2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / config / sparc / sparc.c
bloba3fdcc6cdb26675ce883afe9760eb24a55c40172
1 /* Subroutines for insn-output.c for SPARC.
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
4 Contributed by Michael Tiemann (tiemann@cygnus.com)
5 64-bit SPARC-V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
6 at Cygnus Support.
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2, or (at your option)
13 any later version.
15 GCC is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING. If not, write to
22 the Free Software Foundation, 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "tm.h"
29 #include "tree.h"
30 #include "rtl.h"
31 #include "regs.h"
32 #include "hard-reg-set.h"
33 #include "real.h"
34 #include "insn-config.h"
35 #include "conditions.h"
36 #include "output.h"
37 #include "insn-attr.h"
38 #include "flags.h"
39 #include "function.h"
40 #include "expr.h"
41 #include "optabs.h"
42 #include "recog.h"
43 #include "toplev.h"
44 #include "ggc.h"
45 #include "tm_p.h"
46 #include "debug.h"
47 #include "target.h"
48 #include "target-def.h"
49 #include "cfglayout.h"
51 /* 1 if the caller has placed an "unimp" insn immediately after the call.
52 This is used in v8 code when calling a function that returns a structure.
53 v9 doesn't have this. Be careful to have this test be the same as that
54 used on the call. */
56 #define SKIP_CALLERS_UNIMP_P \
57 (!TARGET_ARCH64 && current_function_returns_struct \
58 && ! integer_zerop (DECL_SIZE (DECL_RESULT (current_function_decl))) \
59 && (TREE_CODE (DECL_SIZE (DECL_RESULT (current_function_decl))) \
60 == INTEGER_CST))
62 /* Global variables for machine-dependent things. */
64 /* Size of frame. Need to know this to emit return insns from leaf procedures.
65 ACTUAL_FSIZE is set by compute_frame_size() which is called during the
66 reload pass. This is important as the value is later used in insn
67 scheduling (to see what can go in a delay slot).
68 APPARENT_FSIZE is the size of the stack less the register save area and less
69 the outgoing argument area. It is used when saving call preserved regs. */
70 static HOST_WIDE_INT apparent_fsize;
71 static HOST_WIDE_INT actual_fsize;
73 /* Number of live general or floating point registers needed to be
74 saved (as 4-byte quantities). */
75 static int num_gfregs;
77 /* Save the operands last given to a compare for use when we
78 generate a scc or bcc insn. */
79 rtx sparc_compare_op0, sparc_compare_op1;
81 /* Coordinate with the md file wrt special insns created by
82 sparc_nonflat_function_epilogue. */
83 bool sparc_emitting_epilogue;
85 /* Vector to say how input registers are mapped to output registers.
86 HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
87 eliminate it. You must use -fomit-frame-pointer to get that. */
88 char leaf_reg_remap[] =
89 { 0, 1, 2, 3, 4, 5, 6, 7,
90 -1, -1, -1, -1, -1, -1, 14, -1,
91 -1, -1, -1, -1, -1, -1, -1, -1,
92 8, 9, 10, 11, 12, 13, -1, 15,
94 32, 33, 34, 35, 36, 37, 38, 39,
95 40, 41, 42, 43, 44, 45, 46, 47,
96 48, 49, 50, 51, 52, 53, 54, 55,
97 56, 57, 58, 59, 60, 61, 62, 63,
98 64, 65, 66, 67, 68, 69, 70, 71,
99 72, 73, 74, 75, 76, 77, 78, 79,
100 80, 81, 82, 83, 84, 85, 86, 87,
101 88, 89, 90, 91, 92, 93, 94, 95,
102 96, 97, 98, 99, 100};
104 /* Vector, indexed by hard register number, which contains 1
105 for a register that is allowable in a candidate for leaf
106 function treatment. */
107 char sparc_leaf_regs[] =
108 { 1, 1, 1, 1, 1, 1, 1, 1,
109 0, 0, 0, 0, 0, 0, 1, 0,
110 0, 0, 0, 0, 0, 0, 0, 0,
111 1, 1, 1, 1, 1, 1, 0, 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, 1, 1, 1,
119 1, 1, 1, 1, 1, 1, 1, 1,
120 1, 1, 1, 1, 1};
122 struct machine_function GTY(())
124 /* Some local-dynamic TLS symbol name. */
125 const char *some_ld_name;
128 /* Name of where we pretend to think the frame pointer points.
129 Normally, this is "%fp", but if we are in a leaf procedure,
130 this is "%sp+something". We record "something" separately as it may be
131 too big for reg+constant addressing. */
133 static const char *frame_base_name;
134 static HOST_WIDE_INT frame_base_offset;
136 static void sparc_init_modes (void);
137 static int save_regs (FILE *, int, int, const char *, int, int, HOST_WIDE_INT);
138 static int restore_regs (FILE *, int, int, const char *, int, int);
139 static void build_big_number (FILE *, HOST_WIDE_INT, const char *);
140 static int function_arg_slotno (const CUMULATIVE_ARGS *, enum machine_mode,
141 tree, int, int, int *, int *);
143 static int supersparc_adjust_cost (rtx, rtx, rtx, int);
144 static int hypersparc_adjust_cost (rtx, rtx, rtx, int);
146 static void sparc_output_addr_vec (rtx);
147 static void sparc_output_addr_diff_vec (rtx);
148 static void sparc_output_deferred_case_vectors (void);
149 static int check_return_regs (rtx);
150 static int epilogue_renumber (rtx *, int);
151 static bool sparc_assemble_integer (rtx, unsigned int, int);
152 static int set_extends (rtx);
153 static void output_restore_regs (FILE *, int);
154 static void sparc_output_function_prologue (FILE *, HOST_WIDE_INT);
155 static void sparc_output_function_epilogue (FILE *, HOST_WIDE_INT);
156 static void sparc_flat_function_epilogue (FILE *, HOST_WIDE_INT);
157 static void sparc_flat_function_prologue (FILE *, HOST_WIDE_INT);
158 static void sparc_flat_save_restore (FILE *, const char *, int,
159 unsigned long, unsigned long,
160 const char *, const char *,
161 HOST_WIDE_INT);
162 static void sparc_nonflat_function_epilogue (FILE *, HOST_WIDE_INT, int);
163 static void sparc_nonflat_function_prologue (FILE *, HOST_WIDE_INT, int);
164 #ifdef OBJECT_FORMAT_ELF
165 static void sparc_elf_asm_named_section (const char *, unsigned int);
166 #endif
167 static void sparc_aout_select_section (tree, int, unsigned HOST_WIDE_INT)
168 ATTRIBUTE_UNUSED;
169 static void sparc_aout_select_rtx_section (enum machine_mode, rtx,
170 unsigned HOST_WIDE_INT)
171 ATTRIBUTE_UNUSED;
173 static int sparc_adjust_cost (rtx, rtx, rtx, int);
174 static int sparc_issue_rate (void);
175 static void sparc_sched_init (FILE *, int, int);
176 static int sparc_use_dfa_pipeline_interface (void);
177 static int sparc_use_sched_lookahead (void);
179 static void emit_soft_tfmode_libcall (const char *, int, rtx *);
180 static void emit_soft_tfmode_binop (enum rtx_code, rtx *);
181 static void emit_soft_tfmode_unop (enum rtx_code, rtx *);
182 static void emit_soft_tfmode_cvt (enum rtx_code, rtx *);
183 static void emit_hard_tfmode_operation (enum rtx_code, rtx *);
185 static bool sparc_function_ok_for_sibcall (tree, tree);
186 static void sparc_init_libfuncs (void);
187 static void sparc_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
188 HOST_WIDE_INT, tree);
189 static struct machine_function * sparc_init_machine_status (void);
190 static bool sparc_cannot_force_const_mem (rtx);
191 static rtx sparc_tls_get_addr (void);
192 static rtx sparc_tls_got (void);
193 static const char *get_some_local_dynamic_name (void);
194 static int get_some_local_dynamic_name_1 (rtx *, void *);
195 static bool sparc_rtx_costs (rtx, int, int, int *);
197 /* Option handling. */
199 /* Code model option as passed by user. */
200 const char *sparc_cmodel_string;
201 /* Parsed value. */
202 enum cmodel sparc_cmodel;
204 char sparc_hard_reg_printed[8];
206 struct sparc_cpu_select sparc_select[] =
208 /* switch name, tune arch */
209 { (char *)0, "default", 1, 1 },
210 { (char *)0, "-mcpu=", 1, 1 },
211 { (char *)0, "-mtune=", 1, 0 },
212 { 0, 0, 0, 0 }
215 /* CPU type. This is set from TARGET_CPU_DEFAULT and -m{cpu,tune}=xxx. */
216 enum processor_type sparc_cpu;
218 /* Initialize the GCC target structure. */
220 /* The sparc default is to use .half rather than .short for aligned
221 HI objects. Use .word instead of .long on non-ELF systems. */
222 #undef TARGET_ASM_ALIGNED_HI_OP
223 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
224 #ifndef OBJECT_FORMAT_ELF
225 #undef TARGET_ASM_ALIGNED_SI_OP
226 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
227 #endif
229 #undef TARGET_ASM_UNALIGNED_HI_OP
230 #define TARGET_ASM_UNALIGNED_HI_OP "\t.uahalf\t"
231 #undef TARGET_ASM_UNALIGNED_SI_OP
232 #define TARGET_ASM_UNALIGNED_SI_OP "\t.uaword\t"
233 #undef TARGET_ASM_UNALIGNED_DI_OP
234 #define TARGET_ASM_UNALIGNED_DI_OP "\t.uaxword\t"
236 /* The target hook has to handle DI-mode values. */
237 #undef TARGET_ASM_INTEGER
238 #define TARGET_ASM_INTEGER sparc_assemble_integer
240 #undef TARGET_ASM_FUNCTION_PROLOGUE
241 #define TARGET_ASM_FUNCTION_PROLOGUE sparc_output_function_prologue
242 #undef TARGET_ASM_FUNCTION_EPILOGUE
243 #define TARGET_ASM_FUNCTION_EPILOGUE sparc_output_function_epilogue
245 #undef TARGET_SCHED_ADJUST_COST
246 #define TARGET_SCHED_ADJUST_COST sparc_adjust_cost
247 #undef TARGET_SCHED_ISSUE_RATE
248 #define TARGET_SCHED_ISSUE_RATE sparc_issue_rate
249 #undef TARGET_SCHED_INIT
250 #define TARGET_SCHED_INIT sparc_sched_init
251 #undef TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE
252 #define TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE sparc_use_dfa_pipeline_interface
253 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
254 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD sparc_use_sched_lookahead
256 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
257 #define TARGET_FUNCTION_OK_FOR_SIBCALL sparc_function_ok_for_sibcall
259 #undef TARGET_INIT_LIBFUNCS
260 #define TARGET_INIT_LIBFUNCS sparc_init_libfuncs
262 #ifdef HAVE_AS_TLS
263 #undef TARGET_HAVE_TLS
264 #define TARGET_HAVE_TLS true
265 #endif
266 #undef TARGET_CANNOT_FORCE_CONST_MEM
267 #define TARGET_CANNOT_FORCE_CONST_MEM sparc_cannot_force_const_mem
269 #undef TARGET_ASM_OUTPUT_MI_THUNK
270 #define TARGET_ASM_OUTPUT_MI_THUNK sparc_output_mi_thunk
271 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
272 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
274 #undef TARGET_RTX_COSTS
275 #define TARGET_RTX_COSTS sparc_rtx_costs
276 #undef TARGET_ADDRESS_COST
277 #define TARGET_ADDRESS_COST hook_int_rtx_0
279 struct gcc_target targetm = TARGET_INITIALIZER;
281 /* Validate and override various options, and do some machine dependent
282 initialization. */
284 void
285 sparc_override_options (void)
287 static struct code_model {
288 const char *const name;
289 const int value;
290 } const cmodels[] = {
291 { "32", CM_32 },
292 { "medlow", CM_MEDLOW },
293 { "medmid", CM_MEDMID },
294 { "medany", CM_MEDANY },
295 { "embmedany", CM_EMBMEDANY },
296 { 0, 0 }
298 const struct code_model *cmodel;
299 /* Map TARGET_CPU_DEFAULT to value for -m{arch,tune}=. */
300 static struct cpu_default {
301 const int cpu;
302 const char *const name;
303 } const cpu_default[] = {
304 /* There must be one entry here for each TARGET_CPU value. */
305 { TARGET_CPU_sparc, "cypress" },
306 { TARGET_CPU_sparclet, "tsc701" },
307 { TARGET_CPU_sparclite, "f930" },
308 { TARGET_CPU_v8, "v8" },
309 { TARGET_CPU_hypersparc, "hypersparc" },
310 { TARGET_CPU_sparclite86x, "sparclite86x" },
311 { TARGET_CPU_supersparc, "supersparc" },
312 { TARGET_CPU_v9, "v9" },
313 { TARGET_CPU_ultrasparc, "ultrasparc" },
314 { TARGET_CPU_ultrasparc3, "ultrasparc3" },
315 { 0, 0 }
317 const struct cpu_default *def;
318 /* Table of values for -m{cpu,tune}=. */
319 static struct cpu_table {
320 const char *const name;
321 const enum processor_type processor;
322 const int disable;
323 const int enable;
324 } const cpu_table[] = {
325 { "v7", PROCESSOR_V7, MASK_ISA, 0 },
326 { "cypress", PROCESSOR_CYPRESS, MASK_ISA, 0 },
327 { "v8", PROCESSOR_V8, MASK_ISA, MASK_V8 },
328 /* TI TMS390Z55 supersparc */
329 { "supersparc", PROCESSOR_SUPERSPARC, MASK_ISA, MASK_V8 },
330 { "sparclite", PROCESSOR_SPARCLITE, MASK_ISA, MASK_SPARCLITE },
331 /* The Fujitsu MB86930 is the original sparclite chip, with no fpu.
332 The Fujitsu MB86934 is the recent sparclite chip, with an fpu. */
333 { "f930", PROCESSOR_F930, MASK_ISA|MASK_FPU, MASK_SPARCLITE },
334 { "f934", PROCESSOR_F934, MASK_ISA, MASK_SPARCLITE|MASK_FPU },
335 { "hypersparc", PROCESSOR_HYPERSPARC, MASK_ISA, MASK_V8|MASK_FPU },
336 { "sparclite86x", PROCESSOR_SPARCLITE86X, MASK_ISA|MASK_FPU,
337 MASK_SPARCLITE },
338 { "sparclet", PROCESSOR_SPARCLET, MASK_ISA, MASK_SPARCLET },
339 /* TEMIC sparclet */
340 { "tsc701", PROCESSOR_TSC701, MASK_ISA, MASK_SPARCLET },
341 { "v9", PROCESSOR_V9, MASK_ISA, MASK_V9 },
342 /* TI ultrasparc I, II, IIi */
343 { "ultrasparc", PROCESSOR_ULTRASPARC, MASK_ISA, MASK_V9
344 /* Although insns using %y are deprecated, it is a clear win on current
345 ultrasparcs. */
346 |MASK_DEPRECATED_V8_INSNS},
347 /* TI ultrasparc III */
348 /* ??? Check if %y issue still holds true in ultra3. */
349 { "ultrasparc3", PROCESSOR_ULTRASPARC3, MASK_ISA, MASK_V9|MASK_DEPRECATED_V8_INSNS},
350 { 0, 0, 0, 0 }
352 const struct cpu_table *cpu;
353 const struct sparc_cpu_select *sel;
354 int fpu;
356 #ifndef SPARC_BI_ARCH
357 /* Check for unsupported architecture size. */
358 if (! TARGET_64BIT != DEFAULT_ARCH32_P)
359 error ("%s is not supported by this configuration",
360 DEFAULT_ARCH32_P ? "-m64" : "-m32");
361 #endif
363 /* We force all 64bit archs to use 128 bit long double */
364 if (TARGET_64BIT && ! TARGET_LONG_DOUBLE_128)
366 error ("-mlong-double-64 not allowed with -m64");
367 target_flags |= MASK_LONG_DOUBLE_128;
370 /* Code model selection. */
371 sparc_cmodel = SPARC_DEFAULT_CMODEL;
373 #ifdef SPARC_BI_ARCH
374 if (TARGET_ARCH32)
375 sparc_cmodel = CM_32;
376 #endif
378 if (sparc_cmodel_string != NULL)
380 if (TARGET_ARCH64)
382 for (cmodel = &cmodels[0]; cmodel->name; cmodel++)
383 if (strcmp (sparc_cmodel_string, cmodel->name) == 0)
384 break;
385 if (cmodel->name == NULL)
386 error ("bad value (%s) for -mcmodel= switch", sparc_cmodel_string);
387 else
388 sparc_cmodel = cmodel->value;
390 else
391 error ("-mcmodel= is not supported on 32 bit systems");
394 fpu = TARGET_FPU; /* save current -mfpu status */
396 /* Set the default CPU. */
397 for (def = &cpu_default[0]; def->name; ++def)
398 if (def->cpu == TARGET_CPU_DEFAULT)
399 break;
400 if (! def->name)
401 abort ();
402 sparc_select[0].string = def->name;
404 for (sel = &sparc_select[0]; sel->name; ++sel)
406 if (sel->string)
408 for (cpu = &cpu_table[0]; cpu->name; ++cpu)
409 if (! strcmp (sel->string, cpu->name))
411 if (sel->set_tune_p)
412 sparc_cpu = cpu->processor;
414 if (sel->set_arch_p)
416 target_flags &= ~cpu->disable;
417 target_flags |= cpu->enable;
419 break;
422 if (! cpu->name)
423 error ("bad value (%s) for %s switch", sel->string, sel->name);
427 /* If -mfpu or -mno-fpu was explicitly used, don't override with
428 the processor default. Clear MASK_FPU_SET to avoid confusing
429 the reverse mapping from switch values to names. */
430 if (TARGET_FPU_SET)
432 target_flags = (target_flags & ~MASK_FPU) | fpu;
433 target_flags &= ~MASK_FPU_SET;
436 /* Don't allow -mvis if FPU is disabled. */
437 if (! TARGET_FPU)
438 target_flags &= ~MASK_VIS;
440 /* -mvis assumes UltraSPARC+, so we are sure v9 instructions
441 are available.
442 -m64 also implies v9. */
443 if (TARGET_VIS || TARGET_ARCH64)
445 target_flags |= MASK_V9;
446 target_flags &= ~(MASK_V8 | MASK_SPARCLET | MASK_SPARCLITE);
449 /* Use the deprecated v8 insns for sparc64 in 32 bit mode. */
450 if (TARGET_V9 && TARGET_ARCH32)
451 target_flags |= MASK_DEPRECATED_V8_INSNS;
453 /* V8PLUS requires V9, makes no sense in 64 bit mode. */
454 if (! TARGET_V9 || TARGET_ARCH64)
455 target_flags &= ~MASK_V8PLUS;
457 /* Don't use stack biasing in 32 bit mode. */
458 if (TARGET_ARCH32)
459 target_flags &= ~MASK_STACK_BIAS;
461 /* Supply a default value for align_functions. */
462 if (align_functions == 0
463 && (sparc_cpu == PROCESSOR_ULTRASPARC
464 || sparc_cpu == PROCESSOR_ULTRASPARC3))
465 align_functions = 32;
467 /* Validate PCC_STRUCT_RETURN. */
468 if (flag_pcc_struct_return == DEFAULT_PCC_STRUCT_RETURN)
469 flag_pcc_struct_return = (TARGET_ARCH64 ? 0 : 1);
471 /* Only use .uaxword when compiling for a 64-bit target. */
472 if (!TARGET_ARCH64)
473 targetm.asm_out.unaligned_op.di = NULL;
475 /* Do various machine dependent initializations. */
476 sparc_init_modes ();
478 /* Set up function hooks. */
479 init_machine_status = sparc_init_machine_status;
482 /* Miscellaneous utilities. */
484 /* Nonzero if CODE, a comparison, is suitable for use in v9 conditional move
485 or branch on register contents instructions. */
488 v9_regcmp_p (enum rtx_code code)
490 return (code == EQ || code == NE || code == GE || code == LT
491 || code == LE || code == GT);
495 /* Operand constraints. */
497 /* Return nonzero only if OP is a register of mode MODE,
498 or const0_rtx. */
501 reg_or_0_operand (rtx op, enum machine_mode mode)
503 if (register_operand (op, mode))
504 return 1;
505 if (op == const0_rtx)
506 return 1;
507 if (GET_MODE (op) == VOIDmode && GET_CODE (op) == CONST_DOUBLE
508 && CONST_DOUBLE_HIGH (op) == 0
509 && CONST_DOUBLE_LOW (op) == 0)
510 return 1;
511 if (fp_zero_operand (op, mode))
512 return 1;
513 return 0;
516 /* Return nonzero only if OP is const1_rtx. */
519 const1_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
521 return op == const1_rtx;
524 /* Nonzero if OP is a floating point value with value 0.0. */
527 fp_zero_operand (rtx op, enum machine_mode mode)
529 if (GET_MODE_CLASS (GET_MODE (op)) != MODE_FLOAT)
530 return 0;
531 return op == CONST0_RTX (mode);
534 /* Nonzero if OP is a register operand in floating point register. */
537 fp_register_operand (rtx op, enum machine_mode mode)
539 if (! register_operand (op, mode))
540 return 0;
541 if (GET_CODE (op) == SUBREG)
542 op = SUBREG_REG (op);
543 return GET_CODE (op) == REG && SPARC_FP_REG_P (REGNO (op));
546 /* Nonzero if OP is a floating point constant which can
547 be loaded into an integer register using a single
548 sethi instruction. */
551 fp_sethi_p (rtx op)
553 if (GET_CODE (op) == CONST_DOUBLE)
555 REAL_VALUE_TYPE r;
556 long i;
558 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
559 if (REAL_VALUES_EQUAL (r, dconst0) &&
560 ! REAL_VALUE_MINUS_ZERO (r))
561 return 0;
562 REAL_VALUE_TO_TARGET_SINGLE (r, i);
563 if (SPARC_SETHI_P (i))
564 return 1;
567 return 0;
570 /* Nonzero if OP is a floating point constant which can
571 be loaded into an integer register using a single
572 mov instruction. */
575 fp_mov_p (rtx op)
577 if (GET_CODE (op) == CONST_DOUBLE)
579 REAL_VALUE_TYPE r;
580 long i;
582 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
583 if (REAL_VALUES_EQUAL (r, dconst0) &&
584 ! REAL_VALUE_MINUS_ZERO (r))
585 return 0;
586 REAL_VALUE_TO_TARGET_SINGLE (r, i);
587 if (SPARC_SIMM13_P (i))
588 return 1;
591 return 0;
594 /* Nonzero if OP is a floating point constant which can
595 be loaded into an integer register using a high/losum
596 instruction sequence. */
599 fp_high_losum_p (rtx op)
601 /* The constraints calling this should only be in
602 SFmode move insns, so any constant which cannot
603 be moved using a single insn will do. */
604 if (GET_CODE (op) == CONST_DOUBLE)
606 REAL_VALUE_TYPE r;
607 long i;
609 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
610 if (REAL_VALUES_EQUAL (r, dconst0) &&
611 ! REAL_VALUE_MINUS_ZERO (r))
612 return 0;
613 REAL_VALUE_TO_TARGET_SINGLE (r, i);
614 if (! SPARC_SETHI_P (i)
615 && ! SPARC_SIMM13_P (i))
616 return 1;
619 return 0;
622 /* Nonzero if OP is an integer register. */
625 intreg_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
627 return (register_operand (op, SImode)
628 || (TARGET_ARCH64 && register_operand (op, DImode)));
631 /* Nonzero if OP is a floating point condition code register. */
634 fcc_reg_operand (rtx op, enum machine_mode mode)
636 /* This can happen when recog is called from combine. Op may be a MEM.
637 Fail instead of calling abort in this case. */
638 if (GET_CODE (op) != REG)
639 return 0;
641 if (mode != VOIDmode && mode != GET_MODE (op))
642 return 0;
643 if (mode == VOIDmode
644 && (GET_MODE (op) != CCFPmode && GET_MODE (op) != CCFPEmode))
645 return 0;
647 #if 0 /* ??? ==> 1 when %fcc0-3 are pseudos first. See gen_compare_reg(). */
648 if (reg_renumber == 0)
649 return REGNO (op) >= FIRST_PSEUDO_REGISTER;
650 return REGNO_OK_FOR_CCFP_P (REGNO (op));
651 #else
652 return (unsigned) REGNO (op) - SPARC_FIRST_V9_FCC_REG < 4;
653 #endif
656 /* Nonzero if OP is a floating point condition code fcc0 register. */
659 fcc0_reg_operand (rtx op, enum machine_mode mode)
661 /* This can happen when recog is called from combine. Op may be a MEM.
662 Fail instead of calling abort in this case. */
663 if (GET_CODE (op) != REG)
664 return 0;
666 if (mode != VOIDmode && mode != GET_MODE (op))
667 return 0;
668 if (mode == VOIDmode
669 && (GET_MODE (op) != CCFPmode && GET_MODE (op) != CCFPEmode))
670 return 0;
672 return REGNO (op) == SPARC_FCC_REG;
675 /* Nonzero if OP is an integer or floating point condition code register. */
678 icc_or_fcc_reg_operand (rtx op, enum machine_mode mode)
680 if (GET_CODE (op) == REG && REGNO (op) == SPARC_ICC_REG)
682 if (mode != VOIDmode && mode != GET_MODE (op))
683 return 0;
684 if (mode == VOIDmode
685 && GET_MODE (op) != CCmode && GET_MODE (op) != CCXmode)
686 return 0;
687 return 1;
690 return fcc_reg_operand (op, mode);
693 /* Nonzero if OP can appear as the dest of a RESTORE insn. */
695 restore_operand (rtx op, enum machine_mode mode)
697 return (GET_CODE (op) == REG && GET_MODE (op) == mode
698 && (REGNO (op) < 8 || (REGNO (op) >= 24 && REGNO (op) < 32)));
701 /* Call insn on SPARC can take a PC-relative constant address, or any regular
702 memory address. */
705 call_operand (rtx op, enum machine_mode mode)
707 if (GET_CODE (op) != MEM)
708 abort ();
709 op = XEXP (op, 0);
710 return (symbolic_operand (op, mode) || memory_address_p (Pmode, op));
714 call_operand_address (rtx op, enum machine_mode mode)
716 return (symbolic_operand (op, mode) || memory_address_p (Pmode, op));
719 /* If OP is a SYMBOL_REF of a thread-local symbol, return its TLS mode,
720 otherwise return 0. */
723 tls_symbolic_operand (rtx op)
725 if (GET_CODE (op) != SYMBOL_REF)
726 return 0;
727 return SYMBOL_REF_TLS_MODEL (op);
731 tgd_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
733 return tls_symbolic_operand (op) == TLS_MODEL_GLOBAL_DYNAMIC;
737 tld_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
739 return tls_symbolic_operand (op) == TLS_MODEL_LOCAL_DYNAMIC;
743 tie_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
745 return tls_symbolic_operand (op) == TLS_MODEL_INITIAL_EXEC;
749 tle_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
751 return tls_symbolic_operand (op) == TLS_MODEL_LOCAL_EXEC;
754 /* Returns 1 if OP is either a symbol reference or a sum of a symbol
755 reference and a constant. */
758 symbolic_operand (register rtx op, enum machine_mode mode)
760 enum machine_mode omode = GET_MODE (op);
762 if (omode != mode && omode != VOIDmode && mode != VOIDmode)
763 return 0;
765 switch (GET_CODE (op))
767 case SYMBOL_REF:
768 return !SYMBOL_REF_TLS_MODEL (op);
770 case LABEL_REF:
771 return 1;
773 case CONST:
774 op = XEXP (op, 0);
775 return (((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
776 && !SYMBOL_REF_TLS_MODEL (XEXP (op, 0)))
777 || GET_CODE (XEXP (op, 0)) == LABEL_REF)
778 && GET_CODE (XEXP (op, 1)) == CONST_INT);
780 default:
781 return 0;
785 /* Return truth value of statement that OP is a symbolic memory
786 operand of mode MODE. */
789 symbolic_memory_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
791 if (GET_CODE (op) == SUBREG)
792 op = SUBREG_REG (op);
793 if (GET_CODE (op) != MEM)
794 return 0;
795 op = XEXP (op, 0);
796 return ((GET_CODE (op) == SYMBOL_REF && !SYMBOL_REF_TLS_MODEL (op))
797 || GET_CODE (op) == CONST || GET_CODE (op) == HIGH
798 || GET_CODE (op) == LABEL_REF);
801 /* Return truth value of statement that OP is a LABEL_REF of mode MODE. */
804 label_ref_operand (rtx op, enum machine_mode mode)
806 if (GET_CODE (op) != LABEL_REF)
807 return 0;
808 if (GET_MODE (op) != mode)
809 return 0;
810 return 1;
813 /* Return 1 if the operand is an argument used in generating pic references
814 in either the medium/low or medium/anywhere code models of sparc64. */
817 sp64_medium_pic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
819 /* Check for (const (minus (symbol_ref:GOT)
820 (const (minus (label) (pc))))). */
821 if (GET_CODE (op) != CONST)
822 return 0;
823 op = XEXP (op, 0);
824 if (GET_CODE (op) != MINUS)
825 return 0;
826 if (GET_CODE (XEXP (op, 0)) != SYMBOL_REF)
827 return 0;
828 /* ??? Ensure symbol is GOT. */
829 if (GET_CODE (XEXP (op, 1)) != CONST)
830 return 0;
831 if (GET_CODE (XEXP (XEXP (op, 1), 0)) != MINUS)
832 return 0;
833 return 1;
836 /* Return 1 if the operand is a data segment reference. This includes
837 the readonly data segment, or in other words anything but the text segment.
838 This is needed in the medium/anywhere code model on v9. These values
839 are accessed with EMBMEDANY_BASE_REG. */
842 data_segment_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
844 switch (GET_CODE (op))
846 case SYMBOL_REF :
847 return ! SYMBOL_REF_FUNCTION_P (op);
848 case PLUS :
849 /* Assume canonical format of symbol + constant.
850 Fall through. */
851 case CONST :
852 return data_segment_operand (XEXP (op, 0), VOIDmode);
853 default :
854 return 0;
858 /* Return 1 if the operand is a text segment reference.
859 This is needed in the medium/anywhere code model on v9. */
862 text_segment_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
864 switch (GET_CODE (op))
866 case LABEL_REF :
867 return 1;
868 case SYMBOL_REF :
869 return SYMBOL_REF_FUNCTION_P (op);
870 case PLUS :
871 /* Assume canonical format of symbol + constant.
872 Fall through. */
873 case CONST :
874 return text_segment_operand (XEXP (op, 0), VOIDmode);
875 default :
876 return 0;
880 /* Return 1 if the operand is either a register or a memory operand that is
881 not symbolic. */
884 reg_or_nonsymb_mem_operand (register rtx op, enum machine_mode mode)
886 if (register_operand (op, mode))
887 return 1;
889 if (memory_operand (op, mode) && ! symbolic_memory_operand (op, mode))
890 return 1;
892 return 0;
896 splittable_symbolic_memory_operand (rtx op,
897 enum machine_mode mode ATTRIBUTE_UNUSED)
899 if (GET_CODE (op) != MEM)
900 return 0;
901 if (! symbolic_operand (XEXP (op, 0), Pmode))
902 return 0;
903 return 1;
907 splittable_immediate_memory_operand (rtx op,
908 enum machine_mode mode ATTRIBUTE_UNUSED)
910 if (GET_CODE (op) != MEM)
911 return 0;
912 if (! immediate_operand (XEXP (op, 0), Pmode))
913 return 0;
914 return 1;
917 /* Return truth value of whether OP is EQ or NE. */
920 eq_or_neq (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
922 return (GET_CODE (op) == EQ || GET_CODE (op) == NE);
925 /* Return 1 if this is a comparison operator, but not an EQ, NE, GEU,
926 or LTU for non-floating-point. We handle those specially. */
929 normal_comp_operator (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
931 enum rtx_code code = GET_CODE (op);
933 if (GET_RTX_CLASS (code) != '<')
934 return 0;
936 if (GET_MODE (XEXP (op, 0)) == CCFPmode
937 || GET_MODE (XEXP (op, 0)) == CCFPEmode)
938 return 1;
940 return (code != NE && code != EQ && code != GEU && code != LTU);
943 /* Return 1 if this is a comparison operator. This allows the use of
944 MATCH_OPERATOR to recognize all the branch insns. */
947 noov_compare_op (register rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
949 enum rtx_code code = GET_CODE (op);
951 if (GET_RTX_CLASS (code) != '<')
952 return 0;
954 if (GET_MODE (XEXP (op, 0)) == CC_NOOVmode
955 || GET_MODE (XEXP (op, 0)) == CCX_NOOVmode)
956 /* These are the only branches which work with CC_NOOVmode. */
957 return (code == EQ || code == NE || code == GE || code == LT);
958 return 1;
961 /* Return 1 if this is a 64-bit comparison operator. This allows the use of
962 MATCH_OPERATOR to recognize all the branch insns. */
965 noov_compare64_op (register rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
967 enum rtx_code code = GET_CODE (op);
969 if (! TARGET_V9)
970 return 0;
972 if (GET_RTX_CLASS (code) != '<')
973 return 0;
975 if (GET_MODE (XEXP (op, 0)) == CCX_NOOVmode)
976 /* These are the only branches which work with CCX_NOOVmode. */
977 return (code == EQ || code == NE || code == GE || code == LT);
978 return (GET_MODE (XEXP (op, 0)) == CCXmode);
981 /* Nonzero if OP is a comparison operator suitable for use in v9
982 conditional move or branch on register contents instructions. */
985 v9_regcmp_op (register rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
987 enum rtx_code code = GET_CODE (op);
989 if (GET_RTX_CLASS (code) != '<')
990 return 0;
992 return v9_regcmp_p (code);
995 /* Return 1 if this is a SIGN_EXTEND or ZERO_EXTEND operation. */
998 extend_op (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1000 return GET_CODE (op) == SIGN_EXTEND || GET_CODE (op) == ZERO_EXTEND;
1003 /* Return nonzero if OP is an operator of mode MODE which can set
1004 the condition codes explicitly. We do not include PLUS and MINUS
1005 because these require CC_NOOVmode, which we handle explicitly. */
1008 cc_arithop (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1010 if (GET_CODE (op) == AND
1011 || GET_CODE (op) == IOR
1012 || GET_CODE (op) == XOR)
1013 return 1;
1015 return 0;
1018 /* Return nonzero if OP is an operator of mode MODE which can bitwise
1019 complement its second operand and set the condition codes explicitly. */
1022 cc_arithopn (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1024 /* XOR is not here because combine canonicalizes (xor (not ...) ...)
1025 and (xor ... (not ...)) to (not (xor ...)). */
1026 return (GET_CODE (op) == AND
1027 || GET_CODE (op) == IOR);
1030 /* Return true if OP is a register, or is a CONST_INT that can fit in a
1031 signed 13 bit immediate field. This is an acceptable SImode operand for
1032 most 3 address instructions. */
1035 arith_operand (rtx op, enum machine_mode mode)
1037 if (register_operand (op, mode))
1038 return 1;
1039 if (GET_CODE (op) != CONST_INT)
1040 return 0;
1041 return SMALL_INT32 (op);
1044 /* Return true if OP is a constant 4096 */
1047 arith_4096_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1049 if (GET_CODE (op) != CONST_INT)
1050 return 0;
1051 else
1052 return INTVAL (op) == 4096;
1055 /* Return true if OP is suitable as second operand for add/sub */
1058 arith_add_operand (rtx op, enum machine_mode mode)
1060 return arith_operand (op, mode) || arith_4096_operand (op, mode);
1063 /* Return true if OP is a CONST_INT or a CONST_DOUBLE which can fit in the
1064 immediate field of OR and XOR instructions. Used for 64-bit
1065 constant formation patterns. */
1067 const64_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1069 return ((GET_CODE (op) == CONST_INT
1070 && SPARC_SIMM13_P (INTVAL (op)))
1071 #if HOST_BITS_PER_WIDE_INT != 64
1072 || (GET_CODE (op) == CONST_DOUBLE
1073 && SPARC_SIMM13_P (CONST_DOUBLE_LOW (op))
1074 && (CONST_DOUBLE_HIGH (op) ==
1075 ((CONST_DOUBLE_LOW (op) & 0x80000000) != 0 ?
1076 (HOST_WIDE_INT)-1 : 0)))
1077 #endif
1081 /* The same, but only for sethi instructions. */
1083 const64_high_operand (rtx op, enum machine_mode mode)
1085 return ((GET_CODE (op) == CONST_INT
1086 && (INTVAL (op) & ~(HOST_WIDE_INT)0x3ff) != 0
1087 && SPARC_SETHI_P (INTVAL (op) & GET_MODE_MASK (mode))
1089 || (GET_CODE (op) == CONST_DOUBLE
1090 && CONST_DOUBLE_HIGH (op) == 0
1091 && (CONST_DOUBLE_LOW (op) & ~(HOST_WIDE_INT)0x3ff) != 0
1092 && SPARC_SETHI_P (CONST_DOUBLE_LOW (op))));
1095 /* Return true if OP is a register, or is a CONST_INT that can fit in a
1096 signed 11 bit immediate field. This is an acceptable SImode operand for
1097 the movcc instructions. */
1100 arith11_operand (rtx op, enum machine_mode mode)
1102 return (register_operand (op, mode)
1103 || (GET_CODE (op) == CONST_INT && SPARC_SIMM11_P (INTVAL (op))));
1106 /* Return true if OP is a register, or is a CONST_INT that can fit in a
1107 signed 10 bit immediate field. This is an acceptable SImode operand for
1108 the movrcc instructions. */
1111 arith10_operand (rtx op, enum machine_mode mode)
1113 return (register_operand (op, mode)
1114 || (GET_CODE (op) == CONST_INT && SPARC_SIMM10_P (INTVAL (op))));
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
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. */
1125 arith_double_operand (rtx op, enum machine_mode mode)
1127 return (register_operand (op, mode)
1128 || (GET_CODE (op) == CONST_INT && SMALL_INT (op))
1129 || (! TARGET_ARCH64
1130 && GET_CODE (op) == CONST_DOUBLE
1131 && (unsigned HOST_WIDE_INT) (CONST_DOUBLE_LOW (op) + 0x1000) < 0x2000
1132 && (unsigned HOST_WIDE_INT) (CONST_DOUBLE_HIGH (op) + 0x1000) < 0x2000)
1133 || (TARGET_ARCH64
1134 && GET_CODE (op) == CONST_DOUBLE
1135 && (unsigned HOST_WIDE_INT) (CONST_DOUBLE_LOW (op) + 0x1000) < 0x2000
1136 && ((CONST_DOUBLE_HIGH (op) == -1
1137 && (CONST_DOUBLE_LOW (op) & 0x1000) == 0x1000)
1138 || (CONST_DOUBLE_HIGH (op) == 0
1139 && (CONST_DOUBLE_LOW (op) & 0x1000) == 0))));
1142 /* Return true if OP is a constant 4096 for DImode on ARCH64 */
1145 arith_double_4096_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1147 return (TARGET_ARCH64 &&
1148 ((GET_CODE (op) == CONST_INT && INTVAL (op) == 4096) ||
1149 (GET_CODE (op) == CONST_DOUBLE &&
1150 CONST_DOUBLE_LOW (op) == 4096 &&
1151 CONST_DOUBLE_HIGH (op) == 0)));
1154 /* Return true if OP is suitable as second operand for add/sub in DImode */
1157 arith_double_add_operand (rtx op, enum machine_mode mode)
1159 return arith_double_operand (op, mode) || arith_double_4096_operand (op, mode);
1162 /* Return true if OP is a register, or is a CONST_INT or CONST_DOUBLE that
1163 can fit in an 11 bit immediate field. This is an acceptable DImode
1164 operand for the movcc instructions. */
1165 /* ??? Replace with arith11_operand? */
1168 arith11_double_operand (rtx op, enum machine_mode mode)
1170 return (register_operand (op, mode)
1171 || (GET_CODE (op) == CONST_DOUBLE
1172 && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
1173 && (unsigned HOST_WIDE_INT) (CONST_DOUBLE_LOW (op) + 0x400) < 0x800
1174 && ((CONST_DOUBLE_HIGH (op) == -1
1175 && (CONST_DOUBLE_LOW (op) & 0x400) == 0x400)
1176 || (CONST_DOUBLE_HIGH (op) == 0
1177 && (CONST_DOUBLE_LOW (op) & 0x400) == 0)))
1178 || (GET_CODE (op) == CONST_INT
1179 && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
1180 && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x400) < 0x800));
1183 /* Return true if OP is a register, or is a CONST_INT or CONST_DOUBLE that
1184 can fit in an 10 bit immediate field. This is an acceptable DImode
1185 operand for the movrcc instructions. */
1186 /* ??? Replace with arith10_operand? */
1189 arith10_double_operand (rtx op, enum machine_mode mode)
1191 return (register_operand (op, mode)
1192 || (GET_CODE (op) == CONST_DOUBLE
1193 && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
1194 && (unsigned) (CONST_DOUBLE_LOW (op) + 0x200) < 0x400
1195 && ((CONST_DOUBLE_HIGH (op) == -1
1196 && (CONST_DOUBLE_LOW (op) & 0x200) == 0x200)
1197 || (CONST_DOUBLE_HIGH (op) == 0
1198 && (CONST_DOUBLE_LOW (op) & 0x200) == 0)))
1199 || (GET_CODE (op) == CONST_INT
1200 && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
1201 && (unsigned HOST_WIDE_INT) (INTVAL (op) + 0x200) < 0x400));
1204 /* Return truth value of whether OP is an integer which fits the
1205 range constraining immediate operands in most three-address insns,
1206 which have a 13 bit immediate field. */
1209 small_int (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1211 return (GET_CODE (op) == CONST_INT && SMALL_INT (op));
1215 small_int_or_double (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1217 return ((GET_CODE (op) == CONST_INT && SMALL_INT (op))
1218 || (GET_CODE (op) == CONST_DOUBLE
1219 && CONST_DOUBLE_HIGH (op) == 0
1220 && SPARC_SIMM13_P (CONST_DOUBLE_LOW (op))));
1223 /* Recognize operand values for the umul instruction. That instruction sign
1224 extends immediate values just like all other sparc instructions, but
1225 interprets the extended result as an unsigned number. */
1228 uns_small_int (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1230 #if HOST_BITS_PER_WIDE_INT > 32
1231 /* All allowed constants will fit a CONST_INT. */
1232 return (GET_CODE (op) == CONST_INT
1233 && ((INTVAL (op) >= 0 && INTVAL (op) < 0x1000)
1234 || (INTVAL (op) >= 0xFFFFF000
1235 && INTVAL (op) <= 0xFFFFFFFF)));
1236 #else
1237 return ((GET_CODE (op) == CONST_INT && (unsigned) INTVAL (op) < 0x1000)
1238 || (GET_CODE (op) == CONST_DOUBLE
1239 && CONST_DOUBLE_HIGH (op) == 0
1240 && (unsigned) CONST_DOUBLE_LOW (op) - 0xFFFFF000 < 0x1000));
1241 #endif
1245 uns_arith_operand (rtx op, enum machine_mode mode)
1247 return register_operand (op, mode) || uns_small_int (op, mode);
1250 /* Return truth value of statement that OP is a call-clobbered register. */
1252 clobbered_register (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1254 return (GET_CODE (op) == REG && call_used_regs[REGNO (op)]);
1257 /* Return 1 if OP is a valid operand for the source of a move insn. */
1260 input_operand (rtx op, enum machine_mode mode)
1262 /* If both modes are non-void they must be the same. */
1263 if (mode != VOIDmode && GET_MODE (op) != VOIDmode && mode != GET_MODE (op))
1264 return 0;
1266 /* Accept CONSTANT_P_RTX, since it will be gone by CSE1 and result in 0/1. */
1267 if (GET_CODE (op) == CONSTANT_P_RTX)
1268 return 1;
1270 /* Allow any one instruction integer constant, and all CONST_INT
1271 variants when we are working in DImode and !arch64. */
1272 if (GET_MODE_CLASS (mode) == MODE_INT
1273 && ((GET_CODE (op) == CONST_INT
1274 && (SPARC_SETHI_P (INTVAL (op) & GET_MODE_MASK (mode))
1275 || SPARC_SIMM13_P (INTVAL (op))
1276 || (mode == DImode
1277 && ! TARGET_ARCH64)))
1278 || (TARGET_ARCH64
1279 && GET_CODE (op) == CONST_DOUBLE
1280 && ((CONST_DOUBLE_HIGH (op) == 0
1281 && SPARC_SETHI_P (CONST_DOUBLE_LOW (op)))
1283 #if HOST_BITS_PER_WIDE_INT == 64
1284 (CONST_DOUBLE_HIGH (op) == 0
1285 && SPARC_SIMM13_P (CONST_DOUBLE_LOW (op)))
1286 #else
1287 (SPARC_SIMM13_P (CONST_DOUBLE_LOW (op))
1288 && (((CONST_DOUBLE_LOW (op) & 0x80000000) == 0
1289 && CONST_DOUBLE_HIGH (op) == 0)
1290 || (CONST_DOUBLE_HIGH (op) == -1
1291 && CONST_DOUBLE_LOW (op) & 0x80000000) != 0))
1292 #endif
1293 ))))
1294 return 1;
1296 /* If !arch64 and this is a DImode const, allow it so that
1297 the splits can be generated. */
1298 if (! TARGET_ARCH64
1299 && mode == DImode
1300 && GET_CODE (op) == CONST_DOUBLE)
1301 return 1;
1303 if (register_operand (op, mode))
1304 return 1;
1306 if (GET_MODE_CLASS (mode) == MODE_FLOAT
1307 && GET_CODE (op) == CONST_DOUBLE)
1308 return 1;
1310 /* If this is a SUBREG, look inside so that we handle
1311 paradoxical ones. */
1312 if (GET_CODE (op) == SUBREG)
1313 op = SUBREG_REG (op);
1315 /* Check for valid MEM forms. */
1316 if (GET_CODE (op) == MEM)
1318 rtx inside = XEXP (op, 0);
1320 if (GET_CODE (inside) == LO_SUM)
1322 /* We can't allow these because all of the splits
1323 (eventually as they trickle down into DFmode
1324 splits) require offsettable memory references. */
1325 if (! TARGET_V9
1326 && GET_MODE (op) == TFmode)
1327 return 0;
1329 return (register_operand (XEXP (inside, 0), Pmode)
1330 && CONSTANT_P (XEXP (inside, 1)));
1332 return memory_address_p (mode, inside);
1335 return 0;
1339 /* We know it can't be done in one insn when we get here,
1340 the movsi expander guarantees this. */
1341 void
1342 sparc_emit_set_const32 (rtx op0, rtx op1)
1344 enum machine_mode mode = GET_MODE (op0);
1345 rtx temp;
1347 if (GET_CODE (op1) == CONST_INT)
1349 HOST_WIDE_INT value = INTVAL (op1);
1351 if (SPARC_SETHI_P (value & GET_MODE_MASK (mode))
1352 || SPARC_SIMM13_P (value))
1353 abort ();
1356 /* Full 2-insn decomposition is needed. */
1357 if (reload_in_progress || reload_completed)
1358 temp = op0;
1359 else
1360 temp = gen_reg_rtx (mode);
1362 if (GET_CODE (op1) == CONST_INT)
1364 /* Emit them as real moves instead of a HIGH/LO_SUM,
1365 this way CSE can see everything and reuse intermediate
1366 values if it wants. */
1367 if (TARGET_ARCH64
1368 && HOST_BITS_PER_WIDE_INT != 64
1369 && (INTVAL (op1) & 0x80000000) != 0)
1370 emit_insn (gen_rtx_SET
1371 (VOIDmode, temp,
1372 immed_double_const (INTVAL (op1) & ~(HOST_WIDE_INT)0x3ff,
1373 0, DImode)));
1374 else
1375 emit_insn (gen_rtx_SET (VOIDmode, temp,
1376 GEN_INT (INTVAL (op1)
1377 & ~(HOST_WIDE_INT)0x3ff)));
1379 emit_insn (gen_rtx_SET (VOIDmode,
1380 op0,
1381 gen_rtx_IOR (mode, temp,
1382 GEN_INT (INTVAL (op1) & 0x3ff))));
1384 else
1386 /* A symbol, emit in the traditional way. */
1387 emit_insn (gen_rtx_SET (VOIDmode, temp,
1388 gen_rtx_HIGH (mode, op1)));
1389 emit_insn (gen_rtx_SET (VOIDmode,
1390 op0, gen_rtx_LO_SUM (mode, temp, op1)));
1396 /* SPARC-v9 code-model support. */
1397 void
1398 sparc_emit_set_symbolic_const64 (rtx op0, rtx op1, rtx temp1)
1400 rtx ti_temp1 = 0;
1402 if (temp1 && GET_MODE (temp1) == TImode)
1404 ti_temp1 = temp1;
1405 temp1 = gen_rtx_REG (DImode, REGNO (temp1));
1408 switch (sparc_cmodel)
1410 case CM_MEDLOW:
1411 /* The range spanned by all instructions in the object is less
1412 than 2^31 bytes (2GB) and the distance from any instruction
1413 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1414 than 2^31 bytes (2GB).
1416 The executable must be in the low 4TB of the virtual address
1417 space.
1419 sethi %hi(symbol), %temp
1420 or %temp, %lo(symbol), %reg */
1421 emit_insn (gen_rtx_SET (VOIDmode, temp1, gen_rtx_HIGH (DImode, op1)));
1422 emit_insn (gen_rtx_SET (VOIDmode, op0, gen_rtx_LO_SUM (DImode, temp1, op1)));
1423 break;
1425 case CM_MEDMID:
1426 /* The range spanned by all instructions in the object is less
1427 than 2^31 bytes (2GB) and the distance from any instruction
1428 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1429 than 2^31 bytes (2GB).
1431 The executable must be in the low 16TB of the virtual address
1432 space.
1434 sethi %h44(symbol), %temp1
1435 or %temp1, %m44(symbol), %temp2
1436 sllx %temp2, 12, %temp3
1437 or %temp3, %l44(symbol), %reg */
1438 emit_insn (gen_seth44 (op0, op1));
1439 emit_insn (gen_setm44 (op0, op0, op1));
1440 emit_insn (gen_rtx_SET (VOIDmode, temp1,
1441 gen_rtx_ASHIFT (DImode, op0, GEN_INT (12))));
1442 emit_insn (gen_setl44 (op0, temp1, op1));
1443 break;
1445 case CM_MEDANY:
1446 /* The range spanned by all instructions in the object is less
1447 than 2^31 bytes (2GB) and the distance from any instruction
1448 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1449 than 2^31 bytes (2GB).
1451 The executable can be placed anywhere in the virtual address
1452 space.
1454 sethi %hh(symbol), %temp1
1455 sethi %lm(symbol), %temp2
1456 or %temp1, %hm(symbol), %temp3
1457 or %temp2, %lo(symbol), %temp4
1458 sllx %temp3, 32, %temp5
1459 or %temp4, %temp5, %reg */
1461 /* It is possible that one of the registers we got for operands[2]
1462 might coincide with that of operands[0] (which is why we made
1463 it TImode). Pick the other one to use as our scratch. */
1464 if (rtx_equal_p (temp1, op0))
1466 if (ti_temp1)
1467 temp1 = gen_rtx_REG (DImode, REGNO (temp1) + 1);
1468 else
1469 abort();
1472 emit_insn (gen_sethh (op0, op1));
1473 emit_insn (gen_setlm (temp1, op1));
1474 emit_insn (gen_sethm (op0, op0, op1));
1475 emit_insn (gen_rtx_SET (VOIDmode, op0,
1476 gen_rtx_ASHIFT (DImode, op0, GEN_INT (32))));
1477 emit_insn (gen_rtx_SET (VOIDmode, op0,
1478 gen_rtx_PLUS (DImode, op0, temp1)));
1479 emit_insn (gen_setlo (op0, op0, op1));
1480 break;
1482 case CM_EMBMEDANY:
1483 /* Old old old backwards compatibility kruft here.
1484 Essentially it is MEDLOW with a fixed 64-bit
1485 virtual base added to all data segment addresses.
1486 Text-segment stuff is computed like MEDANY, we can't
1487 reuse the code above because the relocation knobs
1488 look different.
1490 Data segment: sethi %hi(symbol), %temp1
1491 or %temp1, %lo(symbol), %temp2
1492 add %temp2, EMBMEDANY_BASE_REG, %reg
1494 Text segment: sethi %uhi(symbol), %temp1
1495 sethi %hi(symbol), %temp2
1496 or %temp1, %ulo(symbol), %temp3
1497 or %temp2, %lo(symbol), %temp4
1498 sllx %temp3, 32, %temp5
1499 or %temp4, %temp5, %reg */
1500 if (data_segment_operand (op1, GET_MODE (op1)))
1502 emit_insn (gen_embmedany_sethi (temp1, op1));
1503 emit_insn (gen_embmedany_brsum (op0, temp1));
1504 emit_insn (gen_embmedany_losum (op0, op0, op1));
1506 else
1508 /* It is possible that one of the registers we got for operands[2]
1509 might coincide with that of operands[0] (which is why we made
1510 it TImode). Pick the other one to use as our scratch. */
1511 if (rtx_equal_p (temp1, op0))
1513 if (ti_temp1)
1514 temp1 = gen_rtx_REG (DImode, REGNO (temp1) + 1);
1515 else
1516 abort();
1519 emit_insn (gen_embmedany_textuhi (op0, op1));
1520 emit_insn (gen_embmedany_texthi (temp1, op1));
1521 emit_insn (gen_embmedany_textulo (op0, op0, op1));
1522 emit_insn (gen_rtx_SET (VOIDmode, op0,
1523 gen_rtx_ASHIFT (DImode, op0, GEN_INT (32))));
1524 emit_insn (gen_rtx_SET (VOIDmode, op0,
1525 gen_rtx_PLUS (DImode, op0, temp1)));
1526 emit_insn (gen_embmedany_textlo (op0, op0, op1));
1528 break;
1530 default:
1531 abort();
1535 /* These avoid problems when cross compiling. If we do not
1536 go through all this hair then the optimizer will see
1537 invalid REG_EQUAL notes or in some cases none at all. */
1538 static void sparc_emit_set_safe_HIGH64 (rtx, HOST_WIDE_INT);
1539 static rtx gen_safe_SET64 (rtx, HOST_WIDE_INT);
1540 static rtx gen_safe_OR64 (rtx, HOST_WIDE_INT);
1541 static rtx gen_safe_XOR64 (rtx, HOST_WIDE_INT);
1543 #if HOST_BITS_PER_WIDE_INT == 64
1544 #define GEN_HIGHINT64(__x) GEN_INT ((__x) & ~(HOST_WIDE_INT)0x3ff)
1545 #define GEN_INT64(__x) GEN_INT (__x)
1546 #else
1547 #define GEN_HIGHINT64(__x) \
1548 immed_double_const ((__x) & ~(HOST_WIDE_INT)0x3ff, 0, DImode)
1549 #define GEN_INT64(__x) \
1550 immed_double_const ((__x) & 0xffffffff, \
1551 ((__x) & 0x80000000 ? -1 : 0), DImode)
1552 #endif
1554 /* The optimizer is not to assume anything about exactly
1555 which bits are set for a HIGH, they are unspecified.
1556 Unfortunately this leads to many missed optimizations
1557 during CSE. We mask out the non-HIGH bits, and matches
1558 a plain movdi, to alleviate this problem. */
1559 static void
1560 sparc_emit_set_safe_HIGH64 (rtx dest, HOST_WIDE_INT val)
1562 emit_insn (gen_rtx_SET (VOIDmode, dest, GEN_HIGHINT64 (val)));
1565 static rtx
1566 gen_safe_SET64 (rtx dest, HOST_WIDE_INT val)
1568 return gen_rtx_SET (VOIDmode, dest, GEN_INT64 (val));
1571 static rtx
1572 gen_safe_OR64 (rtx src, HOST_WIDE_INT val)
1574 return gen_rtx_IOR (DImode, src, GEN_INT64 (val));
1577 static rtx
1578 gen_safe_XOR64 (rtx src, HOST_WIDE_INT val)
1580 return gen_rtx_XOR (DImode, src, GEN_INT64 (val));
1583 /* Worker routines for 64-bit constant formation on arch64.
1584 One of the key things to be doing in these emissions is
1585 to create as many temp REGs as possible. This makes it
1586 possible for half-built constants to be used later when
1587 such values are similar to something required later on.
1588 Without doing this, the optimizer cannot see such
1589 opportunities. */
1591 static void sparc_emit_set_const64_quick1 (rtx, rtx,
1592 unsigned HOST_WIDE_INT, int);
1594 static void
1595 sparc_emit_set_const64_quick1 (rtx op0, rtx temp,
1596 unsigned HOST_WIDE_INT low_bits, int is_neg)
1598 unsigned HOST_WIDE_INT high_bits;
1600 if (is_neg)
1601 high_bits = (~low_bits) & 0xffffffff;
1602 else
1603 high_bits = low_bits;
1605 sparc_emit_set_safe_HIGH64 (temp, high_bits);
1606 if (!is_neg)
1608 emit_insn (gen_rtx_SET (VOIDmode, op0,
1609 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
1611 else
1613 /* If we are XOR'ing with -1, then we should emit a one's complement
1614 instead. This way the combiner will notice logical operations
1615 such as ANDN later on and substitute. */
1616 if ((low_bits & 0x3ff) == 0x3ff)
1618 emit_insn (gen_rtx_SET (VOIDmode, op0,
1619 gen_rtx_NOT (DImode, temp)));
1621 else
1623 emit_insn (gen_rtx_SET (VOIDmode, op0,
1624 gen_safe_XOR64 (temp,
1625 (-(HOST_WIDE_INT)0x400
1626 | (low_bits & 0x3ff)))));
1631 static void sparc_emit_set_const64_quick2 (rtx, rtx, unsigned HOST_WIDE_INT,
1632 unsigned HOST_WIDE_INT, int);
1634 static void
1635 sparc_emit_set_const64_quick2 (rtx op0, rtx temp,
1636 unsigned HOST_WIDE_INT high_bits,
1637 unsigned HOST_WIDE_INT low_immediate,
1638 int shift_count)
1640 rtx temp2 = op0;
1642 if ((high_bits & 0xfffffc00) != 0)
1644 sparc_emit_set_safe_HIGH64 (temp, high_bits);
1645 if ((high_bits & ~0xfffffc00) != 0)
1646 emit_insn (gen_rtx_SET (VOIDmode, op0,
1647 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
1648 else
1649 temp2 = temp;
1651 else
1653 emit_insn (gen_safe_SET64 (temp, high_bits));
1654 temp2 = temp;
1657 /* Now shift it up into place. */
1658 emit_insn (gen_rtx_SET (VOIDmode, op0,
1659 gen_rtx_ASHIFT (DImode, temp2,
1660 GEN_INT (shift_count))));
1662 /* If there is a low immediate part piece, finish up by
1663 putting that in as well. */
1664 if (low_immediate != 0)
1665 emit_insn (gen_rtx_SET (VOIDmode, op0,
1666 gen_safe_OR64 (op0, low_immediate)));
1669 static void sparc_emit_set_const64_longway (rtx, rtx, unsigned HOST_WIDE_INT,
1670 unsigned HOST_WIDE_INT);
1672 /* Full 64-bit constant decomposition. Even though this is the
1673 'worst' case, we still optimize a few things away. */
1674 static void
1675 sparc_emit_set_const64_longway (rtx op0, rtx temp,
1676 unsigned HOST_WIDE_INT high_bits,
1677 unsigned HOST_WIDE_INT low_bits)
1679 rtx sub_temp;
1681 if (reload_in_progress || reload_completed)
1682 sub_temp = op0;
1683 else
1684 sub_temp = gen_reg_rtx (DImode);
1686 if ((high_bits & 0xfffffc00) != 0)
1688 sparc_emit_set_safe_HIGH64 (temp, high_bits);
1689 if ((high_bits & ~0xfffffc00) != 0)
1690 emit_insn (gen_rtx_SET (VOIDmode,
1691 sub_temp,
1692 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
1693 else
1694 sub_temp = temp;
1696 else
1698 emit_insn (gen_safe_SET64 (temp, high_bits));
1699 sub_temp = temp;
1702 if (!reload_in_progress && !reload_completed)
1704 rtx temp2 = gen_reg_rtx (DImode);
1705 rtx temp3 = gen_reg_rtx (DImode);
1706 rtx temp4 = gen_reg_rtx (DImode);
1708 emit_insn (gen_rtx_SET (VOIDmode, temp4,
1709 gen_rtx_ASHIFT (DImode, sub_temp,
1710 GEN_INT (32))));
1712 sparc_emit_set_safe_HIGH64 (temp2, low_bits);
1713 if ((low_bits & ~0xfffffc00) != 0)
1715 emit_insn (gen_rtx_SET (VOIDmode, temp3,
1716 gen_safe_OR64 (temp2, (low_bits & 0x3ff))));
1717 emit_insn (gen_rtx_SET (VOIDmode, op0,
1718 gen_rtx_PLUS (DImode, temp4, temp3)));
1720 else
1722 emit_insn (gen_rtx_SET (VOIDmode, op0,
1723 gen_rtx_PLUS (DImode, temp4, temp2)));
1726 else
1728 rtx low1 = GEN_INT ((low_bits >> (32 - 12)) & 0xfff);
1729 rtx low2 = GEN_INT ((low_bits >> (32 - 12 - 12)) & 0xfff);
1730 rtx low3 = GEN_INT ((low_bits >> (32 - 12 - 12 - 8)) & 0x0ff);
1731 int to_shift = 12;
1733 /* We are in the middle of reload, so this is really
1734 painful. However we do still make an attempt to
1735 avoid emitting truly stupid code. */
1736 if (low1 != const0_rtx)
1738 emit_insn (gen_rtx_SET (VOIDmode, op0,
1739 gen_rtx_ASHIFT (DImode, sub_temp,
1740 GEN_INT (to_shift))));
1741 emit_insn (gen_rtx_SET (VOIDmode, op0,
1742 gen_rtx_IOR (DImode, op0, low1)));
1743 sub_temp = op0;
1744 to_shift = 12;
1746 else
1748 to_shift += 12;
1750 if (low2 != const0_rtx)
1752 emit_insn (gen_rtx_SET (VOIDmode, op0,
1753 gen_rtx_ASHIFT (DImode, sub_temp,
1754 GEN_INT (to_shift))));
1755 emit_insn (gen_rtx_SET (VOIDmode, op0,
1756 gen_rtx_IOR (DImode, op0, low2)));
1757 sub_temp = op0;
1758 to_shift = 8;
1760 else
1762 to_shift += 8;
1764 emit_insn (gen_rtx_SET (VOIDmode, op0,
1765 gen_rtx_ASHIFT (DImode, sub_temp,
1766 GEN_INT (to_shift))));
1767 if (low3 != const0_rtx)
1768 emit_insn (gen_rtx_SET (VOIDmode, op0,
1769 gen_rtx_IOR (DImode, op0, low3)));
1770 /* phew... */
1774 /* Analyze a 64-bit constant for certain properties. */
1775 static void analyze_64bit_constant (unsigned HOST_WIDE_INT,
1776 unsigned HOST_WIDE_INT,
1777 int *, int *, int *);
1779 static void
1780 analyze_64bit_constant (unsigned HOST_WIDE_INT high_bits,
1781 unsigned HOST_WIDE_INT low_bits,
1782 int *hbsp, int *lbsp, int *abbasp)
1784 int lowest_bit_set, highest_bit_set, all_bits_between_are_set;
1785 int i;
1787 lowest_bit_set = highest_bit_set = -1;
1788 i = 0;
1791 if ((lowest_bit_set == -1)
1792 && ((low_bits >> i) & 1))
1793 lowest_bit_set = i;
1794 if ((highest_bit_set == -1)
1795 && ((high_bits >> (32 - i - 1)) & 1))
1796 highest_bit_set = (64 - i - 1);
1798 while (++i < 32
1799 && ((highest_bit_set == -1)
1800 || (lowest_bit_set == -1)));
1801 if (i == 32)
1803 i = 0;
1806 if ((lowest_bit_set == -1)
1807 && ((high_bits >> i) & 1))
1808 lowest_bit_set = i + 32;
1809 if ((highest_bit_set == -1)
1810 && ((low_bits >> (32 - i - 1)) & 1))
1811 highest_bit_set = 32 - i - 1;
1813 while (++i < 32
1814 && ((highest_bit_set == -1)
1815 || (lowest_bit_set == -1)));
1817 /* If there are no bits set this should have gone out
1818 as one instruction! */
1819 if (lowest_bit_set == -1
1820 || highest_bit_set == -1)
1821 abort ();
1822 all_bits_between_are_set = 1;
1823 for (i = lowest_bit_set; i <= highest_bit_set; i++)
1825 if (i < 32)
1827 if ((low_bits & (1 << i)) != 0)
1828 continue;
1830 else
1832 if ((high_bits & (1 << (i - 32))) != 0)
1833 continue;
1835 all_bits_between_are_set = 0;
1836 break;
1838 *hbsp = highest_bit_set;
1839 *lbsp = lowest_bit_set;
1840 *abbasp = all_bits_between_are_set;
1843 static int const64_is_2insns (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
1845 static int
1846 const64_is_2insns (unsigned HOST_WIDE_INT high_bits,
1847 unsigned HOST_WIDE_INT low_bits)
1849 int highest_bit_set, lowest_bit_set, all_bits_between_are_set;
1851 if (high_bits == 0
1852 || high_bits == 0xffffffff)
1853 return 1;
1855 analyze_64bit_constant (high_bits, low_bits,
1856 &highest_bit_set, &lowest_bit_set,
1857 &all_bits_between_are_set);
1859 if ((highest_bit_set == 63
1860 || lowest_bit_set == 0)
1861 && all_bits_between_are_set != 0)
1862 return 1;
1864 if ((highest_bit_set - lowest_bit_set) < 21)
1865 return 1;
1867 return 0;
1870 static unsigned HOST_WIDE_INT create_simple_focus_bits (unsigned HOST_WIDE_INT,
1871 unsigned HOST_WIDE_INT,
1872 int, int);
1874 static unsigned HOST_WIDE_INT
1875 create_simple_focus_bits (unsigned HOST_WIDE_INT high_bits,
1876 unsigned HOST_WIDE_INT low_bits,
1877 int lowest_bit_set, int shift)
1879 HOST_WIDE_INT hi, lo;
1881 if (lowest_bit_set < 32)
1883 lo = (low_bits >> lowest_bit_set) << shift;
1884 hi = ((high_bits << (32 - lowest_bit_set)) << shift);
1886 else
1888 lo = 0;
1889 hi = ((high_bits >> (lowest_bit_set - 32)) << shift);
1891 if (hi & lo)
1892 abort ();
1893 return (hi | lo);
1896 /* Here we are sure to be arch64 and this is an integer constant
1897 being loaded into a register. Emit the most efficient
1898 insn sequence possible. Detection of all the 1-insn cases
1899 has been done already. */
1900 void
1901 sparc_emit_set_const64 (rtx op0, rtx op1)
1903 unsigned HOST_WIDE_INT high_bits, low_bits;
1904 int lowest_bit_set, highest_bit_set;
1905 int all_bits_between_are_set;
1906 rtx temp;
1908 /* Sanity check that we know what we are working with. */
1909 if (! TARGET_ARCH64)
1910 abort ();
1912 if (GET_CODE (op0) != SUBREG)
1914 if (GET_CODE (op0) != REG
1915 || (REGNO (op0) >= SPARC_FIRST_FP_REG
1916 && REGNO (op0) <= SPARC_LAST_V9_FP_REG))
1917 abort ();
1920 if (reload_in_progress || reload_completed)
1921 temp = op0;
1922 else
1923 temp = gen_reg_rtx (DImode);
1925 if (GET_CODE (op1) != CONST_DOUBLE
1926 && GET_CODE (op1) != CONST_INT)
1928 sparc_emit_set_symbolic_const64 (op0, op1, temp);
1929 return;
1932 if (GET_CODE (op1) == CONST_DOUBLE)
1934 #if HOST_BITS_PER_WIDE_INT == 64
1935 high_bits = (CONST_DOUBLE_LOW (op1) >> 32) & 0xffffffff;
1936 low_bits = CONST_DOUBLE_LOW (op1) & 0xffffffff;
1937 #else
1938 high_bits = CONST_DOUBLE_HIGH (op1);
1939 low_bits = CONST_DOUBLE_LOW (op1);
1940 #endif
1942 else
1944 #if HOST_BITS_PER_WIDE_INT == 64
1945 high_bits = ((INTVAL (op1) >> 32) & 0xffffffff);
1946 low_bits = (INTVAL (op1) & 0xffffffff);
1947 #else
1948 high_bits = ((INTVAL (op1) < 0) ?
1949 0xffffffff :
1950 0x00000000);
1951 low_bits = INTVAL (op1);
1952 #endif
1955 /* low_bits bits 0 --> 31
1956 high_bits bits 32 --> 63 */
1958 analyze_64bit_constant (high_bits, low_bits,
1959 &highest_bit_set, &lowest_bit_set,
1960 &all_bits_between_are_set);
1962 /* First try for a 2-insn sequence. */
1964 /* These situations are preferred because the optimizer can
1965 * do more things with them:
1966 * 1) mov -1, %reg
1967 * sllx %reg, shift, %reg
1968 * 2) mov -1, %reg
1969 * srlx %reg, shift, %reg
1970 * 3) mov some_small_const, %reg
1971 * sllx %reg, shift, %reg
1973 if (((highest_bit_set == 63
1974 || lowest_bit_set == 0)
1975 && all_bits_between_are_set != 0)
1976 || ((highest_bit_set - lowest_bit_set) < 12))
1978 HOST_WIDE_INT the_const = -1;
1979 int shift = lowest_bit_set;
1981 if ((highest_bit_set != 63
1982 && lowest_bit_set != 0)
1983 || all_bits_between_are_set == 0)
1985 the_const =
1986 create_simple_focus_bits (high_bits, low_bits,
1987 lowest_bit_set, 0);
1989 else if (lowest_bit_set == 0)
1990 shift = -(63 - highest_bit_set);
1992 if (! SPARC_SIMM13_P (the_const))
1993 abort ();
1995 emit_insn (gen_safe_SET64 (temp, the_const));
1996 if (shift > 0)
1997 emit_insn (gen_rtx_SET (VOIDmode,
1998 op0,
1999 gen_rtx_ASHIFT (DImode,
2000 temp,
2001 GEN_INT (shift))));
2002 else if (shift < 0)
2003 emit_insn (gen_rtx_SET (VOIDmode,
2004 op0,
2005 gen_rtx_LSHIFTRT (DImode,
2006 temp,
2007 GEN_INT (-shift))));
2008 else
2009 abort ();
2010 return;
2013 /* Now a range of 22 or less bits set somewhere.
2014 * 1) sethi %hi(focus_bits), %reg
2015 * sllx %reg, shift, %reg
2016 * 2) sethi %hi(focus_bits), %reg
2017 * srlx %reg, shift, %reg
2019 if ((highest_bit_set - lowest_bit_set) < 21)
2021 unsigned HOST_WIDE_INT focus_bits =
2022 create_simple_focus_bits (high_bits, low_bits,
2023 lowest_bit_set, 10);
2025 if (! SPARC_SETHI_P (focus_bits))
2026 abort ();
2028 sparc_emit_set_safe_HIGH64 (temp, focus_bits);
2030 /* If lowest_bit_set == 10 then a sethi alone could have done it. */
2031 if (lowest_bit_set < 10)
2032 emit_insn (gen_rtx_SET (VOIDmode,
2033 op0,
2034 gen_rtx_LSHIFTRT (DImode, temp,
2035 GEN_INT (10 - lowest_bit_set))));
2036 else if (lowest_bit_set > 10)
2037 emit_insn (gen_rtx_SET (VOIDmode,
2038 op0,
2039 gen_rtx_ASHIFT (DImode, temp,
2040 GEN_INT (lowest_bit_set - 10))));
2041 else
2042 abort ();
2043 return;
2046 /* 1) sethi %hi(low_bits), %reg
2047 * or %reg, %lo(low_bits), %reg
2048 * 2) sethi %hi(~low_bits), %reg
2049 * xor %reg, %lo(-0x400 | (low_bits & 0x3ff)), %reg
2051 if (high_bits == 0
2052 || high_bits == 0xffffffff)
2054 sparc_emit_set_const64_quick1 (op0, temp, low_bits,
2055 (high_bits == 0xffffffff));
2056 return;
2059 /* Now, try 3-insn sequences. */
2061 /* 1) sethi %hi(high_bits), %reg
2062 * or %reg, %lo(high_bits), %reg
2063 * sllx %reg, 32, %reg
2065 if (low_bits == 0)
2067 sparc_emit_set_const64_quick2 (op0, temp, high_bits, 0, 32);
2068 return;
2071 /* We may be able to do something quick
2072 when the constant is negated, so try that. */
2073 if (const64_is_2insns ((~high_bits) & 0xffffffff,
2074 (~low_bits) & 0xfffffc00))
2076 /* NOTE: The trailing bits get XOR'd so we need the
2077 non-negated bits, not the negated ones. */
2078 unsigned HOST_WIDE_INT trailing_bits = low_bits & 0x3ff;
2080 if ((((~high_bits) & 0xffffffff) == 0
2081 && ((~low_bits) & 0x80000000) == 0)
2082 || (((~high_bits) & 0xffffffff) == 0xffffffff
2083 && ((~low_bits) & 0x80000000) != 0))
2085 int fast_int = (~low_bits & 0xffffffff);
2087 if ((SPARC_SETHI_P (fast_int)
2088 && (~high_bits & 0xffffffff) == 0)
2089 || SPARC_SIMM13_P (fast_int))
2090 emit_insn (gen_safe_SET64 (temp, fast_int));
2091 else
2092 sparc_emit_set_const64 (temp, GEN_INT64 (fast_int));
2094 else
2096 rtx negated_const;
2097 #if HOST_BITS_PER_WIDE_INT == 64
2098 negated_const = GEN_INT (((~low_bits) & 0xfffffc00) |
2099 (((HOST_WIDE_INT)((~high_bits) & 0xffffffff))<<32));
2100 #else
2101 negated_const = immed_double_const ((~low_bits) & 0xfffffc00,
2102 (~high_bits) & 0xffffffff,
2103 DImode);
2104 #endif
2105 sparc_emit_set_const64 (temp, negated_const);
2108 /* If we are XOR'ing with -1, then we should emit a one's complement
2109 instead. This way the combiner will notice logical operations
2110 such as ANDN later on and substitute. */
2111 if (trailing_bits == 0x3ff)
2113 emit_insn (gen_rtx_SET (VOIDmode, op0,
2114 gen_rtx_NOT (DImode, temp)));
2116 else
2118 emit_insn (gen_rtx_SET (VOIDmode,
2119 op0,
2120 gen_safe_XOR64 (temp,
2121 (-0x400 | trailing_bits))));
2123 return;
2126 /* 1) sethi %hi(xxx), %reg
2127 * or %reg, %lo(xxx), %reg
2128 * sllx %reg, yyy, %reg
2130 * ??? This is just a generalized version of the low_bits==0
2131 * thing above, FIXME...
2133 if ((highest_bit_set - lowest_bit_set) < 32)
2135 unsigned HOST_WIDE_INT focus_bits =
2136 create_simple_focus_bits (high_bits, low_bits,
2137 lowest_bit_set, 0);
2139 /* We can't get here in this state. */
2140 if (highest_bit_set < 32
2141 || lowest_bit_set >= 32)
2142 abort ();
2144 /* So what we know is that the set bits straddle the
2145 middle of the 64-bit word. */
2146 sparc_emit_set_const64_quick2 (op0, temp,
2147 focus_bits, 0,
2148 lowest_bit_set);
2149 return;
2152 /* 1) sethi %hi(high_bits), %reg
2153 * or %reg, %lo(high_bits), %reg
2154 * sllx %reg, 32, %reg
2155 * or %reg, low_bits, %reg
2157 if (SPARC_SIMM13_P(low_bits)
2158 && ((int)low_bits > 0))
2160 sparc_emit_set_const64_quick2 (op0, temp, high_bits, low_bits, 32);
2161 return;
2164 /* The easiest way when all else fails, is full decomposition. */
2165 #if 0
2166 printf ("sparc_emit_set_const64: Hard constant [%08lx%08lx] neg[%08lx%08lx]\n",
2167 high_bits, low_bits, ~high_bits, ~low_bits);
2168 #endif
2169 sparc_emit_set_const64_longway (op0, temp, high_bits, low_bits);
2172 /* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
2173 return the mode to be used for the comparison. For floating-point,
2174 CCFP[E]mode is used. CC_NOOVmode should be used when the first operand
2175 is a PLUS, MINUS, NEG, or ASHIFT. CCmode should be used when no special
2176 processing is needed. */
2178 enum machine_mode
2179 select_cc_mode (enum rtx_code op, rtx x, rtx y ATTRIBUTE_UNUSED)
2181 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2183 switch (op)
2185 case EQ:
2186 case NE:
2187 case UNORDERED:
2188 case ORDERED:
2189 case UNLT:
2190 case UNLE:
2191 case UNGT:
2192 case UNGE:
2193 case UNEQ:
2194 case LTGT:
2195 return CCFPmode;
2197 case LT:
2198 case LE:
2199 case GT:
2200 case GE:
2201 return CCFPEmode;
2203 default:
2204 abort ();
2207 else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
2208 || GET_CODE (x) == NEG || GET_CODE (x) == ASHIFT)
2210 if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2211 return CCX_NOOVmode;
2212 else
2213 return CC_NOOVmode;
2215 else
2217 if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2218 return CCXmode;
2219 else
2220 return CCmode;
2224 /* X and Y are two things to compare using CODE. Emit the compare insn and
2225 return the rtx for the cc reg in the proper mode. */
2228 gen_compare_reg (enum rtx_code code, rtx x, rtx y)
2230 enum machine_mode mode = SELECT_CC_MODE (code, x, y);
2231 rtx cc_reg;
2233 /* ??? We don't have movcc patterns so we cannot generate pseudo regs for the
2234 fcc regs (cse can't tell they're really call clobbered regs and will
2235 remove a duplicate comparison even if there is an intervening function
2236 call - it will then try to reload the cc reg via an int reg which is why
2237 we need the movcc patterns). It is possible to provide the movcc
2238 patterns by using the ldxfsr/stxfsr v9 insns. I tried it: you need two
2239 registers (say %g1,%g5) and it takes about 6 insns. A better fix would be
2240 to tell cse that CCFPE mode registers (even pseudos) are call
2241 clobbered. */
2243 /* ??? This is an experiment. Rather than making changes to cse which may
2244 or may not be easy/clean, we do our own cse. This is possible because
2245 we will generate hard registers. Cse knows they're call clobbered (it
2246 doesn't know the same thing about pseudos). If we guess wrong, no big
2247 deal, but if we win, great! */
2249 if (TARGET_V9 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2250 #if 1 /* experiment */
2252 int reg;
2253 /* We cycle through the registers to ensure they're all exercised. */
2254 static int next_fcc_reg = 0;
2255 /* Previous x,y for each fcc reg. */
2256 static rtx prev_args[4][2];
2258 /* Scan prev_args for x,y. */
2259 for (reg = 0; reg < 4; reg++)
2260 if (prev_args[reg][0] == x && prev_args[reg][1] == y)
2261 break;
2262 if (reg == 4)
2264 reg = next_fcc_reg;
2265 prev_args[reg][0] = x;
2266 prev_args[reg][1] = y;
2267 next_fcc_reg = (next_fcc_reg + 1) & 3;
2269 cc_reg = gen_rtx_REG (mode, reg + SPARC_FIRST_V9_FCC_REG);
2271 #else
2272 cc_reg = gen_reg_rtx (mode);
2273 #endif /* ! experiment */
2274 else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2275 cc_reg = gen_rtx_REG (mode, SPARC_FCC_REG);
2276 else
2277 cc_reg = gen_rtx_REG (mode, SPARC_ICC_REG);
2279 emit_insn (gen_rtx_SET (VOIDmode, cc_reg,
2280 gen_rtx_COMPARE (mode, x, y)));
2282 return cc_reg;
2285 /* This function is used for v9 only.
2286 CODE is the code for an Scc's comparison.
2287 OPERANDS[0] is the target of the Scc insn.
2288 OPERANDS[1] is the value we compare against const0_rtx (which hasn't
2289 been generated yet).
2291 This function is needed to turn
2293 (set (reg:SI 110)
2294 (gt (reg:CCX 100 %icc)
2295 (const_int 0)))
2296 into
2297 (set (reg:SI 110)
2298 (gt:DI (reg:CCX 100 %icc)
2299 (const_int 0)))
2301 IE: The instruction recognizer needs to see the mode of the comparison to
2302 find the right instruction. We could use "gt:DI" right in the
2303 define_expand, but leaving it out allows us to handle DI, SI, etc.
2305 We refer to the global sparc compare operands sparc_compare_op0 and
2306 sparc_compare_op1. */
2309 gen_v9_scc (enum rtx_code compare_code, register rtx *operands)
2311 rtx temp, op0, op1;
2313 if (! TARGET_ARCH64
2314 && (GET_MODE (sparc_compare_op0) == DImode
2315 || GET_MODE (operands[0]) == DImode))
2316 return 0;
2318 op0 = sparc_compare_op0;
2319 op1 = sparc_compare_op1;
2321 /* Try to use the movrCC insns. */
2322 if (TARGET_ARCH64
2323 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
2324 && op1 == const0_rtx
2325 && v9_regcmp_p (compare_code))
2327 /* Special case for op0 != 0. This can be done with one instruction if
2328 operands[0] == sparc_compare_op0. */
2330 if (compare_code == NE
2331 && GET_MODE (operands[0]) == DImode
2332 && rtx_equal_p (op0, operands[0]))
2334 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2335 gen_rtx_IF_THEN_ELSE (DImode,
2336 gen_rtx_fmt_ee (compare_code, DImode,
2337 op0, const0_rtx),
2338 const1_rtx,
2339 operands[0])));
2340 return 1;
2343 if (reg_overlap_mentioned_p (operands[0], op0))
2345 /* Handle the case where operands[0] == sparc_compare_op0.
2346 We "early clobber" the result. */
2347 op0 = gen_reg_rtx (GET_MODE (sparc_compare_op0));
2348 emit_move_insn (op0, sparc_compare_op0);
2351 emit_insn (gen_rtx_SET (VOIDmode, operands[0], const0_rtx));
2352 if (GET_MODE (op0) != DImode)
2354 temp = gen_reg_rtx (DImode);
2355 convert_move (temp, op0, 0);
2357 else
2358 temp = op0;
2359 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2360 gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
2361 gen_rtx_fmt_ee (compare_code, DImode,
2362 temp, const0_rtx),
2363 const1_rtx,
2364 operands[0])));
2365 return 1;
2367 else
2369 operands[1] = gen_compare_reg (compare_code, op0, op1);
2371 switch (GET_MODE (operands[1]))
2373 case CCmode :
2374 case CCXmode :
2375 case CCFPEmode :
2376 case CCFPmode :
2377 break;
2378 default :
2379 abort ();
2381 emit_insn (gen_rtx_SET (VOIDmode, operands[0], const0_rtx));
2382 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2383 gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
2384 gen_rtx_fmt_ee (compare_code,
2385 GET_MODE (operands[1]),
2386 operands[1], const0_rtx),
2387 const1_rtx, operands[0])));
2388 return 1;
2392 /* Emit a conditional jump insn for the v9 architecture using comparison code
2393 CODE and jump target LABEL.
2394 This function exists to take advantage of the v9 brxx insns. */
2396 void
2397 emit_v9_brxx_insn (enum rtx_code code, rtx op0, rtx label)
2399 emit_jump_insn (gen_rtx_SET (VOIDmode,
2400 pc_rtx,
2401 gen_rtx_IF_THEN_ELSE (VOIDmode,
2402 gen_rtx_fmt_ee (code, GET_MODE (op0),
2403 op0, const0_rtx),
2404 gen_rtx_LABEL_REF (VOIDmode, label),
2405 pc_rtx)));
2408 /* Generate a DFmode part of a hard TFmode register.
2409 REG is the TFmode hard register, LOW is 1 for the
2410 low 64bit of the register and 0 otherwise.
2413 gen_df_reg (rtx reg, int low)
2415 int regno = REGNO (reg);
2417 if ((WORDS_BIG_ENDIAN == 0) ^ (low != 0))
2418 regno += (TARGET_ARCH64 && regno < 32) ? 1 : 2;
2419 return gen_rtx_REG (DFmode, regno);
2422 /* Generate a call to FUNC with OPERANDS. Operand 0 is the return value.
2423 Unlike normal calls, TFmode operands are passed by reference. It is
2424 assumed that no more than 3 operands are required. */
2426 static void
2427 emit_soft_tfmode_libcall (const char *func_name, int nargs, rtx *operands)
2429 rtx ret_slot = NULL, arg[3], func_sym;
2430 int i;
2432 /* We only expect to be called for conversions, unary, and binary ops. */
2433 if (nargs < 2 || nargs > 3)
2434 abort ();
2436 for (i = 0; i < nargs; ++i)
2438 rtx this_arg = operands[i];
2439 rtx this_slot;
2441 /* TFmode arguments and return values are passed by reference. */
2442 if (GET_MODE (this_arg) == TFmode)
2444 int force_stack_temp;
2446 force_stack_temp = 0;
2447 if (TARGET_BUGGY_QP_LIB && i == 0)
2448 force_stack_temp = 1;
2450 if (GET_CODE (this_arg) == MEM
2451 && ! force_stack_temp)
2452 this_arg = XEXP (this_arg, 0);
2453 else if (CONSTANT_P (this_arg)
2454 && ! force_stack_temp)
2456 this_slot = force_const_mem (TFmode, this_arg);
2457 this_arg = XEXP (this_slot, 0);
2459 else
2461 this_slot = assign_stack_temp (TFmode, GET_MODE_SIZE (TFmode), 0);
2463 /* Operand 0 is the return value. We'll copy it out later. */
2464 if (i > 0)
2465 emit_move_insn (this_slot, this_arg);
2466 else
2467 ret_slot = this_slot;
2469 this_arg = XEXP (this_slot, 0);
2473 arg[i] = this_arg;
2476 func_sym = gen_rtx_SYMBOL_REF (Pmode, func_name);
2478 if (GET_MODE (operands[0]) == TFmode)
2480 if (nargs == 2)
2481 emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 2,
2482 arg[0], GET_MODE (arg[0]),
2483 arg[1], GET_MODE (arg[1]));
2484 else
2485 emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 3,
2486 arg[0], GET_MODE (arg[0]),
2487 arg[1], GET_MODE (arg[1]),
2488 arg[2], GET_MODE (arg[2]));
2490 if (ret_slot)
2491 emit_move_insn (operands[0], ret_slot);
2493 else
2495 rtx ret;
2497 if (nargs != 2)
2498 abort ();
2500 ret = emit_library_call_value (func_sym, operands[0], LCT_NORMAL,
2501 GET_MODE (operands[0]), 1,
2502 arg[1], GET_MODE (arg[1]));
2504 if (ret != operands[0])
2505 emit_move_insn (operands[0], ret);
2509 /* Expand soft-float TFmode calls to sparc abi routines. */
2511 static void
2512 emit_soft_tfmode_binop (enum rtx_code code, rtx *operands)
2514 const char *func;
2516 switch (code)
2518 case PLUS:
2519 func = "_Qp_add";
2520 break;
2521 case MINUS:
2522 func = "_Qp_sub";
2523 break;
2524 case MULT:
2525 func = "_Qp_mul";
2526 break;
2527 case DIV:
2528 func = "_Qp_div";
2529 break;
2530 default:
2531 abort ();
2534 emit_soft_tfmode_libcall (func, 3, operands);
2537 static void
2538 emit_soft_tfmode_unop (enum rtx_code code, rtx *operands)
2540 const char *func;
2542 switch (code)
2544 case SQRT:
2545 func = "_Qp_sqrt";
2546 break;
2547 default:
2548 abort ();
2551 emit_soft_tfmode_libcall (func, 2, operands);
2554 static void
2555 emit_soft_tfmode_cvt (enum rtx_code code, rtx *operands)
2557 const char *func;
2559 switch (code)
2561 case FLOAT_EXTEND:
2562 switch (GET_MODE (operands[1]))
2564 case SFmode:
2565 func = "_Qp_stoq";
2566 break;
2567 case DFmode:
2568 func = "_Qp_dtoq";
2569 break;
2570 default:
2571 abort ();
2573 break;
2575 case FLOAT_TRUNCATE:
2576 switch (GET_MODE (operands[0]))
2578 case SFmode:
2579 func = "_Qp_qtos";
2580 break;
2581 case DFmode:
2582 func = "_Qp_qtod";
2583 break;
2584 default:
2585 abort ();
2587 break;
2589 case FLOAT:
2590 switch (GET_MODE (operands[1]))
2592 case SImode:
2593 func = "_Qp_itoq";
2594 break;
2595 case DImode:
2596 func = "_Qp_xtoq";
2597 break;
2598 default:
2599 abort ();
2601 break;
2603 case UNSIGNED_FLOAT:
2604 switch (GET_MODE (operands[1]))
2606 case SImode:
2607 func = "_Qp_uitoq";
2608 break;
2609 case DImode:
2610 func = "_Qp_uxtoq";
2611 break;
2612 default:
2613 abort ();
2615 break;
2617 case FIX:
2618 switch (GET_MODE (operands[0]))
2620 case SImode:
2621 func = "_Qp_qtoi";
2622 break;
2623 case DImode:
2624 func = "_Qp_qtox";
2625 break;
2626 default:
2627 abort ();
2629 break;
2631 case UNSIGNED_FIX:
2632 switch (GET_MODE (operands[0]))
2634 case SImode:
2635 func = "_Qp_qtoui";
2636 break;
2637 case DImode:
2638 func = "_Qp_qtoux";
2639 break;
2640 default:
2641 abort ();
2643 break;
2645 default:
2646 abort ();
2649 emit_soft_tfmode_libcall (func, 2, operands);
2652 /* Expand a hard-float tfmode operation. All arguments must be in
2653 registers. */
2655 static void
2656 emit_hard_tfmode_operation (enum rtx_code code, rtx *operands)
2658 rtx op, dest;
2660 if (GET_RTX_CLASS (code) == '1')
2662 operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
2663 op = gen_rtx_fmt_e (code, GET_MODE (operands[0]), operands[1]);
2665 else
2667 operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
2668 operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
2669 op = gen_rtx_fmt_ee (code, GET_MODE (operands[0]),
2670 operands[1], operands[2]);
2673 if (register_operand (operands[0], VOIDmode))
2674 dest = operands[0];
2675 else
2676 dest = gen_reg_rtx (GET_MODE (operands[0]));
2678 emit_insn (gen_rtx_SET (VOIDmode, dest, op));
2680 if (dest != operands[0])
2681 emit_move_insn (operands[0], dest);
2684 void
2685 emit_tfmode_binop (enum rtx_code code, rtx *operands)
2687 if (TARGET_HARD_QUAD)
2688 emit_hard_tfmode_operation (code, operands);
2689 else
2690 emit_soft_tfmode_binop (code, operands);
2693 void
2694 emit_tfmode_unop (enum rtx_code code, rtx *operands)
2696 if (TARGET_HARD_QUAD)
2697 emit_hard_tfmode_operation (code, operands);
2698 else
2699 emit_soft_tfmode_unop (code, operands);
2702 void
2703 emit_tfmode_cvt (enum rtx_code code, rtx *operands)
2705 if (TARGET_HARD_QUAD)
2706 emit_hard_tfmode_operation (code, operands);
2707 else
2708 emit_soft_tfmode_cvt (code, operands);
2711 /* Return nonzero if a return peephole merging return with
2712 setting of output register is ok. */
2714 leaf_return_peephole_ok (void)
2716 return (actual_fsize == 0);
2719 /* Return nonzero if a branch/jump/call instruction will be emitting
2720 nop into its delay slot. */
2723 empty_delay_slot (rtx insn)
2725 rtx seq;
2727 /* If no previous instruction (should not happen), return true. */
2728 if (PREV_INSN (insn) == NULL)
2729 return 1;
2731 seq = NEXT_INSN (PREV_INSN (insn));
2732 if (GET_CODE (PATTERN (seq)) == SEQUENCE)
2733 return 0;
2735 return 1;
2738 /* Return nonzero if TRIAL can go into the function epilogue's
2739 delay slot. SLOT is the slot we are trying to fill. */
2742 eligible_for_epilogue_delay (rtx trial, int slot)
2744 rtx pat, src;
2746 if (slot >= 1)
2747 return 0;
2749 if (GET_CODE (trial) != INSN || GET_CODE (PATTERN (trial)) != SET)
2750 return 0;
2752 if (get_attr_length (trial) != 1)
2753 return 0;
2755 /* If there are any call-saved registers, we should scan TRIAL if it
2756 does not reference them. For now just make it easy. */
2757 if (num_gfregs)
2758 return 0;
2760 /* If the function uses __builtin_eh_return, the eh_return machinery
2761 occupies the delay slot. */
2762 if (current_function_calls_eh_return)
2763 return 0;
2765 /* In the case of a true leaf function, anything can go into the delay slot.
2766 A delay slot only exists however if the frame size is zero, otherwise
2767 we will put an insn to adjust the stack after the return. */
2768 if (current_function_uses_only_leaf_regs)
2770 if (leaf_return_peephole_ok ())
2771 return ((get_attr_in_uncond_branch_delay (trial)
2772 == IN_BRANCH_DELAY_TRUE));
2773 return 0;
2776 pat = PATTERN (trial);
2778 /* Otherwise, only operations which can be done in tandem with
2779 a `restore' or `return' insn can go into the delay slot. */
2780 if (GET_CODE (SET_DEST (pat)) != REG
2781 || REGNO (SET_DEST (pat)) < 24)
2782 return 0;
2784 /* If this instruction sets up floating point register and we have a return
2785 instruction, it can probably go in. But restore will not work
2786 with FP_REGS. */
2787 if (REGNO (SET_DEST (pat)) >= 32)
2789 if (TARGET_V9 && ! epilogue_renumber (&pat, 1)
2790 && (get_attr_in_uncond_branch_delay (trial) == IN_BRANCH_DELAY_TRUE))
2791 return 1;
2792 return 0;
2795 /* The set of insns matched here must agree precisely with the set of
2796 patterns paired with a RETURN in sparc.md. */
2798 src = SET_SRC (pat);
2800 /* This matches "*return_[qhs]i" or even "*return_di" on TARGET_ARCH64. */
2801 if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
2802 && arith_operand (src, GET_MODE (src)))
2804 if (TARGET_ARCH64)
2805 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
2806 else
2807 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (SImode);
2810 /* This matches "*return_di". */
2811 else if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
2812 && arith_double_operand (src, GET_MODE (src)))
2813 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
2815 /* This matches "*return_sf_no_fpu". */
2816 else if (! TARGET_FPU && restore_operand (SET_DEST (pat), SFmode)
2817 && register_operand (src, SFmode))
2818 return 1;
2820 /* If we have return instruction, anything that does not use
2821 local or output registers and can go into a delay slot wins. */
2822 else if (TARGET_V9 && ! epilogue_renumber (&pat, 1)
2823 && (get_attr_in_uncond_branch_delay (trial) == IN_BRANCH_DELAY_TRUE))
2824 return 1;
2826 /* This matches "*return_addsi". */
2827 else if (GET_CODE (src) == PLUS
2828 && arith_operand (XEXP (src, 0), SImode)
2829 && arith_operand (XEXP (src, 1), SImode)
2830 && (register_operand (XEXP (src, 0), SImode)
2831 || register_operand (XEXP (src, 1), SImode)))
2832 return 1;
2834 /* This matches "*return_adddi". */
2835 else if (GET_CODE (src) == PLUS
2836 && arith_double_operand (XEXP (src, 0), DImode)
2837 && arith_double_operand (XEXP (src, 1), DImode)
2838 && (register_operand (XEXP (src, 0), DImode)
2839 || register_operand (XEXP (src, 1), DImode)))
2840 return 1;
2842 /* This can match "*return_losum_[sd]i".
2843 Catch only some cases, so that return_losum* don't have
2844 to be too big. */
2845 else if (GET_CODE (src) == LO_SUM
2846 && ! TARGET_CM_MEDMID
2847 && ((register_operand (XEXP (src, 0), SImode)
2848 && immediate_operand (XEXP (src, 1), SImode))
2849 || (TARGET_ARCH64
2850 && register_operand (XEXP (src, 0), DImode)
2851 && immediate_operand (XEXP (src, 1), DImode))))
2852 return 1;
2854 /* sll{,x} reg,1,reg2 is add reg,reg,reg2 as well. */
2855 else if (GET_CODE (src) == ASHIFT
2856 && (register_operand (XEXP (src, 0), SImode)
2857 || register_operand (XEXP (src, 0), DImode))
2858 && XEXP (src, 1) == const1_rtx)
2859 return 1;
2861 return 0;
2864 /* Return nonzero if TRIAL can go into the call delay slot. */
2866 tls_call_delay (rtx trial)
2868 rtx pat, unspec;
2870 /* Binutils allows
2871 call __tls_get_addr, %tgd_call (foo)
2872 add %l7, %o0, %o0, %tgd_add (foo)
2873 while Sun as/ld does not. */
2874 if (TARGET_GNU_TLS || !TARGET_TLS)
2875 return 1;
2877 pat = PATTERN (trial);
2878 if (GET_CODE (pat) != SET || GET_CODE (SET_DEST (pat)) != PLUS)
2879 return 1;
2881 unspec = XEXP (SET_DEST (pat), 1);
2882 if (GET_CODE (unspec) != UNSPEC
2883 || (XINT (unspec, 1) != UNSPEC_TLSGD
2884 && XINT (unspec, 1) != UNSPEC_TLSLDM))
2885 return 1;
2887 return 0;
2890 /* Return nonzero if TRIAL can go into the sibling call
2891 delay slot. */
2894 eligible_for_sibcall_delay (rtx trial)
2896 rtx pat, src;
2898 if (GET_CODE (trial) != INSN || GET_CODE (PATTERN (trial)) != SET)
2899 return 0;
2901 if (get_attr_length (trial) != 1)
2902 return 0;
2904 pat = PATTERN (trial);
2906 if (current_function_uses_only_leaf_regs)
2908 /* If the tail call is done using the call instruction,
2909 we have to restore %o7 in the delay slot. */
2910 if ((TARGET_ARCH64 && ! TARGET_CM_MEDLOW) || flag_pic)
2911 return 0;
2913 /* %g1 is used to build the function address */
2914 if (reg_mentioned_p (gen_rtx_REG (Pmode, 1), pat))
2915 return 0;
2917 return 1;
2920 /* Otherwise, only operations which can be done in tandem with
2921 a `restore' insn can go into the delay slot. */
2922 if (GET_CODE (SET_DEST (pat)) != REG
2923 || REGNO (SET_DEST (pat)) < 24
2924 || REGNO (SET_DEST (pat)) >= 32)
2925 return 0;
2927 /* If it mentions %o7, it can't go in, because sibcall will clobber it
2928 in most cases. */
2929 if (reg_mentioned_p (gen_rtx_REG (Pmode, 15), pat))
2930 return 0;
2932 src = SET_SRC (pat);
2934 if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
2935 && arith_operand (src, GET_MODE (src)))
2937 if (TARGET_ARCH64)
2938 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
2939 else
2940 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (SImode);
2943 else if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
2944 && arith_double_operand (src, GET_MODE (src)))
2945 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
2947 else if (! TARGET_FPU && restore_operand (SET_DEST (pat), SFmode)
2948 && register_operand (src, SFmode))
2949 return 1;
2951 else if (GET_CODE (src) == PLUS
2952 && arith_operand (XEXP (src, 0), SImode)
2953 && arith_operand (XEXP (src, 1), SImode)
2954 && (register_operand (XEXP (src, 0), SImode)
2955 || register_operand (XEXP (src, 1), SImode)))
2956 return 1;
2958 else if (GET_CODE (src) == PLUS
2959 && arith_double_operand (XEXP (src, 0), DImode)
2960 && arith_double_operand (XEXP (src, 1), DImode)
2961 && (register_operand (XEXP (src, 0), DImode)
2962 || register_operand (XEXP (src, 1), DImode)))
2963 return 1;
2965 else if (GET_CODE (src) == LO_SUM
2966 && ! TARGET_CM_MEDMID
2967 && ((register_operand (XEXP (src, 0), SImode)
2968 && immediate_operand (XEXP (src, 1), SImode))
2969 || (TARGET_ARCH64
2970 && register_operand (XEXP (src, 0), DImode)
2971 && immediate_operand (XEXP (src, 1), DImode))))
2972 return 1;
2974 else if (GET_CODE (src) == ASHIFT
2975 && (register_operand (XEXP (src, 0), SImode)
2976 || register_operand (XEXP (src, 0), DImode))
2977 && XEXP (src, 1) == const1_rtx)
2978 return 1;
2980 return 0;
2983 static int
2984 check_return_regs (rtx x)
2986 switch (GET_CODE (x))
2988 case REG:
2989 return IN_OR_GLOBAL_P (x);
2991 case CONST_INT:
2992 case CONST_DOUBLE:
2993 case CONST:
2994 case SYMBOL_REF:
2995 case LABEL_REF:
2996 return 1;
2998 case SET:
2999 case IOR:
3000 case AND:
3001 case XOR:
3002 case PLUS:
3003 case MINUS:
3004 if (check_return_regs (XEXP (x, 1)) == 0)
3005 return 0;
3006 case NOT:
3007 case NEG:
3008 case MEM:
3009 return check_return_regs (XEXP (x, 0));
3011 default:
3012 return 0;
3018 short_branch (int uid1, int uid2)
3020 int delta = INSN_ADDRESSES (uid1) - INSN_ADDRESSES (uid2);
3022 /* Leave a few words of "slop". */
3023 if (delta >= -1023 && delta <= 1022)
3024 return 1;
3026 return 0;
3029 /* Return nonzero if REG is not used after INSN.
3030 We assume REG is a reload reg, and therefore does
3031 not live past labels or calls or jumps. */
3033 reg_unused_after (rtx reg, rtx insn)
3035 enum rtx_code code, prev_code = UNKNOWN;
3037 while ((insn = NEXT_INSN (insn)))
3039 if (prev_code == CALL_INSN && call_used_regs[REGNO (reg)])
3040 return 1;
3042 code = GET_CODE (insn);
3043 if (GET_CODE (insn) == CODE_LABEL)
3044 return 1;
3046 if (GET_RTX_CLASS (code) == 'i')
3048 rtx set = single_set (insn);
3049 int in_src = set && reg_overlap_mentioned_p (reg, SET_SRC (set));
3050 if (set && in_src)
3051 return 0;
3052 if (set && reg_overlap_mentioned_p (reg, SET_DEST (set)))
3053 return 1;
3054 if (set == 0 && reg_overlap_mentioned_p (reg, PATTERN (insn)))
3055 return 0;
3057 prev_code = code;
3059 return 1;
3062 /* Determine if it's legal to put X into the constant pool. This
3063 is not possible if X contains the address of a symbol that is
3064 not constant (TLS) or not known at final link time (PIC). */
3066 static bool
3067 sparc_cannot_force_const_mem (rtx x)
3069 switch (GET_CODE (x))
3071 case CONST_INT:
3072 case CONST_DOUBLE:
3073 /* Accept all non-symbolic constants. */
3074 return false;
3076 case LABEL_REF:
3077 /* Labels are OK iff we are non-PIC. */
3078 return flag_pic != 0;
3080 case SYMBOL_REF:
3081 /* 'Naked' TLS symbol references are never OK,
3082 non-TLS symbols are OK iff we are non-PIC. */
3083 if (SYMBOL_REF_TLS_MODEL (x))
3084 return true;
3085 else
3086 return flag_pic != 0;
3088 case CONST:
3089 return sparc_cannot_force_const_mem (XEXP (x, 0));
3090 case PLUS:
3091 case MINUS:
3092 return sparc_cannot_force_const_mem (XEXP (x, 0))
3093 || sparc_cannot_force_const_mem (XEXP (x, 1));
3094 case UNSPEC:
3095 return true;
3096 default:
3097 abort ();
3101 /* The table we use to reference PIC data. */
3102 static GTY(()) rtx global_offset_table;
3104 /* The function we use to get at it. */
3105 static GTY(()) rtx get_pc_symbol;
3106 static char get_pc_symbol_name[256];
3108 /* Ensure that we are not using patterns that are not OK with PIC. */
3111 check_pic (int i)
3113 switch (flag_pic)
3115 case 1:
3116 if (GET_CODE (recog_data.operand[i]) == SYMBOL_REF
3117 || (GET_CODE (recog_data.operand[i]) == CONST
3118 && ! (GET_CODE (XEXP (recog_data.operand[i], 0)) == MINUS
3119 && (XEXP (XEXP (recog_data.operand[i], 0), 0)
3120 == global_offset_table)
3121 && (GET_CODE (XEXP (XEXP (recog_data.operand[i], 0), 1))
3122 == CONST))))
3123 abort ();
3124 case 2:
3125 default:
3126 return 1;
3130 /* Return true if X is an address which needs a temporary register when
3131 reloaded while generating PIC code. */
3134 pic_address_needs_scratch (rtx x)
3136 /* An address which is a symbolic plus a non SMALL_INT needs a temp reg. */
3137 if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
3138 && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
3139 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3140 && ! SMALL_INT (XEXP (XEXP (x, 0), 1)))
3141 return 1;
3143 return 0;
3146 /* Determine if a given RTX is a valid constant. We already know this
3147 satisfies CONSTANT_P. */
3149 bool
3150 legitimate_constant_p (rtx x)
3152 rtx inner;
3154 switch (GET_CODE (x))
3156 case SYMBOL_REF:
3157 /* TLS symbols are not constant. */
3158 if (SYMBOL_REF_TLS_MODEL (x))
3159 return false;
3160 break;
3162 case CONST:
3163 inner = XEXP (x, 0);
3165 /* Offsets of TLS symbols are never valid.
3166 Discourage CSE from creating them. */
3167 if (GET_CODE (inner) == PLUS
3168 && tls_symbolic_operand (XEXP (inner, 0)))
3169 return false;
3170 break;
3172 case CONST_DOUBLE:
3173 if (GET_MODE (x) == VOIDmode)
3174 return true;
3176 /* Floating point constants are generally not ok.
3177 The only exception is 0.0 in VIS. */
3178 if (TARGET_VIS
3179 && (GET_MODE (x) == SFmode
3180 || GET_MODE (x) == DFmode
3181 || GET_MODE (x) == TFmode)
3182 && fp_zero_operand (x, GET_MODE (x)))
3183 return true;
3185 return false;
3187 default:
3188 break;
3191 return true;
3194 /* Determine if a given RTX is a valid constant address. */
3196 bool
3197 constant_address_p (rtx x)
3199 switch (GET_CODE (x))
3201 case LABEL_REF:
3202 case CONST_INT:
3203 case HIGH:
3204 return true;
3206 case CONST:
3207 if (flag_pic && pic_address_needs_scratch (x))
3208 return false;
3209 return legitimate_constant_p (x);
3211 case SYMBOL_REF:
3212 return !flag_pic && legitimate_constant_p (x);
3214 default:
3215 return false;
3219 /* Nonzero if the constant value X is a legitimate general operand
3220 when generating PIC code. It is given that flag_pic is on and
3221 that X satisfies CONSTANT_P or is a CONST_DOUBLE. */
3223 bool
3224 legitimate_pic_operand_p (rtx x)
3226 if (pic_address_needs_scratch (x))
3227 return false;
3228 if (tls_symbolic_operand (x)
3229 || (GET_CODE (x) == CONST
3230 && GET_CODE (XEXP (x, 0)) == PLUS
3231 && tls_symbolic_operand (XEXP (XEXP (x, 0), 0))))
3232 return false;
3233 return true;
3236 /* Return nonzero if ADDR is a valid memory address.
3237 STRICT specifies whether strict register checking applies. */
3240 legitimate_address_p (enum machine_mode mode, rtx addr, int strict)
3242 rtx rs1 = NULL, rs2 = NULL, imm1 = NULL, imm2;
3244 if (REG_P (addr) || GET_CODE (addr) == SUBREG)
3245 rs1 = addr;
3246 else if (GET_CODE (addr) == PLUS)
3248 rs1 = XEXP (addr, 0);
3249 rs2 = XEXP (addr, 1);
3251 /* Canonicalize. REG comes first, if there are no regs,
3252 LO_SUM comes first. */
3253 if (!REG_P (rs1)
3254 && GET_CODE (rs1) != SUBREG
3255 && (REG_P (rs2)
3256 || GET_CODE (rs2) == SUBREG
3257 || (GET_CODE (rs2) == LO_SUM && GET_CODE (rs1) != LO_SUM)))
3259 rs1 = XEXP (addr, 1);
3260 rs2 = XEXP (addr, 0);
3263 if ((flag_pic == 1
3264 && rs1 == pic_offset_table_rtx
3265 && !REG_P (rs2)
3266 && GET_CODE (rs2) != SUBREG
3267 && GET_CODE (rs2) != LO_SUM
3268 && GET_CODE (rs2) != MEM
3269 && !tls_symbolic_operand (rs2)
3270 && (! symbolic_operand (rs2, VOIDmode) || mode == Pmode)
3271 && (GET_CODE (rs2) != CONST_INT || SMALL_INT (rs2)))
3272 || ((REG_P (rs1)
3273 || GET_CODE (rs1) == SUBREG)
3274 && RTX_OK_FOR_OFFSET_P (rs2)))
3276 imm1 = rs2;
3277 rs2 = NULL;
3279 else if ((REG_P (rs1) || GET_CODE (rs1) == SUBREG)
3280 && (REG_P (rs2) || GET_CODE (rs2) == SUBREG))
3282 /* We prohibit REG + REG for TFmode when there are no instructions
3283 which accept REG+REG instructions. We do this because REG+REG
3284 is not an offsetable address. If we get the situation in reload
3285 where source and destination of a movtf pattern are both MEMs with
3286 REG+REG address, then only one of them gets converted to an
3287 offsetable address. */
3288 if (mode == TFmode
3289 && !(TARGET_FPU && TARGET_ARCH64 && TARGET_V9
3290 && TARGET_HARD_QUAD))
3291 return 0;
3293 /* We prohibit REG + REG on ARCH32 if not optimizing for
3294 DFmode/DImode because then mem_min_alignment is likely to be zero
3295 after reload and the forced split would lack a matching splitter
3296 pattern. */
3297 if (TARGET_ARCH32 && !optimize
3298 && (mode == DFmode || mode == DImode))
3299 return 0;
3301 else if (USE_AS_OFFSETABLE_LO10
3302 && GET_CODE (rs1) == LO_SUM
3303 && TARGET_ARCH64
3304 && ! TARGET_CM_MEDMID
3305 && RTX_OK_FOR_OLO10_P (rs2))
3307 imm2 = rs2;
3308 rs2 = NULL;
3309 imm1 = XEXP (rs1, 1);
3310 rs1 = XEXP (rs1, 0);
3311 if (! CONSTANT_P (imm1) || tls_symbolic_operand (rs1))
3312 return 0;
3315 else if (GET_CODE (addr) == LO_SUM)
3317 rs1 = XEXP (addr, 0);
3318 imm1 = XEXP (addr, 1);
3320 if (! CONSTANT_P (imm1) || tls_symbolic_operand (rs1))
3321 return 0;
3323 /* We can't allow TFmode, because an offset greater than or equal to the
3324 alignment (8) may cause the LO_SUM to overflow if !v9. */
3325 if (mode == TFmode && !TARGET_V9)
3326 return 0;
3328 else if (GET_CODE (addr) == CONST_INT && SMALL_INT (addr))
3329 return 1;
3330 else
3331 return 0;
3333 if (GET_CODE (rs1) == SUBREG)
3334 rs1 = SUBREG_REG (rs1);
3335 if (!REG_P (rs1))
3336 return 0;
3338 if (rs2)
3340 if (GET_CODE (rs2) == SUBREG)
3341 rs2 = SUBREG_REG (rs2);
3342 if (!REG_P (rs2))
3343 return 0;
3346 if (strict)
3348 if (!REGNO_OK_FOR_BASE_P (REGNO (rs1))
3349 || (rs2 && !REGNO_OK_FOR_BASE_P (REGNO (rs2))))
3350 return 0;
3352 else
3354 if ((REGNO (rs1) >= 32
3355 && REGNO (rs1) != FRAME_POINTER_REGNUM
3356 && REGNO (rs1) < FIRST_PSEUDO_REGISTER)
3357 || (rs2
3358 && (REGNO (rs2) >= 32
3359 && REGNO (rs2) != FRAME_POINTER_REGNUM
3360 && REGNO (rs2) < FIRST_PSEUDO_REGISTER)))
3361 return 0;
3363 return 1;
3366 /* Construct the SYMBOL_REF for the tls_get_offset function. */
3368 static GTY(()) rtx sparc_tls_symbol;
3369 static rtx
3370 sparc_tls_get_addr (void)
3372 if (!sparc_tls_symbol)
3373 sparc_tls_symbol = gen_rtx_SYMBOL_REF (Pmode, "__tls_get_addr");
3375 return sparc_tls_symbol;
3378 static rtx
3379 sparc_tls_got (void)
3381 rtx temp;
3382 if (flag_pic)
3384 current_function_uses_pic_offset_table = 1;
3385 return pic_offset_table_rtx;
3388 if (!global_offset_table)
3389 global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3390 temp = gen_reg_rtx (Pmode);
3391 emit_move_insn (temp, global_offset_table);
3392 return temp;
3396 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
3397 this (thread-local) address. */
3400 legitimize_tls_address (rtx addr)
3402 rtx temp1, temp2, temp3, ret, o0, got, insn;
3404 if (no_new_pseudos)
3405 abort ();
3407 if (GET_CODE (addr) == SYMBOL_REF)
3408 switch (SYMBOL_REF_TLS_MODEL (addr))
3410 case TLS_MODEL_GLOBAL_DYNAMIC:
3411 start_sequence ();
3412 temp1 = gen_reg_rtx (SImode);
3413 temp2 = gen_reg_rtx (SImode);
3414 ret = gen_reg_rtx (Pmode);
3415 o0 = gen_rtx_REG (Pmode, 8);
3416 got = sparc_tls_got ();
3417 emit_insn (gen_tgd_hi22 (temp1, addr));
3418 emit_insn (gen_tgd_lo10 (temp2, temp1, addr));
3419 if (TARGET_ARCH32)
3421 emit_insn (gen_tgd_add32 (o0, got, temp2, addr));
3422 insn = emit_call_insn (gen_tgd_call32 (o0, sparc_tls_get_addr (),
3423 addr, const1_rtx));
3425 else
3427 emit_insn (gen_tgd_add64 (o0, got, temp2, addr));
3428 insn = emit_call_insn (gen_tgd_call64 (o0, sparc_tls_get_addr (),
3429 addr, const1_rtx));
3431 CALL_INSN_FUNCTION_USAGE (insn)
3432 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_USE (VOIDmode, o0),
3433 CALL_INSN_FUNCTION_USAGE (insn));
3434 insn = get_insns ();
3435 end_sequence ();
3436 emit_libcall_block (insn, ret, o0, addr);
3437 break;
3439 case TLS_MODEL_LOCAL_DYNAMIC:
3440 start_sequence ();
3441 temp1 = gen_reg_rtx (SImode);
3442 temp2 = gen_reg_rtx (SImode);
3443 temp3 = gen_reg_rtx (Pmode);
3444 ret = gen_reg_rtx (Pmode);
3445 o0 = gen_rtx_REG (Pmode, 8);
3446 got = sparc_tls_got ();
3447 emit_insn (gen_tldm_hi22 (temp1));
3448 emit_insn (gen_tldm_lo10 (temp2, temp1));
3449 if (TARGET_ARCH32)
3451 emit_insn (gen_tldm_add32 (o0, got, temp2));
3452 insn = emit_call_insn (gen_tldm_call32 (o0, sparc_tls_get_addr (),
3453 const1_rtx));
3455 else
3457 emit_insn (gen_tldm_add64 (o0, got, temp2));
3458 insn = emit_call_insn (gen_tldm_call64 (o0, sparc_tls_get_addr (),
3459 const1_rtx));
3461 CALL_INSN_FUNCTION_USAGE (insn)
3462 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_USE (VOIDmode, o0),
3463 CALL_INSN_FUNCTION_USAGE (insn));
3464 insn = get_insns ();
3465 end_sequence ();
3466 emit_libcall_block (insn, temp3, o0,
3467 gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
3468 UNSPEC_TLSLD_BASE));
3469 temp1 = gen_reg_rtx (SImode);
3470 temp2 = gen_reg_rtx (SImode);
3471 emit_insn (gen_tldo_hix22 (temp1, addr));
3472 emit_insn (gen_tldo_lox10 (temp2, temp1, addr));
3473 if (TARGET_ARCH32)
3474 emit_insn (gen_tldo_add32 (ret, temp3, temp2, addr));
3475 else
3476 emit_insn (gen_tldo_add64 (ret, temp3, temp2, addr));
3477 break;
3479 case TLS_MODEL_INITIAL_EXEC:
3480 temp1 = gen_reg_rtx (SImode);
3481 temp2 = gen_reg_rtx (SImode);
3482 temp3 = gen_reg_rtx (Pmode);
3483 got = sparc_tls_got ();
3484 emit_insn (gen_tie_hi22 (temp1, addr));
3485 emit_insn (gen_tie_lo10 (temp2, temp1, addr));
3486 if (TARGET_ARCH32)
3487 emit_insn (gen_tie_ld32 (temp3, got, temp2, addr));
3488 else
3489 emit_insn (gen_tie_ld64 (temp3, got, temp2, addr));
3490 if (TARGET_SUN_TLS)
3492 ret = gen_reg_rtx (Pmode);
3493 if (TARGET_ARCH32)
3494 emit_insn (gen_tie_add32 (ret, gen_rtx_REG (Pmode, 7),
3495 temp3, addr));
3496 else
3497 emit_insn (gen_tie_add64 (ret, gen_rtx_REG (Pmode, 7),
3498 temp3, addr));
3500 else
3501 ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp3);
3502 break;
3504 case TLS_MODEL_LOCAL_EXEC:
3505 temp1 = gen_reg_rtx (Pmode);
3506 temp2 = gen_reg_rtx (Pmode);
3507 if (TARGET_ARCH32)
3509 emit_insn (gen_tle_hix22_sp32 (temp1, addr));
3510 emit_insn (gen_tle_lox10_sp32 (temp2, temp1, addr));
3512 else
3514 emit_insn (gen_tle_hix22_sp64 (temp1, addr));
3515 emit_insn (gen_tle_lox10_sp64 (temp2, temp1, addr));
3517 ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp2);
3518 break;
3520 default:
3521 abort ();
3524 else
3525 abort (); /* for now ... */
3527 return ret;
3531 /* Legitimize PIC addresses. If the address is already position-independent,
3532 we return ORIG. Newly generated position-independent addresses go into a
3533 reg. This is REG if nonzero, otherwise we allocate register(s) as
3534 necessary. */
3537 legitimize_pic_address (rtx orig, enum machine_mode mode ATTRIBUTE_UNUSED,
3538 rtx reg)
3540 if (GET_CODE (orig) == SYMBOL_REF)
3542 rtx pic_ref, address;
3543 rtx insn;
3545 if (reg == 0)
3547 if (reload_in_progress || reload_completed)
3548 abort ();
3549 else
3550 reg = gen_reg_rtx (Pmode);
3553 if (flag_pic == 2)
3555 /* If not during reload, allocate another temp reg here for loading
3556 in the address, so that these instructions can be optimized
3557 properly. */
3558 rtx temp_reg = ((reload_in_progress || reload_completed)
3559 ? reg : gen_reg_rtx (Pmode));
3561 /* Must put the SYMBOL_REF inside an UNSPEC here so that cse
3562 won't get confused into thinking that these two instructions
3563 are loading in the true address of the symbol. If in the
3564 future a PIC rtx exists, that should be used instead. */
3565 if (Pmode == SImode)
3567 emit_insn (gen_movsi_high_pic (temp_reg, orig));
3568 emit_insn (gen_movsi_lo_sum_pic (temp_reg, temp_reg, orig));
3570 else
3572 emit_insn (gen_movdi_high_pic (temp_reg, orig));
3573 emit_insn (gen_movdi_lo_sum_pic (temp_reg, temp_reg, orig));
3575 address = temp_reg;
3577 else
3578 address = orig;
3580 pic_ref = gen_rtx_MEM (Pmode,
3581 gen_rtx_PLUS (Pmode,
3582 pic_offset_table_rtx, address));
3583 current_function_uses_pic_offset_table = 1;
3584 RTX_UNCHANGING_P (pic_ref) = 1;
3585 insn = emit_move_insn (reg, pic_ref);
3586 /* Put a REG_EQUAL note on this insn, so that it can be optimized
3587 by loop. */
3588 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, orig,
3589 REG_NOTES (insn));
3590 return reg;
3592 else if (GET_CODE (orig) == CONST)
3594 rtx base, offset;
3596 if (GET_CODE (XEXP (orig, 0)) == PLUS
3597 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
3598 return orig;
3600 if (reg == 0)
3602 if (reload_in_progress || reload_completed)
3603 abort ();
3604 else
3605 reg = gen_reg_rtx (Pmode);
3608 if (GET_CODE (XEXP (orig, 0)) == PLUS)
3610 base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode, reg);
3611 offset = legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode,
3612 base == reg ? 0 : reg);
3614 else
3615 abort ();
3617 if (GET_CODE (offset) == CONST_INT)
3619 if (SMALL_INT (offset))
3620 return plus_constant (base, INTVAL (offset));
3621 else if (! reload_in_progress && ! reload_completed)
3622 offset = force_reg (Pmode, offset);
3623 else
3624 /* If we reach here, then something is seriously wrong. */
3625 abort ();
3627 return gen_rtx_PLUS (Pmode, base, offset);
3629 else if (GET_CODE (orig) == LABEL_REF)
3630 /* ??? Why do we do this? */
3631 /* Now movsi_pic_label_ref uses it, but we ought to be checking that
3632 the register is live instead, in case it is eliminated. */
3633 current_function_uses_pic_offset_table = 1;
3635 return orig;
3638 /* Try machine-dependent ways of modifying an illegitimate address X
3639 to be legitimate. If we find one, return the new, valid address.
3641 OLDX is the address as it was before break_out_memory_refs was called.
3642 In some cases it is useful to look at this to decide what needs to be done.
3644 MODE is the mode of the operand pointed to by X. */
3647 legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
3649 rtx orig_x = x;
3651 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == MULT)
3652 x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
3653 force_operand (XEXP (x, 0), NULL_RTX));
3654 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == MULT)
3655 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
3656 force_operand (XEXP (x, 1), NULL_RTX));
3657 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS)
3658 x = gen_rtx_PLUS (Pmode, force_operand (XEXP (x, 0), NULL_RTX),
3659 XEXP (x, 1));
3660 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == PLUS)
3661 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
3662 force_operand (XEXP (x, 1), NULL_RTX));
3664 if (x != orig_x && legitimate_address_p (mode, x, FALSE))
3665 return x;
3667 if (tls_symbolic_operand (x))
3668 x = legitimize_tls_address (x);
3669 else if (flag_pic)
3670 x = legitimize_pic_address (x, mode, 0);
3671 else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 1)))
3672 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
3673 copy_to_mode_reg (Pmode, XEXP (x, 1)));
3674 else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 0)))
3675 x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
3676 copy_to_mode_reg (Pmode, XEXP (x, 0)));
3677 else if (GET_CODE (x) == SYMBOL_REF
3678 || GET_CODE (x) == CONST
3679 || GET_CODE (x) == LABEL_REF)
3680 x = copy_to_suggested_reg (x, NULL_RTX, Pmode);
3681 return x;
3684 /* Emit special PIC prologues. */
3686 void
3687 load_pic_register (void)
3689 /* Labels to get the PC in the prologue of this function. */
3690 int orig_flag_pic = flag_pic;
3692 if (! flag_pic)
3693 abort ();
3695 /* If we haven't emitted the special get_pc helper function, do so now. */
3696 if (get_pc_symbol_name[0] == 0)
3698 int align;
3700 ASM_GENERATE_INTERNAL_LABEL (get_pc_symbol_name, "LGETPC", 0);
3701 text_section ();
3703 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
3704 if (align > 0)
3705 ASM_OUTPUT_ALIGN (asm_out_file, align);
3706 (*targetm.asm_out.internal_label) (asm_out_file, "LGETPC", 0);
3707 fputs ("\tretl\n\tadd\t%o7, %l7, %l7\n", asm_out_file);
3710 /* Initialize every time through, since we can't easily
3711 know this to be permanent. */
3712 global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3713 get_pc_symbol = gen_rtx_SYMBOL_REF (Pmode, get_pc_symbol_name);
3714 flag_pic = 0;
3716 emit_insn (gen_get_pc (pic_offset_table_rtx, global_offset_table,
3717 get_pc_symbol));
3719 flag_pic = orig_flag_pic;
3721 /* Need to emit this whether or not we obey regdecls,
3722 since setjmp/longjmp can cause life info to screw up.
3723 ??? In the case where we don't obey regdecls, this is not sufficient
3724 since we may not fall out the bottom. */
3725 emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
3728 /* Return 1 if RTX is a MEM which is known to be aligned to at
3729 least a DESIRED byte boundary. */
3732 mem_min_alignment (rtx mem, int desired)
3734 rtx addr, base, offset;
3736 /* If it's not a MEM we can't accept it. */
3737 if (GET_CODE (mem) != MEM)
3738 return 0;
3740 addr = XEXP (mem, 0);
3741 base = offset = NULL_RTX;
3742 if (GET_CODE (addr) == PLUS)
3744 if (GET_CODE (XEXP (addr, 0)) == REG)
3746 base = XEXP (addr, 0);
3748 /* What we are saying here is that if the base
3749 REG is aligned properly, the compiler will make
3750 sure any REG based index upon it will be so
3751 as well. */
3752 if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
3753 offset = XEXP (addr, 1);
3754 else
3755 offset = const0_rtx;
3758 else if (GET_CODE (addr) == REG)
3760 base = addr;
3761 offset = const0_rtx;
3764 if (base != NULL_RTX)
3766 int regno = REGNO (base);
3768 if (regno != HARD_FRAME_POINTER_REGNUM && regno != STACK_POINTER_REGNUM)
3770 /* Check if the compiler has recorded some information
3771 about the alignment of the base REG. If reload has
3772 completed, we already matched with proper alignments.
3773 If not running global_alloc, reload might give us
3774 unaligned pointer to local stack though. */
3775 if (((cfun != 0
3776 && REGNO_POINTER_ALIGN (regno) >= desired * BITS_PER_UNIT)
3777 || (optimize && reload_completed))
3778 && (INTVAL (offset) & (desired - 1)) == 0)
3779 return 1;
3781 else
3783 if (((INTVAL (offset) - SPARC_STACK_BIAS) & (desired - 1)) == 0)
3784 return 1;
3787 else if (! TARGET_UNALIGNED_DOUBLES
3788 || CONSTANT_P (addr)
3789 || GET_CODE (addr) == LO_SUM)
3791 /* Anything else we know is properly aligned unless TARGET_UNALIGNED_DOUBLES
3792 is true, in which case we can only assume that an access is aligned if
3793 it is to a constant address, or the address involves a LO_SUM. */
3794 return 1;
3797 /* An obviously unaligned address. */
3798 return 0;
3802 /* Vectors to keep interesting information about registers where it can easily
3803 be got. We used to use the actual mode value as the bit number, but there
3804 are more than 32 modes now. Instead we use two tables: one indexed by
3805 hard register number, and one indexed by mode. */
3807 /* The purpose of sparc_mode_class is to shrink the range of modes so that
3808 they all fit (as bit numbers) in a 32 bit word (again). Each real mode is
3809 mapped into one sparc_mode_class mode. */
3811 enum sparc_mode_class {
3812 S_MODE, D_MODE, T_MODE, O_MODE,
3813 SF_MODE, DF_MODE, TF_MODE, OF_MODE,
3814 CC_MODE, CCFP_MODE
3817 /* Modes for single-word and smaller quantities. */
3818 #define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
3820 /* Modes for double-word and smaller quantities. */
3821 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
3823 /* Modes for quad-word and smaller quantities. */
3824 #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
3826 /* Modes for 8-word and smaller quantities. */
3827 #define O_MODES (T_MODES | (1 << (int) O_MODE) | (1 << (int) OF_MODE))
3829 /* Modes for single-float quantities. We must allow any single word or
3830 smaller quantity. This is because the fix/float conversion instructions
3831 take integer inputs/outputs from the float registers. */
3832 #define SF_MODES (S_MODES)
3834 /* Modes for double-float and smaller quantities. */
3835 #define DF_MODES (S_MODES | D_MODES)
3837 /* Modes for double-float only quantities. */
3838 #define DF_MODES_NO_S ((1 << (int) D_MODE) | (1 << (int) DF_MODE))
3840 /* Modes for quad-float only quantities. */
3841 #define TF_ONLY_MODES (1 << (int) TF_MODE)
3843 /* Modes for quad-float and smaller quantities. */
3844 #define TF_MODES (DF_MODES | TF_ONLY_MODES)
3846 /* Modes for quad-float and double-float quantities. */
3847 #define TF_MODES_NO_S (DF_MODES_NO_S | TF_ONLY_MODES)
3849 /* Modes for quad-float pair only quantities. */
3850 #define OF_ONLY_MODES (1 << (int) OF_MODE)
3852 /* Modes for quad-float pairs and smaller quantities. */
3853 #define OF_MODES (TF_MODES | OF_ONLY_MODES)
3855 #define OF_MODES_NO_S (TF_MODES_NO_S | OF_ONLY_MODES)
3857 /* Modes for condition codes. */
3858 #define CC_MODES (1 << (int) CC_MODE)
3859 #define CCFP_MODES (1 << (int) CCFP_MODE)
3861 /* Value is 1 if register/mode pair is acceptable on sparc.
3862 The funny mixture of D and T modes is because integer operations
3863 do not specially operate on tetra quantities, so non-quad-aligned
3864 registers can hold quadword quantities (except %o4 and %i4 because
3865 they cross fixed registers). */
3867 /* This points to either the 32 bit or the 64 bit version. */
3868 const int *hard_regno_mode_classes;
3870 static const int hard_32bit_mode_classes[] = {
3871 S_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
3872 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
3873 T_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
3874 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
3876 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3877 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3878 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3879 OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
3881 /* FP regs f32 to f63. Only the even numbered registers actually exist,
3882 and none can hold SFmode/SImode values. */
3883 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3884 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3885 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3886 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3888 /* %fcc[0123] */
3889 CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
3891 /* %icc */
3892 CC_MODES
3895 static const int hard_64bit_mode_classes[] = {
3896 D_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
3897 O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
3898 T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
3899 O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
3901 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3902 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3903 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3904 OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
3906 /* FP regs f32 to f63. Only the even numbered registers actually exist,
3907 and none can hold SFmode/SImode values. */
3908 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3909 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3910 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3911 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3913 /* %fcc[0123] */
3914 CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
3916 /* %icc */
3917 CC_MODES
3920 int sparc_mode_class [NUM_MACHINE_MODES];
3922 enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
3924 static void
3925 sparc_init_modes (void)
3927 int i;
3929 for (i = 0; i < NUM_MACHINE_MODES; i++)
3931 switch (GET_MODE_CLASS (i))
3933 case MODE_INT:
3934 case MODE_PARTIAL_INT:
3935 case MODE_COMPLEX_INT:
3936 if (GET_MODE_SIZE (i) <= 4)
3937 sparc_mode_class[i] = 1 << (int) S_MODE;
3938 else if (GET_MODE_SIZE (i) == 8)
3939 sparc_mode_class[i] = 1 << (int) D_MODE;
3940 else if (GET_MODE_SIZE (i) == 16)
3941 sparc_mode_class[i] = 1 << (int) T_MODE;
3942 else if (GET_MODE_SIZE (i) == 32)
3943 sparc_mode_class[i] = 1 << (int) O_MODE;
3944 else
3945 sparc_mode_class[i] = 0;
3946 break;
3947 case MODE_FLOAT:
3948 case MODE_COMPLEX_FLOAT:
3949 if (GET_MODE_SIZE (i) <= 4)
3950 sparc_mode_class[i] = 1 << (int) SF_MODE;
3951 else if (GET_MODE_SIZE (i) == 8)
3952 sparc_mode_class[i] = 1 << (int) DF_MODE;
3953 else if (GET_MODE_SIZE (i) == 16)
3954 sparc_mode_class[i] = 1 << (int) TF_MODE;
3955 else if (GET_MODE_SIZE (i) == 32)
3956 sparc_mode_class[i] = 1 << (int) OF_MODE;
3957 else
3958 sparc_mode_class[i] = 0;
3959 break;
3960 case MODE_CC:
3961 if (i == (int) CCFPmode || i == (int) CCFPEmode)
3962 sparc_mode_class[i] = 1 << (int) CCFP_MODE;
3963 else
3964 sparc_mode_class[i] = 1 << (int) CC_MODE;
3965 break;
3966 default:
3967 sparc_mode_class[i] = 0;
3968 break;
3972 if (TARGET_ARCH64)
3973 hard_regno_mode_classes = hard_64bit_mode_classes;
3974 else
3975 hard_regno_mode_classes = hard_32bit_mode_classes;
3977 /* Initialize the array used by REGNO_REG_CLASS. */
3978 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3980 if (i < 16 && TARGET_V8PLUS)
3981 sparc_regno_reg_class[i] = I64_REGS;
3982 else if (i < 32 || i == FRAME_POINTER_REGNUM)
3983 sparc_regno_reg_class[i] = GENERAL_REGS;
3984 else if (i < 64)
3985 sparc_regno_reg_class[i] = FP_REGS;
3986 else if (i < 96)
3987 sparc_regno_reg_class[i] = EXTRA_FP_REGS;
3988 else if (i < 100)
3989 sparc_regno_reg_class[i] = FPCC_REGS;
3990 else
3991 sparc_regno_reg_class[i] = NO_REGS;
3995 /* Save non call used registers from LOW to HIGH at BASE+OFFSET.
3996 N_REGS is the number of 4-byte regs saved thus far. This applies even to
3997 v9 int regs as it simplifies the code. */
3999 static int
4000 save_regs (FILE *file, int low, int high, const char *base,
4001 int offset, int n_regs, HOST_WIDE_INT real_offset)
4003 int i;
4005 if (TARGET_ARCH64 && high <= 32)
4007 for (i = low; i < high; i++)
4009 if (regs_ever_live[i] && ! call_used_regs[i])
4011 fprintf (file, "\tstx\t%s, [%s+%d]\n",
4012 reg_names[i], base, offset + 4 * n_regs);
4013 if (dwarf2out_do_frame ())
4014 dwarf2out_reg_save ("", i, real_offset + 4 * n_regs);
4015 n_regs += 2;
4019 else
4021 for (i = low; i < high; i += 2)
4023 if (regs_ever_live[i] && ! call_used_regs[i])
4025 if (regs_ever_live[i+1] && ! call_used_regs[i+1])
4027 fprintf (file, "\tstd\t%s, [%s+%d]\n",
4028 reg_names[i], base, offset + 4 * n_regs);
4029 if (dwarf2out_do_frame ())
4031 char *l = dwarf2out_cfi_label ();
4032 dwarf2out_reg_save (l, i, real_offset + 4 * n_regs);
4033 dwarf2out_reg_save (l, i+1, real_offset + 4 * n_regs + 4);
4035 n_regs += 2;
4037 else
4039 fprintf (file, "\tst\t%s, [%s+%d]\n",
4040 reg_names[i], base, offset + 4 * n_regs);
4041 if (dwarf2out_do_frame ())
4042 dwarf2out_reg_save ("", i, real_offset + 4 * n_regs);
4043 n_regs += 2;
4046 else
4048 if (regs_ever_live[i+1] && ! call_used_regs[i+1])
4050 fprintf (file, "\tst\t%s, [%s+%d]\n",
4051 reg_names[i+1], base, offset + 4 * n_regs + 4);
4052 if (dwarf2out_do_frame ())
4053 dwarf2out_reg_save ("", i + 1, real_offset + 4 * n_regs + 4);
4054 n_regs += 2;
4059 return n_regs;
4062 /* Restore non call used registers from LOW to HIGH at BASE+OFFSET.
4064 N_REGS is the number of 4-byte regs saved thus far. This applies even to
4065 v9 int regs as it simplifies the code. */
4067 static int
4068 restore_regs (FILE *file, int low, int high, const char *base,
4069 int offset, int n_regs)
4071 int i;
4073 if (TARGET_ARCH64 && high <= 32)
4075 for (i = low; i < high; i++)
4077 if (regs_ever_live[i] && ! call_used_regs[i])
4078 fprintf (file, "\tldx\t[%s+%d], %s\n",
4079 base, offset + 4 * n_regs, reg_names[i]),
4080 n_regs += 2;
4083 else
4085 for (i = low; i < high; i += 2)
4087 if (regs_ever_live[i] && ! call_used_regs[i])
4088 if (regs_ever_live[i+1] && ! call_used_regs[i+1])
4089 fprintf (file, "\tldd\t[%s+%d], %s\n",
4090 base, offset + 4 * n_regs, reg_names[i]),
4091 n_regs += 2;
4092 else
4093 fprintf (file, "\tld\t[%s+%d], %s\n",
4094 base, offset + 4 * n_regs, reg_names[i]),
4095 n_regs += 2;
4096 else if (regs_ever_live[i+1] && ! call_used_regs[i+1])
4097 fprintf (file, "\tld\t[%s+%d], %s\n",
4098 base, offset + 4 * n_regs + 4, reg_names[i+1]),
4099 n_regs += 2;
4102 return n_regs;
4105 /* Compute the frame size required by the function. This function is called
4106 during the reload pass and also by output_function_prologue(). */
4108 HOST_WIDE_INT
4109 compute_frame_size (HOST_WIDE_INT size, int leaf_function)
4111 int n_regs = 0, i;
4112 int outgoing_args_size = (current_function_outgoing_args_size
4113 + REG_PARM_STACK_SPACE (current_function_decl));
4115 /* N_REGS is the number of 4-byte regs saved thus far. This applies
4116 even to v9 int regs to be consistent with save_regs/restore_regs. */
4118 if (TARGET_ARCH64)
4120 for (i = 0; i < 8; i++)
4121 if (regs_ever_live[i] && ! call_used_regs[i])
4122 n_regs += 2;
4124 else
4126 for (i = 0; i < 8; i += 2)
4127 if ((regs_ever_live[i] && ! call_used_regs[i])
4128 || (regs_ever_live[i+1] && ! call_used_regs[i+1]))
4129 n_regs += 2;
4132 for (i = 32; i < (TARGET_V9 ? 96 : 64); i += 2)
4133 if ((regs_ever_live[i] && ! call_used_regs[i])
4134 || (regs_ever_live[i+1] && ! call_used_regs[i+1]))
4135 n_regs += 2;
4137 /* Set up values for use in `function_epilogue'. */
4138 num_gfregs = n_regs;
4140 if (leaf_function && n_regs == 0
4141 && size == 0 && current_function_outgoing_args_size == 0)
4143 actual_fsize = apparent_fsize = 0;
4145 else
4147 /* We subtract STARTING_FRAME_OFFSET, remember it's negative. */
4148 apparent_fsize = (size - STARTING_FRAME_OFFSET + 7) & -8;
4149 apparent_fsize += n_regs * 4;
4150 actual_fsize = apparent_fsize + ((outgoing_args_size + 7) & -8);
4153 /* Make sure nothing can clobber our register windows.
4154 If a SAVE must be done, or there is a stack-local variable,
4155 the register window area must be allocated.
4156 ??? For v8 we apparently need an additional 8 bytes of reserved space. */
4157 if (leaf_function == 0 || size > 0)
4158 actual_fsize += (16 * UNITS_PER_WORD) + (TARGET_ARCH64 ? 0 : 8);
4160 return SPARC_STACK_ALIGN (actual_fsize);
4163 /* Build big number NUM in register REG and output the result to FILE.
4164 REG is guaranteed to be the only clobbered register. The function
4165 will very likely emit several instructions, so it must not be called
4166 from within a delay slot. */
4168 static void
4169 build_big_number (FILE *file, HOST_WIDE_INT num, const char *reg)
4171 #if HOST_BITS_PER_WIDE_INT == 64
4172 HOST_WIDE_INT high_bits = (num >> 32) & 0xffffffff;
4174 if (high_bits == 0
4175 #else
4176 if (num >= 0
4177 #endif
4178 || ! TARGET_ARCH64)
4180 /* We don't use the 'set' macro because it appears to be broken
4181 in the Solaris 7 assembler. */
4182 fprintf (file, "\tsethi\t%%hi("HOST_WIDE_INT_PRINT_DEC"), %s\n",
4183 num, reg);
4184 if ((num & 0x3ff) != 0)
4185 fprintf (file, "\tor\t%s, %%lo("HOST_WIDE_INT_PRINT_DEC"), %s\n",
4186 reg, num, reg);
4188 #if HOST_BITS_PER_WIDE_INT == 64
4189 else if (high_bits == 0xffffffff) /* && TARGET_ARCH64 */
4190 #else
4191 else /* num < 0 && TARGET_ARCH64 */
4192 #endif
4194 /* Sethi does not sign extend, so we must use a little trickery
4195 to use it for negative numbers. Invert the constant before
4196 loading it in, then use xor immediate to invert the loaded bits
4197 (along with the upper 32 bits) to the desired constant. This
4198 works because the sethi and immediate fields overlap. */
4199 HOST_WIDE_INT inv = ~num;
4200 HOST_WIDE_INT low = -0x400 + (num & 0x3ff);
4202 fprintf (file, "\tsethi\t%%hi("HOST_WIDE_INT_PRINT_DEC"), %s\n",
4203 inv, reg);
4204 fprintf (file, "\txor\t%s, "HOST_WIDE_INT_PRINT_DEC", %s\n",
4205 reg, low, reg);
4207 #if HOST_BITS_PER_WIDE_INT == 64
4208 else /* TARGET_ARCH64 */
4210 /* We don't use the 'setx' macro because if requires a scratch register.
4211 This is the translation of sparc_emit_set_const64_longway into asm.
4212 Hopefully we will soon have prologue/epilogue emitted as RTL. */
4213 HOST_WIDE_INT low1 = (num >> (32 - 12)) & 0xfff;
4214 HOST_WIDE_INT low2 = (num >> (32 - 12 - 12)) & 0xfff;
4215 HOST_WIDE_INT low3 = (num >> (32 - 12 - 12 - 8)) & 0x0ff;
4216 int to_shift = 12;
4218 /* We don't use the 'set' macro because it appears to be broken
4219 in the Solaris 7 assembler. */
4220 fprintf (file, "\tsethi\t%%hi("HOST_WIDE_INT_PRINT_DEC"), %s\n",
4221 high_bits, reg);
4222 if ((high_bits & 0x3ff) != 0)
4223 fprintf (file, "\tor\t%s, %%lo("HOST_WIDE_INT_PRINT_DEC"), %s\n",
4224 reg, high_bits, reg);
4226 if (low1 != 0)
4228 fprintf (file, "\tsllx\t%s, %d, %s\n", reg, to_shift, reg);
4229 fprintf (file, "\tor\t%s, "HOST_WIDE_INT_PRINT_DEC", %s\n",
4230 reg, low1, reg);
4231 to_shift = 12;
4233 else
4235 to_shift += 12;
4237 if (low2 != 0)
4239 fprintf (file, "\tsllx\t%s, %d, %s\n", reg, to_shift, reg);
4240 fprintf (file, "\tor\t%s, "HOST_WIDE_INT_PRINT_DEC", %s\n",
4241 reg, low2, reg);
4242 to_shift = 8;
4244 else
4246 to_shift += 8;
4248 fprintf (file, "\tsllx\t%s, %d, %s\n", reg, to_shift, reg);
4249 if (low3 != 0)
4250 fprintf (file, "\tor\t%s, "HOST_WIDE_INT_PRINT_DEC", %s\n",
4251 reg, low3, reg);
4253 #endif
4256 /* Output any necessary .register pseudo-ops. */
4257 void
4258 sparc_output_scratch_registers (FILE *file ATTRIBUTE_UNUSED)
4260 #ifdef HAVE_AS_REGISTER_PSEUDO_OP
4261 int i;
4263 if (TARGET_ARCH32)
4264 return;
4266 /* Check if %g[2367] were used without
4267 .register being printed for them already. */
4268 for (i = 2; i < 8; i++)
4270 if (regs_ever_live [i]
4271 && ! sparc_hard_reg_printed [i])
4273 sparc_hard_reg_printed [i] = 1;
4274 fprintf (file, "\t.register\t%%g%d, #scratch\n", i);
4276 if (i == 3) i = 5;
4278 #endif
4281 /* This function generates the assembly code for function entry.
4282 FILE is a stdio stream to output the code to.
4283 SIZE is an int: how many units of temporary storage to allocate.
4284 Refer to the array `regs_ever_live' to determine which registers
4285 to save; `regs_ever_live[I]' is nonzero if register number I
4286 is ever used in the function. This macro is responsible for
4287 knowing which registers should not be saved even if used. */
4289 /* On SPARC, move-double insns between fpu and cpu need an 8-byte block
4290 of memory. If any fpu reg is used in the function, we allocate
4291 such a block here, at the bottom of the frame, just in case it's needed.
4293 If this function is a leaf procedure, then we may choose not
4294 to do a "save" insn. The decision about whether or not
4295 to do this is made in regclass.c. */
4297 static void
4298 sparc_output_function_prologue (FILE *file, HOST_WIDE_INT size)
4300 if (TARGET_FLAT)
4301 sparc_flat_function_prologue (file, size);
4302 else
4303 sparc_nonflat_function_prologue (file, size,
4304 current_function_uses_only_leaf_regs);
4307 /* Output code for the function prologue. */
4309 static void
4310 sparc_nonflat_function_prologue (FILE *file, HOST_WIDE_INT size,
4311 int leaf_function)
4313 sparc_output_scratch_registers (file);
4315 /* Need to use actual_fsize, since we are also allocating
4316 space for our callee (and our own register save area). */
4317 actual_fsize = compute_frame_size (size, leaf_function);
4319 if (leaf_function)
4321 frame_base_name = "%sp";
4322 frame_base_offset = actual_fsize + SPARC_STACK_BIAS;
4324 else
4326 frame_base_name = "%fp";
4327 frame_base_offset = SPARC_STACK_BIAS;
4330 /* This is only for the human reader. */
4331 fprintf (file, "\t%s#PROLOGUE# 0\n", ASM_COMMENT_START);
4333 if (actual_fsize == 0)
4334 /* do nothing. */ ;
4335 else if (! leaf_function)
4337 if (actual_fsize <= 4096)
4338 fprintf (file, "\tsave\t%%sp, -"HOST_WIDE_INT_PRINT_DEC", %%sp\n",
4339 actual_fsize);
4340 else if (actual_fsize <= 8192)
4342 fprintf (file, "\tsave\t%%sp, -4096, %%sp\n");
4343 fprintf (file, "\tadd\t%%sp, -"HOST_WIDE_INT_PRINT_DEC", %%sp\n",
4344 actual_fsize - 4096);
4346 else
4348 build_big_number (file, -actual_fsize, "%g1");
4349 fprintf (file, "\tsave\t%%sp, %%g1, %%sp\n");
4352 else /* leaf function */
4354 if (actual_fsize <= 4096)
4355 fprintf (file, "\tadd\t%%sp, -"HOST_WIDE_INT_PRINT_DEC", %%sp\n",
4356 actual_fsize);
4357 else if (actual_fsize <= 8192)
4359 fprintf (file, "\tadd\t%%sp, -4096, %%sp\n");
4360 fprintf (file, "\tadd\t%%sp, -"HOST_WIDE_INT_PRINT_DEC", %%sp\n",
4361 actual_fsize - 4096);
4363 else
4365 build_big_number (file, -actual_fsize, "%g1");
4366 fprintf (file, "\tadd\t%%sp, %%g1, %%sp\n");
4370 if (dwarf2out_do_frame () && actual_fsize)
4372 char *label = dwarf2out_cfi_label ();
4374 /* The canonical frame address refers to the top of the frame. */
4375 dwarf2out_def_cfa (label, (leaf_function ? STACK_POINTER_REGNUM
4376 : HARD_FRAME_POINTER_REGNUM),
4377 frame_base_offset);
4379 if (! leaf_function)
4381 /* Note the register window save. This tells the unwinder that
4382 it needs to restore the window registers from the previous
4383 frame's window save area at 0(cfa). */
4384 dwarf2out_window_save (label);
4386 /* The return address (-8) is now in %i7. */
4387 dwarf2out_return_reg (label, 31);
4391 /* If doing anything with PIC, do it now. */
4392 if (! flag_pic)
4393 fprintf (file, "\t%s#PROLOGUE# 1\n", ASM_COMMENT_START);
4395 /* Call saved registers are saved just above the outgoing argument area. */
4396 if (num_gfregs)
4398 HOST_WIDE_INT offset, real_offset;
4399 int n_regs;
4400 const char *base;
4402 real_offset = -apparent_fsize;
4403 offset = -apparent_fsize + frame_base_offset;
4404 if (offset < -4096 || offset + num_gfregs * 4 > 4096)
4406 /* ??? This might be optimized a little as %g1 might already have a
4407 value close enough that a single add insn will do. */
4408 /* ??? Although, all of this is probably only a temporary fix
4409 because if %g1 can hold a function result, then
4410 output_function_epilogue will lose (the result will get
4411 clobbered). */
4412 build_big_number (file, offset, "%g1");
4413 fprintf (file, "\tadd\t%s, %%g1, %%g1\n", frame_base_name);
4414 base = "%g1";
4415 offset = 0;
4417 else
4419 base = frame_base_name;
4422 n_regs = save_regs (file, 0, 8, base, offset, 0, real_offset);
4423 save_regs (file, 32, TARGET_V9 ? 96 : 64, base, offset, n_regs,
4424 real_offset);
4428 /* Output code to restore any call saved registers. */
4430 static void
4431 output_restore_regs (FILE *file, int leaf_function ATTRIBUTE_UNUSED)
4433 HOST_WIDE_INT offset;
4434 int n_regs;
4435 const char *base;
4437 offset = -apparent_fsize + frame_base_offset;
4438 if (offset < -4096 || offset + num_gfregs * 4 > 4096 - 8 /*double*/)
4440 build_big_number (file, offset, "%g1");
4441 fprintf (file, "\tadd\t%s, %%g1, %%g1\n", frame_base_name);
4442 base = "%g1";
4443 offset = 0;
4445 else
4447 base = frame_base_name;
4450 n_regs = restore_regs (file, 0, 8, base, offset, 0);
4451 restore_regs (file, 32, TARGET_V9 ? 96 : 64, base, offset, n_regs);
4454 /* This function generates the assembly code for function exit,
4455 on machines that need it.
4457 The function epilogue should not depend on the current stack pointer!
4458 It should use the frame pointer only. This is mandatory because
4459 of alloca; we also take advantage of it to omit stack adjustments
4460 before returning. */
4462 static void
4463 sparc_output_function_epilogue (FILE *file, HOST_WIDE_INT size)
4465 if (TARGET_FLAT)
4466 sparc_flat_function_epilogue (file, size);
4467 else
4468 sparc_nonflat_function_epilogue (file, size,
4469 current_function_uses_only_leaf_regs);
4472 /* Output code for the function epilogue. */
4474 static void
4475 sparc_nonflat_function_epilogue (FILE *file,
4476 HOST_WIDE_INT size ATTRIBUTE_UNUSED,
4477 int leaf_function)
4479 const char *ret;
4481 if (current_function_epilogue_delay_list == 0)
4483 /* If code does not drop into the epilogue, we need
4484 do nothing except output pending case vectors.
4486 We have to still output a dummy nop for the sake of
4487 sane backtraces. Otherwise, if the last two instructions
4488 of a function were call foo; dslot; this can make the return
4489 PC of foo (ie. address of call instruction plus 8) point to
4490 the first instruction in the next function. */
4491 rtx insn, last_real_insn;
4493 insn = get_last_insn ();
4495 last_real_insn = prev_real_insn (insn);
4496 if (last_real_insn
4497 && GET_CODE (last_real_insn) == INSN
4498 && GET_CODE (PATTERN (last_real_insn)) == SEQUENCE)
4499 last_real_insn = XVECEXP (PATTERN (last_real_insn), 0, 0);
4501 if (last_real_insn && GET_CODE (last_real_insn) == CALL_INSN)
4502 fputs("\tnop\n", file);
4504 if (GET_CODE (insn) == NOTE)
4505 insn = prev_nonnote_insn (insn);
4506 if (insn && GET_CODE (insn) == BARRIER)
4507 goto output_vectors;
4510 if (num_gfregs)
4511 output_restore_regs (file, leaf_function);
4513 /* Work out how to skip the caller's unimp instruction if required. */
4514 if (leaf_function)
4515 ret = (SKIP_CALLERS_UNIMP_P ? "jmp\t%o7+12" : "retl");
4516 else
4517 ret = (SKIP_CALLERS_UNIMP_P ? "jmp\t%i7+12" : "ret");
4519 if (! leaf_function)
4521 if (current_function_calls_eh_return)
4523 if (current_function_epilogue_delay_list)
4524 abort ();
4525 if (SKIP_CALLERS_UNIMP_P)
4526 abort ();
4528 fputs ("\trestore\n\tretl\n\tadd\t%sp, %g1, %sp\n", file);
4530 /* If we wound up with things in our delay slot, flush them here. */
4531 else if (current_function_epilogue_delay_list)
4533 rtx delay = PATTERN (XEXP (current_function_epilogue_delay_list, 0));
4535 if (TARGET_V9 && ! epilogue_renumber (&delay, 1))
4537 epilogue_renumber (&delay, 0);
4538 fputs (SKIP_CALLERS_UNIMP_P
4539 ? "\treturn\t%i7+12\n"
4540 : "\treturn\t%i7+8\n", file);
4541 final_scan_insn (XEXP (current_function_epilogue_delay_list, 0),
4542 file, 1, 0, 0);
4544 else
4546 rtx insn, src;
4548 if (GET_CODE (delay) != SET)
4549 abort();
4551 src = SET_SRC (delay);
4552 if (GET_CODE (src) == ASHIFT)
4554 if (XEXP (src, 1) != const1_rtx)
4555 abort();
4556 SET_SRC (delay)
4557 = gen_rtx_PLUS (GET_MODE (src), XEXP (src, 0),
4558 XEXP (src, 0));
4561 insn = gen_rtx_PARALLEL (VOIDmode,
4562 gen_rtvec (2, delay,
4563 gen_rtx_RETURN (VOIDmode)));
4564 insn = emit_jump_insn (insn);
4566 sparc_emitting_epilogue = true;
4567 final_scan_insn (insn, file, 1, 0, 1);
4568 sparc_emitting_epilogue = false;
4571 else if (TARGET_V9 && ! SKIP_CALLERS_UNIMP_P)
4572 fputs ("\treturn\t%i7+8\n\tnop\n", file);
4573 else
4574 fprintf (file, "\t%s\n\trestore\n", ret);
4576 /* All of the following cases are for leaf functions. */
4577 else if (current_function_calls_eh_return)
4578 abort ();
4579 else if (current_function_epilogue_delay_list)
4581 /* eligible_for_epilogue_delay_slot ensures that if this is a
4582 leaf function, then we will only have insn in the delay slot
4583 if the frame size is zero, thus no adjust for the stack is
4584 needed here. */
4585 if (actual_fsize != 0)
4586 abort ();
4587 fprintf (file, "\t%s\n", ret);
4588 final_scan_insn (XEXP (current_function_epilogue_delay_list, 0),
4589 file, 1, 0, 1);
4591 /* Output 'nop' instead of 'sub %sp,-0,%sp' when no frame, so as to
4592 avoid generating confusing assembly language output. */
4593 else if (actual_fsize == 0)
4594 fprintf (file, "\t%s\n\tnop\n", ret);
4595 else if (actual_fsize <= 4096)
4596 fprintf (file, "\t%s\n\tsub\t%%sp, -"HOST_WIDE_INT_PRINT_DEC", %%sp\n",
4597 ret, actual_fsize);
4598 else if (actual_fsize <= 8192)
4599 fprintf (file, "\tsub\t%%sp, -4096, %%sp\n\t%s\n\tsub\t%%sp, -"HOST_WIDE_INT_PRINT_DEC", %%sp\n",
4600 ret, actual_fsize - 4096);
4601 else
4603 build_big_number (file, actual_fsize, "%g1");
4604 fprintf (file, "\t%s\n\tadd\t%%sp, %%g1, %%sp\n", ret);
4607 output_vectors:
4608 sparc_output_deferred_case_vectors ();
4611 /* Output a sibling call. */
4613 const char *
4614 output_sibcall (rtx insn, rtx call_operand)
4616 int leaf_regs = current_function_uses_only_leaf_regs;
4617 rtx operands[3];
4618 int delay_slot = dbr_sequence_length () > 0;
4620 if (num_gfregs)
4622 /* Call to restore global regs might clobber
4623 the delay slot. Instead of checking for this
4624 output the delay slot now. */
4625 if (delay_slot)
4627 rtx delay = NEXT_INSN (insn);
4629 if (! delay)
4630 abort ();
4632 final_scan_insn (delay, asm_out_file, 1, 0, 1);
4633 PATTERN (delay) = gen_blockage ();
4634 INSN_CODE (delay) = -1;
4635 delay_slot = 0;
4637 output_restore_regs (asm_out_file, leaf_regs);
4640 operands[0] = call_operand;
4642 if (leaf_regs)
4644 #ifdef HAVE_AS_RELAX_OPTION
4645 /* If as and ld are relaxing tail call insns into branch always,
4646 use or %o7,%g0,X; call Y; or X,%g0,%o7 always, so that it can
4647 be optimized. With sethi/jmpl as nor ld has no easy way how to
4648 find out if somebody does not branch between the sethi and jmpl. */
4649 int spare_slot = 0;
4650 #else
4651 int spare_slot = ((TARGET_ARCH32 || TARGET_CM_MEDLOW) && ! flag_pic);
4652 #endif
4653 HOST_WIDE_INT size = 0;
4655 if ((actual_fsize || ! spare_slot) && delay_slot)
4657 rtx delay = NEXT_INSN (insn);
4659 if (! delay)
4660 abort ();
4662 final_scan_insn (delay, asm_out_file, 1, 0, 1);
4663 PATTERN (delay) = gen_blockage ();
4664 INSN_CODE (delay) = -1;
4665 delay_slot = 0;
4667 if (actual_fsize)
4669 if (actual_fsize <= 4096)
4670 size = actual_fsize;
4671 else if (actual_fsize <= 8192)
4673 fputs ("\tsub\t%sp, -4096, %sp\n", asm_out_file);
4674 size = actual_fsize - 4096;
4676 else
4678 build_big_number (asm_out_file, actual_fsize, "%g1");
4679 fputs ("\tadd\t%%sp, %%g1, %%sp\n", asm_out_file);
4682 if (spare_slot)
4684 output_asm_insn ("sethi\t%%hi(%a0), %%g1", operands);
4685 output_asm_insn ("jmpl\t%%g1 + %%lo(%a0), %%g0", operands);
4686 if (size)
4687 fprintf (asm_out_file, "\t sub\t%%sp, -"HOST_WIDE_INT_PRINT_DEC", %%sp\n", size);
4688 else if (! delay_slot)
4689 fputs ("\t nop\n", asm_out_file);
4691 else
4693 if (size)
4694 fprintf (asm_out_file, "\tsub\t%%sp, -"HOST_WIDE_INT_PRINT_DEC", %%sp\n", size);
4695 /* Use or with rs2 %%g0 instead of mov, so that as/ld can optimize
4696 it into branch if possible. */
4697 output_asm_insn ("or\t%%o7, %%g0, %%g1", operands);
4698 output_asm_insn ("call\t%a0, 0", operands);
4699 output_asm_insn (" or\t%%g1, %%g0, %%o7", operands);
4701 return "";
4704 output_asm_insn ("call\t%a0, 0", operands);
4705 if (delay_slot)
4707 rtx delay = NEXT_INSN (insn), pat;
4709 if (! delay)
4710 abort ();
4712 pat = PATTERN (delay);
4713 if (GET_CODE (pat) != SET)
4714 abort ();
4716 operands[0] = SET_DEST (pat);
4717 pat = SET_SRC (pat);
4718 switch (GET_CODE (pat))
4720 case PLUS:
4721 operands[1] = XEXP (pat, 0);
4722 operands[2] = XEXP (pat, 1);
4723 output_asm_insn (" restore %r1, %2, %Y0", operands);
4724 break;
4725 case LO_SUM:
4726 operands[1] = XEXP (pat, 0);
4727 operands[2] = XEXP (pat, 1);
4728 output_asm_insn (" restore %r1, %%lo(%a2), %Y0", operands);
4729 break;
4730 case ASHIFT:
4731 operands[1] = XEXP (pat, 0);
4732 output_asm_insn (" restore %r1, %r1, %Y0", operands);
4733 break;
4734 default:
4735 operands[1] = pat;
4736 output_asm_insn (" restore %%g0, %1, %Y0", operands);
4737 break;
4739 PATTERN (delay) = gen_blockage ();
4740 INSN_CODE (delay) = -1;
4742 else
4743 fputs ("\t restore\n", asm_out_file);
4744 return "";
4747 /* Functions for handling argument passing.
4749 For v8 the first six args are normally in registers and the rest are
4750 pushed. Any arg that starts within the first 6 words is at least
4751 partially passed in a register unless its data type forbids.
4753 For v9, the argument registers are laid out as an array of 16 elements
4754 and arguments are added sequentially. The first 6 int args and up to the
4755 first 16 fp args (depending on size) are passed in regs.
4757 Slot Stack Integral Float Float in structure Double Long Double
4758 ---- ----- -------- ----- ------------------ ------ -----------
4759 15 [SP+248] %f31 %f30,%f31 %d30
4760 14 [SP+240] %f29 %f28,%f29 %d28 %q28
4761 13 [SP+232] %f27 %f26,%f27 %d26
4762 12 [SP+224] %f25 %f24,%f25 %d24 %q24
4763 11 [SP+216] %f23 %f22,%f23 %d22
4764 10 [SP+208] %f21 %f20,%f21 %d20 %q20
4765 9 [SP+200] %f19 %f18,%f19 %d18
4766 8 [SP+192] %f17 %f16,%f17 %d16 %q16
4767 7 [SP+184] %f15 %f14,%f15 %d14
4768 6 [SP+176] %f13 %f12,%f13 %d12 %q12
4769 5 [SP+168] %o5 %f11 %f10,%f11 %d10
4770 4 [SP+160] %o4 %f9 %f8,%f9 %d8 %q8
4771 3 [SP+152] %o3 %f7 %f6,%f7 %d6
4772 2 [SP+144] %o2 %f5 %f4,%f5 %d4 %q4
4773 1 [SP+136] %o1 %f3 %f2,%f3 %d2
4774 0 [SP+128] %o0 %f1 %f0,%f1 %d0 %q0
4776 Here SP = %sp if -mno-stack-bias or %sp+stack_bias otherwise.
4778 Integral arguments are always passed as 64 bit quantities appropriately
4779 extended.
4781 Passing of floating point values is handled as follows.
4782 If a prototype is in scope:
4783 If the value is in a named argument (i.e. not a stdarg function or a
4784 value not part of the `...') then the value is passed in the appropriate
4785 fp reg.
4786 If the value is part of the `...' and is passed in one of the first 6
4787 slots then the value is passed in the appropriate int reg.
4788 If the value is part of the `...' and is not passed in one of the first 6
4789 slots then the value is passed in memory.
4790 If a prototype is not in scope:
4791 If the value is one of the first 6 arguments the value is passed in the
4792 appropriate integer reg and the appropriate fp reg.
4793 If the value is not one of the first 6 arguments the value is passed in
4794 the appropriate fp reg and in memory.
4797 /* Maximum number of int regs for args. */
4798 #define SPARC_INT_ARG_MAX 6
4799 /* Maximum number of fp regs for args. */
4800 #define SPARC_FP_ARG_MAX 16
4802 #define ROUND_ADVANCE(SIZE) (((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
4804 /* Handle the INIT_CUMULATIVE_ARGS macro.
4805 Initialize a variable CUM of type CUMULATIVE_ARGS
4806 for a call to a function whose data type is FNTYPE.
4807 For a library call, FNTYPE is 0. */
4809 void
4810 init_cumulative_args (struct sparc_args *cum, tree fntype,
4811 rtx libname ATTRIBUTE_UNUSED,
4812 tree fndecl ATTRIBUTE_UNUSED)
4814 cum->words = 0;
4815 cum->prototype_p = fntype && TYPE_ARG_TYPES (fntype);
4816 cum->libcall_p = fntype == 0;
4819 /* Compute the slot number to pass an argument in.
4820 Returns the slot number or -1 if passing on the stack.
4822 CUM is a variable of type CUMULATIVE_ARGS which gives info about
4823 the preceding args and about the function being called.
4824 MODE is the argument's machine mode.
4825 TYPE is the data type of the argument (as a tree).
4826 This is null for libcalls where that information may
4827 not be available.
4828 NAMED is nonzero if this argument is a named parameter
4829 (otherwise it is an extra parameter matching an ellipsis).
4830 INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG.
4831 *PREGNO records the register number to use if scalar type.
4832 *PPADDING records the amount of padding needed in words. */
4834 static int
4835 function_arg_slotno (const struct sparc_args *cum, enum machine_mode mode,
4836 tree type, int named, int incoming_p,
4837 int *pregno, int *ppadding)
4839 int regbase = (incoming_p
4840 ? SPARC_INCOMING_INT_ARG_FIRST
4841 : SPARC_OUTGOING_INT_ARG_FIRST);
4842 int slotno = cum->words;
4843 int regno;
4845 *ppadding = 0;
4847 if (type != 0 && TREE_ADDRESSABLE (type))
4848 return -1;
4849 if (TARGET_ARCH32
4850 && type != 0 && mode == BLKmode
4851 && TYPE_ALIGN (type) % PARM_BOUNDARY != 0)
4852 return -1;
4854 switch (mode)
4856 case VOIDmode :
4857 /* MODE is VOIDmode when generating the actual call.
4858 See emit_call_1. */
4859 return -1;
4861 case QImode : case CQImode :
4862 case HImode : case CHImode :
4863 case SImode : case CSImode :
4864 case DImode : case CDImode :
4865 case TImode : case CTImode :
4866 if (slotno >= SPARC_INT_ARG_MAX)
4867 return -1;
4868 regno = regbase + slotno;
4869 break;
4871 case SFmode : case SCmode :
4872 case DFmode : case DCmode :
4873 case TFmode : case TCmode :
4874 if (TARGET_ARCH32)
4876 if (slotno >= SPARC_INT_ARG_MAX)
4877 return -1;
4878 regno = regbase + slotno;
4880 else
4882 if ((mode == TFmode || mode == TCmode)
4883 && (slotno & 1) != 0)
4884 slotno++, *ppadding = 1;
4885 if (TARGET_FPU && named)
4887 if (slotno >= SPARC_FP_ARG_MAX)
4888 return -1;
4889 regno = SPARC_FP_ARG_FIRST + slotno * 2;
4890 if (mode == SFmode)
4891 regno++;
4893 else
4895 if (slotno >= SPARC_INT_ARG_MAX)
4896 return -1;
4897 regno = regbase + slotno;
4900 break;
4902 case BLKmode :
4903 /* For sparc64, objects requiring 16 byte alignment get it. */
4904 if (TARGET_ARCH64)
4906 if (type && TYPE_ALIGN (type) == 128 && (slotno & 1) != 0)
4907 slotno++, *ppadding = 1;
4910 if (TARGET_ARCH32
4911 || (type && TREE_CODE (type) == UNION_TYPE))
4913 if (slotno >= SPARC_INT_ARG_MAX)
4914 return -1;
4915 regno = regbase + slotno;
4917 else
4919 tree field;
4920 int intregs_p = 0, fpregs_p = 0;
4921 /* The ABI obviously doesn't specify how packed
4922 structures are passed. These are defined to be passed
4923 in int regs if possible, otherwise memory. */
4924 int packed_p = 0;
4926 /* First see what kinds of registers we need. */
4927 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4929 if (TREE_CODE (field) == FIELD_DECL)
4931 if (TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
4932 && TARGET_FPU)
4933 fpregs_p = 1;
4934 else
4935 intregs_p = 1;
4936 if (DECL_PACKED (field))
4937 packed_p = 1;
4940 if (packed_p || !named)
4941 fpregs_p = 0, intregs_p = 1;
4943 /* If all arg slots are filled, then must pass on stack. */
4944 if (fpregs_p && slotno >= SPARC_FP_ARG_MAX)
4945 return -1;
4946 /* If there are only int args and all int arg slots are filled,
4947 then must pass on stack. */
4948 if (!fpregs_p && intregs_p && slotno >= SPARC_INT_ARG_MAX)
4949 return -1;
4950 /* Note that even if all int arg slots are filled, fp members may
4951 still be passed in regs if such regs are available.
4952 *PREGNO isn't set because there may be more than one, it's up
4953 to the caller to compute them. */
4954 return slotno;
4956 break;
4958 default :
4959 abort ();
4962 *pregno = regno;
4963 return slotno;
4966 /* Handle recursive register counting for structure field layout. */
4968 struct function_arg_record_value_parms
4970 rtx ret; /* return expression being built. */
4971 int slotno; /* slot number of the argument. */
4972 int named; /* whether the argument is named. */
4973 int regbase; /* regno of the base register. */
4974 int stack; /* 1 if part of the argument is on the stack. */
4975 int intoffset; /* offset of the pending integer field. */
4976 unsigned int nregs; /* number of words passed in registers. */
4979 static void function_arg_record_value_3
4980 (HOST_WIDE_INT, struct function_arg_record_value_parms *);
4981 static void function_arg_record_value_2
4982 (tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool);
4983 static void function_arg_record_value_1
4984 (tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool);
4985 static rtx function_arg_record_value (tree, enum machine_mode, int, int, int);
4987 /* A subroutine of function_arg_record_value. Traverse the structure
4988 recursively and determine how many registers will be required. */
4990 static void
4991 function_arg_record_value_1 (tree type, HOST_WIDE_INT startbitpos,
4992 struct function_arg_record_value_parms *parms,
4993 bool packed_p)
4995 tree field;
4997 /* We need to compute how many registers are needed so we can
4998 allocate the PARALLEL but before we can do that we need to know
4999 whether there are any packed fields. The ABI obviously doesn't
5000 specify how structures are passed in this case, so they are
5001 defined to be passed in int regs if possible, otherwise memory,
5002 regardless of whether there are fp values present. */
5004 if (! packed_p)
5005 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5007 if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
5009 packed_p = true;
5010 break;
5014 /* Compute how many registers we need. */
5015 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5017 if (TREE_CODE (field) == FIELD_DECL)
5019 HOST_WIDE_INT bitpos = startbitpos;
5021 if (DECL_SIZE (field) != 0
5022 && host_integerp (bit_position (field), 1))
5023 bitpos += int_bit_position (field);
5025 /* ??? FIXME: else assume zero offset. */
5027 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
5028 function_arg_record_value_1 (TREE_TYPE (field),
5029 bitpos,
5030 parms,
5031 packed_p);
5032 else if ((TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
5033 || (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE
5034 && (TREE_CODE (TREE_TYPE (TREE_TYPE (field)))
5035 == REAL_TYPE)))
5036 && TARGET_FPU
5037 && ! packed_p
5038 && parms->named)
5040 if (parms->intoffset != -1)
5042 int intslots, this_slotno;
5044 intslots = (bitpos - parms->intoffset + BITS_PER_WORD - 1)
5045 / BITS_PER_WORD;
5046 this_slotno = parms->slotno + parms->intoffset
5047 / BITS_PER_WORD;
5049 if (intslots > 0 && intslots > SPARC_INT_ARG_MAX - this_slotno)
5051 intslots = MAX (0, SPARC_INT_ARG_MAX - this_slotno);
5052 /* We need to pass this field on the stack. */
5053 parms->stack = 1;
5056 parms->nregs += intslots;
5057 parms->intoffset = -1;
5060 /* There's no need to check this_slotno < SPARC_FP_ARG MAX.
5061 If it wasn't true we wouldn't be here. */
5062 parms->nregs += 1;
5063 if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
5064 parms->nregs += 1;
5066 else
5068 if (parms->intoffset == -1)
5069 parms->intoffset = bitpos;
5075 /* A subroutine of function_arg_record_value. Assign the bits of the
5076 structure between parms->intoffset and bitpos to integer registers. */
5078 static void
5079 function_arg_record_value_3 (HOST_WIDE_INT bitpos,
5080 struct function_arg_record_value_parms *parms)
5082 enum machine_mode mode;
5083 unsigned int regno;
5084 unsigned int startbit, endbit;
5085 int this_slotno, intslots, intoffset;
5086 rtx reg;
5088 if (parms->intoffset == -1)
5089 return;
5091 intoffset = parms->intoffset;
5092 parms->intoffset = -1;
5094 startbit = intoffset & -BITS_PER_WORD;
5095 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
5096 intslots = (endbit - startbit) / BITS_PER_WORD;
5097 this_slotno = parms->slotno + intoffset / BITS_PER_WORD;
5099 intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno);
5100 if (intslots <= 0)
5101 return;
5103 /* If this is the trailing part of a word, only load that much into
5104 the register. Otherwise load the whole register. Note that in
5105 the latter case we may pick up unwanted bits. It's not a problem
5106 at the moment but may wish to revisit. */
5108 if (intoffset % BITS_PER_WORD != 0)
5109 mode = mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
5110 MODE_INT, 0);
5111 else
5112 mode = word_mode;
5114 intoffset /= BITS_PER_UNIT;
5117 regno = parms->regbase + this_slotno;
5118 reg = gen_rtx_REG (mode, regno);
5119 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
5120 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
5122 this_slotno += 1;
5123 intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
5124 parms->nregs += 1;
5125 intslots -= 1;
5127 while (intslots > 0);
5130 /* A subroutine of function_arg_record_value. Traverse the structure
5131 recursively and assign bits to floating point registers. Track which
5132 bits in between need integer registers; invoke function_arg_record_value_3
5133 to make that happen. */
5135 static void
5136 function_arg_record_value_2 (tree type, HOST_WIDE_INT startbitpos,
5137 struct function_arg_record_value_parms *parms,
5138 bool packed_p)
5140 tree field;
5142 if (! packed_p)
5143 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5145 if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
5147 packed_p = true;
5148 break;
5152 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5154 if (TREE_CODE (field) == FIELD_DECL)
5156 HOST_WIDE_INT bitpos = startbitpos;
5158 if (DECL_SIZE (field) != 0
5159 && host_integerp (bit_position (field), 1))
5160 bitpos += int_bit_position (field);
5162 /* ??? FIXME: else assume zero offset. */
5164 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
5165 function_arg_record_value_2 (TREE_TYPE (field),
5166 bitpos,
5167 parms,
5168 packed_p);
5169 else if ((TREE_CODE (TREE_TYPE (field)) == REAL_TYPE
5170 || (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE
5171 && (TREE_CODE (TREE_TYPE (TREE_TYPE (field)))
5172 == REAL_TYPE)))
5173 && TARGET_FPU
5174 && ! packed_p
5175 && parms->named)
5177 int this_slotno = parms->slotno + bitpos / BITS_PER_WORD;
5178 int regno;
5179 enum machine_mode mode = DECL_MODE (field);
5180 rtx reg;
5182 function_arg_record_value_3 (bitpos, parms);
5183 regno = SPARC_FP_ARG_FIRST + this_slotno * 2
5184 + ((mode == SFmode || mode == SCmode)
5185 && (bitpos & 32) != 0);
5186 switch (mode)
5188 case SCmode: mode = SFmode; break;
5189 case DCmode: mode = DFmode; break;
5190 case TCmode: mode = TFmode; break;
5191 default: break;
5193 reg = gen_rtx_REG (mode, regno);
5194 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
5195 = gen_rtx_EXPR_LIST (VOIDmode, reg,
5196 GEN_INT (bitpos / BITS_PER_UNIT));
5197 parms->nregs += 1;
5198 if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
5200 regno += GET_MODE_SIZE (mode) / 4;
5201 reg = gen_rtx_REG (mode, regno);
5202 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
5203 = gen_rtx_EXPR_LIST (VOIDmode, reg,
5204 GEN_INT ((bitpos + GET_MODE_BITSIZE (mode))
5205 / BITS_PER_UNIT));
5206 parms->nregs += 1;
5209 else
5211 if (parms->intoffset == -1)
5212 parms->intoffset = bitpos;
5218 /* Used by function_arg and function_value to implement the complex
5219 conventions of the 64-bit ABI for passing and returning structures.
5220 Return an expression valid as a return value for the two macros
5221 FUNCTION_ARG and FUNCTION_VALUE.
5223 TYPE is the data type of the argument (as a tree).
5224 This is null for libcalls where that information may
5225 not be available.
5226 MODE is the argument's machine mode.
5227 SLOTNO is the index number of the argument's slot in the parameter array.
5228 NAMED is nonzero if this argument is a named parameter
5229 (otherwise it is an extra parameter matching an ellipsis).
5230 REGBASE is the regno of the base register for the parameter array. */
5232 static rtx
5233 function_arg_record_value (tree type, enum machine_mode mode,
5234 int slotno, int named, int regbase)
5236 HOST_WIDE_INT typesize = int_size_in_bytes (type);
5237 struct function_arg_record_value_parms parms;
5238 unsigned int nregs;
5240 parms.ret = NULL_RTX;
5241 parms.slotno = slotno;
5242 parms.named = named;
5243 parms.regbase = regbase;
5244 parms.stack = 0;
5246 /* Compute how many registers we need. */
5247 parms.nregs = 0;
5248 parms.intoffset = 0;
5249 function_arg_record_value_1 (type, 0, &parms, false);
5251 if (parms.intoffset != -1)
5253 unsigned int startbit, endbit;
5254 int intslots, this_slotno;
5256 startbit = parms.intoffset & -BITS_PER_WORD;
5257 endbit = (typesize*BITS_PER_UNIT + BITS_PER_WORD - 1) & -BITS_PER_WORD;
5258 intslots = (endbit - startbit) / BITS_PER_WORD;
5259 this_slotno = slotno + parms.intoffset / BITS_PER_WORD;
5261 if (intslots > 0 && intslots > SPARC_INT_ARG_MAX - this_slotno)
5263 intslots = MAX (0, SPARC_INT_ARG_MAX - this_slotno);
5264 /* We need to pass this field on the stack. */
5265 parms.stack = 1;
5268 parms.nregs += intslots;
5270 nregs = parms.nregs;
5272 /* Allocate the vector and handle some annoying special cases. */
5273 if (nregs == 0)
5275 /* ??? Empty structure has no value? Duh? */
5276 if (typesize <= 0)
5278 /* Though there's nothing really to store, return a word register
5279 anyway so the rest of gcc doesn't go nuts. Returning a PARALLEL
5280 leads to breakage due to the fact that there are zero bytes to
5281 load. */
5282 return gen_rtx_REG (mode, regbase);
5284 else
5286 /* ??? C++ has structures with no fields, and yet a size. Give up
5287 for now and pass everything back in integer registers. */
5288 nregs = (typesize + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
5290 if (nregs + slotno > SPARC_INT_ARG_MAX)
5291 nregs = SPARC_INT_ARG_MAX - slotno;
5293 if (nregs == 0)
5294 abort ();
5296 parms.ret = gen_rtx_PARALLEL (mode, rtvec_alloc (parms.stack + nregs));
5298 /* If at least one field must be passed on the stack, generate
5299 (parallel [(expr_list (nil) ...) ...]) so that all fields will
5300 also be passed on the stack. We can't do much better because the
5301 semantics of FUNCTION_ARG_PARTIAL_NREGS doesn't handle the case
5302 of structures for which the fields passed exclusively in registers
5303 are not at the beginning of the structure. */
5304 if (parms.stack)
5305 XVECEXP (parms.ret, 0, 0)
5306 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
5308 /* Fill in the entries. */
5309 parms.nregs = 0;
5310 parms.intoffset = 0;
5311 function_arg_record_value_2 (type, 0, &parms, false);
5312 function_arg_record_value_3 (typesize * BITS_PER_UNIT, &parms);
5314 if (parms.nregs != nregs)
5315 abort ();
5317 return parms.ret;
5320 /* Handle the FUNCTION_ARG macro.
5321 Determine where to put an argument to a function.
5322 Value is zero to push the argument on the stack,
5323 or a hard register in which to store the argument.
5325 CUM is a variable of type CUMULATIVE_ARGS which gives info about
5326 the preceding args and about the function being called.
5327 MODE is the argument's machine mode.
5328 TYPE is the data type of the argument (as a tree).
5329 This is null for libcalls where that information may
5330 not be available.
5331 NAMED is nonzero if this argument is a named parameter
5332 (otherwise it is an extra parameter matching an ellipsis).
5333 INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG. */
5336 function_arg (const struct sparc_args *cum, enum machine_mode mode,
5337 tree type, int named, int incoming_p)
5339 int regbase = (incoming_p
5340 ? SPARC_INCOMING_INT_ARG_FIRST
5341 : SPARC_OUTGOING_INT_ARG_FIRST);
5342 int slotno, regno, padding;
5343 rtx reg;
5345 slotno = function_arg_slotno (cum, mode, type, named, incoming_p,
5346 &regno, &padding);
5348 if (slotno == -1)
5349 return 0;
5351 if (TARGET_ARCH32)
5353 reg = gen_rtx_REG (mode, regno);
5354 return reg;
5357 /* v9 fp args in reg slots beyond the int reg slots get passed in regs
5358 but also have the slot allocated for them.
5359 If no prototype is in scope fp values in register slots get passed
5360 in two places, either fp regs and int regs or fp regs and memory. */
5361 if ((GET_MODE_CLASS (mode) == MODE_FLOAT
5362 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5363 && SPARC_FP_REG_P (regno))
5365 reg = gen_rtx_REG (mode, regno);
5366 if (cum->prototype_p || cum->libcall_p)
5368 /* "* 2" because fp reg numbers are recorded in 4 byte
5369 quantities. */
5370 #if 0
5371 /* ??? This will cause the value to be passed in the fp reg and
5372 in the stack. When a prototype exists we want to pass the
5373 value in the reg but reserve space on the stack. That's an
5374 optimization, and is deferred [for a bit]. */
5375 if ((regno - SPARC_FP_ARG_FIRST) >= SPARC_INT_ARG_MAX * 2)
5376 return gen_rtx_PARALLEL (mode,
5377 gen_rtvec (2,
5378 gen_rtx_EXPR_LIST (VOIDmode,
5379 NULL_RTX, const0_rtx),
5380 gen_rtx_EXPR_LIST (VOIDmode,
5381 reg, const0_rtx)));
5382 else
5383 #else
5384 /* ??? It seems that passing back a register even when past
5385 the area declared by REG_PARM_STACK_SPACE will allocate
5386 space appropriately, and will not copy the data onto the
5387 stack, exactly as we desire.
5389 This is due to locate_and_pad_parm being called in
5390 expand_call whenever reg_parm_stack_space > 0, which
5391 while beneficial to our example here, would seem to be
5392 in error from what had been intended. Ho hum... -- r~ */
5393 #endif
5394 return reg;
5396 else
5398 rtx v0, v1;
5400 if ((regno - SPARC_FP_ARG_FIRST) < SPARC_INT_ARG_MAX * 2)
5402 int intreg;
5404 /* On incoming, we don't need to know that the value
5405 is passed in %f0 and %i0, and it confuses other parts
5406 causing needless spillage even on the simplest cases. */
5407 if (incoming_p)
5408 return reg;
5410 intreg = (SPARC_OUTGOING_INT_ARG_FIRST
5411 + (regno - SPARC_FP_ARG_FIRST) / 2);
5413 v0 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
5414 v1 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (mode, intreg),
5415 const0_rtx);
5416 return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
5418 else
5420 v0 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
5421 v1 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
5422 return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
5426 else if (type && TREE_CODE (type) == RECORD_TYPE)
5428 /* Structures up to 16 bytes in size are passed in arg slots on the
5429 stack and are promoted to registers where possible. */
5431 if (int_size_in_bytes (type) > 16)
5432 abort (); /* shouldn't get here */
5434 return function_arg_record_value (type, mode, slotno, named, regbase);
5436 else if (type && TREE_CODE (type) == UNION_TYPE)
5438 enum machine_mode mode;
5439 int bytes = int_size_in_bytes (type);
5441 if (bytes > 16)
5442 abort ();
5444 mode = mode_for_size (bytes * BITS_PER_UNIT, MODE_INT, 0);
5445 reg = gen_rtx_REG (mode, regno);
5447 else
5449 /* Scalar or complex int. */
5450 reg = gen_rtx_REG (mode, regno);
5453 return reg;
5456 /* Handle the FUNCTION_ARG_PARTIAL_NREGS macro.
5457 For an arg passed partly in registers and partly in memory,
5458 this is the number of registers used.
5459 For args passed entirely in registers or entirely in memory, zero.
5461 Any arg that starts in the first 6 regs but won't entirely fit in them
5462 needs partial registers on v8. On v9, structures with integer
5463 values in arg slots 5,6 will be passed in %o5 and SP+176, and complex fp
5464 values that begin in the last fp reg [where "last fp reg" varies with the
5465 mode] will be split between that reg and memory. */
5468 function_arg_partial_nregs (const struct sparc_args *cum,
5469 enum machine_mode mode, tree type, int named)
5471 int slotno, regno, padding;
5473 /* We pass 0 for incoming_p here, it doesn't matter. */
5474 slotno = function_arg_slotno (cum, mode, type, named, 0, &regno, &padding);
5476 if (slotno == -1)
5477 return 0;
5479 if (TARGET_ARCH32)
5481 if ((slotno + (mode == BLKmode
5482 ? ROUND_ADVANCE (int_size_in_bytes (type))
5483 : ROUND_ADVANCE (GET_MODE_SIZE (mode))))
5484 > NPARM_REGS (SImode))
5485 return NPARM_REGS (SImode) - slotno;
5486 return 0;
5488 else
5490 if (type && AGGREGATE_TYPE_P (type))
5492 int size = int_size_in_bytes (type);
5493 int align = TYPE_ALIGN (type);
5495 if (align == 16)
5496 slotno += slotno & 1;
5497 if (size > 8 && size <= 16
5498 && slotno == SPARC_INT_ARG_MAX - 1)
5499 return 1;
5501 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_INT
5502 || (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
5503 && ! (TARGET_FPU && named)))
5505 /* The complex types are passed as packed types. */
5506 if (GET_MODE_SIZE (mode) <= UNITS_PER_WORD)
5507 return 0;
5509 if (GET_MODE_ALIGNMENT (mode) == 128)
5511 slotno += slotno & 1;
5513 /* ??? The mode needs 3 slots? */
5514 if (slotno == SPARC_INT_ARG_MAX - 2)
5515 return 1;
5517 else
5519 if (slotno == SPARC_INT_ARG_MAX - 1)
5520 return 1;
5523 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5525 if (GET_MODE_ALIGNMENT (mode) == 128)
5526 slotno += slotno & 1;
5527 if ((slotno + GET_MODE_SIZE (mode) / UNITS_PER_WORD)
5528 > SPARC_FP_ARG_MAX)
5529 return 1;
5531 return 0;
5535 /* Handle the FUNCTION_ARG_PASS_BY_REFERENCE macro.
5536 !v9: The SPARC ABI stipulates passing struct arguments (of any size) and
5537 quad-precision floats by invisible reference.
5538 v9: Aggregates greater than 16 bytes are passed by reference.
5539 For Pascal, also pass arrays by reference. */
5542 function_arg_pass_by_reference (const struct sparc_args *cum ATTRIBUTE_UNUSED,
5543 enum machine_mode mode, tree type,
5544 int named ATTRIBUTE_UNUSED)
5546 if (TARGET_ARCH32)
5548 return ((type && AGGREGATE_TYPE_P (type))
5549 || mode == TFmode || mode == TCmode);
5551 else
5553 return ((type && TREE_CODE (type) == ARRAY_TYPE)
5554 /* Consider complex values as aggregates, so care
5555 for CTImode and TCmode. */
5556 || GET_MODE_SIZE (mode) > 16
5557 || (type
5558 && AGGREGATE_TYPE_P (type)
5559 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 16));
5563 /* Handle the FUNCTION_ARG_ADVANCE macro.
5564 Update the data in CUM to advance over an argument
5565 of mode MODE and data type TYPE.
5566 TYPE is null for libcalls where that information may not be available. */
5568 void
5569 function_arg_advance (struct sparc_args *cum, enum machine_mode mode,
5570 tree type, int named)
5572 int slotno, regno, padding;
5574 /* We pass 0 for incoming_p here, it doesn't matter. */
5575 slotno = function_arg_slotno (cum, mode, type, named, 0, &regno, &padding);
5577 /* If register required leading padding, add it. */
5578 if (slotno != -1)
5579 cum->words += padding;
5581 if (TARGET_ARCH32)
5583 cum->words += (mode != BLKmode
5584 ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
5585 : ROUND_ADVANCE (int_size_in_bytes (type)));
5587 else
5589 if (type && AGGREGATE_TYPE_P (type))
5591 int size = int_size_in_bytes (type);
5593 if (size <= 8)
5594 ++cum->words;
5595 else if (size <= 16)
5596 cum->words += 2;
5597 else /* passed by reference */
5598 ++cum->words;
5600 else
5602 cum->words += (mode != BLKmode
5603 ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
5604 : ROUND_ADVANCE (int_size_in_bytes (type)));
5609 /* Handle the FUNCTION_ARG_PADDING macro.
5610 For the 64 bit ABI structs are always stored left shifted in their
5611 argument slot. */
5613 enum direction
5614 function_arg_padding (enum machine_mode mode, tree type)
5616 if (TARGET_ARCH64 && type != 0 && AGGREGATE_TYPE_P (type))
5617 return upward;
5619 /* Fall back to the default. */
5620 return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
5623 /* Handle FUNCTION_VALUE, FUNCTION_OUTGOING_VALUE, and LIBCALL_VALUE macros.
5624 For v9, function return values are subject to the same rules as arguments,
5625 except that up to 32-bytes may be returned in registers. */
5628 function_value (tree type, enum machine_mode mode, int incoming_p)
5630 int regno;
5631 int regbase = (incoming_p
5632 ? SPARC_OUTGOING_INT_ARG_FIRST
5633 : SPARC_INCOMING_INT_ARG_FIRST);
5635 if (TARGET_ARCH64 && type)
5637 if (TREE_CODE (type) == RECORD_TYPE)
5639 /* Structures up to 32 bytes in size are passed in registers,
5640 promoted to fp registers where possible. */
5642 if (int_size_in_bytes (type) > 32)
5643 abort (); /* shouldn't get here */
5645 return function_arg_record_value (type, mode, 0, 1, regbase);
5647 else if (AGGREGATE_TYPE_P (type))
5649 /* All other aggregate types are passed in an integer register
5650 in a mode corresponding to the size of the type. */
5651 HOST_WIDE_INT bytes = int_size_in_bytes (type);
5653 if (bytes > 32)
5654 abort ();
5656 mode = mode_for_size (bytes * BITS_PER_UNIT, MODE_INT, 0);
5660 if (TARGET_ARCH64
5661 && GET_MODE_CLASS (mode) == MODE_INT
5662 && GET_MODE_SIZE (mode) < UNITS_PER_WORD
5663 && type && ! AGGREGATE_TYPE_P (type))
5664 mode = DImode;
5666 if (incoming_p)
5667 regno = BASE_RETURN_VALUE_REG (mode);
5668 else
5669 regno = BASE_OUTGOING_VALUE_REG (mode);
5671 return gen_rtx_REG (mode, regno);
5674 /* Do what is necessary for `va_start'. We look at the current function
5675 to determine if stdarg or varargs is used and return the address of
5676 the first unnamed parameter. */
5679 sparc_builtin_saveregs (void)
5681 int first_reg = current_function_args_info.words;
5682 rtx address;
5683 int regno;
5685 for (regno = first_reg; regno < NPARM_REGS (word_mode); regno++)
5686 emit_move_insn (gen_rtx_MEM (word_mode,
5687 gen_rtx_PLUS (Pmode,
5688 frame_pointer_rtx,
5689 GEN_INT (FIRST_PARM_OFFSET (0)
5690 + (UNITS_PER_WORD
5691 * regno)))),
5692 gen_rtx_REG (word_mode,
5693 BASE_INCOMING_ARG_REG (word_mode) + regno));
5695 address = gen_rtx_PLUS (Pmode,
5696 frame_pointer_rtx,
5697 GEN_INT (FIRST_PARM_OFFSET (0)
5698 + UNITS_PER_WORD * first_reg));
5700 return address;
5703 /* Implement `va_start' for varargs and stdarg. */
5705 void
5706 sparc_va_start (tree valist, rtx nextarg)
5708 nextarg = expand_builtin_saveregs ();
5709 std_expand_builtin_va_start (valist, nextarg);
5712 /* Implement `va_arg'. */
5715 sparc_va_arg (tree valist, tree type)
5717 HOST_WIDE_INT size, rsize, align;
5718 tree addr, incr;
5719 rtx addr_rtx;
5720 int indirect = 0;
5722 /* Round up sizeof(type) to a word. */
5723 size = int_size_in_bytes (type);
5724 rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
5725 align = 0;
5727 if (TARGET_ARCH64)
5729 if (TYPE_ALIGN (type) >= 2 * (unsigned) BITS_PER_WORD)
5730 align = 2 * UNITS_PER_WORD;
5732 /* Consider complex values as aggregates, so care
5733 for CTImode and TCmode. */
5734 if ((unsigned HOST_WIDE_INT) size > 16)
5736 indirect = 1;
5737 size = rsize = UNITS_PER_WORD;
5738 align = 0;
5740 else if (AGGREGATE_TYPE_P (type))
5742 /* SPARC-V9 ABI states that structures up to 16 bytes in size
5743 are given whole slots as needed. */
5744 if (size == 0)
5745 size = rsize = UNITS_PER_WORD;
5746 else
5747 size = rsize;
5750 else
5752 if (AGGREGATE_TYPE_P (type)
5753 || TYPE_MODE (type) == TFmode
5754 || TYPE_MODE (type) == TCmode)
5756 indirect = 1;
5757 size = rsize = UNITS_PER_WORD;
5761 incr = valist;
5762 if (align)
5764 incr = fold (build (PLUS_EXPR, ptr_type_node, incr,
5765 build_int_2 (align - 1, 0)));
5766 incr = fold (build (BIT_AND_EXPR, ptr_type_node, incr,
5767 build_int_2 (-align, -1)));
5770 addr = incr = save_expr (incr);
5771 if (BYTES_BIG_ENDIAN && size < rsize)
5773 addr = fold (build (PLUS_EXPR, ptr_type_node, incr,
5774 build_int_2 (rsize - size, 0)));
5776 incr = fold (build (PLUS_EXPR, ptr_type_node, incr,
5777 build_int_2 (rsize, 0)));
5779 incr = build (MODIFY_EXPR, ptr_type_node, valist, incr);
5780 TREE_SIDE_EFFECTS (incr) = 1;
5781 expand_expr (incr, const0_rtx, VOIDmode, EXPAND_NORMAL);
5783 addr_rtx = expand_expr (addr, NULL, Pmode, EXPAND_NORMAL);
5785 /* If the address isn't aligned properly for the type,
5786 we may need to copy to a temporary.
5787 FIXME: This is inefficient. Usually we can do this
5788 in registers. */
5789 if (align == 0
5790 && TYPE_ALIGN (type) > BITS_PER_WORD
5791 && !indirect)
5793 /* FIXME: We really need to specify that the temporary is live
5794 for the whole function because expand_builtin_va_arg wants
5795 the alias set to be get_varargs_alias_set (), but in this
5796 case the alias set is that for TYPE and if the memory gets
5797 reused it will be reused with alias set TYPE. */
5798 rtx tmp = assign_temp (type, 0, 1, 0);
5799 rtx dest_addr;
5801 addr_rtx = force_reg (Pmode, addr_rtx);
5802 addr_rtx = gen_rtx_MEM (BLKmode, addr_rtx);
5803 set_mem_alias_set (addr_rtx, get_varargs_alias_set ());
5804 set_mem_align (addr_rtx, BITS_PER_WORD);
5805 tmp = shallow_copy_rtx (tmp);
5806 PUT_MODE (tmp, BLKmode);
5807 set_mem_alias_set (tmp, 0);
5809 dest_addr = emit_block_move (tmp, addr_rtx, GEN_INT (rsize),
5810 BLOCK_OP_NORMAL);
5811 if (dest_addr != NULL_RTX)
5812 addr_rtx = dest_addr;
5813 else
5814 addr_rtx = XCEXP (tmp, 0, MEM);
5817 if (indirect)
5819 addr_rtx = force_reg (Pmode, addr_rtx);
5820 addr_rtx = gen_rtx_MEM (Pmode, addr_rtx);
5821 set_mem_alias_set (addr_rtx, get_varargs_alias_set ());
5824 return addr_rtx;
5827 /* Return the string to output a conditional branch to LABEL, which is
5828 the operand number of the label. OP is the conditional expression.
5829 XEXP (OP, 0) is assumed to be a condition code register (integer or
5830 floating point) and its mode specifies what kind of comparison we made.
5832 REVERSED is nonzero if we should reverse the sense of the comparison.
5834 ANNUL is nonzero if we should generate an annulling branch.
5836 NOOP is nonzero if we have to follow this branch by a noop.
5838 INSN, if set, is the insn. */
5840 char *
5841 output_cbranch (rtx op, rtx dest, int label, int reversed, int annul,
5842 int noop, rtx insn)
5844 static char string[50];
5845 enum rtx_code code = GET_CODE (op);
5846 rtx cc_reg = XEXP (op, 0);
5847 enum machine_mode mode = GET_MODE (cc_reg);
5848 const char *labelno, *branch;
5849 int spaces = 8, far;
5850 char *p;
5852 /* v9 branches are limited to +-1MB. If it is too far away,
5853 change
5855 bne,pt %xcc, .LC30
5859 be,pn %xcc, .+12
5861 ba .LC30
5865 fbne,a,pn %fcc2, .LC29
5869 fbe,pt %fcc2, .+16
5871 ba .LC29 */
5873 far = get_attr_length (insn) >= 3;
5874 if (reversed ^ far)
5876 /* Reversal of FP compares takes care -- an ordered compare
5877 becomes an unordered compare and vice versa. */
5878 if (mode == CCFPmode || mode == CCFPEmode)
5879 code = reverse_condition_maybe_unordered (code);
5880 else
5881 code = reverse_condition (code);
5884 /* Start by writing the branch condition. */
5885 if (mode == CCFPmode || mode == CCFPEmode)
5887 switch (code)
5889 case NE:
5890 branch = "fbne";
5891 break;
5892 case EQ:
5893 branch = "fbe";
5894 break;
5895 case GE:
5896 branch = "fbge";
5897 break;
5898 case GT:
5899 branch = "fbg";
5900 break;
5901 case LE:
5902 branch = "fble";
5903 break;
5904 case LT:
5905 branch = "fbl";
5906 break;
5907 case UNORDERED:
5908 branch = "fbu";
5909 break;
5910 case ORDERED:
5911 branch = "fbo";
5912 break;
5913 case UNGT:
5914 branch = "fbug";
5915 break;
5916 case UNLT:
5917 branch = "fbul";
5918 break;
5919 case UNEQ:
5920 branch = "fbue";
5921 break;
5922 case UNGE:
5923 branch = "fbuge";
5924 break;
5925 case UNLE:
5926 branch = "fbule";
5927 break;
5928 case LTGT:
5929 branch = "fblg";
5930 break;
5932 default:
5933 abort ();
5936 /* ??? !v9: FP branches cannot be preceded by another floating point
5937 insn. Because there is currently no concept of pre-delay slots,
5938 we can fix this only by always emitting a nop before a floating
5939 point branch. */
5941 string[0] = '\0';
5942 if (! TARGET_V9)
5943 strcpy (string, "nop\n\t");
5944 strcat (string, branch);
5946 else
5948 switch (code)
5950 case NE:
5951 branch = "bne";
5952 break;
5953 case EQ:
5954 branch = "be";
5955 break;
5956 case GE:
5957 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
5958 branch = "bpos";
5959 else
5960 branch = "bge";
5961 break;
5962 case GT:
5963 branch = "bg";
5964 break;
5965 case LE:
5966 branch = "ble";
5967 break;
5968 case LT:
5969 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
5970 branch = "bneg";
5971 else
5972 branch = "bl";
5973 break;
5974 case GEU:
5975 branch = "bgeu";
5976 break;
5977 case GTU:
5978 branch = "bgu";
5979 break;
5980 case LEU:
5981 branch = "bleu";
5982 break;
5983 case LTU:
5984 branch = "blu";
5985 break;
5987 default:
5988 abort ();
5990 strcpy (string, branch);
5992 spaces -= strlen (branch);
5993 p = strchr (string, '\0');
5995 /* Now add the annulling, the label, and a possible noop. */
5996 if (annul && ! far)
5998 strcpy (p, ",a");
5999 p += 2;
6000 spaces -= 2;
6003 if (! TARGET_V9)
6004 labelno = "";
6005 else
6007 rtx note;
6008 int v8 = 0;
6010 if (! far && insn && INSN_ADDRESSES_SET_P ())
6012 int delta = (INSN_ADDRESSES (INSN_UID (dest))
6013 - INSN_ADDRESSES (INSN_UID (insn)));
6014 /* Leave some instructions for "slop". */
6015 if (delta < -260000 || delta >= 260000)
6016 v8 = 1;
6019 if (mode == CCFPmode || mode == CCFPEmode)
6021 static char v9_fcc_labelno[] = "%%fccX, ";
6022 /* Set the char indicating the number of the fcc reg to use. */
6023 v9_fcc_labelno[5] = REGNO (cc_reg) - SPARC_FIRST_V9_FCC_REG + '0';
6024 labelno = v9_fcc_labelno;
6025 if (v8)
6027 if (REGNO (cc_reg) == SPARC_FCC_REG)
6028 labelno = "";
6029 else
6030 abort ();
6033 else if (mode == CCXmode || mode == CCX_NOOVmode)
6035 labelno = "%%xcc, ";
6036 if (v8)
6037 abort ();
6039 else
6041 labelno = "%%icc, ";
6042 if (v8)
6043 labelno = "";
6046 if (*labelno && insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
6048 strcpy (p,
6049 ((INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ^ far)
6050 ? ",pt" : ",pn");
6051 p += 3;
6052 spaces -= 3;
6055 if (spaces > 0)
6056 *p++ = '\t';
6057 else
6058 *p++ = ' ';
6059 strcpy (p, labelno);
6060 p = strchr (p, '\0');
6061 if (far)
6063 strcpy (p, ".+12\n\tnop\n\tb\t");
6064 if (annul || noop)
6065 p[3] = '6';
6066 p += 13;
6068 *p++ = '%';
6069 *p++ = 'l';
6070 /* Set the char indicating the number of the operand containing the
6071 label_ref. */
6072 *p++ = label + '0';
6073 *p = '\0';
6074 if (noop)
6075 strcpy (p, "\n\tnop");
6077 return string;
6080 /* Emit a library call comparison between floating point X and Y.
6081 COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).
6082 TARGET_ARCH64 uses _Qp_* functions, which use pointers to TFmode
6083 values as arguments instead of the TFmode registers themselves,
6084 that's why we cannot call emit_float_lib_cmp. */
6085 void
6086 sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
6088 const char *qpfunc;
6089 rtx slot0, slot1, result, tem, tem2;
6090 enum machine_mode mode;
6092 switch (comparison)
6094 case EQ:
6095 qpfunc = (TARGET_ARCH64) ? "_Qp_feq" : "_Q_feq";
6096 break;
6098 case NE:
6099 qpfunc = (TARGET_ARCH64) ? "_Qp_fne" : "_Q_fne";
6100 break;
6102 case GT:
6103 qpfunc = (TARGET_ARCH64) ? "_Qp_fgt" : "_Q_fgt";
6104 break;
6106 case GE:
6107 qpfunc = (TARGET_ARCH64) ? "_Qp_fge" : "_Q_fge";
6108 break;
6110 case LT:
6111 qpfunc = (TARGET_ARCH64) ? "_Qp_flt" : "_Q_flt";
6112 break;
6114 case LE:
6115 qpfunc = (TARGET_ARCH64) ? "_Qp_fle" : "_Q_fle";
6116 break;
6118 case ORDERED:
6119 case UNORDERED:
6120 case UNGT:
6121 case UNLT:
6122 case UNEQ:
6123 case UNGE:
6124 case UNLE:
6125 case LTGT:
6126 qpfunc = (TARGET_ARCH64) ? "_Qp_cmp" : "_Q_cmp";
6127 break;
6129 default:
6130 abort();
6131 break;
6134 if (TARGET_ARCH64)
6136 if (GET_CODE (x) != MEM)
6138 slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
6139 emit_insn (gen_rtx_SET (VOIDmode, slot0, x));
6141 else
6142 slot0 = x;
6144 if (GET_CODE (y) != MEM)
6146 slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
6147 emit_insn (gen_rtx_SET (VOIDmode, slot1, y));
6149 else
6150 slot1 = y;
6152 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), LCT_NORMAL,
6153 DImode, 2,
6154 XEXP (slot0, 0), Pmode,
6155 XEXP (slot1, 0), Pmode);
6157 mode = DImode;
6159 else
6161 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), LCT_NORMAL,
6162 SImode, 2,
6163 x, TFmode, y, TFmode);
6165 mode = SImode;
6169 /* Immediately move the result of the libcall into a pseudo
6170 register so reload doesn't clobber the value if it needs
6171 the return register for a spill reg. */
6172 result = gen_reg_rtx (mode);
6173 emit_move_insn (result, hard_libcall_value (mode));
6175 switch (comparison)
6177 default:
6178 emit_cmp_insn (result, const0_rtx, NE, NULL_RTX, mode, 0);
6179 break;
6180 case ORDERED:
6181 case UNORDERED:
6182 emit_cmp_insn (result, GEN_INT(3), comparison == UNORDERED ? EQ : NE,
6183 NULL_RTX, mode, 0);
6184 break;
6185 case UNGT:
6186 case UNGE:
6187 emit_cmp_insn (result, const1_rtx,
6188 comparison == UNGT ? GT : NE, NULL_RTX, mode, 0);
6189 break;
6190 case UNLE:
6191 emit_cmp_insn (result, const2_rtx, NE, NULL_RTX, mode, 0);
6192 break;
6193 case UNLT:
6194 tem = gen_reg_rtx (mode);
6195 if (TARGET_ARCH32)
6196 emit_insn (gen_andsi3 (tem, result, const1_rtx));
6197 else
6198 emit_insn (gen_anddi3 (tem, result, const1_rtx));
6199 emit_cmp_insn (tem, const0_rtx, NE, NULL_RTX, mode, 0);
6200 break;
6201 case UNEQ:
6202 case LTGT:
6203 tem = gen_reg_rtx (mode);
6204 if (TARGET_ARCH32)
6205 emit_insn (gen_addsi3 (tem, result, const1_rtx));
6206 else
6207 emit_insn (gen_adddi3 (tem, result, const1_rtx));
6208 tem2 = gen_reg_rtx (mode);
6209 if (TARGET_ARCH32)
6210 emit_insn (gen_andsi3 (tem2, tem, const2_rtx));
6211 else
6212 emit_insn (gen_anddi3 (tem2, tem, const2_rtx));
6213 emit_cmp_insn (tem2, const0_rtx, comparison == UNEQ ? EQ : NE,
6214 NULL_RTX, mode, 0);
6215 break;
6219 /* Generate an unsigned DImode to FP conversion. This is the same code
6220 optabs would emit if we didn't have TFmode patterns. */
6222 void
6223 sparc_emit_floatunsdi (rtx *operands)
6225 rtx neglab, donelab, i0, i1, f0, in, out;
6226 enum machine_mode mode;
6228 out = operands[0];
6229 in = force_reg (DImode, operands[1]);
6230 mode = GET_MODE (out);
6231 neglab = gen_label_rtx ();
6232 donelab = gen_label_rtx ();
6233 i0 = gen_reg_rtx (DImode);
6234 i1 = gen_reg_rtx (DImode);
6235 f0 = gen_reg_rtx (mode);
6237 emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, DImode, 0, neglab);
6239 emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_FLOAT (mode, in)));
6240 emit_jump_insn (gen_jump (donelab));
6241 emit_barrier ();
6243 emit_label (neglab);
6245 emit_insn (gen_lshrdi3 (i0, in, const1_rtx));
6246 emit_insn (gen_anddi3 (i1, in, const1_rtx));
6247 emit_insn (gen_iordi3 (i0, i0, i1));
6248 emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_FLOAT (mode, i0)));
6249 emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
6251 emit_label (donelab);
6254 /* Return the string to output a conditional branch to LABEL, testing
6255 register REG. LABEL is the operand number of the label; REG is the
6256 operand number of the reg. OP is the conditional expression. The mode
6257 of REG says what kind of comparison we made.
6259 REVERSED is nonzero if we should reverse the sense of the comparison.
6261 ANNUL is nonzero if we should generate an annulling branch.
6263 NOOP is nonzero if we have to follow this branch by a noop. */
6265 char *
6266 output_v9branch (rtx op, rtx dest, int reg, int label, int reversed,
6267 int annul, int noop, rtx insn)
6269 static char string[50];
6270 enum rtx_code code = GET_CODE (op);
6271 enum machine_mode mode = GET_MODE (XEXP (op, 0));
6272 rtx note;
6273 int far;
6274 char *p;
6276 /* branch on register are limited to +-128KB. If it is too far away,
6277 change
6279 brnz,pt %g1, .LC30
6283 brz,pn %g1, .+12
6285 ba,pt %xcc, .LC30
6289 brgez,a,pn %o1, .LC29
6293 brlz,pt %o1, .+16
6295 ba,pt %xcc, .LC29 */
6297 far = get_attr_length (insn) >= 3;
6299 /* If not floating-point or if EQ or NE, we can just reverse the code. */
6300 if (reversed ^ far)
6301 code = reverse_condition (code);
6303 /* Only 64 bit versions of these instructions exist. */
6304 if (mode != DImode)
6305 abort ();
6307 /* Start by writing the branch condition. */
6309 switch (code)
6311 case NE:
6312 strcpy (string, "brnz");
6313 break;
6315 case EQ:
6316 strcpy (string, "brz");
6317 break;
6319 case GE:
6320 strcpy (string, "brgez");
6321 break;
6323 case LT:
6324 strcpy (string, "brlz");
6325 break;
6327 case LE:
6328 strcpy (string, "brlez");
6329 break;
6331 case GT:
6332 strcpy (string, "brgz");
6333 break;
6335 default:
6336 abort ();
6339 p = strchr (string, '\0');
6341 /* Now add the annulling, reg, label, and nop. */
6342 if (annul && ! far)
6344 strcpy (p, ",a");
6345 p += 2;
6348 if (insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
6350 strcpy (p,
6351 ((INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ^ far)
6352 ? ",pt" : ",pn");
6353 p += 3;
6356 *p = p < string + 8 ? '\t' : ' ';
6357 p++;
6358 *p++ = '%';
6359 *p++ = '0' + reg;
6360 *p++ = ',';
6361 *p++ = ' ';
6362 if (far)
6364 int veryfar = 1, delta;
6366 if (INSN_ADDRESSES_SET_P ())
6368 delta = (INSN_ADDRESSES (INSN_UID (dest))
6369 - INSN_ADDRESSES (INSN_UID (insn)));
6370 /* Leave some instructions for "slop". */
6371 if (delta >= -260000 && delta < 260000)
6372 veryfar = 0;
6375 strcpy (p, ".+12\n\tnop\n\t");
6376 if (annul || noop)
6377 p[3] = '6';
6378 p += 11;
6379 if (veryfar)
6381 strcpy (p, "b\t");
6382 p += 2;
6384 else
6386 strcpy (p, "ba,pt\t%%xcc, ");
6387 p += 13;
6390 *p++ = '%';
6391 *p++ = 'l';
6392 *p++ = '0' + label;
6393 *p = '\0';
6395 if (noop)
6396 strcpy (p, "\n\tnop");
6398 return string;
6401 /* Return 1, if any of the registers of the instruction are %l[0-7] or %o[0-7].
6402 Such instructions cannot be used in the delay slot of return insn on v9.
6403 If TEST is 0, also rename all %i[0-7] registers to their %o[0-7] counterparts.
6406 static int
6407 epilogue_renumber (register rtx *where, int test)
6409 register const char *fmt;
6410 register int i;
6411 register enum rtx_code code;
6413 if (*where == 0)
6414 return 0;
6416 code = GET_CODE (*where);
6418 switch (code)
6420 case REG:
6421 if (REGNO (*where) >= 8 && REGNO (*where) < 24) /* oX or lX */
6422 return 1;
6423 if (! test && REGNO (*where) >= 24 && REGNO (*where) < 32)
6424 *where = gen_rtx (REG, GET_MODE (*where), OUTGOING_REGNO (REGNO(*where)));
6425 case SCRATCH:
6426 case CC0:
6427 case PC:
6428 case CONST_INT:
6429 case CONST_DOUBLE:
6430 return 0;
6432 /* Do not replace the frame pointer with the stack pointer because
6433 it can cause the delayed instruction to load below the stack.
6434 This occurs when instructions like:
6436 (set (reg/i:SI 24 %i0)
6437 (mem/f:SI (plus:SI (reg/f:SI 30 %fp)
6438 (const_int -20 [0xffffffec])) 0))
6440 are in the return delayed slot. */
6441 case PLUS:
6442 if (GET_CODE (XEXP (*where, 0)) == REG
6443 && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM
6444 && (GET_CODE (XEXP (*where, 1)) != CONST_INT
6445 || INTVAL (XEXP (*where, 1)) < SPARC_STACK_BIAS))
6446 return 1;
6447 break;
6449 case MEM:
6450 if (SPARC_STACK_BIAS
6451 && GET_CODE (XEXP (*where, 0)) == REG
6452 && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM)
6453 return 1;
6454 break;
6456 default:
6457 break;
6460 fmt = GET_RTX_FORMAT (code);
6462 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6464 if (fmt[i] == 'E')
6466 register int j;
6467 for (j = XVECLEN (*where, i) - 1; j >= 0; j--)
6468 if (epilogue_renumber (&(XVECEXP (*where, i, j)), test))
6469 return 1;
6471 else if (fmt[i] == 'e'
6472 && epilogue_renumber (&(XEXP (*where, i)), test))
6473 return 1;
6475 return 0;
6478 /* Leaf functions and non-leaf functions have different needs. */
6480 static const int
6481 reg_leaf_alloc_order[] = REG_LEAF_ALLOC_ORDER;
6483 static const int
6484 reg_nonleaf_alloc_order[] = REG_ALLOC_ORDER;
6486 static const int *const reg_alloc_orders[] = {
6487 reg_leaf_alloc_order,
6488 reg_nonleaf_alloc_order};
6490 void
6491 order_regs_for_local_alloc (void)
6493 static int last_order_nonleaf = 1;
6495 if (regs_ever_live[15] != last_order_nonleaf)
6497 last_order_nonleaf = !last_order_nonleaf;
6498 memcpy ((char *) reg_alloc_order,
6499 (const char *) reg_alloc_orders[last_order_nonleaf],
6500 FIRST_PSEUDO_REGISTER * sizeof (int));
6504 /* Return 1 if REG and MEM are legitimate enough to allow the various
6505 mem<-->reg splits to be run. */
6508 sparc_splitdi_legitimate (rtx reg, rtx mem)
6510 /* Punt if we are here by mistake. */
6511 if (! reload_completed)
6512 abort ();
6514 /* We must have an offsettable memory reference. */
6515 if (! offsettable_memref_p (mem))
6516 return 0;
6518 /* If we have legitimate args for ldd/std, we do not want
6519 the split to happen. */
6520 if ((REGNO (reg) % 2) == 0
6521 && mem_min_alignment (mem, 8))
6522 return 0;
6524 /* Success. */
6525 return 1;
6528 /* Return 1 if x and y are some kind of REG and they refer to
6529 different hard registers. This test is guaranteed to be
6530 run after reload. */
6533 sparc_absnegfloat_split_legitimate (rtx x, rtx y)
6535 if (GET_CODE (x) != REG)
6536 return 0;
6537 if (GET_CODE (y) != REG)
6538 return 0;
6539 if (REGNO (x) == REGNO (y))
6540 return 0;
6541 return 1;
6544 /* Return 1 if REGNO (reg1) is even and REGNO (reg1) == REGNO (reg2) - 1.
6545 This makes them candidates for using ldd and std insns.
6547 Note reg1 and reg2 *must* be hard registers. */
6550 registers_ok_for_ldd_peep (rtx reg1, rtx reg2)
6552 /* We might have been passed a SUBREG. */
6553 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
6554 return 0;
6556 if (REGNO (reg1) % 2 != 0)
6557 return 0;
6559 /* Integer ldd is deprecated in SPARC V9 */
6560 if (TARGET_V9 && REGNO (reg1) < 32)
6561 return 0;
6563 return (REGNO (reg1) == REGNO (reg2) - 1);
6566 /* Return 1 if the addresses in mem1 and mem2 are suitable for use in
6567 an ldd or std insn.
6569 This can only happen when addr1 and addr2, the addresses in mem1
6570 and mem2, are consecutive memory locations (addr1 + 4 == addr2).
6571 addr1 must also be aligned on a 64-bit boundary.
6573 Also iff dependent_reg_rtx is not null it should not be used to
6574 compute the address for mem1, i.e. we cannot optimize a sequence
6575 like:
6576 ld [%o0], %o0
6577 ld [%o0 + 4], %o1
6579 ldd [%o0], %o0
6580 nor:
6581 ld [%g3 + 4], %g3
6582 ld [%g3], %g2
6584 ldd [%g3], %g2
6586 But, note that the transformation from:
6587 ld [%g2 + 4], %g3
6588 ld [%g2], %g2
6590 ldd [%g2], %g2
6591 is perfectly fine. Thus, the peephole2 patterns always pass us
6592 the destination register of the first load, never the second one.
6594 For stores we don't have a similar problem, so dependent_reg_rtx is
6595 NULL_RTX. */
6598 mems_ok_for_ldd_peep (rtx mem1, rtx mem2, rtx dependent_reg_rtx)
6600 rtx addr1, addr2;
6601 unsigned int reg1;
6602 HOST_WIDE_INT offset1;
6604 /* The mems cannot be volatile. */
6605 if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
6606 return 0;
6608 /* MEM1 should be aligned on a 64-bit boundary. */
6609 if (MEM_ALIGN (mem1) < 64)
6610 return 0;
6612 addr1 = XEXP (mem1, 0);
6613 addr2 = XEXP (mem2, 0);
6615 /* Extract a register number and offset (if used) from the first addr. */
6616 if (GET_CODE (addr1) == PLUS)
6618 /* If not a REG, return zero. */
6619 if (GET_CODE (XEXP (addr1, 0)) != REG)
6620 return 0;
6621 else
6623 reg1 = REGNO (XEXP (addr1, 0));
6624 /* The offset must be constant! */
6625 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
6626 return 0;
6627 offset1 = INTVAL (XEXP (addr1, 1));
6630 else if (GET_CODE (addr1) != REG)
6631 return 0;
6632 else
6634 reg1 = REGNO (addr1);
6635 /* This was a simple (mem (reg)) expression. Offset is 0. */
6636 offset1 = 0;
6639 /* Make sure the second address is a (mem (plus (reg) (const_int). */
6640 if (GET_CODE (addr2) != PLUS)
6641 return 0;
6643 if (GET_CODE (XEXP (addr2, 0)) != REG
6644 || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
6645 return 0;
6647 if (reg1 != REGNO (XEXP (addr2, 0)))
6648 return 0;
6650 if (dependent_reg_rtx != NULL_RTX && reg1 == REGNO (dependent_reg_rtx))
6651 return 0;
6653 /* The first offset must be evenly divisible by 8 to ensure the
6654 address is 64 bit aligned. */
6655 if (offset1 % 8 != 0)
6656 return 0;
6658 /* The offset for the second addr must be 4 more than the first addr. */
6659 if (INTVAL (XEXP (addr2, 1)) != offset1 + 4)
6660 return 0;
6662 /* All the tests passed. addr1 and addr2 are valid for ldd and std
6663 instructions. */
6664 return 1;
6667 /* Return 1 if reg is a pseudo, or is the first register in
6668 a hard register pair. This makes it a candidate for use in
6669 ldd and std insns. */
6672 register_ok_for_ldd (rtx reg)
6674 /* We might have been passed a SUBREG. */
6675 if (GET_CODE (reg) != REG)
6676 return 0;
6678 if (REGNO (reg) < FIRST_PSEUDO_REGISTER)
6679 return (REGNO (reg) % 2 == 0);
6680 else
6681 return 1;
6684 /* Print operand X (an rtx) in assembler syntax to file FILE.
6685 CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
6686 For `%' followed by punctuation, CODE is the punctuation and X is null. */
6688 void
6689 print_operand (FILE *file, rtx x, int code)
6691 switch (code)
6693 case '#':
6694 /* Output a 'nop' if there's nothing for the delay slot. */
6695 if (dbr_sequence_length () == 0)
6696 fputs ("\n\t nop", file);
6697 return;
6698 case '*':
6699 /* Output an annul flag if there's nothing for the delay slot and we
6700 are optimizing. This is always used with '(' below. */
6701 /* Sun OS 4.1.1 dbx can't handle an annulled unconditional branch;
6702 this is a dbx bug. So, we only do this when optimizing. */
6703 /* On UltraSPARC, a branch in a delay slot causes a pipeline flush.
6704 Always emit a nop in case the next instruction is a branch. */
6705 if (dbr_sequence_length () == 0
6706 && (optimize && (int)sparc_cpu < PROCESSOR_V9))
6707 fputs (",a", file);
6708 return;
6709 case '(':
6710 /* Output a 'nop' if there's nothing for the delay slot and we are
6711 not optimizing. This is always used with '*' above. */
6712 if (dbr_sequence_length () == 0
6713 && ! (optimize && (int)sparc_cpu < PROCESSOR_V9))
6714 fputs ("\n\t nop", file);
6715 return;
6716 case '_':
6717 /* Output the Embedded Medium/Anywhere code model base register. */
6718 fputs (EMBMEDANY_BASE_REG, file);
6719 return;
6720 case '@':
6721 /* Print out what we are using as the frame pointer. This might
6722 be %fp, or might be %sp+offset. */
6723 /* ??? What if offset is too big? Perhaps the caller knows it isn't? */
6724 fprintf (file, "%s+"HOST_WIDE_INT_PRINT_DEC, frame_base_name, frame_base_offset);
6725 return;
6726 case '&':
6727 /* Print some local dynamic TLS name. */
6728 assemble_name (file, get_some_local_dynamic_name ());
6729 return;
6730 case 'Y':
6731 /* Adjust the operand to take into account a RESTORE operation. */
6732 if (GET_CODE (x) == CONST_INT)
6733 break;
6734 else if (GET_CODE (x) != REG)
6735 output_operand_lossage ("invalid %%Y operand");
6736 else if (REGNO (x) < 8)
6737 fputs (reg_names[REGNO (x)], file);
6738 else if (REGNO (x) >= 24 && REGNO (x) < 32)
6739 fputs (reg_names[REGNO (x)-16], file);
6740 else
6741 output_operand_lossage ("invalid %%Y operand");
6742 return;
6743 case 'L':
6744 /* Print out the low order register name of a register pair. */
6745 if (WORDS_BIG_ENDIAN)
6746 fputs (reg_names[REGNO (x)+1], file);
6747 else
6748 fputs (reg_names[REGNO (x)], file);
6749 return;
6750 case 'H':
6751 /* Print out the high order register name of a register pair. */
6752 if (WORDS_BIG_ENDIAN)
6753 fputs (reg_names[REGNO (x)], file);
6754 else
6755 fputs (reg_names[REGNO (x)+1], file);
6756 return;
6757 case 'R':
6758 /* Print out the second register name of a register pair or quad.
6759 I.e., R (%o0) => %o1. */
6760 fputs (reg_names[REGNO (x)+1], file);
6761 return;
6762 case 'S':
6763 /* Print out the third register name of a register quad.
6764 I.e., S (%o0) => %o2. */
6765 fputs (reg_names[REGNO (x)+2], file);
6766 return;
6767 case 'T':
6768 /* Print out the fourth register name of a register quad.
6769 I.e., T (%o0) => %o3. */
6770 fputs (reg_names[REGNO (x)+3], file);
6771 return;
6772 case 'x':
6773 /* Print a condition code register. */
6774 if (REGNO (x) == SPARC_ICC_REG)
6776 /* We don't handle CC[X]_NOOVmode because they're not supposed
6777 to occur here. */
6778 if (GET_MODE (x) == CCmode)
6779 fputs ("%icc", file);
6780 else if (GET_MODE (x) == CCXmode)
6781 fputs ("%xcc", file);
6782 else
6783 abort ();
6785 else
6786 /* %fccN register */
6787 fputs (reg_names[REGNO (x)], file);
6788 return;
6789 case 'm':
6790 /* Print the operand's address only. */
6791 output_address (XEXP (x, 0));
6792 return;
6793 case 'r':
6794 /* In this case we need a register. Use %g0 if the
6795 operand is const0_rtx. */
6796 if (x == const0_rtx
6797 || (GET_MODE (x) != VOIDmode && x == CONST0_RTX (GET_MODE (x))))
6799 fputs ("%g0", file);
6800 return;
6802 else
6803 break;
6805 case 'A':
6806 switch (GET_CODE (x))
6808 case IOR: fputs ("or", file); break;
6809 case AND: fputs ("and", file); break;
6810 case XOR: fputs ("xor", file); break;
6811 default: output_operand_lossage ("invalid %%A operand");
6813 return;
6815 case 'B':
6816 switch (GET_CODE (x))
6818 case IOR: fputs ("orn", file); break;
6819 case AND: fputs ("andn", file); break;
6820 case XOR: fputs ("xnor", file); break;
6821 default: output_operand_lossage ("invalid %%B operand");
6823 return;
6825 /* These are used by the conditional move instructions. */
6826 case 'c' :
6827 case 'C':
6829 enum rtx_code rc = GET_CODE (x);
6831 if (code == 'c')
6833 enum machine_mode mode = GET_MODE (XEXP (x, 0));
6834 if (mode == CCFPmode || mode == CCFPEmode)
6835 rc = reverse_condition_maybe_unordered (GET_CODE (x));
6836 else
6837 rc = reverse_condition (GET_CODE (x));
6839 switch (rc)
6841 case NE: fputs ("ne", file); break;
6842 case EQ: fputs ("e", file); break;
6843 case GE: fputs ("ge", file); break;
6844 case GT: fputs ("g", file); break;
6845 case LE: fputs ("le", file); break;
6846 case LT: fputs ("l", file); break;
6847 case GEU: fputs ("geu", file); break;
6848 case GTU: fputs ("gu", file); break;
6849 case LEU: fputs ("leu", file); break;
6850 case LTU: fputs ("lu", file); break;
6851 case LTGT: fputs ("lg", file); break;
6852 case UNORDERED: fputs ("u", file); break;
6853 case ORDERED: fputs ("o", file); break;
6854 case UNLT: fputs ("ul", file); break;
6855 case UNLE: fputs ("ule", file); break;
6856 case UNGT: fputs ("ug", file); break;
6857 case UNGE: fputs ("uge", file); break;
6858 case UNEQ: fputs ("ue", file); break;
6859 default: output_operand_lossage (code == 'c'
6860 ? "invalid %%c operand"
6861 : "invalid %%C operand");
6863 return;
6866 /* These are used by the movr instruction pattern. */
6867 case 'd':
6868 case 'D':
6870 enum rtx_code rc = (code == 'd'
6871 ? reverse_condition (GET_CODE (x))
6872 : GET_CODE (x));
6873 switch (rc)
6875 case NE: fputs ("ne", file); break;
6876 case EQ: fputs ("e", file); break;
6877 case GE: fputs ("gez", file); break;
6878 case LT: fputs ("lz", file); break;
6879 case LE: fputs ("lez", file); break;
6880 case GT: fputs ("gz", file); break;
6881 default: output_operand_lossage (code == 'd'
6882 ? "invalid %%d operand"
6883 : "invalid %%D operand");
6885 return;
6888 case 'b':
6890 /* Print a sign-extended character. */
6891 int i = trunc_int_for_mode (INTVAL (x), QImode);
6892 fprintf (file, "%d", i);
6893 return;
6896 case 'f':
6897 /* Operand must be a MEM; write its address. */
6898 if (GET_CODE (x) != MEM)
6899 output_operand_lossage ("invalid %%f operand");
6900 output_address (XEXP (x, 0));
6901 return;
6903 case 's':
6905 /* Print a sign-extended 32-bit value. */
6906 HOST_WIDE_INT i;
6907 if (GET_CODE(x) == CONST_INT)
6908 i = INTVAL (x);
6909 else if (GET_CODE(x) == CONST_DOUBLE)
6910 i = CONST_DOUBLE_LOW (x);
6911 else
6913 output_operand_lossage ("invalid %%s operand");
6914 return;
6916 i = trunc_int_for_mode (i, SImode);
6917 fprintf (file, HOST_WIDE_INT_PRINT_DEC, i);
6918 return;
6921 case 0:
6922 /* Do nothing special. */
6923 break;
6925 default:
6926 /* Undocumented flag. */
6927 output_operand_lossage ("invalid operand output code");
6930 if (GET_CODE (x) == REG)
6931 fputs (reg_names[REGNO (x)], file);
6932 else if (GET_CODE (x) == MEM)
6934 fputc ('[', file);
6935 /* Poor Sun assembler doesn't understand absolute addressing. */
6936 if (CONSTANT_P (XEXP (x, 0)))
6937 fputs ("%g0+", file);
6938 output_address (XEXP (x, 0));
6939 fputc (']', file);
6941 else if (GET_CODE (x) == HIGH)
6943 fputs ("%hi(", file);
6944 output_addr_const (file, XEXP (x, 0));
6945 fputc (')', file);
6947 else if (GET_CODE (x) == LO_SUM)
6949 print_operand (file, XEXP (x, 0), 0);
6950 if (TARGET_CM_MEDMID)
6951 fputs ("+%l44(", file);
6952 else
6953 fputs ("+%lo(", file);
6954 output_addr_const (file, XEXP (x, 1));
6955 fputc (')', file);
6957 else if (GET_CODE (x) == CONST_DOUBLE
6958 && (GET_MODE (x) == VOIDmode
6959 || GET_MODE_CLASS (GET_MODE (x)) == MODE_INT))
6961 if (CONST_DOUBLE_HIGH (x) == 0)
6962 fprintf (file, "%u", (unsigned int) CONST_DOUBLE_LOW (x));
6963 else if (CONST_DOUBLE_HIGH (x) == -1
6964 && CONST_DOUBLE_LOW (x) < 0)
6965 fprintf (file, "%d", (int) CONST_DOUBLE_LOW (x));
6966 else
6967 output_operand_lossage ("long long constant not a valid immediate operand");
6969 else if (GET_CODE (x) == CONST_DOUBLE)
6970 output_operand_lossage ("floating point constant not a valid immediate operand");
6971 else { output_addr_const (file, x); }
6974 /* Target hook for assembling integer objects. The sparc version has
6975 special handling for aligned DI-mode objects. */
6977 static bool
6978 sparc_assemble_integer (rtx x, unsigned int size, int aligned_p)
6980 /* ??? We only output .xword's for symbols and only then in environments
6981 where the assembler can handle them. */
6982 if (aligned_p && size == 8
6983 && (GET_CODE (x) != CONST_INT && GET_CODE (x) != CONST_DOUBLE))
6985 if (TARGET_V9)
6987 assemble_integer_with_op ("\t.xword\t", x);
6988 return true;
6990 else
6992 assemble_aligned_integer (4, const0_rtx);
6993 assemble_aligned_integer (4, x);
6994 return true;
6997 return default_assemble_integer (x, size, aligned_p);
7000 /* Return the value of a code used in the .proc pseudo-op that says
7001 what kind of result this function returns. For non-C types, we pick
7002 the closest C type. */
7004 #ifndef SHORT_TYPE_SIZE
7005 #define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
7006 #endif
7008 #ifndef INT_TYPE_SIZE
7009 #define INT_TYPE_SIZE BITS_PER_WORD
7010 #endif
7012 #ifndef LONG_TYPE_SIZE
7013 #define LONG_TYPE_SIZE BITS_PER_WORD
7014 #endif
7016 #ifndef LONG_LONG_TYPE_SIZE
7017 #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
7018 #endif
7020 #ifndef FLOAT_TYPE_SIZE
7021 #define FLOAT_TYPE_SIZE BITS_PER_WORD
7022 #endif
7024 #ifndef DOUBLE_TYPE_SIZE
7025 #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
7026 #endif
7028 #ifndef LONG_DOUBLE_TYPE_SIZE
7029 #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
7030 #endif
7032 unsigned long
7033 sparc_type_code (register tree type)
7035 register unsigned long qualifiers = 0;
7036 register unsigned shift;
7038 /* Only the first 30 bits of the qualifier are valid. We must refrain from
7039 setting more, since some assemblers will give an error for this. Also,
7040 we must be careful to avoid shifts of 32 bits or more to avoid getting
7041 unpredictable results. */
7043 for (shift = 6; shift < 30; shift += 2, type = TREE_TYPE (type))
7045 switch (TREE_CODE (type))
7047 case ERROR_MARK:
7048 return qualifiers;
7050 case ARRAY_TYPE:
7051 qualifiers |= (3 << shift);
7052 break;
7054 case FUNCTION_TYPE:
7055 case METHOD_TYPE:
7056 qualifiers |= (2 << shift);
7057 break;
7059 case POINTER_TYPE:
7060 case REFERENCE_TYPE:
7061 case OFFSET_TYPE:
7062 qualifiers |= (1 << shift);
7063 break;
7065 case RECORD_TYPE:
7066 return (qualifiers | 8);
7068 case UNION_TYPE:
7069 case QUAL_UNION_TYPE:
7070 return (qualifiers | 9);
7072 case ENUMERAL_TYPE:
7073 return (qualifiers | 10);
7075 case VOID_TYPE:
7076 return (qualifiers | 16);
7078 case INTEGER_TYPE:
7079 /* If this is a range type, consider it to be the underlying
7080 type. */
7081 if (TREE_TYPE (type) != 0)
7082 break;
7084 /* Carefully distinguish all the standard types of C,
7085 without messing up if the language is not C. We do this by
7086 testing TYPE_PRECISION and TREE_UNSIGNED. The old code used to
7087 look at both the names and the above fields, but that's redundant.
7088 Any type whose size is between two C types will be considered
7089 to be the wider of the two types. Also, we do not have a
7090 special code to use for "long long", so anything wider than
7091 long is treated the same. Note that we can't distinguish
7092 between "int" and "long" in this code if they are the same
7093 size, but that's fine, since neither can the assembler. */
7095 if (TYPE_PRECISION (type) <= CHAR_TYPE_SIZE)
7096 return (qualifiers | (TREE_UNSIGNED (type) ? 12 : 2));
7098 else if (TYPE_PRECISION (type) <= SHORT_TYPE_SIZE)
7099 return (qualifiers | (TREE_UNSIGNED (type) ? 13 : 3));
7101 else if (TYPE_PRECISION (type) <= INT_TYPE_SIZE)
7102 return (qualifiers | (TREE_UNSIGNED (type) ? 14 : 4));
7104 else
7105 return (qualifiers | (TREE_UNSIGNED (type) ? 15 : 5));
7107 case REAL_TYPE:
7108 /* If this is a range type, consider it to be the underlying
7109 type. */
7110 if (TREE_TYPE (type) != 0)
7111 break;
7113 /* Carefully distinguish all the standard types of C,
7114 without messing up if the language is not C. */
7116 if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
7117 return (qualifiers | 6);
7119 else
7120 return (qualifiers | 7);
7122 case COMPLEX_TYPE: /* GNU Fortran COMPLEX type. */
7123 /* ??? We need to distinguish between double and float complex types,
7124 but I don't know how yet because I can't reach this code from
7125 existing front-ends. */
7126 return (qualifiers | 7); /* Who knows? */
7128 case CHAR_TYPE: /* GNU Pascal CHAR type. Not used in C. */
7129 case BOOLEAN_TYPE: /* GNU Fortran BOOLEAN type. */
7130 case FILE_TYPE: /* GNU Pascal FILE type. */
7131 case SET_TYPE: /* GNU Pascal SET type. */
7132 case LANG_TYPE: /* ? */
7133 return qualifiers;
7135 default:
7136 abort (); /* Not a type! */
7140 return qualifiers;
7143 /* Nested function support. */
7145 /* Emit RTL insns to initialize the variable parts of a trampoline.
7146 FNADDR is an RTX for the address of the function's pure code.
7147 CXT is an RTX for the static chain value for the function.
7149 This takes 16 insns: 2 shifts & 2 ands (to split up addresses), 4 sethi
7150 (to load in opcodes), 4 iors (to merge address and opcodes), and 4 writes
7151 (to store insns). This is a bit excessive. Perhaps a different
7152 mechanism would be better here.
7154 Emit enough FLUSH insns to synchronize the data and instruction caches. */
7156 void
7157 sparc_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
7159 /* SPARC 32-bit trampoline:
7161 sethi %hi(fn), %g1
7162 sethi %hi(static), %g2
7163 jmp %g1+%lo(fn)
7164 or %g2, %lo(static), %g2
7166 SETHI i,r = 00rr rrr1 00ii iiii iiii iiii iiii iiii
7167 JMPL r+i,d = 10dd ddd1 1100 0rrr rr1i iiii iiii iiii
7170 emit_move_insn
7171 (gen_rtx_MEM (SImode, plus_constant (tramp, 0)),
7172 expand_binop (SImode, ior_optab,
7173 expand_shift (RSHIFT_EXPR, SImode, fnaddr,
7174 size_int (10), 0, 1),
7175 GEN_INT (trunc_int_for_mode (0x03000000, SImode)),
7176 NULL_RTX, 1, OPTAB_DIRECT));
7178 emit_move_insn
7179 (gen_rtx_MEM (SImode, plus_constant (tramp, 4)),
7180 expand_binop (SImode, ior_optab,
7181 expand_shift (RSHIFT_EXPR, SImode, cxt,
7182 size_int (10), 0, 1),
7183 GEN_INT (trunc_int_for_mode (0x05000000, SImode)),
7184 NULL_RTX, 1, OPTAB_DIRECT));
7186 emit_move_insn
7187 (gen_rtx_MEM (SImode, plus_constant (tramp, 8)),
7188 expand_binop (SImode, ior_optab,
7189 expand_and (SImode, fnaddr, GEN_INT (0x3ff), NULL_RTX),
7190 GEN_INT (trunc_int_for_mode (0x81c06000, SImode)),
7191 NULL_RTX, 1, OPTAB_DIRECT));
7193 emit_move_insn
7194 (gen_rtx_MEM (SImode, plus_constant (tramp, 12)),
7195 expand_binop (SImode, ior_optab,
7196 expand_and (SImode, cxt, GEN_INT (0x3ff), NULL_RTX),
7197 GEN_INT (trunc_int_for_mode (0x8410a000, SImode)),
7198 NULL_RTX, 1, OPTAB_DIRECT));
7200 /* On UltraSPARC a flush flushes an entire cache line. The trampoline is
7201 aligned on a 16 byte boundary so one flush clears it all. */
7202 emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode, tramp))));
7203 if (sparc_cpu != PROCESSOR_ULTRASPARC
7204 && sparc_cpu != PROCESSOR_ULTRASPARC3)
7205 emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode,
7206 plus_constant (tramp, 8)))));
7208 /* Call __enable_execute_stack after writing onto the stack to make sure
7209 the stack address is accessible. */
7210 #ifdef TRANSFER_FROM_TRAMPOLINE
7211 emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
7212 LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
7213 #endif
7217 /* The 64-bit version is simpler because it makes more sense to load the
7218 values as "immediate" data out of the trampoline. It's also easier since
7219 we can read the PC without clobbering a register. */
7221 void
7222 sparc64_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
7224 /* SPARC 64-bit trampoline:
7226 rd %pc, %g1
7227 ldx [%g1+24], %g5
7228 jmp %g5
7229 ldx [%g1+16], %g5
7230 +16 bytes data
7233 emit_move_insn (gen_rtx_MEM (SImode, tramp),
7234 GEN_INT (trunc_int_for_mode (0x83414000, SImode)));
7235 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 4)),
7236 GEN_INT (trunc_int_for_mode (0xca586018, SImode)));
7237 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 8)),
7238 GEN_INT (trunc_int_for_mode (0x81c14000, SImode)));
7239 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 12)),
7240 GEN_INT (trunc_int_for_mode (0xca586010, SImode)));
7241 emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, 16)), cxt);
7242 emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, 24)), fnaddr);
7243 emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, tramp))));
7245 if (sparc_cpu != PROCESSOR_ULTRASPARC
7246 && sparc_cpu != PROCESSOR_ULTRASPARC3)
7247 emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, plus_constant (tramp, 8)))));
7249 /* Call __enable_execute_stack after writing onto the stack to make sure
7250 the stack address is accessible. */
7251 #ifdef TRANSFER_FROM_TRAMPOLINE
7252 emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__enable_execute_stack"),
7253 LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
7254 #endif
7257 /* Subroutines to support a flat (single) register window calling
7258 convention. */
7260 /* Single-register window sparc stack frames look like:
7262 Before call After call
7263 +-----------------------+ +-----------------------+
7264 high | | | |
7265 mem | caller's temps. | | caller's temps. |
7266 | | | |
7267 +-----------------------+ +-----------------------+
7268 | | | |
7269 | arguments on stack. | | arguments on stack. |
7270 | | | |
7271 +-----------------------+FP+92->+-----------------------+
7272 | 6 words to save | | 6 words to save |
7273 | arguments passed | | arguments passed |
7274 | in registers, even | | in registers, even |
7275 | if not passed. | | if not passed. |
7276 SP+68->+-----------------------+FP+68->+-----------------------+
7277 | 1 word struct addr | | 1 word struct addr |
7278 +-----------------------+FP+64->+-----------------------+
7279 | | | |
7280 | 16 word reg save area | | 16 word reg save area |
7281 | | | |
7282 SP->+-----------------------+ FP->+-----------------------+
7283 | 4 word area for |
7284 | fp/alu reg moves |
7285 FP-16->+-----------------------+
7287 | local variables |
7289 +-----------------------+
7291 | fp register save |
7293 +-----------------------+
7295 | gp register save |
7297 +-----------------------+
7299 | alloca allocations |
7301 +-----------------------+
7303 | arguments on stack |
7305 SP+92->+-----------------------+
7306 | 6 words to save |
7307 | arguments passed |
7308 | in registers, even |
7309 low | if not passed. |
7310 memory SP+68->+-----------------------+
7311 | 1 word struct addr |
7312 SP+64->+-----------------------+
7314 I 16 word reg save area |
7316 SP->+-----------------------+ */
7318 /* Structure to be filled in by sparc_flat_compute_frame_size with register
7319 save masks, and offsets for the current function. */
7321 struct sparc_frame_info
7323 HOST_WIDE_INT total_size; /* # bytes that the entire frame takes up. */
7324 HOST_WIDE_INT var_size; /* # bytes that variables take up. */
7325 int args_size; /* # bytes that outgoing arguments take up. */
7326 int extra_size; /* # bytes of extra gunk. */
7327 int gp_reg_size; /* # bytes needed to store gp regs. */
7328 int fp_reg_size; /* # bytes needed to store fp regs. */
7329 unsigned long gmask; /* Mask of saved gp registers. */
7330 unsigned long fmask; /* Mask of saved fp registers. */
7331 int reg_offset; /* Offset from new sp to store regs. */
7332 int initialized; /* Nonzero if frame size already calculated. */
7335 /* Current frame information calculated by sparc_flat_compute_frame_size. */
7336 struct sparc_frame_info current_frame_info;
7338 /* Zero structure to initialize current_frame_info. */
7339 struct sparc_frame_info zero_frame_info;
7341 #define RETURN_ADDR_REGNUM 15
7342 #define HARD_FRAME_POINTER_MASK (1 << (HARD_FRAME_POINTER_REGNUM))
7343 #define RETURN_ADDR_MASK (1 << (RETURN_ADDR_REGNUM))
7345 /* Tell prologue and epilogue if register REGNO should be saved / restored. */
7347 static bool
7348 sparc_flat_must_save_register_p (int regno)
7350 /* General case: call-saved registers live at some point. */
7351 if (!call_used_regs[regno] && regs_ever_live[regno])
7352 return true;
7354 /* Frame pointer register (%i7) if needed. */
7355 if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
7356 return true;
7358 /* PIC register (%l7) if needed. */
7359 if (regno == (int) PIC_OFFSET_TABLE_REGNUM
7360 && flag_pic && current_function_uses_pic_offset_table)
7361 return true;
7363 /* Return address register (%o7) if needed. */
7364 if (regno == RETURN_ADDR_REGNUM
7365 && (regs_ever_live[RETURN_ADDR_REGNUM]
7366 /* When the PIC offset table is used, the PIC register
7367 is set by using a bare call that clobbers %o7. */
7368 || (flag_pic && current_function_uses_pic_offset_table)))
7369 return true;
7371 return false;
7374 /* Return the bytes needed to compute the frame pointer from the current
7375 stack pointer. */
7377 HOST_WIDE_INT
7378 sparc_flat_compute_frame_size (HOST_WIDE_INT size)
7379 /* # of var. bytes allocated. */
7381 int regno;
7382 HOST_WIDE_INT total_size; /* # bytes that the entire frame takes up. */
7383 HOST_WIDE_INT var_size; /* # bytes that variables take up. */
7384 int args_size; /* # bytes that outgoing arguments take up. */
7385 int extra_size; /* # extra bytes. */
7386 int gp_reg_size; /* # bytes needed to store gp regs. */
7387 int fp_reg_size; /* # bytes needed to store fp regs. */
7388 unsigned long gmask; /* Mask of saved gp registers. */
7389 unsigned long fmask; /* Mask of saved fp registers. */
7390 int reg_offset; /* Offset to register save area. */
7391 int need_aligned_p; /* 1 if need the save area 8 byte aligned. */
7393 /* This is the size of the 16 word reg save area, 1 word struct addr
7394 area, and 4 word fp/alu register copy area. */
7395 extra_size = -STARTING_FRAME_OFFSET + FIRST_PARM_OFFSET(0);
7396 var_size = size;
7397 gp_reg_size = 0;
7398 fp_reg_size = 0;
7399 gmask = 0;
7400 fmask = 0;
7401 reg_offset = 0;
7402 need_aligned_p = 0;
7404 args_size = 0;
7405 if (!leaf_function_p ())
7407 /* Also include the size needed for the 6 parameter registers. */
7408 args_size = current_function_outgoing_args_size + 24;
7410 total_size = var_size + args_size;
7412 /* Calculate space needed for gp registers. */
7413 for (regno = 1; regno <= 31; regno++)
7415 if (sparc_flat_must_save_register_p (regno))
7417 /* If we need to save two regs in a row, ensure there's room to bump
7418 up the address to align it to a doubleword boundary. */
7419 if ((regno & 0x1) == 0 && sparc_flat_must_save_register_p (regno+1))
7421 if (gp_reg_size % 8 != 0)
7422 gp_reg_size += 4;
7423 gp_reg_size += 2 * UNITS_PER_WORD;
7424 gmask |= 3 << regno;
7425 regno++;
7426 need_aligned_p = 1;
7428 else
7430 gp_reg_size += UNITS_PER_WORD;
7431 gmask |= 1 << regno;
7436 /* Calculate space needed for fp registers. */
7437 for (regno = 32; regno <= 63; regno++)
7439 if (regs_ever_live[regno] && !call_used_regs[regno])
7441 fp_reg_size += UNITS_PER_WORD;
7442 fmask |= 1 << (regno - 32);
7446 if (gmask || fmask)
7448 int n;
7449 reg_offset = FIRST_PARM_OFFSET(0) + args_size;
7450 /* Ensure save area is 8 byte aligned if we need it. */
7451 n = reg_offset % 8;
7452 if (need_aligned_p && n != 0)
7454 total_size += 8 - n;
7455 reg_offset += 8 - n;
7457 total_size += gp_reg_size + fp_reg_size;
7460 /* If we must allocate a stack frame at all, we must also allocate
7461 room for register window spillage, so as to be binary compatible
7462 with libraries and operating systems that do not use -mflat. */
7463 if (total_size > 0)
7464 total_size += extra_size;
7465 else
7466 extra_size = 0;
7468 total_size = SPARC_STACK_ALIGN (total_size);
7470 /* Save other computed information. */
7471 current_frame_info.total_size = total_size;
7472 current_frame_info.var_size = var_size;
7473 current_frame_info.args_size = args_size;
7474 current_frame_info.extra_size = extra_size;
7475 current_frame_info.gp_reg_size = gp_reg_size;
7476 current_frame_info.fp_reg_size = fp_reg_size;
7477 current_frame_info.gmask = gmask;
7478 current_frame_info.fmask = fmask;
7479 current_frame_info.reg_offset = reg_offset;
7480 current_frame_info.initialized = reload_completed;
7482 /* Ok, we're done. */
7483 return total_size;
7486 /* Save/restore registers in GMASK and FMASK at register BASE_REG plus offset
7487 OFFSET.
7489 BASE_REG must be 8 byte aligned. This allows us to test OFFSET for
7490 appropriate alignment and use DOUBLEWORD_OP when we can. We assume
7491 [BASE_REG+OFFSET] will always be a valid address.
7493 WORD_OP is either "st" for save, "ld" for restore.
7494 DOUBLEWORD_OP is either "std" for save, "ldd" for restore. */
7496 static void
7497 sparc_flat_save_restore (FILE *file, const char *base_reg, int offset,
7498 unsigned long gmask, unsigned long fmask,
7499 const char *word_op, const char *doubleword_op,
7500 HOST_WIDE_INT base_offset)
7502 int regno;
7504 if (gmask == 0 && fmask == 0)
7505 return;
7507 /* Save registers starting from high to low. We've already saved the
7508 previous frame pointer and previous return address for the debugger's
7509 sake. The debugger allows us to not need a nop in the epilog if at least
7510 one register is reloaded in addition to return address. */
7512 if (gmask)
7514 for (regno = 1; regno <= 31; regno++)
7516 if ((gmask & (1L << regno)) != 0)
7518 if ((regno & 0x1) == 0 && ((gmask & (1L << (regno+1))) != 0))
7520 /* We can save two registers in a row. If we're not at a
7521 double word boundary, move to one.
7522 sparc_flat_compute_frame_size ensures there's room to do
7523 this. */
7524 if (offset % 8 != 0)
7525 offset += UNITS_PER_WORD;
7527 if (word_op[0] == 's')
7529 fprintf (file, "\t%s\t%s, [%s+%d]\n",
7530 doubleword_op, reg_names[regno],
7531 base_reg, offset);
7532 if (dwarf2out_do_frame ())
7534 char *l = dwarf2out_cfi_label ();
7535 dwarf2out_reg_save (l, regno, offset + base_offset);
7536 dwarf2out_reg_save
7537 (l, regno+1, offset+base_offset + UNITS_PER_WORD);
7540 else
7541 fprintf (file, "\t%s\t[%s+%d], %s\n",
7542 doubleword_op, base_reg, offset,
7543 reg_names[regno]);
7545 offset += 2 * UNITS_PER_WORD;
7546 regno++;
7548 else
7550 if (word_op[0] == 's')
7552 fprintf (file, "\t%s\t%s, [%s+%d]\n",
7553 word_op, reg_names[regno],
7554 base_reg, offset);
7555 if (dwarf2out_do_frame ())
7556 dwarf2out_reg_save ("", regno, offset + base_offset);
7558 else
7559 fprintf (file, "\t%s\t[%s+%d], %s\n",
7560 word_op, base_reg, offset, reg_names[regno]);
7562 offset += UNITS_PER_WORD;
7568 if (fmask)
7570 for (regno = 32; regno <= 63; regno++)
7572 if ((fmask & (1L << (regno - 32))) != 0)
7574 if (word_op[0] == 's')
7576 fprintf (file, "\t%s\t%s, [%s+%d]\n",
7577 word_op, reg_names[regno],
7578 base_reg, offset);
7579 if (dwarf2out_do_frame ())
7580 dwarf2out_reg_save ("", regno, offset + base_offset);
7582 else
7583 fprintf (file, "\t%s\t[%s+%d], %s\n",
7584 word_op, base_reg, offset, reg_names[regno]);
7586 offset += UNITS_PER_WORD;
7592 /* Set up the stack and frame (if desired) for the function. */
7594 static void
7595 sparc_flat_function_prologue (FILE *file, HOST_WIDE_INT size)
7597 const char *sp_str = reg_names[STACK_POINTER_REGNUM];
7598 unsigned long gmask = current_frame_info.gmask;
7600 sparc_output_scratch_registers (file);
7602 /* This is only for the human reader. */
7603 fprintf (file, "\t%s#PROLOGUE# 0\n", ASM_COMMENT_START);
7604 fprintf (file, "\t%s# vars= "HOST_WIDE_INT_PRINT_DEC", "
7605 "regs= %d/%d, args= %d, extra= %d\n",
7606 ASM_COMMENT_START,
7607 current_frame_info.var_size,
7608 current_frame_info.gp_reg_size / 4,
7609 current_frame_info.fp_reg_size / 4,
7610 current_function_outgoing_args_size,
7611 current_frame_info.extra_size);
7613 size = SPARC_STACK_ALIGN (size);
7614 size = (! current_frame_info.initialized
7615 ? sparc_flat_compute_frame_size (size)
7616 : current_frame_info.total_size);
7618 /* These cases shouldn't happen. Catch them now. */
7619 if (size == 0 && (gmask || current_frame_info.fmask))
7620 abort ();
7622 /* Allocate our stack frame by decrementing %sp.
7623 At present, the only algorithm gdb can use to determine if this is a
7624 flat frame is if we always set %i7 if we set %sp. This can be optimized
7625 in the future by putting in some sort of debugging information that says
7626 this is a `flat' function. However, there is still the case of debugging
7627 code without such debugging information (including cases where most fns
7628 have such info, but there is one that doesn't). So, always do this now
7629 so we don't get a lot of code out there that gdb can't handle.
7630 If the frame pointer isn't needn't then that's ok - gdb won't be able to
7631 distinguish us from a non-flat function but there won't (and shouldn't)
7632 be any differences anyway. The return pc is saved (if necessary) right
7633 after %i7 so gdb won't have to look too far to find it. */
7634 if (size > 0)
7636 int reg_offset = current_frame_info.reg_offset;
7637 const char *const fp_str = reg_names[HARD_FRAME_POINTER_REGNUM];
7638 static const char *const t1_str = "%g1";
7640 /* Things get a little tricky if local variables take up more than ~4096
7641 bytes and outgoing arguments take up more than ~4096 bytes. When that
7642 happens, the register save area can't be accessed from either end of
7643 the frame. Handle this by decrementing %sp to the start of the gp
7644 register save area, save the regs, update %i7, and then set %sp to its
7645 final value. Given that we only have one scratch register to play
7646 with it is the cheapest solution, and it helps gdb out as it won't
7647 slow down recognition of flat functions.
7648 Don't change the order of insns emitted here without checking with
7649 the gdb folk first. */
7651 /* Is the entire register save area offsettable from %sp? */
7652 if (reg_offset < 4096 - 64 * UNITS_PER_WORD)
7654 if (size <= 4096)
7656 fprintf (file, "\tadd\t%s, -"HOST_WIDE_INT_PRINT_DEC", %s\n",
7657 sp_str, size, sp_str);
7658 if (gmask & HARD_FRAME_POINTER_MASK)
7660 fprintf (file, "\tst\t%s, [%s+%d]\n",
7661 fp_str, sp_str, reg_offset);
7662 fprintf (file, "\tsub\t%s, -"HOST_WIDE_INT_PRINT_DEC", %s"
7663 "\t%s# set up frame pointer\n",
7664 sp_str, size, fp_str, ASM_COMMENT_START);
7665 reg_offset += 4;
7668 else
7670 build_big_number (file, size, t1_str);
7671 fprintf (file, "\tsub\t%s, %s, %s\n", sp_str, t1_str, sp_str);
7672 if (gmask & HARD_FRAME_POINTER_MASK)
7674 fprintf (file, "\tst\t%s, [%s+%d]\n",
7675 fp_str, sp_str, reg_offset);
7676 fprintf (file, "\tadd\t%s, %s, %s\t%s# set up frame pointer\n",
7677 sp_str, t1_str, fp_str, ASM_COMMENT_START);
7678 reg_offset += 4;
7681 if (dwarf2out_do_frame ())
7683 char *l = dwarf2out_cfi_label ();
7684 if (gmask & HARD_FRAME_POINTER_MASK)
7686 dwarf2out_reg_save (l, HARD_FRAME_POINTER_REGNUM,
7687 reg_offset - 4 - size);
7688 dwarf2out_def_cfa (l, HARD_FRAME_POINTER_REGNUM, 0);
7690 else
7691 dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, size);
7693 if (gmask & RETURN_ADDR_MASK)
7695 fprintf (file, "\tst\t%s, [%s+%d]\n",
7696 reg_names[RETURN_ADDR_REGNUM], sp_str, reg_offset);
7697 if (dwarf2out_do_frame ())
7698 dwarf2out_return_save ("", reg_offset - size);
7699 reg_offset += 4;
7701 sparc_flat_save_restore (file, sp_str, reg_offset,
7702 gmask & ~(HARD_FRAME_POINTER_MASK | RETURN_ADDR_MASK),
7703 current_frame_info.fmask,
7704 "st", "std", -size);
7706 else
7708 /* Subtract %sp in two steps, but make sure there is always a
7709 64-byte register save area, and %sp is properly aligned. */
7711 /* Amount to decrement %sp by, the first time. */
7712 HOST_WIDE_INT size1 = ((size - reg_offset + 64) + 15) & -16;
7714 /* Amount to decrement %sp by, the second time. */
7715 HOST_WIDE_INT size2 = size - size1;
7717 /* Offset to register save area from %sp after first decrement. */
7718 int offset = (int)(size1 - (size - reg_offset));
7720 if (size1 <= 4096)
7722 fprintf (file, "\tadd\t%s, -"HOST_WIDE_INT_PRINT_DEC", %s\n",
7723 sp_str, size1, sp_str);
7724 if (gmask & HARD_FRAME_POINTER_MASK)
7726 fprintf (file, "\tst\t%s, [%s+%d]\n"
7727 "\tsub\t%s, -"HOST_WIDE_INT_PRINT_DEC", %s"
7728 "\t%s# set up frame pointer\n",
7729 fp_str, sp_str, offset, sp_str, size1,
7730 fp_str, ASM_COMMENT_START);
7731 offset += 4;
7734 else
7736 build_big_number (file, size1, t1_str);
7737 fprintf (file, "\tsub\t%s, %s, %s\n", sp_str, t1_str, sp_str);
7738 if (gmask & HARD_FRAME_POINTER_MASK)
7740 fprintf (file, "\tst\t%s, [%s+%d]\n"
7741 "\tadd\t%s, %s, %s\t%s# set up frame pointer\n",
7742 fp_str, sp_str, offset, sp_str, t1_str,
7743 fp_str, ASM_COMMENT_START);
7744 offset += 4;
7747 if (dwarf2out_do_frame ())
7749 char *l = dwarf2out_cfi_label ();
7750 if (gmask & HARD_FRAME_POINTER_MASK)
7752 dwarf2out_reg_save (l, HARD_FRAME_POINTER_REGNUM,
7753 offset - 4 - size1);
7754 dwarf2out_def_cfa (l, HARD_FRAME_POINTER_REGNUM, 0);
7756 else
7757 dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, size1);
7759 if (gmask & RETURN_ADDR_MASK)
7761 fprintf (file, "\tst\t%s, [%s+%d]\n",
7762 reg_names[RETURN_ADDR_REGNUM], sp_str, offset);
7763 if (dwarf2out_do_frame ())
7764 /* offset - size1 == reg_offset - size
7765 if reg_offset were updated above like offset. */
7766 dwarf2out_return_save ("", offset - size1);
7767 offset += 4;
7769 sparc_flat_save_restore (file, sp_str, offset,
7770 gmask & ~(HARD_FRAME_POINTER_MASK | RETURN_ADDR_MASK),
7771 current_frame_info.fmask,
7772 "st", "std", -size1);
7773 if (size2 <= 4096)
7774 fprintf (file, "\tadd\t%s, -"HOST_WIDE_INT_PRINT_DEC", %s\n",
7775 sp_str, size2, sp_str);
7776 else
7778 build_big_number (file, size2, t1_str);
7779 fprintf (file, "\tsub\t%s, %s, %s\n", sp_str, t1_str, sp_str);
7781 if (dwarf2out_do_frame ())
7782 if (! (gmask & HARD_FRAME_POINTER_MASK))
7783 dwarf2out_def_cfa ("", STACK_POINTER_REGNUM, size);
7787 fprintf (file, "\t%s#PROLOGUE# 1\n", ASM_COMMENT_START);
7790 /* Do any necessary cleanup after a function to restore stack, frame,
7791 and regs. */
7793 static void
7794 sparc_flat_function_epilogue (FILE *file, HOST_WIDE_INT size)
7796 rtx epilogue_delay = current_function_epilogue_delay_list;
7797 int noepilogue = FALSE;
7799 /* This is only for the human reader. */
7800 fprintf (file, "\t%s#EPILOGUE#\n", ASM_COMMENT_START);
7802 /* The epilogue does not depend on any registers, but the stack
7803 registers, so we assume that if we have 1 pending nop, it can be
7804 ignored, and 2 it must be filled (2 nops occur for integer
7805 multiply and divide). */
7807 size = SPARC_STACK_ALIGN (size);
7808 size = (!current_frame_info.initialized
7809 ? sparc_flat_compute_frame_size (size)
7810 : current_frame_info.total_size);
7812 if (size == 0 && epilogue_delay == 0)
7814 rtx insn = get_last_insn ();
7816 /* If the last insn was a BARRIER, we don't have to write any code
7817 because a jump (aka return) was put there. */
7818 if (GET_CODE (insn) == NOTE)
7819 insn = prev_nonnote_insn (insn);
7820 if (insn && GET_CODE (insn) == BARRIER)
7821 noepilogue = TRUE;
7824 if (!noepilogue)
7826 int reg_offset = current_frame_info.reg_offset;
7827 int reg_offset1;
7828 const char *const sp_str = reg_names[STACK_POINTER_REGNUM];
7829 const char *const fp_str = reg_names[HARD_FRAME_POINTER_REGNUM];
7830 static const char *const t1_str = "%g1";
7832 /* In the reload sequence, we don't need to fill the load delay
7833 slots for most of the loads, also see if we can fill the final
7834 delay slot if not otherwise filled by the reload sequence. */
7836 if (size > 4096)
7837 build_big_number (file, size, t1_str);
7839 if (frame_pointer_needed)
7841 if (size > 4096)
7842 fprintf (file,"\tsub\t%s, %s, %s\t\t%s# sp not trusted here\n",
7843 fp_str, t1_str, sp_str, ASM_COMMENT_START);
7844 else
7845 fprintf (file,"\tadd\t%s, -"HOST_WIDE_INT_PRINT_DEC", %s"
7846 "\t\t%s# sp not trusted here\n",
7847 fp_str, size, sp_str, ASM_COMMENT_START);
7850 /* Is the entire register save area offsettable from %sp? */
7851 if (reg_offset < 4096 - 64 * UNITS_PER_WORD)
7853 reg_offset1 = 0;
7855 else
7857 /* Restore %sp in two steps, but make sure there is always a
7858 64-byte register save area, and %sp is properly aligned. */
7860 /* Amount to increment %sp by, the first time. */
7861 reg_offset1 = ((reg_offset - 64 - 16) + 15) & -16;
7863 /* Offset to register save area from %sp. */
7864 reg_offset = reg_offset1 - reg_offset;
7866 if (reg_offset1 > 4096)
7868 build_big_number (file, reg_offset1, t1_str);
7869 fprintf (file, "\tadd\t%s, %s, %s\n", sp_str, t1_str, sp_str);
7871 else
7872 fprintf (file, "\tsub\t%s, -%d, %s\n", sp_str, reg_offset1, sp_str);
7875 /* We must restore the frame pointer and return address reg first
7876 because they are treated specially by the prologue output code. */
7877 if (current_frame_info.gmask & HARD_FRAME_POINTER_MASK)
7879 fprintf (file, "\tld\t[%s+%d], %s\n",
7880 sp_str, reg_offset, fp_str);
7881 reg_offset += 4;
7883 if (current_frame_info.gmask & RETURN_ADDR_MASK)
7885 fprintf (file, "\tld\t[%s+%d], %s\n",
7886 sp_str, reg_offset, reg_names[RETURN_ADDR_REGNUM]);
7887 reg_offset += 4;
7890 /* Restore any remaining saved registers. */
7891 sparc_flat_save_restore (file, sp_str, reg_offset,
7892 current_frame_info.gmask & ~(HARD_FRAME_POINTER_MASK | RETURN_ADDR_MASK),
7893 current_frame_info.fmask,
7894 "ld", "ldd", 0);
7896 /* If we had to increment %sp in two steps, record it so the second
7897 restoration in the epilogue finishes up. */
7898 if (reg_offset1 > 0)
7900 size -= reg_offset1;
7901 if (size > 4096)
7902 build_big_number (file, size, t1_str);
7905 if (current_function_returns_struct)
7906 fprintf (file, "\tjmp\t%%o7+12\n");
7907 else
7908 fprintf (file, "\tretl\n");
7910 /* If the only register saved is the return address, we need a
7911 nop, unless we have an instruction to put into it. Otherwise
7912 we don't since reloading multiple registers doesn't reference
7913 the register being loaded. */
7915 if (epilogue_delay)
7917 if (size)
7918 abort ();
7919 final_scan_insn (XEXP (epilogue_delay, 0), file, 1, -2, 1);
7922 else if (size > 4096)
7923 fprintf (file, "\tadd\t%s, %s, %s\n", sp_str, t1_str, sp_str);
7925 else if (size > 0)
7926 fprintf (file, "\tsub\t%s, -"HOST_WIDE_INT_PRINT_DEC", %s\n",
7927 sp_str, size, sp_str);
7929 else
7930 fprintf (file, "\tnop\n");
7933 /* Reset state info for each function. */
7934 current_frame_info = zero_frame_info;
7936 sparc_output_deferred_case_vectors ();
7939 /* Define the number of delay slots needed for the function epilogue.
7941 On the sparc, we need a slot if either no stack has been allocated,
7942 or the only register saved is the return register. */
7945 sparc_flat_epilogue_delay_slots (void)
7947 if (!current_frame_info.initialized)
7948 (void) sparc_flat_compute_frame_size (get_frame_size ());
7950 if (current_frame_info.total_size == 0)
7951 return 1;
7953 return 0;
7956 /* Return true if TRIAL is a valid insn for the epilogue delay slot.
7957 Any single length instruction which doesn't reference the stack or frame
7958 pointer is OK. */
7961 sparc_flat_eligible_for_epilogue_delay (rtx trial, int slot ATTRIBUTE_UNUSED)
7963 rtx pat = PATTERN (trial);
7965 if (get_attr_length (trial) != 1)
7966 return 0;
7968 if (! reg_mentioned_p (stack_pointer_rtx, pat)
7969 && ! reg_mentioned_p (frame_pointer_rtx, pat))
7970 return 1;
7972 return 0;
7975 /* Adjust the cost of a scheduling dependency. Return the new cost of
7976 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
7978 static int
7979 supersparc_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
7981 enum attr_type insn_type;
7983 if (! recog_memoized (insn))
7984 return 0;
7986 insn_type = get_attr_type (insn);
7988 if (REG_NOTE_KIND (link) == 0)
7990 /* Data dependency; DEP_INSN writes a register that INSN reads some
7991 cycles later. */
7993 /* if a load, then the dependence must be on the memory address;
7994 add an extra "cycle". Note that the cost could be two cycles
7995 if the reg was written late in an instruction group; we ca not tell
7996 here. */
7997 if (insn_type == TYPE_LOAD || insn_type == TYPE_FPLOAD)
7998 return cost + 3;
8000 /* Get the delay only if the address of the store is the dependence. */
8001 if (insn_type == TYPE_STORE || insn_type == TYPE_FPSTORE)
8003 rtx pat = PATTERN(insn);
8004 rtx dep_pat = PATTERN (dep_insn);
8006 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
8007 return cost; /* This should not happen! */
8009 /* The dependency between the two instructions was on the data that
8010 is being stored. Assume that this implies that the address of the
8011 store is not dependent. */
8012 if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
8013 return cost;
8015 return cost + 3; /* An approximation. */
8018 /* A shift instruction cannot receive its data from an instruction
8019 in the same cycle; add a one cycle penalty. */
8020 if (insn_type == TYPE_SHIFT)
8021 return cost + 3; /* Split before cascade into shift. */
8023 else
8025 /* Anti- or output- dependency; DEP_INSN reads/writes a register that
8026 INSN writes some cycles later. */
8028 /* These are only significant for the fpu unit; writing a fp reg before
8029 the fpu has finished with it stalls the processor. */
8031 /* Reusing an integer register causes no problems. */
8032 if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
8033 return 0;
8036 return cost;
8039 static int
8040 hypersparc_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
8042 enum attr_type insn_type, dep_type;
8043 rtx pat = PATTERN(insn);
8044 rtx dep_pat = PATTERN (dep_insn);
8046 if (recog_memoized (insn) < 0 || recog_memoized (dep_insn) < 0)
8047 return cost;
8049 insn_type = get_attr_type (insn);
8050 dep_type = get_attr_type (dep_insn);
8052 switch (REG_NOTE_KIND (link))
8054 case 0:
8055 /* Data dependency; DEP_INSN writes a register that INSN reads some
8056 cycles later. */
8058 switch (insn_type)
8060 case TYPE_STORE:
8061 case TYPE_FPSTORE:
8062 /* Get the delay iff the address of the store is the dependence. */
8063 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
8064 return cost;
8066 if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
8067 return cost;
8068 return cost + 3;
8070 case TYPE_LOAD:
8071 case TYPE_SLOAD:
8072 case TYPE_FPLOAD:
8073 /* If a load, then the dependence must be on the memory address. If
8074 the addresses aren't equal, then it might be a false dependency */
8075 if (dep_type == TYPE_STORE || dep_type == TYPE_FPSTORE)
8077 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET
8078 || GET_CODE (SET_DEST (dep_pat)) != MEM
8079 || GET_CODE (SET_SRC (pat)) != MEM
8080 || ! rtx_equal_p (XEXP (SET_DEST (dep_pat), 0),
8081 XEXP (SET_SRC (pat), 0)))
8082 return cost + 2;
8084 return cost + 8;
8086 break;
8088 case TYPE_BRANCH:
8089 /* Compare to branch latency is 0. There is no benefit from
8090 separating compare and branch. */
8091 if (dep_type == TYPE_COMPARE)
8092 return 0;
8093 /* Floating point compare to branch latency is less than
8094 compare to conditional move. */
8095 if (dep_type == TYPE_FPCMP)
8096 return cost - 1;
8097 break;
8098 default:
8099 break;
8101 break;
8103 case REG_DEP_ANTI:
8104 /* Anti-dependencies only penalize the fpu unit. */
8105 if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
8106 return 0;
8107 break;
8109 default:
8110 break;
8113 return cost;
8116 static int
8117 sparc_adjust_cost(rtx insn, rtx link, rtx dep, int cost)
8119 switch (sparc_cpu)
8121 case PROCESSOR_SUPERSPARC:
8122 cost = supersparc_adjust_cost (insn, link, dep, cost);
8123 break;
8124 case PROCESSOR_HYPERSPARC:
8125 case PROCESSOR_SPARCLITE86X:
8126 cost = hypersparc_adjust_cost (insn, link, dep, cost);
8127 break;
8128 default:
8129 break;
8131 return cost;
8134 static void
8135 sparc_sched_init (FILE *dump ATTRIBUTE_UNUSED,
8136 int sched_verbose ATTRIBUTE_UNUSED,
8137 int max_ready ATTRIBUTE_UNUSED)
8141 static int
8142 sparc_use_dfa_pipeline_interface (void)
8144 if ((1 << sparc_cpu) &
8145 ((1 << PROCESSOR_ULTRASPARC) | (1 << PROCESSOR_CYPRESS) |
8146 (1 << PROCESSOR_SUPERSPARC) | (1 << PROCESSOR_HYPERSPARC) |
8147 (1 << PROCESSOR_SPARCLITE86X) | (1 << PROCESSOR_TSC701) |
8148 (1 << PROCESSOR_ULTRASPARC3)))
8149 return 1;
8150 return 0;
8153 static int
8154 sparc_use_sched_lookahead (void)
8156 if (sparc_cpu == PROCESSOR_ULTRASPARC
8157 || sparc_cpu == PROCESSOR_ULTRASPARC3)
8158 return 4;
8159 if ((1 << sparc_cpu) &
8160 ((1 << PROCESSOR_SUPERSPARC) | (1 << PROCESSOR_HYPERSPARC) |
8161 (1 << PROCESSOR_SPARCLITE86X)))
8162 return 3;
8163 return 0;
8166 static int
8167 sparc_issue_rate (void)
8169 switch (sparc_cpu)
8171 default:
8172 return 1;
8173 case PROCESSOR_V9:
8174 /* Assume V9 processors are capable of at least dual-issue. */
8175 return 2;
8176 case PROCESSOR_SUPERSPARC:
8177 return 3;
8178 case PROCESSOR_HYPERSPARC:
8179 case PROCESSOR_SPARCLITE86X:
8180 return 2;
8181 case PROCESSOR_ULTRASPARC:
8182 case PROCESSOR_ULTRASPARC3:
8183 return 4;
8187 static int
8188 set_extends (rtx insn)
8190 register rtx pat = PATTERN (insn);
8192 switch (GET_CODE (SET_SRC (pat)))
8194 /* Load and some shift instructions zero extend. */
8195 case MEM:
8196 case ZERO_EXTEND:
8197 /* sethi clears the high bits */
8198 case HIGH:
8199 /* LO_SUM is used with sethi. sethi cleared the high
8200 bits and the values used with lo_sum are positive */
8201 case LO_SUM:
8202 /* Store flag stores 0 or 1 */
8203 case LT: case LTU:
8204 case GT: case GTU:
8205 case LE: case LEU:
8206 case GE: case GEU:
8207 case EQ:
8208 case NE:
8209 return 1;
8210 case AND:
8212 rtx op0 = XEXP (SET_SRC (pat), 0);
8213 rtx op1 = XEXP (SET_SRC (pat), 1);
8214 if (GET_CODE (op1) == CONST_INT)
8215 return INTVAL (op1) >= 0;
8216 if (GET_CODE (op0) != REG)
8217 return 0;
8218 if (sparc_check_64 (op0, insn) == 1)
8219 return 1;
8220 return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
8222 case IOR:
8223 case XOR:
8225 rtx op0 = XEXP (SET_SRC (pat), 0);
8226 rtx op1 = XEXP (SET_SRC (pat), 1);
8227 if (GET_CODE (op0) != REG || sparc_check_64 (op0, insn) <= 0)
8228 return 0;
8229 if (GET_CODE (op1) == CONST_INT)
8230 return INTVAL (op1) >= 0;
8231 return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
8233 case LSHIFTRT:
8234 return GET_MODE (SET_SRC (pat)) == SImode;
8235 /* Positive integers leave the high bits zero. */
8236 case CONST_DOUBLE:
8237 return ! (CONST_DOUBLE_LOW (SET_SRC (pat)) & 0x80000000);
8238 case CONST_INT:
8239 return ! (INTVAL (SET_SRC (pat)) & 0x80000000);
8240 case ASHIFTRT:
8241 case SIGN_EXTEND:
8242 return - (GET_MODE (SET_SRC (pat)) == SImode);
8243 case REG:
8244 return sparc_check_64 (SET_SRC (pat), insn);
8245 default:
8246 return 0;
8250 /* We _ought_ to have only one kind per function, but... */
8251 static GTY(()) rtx sparc_addr_diff_list;
8252 static GTY(()) rtx sparc_addr_list;
8254 void
8255 sparc_defer_case_vector (rtx lab, rtx vec, int diff)
8257 vec = gen_rtx_EXPR_LIST (VOIDmode, lab, vec);
8258 if (diff)
8259 sparc_addr_diff_list
8260 = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_diff_list);
8261 else
8262 sparc_addr_list = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_list);
8265 static void
8266 sparc_output_addr_vec (rtx vec)
8268 rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
8269 int idx, vlen = XVECLEN (body, 0);
8271 #ifdef ASM_OUTPUT_ADDR_VEC_START
8272 ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
8273 #endif
8275 #ifdef ASM_OUTPUT_CASE_LABEL
8276 ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
8277 NEXT_INSN (lab));
8278 #else
8279 (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
8280 #endif
8282 for (idx = 0; idx < vlen; idx++)
8284 ASM_OUTPUT_ADDR_VEC_ELT
8285 (asm_out_file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
8288 #ifdef ASM_OUTPUT_ADDR_VEC_END
8289 ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
8290 #endif
8293 static void
8294 sparc_output_addr_diff_vec (rtx vec)
8296 rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
8297 rtx base = XEXP (XEXP (body, 0), 0);
8298 int idx, vlen = XVECLEN (body, 1);
8300 #ifdef ASM_OUTPUT_ADDR_VEC_START
8301 ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
8302 #endif
8304 #ifdef ASM_OUTPUT_CASE_LABEL
8305 ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
8306 NEXT_INSN (lab));
8307 #else
8308 (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
8309 #endif
8311 for (idx = 0; idx < vlen; idx++)
8313 ASM_OUTPUT_ADDR_DIFF_ELT
8314 (asm_out_file,
8315 body,
8316 CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
8317 CODE_LABEL_NUMBER (base));
8320 #ifdef ASM_OUTPUT_ADDR_VEC_END
8321 ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
8322 #endif
8325 static void
8326 sparc_output_deferred_case_vectors (void)
8328 rtx t;
8329 int align;
8331 if (sparc_addr_list == NULL_RTX
8332 && sparc_addr_diff_list == NULL_RTX)
8333 return;
8335 /* Align to cache line in the function's code section. */
8336 function_section (current_function_decl);
8338 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
8339 if (align > 0)
8340 ASM_OUTPUT_ALIGN (asm_out_file, align);
8342 for (t = sparc_addr_list; t ; t = XEXP (t, 1))
8343 sparc_output_addr_vec (XEXP (t, 0));
8344 for (t = sparc_addr_diff_list; t ; t = XEXP (t, 1))
8345 sparc_output_addr_diff_vec (XEXP (t, 0));
8347 sparc_addr_list = sparc_addr_diff_list = NULL_RTX;
8350 /* Return 0 if the high 32 bits of X (the low word of X, if DImode) are
8351 unknown. Return 1 if the high bits are zero, -1 if the register is
8352 sign extended. */
8354 sparc_check_64 (rtx x, rtx insn)
8356 /* If a register is set only once it is safe to ignore insns this
8357 code does not know how to handle. The loop will either recognize
8358 the single set and return the correct value or fail to recognize
8359 it and return 0. */
8360 int set_once = 0;
8361 rtx y = x;
8363 if (GET_CODE (x) != REG)
8364 abort ();
8366 if (GET_MODE (x) == DImode)
8367 y = gen_rtx_REG (SImode, REGNO (x) + WORDS_BIG_ENDIAN);
8369 if (flag_expensive_optimizations
8370 && REG_N_SETS (REGNO (y)) == 1)
8371 set_once = 1;
8373 if (insn == 0)
8375 if (set_once)
8376 insn = get_last_insn_anywhere ();
8377 else
8378 return 0;
8381 while ((insn = PREV_INSN (insn)))
8383 switch (GET_CODE (insn))
8385 case JUMP_INSN:
8386 case NOTE:
8387 break;
8388 case CODE_LABEL:
8389 case CALL_INSN:
8390 default:
8391 if (! set_once)
8392 return 0;
8393 break;
8394 case INSN:
8396 rtx pat = PATTERN (insn);
8397 if (GET_CODE (pat) != SET)
8398 return 0;
8399 if (rtx_equal_p (x, SET_DEST (pat)))
8400 return set_extends (insn);
8401 if (y && rtx_equal_p (y, SET_DEST (pat)))
8402 return set_extends (insn);
8403 if (reg_overlap_mentioned_p (SET_DEST (pat), y))
8404 return 0;
8408 return 0;
8411 /* Returns assembly code to perform a DImode shift using
8412 a 64-bit global or out register on SPARC-V8+. */
8413 char *
8414 sparc_v8plus_shift (rtx *operands, rtx insn, const char *opcode)
8416 static char asm_code[60];
8418 /* The scratch register is only required when the destination
8419 register is not a 64-bit global or out register. */
8420 if (which_alternative != 2)
8421 operands[3] = operands[0];
8423 /* We can only shift by constants <= 63. */
8424 if (GET_CODE (operands[2]) == CONST_INT)
8425 operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
8427 if (GET_CODE (operands[1]) == CONST_INT)
8429 output_asm_insn ("mov\t%1, %3", operands);
8431 else
8433 output_asm_insn ("sllx\t%H1, 32, %3", operands);
8434 if (sparc_check_64 (operands[1], insn) <= 0)
8435 output_asm_insn ("srl\t%L1, 0, %L1", operands);
8436 output_asm_insn ("or\t%L1, %3, %3", operands);
8439 strcpy(asm_code, opcode);
8441 if (which_alternative != 2)
8442 return strcat (asm_code, "\t%0, %2, %L0\n\tsrlx\t%L0, 32, %H0");
8443 else
8444 return strcat (asm_code, "\t%3, %2, %3\n\tsrlx\t%3, 32, %H0\n\tmov\t%3, %L0");
8447 /* Output rtl to increment the profiler label LABELNO
8448 for profiling a function entry. */
8450 void
8451 sparc_profile_hook (int labelno)
8453 char buf[32];
8454 rtx lab, fun;
8456 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
8457 lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
8458 fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_FUNCTION);
8460 emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lab, Pmode);
8463 #ifdef OBJECT_FORMAT_ELF
8464 static void
8465 sparc_elf_asm_named_section (const char *name, unsigned int flags)
8467 if (flags & SECTION_MERGE)
8469 /* entsize cannot be expressed in this section attributes
8470 encoding style. */
8471 default_elf_asm_named_section (name, flags);
8472 return;
8475 fprintf (asm_out_file, "\t.section\t\"%s\"", name);
8477 if (!(flags & SECTION_DEBUG))
8478 fputs (",#alloc", asm_out_file);
8479 if (flags & SECTION_WRITE)
8480 fputs (",#write", asm_out_file);
8481 if (flags & SECTION_CODE)
8482 fputs (",#execinstr", asm_out_file);
8484 /* ??? Handle SECTION_BSS. */
8486 fputc ('\n', asm_out_file);
8488 #endif /* OBJECT_FORMAT_ELF */
8490 /* We do not allow sibling calls if -mflat, nor
8491 we do not allow indirect calls to be optimized into sibling calls.
8493 Also, on sparc 32-bit we cannot emit a sibling call when the
8494 current function returns a structure. This is because the "unimp
8495 after call" convention would cause the callee to return to the
8496 wrong place. The generic code already disallows cases where the
8497 function being called returns a structure.
8499 It may seem strange how this last case could occur. Usually there
8500 is code after the call which jumps to epilogue code which dumps the
8501 return value into the struct return area. That ought to invalidate
8502 the sibling call right? Well, in the c++ case we can end up passing
8503 the pointer to the struct return area to a constructor (which returns
8504 void) and then nothing else happens. Such a sibling call would look
8505 valid without the added check here. */
8506 static bool
8507 sparc_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
8509 return (decl
8510 && ! TARGET_FLAT
8511 && (TARGET_ARCH64 || ! current_function_returns_struct));
8514 /* libfunc renaming. */
8515 #include "config/gofast.h"
8517 static void
8518 sparc_init_libfuncs (void)
8520 if (TARGET_ARCH32)
8522 /* Use the subroutines that Sun's library provides for integer
8523 multiply and divide. The `*' prevents an underscore from
8524 being prepended by the compiler. .umul is a little faster
8525 than .mul. */
8526 set_optab_libfunc (smul_optab, SImode, "*.umul");
8527 set_optab_libfunc (sdiv_optab, SImode, "*.div");
8528 set_optab_libfunc (udiv_optab, SImode, "*.udiv");
8529 set_optab_libfunc (smod_optab, SImode, "*.rem");
8530 set_optab_libfunc (umod_optab, SImode, "*.urem");
8532 /* TFmode arithmetic. These names are part of the SPARC 32bit ABI. */
8533 set_optab_libfunc (add_optab, TFmode, "_Q_add");
8534 set_optab_libfunc (sub_optab, TFmode, "_Q_sub");
8535 set_optab_libfunc (neg_optab, TFmode, "_Q_neg");
8536 set_optab_libfunc (smul_optab, TFmode, "_Q_mul");
8537 set_optab_libfunc (sdiv_optab, TFmode, "_Q_div");
8539 /* We can define the TFmode sqrt optab only if TARGET_FPU. This
8540 is because with soft-float, the SFmode and DFmode sqrt
8541 instructions will be absent, and the compiler will notice and
8542 try to use the TFmode sqrt instruction for calls to the
8543 builtin function sqrt, but this fails. */
8544 if (TARGET_FPU)
8545 set_optab_libfunc (sqrt_optab, TFmode, "_Q_sqrt");
8547 set_optab_libfunc (eq_optab, TFmode, "_Q_feq");
8548 set_optab_libfunc (ne_optab, TFmode, "_Q_fne");
8549 set_optab_libfunc (gt_optab, TFmode, "_Q_fgt");
8550 set_optab_libfunc (ge_optab, TFmode, "_Q_fge");
8551 set_optab_libfunc (lt_optab, TFmode, "_Q_flt");
8552 set_optab_libfunc (le_optab, TFmode, "_Q_fle");
8554 set_conv_libfunc (sext_optab, TFmode, SFmode, "_Q_stoq");
8555 set_conv_libfunc (sext_optab, TFmode, DFmode, "_Q_dtoq");
8556 set_conv_libfunc (trunc_optab, SFmode, TFmode, "_Q_qtos");
8557 set_conv_libfunc (trunc_optab, DFmode, TFmode, "_Q_qtod");
8559 set_conv_libfunc (sfix_optab, SImode, TFmode, "_Q_qtoi");
8560 set_conv_libfunc (ufix_optab, SImode, TFmode, "_Q_qtou");
8561 set_conv_libfunc (sfloat_optab, TFmode, SImode, "_Q_itoq");
8563 if (SUN_CONVERSION_LIBFUNCS)
8565 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftoll");
8566 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoull");
8567 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtoll");
8568 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoull");
8571 if (TARGET_ARCH64)
8573 /* In the SPARC 64bit ABI, SImode multiply and divide functions
8574 do not exist in the library. Make sure the compiler does not
8575 emit calls to them by accident. (It should always use the
8576 hardware instructions.) */
8577 set_optab_libfunc (smul_optab, SImode, 0);
8578 set_optab_libfunc (sdiv_optab, SImode, 0);
8579 set_optab_libfunc (udiv_optab, SImode, 0);
8580 set_optab_libfunc (smod_optab, SImode, 0);
8581 set_optab_libfunc (umod_optab, SImode, 0);
8583 if (SUN_INTEGER_MULTIPLY_64)
8585 set_optab_libfunc (smul_optab, DImode, "__mul64");
8586 set_optab_libfunc (sdiv_optab, DImode, "__div64");
8587 set_optab_libfunc (udiv_optab, DImode, "__udiv64");
8588 set_optab_libfunc (smod_optab, DImode, "__rem64");
8589 set_optab_libfunc (umod_optab, DImode, "__urem64");
8592 if (SUN_CONVERSION_LIBFUNCS)
8594 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftol");
8595 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoul");
8596 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtol");
8597 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoul");
8601 gofast_maybe_init_libfuncs ();
8604 /* ??? Similar to the standard section selection, but force reloc-y-ness
8605 if SUNOS4_SHARED_LIBRARIES. Unclear why this helps (as opposed to
8606 pretending PIC always on), but that's what the old code did. */
8608 static void
8609 sparc_aout_select_section (tree t, int reloc, unsigned HOST_WIDE_INT align)
8611 default_select_section (t, reloc | SUNOS4_SHARED_LIBRARIES, align);
8614 /* Use text section for a constant unless we need more alignment than
8615 that offers. */
8617 static void
8618 sparc_aout_select_rtx_section (enum machine_mode mode, rtx x,
8619 unsigned HOST_WIDE_INT align)
8621 if (align <= MAX_TEXT_ALIGN
8622 && ! (flag_pic && (symbolic_operand (x, mode)
8623 || SUNOS4_SHARED_LIBRARIES)))
8624 readonly_data_section ();
8625 else
8626 data_section ();
8630 sparc_extra_constraint_check (rtx op, int c, int strict)
8632 int reload_ok_mem;
8634 if (TARGET_ARCH64
8635 && (c == 'T' || c == 'U'))
8636 return 0;
8638 switch (c)
8640 case 'Q':
8641 return fp_sethi_p (op);
8643 case 'R':
8644 return fp_mov_p (op);
8646 case 'S':
8647 return fp_high_losum_p (op);
8649 case 'U':
8650 if (! strict
8651 || (GET_CODE (op) == REG
8652 && (REGNO (op) < FIRST_PSEUDO_REGISTER
8653 || reg_renumber[REGNO (op)] >= 0)))
8654 return register_ok_for_ldd (op);
8656 return 0;
8658 case 'W':
8659 case 'T':
8660 break;
8662 default:
8663 return 0;
8666 /* Our memory extra constraints have to emulate the
8667 behavior of 'm' and 'o' in order for reload to work
8668 correctly. */
8669 if (GET_CODE (op) == MEM)
8671 reload_ok_mem = 0;
8672 if ((TARGET_ARCH64 || mem_min_alignment (op, 8))
8673 && (! strict
8674 || strict_memory_address_p (Pmode, XEXP (op, 0))))
8675 reload_ok_mem = 1;
8677 else
8679 reload_ok_mem = (reload_in_progress
8680 && GET_CODE (op) == REG
8681 && REGNO (op) >= FIRST_PSEUDO_REGISTER
8682 && reg_renumber [REGNO (op)] < 0);
8685 return reload_ok_mem;
8688 /* ??? This duplicates information provided to the compiler by the
8689 ??? scheduler description. Some day, teach genautomata to output
8690 ??? the latencies and then CSE will just use that. */
8692 static bool
8693 sparc_rtx_costs (rtx x, int code, int outer_code, int *total)
8695 switch (code)
8697 case PLUS: case MINUS: case ABS: case NEG:
8698 case FLOAT: case UNSIGNED_FLOAT:
8699 case FIX: case UNSIGNED_FIX:
8700 case FLOAT_EXTEND: case FLOAT_TRUNCATE:
8701 if (FLOAT_MODE_P (GET_MODE (x)))
8703 switch (sparc_cpu)
8705 case PROCESSOR_ULTRASPARC:
8706 case PROCESSOR_ULTRASPARC3:
8707 *total = COSTS_N_INSNS (4);
8708 return true;
8710 case PROCESSOR_SUPERSPARC:
8711 *total = COSTS_N_INSNS (3);
8712 return true;
8714 case PROCESSOR_CYPRESS:
8715 *total = COSTS_N_INSNS (5);
8716 return true;
8718 case PROCESSOR_HYPERSPARC:
8719 case PROCESSOR_SPARCLITE86X:
8720 default:
8721 *total = COSTS_N_INSNS (1);
8722 return true;
8726 *total = COSTS_N_INSNS (1);
8727 return true;
8729 case SQRT:
8730 switch (sparc_cpu)
8732 case PROCESSOR_ULTRASPARC:
8733 if (GET_MODE (x) == SFmode)
8734 *total = COSTS_N_INSNS (13);
8735 else
8736 *total = COSTS_N_INSNS (23);
8737 return true;
8739 case PROCESSOR_ULTRASPARC3:
8740 if (GET_MODE (x) == SFmode)
8741 *total = COSTS_N_INSNS (20);
8742 else
8743 *total = COSTS_N_INSNS (29);
8744 return true;
8746 case PROCESSOR_SUPERSPARC:
8747 *total = COSTS_N_INSNS (12);
8748 return true;
8750 case PROCESSOR_CYPRESS:
8751 *total = COSTS_N_INSNS (63);
8752 return true;
8754 case PROCESSOR_HYPERSPARC:
8755 case PROCESSOR_SPARCLITE86X:
8756 *total = COSTS_N_INSNS (17);
8757 return true;
8759 default:
8760 *total = COSTS_N_INSNS (30);
8761 return true;
8764 case COMPARE:
8765 if (FLOAT_MODE_P (GET_MODE (x)))
8767 switch (sparc_cpu)
8769 case PROCESSOR_ULTRASPARC:
8770 case PROCESSOR_ULTRASPARC3:
8771 *total = COSTS_N_INSNS (1);
8772 return true;
8774 case PROCESSOR_SUPERSPARC:
8775 *total = COSTS_N_INSNS (3);
8776 return true;
8778 case PROCESSOR_CYPRESS:
8779 *total = COSTS_N_INSNS (5);
8780 return true;
8782 case PROCESSOR_HYPERSPARC:
8783 case PROCESSOR_SPARCLITE86X:
8784 default:
8785 *total = COSTS_N_INSNS (1);
8786 return true;
8790 /* ??? Maybe mark integer compares as zero cost on
8791 ??? all UltraSPARC processors because the result
8792 ??? can be bypassed to a branch in the same group. */
8794 *total = COSTS_N_INSNS (1);
8795 return true;
8797 case MULT:
8798 if (FLOAT_MODE_P (GET_MODE (x)))
8800 switch (sparc_cpu)
8802 case PROCESSOR_ULTRASPARC:
8803 case PROCESSOR_ULTRASPARC3:
8804 *total = COSTS_N_INSNS (4);
8805 return true;
8807 case PROCESSOR_SUPERSPARC:
8808 *total = COSTS_N_INSNS (3);
8809 return true;
8811 case PROCESSOR_CYPRESS:
8812 *total = COSTS_N_INSNS (7);
8813 return true;
8815 case PROCESSOR_HYPERSPARC:
8816 case PROCESSOR_SPARCLITE86X:
8817 *total = COSTS_N_INSNS (1);
8818 return true;
8820 default:
8821 *total = COSTS_N_INSNS (5);
8822 return true;
8826 /* The latency is actually variable for Ultra-I/II
8827 And if one of the inputs have a known constant
8828 value, we could calculate this precisely.
8830 However, for that to be useful we would need to
8831 add some machine description changes which would
8832 make sure small constants ended up in rs1 of the
8833 multiply instruction. This is because the multiply
8834 latency is determined by the number of clear (or
8835 set if the value is negative) bits starting from
8836 the most significant bit of the first input.
8838 The algorithm for computing num_cycles of a multiply
8839 on Ultra-I/II is:
8841 if (rs1 < 0)
8842 highest_bit = highest_clear_bit(rs1);
8843 else
8844 highest_bit = highest_set_bit(rs1);
8845 if (num_bits < 3)
8846 highest_bit = 3;
8847 num_cycles = 4 + ((highest_bit - 3) / 2);
8849 If we did that we would have to also consider register
8850 allocation issues that would result from forcing such
8851 a value into a register.
8853 There are other similar tricks we could play if we
8854 knew, for example, that one input was an array index.
8856 Since we do not play any such tricks currently the
8857 safest thing to do is report the worst case latency. */
8858 if (sparc_cpu == PROCESSOR_ULTRASPARC)
8860 *total = (GET_MODE (x) == DImode
8861 ? COSTS_N_INSNS (34) : COSTS_N_INSNS (19));
8862 return true;
8865 /* Multiply latency on Ultra-III, fortunately, is constant. */
8866 if (sparc_cpu == PROCESSOR_ULTRASPARC3)
8868 *total = COSTS_N_INSNS (6);
8869 return true;
8872 if (sparc_cpu == PROCESSOR_HYPERSPARC
8873 || sparc_cpu == PROCESSOR_SPARCLITE86X)
8875 *total = COSTS_N_INSNS (17);
8876 return true;
8879 *total = (TARGET_HARD_MUL ? COSTS_N_INSNS (5) : COSTS_N_INSNS (25));
8880 return true;
8882 case DIV:
8883 case UDIV:
8884 case MOD:
8885 case UMOD:
8886 if (FLOAT_MODE_P (GET_MODE (x)))
8888 switch (sparc_cpu)
8890 case PROCESSOR_ULTRASPARC:
8891 if (GET_MODE (x) == SFmode)
8892 *total = COSTS_N_INSNS (13);
8893 else
8894 *total = COSTS_N_INSNS (23);
8895 return true;
8897 case PROCESSOR_ULTRASPARC3:
8898 if (GET_MODE (x) == SFmode)
8899 *total = COSTS_N_INSNS (17);
8900 else
8901 *total = COSTS_N_INSNS (20);
8902 return true;
8904 case PROCESSOR_SUPERSPARC:
8905 if (GET_MODE (x) == SFmode)
8906 *total = COSTS_N_INSNS (6);
8907 else
8908 *total = COSTS_N_INSNS (9);
8909 return true;
8911 case PROCESSOR_HYPERSPARC:
8912 case PROCESSOR_SPARCLITE86X:
8913 if (GET_MODE (x) == SFmode)
8914 *total = COSTS_N_INSNS (8);
8915 else
8916 *total = COSTS_N_INSNS (12);
8917 return true;
8919 default:
8920 *total = COSTS_N_INSNS (7);
8921 return true;
8925 if (sparc_cpu == PROCESSOR_ULTRASPARC)
8926 *total = (GET_MODE (x) == DImode
8927 ? COSTS_N_INSNS (68) : COSTS_N_INSNS (37));
8928 else if (sparc_cpu == PROCESSOR_ULTRASPARC3)
8929 *total = (GET_MODE (x) == DImode
8930 ? COSTS_N_INSNS (71) : COSTS_N_INSNS (40));
8931 else
8932 *total = COSTS_N_INSNS (25);
8933 return true;
8935 case IF_THEN_ELSE:
8936 /* Conditional moves. */
8937 switch (sparc_cpu)
8939 case PROCESSOR_ULTRASPARC:
8940 *total = COSTS_N_INSNS (2);
8941 return true;
8943 case PROCESSOR_ULTRASPARC3:
8944 if (FLOAT_MODE_P (GET_MODE (x)))
8945 *total = COSTS_N_INSNS (3);
8946 else
8947 *total = COSTS_N_INSNS (2);
8948 return true;
8950 default:
8951 *total = COSTS_N_INSNS (1);
8952 return true;
8955 case MEM:
8956 /* If outer-code is SIGN/ZERO extension we have to subtract
8957 out COSTS_N_INSNS (1) from whatever we return in determining
8958 the cost. */
8959 switch (sparc_cpu)
8961 case PROCESSOR_ULTRASPARC:
8962 if (outer_code == ZERO_EXTEND)
8963 *total = COSTS_N_INSNS (1);
8964 else
8965 *total = COSTS_N_INSNS (2);
8966 return true;
8968 case PROCESSOR_ULTRASPARC3:
8969 if (outer_code == ZERO_EXTEND)
8971 if (GET_MODE (x) == QImode
8972 || GET_MODE (x) == HImode
8973 || outer_code == SIGN_EXTEND)
8974 *total = COSTS_N_INSNS (2);
8975 else
8976 *total = COSTS_N_INSNS (1);
8978 else
8980 /* This handles sign extension (3 cycles)
8981 and everything else (2 cycles). */
8982 *total = COSTS_N_INSNS (2);
8984 return true;
8986 case PROCESSOR_SUPERSPARC:
8987 if (FLOAT_MODE_P (GET_MODE (x))
8988 || outer_code == ZERO_EXTEND
8989 || outer_code == SIGN_EXTEND)
8990 *total = COSTS_N_INSNS (0);
8991 else
8992 *total = COSTS_N_INSNS (1);
8993 return true;
8995 case PROCESSOR_TSC701:
8996 if (outer_code == ZERO_EXTEND
8997 || outer_code == SIGN_EXTEND)
8998 *total = COSTS_N_INSNS (2);
8999 else
9000 *total = COSTS_N_INSNS (3);
9001 return true;
9003 case PROCESSOR_CYPRESS:
9004 if (outer_code == ZERO_EXTEND
9005 || outer_code == SIGN_EXTEND)
9006 *total = COSTS_N_INSNS (1);
9007 else
9008 *total = COSTS_N_INSNS (2);
9009 return true;
9011 case PROCESSOR_HYPERSPARC:
9012 case PROCESSOR_SPARCLITE86X:
9013 default:
9014 if (outer_code == ZERO_EXTEND
9015 || outer_code == SIGN_EXTEND)
9016 *total = COSTS_N_INSNS (0);
9017 else
9018 *total = COSTS_N_INSNS (1);
9019 return true;
9022 case CONST_INT:
9023 if (INTVAL (x) < 0x1000 && INTVAL (x) >= -0x1000)
9025 *total = 0;
9026 return true;
9028 /* FALLTHRU */
9030 case HIGH:
9031 *total = 2;
9032 return true;
9034 case CONST:
9035 case LABEL_REF:
9036 case SYMBOL_REF:
9037 *total = 4;
9038 return true;
9040 case CONST_DOUBLE:
9041 if (GET_MODE (x) == DImode
9042 && ((XINT (x, 3) == 0
9043 && (unsigned HOST_WIDE_INT) XINT (x, 2) < 0x1000)
9044 || (XINT (x, 3) == -1
9045 && XINT (x, 2) < 0
9046 && XINT (x, 2) >= -0x1000)))
9047 *total = 0;
9048 else
9049 *total = 8;
9050 return true;
9052 default:
9053 return false;
9057 /* Output code to add DELTA to the first argument, and then jump to FUNCTION.
9058 Used for C++ multiple inheritance. */
9060 static void
9061 sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
9062 HOST_WIDE_INT delta,
9063 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED,
9064 tree function)
9066 rtx this, insn, funexp, delta_rtx, tmp;
9068 reload_completed = 1;
9069 epilogue_completed = 1;
9070 no_new_pseudos = 1;
9071 current_function_uses_only_leaf_regs = 1;
9073 emit_note (NOTE_INSN_PROLOGUE_END);
9075 /* Find the "this" pointer. Normally in %o0, but in ARCH64 if the function
9076 returns a structure, the structure return pointer is there instead. */
9077 if (TARGET_ARCH64 && aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
9078 this = gen_rtx_REG (Pmode, SPARC_INCOMING_INT_ARG_FIRST + 1);
9079 else
9080 this = gen_rtx_REG (Pmode, SPARC_INCOMING_INT_ARG_FIRST);
9082 /* Add DELTA. When possible use a plain add, otherwise load it into
9083 a register first. */
9084 delta_rtx = GEN_INT (delta);
9085 if (!SPARC_SIMM13_P (delta))
9087 rtx scratch = gen_rtx_REG (Pmode, 1);
9089 if (input_operand (delta_rtx, GET_MODE (scratch)))
9090 emit_insn (gen_rtx_SET (VOIDmode, scratch, delta_rtx));
9091 else
9093 if (TARGET_ARCH64)
9094 sparc_emit_set_const64 (scratch, delta_rtx);
9095 else
9096 sparc_emit_set_const32 (scratch, delta_rtx);
9099 delta_rtx = scratch;
9102 tmp = gen_rtx_PLUS (Pmode, this, delta_rtx);
9103 emit_insn (gen_rtx_SET (VOIDmode, this, tmp));
9105 /* Generate a tail call to the target function. */
9106 if (! TREE_USED (function))
9108 assemble_external (function);
9109 TREE_USED (function) = 1;
9111 funexp = XEXP (DECL_RTL (function), 0);
9112 funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
9113 insn = emit_call_insn (gen_sibcall (funexp));
9114 SIBLING_CALL_P (insn) = 1;
9115 emit_barrier ();
9117 /* Run just enough of rest_of_compilation to get the insns emitted.
9118 There's not really enough bulk here to make other passes such as
9119 instruction scheduling worth while. Note that use_thunk calls
9120 assemble_start_function and assemble_end_function. */
9121 insn = get_insns ();
9122 insn_locators_initialize ();
9123 shorten_branches (insn);
9124 final_start_function (insn, file, 1);
9125 final (insn, file, 1, 0);
9126 final_end_function ();
9128 reload_completed = 0;
9129 epilogue_completed = 0;
9130 no_new_pseudos = 0;
9133 /* How to allocate a 'struct machine_function'. */
9135 static struct machine_function *
9136 sparc_init_machine_status (void)
9138 return ggc_alloc_cleared (sizeof (struct machine_function));
9141 /* Locate some local-dynamic symbol still in use by this function
9142 so that we can print its name in local-dynamic base patterns. */
9144 static const char *
9145 get_some_local_dynamic_name (void)
9147 rtx insn;
9149 if (cfun->machine->some_ld_name)
9150 return cfun->machine->some_ld_name;
9152 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
9153 if (INSN_P (insn)
9154 && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
9155 return cfun->machine->some_ld_name;
9157 abort ();
9160 static int
9161 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
9163 rtx x = *px;
9165 if (x
9166 && GET_CODE (x) == SYMBOL_REF
9167 && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
9169 cfun->machine->some_ld_name = XSTR (x, 0);
9170 return 1;
9173 return 0;
9176 /* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
9177 We need to emit DTP-relative relocations. */
9179 void
9180 sparc_output_dwarf_dtprel (FILE *file, int size, rtx x)
9182 switch (size)
9184 case 4:
9185 fputs ("\t.word\t%r_tls_dtpoff32(", file);
9186 break;
9187 case 8:
9188 fputs ("\t.xword\t%r_tls_dtpoff64(", file);
9189 break;
9190 default:
9191 abort ();
9193 output_addr_const (file, x);
9194 fputs (")", file);
9197 #include "gt-sparc.h"