]> gcc.gnu.org Git - gcc.git/blame - gcc/config/sparc/sparc.c
sh.h (EXTRA_CONSTRAINT_Z): New macro.
[gcc.git] / gcc / config / sparc / sparc.c
CommitLineData
ab835497 1/* Subroutines for insn-output.c for Sun SPARC.
4592bdcb 2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
ae46c4e0 3 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
ab835497 4 Contributed by Michael Tiemann (tiemann@cygnus.com)
61a55e8b
DE
5 64 bit SPARC V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
6 at Cygnus Support.
ab835497
RK
7
8This file is part of GNU CC.
9
10GNU CC is free software; you can redistribute it and/or modify
11it under the terms of the GNU General Public License as published by
12the Free Software Foundation; either version 2, or (at your option)
13any later version.
14
15GNU CC is distributed in the hope that it will be useful,
16but WITHOUT ANY WARRANTY; without even the implied warranty of
17MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18GNU General Public License for more details.
19
20You should have received a copy of the GNU General Public License
21along with GNU CC; see the file COPYING. If not, write to
c15c9075
RK
22the Free Software Foundation, 59 Temple Place - Suite 330,
23Boston, MA 02111-1307, USA. */
ab835497 24
ab835497 25#include "config.h"
284d86e9 26#include "system.h"
210aa14a 27#include "tree.h"
ab835497
RK
28#include "rtl.h"
29#include "regs.h"
30#include "hard-reg-set.h"
31#include "real.h"
32#include "insn-config.h"
33#include "conditions.h"
ab835497
RK
34#include "output.h"
35#include "insn-attr.h"
36#include "flags.h"
49ad7cfa 37#include "function.h"
ab835497 38#include "expr.h"
e78d8e51
ZW
39#include "optabs.h"
40#include "libfuncs.h"
ab835497 41#include "recog.h"
487a6e06 42#include "toplev.h"
d07d525a 43#include "ggc.h"
b1474bb7 44#include "tm_p.h"
e78d8e51 45#include "debug.h"
672a6f42
NB
46#include "target.h"
47#include "target-def.h"
ab835497 48
61a55e8b
DE
49/* 1 if the caller has placed an "unimp" insn immediately after the call.
50 This is used in v8 code when calling a function that returns a structure.
06b967f9
RK
51 v9 doesn't have this. Be careful to have this test be the same as that
52 used on the call. */
53
54#define SKIP_CALLERS_UNIMP_P \
55(!TARGET_ARCH64 && current_function_returns_struct \
56 && ! integer_zerop (DECL_SIZE (DECL_RESULT (current_function_decl))) \
57 && (TREE_CODE (DECL_SIZE (DECL_RESULT (current_function_decl))) \
58 == INTEGER_CST))
61a55e8b 59
ab835497
RK
60/* Global variables for machine-dependent things. */
61
61a55e8b
DE
62/* Size of frame. Need to know this to emit return insns from leaf procedures.
63 ACTUAL_FSIZE is set by compute_frame_size() which is called during the
64 reload pass. This is important as the value is later used in insn
65 scheduling (to see what can go in a delay slot).
66 APPARENT_FSIZE is the size of the stack less the register save area and less
67 the outgoing argument area. It is used when saving call preserved regs. */
68static int apparent_fsize;
69static int actual_fsize;
70
33074e5f
RH
71/* Number of live general or floating point registers needed to be
72 saved (as 4-byte quantities). */
e48addee
JJ
73static int num_gfregs;
74
ab835497
RK
75/* Save the operands last given to a compare for use when we
76 generate a scc or bcc insn. */
ab835497
RK
77rtx sparc_compare_op0, sparc_compare_op1;
78
33074e5f
RH
79/* Coordinate with the md file wrt special insns created by
80 sparc_nonflat_function_epilogue. */
81bool sparc_emitting_epilogue;
ab835497 82
563c12b0
RH
83/* Vector to say how input registers are mapped to output registers.
84 HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
85 eliminate it. You must use -fomit-frame-pointer to get that. */
d70e94ec 86char leaf_reg_remap[] =
ab835497
RK
87{ 0, 1, 2, 3, 4, 5, 6, 7,
88 -1, -1, -1, -1, -1, -1, 14, -1,
89 -1, -1, -1, -1, -1, -1, -1, -1,
90 8, 9, 10, 11, 12, 13, -1, 15,
91
92 32, 33, 34, 35, 36, 37, 38, 39,
93 40, 41, 42, 43, 44, 45, 46, 47,
94 48, 49, 50, 51, 52, 53, 54, 55,
61a55e8b
DE
95 56, 57, 58, 59, 60, 61, 62, 63,
96 64, 65, 66, 67, 68, 69, 70, 71,
97 72, 73, 74, 75, 76, 77, 78, 79,
98 80, 81, 82, 83, 84, 85, 86, 87,
99 88, 89, 90, 91, 92, 93, 94, 95,
c4ce6853 100 96, 97, 98, 99, 100};
ab835497 101
7d167afd
JJ
102/* Vector, indexed by hard register number, which contains 1
103 for a register that is allowable in a candidate for leaf
104 function treatment. */
105char sparc_leaf_regs[] =
106{ 1, 1, 1, 1, 1, 1, 1, 1,
107 0, 0, 0, 0, 0, 0, 1, 0,
108 0, 0, 0, 0, 0, 0, 0, 0,
109 1, 1, 1, 1, 1, 1, 0, 1,
110 1, 1, 1, 1, 1, 1, 1, 1,
111 1, 1, 1, 1, 1, 1, 1, 1,
112 1, 1, 1, 1, 1, 1, 1, 1,
113 1, 1, 1, 1, 1, 1, 1, 1,
114 1, 1, 1, 1, 1, 1, 1, 1,
115 1, 1, 1, 1, 1, 1, 1, 1,
116 1, 1, 1, 1, 1, 1, 1, 1,
117 1, 1, 1, 1, 1, 1, 1, 1,
118 1, 1, 1, 1, 1};
119
ab835497
RK
120/* Name of where we pretend to think the frame pointer points.
121 Normally, this is "%fp", but if we are in a leaf procedure,
61a55e8b
DE
122 this is "%sp+something". We record "something" separately as it may be
123 too big for reg+constant addressing. */
124
3bb5de61 125static const char *frame_base_name;
61a55e8b 126static int frame_base_offset;
ab835497 127
f6da8bc3
KG
128static void sparc_init_modes PARAMS ((void));
129static int save_regs PARAMS ((FILE *, int, int, const char *,
c85f7c16 130 int, int, int));
f6da8bc3
KG
131static int restore_regs PARAMS ((FILE *, int, int, const char *, int, int));
132static void build_big_number PARAMS ((FILE *, int, const char *));
133static int function_arg_slotno PARAMS ((const CUMULATIVE_ARGS *,
c85f7c16
JL
134 enum machine_mode, tree, int, int,
135 int *, int *));
8947065c 136
f6da8bc3
KG
137static int supersparc_adjust_cost PARAMS ((rtx, rtx, rtx, int));
138static int hypersparc_adjust_cost PARAMS ((rtx, rtx, rtx, int));
f6da8bc3
KG
139
140static void sparc_output_addr_vec PARAMS ((rtx));
141static void sparc_output_addr_diff_vec PARAMS ((rtx));
142static void sparc_output_deferred_case_vectors PARAMS ((void));
f6da8bc3
KG
143static int check_return_regs PARAMS ((rtx));
144static int epilogue_renumber PARAMS ((rtx *, int));
301d03af 145static bool sparc_assemble_integer PARAMS ((rtx, unsigned int, int));
4df1190a 146static int set_extends PARAMS ((rtx));
e77d72cb 147static void output_restore_regs PARAMS ((FILE *, int));
08c148a8
NB
148static void sparc_output_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
149static void sparc_output_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
150static void sparc_flat_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
151static void sparc_flat_function_prologue PARAMS ((FILE *, HOST_WIDE_INT));
152static void sparc_nonflat_function_epilogue PARAMS ((FILE *, HOST_WIDE_INT,
153 int));
154static void sparc_nonflat_function_prologue PARAMS ((FILE *, HOST_WIDE_INT,
155 int));
ede75ee8 156#ifdef OBJECT_FORMAT_ELF
715bdd29 157static void sparc_elf_asm_named_section PARAMS ((const char *, unsigned int));
ede75ee8 158#endif
ae46c4e0
RH
159static void sparc_aout_select_section PARAMS ((tree, int,
160 unsigned HOST_WIDE_INT))
161 ATTRIBUTE_UNUSED;
b64a1b53
RH
162static void sparc_aout_select_rtx_section PARAMS ((enum machine_mode, rtx,
163 unsigned HOST_WIDE_INT))
164 ATTRIBUTE_UNUSED;
c237e94a
ZW
165
166static int sparc_adjust_cost PARAMS ((rtx, rtx, rtx, int));
167static int sparc_issue_rate PARAMS ((void));
c237e94a 168static void sparc_sched_init PARAMS ((FILE *, int, int));
fae15c93
VM
169static int sparc_use_dfa_pipeline_interface PARAMS ((void));
170static int sparc_use_sched_lookahead PARAMS ((void));
73985940
RH
171
172static void emit_soft_tfmode_libcall PARAMS ((const char *, int, rtx *));
173static void emit_soft_tfmode_binop PARAMS ((enum rtx_code, rtx *));
174static void emit_soft_tfmode_unop PARAMS ((enum rtx_code, rtx *));
175static void emit_soft_tfmode_cvt PARAMS ((enum rtx_code, rtx *));
176static void emit_hard_tfmode_operation PARAMS ((enum rtx_code, rtx *));
fb49053f
RH
177
178static void sparc_encode_section_info PARAMS ((tree, int));
3961e8fe
RH
179static void sparc_output_mi_thunk PARAMS ((FILE *, tree, HOST_WIDE_INT,
180 HOST_WIDE_INT, tree));
61a55e8b
DE
181\f
182/* Option handling. */
183
a0a301fc 184/* Code model option as passed by user. */
3bb5de61 185const char *sparc_cmodel_string;
a0a301fc
DE
186/* Parsed value. */
187enum cmodel sparc_cmodel;
188
1cb36a98
RH
189char sparc_hard_reg_printed[8];
190
16956f6e
DE
191struct sparc_cpu_select sparc_select[] =
192{
193 /* switch name, tune arch */
194 { (char *)0, "default", 1, 1 },
195 { (char *)0, "-mcpu=", 1, 1 },
196 { (char *)0, "-mtune=", 1, 0 },
db3d4438 197 { 0, 0, 0, 0 }
16956f6e 198};
733f53f5 199
16956f6e
DE
200/* CPU type. This is set from TARGET_CPU_DEFAULT and -m{cpu,tune}=xxx. */
201enum processor_type sparc_cpu;
672a6f42
NB
202\f
203/* Initialize the GCC target structure. */
301d03af
RS
204
205/* The sparc default is to use .half rather than .short for aligned
206 HI objects. Use .word instead of .long on non-ELF systems. */
207#undef TARGET_ASM_ALIGNED_HI_OP
208#define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
209#ifndef OBJECT_FORMAT_ELF
210#undef TARGET_ASM_ALIGNED_SI_OP
211#define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
212#endif
213
214#undef TARGET_ASM_UNALIGNED_HI_OP
215#define TARGET_ASM_UNALIGNED_HI_OP "\t.uahalf\t"
216#undef TARGET_ASM_UNALIGNED_SI_OP
217#define TARGET_ASM_UNALIGNED_SI_OP "\t.uaword\t"
218#undef TARGET_ASM_UNALIGNED_DI_OP
219#define TARGET_ASM_UNALIGNED_DI_OP "\t.uaxword\t"
220
221/* The target hook has to handle DI-mode values. */
222#undef TARGET_ASM_INTEGER
223#define TARGET_ASM_INTEGER sparc_assemble_integer
224
08c148a8
NB
225#undef TARGET_ASM_FUNCTION_PROLOGUE
226#define TARGET_ASM_FUNCTION_PROLOGUE sparc_output_function_prologue
227#undef TARGET_ASM_FUNCTION_EPILOGUE
228#define TARGET_ASM_FUNCTION_EPILOGUE sparc_output_function_epilogue
733f53f5 229
c237e94a
ZW
230#undef TARGET_SCHED_ADJUST_COST
231#define TARGET_SCHED_ADJUST_COST sparc_adjust_cost
232#undef TARGET_SCHED_ISSUE_RATE
233#define TARGET_SCHED_ISSUE_RATE sparc_issue_rate
c237e94a
ZW
234#undef TARGET_SCHED_INIT
235#define TARGET_SCHED_INIT sparc_sched_init
fae15c93
VM
236#undef TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE
237#define TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE sparc_use_dfa_pipeline_interface
238#undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
239#define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD sparc_use_sched_lookahead
c237e94a 240
fb49053f
RH
241#undef TARGET_ENCODE_SECTION_INFO
242#define TARGET_ENCODE_SECTION_INFO sparc_encode_section_info
243
c590b625
RH
244#undef TARGET_ASM_OUTPUT_MI_THUNK
245#define TARGET_ASM_OUTPUT_MI_THUNK sparc_output_mi_thunk
3961e8fe
RH
246#undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
247#define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
c590b625 248
f6897b10 249struct gcc_target targetm = TARGET_INITIALIZER;
672a6f42 250\f
61a55e8b
DE
251/* Validate and override various options, and do some machine dependent
252 initialization. */
253
254void
255sparc_override_options ()
256{
a0a301fc 257 static struct code_model {
8b60264b
KG
258 const char *const name;
259 const int value;
260 } const cmodels[] = {
a0a301fc
DE
261 { "32", CM_32 },
262 { "medlow", CM_MEDLOW },
263 { "medmid", CM_MEDMID },
264 { "medany", CM_MEDANY },
265 { "embmedany", CM_EMBMEDANY },
266 { 0, 0 }
267 };
8b60264b 268 const struct code_model *cmodel;
16956f6e 269 /* Map TARGET_CPU_DEFAULT to value for -m{arch,tune}=. */
733f53f5 270 static struct cpu_default {
8b60264b
KG
271 const int cpu;
272 const char *const name;
273 } const cpu_default[] = {
a0a301fc 274 /* There must be one entry here for each TARGET_CPU value. */
16956f6e 275 { TARGET_CPU_sparc, "cypress" },
3592ea0d 276 { TARGET_CPU_sparclet, "tsc701" },
16956f6e 277 { TARGET_CPU_sparclite, "f930" },
a0a301fc 278 { TARGET_CPU_v8, "v8" },
8947065c
RH
279 { TARGET_CPU_hypersparc, "hypersparc" },
280 { TARGET_CPU_sparclite86x, "sparclite86x" },
a0a301fc
DE
281 { TARGET_CPU_supersparc, "supersparc" },
282 { TARGET_CPU_v9, "v9" },
ba542005 283 { TARGET_CPU_ultrasparc, "ultrasparc" },
fae15c93 284 { TARGET_CPU_ultrasparc3, "ultrasparc3" },
db3d4438 285 { 0, 0 }
733f53f5 286 };
8b60264b 287 const struct cpu_default *def;
16956f6e 288 /* Table of values for -m{cpu,tune}=. */
733f53f5 289 static struct cpu_table {
8b60264b
KG
290 const char *const name;
291 const enum processor_type processor;
292 const int disable;
293 const int enable;
294 } const cpu_table[] = {
16956f6e
DE
295 { "v7", PROCESSOR_V7, MASK_ISA, 0 },
296 { "cypress", PROCESSOR_CYPRESS, MASK_ISA, 0 },
297 { "v8", PROCESSOR_V8, MASK_ISA, MASK_V8 },
733f53f5 298 /* TI TMS390Z55 supersparc */
16956f6e
DE
299 { "supersparc", PROCESSOR_SUPERSPARC, MASK_ISA, MASK_V8 },
300 { "sparclite", PROCESSOR_SPARCLITE, MASK_ISA, MASK_SPARCLITE },
733f53f5
DE
301 /* The Fujitsu MB86930 is the original sparclite chip, with no fpu.
302 The Fujitsu MB86934 is the recent sparclite chip, with an fpu. */
16956f6e
DE
303 { "f930", PROCESSOR_F930, MASK_ISA|MASK_FPU, MASK_SPARCLITE },
304 { "f934", PROCESSOR_F934, MASK_ISA, MASK_SPARCLITE|MASK_FPU },
8947065c 305 { "hypersparc", PROCESSOR_HYPERSPARC, MASK_ISA, MASK_V8|MASK_FPU },
d3ec6b06
VM
306 { "sparclite86x", PROCESSOR_SPARCLITE86X, MASK_ISA|MASK_FPU,
307 MASK_SPARCLITE },
16956f6e 308 { "sparclet", PROCESSOR_SPARCLET, MASK_ISA, MASK_SPARCLET },
733f53f5 309 /* TEMIC sparclet */
3592ea0d 310 { "tsc701", PROCESSOR_TSC701, MASK_ISA, MASK_SPARCLET },
16956f6e 311 { "v9", PROCESSOR_V9, MASK_ISA, MASK_V9 },
5cb01b65
JJ
312 /* TI ultrasparc I, II, IIi */
313 { "ultrasparc", PROCESSOR_ULTRASPARC, MASK_ISA, MASK_V9
314 /* Although insns using %y are deprecated, it is a clear win on current
80ffc95e 315 ultrasparcs. */
3276910d 316 |MASK_DEPRECATED_V8_INSNS},
fae15c93
VM
317 /* TI ultrasparc III */
318 /* ??? Check if %y issue still holds true in ultra3. */
319 { "ultrasparc3", PROCESSOR_ULTRASPARC3, MASK_ISA, MASK_V9|MASK_DEPRECATED_V8_INSNS},
db3d4438 320 { 0, 0, 0, 0 }
733f53f5 321 };
8b60264b
KG
322 const struct cpu_table *cpu;
323 const struct sparc_cpu_select *sel;
a0a301fc 324 int fpu;
345a6161 325
a0a301fc
DE
326#ifndef SPARC_BI_ARCH
327 /* Check for unsupported architecture size. */
328 if (! TARGET_64BIT != DEFAULT_ARCH32_P)
3276910d
RK
329 error ("%s is not supported by this configuration",
330 DEFAULT_ARCH32_P ? "-m64" : "-m32");
a0a301fc
DE
331#endif
332
4710d3eb
JJ
333 /* We force all 64bit archs to use 128 bit long double */
334 if (TARGET_64BIT && ! TARGET_LONG_DOUBLE_128)
335 {
336 error ("-mlong-double-64 not allowed with -m64");
337 target_flags |= MASK_LONG_DOUBLE_128;
338 }
339
a0a301fc
DE
340 /* Code model selection. */
341 sparc_cmodel = SPARC_DEFAULT_CMODEL;
345a6161
DM
342
343#ifdef SPARC_BI_ARCH
344 if (TARGET_ARCH32)
345 sparc_cmodel = CM_32;
346#endif
347
a0a301fc
DE
348 if (sparc_cmodel_string != NULL)
349 {
350 if (TARGET_ARCH64)
351 {
352 for (cmodel = &cmodels[0]; cmodel->name; cmodel++)
353 if (strcmp (sparc_cmodel_string, cmodel->name) == 0)
354 break;
355 if (cmodel->name == NULL)
356 error ("bad value (%s) for -mcmodel= switch", sparc_cmodel_string);
357 else
358 sparc_cmodel = cmodel->value;
359 }
360 else
361 error ("-mcmodel= is not supported on 32 bit systems");
362 }
16956f6e 363
a0a301fc 364 fpu = TARGET_FPU; /* save current -mfpu status */
1f1406b4 365
a0a301fc 366 /* Set the default CPU. */
16956f6e
DE
367 for (def = &cpu_default[0]; def->name; ++def)
368 if (def->cpu == TARGET_CPU_DEFAULT)
369 break;
370 if (! def->name)
371 abort ();
372 sparc_select[0].string = def->name;
373
374 for (sel = &sparc_select[0]; sel->name; ++sel)
61a55e8b 375 {
16956f6e 376 if (sel->string)
733f53f5 377 {
16956f6e
DE
378 for (cpu = &cpu_table[0]; cpu->name; ++cpu)
379 if (! strcmp (sel->string, cpu->name))
380 {
381 if (sel->set_tune_p)
382 sparc_cpu = cpu->processor;
383
384 if (sel->set_arch_p)
385 {
386 target_flags &= ~cpu->disable;
387 target_flags |= cpu->enable;
388 }
389 break;
390 }
391
392 if (! cpu->name)
393 error ("bad value (%s) for %s switch", sel->string, sel->name);
733f53f5 394 }
61a55e8b 395 }
97da85b7 396
1f1406b4 397 /* If -mfpu or -mno-fpu was explicitly used, don't override with
46cc13b3
RO
398 the processor default. Clear MASK_FPU_SET to avoid confusing
399 the reverse mapping from switch values to names. */
1f1406b4 400 if (TARGET_FPU_SET)
46cc13b3
RO
401 {
402 target_flags = (target_flags & ~MASK_FPU) | fpu;
403 target_flags &= ~MASK_FPU_SET;
404 }
1f1406b4 405
a5774a7d
JJ
406 /* Don't allow -mvis if FPU is disabled. */
407 if (! TARGET_FPU)
408 target_flags &= ~MASK_VIS;
409
410 /* -mvis assumes UltraSPARC+, so we are sure v9 instructions
411 are available.
412 -m64 also implies v9. */
413 if (TARGET_VIS || TARGET_ARCH64)
c4031a04
JJ
414 {
415 target_flags |= MASK_V9;
416 target_flags &= ~(MASK_V8 | MASK_SPARCLET | MASK_SPARCLITE);
417 }
a5774a7d 418
16956f6e
DE
419 /* Use the deprecated v8 insns for sparc64 in 32 bit mode. */
420 if (TARGET_V9 && TARGET_ARCH32)
733f53f5 421 target_flags |= MASK_DEPRECATED_V8_INSNS;
61a55e8b 422
345a6161
DM
423 /* V8PLUS requires V9, makes no sense in 64 bit mode. */
424 if (! TARGET_V9 || TARGET_ARCH64)
284d86e9
JC
425 target_flags &= ~MASK_V8PLUS;
426
82d6b402
RH
427 /* Don't use stack biasing in 32 bit mode. */
428 if (TARGET_ARCH32)
429 target_flags &= ~MASK_STACK_BIAS;
f952a238 430
efa3896a 431 /* Supply a default value for align_functions. */
fae15c93
VM
432 if (align_functions == 0
433 && (sparc_cpu == PROCESSOR_ULTRASPARC
434 || sparc_cpu == PROCESSOR_ULTRASPARC3))
efa3896a 435 align_functions = 32;
bf62bbf1 436
82d6b402
RH
437 /* Validate PCC_STRUCT_RETURN. */
438 if (flag_pcc_struct_return == DEFAULT_PCC_STRUCT_RETURN)
439 flag_pcc_struct_return = (TARGET_ARCH64 ? 0 : 1);
440
301d03af
RS
441 /* Only use .uaxword when compiling for a 64-bit target. */
442 if (!TARGET_ARCH64)
443 targetm.asm_out.unaligned_op.di = NULL;
444
61a55e8b
DE
445 /* Do various machine dependent initializations. */
446 sparc_init_modes ();
447}
448\f
cd5fb1ee
DE
449/* Miscellaneous utilities. */
450
451/* Nonzero if CODE, a comparison, is suitable for use in v9 conditional move
452 or branch on register contents instructions. */
453
454int
455v9_regcmp_p (code)
456 enum rtx_code code;
457{
458 return (code == EQ || code == NE || code == GE || code == LT
459 || code == LE || code == GT);
460}
bfd6bc60 461
cd5fb1ee
DE
462\f
463/* Operand constraints. */
464
5e7a8ee0 465/* Return nonzero only if OP is a register of mode MODE,
e6c1be7e 466 or const0_rtx. */
c4ce6853 467
ab835497
RK
468int
469reg_or_0_operand (op, mode)
470 rtx op;
471 enum machine_mode mode;
472{
c4ce6853
DE
473 if (register_operand (op, mode))
474 return 1;
c4ce6853 475 if (op == const0_rtx)
ab835497 476 return 1;
5b486ce0 477 if (GET_MODE (op) == VOIDmode && GET_CODE (op) == CONST_DOUBLE
ab835497
RK
478 && CONST_DOUBLE_HIGH (op) == 0
479 && CONST_DOUBLE_LOW (op) == 0)
480 return 1;
7ce86678 481 if (fp_zero_operand (op, mode))
302484ff 482 return 1;
ab835497
RK
483 return 0;
484}
485
5e7a8ee0 486/* Return nonzero only if OP is const1_rtx. */
84ea5bc1
JJ
487
488int
489const1_operand (op, mode)
490 rtx op;
491 enum machine_mode mode ATTRIBUTE_UNUSED;
492{
493 return op == const1_rtx;
494}
495
302484ff 496/* Nonzero if OP is a floating point value with value 0.0. */
c4ce6853 497
302484ff 498int
7ce86678 499fp_zero_operand (op, mode)
302484ff 500 rtx op;
7ce86678 501 enum machine_mode mode;
302484ff 502{
7ce86678
RH
503 if (GET_MODE_CLASS (GET_MODE (op)) != MODE_FLOAT)
504 return 0;
505 return op == CONST0_RTX (mode);
302484ff
JW
506}
507
2a732575
JJ
508/* Nonzero if OP is a register operand in floating point register. */
509
510int
511fp_register_operand (op, mode)
512 rtx op;
513 enum machine_mode mode;
514{
515 if (! register_operand (op, mode))
516 return 0;
517 if (GET_CODE (op) == SUBREG)
518 op = SUBREG_REG (op);
519 return GET_CODE (op) == REG && SPARC_FP_REG_P (REGNO (op));
520}
521
62190128
DM
522/* Nonzero if OP is a floating point constant which can
523 be loaded into an integer register using a single
524 sethi instruction. */
525
526int
527fp_sethi_p (op)
528 rtx op;
529{
530 if (GET_CODE (op) == CONST_DOUBLE)
531 {
532 REAL_VALUE_TYPE r;
533 long i;
534
535 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
536 if (REAL_VALUES_EQUAL (r, dconst0) &&
537 ! REAL_VALUE_MINUS_ZERO (r))
538 return 0;
539 REAL_VALUE_TO_TARGET_SINGLE (r, i);
540 if (SPARC_SETHI_P (i))
541 return 1;
542 }
543
544 return 0;
545}
546
547/* Nonzero if OP is a floating point constant which can
548 be loaded into an integer register using a single
549 mov instruction. */
550
551int
552fp_mov_p (op)
553 rtx op;
554{
555 if (GET_CODE (op) == CONST_DOUBLE)
556 {
557 REAL_VALUE_TYPE r;
558 long i;
559
560 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
561 if (REAL_VALUES_EQUAL (r, dconst0) &&
562 ! REAL_VALUE_MINUS_ZERO (r))
563 return 0;
564 REAL_VALUE_TO_TARGET_SINGLE (r, i);
565 if (SPARC_SIMM13_P (i))
566 return 1;
567 }
568
569 return 0;
570}
571
572/* Nonzero if OP is a floating point constant which can
573 be loaded into an integer register using a high/losum
574 instruction sequence. */
575
576int
577fp_high_losum_p (op)
578 rtx op;
579{
580 /* The constraints calling this should only be in
581 SFmode move insns, so any constant which cannot
582 be moved using a single insn will do. */
583 if (GET_CODE (op) == CONST_DOUBLE)
584 {
585 REAL_VALUE_TYPE r;
586 long i;
587
588 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
589 if (REAL_VALUES_EQUAL (r, dconst0) &&
590 ! REAL_VALUE_MINUS_ZERO (r))
591 return 0;
592 REAL_VALUE_TO_TARGET_SINGLE (r, i);
593 if (! SPARC_SETHI_P (i)
594 && ! SPARC_SIMM13_P (i))
595 return 1;
596 }
597
598 return 0;
599}
600
61a55e8b
DE
601/* Nonzero if OP is an integer register. */
602
603int
604intreg_operand (op, mode)
605 rtx op;
487a6e06 606 enum machine_mode mode ATTRIBUTE_UNUSED;
61a55e8b
DE
607{
608 return (register_operand (op, SImode)
a9e27770 609 || (TARGET_ARCH64 && register_operand (op, DImode)));
61a55e8b
DE
610}
611
612/* Nonzero if OP is a floating point condition code register. */
613
614int
c4ce6853 615fcc_reg_operand (op, mode)
61a55e8b
DE
616 rtx op;
617 enum machine_mode mode;
618{
619 /* This can happen when recog is called from combine. Op may be a MEM.
620 Fail instead of calling abort in this case. */
c4ce6853 621 if (GET_CODE (op) != REG)
61a55e8b 622 return 0;
304b7a23 623
c4ce6853 624 if (mode != VOIDmode && mode != GET_MODE (op))
61a55e8b 625 return 0;
304b7a23
DE
626 if (mode == VOIDmode
627 && (GET_MODE (op) != CCFPmode && GET_MODE (op) != CCFPEmode))
628 return 0;
61a55e8b 629
c4ce6853 630#if 0 /* ??? ==> 1 when %fcc0-3 are pseudos first. See gen_compare_reg(). */
61a55e8b
DE
631 if (reg_renumber == 0)
632 return REGNO (op) >= FIRST_PSEUDO_REGISTER;
633 return REGNO_OK_FOR_CCFP_P (REGNO (op));
634#else
c4ce6853 635 return (unsigned) REGNO (op) - SPARC_FIRST_V9_FCC_REG < 4;
61a55e8b
DE
636#endif
637}
638
0b82d204
JJ
639/* Nonzero if OP is a floating point condition code fcc0 register. */
640
641int
642fcc0_reg_operand (op, mode)
643 rtx op;
644 enum machine_mode mode;
645{
646 /* This can happen when recog is called from combine. Op may be a MEM.
647 Fail instead of calling abort in this case. */
648 if (GET_CODE (op) != REG)
649 return 0;
650
651 if (mode != VOIDmode && mode != GET_MODE (op))
652 return 0;
653 if (mode == VOIDmode
654 && (GET_MODE (op) != CCFPmode && GET_MODE (op) != CCFPEmode))
655 return 0;
656
657 return REGNO (op) == SPARC_FCC_REG;
658}
659
c4ce6853
DE
660/* Nonzero if OP is an integer or floating point condition code register. */
661
662int
663icc_or_fcc_reg_operand (op, mode)
664 rtx op;
665 enum machine_mode mode;
666{
667 if (GET_CODE (op) == REG && REGNO (op) == SPARC_ICC_REG)
304b7a23
DE
668 {
669 if (mode != VOIDmode && mode != GET_MODE (op))
670 return 0;
671 if (mode == VOIDmode
672 && GET_MODE (op) != CCmode && GET_MODE (op) != CCXmode)
673 return 0;
674 return 1;
675 }
676
c4ce6853
DE
677 return fcc_reg_operand (op, mode);
678}
679
ab835497
RK
680/* Nonzero if OP can appear as the dest of a RESTORE insn. */
681int
682restore_operand (op, mode)
683 rtx op;
684 enum machine_mode mode;
685{
686 return (GET_CODE (op) == REG && GET_MODE (op) == mode
687 && (REGNO (op) < 8 || (REGNO (op) >= 24 && REGNO (op) < 32)));
688}
689
401cec23
JW
690/* Call insn on SPARC can take a PC-relative constant address, or any regular
691 memory address. */
ab835497
RK
692
693int
694call_operand (op, mode)
695 rtx op;
696 enum machine_mode mode;
697{
698 if (GET_CODE (op) != MEM)
699 abort ();
700 op = XEXP (op, 0);
2445f289 701 return (symbolic_operand (op, mode) || memory_address_p (Pmode, op));
ab835497
RK
702}
703
704int
705call_operand_address (op, mode)
706 rtx op;
707 enum machine_mode mode;
708{
2445f289 709 return (symbolic_operand (op, mode) || memory_address_p (Pmode, op));
ab835497
RK
710}
711
712/* Returns 1 if OP is either a symbol reference or a sum of a symbol
713 reference and a constant. */
714
715int
716symbolic_operand (op, mode)
717 register rtx op;
718 enum machine_mode mode;
719{
6871dd65
RH
720 enum machine_mode omode = GET_MODE (op);
721
722 if (omode != mode && omode != VOIDmode && mode != VOIDmode)
723 return 0;
724
ab835497
RK
725 switch (GET_CODE (op))
726 {
727 case SYMBOL_REF:
728 case LABEL_REF:
729 return 1;
730
731 case CONST:
732 op = XEXP (op, 0);
733 return ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
734 || GET_CODE (XEXP (op, 0)) == LABEL_REF)
735 && GET_CODE (XEXP (op, 1)) == CONST_INT);
736
ab835497
RK
737 default:
738 return 0;
739 }
740}
741
742/* Return truth value of statement that OP is a symbolic memory
743 operand of mode MODE. */
744
745int
746symbolic_memory_operand (op, mode)
747 rtx op;
487a6e06 748 enum machine_mode mode ATTRIBUTE_UNUSED;
ab835497
RK
749{
750 if (GET_CODE (op) == SUBREG)
751 op = SUBREG_REG (op);
752 if (GET_CODE (op) != MEM)
753 return 0;
754 op = XEXP (op, 0);
755 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST
756 || GET_CODE (op) == HIGH || GET_CODE (op) == LABEL_REF);
757}
758
5ab7138b
DE
759/* Return truth value of statement that OP is a LABEL_REF of mode MODE. */
760
761int
762label_ref_operand (op, mode)
763 rtx op;
764 enum machine_mode mode;
765{
766 if (GET_CODE (op) != LABEL_REF)
767 return 0;
768 if (GET_MODE (op) != mode)
769 return 0;
770 return 1;
771}
772
95726648
DE
773/* Return 1 if the operand is an argument used in generating pic references
774 in either the medium/low or medium/anywhere code models of sparc64. */
775
776int
777sp64_medium_pic_operand (op, mode)
778 rtx op;
487a6e06 779 enum machine_mode mode ATTRIBUTE_UNUSED;
95726648
DE
780{
781 /* Check for (const (minus (symbol_ref:GOT)
782 (const (minus (label) (pc))))). */
783 if (GET_CODE (op) != CONST)
784 return 0;
785 op = XEXP (op, 0);
786 if (GET_CODE (op) != MINUS)
787 return 0;
788 if (GET_CODE (XEXP (op, 0)) != SYMBOL_REF)
789 return 0;
790 /* ??? Ensure symbol is GOT. */
791 if (GET_CODE (XEXP (op, 1)) != CONST)
792 return 0;
793 if (GET_CODE (XEXP (XEXP (op, 1), 0)) != MINUS)
794 return 0;
795 return 1;
796}
797
61a55e8b
DE
798/* Return 1 if the operand is a data segment reference. This includes
799 the readonly data segment, or in other words anything but the text segment.
800 This is needed in the medium/anywhere code model on v9. These values
a0a301fc 801 are accessed with EMBMEDANY_BASE_REG. */
61a55e8b
DE
802
803int
804data_segment_operand (op, mode)
805 rtx op;
487a6e06 806 enum machine_mode mode ATTRIBUTE_UNUSED;
61a55e8b
DE
807{
808 switch (GET_CODE (op))
809 {
810 case SYMBOL_REF :
811 return ! SYMBOL_REF_FLAG (op);
812 case PLUS :
95726648
DE
813 /* Assume canonical format of symbol + constant.
814 Fall through. */
61a55e8b 815 case CONST :
b1474bb7 816 return data_segment_operand (XEXP (op, 0), VOIDmode);
61a55e8b
DE
817 default :
818 return 0;
819 }
820}
821
822/* Return 1 if the operand is a text segment reference.
823 This is needed in the medium/anywhere code model on v9. */
824
825int
826text_segment_operand (op, mode)
827 rtx op;
487a6e06 828 enum machine_mode mode ATTRIBUTE_UNUSED;
61a55e8b
DE
829{
830 switch (GET_CODE (op))
831 {
832 case LABEL_REF :
833 return 1;
834 case SYMBOL_REF :
835 return SYMBOL_REF_FLAG (op);
836 case PLUS :
95726648
DE
837 /* Assume canonical format of symbol + constant.
838 Fall through. */
61a55e8b 839 case CONST :
b1474bb7 840 return text_segment_operand (XEXP (op, 0), VOIDmode);
61a55e8b
DE
841 default :
842 return 0;
843 }
844}
845
ab835497
RK
846/* Return 1 if the operand is either a register or a memory operand that is
847 not symbolic. */
848
849int
850reg_or_nonsymb_mem_operand (op, mode)
851 register rtx op;
852 enum machine_mode mode;
853{
854 if (register_operand (op, mode))
855 return 1;
856
857 if (memory_operand (op, mode) && ! symbolic_memory_operand (op, mode))
858 return 1;
859
860 return 0;
861}
862
ab835497 863int
6ac34277 864splittable_symbolic_memory_operand (op, mode)
ab835497 865 rtx op;
487a6e06 866 enum machine_mode mode ATTRIBUTE_UNUSED;
ab835497 867{
6ac34277
DE
868 if (GET_CODE (op) != MEM)
869 return 0;
870 if (! symbolic_operand (XEXP (op, 0), Pmode))
871 return 0;
872 return 1;
873}
874
875int
876splittable_immediate_memory_operand (op, mode)
877 rtx op;
487a6e06 878 enum machine_mode mode ATTRIBUTE_UNUSED;
6ac34277
DE
879{
880 if (GET_CODE (op) != MEM)
881 return 0;
882 if (! immediate_operand (XEXP (op, 0), Pmode))
883 return 0;
884 return 1;
ab835497
RK
885}
886
887/* Return truth value of whether OP is EQ or NE. */
888
889int
890eq_or_neq (op, mode)
891 rtx op;
487a6e06 892 enum machine_mode mode ATTRIBUTE_UNUSED;
ab835497
RK
893{
894 return (GET_CODE (op) == EQ || GET_CODE (op) == NE);
895}
896
897/* Return 1 if this is a comparison operator, but not an EQ, NE, GEU,
898 or LTU for non-floating-point. We handle those specially. */
899
900int
901normal_comp_operator (op, mode)
902 rtx op;
487a6e06 903 enum machine_mode mode ATTRIBUTE_UNUSED;
ab835497
RK
904{
905 enum rtx_code code = GET_CODE (op);
906
907 if (GET_RTX_CLASS (code) != '<')
908 return 0;
909
4d449554
JW
910 if (GET_MODE (XEXP (op, 0)) == CCFPmode
911 || GET_MODE (XEXP (op, 0)) == CCFPEmode)
ab835497
RK
912 return 1;
913
914 return (code != NE && code != EQ && code != GEU && code != LTU);
915}
916
917/* Return 1 if this is a comparison operator. This allows the use of
918 MATCH_OPERATOR to recognize all the branch insns. */
919
920int
921noov_compare_op (op, mode)
922 register rtx op;
487a6e06 923 enum machine_mode mode ATTRIBUTE_UNUSED;
ab835497
RK
924{
925 enum rtx_code code = GET_CODE (op);
926
927 if (GET_RTX_CLASS (code) != '<')
928 return 0;
929
0b82d204
JJ
930 if (GET_MODE (XEXP (op, 0)) == CC_NOOVmode
931 || GET_MODE (XEXP (op, 0)) == CCX_NOOVmode)
ab835497
RK
932 /* These are the only branches which work with CC_NOOVmode. */
933 return (code == EQ || code == NE || code == GE || code == LT);
934 return 1;
935}
936
0b82d204
JJ
937/* Return 1 if this is a 64-bit comparison operator. This allows the use of
938 MATCH_OPERATOR to recognize all the branch insns. */
939
940int
941noov_compare64_op (op, mode)
942 register rtx op;
943 enum machine_mode mode ATTRIBUTE_UNUSED;
944{
945 enum rtx_code code = GET_CODE (op);
946
947 if (! TARGET_V9)
948 return 0;
949
950 if (GET_RTX_CLASS (code) != '<')
951 return 0;
952
953 if (GET_MODE (XEXP (op, 0)) == CCX_NOOVmode)
954 /* These are the only branches which work with CCX_NOOVmode. */
955 return (code == EQ || code == NE || code == GE || code == LT);
956 return (GET_MODE (XEXP (op, 0)) == CCXmode);
957}
958
61a55e8b
DE
959/* Nonzero if OP is a comparison operator suitable for use in v9
960 conditional move or branch on register contents instructions. */
961
962int
963v9_regcmp_op (op, mode)
964 register rtx op;
487a6e06 965 enum machine_mode mode ATTRIBUTE_UNUSED;
61a55e8b
DE
966{
967 enum rtx_code code = GET_CODE (op);
968
969 if (GET_RTX_CLASS (code) != '<')
970 return 0;
971
cd5fb1ee 972 return v9_regcmp_p (code);
61a55e8b
DE
973}
974
ab835497
RK
975/* Return 1 if this is a SIGN_EXTEND or ZERO_EXTEND operation. */
976
977int
978extend_op (op, mode)
979 rtx op;
487a6e06 980 enum machine_mode mode ATTRIBUTE_UNUSED;
ab835497
RK
981{
982 return GET_CODE (op) == SIGN_EXTEND || GET_CODE (op) == ZERO_EXTEND;
983}
984
985/* Return nonzero if OP is an operator of mode MODE which can set
986 the condition codes explicitly. We do not include PLUS and MINUS
987 because these require CC_NOOVmode, which we handle explicitly. */
988
989int
990cc_arithop (op, mode)
991 rtx op;
487a6e06 992 enum machine_mode mode ATTRIBUTE_UNUSED;
ab835497
RK
993{
994 if (GET_CODE (op) == AND
995 || GET_CODE (op) == IOR
996 || GET_CODE (op) == XOR)
997 return 1;
998
999 return 0;
1000}
1001
1002/* Return nonzero if OP is an operator of mode MODE which can bitwise
1003 complement its second operand and set the condition codes explicitly. */
1004
1005int
1006cc_arithopn (op, mode)
1007 rtx op;
487a6e06 1008 enum machine_mode mode ATTRIBUTE_UNUSED;
ab835497
RK
1009{
1010 /* XOR is not here because combine canonicalizes (xor (not ...) ...)
80ffc95e 1011 and (xor ... (not ...)) to (not (xor ...)). */
ab835497
RK
1012 return (GET_CODE (op) == AND
1013 || GET_CODE (op) == IOR);
1014}
1015\f
58cbf20e
DE
1016/* Return true if OP is a register, or is a CONST_INT that can fit in a
1017 signed 13 bit immediate field. This is an acceptable SImode operand for
1018 most 3 address instructions. */
ab835497
RK
1019
1020int
1021arith_operand (op, mode)
1022 rtx op;
1023 enum machine_mode mode;
1024{
11301057 1025 if (register_operand (op, mode))
284d86e9
JC
1026 return 1;
1027 if (GET_CODE (op) != CONST_INT)
1028 return 0;
9e0625a3 1029 return SMALL_INT32 (op);
ab835497
RK
1030}
1031
5d6d3339
JJ
1032/* Return true if OP is a constant 4096 */
1033
1034int
1035arith_4096_operand (op, mode)
1036 rtx op;
ddf80874 1037 enum machine_mode mode ATTRIBUTE_UNUSED;
5d6d3339 1038{
5d6d3339
JJ
1039 if (GET_CODE (op) != CONST_INT)
1040 return 0;
3070dd00
KG
1041 else
1042 return INTVAL (op) == 4096;
5d6d3339
JJ
1043}
1044
1045/* Return true if OP is suitable as second operand for add/sub */
1046
1047int
1048arith_add_operand (op, mode)
1049 rtx op;
1050 enum machine_mode mode;
1051{
1052 return arith_operand (op, mode) || arith_4096_operand (op, mode);
1053}
1054
89e65674
DM
1055/* Return true if OP is a CONST_INT or a CONST_DOUBLE which can fit in the
1056 immediate field of OR and XOR instructions. Used for 64-bit
1057 constant formation patterns. */
1058int
1059const64_operand (op, mode)
1060 rtx op;
ddf80874 1061 enum machine_mode mode ATTRIBUTE_UNUSED;
89e65674
DM
1062{
1063 return ((GET_CODE (op) == CONST_INT
1064 && SPARC_SIMM13_P (INTVAL (op)))
9208e4b2 1065#if HOST_BITS_PER_WIDE_INT != 64
89e65674 1066 || (GET_CODE (op) == CONST_DOUBLE
9208e4b2
DM
1067 && SPARC_SIMM13_P (CONST_DOUBLE_LOW (op))
1068 && (CONST_DOUBLE_HIGH (op) ==
1069 ((CONST_DOUBLE_LOW (op) & 0x80000000) != 0 ?
9e0625a3 1070 (HOST_WIDE_INT)-1 : 0)))
9208e4b2 1071#endif
11301057 1072 );
89e65674
DM
1073}
1074
9208e4b2 1075/* The same, but only for sethi instructions. */
89e65674
DM
1076int
1077const64_high_operand (op, mode)
1078 rtx op;
7d6040e8 1079 enum machine_mode mode;
89e65674
DM
1080{
1081 return ((GET_CODE (op) == CONST_INT
9e0625a3 1082 && (INTVAL (op) & ~(HOST_WIDE_INT)0x3ff) != 0
7d6040e8 1083 && SPARC_SETHI_P (INTVAL (op) & GET_MODE_MASK (mode))
9208e4b2 1084 )
89e65674
DM
1085 || (GET_CODE (op) == CONST_DOUBLE
1086 && CONST_DOUBLE_HIGH (op) == 0
9e0625a3 1087 && (CONST_DOUBLE_LOW (op) & ~(HOST_WIDE_INT)0x3ff) != 0
11301057 1088 && SPARC_SETHI_P (CONST_DOUBLE_LOW (op))));
89e65674
DM
1089}
1090
58cbf20e
DE
1091/* Return true if OP is a register, or is a CONST_INT that can fit in a
1092 signed 11 bit immediate field. This is an acceptable SImode operand for
1093 the movcc instructions. */
61a55e8b
DE
1094
1095int
1096arith11_operand (op, mode)
1097 rtx op;
1098 enum machine_mode mode;
1099{
1100 return (register_operand (op, mode)
58cbf20e 1101 || (GET_CODE (op) == CONST_INT && SPARC_SIMM11_P (INTVAL (op))));
61a55e8b
DE
1102}
1103
58cbf20e
DE
1104/* Return true if OP is a register, or is a CONST_INT that can fit in a
1105 signed 10 bit immediate field. This is an acceptable SImode operand for
1106 the movrcc instructions. */
61a55e8b
DE
1107
1108int
1109arith10_operand (op, mode)
1110 rtx op;
1111 enum machine_mode mode;
1112{
1113 return (register_operand (op, mode)
58cbf20e 1114 || (GET_CODE (op) == CONST_INT && SPARC_SIMM10_P (INTVAL (op))));
61a55e8b
DE
1115}
1116
23b8a89f
JW
1117/* Return true if OP is a register, is a CONST_INT that fits in a 13 bit
1118 immediate field, or is a CONST_DOUBLE whose both parts fit in a 13 bit
61a55e8b
DE
1119 immediate field.
1120 v9: Return true if OP is a register, or is a CONST_INT or CONST_DOUBLE that
1121 can fit in a 13 bit immediate field. This is an acceptable DImode operand
1122 for most 3 address instructions. */
ab835497
RK
1123
1124int
1125arith_double_operand (op, mode)
1126 rtx op;
1127 enum machine_mode mode;
1128{
1129 return (register_operand (op, mode)
23b8a89f 1130 || (GET_CODE (op) == CONST_INT && SMALL_INT (op))
a9e27770 1131 || (! TARGET_ARCH64
61a55e8b 1132 && GET_CODE (op) == CONST_DOUBLE
bf62bbf1
DE
1133 && (unsigned HOST_WIDE_INT) (CONST_DOUBLE_LOW (op) + 0x1000) < 0x2000
1134 && (unsigned HOST_WIDE_INT) (CONST_DOUBLE_HIGH (op) + 0x1000) < 0x2000)
a9e27770 1135 || (TARGET_ARCH64
61a55e8b 1136 && GET_CODE (op) == CONST_DOUBLE
bf62bbf1 1137 && (unsigned HOST_WIDE_INT) (CONST_DOUBLE_LOW (op) + 0x1000) < 0x2000
61a55e8b
DE
1138 && ((CONST_DOUBLE_HIGH (op) == -1
1139 && (CONST_DOUBLE_LOW (op) & 0x1000) == 0x1000)
1140 || (CONST_DOUBLE_HIGH (op) == 0
1141 && (CONST_DOUBLE_LOW (op) & 0x1000) == 0))));
1142}
1143
5d6d3339
JJ
1144/* Return true if OP is a constant 4096 for DImode on ARCH64 */
1145
1146int
1147arith_double_4096_operand (op, mode)
1148 rtx op;
ddf80874 1149 enum machine_mode mode ATTRIBUTE_UNUSED;
5d6d3339
JJ
1150{
1151 return (TARGET_ARCH64 &&
1152 ((GET_CODE (op) == CONST_INT && INTVAL (op) == 4096) ||
1153 (GET_CODE (op) == CONST_DOUBLE &&
1154 CONST_DOUBLE_LOW (op) == 4096 &&
1155 CONST_DOUBLE_HIGH (op) == 0)));
1156}
1157
1158/* Return true if OP is suitable as second operand for add/sub in DImode */
1159
1160int
1161arith_double_add_operand (op, mode)
1162 rtx op;
1163 enum machine_mode mode;
1164{
1165 return arith_double_operand (op, mode) || arith_double_4096_operand (op, mode);
1166}
1167
61a55e8b
DE
1168/* Return true if OP is a register, or is a CONST_INT or CONST_DOUBLE that
1169 can fit in an 11 bit immediate field. This is an acceptable DImode
1170 operand for the movcc instructions. */
1171/* ??? Replace with arith11_operand? */
1172
1173int
1174arith11_double_operand (op, mode)
1175 rtx op;
1176 enum machine_mode mode;
1177{
1178 return (register_operand (op, mode)
1179 || (GET_CODE (op) == CONST_DOUBLE
1180 && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
bf62bbf1 1181 && (unsigned HOST_WIDE_INT) (CONST_DOUBLE_LOW (op) + 0x400) < 0x800
61a55e8b
DE
1182 && ((CONST_DOUBLE_HIGH (op) == -1
1183 && (CONST_DOUBLE_LOW (op) & 0x400) == 0x400)
1184 || (CONST_DOUBLE_HIGH (op) == 0
1185 && (CONST_DOUBLE_LOW (op) & 0x400) == 0)))
1186 || (GET_CODE (op) == CONST_INT
1187 && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
bf62bbf1 1188 && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x400) < 0x800));
61a55e8b
DE
1189}
1190
1191/* Return true if OP is a register, or is a CONST_INT or CONST_DOUBLE that
1192 can fit in an 10 bit immediate field. This is an acceptable DImode
1193 operand for the movrcc instructions. */
1194/* ??? Replace with arith10_operand? */
1195
1196int
1197arith10_double_operand (op, mode)
1198 rtx op;
1199 enum machine_mode mode;
1200{
1201 return (register_operand (op, mode)
1202 || (GET_CODE (op) == CONST_DOUBLE
1203 && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
1204 && (unsigned) (CONST_DOUBLE_LOW (op) + 0x200) < 0x400
1205 && ((CONST_DOUBLE_HIGH (op) == -1
1206 && (CONST_DOUBLE_LOW (op) & 0x200) == 0x200)
1207 || (CONST_DOUBLE_HIGH (op) == 0
1208 && (CONST_DOUBLE_LOW (op) & 0x200) == 0)))
1209 || (GET_CODE (op) == CONST_INT
1210 && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
bf62bbf1 1211 && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x200) < 0x400));
ab835497
RK
1212}
1213
5519a4f9 1214/* Return truth value of whether OP is an integer which fits the
228b4037
JW
1215 range constraining immediate operands in most three-address insns,
1216 which have a 13 bit immediate field. */
ab835497
RK
1217
1218int
1219small_int (op, mode)
1220 rtx op;
487a6e06 1221 enum machine_mode mode ATTRIBUTE_UNUSED;
ab835497 1222{
11301057 1223 return (GET_CODE (op) == CONST_INT && SMALL_INT (op));
ab835497
RK
1224}
1225
e0d80184
DM
1226int
1227small_int_or_double (op, mode)
1228 rtx op;
1229 enum machine_mode mode ATTRIBUTE_UNUSED;
1230{
1231 return ((GET_CODE (op) == CONST_INT && SMALL_INT (op))
1232 || (GET_CODE (op) == CONST_DOUBLE
1233 && CONST_DOUBLE_HIGH (op) == 0
11301057 1234 && SPARC_SIMM13_P (CONST_DOUBLE_LOW (op))));
e0d80184
DM
1235}
1236
9b3fad96
JW
1237/* Recognize operand values for the umul instruction. That instruction sign
1238 extends immediate values just like all other sparc instructions, but
1239 interprets the extended result as an unsigned number. */
1240
1241int
1242uns_small_int (op, mode)
1243 rtx op;
487a6e06 1244 enum machine_mode mode ATTRIBUTE_UNUSED;
9b3fad96
JW
1245{
1246#if HOST_BITS_PER_WIDE_INT > 32
1247 /* All allowed constants will fit a CONST_INT. */
11301057
RH
1248 return (GET_CODE (op) == CONST_INT
1249 && ((INTVAL (op) >= 0 && INTVAL (op) < 0x1000)
1250 || (INTVAL (op) >= 0xFFFFF000
0d587737 1251 && INTVAL (op) <= 0xFFFFFFFF)));
9b3fad96 1252#else
11301057
RH
1253 return ((GET_CODE (op) == CONST_INT && (unsigned) INTVAL (op) < 0x1000)
1254 || (GET_CODE (op) == CONST_DOUBLE
1255 && CONST_DOUBLE_HIGH (op) == 0
1256 && (unsigned) CONST_DOUBLE_LOW (op) - 0xFFFFF000 < 0x1000));
9b3fad96
JW
1257#endif
1258}
1259
1260int
1261uns_arith_operand (op, mode)
1262 rtx op;
1263 enum machine_mode mode;
1264{
1265 return register_operand (op, mode) || uns_small_int (op, mode);
1266}
1267
ab835497
RK
1268/* Return truth value of statement that OP is a call-clobbered register. */
1269int
1270clobbered_register (op, mode)
1271 rtx op;
487a6e06 1272 enum machine_mode mode ATTRIBUTE_UNUSED;
ab835497
RK
1273{
1274 return (GET_CODE (op) == REG && call_used_regs[REGNO (op)]);
1275}
ab835497 1276
e0d80184 1277/* Return 1 if OP is a valid operand for the source of a move insn. */
61a55e8b 1278
e0d80184
DM
1279int
1280input_operand (op, mode)
1281 rtx op;
1282 enum machine_mode mode;
1283{
1284 /* If both modes are non-void they must be the same. */
1285 if (mode != VOIDmode && GET_MODE (op) != VOIDmode && mode != GET_MODE (op))
1286 return 0;
61a55e8b 1287
11301057
RH
1288 /* Only a tiny bit of handling for CONSTANT_P_RTX is necessary. */
1289 if (GET_CODE (op) == CONST && GET_CODE (XEXP (op, 0)) == CONSTANT_P_RTX)
1290 return 1;
1291
e0d80184
DM
1292 /* Allow any one instruction integer constant, and all CONST_INT
1293 variants when we are working in DImode and !arch64. */
1294 if (GET_MODE_CLASS (mode) == MODE_INT
9208e4b2 1295 && ((GET_CODE (op) == CONST_INT
7d6040e8 1296 && (SPARC_SETHI_P (INTVAL (op) & GET_MODE_MASK (mode))
9208e4b2
DM
1297 || SPARC_SIMM13_P (INTVAL (op))
1298 || (mode == DImode
1299 && ! TARGET_ARCH64)))
1300 || (TARGET_ARCH64
1301 && GET_CODE (op) == CONST_DOUBLE
1302 && ((CONST_DOUBLE_HIGH (op) == 0
1303 && SPARC_SETHI_P (CONST_DOUBLE_LOW (op)))
1304 ||
1305#if HOST_BITS_PER_WIDE_INT == 64
1306 (CONST_DOUBLE_HIGH (op) == 0
1307 && SPARC_SIMM13_P (CONST_DOUBLE_LOW (op)))
1308#else
1309 (SPARC_SIMM13_P (CONST_DOUBLE_LOW (op))
1310 && (((CONST_DOUBLE_LOW (op) & 0x80000000) == 0
1311 && CONST_DOUBLE_HIGH (op) == 0)
4746e0fe
RK
1312 || (CONST_DOUBLE_HIGH (op) == -1
1313 && CONST_DOUBLE_LOW (op) & 0x80000000) != 0))
9208e4b2
DM
1314#endif
1315 ))))
e0d80184
DM
1316 return 1;
1317
e0d80184
DM
1318 /* If !arch64 and this is a DImode const, allow it so that
1319 the splits can be generated. */
1320 if (! TARGET_ARCH64
1321 && mode == DImode
1322 && GET_CODE (op) == CONST_DOUBLE)
1323 return 1;
1324
1325 if (register_operand (op, mode))
1326 return 1;
1327
62190128
DM
1328 if (GET_MODE_CLASS (mode) == MODE_FLOAT
1329 && GET_CODE (op) == CONST_DOUBLE)
1330 return 1;
1331
e0d80184
DM
1332 /* If this is a SUBREG, look inside so that we handle
1333 paradoxical ones. */
1334 if (GET_CODE (op) == SUBREG)
1335 op = SUBREG_REG (op);
1336
1337 /* Check for valid MEM forms. */
1338 if (GET_CODE (op) == MEM)
61a55e8b 1339 {
e0d80184 1340 rtx inside = XEXP (op, 0);
61a55e8b 1341
e0d80184 1342 if (GET_CODE (inside) == LO_SUM)
03ad6f4d
DM
1343 {
1344 /* We can't allow these because all of the splits
1345 (eventually as they trickle down into DFmode
1346 splits) require offsettable memory references. */
1347 if (! TARGET_V9
1348 && GET_MODE (op) == TFmode)
1349 return 0;
1350
1351 return (register_operand (XEXP (inside, 0), Pmode)
1352 && CONSTANT_P (XEXP (inside, 1)));
1353 }
e0d80184 1354 return memory_address_p (mode, inside);
61a55e8b 1355 }
ab835497 1356
e0d80184
DM
1357 return 0;
1358}
1359
1360\f
1361/* We know it can't be done in one insn when we get here,
1362 the movsi expander guarentees this. */
1363void
1364sparc_emit_set_const32 (op0, op1)
1365 rtx op0;
1366 rtx op1;
1367{
1368 enum machine_mode mode = GET_MODE (op0);
1369 rtx temp;
1370
1371 if (GET_CODE (op1) == CONST_INT)
284d86e9 1372 {
2a01c939 1373 HOST_WIDE_INT value = INTVAL (op1);
e0d80184 1374
7d6040e8 1375 if (SPARC_SETHI_P (value & GET_MODE_MASK (mode))
e0d80184
DM
1376 || SPARC_SIMM13_P (value))
1377 abort ();
284d86e9 1378 }
e0d80184
DM
1379
1380 /* Full 2-insn decomposition is needed. */
1381 if (reload_in_progress || reload_completed)
1382 temp = op0;
284d86e9 1383 else
e0d80184
DM
1384 temp = gen_reg_rtx (mode);
1385
71648202
DM
1386 if (GET_CODE (op1) == CONST_INT)
1387 {
1388 /* Emit them as real moves instead of a HIGH/LO_SUM,
1389 this way CSE can see everything and reuse intermediate
1390 values if it wants. */
1391 if (TARGET_ARCH64
1392 && HOST_BITS_PER_WIDE_INT != 64
1393 && (INTVAL (op1) & 0x80000000) != 0)
f2827474
RK
1394 emit_insn (gen_rtx_SET
1395 (VOIDmode, temp,
5692c7bc
ZW
1396 immed_double_const (INTVAL (op1) & ~(HOST_WIDE_INT)0x3ff,
1397 0, DImode)));
71648202 1398 else
f2827474 1399 emit_insn (gen_rtx_SET (VOIDmode, temp,
9e0625a3
AO
1400 GEN_INT (INTVAL (op1)
1401 & ~(HOST_WIDE_INT)0x3ff)));
f2827474 1402
71648202
DM
1403 emit_insn (gen_rtx_SET (VOIDmode,
1404 op0,
f2827474 1405 gen_rtx_IOR (mode, temp,
71648202
DM
1406 GEN_INT (INTVAL (op1) & 0x3ff))));
1407 }
1408 else
1409 {
1410 /* A symbol, emit in the traditional way. */
f2827474
RK
1411 emit_insn (gen_rtx_SET (VOIDmode, temp,
1412 gen_rtx_HIGH (mode, op1)));
71648202 1413 emit_insn (gen_rtx_SET (VOIDmode,
f2827474 1414 op0, gen_rtx_LO_SUM (mode, temp, op1)));
71648202
DM
1415
1416 }
e0d80184
DM
1417}
1418
1419\f
56149abc 1420/* SPARC-v9 code-model support. */
e0d80184
DM
1421void
1422sparc_emit_set_symbolic_const64 (op0, op1, temp1)
1423 rtx op0;
1424 rtx op1;
1425 rtx temp1;
1426{
3968de80
DD
1427 rtx ti_temp1 = 0;
1428
1429 if (temp1 && GET_MODE (temp1) == TImode)
1430 {
1431 ti_temp1 = temp1;
1432 temp1 = gen_rtx_REG (DImode, REGNO (temp1));
1433 }
1434
e0d80184 1435 switch (sparc_cmodel)
284d86e9 1436 {
e0d80184
DM
1437 case CM_MEDLOW:
1438 /* The range spanned by all instructions in the object is less
1439 than 2^31 bytes (2GB) and the distance from any instruction
1440 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1441 than 2^31 bytes (2GB).
ab835497 1442
e0d80184
DM
1443 The executable must be in the low 4TB of the virtual address
1444 space.
61a55e8b 1445
e0d80184
DM
1446 sethi %hi(symbol), %temp
1447 or %temp, %lo(symbol), %reg */
9208e4b2
DM
1448 emit_insn (gen_rtx_SET (VOIDmode, temp1, gen_rtx_HIGH (DImode, op1)));
1449 emit_insn (gen_rtx_SET (VOIDmode, op0, gen_rtx_LO_SUM (DImode, temp1, op1)));
e0d80184 1450 break;
61a55e8b 1451
e0d80184
DM
1452 case CM_MEDMID:
1453 /* The range spanned by all instructions in the object is less
1454 than 2^31 bytes (2GB) and the distance from any instruction
1455 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1456 than 2^31 bytes (2GB).
1457
1458 The executable must be in the low 16TB of the virtual address
1459 space.
1460
1461 sethi %h44(symbol), %temp1
1462 or %temp1, %m44(symbol), %temp2
1463 sllx %temp2, 12, %temp3
1464 or %temp3, %l44(symbol), %reg */
1465 emit_insn (gen_seth44 (op0, op1));
1466 emit_insn (gen_setm44 (op0, op0, op1));
9208e4b2 1467 emit_insn (gen_rtx_SET (VOIDmode, temp1,
e0d80184
DM
1468 gen_rtx_ASHIFT (DImode, op0, GEN_INT (12))));
1469 emit_insn (gen_setl44 (op0, temp1, op1));
1470 break;
61a55e8b 1471
e0d80184
DM
1472 case CM_MEDANY:
1473 /* The range spanned by all instructions in the object is less
1474 than 2^31 bytes (2GB) and the distance from any instruction
1475 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1476 than 2^31 bytes (2GB).
1477
1478 The executable can be placed anywhere in the virtual address
1479 space.
1480
1481 sethi %hh(symbol), %temp1
1482 sethi %lm(symbol), %temp2
1483 or %temp1, %hm(symbol), %temp3
1484 or %temp2, %lo(symbol), %temp4
1485 sllx %temp3, 32, %temp5
1486 or %temp4, %temp5, %reg */
1487
3968de80
DD
1488 /* It is possible that one of the registers we got for operands[2]
1489 might coincide with that of operands[0] (which is why we made
1490 it TImode). Pick the other one to use as our scratch. */
6cd444b4 1491 if (rtx_equal_p (temp1, op0))
3968de80
DD
1492 {
1493 if (ti_temp1)
1494 temp1 = gen_rtx_REG (DImode, REGNO (temp1) + 1);
1495 else
1496 abort();
1497 }
61a55e8b 1498
e0d80184
DM
1499 emit_insn (gen_sethh (op0, op1));
1500 emit_insn (gen_setlm (temp1, op1));
1501 emit_insn (gen_sethm (op0, op0, op1));
9208e4b2 1502 emit_insn (gen_rtx_SET (VOIDmode, op0,
e0d80184 1503 gen_rtx_ASHIFT (DImode, op0, GEN_INT (32))));
9208e4b2 1504 emit_insn (gen_rtx_SET (VOIDmode, op0,
e0d80184
DM
1505 gen_rtx_PLUS (DImode, op0, temp1)));
1506 emit_insn (gen_setlo (op0, op0, op1));
1507 break;
61a55e8b 1508
e0d80184
DM
1509 case CM_EMBMEDANY:
1510 /* Old old old backwards compatibility kruft here.
1511 Essentially it is MEDLOW with a fixed 64-bit
1512 virtual base added to all data segment addresses.
1513 Text-segment stuff is computed like MEDANY, we can't
1514 reuse the code above because the relocation knobs
1515 look different.
1516
1517 Data segment: sethi %hi(symbol), %temp1
1518 or %temp1, %lo(symbol), %temp2
1519 add %temp2, EMBMEDANY_BASE_REG, %reg
1520
1521 Text segment: sethi %uhi(symbol), %temp1
1522 sethi %hi(symbol), %temp2
1523 or %temp1, %ulo(symbol), %temp3
1524 or %temp2, %lo(symbol), %temp4
1525 sllx %temp3, 32, %temp5
1526 or %temp4, %temp5, %reg */
1527 if (data_segment_operand (op1, GET_MODE (op1)))
1528 {
1529 emit_insn (gen_embmedany_sethi (temp1, op1));
1530 emit_insn (gen_embmedany_brsum (op0, temp1));
1531 emit_insn (gen_embmedany_losum (op0, op0, op1));
1532 }
1533 else
1534 {
3968de80
DD
1535 /* It is possible that one of the registers we got for operands[2]
1536 might coincide with that of operands[0] (which is why we made
1537 it TImode). Pick the other one to use as our scratch. */
1538 if (rtx_equal_p (temp1, op0))
1539 {
1540 if (ti_temp1)
1541 temp1 = gen_rtx_REG (DImode, REGNO (temp1) + 1);
1542 else
1543 abort();
1544 }
61a55e8b 1545
e0d80184
DM
1546 emit_insn (gen_embmedany_textuhi (op0, op1));
1547 emit_insn (gen_embmedany_texthi (temp1, op1));
1548 emit_insn (gen_embmedany_textulo (op0, op0, op1));
9208e4b2 1549 emit_insn (gen_rtx_SET (VOIDmode, op0,
e0d80184 1550 gen_rtx_ASHIFT (DImode, op0, GEN_INT (32))));
9208e4b2 1551 emit_insn (gen_rtx_SET (VOIDmode, op0,
e0d80184
DM
1552 gen_rtx_PLUS (DImode, op0, temp1)));
1553 emit_insn (gen_embmedany_textlo (op0, op0, op1));
1554 }
1555 break;
1556
1557 default:
1558 abort();
1559 }
1560}
1561
9208e4b2
DM
1562/* These avoid problems when cross compiling. If we do not
1563 go through all this hair then the optimizer will see
1564 invalid REG_EQUAL notes or in some cases none at all. */
f6da8bc3
KG
1565static void sparc_emit_set_safe_HIGH64 PARAMS ((rtx, HOST_WIDE_INT));
1566static rtx gen_safe_SET64 PARAMS ((rtx, HOST_WIDE_INT));
1567static rtx gen_safe_OR64 PARAMS ((rtx, HOST_WIDE_INT));
1568static rtx gen_safe_XOR64 PARAMS ((rtx, HOST_WIDE_INT));
9208e4b2
DM
1569
1570#if HOST_BITS_PER_WIDE_INT == 64
9e0625a3 1571#define GEN_HIGHINT64(__x) GEN_INT ((__x) & ~(HOST_WIDE_INT)0x3ff)
9208e4b2
DM
1572#define GEN_INT64(__x) GEN_INT (__x)
1573#else
1574#define GEN_HIGHINT64(__x) \
5692c7bc 1575 immed_double_const ((__x) & ~(HOST_WIDE_INT)0x3ff, 0, DImode)
9208e4b2 1576#define GEN_INT64(__x) \
5692c7bc
ZW
1577 immed_double_const ((__x) & 0xffffffff, \
1578 ((__x) & 0x80000000 ? -1 : 0), DImode)
9208e4b2
DM
1579#endif
1580
1581/* The optimizer is not to assume anything about exactly
1582 which bits are set for a HIGH, they are unspecified.
1583 Unfortunately this leads to many missed optimizations
1584 during CSE. We mask out the non-HIGH bits, and matches
1585 a plain movdi, to alleviate this problem. */
1586static void
1587sparc_emit_set_safe_HIGH64 (dest, val)
1588 rtx dest;
1589 HOST_WIDE_INT val;
1590{
1591 emit_insn (gen_rtx_SET (VOIDmode, dest, GEN_HIGHINT64 (val)));
1592}
2a01c939 1593
e0d80184 1594static rtx
9208e4b2
DM
1595gen_safe_SET64 (dest, val)
1596 rtx dest;
e0d80184 1597 HOST_WIDE_INT val;
61a55e8b 1598{
9208e4b2
DM
1599 return gen_rtx_SET (VOIDmode, dest, GEN_INT64 (val));
1600}
1601
1602static rtx
1603gen_safe_OR64 (src, val)
1604 rtx src;
1605 HOST_WIDE_INT val;
1606{
1607 return gen_rtx_IOR (DImode, src, GEN_INT64 (val));
1608}
1609
1610static rtx
1611gen_safe_XOR64 (src, val)
1612 rtx src;
1613 HOST_WIDE_INT val;
1614{
1615 return gen_rtx_XOR (DImode, src, GEN_INT64 (val));
e0d80184 1616}
61a55e8b 1617
e0d80184
DM
1618/* Worker routines for 64-bit constant formation on arch64.
1619 One of the key things to be doing in these emissions is
1620 to create as many temp REGs as possible. This makes it
1621 possible for half-built constants to be used later when
1622 such values are similar to something required later on.
1623 Without doing this, the optimizer cannot see such
1624 opportunities. */
2a01c939
DM
1625
1626static void sparc_emit_set_const64_quick1
f6da8bc3 1627 PARAMS ((rtx, rtx, unsigned HOST_WIDE_INT, int));
2a01c939 1628
e0d80184
DM
1629static void
1630sparc_emit_set_const64_quick1 (op0, temp, low_bits, is_neg)
1631 rtx op0;
1632 rtx temp;
2a01c939 1633 unsigned HOST_WIDE_INT low_bits;
e0d80184
DM
1634 int is_neg;
1635{
2a01c939 1636 unsigned HOST_WIDE_INT high_bits;
a9e27770 1637
e0d80184 1638 if (is_neg)
2a01c939 1639 high_bits = (~low_bits) & 0xffffffff;
31bc9eba 1640 else
e0d80184 1641 high_bits = low_bits;
31bc9eba 1642
9208e4b2 1643 sparc_emit_set_safe_HIGH64 (temp, high_bits);
e0d80184 1644 if (!is_neg)
5108f3e5
DM
1645 {
1646 emit_insn (gen_rtx_SET (VOIDmode, op0,
1647 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
1648 }
e0d80184 1649 else
5108f3e5
DM
1650 {
1651 /* If we are XOR'ing with -1, then we should emit a one's complement
1652 instead. This way the combiner will notice logical operations
1653 such as ANDN later on and substitute. */
1654 if ((low_bits & 0x3ff) == 0x3ff)
1655 {
1656 emit_insn (gen_rtx_SET (VOIDmode, op0,
1657 gen_rtx_NOT (DImode, temp)));
1658 }
1659 else
1660 {
1661 emit_insn (gen_rtx_SET (VOIDmode, op0,
1662 gen_safe_XOR64 (temp,
9e0625a3
AO
1663 (-(HOST_WIDE_INT)0x400
1664 | (low_bits & 0x3ff)))));
5108f3e5
DM
1665 }
1666 }
e0d80184 1667}
61a55e8b 1668
2a01c939 1669static void sparc_emit_set_const64_quick2
f6da8bc3 1670 PARAMS ((rtx, rtx, unsigned HOST_WIDE_INT,
2a01c939
DM
1671 unsigned HOST_WIDE_INT, int));
1672
e0d80184
DM
1673static void
1674sparc_emit_set_const64_quick2 (op0, temp, high_bits, low_immediate, shift_count)
1675 rtx op0;
1676 rtx temp;
2a01c939
DM
1677 unsigned HOST_WIDE_INT high_bits;
1678 unsigned HOST_WIDE_INT low_immediate;
e0d80184
DM
1679 int shift_count;
1680{
1681 rtx temp2 = op0;
61a55e8b 1682
e0d80184
DM
1683 if ((high_bits & 0xfffffc00) != 0)
1684 {
9208e4b2 1685 sparc_emit_set_safe_HIGH64 (temp, high_bits);
e0d80184 1686 if ((high_bits & ~0xfffffc00) != 0)
9208e4b2
DM
1687 emit_insn (gen_rtx_SET (VOIDmode, op0,
1688 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
61a55e8b 1689 else
e0d80184 1690 temp2 = temp;
61a55e8b
DE
1691 }
1692 else
1693 {
f710f868 1694 emit_insn (gen_safe_SET64 (temp, high_bits));
e0d80184
DM
1695 temp2 = temp;
1696 }
61a55e8b 1697
80ffc95e 1698 /* Now shift it up into place. */
9208e4b2 1699 emit_insn (gen_rtx_SET (VOIDmode, op0,
e0d80184
DM
1700 gen_rtx_ASHIFT (DImode, temp2,
1701 GEN_INT (shift_count))));
61a55e8b 1702
e0d80184
DM
1703 /* If there is a low immediate part piece, finish up by
1704 putting that in as well. */
1705 if (low_immediate != 0)
9208e4b2
DM
1706 emit_insn (gen_rtx_SET (VOIDmode, op0,
1707 gen_safe_OR64 (op0, low_immediate)));
ab835497
RK
1708}
1709
2a01c939 1710static void sparc_emit_set_const64_longway
f6da8bc3 1711 PARAMS ((rtx, rtx, unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT));
2a01c939 1712
e0d80184
DM
1713/* Full 64-bit constant decomposition. Even though this is the
1714 'worst' case, we still optimize a few things away. */
1715static void
1716sparc_emit_set_const64_longway (op0, temp, high_bits, low_bits)
1717 rtx op0;
1718 rtx temp;
2a01c939
DM
1719 unsigned HOST_WIDE_INT high_bits;
1720 unsigned HOST_WIDE_INT low_bits;
ab835497 1721{
e0d80184 1722 rtx sub_temp;
4bf7135b 1723
e0d80184
DM
1724 if (reload_in_progress || reload_completed)
1725 sub_temp = op0;
1726 else
1727 sub_temp = gen_reg_rtx (DImode);
1728
1729 if ((high_bits & 0xfffffc00) != 0)
1730 {
9208e4b2 1731 sparc_emit_set_safe_HIGH64 (temp, high_bits);
e0d80184 1732 if ((high_bits & ~0xfffffc00) != 0)
9208e4b2 1733 emit_insn (gen_rtx_SET (VOIDmode,
e0d80184 1734 sub_temp,
9208e4b2 1735 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
e0d80184
DM
1736 else
1737 sub_temp = temp;
1738 }
1739 else
ab835497 1740 {
f710f868 1741 emit_insn (gen_safe_SET64 (temp, high_bits));
e0d80184 1742 sub_temp = temp;
ab835497 1743 }
4bf7135b 1744
e0d80184 1745 if (!reload_in_progress && !reload_completed)
284d86e9 1746 {
e0d80184
DM
1747 rtx temp2 = gen_reg_rtx (DImode);
1748 rtx temp3 = gen_reg_rtx (DImode);
1749 rtx temp4 = gen_reg_rtx (DImode);
284d86e9 1750
9208e4b2 1751 emit_insn (gen_rtx_SET (VOIDmode, temp4,
e0d80184
DM
1752 gen_rtx_ASHIFT (DImode, sub_temp,
1753 GEN_INT (32))));
4bf7135b 1754
9208e4b2 1755 sparc_emit_set_safe_HIGH64 (temp2, low_bits);
e0d80184 1756 if ((low_bits & ~0xfffffc00) != 0)
f710f868
DM
1757 {
1758 emit_insn (gen_rtx_SET (VOIDmode, temp3,
1759 gen_safe_OR64 (temp2, (low_bits & 0x3ff))));
1760 emit_insn (gen_rtx_SET (VOIDmode, op0,
1761 gen_rtx_PLUS (DImode, temp4, temp3)));
1762 }
1763 else
1764 {
1765 emit_insn (gen_rtx_SET (VOIDmode, op0,
1766 gen_rtx_PLUS (DImode, temp4, temp2)));
1767 }
284d86e9 1768 }
e0d80184
DM
1769 else
1770 {
9208e4b2
DM
1771 rtx low1 = GEN_INT ((low_bits >> (32 - 12)) & 0xfff);
1772 rtx low2 = GEN_INT ((low_bits >> (32 - 12 - 12)) & 0xfff);
1773 rtx low3 = GEN_INT ((low_bits >> (32 - 12 - 12 - 8)) & 0x0ff);
e0d80184 1774 int to_shift = 12;
284d86e9 1775
e0d80184
DM
1776 /* We are in the middle of reload, so this is really
1777 painful. However we do still make an attempt to
5108f3e5 1778 avoid emitting truly stupid code. */
e0d80184
DM
1779 if (low1 != const0_rtx)
1780 {
9208e4b2 1781 emit_insn (gen_rtx_SET (VOIDmode, op0,
e0d80184 1782 gen_rtx_ASHIFT (DImode, sub_temp,
2a01c939 1783 GEN_INT (to_shift))));
9208e4b2 1784 emit_insn (gen_rtx_SET (VOIDmode, op0,
e0d80184
DM
1785 gen_rtx_IOR (DImode, op0, low1)));
1786 sub_temp = op0;
1787 to_shift = 12;
1788 }
1789 else
1790 {
1791 to_shift += 12;
1792 }
1793 if (low2 != const0_rtx)
1794 {
9208e4b2 1795 emit_insn (gen_rtx_SET (VOIDmode, op0,
e0d80184
DM
1796 gen_rtx_ASHIFT (DImode, sub_temp,
1797 GEN_INT (to_shift))));
9208e4b2 1798 emit_insn (gen_rtx_SET (VOIDmode, op0,
e0d80184
DM
1799 gen_rtx_IOR (DImode, op0, low2)));
1800 sub_temp = op0;
1801 to_shift = 8;
1802 }
1803 else
1804 {
1805 to_shift += 8;
1806 }
9208e4b2 1807 emit_insn (gen_rtx_SET (VOIDmode, op0,
e0d80184
DM
1808 gen_rtx_ASHIFT (DImode, sub_temp,
1809 GEN_INT (to_shift))));
1810 if (low3 != const0_rtx)
9208e4b2 1811 emit_insn (gen_rtx_SET (VOIDmode, op0,
e0d80184 1812 gen_rtx_IOR (DImode, op0, low3)));
80ffc95e 1813 /* phew... */
e0d80184 1814 }
284d86e9
JC
1815}
1816
80ffc95e 1817/* Analyze a 64-bit constant for certain properties. */
2a01c939 1818static void analyze_64bit_constant
f6da8bc3 1819 PARAMS ((unsigned HOST_WIDE_INT,
2a01c939
DM
1820 unsigned HOST_WIDE_INT,
1821 int *, int *, int *));
1822
e0d80184
DM
1823static void
1824analyze_64bit_constant (high_bits, low_bits, hbsp, lbsp, abbasp)
2a01c939 1825 unsigned HOST_WIDE_INT high_bits, low_bits;
e0d80184 1826 int *hbsp, *lbsp, *abbasp;
ab835497 1827{
e0d80184
DM
1828 int lowest_bit_set, highest_bit_set, all_bits_between_are_set;
1829 int i;
ab835497 1830
e0d80184
DM
1831 lowest_bit_set = highest_bit_set = -1;
1832 i = 0;
1833 do
ab835497 1834 {
e0d80184
DM
1835 if ((lowest_bit_set == -1)
1836 && ((low_bits >> i) & 1))
1837 lowest_bit_set = i;
1838 if ((highest_bit_set == -1)
1839 && ((high_bits >> (32 - i - 1)) & 1))
1840 highest_bit_set = (64 - i - 1);
1841 }
1842 while (++i < 32
1843 && ((highest_bit_set == -1)
1844 || (lowest_bit_set == -1)));
1845 if (i == 32)
1846 {
1847 i = 0;
1848 do
ab835497 1849 {
e0d80184
DM
1850 if ((lowest_bit_set == -1)
1851 && ((high_bits >> i) & 1))
1852 lowest_bit_set = i + 32;
1853 if ((highest_bit_set == -1)
1854 && ((low_bits >> (32 - i - 1)) & 1))
1855 highest_bit_set = 32 - i - 1;
ab835497 1856 }
e0d80184
DM
1857 while (++i < 32
1858 && ((highest_bit_set == -1)
1859 || (lowest_bit_set == -1)));
1860 }
1861 /* If there are no bits set this should have gone out
1862 as one instruction! */
1863 if (lowest_bit_set == -1
1864 || highest_bit_set == -1)
9208e4b2 1865 abort ();
e0d80184
DM
1866 all_bits_between_are_set = 1;
1867 for (i = lowest_bit_set; i <= highest_bit_set; i++)
1868 {
1869 if (i < 32)
1870 {
1871 if ((low_bits & (1 << i)) != 0)
1872 continue;
1873 }
1874 else
1875 {
1876 if ((high_bits & (1 << (i - 32))) != 0)
1877 continue;
1878 }
1879 all_bits_between_are_set = 0;
1880 break;
ab835497 1881 }
e0d80184
DM
1882 *hbsp = highest_bit_set;
1883 *lbsp = lowest_bit_set;
1884 *abbasp = all_bits_between_are_set;
ab835497 1885}
6a4bb1fa 1886
2a01c939 1887static int const64_is_2insns
f6da8bc3 1888 PARAMS ((unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT));
2a01c939 1889
e0d80184
DM
1890static int
1891const64_is_2insns (high_bits, low_bits)
2a01c939 1892 unsigned HOST_WIDE_INT high_bits, low_bits;
e0d80184
DM
1893{
1894 int highest_bit_set, lowest_bit_set, all_bits_between_are_set;
284d86e9 1895
e0d80184 1896 if (high_bits == 0
f451b552 1897 || high_bits == 0xffffffff)
e0d80184 1898 return 1;
6a4bb1fa 1899
e0d80184
DM
1900 analyze_64bit_constant (high_bits, low_bits,
1901 &highest_bit_set, &lowest_bit_set,
1902 &all_bits_between_are_set);
6a4bb1fa 1903
f710f868
DM
1904 if ((highest_bit_set == 63
1905 || lowest_bit_set == 0)
e0d80184
DM
1906 && all_bits_between_are_set != 0)
1907 return 1;
6a4bb1fa 1908
9208e4b2
DM
1909 if ((highest_bit_set - lowest_bit_set) < 21)
1910 return 1;
1911
6a4bb1fa
DE
1912 return 0;
1913}
1914
2a01c939 1915static unsigned HOST_WIDE_INT create_simple_focus_bits
f6da8bc3 1916 PARAMS ((unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT,
ddf80874 1917 int, int));
2a01c939
DM
1918
1919static unsigned HOST_WIDE_INT
ddf80874 1920create_simple_focus_bits (high_bits, low_bits, lowest_bit_set, shift)
2a01c939 1921 unsigned HOST_WIDE_INT high_bits, low_bits;
ddf80874 1922 int lowest_bit_set, shift;
ab835497 1923{
f710f868 1924 HOST_WIDE_INT hi, lo;
ab835497 1925
e0d80184
DM
1926 if (lowest_bit_set < 32)
1927 {
1928 lo = (low_bits >> lowest_bit_set) << shift;
1929 hi = ((high_bits << (32 - lowest_bit_set)) << shift);
1930 }
1931 else
1932 {
1933 lo = 0;
1934 hi = ((high_bits >> (lowest_bit_set - 32)) << shift);
1935 }
1936 if (hi & lo)
9208e4b2 1937 abort ();
e0d80184
DM
1938 return (hi | lo);
1939}
ab835497 1940
e0d80184
DM
1941/* Here we are sure to be arch64 and this is an integer constant
1942 being loaded into a register. Emit the most efficient
1943 insn sequence possible. Detection of all the 1-insn cases
1944 has been done already. */
1945void
1946sparc_emit_set_const64 (op0, op1)
1947 rtx op0;
1948 rtx op1;
1949{
2a01c939 1950 unsigned HOST_WIDE_INT high_bits, low_bits;
e0d80184
DM
1951 int lowest_bit_set, highest_bit_set;
1952 int all_bits_between_are_set;
e0d80184 1953 rtx temp;
ab835497 1954
e0d80184 1955 /* Sanity check that we know what we are working with. */
380f6ad3 1956 if (! TARGET_ARCH64)
9208e4b2 1957 abort ();
95726648 1958
380f6ad3
JJ
1959 if (GET_CODE (op0) != SUBREG)
1960 {
1961 if (GET_CODE (op0) != REG
1962 || (REGNO (op0) >= SPARC_FIRST_FP_REG
1963 && REGNO (op0) <= SPARC_LAST_V9_FP_REG))
1964 abort ();
1965 }
1966
f710f868
DM
1967 if (reload_in_progress || reload_completed)
1968 temp = op0;
1969 else
1970 temp = gen_reg_rtx (DImode);
1971
e0d80184
DM
1972 if (GET_CODE (op1) != CONST_DOUBLE
1973 && GET_CODE (op1) != CONST_INT)
1974 {
5f78aa30
JC
1975 sparc_emit_set_symbolic_const64 (op0, op1, temp);
1976 return;
e0d80184 1977 }
ab835497 1978
e0d80184
DM
1979 if (GET_CODE (op1) == CONST_DOUBLE)
1980 {
1981#if HOST_BITS_PER_WIDE_INT == 64
2a01c939 1982 high_bits = (CONST_DOUBLE_LOW (op1) >> 32) & 0xffffffff;
e0d80184
DM
1983 low_bits = CONST_DOUBLE_LOW (op1) & 0xffffffff;
1984#else
1985 high_bits = CONST_DOUBLE_HIGH (op1);
1986 low_bits = CONST_DOUBLE_LOW (op1);
1987#endif
ab835497 1988 }
e0d80184 1989 else
ab835497 1990 {
e0d80184 1991#if HOST_BITS_PER_WIDE_INT == 64
2a01c939 1992 high_bits = ((INTVAL (op1) >> 32) & 0xffffffff);
e0d80184
DM
1993 low_bits = (INTVAL (op1) & 0xffffffff);
1994#else
1995 high_bits = ((INTVAL (op1) < 0) ?
1996 0xffffffff :
1997 0x00000000);
1998 low_bits = INTVAL (op1);
1999#endif
2000 }
ab835497 2001
e0d80184
DM
2002 /* low_bits bits 0 --> 31
2003 high_bits bits 32 --> 63 */
ab835497 2004
e0d80184
DM
2005 analyze_64bit_constant (high_bits, low_bits,
2006 &highest_bit_set, &lowest_bit_set,
2007 &all_bits_between_are_set);
2008
2009 /* First try for a 2-insn sequence. */
2010
2011 /* These situations are preferred because the optimizer can
2012 * do more things with them:
2013 * 1) mov -1, %reg
2014 * sllx %reg, shift, %reg
2015 * 2) mov -1, %reg
2016 * srlx %reg, shift, %reg
2017 * 3) mov some_small_const, %reg
2018 * sllx %reg, shift, %reg
2019 */
2020 if (((highest_bit_set == 63
2021 || lowest_bit_set == 0)
2022 && all_bits_between_are_set != 0)
2a01c939 2023 || ((highest_bit_set - lowest_bit_set) < 12))
e0d80184 2024 {
9208e4b2 2025 HOST_WIDE_INT the_const = -1;
e0d80184
DM
2026 int shift = lowest_bit_set;
2027
f710f868
DM
2028 if ((highest_bit_set != 63
2029 && lowest_bit_set != 0)
2030 || all_bits_between_are_set == 0)
ab835497 2031 {
e0d80184 2032 the_const =
9208e4b2 2033 create_simple_focus_bits (high_bits, low_bits,
9208e4b2 2034 lowest_bit_set, 0);
ab835497 2035 }
e0d80184 2036 else if (lowest_bit_set == 0)
9208e4b2 2037 shift = -(63 - highest_bit_set);
e0d80184 2038
f710f868
DM
2039 if (! SPARC_SIMM13_P (the_const))
2040 abort ();
2041
9208e4b2 2042 emit_insn (gen_safe_SET64 (temp, the_const));
e0d80184 2043 if (shift > 0)
9208e4b2 2044 emit_insn (gen_rtx_SET (VOIDmode,
e0d80184
DM
2045 op0,
2046 gen_rtx_ASHIFT (DImode,
2047 temp,
2048 GEN_INT (shift))));
2049 else if (shift < 0)
9208e4b2 2050 emit_insn (gen_rtx_SET (VOIDmode,
e0d80184 2051 op0,
9208e4b2 2052 gen_rtx_LSHIFTRT (DImode,
e0d80184
DM
2053 temp,
2054 GEN_INT (-shift))));
ab835497
RK
2055 else
2056 abort ();
e0d80184
DM
2057 return;
2058 }
ab835497 2059
e0d80184
DM
2060 /* Now a range of 22 or less bits set somewhere.
2061 * 1) sethi %hi(focus_bits), %reg
2062 * sllx %reg, shift, %reg
2063 * 2) sethi %hi(focus_bits), %reg
2064 * srlx %reg, shift, %reg
2065 */
2a01c939 2066 if ((highest_bit_set - lowest_bit_set) < 21)
e0d80184 2067 {
2a01c939 2068 unsigned HOST_WIDE_INT focus_bits =
e0d80184 2069 create_simple_focus_bits (high_bits, low_bits,
ddf80874 2070 lowest_bit_set, 10);
f710f868
DM
2071
2072 if (! SPARC_SETHI_P (focus_bits))
2073 abort ();
2074
9208e4b2 2075 sparc_emit_set_safe_HIGH64 (temp, focus_bits);
e0d80184 2076
9208e4b2 2077 /* If lowest_bit_set == 10 then a sethi alone could have done it. */
e0d80184 2078 if (lowest_bit_set < 10)
9208e4b2 2079 emit_insn (gen_rtx_SET (VOIDmode,
e0d80184 2080 op0,
9208e4b2 2081 gen_rtx_LSHIFTRT (DImode, temp,
e0d80184 2082 GEN_INT (10 - lowest_bit_set))));
9208e4b2
DM
2083 else if (lowest_bit_set > 10)
2084 emit_insn (gen_rtx_SET (VOIDmode,
e0d80184
DM
2085 op0,
2086 gen_rtx_ASHIFT (DImode, temp,
2087 GEN_INT (lowest_bit_set - 10))));
2088 else
9208e4b2 2089 abort ();
e0d80184
DM
2090 return;
2091 }
2092
2093 /* 1) sethi %hi(low_bits), %reg
2094 * or %reg, %lo(low_bits), %reg
2095 * 2) sethi %hi(~low_bits), %reg
2096 * xor %reg, %lo(-0x400 | (low_bits & 0x3ff)), %reg
2097 */
2098 if (high_bits == 0
2a01c939 2099 || high_bits == 0xffffffff)
5f78aa30
JC
2100 {
2101 sparc_emit_set_const64_quick1 (op0, temp, low_bits,
2102 (high_bits == 0xffffffff));
2103 return;
2104 }
e0d80184 2105
f710f868
DM
2106 /* Now, try 3-insn sequences. */
2107
e0d80184
DM
2108 /* 1) sethi %hi(high_bits), %reg
2109 * or %reg, %lo(high_bits), %reg
2110 * sllx %reg, 32, %reg
2111 */
f710f868 2112 if (low_bits == 0)
5f78aa30 2113 {
f710f868 2114 sparc_emit_set_const64_quick2 (op0, temp, high_bits, 0, 32);
5f78aa30
JC
2115 return;
2116 }
e0d80184 2117
f710f868
DM
2118 /* We may be able to do something quick
2119 when the constant is negated, so try that. */
e0d80184
DM
2120 if (const64_is_2insns ((~high_bits) & 0xffffffff,
2121 (~low_bits) & 0xfffffc00))
2122 {
5108f3e5
DM
2123 /* NOTE: The trailing bits get XOR'd so we need the
2124 non-negated bits, not the negated ones. */
2125 unsigned HOST_WIDE_INT trailing_bits = low_bits & 0x3ff;
e0d80184
DM
2126
2127 if ((((~high_bits) & 0xffffffff) == 0
2128 && ((~low_bits) & 0x80000000) == 0)
2129 || (((~high_bits) & 0xffffffff) == 0xffffffff
2130 && ((~low_bits) & 0x80000000) != 0))
ab835497 2131 {
5108f3e5 2132 int fast_int = (~low_bits & 0xffffffff);
e0d80184 2133
5108f3e5
DM
2134 if ((SPARC_SETHI_P (fast_int)
2135 && (~high_bits & 0xffffffff) == 0)
2136 || SPARC_SIMM13_P (fast_int))
9208e4b2 2137 emit_insn (gen_safe_SET64 (temp, fast_int));
ab835497 2138 else
9208e4b2 2139 sparc_emit_set_const64 (temp, GEN_INT64 (fast_int));
ab835497 2140 }
e0d80184
DM
2141 else
2142 {
2143 rtx negated_const;
2144#if HOST_BITS_PER_WIDE_INT == 64
2145 negated_const = GEN_INT (((~low_bits) & 0xfffffc00) |
2146 (((HOST_WIDE_INT)((~high_bits) & 0xffffffff))<<32));
2147#else
5692c7bc
ZW
2148 negated_const = immed_double_const ((~low_bits) & 0xfffffc00,
2149 (~high_bits) & 0xffffffff,
2150 DImode);
e0d80184
DM
2151#endif
2152 sparc_emit_set_const64 (temp, negated_const);
2153 }
5108f3e5
DM
2154
2155 /* If we are XOR'ing with -1, then we should emit a one's complement
2156 instead. This way the combiner will notice logical operations
2157 such as ANDN later on and substitute. */
2158 if (trailing_bits == 0x3ff)
2159 {
2160 emit_insn (gen_rtx_SET (VOIDmode, op0,
2161 gen_rtx_NOT (DImode, temp)));
2162 }
2163 else
2164 {
2165 emit_insn (gen_rtx_SET (VOIDmode,
2166 op0,
2167 gen_safe_XOR64 (temp,
2168 (-0x400 | trailing_bits))));
2169 }
e0d80184 2170 return;
ab835497 2171 }
ab835497 2172
e0d80184
DM
2173 /* 1) sethi %hi(xxx), %reg
2174 * or %reg, %lo(xxx), %reg
2175 * sllx %reg, yyy, %reg
f710f868
DM
2176 *
2177 * ??? This is just a generalized version of the low_bits==0
2178 * thing above, FIXME...
e0d80184
DM
2179 */
2180 if ((highest_bit_set - lowest_bit_set) < 32)
2181 {
f710f868
DM
2182 unsigned HOST_WIDE_INT focus_bits =
2183 create_simple_focus_bits (high_bits, low_bits,
ddf80874 2184 lowest_bit_set, 0);
ab835497 2185
e0d80184
DM
2186 /* We can't get here in this state. */
2187 if (highest_bit_set < 32
2188 || lowest_bit_set >= 32)
9208e4b2 2189 abort ();
95726648 2190
e0d80184
DM
2191 /* So what we know is that the set bits straddle the
2192 middle of the 64-bit word. */
5f78aa30
JC
2193 sparc_emit_set_const64_quick2 (op0, temp,
2194 focus_bits, 0,
2195 lowest_bit_set);
2196 return;
e0d80184 2197 }
c85f7c16 2198
f710f868
DM
2199 /* 1) sethi %hi(high_bits), %reg
2200 * or %reg, %lo(high_bits), %reg
2201 * sllx %reg, 32, %reg
2202 * or %reg, low_bits, %reg
2203 */
2204 if (SPARC_SIMM13_P(low_bits)
2205 && ((int)low_bits > 0))
2206 {
2207 sparc_emit_set_const64_quick2 (op0, temp, high_bits, low_bits, 32);
2208 return;
2209 }
2210
80ffc95e 2211 /* The easiest way when all else fails, is full decomposition. */
e0d80184
DM
2212#if 0
2213 printf ("sparc_emit_set_const64: Hard constant [%08lx%08lx] neg[%08lx%08lx]\n",
2214 high_bits, low_bits, ~high_bits, ~low_bits);
2215#endif
2216 sparc_emit_set_const64_longway (op0, temp, high_bits, low_bits);
c85f7c16
JL
2217}
2218
e267e177
RH
2219/* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
2220 return the mode to be used for the comparison. For floating-point,
2221 CCFP[E]mode is used. CC_NOOVmode should be used when the first operand
2222 is a PLUS, MINUS, NEG, or ASHIFT. CCmode should be used when no special
2223 processing is needed. */
2224
2225enum machine_mode
2226select_cc_mode (op, x, y)
2227 enum rtx_code op;
2228 rtx x;
2229 rtx y ATTRIBUTE_UNUSED;
2230{
2231 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2232 {
2233 switch (op)
2234 {
2235 case EQ:
2236 case NE:
2237 case UNORDERED:
2238 case ORDERED:
2239 case UNLT:
2240 case UNLE:
2241 case UNGT:
2242 case UNGE:
2243 case UNEQ:
7913f3d0 2244 case LTGT:
e267e177
RH
2245 return CCFPmode;
2246
2247 case LT:
2248 case LE:
2249 case GT:
2250 case GE:
2251 return CCFPEmode;
2252
2253 default:
2254 abort ();
2255 }
2256 }
2257 else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
2258 || GET_CODE (x) == NEG || GET_CODE (x) == ASHIFT)
2259 {
2260 if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2261 return CCX_NOOVmode;
2262 else
2263 return CC_NOOVmode;
2264 }
2265 else
2266 {
2267 if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2268 return CCXmode;
2269 else
2270 return CCmode;
2271 }
2272}
2273
e0d80184
DM
2274/* X and Y are two things to compare using CODE. Emit the compare insn and
2275 return the rtx for the cc reg in the proper mode. */
c85f7c16 2276
e0d80184
DM
2277rtx
2278gen_compare_reg (code, x, y)
2279 enum rtx_code code;
2280 rtx x, y;
c85f7c16 2281{
e0d80184
DM
2282 enum machine_mode mode = SELECT_CC_MODE (code, x, y);
2283 rtx cc_reg;
c85f7c16 2284
e0d80184
DM
2285 /* ??? We don't have movcc patterns so we cannot generate pseudo regs for the
2286 fcc regs (cse can't tell they're really call clobbered regs and will
2287 remove a duplicate comparison even if there is an intervening function
2288 call - it will then try to reload the cc reg via an int reg which is why
2289 we need the movcc patterns). It is possible to provide the movcc
2290 patterns by using the ldxfsr/stxfsr v9 insns. I tried it: you need two
2291 registers (say %g1,%g5) and it takes about 6 insns. A better fix would be
2292 to tell cse that CCFPE mode registers (even pseudos) are call
2293 clobbered. */
c85f7c16 2294
e0d80184
DM
2295 /* ??? This is an experiment. Rather than making changes to cse which may
2296 or may not be easy/clean, we do our own cse. This is possible because
2297 we will generate hard registers. Cse knows they're call clobbered (it
2298 doesn't know the same thing about pseudos). If we guess wrong, no big
2299 deal, but if we win, great! */
c85f7c16 2300
e0d80184
DM
2301 if (TARGET_V9 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2302#if 1 /* experiment */
284d86e9 2303 {
e0d80184
DM
2304 int reg;
2305 /* We cycle through the registers to ensure they're all exercised. */
2306 static int next_fcc_reg = 0;
2307 /* Previous x,y for each fcc reg. */
2308 static rtx prev_args[4][2];
284d86e9 2309
e0d80184
DM
2310 /* Scan prev_args for x,y. */
2311 for (reg = 0; reg < 4; reg++)
2312 if (prev_args[reg][0] == x && prev_args[reg][1] == y)
2313 break;
2314 if (reg == 4)
2315 {
2316 reg = next_fcc_reg;
2317 prev_args[reg][0] = x;
2318 prev_args[reg][1] = y;
2319 next_fcc_reg = (next_fcc_reg + 1) & 3;
2320 }
2321 cc_reg = gen_rtx_REG (mode, reg + SPARC_FIRST_V9_FCC_REG);
284d86e9 2322 }
e0d80184
DM
2323#else
2324 cc_reg = gen_reg_rtx (mode);
2325#endif /* ! experiment */
2326 else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2327 cc_reg = gen_rtx_REG (mode, SPARC_FCC_REG);
2328 else
2329 cc_reg = gen_rtx_REG (mode, SPARC_ICC_REG);
284d86e9 2330
e0d80184
DM
2331 emit_insn (gen_rtx_SET (VOIDmode, cc_reg,
2332 gen_rtx_COMPARE (mode, x, y)));
c85f7c16 2333
e0d80184
DM
2334 return cc_reg;
2335}
c85f7c16 2336
e0d80184
DM
2337/* This function is used for v9 only.
2338 CODE is the code for an Scc's comparison.
2339 OPERANDS[0] is the target of the Scc insn.
2340 OPERANDS[1] is the value we compare against const0_rtx (which hasn't
2341 been generated yet).
c85f7c16 2342
e0d80184 2343 This function is needed to turn
ab835497 2344
e0d80184
DM
2345 (set (reg:SI 110)
2346 (gt (reg:CCX 100 %icc)
2347 (const_int 0)))
2348 into
2349 (set (reg:SI 110)
2350 (gt:DI (reg:CCX 100 %icc)
2351 (const_int 0)))
2352
2353 IE: The instruction recognizer needs to see the mode of the comparison to
2354 find the right instruction. We could use "gt:DI" right in the
2355 define_expand, but leaving it out allows us to handle DI, SI, etc.
ab835497 2356
e0d80184
DM
2357 We refer to the global sparc compare operands sparc_compare_op0 and
2358 sparc_compare_op1. */
ab835497
RK
2359
2360int
e0d80184
DM
2361gen_v9_scc (compare_code, operands)
2362 enum rtx_code compare_code;
2363 register rtx *operands;
ab835497 2364{
e0d80184 2365 rtx temp, op0, op1;
ab835497 2366
e0d80184
DM
2367 if (! TARGET_ARCH64
2368 && (GET_MODE (sparc_compare_op0) == DImode
2369 || GET_MODE (operands[0]) == DImode))
2370 return 0;
7e2feebf 2371
a42519be 2372 op0 = sparc_compare_op0;
e0d80184
DM
2373 op1 = sparc_compare_op1;
2374
2375 /* Try to use the movrCC insns. */
2376 if (TARGET_ARCH64
2377 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
2378 && op1 == const0_rtx
2379 && v9_regcmp_p (compare_code))
ab835497 2380 {
e0d80184 2381 /* Special case for op0 != 0. This can be done with one instruction if
a42519be 2382 operands[0] == sparc_compare_op0. */
e0d80184
DM
2383
2384 if (compare_code == NE
2385 && GET_MODE (operands[0]) == DImode
a42519be 2386 && rtx_equal_p (op0, operands[0]))
ab835497 2387 {
e0d80184
DM
2388 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2389 gen_rtx_IF_THEN_ELSE (DImode,
2390 gen_rtx_fmt_ee (compare_code, DImode,
2391 op0, const0_rtx),
2392 const1_rtx,
2393 operands[0])));
ab835497
RK
2394 return 1;
2395 }
e0d80184 2396
a42519be
JJ
2397 if (reg_overlap_mentioned_p (operands[0], op0))
2398 {
2399 /* Handle the case where operands[0] == sparc_compare_op0.
2400 We "early clobber" the result. */
2401 op0 = gen_reg_rtx (GET_MODE (sparc_compare_op0));
2402 emit_move_insn (op0, sparc_compare_op0);
2403 }
2404
e0d80184
DM
2405 emit_insn (gen_rtx_SET (VOIDmode, operands[0], const0_rtx));
2406 if (GET_MODE (op0) != DImode)
ab835497 2407 {
e0d80184
DM
2408 temp = gen_reg_rtx (DImode);
2409 convert_move (temp, op0, 0);
ab835497 2410 }
e0d80184
DM
2411 else
2412 temp = op0;
2413 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2414 gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
2415 gen_rtx_fmt_ee (compare_code, DImode,
2416 temp, const0_rtx),
2417 const1_rtx,
2418 operands[0])));
95726648
DE
2419 return 1;
2420 }
e0d80184 2421 else
ab835497 2422 {
e0d80184 2423 operands[1] = gen_compare_reg (compare_code, op0, op1);
ab835497 2424
e0d80184 2425 switch (GET_MODE (operands[1]))
ab835497 2426 {
e0d80184
DM
2427 case CCmode :
2428 case CCXmode :
2429 case CCFPEmode :
2430 case CCFPmode :
2431 break;
2432 default :
2433 abort ();
ab835497 2434 }
e0d80184
DM
2435 emit_insn (gen_rtx_SET (VOIDmode, operands[0], const0_rtx));
2436 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2437 gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
2438 gen_rtx_fmt_ee (compare_code,
2439 GET_MODE (operands[1]),
2440 operands[1], const0_rtx),
2441 const1_rtx, operands[0])));
2442 return 1;
ab835497 2443 }
ab835497 2444}
4fb4e4b8 2445
e0d80184
DM
2446/* Emit a conditional jump insn for the v9 architecture using comparison code
2447 CODE and jump target LABEL.
2448 This function exists to take advantage of the v9 brxx insns. */
ab835497 2449
e0d80184
DM
2450void
2451emit_v9_brxx_insn (code, op0, label)
2452 enum rtx_code code;
2453 rtx op0, label;
ab835497 2454{
e0d80184
DM
2455 emit_jump_insn (gen_rtx_SET (VOIDmode,
2456 pc_rtx,
2457 gen_rtx_IF_THEN_ELSE (VOIDmode,
2458 gen_rtx_fmt_ee (code, GET_MODE (op0),
2459 op0, const0_rtx),
2460 gen_rtx_LABEL_REF (VOIDmode, label),
2461 pc_rtx)));
2462}
7b1ac798
JJ
2463
2464/* Generate a DFmode part of a hard TFmode register.
2465 REG is the TFmode hard register, LOW is 1 for the
2466 low 64bit of the register and 0 otherwise.
2467 */
2468rtx
2469gen_df_reg (reg, low)
2470 rtx reg;
2471 int low;
2472{
2473 int regno = REGNO (reg);
2474
2475 if ((WORDS_BIG_ENDIAN == 0) ^ (low != 0))
2aac41d6 2476 regno += (TARGET_ARCH64 && regno < 32) ? 1 : 2;
7b1ac798
JJ
2477 return gen_rtx_REG (DFmode, regno);
2478}
e0d80184 2479\f
73985940
RH
2480/* Generate a call to FUNC with OPERANDS. Operand 0 is the return value.
2481 Unlike normal calls, TFmode operands are passed by reference. It is
2482 assumed that no more than 3 operands are required. */
2483
2484static void
2485emit_soft_tfmode_libcall (func_name, nargs, operands)
2486 const char *func_name;
2487 int nargs;
2488 rtx *operands;
2489{
2490 rtx ret_slot = NULL, arg[3], func_sym;
4e7d5d27 2491 int i;
73985940
RH
2492
2493 /* We only expect to be called for conversions, unary, and binary ops. */
2494 if (nargs < 2 || nargs > 3)
2495 abort ();
2496
2497 for (i = 0; i < nargs; ++i)
2498 {
2499 rtx this_arg = operands[i];
2500 rtx this_slot;
2501
2502 /* TFmode arguments and return values are passed by reference. */
2503 if (GET_MODE (this_arg) == TFmode)
2504 {
4e7d5d27
DM
2505 int force_stack_temp;
2506
2507 force_stack_temp = 0;
2508 if (TARGET_BUGGY_QP_LIB && i == 0)
2509 force_stack_temp = 1;
2510
2511 if (GET_CODE (this_arg) == MEM
2512 && ! force_stack_temp)
2513 this_arg = XEXP (this_arg, 0);
2514 else if (CONSTANT_P (this_arg)
2515 && ! force_stack_temp)
73985940
RH
2516 {
2517 this_slot = force_const_mem (TFmode, this_arg);
2518 this_arg = XEXP (this_slot, 0);
2519 }
2520 else
2521 {
2522 this_slot = assign_stack_temp (TFmode, GET_MODE_SIZE (TFmode), 0);
2523
2524 /* Operand 0 is the return value. We'll copy it out later. */
2525 if (i > 0)
2526 emit_move_insn (this_slot, this_arg);
2527 else
2528 ret_slot = this_slot;
2529
2530 this_arg = XEXP (this_slot, 0);
2531 }
2532 }
2533
2534 arg[i] = this_arg;
2535 }
2536
2537 func_sym = gen_rtx_SYMBOL_REF (Pmode, func_name);
2538
2539 if (GET_MODE (operands[0]) == TFmode)
2540 {
2541 if (nargs == 2)
2542 emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 2,
2543 arg[0], GET_MODE (arg[0]),
2544 arg[1], GET_MODE (arg[1]));
2545 else
2546 emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 3,
2547 arg[0], GET_MODE (arg[0]),
2548 arg[1], GET_MODE (arg[1]),
2549 arg[2], GET_MODE (arg[2]));
2550
2551 if (ret_slot)
2552 emit_move_insn (operands[0], ret_slot);
2553 }
2554 else
2555 {
2556 rtx ret;
2557
2558 if (nargs != 2)
2559 abort ();
2560
2561 ret = emit_library_call_value (func_sym, operands[0], LCT_NORMAL,
2562 GET_MODE (operands[0]), 1,
2563 arg[1], GET_MODE (arg[1]));
2564
2565 if (ret != operands[0])
2566 emit_move_insn (operands[0], ret);
2567 }
2568}
2569
2570/* Expand soft-float TFmode calls to sparc abi routines. */
2571
2572static void
2573emit_soft_tfmode_binop (code, operands)
2574 enum rtx_code code;
2575 rtx *operands;
2576{
2577 const char *func;
2578
2579 switch (code)
2580 {
2581 case PLUS:
2582 func = "_Qp_add";
2583 break;
2584 case MINUS:
2585 func = "_Qp_sub";
2586 break;
2587 case MULT:
2588 func = "_Qp_mul";
2589 break;
2590 case DIV:
2591 func = "_Qp_div";
2592 break;
2593 default:
2594 abort ();
2595 }
2596
2597 emit_soft_tfmode_libcall (func, 3, operands);
2598}
2599
2600static void
2601emit_soft_tfmode_unop (code, operands)
2602 enum rtx_code code;
2603 rtx *operands;
2604{
2605 const char *func;
2606
2607 switch (code)
2608 {
2609 case SQRT:
2610 func = "_Qp_sqrt";
2611 break;
2612 default:
2613 abort ();
2614 }
2615
2616 emit_soft_tfmode_libcall (func, 2, operands);
2617}
2618
2619static void
2620emit_soft_tfmode_cvt (code, operands)
2621 enum rtx_code code;
2622 rtx *operands;
2623{
2624 const char *func;
2625
2626 switch (code)
2627 {
2628 case FLOAT_EXTEND:
2629 switch (GET_MODE (operands[1]))
2630 {
2631 case SFmode:
2632 func = "_Qp_stoq";
2633 break;
2634 case DFmode:
2635 func = "_Qp_dtoq";
2636 break;
2637 default:
2638 abort ();
2639 }
2640 break;
2641
2642 case FLOAT_TRUNCATE:
2643 switch (GET_MODE (operands[0]))
2644 {
2645 case SFmode:
2646 func = "_Qp_qtos";
2647 break;
2648 case DFmode:
2649 func = "_Qp_qtod";
2650 break;
2651 default:
2652 abort ();
2653 }
2654 break;
2655
2656 case FLOAT:
2657 switch (GET_MODE (operands[1]))
2658 {
2659 case SImode:
2660 func = "_Qp_itoq";
2661 break;
2662 case DImode:
2663 func = "_Qp_xtoq";
2664 break;
2665 default:
2666 abort ();
2667 }
2668 break;
2669
2670 case UNSIGNED_FLOAT:
2671 switch (GET_MODE (operands[1]))
2672 {
2673 case SImode:
2674 func = "_Qp_uitoq";
2675 break;
2676 case DImode:
2677 func = "_Qp_uxtoq";
2678 break;
2679 default:
2680 abort ();
2681 }
2682 break;
2683
2684 case FIX:
2685 switch (GET_MODE (operands[0]))
2686 {
2687 case SImode:
2688 func = "_Qp_qtoi";
2689 break;
2690 case DImode:
2691 func = "_Qp_qtox";
2692 break;
2693 default:
2694 abort ();
2695 }
2696 break;
2697
2698 case UNSIGNED_FIX:
2699 switch (GET_MODE (operands[0]))
2700 {
2701 case SImode:
2702 func = "_Qp_qtoui";
2703 break;
2704 case DImode:
2705 func = "_Qp_qtoux";
2706 break;
2707 default:
2708 abort ();
2709 }
2710 break;
2711
2712 default:
2713 abort ();
2714 }
2715
2716 emit_soft_tfmode_libcall (func, 2, operands);
2717}
2718
2719/* Expand a hard-float tfmode operation. All arguments must be in
2720 registers. */
2721
2722static void
2723emit_hard_tfmode_operation (code, operands)
2724 enum rtx_code code;
2725 rtx *operands;
2726{
2727 rtx op, dest;
2728
2729 if (GET_RTX_CLASS (code) == '1')
2730 {
2731 operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
2732 op = gen_rtx_fmt_e (code, GET_MODE (operands[0]), operands[1]);
2733 }
2734 else
2735 {
2736 operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
2737 operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
2738 op = gen_rtx_fmt_ee (code, GET_MODE (operands[0]),
2739 operands[1], operands[2]);
2740 }
2741
2742 if (register_operand (operands[0], VOIDmode))
2743 dest = operands[0];
2744 else
2745 dest = gen_reg_rtx (GET_MODE (operands[0]));
2746
2747 emit_insn (gen_rtx_SET (VOIDmode, dest, op));
2748
2749 if (dest != operands[0])
2750 emit_move_insn (operands[0], dest);
2751}
2752
2753void
2754emit_tfmode_binop (code, operands)
2755 enum rtx_code code;
2756 rtx *operands;
2757{
2758 if (TARGET_HARD_QUAD)
2759 emit_hard_tfmode_operation (code, operands);
2760 else
2761 emit_soft_tfmode_binop (code, operands);
2762}
2763
2764void
2765emit_tfmode_unop (code, operands)
2766 enum rtx_code code;
2767 rtx *operands;
2768{
2769 if (TARGET_HARD_QUAD)
2770 emit_hard_tfmode_operation (code, operands);
2771 else
2772 emit_soft_tfmode_unop (code, operands);
2773}
2774
2775void
2776emit_tfmode_cvt (code, operands)
2777 enum rtx_code code;
2778 rtx *operands;
2779{
2780 if (TARGET_HARD_QUAD)
2781 emit_hard_tfmode_operation (code, operands);
2782 else
2783 emit_soft_tfmode_cvt (code, operands);
2784}
2785\f
e0d80184
DM
2786/* Return nonzero if a return peephole merging return with
2787 setting of output register is ok. */
2788int
2789leaf_return_peephole_ok ()
2790{
2791 return (actual_fsize == 0);
2792}
284d86e9 2793
f17f9332
JJ
2794/* Return nonzero if a branch/jump/call instruction will be emitting
2795 nop into its delay slot. */
2796
2797int
2798empty_delay_slot (insn)
2799 rtx insn;
2800{
2801 rtx seq;
2802
2803 /* If no previous instruction (should not happen), return true. */
2804 if (PREV_INSN (insn) == NULL)
2805 return 1;
2806
2807 seq = NEXT_INSN (PREV_INSN (insn));
2808 if (GET_CODE (PATTERN (seq)) == SEQUENCE)
2809 return 0;
2810
2811 return 1;
2812}
2813
e0d80184
DM
2814/* Return nonzero if TRIAL can go into the function epilogue's
2815 delay slot. SLOT is the slot we are trying to fill. */
ab835497 2816
e0d80184
DM
2817int
2818eligible_for_epilogue_delay (trial, slot)
2819 rtx trial;
2820 int slot;
2821{
2822 rtx pat, src;
4fb4e4b8 2823
e0d80184
DM
2824 if (slot >= 1)
2825 return 0;
4fb4e4b8 2826
e0d80184
DM
2827 if (GET_CODE (trial) != INSN || GET_CODE (PATTERN (trial)) != SET)
2828 return 0;
4fb4e4b8 2829
e0d80184
DM
2830 if (get_attr_length (trial) != 1)
2831 return 0;
4fb4e4b8 2832
e48addee
JJ
2833 /* If there are any call-saved registers, we should scan TRIAL if it
2834 does not reference them. For now just make it easy. */
2835 if (num_gfregs)
2836 return 0;
4fb4e4b8 2837
1150a841
RH
2838 /* If the function uses __builtin_eh_return, the eh_return machinery
2839 occupies the delay slot. */
2840 if (current_function_calls_eh_return)
2841 return 0;
2842
e0d80184
DM
2843 /* In the case of a true leaf function, anything can go into the delay slot.
2844 A delay slot only exists however if the frame size is zero, otherwise
2845 we will put an insn to adjust the stack after the return. */
54ff41b7 2846 if (current_function_uses_only_leaf_regs)
4fb4e4b8 2847 {
e0d80184
DM
2848 if (leaf_return_peephole_ok ())
2849 return ((get_attr_in_uncond_branch_delay (trial)
2850 == IN_BRANCH_DELAY_TRUE));
2851 return 0;
4fb4e4b8 2852 }
4fb4e4b8 2853
e0d80184 2854 pat = PATTERN (trial);
795068a4 2855
e0d80184 2856 /* Otherwise, only operations which can be done in tandem with
e48addee 2857 a `restore' or `return' insn can go into the delay slot. */
e0d80184 2858 if (GET_CODE (SET_DEST (pat)) != REG
e0d80184
DM
2859 || REGNO (SET_DEST (pat)) < 24)
2860 return 0;
795068a4 2861
c137830f
JJ
2862 /* If this instruction sets up floating point register and we have a return
2863 instruction, it can probably go in. But restore will not work
2864 with FP_REGS. */
2865 if (REGNO (SET_DEST (pat)) >= 32)
2866 {
2867 if (TARGET_V9 && ! epilogue_renumber (&pat, 1)
2868 && (get_attr_in_uncond_branch_delay (trial) == IN_BRANCH_DELAY_TRUE))
2869 return 1;
2870 return 0;
2871 }
2872
e0d80184
DM
2873 /* The set of insns matched here must agree precisely with the set of
2874 patterns paired with a RETURN in sparc.md. */
795068a4 2875
e0d80184 2876 src = SET_SRC (pat);
795068a4 2877
3c6088d2 2878 /* This matches "*return_[qhs]i" or even "*return_di" on TARGET_ARCH64. */
3ec6f1a9
RK
2879 if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
2880 && arith_operand (src, GET_MODE (src)))
3c6088d2
JJ
2881 {
2882 if (TARGET_ARCH64)
2883 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
2884 else
2885 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (SImode);
2886 }
e48addee 2887
e0d80184 2888 /* This matches "*return_di". */
3ec6f1a9
RK
2889 else if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
2890 && arith_double_operand (src, GET_MODE (src)))
e0d80184 2891 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
795068a4 2892
e0d80184
DM
2893 /* This matches "*return_sf_no_fpu". */
2894 else if (! TARGET_FPU && restore_operand (SET_DEST (pat), SFmode)
2895 && register_operand (src, SFmode))
2896 return 1;
f5da225e 2897
e48addee
JJ
2898 /* If we have return instruction, anything that does not use
2899 local or output registers and can go into a delay slot wins. */
2900 else if (TARGET_V9 && ! epilogue_renumber (&pat, 1)
2901 && (get_attr_in_uncond_branch_delay (trial) == IN_BRANCH_DELAY_TRUE))
2902 return 1;
2903
e0d80184
DM
2904 /* This matches "*return_addsi". */
2905 else if (GET_CODE (src) == PLUS
2906 && arith_operand (XEXP (src, 0), SImode)
2907 && arith_operand (XEXP (src, 1), SImode)
2908 && (register_operand (XEXP (src, 0), SImode)
2909 || register_operand (XEXP (src, 1), SImode)))
2910 return 1;
2911
2912 /* This matches "*return_adddi". */
2913 else if (GET_CODE (src) == PLUS
2914 && arith_double_operand (XEXP (src, 0), DImode)
2915 && arith_double_operand (XEXP (src, 1), DImode)
2916 && (register_operand (XEXP (src, 0), DImode)
2917 || register_operand (XEXP (src, 1), DImode)))
795068a4 2918 return 1;
795068a4 2919
e48addee
JJ
2920 /* This can match "*return_losum_[sd]i".
2921 Catch only some cases, so that return_losum* don't have
2922 to be too big. */
2923 else if (GET_CODE (src) == LO_SUM
2924 && ! TARGET_CM_MEDMID
2925 && ((register_operand (XEXP (src, 0), SImode)
2926 && immediate_operand (XEXP (src, 1), SImode))
2927 || (TARGET_ARCH64
2928 && register_operand (XEXP (src, 0), DImode)
2929 && immediate_operand (XEXP (src, 1), DImode))))
2930 return 1;
2931
2932 /* sll{,x} reg,1,reg2 is add reg,reg,reg2 as well. */
2933 else if (GET_CODE (src) == ASHIFT
2934 && (register_operand (XEXP (src, 0), SImode)
2935 || register_operand (XEXP (src, 0), DImode))
2936 && XEXP (src, 1) == const1_rtx)
2937 return 1;
2938
795068a4
JW
2939 return 0;
2940}
2941
7d167afd
JJ
2942/* Return nonzero if TRIAL can go into the sibling call
2943 delay slot. */
2944
2945int
2946eligible_for_sibcall_delay (trial)
2947 rtx trial;
2948{
2949 rtx pat, src;
2950
2951 if (GET_CODE (trial) != INSN || GET_CODE (PATTERN (trial)) != SET)
2952 return 0;
2953
8456b95a 2954 if (get_attr_length (trial) != 1)
7d167afd
JJ
2955 return 0;
2956
2957 pat = PATTERN (trial);
2958
2959 if (current_function_uses_only_leaf_regs)
2960 {
2961 /* If the tail call is done using the call instruction,
2962 we have to restore %o7 in the delay slot. */
2be5e524 2963 if ((TARGET_ARCH64 && ! TARGET_CM_MEDLOW) || flag_pic)
7d167afd
JJ
2964 return 0;
2965
2966 /* %g1 is used to build the function address */
2967 if (reg_mentioned_p (gen_rtx_REG (Pmode, 1), pat))
2968 return 0;
2969
2970 return 1;
2971 }
2972
2973 /* Otherwise, only operations which can be done in tandem with
2974 a `restore' insn can go into the delay slot. */
2975 if (GET_CODE (SET_DEST (pat)) != REG
2976 || REGNO (SET_DEST (pat)) < 24
2977 || REGNO (SET_DEST (pat)) >= 32)
2978 return 0;
2979
2980 /* If it mentions %o7, it can't go in, because sibcall will clobber it
2981 in most cases. */
2982 if (reg_mentioned_p (gen_rtx_REG (Pmode, 15), pat))
2983 return 0;
2984
2985 src = SET_SRC (pat);
2986
3ec6f1a9
RK
2987 if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
2988 && arith_operand (src, GET_MODE (src)))
7d167afd
JJ
2989 {
2990 if (TARGET_ARCH64)
2991 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
2992 else
2993 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (SImode);
2994 }
2995
3ec6f1a9
RK
2996 else if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
2997 && arith_double_operand (src, GET_MODE (src)))
7d167afd
JJ
2998 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
2999
3000 else if (! TARGET_FPU && restore_operand (SET_DEST (pat), SFmode)
3001 && register_operand (src, SFmode))
3002 return 1;
3003
3004 else if (GET_CODE (src) == PLUS
3005 && arith_operand (XEXP (src, 0), SImode)
3006 && arith_operand (XEXP (src, 1), SImode)
3007 && (register_operand (XEXP (src, 0), SImode)
3008 || register_operand (XEXP (src, 1), SImode)))
3009 return 1;
3010
3011 else if (GET_CODE (src) == PLUS
3012 && arith_double_operand (XEXP (src, 0), DImode)
3013 && arith_double_operand (XEXP (src, 1), DImode)
3014 && (register_operand (XEXP (src, 0), DImode)
3015 || register_operand (XEXP (src, 1), DImode)))
3016 return 1;
3017
3018 else if (GET_CODE (src) == LO_SUM
3019 && ! TARGET_CM_MEDMID
3020 && ((register_operand (XEXP (src, 0), SImode)
3021 && immediate_operand (XEXP (src, 1), SImode))
3022 || (TARGET_ARCH64
3023 && register_operand (XEXP (src, 0), DImode)
3024 && immediate_operand (XEXP (src, 1), DImode))))
3025 return 1;
3026
3027 else if (GET_CODE (src) == ASHIFT
3028 && (register_operand (XEXP (src, 0), SImode)
3029 || register_operand (XEXP (src, 0), DImode))
3030 && XEXP (src, 1) == const1_rtx)
3031 return 1;
3032
3033 return 0;
3034}
3035
e0d80184
DM
3036static int
3037check_return_regs (x)
3038 rtx x;
ab835497 3039{
e0d80184
DM
3040 switch (GET_CODE (x))
3041 {
3042 case REG:
3043 return IN_OR_GLOBAL_P (x);
ab835497 3044
e0d80184
DM
3045 case CONST_INT:
3046 case CONST_DOUBLE:
3047 case CONST:
3048 case SYMBOL_REF:
3049 case LABEL_REF:
3050 return 1;
ab835497 3051
e0d80184
DM
3052 case SET:
3053 case IOR:
3054 case AND:
3055 case XOR:
3056 case PLUS:
3057 case MINUS:
3058 if (check_return_regs (XEXP (x, 1)) == 0)
3059 return 0;
3060 case NOT:
3061 case NEG:
3062 case MEM:
3063 return check_return_regs (XEXP (x, 0));
3064
3065 default:
3066 return 0;
3067 }
ab835497 3068
e0d80184 3069}
ab835497 3070
e0d80184
DM
3071int
3072short_branch (uid1, uid2)
3073 int uid1, uid2;
3074{
9d98a694 3075 int delta = INSN_ADDRESSES (uid1) - INSN_ADDRESSES (uid2);
77b91512
RK
3076
3077 /* Leave a few words of "slop". */
3078 if (delta >= -1023 && delta <= 1022)
e0d80184 3079 return 1;
77b91512 3080
e0d80184
DM
3081 return 0;
3082}
ab835497 3083
5e7a8ee0 3084/* Return nonzero if REG is not used after INSN.
e0d80184
DM
3085 We assume REG is a reload reg, and therefore does
3086 not live past labels or calls or jumps. */
3087int
3088reg_unused_after (reg, insn)
3089 rtx reg;
3090 rtx insn;
3091{
3092 enum rtx_code code, prev_code = UNKNOWN;
ab835497 3093
e0d80184 3094 while ((insn = NEXT_INSN (insn)))
61a55e8b 3095 {
e0d80184
DM
3096 if (prev_code == CALL_INSN && call_used_regs[REGNO (reg)])
3097 return 1;
ab835497 3098
e0d80184
DM
3099 code = GET_CODE (insn);
3100 if (GET_CODE (insn) == CODE_LABEL)
3101 return 1;
bc961ed7 3102
e0d80184 3103 if (GET_RTX_CLASS (code) == 'i')
61a55e8b 3104 {
e0d80184
DM
3105 rtx set = single_set (insn);
3106 int in_src = set && reg_overlap_mentioned_p (reg, SET_SRC (set));
3107 if (set && in_src)
3108 return 0;
3109 if (set && reg_overlap_mentioned_p (reg, SET_DEST (set)))
3110 return 1;
3111 if (set == 0 && reg_overlap_mentioned_p (reg, PATTERN (insn)))
3112 return 0;
61a55e8b 3113 }
e0d80184 3114 prev_code = code;
61a55e8b 3115 }
e0d80184
DM
3116 return 1;
3117}
3118\f
3119/* The table we use to reference PIC data. */
e2500fed 3120static GTY(()) rtx global_offset_table;
bc961ed7 3121
e0d80184 3122/* The function we use to get at it. */
e2500fed 3123static GTY(()) rtx get_pc_symbol;
e0d80184 3124static char get_pc_symbol_name[256];
ab835497 3125
e0d80184 3126/* Ensure that we are not using patterns that are not OK with PIC. */
795068a4 3127
e0d80184
DM
3128int
3129check_pic (i)
3130 int i;
3131{
3132 switch (flag_pic)
ab835497 3133 {
e0d80184 3134 case 1:
1ccbefce
RH
3135 if (GET_CODE (recog_data.operand[i]) == SYMBOL_REF
3136 || (GET_CODE (recog_data.operand[i]) == CONST
3137 && ! (GET_CODE (XEXP (recog_data.operand[i], 0)) == MINUS
3138 && (XEXP (XEXP (recog_data.operand[i], 0), 0)
e0d80184 3139 == global_offset_table)
1ccbefce 3140 && (GET_CODE (XEXP (XEXP (recog_data.operand[i], 0), 1))
e0d80184
DM
3141 == CONST))))
3142 abort ();
3143 case 2:
3144 default:
3145 return 1;
ab835497 3146 }
ab835497 3147}
795068a4 3148
e0d80184
DM
3149/* Return true if X is an address which needs a temporary register when
3150 reloaded while generating PIC code. */
795068a4 3151
e0d80184
DM
3152int
3153pic_address_needs_scratch (x)
3154 rtx x;
795068a4 3155{
e0d80184
DM
3156 /* An address which is a symbolic plus a non SMALL_INT needs a temp reg. */
3157 if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
3158 && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
3159 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3160 && ! SMALL_INT (XEXP (XEXP (x, 0), 1)))
3161 return 1;
795068a4 3162
e0d80184
DM
3163 return 0;
3164}
795068a4 3165
e0d80184
DM
3166/* Legitimize PIC addresses. If the address is already position-independent,
3167 we return ORIG. Newly generated position-independent addresses go into a
88cad84b 3168 reg. This is REG if nonzero, otherwise we allocate register(s) as
e0d80184 3169 necessary. */
795068a4 3170
e0d80184
DM
3171rtx
3172legitimize_pic_address (orig, mode, reg)
3173 rtx orig;
3174 enum machine_mode mode ATTRIBUTE_UNUSED;
3175 rtx reg;
3176{
3177 if (GET_CODE (orig) == SYMBOL_REF)
82d6b402 3178 {
e0d80184
DM
3179 rtx pic_ref, address;
3180 rtx insn;
82d6b402 3181
e0d80184 3182 if (reg == 0)
82d6b402 3183 {
e0d80184
DM
3184 if (reload_in_progress || reload_completed)
3185 abort ();
3186 else
3187 reg = gen_reg_rtx (Pmode);
82d6b402 3188 }
795068a4 3189
e0d80184 3190 if (flag_pic == 2)
4fb4e4b8 3191 {
e0d80184
DM
3192 /* If not during reload, allocate another temp reg here for loading
3193 in the address, so that these instructions can be optimized
3194 properly. */
3195 rtx temp_reg = ((reload_in_progress || reload_completed)
3196 ? reg : gen_reg_rtx (Pmode));
3197
3198 /* Must put the SYMBOL_REF inside an UNSPEC here so that cse
3199 won't get confused into thinking that these two instructions
3200 are loading in the true address of the symbol. If in the
3201 future a PIC rtx exists, that should be used instead. */
be3f1ff5
DM
3202 if (Pmode == SImode)
3203 {
3204 emit_insn (gen_movsi_high_pic (temp_reg, orig));
3205 emit_insn (gen_movsi_lo_sum_pic (temp_reg, temp_reg, orig));
3206 }
3207 else
3208 {
3209 emit_insn (gen_movdi_high_pic (temp_reg, orig));
3210 emit_insn (gen_movdi_lo_sum_pic (temp_reg, temp_reg, orig));
3211 }
e0d80184 3212 address = temp_reg;
4fb4e4b8
DE
3213 }
3214 else
e0d80184
DM
3215 address = orig;
3216
3217 pic_ref = gen_rtx_MEM (Pmode,
8ac61af7
RK
3218 gen_rtx_PLUS (Pmode,
3219 pic_offset_table_rtx, address));
e0d80184
DM
3220 current_function_uses_pic_offset_table = 1;
3221 RTX_UNCHANGING_P (pic_ref) = 1;
3222 insn = emit_move_insn (reg, pic_ref);
3223 /* Put a REG_EQUAL note on this insn, so that it can be optimized
3224 by loop. */
3225 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, orig,
3226 REG_NOTES (insn));
3227 return reg;
795068a4 3228 }
e0d80184 3229 else if (GET_CODE (orig) == CONST)
795068a4 3230 {
e0d80184 3231 rtx base, offset;
795068a4 3232
e0d80184
DM
3233 if (GET_CODE (XEXP (orig, 0)) == PLUS
3234 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
3235 return orig;
82d6b402 3236
e0d80184 3237 if (reg == 0)
4fb4e4b8 3238 {
e0d80184
DM
3239 if (reload_in_progress || reload_completed)
3240 abort ();
3241 else
3242 reg = gen_reg_rtx (Pmode);
4fb4e4b8 3243 }
e0d80184
DM
3244
3245 if (GET_CODE (XEXP (orig, 0)) == PLUS)
4fb4e4b8 3246 {
e0d80184
DM
3247 base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode, reg);
3248 offset = legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode,
3249 base == reg ? 0 : reg);
4fb4e4b8
DE
3250 }
3251 else
61a66555
JW
3252 abort ();
3253
e0d80184
DM
3254 if (GET_CODE (offset) == CONST_INT)
3255 {
3256 if (SMALL_INT (offset))
ed8908e7 3257 return plus_constant (base, INTVAL (offset));
e0d80184
DM
3258 else if (! reload_in_progress && ! reload_completed)
3259 offset = force_reg (Pmode, offset);
3260 else
3261 /* If we reach here, then something is seriously wrong. */
3262 abort ();
3263 }
3264 return gen_rtx_PLUS (Pmode, base, offset);
795068a4 3265 }
e0d80184
DM
3266 else if (GET_CODE (orig) == LABEL_REF)
3267 /* ??? Why do we do this? */
3268 /* Now movsi_pic_label_ref uses it, but we ought to be checking that
3269 the register is live instead, in case it is eliminated. */
3270 current_function_uses_pic_offset_table = 1;
795068a4 3271
e0d80184
DM
3272 return orig;
3273}
795068a4 3274
fccf9848 3275/* Emit special PIC prologues. */
795068a4 3276
e0d80184 3277void
fccf9848 3278load_pic_register ()
e0d80184
DM
3279{
3280 /* Labels to get the PC in the prologue of this function. */
3281 int orig_flag_pic = flag_pic;
4fb4e4b8 3282
e0d80184
DM
3283 if (! flag_pic)
3284 abort ();
3285
d6a7951f 3286 /* If we haven't emitted the special get_pc helper function, do so now. */
e0d80184 3287 if (get_pc_symbol_name[0] == 0)
4fb4e4b8 3288 {
d676da68 3289 int align;
82d6b402 3290
d676da68 3291 ASM_GENERATE_INTERNAL_LABEL (get_pc_symbol_name, "LGETPC", 0);
e0d80184 3292 text_section ();
d676da68
DM
3293
3294 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
3295 if (align > 0)
3296 ASM_OUTPUT_ALIGN (asm_out_file, align);
e0d80184 3297 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "LGETPC", 0);
4df1190a 3298 fputs ("\tretl\n\tadd\t%o7, %l7, %l7\n", asm_out_file);
e0d80184 3299 }
82d6b402 3300
e0d80184
DM
3301 /* Initialize every time through, since we can't easily
3302 know this to be permanent. */
3303 global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3304 get_pc_symbol = gen_rtx_SYMBOL_REF (Pmode, get_pc_symbol_name);
3305 flag_pic = 0;
82d6b402 3306
fccf9848
JJ
3307 emit_insn (gen_get_pc (pic_offset_table_rtx, global_offset_table,
3308 get_pc_symbol));
82d6b402 3309
e0d80184 3310 flag_pic = orig_flag_pic;
82d6b402 3311
e0d80184
DM
3312 /* Need to emit this whether or not we obey regdecls,
3313 since setjmp/longjmp can cause life info to screw up.
3314 ??? In the case where we don't obey regdecls, this is not sufficient
3315 since we may not fall out the bottom. */
3316 emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
795068a4 3317}
ab835497 3318\f
e0d80184 3319/* Return 1 if RTX is a MEM which is known to be aligned to at
7a31a340 3320 least a DESIRED byte boundary. */
a3ee5899 3321
e0d80184
DM
3322int
3323mem_min_alignment (mem, desired)
3324 rtx mem;
3325 int desired;
ab835497 3326{
e0d80184
DM
3327 rtx addr, base, offset;
3328
3329 /* If it's not a MEM we can't accept it. */
3330 if (GET_CODE (mem) != MEM)
3331 return 0;
3332
3333 addr = XEXP (mem, 0);
3334 base = offset = NULL_RTX;
3335 if (GET_CODE (addr) == PLUS)
ab835497 3336 {
e0d80184 3337 if (GET_CODE (XEXP (addr, 0)) == REG)
61a55e8b 3338 {
e0d80184
DM
3339 base = XEXP (addr, 0);
3340
3341 /* What we are saying here is that if the base
3342 REG is aligned properly, the compiler will make
3343 sure any REG based index upon it will be so
3344 as well. */
3345 if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
3346 offset = XEXP (addr, 1);
61a55e8b 3347 else
e0d80184 3348 offset = const0_rtx;
61a55e8b 3349 }
ab835497 3350 }
e0d80184 3351 else if (GET_CODE (addr) == REG)
ab835497 3352 {
e0d80184
DM
3353 base = addr;
3354 offset = const0_rtx;
ab835497 3355 }
82d6b402 3356
e0d80184 3357 if (base != NULL_RTX)
795068a4 3358 {
e0d80184
DM
3359 int regno = REGNO (base);
3360
563c12b0 3361 if (regno != HARD_FRAME_POINTER_REGNUM && regno != STACK_POINTER_REGNUM)
61a55e8b 3362 {
e0d80184
DM
3363 /* Check if the compiler has recorded some information
3364 about the alignment of the base REG. If reload has
021e2ecc
JJ
3365 completed, we already matched with proper alignments.
3366 If not running global_alloc, reload might give us
3367 unaligned pointer to local stack though. */
bdb429a5
RK
3368 if (((cfun != 0
3369 && REGNO_POINTER_ALIGN (regno) >= desired * BITS_PER_UNIT)
021e2ecc 3370 || (optimize && reload_completed))
bdb429a5 3371 && (INTVAL (offset) & (desired - 1)) == 0)
e0d80184 3372 return 1;
61a55e8b 3373 }
795068a4 3374 else
e0d80184
DM
3375 {
3376 if (((INTVAL (offset) - SPARC_STACK_BIAS) & (desired - 1)) == 0)
3377 return 1;
3378 }
795068a4 3379 }
e0d80184
DM
3380 else if (! TARGET_UNALIGNED_DOUBLES
3381 || CONSTANT_P (addr)
3382 || GET_CODE (addr) == LO_SUM)
795068a4 3383 {
e0d80184
DM
3384 /* Anything else we know is properly aligned unless TARGET_UNALIGNED_DOUBLES
3385 is true, in which case we can only assume that an access is aligned if
3386 it is to a constant address, or the address involves a LO_SUM. */
3387 return 1;
795068a4 3388 }
e0d80184
DM
3389
3390 /* An obviously unaligned address. */
3391 return 0;
795068a4 3392}
e0d80184 3393
ab835497 3394\f
61a55e8b
DE
3395/* Vectors to keep interesting information about registers where it can easily
3396 be got. We use to use the actual mode value as the bit number, but there
3397 are more than 32 modes now. Instead we use two tables: one indexed by
3398 hard register number, and one indexed by mode. */
3399
3400/* The purpose of sparc_mode_class is to shrink the range of modes so that
3401 they all fit (as bit numbers) in a 32 bit word (again). Each real mode is
3402 mapped into one sparc_mode_class mode. */
3403
3404enum sparc_mode_class {
61a55e8b 3405 S_MODE, D_MODE, T_MODE, O_MODE,
c4ce6853
DE
3406 SF_MODE, DF_MODE, TF_MODE, OF_MODE,
3407 CC_MODE, CCFP_MODE
61a55e8b 3408};
ab835497 3409
61a55e8b
DE
3410/* Modes for single-word and smaller quantities. */
3411#define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
3412
3413/* Modes for double-word and smaller quantities. */
3414#define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
3415
3416/* Modes for quad-word and smaller quantities. */
3417#define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
ab835497 3418
d0cee9ba
JJ
3419/* Modes for 8-word and smaller quantities. */
3420#define O_MODES (T_MODES | (1 << (int) O_MODE) | (1 << (int) OF_MODE))
3421
1e4eb8d1
JW
3422/* Modes for single-float quantities. We must allow any single word or
3423 smaller quantity. This is because the fix/float conversion instructions
3424 take integer inputs/outputs from the float registers. */
3425#define SF_MODES (S_MODES)
ab835497 3426
61a55e8b
DE
3427/* Modes for double-float and smaller quantities. */
3428#define DF_MODES (S_MODES | D_MODES)
3429
61a55e8b 3430/* Modes for double-float only quantities. */
38875aba 3431#define DF_MODES_NO_S ((1 << (int) D_MODE) | (1 << (int) DF_MODE))
ab835497 3432
61a55e8b
DE
3433/* Modes for quad-float only quantities. */
3434#define TF_ONLY_MODES (1 << (int) TF_MODE)
3435
3436/* Modes for quad-float and smaller quantities. */
3437#define TF_MODES (DF_MODES | TF_ONLY_MODES)
3438
d0cee9ba
JJ
3439/* Modes for quad-float and double-float quantities. */
3440#define TF_MODES_NO_S (DF_MODES_NO_S | TF_ONLY_MODES)
3441
3442/* Modes for quad-float pair only quantities. */
3443#define OF_ONLY_MODES (1 << (int) OF_MODE)
3444
3445/* Modes for quad-float pairs and smaller quantities. */
3446#define OF_MODES (TF_MODES | OF_ONLY_MODES)
3447
3448#define OF_MODES_NO_S (TF_MODES_NO_S | OF_ONLY_MODES)
ab835497 3449
c4ce6853
DE
3450/* Modes for condition codes. */
3451#define CC_MODES (1 << (int) CC_MODE)
3452#define CCFP_MODES (1 << (int) CCFP_MODE)
3453
ab835497
RK
3454/* Value is 1 if register/mode pair is acceptable on sparc.
3455 The funny mixture of D and T modes is because integer operations
3456 do not specially operate on tetra quantities, so non-quad-aligned
3457 registers can hold quadword quantities (except %o4 and %i4 because
c4ce6853 3458 they cross fixed registers). */
ab835497 3459
61a55e8b 3460/* This points to either the 32 bit or the 64 bit version. */
0b5826ac 3461const int *hard_regno_mode_classes;
61a55e8b 3462
0b5826ac 3463static const int hard_32bit_mode_classes[] = {
c4ce6853 3464 S_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
ab835497
RK
3465 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
3466 T_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
3467 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
3468
d0cee9ba
JJ
3469 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3470 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3471 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3472 OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
a9e27770
DE
3473
3474 /* FP regs f32 to f63. Only the even numbered registers actually exist,
3475 and none can hold SFmode/SImode values. */
d0cee9ba
JJ
3476 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3477 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3478 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3479 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
a9e27770
DE
3480
3481 /* %fcc[0123] */
c4ce6853
DE
3482 CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
3483
3484 /* %icc */
3485 CC_MODES
61a55e8b
DE
3486};
3487
0b5826ac 3488static const int hard_64bit_mode_classes[] = {
c4ce6853 3489 D_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
d0cee9ba 3490 O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
61a55e8b 3491 T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
d0cee9ba 3492 O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
61a55e8b 3493
d0cee9ba
JJ
3494 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3495 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3496 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3497 OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
61a55e8b 3498
a9e27770 3499 /* FP regs f32 to f63. Only the even numbered registers actually exist,
61a55e8b 3500 and none can hold SFmode/SImode values. */
d0cee9ba
JJ
3501 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3502 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3503 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3504 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
61a55e8b
DE
3505
3506 /* %fcc[0123] */
c4ce6853
DE
3507 CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
3508
3509 /* %icc */
3510 CC_MODES
61a55e8b
DE
3511};
3512
3513int sparc_mode_class [NUM_MACHINE_MODES];
3514
c4ce6853
DE
3515enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
3516
61a55e8b
DE
3517static void
3518sparc_init_modes ()
3519{
3520 int i;
3521
61a55e8b
DE
3522 for (i = 0; i < NUM_MACHINE_MODES; i++)
3523 {
3524 switch (GET_MODE_CLASS (i))
3525 {
3526 case MODE_INT:
3527 case MODE_PARTIAL_INT:
3528 case MODE_COMPLEX_INT:
3529 if (GET_MODE_SIZE (i) <= 4)
3530 sparc_mode_class[i] = 1 << (int) S_MODE;
3531 else if (GET_MODE_SIZE (i) == 8)
3532 sparc_mode_class[i] = 1 << (int) D_MODE;
3533 else if (GET_MODE_SIZE (i) == 16)
3534 sparc_mode_class[i] = 1 << (int) T_MODE;
3535 else if (GET_MODE_SIZE (i) == 32)
3536 sparc_mode_class[i] = 1 << (int) O_MODE;
3537 else
3538 sparc_mode_class[i] = 0;
3539 break;
3540 case MODE_FLOAT:
3541 case MODE_COMPLEX_FLOAT:
3542 if (GET_MODE_SIZE (i) <= 4)
3543 sparc_mode_class[i] = 1 << (int) SF_MODE;
3544 else if (GET_MODE_SIZE (i) == 8)
3545 sparc_mode_class[i] = 1 << (int) DF_MODE;
3546 else if (GET_MODE_SIZE (i) == 16)
3547 sparc_mode_class[i] = 1 << (int) TF_MODE;
3548 else if (GET_MODE_SIZE (i) == 32)
3549 sparc_mode_class[i] = 1 << (int) OF_MODE;
3550 else
3551 sparc_mode_class[i] = 0;
3552 break;
3553 case MODE_CC:
3554 default:
3555 /* mode_class hasn't been initialized yet for EXTRA_CC_MODES, so
3556 we must explicitly check for them here. */
3557 if (i == (int) CCFPmode || i == (int) CCFPEmode)
3558 sparc_mode_class[i] = 1 << (int) CCFP_MODE;
3559 else if (i == (int) CCmode || i == (int) CC_NOOVmode
a9e27770 3560 || i == (int) CCXmode || i == (int) CCX_NOOVmode)
c4ce6853 3561 sparc_mode_class[i] = 1 << (int) CC_MODE;
61a55e8b
DE
3562 else
3563 sparc_mode_class[i] = 0;
3564 break;
3565 }
3566 }
3567
a9e27770 3568 if (TARGET_ARCH64)
61a55e8b
DE
3569 hard_regno_mode_classes = hard_64bit_mode_classes;
3570 else
3571 hard_regno_mode_classes = hard_32bit_mode_classes;
c4ce6853
DE
3572
3573 /* Initialize the array used by REGNO_REG_CLASS. */
3574 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3575 {
284d86e9
JC
3576 if (i < 16 && TARGET_V8PLUS)
3577 sparc_regno_reg_class[i] = I64_REGS;
563c12b0 3578 else if (i < 32 || i == FRAME_POINTER_REGNUM)
c4ce6853
DE
3579 sparc_regno_reg_class[i] = GENERAL_REGS;
3580 else if (i < 64)
3581 sparc_regno_reg_class[i] = FP_REGS;
3582 else if (i < 96)
3583 sparc_regno_reg_class[i] = EXTRA_FP_REGS;
3584 else if (i < 100)
3585 sparc_regno_reg_class[i] = FPCC_REGS;
3586 else
3587 sparc_regno_reg_class[i] = NO_REGS;
3588 }
61a55e8b 3589}
ab835497 3590\f
61a55e8b
DE
3591/* Save non call used registers from LOW to HIGH at BASE+OFFSET.
3592 N_REGS is the number of 4-byte regs saved thus far. This applies even to
3593 v9 int regs as it simplifies the code. */
3594
ab835497 3595static int
c53aa195 3596save_regs (file, low, high, base, offset, n_regs, real_offset)
ab835497
RK
3597 FILE *file;
3598 int low, high;
3bb5de61 3599 const char *base;
ab835497 3600 int offset;
61a55e8b 3601 int n_regs;
c53aa195 3602 int real_offset;
ab835497
RK
3603{
3604 int i;
3605
a9e27770 3606 if (TARGET_ARCH64 && high <= 32)
ab835497 3607 {
61a55e8b
DE
3608 for (i = low; i < high; i++)
3609 {
3610 if (regs_ever_live[i] && ! call_used_regs[i])
c53aa195 3611 {
e0d80184 3612 fprintf (file, "\tstx\t%s, [%s+%d]\n",
c53aa195 3613 reg_names[i], base, offset + 4 * n_regs);
0021b564 3614 if (dwarf2out_do_frame ())
c53aa195 3615 dwarf2out_reg_save ("", i, real_offset + 4 * n_regs);
c53aa195
JM
3616 n_regs += 2;
3617 }
61a55e8b 3618 }
ab835497 3619 }
61a55e8b
DE
3620 else
3621 {
3622 for (i = low; i < high; i += 2)
3623 {
3624 if (regs_ever_live[i] && ! call_used_regs[i])
c53aa195 3625 {
5e9defae
KG
3626 if (regs_ever_live[i+1] && ! call_used_regs[i+1])
3627 {
e0d80184 3628 fprintf (file, "\tstd\t%s, [%s+%d]\n",
5e9defae
KG
3629 reg_names[i], base, offset + 4 * n_regs);
3630 if (dwarf2out_do_frame ())
3631 {
3632 char *l = dwarf2out_cfi_label ();
3633 dwarf2out_reg_save (l, i, real_offset + 4 * n_regs);
3634 dwarf2out_reg_save (l, i+1, real_offset + 4 * n_regs + 4);
3635 }
3636 n_regs += 2;
3637 }
3638 else
3639 {
e0d80184 3640 fprintf (file, "\tst\t%s, [%s+%d]\n",
5e9defae
KG
3641 reg_names[i], base, offset + 4 * n_regs);
3642 if (dwarf2out_do_frame ())
3643 dwarf2out_reg_save ("", i, real_offset + 4 * n_regs);
3644 n_regs += 2;
3645 }
3646 }
3647 else
3648 {
3649 if (regs_ever_live[i+1] && ! call_used_regs[i+1])
3650 {
e0d80184 3651 fprintf (file, "\tst\t%s, [%s+%d]\n",
5e9defae
KG
3652 reg_names[i+1], base, offset + 4 * n_regs + 4);
3653 if (dwarf2out_do_frame ())
3654 dwarf2out_reg_save ("", i + 1, real_offset + 4 * n_regs + 4);
3655 n_regs += 2;
3656 }
c53aa195 3657 }
61a55e8b
DE
3658 }
3659 }
3660 return n_regs;
ab835497
RK
3661}
3662
61a55e8b
DE
3663/* Restore non call used registers from LOW to HIGH at BASE+OFFSET.
3664
3665 N_REGS is the number of 4-byte regs saved thus far. This applies even to
3666 v9 int regs as it simplifies the code. */
3667
ab835497 3668static int
61a55e8b 3669restore_regs (file, low, high, base, offset, n_regs)
ab835497
RK
3670 FILE *file;
3671 int low, high;
3bb5de61 3672 const char *base;
ab835497 3673 int offset;
61a55e8b 3674 int n_regs;
ab835497
RK
3675{
3676 int i;
3677
a9e27770 3678 if (TARGET_ARCH64 && high <= 32)
61a55e8b
DE
3679 {
3680 for (i = low; i < high; i++)
3681 {
3682 if (regs_ever_live[i] && ! call_used_regs[i])
e0d80184 3683 fprintf (file, "\tldx\t[%s+%d], %s\n",
61a55e8b
DE
3684 base, offset + 4 * n_regs, reg_names[i]),
3685 n_regs += 2;
3686 }
3687 }
3688 else
ab835497 3689 {
61a55e8b
DE
3690 for (i = low; i < high; i += 2)
3691 {
3692 if (regs_ever_live[i] && ! call_used_regs[i])
3693 if (regs_ever_live[i+1] && ! call_used_regs[i+1])
e0d80184 3694 fprintf (file, "\tldd\t[%s+%d], %s\n",
61a55e8b
DE
3695 base, offset + 4 * n_regs, reg_names[i]),
3696 n_regs += 2;
3697 else
4df1190a 3698 fprintf (file, "\tld\t[%s+%d], %s\n",
61a55e8b
DE
3699 base, offset + 4 * n_regs, reg_names[i]),
3700 n_regs += 2;
3701 else if (regs_ever_live[i+1] && ! call_used_regs[i+1])
4df1190a 3702 fprintf (file, "\tld\t[%s+%d], %s\n",
61a55e8b
DE
3703 base, offset + 4 * n_regs + 4, reg_names[i+1]),
3704 n_regs += 2;
3705 }
ab835497 3706 }
61a55e8b 3707 return n_regs;
ab835497
RK
3708}
3709
61a55e8b
DE
3710/* Compute the frame size required by the function. This function is called
3711 during the reload pass and also by output_function_prologue(). */
ab835497 3712
ab835497
RK
3713int
3714compute_frame_size (size, leaf_function)
3715 int size;
3716 int leaf_function;
3717{
61a55e8b 3718 int n_regs = 0, i;
ab835497 3719 int outgoing_args_size = (current_function_outgoing_args_size
4fb4e4b8 3720 + REG_PARM_STACK_SPACE (current_function_decl));
ab835497 3721
33074e5f
RH
3722 /* N_REGS is the number of 4-byte regs saved thus far. This applies
3723 even to v9 int regs to be consistent with save_regs/restore_regs. */
61a55e8b 3724
33074e5f
RH
3725 if (TARGET_ARCH64)
3726 {
3727 for (i = 0; i < 8; i++)
3728 if (regs_ever_live[i] && ! call_used_regs[i])
3729 n_regs += 2;
3730 }
3731 else
3732 {
3733 for (i = 0; i < 8; i += 2)
ab835497
RK
3734 if ((regs_ever_live[i] && ! call_used_regs[i])
3735 || (regs_ever_live[i+1] && ! call_used_regs[i+1]))
61a55e8b 3736 n_regs += 2;
ab835497
RK
3737 }
3738
33074e5f
RH
3739 for (i = 32; i < (TARGET_V9 ? 96 : 64); i += 2)
3740 if ((regs_ever_live[i] && ! call_used_regs[i])
3741 || (regs_ever_live[i+1] && ! call_used_regs[i+1]))
3742 n_regs += 2;
3743
ab835497 3744 /* Set up values for use in `function_epilogue'. */
61a55e8b 3745 num_gfregs = n_regs;
ab835497 3746
61a55e8b
DE
3747 if (leaf_function && n_regs == 0
3748 && size == 0 && current_function_outgoing_args_size == 0)
3749 {
3750 actual_fsize = apparent_fsize = 0;
3751 }
3752 else
3753 {
225909c3
JS
3754 /* We subtract STARTING_FRAME_OFFSET, remember it's negative. */
3755 apparent_fsize = (size - STARTING_FRAME_OFFSET + 7) & -8;
61a55e8b
DE
3756 apparent_fsize += n_regs * 4;
3757 actual_fsize = apparent_fsize + ((outgoing_args_size + 7) & -8);
3758 }
ab835497
RK
3759
3760 /* Make sure nothing can clobber our register windows.
3761 If a SAVE must be done, or there is a stack-local variable,
61a55e8b 3762 the register window area must be allocated.
4fb4e4b8 3763 ??? For v8 we apparently need an additional 8 bytes of reserved space. */
ab835497 3764 if (leaf_function == 0 || size > 0)
4fb4e4b8 3765 actual_fsize += (16 * UNITS_PER_WORD) + (TARGET_ARCH64 ? 0 : 8);
ab835497 3766
61a55e8b
DE
3767 return SPARC_STACK_ALIGN (actual_fsize);
3768}
3769
3770/* Build a (32 bit) big number in a register. */
86735b02 3771/* ??? We may be able to use the set macro here too. */
61a55e8b
DE
3772
3773static void
3774build_big_number (file, num, reg)
3775 FILE *file;
3776 int num;
3bb5de61 3777 const char *reg;
61a55e8b 3778{
a9e27770 3779 if (num >= 0 || ! TARGET_ARCH64)
61a55e8b 3780 {
e0d80184 3781 fprintf (file, "\tsethi\t%%hi(%d), %s\n", num, reg);
61a55e8b 3782 if ((num & 0x3ff) != 0)
e0d80184 3783 fprintf (file, "\tor\t%s, %%lo(%d), %s\n", reg, num, reg);
61a55e8b 3784 }
a9e27770 3785 else /* num < 0 && TARGET_ARCH64 */
61a55e8b
DE
3786 {
3787 /* Sethi does not sign extend, so we must use a little trickery
3788 to use it for negative numbers. Invert the constant before
3789 loading it in, then use xor immediate to invert the loaded bits
3790 (along with the upper 32 bits) to the desired constant. This
3791 works because the sethi and immediate fields overlap. */
3792 int asize = num;
3793 int inv = ~asize;
3794 int low = -0x400 + (asize & 0x3FF);
3795
e0d80184 3796 fprintf (file, "\tsethi\t%%hi(%d), %s\n\txor\t%s, %d, %s\n",
61a55e8b
DE
3797 inv, reg, reg, low, reg);
3798 }
ab835497
RK
3799}
3800
1cb36a98
RH
3801/* Output any necessary .register pseudo-ops. */
3802void
3803sparc_output_scratch_registers (file)
fbd039b2 3804 FILE *file ATTRIBUTE_UNUSED;
1cb36a98
RH
3805{
3806#ifdef HAVE_AS_REGISTER_PSEUDO_OP
3807 int i;
3808
3809 if (TARGET_ARCH32)
3810 return;
3811
3812 /* Check if %g[2367] were used without
3813 .register being printed for them already. */
3814 for (i = 2; i < 8; i++)
3815 {
3816 if (regs_ever_live [i]
3817 && ! sparc_hard_reg_printed [i])
3818 {
3819 sparc_hard_reg_printed [i] = 1;
3820 fprintf (file, "\t.register\t%%g%d, #scratch\n", i);
3821 }
3822 if (i == 3) i = 5;
3823 }
3824#endif
3825}
3826
08c148a8
NB
3827/* This function generates the assembly code for function entry.
3828 FILE is a stdio stream to output the code to.
3829 SIZE is an int: how many units of temporary storage to allocate.
3830 Refer to the array `regs_ever_live' to determine which registers
3831 to save; `regs_ever_live[I]' is nonzero if register number I
3832 is ever used in the function. This macro is responsible for
3833 knowing which registers should not be saved even if used. */
3834
3835/* On SPARC, move-double insns between fpu and cpu need an 8-byte block
3836 of memory. If any fpu reg is used in the function, we allocate
3837 such a block here, at the bottom of the frame, just in case it's needed.
3838
3839 If this function is a leaf procedure, then we may choose not
3840 to do a "save" insn. The decision about whether or not
3841 to do this is made in regclass.c. */
3842
3843static void
3844sparc_output_function_prologue (file, size)
3845 FILE *file;
3846 HOST_WIDE_INT size;
3847{
3848 if (TARGET_FLAT)
3849 sparc_flat_function_prologue (file, size);
3850 else
3851 sparc_nonflat_function_prologue (file, size,
3852 current_function_uses_only_leaf_regs);
3853}
3854
915f619f
JW
3855/* Output code for the function prologue. */
3856
08c148a8
NB
3857static void
3858sparc_nonflat_function_prologue (file, size, leaf_function)
ab835497 3859 FILE *file;
08c148a8 3860 HOST_WIDE_INT size;
915f619f 3861 int leaf_function;
ab835497 3862{
1cb36a98
RH
3863 sparc_output_scratch_registers (file);
3864
915f619f
JW
3865 /* Need to use actual_fsize, since we are also allocating
3866 space for our callee (and our own register save area). */
ab835497
RK
3867 actual_fsize = compute_frame_size (size, leaf_function);
3868
61a55e8b
DE
3869 if (leaf_function)
3870 {
3871 frame_base_name = "%sp";
3872 frame_base_offset = actual_fsize + SPARC_STACK_BIAS;
3873 }
3874 else
3875 {
3876 frame_base_name = "%fp";
3877 frame_base_offset = SPARC_STACK_BIAS;
3878 }
3879
c6aa9ce1 3880 /* This is only for the human reader. */
bf62bbf1 3881 fprintf (file, "\t%s#PROLOGUE# 0\n", ASM_COMMENT_START);
c6aa9ce1 3882
915f619f
JW
3883 if (actual_fsize == 0)
3884 /* do nothing. */ ;
e6c1be7e 3885 else if (! leaf_function)
ab835497 3886 {
3592ea0d 3887 if (actual_fsize <= 4096)
e0d80184 3888 fprintf (file, "\tsave\t%%sp, -%d, %%sp\n", actual_fsize);
3592ea0d 3889 else if (actual_fsize <= 8192)
915f619f 3890 {
e0d80184
DM
3891 fprintf (file, "\tsave\t%%sp, -4096, %%sp\n");
3892 fprintf (file, "\tadd\t%%sp, -%d, %%sp\n", actual_fsize - 4096);
915f619f
JW
3893 }
3894 else
3895 {
3592ea0d 3896 build_big_number (file, -actual_fsize, "%g1");
e0d80184 3897 fprintf (file, "\tsave\t%%sp, %%g1, %%sp\n");
915f619f 3898 }
ab835497 3899 }
5f4241d5
DE
3900 else /* leaf function */
3901 {
3592ea0d 3902 if (actual_fsize <= 4096)
e0d80184 3903 fprintf (file, "\tadd\t%%sp, -%d, %%sp\n", actual_fsize);
3592ea0d
DE
3904 else if (actual_fsize <= 8192)
3905 {
e0d80184
DM
3906 fprintf (file, "\tadd\t%%sp, -4096, %%sp\n");
3907 fprintf (file, "\tadd\t%%sp, -%d, %%sp\n", actual_fsize - 4096);
3592ea0d 3908 }
915f619f 3909 else
3592ea0d
DE
3910 {
3911 build_big_number (file, -actual_fsize, "%g1");
e0d80184 3912 fprintf (file, "\tadd\t%%sp, %%g1, %%sp\n");
3592ea0d 3913 }
ab835497
RK
3914 }
3915
0021b564 3916 if (dwarf2out_do_frame () && actual_fsize)
c53aa195 3917 {
96987e96 3918 char *label = dwarf2out_cfi_label ();
c53aa195
JM
3919
3920 /* The canonical frame address refers to the top of the frame. */
3921 dwarf2out_def_cfa (label, (leaf_function ? STACK_POINTER_REGNUM
563c12b0 3922 : HARD_FRAME_POINTER_REGNUM),
c53aa195
JM
3923 frame_base_offset);
3924
3925 if (! leaf_function)
3926 {
3927 /* Note the register window save. This tells the unwinder that
3928 it needs to restore the window registers from the previous
3929 frame's window save area at 0(cfa). */
3930 dwarf2out_window_save (label);
3931
3932 /* The return address (-8) is now in %i7. */
3933 dwarf2out_return_reg (label, 31);
3934 }
3935 }
c53aa195 3936
ab835497
RK
3937 /* If doing anything with PIC, do it now. */
3938 if (! flag_pic)
bf62bbf1 3939 fprintf (file, "\t%s#PROLOGUE# 1\n", ASM_COMMENT_START);
ab835497 3940
61a55e8b
DE
3941 /* Call saved registers are saved just above the outgoing argument area. */
3942 if (num_gfregs)
ab835497 3943 {
c53aa195 3944 int offset, real_offset, n_regs;
3bb5de61 3945 const char *base;
ab835497 3946
84e884e9
JM
3947 real_offset = -apparent_fsize;
3948 offset = -apparent_fsize + frame_base_offset;
61a55e8b
DE
3949 if (offset < -4096 || offset + num_gfregs * 4 > 4096)
3950 {
3951 /* ??? This might be optimized a little as %g1 might already have a
3952 value close enough that a single add insn will do. */
3953 /* ??? Although, all of this is probably only a temporary fix
3954 because if %g1 can hold a function result, then
3955 output_function_epilogue will lose (the result will get
3956 clobbered). */
3957 build_big_number (file, offset, "%g1");
e0d80184 3958 fprintf (file, "\tadd\t%s, %%g1, %%g1\n", frame_base_name);
61a55e8b
DE
3959 base = "%g1";
3960 offset = 0;
3961 }
ab835497 3962 else
61a55e8b
DE
3963 {
3964 base = frame_base_name;
3965 }
ab835497 3966
33074e5f
RH
3967 n_regs = save_regs (file, 0, 8, base, offset, 0, real_offset);
3968 save_regs (file, 32, TARGET_V9 ? 96 : 64, base, offset, n_regs,
3969 real_offset);
ab835497
RK
3970 }
3971}
3972
7d167afd
JJ
3973/* Output code to restore any call saved registers. */
3974
3975static void
3976output_restore_regs (file, leaf_function)
3977 FILE *file;
f451b552 3978 int leaf_function ATTRIBUTE_UNUSED;
7d167afd
JJ
3979{
3980 int offset, n_regs;
3981 const char *base;
3982
3983 offset = -apparent_fsize + frame_base_offset;
3984 if (offset < -4096 || offset + num_gfregs * 4 > 4096 - 8 /*double*/)
3985 {
3986 build_big_number (file, offset, "%g1");
3987 fprintf (file, "\tadd\t%s, %%g1, %%g1\n", frame_base_name);
3988 base = "%g1";
3989 offset = 0;
3990 }
3991 else
3992 {
3993 base = frame_base_name;
3994 }
3995
33074e5f
RH
3996 n_regs = restore_regs (file, 0, 8, base, offset, 0);
3997 restore_regs (file, 32, TARGET_V9 ? 96 : 64, base, offset, n_regs);
7d167afd
JJ
3998}
3999
08c148a8
NB
4000/* This function generates the assembly code for function exit,
4001 on machines that need it.
4002
4003 The function epilogue should not depend on the current stack pointer!
4004 It should use the frame pointer only. This is mandatory because
4005 of alloca; we also take advantage of it to omit stack adjustments
4006 before returning. */
4007
4008static void
4009sparc_output_function_epilogue (file, size)
4010 FILE *file;
4011 HOST_WIDE_INT size;
4012{
4013 if (TARGET_FLAT)
4014 sparc_flat_function_epilogue (file, size);
4015 else
4016 sparc_nonflat_function_epilogue (file, size,
4017 current_function_uses_only_leaf_regs);
4018}
4019
915f619f
JW
4020/* Output code for the function epilogue. */
4021
08c148a8
NB
4022static void
4023sparc_nonflat_function_epilogue (file, size, leaf_function)
ab835497 4024 FILE *file;
08c148a8 4025 HOST_WIDE_INT size ATTRIBUTE_UNUSED;
ef8200df 4026 int leaf_function;
ab835497 4027{
3bb5de61 4028 const char *ret;
ab835497 4029
8456b95a 4030 if (current_function_epilogue_delay_list == 0)
e48addee 4031 {
e0d80184 4032 /* If code does not drop into the epilogue, we need
7a31a340
DM
4033 do nothing except output pending case vectors.
4034
4035 We have to still output a dummy nop for the sake of
4036 sane backtraces. Otherwise, if the last two instructions
4037 of a function were call foo; dslot; this can make the return
4038 PC of foo (ie. address of call instruction plus 8) point to
4039 the first instruction in the next function. */
4040 rtx insn;
4041
4042 fputs("\tnop\n", file);
4043
4044 insn = get_last_insn ();
4045 if (GET_CODE (insn) == NOTE)
4046 insn = prev_nonnote_insn (insn);
4047 if (insn && GET_CODE (insn) == BARRIER)
4048 goto output_vectors;
bfd6bc60
JC
4049 }
4050
61a55e8b 4051 if (num_gfregs)
7d167afd 4052 output_restore_regs (file, leaf_function);
ab835497
RK
4053
4054 /* Work out how to skip the caller's unimp instruction if required. */
4055 if (leaf_function)
e0d80184 4056 ret = (SKIP_CALLERS_UNIMP_P ? "jmp\t%o7+12" : "retl");
ab835497 4057 else
e0d80184 4058 ret = (SKIP_CALLERS_UNIMP_P ? "jmp\t%i7+12" : "ret");
ab835497 4059
33074e5f 4060 if (! leaf_function)
ab835497 4061 {
33074e5f
RH
4062 if (current_function_calls_eh_return)
4063 {
4064 if (current_function_epilogue_delay_list)
4065 abort ();
4066 if (SKIP_CALLERS_UNIMP_P)
4067 abort ();
ab835497 4068
33074e5f
RH
4069 fputs ("\trestore\n\tretl\n\tadd\t%sp, %g1, %sp\n", file);
4070 }
4071 /* If we wound up with things in our delay slot, flush them here. */
4072 else if (current_function_epilogue_delay_list)
ef8200df 4073 {
33074e5f 4074 rtx delay = PATTERN (XEXP (current_function_epilogue_delay_list, 0));
1150a841 4075
33074e5f
RH
4076 if (TARGET_V9 && ! epilogue_renumber (&delay, 1))
4077 {
4078 epilogue_renumber (&delay, 0);
4079 fputs (SKIP_CALLERS_UNIMP_P
4080 ? "\treturn\t%i7+12\n"
4081 : "\treturn\t%i7+8\n", file);
4082 final_scan_insn (XEXP (current_function_epilogue_delay_list, 0),
4083 file, 1, 0, 0);
1150a841 4084 }
33074e5f 4085 else
ab835497 4086 {
33074e5f 4087 rtx insn, src;
e48addee 4088
33074e5f
RH
4089 if (GET_CODE (delay) != SET)
4090 abort();
e48addee 4091
33074e5f
RH
4092 src = SET_SRC (delay);
4093 if (GET_CODE (src) == ASHIFT)
4094 {
4095 if (XEXP (src, 1) != const1_rtx)
e48addee 4096 abort();
33074e5f
RH
4097 SET_SRC (delay)
4098 = gen_rtx_PLUS (GET_MODE (src), XEXP (src, 0),
4099 XEXP (src, 0));
4100 }
e48addee 4101
33074e5f
RH
4102 insn = gen_rtx_PARALLEL (VOIDmode,
4103 gen_rtvec (2, delay,
4104 gen_rtx_RETURN (VOIDmode)));
4105 insn = emit_jump_insn (insn);
e48addee 4106
33074e5f
RH
4107 sparc_emitting_epilogue = true;
4108 final_scan_insn (insn, file, 1, 0, 1);
4109 sparc_emitting_epilogue = false;
ab835497 4110 }
ef8200df 4111 }
33074e5f
RH
4112 else if (TARGET_V9 && ! SKIP_CALLERS_UNIMP_P)
4113 fputs ("\treturn\t%i7+8\n\tnop\n", file);
4114 else
4115 fprintf (file, "\t%s\n\trestore\n", ret);
4116 }
4117 /* All of the following cases are for leaf functions. */
4118 else if (current_function_calls_eh_return)
4119 abort ();
4120 else if (current_function_epilogue_delay_list)
4121 {
4122 /* eligible_for_epilogue_delay_slot ensures that if this is a
4123 leaf function, then we will only have insn in the delay slot
4124 if the frame size is zero, thus no adjust for the stack is
4125 needed here. */
4126 if (actual_fsize != 0)
1150a841 4127 abort ();
33074e5f
RH
4128 fprintf (file, "\t%s\n", ret);
4129 final_scan_insn (XEXP (current_function_epilogue_delay_list, 0),
4130 file, 1, 0, 1);
ab835497 4131 }
33074e5f
RH
4132 /* Output 'nop' instead of 'sub %sp,-0,%sp' when no frame, so as to
4133 avoid generating confusing assembly language output. */
4134 else if (actual_fsize == 0)
4135 fprintf (file, "\t%s\n\tnop\n", ret);
4136 else if (actual_fsize <= 4096)
4137 fprintf (file, "\t%s\n\tsub\t%%sp, -%d, %%sp\n", ret, actual_fsize);
4138 else if (actual_fsize <= 8192)
4139 fprintf (file, "\tsub\t%%sp, -4096, %%sp\n\t%s\n\tsub\t%%sp, -%d, %%sp\n",
4140 ret, actual_fsize - 4096);
4141 else if ((actual_fsize & 0x3ff) == 0)
4142 fprintf (file, "\tsethi\t%%hi(%d), %%g1\n\t%s\n\tadd\t%%sp, %%g1, %%sp\n",
4143 actual_fsize, ret);
4144 else
4145 fprintf (file, "\tsethi\t%%hi(%d), %%g1\n\tor\t%%g1, %%lo(%d), %%g1\n\t%s\n\tadd\t%%sp, %%g1, %%sp\n",
4146 actual_fsize, actual_fsize, ret);
e0d80184
DM
4147
4148 output_vectors:
4149 sparc_output_deferred_case_vectors ();
ab835497 4150}
7d167afd
JJ
4151
4152/* Output a sibling call. */
4153
4154const char *
4155output_sibcall (insn, call_operand)
4156 rtx insn, call_operand;
4157{
4158 int leaf_regs = current_function_uses_only_leaf_regs;
4159 rtx operands[3];
4160 int delay_slot = dbr_sequence_length () > 0;
4161
4162 if (num_gfregs)
4163 {
4164 /* Call to restore global regs might clobber
4165 the delay slot. Instead of checking for this
4166 output the delay slot now. */
4167 if (delay_slot)
4168 {
4169 rtx delay = NEXT_INSN (insn);
4170
4171 if (! delay)
4172 abort ();
4173
4174 final_scan_insn (delay, asm_out_file, 1, 0, 1);
4175 PATTERN (delay) = gen_blockage ();
4176 INSN_CODE (delay) = -1;
4177 delay_slot = 0;
4178 }
4179 output_restore_regs (asm_out_file, leaf_regs);
4180 }
4181
4182 operands[0] = call_operand;
4183
4184 if (leaf_regs)
4185 {
e95b1e6a
JJ
4186#ifdef HAVE_AS_RELAX_OPTION
4187 /* If as and ld are relaxing tail call insns into branch always,
4188 use or %o7,%g0,X; call Y; or X,%g0,%o7 always, so that it can
4189 be optimized. With sethi/jmpl as nor ld has no easy way how to
4190 find out if somebody does not branch between the sethi and jmpl. */
4191 int spare_slot = 0;
4192#else
2be5e524 4193 int spare_slot = ((TARGET_ARCH32 || TARGET_CM_MEDLOW) && ! flag_pic);
e95b1e6a 4194#endif
7d167afd
JJ
4195 int size = 0;
4196
4197 if ((actual_fsize || ! spare_slot) && delay_slot)
4198 {
4199 rtx delay = NEXT_INSN (insn);
4200
4201 if (! delay)
4202 abort ();
4203
4204 final_scan_insn (delay, asm_out_file, 1, 0, 1);
4205 PATTERN (delay) = gen_blockage ();
4206 INSN_CODE (delay) = -1;
4207 delay_slot = 0;
4208 }
4209 if (actual_fsize)
4210 {
4211 if (actual_fsize <= 4096)
4212 size = actual_fsize;
4213 else if (actual_fsize <= 8192)
4214 {
4215 fputs ("\tsub\t%sp, -4096, %sp\n", asm_out_file);
4216 size = actual_fsize - 4096;
4217 }
4218 else if ((actual_fsize & 0x3ff) == 0)
4219 fprintf (asm_out_file,
4220 "\tsethi\t%%hi(%d), %%g1\n\tadd\t%%sp, %%g1, %%sp\n",
4221 actual_fsize);
4222 else
4223 {
4224 fprintf (asm_out_file,
4225 "\tsethi\t%%hi(%d), %%g1\n\tor\t%%g1, %%lo(%d), %%g1\n",
4226 actual_fsize, actual_fsize);
4227 fputs ("\tadd\t%%sp, %%g1, %%sp\n", asm_out_file);
4228 }
4229 }
4230 if (spare_slot)
4231 {
4232 output_asm_insn ("sethi\t%%hi(%a0), %%g1", operands);
4233 output_asm_insn ("jmpl\t%%g1 + %%lo(%a0), %%g0", operands);
4234 if (size)
4235 fprintf (asm_out_file, "\t sub\t%%sp, -%d, %%sp\n", size);
4236 else if (! delay_slot)
4237 fputs ("\t nop\n", asm_out_file);
4238 }
4239 else
4240 {
4241 if (size)
4242 fprintf (asm_out_file, "\tsub\t%%sp, -%d, %%sp\n", size);
e95b1e6a
JJ
4243 /* Use or with rs2 %%g0 instead of mov, so that as/ld can optimize
4244 it into branch if possible. */
4245 output_asm_insn ("or\t%%o7, %%g0, %%g1", operands);
7d167afd 4246 output_asm_insn ("call\t%a0, 0", operands);
e95b1e6a 4247 output_asm_insn (" or\t%%g1, %%g0, %%o7", operands);
7d167afd
JJ
4248 }
4249 return "";
4250 }
4251
4252 output_asm_insn ("call\t%a0, 0", operands);
4253 if (delay_slot)
4254 {
4255 rtx delay = NEXT_INSN (insn), pat;
4256
4257 if (! delay)
4258 abort ();
4259
4260 pat = PATTERN (delay);
4261 if (GET_CODE (pat) != SET)
4262 abort ();
4263
4264 operands[0] = SET_DEST (pat);
4265 pat = SET_SRC (pat);
4266 switch (GET_CODE (pat))
4267 {
4268 case PLUS:
4269 operands[1] = XEXP (pat, 0);
4270 operands[2] = XEXP (pat, 1);
4271 output_asm_insn (" restore %r1, %2, %Y0", operands);
4272 break;
4273 case LO_SUM:
4274 operands[1] = XEXP (pat, 0);
4275 operands[2] = XEXP (pat, 1);
4276 output_asm_insn (" restore %r1, %%lo(%a2), %Y0", operands);
4277 break;
4278 case ASHIFT:
4279 operands[1] = XEXP (pat, 0);
4280 output_asm_insn (" restore %r1, %r1, %Y0", operands);
4281 break;
4282 default:
4283 operands[1] = pat;
4284 output_asm_insn (" restore %%g0, %1, %Y0", operands);
4285 break;
4286 }
4287 PATTERN (delay) = gen_blockage ();
4288 INSN_CODE (delay) = -1;
4289 }
4290 else
4291 fputs ("\t restore\n", asm_out_file);
4292 return "";
4293}
4fb4e4b8
DE
4294\f
4295/* Functions for handling argument passing.
4296
4297 For v8 the first six args are normally in registers and the rest are
4298 pushed. Any arg that starts within the first 6 words is at least
4299 partially passed in a register unless its data type forbids.
4300
4301 For v9, the argument registers are laid out as an array of 16 elements
4302 and arguments are added sequentially. The first 6 int args and up to the
4303 first 16 fp args (depending on size) are passed in regs.
4304
4305 Slot Stack Integral Float Float in structure Double Long Double
4306 ---- ----- -------- ----- ------------------ ------ -----------
4307 15 [SP+248] %f31 %f30,%f31 %d30
4308 14 [SP+240] %f29 %f28,%f29 %d28 %q28
4309 13 [SP+232] %f27 %f26,%f27 %d26
4310 12 [SP+224] %f25 %f24,%f25 %d24 %q24
4311 11 [SP+216] %f23 %f22,%f23 %d22
4312 10 [SP+208] %f21 %f20,%f21 %d20 %q20
4313 9 [SP+200] %f19 %f18,%f19 %d18
4314 8 [SP+192] %f17 %f16,%f17 %d16 %q16
4315 7 [SP+184] %f15 %f14,%f15 %d14
4316 6 [SP+176] %f13 %f12,%f13 %d12 %q12
4317 5 [SP+168] %o5 %f11 %f10,%f11 %d10
4318 4 [SP+160] %o4 %f9 %f8,%f9 %d8 %q8
4319 3 [SP+152] %o3 %f7 %f6,%f7 %d6
4320 2 [SP+144] %o2 %f5 %f4,%f5 %d4 %q4
4321 1 [SP+136] %o1 %f3 %f2,%f3 %d2
4322 0 [SP+128] %o0 %f1 %f0,%f1 %d0 %q0
4323
4324 Here SP = %sp if -mno-stack-bias or %sp+stack_bias otherwise.
4325
4326 Integral arguments are always passed as 64 bit quantities appropriately
4327 extended.
4328
4329 Passing of floating point values is handled as follows.
4330 If a prototype is in scope:
4331 If the value is in a named argument (i.e. not a stdarg function or a
4332 value not part of the `...') then the value is passed in the appropriate
4333 fp reg.
4334 If the value is part of the `...' and is passed in one of the first 6
4335 slots then the value is passed in the appropriate int reg.
4336 If the value is part of the `...' and is not passed in one of the first 6
4337 slots then the value is passed in memory.
4338 If a prototype is not in scope:
4339 If the value is one of the first 6 arguments the value is passed in the
4340 appropriate integer reg and the appropriate fp reg.
4341 If the value is not one of the first 6 arguments the value is passed in
4342 the appropriate fp reg and in memory.
4343 */
4344
4345/* Maximum number of int regs for args. */
4346#define SPARC_INT_ARG_MAX 6
4347/* Maximum number of fp regs for args. */
4348#define SPARC_FP_ARG_MAX 16
4349
4350#define ROUND_ADVANCE(SIZE) (((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
4351
4352/* Handle the INIT_CUMULATIVE_ARGS macro.
4353 Initialize a variable CUM of type CUMULATIVE_ARGS
4354 for a call to a function whose data type is FNTYPE.
4355 For a library call, FNTYPE is 0. */
3ea1fdd3 4356
4fb4e4b8
DE
4357void
4358init_cumulative_args (cum, fntype, libname, indirect)
4359 CUMULATIVE_ARGS *cum;
db3d4438 4360 tree fntype;
88430453 4361 rtx libname ATTRIBUTE_UNUSED;
db3d4438 4362 int indirect ATTRIBUTE_UNUSED;
4fb4e4b8
DE
4363{
4364 cum->words = 0;
4365 cum->prototype_p = fntype && TYPE_ARG_TYPES (fntype);
4366 cum->libcall_p = fntype == 0;
4367}
61a55e8b 4368
4fb4e4b8
DE
4369/* Compute the slot number to pass an argument in.
4370 Returns the slot number or -1 if passing on the stack.
4371
4372 CUM is a variable of type CUMULATIVE_ARGS which gives info about
4373 the preceding args and about the function being called.
4374 MODE is the argument's machine mode.
4375 TYPE is the data type of the argument (as a tree).
4376 This is null for libcalls where that information may
4377 not be available.
4378 NAMED is nonzero if this argument is a named parameter
4379 (otherwise it is an extra parameter matching an ellipsis).
4380 INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG.
4381 *PREGNO records the register number to use if scalar type.
4382 *PPADDING records the amount of padding needed in words. */
4383
4384static int
4385function_arg_slotno (cum, mode, type, named, incoming_p, pregno, ppadding)
4386 const CUMULATIVE_ARGS *cum;
4387 enum machine_mode mode;
4388 tree type;
4389 int named;
4390 int incoming_p;
4391 int *pregno;
4392 int *ppadding;
4393{
4394 int regbase = (incoming_p
4395 ? SPARC_INCOMING_INT_ARG_FIRST
4396 : SPARC_OUTGOING_INT_ARG_FIRST);
4397 int slotno = cum->words;
4398 int regno;
4399
4400 *ppadding = 0;
4401
4402 if (type != 0 && TREE_ADDRESSABLE (type))
4403 return -1;
4404 if (TARGET_ARCH32
4405 && type != 0 && mode == BLKmode
4406 && TYPE_ALIGN (type) % PARM_BOUNDARY != 0)
4407 return -1;
4408
4409 switch (mode)
4410 {
4411 case VOIDmode :
4412 /* MODE is VOIDmode when generating the actual call.
4413 See emit_call_1. */
4414 return -1;
4415
4416 case QImode : case CQImode :
4417 case HImode : case CHImode :
4418 case SImode : case CSImode :
4419 case DImode : case CDImode :
380f6ad3 4420 case TImode : case CTImode :
4fb4e4b8
DE
4421 if (slotno >= SPARC_INT_ARG_MAX)
4422 return -1;
4423 regno = regbase + slotno;
4424 break;
4425
4426 case SFmode : case SCmode :
4427 case DFmode : case DCmode :
4428 case TFmode : case TCmode :
4429 if (TARGET_ARCH32)
4430 {
4431 if (slotno >= SPARC_INT_ARG_MAX)
4432 return -1;
4433 regno = regbase + slotno;
4434 }
4435 else
4436 {
4437 if ((mode == TFmode || mode == TCmode)
4438 && (slotno & 1) != 0)
4439 slotno++, *ppadding = 1;
4440 if (TARGET_FPU && named)
4441 {
4442 if (slotno >= SPARC_FP_ARG_MAX)
82d6b402 4443 return -1;
4fb4e4b8
DE
4444 regno = SPARC_FP_ARG_FIRST + slotno * 2;
4445 if (mode == SFmode)
4446 regno++;
4447 }
4448 else
4449 {
4450 if (slotno >= SPARC_INT_ARG_MAX)
4451 return -1;
4452 regno = regbase + slotno;
4453 }
4454 }
4455 break;
4456
4457 case BLKmode :
4458 /* For sparc64, objects requiring 16 byte alignment get it. */
4459 if (TARGET_ARCH64)
4460 {
4461 if (type && TYPE_ALIGN (type) == 128 && (slotno & 1) != 0)
4462 slotno++, *ppadding = 1;
4463 }
4464
4465 if (TARGET_ARCH32
5e9defae 4466 || (type && TREE_CODE (type) == UNION_TYPE))
4fb4e4b8
DE
4467 {
4468 if (slotno >= SPARC_INT_ARG_MAX)
4469 return -1;
4470 regno = regbase + slotno;
4471 }
4472 else
4473 {
4474 tree field;
4475 int intregs_p = 0, fpregs_p = 0;
4476 /* The ABI obviously doesn't specify how packed
4477 structures are passed. These are defined to be passed
4478 in int regs if possible, otherwise memory. */
4479 int packed_p = 0;
4480
4481 /* First see what kinds of registers we need. */
4482 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4483 {
4484 if (TREE_CODE (field) == FIELD_DECL)
4485 {
4486 if (TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
4487 && TARGET_FPU)
4488 fpregs_p = 1;
4489 else
4490 intregs_p = 1;
4491 if (DECL_PACKED (field))
4492 packed_p = 1;
4493 }
4494 }
4495 if (packed_p || !named)
4496 fpregs_p = 0, intregs_p = 1;
4497
4498 /* If all arg slots are filled, then must pass on stack. */
4499 if (fpregs_p && slotno >= SPARC_FP_ARG_MAX)
4500 return -1;
4501 /* If there are only int args and all int arg slots are filled,
4502 then must pass on stack. */
4503 if (!fpregs_p && intregs_p && slotno >= SPARC_INT_ARG_MAX)
4504 return -1;
4505 /* Note that even if all int arg slots are filled, fp members may
4506 still be passed in regs if such regs are available.
4507 *PREGNO isn't set because there may be more than one, it's up
4508 to the caller to compute them. */
4509 return slotno;
4510 }
4511 break;
4512
4513 default :
4514 abort ();
4515 }
4516
4517 *pregno = regno;
4518 return slotno;
4519}
4520
82d6b402
RH
4521/* Handle recursive register counting for structure field layout. */
4522
4523struct function_arg_record_value_parms
4524{
4525 rtx ret;
4526 int slotno, named, regbase;
75131237
RK
4527 unsigned int nregs;
4528 int intoffset;
82d6b402
RH
4529};
4530
2a01c939 4531static void function_arg_record_value_3
75131237 4532 PARAMS ((HOST_WIDE_INT, struct function_arg_record_value_parms *));
2a01c939 4533static void function_arg_record_value_2
75131237
RK
4534 PARAMS ((tree, HOST_WIDE_INT,
4535 struct function_arg_record_value_parms *));
b1474bb7 4536static void function_arg_record_value_1
75131237
RK
4537 PARAMS ((tree, HOST_WIDE_INT,
4538 struct function_arg_record_value_parms *));
2a01c939 4539static rtx function_arg_record_value
f6da8bc3 4540 PARAMS ((tree, enum machine_mode, int, int, int));
2a01c939 4541
0020b823
RH
4542/* A subroutine of function_arg_record_value. Traverse the structure
4543 recusively and determine how many registers will be required. */
4544
82d6b402
RH
4545static void
4546function_arg_record_value_1 (type, startbitpos, parms)
4547 tree type;
75131237 4548 HOST_WIDE_INT startbitpos;
82d6b402
RH
4549 struct function_arg_record_value_parms *parms;
4550{
4551 tree field;
4552
4553 /* The ABI obviously doesn't specify how packed structures are
4554 passed. These are defined to be passed in int regs if possible,
4555 otherwise memory. */
4556 int packed_p = 0;
4557
4558 /* We need to compute how many registers are needed so we can
4559 allocate the PARALLEL but before we can do that we need to know
4560 whether there are any packed fields. If there are, int regs are
4561 used regardless of whether there are fp values present. */
4562 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4563 {
4564 if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
4565 {
4566 packed_p = 1;
4567 break;
4568 }
4569 }
4570
4571 /* Compute how many registers we need. */
4572 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4573 {
4574 if (TREE_CODE (field) == FIELD_DECL)
4575 {
75131237
RK
4576 HOST_WIDE_INT bitpos = startbitpos;
4577
4578 if (DECL_SIZE (field) != 0
4579 && host_integerp (bit_position (field), 1))
4580 bitpos += int_bit_position (field);
4581
82d6b402
RH
4582 /* ??? FIXME: else assume zero offset. */
4583
4584 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
75131237 4585 function_arg_record_value_1 (TREE_TYPE (field), bitpos, parms);
105b2084
JJ
4586 else if ((TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
4587 || (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE
4588 && (TREE_CODE (TREE_TYPE (TREE_TYPE (field)))
4589 == REAL_TYPE)))
82d6b402
RH
4590 && TARGET_FPU
4591 && ! packed_p
4592 && parms->named)
4593 {
4594 if (parms->intoffset != -1)
4595 {
4596 int intslots, this_slotno;
4597
4598 intslots = (bitpos - parms->intoffset + BITS_PER_WORD - 1)
4599 / BITS_PER_WORD;
4600 this_slotno = parms->slotno + parms->intoffset
4601 / BITS_PER_WORD;
4602
4603 intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno);
4604 intslots = MAX (intslots, 0);
4605 parms->nregs += intslots;
4606 parms->intoffset = -1;
4607 }
4608
4609 /* There's no need to check this_slotno < SPARC_FP_ARG MAX.
4610 If it wasn't true we wouldn't be here. */
4611 parms->nregs += 1;
105b2084
JJ
4612 if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
4613 parms->nregs += 1;
82d6b402
RH
4614 }
4615 else
4616 {
4617 if (parms->intoffset == -1)
4618 parms->intoffset = bitpos;
4619 }
4620 }
4621 }
4622}
4623
0020b823
RH
4624/* A subroutine of function_arg_record_value. Assign the bits of the
4625 structure between parms->intoffset and bitpos to integer registers. */
82d6b402
RH
4626
4627static void
4628function_arg_record_value_3 (bitpos, parms)
75131237 4629 HOST_WIDE_INT bitpos;
82d6b402
RH
4630 struct function_arg_record_value_parms *parms;
4631{
4632 enum machine_mode mode;
75131237 4633 unsigned int regno;
0020b823 4634 unsigned int startbit, endbit;
75131237 4635 int this_slotno, intslots, intoffset;
82d6b402
RH
4636 rtx reg;
4637
4638 if (parms->intoffset == -1)
4639 return;
75131237 4640
82d6b402
RH
4641 intoffset = parms->intoffset;
4642 parms->intoffset = -1;
4643
0020b823
RH
4644 startbit = intoffset & -BITS_PER_WORD;
4645 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
4646 intslots = (endbit - startbit) / BITS_PER_WORD;
82d6b402
RH
4647 this_slotno = parms->slotno + intoffset / BITS_PER_WORD;
4648
4649 intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno);
4650 if (intslots <= 0)
4651 return;
4652
4653 /* If this is the trailing part of a word, only load that much into
4654 the register. Otherwise load the whole register. Note that in
4655 the latter case we may pick up unwanted bits. It's not a problem
4656 at the moment but may wish to revisit. */
4657
4658 if (intoffset % BITS_PER_WORD != 0)
75131237
RK
4659 mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
4660 MODE_INT, 0);
82d6b402
RH
4661 else
4662 mode = word_mode;
4663
4664 intoffset /= BITS_PER_UNIT;
4665 do
4666 {
4667 regno = parms->regbase + this_slotno;
254110c2 4668 reg = gen_rtx_REG (mode, regno);
82d6b402 4669 XVECEXP (parms->ret, 0, parms->nregs)
254110c2 4670 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
82d6b402
RH
4671
4672 this_slotno += 1;
4673 intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
4674 parms->nregs += 1;
4675 intslots -= 1;
4676 }
4677 while (intslots > 0);
4678}
4679
0020b823
RH
4680/* A subroutine of function_arg_record_value. Traverse the structure
4681 recursively and assign bits to floating point registers. Track which
4682 bits in between need integer registers; invoke function_arg_record_value_3
4683 to make that happen. */
4684
82d6b402
RH
4685static void
4686function_arg_record_value_2 (type, startbitpos, parms)
4687 tree type;
75131237 4688 HOST_WIDE_INT startbitpos;
82d6b402
RH
4689 struct function_arg_record_value_parms *parms;
4690{
4691 tree field;
4692 int packed_p = 0;
4693
4694 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4695 {
4696 if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
4697 {
4698 packed_p = 1;
4699 break;
4700 }
4701 }
4702
4703 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4704 {
4705 if (TREE_CODE (field) == FIELD_DECL)
4706 {
75131237
RK
4707 HOST_WIDE_INT bitpos = startbitpos;
4708
4709 if (DECL_SIZE (field) != 0
4710 && host_integerp (bit_position (field), 1))
4711 bitpos += int_bit_position (field);
4712
82d6b402
RH
4713 /* ??? FIXME: else assume zero offset. */
4714
4715 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
75131237 4716 function_arg_record_value_2 (TREE_TYPE (field), bitpos, parms);
105b2084
JJ
4717 else if ((TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
4718 || (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE
4719 && (TREE_CODE (TREE_TYPE (TREE_TYPE (field)))
4720 == REAL_TYPE)))
82d6b402
RH
4721 && TARGET_FPU
4722 && ! packed_p
4723 && parms->named)
4724 {
4725 int this_slotno = parms->slotno + bitpos / BITS_PER_WORD;
105b2084
JJ
4726 int regno;
4727 enum machine_mode mode = DECL_MODE (field);
82d6b402
RH
4728 rtx reg;
4729
4730 function_arg_record_value_3 (bitpos, parms);
105b2084
JJ
4731 regno = SPARC_FP_ARG_FIRST + this_slotno * 2
4732 + ((mode == SFmode || mode == SCmode)
4733 && (bitpos & 32) != 0);
4734 switch (mode)
4735 {
4736 case SCmode: mode = SFmode; break;
4737 case DCmode: mode = DFmode; break;
4738 case TCmode: mode = TFmode; break;
4739 default: break;
4740 }
4741 reg = gen_rtx_REG (mode, regno);
82d6b402 4742 XVECEXP (parms->ret, 0, parms->nregs)
254110c2 4743 = gen_rtx_EXPR_LIST (VOIDmode, reg,
82d6b402
RH
4744 GEN_INT (bitpos / BITS_PER_UNIT));
4745 parms->nregs += 1;
105b2084
JJ
4746 if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
4747 {
4748 regno += GET_MODE_SIZE (mode) / 4;
4749 reg = gen_rtx_REG (mode, regno);
4750 XVECEXP (parms->ret, 0, parms->nregs)
4751 = gen_rtx_EXPR_LIST (VOIDmode, reg,
4752 GEN_INT ((bitpos + GET_MODE_BITSIZE (mode))
4753 / BITS_PER_UNIT));
4754 parms->nregs += 1;
4755 }
82d6b402
RH
4756 }
4757 else
4758 {
4759 if (parms->intoffset == -1)
4760 parms->intoffset = bitpos;
4761 }
4762 }
4763 }
4764}
4765
0020b823 4766/* Used by function_arg and function_value to implement the complex
56149abc 4767 SPARC64 structure calling conventions. */
0020b823 4768
82d6b402 4769static rtx
1eac9f59 4770function_arg_record_value (type, mode, slotno, named, regbase)
82d6b402 4771 tree type;
1eac9f59 4772 enum machine_mode mode;
82d6b402
RH
4773 int slotno, named, regbase;
4774{
4775 HOST_WIDE_INT typesize = int_size_in_bytes (type);
4776 struct function_arg_record_value_parms parms;
75131237 4777 unsigned int nregs;
82d6b402
RH
4778
4779 parms.ret = NULL_RTX;
4780 parms.slotno = slotno;
4781 parms.named = named;
4782 parms.regbase = regbase;
4783
4784 /* Compute how many registers we need. */
4785 parms.nregs = 0;
4786 parms.intoffset = 0;
4787 function_arg_record_value_1 (type, 0, &parms);
4788
4789 if (parms.intoffset != -1)
4790 {
0020b823 4791 unsigned int startbit, endbit;
82d6b402
RH
4792 int intslots, this_slotno;
4793
0020b823
RH
4794 startbit = parms.intoffset & -BITS_PER_WORD;
4795 endbit = (typesize*BITS_PER_UNIT + BITS_PER_WORD - 1) & -BITS_PER_WORD;
4796 intslots = (endbit - startbit) / BITS_PER_WORD;
82d6b402
RH
4797 this_slotno = slotno + parms.intoffset / BITS_PER_WORD;
4798
4799 intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno);
4800 intslots = MAX (intslots, 0);
4801
4802 parms.nregs += intslots;
4803 }
4804 nregs = parms.nregs;
4805
4806 /* Allocate the vector and handle some annoying special cases. */
4807 if (nregs == 0)
4808 {
4809 /* ??? Empty structure has no value? Duh? */
4810 if (typesize <= 0)
4811 {
4812 /* Though there's nothing really to store, return a word register
4813 anyway so the rest of gcc doesn't go nuts. Returning a PARALLEL
4814 leads to breakage due to the fact that there are zero bytes to
4815 load. */
1eac9f59 4816 return gen_rtx_REG (mode, regbase);
82d6b402
RH
4817 }
4818 else
4819 {
4820 /* ??? C++ has structures with no fields, and yet a size. Give up
4821 for now and pass everything back in integer registers. */
4822 nregs = (typesize + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4823 }
4824 if (nregs + slotno > SPARC_INT_ARG_MAX)
4825 nregs = SPARC_INT_ARG_MAX - slotno;
4826 }
4827 if (nregs == 0)
9208e4b2 4828 abort ();
82d6b402 4829
1eac9f59 4830 parms.ret = gen_rtx_PARALLEL (mode, rtvec_alloc (nregs));
82d6b402
RH
4831
4832 /* Fill in the entries. */
4833 parms.nregs = 0;
4834 parms.intoffset = 0;
4835 function_arg_record_value_2 (type, 0, &parms);
4836 function_arg_record_value_3 (typesize * BITS_PER_UNIT, &parms);
4837
4838 if (parms.nregs != nregs)
4839 abort ();
4840
4841 return parms.ret;
4842}
4843
4fb4e4b8
DE
4844/* Handle the FUNCTION_ARG macro.
4845 Determine where to put an argument to a function.
4846 Value is zero to push the argument on the stack,
4847 or a hard register in which to store the argument.
4848
4849 CUM is a variable of type CUMULATIVE_ARGS which gives info about
4850 the preceding args and about the function being called.
4851 MODE is the argument's machine mode.
4852 TYPE is the data type of the argument (as a tree).
4853 This is null for libcalls where that information may
4854 not be available.
4855 NAMED is nonzero if this argument is a named parameter
4856 (otherwise it is an extra parameter matching an ellipsis).
4857 INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG. */
61a55e8b
DE
4858
4859rtx
4fb4e4b8
DE
4860function_arg (cum, mode, type, named, incoming_p)
4861 const CUMULATIVE_ARGS *cum;
4862 enum machine_mode mode;
4863 tree type;
4864 int named;
4865 int incoming_p;
61a55e8b 4866{
4fb4e4b8
DE
4867 int regbase = (incoming_p
4868 ? SPARC_INCOMING_INT_ARG_FIRST
4869 : SPARC_OUTGOING_INT_ARG_FIRST);
4870 int slotno, regno, padding;
4871 rtx reg;
4872
4873 slotno = function_arg_slotno (cum, mode, type, named, incoming_p,
4874 &regno, &padding);
4875
4876 if (slotno == -1)
4877 return 0;
4878
4879 if (TARGET_ARCH32)
4880 {
254110c2 4881 reg = gen_rtx_REG (mode, regno);
4fb4e4b8
DE
4882 return reg;
4883 }
4884
4885 /* v9 fp args in reg slots beyond the int reg slots get passed in regs
4886 but also have the slot allocated for them.
4887 If no prototype is in scope fp values in register slots get passed
4888 in two places, either fp regs and int regs or fp regs and memory. */
4889 if ((GET_MODE_CLASS (mode) == MODE_FLOAT
4890 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4891 && SPARC_FP_REG_P (regno))
4892 {
254110c2 4893 reg = gen_rtx_REG (mode, regno);
4fb4e4b8
DE
4894 if (cum->prototype_p || cum->libcall_p)
4895 {
4896 /* "* 2" because fp reg numbers are recorded in 4 byte
4897 quantities. */
82d6b402 4898#if 0
4fb4e4b8
DE
4899 /* ??? This will cause the value to be passed in the fp reg and
4900 in the stack. When a prototype exists we want to pass the
4901 value in the reg but reserve space on the stack. That's an
956d6950 4902 optimization, and is deferred [for a bit]. */
4fb4e4b8 4903 if ((regno - SPARC_FP_ARG_FIRST) >= SPARC_INT_ARG_MAX * 2)
254110c2 4904 return gen_rtx_PARALLEL (mode,
4fb4e4b8 4905 gen_rtvec (2,
254110c2 4906 gen_rtx_EXPR_LIST (VOIDmode,
4fb4e4b8 4907 NULL_RTX, const0_rtx),
254110c2 4908 gen_rtx_EXPR_LIST (VOIDmode,
4fb4e4b8
DE
4909 reg, const0_rtx)));
4910 else
82d6b402
RH
4911#else
4912 /* ??? It seems that passing back a register even when past
4913 the area declared by REG_PARM_STACK_SPACE will allocate
4914 space appropriately, and will not copy the data onto the
4915 stack, exactly as we desire.
4916
4917 This is due to locate_and_pad_parm being called in
4918 expand_call whenever reg_parm_stack_space > 0, which
4919 while benefical to our example here, would seem to be
4920 in error from what had been intended. Ho hum... -- r~ */
4921#endif
4fb4e4b8
DE
4922 return reg;
4923 }
4924 else
4925 {
82d6b402
RH
4926 rtx v0, v1;
4927
4fb4e4b8
DE
4928 if ((regno - SPARC_FP_ARG_FIRST) < SPARC_INT_ARG_MAX * 2)
4929 {
82d6b402
RH
4930 int intreg;
4931
4932 /* On incoming, we don't need to know that the value
4933 is passed in %f0 and %i0, and it confuses other parts
4934 causing needless spillage even on the simplest cases. */
4935 if (incoming_p)
4936 return reg;
4937
4938 intreg = (SPARC_OUTGOING_INT_ARG_FIRST
4939 + (regno - SPARC_FP_ARG_FIRST) / 2);
4940
4941 v0 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
4942 v1 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (mode, intreg),
4943 const0_rtx);
4944 return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
4fb4e4b8
DE
4945 }
4946 else
82d6b402
RH
4947 {
4948 v0 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
4949 v1 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
4950 return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
4951 }
4fb4e4b8
DE
4952 }
4953 }
4954 else if (type && TREE_CODE (type) == RECORD_TYPE)
4955 {
4956 /* Structures up to 16 bytes in size are passed in arg slots on the
4957 stack and are promoted to registers where possible. */
4fb4e4b8
DE
4958
4959 if (int_size_in_bytes (type) > 16)
4960 abort (); /* shouldn't get here */
4961
1eac9f59 4962 return function_arg_record_value (type, mode, slotno, named, regbase);
4fb4e4b8
DE
4963 }
4964 else if (type && TREE_CODE (type) == UNION_TYPE)
4965 {
4966 enum machine_mode mode;
4967 int bytes = int_size_in_bytes (type);
4968
4969 if (bytes > 16)
4970 abort ();
4971
4972 mode = mode_for_size (bytes * BITS_PER_UNIT, MODE_INT, 0);
254110c2 4973 reg = gen_rtx_REG (mode, regno);
4fb4e4b8 4974 }
a7acd911 4975 else
4fb4e4b8
DE
4976 {
4977 /* Scalar or complex int. */
254110c2 4978 reg = gen_rtx_REG (mode, regno);
4fb4e4b8
DE
4979 }
4980
4981 return reg;
4982}
a7acd911 4983
4fb4e4b8
DE
4984/* Handle the FUNCTION_ARG_PARTIAL_NREGS macro.
4985 For an arg passed partly in registers and partly in memory,
4986 this is the number of registers used.
4987 For args passed entirely in registers or entirely in memory, zero.
61a55e8b 4988
4fb4e4b8
DE
4989 Any arg that starts in the first 6 regs but won't entirely fit in them
4990 needs partial registers on v8. On v9, structures with integer
4991 values in arg slots 5,6 will be passed in %o5 and SP+176, and complex fp
4992 values that begin in the last fp reg [where "last fp reg" varies with the
4993 mode] will be split between that reg and memory. */
61a55e8b 4994
4fb4e4b8
DE
4995int
4996function_arg_partial_nregs (cum, mode, type, named)
4997 const CUMULATIVE_ARGS *cum;
4998 enum machine_mode mode;
4999 tree type;
5000 int named;
5001{
5002 int slotno, regno, padding;
61a55e8b 5003
4fb4e4b8
DE
5004 /* We pass 0 for incoming_p here, it doesn't matter. */
5005 slotno = function_arg_slotno (cum, mode, type, named, 0, &regno, &padding);
5006
5007 if (slotno == -1)
5008 return 0;
5009
5010 if (TARGET_ARCH32)
bf62bbf1 5011 {
4fb4e4b8
DE
5012 if ((slotno + (mode == BLKmode
5013 ? ROUND_ADVANCE (int_size_in_bytes (type))
5014 : ROUND_ADVANCE (GET_MODE_SIZE (mode))))
5015 > NPARM_REGS (SImode))
5016 return NPARM_REGS (SImode) - slotno;
5017 return 0;
5018 }
5019 else
5020 {
5021 if (type && AGGREGATE_TYPE_P (type))
5022 {
5023 int size = int_size_in_bytes (type);
5024 int align = TYPE_ALIGN (type);
bf62bbf1 5025
4fb4e4b8
DE
5026 if (align == 16)
5027 slotno += slotno & 1;
5028 if (size > 8 && size <= 16
5029 && slotno == SPARC_INT_ARG_MAX - 1)
5030 return 1;
5031 }
5032 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_INT
5033 || (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
5034 && ! TARGET_FPU))
5035 {
5036 if (GET_MODE_ALIGNMENT (mode) == 128)
5037 {
5038 slotno += slotno & 1;
5039 if (slotno == SPARC_INT_ARG_MAX - 2)
5040 return 1;
5041 }
5042 else
5043 {
5044 if (slotno == SPARC_INT_ARG_MAX - 1)
5045 return 1;
5046 }
5047 }
5048 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5049 {
5050 if (GET_MODE_ALIGNMENT (mode) == 128)
5051 slotno += slotno & 1;
5052 if ((slotno + GET_MODE_SIZE (mode) / UNITS_PER_WORD)
5053 > SPARC_FP_ARG_MAX)
5054 return 1;
5055 }
5056 return 0;
bf62bbf1 5057 }
4fb4e4b8 5058}
61a55e8b 5059
4fb4e4b8
DE
5060/* Handle the FUNCTION_ARG_PASS_BY_REFERENCE macro.
5061 !v9: The SPARC ABI stipulates passing struct arguments (of any size) and
5062 quad-precision floats by invisible reference.
82d6b402 5063 v9: Aggregates greater than 16 bytes are passed by reference.
4fb4e4b8
DE
5064 For Pascal, also pass arrays by reference. */
5065
5066int
5067function_arg_pass_by_reference (cum, mode, type, named)
db3d4438 5068 const CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED;
4fb4e4b8
DE
5069 enum machine_mode mode;
5070 tree type;
db3d4438 5071 int named ATTRIBUTE_UNUSED;
4fb4e4b8
DE
5072{
5073 if (TARGET_ARCH32)
eadceb59 5074 {
5e9defae 5075 return ((type && AGGREGATE_TYPE_P (type))
4fb4e4b8
DE
5076 || mode == TFmode || mode == TCmode);
5077 }
5078 else
5079 {
5080 return ((type && TREE_CODE (type) == ARRAY_TYPE)
80ffc95e 5081 /* Consider complex values as aggregates, so care for TCmode. */
82d6b402 5082 || GET_MODE_SIZE (mode) > 16
f36dea3c
RH
5083 || (type
5084 && AGGREGATE_TYPE_P (type)
5085 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 16));
4fb4e4b8
DE
5086 }
5087}
5088
5089/* Handle the FUNCTION_ARG_ADVANCE macro.
5090 Update the data in CUM to advance over an argument
5091 of mode MODE and data type TYPE.
5092 TYPE is null for libcalls where that information may not be available. */
5093
5094void
5095function_arg_advance (cum, mode, type, named)
5096 CUMULATIVE_ARGS *cum;
5097 enum machine_mode mode;
5098 tree type;
5099 int named;
5100{
5101 int slotno, regno, padding;
5102
5103 /* We pass 0 for incoming_p here, it doesn't matter. */
5104 slotno = function_arg_slotno (cum, mode, type, named, 0, &regno, &padding);
5105
5106 /* If register required leading padding, add it. */
5107 if (slotno != -1)
5108 cum->words += padding;
eadceb59 5109
4fb4e4b8
DE
5110 if (TARGET_ARCH32)
5111 {
5112 cum->words += (mode != BLKmode
5113 ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
5114 : ROUND_ADVANCE (int_size_in_bytes (type)));
5115 }
5116 else
5117 {
5118 if (type && AGGREGATE_TYPE_P (type))
5119 {
5120 int size = int_size_in_bytes (type);
5121
5122 if (size <= 8)
5123 ++cum->words;
5124 else if (size <= 16)
5125 cum->words += 2;
5126 else /* passed by reference */
5127 ++cum->words;
5128 }
5129 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_INT)
5130 {
5131 cum->words += 2;
5132 }
5133 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5134 {
5135 cum->words += GET_MODE_SIZE (mode) / UNITS_PER_WORD;
5136 }
5137 else
5138 {
5139 cum->words += (mode != BLKmode
5140 ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
5141 : ROUND_ADVANCE (int_size_in_bytes (type)));
5142 }
eadceb59 5143 }
4fb4e4b8 5144}
eadceb59 5145
4fb4e4b8
DE
5146/* Handle the FUNCTION_ARG_PADDING macro.
5147 For the 64 bit ABI structs are always stored left shifted in their
5148 argument slot. */
5149
5150enum direction
5151function_arg_padding (mode, type)
5152 enum machine_mode mode;
5153 tree type;
5154{
c85f7c16
JL
5155 if (TARGET_ARCH64 && type != 0 && AGGREGATE_TYPE_P (type))
5156 return upward;
61a55e8b 5157
4fb4e4b8
DE
5158 /* This is the default definition. */
5159 return (! BYTES_BIG_ENDIAN
5160 ? upward
5161 : ((mode == BLKmode
5162 ? (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
5163 && int_size_in_bytes (type) < (PARM_BOUNDARY / BITS_PER_UNIT))
5164 : GET_MODE_BITSIZE (mode) < PARM_BOUNDARY)
5165 ? downward : upward));
61a55e8b 5166}
82d6b402
RH
5167
5168/* Handle FUNCTION_VALUE, FUNCTION_OUTGOING_VALUE, and LIBCALL_VALUE macros.
5169 For v9, function return values are subject to the same rules as arguments,
5170 except that up to 32-bytes may be returned in registers. */
5171
5172rtx
5173function_value (type, mode, incoming_p)
5174 tree type;
5175 enum machine_mode mode;
5176 int incoming_p;
5177{
5178 int regno;
5179 int regbase = (incoming_p
5180 ? SPARC_OUTGOING_INT_ARG_FIRST
5181 : SPARC_INCOMING_INT_ARG_FIRST);
5182
5183 if (TARGET_ARCH64 && type)
5184 {
5185 if (TREE_CODE (type) == RECORD_TYPE)
5186 {
5187 /* Structures up to 32 bytes in size are passed in registers,
5188 promoted to fp registers where possible. */
5189
5190 if (int_size_in_bytes (type) > 32)
5191 abort (); /* shouldn't get here */
5192
1eac9f59 5193 return function_arg_record_value (type, mode, 0, 1, regbase);
82d6b402 5194 }
8a7199ad 5195 else if (AGGREGATE_TYPE_P (type))
82d6b402 5196 {
8a7199ad
RK
5197 /* All other aggregate types are passed in an integer register
5198 in a mode corresponding to the size of the type. */
5199 HOST_WIDE_INT bytes = int_size_in_bytes (type);
82d6b402
RH
5200
5201 if (bytes > 32)
5202 abort ();
5203
5204 mode = mode_for_size (bytes * BITS_PER_UNIT, MODE_INT, 0);
5205 }
5206 }
3c6088d2
JJ
5207
5208 if (TARGET_ARCH64
5209 && GET_MODE_CLASS (mode) == MODE_INT
5210 && GET_MODE_SIZE (mode) < UNITS_PER_WORD
8a7199ad 5211 && type && ! AGGREGATE_TYPE_P (type))
3c6088d2 5212 mode = DImode;
82d6b402
RH
5213
5214 if (incoming_p)
5215 regno = BASE_RETURN_VALUE_REG (mode);
5216 else
5217 regno = BASE_OUTGOING_VALUE_REG (mode);
5218
254110c2 5219 return gen_rtx_REG (mode, regno);
82d6b402
RH
5220}
5221
648d2ffc
RH
5222/* Do what is necessary for `va_start'. We look at the current function
5223 to determine if stdarg or varargs is used and return the address of
5224 the first unnamed parameter. */
3ea1fdd3
JW
5225
5226rtx
648d2ffc 5227sparc_builtin_saveregs ()
3ea1fdd3 5228{
4fb4e4b8 5229 int first_reg = current_function_args_info.words;
3ea1fdd3
JW
5230 rtx address;
5231 int regno;
5232
4fb4e4b8 5233 for (regno = first_reg; regno < NPARM_REGS (word_mode); regno++)
254110c2 5234 emit_move_insn (gen_rtx_MEM (word_mode,
8ac61af7
RK
5235 gen_rtx_PLUS (Pmode,
5236 frame_pointer_rtx,
563c12b0 5237 GEN_INT (FIRST_PARM_OFFSET (0)
8ac61af7
RK
5238 + (UNITS_PER_WORD
5239 * regno)))),
254110c2 5240 gen_rtx_REG (word_mode,
8ac61af7 5241 BASE_INCOMING_ARG_REG (word_mode) + regno));
3ea1fdd3 5242
254110c2 5243 address = gen_rtx_PLUS (Pmode,
8ac61af7 5244 frame_pointer_rtx,
563c12b0 5245 GEN_INT (FIRST_PARM_OFFSET (0)
8ac61af7 5246 + UNITS_PER_WORD * first_reg));
3ea1fdd3
JW
5247
5248 return address;
5249}
a8b2c8a1
RH
5250
5251/* Implement `va_start' for varargs and stdarg. */
5252
5253void
e5faf155 5254sparc_va_start (valist, nextarg)
a8b2c8a1
RH
5255 tree valist;
5256 rtx nextarg;
5257{
5258 nextarg = expand_builtin_saveregs ();
e5faf155 5259 std_expand_builtin_va_start (valist, nextarg);
a8b2c8a1
RH
5260}
5261
5262/* Implement `va_arg'. */
5263
5264rtx
5265sparc_va_arg (valist, type)
5266 tree valist, type;
5267{
5268 HOST_WIDE_INT size, rsize, align;
da09e317 5269 tree addr, incr;
a8b2c8a1
RH
5270 rtx addr_rtx;
5271 int indirect = 0;
5272
5273 /* Round up sizeof(type) to a word. */
5274 size = int_size_in_bytes (type);
5275 rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
5276 align = 0;
5277
5278 if (TARGET_ARCH64)
5279 {
fbd039b2 5280 if (TYPE_ALIGN (type) >= 2 * (unsigned) BITS_PER_WORD)
a8b2c8a1
RH
5281 align = 2 * UNITS_PER_WORD;
5282
f34e52f7 5283 if (AGGREGATE_TYPE_P (type))
a8b2c8a1 5284 {
f36dea3c 5285 if ((unsigned HOST_WIDE_INT) size > 16)
f34e52f7
JJ
5286 {
5287 indirect = 1;
5288 size = rsize = UNITS_PER_WORD;
5289 }
014c0998
JJ
5290 /* SPARC v9 ABI states that structures up to 8 bytes in size are
5291 given one 8 byte slot. */
5292 else if (size == 0)
5293 size = rsize = UNITS_PER_WORD;
f34e52f7
JJ
5294 else
5295 size = rsize;
a8b2c8a1
RH
5296 }
5297 }
5298 else
5299 {
5300 if (AGGREGATE_TYPE_P (type)
5301 || TYPE_MODE (type) == TFmode
5302 || TYPE_MODE (type) == TCmode)
5303 {
5304 indirect = 1;
5305 size = rsize = UNITS_PER_WORD;
5306 }
a8b2c8a1
RH
5307 }
5308
5309 incr = valist;
5310 if (align)
5311 {
5312 incr = fold (build (PLUS_EXPR, ptr_type_node, incr,
5313 build_int_2 (align - 1, 0)));
5314 incr = fold (build (BIT_AND_EXPR, ptr_type_node, incr,
5315 build_int_2 (-align, -1)));
5316 }
5317
5318 addr = incr = save_expr (incr);
5319 if (BYTES_BIG_ENDIAN && size < rsize)
5320 {
5321 addr = fold (build (PLUS_EXPR, ptr_type_node, incr,
5322 build_int_2 (rsize - size, 0)));
5323 }
5324 incr = fold (build (PLUS_EXPR, ptr_type_node, incr,
5325 build_int_2 (rsize, 0)));
5326
5327 incr = build (MODIFY_EXPR, ptr_type_node, valist, incr);
5328 TREE_SIDE_EFFECTS (incr) = 1;
5329 expand_expr (incr, const0_rtx, VOIDmode, EXPAND_NORMAL);
5330
5331 addr_rtx = expand_expr (addr, NULL, Pmode, EXPAND_NORMAL);
5332
9a0662b4
GK
5333 /* If the address isn't aligned properly for the type,
5334 we may need to copy to a temporary.
5335 FIXME: This is inefficient. Usually we can do this
5336 in registers. */
5337 if (align == 0
5338 && TYPE_ALIGN (type) > BITS_PER_WORD
5339 && !indirect)
5340 {
5341 /* FIXME: We really need to specify that the temporary is live
5342 for the whole function because expand_builtin_va_arg wants
5343 the alias set to be get_varargs_alias_set (), but in this
5344 case the alias set is that for TYPE and if the memory gets
5345 reused it will be reused with alias set TYPE. */
5346 rtx tmp = assign_temp (type, 0, 1, 0);
5347 rtx dest_addr;
5348
5349 addr_rtx = force_reg (Pmode, addr_rtx);
5350 addr_rtx = gen_rtx_MEM (BLKmode, addr_rtx);
ba4828e0 5351 set_mem_alias_set (addr_rtx, get_varargs_alias_set ());
8ac61af7 5352 set_mem_align (addr_rtx, BITS_PER_WORD);
9a0662b4
GK
5353 tmp = shallow_copy_rtx (tmp);
5354 PUT_MODE (tmp, BLKmode);
ba4828e0 5355 set_mem_alias_set (tmp, 0);
9a0662b4 5356
44bb111a
RH
5357 dest_addr = emit_block_move (tmp, addr_rtx, GEN_INT (rsize),
5358 BLOCK_OP_NORMAL);
9a0662b4
GK
5359 if (dest_addr != NULL_RTX)
5360 addr_rtx = dest_addr;
5361 else
5362 addr_rtx = XCEXP (tmp, 0, MEM);
5363 }
5364
a8b2c8a1
RH
5365 if (indirect)
5366 {
5367 addr_rtx = force_reg (Pmode, addr_rtx);
5368 addr_rtx = gen_rtx_MEM (Pmode, addr_rtx);
ba4828e0 5369 set_mem_alias_set (addr_rtx, get_varargs_alias_set ());
a8b2c8a1
RH
5370 }
5371
5372 return addr_rtx;
5373}
ab835497
RK
5374\f
5375/* Return the string to output a conditional branch to LABEL, which is
c4ce6853
DE
5376 the operand number of the label. OP is the conditional expression.
5377 XEXP (OP, 0) is assumed to be a condition code register (integer or
5378 floating point) and its mode specifies what kind of comparison we made.
61a55e8b 5379
5e7a8ee0 5380 REVERSED is nonzero if we should reverse the sense of the comparison.
ab835497 5381
5e7a8ee0 5382 ANNUL is nonzero if we should generate an annulling branch.
ab835497 5383
5e7a8ee0 5384 NOOP is nonzero if we have to follow this branch by a noop.
c6b0465b
JC
5385
5386 INSN, if set, is the insn. */
ab835497
RK
5387
5388char *
0b82d204
JJ
5389output_cbranch (op, dest, label, reversed, annul, noop, insn)
5390 rtx op, dest;
ab835497
RK
5391 int label;
5392 int reversed, annul, noop;
c6b0465b 5393 rtx insn;
ab835497 5394{
0b82d204 5395 static char string[50];
ab835497 5396 enum rtx_code code = GET_CODE (op);
c4ce6853
DE
5397 rtx cc_reg = XEXP (op, 0);
5398 enum machine_mode mode = GET_MODE (cc_reg);
0b82d204
JJ
5399 const char *labelno, *branch;
5400 int spaces = 8, far;
5401 char *p;
5402
5403 /* v9 branches are limited to +-1MB. If it is too far away,
5404 change
5405
5406 bne,pt %xcc, .LC30
5407
5408 to
5409
5410 be,pn %xcc, .+12
5411 nop
5412 ba .LC30
5413
5414 and
5415
5416 fbne,a,pn %fcc2, .LC29
61a55e8b 5417
0b82d204
JJ
5418 to
5419
5420 fbe,pt %fcc2, .+16
5421 nop
5422 ba .LC29 */
5423
5424 far = get_attr_length (insn) >= 3;
5425 if (reversed ^ far)
ab835497 5426 {
e267e177
RH
5427 /* Reversal of FP compares takes care -- an ordered compare
5428 becomes an unordered compare and vice versa. */
4d449554 5429 if (mode == CCFPmode || mode == CCFPEmode)
7913f3d0 5430 code = reverse_condition_maybe_unordered (code);
ab835497 5431 else
e267e177 5432 code = reverse_condition (code);
ab835497
RK
5433 }
5434
e267e177
RH
5435 /* Start by writing the branch condition. */
5436 if (mode == CCFPmode || mode == CCFPEmode)
5850dc00
RH
5437 {
5438 switch (code)
5439 {
5440 case NE:
5441 branch = "fbne";
5442 break;
5443 case EQ:
5444 branch = "fbe";
5445 break;
5446 case GE:
5447 branch = "fbge";
5448 break;
5449 case GT:
5450 branch = "fbg";
5451 break;
5452 case LE:
5453 branch = "fble";
5454 break;
5455 case LT:
5456 branch = "fbl";
5457 break;
5458 case UNORDERED:
5459 branch = "fbu";
5460 break;
5461 case ORDERED:
5462 branch = "fbo";
5463 break;
5464 case UNGT:
5465 branch = "fbug";
5466 break;
5467 case UNLT:
5468 branch = "fbul";
5469 break;
5470 case UNEQ:
5471 branch = "fbue";
5472 break;
5473 case UNGE:
5474 branch = "fbuge";
5475 break;
5476 case UNLE:
5477 branch = "fbule";
5478 break;
5479 case LTGT:
5480 branch = "fblg";
5481 break;
5482
5483 default:
5484 abort ();
5485 }
5486
5487 /* ??? !v9: FP branches cannot be preceded by another floating point
5488 insn. Because there is currently no concept of pre-delay slots,
5489 we can fix this only by always emitting a nop before a floating
5490 point branch. */
5491
5492 string[0] = '\0';
5493 if (! TARGET_V9)
5494 strcpy (string, "nop\n\t");
5495 strcat (string, branch);
5496 }
e267e177 5497 else
5850dc00
RH
5498 {
5499 switch (code)
5500 {
5501 case NE:
5502 branch = "bne";
5503 break;
5504 case EQ:
5505 branch = "be";
5506 break;
5507 case GE:
0b82d204 5508 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
5850dc00
RH
5509 branch = "bpos";
5510 else
5511 branch = "bge";
5512 break;
5513 case GT:
5514 branch = "bg";
5515 break;
5516 case LE:
5517 branch = "ble";
5518 break;
5519 case LT:
0b82d204 5520 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
5850dc00
RH
5521 branch = "bneg";
5522 else
5523 branch = "bl";
5524 break;
5525 case GEU:
5526 branch = "bgeu";
5527 break;
5528 case GTU:
5529 branch = "bgu";
5530 break;
5531 case LEU:
5532 branch = "bleu";
5533 break;
5534 case LTU:
5535 branch = "blu";
5536 break;
5537
5538 default:
5539 abort ();
5540 }
5541 strcpy (string, branch);
5542 }
e267e177 5543 spaces -= strlen (branch);
0b82d204 5544 p = strchr (string, '\0');
e267e177 5545
ab835497 5546 /* Now add the annulling, the label, and a possible noop. */
0b82d204 5547 if (annul && ! far)
e0d80184 5548 {
0b82d204
JJ
5549 strcpy (p, ",a");
5550 p += 2;
e0d80184
DM
5551 spaces -= 2;
5552 }
ab835497 5553
61a55e8b 5554 if (! TARGET_V9)
0b82d204 5555 labelno = "";
61a55e8b
DE
5556 else
5557 {
c6b0465b 5558 rtx note;
0b82d204 5559 int v8 = 0;
c6b0465b 5560
0b82d204 5561 if (! far && insn && INSN_ADDRESSES_SET_P ())
e0d80184 5562 {
0b82d204
JJ
5563 int delta = (INSN_ADDRESSES (INSN_UID (dest))
5564 - INSN_ADDRESSES (INSN_UID (insn)));
5565 /* Leave some instructions for "slop". */
5566 if (delta < -260000 || delta >= 260000)
5567 v8 = 1;
e0d80184 5568 }
c6b0465b 5569
61a55e8b
DE
5570 if (mode == CCFPmode || mode == CCFPEmode)
5571 {
0b82d204 5572 static char v9_fcc_labelno[] = "%%fccX, ";
61a55e8b 5573 /* Set the char indicating the number of the fcc reg to use. */
0b82d204
JJ
5574 v9_fcc_labelno[5] = REGNO (cc_reg) - SPARC_FIRST_V9_FCC_REG + '0';
5575 labelno = v9_fcc_labelno;
5576 if (v8)
5577 {
5578 if (REGNO (cc_reg) == SPARC_FCC_REG)
5579 labelno = "";
5580 else
5581 abort ();
5582 }
61a55e8b
DE
5583 }
5584 else if (mode == CCXmode || mode == CCX_NOOVmode)
0b82d204
JJ
5585 {
5586 labelno = "%%xcc, ";
5587 if (v8)
5588 abort ();
5589 }
61a55e8b 5590 else
0b82d204
JJ
5591 {
5592 labelno = "%%icc, ";
5593 if (v8)
5594 labelno = "";
5595 }
5596
4f31cce8 5597 if (*labelno && insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
0b82d204
JJ
5598 {
5599 strcpy (p,
4f31cce8 5600 ((INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ^ far)
0b82d204
JJ
5601 ? ",pt" : ",pn");
5602 p += 3;
5603 spaces -= 3;
5604 }
61a55e8b 5605 }
e0d80184 5606 if (spaces > 0)
0b82d204 5607 *p++ = '\t';
e0d80184 5608 else
0b82d204
JJ
5609 *p++ = ' ';
5610 strcpy (p, labelno);
5611 p = strchr (p, '\0');
5612 if (far)
5613 {
5614 strcpy (p, ".+12\n\tnop\n\tb\t");
5615 if (annul || noop)
5616 p[3] = '6';
5617 p += 13;
5618 }
5619 *p++ = '%';
5620 *p++ = 'l';
5621 /* Set the char indicating the number of the operand containing the
5622 label_ref. */
5623 *p++ = label + '0';
5624 *p = '\0';
61a55e8b 5625 if (noop)
0b82d204 5626 strcpy (p, "\n\tnop");
61a55e8b
DE
5627
5628 return string;
5629}
5630
47ac041c
JJ
5631/* Emit a library call comparison between floating point X and Y.
5632 COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).
5633 TARGET_ARCH64 uses _Qp_* functions, which use pointers to TFmode
5634 values as arguments instead of the TFmode registers themselves,
5635 that's why we cannot call emit_float_lib_cmp. */
5636void
5637sparc_emit_float_lib_cmp (x, y, comparison)
5638 rtx x, y;
5639 enum rtx_code comparison;
5640{
e77d72cb 5641 const char *qpfunc;
5c5c34a4
JJ
5642 rtx slot0, slot1, result, tem, tem2;
5643 enum machine_mode mode;
47ac041c
JJ
5644
5645 switch (comparison)
5646 {
5647 case EQ:
5c5c34a4 5648 qpfunc = (TARGET_ARCH64) ? "_Qp_feq" : "_Q_feq";
47ac041c
JJ
5649 break;
5650
5651 case NE:
5c5c34a4 5652 qpfunc = (TARGET_ARCH64) ? "_Qp_fne" : "_Q_fne";
47ac041c
JJ
5653 break;
5654
5655 case GT:
5c5c34a4 5656 qpfunc = (TARGET_ARCH64) ? "_Qp_fgt" : "_Q_fgt";
47ac041c
JJ
5657 break;
5658
5659 case GE:
5c5c34a4 5660 qpfunc = (TARGET_ARCH64) ? "_Qp_fge" : "_Q_fge";
47ac041c
JJ
5661 break;
5662
5663 case LT:
5c5c34a4 5664 qpfunc = (TARGET_ARCH64) ? "_Qp_flt" : "_Q_flt";
47ac041c
JJ
5665 break;
5666
5667 case LE:
5c5c34a4
JJ
5668 qpfunc = (TARGET_ARCH64) ? "_Qp_fle" : "_Q_fle";
5669 break;
5670
5671 case ORDERED:
5672 case UNORDERED:
5673 case UNGT:
5674 case UNLT:
5675 case UNEQ:
5676 case UNGE:
5677 case UNLE:
5678 case LTGT:
5679 qpfunc = (TARGET_ARCH64) ? "_Qp_cmp" : "_Q_cmp";
47ac041c
JJ
5680 break;
5681
5682 default:
5683 abort();
5684 break;
5685 }
5686
5c5c34a4 5687 if (TARGET_ARCH64)
47ac041c 5688 {
5c5c34a4
JJ
5689 if (GET_CODE (x) != MEM)
5690 {
5691 slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
5692 emit_insn (gen_rtx_SET (VOIDmode, slot0, x));
5693 }
5694 else
5695 slot0 = x;
5696
5697 if (GET_CODE (y) != MEM)
5698 {
5699 slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
5700 emit_insn (gen_rtx_SET (VOIDmode, slot1, y));
5701 }
5702 else
5703 slot1 = y;
47ac041c 5704
eb29ddb6 5705 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), LCT_NORMAL,
5c5c34a4
JJ
5706 DImode, 2,
5707 XEXP (slot0, 0), Pmode,
5708 XEXP (slot1, 0), Pmode);
5709
5710 mode = DImode;
5711 }
5712 else
47ac041c 5713 {
eb29ddb6 5714 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), LCT_NORMAL,
5c5c34a4
JJ
5715 SImode, 2,
5716 x, TFmode, y, TFmode);
5717
5718 mode = SImode;
47ac041c
JJ
5719 }
5720
47ac041c
JJ
5721
5722 /* Immediately move the result of the libcall into a pseudo
5723 register so reload doesn't clobber the value if it needs
5724 the return register for a spill reg. */
5c5c34a4
JJ
5725 result = gen_reg_rtx (mode);
5726 emit_move_insn (result, hard_libcall_value (mode));
47ac041c 5727
5c5c34a4
JJ
5728 switch (comparison)
5729 {
5730 default:
3b2d1507 5731 emit_cmp_insn (result, const0_rtx, NE, NULL_RTX, mode, 0);
5c5c34a4
JJ
5732 break;
5733 case ORDERED:
5734 case UNORDERED:
3b2d1507
AT
5735 emit_cmp_insn (result, GEN_INT(3), comparison == UNORDERED ? EQ : NE,
5736 NULL_RTX, mode, 0);
5c5c34a4
JJ
5737 break;
5738 case UNGT:
5739 case UNGE:
5740 emit_cmp_insn (result, const1_rtx,
3b2d1507 5741 comparison == UNGT ? GT : NE, NULL_RTX, mode, 0);
5c5c34a4
JJ
5742 break;
5743 case UNLE:
3b2d1507 5744 emit_cmp_insn (result, const2_rtx, NE, NULL_RTX, mode, 0);
5c5c34a4
JJ
5745 break;
5746 case UNLT:
5747 tem = gen_reg_rtx (mode);
5748 if (TARGET_ARCH32)
5749 emit_insn (gen_andsi3 (tem, result, const1_rtx));
5750 else
5751 emit_insn (gen_anddi3 (tem, result, const1_rtx));
3b2d1507 5752 emit_cmp_insn (tem, const0_rtx, NE, NULL_RTX, mode, 0);
5c5c34a4
JJ
5753 break;
5754 case UNEQ:
5755 case LTGT:
5756 tem = gen_reg_rtx (mode);
5757 if (TARGET_ARCH32)
5758 emit_insn (gen_addsi3 (tem, result, const1_rtx));
5759 else
5760 emit_insn (gen_adddi3 (tem, result, const1_rtx));
5761 tem2 = gen_reg_rtx (mode);
5762 if (TARGET_ARCH32)
5763 emit_insn (gen_andsi3 (tem2, tem, const2_rtx));
5764 else
5765 emit_insn (gen_anddi3 (tem2, tem, const2_rtx));
3b2d1507
AT
5766 emit_cmp_insn (tem2, const0_rtx, comparison == UNEQ ? EQ : NE,
5767 NULL_RTX, mode, 0);
5c5c34a4
JJ
5768 break;
5769 }
47ac041c 5770}
5c5c34a4 5771
d88e57d1
RH
5772/* Generate an unsigned DImode to FP conversion. This is the same code
5773 optabs would emit if we didn't have TFmode patterns. */
5774
5775void
5776sparc_emit_floatunsdi (operands)
5777 rtx operands[2];
5778{
5779 rtx neglab, donelab, i0, i1, f0, in, out;
5780 enum machine_mode mode;
5781
5782 out = operands[0];
5783 in = force_reg (DImode, operands[1]);
5784 mode = GET_MODE (out);
5785 neglab = gen_label_rtx ();
5786 donelab = gen_label_rtx ();
5787 i0 = gen_reg_rtx (DImode);
5788 i1 = gen_reg_rtx (DImode);
5789 f0 = gen_reg_rtx (mode);
5790
5791 emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, DImode, 0, neglab);
5792
5793 emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_FLOAT (mode, in)));
5794 emit_jump_insn (gen_jump (donelab));
5795 emit_barrier ();
5796
5797 emit_label (neglab);
5798
5799 emit_insn (gen_lshrdi3 (i0, in, const1_rtx));
5800 emit_insn (gen_anddi3 (i1, in, const1_rtx));
5801 emit_insn (gen_iordi3 (i0, i0, i1));
5802 emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_FLOAT (mode, i0)));
5803 emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
5804
5805 emit_label (donelab);
5806}
5807
61a55e8b
DE
5808/* Return the string to output a conditional branch to LABEL, testing
5809 register REG. LABEL is the operand number of the label; REG is the
5810 operand number of the reg. OP is the conditional expression. The mode
5811 of REG says what kind of comparison we made.
5812
5e7a8ee0 5813 REVERSED is nonzero if we should reverse the sense of the comparison.
61a55e8b 5814
5e7a8ee0 5815 ANNUL is nonzero if we should generate an annulling branch.
61a55e8b 5816
5e7a8ee0 5817 NOOP is nonzero if we have to follow this branch by a noop. */
61a55e8b
DE
5818
5819char *
0b82d204
JJ
5820output_v9branch (op, dest, reg, label, reversed, annul, noop, insn)
5821 rtx op, dest;
61a55e8b
DE
5822 int reg, label;
5823 int reversed, annul, noop;
e0d80184 5824 rtx insn;
61a55e8b 5825{
0b82d204 5826 static char string[50];
61a55e8b
DE
5827 enum rtx_code code = GET_CODE (op);
5828 enum machine_mode mode = GET_MODE (XEXP (op, 0));
e0d80184 5829 rtx note;
0b82d204
JJ
5830 int far;
5831 char *p;
5832
5833 /* branch on register are limited to +-128KB. If it is too far away,
5834 change
5835
5836 brnz,pt %g1, .LC30
5837
5838 to
5839
5840 brz,pn %g1, .+12
5841 nop
5842 ba,pt %xcc, .LC30
5843
5844 and
5845
5846 brgez,a,pn %o1, .LC29
5847
5848 to
5849
5850 brlz,pt %o1, .+16
5851 nop
5852 ba,pt %xcc, .LC29 */
5853
5854 far = get_attr_length (insn) >= 3;
61a55e8b
DE
5855
5856 /* If not floating-point or if EQ or NE, we can just reverse the code. */
0b82d204
JJ
5857 if (reversed ^ far)
5858 code = reverse_condition (code);
61a55e8b
DE
5859
5860 /* Only 64 bit versions of these instructions exist. */
5861 if (mode != DImode)
5862 abort ();
5863
5864 /* Start by writing the branch condition. */
5865
5866 switch (code)
5867 {
5868 case NE:
5869 strcpy (string, "brnz");
5870 break;
5871
5872 case EQ:
5873 strcpy (string, "brz");
5874 break;
5875
5876 case GE:
5877 strcpy (string, "brgez");
5878 break;
5879
5880 case LT:
5881 strcpy (string, "brlz");
5882 break;
5883
5884 case LE:
5885 strcpy (string, "brlez");
5886 break;
5887
5888 case GT:
5889 strcpy (string, "brgz");
5890 break;
5891
5892 default:
5893 abort ();
5894 }
5895
0b82d204
JJ
5896 p = strchr (string, '\0');
5897
61a55e8b 5898 /* Now add the annulling, reg, label, and nop. */
0b82d204 5899 if (annul && ! far)
e0d80184 5900 {
0b82d204
JJ
5901 strcpy (p, ",a");
5902 p += 2;
e0d80184 5903 }
61a55e8b 5904
4f31cce8 5905 if (insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
e0d80184 5906 {
0b82d204 5907 strcpy (p,
4f31cce8 5908 ((INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ^ far)
0b82d204
JJ
5909 ? ",pt" : ",pn");
5910 p += 3;
e0d80184 5911 }
61a55e8b 5912
0b82d204
JJ
5913 *p = p < string + 8 ? '\t' : ' ';
5914 p++;
5915 *p++ = '%';
5916 *p++ = '0' + reg;
5917 *p++ = ',';
5918 *p++ = ' ';
5919 if (far)
5920 {
5921 int veryfar = 1, delta;
5922
5923 if (INSN_ADDRESSES_SET_P ())
5924 {
5925 delta = (INSN_ADDRESSES (INSN_UID (dest))
5926 - INSN_ADDRESSES (INSN_UID (insn)));
5927 /* Leave some instructions for "slop". */
5928 if (delta >= -260000 && delta < 260000)
5929 veryfar = 0;
5930 }
5931
5932 strcpy (p, ".+12\n\tnop\n\t");
5933 if (annul || noop)
5934 p[3] = '6';
5935 p += 11;
5936 if (veryfar)
5937 {
5938 strcpy (p, "b\t");
5939 p += 2;
5940 }
5941 else
5942 {
5943 strcpy (p, "ba,pt\t%%xcc, ");
5944 p += 13;
5945 }
5946 }
5947 *p++ = '%';
5948 *p++ = 'l';
5949 *p++ = '0' + label;
5950 *p = '\0';
ab835497
RK
5951
5952 if (noop)
0b82d204 5953 strcpy (p, "\n\tnop");
ab835497
RK
5954
5955 return string;
5956}
5957
e48addee
JJ
5958/* Return 1, if any of the registers of the instruction are %l[0-7] or %o[0-7].
5959 Such instructions cannot be used in the delay slot of return insn on v9.
5960 If TEST is 0, also rename all %i[0-7] registers to their %o[0-7] counterparts.
5961 */
284d86e9 5962
e48addee
JJ
5963static int
5964epilogue_renumber (where, test)
5965 register rtx *where;
5966 int test;
284d86e9 5967{
e48addee
JJ
5968 register const char *fmt;
5969 register int i;
5970 register enum rtx_code code;
5971
5972 if (*where == 0)
5973 return 0;
5974
5975 code = GET_CODE (*where);
284d86e9
JC
5976
5977 switch (code)
5978 {
284d86e9 5979 case REG:
e48addee
JJ
5980 if (REGNO (*where) >= 8 && REGNO (*where) < 24) /* oX or lX */
5981 return 1;
5982 if (! test && REGNO (*where) >= 24 && REGNO (*where) < 32)
5983 *where = gen_rtx (REG, GET_MODE (*where), OUTGOING_REGNO (REGNO(*where)));
5984 case SCRATCH:
5985 case CC0:
5986 case PC:
284d86e9
JC
5987 case CONST_INT:
5988 case CONST_DOUBLE:
e48addee 5989 return 0;
76a7c776 5990
09ebda1b
SC
5991 /* Do not replace the frame pointer with the stack pointer because
5992 it can cause the delayed instruction to load below the stack.
5993 This occurs when instructions like:
5994
5995 (set (reg/i:SI 24 %i0)
5996 (mem/f:SI (plus:SI (reg/f:SI 30 %fp)
5997 (const_int -20 [0xffffffec])) 0))
5998
5999 are in the return delayed slot. */
6000 case PLUS:
6001 if (GET_CODE (XEXP (*where, 0)) == REG
563c12b0 6002 && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM
09ebda1b
SC
6003 && (GET_CODE (XEXP (*where, 1)) != CONST_INT
6004 || INTVAL (XEXP (*where, 1)) < SPARC_STACK_BIAS))
6005 return 1;
6006 break;
6007
6008 case MEM:
6009 if (SPARC_STACK_BIAS
6010 && GET_CODE (XEXP (*where, 0)) == REG
563c12b0 6011 && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM)
09ebda1b
SC
6012 return 1;
6013 break;
6014
76a7c776
DM
6015 default:
6016 break;
e48addee 6017 }
284d86e9 6018
e48addee 6019 fmt = GET_RTX_FORMAT (code);
284d86e9 6020
e48addee
JJ
6021 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6022 {
6023 if (fmt[i] == 'E')
6024 {
6025 register int j;
6026 for (j = XVECLEN (*where, i) - 1; j >= 0; j--)
6027 if (epilogue_renumber (&(XVECEXP (*where, i, j)), test))
6028 return 1;
6029 }
6030 else if (fmt[i] == 'e'
6031 && epilogue_renumber (&(XEXP (*where, i)), test))
6032 return 1;
284d86e9 6033 }
e48addee 6034 return 0;
284d86e9 6035}
ab835497
RK
6036\f
6037/* Leaf functions and non-leaf functions have different needs. */
6038
8b60264b 6039static const int
ab835497
RK
6040reg_leaf_alloc_order[] = REG_LEAF_ALLOC_ORDER;
6041
8b60264b 6042static const int
ab835497
RK
6043reg_nonleaf_alloc_order[] = REG_ALLOC_ORDER;
6044
8b60264b 6045static const int *const reg_alloc_orders[] = {
ab835497
RK
6046 reg_leaf_alloc_order,
6047 reg_nonleaf_alloc_order};
6048
6049void
6050order_regs_for_local_alloc ()
6051{
6052 static int last_order_nonleaf = 1;
6053
6054 if (regs_ever_live[15] != last_order_nonleaf)
6055 {
6056 last_order_nonleaf = !last_order_nonleaf;
2e09e75a 6057 memcpy ((char *) reg_alloc_order,
8b60264b 6058 (const char *) reg_alloc_orders[last_order_nonleaf],
2e09e75a 6059 FIRST_PSEUDO_REGISTER * sizeof (int));
ab835497
RK
6060 }
6061}
6062\f
e0d80184
DM
6063/* Return 1 if REG and MEM are legitimate enough to allow the various
6064 mem<-->reg splits to be run. */
6065
6066int
e61c29e9 6067sparc_splitdi_legitimate (reg, mem)
e0d80184
DM
6068 rtx reg;
6069 rtx mem;
6070{
e0d80184
DM
6071 /* Punt if we are here by mistake. */
6072 if (! reload_completed)
9208e4b2 6073 abort ();
e0d80184
DM
6074
6075 /* We must have an offsettable memory reference. */
6076 if (! offsettable_memref_p (mem))
6077 return 0;
6078
6079 /* If we have legitimate args for ldd/std, we do not want
6080 the split to happen. */
6081 if ((REGNO (reg) % 2) == 0
6082 && mem_min_alignment (mem, 8))
6083 return 0;
6084
6085 /* Success. */
6086 return 1;
6087}
6088
e61c29e9
DM
6089/* Return 1 if x and y are some kind of REG and they refer to
6090 different hard registers. This test is guarenteed to be
6091 run after reload. */
6092
6093int
6094sparc_absnegfloat_split_legitimate (x, y)
6095 rtx x, y;
6096{
e61c29e9
DM
6097 if (GET_CODE (x) != REG)
6098 return 0;
e61c29e9
DM
6099 if (GET_CODE (y) != REG)
6100 return 0;
6101 if (REGNO (x) == REGNO (y))
6102 return 0;
6103 return 1;
6104}
6105
35016322
JW
6106/* Return 1 if REGNO (reg1) is even and REGNO (reg1) == REGNO (reg2) - 1.
6107 This makes them candidates for using ldd and std insns.
6108
bfd6bc60 6109 Note reg1 and reg2 *must* be hard registers. */
35016322
JW
6110
6111int
7c56249d 6112registers_ok_for_ldd_peep (reg1, reg2)
35016322
JW
6113 rtx reg1, reg2;
6114{
35016322
JW
6115 /* We might have been passed a SUBREG. */
6116 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
6117 return 0;
6118
35016322
JW
6119 if (REGNO (reg1) % 2 != 0)
6120 return 0;
6121
bfd6bc60
JC
6122 /* Integer ldd is deprecated in SPARC V9 */
6123 if (TARGET_V9 && REGNO (reg1) < 32)
6124 return 0;
6125
35016322 6126 return (REGNO (reg1) == REGNO (reg2) - 1);
35016322
JW
6127}
6128
2aad5d68 6129/* Return 1 if the addresses in mem1 and mem2 are suitable for use in
303f8933
DN
6130 an ldd or std insn.
6131
2aad5d68
DN
6132 This can only happen when addr1 and addr2, the addresses in mem1
6133 and mem2, are consecutive memory locations (addr1 + 4 == addr2).
303f8933
DN
6134 addr1 must also be aligned on a 64-bit boundary.
6135
6136 Also iff dependent_reg_rtx is not null it should not be used to
6137 compute the address for mem1, i.e. we cannot optimize a sequence
6138 like:
6139 ld [%o0], %o0
6140 ld [%o0 + 4], %o1
6141 to
bcdd764b 6142 ldd [%o0], %o0
0acf409f
DM
6143 nor:
6144 ld [%g3 + 4], %g3
6145 ld [%g3], %g2
6146 to
6147 ldd [%g3], %g2
6148
6149 But, note that the transformation from:
6150 ld [%g2 + 4], %g3
6151 ld [%g2], %g2
6152 to
6153 ldd [%g2], %g2
6154 is perfectly fine. Thus, the peephole2 patterns always pass us
6155 the destination register of the first load, never the second one.
6156
303f8933
DN
6157 For stores we don't have a similar problem, so dependent_reg_rtx is
6158 NULL_RTX. */
35016322
JW
6159
6160int
303f8933
DN
6161mems_ok_for_ldd_peep (mem1, mem2, dependent_reg_rtx)
6162 rtx mem1, mem2, dependent_reg_rtx;
35016322 6163{
2aad5d68 6164 rtx addr1, addr2;
0d587737
KG
6165 unsigned int reg1;
6166 int offset1;
35016322 6167
303f8933
DN
6168 /* The mems cannot be volatile. */
6169 if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
6170 return 0;
2aad5d68 6171
303f8933 6172 /* MEM1 should be aligned on a 64-bit boundary. */
2aad5d68
DN
6173 if (MEM_ALIGN (mem1) < 64)
6174 return 0;
6175
303f8933
DN
6176 addr1 = XEXP (mem1, 0);
6177 addr2 = XEXP (mem2, 0);
6178
35016322
JW
6179 /* Extract a register number and offset (if used) from the first addr. */
6180 if (GET_CODE (addr1) == PLUS)
6181 {
6182 /* If not a REG, return zero. */
6183 if (GET_CODE (XEXP (addr1, 0)) != REG)
6184 return 0;
6185 else
6186 {
6187 reg1 = REGNO (XEXP (addr1, 0));
6188 /* The offset must be constant! */
6189 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
6190 return 0;
6191 offset1 = INTVAL (XEXP (addr1, 1));
6192 }
6193 }
6194 else if (GET_CODE (addr1) != REG)
6195 return 0;
6196 else
6197 {
6198 reg1 = REGNO (addr1);
6199 /* This was a simple (mem (reg)) expression. Offset is 0. */
6200 offset1 = 0;
6201 }
6202
6203 /* Make sure the second address is a (mem (plus (reg) (const_int). */
6204 if (GET_CODE (addr2) != PLUS)
6205 return 0;
6206
6207 if (GET_CODE (XEXP (addr2, 0)) != REG
6208 || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
6209 return 0;
6210
35016322
JW
6211 if (reg1 != REGNO (XEXP (addr2, 0)))
6212 return 0;
6213
303f8933
DN
6214 if (dependent_reg_rtx != NULL_RTX && reg1 == REGNO (dependent_reg_rtx))
6215 return 0;
6216
2296cba3 6217 /* The first offset must be evenly divisible by 8 to ensure the
35016322
JW
6218 address is 64 bit aligned. */
6219 if (offset1 % 8 != 0)
6220 return 0;
6221
6222 /* The offset for the second addr must be 4 more than the first addr. */
6223 if (INTVAL (XEXP (addr2, 1)) != offset1 + 4)
6224 return 0;
6225
6226 /* All the tests passed. addr1 and addr2 are valid for ldd and std
6227 instructions. */
6228 return 1;
6229}
7c56249d
JL
6230
6231/* Return 1 if reg is a pseudo, or is the first register in
6232 a hard register pair. This makes it a candidate for use in
6233 ldd and std insns. */
6234
6235int
6236register_ok_for_ldd (reg)
6237 rtx reg;
6238{
7c56249d
JL
6239 /* We might have been passed a SUBREG. */
6240 if (GET_CODE (reg) != REG)
6241 return 0;
6242
6243 if (REGNO (reg) < FIRST_PSEUDO_REGISTER)
6244 return (REGNO (reg) % 2 == 0);
6245 else
6246 return 1;
7c56249d 6247}
ab835497 6248\f
ab835497
RK
6249/* Print operand X (an rtx) in assembler syntax to file FILE.
6250 CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
6251 For `%' followed by punctuation, CODE is the punctuation and X is null. */
6252
6253void
6254print_operand (file, x, code)
6255 FILE *file;
6256 rtx x;
6257 int code;
6258{
6259 switch (code)
6260 {
6261 case '#':
6262 /* Output a 'nop' if there's nothing for the delay slot. */
6263 if (dbr_sequence_length () == 0)
e0d80184 6264 fputs ("\n\t nop", file);
ab835497
RK
6265 return;
6266 case '*':
c6ce0969
JW
6267 /* Output an annul flag if there's nothing for the delay slot and we
6268 are optimizing. This is always used with '(' below. */
6269 /* Sun OS 4.1.1 dbx can't handle an annulled unconditional branch;
6270 this is a dbx bug. So, we only do this when optimizing. */
bfd6bc60
JC
6271 /* On UltraSPARC, a branch in a delay slot causes a pipeline flush.
6272 Always emit a nop in case the next instruction is a branch. */
6273 if (dbr_sequence_length () == 0
284d86e9 6274 && (optimize && (int)sparc_cpu < PROCESSOR_V9))
c6ce0969
JW
6275 fputs (",a", file);
6276 return;
6277 case '(':
6278 /* Output a 'nop' if there's nothing for the delay slot and we are
6279 not optimizing. This is always used with '*' above. */
bfd6bc60 6280 if (dbr_sequence_length () == 0
284d86e9 6281 && ! (optimize && (int)sparc_cpu < PROCESSOR_V9))
e0d80184 6282 fputs ("\n\t nop", file);
ab835497 6283 return;
61a55e8b 6284 case '_':
a0a301fc
DE
6285 /* Output the Embedded Medium/Anywhere code model base register. */
6286 fputs (EMBMEDANY_BASE_REG, file);
61a55e8b
DE
6287 return;
6288 case '@':
6289 /* Print out what we are using as the frame pointer. This might
6290 be %fp, or might be %sp+offset. */
6291 /* ??? What if offset is too big? Perhaps the caller knows it isn't? */
6292 fprintf (file, "%s+%d", frame_base_name, frame_base_offset);
6293 return;
ab835497
RK
6294 case 'Y':
6295 /* Adjust the operand to take into account a RESTORE operation. */
bfd6bc60
JC
6296 if (GET_CODE (x) == CONST_INT)
6297 break;
6298 else if (GET_CODE (x) != REG)
c725bd79 6299 output_operand_lossage ("invalid %%Y operand");
b3b1e8bd 6300 else if (REGNO (x) < 8)
ab835497
RK
6301 fputs (reg_names[REGNO (x)], file);
6302 else if (REGNO (x) >= 24 && REGNO (x) < 32)
6303 fputs (reg_names[REGNO (x)-16], file);
6304 else
c725bd79 6305 output_operand_lossage ("invalid %%Y operand");
ab835497 6306 return;
0f39a9aa
DE
6307 case 'L':
6308 /* Print out the low order register name of a register pair. */
6309 if (WORDS_BIG_ENDIAN)
6310 fputs (reg_names[REGNO (x)+1], file);
6311 else
6312 fputs (reg_names[REGNO (x)], file);
6313 return;
6314 case 'H':
6315 /* Print out the high order register name of a register pair. */
6316 if (WORDS_BIG_ENDIAN)
6317 fputs (reg_names[REGNO (x)], file);
6318 else
6319 fputs (reg_names[REGNO (x)+1], file);
6320 return;
ab835497 6321 case 'R':
795068a4 6322 /* Print out the second register name of a register pair or quad.
ab835497
RK
6323 I.e., R (%o0) => %o1. */
6324 fputs (reg_names[REGNO (x)+1], file);
6325 return;
795068a4
JW
6326 case 'S':
6327 /* Print out the third register name of a register quad.
6328 I.e., S (%o0) => %o2. */
6329 fputs (reg_names[REGNO (x)+2], file);
6330 return;
6331 case 'T':
6332 /* Print out the fourth register name of a register quad.
6333 I.e., T (%o0) => %o3. */
6334 fputs (reg_names[REGNO (x)+3], file);
6335 return;
304b7a23
DE
6336 case 'x':
6337 /* Print a condition code register. */
6338 if (REGNO (x) == SPARC_ICC_REG)
6339 {
6340 /* We don't handle CC[X]_NOOVmode because they're not supposed
6341 to occur here. */
6342 if (GET_MODE (x) == CCmode)
6343 fputs ("%icc", file);
6344 else if (GET_MODE (x) == CCXmode)
6345 fputs ("%xcc", file);
6346 else
6347 abort ();
6348 }
6349 else
6350 /* %fccN register */
6351 fputs (reg_names[REGNO (x)], file);
6352 return;
ab835497
RK
6353 case 'm':
6354 /* Print the operand's address only. */
6355 output_address (XEXP (x, 0));
6356 return;
6357 case 'r':
6358 /* In this case we need a register. Use %g0 if the
77a02b01 6359 operand is const0_rtx. */
76052e74
RS
6360 if (x == const0_rtx
6361 || (GET_MODE (x) != VOIDmode && x == CONST0_RTX (GET_MODE (x))))
ab835497
RK
6362 {
6363 fputs ("%g0", file);
6364 return;
6365 }
6366 else
6367 break;
6368
61a55e8b 6369 case 'A':
ab835497
RK
6370 switch (GET_CODE (x))
6371 {
6372 case IOR: fputs ("or", file); break;
6373 case AND: fputs ("and", file); break;
6374 case XOR: fputs ("xor", file); break;
c725bd79 6375 default: output_operand_lossage ("invalid %%A operand");
ab835497
RK
6376 }
6377 return;
6378
6379 case 'B':
6380 switch (GET_CODE (x))
6381 {
6382 case IOR: fputs ("orn", file); break;
6383 case AND: fputs ("andn", file); break;
6384 case XOR: fputs ("xnor", file); break;
c725bd79 6385 default: output_operand_lossage ("invalid %%B operand");
ab835497
RK
6386 }
6387 return;
6388
304b7a23
DE
6389 /* These are used by the conditional move instructions. */
6390 case 'c' :
61a55e8b 6391 case 'C':
304b7a23 6392 {
5c5c34a4
JJ
6393 enum rtx_code rc = GET_CODE (x);
6394
6395 if (code == 'c')
6396 {
6397 enum machine_mode mode = GET_MODE (XEXP (x, 0));
6398 if (mode == CCFPmode || mode == CCFPEmode)
6399 rc = reverse_condition_maybe_unordered (GET_CODE (x));
6400 else
6401 rc = reverse_condition (GET_CODE (x));
6402 }
304b7a23
DE
6403 switch (rc)
6404 {
6405 case NE: fputs ("ne", file); break;
6406 case EQ: fputs ("e", file); break;
6407 case GE: fputs ("ge", file); break;
6408 case GT: fputs ("g", file); break;
6409 case LE: fputs ("le", file); break;
6410 case LT: fputs ("l", file); break;
6411 case GEU: fputs ("geu", file); break;
6412 case GTU: fputs ("gu", file); break;
6413 case LEU: fputs ("leu", file); break;
6414 case LTU: fputs ("lu", file); break;
5c5c34a4
JJ
6415 case LTGT: fputs ("lg", file); break;
6416 case UNORDERED: fputs ("u", file); break;
6417 case ORDERED: fputs ("o", file); break;
6418 case UNLT: fputs ("ul", file); break;
6419 case UNLE: fputs ("ule", file); break;
6420 case UNGT: fputs ("ug", file); break;
6421 case UNGE: fputs ("uge", file); break;
6422 case UNEQ: fputs ("ue", file); break;
304b7a23 6423 default: output_operand_lossage (code == 'c'
c725bd79
NB
6424 ? "invalid %%c operand"
6425 : "invalid %%C operand");
304b7a23
DE
6426 }
6427 return;
6428 }
6429
6430 /* These are used by the movr instruction pattern. */
6431 case 'd':
61a55e8b 6432 case 'D':
304b7a23
DE
6433 {
6434 enum rtx_code rc = (code == 'd'
6435 ? reverse_condition (GET_CODE (x))
6436 : GET_CODE (x));
6437 switch (rc)
6438 {
6439 case NE: fputs ("ne", file); break;
6440 case EQ: fputs ("e", file); break;
6441 case GE: fputs ("gez", file); break;
6442 case LT: fputs ("lz", file); break;
6443 case LE: fputs ("lez", file); break;
6444 case GT: fputs ("gz", file); break;
6445 default: output_operand_lossage (code == 'd'
c725bd79
NB
6446 ? "invalid %%d operand"
6447 : "invalid %%D operand");
304b7a23
DE
6448 }
6449 return;
6450 }
61a55e8b 6451
ab835497
RK
6452 case 'b':
6453 {
6454 /* Print a sign-extended character. */
9e0625a3 6455 int i = trunc_int_for_mode (INTVAL (x), QImode);
ab835497
RK
6456 fprintf (file, "%d", i);
6457 return;
6458 }
6459
d2889939
RK
6460 case 'f':
6461 /* Operand must be a MEM; write its address. */
6462 if (GET_CODE (x) != MEM)
c725bd79 6463 output_operand_lossage ("invalid %%f operand");
d2889939
RK
6464 output_address (XEXP (x, 0));
6465 return;
6466
ab835497
RK
6467 case 0:
6468 /* Do nothing special. */
6469 break;
6470
6471 default:
6472 /* Undocumented flag. */
415f583e 6473 output_operand_lossage ("invalid operand output code");
ab835497
RK
6474 }
6475
6476 if (GET_CODE (x) == REG)
6477 fputs (reg_names[REGNO (x)], file);
6478 else if (GET_CODE (x) == MEM)
6479 {
6480 fputc ('[', file);
ab835497 6481 /* Poor Sun assembler doesn't understand absolute addressing. */
e6c1be7e 6482 if (CONSTANT_P (XEXP (x, 0)))
ab835497
RK
6483 fputs ("%g0+", file);
6484 output_address (XEXP (x, 0));
6485 fputc (']', file);
6486 }
6487 else if (GET_CODE (x) == HIGH)
6488 {
6489 fputs ("%hi(", file);
6490 output_addr_const (file, XEXP (x, 0));
6491 fputc (')', file);
6492 }
6493 else if (GET_CODE (x) == LO_SUM)
6494 {
6495 print_operand (file, XEXP (x, 0), 0);
e0d80184
DM
6496 if (TARGET_CM_MEDMID)
6497 fputs ("+%l44(", file);
6498 else
6499 fputs ("+%lo(", file);
ab835497
RK
6500 output_addr_const (file, XEXP (x, 1));
6501 fputc (')', file);
6502 }
e601abce
JW
6503 else if (GET_CODE (x) == CONST_DOUBLE
6504 && (GET_MODE (x) == VOIDmode
6505 || GET_MODE_CLASS (GET_MODE (x)) == MODE_INT))
ab835497
RK
6506 {
6507 if (CONST_DOUBLE_HIGH (x) == 0)
0d9484c5 6508 fprintf (file, "%u", (unsigned int) CONST_DOUBLE_LOW (x));
ab835497
RK
6509 else if (CONST_DOUBLE_HIGH (x) == -1
6510 && CONST_DOUBLE_LOW (x) < 0)
0d9484c5 6511 fprintf (file, "%d", (int) CONST_DOUBLE_LOW (x));
ab835497 6512 else
e601abce 6513 output_operand_lossage ("long long constant not a valid immediate operand");
ab835497 6514 }
e601abce
JW
6515 else if (GET_CODE (x) == CONST_DOUBLE)
6516 output_operand_lossage ("floating point constant not a valid immediate operand");
ab835497
RK
6517 else { output_addr_const (file, x); }
6518}
6519\f
301d03af
RS
6520/* Target hook for assembling integer objects. The sparc version has
6521 special handling for aligned DI-mode objects. */
ab835497 6522
301d03af
RS
6523static bool
6524sparc_assemble_integer (x, size, aligned_p)
6525 rtx x;
6526 unsigned int size;
6527 int aligned_p;
ab835497 6528{
301d03af
RS
6529 /* ??? We only output .xword's for symbols and only then in environments
6530 where the assembler can handle them. */
6531 if (aligned_p && size == 8
6532 && (GET_CODE (x) != CONST_INT && GET_CODE (x) != CONST_DOUBLE))
ab835497 6533 {
301d03af 6534 if (TARGET_V9)
61a55e8b 6535 {
301d03af
RS
6536 assemble_integer_with_op ("\t.xword\t", x);
6537 return true;
61a55e8b
DE
6538 }
6539 else
6540 {
301d03af
RS
6541 assemble_aligned_integer (4, const0_rtx);
6542 assemble_aligned_integer (4, x);
6543 return true;
61a55e8b 6544 }
ab835497 6545 }
301d03af 6546 return default_assemble_integer (x, size, aligned_p);
ab835497 6547}
210aa14a 6548\f
b0468b84
RK
6549/* Return the value of a code used in the .proc pseudo-op that says
6550 what kind of result this function returns. For non-C types, we pick
6551 the closest C type. */
6552
77a02b01
JW
6553#ifndef SHORT_TYPE_SIZE
6554#define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
6555#endif
6556
6557#ifndef INT_TYPE_SIZE
6558#define INT_TYPE_SIZE BITS_PER_WORD
6559#endif
6560
6561#ifndef LONG_TYPE_SIZE
6562#define LONG_TYPE_SIZE BITS_PER_WORD
6563#endif
6564
6565#ifndef LONG_LONG_TYPE_SIZE
6566#define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
6567#endif
6568
6569#ifndef FLOAT_TYPE_SIZE
6570#define FLOAT_TYPE_SIZE BITS_PER_WORD
6571#endif
6572
6573#ifndef DOUBLE_TYPE_SIZE
6574#define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
6575#endif
6576
6577#ifndef LONG_DOUBLE_TYPE_SIZE
6578#define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
6579#endif
210aa14a
RS
6580
6581unsigned long
6582sparc_type_code (type)
6583 register tree type;
6584{
6585 register unsigned long qualifiers = 0;
e5e809f4 6586 register unsigned shift;
210aa14a 6587
abc95ed3 6588 /* Only the first 30 bits of the qualifier are valid. We must refrain from
aee2c3c5
JW
6589 setting more, since some assemblers will give an error for this. Also,
6590 we must be careful to avoid shifts of 32 bits or more to avoid getting
6591 unpredictable results. */
6592
e5e809f4 6593 for (shift = 6; shift < 30; shift += 2, type = TREE_TYPE (type))
210aa14a
RS
6594 {
6595 switch (TREE_CODE (type))
6596 {
6597 case ERROR_MARK:
6598 return qualifiers;
6599
6600 case ARRAY_TYPE:
e5e809f4 6601 qualifiers |= (3 << shift);
210aa14a
RS
6602 break;
6603
6604 case FUNCTION_TYPE:
6605 case METHOD_TYPE:
e5e809f4 6606 qualifiers |= (2 << shift);
210aa14a
RS
6607 break;
6608
6609 case POINTER_TYPE:
6610 case REFERENCE_TYPE:
6611 case OFFSET_TYPE:
e5e809f4 6612 qualifiers |= (1 << shift);
210aa14a 6613 break;
ab835497 6614
210aa14a
RS
6615 case RECORD_TYPE:
6616 return (qualifiers | 8);
6617
6618 case UNION_TYPE:
b0468b84 6619 case QUAL_UNION_TYPE:
210aa14a
RS
6620 return (qualifiers | 9);
6621
6622 case ENUMERAL_TYPE:
6623 return (qualifiers | 10);
6624
6625 case VOID_TYPE:
6626 return (qualifiers | 16);
6627
6628 case INTEGER_TYPE:
654209e6
JW
6629 /* If this is a range type, consider it to be the underlying
6630 type. */
6631 if (TREE_TYPE (type) != 0)
e5e809f4 6632 break;
654209e6 6633
77a02b01 6634 /* Carefully distinguish all the standard types of C,
b0468b84
RK
6635 without messing up if the language is not C. We do this by
6636 testing TYPE_PRECISION and TREE_UNSIGNED. The old code used to
6637 look at both the names and the above fields, but that's redundant.
6638 Any type whose size is between two C types will be considered
6639 to be the wider of the two types. Also, we do not have a
6640 special code to use for "long long", so anything wider than
6641 long is treated the same. Note that we can't distinguish
6642 between "int" and "long" in this code if they are the same
6643 size, but that's fine, since neither can the assembler. */
6644
6645 if (TYPE_PRECISION (type) <= CHAR_TYPE_SIZE)
6646 return (qualifiers | (TREE_UNSIGNED (type) ? 12 : 2));
77a02b01 6647
b0468b84
RK
6648 else if (TYPE_PRECISION (type) <= SHORT_TYPE_SIZE)
6649 return (qualifiers | (TREE_UNSIGNED (type) ? 13 : 3));
77a02b01 6650
b0468b84 6651 else if (TYPE_PRECISION (type) <= INT_TYPE_SIZE)
77a02b01
JW
6652 return (qualifiers | (TREE_UNSIGNED (type) ? 14 : 4));
6653
b0468b84 6654 else
77a02b01
JW
6655 return (qualifiers | (TREE_UNSIGNED (type) ? 15 : 5));
6656
210aa14a 6657 case REAL_TYPE:
e5e809f4
JL
6658 /* If this is a range type, consider it to be the underlying
6659 type. */
6660 if (TREE_TYPE (type) != 0)
6661 break;
6662
77a02b01
JW
6663 /* Carefully distinguish all the standard types of C,
6664 without messing up if the language is not C. */
b0468b84 6665
77a02b01 6666 if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
210aa14a 6667 return (qualifiers | 6);
b0468b84
RK
6668
6669 else
6670 return (qualifiers | 7);
210aa14a
RS
6671
6672 case COMPLEX_TYPE: /* GNU Fortran COMPLEX type. */
13d39dbc 6673 /* ??? We need to distinguish between double and float complex types,
c82aa69a
JW
6674 but I don't know how yet because I can't reach this code from
6675 existing front-ends. */
6676 return (qualifiers | 7); /* Who knows? */
6677
210aa14a
RS
6678 case CHAR_TYPE: /* GNU Pascal CHAR type. Not used in C. */
6679 case BOOLEAN_TYPE: /* GNU Fortran BOOLEAN type. */
6680 case FILE_TYPE: /* GNU Pascal FILE type. */
26902ae0 6681 case SET_TYPE: /* GNU Pascal SET type. */
210aa14a 6682 case LANG_TYPE: /* ? */
26902ae0 6683 return qualifiers;
210aa14a
RS
6684
6685 default:
6686 abort (); /* Not a type! */
6687 }
6688 }
e5e809f4
JL
6689
6690 return qualifiers;
210aa14a 6691}
ead69aea 6692\f
61a55e8b
DE
6693/* Nested function support. */
6694
6695/* Emit RTL insns to initialize the variable parts of a trampoline.
6696 FNADDR is an RTX for the address of the function's pure code.
6697 CXT is an RTX for the static chain value for the function.
6698
6699 This takes 16 insns: 2 shifts & 2 ands (to split up addresses), 4 sethi
6700 (to load in opcodes), 4 iors (to merge address and opcodes), and 4 writes
6701 (to store insns). This is a bit excessive. Perhaps a different
6702 mechanism would be better here.
6703
849a528d 6704 Emit enough FLUSH insns to synchronize the data and instruction caches. */
61a55e8b
DE
6705
6706void
6707sparc_initialize_trampoline (tramp, fnaddr, cxt)
6708 rtx tramp, fnaddr, cxt;
6709{
c6b0465b
JC
6710 /* SPARC 32 bit trampoline:
6711
e0d80184
DM
6712 sethi %hi(fn), %g1
6713 sethi %hi(static), %g2
6714 jmp %g1+%lo(fn)
6715 or %g2, %lo(static), %g2
c6b0465b
JC
6716
6717 SETHI i,r = 00rr rrr1 00ii iiii iiii iiii iiii iiii
6718 JMPL r+i,d = 10dd ddd1 1100 0rrr rr1i iiii iiii iiii
6719 */
959eb758
DM
6720#ifdef TRANSFER_FROM_TRAMPOLINE
6721 emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
eb29ddb6 6722 LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
959eb758 6723#endif
c6b0465b 6724
35aa3c1c
RK
6725 emit_move_insn
6726 (gen_rtx_MEM (SImode, plus_constant (tramp, 0)),
6727 expand_binop (SImode, ior_optab,
6728 expand_shift (RSHIFT_EXPR, SImode, fnaddr,
6729 size_int (10), 0, 1),
6730 GEN_INT (trunc_int_for_mode (0x03000000, SImode)),
6731 NULL_RTX, 1, OPTAB_DIRECT));
6732
6733 emit_move_insn
6734 (gen_rtx_MEM (SImode, plus_constant (tramp, 4)),
6735 expand_binop (SImode, ior_optab,
6736 expand_shift (RSHIFT_EXPR, SImode, cxt,
6737 size_int (10), 0, 1),
6738 GEN_INT (trunc_int_for_mode (0x05000000, SImode)),
6739 NULL_RTX, 1, OPTAB_DIRECT));
6740
6741 emit_move_insn
6742 (gen_rtx_MEM (SImode, plus_constant (tramp, 8)),
6743 expand_binop (SImode, ior_optab,
6744 expand_and (SImode, fnaddr, GEN_INT (0x3ff), NULL_RTX),
6745 GEN_INT (trunc_int_for_mode (0x81c06000, SImode)),
6746 NULL_RTX, 1, OPTAB_DIRECT));
6747
6748 emit_move_insn
6749 (gen_rtx_MEM (SImode, plus_constant (tramp, 12)),
6750 expand_binop (SImode, ior_optab,
6751 expand_and (SImode, cxt, GEN_INT (0x3ff), NULL_RTX),
6752 GEN_INT (trunc_int_for_mode (0x8410a000, SImode)),
6753 NULL_RTX, 1, OPTAB_DIRECT));
c6b0465b 6754
c6b0465b
JC
6755 /* On UltraSPARC a flush flushes an entire cache line. The trampoline is
6756 aligned on a 16 byte boundary so one flush clears it all. */
35aa3c1c 6757 emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode, tramp))));
84643cbf
DM
6758 if (sparc_cpu != PROCESSOR_ULTRASPARC
6759 && sparc_cpu != PROCESSOR_ULTRASPARC3)
c6b0465b
JC
6760 emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode,
6761 plus_constant (tramp, 8)))));
61a55e8b
DE
6762}
6763
849a528d
RK
6764/* The 64 bit version is simpler because it makes more sense to load the
6765 values as "immediate" data out of the trampoline. It's also easier since
6766 we can read the PC without clobbering a register. */
6767
61a55e8b
DE
6768void
6769sparc64_initialize_trampoline (tramp, fnaddr, cxt)
6770 rtx tramp, fnaddr, cxt;
6771{
345a6161
DM
6772#ifdef TRANSFER_FROM_TRAMPOLINE
6773 emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
eb29ddb6 6774 LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
345a6161
DM
6775#endif
6776
c6b0465b 6777 /*
e0d80184
DM
6778 rd %pc, %g1
6779 ldx [%g1+24], %g5
6780 jmp %g5
6781 ldx [%g1+16], %g5
c6b0465b
JC
6782 +16 bytes data
6783 */
6784
6785 emit_move_insn (gen_rtx_MEM (SImode, tramp),
e3aaacf4 6786 GEN_INT (trunc_int_for_mode (0x83414000, SImode)));
c6b0465b 6787 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 4)),
e3aaacf4 6788 GEN_INT (trunc_int_for_mode (0xca586018, SImode)));
c6b0465b 6789 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 8)),
e3aaacf4 6790 GEN_INT (trunc_int_for_mode (0x81c14000, SImode)));
c6b0465b 6791 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 12)),
e3aaacf4 6792 GEN_INT (trunc_int_for_mode (0xca586010, SImode)));
c6b0465b 6793 emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, 16)), cxt);
345a6161 6794 emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, 24)), fnaddr);
d4203cb4 6795 emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, tramp))));
345a6161 6796
fae15c93
VM
6797 if (sparc_cpu != PROCESSOR_ULTRASPARC
6798 && sparc_cpu != PROCESSOR_ULTRASPARC3)
d4203cb4 6799 emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, plus_constant (tramp, 8)))));
61a55e8b
DE
6800}
6801\f
c819be5b
JW
6802/* Subroutines to support a flat (single) register window calling
6803 convention. */
6804
6805/* Single-register window sparc stack frames look like:
6806
6807 Before call After call
6808 +-----------------------+ +-----------------------+
86735b02
DE
6809 high | | | |
6810 mem | caller's temps. | | caller's temps. |
c819be5b
JW
6811 | | | |
6812 +-----------------------+ +-----------------------+
6813 | | | |
6814 | arguments on stack. | | arguments on stack. |
86735b02
DE
6815 | | | |
6816 +-----------------------+FP+92->+-----------------------+
c819be5b
JW
6817 | 6 words to save | | 6 words to save |
6818 | arguments passed | | arguments passed |
6819 | in registers, even | | in registers, even |
86735b02
DE
6820 | if not passed. | | if not passed. |
6821 SP+68->+-----------------------+FP+68->+-----------------------+
6822 | 1 word struct addr | | 1 word struct addr |
6823 +-----------------------+FP+64->+-----------------------+
6824 | | | |
6825 | 16 word reg save area | | 16 word reg save area |
6826 | | | |
6827 SP->+-----------------------+ FP->+-----------------------+
6828 | 4 word area for |
6829 | fp/alu reg moves |
6830 FP-16->+-----------------------+
6831 | |
6832 | local variables |
6833 | |
6834 +-----------------------+
6835 | |
c819be5b 6836 | fp register save |
86735b02
DE
6837 | |
6838 +-----------------------+
6839 | |
c819be5b
JW
6840 | gp register save |
6841 | |
86735b02
DE
6842 +-----------------------+
6843 | |
c819be5b 6844 | alloca allocations |
86735b02
DE
6845 | |
6846 +-----------------------+
6847 | |
c819be5b 6848 | arguments on stack |
86735b02
DE
6849 | |
6850 SP+92->+-----------------------+
c819be5b 6851 | 6 words to save |
86735b02 6852 | arguments passed |
c819be5b 6853 | in registers, even |
86735b02
DE
6854 low | if not passed. |
6855 memory SP+68->+-----------------------+
6856 | 1 word struct addr |
6857 SP+64->+-----------------------+
6858 | |
6859 I 16 word reg save area |
6860 | |
6861 SP->+-----------------------+ */
c819be5b 6862
c6aa9ce1 6863/* Structure to be filled in by sparc_flat_compute_frame_size with register
c819be5b
JW
6864 save masks, and offsets for the current function. */
6865
6866struct sparc_frame_info
6867{
6868 unsigned long total_size; /* # bytes that the entire frame takes up. */
6869 unsigned long var_size; /* # bytes that variables take up. */
6870 unsigned long args_size; /* # bytes that outgoing arguments take up. */
6871 unsigned long extra_size; /* # bytes of extra gunk. */
6872 unsigned int gp_reg_size; /* # bytes needed to store gp regs. */
6873 unsigned int fp_reg_size; /* # bytes needed to store fp regs. */
86735b02 6874 unsigned long gmask; /* Mask of saved gp registers. */
c819be5b 6875 unsigned long fmask; /* Mask of saved fp registers. */
86735b02 6876 unsigned long reg_offset; /* Offset from new sp to store regs. */
c819be5b
JW
6877 int initialized; /* Nonzero if frame size already calculated. */
6878};
6879
c6aa9ce1 6880/* Current frame information calculated by sparc_flat_compute_frame_size. */
c819be5b
JW
6881struct sparc_frame_info current_frame_info;
6882
6883/* Zero structure to initialize current_frame_info. */
6884struct sparc_frame_info zero_frame_info;
6885
6886/* Tell prologue and epilogue if register REGNO should be saved / restored. */
6887
86735b02 6888#define RETURN_ADDR_REGNUM 15
563c12b0 6889#define HARD_FRAME_POINTER_MASK (1 << (HARD_FRAME_POINTER_REGNUM))
86735b02
DE
6890#define RETURN_ADDR_MASK (1 << (RETURN_ADDR_REGNUM))
6891
c819be5b 6892#define MUST_SAVE_REGISTER(regno) \
563c12b0
RH
6893 ((regs_ever_live[regno] && !call_used_regs[regno]) \
6894 || (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed) \
86735b02 6895 || (regno == RETURN_ADDR_REGNUM && regs_ever_live[RETURN_ADDR_REGNUM]))
c819be5b
JW
6896
6897/* Return the bytes needed to compute the frame pointer from the current
6898 stack pointer. */
6899
6900unsigned long
c6aa9ce1 6901sparc_flat_compute_frame_size (size)
c819be5b
JW
6902 int size; /* # of var. bytes allocated. */
6903{
6904 int regno;
6905 unsigned long total_size; /* # bytes that the entire frame takes up. */
6906 unsigned long var_size; /* # bytes that variables take up. */
6907 unsigned long args_size; /* # bytes that outgoing arguments take up. */
6908 unsigned long extra_size; /* # extra bytes. */
6909 unsigned int gp_reg_size; /* # bytes needed to store gp regs. */
6910 unsigned int fp_reg_size; /* # bytes needed to store fp regs. */
86735b02 6911 unsigned long gmask; /* Mask of saved gp registers. */
c819be5b 6912 unsigned long fmask; /* Mask of saved fp registers. */
86735b02
DE
6913 unsigned long reg_offset; /* Offset to register save area. */
6914 int need_aligned_p; /* 1 if need the save area 8 byte aligned. */
c819be5b
JW
6915
6916 /* This is the size of the 16 word reg save area, 1 word struct addr
6917 area, and 4 word fp/alu register copy area. */
8c64be75
SC
6918 extra_size = -STARTING_FRAME_OFFSET + FIRST_PARM_OFFSET(0);
6919 var_size = size;
6920 gp_reg_size = 0;
6921 fp_reg_size = 0;
6922 gmask = 0;
6923 fmask = 0;
6924 reg_offset = 0;
86735b02 6925 need_aligned_p = 0;
c819be5b 6926
8c64be75
SC
6927 args_size = 0;
6928 if (!leaf_function_p ())
6929 {
6930 /* Also include the size needed for the 6 parameter registers. */
6931 args_size = current_function_outgoing_args_size + 24;
6932 }
6933 total_size = var_size + args_size;
6934
c819be5b
JW
6935 /* Calculate space needed for gp registers. */
6936 for (regno = 1; regno <= 31; regno++)
6937 {
6938 if (MUST_SAVE_REGISTER (regno))
6939 {
86735b02
DE
6940 /* If we need to save two regs in a row, ensure there's room to bump
6941 up the address to align it to a doubleword boundary. */
c819be5b
JW
6942 if ((regno & 0x1) == 0 && MUST_SAVE_REGISTER (regno+1))
6943 {
6944 if (gp_reg_size % 8 != 0)
86735b02 6945 gp_reg_size += 4;
c819be5b 6946 gp_reg_size += 2 * UNITS_PER_WORD;
86735b02 6947 gmask |= 3 << regno;
c819be5b 6948 regno++;
86735b02 6949 need_aligned_p = 1;
c819be5b
JW
6950 }
6951 else
6952 {
6953 gp_reg_size += UNITS_PER_WORD;
86735b02 6954 gmask |= 1 << regno;
c819be5b
JW
6955 }
6956 }
6957 }
c819be5b
JW
6958
6959 /* Calculate space needed for fp registers. */
6960 for (regno = 32; regno <= 63; regno++)
6961 {
6962 if (regs_ever_live[regno] && !call_used_regs[regno])
6963 {
6964 fp_reg_size += UNITS_PER_WORD;
6965 fmask |= 1 << (regno - 32);
6966 }
6967 }
6968
86735b02
DE
6969 if (gmask || fmask)
6970 {
6971 int n;
6972 reg_offset = FIRST_PARM_OFFSET(0) + args_size;
6973 /* Ensure save area is 8 byte aligned if we need it. */
6974 n = reg_offset % 8;
6975 if (need_aligned_p && n != 0)
6976 {
6977 total_size += 8 - n;
6978 reg_offset += 8 - n;
6979 }
6980 total_size += gp_reg_size + fp_reg_size;
6981 }
c819be5b 6982
8c64be75
SC
6983 /* If we must allocate a stack frame at all, we must also allocate
6984 room for register window spillage, so as to be binary compatible
6985 with libraries and operating systems that do not use -mflat. */
6986 if (total_size > 0)
6987 total_size += extra_size;
6988 else
6989 extra_size = 0;
c819be5b
JW
6990
6991 total_size = SPARC_STACK_ALIGN (total_size);
6992
6993 /* Save other computed information. */
6994 current_frame_info.total_size = total_size;
6995 current_frame_info.var_size = var_size;
6996 current_frame_info.args_size = args_size;
6997 current_frame_info.extra_size = extra_size;
6998 current_frame_info.gp_reg_size = gp_reg_size;
6999 current_frame_info.fp_reg_size = fp_reg_size;
86735b02 7000 current_frame_info.gmask = gmask;
c819be5b 7001 current_frame_info.fmask = fmask;
86735b02 7002 current_frame_info.reg_offset = reg_offset;
c819be5b
JW
7003 current_frame_info.initialized = reload_completed;
7004
c819be5b
JW
7005 /* Ok, we're done. */
7006 return total_size;
7007}
7008\f
86735b02
DE
7009/* Save/restore registers in GMASK and FMASK at register BASE_REG plus offset
7010 OFFSET.
7011
7012 BASE_REG must be 8 byte aligned. This allows us to test OFFSET for
7013 appropriate alignment and use DOUBLEWORD_OP when we can. We assume
7014 [BASE_REG+OFFSET] will always be a valid address.
7015
7016 WORD_OP is either "st" for save, "ld" for restore.
7017 DOUBLEWORD_OP is either "std" for save, "ldd" for restore. */
c819be5b
JW
7018
7019void
96987e96
DE
7020sparc_flat_save_restore (file, base_reg, offset, gmask, fmask, word_op,
7021 doubleword_op, base_offset)
86735b02 7022 FILE *file;
b1474bb7 7023 const char *base_reg;
86735b02
DE
7024 unsigned int offset;
7025 unsigned long gmask;
7026 unsigned long fmask;
b1474bb7
KG
7027 const char *word_op;
7028 const char *doubleword_op;
c53aa195 7029 unsigned long base_offset;
c819be5b
JW
7030{
7031 int regno;
c819be5b 7032
86735b02
DE
7033 if (gmask == 0 && fmask == 0)
7034 return;
c819be5b 7035
86735b02
DE
7036 /* Save registers starting from high to low. We've already saved the
7037 previous frame pointer and previous return address for the debugger's
7038 sake. The debugger allows us to not need a nop in the epilog if at least
7039 one register is reloaded in addition to return address. */
c819be5b 7040
86735b02 7041 if (gmask)
c819be5b
JW
7042 {
7043 for (regno = 1; regno <= 31; regno++)
7044 {
86735b02 7045 if ((gmask & (1L << regno)) != 0)
c819be5b 7046 {
86735b02 7047 if ((regno & 0x1) == 0 && ((gmask & (1L << (regno+1))) != 0))
c819be5b 7048 {
86735b02
DE
7049 /* We can save two registers in a row. If we're not at a
7050 double word boundary, move to one.
7051 sparc_flat_compute_frame_size ensures there's room to do
7052 this. */
7053 if (offset % 8 != 0)
7054 offset += UNITS_PER_WORD;
7055
c819be5b 7056 if (word_op[0] == 's')
c53aa195 7057 {
e0d80184 7058 fprintf (file, "\t%s\t%s, [%s+%d]\n",
c53aa195
JM
7059 doubleword_op, reg_names[regno],
7060 base_reg, offset);
0021b564 7061 if (dwarf2out_do_frame ())
c53aa195 7062 {
96987e96 7063 char *l = dwarf2out_cfi_label ();
c53aa195
JM
7064 dwarf2out_reg_save (l, regno, offset + base_offset);
7065 dwarf2out_reg_save
7066 (l, regno+1, offset+base_offset + UNITS_PER_WORD);
7067 }
c53aa195 7068 }
c819be5b 7069 else
e0d80184 7070 fprintf (file, "\t%s\t[%s+%d], %s\n",
86735b02 7071 doubleword_op, base_reg, offset,
c819be5b
JW
7072 reg_names[regno]);
7073
86735b02 7074 offset += 2 * UNITS_PER_WORD;
c819be5b
JW
7075 regno++;
7076 }
7077 else
7078 {
7079 if (word_op[0] == 's')
c53aa195 7080 {
e0d80184 7081 fprintf (file, "\t%s\t%s, [%s+%d]\n",
c53aa195
JM
7082 word_op, reg_names[regno],
7083 base_reg, offset);
0021b564 7084 if (dwarf2out_do_frame ())
c53aa195 7085 dwarf2out_reg_save ("", regno, offset + base_offset);
c53aa195 7086 }
c819be5b 7087 else
e0d80184 7088 fprintf (file, "\t%s\t[%s+%d], %s\n",
86735b02 7089 word_op, base_reg, offset, reg_names[regno]);
c819be5b 7090
86735b02 7091 offset += UNITS_PER_WORD;
c819be5b
JW
7092 }
7093 }
7094 }
7095 }
7096
7097 if (fmask)
7098 {
7099 for (regno = 32; regno <= 63; regno++)
7100 {
7101 if ((fmask & (1L << (regno - 32))) != 0)
7102 {
7103 if (word_op[0] == 's')
c53aa195 7104 {
e0d80184 7105 fprintf (file, "\t%s\t%s, [%s+%d]\n",
c53aa195
JM
7106 word_op, reg_names[regno],
7107 base_reg, offset);
0021b564 7108 if (dwarf2out_do_frame ())
c53aa195 7109 dwarf2out_reg_save ("", regno, offset + base_offset);
c53aa195 7110 }
c819be5b 7111 else
e0d80184 7112 fprintf (file, "\t%s\t[%s+%d], %s\n",
86735b02 7113 word_op, base_reg, offset, reg_names[regno]);
c819be5b 7114
86735b02 7115 offset += UNITS_PER_WORD;
c819be5b
JW
7116 }
7117 }
7118 }
7119}
7120\f
7121/* Set up the stack and frame (if desired) for the function. */
7122
08c148a8
NB
7123static void
7124sparc_flat_function_prologue (file, size)
c819be5b 7125 FILE *file;
08c148a8 7126 HOST_WIDE_INT size;
c819be5b 7127{
99f44eba 7128 const char *sp_str = reg_names[STACK_POINTER_REGNUM];
86735b02 7129 unsigned long gmask = current_frame_info.gmask;
a07c1915 7130
1cb36a98
RH
7131 sparc_output_scratch_registers (file);
7132
c6aa9ce1 7133 /* This is only for the human reader. */
bf62bbf1 7134 fprintf (file, "\t%s#PROLOGUE# 0\n", ASM_COMMENT_START);
5e9defae 7135 fprintf (file, "\t%s# vars= %ld, regs= %d/%d, args= %d, extra= %ld\n",
bf62bbf1 7136 ASM_COMMENT_START,
86735b02
DE
7137 current_frame_info.var_size,
7138 current_frame_info.gp_reg_size / 4,
9f8b85b8 7139 current_frame_info.fp_reg_size / 4,
86735b02
DE
7140 current_function_outgoing_args_size,
7141 current_frame_info.extra_size);
c819be5b
JW
7142
7143 size = SPARC_STACK_ALIGN (size);
86735b02
DE
7144 size = (! current_frame_info.initialized
7145 ? sparc_flat_compute_frame_size (size)
7146 : current_frame_info.total_size);
c819be5b 7147
86735b02
DE
7148 /* These cases shouldn't happen. Catch them now. */
7149 if (size == 0 && (gmask || current_frame_info.fmask))
7150 abort ();
c819be5b 7151
86735b02
DE
7152 /* Allocate our stack frame by decrementing %sp.
7153 At present, the only algorithm gdb can use to determine if this is a
7154 flat frame is if we always set %i7 if we set %sp. This can be optimized
7155 in the future by putting in some sort of debugging information that says
7156 this is a `flat' function. However, there is still the case of debugging
7157 code without such debugging information (including cases where most fns
7158 have such info, but there is one that doesn't). So, always do this now
7159 so we don't get a lot of code out there that gdb can't handle.
7160 If the frame pointer isn't needn't then that's ok - gdb won't be able to
7161 distinguish us from a non-flat function but there won't (and shouldn't)
7162 be any differences anyway. The return pc is saved (if necessary) right
7163 after %i7 so gdb won't have to look too far to find it. */
7164 if (size > 0)
c819be5b 7165 {
86735b02 7166 unsigned int reg_offset = current_frame_info.reg_offset;
563c12b0 7167 const char *const fp_str = reg_names[HARD_FRAME_POINTER_REGNUM];
83182544 7168 static const char *const t1_str = "%g1";
86735b02
DE
7169
7170 /* Things get a little tricky if local variables take up more than ~4096
7171 bytes and outgoing arguments take up more than ~4096 bytes. When that
7172 happens, the register save area can't be accessed from either end of
7173 the frame. Handle this by decrementing %sp to the start of the gp
7174 register save area, save the regs, update %i7, and then set %sp to its
7175 final value. Given that we only have one scratch register to play
7176 with it is the cheapest solution, and it helps gdb out as it won't
7177 slow down recognition of flat functions.
7178 Don't change the order of insns emitted here without checking with
7179 the gdb folk first. */
7180
ddd5a7c1 7181 /* Is the entire register save area offsettable from %sp? */
fbd039b2 7182 if (reg_offset < 4096 - 64 * (unsigned) UNITS_PER_WORD)
86735b02
DE
7183 {
7184 if (size <= 4096)
7185 {
e0d80184 7186 fprintf (file, "\tadd\t%s, %d, %s\n",
0d587737 7187 sp_str, (int) -size, sp_str);
563c12b0 7188 if (gmask & HARD_FRAME_POINTER_MASK)
86735b02 7189 {
e0d80184 7190 fprintf (file, "\tst\t%s, [%s+%d]\n",
86735b02 7191 fp_str, sp_str, reg_offset);
e0d80184 7192 fprintf (file, "\tsub\t%s, %d, %s\t%s# set up frame pointer\n",
0d587737 7193 sp_str, (int) -size, fp_str, ASM_COMMENT_START);
86735b02
DE
7194 reg_offset += 4;
7195 }
7196 }
7197 else
7198 {
0d587737
KG
7199 fprintf (file, "\tset\t");
7200 fprintf (file, HOST_WIDE_INT_PRINT_DEC, size);
7201 fprintf (file, ", %s\n\tsub\t%s, %s, %s\n",
7202 t1_str, sp_str, t1_str, sp_str);
563c12b0 7203 if (gmask & HARD_FRAME_POINTER_MASK)
86735b02 7204 {
e0d80184 7205 fprintf (file, "\tst\t%s, [%s+%d]\n",
86735b02 7206 fp_str, sp_str, reg_offset);
e0d80184 7207 fprintf (file, "\tadd\t%s, %s, %s\t%s# set up frame pointer\n",
bf62bbf1 7208 sp_str, t1_str, fp_str, ASM_COMMENT_START);
86735b02
DE
7209 reg_offset += 4;
7210 }
7211 }
0021b564 7212 if (dwarf2out_do_frame ())
c53aa195 7213 {
96987e96 7214 char *l = dwarf2out_cfi_label ();
563c12b0 7215 if (gmask & HARD_FRAME_POINTER_MASK)
c53aa195 7216 {
563c12b0 7217 dwarf2out_reg_save (l, HARD_FRAME_POINTER_REGNUM,
c53aa195 7218 reg_offset - 4 - size);
563c12b0 7219 dwarf2out_def_cfa (l, HARD_FRAME_POINTER_REGNUM, 0);
c53aa195
JM
7220 }
7221 else
7222 dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, size);
7223 }
86735b02
DE
7224 if (gmask & RETURN_ADDR_MASK)
7225 {
e0d80184 7226 fprintf (file, "\tst\t%s, [%s+%d]\n",
86735b02 7227 reg_names[RETURN_ADDR_REGNUM], sp_str, reg_offset);
0021b564 7228 if (dwarf2out_do_frame ())
c53aa195 7229 dwarf2out_return_save ("", reg_offset - size);
86735b02
DE
7230 reg_offset += 4;
7231 }
7232 sparc_flat_save_restore (file, sp_str, reg_offset,
563c12b0 7233 gmask & ~(HARD_FRAME_POINTER_MASK | RETURN_ADDR_MASK),
86735b02 7234 current_frame_info.fmask,
84e884e9 7235 "st", "std", -size);
86735b02 7236 }
c819be5b 7237 else
86735b02
DE
7238 {
7239 /* Subtract %sp in two steps, but make sure there is always a
7240 64 byte register save area, and %sp is properly aligned. */
7241 /* Amount to decrement %sp by, the first time. */
08c148a8 7242 unsigned HOST_WIDE_INT size1 = ((size - reg_offset + 64) + 15) & -16;
86735b02 7243 /* Offset to register save area from %sp. */
08c148a8 7244 unsigned HOST_WIDE_INT offset = size1 - (size - reg_offset);
86735b02
DE
7245
7246 if (size1 <= 4096)
7247 {
e0d80184 7248 fprintf (file, "\tadd\t%s, %d, %s\n",
0d587737 7249 sp_str, (int) -size1, sp_str);
563c12b0 7250 if (gmask & HARD_FRAME_POINTER_MASK)
86735b02 7251 {
e0d80184 7252 fprintf (file, "\tst\t%s, [%s+%d]\n\tsub\t%s, %d, %s\t%s# set up frame pointer\n",
0d587737
KG
7253 fp_str, sp_str, (int) offset, sp_str, (int) -size1,
7254 fp_str, ASM_COMMENT_START);
86735b02
DE
7255 offset += 4;
7256 }
7257 }
7258 else
7259 {
0d587737
KG
7260 fprintf (file, "\tset\t");
7261 fprintf (file, HOST_WIDE_INT_PRINT_DEC, size1);
7262 fprintf (file, ", %s\n\tsub\t%s, %s, %s\n",
7263 t1_str, sp_str, t1_str, sp_str);
563c12b0 7264 if (gmask & HARD_FRAME_POINTER_MASK)
86735b02 7265 {
e0d80184 7266 fprintf (file, "\tst\t%s, [%s+%d]\n\tadd\t%s, %s, %s\t%s# set up frame pointer\n",
0d587737
KG
7267 fp_str, sp_str, (int) offset, sp_str, t1_str,
7268 fp_str, ASM_COMMENT_START);
86735b02
DE
7269 offset += 4;
7270 }
7271 }
0021b564 7272 if (dwarf2out_do_frame ())
c53aa195 7273 {
96987e96 7274 char *l = dwarf2out_cfi_label ();
563c12b0 7275 if (gmask & HARD_FRAME_POINTER_MASK)
c53aa195 7276 {
563c12b0 7277 dwarf2out_reg_save (l, HARD_FRAME_POINTER_REGNUM,
c53aa195 7278 offset - 4 - size1);
563c12b0 7279 dwarf2out_def_cfa (l, HARD_FRAME_POINTER_REGNUM, 0);
c53aa195
JM
7280 }
7281 else
7282 dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, size1);
7283 }
86735b02
DE
7284 if (gmask & RETURN_ADDR_MASK)
7285 {
e0d80184 7286 fprintf (file, "\tst\t%s, [%s+%d]\n",
0d587737 7287 reg_names[RETURN_ADDR_REGNUM], sp_str, (int) offset);
0021b564 7288 if (dwarf2out_do_frame ())
c53aa195
JM
7289 /* offset - size1 == reg_offset - size
7290 if reg_offset were updated above like offset. */
7291 dwarf2out_return_save ("", offset - size1);
86735b02
DE
7292 offset += 4;
7293 }
7294 sparc_flat_save_restore (file, sp_str, offset,
563c12b0 7295 gmask & ~(HARD_FRAME_POINTER_MASK | RETURN_ADDR_MASK),
86735b02 7296 current_frame_info.fmask,
84e884e9 7297 "st", "std", -size1);
0d587737
KG
7298 fprintf (file, "\tset\t");
7299 fprintf (file, HOST_WIDE_INT_PRINT_DEC, size - size1);
7300 fprintf (file, ", %s\n\tsub\t%s, %s, %s\n",
7301 t1_str, sp_str, t1_str, sp_str);
0021b564 7302 if (dwarf2out_do_frame ())
563c12b0 7303 if (! (gmask & HARD_FRAME_POINTER_MASK))
c53aa195 7304 dwarf2out_def_cfa ("", STACK_POINTER_REGNUM, size);
86735b02 7305 }
c819be5b 7306 }
c6aa9ce1 7307
bf62bbf1 7308 fprintf (file, "\t%s#PROLOGUE# 1\n", ASM_COMMENT_START);
c819be5b
JW
7309}
7310\f
7311/* Do any necessary cleanup after a function to restore stack, frame,
80ffc95e 7312 and regs. */
c819be5b 7313
08c148a8
NB
7314static void
7315sparc_flat_function_epilogue (file, size)
c819be5b 7316 FILE *file;
08c148a8 7317 HOST_WIDE_INT size;
c819be5b 7318{
c819be5b
JW
7319 rtx epilogue_delay = current_function_epilogue_delay_list;
7320 int noepilogue = FALSE;
c819be5b 7321
c6aa9ce1 7322 /* This is only for the human reader. */
bf62bbf1 7323 fprintf (file, "\t%s#EPILOGUE#\n", ASM_COMMENT_START);
c6aa9ce1 7324
c819be5b
JW
7325 /* The epilogue does not depend on any registers, but the stack
7326 registers, so we assume that if we have 1 pending nop, it can be
7327 ignored, and 2 it must be filled (2 nops occur for integer
7328 multiply and divide). */
7329
7330 size = SPARC_STACK_ALIGN (size);
86735b02 7331 size = (!current_frame_info.initialized
c6aa9ce1 7332 ? sparc_flat_compute_frame_size (size)
c819be5b
JW
7333 : current_frame_info.total_size);
7334
86735b02 7335 if (size == 0 && epilogue_delay == 0)
c819be5b
JW
7336 {
7337 rtx insn = get_last_insn ();
7338
7339 /* If the last insn was a BARRIER, we don't have to write any code
7340 because a jump (aka return) was put there. */
7341 if (GET_CODE (insn) == NOTE)
7342 insn = prev_nonnote_insn (insn);
7343 if (insn && GET_CODE (insn) == BARRIER)
7344 noepilogue = TRUE;
7345 }
7346
7347 if (!noepilogue)
7348 {
08c148a8
NB
7349 unsigned HOST_WIDE_INT reg_offset = current_frame_info.reg_offset;
7350 unsigned HOST_WIDE_INT size1;
27c38fbe 7351 const char *const sp_str = reg_names[STACK_POINTER_REGNUM];
563c12b0 7352 const char *const fp_str = reg_names[HARD_FRAME_POINTER_REGNUM];
83182544 7353 static const char *const t1_str = "%g1";
86735b02 7354
c819be5b
JW
7355 /* In the reload sequence, we don't need to fill the load delay
7356 slots for most of the loads, also see if we can fill the final
7357 delay slot if not otherwise filled by the reload sequence. */
7358
86735b02 7359 if (size > 4095)
0d587737
KG
7360 {
7361 fprintf (file, "\tset\t");
7362 fprintf (file, HOST_WIDE_INT_PRINT_DEC, size);
7363 fprintf (file, ", %s\n", t1_str);
7364 }
c819be5b
JW
7365
7366 if (frame_pointer_needed)
7367 {
86735b02 7368 if (size > 4095)
e0d80184 7369 fprintf (file,"\tsub\t%s, %s, %s\t\t%s# sp not trusted here\n",
bf62bbf1 7370 fp_str, t1_str, sp_str, ASM_COMMENT_START);
c819be5b 7371 else
e0d80184 7372 fprintf (file,"\tsub\t%s, %d, %s\t\t%s# sp not trusted here\n",
0d587737 7373 fp_str, (int) size, sp_str, ASM_COMMENT_START);
c819be5b
JW
7374 }
7375
ddd5a7c1 7376 /* Is the entire register save area offsettable from %sp? */
fbd039b2 7377 if (reg_offset < 4096 - 64 * (unsigned) UNITS_PER_WORD)
86735b02
DE
7378 {
7379 size1 = 0;
7380 }
7381 else
7382 {
7383 /* Restore %sp in two steps, but make sure there is always a
7384 64 byte register save area, and %sp is properly aligned. */
7385 /* Amount to increment %sp by, the first time. */
7386 size1 = ((reg_offset - 64 - 16) + 15) & -16;
7387 /* Offset to register save area from %sp. */
7388 reg_offset = size1 - reg_offset;
7389
0d587737
KG
7390 fprintf (file, "\tset\t");
7391 fprintf (file, HOST_WIDE_INT_PRINT_DEC, size1);
7392 fprintf (file, ", %s\n\tadd\t%s, %s, %s\n",
7393 t1_str, sp_str, t1_str, sp_str);
86735b02
DE
7394 }
7395
7396 /* We must restore the frame pointer and return address reg first
7397 because they are treated specially by the prologue output code. */
563c12b0 7398 if (current_frame_info.gmask & HARD_FRAME_POINTER_MASK)
86735b02 7399 {
e0d80184 7400 fprintf (file, "\tld\t[%s+%d], %s\n",
0d587737 7401 sp_str, (int) reg_offset, fp_str);
86735b02
DE
7402 reg_offset += 4;
7403 }
7404 if (current_frame_info.gmask & RETURN_ADDR_MASK)
7405 {
e0d80184 7406 fprintf (file, "\tld\t[%s+%d], %s\n",
0d587737 7407 sp_str, (int) reg_offset, reg_names[RETURN_ADDR_REGNUM]);
86735b02
DE
7408 reg_offset += 4;
7409 }
7410
7411 /* Restore any remaining saved registers. */
7412 sparc_flat_save_restore (file, sp_str, reg_offset,
563c12b0 7413 current_frame_info.gmask & ~(HARD_FRAME_POINTER_MASK | RETURN_ADDR_MASK),
86735b02 7414 current_frame_info.fmask,
c53aa195 7415 "ld", "ldd", 0);
86735b02
DE
7416
7417 /* If we had to increment %sp in two steps, record it so the second
7418 restoration in the epilogue finishes up. */
7419 if (size1 > 0)
7420 {
7421 size -= size1;
7422 if (size > 4095)
0d587737
KG
7423 {
7424 fprintf (file, "\tset\t");
7425 fprintf (file, HOST_WIDE_INT_PRINT_DEC, size);
7426 fprintf (file, ", %s\n", t1_str);
7427 }
86735b02 7428 }
c819be5b 7429
c819be5b 7430 if (current_function_returns_struct)
e0d80184 7431 fprintf (file, "\tjmp\t%%o7+12\n");
c819be5b
JW
7432 else
7433 fprintf (file, "\tretl\n");
7434
7435 /* If the only register saved is the return address, we need a
7436 nop, unless we have an instruction to put into it. Otherwise
7437 we don't since reloading multiple registers doesn't reference
7438 the register being loaded. */
7439
7440 if (epilogue_delay)
7441 {
86735b02 7442 if (size)
c819be5b
JW
7443 abort ();
7444 final_scan_insn (XEXP (epilogue_delay, 0), file, 1, -2, 1);
7445 }
7446
86735b02 7447 else if (size > 4095)
e0d80184 7448 fprintf (file, "\tadd\t%s, %s, %s\n", sp_str, t1_str, sp_str);
c819be5b 7449
86735b02 7450 else if (size > 0)
0d587737 7451 fprintf (file, "\tadd\t%s, %d, %s\n", sp_str, (int) size, sp_str);
c819be5b
JW
7452
7453 else
7454 fprintf (file, "\tnop\n");
7455 }
7456
7457 /* Reset state info for each function. */
7458 current_frame_info = zero_frame_info;
e0d80184
DM
7459
7460 sparc_output_deferred_case_vectors ();
c819be5b
JW
7461}
7462\f
7463/* Define the number of delay slots needed for the function epilogue.
7464
7465 On the sparc, we need a slot if either no stack has been allocated,
7466 or the only register saved is the return register. */
7467
7468int
c6aa9ce1 7469sparc_flat_epilogue_delay_slots ()
c819be5b
JW
7470{
7471 if (!current_frame_info.initialized)
c6aa9ce1 7472 (void) sparc_flat_compute_frame_size (get_frame_size ());
c819be5b
JW
7473
7474 if (current_frame_info.total_size == 0)
7475 return 1;
7476
c819be5b
JW
7477 return 0;
7478}
7479
51f26c45 7480/* Return true if TRIAL is a valid insn for the epilogue delay slot.
c819be5b
JW
7481 Any single length instruction which doesn't reference the stack or frame
7482 pointer is OK. */
7483
7484int
c6aa9ce1 7485sparc_flat_eligible_for_epilogue_delay (trial, slot)
c819be5b 7486 rtx trial;
db3d4438 7487 int slot ATTRIBUTE_UNUSED;
c819be5b 7488{
c4ce6853
DE
7489 rtx pat = PATTERN (trial);
7490
7491 if (get_attr_length (trial) != 1)
7492 return 0;
7493
c4ce6853
DE
7494 if (! reg_mentioned_p (stack_pointer_rtx, pat)
7495 && ! reg_mentioned_p (frame_pointer_rtx, pat))
c819be5b 7496 return 1;
c4ce6853 7497
c819be5b
JW
7498 return 0;
7499}
dbb54862
JW
7500\f
7501/* Adjust the cost of a scheduling dependency. Return the new cost of
7502 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
7503
8947065c 7504static int
dbb54862
JW
7505supersparc_adjust_cost (insn, link, dep_insn, cost)
7506 rtx insn;
7507 rtx link;
7508 rtx dep_insn;
7509 int cost;
7510{
7511 enum attr_type insn_type;
7512
7513 if (! recog_memoized (insn))
7514 return 0;
7515
7516 insn_type = get_attr_type (insn);
7517
7518 if (REG_NOTE_KIND (link) == 0)
7519 {
7520 /* Data dependency; DEP_INSN writes a register that INSN reads some
7521 cycles later. */
7522
7523 /* if a load, then the dependence must be on the memory address;
3bc8b61e
DM
7524 add an extra "cycle". Note that the cost could be two cycles
7525 if the reg was written late in an instruction group; we ca not tell
dbb54862
JW
7526 here. */
7527 if (insn_type == TYPE_LOAD || insn_type == TYPE_FPLOAD)
7528 return cost + 3;
7529
7530 /* Get the delay only if the address of the store is the dependence. */
7531 if (insn_type == TYPE_STORE || insn_type == TYPE_FPSTORE)
7532 {
7533 rtx pat = PATTERN(insn);
7534 rtx dep_pat = PATTERN (dep_insn);
7535
7536 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
3bc8b61e 7537 return cost; /* This should not happen! */
dbb54862
JW
7538
7539 /* The dependency between the two instructions was on the data that
7540 is being stored. Assume that this implies that the address of the
7541 store is not dependent. */
7542 if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
7543 return cost;
7544
7545 return cost + 3; /* An approximation. */
7546 }
7547
7548 /* A shift instruction cannot receive its data from an instruction
7549 in the same cycle; add a one cycle penalty. */
7550 if (insn_type == TYPE_SHIFT)
7551 return cost + 3; /* Split before cascade into shift. */
7552 }
7553 else
7554 {
7555 /* Anti- or output- dependency; DEP_INSN reads/writes a register that
7556 INSN writes some cycles later. */
7557
7558 /* These are only significant for the fpu unit; writing a fp reg before
7559 the fpu has finished with it stalls the processor. */
7560
7561 /* Reusing an integer register causes no problems. */
7562 if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
7563 return 0;
7564 }
7565
7566 return cost;
7567}
bfd6bc60 7568
8947065c
RH
7569static int
7570hypersparc_adjust_cost (insn, link, dep_insn, cost)
7571 rtx insn;
7572 rtx link;
7573 rtx dep_insn;
7574 int cost;
7575{
7576 enum attr_type insn_type, dep_type;
7577 rtx pat = PATTERN(insn);
7578 rtx dep_pat = PATTERN (dep_insn);
7579
7580 if (recog_memoized (insn) < 0 || recog_memoized (dep_insn) < 0)
7581 return cost;
7582
7583 insn_type = get_attr_type (insn);
7584 dep_type = get_attr_type (dep_insn);
7585
7586 switch (REG_NOTE_KIND (link))
7587 {
7588 case 0:
7589 /* Data dependency; DEP_INSN writes a register that INSN reads some
7590 cycles later. */
7591
7592 switch (insn_type)
7593 {
7594 case TYPE_STORE:
7595 case TYPE_FPSTORE:
80ffc95e 7596 /* Get the delay iff the address of the store is the dependence. */
8947065c
RH
7597 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
7598 return cost;
7599
7600 if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
7601 return cost;
7602 return cost + 3;
7603
7604 case TYPE_LOAD:
7605 case TYPE_SLOAD:
7606 case TYPE_FPLOAD:
7607 /* If a load, then the dependence must be on the memory address. If
7608 the addresses aren't equal, then it might be a false dependency */
7609 if (dep_type == TYPE_STORE || dep_type == TYPE_FPSTORE)
7610 {
7611 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET
7612 || GET_CODE (SET_DEST (dep_pat)) != MEM
7613 || GET_CODE (SET_SRC (pat)) != MEM
7614 || ! rtx_equal_p (XEXP (SET_DEST (dep_pat), 0),
7615 XEXP (SET_SRC (pat), 0)))
7616 return cost + 2;
7617
7618 return cost + 8;
7619 }
7620 break;
7621
7622 case TYPE_BRANCH:
7623 /* Compare to branch latency is 0. There is no benefit from
7624 separating compare and branch. */
7625 if (dep_type == TYPE_COMPARE)
7626 return 0;
7627 /* Floating point compare to branch latency is less than
7628 compare to conditional move. */
7629 if (dep_type == TYPE_FPCMP)
7630 return cost - 1;
7631 break;
3bb5de61
KG
7632 default:
7633 break;
8947065c
RH
7634 }
7635 break;
7636
7637 case REG_DEP_ANTI:
80ffc95e 7638 /* Anti-dependencies only penalize the fpu unit. */
8947065c
RH
7639 if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
7640 return 0;
7641 break;
7642
7643 default:
7644 break;
7645 }
7646
7647 return cost;
7648}
7649
c237e94a 7650static int
8947065c
RH
7651sparc_adjust_cost(insn, link, dep, cost)
7652 rtx insn;
7653 rtx link;
7654 rtx dep;
7655 int cost;
7656{
7657 switch (sparc_cpu)
7658 {
7659 case PROCESSOR_SUPERSPARC:
7660 cost = supersparc_adjust_cost (insn, link, dep, cost);
7661 break;
7662 case PROCESSOR_HYPERSPARC:
7663 case PROCESSOR_SPARCLITE86X:
7664 cost = hypersparc_adjust_cost (insn, link, dep, cost);
7665 break;
8947065c
RH
7666 default:
7667 break;
7668 }
7669 return cost;
7670}
7671
fae15c93
VM
7672static void
7673sparc_sched_init (dump, sched_verbose, max_ready)
7674 FILE *dump ATTRIBUTE_UNUSED;
7675 int sched_verbose ATTRIBUTE_UNUSED;
7676 int max_ready ATTRIBUTE_UNUSED;
3bc8b61e 7677{
3bc8b61e 7678}
fae15c93 7679
3bc8b61e 7680static int
fae15c93 7681sparc_use_dfa_pipeline_interface ()
3bc8b61e 7682{
fae15c93
VM
7683 if ((1 << sparc_cpu) &
7684 ((1 << PROCESSOR_ULTRASPARC) | (1 << PROCESSOR_CYPRESS) |
7685 (1 << PROCESSOR_SUPERSPARC) | (1 << PROCESSOR_HYPERSPARC) |
7686 (1 << PROCESSOR_SPARCLITE86X) | (1 << PROCESSOR_TSC701) |
7687 (1 << PROCESSOR_ULTRASPARC3)))
7688 return 1;
3bc8b61e
DM
7689 return 0;
7690}
7691
fae15c93
VM
7692static int
7693sparc_use_sched_lookahead ()
7694{
7695 if (sparc_cpu == PROCESSOR_ULTRASPARC
7696 || sparc_cpu == PROCESSOR_ULTRASPARC3)
7697 return 4;
7698 if ((1 << sparc_cpu) &
7699 ((1 << PROCESSOR_SUPERSPARC) | (1 << PROCESSOR_HYPERSPARC) |
7700 (1 << PROCESSOR_SPARCLITE86X)))
7701 return 3;
3bc8b61e
DM
7702 return 0;
7703}
7704
fae15c93 7705static int
bfd6bc60
JC
7706sparc_issue_rate ()
7707{
7708 switch (sparc_cpu)
7709 {
fae15c93
VM
7710 default:
7711 return 1;
7712 case PROCESSOR_V9:
284d86e9 7713 /* Assume V9 processors are capable of at least dual-issue. */
bfd6bc60 7714 return 2;
fae15c93
VM
7715 case PROCESSOR_SUPERSPARC:
7716 return 3;
393049a9
RH
7717 case PROCESSOR_HYPERSPARC:
7718 case PROCESSOR_SPARCLITE86X:
7719 return 2;
fae15c93
VM
7720 case PROCESSOR_ULTRASPARC:
7721 case PROCESSOR_ULTRASPARC3:
7722 return 4;
bfd6bc60
JC
7723 }
7724}
284d86e9
JC
7725
7726static int
4df1190a
JJ
7727set_extends (insn)
7728 rtx insn;
284d86e9
JC
7729{
7730 register rtx pat = PATTERN (insn);
7731
7732 switch (GET_CODE (SET_SRC (pat)))
7733 {
80ffc95e 7734 /* Load and some shift instructions zero extend. */
284d86e9
JC
7735 case MEM:
7736 case ZERO_EXTEND:
7737 /* sethi clears the high bits */
7738 case HIGH:
7739 /* LO_SUM is used with sethi. sethi cleared the high
7740 bits and the values used with lo_sum are positive */
7741 case LO_SUM:
284d86e9
JC
7742 /* Store flag stores 0 or 1 */
7743 case LT: case LTU:
7744 case GT: case GTU:
7745 case LE: case LEU:
7746 case GE: case GEU:
7747 case EQ:
7748 case NE:
7749 return 1;
7750 case AND:
7751 {
4df1190a 7752 rtx op0 = XEXP (SET_SRC (pat), 0);
284d86e9
JC
7753 rtx op1 = XEXP (SET_SRC (pat), 1);
7754 if (GET_CODE (op1) == CONST_INT)
7755 return INTVAL (op1) >= 0;
4df1190a
JJ
7756 if (GET_CODE (op0) != REG)
7757 return 0;
7758 if (sparc_check_64 (op0, insn) == 1)
284d86e9 7759 return 1;
4df1190a
JJ
7760 return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
7761 }
7762 case IOR:
7763 case XOR:
7764 {
7765 rtx op0 = XEXP (SET_SRC (pat), 0);
7766 rtx op1 = XEXP (SET_SRC (pat), 1);
7767 if (GET_CODE (op0) != REG || sparc_check_64 (op0, insn) <= 0)
7768 return 0;
7769 if (GET_CODE (op1) == CONST_INT)
7770 return INTVAL (op1) >= 0;
7771 return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
284d86e9 7772 }
284d86e9
JC
7773 case LSHIFTRT:
7774 return GET_MODE (SET_SRC (pat)) == SImode;
80ffc95e 7775 /* Positive integers leave the high bits zero. */
284d86e9 7776 case CONST_DOUBLE:
4df1190a 7777 return ! (CONST_DOUBLE_LOW (SET_SRC (pat)) & 0x80000000);
284d86e9 7778 case CONST_INT:
4df1190a 7779 return ! (INTVAL (SET_SRC (pat)) & 0x80000000);
284d86e9
JC
7780 case ASHIFTRT:
7781 case SIGN_EXTEND:
7782 return - (GET_MODE (SET_SRC (pat)) == SImode);
4df1190a
JJ
7783 case REG:
7784 return sparc_check_64 (SET_SRC (pat), insn);
284d86e9
JC
7785 default:
7786 return 0;
7787 }
7788}
7789
80ffc95e 7790/* We _ought_ to have only one kind per function, but... */
e2500fed
GK
7791static GTY(()) rtx sparc_addr_diff_list;
7792static GTY(()) rtx sparc_addr_list;
e0d80184
DM
7793
7794void
7795sparc_defer_case_vector (lab, vec, diff)
7796 rtx lab, vec;
7797 int diff;
7798{
7799 vec = gen_rtx_EXPR_LIST (VOIDmode, lab, vec);
7800 if (diff)
7801 sparc_addr_diff_list
7802 = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_diff_list);
7803 else
7804 sparc_addr_list = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_list);
7805}
7806
7807static void
7808sparc_output_addr_vec (vec)
7809 rtx vec;
7810{
7811 rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
7812 int idx, vlen = XVECLEN (body, 0);
7813
d1accaa3
JJ
7814#ifdef ASM_OUTPUT_ADDR_VEC_START
7815 ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
7816#endif
7817
e0d80184
DM
7818#ifdef ASM_OUTPUT_CASE_LABEL
7819 ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
7820 NEXT_INSN (lab));
7821#else
7822 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
7823#endif
7824
7825 for (idx = 0; idx < vlen; idx++)
7826 {
7827 ASM_OUTPUT_ADDR_VEC_ELT
7828 (asm_out_file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
7829 }
d1accaa3
JJ
7830
7831#ifdef ASM_OUTPUT_ADDR_VEC_END
7832 ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
7833#endif
e0d80184
DM
7834}
7835
7836static void
7837sparc_output_addr_diff_vec (vec)
7838 rtx vec;
7839{
7840 rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
7841 rtx base = XEXP (XEXP (body, 0), 0);
7842 int idx, vlen = XVECLEN (body, 1);
7843
d1accaa3
JJ
7844#ifdef ASM_OUTPUT_ADDR_VEC_START
7845 ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
7846#endif
7847
e0d80184
DM
7848#ifdef ASM_OUTPUT_CASE_LABEL
7849 ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
7850 NEXT_INSN (lab));
7851#else
7852 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
7853#endif
7854
7855 for (idx = 0; idx < vlen; idx++)
7856 {
7857 ASM_OUTPUT_ADDR_DIFF_ELT
7858 (asm_out_file,
7859 body,
7860 CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
7861 CODE_LABEL_NUMBER (base));
7862 }
d1accaa3
JJ
7863
7864#ifdef ASM_OUTPUT_ADDR_VEC_END
7865 ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
7866#endif
e0d80184
DM
7867}
7868
7869static void
7870sparc_output_deferred_case_vectors ()
7871{
7872 rtx t;
d676da68 7873 int align;
e0d80184 7874
f3b8847b
DM
7875 if (sparc_addr_list == NULL_RTX
7876 && sparc_addr_diff_list == NULL_RTX)
7877 return;
7878
e0d80184
DM
7879 /* Align to cache line in the function's code section. */
7880 function_section (current_function_decl);
d676da68
DM
7881
7882 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
7883 if (align > 0)
f3b8847b 7884 ASM_OUTPUT_ALIGN (asm_out_file, align);
e0d80184
DM
7885
7886 for (t = sparc_addr_list; t ; t = XEXP (t, 1))
7887 sparc_output_addr_vec (XEXP (t, 0));
7888 for (t = sparc_addr_diff_list; t ; t = XEXP (t, 1))
7889 sparc_output_addr_diff_vec (XEXP (t, 0));
7890
7891 sparc_addr_list = sparc_addr_diff_list = NULL_RTX;
7892}
7893
284d86e9
JC
7894/* Return 0 if the high 32 bits of X (the low word of X, if DImode) are
7895 unknown. Return 1 if the high bits are zero, -1 if the register is
7896 sign extended. */
7897int
7898sparc_check_64 (x, insn)
7899 rtx x, insn;
7900{
7901 /* If a register is set only once it is safe to ignore insns this
7902 code does not know how to handle. The loop will either recognize
7903 the single set and return the correct value or fail to recognize
7904 it and return 0. */
7905 int set_once = 0;
4df1190a
JJ
7906 rtx y = x;
7907
7908 if (GET_CODE (x) != REG)
7909 abort ();
7910
7911 if (GET_MODE (x) == DImode)
7912 y = gen_rtx_REG (SImode, REGNO (x) + WORDS_BIG_ENDIAN);
284d86e9 7913
4df1190a
JJ
7914 if (flag_expensive_optimizations
7915 && REG_N_SETS (REGNO (y)) == 1)
284d86e9
JC
7916 set_once = 1;
7917
7918 if (insn == 0)
d6f4ec51
KG
7919 {
7920 if (set_once)
7921 insn = get_last_insn_anywhere ();
7922 else
7923 return 0;
7924 }
284d86e9 7925
d6f4ec51 7926 while ((insn = PREV_INSN (insn)))
284d86e9
JC
7927 {
7928 switch (GET_CODE (insn))
7929 {
7930 case JUMP_INSN:
7931 case NOTE:
7932 break;
7933 case CODE_LABEL:
7934 case CALL_INSN:
7935 default:
7936 if (! set_once)
7937 return 0;
7938 break;
7939 case INSN:
7940 {
7941 rtx pat = PATTERN (insn);
7942 if (GET_CODE (pat) != SET)
7943 return 0;
7944 if (rtx_equal_p (x, SET_DEST (pat)))
4df1190a
JJ
7945 return set_extends (insn);
7946 if (y && rtx_equal_p (y, SET_DEST (pat)))
7947 return set_extends (insn);
7948 if (reg_overlap_mentioned_p (SET_DEST (pat), y))
284d86e9
JC
7949 return 0;
7950 }
7951 }
7952 }
7953 return 0;
7954}
7955
7956char *
7957sparc_v8plus_shift (operands, insn, opcode)
7958 rtx *operands;
7959 rtx insn;
b1474bb7 7960 const char *opcode;
284d86e9
JC
7961{
7962 static char asm_code[60];
7963
7964 if (GET_CODE (operands[3]) == SCRATCH)
7965 operands[3] = operands[0];
c6b0465b
JC
7966 if (GET_CODE (operands[1]) == CONST_INT)
7967 {
4df1190a 7968 output_asm_insn ("mov\t%1, %3", operands);
c6b0465b
JC
7969 }
7970 else
7971 {
4df1190a 7972 output_asm_insn ("sllx\t%H1, 32, %3", operands);
c6b0465b 7973 if (sparc_check_64 (operands[1], insn) <= 0)
4df1190a
JJ
7974 output_asm_insn ("srl\t%L1, 0, %L1", operands);
7975 output_asm_insn ("or\t%L1, %3, %3", operands);
c6b0465b 7976 }
284d86e9
JC
7977
7978 strcpy(asm_code, opcode);
7979 if (which_alternative != 2)
4df1190a 7980 return strcat (asm_code, "\t%0, %2, %L0\n\tsrlx\t%L0, 32, %H0");
284d86e9 7981 else
4df1190a 7982 return strcat (asm_code, "\t%3, %2, %3\n\tsrlx\t%3, 32, %H0\n\tmov\t%3, %L0");
284d86e9 7983}
2be15d0f 7984\f
89a8b315
RH
7985/* Output rtl to increment the profiler label LABELNO
7986 for profiling a function entry. */
2be15d0f
RH
7987
7988void
89a8b315 7989sparc_profile_hook (labelno)
2be15d0f
RH
7990 int labelno;
7991{
7992 char buf[32];
89a8b315 7993 rtx lab, fun;
2be15d0f 7994
89a8b315
RH
7995 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
7996 lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
7997 fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_FUNCTION);
2be15d0f 7998
eb29ddb6 7999 emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lab, Pmode);
2be15d0f 8000}
89a8b315 8001\f
ede75ee8 8002#ifdef OBJECT_FORMAT_ELF
7c262518 8003static void
715bdd29 8004sparc_elf_asm_named_section (name, flags)
7c262518
RH
8005 const char *name;
8006 unsigned int flags;
7c262518 8007{
201556f0
JJ
8008 if (flags & SECTION_MERGE)
8009 {
8010 /* entsize cannot be expressed in this section attributes
8011 encoding style. */
8012 default_elf_asm_named_section (name, flags);
8013 return;
8014 }
8015
7c262518
RH
8016 fprintf (asm_out_file, "\t.section\t\"%s\"", name);
8017
8018 if (!(flags & SECTION_DEBUG))
8019 fputs (",#alloc", asm_out_file);
8020 if (flags & SECTION_WRITE)
8021 fputs (",#write", asm_out_file);
8022 if (flags & SECTION_CODE)
8023 fputs (",#execinstr", asm_out_file);
8024
8025 /* ??? Handle SECTION_BSS. */
8026
8027 fputc ('\n', asm_out_file);
8028}
ede75ee8 8029#endif /* OBJECT_FORMAT_ELF */
f451b552 8030
ae46c4e0
RH
8031/* ??? Similar to the standard section selection, but force reloc-y-ness
8032 if SUNOS4_SHARED_LIBRARIES. Unclear why this helps (as opposed to
8033 pretending PIC always on), but that's what the old code did. */
8034
8035static void
8036sparc_aout_select_section (t, reloc, align)
8037 tree t;
8038 int reloc;
8039 unsigned HOST_WIDE_INT align;
8040{
508bc172 8041 default_select_section (t, reloc | SUNOS4_SHARED_LIBRARIES, align);
ae46c4e0
RH
8042}
8043
b64a1b53
RH
8044/* Use text section for a constant unless we need more alignment than
8045 that offers. */
8046
8047static void
8048sparc_aout_select_rtx_section (mode, x, align)
8049 enum machine_mode mode;
8050 rtx x;
8051 unsigned HOST_WIDE_INT align;
8052{
8053 if (align <= MAX_TEXT_ALIGN
8054 && ! (flag_pic && (symbolic_operand (x, mode)
8055 || SUNOS4_SHARED_LIBRARIES)))
8056 readonly_data_section ();
8057 else
8058 data_section ();
8059}
8060
f451b552
DM
8061int
8062sparc_extra_constraint_check (op, c, strict)
8063 rtx op;
eb29ddb6 8064 int c;
f451b552
DM
8065 int strict;
8066{
8067 int reload_ok_mem;
8068
8069 if (TARGET_ARCH64
8070 && (c == 'T' || c == 'U'))
8071 return 0;
8072
8073 switch (c)
8074 {
8075 case 'Q':
8076 return fp_sethi_p (op);
8077
8078 case 'R':
8079 return fp_mov_p (op);
8080
8081 case 'S':
8082 return fp_high_losum_p (op);
8083
8084 case 'U':
8085 if (! strict
8086 || (GET_CODE (op) == REG
8087 && (REGNO (op) < FIRST_PSEUDO_REGISTER
8088 || reg_renumber[REGNO (op)] >= 0)))
8089 return register_ok_for_ldd (op);
8090
8091 return 0;
8092
8093 case 'W':
8094 case 'T':
8095 break;
8096
8097 default:
8098 return 0;
8099 }
8100
8101 /* Our memory extra constraints have to emulate the
8102 behavior of 'm' and 'o' in order for reload to work
8103 correctly. */
8104 if (GET_CODE (op) == MEM)
8105 {
8106 reload_ok_mem = 0;
8107 if ((TARGET_ARCH64 || mem_min_alignment (op, 8))
8108 && (! strict
8109 || strict_memory_address_p (Pmode, XEXP (op, 0))))
8110 reload_ok_mem = 1;
8111 }
8112 else
8113 {
8114 reload_ok_mem = (reload_in_progress
8115 && GET_CODE (op) == REG
8116 && REGNO (op) >= FIRST_PSEUDO_REGISTER
8117 && reg_renumber [REGNO (op)] < 0);
8118 }
8119
8120 return reload_ok_mem;
8121}
2ce04b6b 8122
214c6394
DM
8123/* ??? This duplicates information provided to the compiler by the
8124 ??? scheduler description. Some day, teach genautomata to output
8125 ??? the latencies and then CSE will just use that. */
8126
2ce04b6b
DM
8127int
8128sparc_rtx_costs (x, code, outer_code)
8129 rtx x;
8130 enum rtx_code code, outer_code;
8131{
8132 switch (code)
8133 {
214c6394
DM
8134 case PLUS: case MINUS: case ABS: case NEG:
8135 case FLOAT: case UNSIGNED_FLOAT:
8136 case FIX: case UNSIGNED_FIX:
8137 case FLOAT_EXTEND: case FLOAT_TRUNCATE:
8138 if (FLOAT_MODE_P (GET_MODE (x)))
8139 {
8140 switch (sparc_cpu)
8141 {
8142 case PROCESSOR_ULTRASPARC:
8143 case PROCESSOR_ULTRASPARC3:
8144 return COSTS_N_INSNS (4);
8145
8146 case PROCESSOR_SUPERSPARC:
8147 return COSTS_N_INSNS (3);
8148
8149 case PROCESSOR_CYPRESS:
8150 return COSTS_N_INSNS (5);
8151
8152 case PROCESSOR_HYPERSPARC:
8153 case PROCESSOR_SPARCLITE86X:
8154 default:
8155 return COSTS_N_INSNS (1);
8156 }
8157 }
8158
8159 return COSTS_N_INSNS (1);
8160
8161 case SQRT:
8162 switch (sparc_cpu)
8163 {
8164 case PROCESSOR_ULTRASPARC:
8165 if (GET_MODE (x) == SFmode)
8166 return COSTS_N_INSNS (13);
8167 else
8168 return COSTS_N_INSNS (23);
8169
8170 case PROCESSOR_ULTRASPARC3:
8171 if (GET_MODE (x) == SFmode)
8172 return COSTS_N_INSNS (20);
8173 else
8174 return COSTS_N_INSNS (29);
8175
8176 case PROCESSOR_SUPERSPARC:
8177 return COSTS_N_INSNS (12);
8178
8179 case PROCESSOR_CYPRESS:
8180 return COSTS_N_INSNS (63);
8181
8182 case PROCESSOR_HYPERSPARC:
8183 case PROCESSOR_SPARCLITE86X:
8184 return COSTS_N_INSNS (17);
8185
8186 default:
8187 return COSTS_N_INSNS (30);
8188 }
8189
8190 case COMPARE:
8191 if (FLOAT_MODE_P (GET_MODE (x)))
8192 {
8193 switch (sparc_cpu)
8194 {
8195 case PROCESSOR_ULTRASPARC:
8196 case PROCESSOR_ULTRASPARC3:
8197 return COSTS_N_INSNS (1);
8198
8199 case PROCESSOR_SUPERSPARC:
8200 return COSTS_N_INSNS (3);
8201
8202 case PROCESSOR_CYPRESS:
8203 return COSTS_N_INSNS (5);
8204
8205 case PROCESSOR_HYPERSPARC:
8206 case PROCESSOR_SPARCLITE86X:
8207 default:
8208 return COSTS_N_INSNS (1);
8209 }
8210 }
8211
8212 /* ??? Maybe mark integer compares as zero cost on
8213 ??? all UltraSPARC processors because the result
8214 ??? can be bypassed to a branch in the same group. */
8215
8216 return COSTS_N_INSNS (1);
8217
2ce04b6b 8218 case MULT:
214c6394
DM
8219 if (FLOAT_MODE_P (GET_MODE (x)))
8220 {
8221 switch (sparc_cpu)
8222 {
8223 case PROCESSOR_ULTRASPARC:
8224 case PROCESSOR_ULTRASPARC3:
8225 return COSTS_N_INSNS (4);
8226
8227 case PROCESSOR_SUPERSPARC:
8228 return COSTS_N_INSNS (3);
8229
8230 case PROCESSOR_CYPRESS:
8231 return COSTS_N_INSNS (7);
8232
8233 case PROCESSOR_HYPERSPARC:
8234 case PROCESSOR_SPARCLITE86X:
8235 return COSTS_N_INSNS (1);
8236
8237 default:
8238 return COSTS_N_INSNS (5);
8239 }
8240 }
8241
8242 /* The latency is actually variable for Ultra-I/II
8243 And if one of the inputs have a known constant
8244 value, we could calculate this precisely.
8245
8246 However, for that to be useful we would need to
8247 add some machine description changes which would
8248 make sure small constants ended up in rs1 of the
8249 multiply instruction. This is because the multiply
8250 latency is determined by the number of clear (or
8251 set if the value is negative) bits starting from
8252 the most significant bit of the first input.
8253
8254 The algorithm for computing num_cycles of a multiply
8255 on Ultra-I/II is:
8256
8257 if (rs1 < 0)
8258 highest_bit = highest_clear_bit(rs1);
8259 else
8260 highest_bit = highest_set_bit(rs1);
8261 if (num_bits < 3)
8262 highest_bit = 3;
8263 num_cycles = 4 + ((highest_bit - 3) / 2);
8264
8265 If we did that we would have to also consider register
8266 allocation issues that would result from forcing such
8267 a value into a register.
8268
8269 There are other similar tricks we could play if we
8270 knew, for example, that one input was an array index.
8271
8272 Since we do not play any such tricks currently the
8273 safest thing to do is report the worst case latency. */
2ce04b6b
DM
8274 if (sparc_cpu == PROCESSOR_ULTRASPARC)
8275 return (GET_MODE (x) == DImode ?
8276 COSTS_N_INSNS (34) : COSTS_N_INSNS (19));
8277
214c6394 8278 /* Multiply latency on Ultra-III, fortunately, is constant. */
2ce04b6b
DM
8279 if (sparc_cpu == PROCESSOR_ULTRASPARC3)
8280 return COSTS_N_INSNS (6);
8281
214c6394
DM
8282 if (sparc_cpu == PROCESSOR_HYPERSPARC
8283 || sparc_cpu == PROCESSOR_SPARCLITE86X)
8284 return COSTS_N_INSNS (17);
8285
2ce04b6b
DM
8286 return (TARGET_HARD_MUL
8287 ? COSTS_N_INSNS (5)
8288 : COSTS_N_INSNS (25));
8289
8290 case DIV:
8291 case UDIV:
8292 case MOD:
8293 case UMOD:
214c6394
DM
8294 if (FLOAT_MODE_P (GET_MODE (x)))
8295 {
8296 switch (sparc_cpu)
8297 {
8298 case PROCESSOR_ULTRASPARC:
8299 if (GET_MODE (x) == SFmode)
8300 return COSTS_N_INSNS (13);
8301 else
8302 return COSTS_N_INSNS (23);
8303
8304 case PROCESSOR_ULTRASPARC3:
8305 if (GET_MODE (x) == SFmode)
8306 return COSTS_N_INSNS (17);
8307 else
8308 return COSTS_N_INSNS (20);
8309
8310 case PROCESSOR_SUPERSPARC:
8311 if (GET_MODE (x) == SFmode)
8312 return COSTS_N_INSNS (6);
8313 else
8314 return COSTS_N_INSNS (9);
8315
8316 case PROCESSOR_HYPERSPARC:
8317 case PROCESSOR_SPARCLITE86X:
8318 if (GET_MODE (x) == SFmode)
8319 return COSTS_N_INSNS (8);
8320 else
8321 return COSTS_N_INSNS (12);
8322
8323 default:
8324 return COSTS_N_INSNS (7);
8325 }
8326 }
8327
2ce04b6b
DM
8328 if (sparc_cpu == PROCESSOR_ULTRASPARC)
8329 return (GET_MODE (x) == DImode ?
8330 COSTS_N_INSNS (68) : COSTS_N_INSNS (37));
8331 if (sparc_cpu == PROCESSOR_ULTRASPARC3)
8332 return (GET_MODE (x) == DImode ?
8333 COSTS_N_INSNS (71) : COSTS_N_INSNS (40));
8334 return COSTS_N_INSNS (25);
8335
214c6394
DM
8336 case IF_THEN_ELSE:
8337 /* Conditional moves. */
8338 switch (sparc_cpu)
8339 {
8340 case PROCESSOR_ULTRASPARC:
8341 return COSTS_N_INSNS (2);
8342
8343 case PROCESSOR_ULTRASPARC3:
8344 if (FLOAT_MODE_P (GET_MODE (x)))
8345 return COSTS_N_INSNS (3);
8346 else
8347 return COSTS_N_INSNS (2);
8348
8349 default:
8350 return COSTS_N_INSNS (1);
8351 }
8352
8353 case MEM:
8354 /* If outer-code is SIGN/ZERO extension we have to subtract
8355 out COSTS_N_INSNS (1) from whatever we return in determining
8356 the cost. */
8357 switch (sparc_cpu)
8358 {
8359 case PROCESSOR_ULTRASPARC:
8360 if (outer_code == ZERO_EXTEND)
8361 return COSTS_N_INSNS (1);
8362 else
8363 return COSTS_N_INSNS (2);
8364
8365 case PROCESSOR_ULTRASPARC3:
8366 if (outer_code == ZERO_EXTEND)
8367 {
8368 if (GET_MODE (x) == QImode
8369 || GET_MODE (x) == HImode
8370 || outer_code == SIGN_EXTEND)
8371 return COSTS_N_INSNS (2);
8372 else
8373 return COSTS_N_INSNS (1);
8374 }
8375 else
8376 {
8377 /* This handles sign extension (3 cycles)
8378 and everything else (2 cycles). */
8379 return COSTS_N_INSNS (2);
8380 }
8381
8382 case PROCESSOR_SUPERSPARC:
8383 if (FLOAT_MODE_P (GET_MODE (x))
8384 || outer_code == ZERO_EXTEND
8385 || outer_code == SIGN_EXTEND)
8386 return COSTS_N_INSNS (0);
8387 else
8388 return COSTS_N_INSNS (1);
8389
8390 case PROCESSOR_TSC701:
8391 if (outer_code == ZERO_EXTEND
8392 || outer_code == SIGN_EXTEND)
8393 return COSTS_N_INSNS (2);
8394 else
8395 return COSTS_N_INSNS (3);
8396
8397 case PROCESSOR_CYPRESS:
8398 if (outer_code == ZERO_EXTEND
8399 || outer_code == SIGN_EXTEND)
8400 return COSTS_N_INSNS (1);
8401 else
8402 return COSTS_N_INSNS (2);
8403
8404 case PROCESSOR_HYPERSPARC:
8405 case PROCESSOR_SPARCLITE86X:
8406 default:
8407 if (outer_code == ZERO_EXTEND
8408 || outer_code == SIGN_EXTEND)
8409 return COSTS_N_INSNS (0);
8410 else
8411 return COSTS_N_INSNS (1);
8412 }
2ce04b6b
DM
8413
8414 case CONST_INT:
8415 if (INTVAL (x) < 0x1000 && INTVAL (x) >= -0x1000)
8416 return 0;
8417
8418 /* fallthru */
8419 case HIGH:
8420 return 2;
8421
8422 case CONST:
8423 case LABEL_REF:
8424 case SYMBOL_REF:
8425 return 4;
8426
8427 case CONST_DOUBLE:
8428 if (GET_MODE (x) == DImode)
8429 if ((XINT (x, 3) == 0
8430 && (unsigned) XINT (x, 2) < 0x1000)
8431 || (XINT (x, 3) == -1
8432 && XINT (x, 2) < 0
8433 && XINT (x, 2) >= -0x1000))
8434 return 0;
8435 return 8;
8436
8437 default:
8438 abort();
8439 };
8440}
fb49053f
RH
8441
8442/* If we are referencing a function make the SYMBOL_REF special. In
8443 the Embedded Medium/Anywhere code model, %g4 points to the data
8444 segment so we must not add it to function addresses. */
8445
8446static void
8447sparc_encode_section_info (decl, first)
8448 tree decl;
8449 int first ATTRIBUTE_UNUSED;
8450{
8451 if (TARGET_CM_EMBMEDANY && TREE_CODE (decl) == FUNCTION_DECL)
8452 SYMBOL_REF_FLAG (XEXP (DECL_RTL (decl), 0)) = 1;
8453}
e133041b
RH
8454
8455/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
8456 Used for C++ multiple inheritance. */
8457
c590b625 8458static void
3961e8fe 8459sparc_output_mi_thunk (file, thunk_fndecl, delta, vcall_offset, function)
e133041b
RH
8460 FILE *file;
8461 tree thunk_fndecl ATTRIBUTE_UNUSED;
8462 HOST_WIDE_INT delta;
3961e8fe 8463 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED;
e133041b
RH
8464 tree function;
8465{
8466 rtx this, insn, funexp, delta_rtx, tmp;
8467
8468 reload_completed = 1;
8469 no_new_pseudos = 1;
8470 current_function_uses_only_leaf_regs = 1;
8471
8472 emit_note (NULL, NOTE_INSN_PROLOGUE_END);
8473
8474 /* Find the "this" pointer. Normally in %o0, but in ARCH64 if the function
8475 returns a structure, the structure return pointer is there instead. */
8476 if (TARGET_ARCH64 && aggregate_value_p (TREE_TYPE (TREE_TYPE (function))))
8477 this = gen_rtx_REG (Pmode, SPARC_INCOMING_INT_ARG_FIRST + 1);
8478 else
8479 this = gen_rtx_REG (Pmode, SPARC_INCOMING_INT_ARG_FIRST);
8480
8481 /* Add DELTA. When possible use a plain add, otherwise load it into
8482 a register first. */
8483 delta_rtx = GEN_INT (delta);
8484 if (!SPARC_SIMM13_P (delta))
8485 {
8486 rtx scratch = gen_rtx_REG (Pmode, 1);
8487 if (TARGET_ARCH64)
8488 sparc_emit_set_const64 (scratch, delta_rtx);
8489 else
8490 sparc_emit_set_const32 (scratch, delta_rtx);
8491 delta_rtx = scratch;
8492 }
8493
8494 tmp = gen_rtx_PLUS (Pmode, this, delta_rtx);
8495 emit_insn (gen_rtx_SET (VOIDmode, this, tmp));
8496
8497 /* Generate a tail call to the target function. */
8498 if (! TREE_USED (function))
8499 {
8500 assemble_external (function);
8501 TREE_USED (function) = 1;
8502 }
8503 funexp = XEXP (DECL_RTL (function), 0);
8504 funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
8505 insn = emit_call_insn (gen_sibcall (funexp));
8506 SIBLING_CALL_P (insn) = 1;
8507 emit_barrier ();
8508
8509 /* Run just enough of rest_of_compilation to get the insns emitted.
8510 There's not really enough bulk here to make other passes such as
8511 instruction scheduling worth while. Note that use_thunk calls
8512 assemble_start_function and assemble_end_function. */
8513 insn = get_insns ();
8514 shorten_branches (insn);
8515 final_start_function (insn, file, 1);
8516 final (insn, file, 1, 0);
8517 final_end_function ();
8518
8519 reload_completed = 0;
8520 no_new_pseudos = 0;
8521}
e2500fed
GK
8522
8523#include "gt-sparc.h"
This page took 2.596054 seconds and 5 git commands to generate.