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, 2004 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,
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)
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. */
27 #include "coretypes.h"
32 #include "hard-reg-set.h"
34 #include "insn-config.h"
35 #include "conditions.h"
37 #include "insn-attr.h"
48 #include "target-def.h"
49 #include "cfglayout.h"
50 #include "tree-gimple.h"
54 struct processor_costs cypress_costs
= {
55 COSTS_N_INSNS (2), /* int load */
56 COSTS_N_INSNS (2), /* int signed load */
57 COSTS_N_INSNS (2), /* int zeroed load */
58 COSTS_N_INSNS (2), /* float load */
59 COSTS_N_INSNS (5), /* fmov, fneg, fabs */
60 COSTS_N_INSNS (5), /* fadd, fsub */
61 COSTS_N_INSNS (1), /* fcmp */
62 COSTS_N_INSNS (1), /* fmov, fmovr */
63 COSTS_N_INSNS (7), /* fmul */
64 COSTS_N_INSNS (37), /* fdivs */
65 COSTS_N_INSNS (37), /* fdivd */
66 COSTS_N_INSNS (63), /* fsqrts */
67 COSTS_N_INSNS (63), /* fsqrtd */
68 COSTS_N_INSNS (1), /* imul */
69 COSTS_N_INSNS (1), /* imulX */
70 0, /* imul bit factor */
71 COSTS_N_INSNS (1), /* idiv */
72 COSTS_N_INSNS (1), /* idivX */
73 COSTS_N_INSNS (1), /* movcc/movr */
74 0, /* shift penalty */
78 struct processor_costs supersparc_costs
= {
79 COSTS_N_INSNS (1), /* int load */
80 COSTS_N_INSNS (1), /* int signed load */
81 COSTS_N_INSNS (1), /* int zeroed load */
82 COSTS_N_INSNS (0), /* float load */
83 COSTS_N_INSNS (3), /* fmov, fneg, fabs */
84 COSTS_N_INSNS (3), /* fadd, fsub */
85 COSTS_N_INSNS (3), /* fcmp */
86 COSTS_N_INSNS (1), /* fmov, fmovr */
87 COSTS_N_INSNS (3), /* fmul */
88 COSTS_N_INSNS (6), /* fdivs */
89 COSTS_N_INSNS (9), /* fdivd */
90 COSTS_N_INSNS (12), /* fsqrts */
91 COSTS_N_INSNS (12), /* fsqrtd */
92 COSTS_N_INSNS (4), /* imul */
93 COSTS_N_INSNS (4), /* imulX */
94 0, /* imul bit factor */
95 COSTS_N_INSNS (4), /* idiv */
96 COSTS_N_INSNS (4), /* idivX */
97 COSTS_N_INSNS (1), /* movcc/movr */
98 1, /* shift penalty */
102 struct processor_costs hypersparc_costs
= {
103 COSTS_N_INSNS (1), /* int load */
104 COSTS_N_INSNS (1), /* int signed load */
105 COSTS_N_INSNS (1), /* int zeroed load */
106 COSTS_N_INSNS (1), /* float load */
107 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
108 COSTS_N_INSNS (1), /* fadd, fsub */
109 COSTS_N_INSNS (1), /* fcmp */
110 COSTS_N_INSNS (1), /* fmov, fmovr */
111 COSTS_N_INSNS (1), /* fmul */
112 COSTS_N_INSNS (8), /* fdivs */
113 COSTS_N_INSNS (12), /* fdivd */
114 COSTS_N_INSNS (17), /* fsqrts */
115 COSTS_N_INSNS (17), /* fsqrtd */
116 COSTS_N_INSNS (17), /* imul */
117 COSTS_N_INSNS (17), /* imulX */
118 0, /* imul bit factor */
119 COSTS_N_INSNS (17), /* idiv */
120 COSTS_N_INSNS (17), /* idivX */
121 COSTS_N_INSNS (1), /* movcc/movr */
122 0, /* shift penalty */
126 struct processor_costs sparclet_costs
= {
127 COSTS_N_INSNS (3), /* int load */
128 COSTS_N_INSNS (3), /* int signed load */
129 COSTS_N_INSNS (1), /* int zeroed load */
130 COSTS_N_INSNS (1), /* float load */
131 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
132 COSTS_N_INSNS (1), /* fadd, fsub */
133 COSTS_N_INSNS (1), /* fcmp */
134 COSTS_N_INSNS (1), /* fmov, fmovr */
135 COSTS_N_INSNS (1), /* fmul */
136 COSTS_N_INSNS (1), /* fdivs */
137 COSTS_N_INSNS (1), /* fdivd */
138 COSTS_N_INSNS (1), /* fsqrts */
139 COSTS_N_INSNS (1), /* fsqrtd */
140 COSTS_N_INSNS (5), /* imul */
141 COSTS_N_INSNS (5), /* imulX */
142 0, /* imul bit factor */
143 COSTS_N_INSNS (5), /* idiv */
144 COSTS_N_INSNS (5), /* idivX */
145 COSTS_N_INSNS (1), /* movcc/movr */
146 0, /* shift penalty */
150 struct processor_costs ultrasparc_costs
= {
151 COSTS_N_INSNS (2), /* int load */
152 COSTS_N_INSNS (3), /* int signed load */
153 COSTS_N_INSNS (2), /* int zeroed load */
154 COSTS_N_INSNS (2), /* float load */
155 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
156 COSTS_N_INSNS (4), /* fadd, fsub */
157 COSTS_N_INSNS (1), /* fcmp */
158 COSTS_N_INSNS (2), /* fmov, fmovr */
159 COSTS_N_INSNS (4), /* fmul */
160 COSTS_N_INSNS (13), /* fdivs */
161 COSTS_N_INSNS (23), /* fdivd */
162 COSTS_N_INSNS (13), /* fsqrts */
163 COSTS_N_INSNS (23), /* fsqrtd */
164 COSTS_N_INSNS (4), /* imul */
165 COSTS_N_INSNS (4), /* imulX */
166 2, /* imul bit factor */
167 COSTS_N_INSNS (37), /* idiv */
168 COSTS_N_INSNS (68), /* idivX */
169 COSTS_N_INSNS (2), /* movcc/movr */
170 2, /* shift penalty */
174 struct processor_costs ultrasparc3_costs
= {
175 COSTS_N_INSNS (2), /* int load */
176 COSTS_N_INSNS (3), /* int signed load */
177 COSTS_N_INSNS (3), /* int zeroed load */
178 COSTS_N_INSNS (2), /* float load */
179 COSTS_N_INSNS (3), /* fmov, fneg, fabs */
180 COSTS_N_INSNS (4), /* fadd, fsub */
181 COSTS_N_INSNS (5), /* fcmp */
182 COSTS_N_INSNS (3), /* fmov, fmovr */
183 COSTS_N_INSNS (4), /* fmul */
184 COSTS_N_INSNS (17), /* fdivs */
185 COSTS_N_INSNS (20), /* fdivd */
186 COSTS_N_INSNS (20), /* fsqrts */
187 COSTS_N_INSNS (29), /* fsqrtd */
188 COSTS_N_INSNS (6), /* imul */
189 COSTS_N_INSNS (6), /* imulX */
190 0, /* imul bit factor */
191 COSTS_N_INSNS (40), /* idiv */
192 COSTS_N_INSNS (71), /* idivX */
193 COSTS_N_INSNS (2), /* movcc/movr */
194 0, /* shift penalty */
197 const struct processor_costs
*sparc_costs
= &cypress_costs
;
199 #ifdef HAVE_AS_RELAX_OPTION
200 /* If 'as' and 'ld' are relaxing tail call insns into branch always, use
201 "or %o7,%g0,X; call Y; or X,%g0,%o7" always, so that it can be optimized.
202 With sethi/jmp, neither 'as' nor 'ld' has an easy way how to find out if
203 somebody does not branch between the sethi and jmp. */
204 #define LEAF_SIBCALL_SLOT_RESERVED_P 1
206 #define LEAF_SIBCALL_SLOT_RESERVED_P \
207 ((TARGET_ARCH64 && !TARGET_CM_MEDLOW) || flag_pic)
210 /* Global variables for machine-dependent things. */
212 /* Size of frame. Need to know this to emit return insns from leaf procedures.
213 ACTUAL_FSIZE is set by sparc_compute_frame_size() which is called during the
214 reload pass. This is important as the value is later used for scheduling
215 (to see what can go in a delay slot).
216 APPARENT_FSIZE is the size of the stack less the register save area and less
217 the outgoing argument area. It is used when saving call preserved regs. */
218 static HOST_WIDE_INT apparent_fsize
;
219 static HOST_WIDE_INT actual_fsize
;
221 /* Number of live general or floating point registers needed to be
222 saved (as 4-byte quantities). */
223 static int num_gfregs
;
225 /* The alias set for prologue/epilogue register save/restore. */
226 static GTY(()) int sparc_sr_alias_set
;
228 /* Save the operands last given to a compare for use when we
229 generate a scc or bcc insn. */
230 rtx sparc_compare_op0
, sparc_compare_op1
;
232 /* Vector to say how input registers are mapped to output registers.
233 HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
234 eliminate it. You must use -fomit-frame-pointer to get that. */
235 char leaf_reg_remap
[] =
236 { 0, 1, 2, 3, 4, 5, 6, 7,
237 -1, -1, -1, -1, -1, -1, 14, -1,
238 -1, -1, -1, -1, -1, -1, -1, -1,
239 8, 9, 10, 11, 12, 13, -1, 15,
241 32, 33, 34, 35, 36, 37, 38, 39,
242 40, 41, 42, 43, 44, 45, 46, 47,
243 48, 49, 50, 51, 52, 53, 54, 55,
244 56, 57, 58, 59, 60, 61, 62, 63,
245 64, 65, 66, 67, 68, 69, 70, 71,
246 72, 73, 74, 75, 76, 77, 78, 79,
247 80, 81, 82, 83, 84, 85, 86, 87,
248 88, 89, 90, 91, 92, 93, 94, 95,
249 96, 97, 98, 99, 100};
251 /* Vector, indexed by hard register number, which contains 1
252 for a register that is allowable in a candidate for leaf
253 function treatment. */
254 char sparc_leaf_regs
[] =
255 { 1, 1, 1, 1, 1, 1, 1, 1,
256 0, 0, 0, 0, 0, 0, 1, 0,
257 0, 0, 0, 0, 0, 0, 0, 0,
258 1, 1, 1, 1, 1, 1, 0, 1,
259 1, 1, 1, 1, 1, 1, 1, 1,
260 1, 1, 1, 1, 1, 1, 1, 1,
261 1, 1, 1, 1, 1, 1, 1, 1,
262 1, 1, 1, 1, 1, 1, 1, 1,
263 1, 1, 1, 1, 1, 1, 1, 1,
264 1, 1, 1, 1, 1, 1, 1, 1,
265 1, 1, 1, 1, 1, 1, 1, 1,
266 1, 1, 1, 1, 1, 1, 1, 1,
269 struct machine_function
GTY(())
271 /* Some local-dynamic TLS symbol name. */
272 const char *some_ld_name
;
275 /* Register we pretend to think the frame pointer is allocated to.
276 Normally, this is %fp, but if we are in a leaf procedure, this
277 is %sp+"something". We record "something" separately as it may
278 be too big for reg+constant addressing. */
280 static rtx frame_base_reg
;
281 static HOST_WIDE_INT frame_base_offset
;
283 static void sparc_init_modes (void);
284 static void scan_record_type (tree
, int *, int *, int *);
285 static int function_arg_slotno (const CUMULATIVE_ARGS
*, enum machine_mode
,
286 tree
, int, int, int *, int *);
288 static int supersparc_adjust_cost (rtx
, rtx
, rtx
, int);
289 static int hypersparc_adjust_cost (rtx
, rtx
, rtx
, int);
291 static void sparc_output_addr_vec (rtx
);
292 static void sparc_output_addr_diff_vec (rtx
);
293 static void sparc_output_deferred_case_vectors (void);
294 static rtx
sparc_builtin_saveregs (void);
295 static int epilogue_renumber (rtx
*, int);
296 static bool sparc_assemble_integer (rtx
, unsigned int, int);
297 static int set_extends (rtx
);
298 static void load_pic_register (void);
299 static int save_or_restore_regs (int, int, rtx
, int, int);
300 static void emit_save_regs (void);
301 static void emit_restore_regs (void);
302 static void sparc_asm_function_prologue (FILE *, HOST_WIDE_INT
);
303 static void sparc_asm_function_epilogue (FILE *, HOST_WIDE_INT
);
304 #ifdef OBJECT_FORMAT_ELF
305 static void sparc_elf_asm_named_section (const char *, unsigned int);
308 static int sparc_adjust_cost (rtx
, rtx
, rtx
, int);
309 static int sparc_issue_rate (void);
310 static void sparc_sched_init (FILE *, int, int);
311 static int sparc_use_sched_lookahead (void);
313 static void emit_soft_tfmode_libcall (const char *, int, rtx
*);
314 static void emit_soft_tfmode_binop (enum rtx_code
, rtx
*);
315 static void emit_soft_tfmode_unop (enum rtx_code
, rtx
*);
316 static void emit_soft_tfmode_cvt (enum rtx_code
, rtx
*);
317 static void emit_hard_tfmode_operation (enum rtx_code
, rtx
*);
319 static bool sparc_function_ok_for_sibcall (tree
, tree
);
320 static void sparc_init_libfuncs (void);
321 static void sparc_output_mi_thunk (FILE *, tree
, HOST_WIDE_INT
,
322 HOST_WIDE_INT
, tree
);
323 static struct machine_function
* sparc_init_machine_status (void);
324 static bool sparc_cannot_force_const_mem (rtx
);
325 static rtx
sparc_tls_get_addr (void);
326 static rtx
sparc_tls_got (void);
327 static const char *get_some_local_dynamic_name (void);
328 static int get_some_local_dynamic_name_1 (rtx
*, void *);
329 static bool sparc_rtx_costs (rtx
, int, int, int *);
330 static bool sparc_promote_prototypes (tree
);
331 static rtx
sparc_struct_value_rtx (tree
, int);
332 static bool sparc_return_in_memory (tree
, tree
);
333 static bool sparc_strict_argument_naming (CUMULATIVE_ARGS
*);
334 static tree
sparc_gimplify_va_arg (tree
, tree
, tree
*, tree
*);
335 static bool sparc_pass_by_reference (CUMULATIVE_ARGS
*,
336 enum machine_mode
, tree
, bool);
338 /* Option handling. */
340 /* Code model option as passed by user. */
341 const char *sparc_cmodel_string
;
343 enum cmodel sparc_cmodel
;
345 char sparc_hard_reg_printed
[8];
347 struct sparc_cpu_select sparc_select
[] =
349 /* switch name, tune arch */
350 { (char *)0, "default", 1, 1 },
351 { (char *)0, "-mcpu=", 1, 1 },
352 { (char *)0, "-mtune=", 1, 0 },
356 /* CPU type. This is set from TARGET_CPU_DEFAULT and -m{cpu,tune}=xxx. */
357 enum processor_type sparc_cpu
;
359 /* Initialize the GCC target structure. */
361 /* The sparc default is to use .half rather than .short for aligned
362 HI objects. Use .word instead of .long on non-ELF systems. */
363 #undef TARGET_ASM_ALIGNED_HI_OP
364 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
365 #ifndef OBJECT_FORMAT_ELF
366 #undef TARGET_ASM_ALIGNED_SI_OP
367 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
370 #undef TARGET_ASM_UNALIGNED_HI_OP
371 #define TARGET_ASM_UNALIGNED_HI_OP "\t.uahalf\t"
372 #undef TARGET_ASM_UNALIGNED_SI_OP
373 #define TARGET_ASM_UNALIGNED_SI_OP "\t.uaword\t"
374 #undef TARGET_ASM_UNALIGNED_DI_OP
375 #define TARGET_ASM_UNALIGNED_DI_OP "\t.uaxword\t"
377 /* The target hook has to handle DI-mode values. */
378 #undef TARGET_ASM_INTEGER
379 #define TARGET_ASM_INTEGER sparc_assemble_integer
381 #undef TARGET_ASM_FUNCTION_PROLOGUE
382 #define TARGET_ASM_FUNCTION_PROLOGUE sparc_asm_function_prologue
383 #undef TARGET_ASM_FUNCTION_EPILOGUE
384 #define TARGET_ASM_FUNCTION_EPILOGUE sparc_asm_function_epilogue
386 #undef TARGET_SCHED_ADJUST_COST
387 #define TARGET_SCHED_ADJUST_COST sparc_adjust_cost
388 #undef TARGET_SCHED_ISSUE_RATE
389 #define TARGET_SCHED_ISSUE_RATE sparc_issue_rate
390 #undef TARGET_SCHED_INIT
391 #define TARGET_SCHED_INIT sparc_sched_init
392 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
393 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD sparc_use_sched_lookahead
395 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
396 #define TARGET_FUNCTION_OK_FOR_SIBCALL sparc_function_ok_for_sibcall
398 #undef TARGET_INIT_LIBFUNCS
399 #define TARGET_INIT_LIBFUNCS sparc_init_libfuncs
402 #undef TARGET_HAVE_TLS
403 #define TARGET_HAVE_TLS true
405 #undef TARGET_CANNOT_FORCE_CONST_MEM
406 #define TARGET_CANNOT_FORCE_CONST_MEM sparc_cannot_force_const_mem
408 #undef TARGET_ASM_OUTPUT_MI_THUNK
409 #define TARGET_ASM_OUTPUT_MI_THUNK sparc_output_mi_thunk
410 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
411 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
413 #undef TARGET_RTX_COSTS
414 #define TARGET_RTX_COSTS sparc_rtx_costs
415 #undef TARGET_ADDRESS_COST
416 #define TARGET_ADDRESS_COST hook_int_rtx_0
418 /* This is only needed for TARGET_ARCH64, but since PROMOTE_FUNCTION_MODE is a
419 no-op for TARGET_ARCH32 this is ok. Otherwise we'd need to add a runtime
420 test for this value. */
421 #undef TARGET_PROMOTE_FUNCTION_ARGS
422 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
424 /* This is only needed for TARGET_ARCH64, but since PROMOTE_FUNCTION_MODE is a
425 no-op for TARGET_ARCH32 this is ok. Otherwise we'd need to add a runtime
426 test for this value. */
427 #undef TARGET_PROMOTE_FUNCTION_RETURN
428 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
430 #undef TARGET_PROMOTE_PROTOTYPES
431 #define TARGET_PROMOTE_PROTOTYPES sparc_promote_prototypes
433 #undef TARGET_STRUCT_VALUE_RTX
434 #define TARGET_STRUCT_VALUE_RTX sparc_struct_value_rtx
435 #undef TARGET_RETURN_IN_MEMORY
436 #define TARGET_RETURN_IN_MEMORY sparc_return_in_memory
437 #undef TARGET_MUST_PASS_IN_STACK
438 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
439 #undef TARGET_PASS_BY_REFERENCE
440 #define TARGET_PASS_BY_REFERENCE sparc_pass_by_reference
442 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
443 #define TARGET_EXPAND_BUILTIN_SAVEREGS sparc_builtin_saveregs
444 #undef TARGET_STRICT_ARGUMENT_NAMING
445 #define TARGET_STRICT_ARGUMENT_NAMING sparc_strict_argument_naming
447 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
448 #define TARGET_GIMPLIFY_VA_ARG_EXPR sparc_gimplify_va_arg
450 #undef TARGET_LATE_RTL_PROLOGUE_EPILOGUE
451 #define TARGET_LATE_RTL_PROLOGUE_EPILOGUE true
453 struct gcc_target targetm
= TARGET_INITIALIZER
;
455 /* Validate and override various options, and do some machine dependent
459 sparc_override_options (void)
461 static struct code_model
{
462 const char *const name
;
464 } const cmodels
[] = {
466 { "medlow", CM_MEDLOW
},
467 { "medmid", CM_MEDMID
},
468 { "medany", CM_MEDANY
},
469 { "embmedany", CM_EMBMEDANY
},
472 const struct code_model
*cmodel
;
473 /* Map TARGET_CPU_DEFAULT to value for -m{arch,tune}=. */
474 static struct cpu_default
{
476 const char *const name
;
477 } const cpu_default
[] = {
478 /* There must be one entry here for each TARGET_CPU value. */
479 { TARGET_CPU_sparc
, "cypress" },
480 { TARGET_CPU_sparclet
, "tsc701" },
481 { TARGET_CPU_sparclite
, "f930" },
482 { TARGET_CPU_v8
, "v8" },
483 { TARGET_CPU_hypersparc
, "hypersparc" },
484 { TARGET_CPU_sparclite86x
, "sparclite86x" },
485 { TARGET_CPU_supersparc
, "supersparc" },
486 { TARGET_CPU_v9
, "v9" },
487 { TARGET_CPU_ultrasparc
, "ultrasparc" },
488 { TARGET_CPU_ultrasparc3
, "ultrasparc3" },
491 const struct cpu_default
*def
;
492 /* Table of values for -m{cpu,tune}=. */
493 static struct cpu_table
{
494 const char *const name
;
495 const enum processor_type processor
;
498 } const cpu_table
[] = {
499 { "v7", PROCESSOR_V7
, MASK_ISA
, 0 },
500 { "cypress", PROCESSOR_CYPRESS
, MASK_ISA
, 0 },
501 { "v8", PROCESSOR_V8
, MASK_ISA
, MASK_V8
},
502 /* TI TMS390Z55 supersparc */
503 { "supersparc", PROCESSOR_SUPERSPARC
, MASK_ISA
, MASK_V8
},
504 { "sparclite", PROCESSOR_SPARCLITE
, MASK_ISA
, MASK_SPARCLITE
},
505 /* The Fujitsu MB86930 is the original sparclite chip, with no fpu.
506 The Fujitsu MB86934 is the recent sparclite chip, with an fpu. */
507 { "f930", PROCESSOR_F930
, MASK_ISA
|MASK_FPU
, MASK_SPARCLITE
},
508 { "f934", PROCESSOR_F934
, MASK_ISA
, MASK_SPARCLITE
|MASK_FPU
},
509 { "hypersparc", PROCESSOR_HYPERSPARC
, MASK_ISA
, MASK_V8
|MASK_FPU
},
510 { "sparclite86x", PROCESSOR_SPARCLITE86X
, MASK_ISA
|MASK_FPU
,
512 { "sparclet", PROCESSOR_SPARCLET
, MASK_ISA
, MASK_SPARCLET
},
514 { "tsc701", PROCESSOR_TSC701
, MASK_ISA
, MASK_SPARCLET
},
515 { "v9", PROCESSOR_V9
, MASK_ISA
, MASK_V9
},
516 /* TI ultrasparc I, II, IIi */
517 { "ultrasparc", PROCESSOR_ULTRASPARC
, MASK_ISA
, MASK_V9
518 /* Although insns using %y are deprecated, it is a clear win on current
520 |MASK_DEPRECATED_V8_INSNS
},
521 /* TI ultrasparc III */
522 /* ??? Check if %y issue still holds true in ultra3. */
523 { "ultrasparc3", PROCESSOR_ULTRASPARC3
, MASK_ISA
, MASK_V9
|MASK_DEPRECATED_V8_INSNS
},
526 const struct cpu_table
*cpu
;
527 const struct sparc_cpu_select
*sel
;
530 #ifndef SPARC_BI_ARCH
531 /* Check for unsupported architecture size. */
532 if (! TARGET_64BIT
!= DEFAULT_ARCH32_P
)
533 error ("%s is not supported by this configuration",
534 DEFAULT_ARCH32_P
? "-m64" : "-m32");
537 /* We force all 64bit archs to use 128 bit long double */
538 if (TARGET_64BIT
&& ! TARGET_LONG_DOUBLE_128
)
540 error ("-mlong-double-64 not allowed with -m64");
541 target_flags
|= MASK_LONG_DOUBLE_128
;
544 /* Code model selection. */
545 sparc_cmodel
= SPARC_DEFAULT_CMODEL
;
549 sparc_cmodel
= CM_32
;
552 if (sparc_cmodel_string
!= NULL
)
556 for (cmodel
= &cmodels
[0]; cmodel
->name
; cmodel
++)
557 if (strcmp (sparc_cmodel_string
, cmodel
->name
) == 0)
559 if (cmodel
->name
== NULL
)
560 error ("bad value (%s) for -mcmodel= switch", sparc_cmodel_string
);
562 sparc_cmodel
= cmodel
->value
;
565 error ("-mcmodel= is not supported on 32 bit systems");
568 fpu
= TARGET_FPU
; /* save current -mfpu status */
570 /* Set the default CPU. */
571 for (def
= &cpu_default
[0]; def
->name
; ++def
)
572 if (def
->cpu
== TARGET_CPU_DEFAULT
)
576 sparc_select
[0].string
= def
->name
;
578 for (sel
= &sparc_select
[0]; sel
->name
; ++sel
)
582 for (cpu
= &cpu_table
[0]; cpu
->name
; ++cpu
)
583 if (! strcmp (sel
->string
, cpu
->name
))
586 sparc_cpu
= cpu
->processor
;
590 target_flags
&= ~cpu
->disable
;
591 target_flags
|= cpu
->enable
;
597 error ("bad value (%s) for %s switch", sel
->string
, sel
->name
);
601 /* If -mfpu or -mno-fpu was explicitly used, don't override with
602 the processor default. Clear MASK_FPU_SET to avoid confusing
603 the reverse mapping from switch values to names. */
606 target_flags
= (target_flags
& ~MASK_FPU
) | fpu
;
607 target_flags
&= ~MASK_FPU_SET
;
610 /* Don't allow -mvis if FPU is disabled. */
612 target_flags
&= ~MASK_VIS
;
614 /* -mvis assumes UltraSPARC+, so we are sure v9 instructions
616 -m64 also implies v9. */
617 if (TARGET_VIS
|| TARGET_ARCH64
)
619 target_flags
|= MASK_V9
;
620 target_flags
&= ~(MASK_V8
| MASK_SPARCLET
| MASK_SPARCLITE
);
623 /* Use the deprecated v8 insns for sparc64 in 32 bit mode. */
624 if (TARGET_V9
&& TARGET_ARCH32
)
625 target_flags
|= MASK_DEPRECATED_V8_INSNS
;
627 /* V8PLUS requires V9, makes no sense in 64 bit mode. */
628 if (! TARGET_V9
|| TARGET_ARCH64
)
629 target_flags
&= ~MASK_V8PLUS
;
631 /* Don't use stack biasing in 32 bit mode. */
633 target_flags
&= ~MASK_STACK_BIAS
;
635 /* Supply a default value for align_functions. */
636 if (align_functions
== 0
637 && (sparc_cpu
== PROCESSOR_ULTRASPARC
638 || sparc_cpu
== PROCESSOR_ULTRASPARC3
))
639 align_functions
= 32;
641 /* Validate PCC_STRUCT_RETURN. */
642 if (flag_pcc_struct_return
== DEFAULT_PCC_STRUCT_RETURN
)
643 flag_pcc_struct_return
= (TARGET_ARCH64
? 0 : 1);
645 /* Only use .uaxword when compiling for a 64-bit target. */
647 targetm
.asm_out
.unaligned_op
.di
= NULL
;
649 /* Do various machine dependent initializations. */
652 /* Acquire a unique set number for our register saves and restores. */
653 sparc_sr_alias_set
= new_alias_set ();
655 /* Set up function hooks. */
656 init_machine_status
= sparc_init_machine_status
;
661 case PROCESSOR_CYPRESS
:
662 sparc_costs
= &cypress_costs
;
665 case PROCESSOR_SPARCLITE
:
666 case PROCESSOR_SUPERSPARC
:
667 sparc_costs
= &supersparc_costs
;
671 case PROCESSOR_HYPERSPARC
:
672 case PROCESSOR_SPARCLITE86X
:
673 sparc_costs
= &hypersparc_costs
;
675 case PROCESSOR_SPARCLET
:
676 case PROCESSOR_TSC701
:
677 sparc_costs
= &sparclet_costs
;
680 case PROCESSOR_ULTRASPARC
:
681 sparc_costs
= &ultrasparc_costs
;
683 case PROCESSOR_ULTRASPARC3
:
684 sparc_costs
= &ultrasparc3_costs
;
689 /* Miscellaneous utilities. */
691 /* Nonzero if CODE, a comparison, is suitable for use in v9 conditional move
692 or branch on register contents instructions. */
695 v9_regcmp_p (enum rtx_code code
)
697 return (code
== EQ
|| code
== NE
|| code
== GE
|| code
== LT
698 || code
== LE
|| code
== GT
);
702 /* Operand constraints. */
704 /* Return nonzero only if OP is a register of mode MODE,
708 reg_or_0_operand (rtx op
, enum machine_mode mode
)
710 if (register_operand (op
, mode
))
712 if (op
== const0_rtx
)
714 if (GET_MODE (op
) == VOIDmode
&& GET_CODE (op
) == CONST_DOUBLE
715 && CONST_DOUBLE_HIGH (op
) == 0
716 && CONST_DOUBLE_LOW (op
) == 0)
718 if (fp_zero_operand (op
, mode
))
723 /* Return nonzero only if OP is const1_rtx. */
726 const1_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
728 return op
== const1_rtx
;
731 /* Nonzero if OP is a floating point value with value 0.0. */
734 fp_zero_operand (rtx op
, enum machine_mode mode
)
736 if (GET_MODE_CLASS (GET_MODE (op
)) != MODE_FLOAT
)
738 return op
== CONST0_RTX (mode
);
741 /* Nonzero if OP is a register operand in floating point register. */
744 fp_register_operand (rtx op
, enum machine_mode mode
)
746 if (! register_operand (op
, mode
))
748 if (GET_CODE (op
) == SUBREG
)
749 op
= SUBREG_REG (op
);
750 return GET_CODE (op
) == REG
&& SPARC_FP_REG_P (REGNO (op
));
753 /* Nonzero if OP is a floating point constant which can
754 be loaded into an integer register using a single
755 sethi instruction. */
760 if (GET_CODE (op
) == CONST_DOUBLE
)
765 REAL_VALUE_FROM_CONST_DOUBLE (r
, op
);
766 if (REAL_VALUES_EQUAL (r
, dconst0
) &&
767 ! REAL_VALUE_MINUS_ZERO (r
))
769 REAL_VALUE_TO_TARGET_SINGLE (r
, i
);
770 if (SPARC_SETHI_P (i
))
777 /* Nonzero if OP is a floating point constant which can
778 be loaded into an integer register using a single
784 if (GET_CODE (op
) == CONST_DOUBLE
)
789 REAL_VALUE_FROM_CONST_DOUBLE (r
, op
);
790 if (REAL_VALUES_EQUAL (r
, dconst0
) &&
791 ! REAL_VALUE_MINUS_ZERO (r
))
793 REAL_VALUE_TO_TARGET_SINGLE (r
, i
);
794 if (SPARC_SIMM13_P (i
))
801 /* Nonzero if OP is a floating point constant which can
802 be loaded into an integer register using a high/losum
803 instruction sequence. */
806 fp_high_losum_p (rtx op
)
808 /* The constraints calling this should only be in
809 SFmode move insns, so any constant which cannot
810 be moved using a single insn will do. */
811 if (GET_CODE (op
) == CONST_DOUBLE
)
816 REAL_VALUE_FROM_CONST_DOUBLE (r
, op
);
817 if (REAL_VALUES_EQUAL (r
, dconst0
) &&
818 ! REAL_VALUE_MINUS_ZERO (r
))
820 REAL_VALUE_TO_TARGET_SINGLE (r
, i
);
821 if (! SPARC_SETHI_P (i
)
822 && ! SPARC_SIMM13_P (i
))
829 /* Nonzero if OP is an integer register. */
832 intreg_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
834 return (register_operand (op
, SImode
)
835 || (TARGET_ARCH64
&& register_operand (op
, DImode
)));
838 /* Nonzero if OP is a floating point condition code register. */
841 fcc_reg_operand (rtx op
, enum machine_mode mode
)
843 /* This can happen when recog is called from combine. Op may be a MEM.
844 Fail instead of calling abort in this case. */
845 if (GET_CODE (op
) != REG
)
848 if (mode
!= VOIDmode
&& mode
!= GET_MODE (op
))
851 && (GET_MODE (op
) != CCFPmode
&& GET_MODE (op
) != CCFPEmode
))
854 #if 0 /* ??? ==> 1 when %fcc0-3 are pseudos first. See gen_compare_reg(). */
855 if (reg_renumber
== 0)
856 return REGNO (op
) >= FIRST_PSEUDO_REGISTER
;
857 return REGNO_OK_FOR_CCFP_P (REGNO (op
));
859 return (unsigned) REGNO (op
) - SPARC_FIRST_V9_FCC_REG
< 4;
863 /* Nonzero if OP is a floating point condition code fcc0 register. */
866 fcc0_reg_operand (rtx op
, enum machine_mode mode
)
868 /* This can happen when recog is called from combine. Op may be a MEM.
869 Fail instead of calling abort in this case. */
870 if (GET_CODE (op
) != REG
)
873 if (mode
!= VOIDmode
&& mode
!= GET_MODE (op
))
876 && (GET_MODE (op
) != CCFPmode
&& GET_MODE (op
) != CCFPEmode
))
879 return REGNO (op
) == SPARC_FCC_REG
;
882 /* Nonzero if OP is an integer or floating point condition code register. */
885 icc_or_fcc_reg_operand (rtx op
, enum machine_mode mode
)
887 if (GET_CODE (op
) == REG
&& REGNO (op
) == SPARC_ICC_REG
)
889 if (mode
!= VOIDmode
&& mode
!= GET_MODE (op
))
892 && GET_MODE (op
) != CCmode
&& GET_MODE (op
) != CCXmode
)
897 return fcc_reg_operand (op
, mode
);
900 /* Call insn on SPARC can take a PC-relative constant address, or any regular
904 call_operand (rtx op
, enum machine_mode mode
)
906 if (GET_CODE (op
) != MEM
)
909 return (symbolic_operand (op
, mode
) || memory_address_p (Pmode
, op
));
913 call_operand_address (rtx op
, enum machine_mode mode
)
915 return (symbolic_operand (op
, mode
) || memory_address_p (Pmode
, op
));
918 /* If OP is a SYMBOL_REF of a thread-local symbol, return its TLS mode,
919 otherwise return 0. */
922 tls_symbolic_operand (rtx op
)
924 if (GET_CODE (op
) != SYMBOL_REF
)
926 return SYMBOL_REF_TLS_MODEL (op
);
930 tgd_symbolic_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
932 return tls_symbolic_operand (op
) == TLS_MODEL_GLOBAL_DYNAMIC
;
936 tld_symbolic_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
938 return tls_symbolic_operand (op
) == TLS_MODEL_LOCAL_DYNAMIC
;
942 tie_symbolic_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
944 return tls_symbolic_operand (op
) == TLS_MODEL_INITIAL_EXEC
;
948 tle_symbolic_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
950 return tls_symbolic_operand (op
) == TLS_MODEL_LOCAL_EXEC
;
953 /* Returns 1 if OP is either a symbol reference or a sum of a symbol
954 reference and a constant. */
957 symbolic_operand (register rtx op
, enum machine_mode mode
)
959 enum machine_mode omode
= GET_MODE (op
);
961 if (omode
!= mode
&& omode
!= VOIDmode
&& mode
!= VOIDmode
)
964 switch (GET_CODE (op
))
967 return !SYMBOL_REF_TLS_MODEL (op
);
974 return (((GET_CODE (XEXP (op
, 0)) == SYMBOL_REF
975 && !SYMBOL_REF_TLS_MODEL (XEXP (op
, 0)))
976 || GET_CODE (XEXP (op
, 0)) == LABEL_REF
)
977 && GET_CODE (XEXP (op
, 1)) == CONST_INT
);
984 /* Return truth value of statement that OP is a symbolic memory
985 operand of mode MODE. */
988 symbolic_memory_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
990 if (GET_CODE (op
) == SUBREG
)
991 op
= SUBREG_REG (op
);
992 if (GET_CODE (op
) != MEM
)
995 return ((GET_CODE (op
) == SYMBOL_REF
&& !SYMBOL_REF_TLS_MODEL (op
))
996 || GET_CODE (op
) == CONST
|| GET_CODE (op
) == HIGH
997 || GET_CODE (op
) == LABEL_REF
);
1000 /* Return truth value of statement that OP is a LABEL_REF of mode MODE. */
1003 label_ref_operand (rtx op
, enum machine_mode mode
)
1005 if (GET_CODE (op
) != LABEL_REF
)
1007 if (GET_MODE (op
) != mode
)
1012 /* Return 1 if the operand is an argument used in generating pic references
1013 in either the medium/low or medium/anywhere code models of sparc64. */
1016 sp64_medium_pic_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1018 /* Check for (const (minus (symbol_ref:GOT)
1019 (const (minus (label) (pc))))). */
1020 if (GET_CODE (op
) != CONST
)
1023 if (GET_CODE (op
) != MINUS
)
1025 if (GET_CODE (XEXP (op
, 0)) != SYMBOL_REF
)
1027 /* ??? Ensure symbol is GOT. */
1028 if (GET_CODE (XEXP (op
, 1)) != CONST
)
1030 if (GET_CODE (XEXP (XEXP (op
, 1), 0)) != MINUS
)
1035 /* Return 1 if the operand is a data segment reference. This includes
1036 the readonly data segment, or in other words anything but the text segment.
1037 This is needed in the medium/anywhere code model on v9. These values
1038 are accessed with EMBMEDANY_BASE_REG. */
1041 data_segment_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1043 switch (GET_CODE (op
))
1046 return ! SYMBOL_REF_FUNCTION_P (op
);
1048 /* Assume canonical format of symbol + constant.
1051 return data_segment_operand (XEXP (op
, 0), VOIDmode
);
1057 /* Return 1 if the operand is a text segment reference.
1058 This is needed in the medium/anywhere code model on v9. */
1061 text_segment_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1063 switch (GET_CODE (op
))
1068 return SYMBOL_REF_FUNCTION_P (op
);
1070 /* Assume canonical format of symbol + constant.
1073 return text_segment_operand (XEXP (op
, 0), VOIDmode
);
1079 /* Return 1 if the operand is either a register or a memory operand that is
1083 reg_or_nonsymb_mem_operand (register rtx op
, enum machine_mode mode
)
1085 if (register_operand (op
, mode
))
1088 if (memory_operand (op
, mode
) && ! symbolic_memory_operand (op
, mode
))
1095 splittable_symbolic_memory_operand (rtx op
,
1096 enum machine_mode mode ATTRIBUTE_UNUSED
)
1098 if (GET_CODE (op
) != MEM
)
1100 if (! symbolic_operand (XEXP (op
, 0), Pmode
))
1106 splittable_immediate_memory_operand (rtx op
,
1107 enum machine_mode mode ATTRIBUTE_UNUSED
)
1109 if (GET_CODE (op
) != MEM
)
1111 if (! immediate_operand (XEXP (op
, 0), Pmode
))
1116 /* Return truth value of whether OP is EQ or NE. */
1119 eq_or_neq (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1121 return (GET_CODE (op
) == EQ
|| GET_CODE (op
) == NE
);
1124 /* Return 1 if this is a comparison operator, but not an EQ, NE, GEU,
1125 or LTU for non-floating-point. We handle those specially. */
1128 normal_comp_operator (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1132 if (!COMPARISON_P (op
))
1135 if (GET_MODE (XEXP (op
, 0)) == CCFPmode
1136 || GET_MODE (XEXP (op
, 0)) == CCFPEmode
)
1139 code
= GET_CODE (op
);
1140 return (code
!= NE
&& code
!= EQ
&& code
!= GEU
&& code
!= LTU
);
1143 /* Return 1 if this is a comparison operator. This allows the use of
1144 MATCH_OPERATOR to recognize all the branch insns. */
1147 noov_compare_op (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1151 if (!COMPARISON_P (op
))
1154 code
= GET_CODE (op
);
1155 if (GET_MODE (XEXP (op
, 0)) == CC_NOOVmode
1156 || GET_MODE (XEXP (op
, 0)) == CCX_NOOVmode
)
1157 /* These are the only branches which work with CC_NOOVmode. */
1158 return (code
== EQ
|| code
== NE
|| code
== GE
|| code
== LT
);
1162 /* Return 1 if this is a 64-bit comparison operator. This allows the use of
1163 MATCH_OPERATOR to recognize all the branch insns. */
1166 noov_compare64_op (register rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1173 if (!COMPARISON_P (op
))
1176 code
= GET_CODE (op
);
1177 if (GET_MODE (XEXP (op
, 0)) == CCX_NOOVmode
)
1178 /* These are the only branches which work with CCX_NOOVmode. */
1179 return (code
== EQ
|| code
== NE
|| code
== GE
|| code
== LT
);
1180 return (GET_MODE (XEXP (op
, 0)) == CCXmode
);
1183 /* Nonzero if OP is a comparison operator suitable for use in v9
1184 conditional move or branch on register contents instructions. */
1187 v9_regcmp_op (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1191 if (!COMPARISON_P (op
))
1194 code
= GET_CODE (op
);
1195 return v9_regcmp_p (code
);
1198 /* Return 1 if this is a SIGN_EXTEND or ZERO_EXTEND operation. */
1201 extend_op (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1203 return GET_CODE (op
) == SIGN_EXTEND
|| GET_CODE (op
) == ZERO_EXTEND
;
1206 /* Return nonzero if OP is an operator of mode MODE which can set
1207 the condition codes explicitly. We do not include PLUS and MINUS
1208 because these require CC_NOOVmode, which we handle explicitly. */
1211 cc_arithop (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1213 if (GET_CODE (op
) == AND
1214 || GET_CODE (op
) == IOR
1215 || GET_CODE (op
) == XOR
)
1221 /* Return nonzero if OP is an operator of mode MODE which can bitwise
1222 complement its second operand and set the condition codes explicitly. */
1225 cc_arithopn (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1227 /* XOR is not here because combine canonicalizes (xor (not ...) ...)
1228 and (xor ... (not ...)) to (not (xor ...)). */
1229 return (GET_CODE (op
) == AND
1230 || GET_CODE (op
) == IOR
);
1233 /* Return true if OP is a register, or is a CONST_INT that can fit in a
1234 signed 13 bit immediate field. This is an acceptable SImode operand for
1235 most 3 address instructions. */
1238 arith_operand (rtx op
, enum machine_mode mode
)
1240 if (register_operand (op
, mode
))
1242 if (GET_CODE (op
) != CONST_INT
)
1244 return SMALL_INT32 (op
);
1247 /* Return true if OP is a constant 4096 */
1250 arith_4096_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1252 if (GET_CODE (op
) != CONST_INT
)
1255 return INTVAL (op
) == 4096;
1258 /* Return true if OP is suitable as second operand for add/sub */
1261 arith_add_operand (rtx op
, enum machine_mode mode
)
1263 return arith_operand (op
, mode
) || arith_4096_operand (op
, mode
);
1266 /* Return true if OP is a CONST_INT or a CONST_DOUBLE which can fit in the
1267 immediate field of OR and XOR instructions. Used for 64-bit
1268 constant formation patterns. */
1270 const64_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1272 return ((GET_CODE (op
) == CONST_INT
1273 && SPARC_SIMM13_P (INTVAL (op
)))
1274 #if HOST_BITS_PER_WIDE_INT != 64
1275 || (GET_CODE (op
) == CONST_DOUBLE
1276 && SPARC_SIMM13_P (CONST_DOUBLE_LOW (op
))
1277 && (CONST_DOUBLE_HIGH (op
) ==
1278 ((CONST_DOUBLE_LOW (op
) & 0x80000000) != 0 ?
1279 (HOST_WIDE_INT
)-1 : 0)))
1284 /* The same, but only for sethi instructions. */
1286 const64_high_operand (rtx op
, enum machine_mode mode
)
1288 return ((GET_CODE (op
) == CONST_INT
1289 && (INTVAL (op
) & ~(HOST_WIDE_INT
)0x3ff) != 0
1290 && SPARC_SETHI_P (INTVAL (op
) & GET_MODE_MASK (mode
))
1292 || (GET_CODE (op
) == CONST_DOUBLE
1293 && CONST_DOUBLE_HIGH (op
) == 0
1294 && (CONST_DOUBLE_LOW (op
) & ~(HOST_WIDE_INT
)0x3ff) != 0
1295 && SPARC_SETHI_P (CONST_DOUBLE_LOW (op
))));
1298 /* Return true if OP is a register, or is a CONST_INT that can fit in a
1299 signed 11 bit immediate field. This is an acceptable SImode operand for
1300 the movcc instructions. */
1303 arith11_operand (rtx op
, enum machine_mode mode
)
1305 return (register_operand (op
, mode
)
1306 || (GET_CODE (op
) == CONST_INT
&& SPARC_SIMM11_P (INTVAL (op
))));
1309 /* Return true if OP is a register, or is a CONST_INT that can fit in a
1310 signed 10 bit immediate field. This is an acceptable SImode operand for
1311 the movrcc instructions. */
1314 arith10_operand (rtx op
, enum machine_mode mode
)
1316 return (register_operand (op
, mode
)
1317 || (GET_CODE (op
) == CONST_INT
&& SPARC_SIMM10_P (INTVAL (op
))));
1320 /* Return true if OP is a register, is a CONST_INT that fits in a 13 bit
1321 immediate field, or is a CONST_DOUBLE whose both parts fit in a 13 bit
1323 ARCH64: Return true if OP is a register, or is a CONST_INT or CONST_DOUBLE that
1324 can fit in a 13 bit immediate field. This is an acceptable DImode operand
1325 for most 3 address instructions. */
1328 arith_double_operand (rtx op
, enum machine_mode mode
)
1330 return (register_operand (op
, mode
)
1331 || (GET_CODE (op
) == CONST_INT
&& SMALL_INT (op
))
1333 && GET_CODE (op
) == CONST_DOUBLE
1334 && (unsigned HOST_WIDE_INT
) (CONST_DOUBLE_LOW (op
) + 0x1000) < 0x2000
1335 && (unsigned HOST_WIDE_INT
) (CONST_DOUBLE_HIGH (op
) + 0x1000) < 0x2000)
1337 && GET_CODE (op
) == CONST_DOUBLE
1338 && (unsigned HOST_WIDE_INT
) (CONST_DOUBLE_LOW (op
) + 0x1000) < 0x2000
1339 && ((CONST_DOUBLE_HIGH (op
) == -1
1340 && (CONST_DOUBLE_LOW (op
) & 0x1000) == 0x1000)
1341 || (CONST_DOUBLE_HIGH (op
) == 0
1342 && (CONST_DOUBLE_LOW (op
) & 0x1000) == 0))));
1345 /* Return true if OP is a constant 4096 for DImode on ARCH64 */
1348 arith_double_4096_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1350 return (TARGET_ARCH64
&&
1351 ((GET_CODE (op
) == CONST_INT
&& INTVAL (op
) == 4096) ||
1352 (GET_CODE (op
) == CONST_DOUBLE
&&
1353 CONST_DOUBLE_LOW (op
) == 4096 &&
1354 CONST_DOUBLE_HIGH (op
) == 0)));
1357 /* Return true if OP is suitable as second operand for add/sub in DImode */
1360 arith_double_add_operand (rtx op
, enum machine_mode mode
)
1362 return arith_double_operand (op
, mode
) || arith_double_4096_operand (op
, mode
);
1365 /* Return true if OP is a register, or is a CONST_INT or CONST_DOUBLE that
1366 can fit in an 11 bit immediate field. This is an acceptable DImode
1367 operand for the movcc instructions. */
1368 /* ??? Replace with arith11_operand? */
1371 arith11_double_operand (rtx op
, enum machine_mode mode
)
1373 return (register_operand (op
, mode
)
1374 || (GET_CODE (op
) == CONST_DOUBLE
1375 && (GET_MODE (op
) == mode
|| GET_MODE (op
) == VOIDmode
)
1376 && (unsigned HOST_WIDE_INT
) (CONST_DOUBLE_LOW (op
) + 0x400) < 0x800
1377 && ((CONST_DOUBLE_HIGH (op
) == -1
1378 && (CONST_DOUBLE_LOW (op
) & 0x400) == 0x400)
1379 || (CONST_DOUBLE_HIGH (op
) == 0
1380 && (CONST_DOUBLE_LOW (op
) & 0x400) == 0)))
1381 || (GET_CODE (op
) == CONST_INT
1382 && (GET_MODE (op
) == mode
|| GET_MODE (op
) == VOIDmode
)
1383 && (unsigned HOST_WIDE_INT
) (INTVAL (op
) + 0x400) < 0x800));
1386 /* Return true if OP is a register, or is a CONST_INT or CONST_DOUBLE that
1387 can fit in an 10 bit immediate field. This is an acceptable DImode
1388 operand for the movrcc instructions. */
1389 /* ??? Replace with arith10_operand? */
1392 arith10_double_operand (rtx op
, enum machine_mode mode
)
1394 return (register_operand (op
, mode
)
1395 || (GET_CODE (op
) == CONST_DOUBLE
1396 && (GET_MODE (op
) == mode
|| GET_MODE (op
) == VOIDmode
)
1397 && (unsigned) (CONST_DOUBLE_LOW (op
) + 0x200) < 0x400
1398 && ((CONST_DOUBLE_HIGH (op
) == -1
1399 && (CONST_DOUBLE_LOW (op
) & 0x200) == 0x200)
1400 || (CONST_DOUBLE_HIGH (op
) == 0
1401 && (CONST_DOUBLE_LOW (op
) & 0x200) == 0)))
1402 || (GET_CODE (op
) == CONST_INT
1403 && (GET_MODE (op
) == mode
|| GET_MODE (op
) == VOIDmode
)
1404 && (unsigned HOST_WIDE_INT
) (INTVAL (op
) + 0x200) < 0x400));
1407 /* Return truth value of whether OP is an integer which fits the
1408 range constraining immediate operands in most three-address insns,
1409 which have a 13 bit immediate field. */
1412 small_int (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1414 return (GET_CODE (op
) == CONST_INT
&& SMALL_INT (op
));
1418 small_int_or_double (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1420 return ((GET_CODE (op
) == CONST_INT
&& SMALL_INT (op
))
1421 || (GET_CODE (op
) == CONST_DOUBLE
1422 && CONST_DOUBLE_HIGH (op
) == 0
1423 && SPARC_SIMM13_P (CONST_DOUBLE_LOW (op
))));
1426 /* Recognize operand values for the umul instruction. That instruction sign
1427 extends immediate values just like all other sparc instructions, but
1428 interprets the extended result as an unsigned number. */
1431 uns_small_int (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1433 #if HOST_BITS_PER_WIDE_INT > 32
1434 /* All allowed constants will fit a CONST_INT. */
1435 return (GET_CODE (op
) == CONST_INT
1436 && ((INTVAL (op
) >= 0 && INTVAL (op
) < 0x1000)
1437 || (INTVAL (op
) >= 0xFFFFF000
1438 && INTVAL (op
) <= 0xFFFFFFFF)));
1440 return ((GET_CODE (op
) == CONST_INT
&& (unsigned) INTVAL (op
) < 0x1000)
1441 || (GET_CODE (op
) == CONST_DOUBLE
1442 && CONST_DOUBLE_HIGH (op
) == 0
1443 && (unsigned) CONST_DOUBLE_LOW (op
) - 0xFFFFF000 < 0x1000));
1448 uns_arith_operand (rtx op
, enum machine_mode mode
)
1450 return register_operand (op
, mode
) || uns_small_int (op
, mode
);
1453 /* Return truth value of statement that OP is a call-clobbered register. */
1455 clobbered_register (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1457 return (GET_CODE (op
) == REG
&& call_used_regs
[REGNO (op
)]);
1460 /* Return 1 if OP is a valid operand for the source of a move insn. */
1463 input_operand (rtx op
, enum machine_mode mode
)
1465 /* If both modes are non-void they must be the same. */
1466 if (mode
!= VOIDmode
&& GET_MODE (op
) != VOIDmode
&& mode
!= GET_MODE (op
))
1469 /* Allow any one instruction integer constant, and all CONST_INT
1470 variants when we are working in DImode and !arch64. */
1471 if (GET_MODE_CLASS (mode
) == MODE_INT
1472 && ((GET_CODE (op
) == CONST_INT
1473 && (SPARC_SETHI_P (INTVAL (op
) & GET_MODE_MASK (mode
))
1474 || SPARC_SIMM13_P (INTVAL (op
))
1476 && ! TARGET_ARCH64
)))
1478 && GET_CODE (op
) == CONST_DOUBLE
1479 && ((CONST_DOUBLE_HIGH (op
) == 0
1480 && SPARC_SETHI_P (CONST_DOUBLE_LOW (op
)))
1482 #if HOST_BITS_PER_WIDE_INT == 64
1483 (CONST_DOUBLE_HIGH (op
) == 0
1484 && SPARC_SIMM13_P (CONST_DOUBLE_LOW (op
)))
1486 (SPARC_SIMM13_P (CONST_DOUBLE_LOW (op
))
1487 && (((CONST_DOUBLE_LOW (op
) & 0x80000000) == 0
1488 && CONST_DOUBLE_HIGH (op
) == 0)
1489 || (CONST_DOUBLE_HIGH (op
) == -1
1490 && CONST_DOUBLE_LOW (op
) & 0x80000000) != 0))
1495 /* If !arch64 and this is a DImode const, allow it so that
1496 the splits can be generated. */
1499 && GET_CODE (op
) == CONST_DOUBLE
)
1502 if (register_operand (op
, mode
))
1505 if (GET_MODE_CLASS (mode
) == MODE_FLOAT
1506 && GET_CODE (op
) == CONST_DOUBLE
)
1509 /* If this is a SUBREG, look inside so that we handle
1510 paradoxical ones. */
1511 if (GET_CODE (op
) == SUBREG
)
1512 op
= SUBREG_REG (op
);
1514 /* Check for valid MEM forms. */
1515 if (GET_CODE (op
) == MEM
)
1517 rtx inside
= XEXP (op
, 0);
1519 if (GET_CODE (inside
) == LO_SUM
)
1521 /* We can't allow these because all of the splits
1522 (eventually as they trickle down into DFmode
1523 splits) require offsettable memory references. */
1525 && GET_MODE (op
) == TFmode
)
1528 return (register_operand (XEXP (inside
, 0), Pmode
)
1529 && CONSTANT_P (XEXP (inside
, 1)));
1531 return memory_address_p (mode
, inside
);
1537 /* Return 1 if OP is valid for the lhs of a compare insn. */
1540 compare_operand (rtx op
, enum machine_mode mode
)
1542 if (GET_CODE (op
) == ZERO_EXTRACT
)
1543 return (register_operand (XEXP (op
, 0), mode
)
1544 && small_int_or_double (XEXP (op
, 1), mode
)
1545 && small_int_or_double (XEXP (op
, 2), mode
)
1546 /* This matches cmp_zero_extract. */
1548 && ((GET_CODE (XEXP (op
, 2)) == CONST_INT
1549 && INTVAL (XEXP (op
, 2)) > 19)
1550 || (GET_CODE (XEXP (op
, 2)) == CONST_DOUBLE
1551 && CONST_DOUBLE_LOW (XEXP (op
, 2)) > 19)))
1552 /* This matches cmp_zero_extract_sp64. */
1555 && ((GET_CODE (XEXP (op
, 2)) == CONST_INT
1556 && INTVAL (XEXP (op
, 2)) > 51)
1557 || (GET_CODE (XEXP (op
, 2)) == CONST_DOUBLE
1558 && CONST_DOUBLE_LOW (XEXP (op
, 2)) > 51)))));
1560 return register_operand (op
, mode
);
1564 /* We know it can't be done in one insn when we get here,
1565 the movsi expander guarantees this. */
1567 sparc_emit_set_const32 (rtx op0
, rtx op1
)
1569 enum machine_mode mode
= GET_MODE (op0
);
1572 if (GET_CODE (op1
) == CONST_INT
)
1574 HOST_WIDE_INT value
= INTVAL (op1
);
1576 if (SPARC_SETHI_P (value
& GET_MODE_MASK (mode
))
1577 || SPARC_SIMM13_P (value
))
1581 /* Full 2-insn decomposition is needed. */
1582 if (reload_in_progress
|| reload_completed
)
1585 temp
= gen_reg_rtx (mode
);
1587 if (GET_CODE (op1
) == CONST_INT
)
1589 /* Emit them as real moves instead of a HIGH/LO_SUM,
1590 this way CSE can see everything and reuse intermediate
1591 values if it wants. */
1593 && HOST_BITS_PER_WIDE_INT
!= 64
1594 && (INTVAL (op1
) & 0x80000000) != 0)
1595 emit_insn (gen_rtx_SET
1597 immed_double_const (INTVAL (op1
) & ~(HOST_WIDE_INT
)0x3ff,
1600 emit_insn (gen_rtx_SET (VOIDmode
, temp
,
1601 GEN_INT (INTVAL (op1
)
1602 & ~(HOST_WIDE_INT
)0x3ff)));
1604 emit_insn (gen_rtx_SET (VOIDmode
,
1606 gen_rtx_IOR (mode
, temp
,
1607 GEN_INT (INTVAL (op1
) & 0x3ff))));
1611 /* A symbol, emit in the traditional way. */
1612 emit_insn (gen_rtx_SET (VOIDmode
, temp
,
1613 gen_rtx_HIGH (mode
, op1
)));
1614 emit_insn (gen_rtx_SET (VOIDmode
,
1615 op0
, gen_rtx_LO_SUM (mode
, temp
, op1
)));
1621 /* Load OP1, a symbolic 64-bit constant, into OP0, a DImode register.
1622 If TEMP is non-zero, we are forbidden to use any other scratch
1623 registers. Otherwise, we are allowed to generate them as needed.
1625 Note that TEMP may have TImode if the code model is TARGET_CM_MEDANY
1626 or TARGET_CM_EMBMEDANY (see the reload_indi and reload_outdi patterns). */
1628 sparc_emit_set_symbolic_const64 (rtx op0
, rtx op1
, rtx temp
)
1630 rtx temp1
, temp2
, temp3
, temp4
, temp5
;
1633 if (temp
&& GET_MODE (temp
) == TImode
)
1636 temp
= gen_rtx_REG (DImode
, REGNO (temp
));
1639 /* SPARC-V9 code-model support. */
1640 switch (sparc_cmodel
)
1643 /* The range spanned by all instructions in the object is less
1644 than 2^31 bytes (2GB) and the distance from any instruction
1645 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1646 than 2^31 bytes (2GB).
1648 The executable must be in the low 4TB of the virtual address
1651 sethi %hi(symbol), %temp1
1652 or %temp1, %lo(symbol), %reg */
1654 temp1
= temp
; /* op0 is allowed. */
1656 temp1
= gen_reg_rtx (DImode
);
1658 emit_insn (gen_rtx_SET (VOIDmode
, temp1
, gen_rtx_HIGH (DImode
, op1
)));
1659 emit_insn (gen_rtx_SET (VOIDmode
, op0
, gen_rtx_LO_SUM (DImode
, temp1
, op1
)));
1663 /* The range spanned by all instructions in the object is less
1664 than 2^31 bytes (2GB) and the distance from any instruction
1665 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1666 than 2^31 bytes (2GB).
1668 The executable must be in the low 16TB of the virtual address
1671 sethi %h44(symbol), %temp1
1672 or %temp1, %m44(symbol), %temp2
1673 sllx %temp2, 12, %temp3
1674 or %temp3, %l44(symbol), %reg */
1679 temp3
= temp
; /* op0 is allowed. */
1683 temp1
= gen_reg_rtx (DImode
);
1684 temp2
= gen_reg_rtx (DImode
);
1685 temp3
= gen_reg_rtx (DImode
);
1688 emit_insn (gen_seth44 (temp1
, op1
));
1689 emit_insn (gen_setm44 (temp2
, temp1
, op1
));
1690 emit_insn (gen_rtx_SET (VOIDmode
, temp3
,
1691 gen_rtx_ASHIFT (DImode
, temp2
, GEN_INT (12))));
1692 emit_insn (gen_setl44 (op0
, temp3
, op1
));
1696 /* The range spanned by all instructions in the object is less
1697 than 2^31 bytes (2GB) and the distance from any instruction
1698 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1699 than 2^31 bytes (2GB).
1701 The executable can be placed anywhere in the virtual address
1704 sethi %hh(symbol), %temp1
1705 sethi %lm(symbol), %temp2
1706 or %temp1, %hm(symbol), %temp3
1707 sllx %temp3, 32, %temp4
1708 or %temp4, %temp2, %temp5
1709 or %temp5, %lo(symbol), %reg */
1712 /* It is possible that one of the registers we got for operands[2]
1713 might coincide with that of operands[0] (which is why we made
1714 it TImode). Pick the other one to use as our scratch. */
1715 if (rtx_equal_p (temp
, op0
))
1718 temp
= gen_rtx_REG (DImode
, REGNO (temp
) + 1);
1723 temp2
= temp
; /* op0 is _not_ allowed, see above. */
1730 temp1
= gen_reg_rtx (DImode
);
1731 temp2
= gen_reg_rtx (DImode
);
1732 temp3
= gen_reg_rtx (DImode
);
1733 temp4
= gen_reg_rtx (DImode
);
1734 temp5
= gen_reg_rtx (DImode
);
1737 emit_insn (gen_sethh (temp1
, op1
));
1738 emit_insn (gen_setlm (temp2
, op1
));
1739 emit_insn (gen_sethm (temp3
, temp1
, op1
));
1740 emit_insn (gen_rtx_SET (VOIDmode
, temp4
,
1741 gen_rtx_ASHIFT (DImode
, temp3
, GEN_INT (32))));
1742 emit_insn (gen_rtx_SET (VOIDmode
, temp5
,
1743 gen_rtx_PLUS (DImode
, temp4
, temp2
)));
1744 emit_insn (gen_setlo (op0
, temp5
, op1
));
1748 /* Old old old backwards compatibility kruft here.
1749 Essentially it is MEDLOW with a fixed 64-bit
1750 virtual base added to all data segment addresses.
1751 Text-segment stuff is computed like MEDANY, we can't
1752 reuse the code above because the relocation knobs
1755 Data segment: sethi %hi(symbol), %temp1
1756 add %temp1, EMBMEDANY_BASE_REG, %temp2
1757 or %temp2, %lo(symbol), %reg */
1758 if (data_segment_operand (op1
, GET_MODE (op1
)))
1762 temp1
= temp
; /* op0 is allowed. */
1767 temp1
= gen_reg_rtx (DImode
);
1768 temp2
= gen_reg_rtx (DImode
);
1771 emit_insn (gen_embmedany_sethi (temp1
, op1
));
1772 emit_insn (gen_embmedany_brsum (temp2
, temp1
));
1773 emit_insn (gen_embmedany_losum (op0
, temp2
, op1
));
1776 /* Text segment: sethi %uhi(symbol), %temp1
1777 sethi %hi(symbol), %temp2
1778 or %temp1, %ulo(symbol), %temp3
1779 sllx %temp3, 32, %temp4
1780 or %temp4, %temp2, %temp5
1781 or %temp5, %lo(symbol), %reg */
1786 /* It is possible that one of the registers we got for operands[2]
1787 might coincide with that of operands[0] (which is why we made
1788 it TImode). Pick the other one to use as our scratch. */
1789 if (rtx_equal_p (temp
, op0
))
1792 temp
= gen_rtx_REG (DImode
, REGNO (temp
) + 1);
1797 temp2
= temp
; /* op0 is _not_ allowed, see above. */
1804 temp1
= gen_reg_rtx (DImode
);
1805 temp2
= gen_reg_rtx (DImode
);
1806 temp3
= gen_reg_rtx (DImode
);
1807 temp4
= gen_reg_rtx (DImode
);
1808 temp5
= gen_reg_rtx (DImode
);
1811 emit_insn (gen_embmedany_textuhi (temp1
, op1
));
1812 emit_insn (gen_embmedany_texthi (temp2
, op1
));
1813 emit_insn (gen_embmedany_textulo (temp3
, temp1
, op1
));
1814 emit_insn (gen_rtx_SET (VOIDmode
, temp4
,
1815 gen_rtx_ASHIFT (DImode
, temp3
, GEN_INT (32))));
1816 emit_insn (gen_rtx_SET (VOIDmode
, temp5
,
1817 gen_rtx_PLUS (DImode
, temp4
, temp2
)));
1818 emit_insn (gen_embmedany_textlo (op0
, temp5
, op1
));
1827 /* These avoid problems when cross compiling. If we do not
1828 go through all this hair then the optimizer will see
1829 invalid REG_EQUAL notes or in some cases none at all. */
1830 static void sparc_emit_set_safe_HIGH64 (rtx
, HOST_WIDE_INT
);
1831 static rtx
gen_safe_SET64 (rtx
, HOST_WIDE_INT
);
1832 static rtx
gen_safe_OR64 (rtx
, HOST_WIDE_INT
);
1833 static rtx
gen_safe_XOR64 (rtx
, HOST_WIDE_INT
);
1835 #if HOST_BITS_PER_WIDE_INT == 64
1836 #define GEN_HIGHINT64(__x) GEN_INT ((__x) & ~(HOST_WIDE_INT)0x3ff)
1837 #define GEN_INT64(__x) GEN_INT (__x)
1839 #define GEN_HIGHINT64(__x) \
1840 immed_double_const ((__x) & ~(HOST_WIDE_INT)0x3ff, 0, DImode)
1841 #define GEN_INT64(__x) \
1842 immed_double_const ((__x) & 0xffffffff, \
1843 ((__x) & 0x80000000 ? -1 : 0), DImode)
1846 /* The optimizer is not to assume anything about exactly
1847 which bits are set for a HIGH, they are unspecified.
1848 Unfortunately this leads to many missed optimizations
1849 during CSE. We mask out the non-HIGH bits, and matches
1850 a plain movdi, to alleviate this problem. */
1852 sparc_emit_set_safe_HIGH64 (rtx dest
, HOST_WIDE_INT val
)
1854 emit_insn (gen_rtx_SET (VOIDmode
, dest
, GEN_HIGHINT64 (val
)));
1858 gen_safe_SET64 (rtx dest
, HOST_WIDE_INT val
)
1860 return gen_rtx_SET (VOIDmode
, dest
, GEN_INT64 (val
));
1864 gen_safe_OR64 (rtx src
, HOST_WIDE_INT val
)
1866 return gen_rtx_IOR (DImode
, src
, GEN_INT64 (val
));
1870 gen_safe_XOR64 (rtx src
, HOST_WIDE_INT val
)
1872 return gen_rtx_XOR (DImode
, src
, GEN_INT64 (val
));
1875 /* Worker routines for 64-bit constant formation on arch64.
1876 One of the key things to be doing in these emissions is
1877 to create as many temp REGs as possible. This makes it
1878 possible for half-built constants to be used later when
1879 such values are similar to something required later on.
1880 Without doing this, the optimizer cannot see such
1883 static void sparc_emit_set_const64_quick1 (rtx
, rtx
,
1884 unsigned HOST_WIDE_INT
, int);
1887 sparc_emit_set_const64_quick1 (rtx op0
, rtx temp
,
1888 unsigned HOST_WIDE_INT low_bits
, int is_neg
)
1890 unsigned HOST_WIDE_INT high_bits
;
1893 high_bits
= (~low_bits
) & 0xffffffff;
1895 high_bits
= low_bits
;
1897 sparc_emit_set_safe_HIGH64 (temp
, high_bits
);
1900 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
1901 gen_safe_OR64 (temp
, (high_bits
& 0x3ff))));
1905 /* If we are XOR'ing with -1, then we should emit a one's complement
1906 instead. This way the combiner will notice logical operations
1907 such as ANDN later on and substitute. */
1908 if ((low_bits
& 0x3ff) == 0x3ff)
1910 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
1911 gen_rtx_NOT (DImode
, temp
)));
1915 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
1916 gen_safe_XOR64 (temp
,
1917 (-(HOST_WIDE_INT
)0x400
1918 | (low_bits
& 0x3ff)))));
1923 static void sparc_emit_set_const64_quick2 (rtx
, rtx
, unsigned HOST_WIDE_INT
,
1924 unsigned HOST_WIDE_INT
, int);
1927 sparc_emit_set_const64_quick2 (rtx op0
, rtx temp
,
1928 unsigned HOST_WIDE_INT high_bits
,
1929 unsigned HOST_WIDE_INT low_immediate
,
1934 if ((high_bits
& 0xfffffc00) != 0)
1936 sparc_emit_set_safe_HIGH64 (temp
, high_bits
);
1937 if ((high_bits
& ~0xfffffc00) != 0)
1938 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
1939 gen_safe_OR64 (temp
, (high_bits
& 0x3ff))));
1945 emit_insn (gen_safe_SET64 (temp
, high_bits
));
1949 /* Now shift it up into place. */
1950 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
1951 gen_rtx_ASHIFT (DImode
, temp2
,
1952 GEN_INT (shift_count
))));
1954 /* If there is a low immediate part piece, finish up by
1955 putting that in as well. */
1956 if (low_immediate
!= 0)
1957 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
1958 gen_safe_OR64 (op0
, low_immediate
)));
1961 static void sparc_emit_set_const64_longway (rtx
, rtx
, unsigned HOST_WIDE_INT
,
1962 unsigned HOST_WIDE_INT
);
1964 /* Full 64-bit constant decomposition. Even though this is the
1965 'worst' case, we still optimize a few things away. */
1967 sparc_emit_set_const64_longway (rtx op0
, rtx temp
,
1968 unsigned HOST_WIDE_INT high_bits
,
1969 unsigned HOST_WIDE_INT low_bits
)
1973 if (reload_in_progress
|| reload_completed
)
1976 sub_temp
= gen_reg_rtx (DImode
);
1978 if ((high_bits
& 0xfffffc00) != 0)
1980 sparc_emit_set_safe_HIGH64 (temp
, high_bits
);
1981 if ((high_bits
& ~0xfffffc00) != 0)
1982 emit_insn (gen_rtx_SET (VOIDmode
,
1984 gen_safe_OR64 (temp
, (high_bits
& 0x3ff))));
1990 emit_insn (gen_safe_SET64 (temp
, high_bits
));
1994 if (!reload_in_progress
&& !reload_completed
)
1996 rtx temp2
= gen_reg_rtx (DImode
);
1997 rtx temp3
= gen_reg_rtx (DImode
);
1998 rtx temp4
= gen_reg_rtx (DImode
);
2000 emit_insn (gen_rtx_SET (VOIDmode
, temp4
,
2001 gen_rtx_ASHIFT (DImode
, sub_temp
,
2004 sparc_emit_set_safe_HIGH64 (temp2
, low_bits
);
2005 if ((low_bits
& ~0xfffffc00) != 0)
2007 emit_insn (gen_rtx_SET (VOIDmode
, temp3
,
2008 gen_safe_OR64 (temp2
, (low_bits
& 0x3ff))));
2009 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
2010 gen_rtx_PLUS (DImode
, temp4
, temp3
)));
2014 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
2015 gen_rtx_PLUS (DImode
, temp4
, temp2
)));
2020 rtx low1
= GEN_INT ((low_bits
>> (32 - 12)) & 0xfff);
2021 rtx low2
= GEN_INT ((low_bits
>> (32 - 12 - 12)) & 0xfff);
2022 rtx low3
= GEN_INT ((low_bits
>> (32 - 12 - 12 - 8)) & 0x0ff);
2025 /* We are in the middle of reload, so this is really
2026 painful. However we do still make an attempt to
2027 avoid emitting truly stupid code. */
2028 if (low1
!= const0_rtx
)
2030 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
2031 gen_rtx_ASHIFT (DImode
, sub_temp
,
2032 GEN_INT (to_shift
))));
2033 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
2034 gen_rtx_IOR (DImode
, op0
, low1
)));
2042 if (low2
!= const0_rtx
)
2044 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
2045 gen_rtx_ASHIFT (DImode
, sub_temp
,
2046 GEN_INT (to_shift
))));
2047 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
2048 gen_rtx_IOR (DImode
, op0
, low2
)));
2056 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
2057 gen_rtx_ASHIFT (DImode
, sub_temp
,
2058 GEN_INT (to_shift
))));
2059 if (low3
!= const0_rtx
)
2060 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
2061 gen_rtx_IOR (DImode
, op0
, low3
)));
2066 /* Analyze a 64-bit constant for certain properties. */
2067 static void analyze_64bit_constant (unsigned HOST_WIDE_INT
,
2068 unsigned HOST_WIDE_INT
,
2069 int *, int *, int *);
2072 analyze_64bit_constant (unsigned HOST_WIDE_INT high_bits
,
2073 unsigned HOST_WIDE_INT low_bits
,
2074 int *hbsp
, int *lbsp
, int *abbasp
)
2076 int lowest_bit_set
, highest_bit_set
, all_bits_between_are_set
;
2079 lowest_bit_set
= highest_bit_set
= -1;
2083 if ((lowest_bit_set
== -1)
2084 && ((low_bits
>> i
) & 1))
2086 if ((highest_bit_set
== -1)
2087 && ((high_bits
>> (32 - i
- 1)) & 1))
2088 highest_bit_set
= (64 - i
- 1);
2091 && ((highest_bit_set
== -1)
2092 || (lowest_bit_set
== -1)));
2098 if ((lowest_bit_set
== -1)
2099 && ((high_bits
>> i
) & 1))
2100 lowest_bit_set
= i
+ 32;
2101 if ((highest_bit_set
== -1)
2102 && ((low_bits
>> (32 - i
- 1)) & 1))
2103 highest_bit_set
= 32 - i
- 1;
2106 && ((highest_bit_set
== -1)
2107 || (lowest_bit_set
== -1)));
2109 /* If there are no bits set this should have gone out
2110 as one instruction! */
2111 if (lowest_bit_set
== -1
2112 || highest_bit_set
== -1)
2114 all_bits_between_are_set
= 1;
2115 for (i
= lowest_bit_set
; i
<= highest_bit_set
; i
++)
2119 if ((low_bits
& (1 << i
)) != 0)
2124 if ((high_bits
& (1 << (i
- 32))) != 0)
2127 all_bits_between_are_set
= 0;
2130 *hbsp
= highest_bit_set
;
2131 *lbsp
= lowest_bit_set
;
2132 *abbasp
= all_bits_between_are_set
;
2135 static int const64_is_2insns (unsigned HOST_WIDE_INT
, unsigned HOST_WIDE_INT
);
2138 const64_is_2insns (unsigned HOST_WIDE_INT high_bits
,
2139 unsigned HOST_WIDE_INT low_bits
)
2141 int highest_bit_set
, lowest_bit_set
, all_bits_between_are_set
;
2144 || high_bits
== 0xffffffff)
2147 analyze_64bit_constant (high_bits
, low_bits
,
2148 &highest_bit_set
, &lowest_bit_set
,
2149 &all_bits_between_are_set
);
2151 if ((highest_bit_set
== 63
2152 || lowest_bit_set
== 0)
2153 && all_bits_between_are_set
!= 0)
2156 if ((highest_bit_set
- lowest_bit_set
) < 21)
2162 static unsigned HOST_WIDE_INT
create_simple_focus_bits (unsigned HOST_WIDE_INT
,
2163 unsigned HOST_WIDE_INT
,
2166 static unsigned HOST_WIDE_INT
2167 create_simple_focus_bits (unsigned HOST_WIDE_INT high_bits
,
2168 unsigned HOST_WIDE_INT low_bits
,
2169 int lowest_bit_set
, int shift
)
2171 HOST_WIDE_INT hi
, lo
;
2173 if (lowest_bit_set
< 32)
2175 lo
= (low_bits
>> lowest_bit_set
) << shift
;
2176 hi
= ((high_bits
<< (32 - lowest_bit_set
)) << shift
);
2181 hi
= ((high_bits
>> (lowest_bit_set
- 32)) << shift
);
2188 /* Here we are sure to be arch64 and this is an integer constant
2189 being loaded into a register. Emit the most efficient
2190 insn sequence possible. Detection of all the 1-insn cases
2191 has been done already. */
2193 sparc_emit_set_const64 (rtx op0
, rtx op1
)
2195 unsigned HOST_WIDE_INT high_bits
, low_bits
;
2196 int lowest_bit_set
, highest_bit_set
;
2197 int all_bits_between_are_set
;
2200 /* Sanity check that we know what we are working with. */
2201 if (! TARGET_ARCH64
)
2204 if (GET_CODE (op0
) != SUBREG
)
2206 if (GET_CODE (op0
) != REG
2207 || (REGNO (op0
) >= SPARC_FIRST_FP_REG
2208 && REGNO (op0
) <= SPARC_LAST_V9_FP_REG
))
2212 if (reload_in_progress
|| reload_completed
)
2215 if (GET_CODE (op1
) != CONST_DOUBLE
2216 && GET_CODE (op1
) != CONST_INT
)
2218 sparc_emit_set_symbolic_const64 (op0
, op1
, temp
);
2223 temp
= gen_reg_rtx (DImode
);
2225 if (GET_CODE (op1
) == CONST_DOUBLE
)
2227 #if HOST_BITS_PER_WIDE_INT == 64
2228 high_bits
= (CONST_DOUBLE_LOW (op1
) >> 32) & 0xffffffff;
2229 low_bits
= CONST_DOUBLE_LOW (op1
) & 0xffffffff;
2231 high_bits
= CONST_DOUBLE_HIGH (op1
);
2232 low_bits
= CONST_DOUBLE_LOW (op1
);
2237 #if HOST_BITS_PER_WIDE_INT == 64
2238 high_bits
= ((INTVAL (op1
) >> 32) & 0xffffffff);
2239 low_bits
= (INTVAL (op1
) & 0xffffffff);
2241 high_bits
= ((INTVAL (op1
) < 0) ?
2244 low_bits
= INTVAL (op1
);
2248 /* low_bits bits 0 --> 31
2249 high_bits bits 32 --> 63 */
2251 analyze_64bit_constant (high_bits
, low_bits
,
2252 &highest_bit_set
, &lowest_bit_set
,
2253 &all_bits_between_are_set
);
2255 /* First try for a 2-insn sequence. */
2257 /* These situations are preferred because the optimizer can
2258 * do more things with them:
2260 * sllx %reg, shift, %reg
2262 * srlx %reg, shift, %reg
2263 * 3) mov some_small_const, %reg
2264 * sllx %reg, shift, %reg
2266 if (((highest_bit_set
== 63
2267 || lowest_bit_set
== 0)
2268 && all_bits_between_are_set
!= 0)
2269 || ((highest_bit_set
- lowest_bit_set
) < 12))
2271 HOST_WIDE_INT the_const
= -1;
2272 int shift
= lowest_bit_set
;
2274 if ((highest_bit_set
!= 63
2275 && lowest_bit_set
!= 0)
2276 || all_bits_between_are_set
== 0)
2279 create_simple_focus_bits (high_bits
, low_bits
,
2282 else if (lowest_bit_set
== 0)
2283 shift
= -(63 - highest_bit_set
);
2285 if (! SPARC_SIMM13_P (the_const
))
2288 emit_insn (gen_safe_SET64 (temp
, the_const
));
2290 emit_insn (gen_rtx_SET (VOIDmode
,
2292 gen_rtx_ASHIFT (DImode
,
2296 emit_insn (gen_rtx_SET (VOIDmode
,
2298 gen_rtx_LSHIFTRT (DImode
,
2300 GEN_INT (-shift
))));
2306 /* Now a range of 22 or less bits set somewhere.
2307 * 1) sethi %hi(focus_bits), %reg
2308 * sllx %reg, shift, %reg
2309 * 2) sethi %hi(focus_bits), %reg
2310 * srlx %reg, shift, %reg
2312 if ((highest_bit_set
- lowest_bit_set
) < 21)
2314 unsigned HOST_WIDE_INT focus_bits
=
2315 create_simple_focus_bits (high_bits
, low_bits
,
2316 lowest_bit_set
, 10);
2318 if (! SPARC_SETHI_P (focus_bits
))
2321 sparc_emit_set_safe_HIGH64 (temp
, focus_bits
);
2323 /* If lowest_bit_set == 10 then a sethi alone could have done it. */
2324 if (lowest_bit_set
< 10)
2325 emit_insn (gen_rtx_SET (VOIDmode
,
2327 gen_rtx_LSHIFTRT (DImode
, temp
,
2328 GEN_INT (10 - lowest_bit_set
))));
2329 else if (lowest_bit_set
> 10)
2330 emit_insn (gen_rtx_SET (VOIDmode
,
2332 gen_rtx_ASHIFT (DImode
, temp
,
2333 GEN_INT (lowest_bit_set
- 10))));
2339 /* 1) sethi %hi(low_bits), %reg
2340 * or %reg, %lo(low_bits), %reg
2341 * 2) sethi %hi(~low_bits), %reg
2342 * xor %reg, %lo(-0x400 | (low_bits & 0x3ff)), %reg
2345 || high_bits
== 0xffffffff)
2347 sparc_emit_set_const64_quick1 (op0
, temp
, low_bits
,
2348 (high_bits
== 0xffffffff));
2352 /* Now, try 3-insn sequences. */
2354 /* 1) sethi %hi(high_bits), %reg
2355 * or %reg, %lo(high_bits), %reg
2356 * sllx %reg, 32, %reg
2360 sparc_emit_set_const64_quick2 (op0
, temp
, high_bits
, 0, 32);
2364 /* We may be able to do something quick
2365 when the constant is negated, so try that. */
2366 if (const64_is_2insns ((~high_bits
) & 0xffffffff,
2367 (~low_bits
) & 0xfffffc00))
2369 /* NOTE: The trailing bits get XOR'd so we need the
2370 non-negated bits, not the negated ones. */
2371 unsigned HOST_WIDE_INT trailing_bits
= low_bits
& 0x3ff;
2373 if ((((~high_bits
) & 0xffffffff) == 0
2374 && ((~low_bits
) & 0x80000000) == 0)
2375 || (((~high_bits
) & 0xffffffff) == 0xffffffff
2376 && ((~low_bits
) & 0x80000000) != 0))
2378 int fast_int
= (~low_bits
& 0xffffffff);
2380 if ((SPARC_SETHI_P (fast_int
)
2381 && (~high_bits
& 0xffffffff) == 0)
2382 || SPARC_SIMM13_P (fast_int
))
2383 emit_insn (gen_safe_SET64 (temp
, fast_int
));
2385 sparc_emit_set_const64 (temp
, GEN_INT64 (fast_int
));
2390 #if HOST_BITS_PER_WIDE_INT == 64
2391 negated_const
= GEN_INT (((~low_bits
) & 0xfffffc00) |
2392 (((HOST_WIDE_INT
)((~high_bits
) & 0xffffffff))<<32));
2394 negated_const
= immed_double_const ((~low_bits
) & 0xfffffc00,
2395 (~high_bits
) & 0xffffffff,
2398 sparc_emit_set_const64 (temp
, negated_const
);
2401 /* If we are XOR'ing with -1, then we should emit a one's complement
2402 instead. This way the combiner will notice logical operations
2403 such as ANDN later on and substitute. */
2404 if (trailing_bits
== 0x3ff)
2406 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
2407 gen_rtx_NOT (DImode
, temp
)));
2411 emit_insn (gen_rtx_SET (VOIDmode
,
2413 gen_safe_XOR64 (temp
,
2414 (-0x400 | trailing_bits
))));
2419 /* 1) sethi %hi(xxx), %reg
2420 * or %reg, %lo(xxx), %reg
2421 * sllx %reg, yyy, %reg
2423 * ??? This is just a generalized version of the low_bits==0
2424 * thing above, FIXME...
2426 if ((highest_bit_set
- lowest_bit_set
) < 32)
2428 unsigned HOST_WIDE_INT focus_bits
=
2429 create_simple_focus_bits (high_bits
, low_bits
,
2432 /* We can't get here in this state. */
2433 if (highest_bit_set
< 32
2434 || lowest_bit_set
>= 32)
2437 /* So what we know is that the set bits straddle the
2438 middle of the 64-bit word. */
2439 sparc_emit_set_const64_quick2 (op0
, temp
,
2445 /* 1) sethi %hi(high_bits), %reg
2446 * or %reg, %lo(high_bits), %reg
2447 * sllx %reg, 32, %reg
2448 * or %reg, low_bits, %reg
2450 if (SPARC_SIMM13_P(low_bits
)
2451 && ((int)low_bits
> 0))
2453 sparc_emit_set_const64_quick2 (op0
, temp
, high_bits
, low_bits
, 32);
2457 /* The easiest way when all else fails, is full decomposition. */
2459 printf ("sparc_emit_set_const64: Hard constant [%08lx%08lx] neg[%08lx%08lx]\n",
2460 high_bits
, low_bits
, ~high_bits
, ~low_bits
);
2462 sparc_emit_set_const64_longway (op0
, temp
, high_bits
, low_bits
);
2465 /* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
2466 return the mode to be used for the comparison. For floating-point,
2467 CCFP[E]mode is used. CC_NOOVmode should be used when the first operand
2468 is a PLUS, MINUS, NEG, or ASHIFT. CCmode should be used when no special
2469 processing is needed. */
2472 select_cc_mode (enum rtx_code op
, rtx x
, rtx y ATTRIBUTE_UNUSED
)
2474 if (GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
2500 else if (GET_CODE (x
) == PLUS
|| GET_CODE (x
) == MINUS
2501 || GET_CODE (x
) == NEG
|| GET_CODE (x
) == ASHIFT
)
2503 if (TARGET_ARCH64
&& GET_MODE (x
) == DImode
)
2504 return CCX_NOOVmode
;
2510 if (TARGET_ARCH64
&& GET_MODE (x
) == DImode
)
2517 /* X and Y are two things to compare using CODE. Emit the compare insn and
2518 return the rtx for the cc reg in the proper mode. */
2521 gen_compare_reg (enum rtx_code code
, rtx x
, rtx y
)
2523 enum machine_mode mode
= SELECT_CC_MODE (code
, x
, y
);
2526 /* ??? We don't have movcc patterns so we cannot generate pseudo regs for the
2527 fcc regs (cse can't tell they're really call clobbered regs and will
2528 remove a duplicate comparison even if there is an intervening function
2529 call - it will then try to reload the cc reg via an int reg which is why
2530 we need the movcc patterns). It is possible to provide the movcc
2531 patterns by using the ldxfsr/stxfsr v9 insns. I tried it: you need two
2532 registers (say %g1,%g5) and it takes about 6 insns. A better fix would be
2533 to tell cse that CCFPE mode registers (even pseudos) are call
2536 /* ??? This is an experiment. Rather than making changes to cse which may
2537 or may not be easy/clean, we do our own cse. This is possible because
2538 we will generate hard registers. Cse knows they're call clobbered (it
2539 doesn't know the same thing about pseudos). If we guess wrong, no big
2540 deal, but if we win, great! */
2542 if (TARGET_V9
&& GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
2543 #if 1 /* experiment */
2546 /* We cycle through the registers to ensure they're all exercised. */
2547 static int next_fcc_reg
= 0;
2548 /* Previous x,y for each fcc reg. */
2549 static rtx prev_args
[4][2];
2551 /* Scan prev_args for x,y. */
2552 for (reg
= 0; reg
< 4; reg
++)
2553 if (prev_args
[reg
][0] == x
&& prev_args
[reg
][1] == y
)
2558 prev_args
[reg
][0] = x
;
2559 prev_args
[reg
][1] = y
;
2560 next_fcc_reg
= (next_fcc_reg
+ 1) & 3;
2562 cc_reg
= gen_rtx_REG (mode
, reg
+ SPARC_FIRST_V9_FCC_REG
);
2565 cc_reg
= gen_reg_rtx (mode
);
2566 #endif /* ! experiment */
2567 else if (GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
2568 cc_reg
= gen_rtx_REG (mode
, SPARC_FCC_REG
);
2570 cc_reg
= gen_rtx_REG (mode
, SPARC_ICC_REG
);
2572 emit_insn (gen_rtx_SET (VOIDmode
, cc_reg
,
2573 gen_rtx_COMPARE (mode
, x
, y
)));
2578 /* This function is used for v9 only.
2579 CODE is the code for an Scc's comparison.
2580 OPERANDS[0] is the target of the Scc insn.
2581 OPERANDS[1] is the value we compare against const0_rtx (which hasn't
2582 been generated yet).
2584 This function is needed to turn
2587 (gt (reg:CCX 100 %icc)
2591 (gt:DI (reg:CCX 100 %icc)
2594 IE: The instruction recognizer needs to see the mode of the comparison to
2595 find the right instruction. We could use "gt:DI" right in the
2596 define_expand, but leaving it out allows us to handle DI, SI, etc.
2598 We refer to the global sparc compare operands sparc_compare_op0 and
2599 sparc_compare_op1. */
2602 gen_v9_scc (enum rtx_code compare_code
, register rtx
*operands
)
2607 && (GET_MODE (sparc_compare_op0
) == DImode
2608 || GET_MODE (operands
[0]) == DImode
))
2611 op0
= sparc_compare_op0
;
2612 op1
= sparc_compare_op1
;
2614 /* Try to use the movrCC insns. */
2616 && GET_MODE_CLASS (GET_MODE (op0
)) == MODE_INT
2617 && op1
== const0_rtx
2618 && v9_regcmp_p (compare_code
))
2620 /* Special case for op0 != 0. This can be done with one instruction if
2621 operands[0] == sparc_compare_op0. */
2623 if (compare_code
== NE
2624 && GET_MODE (operands
[0]) == DImode
2625 && rtx_equal_p (op0
, operands
[0]))
2627 emit_insn (gen_rtx_SET (VOIDmode
, operands
[0],
2628 gen_rtx_IF_THEN_ELSE (DImode
,
2629 gen_rtx_fmt_ee (compare_code
, DImode
,
2636 if (reg_overlap_mentioned_p (operands
[0], op0
))
2638 /* Handle the case where operands[0] == sparc_compare_op0.
2639 We "early clobber" the result. */
2640 op0
= gen_reg_rtx (GET_MODE (sparc_compare_op0
));
2641 emit_move_insn (op0
, sparc_compare_op0
);
2644 emit_insn (gen_rtx_SET (VOIDmode
, operands
[0], const0_rtx
));
2645 if (GET_MODE (op0
) != DImode
)
2647 temp
= gen_reg_rtx (DImode
);
2648 convert_move (temp
, op0
, 0);
2652 emit_insn (gen_rtx_SET (VOIDmode
, operands
[0],
2653 gen_rtx_IF_THEN_ELSE (GET_MODE (operands
[0]),
2654 gen_rtx_fmt_ee (compare_code
, DImode
,
2662 operands
[1] = gen_compare_reg (compare_code
, op0
, op1
);
2664 switch (GET_MODE (operands
[1]))
2674 emit_insn (gen_rtx_SET (VOIDmode
, operands
[0], const0_rtx
));
2675 emit_insn (gen_rtx_SET (VOIDmode
, operands
[0],
2676 gen_rtx_IF_THEN_ELSE (GET_MODE (operands
[0]),
2677 gen_rtx_fmt_ee (compare_code
,
2678 GET_MODE (operands
[1]),
2679 operands
[1], const0_rtx
),
2680 const1_rtx
, operands
[0])));
2685 /* Emit a conditional jump insn for the v9 architecture using comparison code
2686 CODE and jump target LABEL.
2687 This function exists to take advantage of the v9 brxx insns. */
2690 emit_v9_brxx_insn (enum rtx_code code
, rtx op0
, rtx label
)
2692 emit_jump_insn (gen_rtx_SET (VOIDmode
,
2694 gen_rtx_IF_THEN_ELSE (VOIDmode
,
2695 gen_rtx_fmt_ee (code
, GET_MODE (op0
),
2697 gen_rtx_LABEL_REF (VOIDmode
, label
),
2701 /* Generate a DFmode part of a hard TFmode register.
2702 REG is the TFmode hard register, LOW is 1 for the
2703 low 64bit of the register and 0 otherwise.
2706 gen_df_reg (rtx reg
, int low
)
2708 int regno
= REGNO (reg
);
2710 if ((WORDS_BIG_ENDIAN
== 0) ^ (low
!= 0))
2711 regno
+= (TARGET_ARCH64
&& regno
< 32) ? 1 : 2;
2712 return gen_rtx_REG (DFmode
, regno
);
2715 /* Generate a call to FUNC with OPERANDS. Operand 0 is the return value.
2716 Unlike normal calls, TFmode operands are passed by reference. It is
2717 assumed that no more than 3 operands are required. */
2720 emit_soft_tfmode_libcall (const char *func_name
, int nargs
, rtx
*operands
)
2722 rtx ret_slot
= NULL
, arg
[3], func_sym
;
2725 /* We only expect to be called for conversions, unary, and binary ops. */
2726 if (nargs
< 2 || nargs
> 3)
2729 for (i
= 0; i
< nargs
; ++i
)
2731 rtx this_arg
= operands
[i
];
2734 /* TFmode arguments and return values are passed by reference. */
2735 if (GET_MODE (this_arg
) == TFmode
)
2737 int force_stack_temp
;
2739 force_stack_temp
= 0;
2740 if (TARGET_BUGGY_QP_LIB
&& i
== 0)
2741 force_stack_temp
= 1;
2743 if (GET_CODE (this_arg
) == MEM
2744 && ! force_stack_temp
)
2745 this_arg
= XEXP (this_arg
, 0);
2746 else if (CONSTANT_P (this_arg
)
2747 && ! force_stack_temp
)
2749 this_slot
= force_const_mem (TFmode
, this_arg
);
2750 this_arg
= XEXP (this_slot
, 0);
2754 this_slot
= assign_stack_temp (TFmode
, GET_MODE_SIZE (TFmode
), 0);
2756 /* Operand 0 is the return value. We'll copy it out later. */
2758 emit_move_insn (this_slot
, this_arg
);
2760 ret_slot
= this_slot
;
2762 this_arg
= XEXP (this_slot
, 0);
2769 func_sym
= gen_rtx_SYMBOL_REF (Pmode
, func_name
);
2771 if (GET_MODE (operands
[0]) == TFmode
)
2774 emit_library_call (func_sym
, LCT_NORMAL
, VOIDmode
, 2,
2775 arg
[0], GET_MODE (arg
[0]),
2776 arg
[1], GET_MODE (arg
[1]));
2778 emit_library_call (func_sym
, LCT_NORMAL
, VOIDmode
, 3,
2779 arg
[0], GET_MODE (arg
[0]),
2780 arg
[1], GET_MODE (arg
[1]),
2781 arg
[2], GET_MODE (arg
[2]));
2784 emit_move_insn (operands
[0], ret_slot
);
2793 ret
= emit_library_call_value (func_sym
, operands
[0], LCT_NORMAL
,
2794 GET_MODE (operands
[0]), 1,
2795 arg
[1], GET_MODE (arg
[1]));
2797 if (ret
!= operands
[0])
2798 emit_move_insn (operands
[0], ret
);
2802 /* Expand soft-float TFmode calls to sparc abi routines. */
2805 emit_soft_tfmode_binop (enum rtx_code code
, rtx
*operands
)
2827 emit_soft_tfmode_libcall (func
, 3, operands
);
2831 emit_soft_tfmode_unop (enum rtx_code code
, rtx
*operands
)
2844 emit_soft_tfmode_libcall (func
, 2, operands
);
2848 emit_soft_tfmode_cvt (enum rtx_code code
, rtx
*operands
)
2855 switch (GET_MODE (operands
[1]))
2868 case FLOAT_TRUNCATE
:
2869 switch (GET_MODE (operands
[0]))
2883 switch (GET_MODE (operands
[1]))
2896 case UNSIGNED_FLOAT
:
2897 switch (GET_MODE (operands
[1]))
2911 switch (GET_MODE (operands
[0]))
2925 switch (GET_MODE (operands
[0]))
2942 emit_soft_tfmode_libcall (func
, 2, operands
);
2945 /* Expand a hard-float tfmode operation. All arguments must be in
2949 emit_hard_tfmode_operation (enum rtx_code code
, rtx
*operands
)
2953 if (GET_RTX_CLASS (code
) == RTX_UNARY
)
2955 operands
[1] = force_reg (GET_MODE (operands
[1]), operands
[1]);
2956 op
= gen_rtx_fmt_e (code
, GET_MODE (operands
[0]), operands
[1]);
2960 operands
[1] = force_reg (GET_MODE (operands
[1]), operands
[1]);
2961 operands
[2] = force_reg (GET_MODE (operands
[2]), operands
[2]);
2962 op
= gen_rtx_fmt_ee (code
, GET_MODE (operands
[0]),
2963 operands
[1], operands
[2]);
2966 if (register_operand (operands
[0], VOIDmode
))
2969 dest
= gen_reg_rtx (GET_MODE (operands
[0]));
2971 emit_insn (gen_rtx_SET (VOIDmode
, dest
, op
));
2973 if (dest
!= operands
[0])
2974 emit_move_insn (operands
[0], dest
);
2978 emit_tfmode_binop (enum rtx_code code
, rtx
*operands
)
2980 if (TARGET_HARD_QUAD
)
2981 emit_hard_tfmode_operation (code
, operands
);
2983 emit_soft_tfmode_binop (code
, operands
);
2987 emit_tfmode_unop (enum rtx_code code
, rtx
*operands
)
2989 if (TARGET_HARD_QUAD
)
2990 emit_hard_tfmode_operation (code
, operands
);
2992 emit_soft_tfmode_unop (code
, operands
);
2996 emit_tfmode_cvt (enum rtx_code code
, rtx
*operands
)
2998 if (TARGET_HARD_QUAD
)
2999 emit_hard_tfmode_operation (code
, operands
);
3001 emit_soft_tfmode_cvt (code
, operands
);
3004 /* Return nonzero if a branch/jump/call instruction will be emitting
3005 nop into its delay slot. */
3008 empty_delay_slot (rtx insn
)
3012 /* If no previous instruction (should not happen), return true. */
3013 if (PREV_INSN (insn
) == NULL
)
3016 seq
= NEXT_INSN (PREV_INSN (insn
));
3017 if (GET_CODE (PATTERN (seq
)) == SEQUENCE
)
3023 /* Return nonzero if TRIAL can go into the call delay slot. */
3026 tls_call_delay (rtx trial
)
3031 call __tls_get_addr, %tgd_call (foo)
3032 add %l7, %o0, %o0, %tgd_add (foo)
3033 while Sun as/ld does not. */
3034 if (TARGET_GNU_TLS
|| !TARGET_TLS
)
3037 pat
= PATTERN (trial
);
3038 if (GET_CODE (pat
) != SET
|| GET_CODE (SET_DEST (pat
)) != PLUS
)
3041 unspec
= XEXP (SET_DEST (pat
), 1);
3042 if (GET_CODE (unspec
) != UNSPEC
3043 || (XINT (unspec
, 1) != UNSPEC_TLSGD
3044 && XINT (unspec
, 1) != UNSPEC_TLSLDM
))
3050 /* Return nonzero if TRIAL, an insn, can be combined with a 'restore'
3051 instruction. RETURN_P is true if the v9 variant 'return' is to be
3052 considered in the test too.
3054 TRIAL must be a SET whose destination is a REG appropriate for the
3055 'restore' instruction or, if RETURN_P is true, for the 'return'
3059 eligible_for_restore_insn (rtx trial
, bool return_p
)
3061 rtx pat
= PATTERN (trial
);
3062 rtx src
= SET_SRC (pat
);
3064 /* The 'restore src,%g0,dest' pattern for word mode and below. */
3065 if (GET_MODE_CLASS (GET_MODE (src
)) != MODE_FLOAT
3066 && arith_operand (src
, GET_MODE (src
)))
3069 return GET_MODE_SIZE (GET_MODE (src
)) <= GET_MODE_SIZE (DImode
);
3071 return GET_MODE_SIZE (GET_MODE (src
)) <= GET_MODE_SIZE (SImode
);
3074 /* The 'restore src,%g0,dest' pattern for double-word mode. */
3075 else if (GET_MODE_CLASS (GET_MODE (src
)) != MODE_FLOAT
3076 && arith_double_operand (src
, GET_MODE (src
)))
3077 return GET_MODE_SIZE (GET_MODE (src
)) <= GET_MODE_SIZE (DImode
);
3079 /* The 'restore src,%g0,dest' pattern for float if no FPU. */
3080 else if (! TARGET_FPU
&& register_operand (src
, SFmode
))
3083 /* The 'restore src,%g0,dest' pattern for double if no FPU. */
3084 else if (! TARGET_FPU
&& TARGET_ARCH64
&& register_operand (src
, DFmode
))
3087 /* If we have the 'return' instruction, anything that does not use
3088 local or output registers and can go into a delay slot wins. */
3089 else if (return_p
&& TARGET_V9
&& ! epilogue_renumber (&pat
, 1)
3090 && (get_attr_in_uncond_branch_delay (trial
)
3091 == IN_UNCOND_BRANCH_DELAY_TRUE
))
3094 /* The 'restore src1,src2,dest' pattern for SImode. */
3095 else if (GET_CODE (src
) == PLUS
3096 && register_operand (XEXP (src
, 0), SImode
)
3097 && arith_operand (XEXP (src
, 1), SImode
))
3100 /* The 'restore src1,src2,dest' pattern for DImode. */
3101 else if (GET_CODE (src
) == PLUS
3102 && register_operand (XEXP (src
, 0), DImode
)
3103 && arith_double_operand (XEXP (src
, 1), DImode
))
3106 /* The 'restore src1,%lo(src2),dest' pattern. */
3107 else if (GET_CODE (src
) == LO_SUM
3108 && ! TARGET_CM_MEDMID
3109 && ((register_operand (XEXP (src
, 0), SImode
)
3110 && immediate_operand (XEXP (src
, 1), SImode
))
3112 && register_operand (XEXP (src
, 0), DImode
)
3113 && immediate_operand (XEXP (src
, 1), DImode
))))
3116 /* The 'restore src,src,dest' pattern. */
3117 else if (GET_CODE (src
) == ASHIFT
3118 && (register_operand (XEXP (src
, 0), SImode
)
3119 || register_operand (XEXP (src
, 0), DImode
))
3120 && XEXP (src
, 1) == const1_rtx
)
3126 /* Return nonzero if TRIAL can go into the function return's
3130 eligible_for_return_delay (rtx trial
)
3132 int leaf_function_p
= current_function_uses_only_leaf_regs
;
3135 if (GET_CODE (trial
) != INSN
|| GET_CODE (PATTERN (trial
)) != SET
)
3138 if (get_attr_length (trial
) != 1)
3141 /* If there are any call-saved registers, we should scan TRIAL if it
3142 does not reference them. For now just make it easy. */
3146 /* If the function uses __builtin_eh_return, the eh_return machinery
3147 occupies the delay slot. */
3148 if (current_function_calls_eh_return
)
3151 /* In the case of a true leaf function, anything can go into the slot. */
3152 if (leaf_function_p
)
3153 return get_attr_in_uncond_branch_delay (trial
)
3154 == IN_UNCOND_BRANCH_DELAY_TRUE
;
3156 pat
= PATTERN (trial
);
3158 /* Otherwise, only operations which can be done in tandem with
3159 a `restore' or `return' insn can go into the delay slot. */
3160 if (GET_CODE (SET_DEST (pat
)) != REG
3161 || (REGNO (SET_DEST (pat
)) >= 8 && REGNO (SET_DEST (pat
)) < 24))
3164 /* If this instruction sets up floating point register and we have a return
3165 instruction, it can probably go in. But restore will not work
3167 if (REGNO (SET_DEST (pat
)) >= 32)
3169 && ! epilogue_renumber (&pat
, 1)
3170 && (get_attr_in_uncond_branch_delay (trial
)
3171 == IN_UNCOND_BRANCH_DELAY_TRUE
));
3173 return eligible_for_restore_insn (trial
, true);
3176 /* Return nonzero if TRIAL can go into the sibling call's
3180 eligible_for_sibcall_delay (rtx trial
)
3182 int leaf_function_p
= current_function_uses_only_leaf_regs
;
3185 if (GET_CODE (trial
) != INSN
|| GET_CODE (PATTERN (trial
)) != SET
)
3188 if (get_attr_length (trial
) != 1)
3191 pat
= PATTERN (trial
);
3193 if (leaf_function_p
)
3195 /* If the tail call is done using the call instruction,
3196 we have to restore %o7 in the delay slot. */
3197 if (LEAF_SIBCALL_SLOT_RESERVED_P
)
3200 /* %g1 is used to build the function address */
3201 if (reg_mentioned_p (gen_rtx_REG (Pmode
, 1), pat
))
3207 /* Otherwise, only operations which can be done in tandem with
3208 a `restore' insn can go into the delay slot. */
3209 if (GET_CODE (SET_DEST (pat
)) != REG
3210 || (REGNO (SET_DEST (pat
)) >= 8 && REGNO (SET_DEST (pat
)) < 24)
3211 || REGNO (SET_DEST (pat
)) >= 32)
3214 /* If it mentions %o7, it can't go in, because sibcall will clobber it
3216 if (reg_mentioned_p (gen_rtx_REG (Pmode
, 15), pat
))
3219 return eligible_for_restore_insn (trial
, false);
3223 short_branch (int uid1
, int uid2
)
3225 int delta
= INSN_ADDRESSES (uid1
) - INSN_ADDRESSES (uid2
);
3227 /* Leave a few words of "slop". */
3228 if (delta
>= -1023 && delta
<= 1022)
3234 /* Return nonzero if REG is not used after INSN.
3235 We assume REG is a reload reg, and therefore does
3236 not live past labels or calls or jumps. */
3238 reg_unused_after (rtx reg
, rtx insn
)
3240 enum rtx_code code
, prev_code
= UNKNOWN
;
3242 while ((insn
= NEXT_INSN (insn
)))
3244 if (prev_code
== CALL_INSN
&& call_used_regs
[REGNO (reg
)])
3247 code
= GET_CODE (insn
);
3248 if (GET_CODE (insn
) == CODE_LABEL
)
3253 rtx set
= single_set (insn
);
3254 int in_src
= set
&& reg_overlap_mentioned_p (reg
, SET_SRC (set
));
3257 if (set
&& reg_overlap_mentioned_p (reg
, SET_DEST (set
)))
3259 if (set
== 0 && reg_overlap_mentioned_p (reg
, PATTERN (insn
)))
3267 /* Determine if it's legal to put X into the constant pool. This
3268 is not possible if X contains the address of a symbol that is
3269 not constant (TLS) or not known at final link time (PIC). */
3272 sparc_cannot_force_const_mem (rtx x
)
3274 switch (GET_CODE (x
))
3278 /* Accept all non-symbolic constants. */
3282 /* Labels are OK iff we are non-PIC. */
3283 return flag_pic
!= 0;
3286 /* 'Naked' TLS symbol references are never OK,
3287 non-TLS symbols are OK iff we are non-PIC. */
3288 if (SYMBOL_REF_TLS_MODEL (x
))
3291 return flag_pic
!= 0;
3294 return sparc_cannot_force_const_mem (XEXP (x
, 0));
3297 return sparc_cannot_force_const_mem (XEXP (x
, 0))
3298 || sparc_cannot_force_const_mem (XEXP (x
, 1));
3306 /* The table we use to reference PIC data. */
3307 static GTY(()) rtx global_offset_table
;
3309 /* The function we use to get at it. */
3310 static GTY(()) rtx add_pc_to_pic_symbol
;
3311 static GTY(()) char add_pc_to_pic_symbol_name
[256];
3313 /* Ensure that we are not using patterns that are not OK with PIC. */
3321 if (GET_CODE (recog_data
.operand
[i
]) == SYMBOL_REF
3322 || (GET_CODE (recog_data
.operand
[i
]) == CONST
3323 && ! (GET_CODE (XEXP (recog_data
.operand
[i
], 0)) == MINUS
3324 && (XEXP (XEXP (recog_data
.operand
[i
], 0), 0)
3325 == global_offset_table
)
3326 && (GET_CODE (XEXP (XEXP (recog_data
.operand
[i
], 0), 1))
3335 /* Return true if X is an address which needs a temporary register when
3336 reloaded while generating PIC code. */
3339 pic_address_needs_scratch (rtx x
)
3341 /* An address which is a symbolic plus a non SMALL_INT needs a temp reg. */
3342 if (GET_CODE (x
) == CONST
&& GET_CODE (XEXP (x
, 0)) == PLUS
3343 && GET_CODE (XEXP (XEXP (x
, 0), 0)) == SYMBOL_REF
3344 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == CONST_INT
3345 && ! SMALL_INT (XEXP (XEXP (x
, 0), 1)))
3351 /* Determine if a given RTX is a valid constant. We already know this
3352 satisfies CONSTANT_P. */
3355 legitimate_constant_p (rtx x
)
3359 switch (GET_CODE (x
))
3362 /* TLS symbols are not constant. */
3363 if (SYMBOL_REF_TLS_MODEL (x
))
3368 inner
= XEXP (x
, 0);
3370 /* Offsets of TLS symbols are never valid.
3371 Discourage CSE from creating them. */
3372 if (GET_CODE (inner
) == PLUS
3373 && tls_symbolic_operand (XEXP (inner
, 0)))
3378 if (GET_MODE (x
) == VOIDmode
)
3381 /* Floating point constants are generally not ok.
3382 The only exception is 0.0 in VIS. */
3384 && (GET_MODE (x
) == SFmode
3385 || GET_MODE (x
) == DFmode
3386 || GET_MODE (x
) == TFmode
)
3387 && fp_zero_operand (x
, GET_MODE (x
)))
3399 /* Determine if a given RTX is a valid constant address. */
3402 constant_address_p (rtx x
)
3404 switch (GET_CODE (x
))
3412 if (flag_pic
&& pic_address_needs_scratch (x
))
3414 return legitimate_constant_p (x
);
3417 return !flag_pic
&& legitimate_constant_p (x
);
3424 /* Nonzero if the constant value X is a legitimate general operand
3425 when generating PIC code. It is given that flag_pic is on and
3426 that X satisfies CONSTANT_P or is a CONST_DOUBLE. */
3429 legitimate_pic_operand_p (rtx x
)
3431 if (pic_address_needs_scratch (x
))
3433 if (tls_symbolic_operand (x
)
3434 || (GET_CODE (x
) == CONST
3435 && GET_CODE (XEXP (x
, 0)) == PLUS
3436 && tls_symbolic_operand (XEXP (XEXP (x
, 0), 0))))
3441 /* Return nonzero if ADDR is a valid memory address.
3442 STRICT specifies whether strict register checking applies. */
3445 legitimate_address_p (enum machine_mode mode
, rtx addr
, int strict
)
3447 rtx rs1
= NULL
, rs2
= NULL
, imm1
= NULL
, imm2
;
3449 if (REG_P (addr
) || GET_CODE (addr
) == SUBREG
)
3451 else if (GET_CODE (addr
) == PLUS
)
3453 rs1
= XEXP (addr
, 0);
3454 rs2
= XEXP (addr
, 1);
3456 /* Canonicalize. REG comes first, if there are no regs,
3457 LO_SUM comes first. */
3459 && GET_CODE (rs1
) != SUBREG
3461 || GET_CODE (rs2
) == SUBREG
3462 || (GET_CODE (rs2
) == LO_SUM
&& GET_CODE (rs1
) != LO_SUM
)))
3464 rs1
= XEXP (addr
, 1);
3465 rs2
= XEXP (addr
, 0);
3469 && rs1
== pic_offset_table_rtx
3471 && GET_CODE (rs2
) != SUBREG
3472 && GET_CODE (rs2
) != LO_SUM
3473 && GET_CODE (rs2
) != MEM
3474 && !tls_symbolic_operand (rs2
)
3475 && (! symbolic_operand (rs2
, VOIDmode
) || mode
== Pmode
)
3476 && (GET_CODE (rs2
) != CONST_INT
|| SMALL_INT (rs2
)))
3478 || GET_CODE (rs1
) == SUBREG
)
3479 && RTX_OK_FOR_OFFSET_P (rs2
)))
3484 else if ((REG_P (rs1
) || GET_CODE (rs1
) == SUBREG
)
3485 && (REG_P (rs2
) || GET_CODE (rs2
) == SUBREG
))
3487 /* We prohibit REG + REG for TFmode when there are no instructions
3488 which accept REG+REG instructions. We do this because REG+REG
3489 is not an offsetable address. If we get the situation in reload
3490 where source and destination of a movtf pattern are both MEMs with
3491 REG+REG address, then only one of them gets converted to an
3492 offsetable address. */
3494 && !(TARGET_FPU
&& TARGET_ARCH64
&& TARGET_V9
3495 && TARGET_HARD_QUAD
))
3498 /* We prohibit REG + REG on ARCH32 if not optimizing for
3499 DFmode/DImode because then mem_min_alignment is likely to be zero
3500 after reload and the forced split would lack a matching splitter
3502 if (TARGET_ARCH32
&& !optimize
3503 && (mode
== DFmode
|| mode
== DImode
))
3506 else if (USE_AS_OFFSETABLE_LO10
3507 && GET_CODE (rs1
) == LO_SUM
3509 && ! TARGET_CM_MEDMID
3510 && RTX_OK_FOR_OLO10_P (rs2
))
3514 imm1
= XEXP (rs1
, 1);
3515 rs1
= XEXP (rs1
, 0);
3516 if (! CONSTANT_P (imm1
) || tls_symbolic_operand (rs1
))
3520 else if (GET_CODE (addr
) == LO_SUM
)
3522 rs1
= XEXP (addr
, 0);
3523 imm1
= XEXP (addr
, 1);
3525 if (! CONSTANT_P (imm1
) || tls_symbolic_operand (rs1
))
3528 /* We can't allow TFmode, because an offset greater than or equal to the
3529 alignment (8) may cause the LO_SUM to overflow if !v9. */
3530 if (mode
== TFmode
&& !TARGET_V9
)
3533 else if (GET_CODE (addr
) == CONST_INT
&& SMALL_INT (addr
))
3538 if (GET_CODE (rs1
) == SUBREG
)
3539 rs1
= SUBREG_REG (rs1
);
3545 if (GET_CODE (rs2
) == SUBREG
)
3546 rs2
= SUBREG_REG (rs2
);
3553 if (!REGNO_OK_FOR_BASE_P (REGNO (rs1
))
3554 || (rs2
&& !REGNO_OK_FOR_BASE_P (REGNO (rs2
))))
3559 if ((REGNO (rs1
) >= 32
3560 && REGNO (rs1
) != FRAME_POINTER_REGNUM
3561 && REGNO (rs1
) < FIRST_PSEUDO_REGISTER
)
3563 && (REGNO (rs2
) >= 32
3564 && REGNO (rs2
) != FRAME_POINTER_REGNUM
3565 && REGNO (rs2
) < FIRST_PSEUDO_REGISTER
)))
3571 /* Construct the SYMBOL_REF for the tls_get_offset function. */
3573 static GTY(()) rtx sparc_tls_symbol
;
3575 sparc_tls_get_addr (void)
3577 if (!sparc_tls_symbol
)
3578 sparc_tls_symbol
= gen_rtx_SYMBOL_REF (Pmode
, "__tls_get_addr");
3580 return sparc_tls_symbol
;
3584 sparc_tls_got (void)
3589 current_function_uses_pic_offset_table
= 1;
3590 return pic_offset_table_rtx
;
3593 if (!global_offset_table
)
3594 global_offset_table
= gen_rtx_SYMBOL_REF (Pmode
, "_GLOBAL_OFFSET_TABLE_");
3595 temp
= gen_reg_rtx (Pmode
);
3596 emit_move_insn (temp
, global_offset_table
);
3601 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
3602 this (thread-local) address. */
3605 legitimize_tls_address (rtx addr
)
3607 rtx temp1
, temp2
, temp3
, ret
, o0
, got
, insn
;
3612 if (GET_CODE (addr
) == SYMBOL_REF
)
3613 switch (SYMBOL_REF_TLS_MODEL (addr
))
3615 case TLS_MODEL_GLOBAL_DYNAMIC
:
3617 temp1
= gen_reg_rtx (SImode
);
3618 temp2
= gen_reg_rtx (SImode
);
3619 ret
= gen_reg_rtx (Pmode
);
3620 o0
= gen_rtx_REG (Pmode
, 8);
3621 got
= sparc_tls_got ();
3622 emit_insn (gen_tgd_hi22 (temp1
, addr
));
3623 emit_insn (gen_tgd_lo10 (temp2
, temp1
, addr
));
3626 emit_insn (gen_tgd_add32 (o0
, got
, temp2
, addr
));
3627 insn
= emit_call_insn (gen_tgd_call32 (o0
, sparc_tls_get_addr (),
3632 emit_insn (gen_tgd_add64 (o0
, got
, temp2
, addr
));
3633 insn
= emit_call_insn (gen_tgd_call64 (o0
, sparc_tls_get_addr (),
3636 CALL_INSN_FUNCTION_USAGE (insn
)
3637 = gen_rtx_EXPR_LIST (VOIDmode
, gen_rtx_USE (VOIDmode
, o0
),
3638 CALL_INSN_FUNCTION_USAGE (insn
));
3639 insn
= get_insns ();
3641 emit_libcall_block (insn
, ret
, o0
, addr
);
3644 case TLS_MODEL_LOCAL_DYNAMIC
:
3646 temp1
= gen_reg_rtx (SImode
);
3647 temp2
= gen_reg_rtx (SImode
);
3648 temp3
= gen_reg_rtx (Pmode
);
3649 ret
= gen_reg_rtx (Pmode
);
3650 o0
= gen_rtx_REG (Pmode
, 8);
3651 got
= sparc_tls_got ();
3652 emit_insn (gen_tldm_hi22 (temp1
));
3653 emit_insn (gen_tldm_lo10 (temp2
, temp1
));
3656 emit_insn (gen_tldm_add32 (o0
, got
, temp2
));
3657 insn
= emit_call_insn (gen_tldm_call32 (o0
, sparc_tls_get_addr (),
3662 emit_insn (gen_tldm_add64 (o0
, got
, temp2
));
3663 insn
= emit_call_insn (gen_tldm_call64 (o0
, sparc_tls_get_addr (),
3666 CALL_INSN_FUNCTION_USAGE (insn
)
3667 = gen_rtx_EXPR_LIST (VOIDmode
, gen_rtx_USE (VOIDmode
, o0
),
3668 CALL_INSN_FUNCTION_USAGE (insn
));
3669 insn
= get_insns ();
3671 emit_libcall_block (insn
, temp3
, o0
,
3672 gen_rtx_UNSPEC (Pmode
, gen_rtvec (1, const0_rtx
),
3673 UNSPEC_TLSLD_BASE
));
3674 temp1
= gen_reg_rtx (SImode
);
3675 temp2
= gen_reg_rtx (SImode
);
3676 emit_insn (gen_tldo_hix22 (temp1
, addr
));
3677 emit_insn (gen_tldo_lox10 (temp2
, temp1
, addr
));
3679 emit_insn (gen_tldo_add32 (ret
, temp3
, temp2
, addr
));
3681 emit_insn (gen_tldo_add64 (ret
, temp3
, temp2
, addr
));
3684 case TLS_MODEL_INITIAL_EXEC
:
3685 temp1
= gen_reg_rtx (SImode
);
3686 temp2
= gen_reg_rtx (SImode
);
3687 temp3
= gen_reg_rtx (Pmode
);
3688 got
= sparc_tls_got ();
3689 emit_insn (gen_tie_hi22 (temp1
, addr
));
3690 emit_insn (gen_tie_lo10 (temp2
, temp1
, addr
));
3692 emit_insn (gen_tie_ld32 (temp3
, got
, temp2
, addr
));
3694 emit_insn (gen_tie_ld64 (temp3
, got
, temp2
, addr
));
3697 ret
= gen_reg_rtx (Pmode
);
3699 emit_insn (gen_tie_add32 (ret
, gen_rtx_REG (Pmode
, 7),
3702 emit_insn (gen_tie_add64 (ret
, gen_rtx_REG (Pmode
, 7),
3706 ret
= gen_rtx_PLUS (Pmode
, gen_rtx_REG (Pmode
, 7), temp3
);
3709 case TLS_MODEL_LOCAL_EXEC
:
3710 temp1
= gen_reg_rtx (Pmode
);
3711 temp2
= gen_reg_rtx (Pmode
);
3714 emit_insn (gen_tle_hix22_sp32 (temp1
, addr
));
3715 emit_insn (gen_tle_lox10_sp32 (temp2
, temp1
, addr
));
3719 emit_insn (gen_tle_hix22_sp64 (temp1
, addr
));
3720 emit_insn (gen_tle_lox10_sp64 (temp2
, temp1
, addr
));
3722 ret
= gen_rtx_PLUS (Pmode
, gen_rtx_REG (Pmode
, 7), temp2
);
3730 abort (); /* for now ... */
3736 /* Legitimize PIC addresses. If the address is already position-independent,
3737 we return ORIG. Newly generated position-independent addresses go into a
3738 reg. This is REG if nonzero, otherwise we allocate register(s) as
3742 legitimize_pic_address (rtx orig
, enum machine_mode mode ATTRIBUTE_UNUSED
,
3745 if (GET_CODE (orig
) == SYMBOL_REF
)
3747 rtx pic_ref
, address
;
3752 if (reload_in_progress
|| reload_completed
)
3755 reg
= gen_reg_rtx (Pmode
);
3760 /* If not during reload, allocate another temp reg here for loading
3761 in the address, so that these instructions can be optimized
3763 rtx temp_reg
= ((reload_in_progress
|| reload_completed
)
3764 ? reg
: gen_reg_rtx (Pmode
));
3766 /* Must put the SYMBOL_REF inside an UNSPEC here so that cse
3767 won't get confused into thinking that these two instructions
3768 are loading in the true address of the symbol. If in the
3769 future a PIC rtx exists, that should be used instead. */
3770 if (Pmode
== SImode
)
3772 emit_insn (gen_movsi_high_pic (temp_reg
, orig
));
3773 emit_insn (gen_movsi_lo_sum_pic (temp_reg
, temp_reg
, orig
));
3777 emit_insn (gen_movdi_high_pic (temp_reg
, orig
));
3778 emit_insn (gen_movdi_lo_sum_pic (temp_reg
, temp_reg
, orig
));
3785 pic_ref
= gen_rtx_MEM (Pmode
,
3786 gen_rtx_PLUS (Pmode
,
3787 pic_offset_table_rtx
, address
));
3788 current_function_uses_pic_offset_table
= 1;
3789 RTX_UNCHANGING_P (pic_ref
) = 1;
3790 insn
= emit_move_insn (reg
, pic_ref
);
3791 /* Put a REG_EQUAL note on this insn, so that it can be optimized
3793 REG_NOTES (insn
) = gen_rtx_EXPR_LIST (REG_EQUAL
, orig
,
3797 else if (GET_CODE (orig
) == CONST
)
3801 if (GET_CODE (XEXP (orig
, 0)) == PLUS
3802 && XEXP (XEXP (orig
, 0), 0) == pic_offset_table_rtx
)
3807 if (reload_in_progress
|| reload_completed
)
3810 reg
= gen_reg_rtx (Pmode
);
3813 if (GET_CODE (XEXP (orig
, 0)) == PLUS
)
3815 base
= legitimize_pic_address (XEXP (XEXP (orig
, 0), 0), Pmode
, reg
);
3816 offset
= legitimize_pic_address (XEXP (XEXP (orig
, 0), 1), Pmode
,
3817 base
== reg
? 0 : reg
);
3822 if (GET_CODE (offset
) == CONST_INT
)
3824 if (SMALL_INT (offset
))
3825 return plus_constant (base
, INTVAL (offset
));
3826 else if (! reload_in_progress
&& ! reload_completed
)
3827 offset
= force_reg (Pmode
, offset
);
3829 /* If we reach here, then something is seriously wrong. */
3832 return gen_rtx_PLUS (Pmode
, base
, offset
);
3834 else if (GET_CODE (orig
) == LABEL_REF
)
3835 /* ??? Why do we do this? */
3836 /* Now movsi_pic_label_ref uses it, but we ought to be checking that
3837 the register is live instead, in case it is eliminated. */
3838 current_function_uses_pic_offset_table
= 1;
3843 /* Try machine-dependent ways of modifying an illegitimate address X
3844 to be legitimate. If we find one, return the new, valid address.
3846 OLDX is the address as it was before break_out_memory_refs was called.
3847 In some cases it is useful to look at this to decide what needs to be done.
3849 MODE is the mode of the operand pointed to by X. */
3852 legitimize_address (rtx x
, rtx oldx ATTRIBUTE_UNUSED
, enum machine_mode mode
)
3856 if (GET_CODE (x
) == PLUS
&& GET_CODE (XEXP (x
, 0)) == MULT
)
3857 x
= gen_rtx_PLUS (Pmode
, XEXP (x
, 1),
3858 force_operand (XEXP (x
, 0), NULL_RTX
));
3859 if (GET_CODE (x
) == PLUS
&& GET_CODE (XEXP (x
, 1)) == MULT
)
3860 x
= gen_rtx_PLUS (Pmode
, XEXP (x
, 0),
3861 force_operand (XEXP (x
, 1), NULL_RTX
));
3862 if (GET_CODE (x
) == PLUS
&& GET_CODE (XEXP (x
, 0)) == PLUS
)
3863 x
= gen_rtx_PLUS (Pmode
, force_operand (XEXP (x
, 0), NULL_RTX
),
3865 if (GET_CODE (x
) == PLUS
&& GET_CODE (XEXP (x
, 1)) == PLUS
)
3866 x
= gen_rtx_PLUS (Pmode
, XEXP (x
, 0),
3867 force_operand (XEXP (x
, 1), NULL_RTX
));
3869 if (x
!= orig_x
&& legitimate_address_p (mode
, x
, FALSE
))
3872 if (tls_symbolic_operand (x
))
3873 x
= legitimize_tls_address (x
);
3875 x
= legitimize_pic_address (x
, mode
, 0);
3876 else if (GET_CODE (x
) == PLUS
&& CONSTANT_ADDRESS_P (XEXP (x
, 1)))
3877 x
= gen_rtx_PLUS (Pmode
, XEXP (x
, 0),
3878 copy_to_mode_reg (Pmode
, XEXP (x
, 1)));
3879 else if (GET_CODE (x
) == PLUS
&& CONSTANT_ADDRESS_P (XEXP (x
, 0)))
3880 x
= gen_rtx_PLUS (Pmode
, XEXP (x
, 1),
3881 copy_to_mode_reg (Pmode
, XEXP (x
, 0)));
3882 else if (GET_CODE (x
) == SYMBOL_REF
3883 || GET_CODE (x
) == CONST
3884 || GET_CODE (x
) == LABEL_REF
)
3885 x
= copy_to_suggested_reg (x
, NULL_RTX
, Pmode
);
3889 /* Emit the special PIC prologue. */
3892 load_pic_register (void)
3894 int orig_flag_pic
= flag_pic
;
3896 /* If we haven't emitted the special helper function, do so now. */
3897 if (add_pc_to_pic_symbol_name
[0] == 0)
3899 const char *pic_name
= reg_names
[REGNO (pic_offset_table_rtx
)];
3902 ASM_GENERATE_INTERNAL_LABEL (add_pc_to_pic_symbol_name
, "LADDPC", 0);
3905 align
= floor_log2 (FUNCTION_BOUNDARY
/ BITS_PER_UNIT
);
3907 ASM_OUTPUT_ALIGN (asm_out_file
, align
);
3908 ASM_OUTPUT_LABEL (asm_out_file
, add_pc_to_pic_symbol_name
);
3909 if (flag_delayed_branch
)
3910 fprintf (asm_out_file
, "\tjmp %%o7+8\n\t add\t%%o7, %s, %s\n",
3911 pic_name
, pic_name
);
3913 fprintf (asm_out_file
, "\tadd\t%%o7, %s, %s\n\tjmp %%o7+8\n\t nop\n",
3914 pic_name
, pic_name
);
3917 /* Initialize every time through, since we can't easily
3918 know this to be permanent. */
3919 global_offset_table
= gen_rtx_SYMBOL_REF (Pmode
, "_GLOBAL_OFFSET_TABLE_");
3920 add_pc_to_pic_symbol
= gen_rtx_SYMBOL_REF (Pmode
, add_pc_to_pic_symbol_name
);
3923 emit_insn (gen_load_pcrel_sym (pic_offset_table_rtx
, global_offset_table
,
3924 add_pc_to_pic_symbol
));
3925 flag_pic
= orig_flag_pic
;
3927 /* Need to emit this whether or not we obey regdecls,
3928 since setjmp/longjmp can cause life info to screw up.
3929 ??? In the case where we don't obey regdecls, this is not sufficient
3930 since we may not fall out the bottom. */
3931 emit_insn (gen_rtx_USE (VOIDmode
, pic_offset_table_rtx
));
3934 /* Return 1 if RTX is a MEM which is known to be aligned to at
3935 least a DESIRED byte boundary. */
3938 mem_min_alignment (rtx mem
, int desired
)
3940 rtx addr
, base
, offset
;
3942 /* If it's not a MEM we can't accept it. */
3943 if (GET_CODE (mem
) != MEM
)
3946 addr
= XEXP (mem
, 0);
3947 base
= offset
= NULL_RTX
;
3948 if (GET_CODE (addr
) == PLUS
)
3950 if (GET_CODE (XEXP (addr
, 0)) == REG
)
3952 base
= XEXP (addr
, 0);
3954 /* What we are saying here is that if the base
3955 REG is aligned properly, the compiler will make
3956 sure any REG based index upon it will be so
3958 if (GET_CODE (XEXP (addr
, 1)) == CONST_INT
)
3959 offset
= XEXP (addr
, 1);
3961 offset
= const0_rtx
;
3964 else if (GET_CODE (addr
) == REG
)
3967 offset
= const0_rtx
;
3970 if (base
!= NULL_RTX
)
3972 int regno
= REGNO (base
);
3974 if (regno
!= HARD_FRAME_POINTER_REGNUM
&& regno
!= STACK_POINTER_REGNUM
)
3976 /* Check if the compiler has recorded some information
3977 about the alignment of the base REG. If reload has
3978 completed, we already matched with proper alignments.
3979 If not running global_alloc, reload might give us
3980 unaligned pointer to local stack though. */
3982 && REGNO_POINTER_ALIGN (regno
) >= desired
* BITS_PER_UNIT
)
3983 || (optimize
&& reload_completed
))
3984 && (INTVAL (offset
) & (desired
- 1)) == 0)
3989 if (((INTVAL (offset
) - SPARC_STACK_BIAS
) & (desired
- 1)) == 0)
3993 else if (! TARGET_UNALIGNED_DOUBLES
3994 || CONSTANT_P (addr
)
3995 || GET_CODE (addr
) == LO_SUM
)
3997 /* Anything else we know is properly aligned unless TARGET_UNALIGNED_DOUBLES
3998 is true, in which case we can only assume that an access is aligned if
3999 it is to a constant address, or the address involves a LO_SUM. */
4003 /* An obviously unaligned address. */
4008 /* Vectors to keep interesting information about registers where it can easily
4009 be got. We used to use the actual mode value as the bit number, but there
4010 are more than 32 modes now. Instead we use two tables: one indexed by
4011 hard register number, and one indexed by mode. */
4013 /* The purpose of sparc_mode_class is to shrink the range of modes so that
4014 they all fit (as bit numbers) in a 32 bit word (again). Each real mode is
4015 mapped into one sparc_mode_class mode. */
4017 enum sparc_mode_class
{
4018 S_MODE
, D_MODE
, T_MODE
, O_MODE
,
4019 SF_MODE
, DF_MODE
, TF_MODE
, OF_MODE
,
4023 /* Modes for single-word and smaller quantities. */
4024 #define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
4026 /* Modes for double-word and smaller quantities. */
4027 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
4029 /* Modes for quad-word and smaller quantities. */
4030 #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
4032 /* Modes for 8-word and smaller quantities. */
4033 #define O_MODES (T_MODES | (1 << (int) O_MODE) | (1 << (int) OF_MODE))
4035 /* Modes for single-float quantities. We must allow any single word or
4036 smaller quantity. This is because the fix/float conversion instructions
4037 take integer inputs/outputs from the float registers. */
4038 #define SF_MODES (S_MODES)
4040 /* Modes for double-float and smaller quantities. */
4041 #define DF_MODES (S_MODES | D_MODES)
4043 /* Modes for double-float only quantities. */
4044 #define DF_MODES_NO_S ((1 << (int) D_MODE) | (1 << (int) DF_MODE))
4046 /* Modes for quad-float only quantities. */
4047 #define TF_ONLY_MODES (1 << (int) TF_MODE)
4049 /* Modes for quad-float and smaller quantities. */
4050 #define TF_MODES (DF_MODES | TF_ONLY_MODES)
4052 /* Modes for quad-float and double-float quantities. */
4053 #define TF_MODES_NO_S (DF_MODES_NO_S | TF_ONLY_MODES)
4055 /* Modes for quad-float pair only quantities. */
4056 #define OF_ONLY_MODES (1 << (int) OF_MODE)
4058 /* Modes for quad-float pairs and smaller quantities. */
4059 #define OF_MODES (TF_MODES | OF_ONLY_MODES)
4061 #define OF_MODES_NO_S (TF_MODES_NO_S | OF_ONLY_MODES)
4063 /* Modes for condition codes. */
4064 #define CC_MODES (1 << (int) CC_MODE)
4065 #define CCFP_MODES (1 << (int) CCFP_MODE)
4067 /* Value is 1 if register/mode pair is acceptable on sparc.
4068 The funny mixture of D and T modes is because integer operations
4069 do not specially operate on tetra quantities, so non-quad-aligned
4070 registers can hold quadword quantities (except %o4 and %i4 because
4071 they cross fixed registers). */
4073 /* This points to either the 32 bit or the 64 bit version. */
4074 const int *hard_regno_mode_classes
;
4076 static const int hard_32bit_mode_classes
[] = {
4077 S_MODES
, S_MODES
, T_MODES
, S_MODES
, T_MODES
, S_MODES
, D_MODES
, S_MODES
,
4078 T_MODES
, S_MODES
, T_MODES
, S_MODES
, D_MODES
, S_MODES
, D_MODES
, S_MODES
,
4079 T_MODES
, S_MODES
, T_MODES
, S_MODES
, T_MODES
, S_MODES
, D_MODES
, S_MODES
,
4080 T_MODES
, S_MODES
, T_MODES
, S_MODES
, D_MODES
, S_MODES
, D_MODES
, S_MODES
,
4082 OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
, OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
,
4083 OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
, OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
,
4084 OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
, OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
,
4085 OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
, TF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
,
4087 /* FP regs f32 to f63. Only the even numbered registers actually exist,
4088 and none can hold SFmode/SImode values. */
4089 OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0, OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0,
4090 OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0, OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0,
4091 OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0, OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0,
4092 OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0, TF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0,
4095 CCFP_MODES
, CCFP_MODES
, CCFP_MODES
, CCFP_MODES
,
4101 static const int hard_64bit_mode_classes
[] = {
4102 D_MODES
, D_MODES
, T_MODES
, D_MODES
, T_MODES
, D_MODES
, T_MODES
, D_MODES
,
4103 O_MODES
, D_MODES
, T_MODES
, D_MODES
, T_MODES
, D_MODES
, T_MODES
, D_MODES
,
4104 T_MODES
, D_MODES
, T_MODES
, D_MODES
, T_MODES
, D_MODES
, T_MODES
, D_MODES
,
4105 O_MODES
, D_MODES
, T_MODES
, D_MODES
, T_MODES
, D_MODES
, T_MODES
, D_MODES
,
4107 OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
, OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
,
4108 OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
, OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
,
4109 OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
, OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
,
4110 OF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
, TF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
,
4112 /* FP regs f32 to f63. Only the even numbered registers actually exist,
4113 and none can hold SFmode/SImode values. */
4114 OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0, OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0,
4115 OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0, OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0,
4116 OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0, OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0,
4117 OF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0, TF_MODES_NO_S
, 0, DF_MODES_NO_S
, 0,
4120 CCFP_MODES
, CCFP_MODES
, CCFP_MODES
, CCFP_MODES
,
4126 int sparc_mode_class
[NUM_MACHINE_MODES
];
4128 enum reg_class sparc_regno_reg_class
[FIRST_PSEUDO_REGISTER
];
4131 sparc_init_modes (void)
4135 for (i
= 0; i
< NUM_MACHINE_MODES
; i
++)
4137 switch (GET_MODE_CLASS (i
))
4140 case MODE_PARTIAL_INT
:
4141 case MODE_COMPLEX_INT
:
4142 if (GET_MODE_SIZE (i
) <= 4)
4143 sparc_mode_class
[i
] = 1 << (int) S_MODE
;
4144 else if (GET_MODE_SIZE (i
) == 8)
4145 sparc_mode_class
[i
] = 1 << (int) D_MODE
;
4146 else if (GET_MODE_SIZE (i
) == 16)
4147 sparc_mode_class
[i
] = 1 << (int) T_MODE
;
4148 else if (GET_MODE_SIZE (i
) == 32)
4149 sparc_mode_class
[i
] = 1 << (int) O_MODE
;
4151 sparc_mode_class
[i
] = 0;
4154 case MODE_COMPLEX_FLOAT
:
4155 if (GET_MODE_SIZE (i
) <= 4)
4156 sparc_mode_class
[i
] = 1 << (int) SF_MODE
;
4157 else if (GET_MODE_SIZE (i
) == 8)
4158 sparc_mode_class
[i
] = 1 << (int) DF_MODE
;
4159 else if (GET_MODE_SIZE (i
) == 16)
4160 sparc_mode_class
[i
] = 1 << (int) TF_MODE
;
4161 else if (GET_MODE_SIZE (i
) == 32)
4162 sparc_mode_class
[i
] = 1 << (int) OF_MODE
;
4164 sparc_mode_class
[i
] = 0;
4167 if (i
== (int) CCFPmode
|| i
== (int) CCFPEmode
)
4168 sparc_mode_class
[i
] = 1 << (int) CCFP_MODE
;
4170 sparc_mode_class
[i
] = 1 << (int) CC_MODE
;
4173 sparc_mode_class
[i
] = 0;
4179 hard_regno_mode_classes
= hard_64bit_mode_classes
;
4181 hard_regno_mode_classes
= hard_32bit_mode_classes
;
4183 /* Initialize the array used by REGNO_REG_CLASS. */
4184 for (i
= 0; i
< FIRST_PSEUDO_REGISTER
; i
++)
4186 if (i
< 16 && TARGET_V8PLUS
)
4187 sparc_regno_reg_class
[i
] = I64_REGS
;
4188 else if (i
< 32 || i
== FRAME_POINTER_REGNUM
)
4189 sparc_regno_reg_class
[i
] = GENERAL_REGS
;
4191 sparc_regno_reg_class
[i
] = FP_REGS
;
4193 sparc_regno_reg_class
[i
] = EXTRA_FP_REGS
;
4195 sparc_regno_reg_class
[i
] = FPCC_REGS
;
4197 sparc_regno_reg_class
[i
] = NO_REGS
;
4201 /* Compute the frame size required by the function. This function is called
4202 during the reload pass and also by sparc_expand_prologue. */
4205 sparc_compute_frame_size (HOST_WIDE_INT size
, int leaf_function_p
)
4207 int outgoing_args_size
= (current_function_outgoing_args_size
4208 + REG_PARM_STACK_SPACE (current_function_decl
));
4209 int n_regs
= 0; /* N_REGS is the number of 4-byte regs saved thus far. */
4214 for (i
= 0; i
< 8; i
++)
4215 if (regs_ever_live
[i
] && ! call_used_regs
[i
])
4220 for (i
= 0; i
< 8; i
+= 2)
4221 if ((regs_ever_live
[i
] && ! call_used_regs
[i
])
4222 || (regs_ever_live
[i
+1] && ! call_used_regs
[i
+1]))
4226 for (i
= 32; i
< (TARGET_V9
? 96 : 64); i
+= 2)
4227 if ((regs_ever_live
[i
] && ! call_used_regs
[i
])
4228 || (regs_ever_live
[i
+1] && ! call_used_regs
[i
+1]))
4231 /* Set up values for use in prologue and epilogue. */
4232 num_gfregs
= n_regs
;
4237 && current_function_outgoing_args_size
== 0)
4238 actual_fsize
= apparent_fsize
= 0;
4241 /* We subtract STARTING_FRAME_OFFSET, remember it's negative. */
4242 apparent_fsize
= (size
- STARTING_FRAME_OFFSET
+ 7) & -8;
4243 apparent_fsize
+= n_regs
* 4;
4244 actual_fsize
= apparent_fsize
+ ((outgoing_args_size
+ 7) & -8);
4247 /* Make sure nothing can clobber our register windows.
4248 If a SAVE must be done, or there is a stack-local variable,
4249 the register window area must be allocated.
4250 ??? For v8 we apparently need an additional 8 bytes of reserved space. */
4251 if (! leaf_function_p
|| size
> 0)
4252 actual_fsize
+= (16 * UNITS_PER_WORD
) + (TARGET_ARCH64
? 0 : 8);
4254 return SPARC_STACK_ALIGN (actual_fsize
);
4257 /* Output any necessary .register pseudo-ops. */
4260 sparc_output_scratch_registers (FILE *file ATTRIBUTE_UNUSED
)
4262 #ifdef HAVE_AS_REGISTER_PSEUDO_OP
4268 /* Check if %g[2367] were used without
4269 .register being printed for them already. */
4270 for (i
= 2; i
< 8; i
++)
4272 if (regs_ever_live
[i
]
4273 && ! sparc_hard_reg_printed
[i
])
4275 sparc_hard_reg_printed
[i
] = 1;
4276 fprintf (file
, "\t.register\t%%g%d, #scratch\n", i
);
4283 /* Save/restore call-saved registers from LOW to HIGH at BASE+OFFSET
4284 as needed. LOW should be double-word aligned for 32-bit registers.
4285 Return the new OFFSET. */
4288 #define SORR_RESTORE 1
4291 save_or_restore_regs (int low
, int high
, rtx base
, int offset
, int action
)
4296 if (TARGET_ARCH64
&& high
<= 32)
4298 for (i
= low
; i
< high
; i
++)
4300 if (regs_ever_live
[i
] && ! call_used_regs
[i
])
4302 mem
= gen_rtx_MEM (DImode
, plus_constant (base
, offset
));
4303 set_mem_alias_set (mem
, sparc_sr_alias_set
);
4304 if (action
== SORR_SAVE
)
4306 insn
= emit_move_insn (mem
, gen_rtx_REG (DImode
, i
));
4307 RTX_FRAME_RELATED_P (insn
) = 1;
4309 else /* action == SORR_RESTORE */
4310 emit_move_insn (gen_rtx_REG (DImode
, i
), mem
);
4317 for (i
= low
; i
< high
; i
+= 2)
4319 bool reg0
= regs_ever_live
[i
] && ! call_used_regs
[i
];
4320 bool reg1
= regs_ever_live
[i
+1] && ! call_used_regs
[i
+1];
4321 enum machine_mode mode
;
4326 mode
= i
< 32 ? DImode
: DFmode
;
4331 mode
= i
< 32 ? SImode
: SFmode
;
4336 mode
= i
< 32 ? SImode
: SFmode
;
4343 mem
= gen_rtx_MEM (mode
, plus_constant (base
, offset
));
4344 set_mem_alias_set (mem
, sparc_sr_alias_set
);
4345 if (action
== SORR_SAVE
)
4347 insn
= emit_move_insn (mem
, gen_rtx_REG (mode
, regno
));
4348 RTX_FRAME_RELATED_P (insn
) = 1;
4350 else /* action == SORR_RESTORE */
4351 emit_move_insn (gen_rtx_REG (mode
, regno
), mem
);
4353 /* Always preserve double-word alignment. */
4354 offset
= (offset
+ 7) & -8;
4361 /* Emit code to save call-saved registers. */
4364 emit_save_regs (void)
4366 HOST_WIDE_INT offset
;
4369 offset
= frame_base_offset
- apparent_fsize
;
4371 if (offset
< -4096 || offset
+ num_gfregs
* 4 > 4096)
4373 /* ??? This might be optimized a little as %g1 might already have a
4374 value close enough that a single add insn will do. */
4375 /* ??? Although, all of this is probably only a temporary fix
4376 because if %g1 can hold a function result, then
4377 sparc_expand_epilogue will lose (the result will be
4379 base
= gen_rtx_REG (Pmode
, 1);
4380 emit_move_insn (base
, GEN_INT (offset
));
4381 emit_insn (gen_rtx_SET (VOIDmode
,
4383 gen_rtx_PLUS (Pmode
, frame_base_reg
, base
)));
4387 base
= frame_base_reg
;
4389 offset
= save_or_restore_regs (0, 8, base
, offset
, SORR_SAVE
);
4390 save_or_restore_regs (32, TARGET_V9
? 96 : 64, base
, offset
, SORR_SAVE
);
4393 /* Emit code to restore call-saved registers. */
4396 emit_restore_regs (void)
4398 HOST_WIDE_INT offset
;
4401 offset
= frame_base_offset
- apparent_fsize
;
4403 if (offset
< -4096 || offset
+ num_gfregs
* 4 > 4096 - 8 /*double*/)
4405 base
= gen_rtx_REG (Pmode
, 1);
4406 emit_move_insn (base
, GEN_INT (offset
));
4407 emit_insn (gen_rtx_SET (VOIDmode
,
4409 gen_rtx_PLUS (Pmode
, frame_base_reg
, base
)));
4413 base
= frame_base_reg
;
4415 offset
= save_or_restore_regs (0, 8, base
, offset
, SORR_RESTORE
);
4416 save_or_restore_regs (32, TARGET_V9
? 96 : 64, base
, offset
, SORR_RESTORE
);
4419 /* Emit an increment for the stack pointer. */
4422 emit_stack_pointer_increment (rtx increment
)
4425 emit_insn (gen_adddi3 (stack_pointer_rtx
, stack_pointer_rtx
, increment
));
4427 emit_insn (gen_addsi3 (stack_pointer_rtx
, stack_pointer_rtx
, increment
));
4430 /* Emit a decrement for the stack pointer. */
4433 emit_stack_pointer_decrement (rtx decrement
)
4436 emit_insn (gen_subdi3 (stack_pointer_rtx
, stack_pointer_rtx
, decrement
));
4438 emit_insn (gen_subsi3 (stack_pointer_rtx
, stack_pointer_rtx
, decrement
));
4441 /* Expand the function prologue. The prologue is responsible for reserving
4442 storage for the frame, saving the call-saved registers and loading the
4443 PIC register if needed. */
4446 sparc_expand_prologue (void)
4448 int leaf_function_p
= current_function_uses_only_leaf_regs
;
4450 /* Need to use actual_fsize, since we are also allocating
4451 space for our callee (and our own register save area). */
4452 actual_fsize
= sparc_compute_frame_size (get_frame_size(), leaf_function_p
);
4454 if (leaf_function_p
)
4456 frame_base_reg
= stack_pointer_rtx
;
4457 frame_base_offset
= actual_fsize
+ SPARC_STACK_BIAS
;
4461 frame_base_reg
= hard_frame_pointer_rtx
;
4462 frame_base_offset
= SPARC_STACK_BIAS
;
4465 if (actual_fsize
== 0)
4467 else if (leaf_function_p
)
4469 if (actual_fsize
<= 4096)
4470 emit_stack_pointer_increment (GEN_INT (- actual_fsize
));
4471 else if (actual_fsize
<= 8192)
4473 emit_stack_pointer_increment (GEN_INT (-4096));
4474 emit_stack_pointer_increment (GEN_INT (4096 - actual_fsize
));
4478 rtx reg
= gen_rtx_REG (Pmode
, 1);
4479 emit_move_insn (reg
, GEN_INT (-actual_fsize
));
4480 emit_stack_pointer_increment (reg
);
4485 if (actual_fsize
<= 4096)
4486 emit_insn (gen_save_register_window (GEN_INT (-actual_fsize
)));
4487 else if (actual_fsize
<= 8192)
4489 emit_insn (gen_save_register_window (GEN_INT (-4096)));
4490 emit_stack_pointer_increment (GEN_INT (4096 - actual_fsize
));
4494 rtx reg
= gen_rtx_REG (Pmode
, 1);
4495 emit_move_insn (reg
, GEN_INT (-actual_fsize
));
4496 emit_insn (gen_save_register_window (reg
));
4500 /* Call-saved registers are saved just above the outgoing argument area. */
4504 /* Load the PIC register if needed. */
4505 if (flag_pic
&& current_function_uses_pic_offset_table
)
4506 load_pic_register ();
4509 /* This function generates the assembly code for function entry, which boils
4510 down to emitting the necessary .register directives. It also informs the
4511 DWARF-2 back-end on the layout of the frame.
4513 ??? Historical cruft: "On SPARC, move-double insns between fpu and cpu need
4514 an 8-byte block of memory. If any fpu reg is used in the function, we
4515 allocate such a block here, at the bottom of the frame, just in case it's
4516 needed." Could this explain the -8 in emit_restore_regs? */
4519 sparc_asm_function_prologue (FILE *file
, HOST_WIDE_INT size ATTRIBUTE_UNUSED
)
4521 int leaf_function_p
= current_function_uses_only_leaf_regs
;
4523 sparc_output_scratch_registers (file
);
4525 if (dwarf2out_do_frame () && actual_fsize
)
4527 char *label
= dwarf2out_cfi_label ();
4529 /* The canonical frame address refers to the top of the frame. */
4530 dwarf2out_def_cfa (label
,
4532 ? STACK_POINTER_REGNUM
4533 : HARD_FRAME_POINTER_REGNUM
,
4536 if (! leaf_function_p
)
4538 /* Note the register window save. This tells the unwinder that
4539 it needs to restore the window registers from the previous
4540 frame's window save area at 0(cfa). */
4541 dwarf2out_window_save (label
);
4543 /* The return address (-8) is now in %i7. */
4544 dwarf2out_return_reg (label
, 31);
4549 /* Expand the function epilogue, either normal or part of a sibcall.
4550 We emit all the instructions except the return or the call. */
4553 sparc_expand_epilogue (void)
4555 int leaf_function_p
= current_function_uses_only_leaf_regs
;
4558 emit_restore_regs ();
4560 if (actual_fsize
== 0)
4562 else if (leaf_function_p
)
4564 if (actual_fsize
<= 4096)
4565 emit_stack_pointer_decrement (GEN_INT (- actual_fsize
));
4566 else if (actual_fsize
<= 8192)
4568 emit_stack_pointer_decrement (GEN_INT (-4096));
4569 emit_stack_pointer_decrement (GEN_INT (4096 - actual_fsize
));
4573 rtx reg
= gen_rtx_REG (Pmode
, 1);
4574 emit_move_insn (reg
, GEN_INT (-actual_fsize
));
4575 emit_stack_pointer_decrement (reg
);
4580 /* This function generates the assembly code for function exit. */
4583 sparc_asm_function_epilogue (FILE *file
, HOST_WIDE_INT size ATTRIBUTE_UNUSED
)
4585 /* If code does not drop into the epilogue, we have to still output
4586 a dummy nop for the sake of sane backtraces. Otherwise, if the
4587 last two instructions of a function were "call foo; dslot;" this
4588 can make the return PC of foo (ie. address of call instruction
4589 plus 8) point to the first instruction in the next function. */
4591 rtx insn
, last_real_insn
;
4593 insn
= get_last_insn ();
4595 last_real_insn
= prev_real_insn (insn
);
4597 && GET_CODE (last_real_insn
) == INSN
4598 && GET_CODE (PATTERN (last_real_insn
)) == SEQUENCE
)
4599 last_real_insn
= XVECEXP (PATTERN (last_real_insn
), 0, 0);
4601 if (last_real_insn
&& GET_CODE (last_real_insn
) == CALL_INSN
)
4602 fputs("\tnop\n", file
);
4604 sparc_output_deferred_case_vectors ();
4607 /* Output a 'restore' instruction. */
4610 output_restore (rtx pat
)
4616 fputs ("\t restore\n", asm_out_file
);
4620 if (GET_CODE (pat
) != SET
)
4623 operands
[0] = SET_DEST (pat
);
4624 pat
= SET_SRC (pat
);
4626 switch (GET_CODE (pat
))
4629 operands
[1] = XEXP (pat
, 0);
4630 operands
[2] = XEXP (pat
, 1);
4631 output_asm_insn (" restore %r1, %2, %Y0", operands
);
4634 operands
[1] = XEXP (pat
, 0);
4635 operands
[2] = XEXP (pat
, 1);
4636 output_asm_insn (" restore %r1, %%lo(%a2), %Y0", operands
);
4639 operands
[1] = XEXP (pat
, 0);
4640 if (XEXP (pat
, 1) != const1_rtx
)
4642 output_asm_insn (" restore %r1, %r1, %Y0", operands
);
4646 output_asm_insn (" restore %%g0, %1, %Y0", operands
);
4651 /* Output a return. */
4654 output_return (rtx insn
)
4656 int leaf_function_p
= current_function_uses_only_leaf_regs
;
4657 bool delay_slot_filled_p
= dbr_sequence_length () > 0;
4658 /* True if the caller has placed an "unimp" insn immediately after the call.
4659 This insn is used in the 32-bit ABI when calling a function that returns
4660 a non zero-sized structure. The 64-bit ABI doesn't have it. Be careful
4661 to have this test be the same as that used on the call. */
4662 bool sparc_skip_caller_unimp
4664 && current_function_returns_struct
4665 && (TREE_CODE (DECL_SIZE (DECL_RESULT (current_function_decl
)))
4667 && ! integer_zerop (DECL_SIZE (DECL_RESULT (current_function_decl
)));
4669 if (leaf_function_p
)
4671 /* This is a leaf function so we don't have to bother restoring the
4672 register window, which frees us from dealing with the convoluted
4673 semantics of restore/return. We simply output the jump to the
4674 return address and the insn in the delay slot, which usually is
4675 the substraction restoring the stack pointer %sp. */
4677 if (current_function_calls_eh_return
)
4680 fprintf (asm_out_file
, "\tjmp\t%%o7+%d\n", sparc_skip_caller_unimp
? 12 : 8);
4682 if (delay_slot_filled_p
)
4684 rtx delay
= NEXT_INSN (insn
);
4688 final_scan_insn (delay
, asm_out_file
, 1, 0, 1, NULL
);
4689 PATTERN (delay
) = gen_blockage ();
4690 INSN_CODE (delay
) = -1;
4693 fputs ("\t nop\n", asm_out_file
);
4697 /* This is a regular function so we have to restore the register window.
4698 We may have a pending insn for the delay slot, which will be either
4699 combined with the 'restore' instruction or put in the delay slot of
4700 the 'return' instruction. */
4702 if (current_function_calls_eh_return
)
4704 /* If the function uses __builtin_eh_return, the eh_return
4705 machinery occupies the delay slot. */
4706 if (delay_slot_filled_p
|| sparc_skip_caller_unimp
)
4709 if (! flag_delayed_branch
)
4710 fputs ("\tadd\t%fp, %g1, %fp\n", asm_out_file
);
4713 fputs ("\treturn\t%i7+8\n", asm_out_file
);
4715 fputs ("\trestore\n\tjmp\t%o7+8\n", asm_out_file
);
4717 if (flag_delayed_branch
)
4718 fputs ("\t add\t%sp, %g1, %sp\n", asm_out_file
);
4720 fputs ("\t nop\n", asm_out_file
);
4722 else if (delay_slot_filled_p
)
4726 delay
= NEXT_INSN (insn
);
4730 pat
= PATTERN (delay
);
4732 if (TARGET_V9
&& ! epilogue_renumber (&pat
, 1))
4734 epilogue_renumber (&pat
, 0);
4735 fprintf (asm_out_file
, "\treturn\t%%i7+%d\n",
4736 sparc_skip_caller_unimp
? 12 : 8);
4737 final_scan_insn (delay
, asm_out_file
, 1, 0, 1, NULL
);
4741 fprintf (asm_out_file
, "\tjmp\t%%i7+%d\n",
4742 sparc_skip_caller_unimp
? 12 : 8);
4743 output_restore (pat
);
4746 PATTERN (delay
) = gen_blockage ();
4747 INSN_CODE (delay
) = -1;
4751 /* The delay slot is empty. */
4753 fprintf (asm_out_file
, "\treturn\t%%i7+%d\n\t nop\n",
4754 sparc_skip_caller_unimp
? 12 : 8);
4755 else if (flag_delayed_branch
)
4756 fprintf (asm_out_file
, "\tjmp\t%%i7+%d\n\t restore\n",
4757 sparc_skip_caller_unimp
? 12 : 8);
4759 fprintf (asm_out_file
, "\trestore\n\tjmp\t%%o7+%d\n\t nop\n",
4760 sparc_skip_caller_unimp
? 12 : 8);
4767 /* Output a sibling call. */
4770 output_sibcall (rtx insn
, rtx call_operand
)
4772 int leaf_function_p
= current_function_uses_only_leaf_regs
;
4773 bool delay_slot_filled_p
= dbr_sequence_length () > 0;
4776 if (! flag_delayed_branch
)
4779 operands
[0] = call_operand
;
4781 if (leaf_function_p
)
4783 /* This is a leaf function so we don't have to bother restoring the
4784 register window. We simply output the jump to the function and
4785 the insn in the delay slot (if any). */
4787 if (LEAF_SIBCALL_SLOT_RESERVED_P
&& delay_slot_filled_p
)
4790 if (delay_slot_filled_p
)
4792 rtx delay
= NEXT_INSN (insn
);
4796 output_asm_insn ("sethi\t%%hi(%a0), %%g1", operands
);
4797 output_asm_insn ("jmp\t%%g1 + %%lo(%a0)", operands
);
4798 final_scan_insn (delay
, asm_out_file
, 1, 0, 1, NULL
);
4800 PATTERN (delay
) = gen_blockage ();
4801 INSN_CODE (delay
) = -1;
4805 /* Use or with rs2 %%g0 instead of mov, so that as/ld can optimize
4806 it into branch if possible. */
4807 output_asm_insn ("or\t%%o7, %%g0, %%g1", operands
);
4808 output_asm_insn ("call\t%a0, 0", operands
);
4809 output_asm_insn (" or\t%%g1, %%g0, %%o7", operands
);
4814 /* This is a regular function so we have to restore the register window.
4815 We may have a pending insn for the delay slot, which will be combined
4816 with the 'restore' instruction. */
4818 output_asm_insn ("call\t%a0, 0", operands
);
4820 if (delay_slot_filled_p
)
4822 rtx delay
= NEXT_INSN (insn
);
4826 output_restore (PATTERN (delay
));
4828 PATTERN (delay
) = gen_blockage ();
4829 INSN_CODE (delay
) = -1;
4832 output_restore (NULL_RTX
);
4838 /* Functions for handling argument passing.
4840 For 32-bit, the first 6 args are normally in registers and the rest are
4841 pushed. Any arg that starts within the first 6 words is at least
4842 partially passed in a register unless its data type forbids.
4844 For 64-bit, the argument registers are laid out as an array of 16 elements
4845 and arguments are added sequentially. The first 6 int args and up to the
4846 first 16 fp args (depending on size) are passed in regs.
4848 Slot Stack Integral Float Float in structure Double Long Double
4849 ---- ----- -------- ----- ------------------ ------ -----------
4850 15 [SP+248] %f31 %f30,%f31 %d30
4851 14 [SP+240] %f29 %f28,%f29 %d28 %q28
4852 13 [SP+232] %f27 %f26,%f27 %d26
4853 12 [SP+224] %f25 %f24,%f25 %d24 %q24
4854 11 [SP+216] %f23 %f22,%f23 %d22
4855 10 [SP+208] %f21 %f20,%f21 %d20 %q20
4856 9 [SP+200] %f19 %f18,%f19 %d18
4857 8 [SP+192] %f17 %f16,%f17 %d16 %q16
4858 7 [SP+184] %f15 %f14,%f15 %d14
4859 6 [SP+176] %f13 %f12,%f13 %d12 %q12
4860 5 [SP+168] %o5 %f11 %f10,%f11 %d10
4861 4 [SP+160] %o4 %f9 %f8,%f9 %d8 %q8
4862 3 [SP+152] %o3 %f7 %f6,%f7 %d6
4863 2 [SP+144] %o2 %f5 %f4,%f5 %d4 %q4
4864 1 [SP+136] %o1 %f3 %f2,%f3 %d2
4865 0 [SP+128] %o0 %f1 %f0,%f1 %d0 %q0
4867 Here SP = %sp if -mno-stack-bias or %sp+stack_bias otherwise.
4869 Integral arguments are always passed as 64-bit quantities appropriately
4872 Passing of floating point values is handled as follows.
4873 If a prototype is in scope:
4874 If the value is in a named argument (i.e. not a stdarg function or a
4875 value not part of the `...') then the value is passed in the appropriate
4877 If the value is part of the `...' and is passed in one of the first 6
4878 slots then the value is passed in the appropriate int reg.
4879 If the value is part of the `...' and is not passed in one of the first 6
4880 slots then the value is passed in memory.
4881 If a prototype is not in scope:
4882 If the value is one of the first 6 arguments the value is passed in the
4883 appropriate integer reg and the appropriate fp reg.
4884 If the value is not one of the first 6 arguments the value is passed in
4885 the appropriate fp reg and in memory.
4888 Summary of the calling conventions implemented by GCC on SPARC:
4891 size argument return value
4893 small integer <4 int. reg. int. reg.
4894 word 4 int. reg. int. reg.
4895 double word 8 int. reg. int. reg.
4897 _Complex small integer <8 int. reg. int. reg.
4898 _Complex word 8 int. reg. int. reg.
4899 _Complex double word 16 memory int. reg.
4901 vector integer <=8 int. reg. FP reg.
4902 vector integer >8 memory memory
4904 float 4 int. reg. FP reg.
4905 double 8 int. reg. FP reg.
4906 long double 16 memory memory
4908 _Complex float 8 memory FP reg.
4909 _Complex double 16 memory FP reg.
4910 _Complex long double 32 memory FP reg.
4912 vector float <=32 memory FP reg.
4913 vector float >32 memory memory
4915 aggregate any memory memory
4920 size argument return value
4922 small integer <8 int. reg. int. reg.
4923 word 8 int. reg. int. reg.
4924 double word 16 int. reg. int. reg.
4926 _Complex small integer <16 int. reg. int. reg.
4927 _Complex word 16 int. reg. int. reg.
4928 _Complex double word 32 memory int. reg.
4930 vector integer <=16 FP reg. FP reg.
4931 vector integer 16<s<=32 memory FP reg.
4932 vector integer >32 memory memory
4934 float 4 FP reg. FP reg.
4935 double 8 FP reg. FP reg.
4936 long double 16 FP reg. FP reg.
4938 _Complex float 8 FP reg. FP reg.
4939 _Complex double 16 FP reg. FP reg.
4940 _Complex long double 32 memory FP reg.
4942 vector float <=16 FP reg. FP reg.
4943 vector float 16<s<=32 memory FP reg.
4944 vector float >32 memory memory
4946 aggregate <=16 reg. reg.
4947 aggregate 16<s<=32 memory reg.
4948 aggregate >32 memory memory
4952 Note #1: complex floating-point types follow the extended SPARC ABIs as
4953 implemented by the Sun compiler.
4955 Note #2: integral vector types follow the scalar floating-point types
4956 conventions to match what is implemented by the Sun VIS SDK.
4958 Note #3: floating-point vector types follow the complex floating-point
4959 types conventions. */
4962 /* Maximum number of int regs for args. */
4963 #define SPARC_INT_ARG_MAX 6
4964 /* Maximum number of fp regs for args. */
4965 #define SPARC_FP_ARG_MAX 16
4967 #define ROUND_ADVANCE(SIZE) (((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
4969 /* Handle the INIT_CUMULATIVE_ARGS macro.
4970 Initialize a variable CUM of type CUMULATIVE_ARGS
4971 for a call to a function whose data type is FNTYPE.
4972 For a library call, FNTYPE is 0. */
4975 init_cumulative_args (struct sparc_args
*cum
, tree fntype
,
4976 rtx libname ATTRIBUTE_UNUSED
,
4977 tree fndecl ATTRIBUTE_UNUSED
)
4980 cum
->prototype_p
= fntype
&& TYPE_ARG_TYPES (fntype
);
4981 cum
->libcall_p
= fntype
== 0;
4984 /* Handle the TARGET_PROMOTE_PROTOTYPES target hook.
4985 When a prototype says `char' or `short', really pass an `int'. */
4988 sparc_promote_prototypes (tree fntype ATTRIBUTE_UNUSED
)
4990 return TARGET_ARCH32
? true : false;
4993 /* Handle the TARGET_STRICT_ARGUMENT_NAMING target hook. */
4996 sparc_strict_argument_naming (CUMULATIVE_ARGS
*ca ATTRIBUTE_UNUSED
)
4998 return TARGET_ARCH64
? true : false;
5001 /* Scan the record type TYPE and return the following predicates:
5002 - INTREGS_P: the record contains at least one field or sub-field
5003 that is eligible for promotion in integer registers.
5004 - FP_REGS_P: the record contains at least one field or sub-field
5005 that is eligible for promotion in floating-point registers.
5006 - PACKED_P: the record contains at least one field that is packed.
5008 Sub-fields are not taken into account for the PACKED_P predicate. */
5011 scan_record_type (tree type
, int *intregs_p
, int *fpregs_p
, int *packed_p
)
5015 for (field
= TYPE_FIELDS (type
); field
; field
= TREE_CHAIN (field
))
5017 if (TREE_CODE (field
) == FIELD_DECL
)
5019 if (TREE_CODE (TREE_TYPE (field
)) == RECORD_TYPE
)
5020 scan_record_type (TREE_TYPE (field
), intregs_p
, fpregs_p
, 0);
5021 else if (FLOAT_TYPE_P (TREE_TYPE (field
)) && TARGET_FPU
)
5026 if (packed_p
&& DECL_PACKED (field
))
5032 /* Compute the slot number to pass an argument in.
5033 Return the slot number or -1 if passing on the stack.
5035 CUM is a variable of type CUMULATIVE_ARGS which gives info about
5036 the preceding args and about the function being called.
5037 MODE is the argument's machine mode.
5038 TYPE is the data type of the argument (as a tree).
5039 This is null for libcalls where that information may
5041 NAMED is nonzero if this argument is a named parameter
5042 (otherwise it is an extra parameter matching an ellipsis).
5043 INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG.
5044 *PREGNO records the register number to use if scalar type.
5045 *PPADDING records the amount of padding needed in words. */
5048 function_arg_slotno (const struct sparc_args
*cum
, enum machine_mode mode
,
5049 tree type
, int named
, int incoming_p
,
5050 int *pregno
, int *ppadding
)
5052 int regbase
= (incoming_p
5053 ? SPARC_INCOMING_INT_ARG_FIRST
5054 : SPARC_OUTGOING_INT_ARG_FIRST
);
5055 int slotno
= cum
->words
;
5060 if (type
&& TREE_ADDRESSABLE (type
))
5066 && TYPE_ALIGN (type
) % PARM_BOUNDARY
!= 0)
5069 /* For SPARC64, objects requiring 16-byte alignment get it. */
5071 && GET_MODE_ALIGNMENT (mode
) >= 2 * BITS_PER_WORD
5072 && (slotno
& 1) != 0)
5073 slotno
++, *ppadding
= 1;
5075 switch (GET_MODE_CLASS (mode
))
5078 case MODE_COMPLEX_FLOAT
:
5079 case MODE_VECTOR_INT
:
5080 case MODE_VECTOR_FLOAT
:
5081 if (TARGET_ARCH64
&& TARGET_FPU
&& named
)
5083 if (slotno
>= SPARC_FP_ARG_MAX
)
5085 regno
= SPARC_FP_ARG_FIRST
+ slotno
* 2;
5086 /* Arguments filling only one single FP register are
5087 right-justified in the outer double FP register. */
5088 if (GET_MODE_SIZE (mode
) <= 4)
5095 case MODE_COMPLEX_INT
:
5096 if (slotno
>= SPARC_INT_ARG_MAX
)
5098 regno
= regbase
+ slotno
;
5102 if (mode
== VOIDmode
)
5103 /* MODE is VOIDmode when generating the actual call. */
5106 if (mode
!= BLKmode
)
5109 /* For SPARC64, objects requiring 16-byte alignment get it. */
5112 && TYPE_ALIGN (type
) >= 2 * BITS_PER_WORD
5113 && (slotno
& 1) != 0)
5114 slotno
++, *ppadding
= 1;
5116 if (TARGET_ARCH32
|| (type
&& TREE_CODE (type
) == UNION_TYPE
))
5118 if (slotno
>= SPARC_INT_ARG_MAX
)
5120 regno
= regbase
+ slotno
;
5122 else /* TARGET_ARCH64 && type && TREE_CODE (type) == RECORD_TYPE */
5124 int intregs_p
= 0, fpregs_p
= 0, packed_p
= 0;
5126 /* First see what kinds of registers we would need. */
5127 scan_record_type (type
, &intregs_p
, &fpregs_p
, &packed_p
);
5129 /* The ABI obviously doesn't specify how packed structures
5130 are passed. These are defined to be passed in int regs
5131 if possible, otherwise memory. */
5132 if (packed_p
|| !named
)
5133 fpregs_p
= 0, intregs_p
= 1;
5135 /* If all arg slots are filled, then must pass on stack. */
5136 if (fpregs_p
&& slotno
>= SPARC_FP_ARG_MAX
)
5139 /* If there are only int args and all int arg slots are filled,
5140 then must pass on stack. */
5141 if (!fpregs_p
&& intregs_p
&& slotno
>= SPARC_INT_ARG_MAX
)
5144 /* Note that even if all int arg slots are filled, fp members may
5145 still be passed in regs if such regs are available.
5146 *PREGNO isn't set because there may be more than one, it's up
5147 to the caller to compute them. */
5160 /* Handle recursive register counting for structure field layout. */
5162 struct function_arg_record_value_parms
5164 rtx ret
; /* return expression being built. */
5165 int slotno
; /* slot number of the argument. */
5166 int named
; /* whether the argument is named. */
5167 int regbase
; /* regno of the base register. */
5168 int stack
; /* 1 if part of the argument is on the stack. */
5169 int intoffset
; /* offset of the first pending integer field. */
5170 unsigned int nregs
; /* number of words passed in registers. */
5173 static void function_arg_record_value_3
5174 (HOST_WIDE_INT
, struct function_arg_record_value_parms
*);
5175 static void function_arg_record_value_2
5176 (tree
, HOST_WIDE_INT
, struct function_arg_record_value_parms
*, bool);
5177 static void function_arg_record_value_1
5178 (tree
, HOST_WIDE_INT
, struct function_arg_record_value_parms
*, bool);
5179 static rtx
function_arg_record_value (tree
, enum machine_mode
, int, int, int);
5180 static rtx
function_arg_union_value (int, enum machine_mode
, int);
5182 /* A subroutine of function_arg_record_value. Traverse the structure
5183 recursively and determine how many registers will be required. */
5186 function_arg_record_value_1 (tree type
, HOST_WIDE_INT startbitpos
,
5187 struct function_arg_record_value_parms
*parms
,
5192 /* We need to compute how many registers are needed so we can
5193 allocate the PARALLEL but before we can do that we need to know
5194 whether there are any packed fields. The ABI obviously doesn't
5195 specify how structures are passed in this case, so they are
5196 defined to be passed in int regs if possible, otherwise memory,
5197 regardless of whether there are fp values present. */
5200 for (field
= TYPE_FIELDS (type
); field
; field
= TREE_CHAIN (field
))
5202 if (TREE_CODE (field
) == FIELD_DECL
&& DECL_PACKED (field
))
5209 /* Compute how many registers we need. */
5210 for (field
= TYPE_FIELDS (type
); field
; field
= TREE_CHAIN (field
))
5212 if (TREE_CODE (field
) == FIELD_DECL
)
5214 HOST_WIDE_INT bitpos
= startbitpos
;
5216 if (DECL_SIZE (field
) != 0
5217 && host_integerp (bit_position (field
), 1))
5218 bitpos
+= int_bit_position (field
);
5220 /* ??? FIXME: else assume zero offset. */
5222 if (TREE_CODE (TREE_TYPE (field
)) == RECORD_TYPE
)
5223 function_arg_record_value_1 (TREE_TYPE (field
),
5227 else if ((FLOAT_TYPE_P (TREE_TYPE (field
))
5228 || TREE_CODE (TREE_TYPE (field
)) == VECTOR_TYPE
)
5233 if (parms
->intoffset
!= -1)
5235 unsigned int startbit
, endbit
;
5236 int intslots
, this_slotno
;
5238 startbit
= parms
->intoffset
& -BITS_PER_WORD
;
5239 endbit
= (bitpos
+ BITS_PER_WORD
- 1) & -BITS_PER_WORD
;
5241 intslots
= (endbit
- startbit
) / BITS_PER_WORD
;
5242 this_slotno
= parms
->slotno
+ parms
->intoffset
5245 if (intslots
> 0 && intslots
> SPARC_INT_ARG_MAX
- this_slotno
)
5247 intslots
= MAX (0, SPARC_INT_ARG_MAX
- this_slotno
);
5248 /* We need to pass this field on the stack. */
5252 parms
->nregs
+= intslots
;
5253 parms
->intoffset
= -1;
5256 /* There's no need to check this_slotno < SPARC_FP_ARG MAX.
5257 If it wasn't true we wouldn't be here. */
5259 if (TREE_CODE (TREE_TYPE (field
)) == COMPLEX_TYPE
)
5264 if (parms
->intoffset
== -1)
5265 parms
->intoffset
= bitpos
;
5271 /* A subroutine of function_arg_record_value. Assign the bits of the
5272 structure between parms->intoffset and bitpos to integer registers. */
5275 function_arg_record_value_3 (HOST_WIDE_INT bitpos
,
5276 struct function_arg_record_value_parms
*parms
)
5278 enum machine_mode mode
;
5280 unsigned int startbit
, endbit
;
5281 int this_slotno
, intslots
, intoffset
;
5284 if (parms
->intoffset
== -1)
5287 intoffset
= parms
->intoffset
;
5288 parms
->intoffset
= -1;
5290 startbit
= intoffset
& -BITS_PER_WORD
;
5291 endbit
= (bitpos
+ BITS_PER_WORD
- 1) & -BITS_PER_WORD
;
5292 intslots
= (endbit
- startbit
) / BITS_PER_WORD
;
5293 this_slotno
= parms
->slotno
+ intoffset
/ BITS_PER_WORD
;
5295 intslots
= MIN (intslots
, SPARC_INT_ARG_MAX
- this_slotno
);
5299 /* If this is the trailing part of a word, only load that much into
5300 the register. Otherwise load the whole register. Note that in
5301 the latter case we may pick up unwanted bits. It's not a problem
5302 at the moment but may wish to revisit. */
5304 if (intoffset
% BITS_PER_WORD
!= 0)
5305 mode
= mode_for_size (BITS_PER_WORD
- intoffset
% BITS_PER_WORD
,
5310 intoffset
/= BITS_PER_UNIT
;
5313 regno
= parms
->regbase
+ this_slotno
;
5314 reg
= gen_rtx_REG (mode
, regno
);
5315 XVECEXP (parms
->ret
, 0, parms
->stack
+ parms
->nregs
)
5316 = gen_rtx_EXPR_LIST (VOIDmode
, reg
, GEN_INT (intoffset
));
5319 intoffset
= (intoffset
| (UNITS_PER_WORD
-1)) + 1;
5324 while (intslots
> 0);
5327 /* A subroutine of function_arg_record_value. Traverse the structure
5328 recursively and assign bits to floating point registers. Track which
5329 bits in between need integer registers; invoke function_arg_record_value_3
5330 to make that happen. */
5333 function_arg_record_value_2 (tree type
, HOST_WIDE_INT startbitpos
,
5334 struct function_arg_record_value_parms
*parms
,
5340 for (field
= TYPE_FIELDS (type
); field
; field
= TREE_CHAIN (field
))
5342 if (TREE_CODE (field
) == FIELD_DECL
&& DECL_PACKED (field
))
5349 for (field
= TYPE_FIELDS (type
); field
; field
= TREE_CHAIN (field
))
5351 if (TREE_CODE (field
) == FIELD_DECL
)
5353 HOST_WIDE_INT bitpos
= startbitpos
;
5355 if (DECL_SIZE (field
) != 0
5356 && host_integerp (bit_position (field
), 1))
5357 bitpos
+= int_bit_position (field
);
5359 /* ??? FIXME: else assume zero offset. */
5361 if (TREE_CODE (TREE_TYPE (field
)) == RECORD_TYPE
)
5362 function_arg_record_value_2 (TREE_TYPE (field
),
5366 else if ((FLOAT_TYPE_P (TREE_TYPE (field
))
5367 || TREE_CODE (TREE_TYPE (field
)) == VECTOR_TYPE
)
5372 int this_slotno
= parms
->slotno
+ bitpos
/ BITS_PER_WORD
;
5374 enum machine_mode mode
= DECL_MODE (field
);
5377 function_arg_record_value_3 (bitpos
, parms
);
5380 case SCmode
: mode
= SFmode
; break;
5381 case DCmode
: mode
= DFmode
; break;
5382 case TCmode
: mode
= TFmode
; break;
5385 regno
= SPARC_FP_ARG_FIRST
+ this_slotno
* 2;
5386 if (GET_MODE_SIZE (mode
) <= 4 && (bitpos
& 32) != 0)
5388 reg
= gen_rtx_REG (mode
, regno
);
5389 XVECEXP (parms
->ret
, 0, parms
->stack
+ parms
->nregs
)
5390 = gen_rtx_EXPR_LIST (VOIDmode
, reg
,
5391 GEN_INT (bitpos
/ BITS_PER_UNIT
));
5393 if (TREE_CODE (TREE_TYPE (field
)) == COMPLEX_TYPE
)
5395 regno
+= GET_MODE_SIZE (mode
) / 4;
5396 reg
= gen_rtx_REG (mode
, regno
);
5397 XVECEXP (parms
->ret
, 0, parms
->stack
+ parms
->nregs
)
5398 = gen_rtx_EXPR_LIST (VOIDmode
, reg
,
5399 GEN_INT ((bitpos
+ GET_MODE_BITSIZE (mode
))
5406 if (parms
->intoffset
== -1)
5407 parms
->intoffset
= bitpos
;
5413 /* Used by function_arg and function_value to implement the complex
5414 conventions of the 64-bit ABI for passing and returning structures.
5415 Return an expression valid as a return value for the two macros
5416 FUNCTION_ARG and FUNCTION_VALUE.
5418 TYPE is the data type of the argument (as a tree).
5419 This is null for libcalls where that information may
5421 MODE is the argument's machine mode.
5422 SLOTNO is the index number of the argument's slot in the parameter array.
5423 NAMED is nonzero if this argument is a named parameter
5424 (otherwise it is an extra parameter matching an ellipsis).
5425 REGBASE is the regno of the base register for the parameter array. */
5428 function_arg_record_value (tree type
, enum machine_mode mode
,
5429 int slotno
, int named
, int regbase
)
5431 HOST_WIDE_INT typesize
= int_size_in_bytes (type
);
5432 struct function_arg_record_value_parms parms
;
5435 parms
.ret
= NULL_RTX
;
5436 parms
.slotno
= slotno
;
5437 parms
.named
= named
;
5438 parms
.regbase
= regbase
;
5441 /* Compute how many registers we need. */
5443 parms
.intoffset
= 0;
5444 function_arg_record_value_1 (type
, 0, &parms
, false);
5446 /* Take into account pending integer fields. */
5447 if (parms
.intoffset
!= -1)
5449 unsigned int startbit
, endbit
;
5450 int intslots
, this_slotno
;
5452 startbit
= parms
.intoffset
& -BITS_PER_WORD
;
5453 endbit
= (typesize
*BITS_PER_UNIT
+ BITS_PER_WORD
- 1) & -BITS_PER_WORD
;
5454 intslots
= (endbit
- startbit
) / BITS_PER_WORD
;
5455 this_slotno
= slotno
+ parms
.intoffset
/ BITS_PER_WORD
;
5457 if (intslots
> 0 && intslots
> SPARC_INT_ARG_MAX
- this_slotno
)
5459 intslots
= MAX (0, SPARC_INT_ARG_MAX
- this_slotno
);
5460 /* We need to pass this field on the stack. */
5464 parms
.nregs
+= intslots
;
5466 nregs
= parms
.nregs
;
5468 /* Allocate the vector and handle some annoying special cases. */
5471 /* ??? Empty structure has no value? Duh? */
5474 /* Though there's nothing really to store, return a word register
5475 anyway so the rest of gcc doesn't go nuts. Returning a PARALLEL
5476 leads to breakage due to the fact that there are zero bytes to
5478 return gen_rtx_REG (mode
, regbase
);
5482 /* ??? C++ has structures with no fields, and yet a size. Give up
5483 for now and pass everything back in integer registers. */
5484 nregs
= (typesize
+ UNITS_PER_WORD
- 1) / UNITS_PER_WORD
;
5486 if (nregs
+ slotno
> SPARC_INT_ARG_MAX
)
5487 nregs
= SPARC_INT_ARG_MAX
- slotno
;
5492 parms
.ret
= gen_rtx_PARALLEL (mode
, rtvec_alloc (parms
.stack
+ nregs
));
5494 /* If at least one field must be passed on the stack, generate
5495 (parallel [(expr_list (nil) ...) ...]) so that all fields will
5496 also be passed on the stack. We can't do much better because the
5497 semantics of FUNCTION_ARG_PARTIAL_NREGS doesn't handle the case
5498 of structures for which the fields passed exclusively in registers
5499 are not at the beginning of the structure. */
5501 XVECEXP (parms
.ret
, 0, 0)
5502 = gen_rtx_EXPR_LIST (VOIDmode
, NULL_RTX
, const0_rtx
);
5504 /* Fill in the entries. */
5506 parms
.intoffset
= 0;
5507 function_arg_record_value_2 (type
, 0, &parms
, false);
5508 function_arg_record_value_3 (typesize
* BITS_PER_UNIT
, &parms
);
5510 if (parms
.nregs
!= nregs
)
5516 /* Used by function_arg and function_value to implement the conventions
5517 of the 64-bit ABI for passing and returning unions.
5518 Return an expression valid as a return value for the two macros
5519 FUNCTION_ARG and FUNCTION_VALUE.
5521 SIZE is the size in bytes of the union.
5522 MODE is the argument's machine mode.
5523 REGNO is the hard register the union will be passed in. */
5526 function_arg_union_value (int size
, enum machine_mode mode
, int regno
)
5528 int nwords
= ROUND_ADVANCE (size
), i
;
5531 /* Unions are passed left-justified. */
5532 regs
= gen_rtx_PARALLEL (mode
, rtvec_alloc (nwords
));
5534 for (i
= 0; i
< nwords
; i
++)
5535 XVECEXP (regs
, 0, i
)
5536 = gen_rtx_EXPR_LIST (VOIDmode
,
5537 gen_rtx_REG (word_mode
, regno
+ i
),
5538 GEN_INT (UNITS_PER_WORD
* i
));
5543 /* Handle the FUNCTION_ARG macro.
5544 Determine where to put an argument to a function.
5545 Value is zero to push the argument on the stack,
5546 or a hard register in which to store the argument.
5548 CUM is a variable of type CUMULATIVE_ARGS which gives info about
5549 the preceding args and about the function being called.
5550 MODE is the argument's machine mode.
5551 TYPE is the data type of the argument (as a tree).
5552 This is null for libcalls where that information may
5554 NAMED is nonzero if this argument is a named parameter
5555 (otherwise it is an extra parameter matching an ellipsis).
5556 INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG. */
5559 function_arg (const struct sparc_args
*cum
, enum machine_mode mode
,
5560 tree type
, int named
, int incoming_p
)
5562 int regbase
= (incoming_p
5563 ? SPARC_INCOMING_INT_ARG_FIRST
5564 : SPARC_OUTGOING_INT_ARG_FIRST
);
5565 int slotno
, regno
, padding
;
5568 slotno
= function_arg_slotno (cum
, mode
, type
, named
, incoming_p
,
5576 reg
= gen_rtx_REG (mode
, regno
);
5580 if (type
&& TREE_CODE (type
) == RECORD_TYPE
)
5582 /* Structures up to 16 bytes in size are passed in arg slots on the
5583 stack and are promoted to registers where possible. */
5585 if (int_size_in_bytes (type
) > 16)
5586 abort (); /* shouldn't get here */
5588 return function_arg_record_value (type
, mode
, slotno
, named
, regbase
);
5590 else if (type
&& TREE_CODE (type
) == UNION_TYPE
)
5592 HOST_WIDE_INT size
= int_size_in_bytes (type
);
5595 abort (); /* shouldn't get here */
5597 return function_arg_union_value (size
, mode
, regno
);
5599 /* v9 fp args in reg slots beyond the int reg slots get passed in regs
5600 but also have the slot allocated for them.
5601 If no prototype is in scope fp values in register slots get passed
5602 in two places, either fp regs and int regs or fp regs and memory. */
5603 else if ((GET_MODE_CLASS (mode
) == MODE_FLOAT
5604 || GET_MODE_CLASS (mode
) == MODE_COMPLEX_FLOAT
5605 || GET_MODE_CLASS (mode
) == MODE_VECTOR_INT
5606 || GET_MODE_CLASS (mode
) == MODE_VECTOR_FLOAT
)
5607 && SPARC_FP_REG_P (regno
))
5609 reg
= gen_rtx_REG (mode
, regno
);
5610 if (cum
->prototype_p
|| cum
->libcall_p
)
5612 /* "* 2" because fp reg numbers are recorded in 4 byte
5615 /* ??? This will cause the value to be passed in the fp reg and
5616 in the stack. When a prototype exists we want to pass the
5617 value in the reg but reserve space on the stack. That's an
5618 optimization, and is deferred [for a bit]. */
5619 if ((regno
- SPARC_FP_ARG_FIRST
) >= SPARC_INT_ARG_MAX
* 2)
5620 return gen_rtx_PARALLEL (mode
,
5622 gen_rtx_EXPR_LIST (VOIDmode
,
5623 NULL_RTX
, const0_rtx
),
5624 gen_rtx_EXPR_LIST (VOIDmode
,
5628 /* ??? It seems that passing back a register even when past
5629 the area declared by REG_PARM_STACK_SPACE will allocate
5630 space appropriately, and will not copy the data onto the
5631 stack, exactly as we desire.
5633 This is due to locate_and_pad_parm being called in
5634 expand_call whenever reg_parm_stack_space > 0, which
5635 while beneficial to our example here, would seem to be
5636 in error from what had been intended. Ho hum... -- r~ */
5644 if ((regno
- SPARC_FP_ARG_FIRST
) < SPARC_INT_ARG_MAX
* 2)
5648 /* On incoming, we don't need to know that the value
5649 is passed in %f0 and %i0, and it confuses other parts
5650 causing needless spillage even on the simplest cases. */
5654 intreg
= (SPARC_OUTGOING_INT_ARG_FIRST
5655 + (regno
- SPARC_FP_ARG_FIRST
) / 2);
5657 v0
= gen_rtx_EXPR_LIST (VOIDmode
, reg
, const0_rtx
);
5658 v1
= gen_rtx_EXPR_LIST (VOIDmode
, gen_rtx_REG (mode
, intreg
),
5660 return gen_rtx_PARALLEL (mode
, gen_rtvec (2, v0
, v1
));
5664 v0
= gen_rtx_EXPR_LIST (VOIDmode
, NULL_RTX
, const0_rtx
);
5665 v1
= gen_rtx_EXPR_LIST (VOIDmode
, reg
, const0_rtx
);
5666 return gen_rtx_PARALLEL (mode
, gen_rtvec (2, v0
, v1
));
5672 /* Scalar or complex int. */
5673 reg
= gen_rtx_REG (mode
, regno
);
5679 /* Handle the FUNCTION_ARG_PARTIAL_NREGS macro.
5680 For an arg passed partly in registers and partly in memory,
5681 this is the number of registers used.
5682 For args passed entirely in registers or entirely in memory, zero.
5684 Any arg that starts in the first 6 regs but won't entirely fit in them
5685 needs partial registers on v8. On v9, structures with integer
5686 values in arg slots 5,6 will be passed in %o5 and SP+176, and complex fp
5687 values that begin in the last fp reg [where "last fp reg" varies with the
5688 mode] will be split between that reg and memory. */
5691 function_arg_partial_nregs (const struct sparc_args
*cum
,
5692 enum machine_mode mode
, tree type
, int named
)
5694 int slotno
, regno
, padding
;
5696 /* We pass 0 for incoming_p here, it doesn't matter. */
5697 slotno
= function_arg_slotno (cum
, mode
, type
, named
, 0, ®no
, &padding
);
5704 if ((slotno
+ (mode
== BLKmode
5705 ? ROUND_ADVANCE (int_size_in_bytes (type
))
5706 : ROUND_ADVANCE (GET_MODE_SIZE (mode
))))
5707 > SPARC_INT_ARG_MAX
)
5708 return SPARC_INT_ARG_MAX
- slotno
;
5712 /* We are guaranteed by pass_by_reference that the size of the
5713 argument is not greater than 16 bytes, so we only need to
5714 return 1 if the argument is partially passed in registers. */
5716 if (type
&& AGGREGATE_TYPE_P (type
))
5718 int size
= int_size_in_bytes (type
);
5720 if (size
> UNITS_PER_WORD
5721 && slotno
== SPARC_INT_ARG_MAX
- 1)
5724 else if (GET_MODE_CLASS (mode
) == MODE_COMPLEX_INT
5725 || (GET_MODE_CLASS (mode
) == MODE_COMPLEX_FLOAT
5726 && ! (TARGET_FPU
&& named
)))
5728 /* The complex types are passed as packed types. */
5729 if (GET_MODE_SIZE (mode
) > UNITS_PER_WORD
5730 && slotno
== SPARC_INT_ARG_MAX
- 1)
5733 else if (GET_MODE_CLASS (mode
) == MODE_COMPLEX_FLOAT
)
5735 if ((slotno
+ GET_MODE_SIZE (mode
) / UNITS_PER_WORD
)
5744 /* Return true if the argument should be passed by reference.
5745 !v9: The SPARC ABI stipulates passing struct arguments (of any size) and
5746 quad-precision floats by invisible reference.
5747 v9: Aggregates greater than 16 bytes are passed by reference.
5748 For Pascal, also pass arrays by reference. */
5751 sparc_pass_by_reference (CUMULATIVE_ARGS
*cum ATTRIBUTE_UNUSED
,
5752 enum machine_mode mode
, tree type
,
5753 bool named ATTRIBUTE_UNUSED
)
5757 return ((type
&& AGGREGATE_TYPE_P (type
))
5758 /* Extended ABI (as implemented by the Sun compiler) says
5759 that all complex floats are passed in memory. */
5761 /* Enforce the 2-word cap for passing arguments in registers.
5762 This affects CDImode, TFmode, DCmode, TCmode and large
5764 || GET_MODE_SIZE (mode
) > 8);
5768 return ((type
&& TREE_CODE (type
) == ARRAY_TYPE
)
5770 && AGGREGATE_TYPE_P (type
)
5771 && (unsigned HOST_WIDE_INT
) int_size_in_bytes (type
) > 16)
5772 /* Enforce the 2-word cap for passing arguments in registers.
5773 This affects CTImode, TCmode and large vector modes. */
5774 || GET_MODE_SIZE (mode
) > 16);
5778 /* Handle the FUNCTION_ARG_ADVANCE macro.
5779 Update the data in CUM to advance over an argument
5780 of mode MODE and data type TYPE.
5781 TYPE is null for libcalls where that information may not be available. */
5784 function_arg_advance (struct sparc_args
*cum
, enum machine_mode mode
,
5785 tree type
, int named
)
5787 int slotno
, regno
, padding
;
5789 /* We pass 0 for incoming_p here, it doesn't matter. */
5790 slotno
= function_arg_slotno (cum
, mode
, type
, named
, 0, ®no
, &padding
);
5792 /* If register required leading padding, add it. */
5794 cum
->words
+= padding
;
5798 cum
->words
+= (mode
!= BLKmode
5799 ? ROUND_ADVANCE (GET_MODE_SIZE (mode
))
5800 : ROUND_ADVANCE (int_size_in_bytes (type
)));
5804 if (type
&& AGGREGATE_TYPE_P (type
))
5806 int size
= int_size_in_bytes (type
);
5810 else if (size
<= 16)
5812 else /* passed by reference */
5817 cum
->words
+= (mode
!= BLKmode
5818 ? ROUND_ADVANCE (GET_MODE_SIZE (mode
))
5819 : ROUND_ADVANCE (int_size_in_bytes (type
)));
5824 /* Handle the FUNCTION_ARG_PADDING macro.
5825 For the 64 bit ABI structs are always stored left shifted in their
5829 function_arg_padding (enum machine_mode mode
, tree type
)
5831 if (TARGET_ARCH64
&& type
!= 0 && AGGREGATE_TYPE_P (type
))
5834 /* Fall back to the default. */
5835 return DEFAULT_FUNCTION_ARG_PADDING (mode
, type
);
5838 /* Handle the TARGET_RETURN_IN_MEMORY target hook.
5839 Specify whether to return the return value in memory. */
5842 sparc_return_in_memory (tree type
, tree fntype ATTRIBUTE_UNUSED
)
5845 /* Original SPARC 32-bit ABI says that quad-precision floats
5846 and all structures are returned in memory. Extended ABI
5847 (as implemented by the Sun compiler) says that all complex
5848 floats are returned in registers (8 FP registers at most
5849 for '_Complex long double'). Return all complex integers
5850 in registers (4 at most for '_Complex long long'). */
5851 return (TYPE_MODE (type
) == BLKmode
5852 || TYPE_MODE (type
) == TFmode
5853 /* Integral vector types follow the scalar FP types conventions. */
5854 || (GET_MODE_CLASS (TYPE_MODE (type
)) == MODE_VECTOR_INT
5855 && GET_MODE_SIZE (TYPE_MODE (type
)) > 8)
5856 /* FP vector types follow the complex FP types conventions. */
5857 || (GET_MODE_CLASS (TYPE_MODE (type
)) == MODE_VECTOR_FLOAT
5858 && GET_MODE_SIZE (TYPE_MODE (type
)) > 32));
5860 /* Original SPARC 64-bit ABI says that structures and unions
5861 smaller than 32 bytes are returned in registers. Extended
5862 ABI (as implemented by the Sun compiler) says that all complex
5863 floats are returned in registers (8 FP registers at most
5864 for '_Complex long double'). Return all complex integers
5865 in registers (4 at most for '_Complex TItype'). */
5866 return ((TYPE_MODE (type
) == BLKmode
5867 && (unsigned HOST_WIDE_INT
) int_size_in_bytes (type
) > 32)
5868 || GET_MODE_SIZE (TYPE_MODE (type
)) > 32);
5871 /* Handle the TARGET_STRUCT_VALUE target hook.
5872 Return where to find the structure return value address. */
5875 sparc_struct_value_rtx (tree fndecl ATTRIBUTE_UNUSED
, int incoming
)
5882 return gen_rtx_MEM (Pmode
, plus_constant (frame_pointer_rtx
,
5883 STRUCT_VALUE_OFFSET
));
5885 return gen_rtx_MEM (Pmode
, plus_constant (stack_pointer_rtx
,
5886 STRUCT_VALUE_OFFSET
));
5890 /* Handle FUNCTION_VALUE, FUNCTION_OUTGOING_VALUE, and LIBCALL_VALUE macros.
5891 For v9, function return values are subject to the same rules as arguments,
5892 except that up to 32 bytes may be returned in registers. */
5895 function_value (tree type
, enum machine_mode mode
, int incoming_p
)
5897 /* Beware that the two values are swapped here wrt function_arg. */
5898 int regbase
= (incoming_p
5899 ? SPARC_OUTGOING_INT_ARG_FIRST
5900 : SPARC_INCOMING_INT_ARG_FIRST
);
5903 if (TARGET_ARCH64
&& type
)
5905 if (TREE_CODE (type
) == RECORD_TYPE
)
5907 /* Structures up to 32 bytes in size are passed in registers,
5908 promoted to fp registers where possible. */
5910 if (int_size_in_bytes (type
) > 32)
5911 abort (); /* shouldn't get here */
5913 return function_arg_record_value (type
, mode
, 0, 1, regbase
);
5915 else if (TREE_CODE (type
) == UNION_TYPE
)
5917 HOST_WIDE_INT size
= int_size_in_bytes (type
);
5920 abort (); /* shouldn't get here */
5922 return function_arg_union_value (size
, mode
, regbase
);
5924 else if (AGGREGATE_TYPE_P (type
))
5926 /* All other aggregate types are passed in an integer register
5927 in a mode corresponding to the size of the type. */
5928 HOST_WIDE_INT bytes
= int_size_in_bytes (type
);
5931 abort (); /* shouldn't get here */
5933 mode
= mode_for_size (bytes
* BITS_PER_UNIT
, MODE_INT
, 0);
5935 /* ??? We probably should have made the same ABI change in
5936 3.4.0 as the one we made for unions. The latter was
5937 required by the SCD though, while the former is not
5938 specified, so we favored compatibility and efficiency.
5940 Now we're stuck for aggregates larger than 16 bytes,
5941 because OImode vanished in the meantime. Let's not
5942 try to be unduly clever, and simply follow the ABI
5943 for unions in that case. */
5944 if (mode
== BLKmode
)
5945 return function_arg_union_value (bytes
, mode
, regbase
);
5947 else if (GET_MODE_CLASS (mode
) == MODE_INT
5948 && GET_MODE_SIZE (mode
) < UNITS_PER_WORD
)
5952 if (TARGET_FPU
&& (FLOAT_MODE_P (mode
) || VECTOR_MODE_P (mode
)))
5953 regno
= SPARC_FP_ARG_FIRST
;
5957 return gen_rtx_REG (mode
, regno
);
5960 /* Do what is necessary for `va_start'. We look at the current function
5961 to determine if stdarg or varargs is used and return the address of
5962 the first unnamed parameter. */
5965 sparc_builtin_saveregs (void)
5967 int first_reg
= current_function_args_info
.words
;
5971 for (regno
= first_reg
; regno
< SPARC_INT_ARG_MAX
; regno
++)
5972 emit_move_insn (gen_rtx_MEM (word_mode
,
5973 gen_rtx_PLUS (Pmode
,
5975 GEN_INT (FIRST_PARM_OFFSET (0)
5978 gen_rtx_REG (word_mode
,
5979 SPARC_INCOMING_INT_ARG_FIRST
+ regno
));
5981 address
= gen_rtx_PLUS (Pmode
,
5983 GEN_INT (FIRST_PARM_OFFSET (0)
5984 + UNITS_PER_WORD
* first_reg
));
5989 /* Implement `va_start' for stdarg. */
5992 sparc_va_start (tree valist
, rtx nextarg
)
5994 nextarg
= expand_builtin_saveregs ();
5995 std_expand_builtin_va_start (valist
, nextarg
);
5998 /* Implement `va_arg' for stdarg. */
6001 sparc_gimplify_va_arg (tree valist
, tree type
, tree
*pre_p
, tree
*post_p
)
6003 HOST_WIDE_INT size
, rsize
, align
;
6006 tree ptrtype
= build_pointer_type (type
);
6008 if (pass_by_reference (NULL
, TYPE_MODE (type
), type
, 0))
6011 size
= rsize
= UNITS_PER_WORD
;
6017 size
= int_size_in_bytes (type
);
6018 rsize
= (size
+ UNITS_PER_WORD
- 1) & -UNITS_PER_WORD
;
6023 /* For SPARC64, objects requiring 16-byte alignment get it. */
6024 if (TYPE_ALIGN (type
) >= 2 * (unsigned) BITS_PER_WORD
)
6025 align
= 2 * UNITS_PER_WORD
;
6027 /* SPARC-V9 ABI states that structures up to 16 bytes in size
6028 are given whole slots as needed. */
6029 if (AGGREGATE_TYPE_P (type
))
6032 size
= rsize
= UNITS_PER_WORD
;
6042 incr
= fold (build2 (PLUS_EXPR
, ptr_type_node
, incr
,
6043 ssize_int (align
- 1)));
6044 incr
= fold (build2 (BIT_AND_EXPR
, ptr_type_node
, incr
,
6045 ssize_int (-align
)));
6048 gimplify_expr (&incr
, pre_p
, post_p
, is_gimple_val
, fb_rvalue
);
6051 if (BYTES_BIG_ENDIAN
&& size
< rsize
)
6052 addr
= fold (build2 (PLUS_EXPR
, ptr_type_node
, incr
,
6053 ssize_int (rsize
- size
)));
6057 addr
= fold_convert (build_pointer_type (ptrtype
), addr
);
6058 addr
= build_fold_indirect_ref (addr
);
6060 /* If the address isn't aligned properly for the type,
6061 we may need to copy to a temporary.
6062 FIXME: This is inefficient. Usually we can do this
6065 && TYPE_ALIGN (type
) > BITS_PER_WORD
)
6067 tree tmp
= create_tmp_var (type
, "va_arg_tmp");
6068 tree dest_addr
= build_fold_addr_expr (tmp
);
6070 tree copy
= build_function_call_expr
6071 (implicit_built_in_decls
[BUILT_IN_MEMCPY
],
6072 tree_cons (NULL_TREE
, dest_addr
,
6073 tree_cons (NULL_TREE
, addr
,
6074 tree_cons (NULL_TREE
, size_int (rsize
),
6077 gimplify_and_add (copy
, pre_p
);
6081 addr
= fold_convert (ptrtype
, addr
);
6083 incr
= fold (build2 (PLUS_EXPR
, ptr_type_node
, incr
, ssize_int (rsize
)));
6084 incr
= build2 (MODIFY_EXPR
, ptr_type_node
, valist
, incr
);
6085 gimplify_and_add (incr
, post_p
);
6087 return build_fold_indirect_ref (addr
);
6090 /* Return the string to output an unconditional branch to LABEL, which is
6091 the operand number of the label.
6093 DEST is the destination insn (i.e. the label), INSN is the source. */
6096 output_ubranch (rtx dest
, int label
, rtx insn
)
6098 static char string
[64];
6102 /* TurboSPARC is reported to have problems with
6105 i.e. an empty loop with the annul bit set. The workaround is to use
6109 if (! TARGET_V9
&& flag_delayed_branch
6110 && (INSN_ADDRESSES (INSN_UID (dest
))
6111 == INSN_ADDRESSES (INSN_UID (insn
))))
6113 strcpy (string
, "b\t");
6118 bool v9_form
= false;
6120 if (TARGET_V9
&& INSN_ADDRESSES_SET_P ())
6122 int delta
= (INSN_ADDRESSES (INSN_UID (dest
))
6123 - INSN_ADDRESSES (INSN_UID (insn
)));
6124 /* Leave some instructions for "slop". */
6125 if (delta
>= -260000 && delta
< 260000)
6130 strcpy (string
, "ba%*,pt\t%%xcc, ");
6132 strcpy (string
, "b%*\t");
6135 p
= strchr (string
, '\0');
6149 /* Return the string to output a conditional branch to LABEL, which is
6150 the operand number of the label. OP is the conditional expression.
6151 XEXP (OP, 0) is assumed to be a condition code register (integer or
6152 floating point) and its mode specifies what kind of comparison we made.
6154 DEST is the destination insn (i.e. the label), INSN is the source.
6156 REVERSED is nonzero if we should reverse the sense of the comparison.
6158 ANNUL is nonzero if we should generate an annulling branch.
6160 NOOP is nonzero if we have to follow this branch by a noop. */
6163 output_cbranch (rtx op
, rtx dest
, int label
, int reversed
, int annul
,
6166 static char string
[64];
6167 enum rtx_code code
= GET_CODE (op
);
6168 rtx cc_reg
= XEXP (op
, 0);
6169 enum machine_mode mode
= GET_MODE (cc_reg
);
6170 const char *labelno
, *branch
;
6171 int spaces
= 8, far
;
6174 /* v9 branches are limited to +-1MB. If it is too far away,
6187 fbne,a,pn %fcc2, .LC29
6195 far
= TARGET_V9
&& (get_attr_length (insn
) >= 3);
6198 /* Reversal of FP compares takes care -- an ordered compare
6199 becomes an unordered compare and vice versa. */
6200 if (mode
== CCFPmode
|| mode
== CCFPEmode
)
6201 code
= reverse_condition_maybe_unordered (code
);
6203 code
= reverse_condition (code
);
6206 /* Start by writing the branch condition. */
6207 if (mode
== CCFPmode
|| mode
== CCFPEmode
)
6258 /* ??? !v9: FP branches cannot be preceded by another floating point
6259 insn. Because there is currently no concept of pre-delay slots,
6260 we can fix this only by always emitting a nop before a floating
6265 strcpy (string
, "nop\n\t");
6266 strcat (string
, branch
);
6279 if (mode
== CC_NOOVmode
|| mode
== CCX_NOOVmode
)
6291 if (mode
== CC_NOOVmode
|| mode
== CCX_NOOVmode
)
6312 strcpy (string
, branch
);
6314 spaces
-= strlen (branch
);
6315 p
= strchr (string
, '\0');
6317 /* Now add the annulling, the label, and a possible noop. */
6330 if (! far
&& insn
&& INSN_ADDRESSES_SET_P ())
6332 int delta
= (INSN_ADDRESSES (INSN_UID (dest
))
6333 - INSN_ADDRESSES (INSN_UID (insn
)));
6334 /* Leave some instructions for "slop". */
6335 if (delta
< -260000 || delta
>= 260000)
6339 if (mode
== CCFPmode
|| mode
== CCFPEmode
)
6341 static char v9_fcc_labelno
[] = "%%fccX, ";
6342 /* Set the char indicating the number of the fcc reg to use. */
6343 v9_fcc_labelno
[5] = REGNO (cc_reg
) - SPARC_FIRST_V9_FCC_REG
+ '0';
6344 labelno
= v9_fcc_labelno
;
6347 if (REGNO (cc_reg
) == SPARC_FCC_REG
)
6353 else if (mode
== CCXmode
|| mode
== CCX_NOOVmode
)
6355 labelno
= "%%xcc, ";
6361 labelno
= "%%icc, ";
6366 if (*labelno
&& insn
&& (note
= find_reg_note (insn
, REG_BR_PROB
, NULL_RTX
)))
6369 ((INTVAL (XEXP (note
, 0)) >= REG_BR_PROB_BASE
/ 2) ^ far
)
6382 strcpy (p
, labelno
);
6383 p
= strchr (p
, '\0');
6386 strcpy (p
, ".+12\n\t nop\n\tb\t");
6393 /* Set the char indicating the number of the operand containing the
6398 strcpy (p
, "\n\t nop");
6403 /* Emit a library call comparison between floating point X and Y.
6404 COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).
6405 TARGET_ARCH64 uses _Qp_* functions, which use pointers to TFmode
6406 values as arguments instead of the TFmode registers themselves,
6407 that's why we cannot call emit_float_lib_cmp. */
6409 sparc_emit_float_lib_cmp (rtx x
, rtx y
, enum rtx_code comparison
)
6412 rtx slot0
, slot1
, result
, tem
, tem2
;
6413 enum machine_mode mode
;
6418 qpfunc
= (TARGET_ARCH64
) ? "_Qp_feq" : "_Q_feq";
6422 qpfunc
= (TARGET_ARCH64
) ? "_Qp_fne" : "_Q_fne";
6426 qpfunc
= (TARGET_ARCH64
) ? "_Qp_fgt" : "_Q_fgt";
6430 qpfunc
= (TARGET_ARCH64
) ? "_Qp_fge" : "_Q_fge";
6434 qpfunc
= (TARGET_ARCH64
) ? "_Qp_flt" : "_Q_flt";
6438 qpfunc
= (TARGET_ARCH64
) ? "_Qp_fle" : "_Q_fle";
6449 qpfunc
= (TARGET_ARCH64
) ? "_Qp_cmp" : "_Q_cmp";
6459 if (GET_CODE (x
) != MEM
)
6461 slot0
= assign_stack_temp (TFmode
, GET_MODE_SIZE(TFmode
), 0);
6462 emit_insn (gen_rtx_SET (VOIDmode
, slot0
, x
));
6467 if (GET_CODE (y
) != MEM
)
6469 slot1
= assign_stack_temp (TFmode
, GET_MODE_SIZE(TFmode
), 0);
6470 emit_insn (gen_rtx_SET (VOIDmode
, slot1
, y
));
6475 emit_library_call (gen_rtx_SYMBOL_REF (Pmode
, qpfunc
), LCT_NORMAL
,
6477 XEXP (slot0
, 0), Pmode
,
6478 XEXP (slot1
, 0), Pmode
);
6484 emit_library_call (gen_rtx_SYMBOL_REF (Pmode
, qpfunc
), LCT_NORMAL
,
6486 x
, TFmode
, y
, TFmode
);
6492 /* Immediately move the result of the libcall into a pseudo
6493 register so reload doesn't clobber the value if it needs
6494 the return register for a spill reg. */
6495 result
= gen_reg_rtx (mode
);
6496 emit_move_insn (result
, hard_libcall_value (mode
));
6501 emit_cmp_insn (result
, const0_rtx
, NE
, NULL_RTX
, mode
, 0);
6505 emit_cmp_insn (result
, GEN_INT(3), comparison
== UNORDERED
? EQ
: NE
,
6510 emit_cmp_insn (result
, const1_rtx
,
6511 comparison
== UNGT
? GT
: NE
, NULL_RTX
, mode
, 0);
6514 emit_cmp_insn (result
, const2_rtx
, NE
, NULL_RTX
, mode
, 0);
6517 tem
= gen_reg_rtx (mode
);
6519 emit_insn (gen_andsi3 (tem
, result
, const1_rtx
));
6521 emit_insn (gen_anddi3 (tem
, result
, const1_rtx
));
6522 emit_cmp_insn (tem
, const0_rtx
, NE
, NULL_RTX
, mode
, 0);
6526 tem
= gen_reg_rtx (mode
);
6528 emit_insn (gen_addsi3 (tem
, result
, const1_rtx
));
6530 emit_insn (gen_adddi3 (tem
, result
, const1_rtx
));
6531 tem2
= gen_reg_rtx (mode
);
6533 emit_insn (gen_andsi3 (tem2
, tem
, const2_rtx
));
6535 emit_insn (gen_anddi3 (tem2
, tem
, const2_rtx
));
6536 emit_cmp_insn (tem2
, const0_rtx
, comparison
== UNEQ
? EQ
: NE
,
6542 /* Generate an unsigned DImode to FP conversion. This is the same code
6543 optabs would emit if we didn't have TFmode patterns. */
6546 sparc_emit_floatunsdi (rtx
*operands
, enum machine_mode mode
)
6548 rtx neglab
, donelab
, i0
, i1
, f0
, in
, out
;
6551 in
= force_reg (DImode
, operands
[1]);
6552 neglab
= gen_label_rtx ();
6553 donelab
= gen_label_rtx ();
6554 i0
= gen_reg_rtx (DImode
);
6555 i1
= gen_reg_rtx (DImode
);
6556 f0
= gen_reg_rtx (mode
);
6558 emit_cmp_and_jump_insns (in
, const0_rtx
, LT
, const0_rtx
, DImode
, 0, neglab
);
6560 emit_insn (gen_rtx_SET (VOIDmode
, out
, gen_rtx_FLOAT (mode
, in
)));
6561 emit_jump_insn (gen_jump (donelab
));
6564 emit_label (neglab
);
6566 emit_insn (gen_lshrdi3 (i0
, in
, const1_rtx
));
6567 emit_insn (gen_anddi3 (i1
, in
, const1_rtx
));
6568 emit_insn (gen_iordi3 (i0
, i0
, i1
));
6569 emit_insn (gen_rtx_SET (VOIDmode
, f0
, gen_rtx_FLOAT (mode
, i0
)));
6570 emit_insn (gen_rtx_SET (VOIDmode
, out
, gen_rtx_PLUS (mode
, f0
, f0
)));
6572 emit_label (donelab
);
6575 /* Generate an FP to unsigned DImode conversion. This is the same code
6576 optabs would emit if we didn't have TFmode patterns. */
6579 sparc_emit_fixunsdi (rtx
*operands
, enum machine_mode mode
)
6581 rtx neglab
, donelab
, i0
, i1
, f0
, in
, out
, limit
;
6584 in
= force_reg (mode
, operands
[1]);
6585 neglab
= gen_label_rtx ();
6586 donelab
= gen_label_rtx ();
6587 i0
= gen_reg_rtx (DImode
);
6588 i1
= gen_reg_rtx (DImode
);
6589 limit
= gen_reg_rtx (mode
);
6590 f0
= gen_reg_rtx (mode
);
6592 emit_move_insn (limit
,
6593 CONST_DOUBLE_FROM_REAL_VALUE (
6594 REAL_VALUE_ATOF ("9223372036854775808.0", mode
), mode
));
6595 emit_cmp_and_jump_insns (in
, limit
, GE
, NULL_RTX
, mode
, 0, neglab
);
6597 emit_insn (gen_rtx_SET (VOIDmode
,
6599 gen_rtx_FIX (DImode
, gen_rtx_FIX (mode
, in
))));
6600 emit_jump_insn (gen_jump (donelab
));
6603 emit_label (neglab
);
6605 emit_insn (gen_rtx_SET (VOIDmode
, f0
, gen_rtx_MINUS (mode
, in
, limit
)));
6606 emit_insn (gen_rtx_SET (VOIDmode
,
6608 gen_rtx_FIX (DImode
, gen_rtx_FIX (mode
, f0
))));
6609 emit_insn (gen_movdi (i1
, const1_rtx
));
6610 emit_insn (gen_ashldi3 (i1
, i1
, GEN_INT (63)));
6611 emit_insn (gen_xordi3 (out
, i0
, i1
));
6613 emit_label (donelab
);
6616 /* Return the string to output a conditional branch to LABEL, testing
6617 register REG. LABEL is the operand number of the label; REG is the
6618 operand number of the reg. OP is the conditional expression. The mode
6619 of REG says what kind of comparison we made.
6621 DEST is the destination insn (i.e. the label), INSN is the source.
6623 REVERSED is nonzero if we should reverse the sense of the comparison.
6625 ANNUL is nonzero if we should generate an annulling branch.
6627 NOOP is nonzero if we have to follow this branch by a noop. */
6630 output_v9branch (rtx op
, rtx dest
, int reg
, int label
, int reversed
,
6631 int annul
, int noop
, rtx insn
)
6633 static char string
[64];
6634 enum rtx_code code
= GET_CODE (op
);
6635 enum machine_mode mode
= GET_MODE (XEXP (op
, 0));
6640 /* branch on register are limited to +-128KB. If it is too far away,
6653 brgez,a,pn %o1, .LC29
6659 ba,pt %xcc, .LC29 */
6661 far
= get_attr_length (insn
) >= 3;
6663 /* If not floating-point or if EQ or NE, we can just reverse the code. */
6665 code
= reverse_condition (code
);
6667 /* Only 64 bit versions of these instructions exist. */
6671 /* Start by writing the branch condition. */
6676 strcpy (string
, "brnz");
6680 strcpy (string
, "brz");
6684 strcpy (string
, "brgez");
6688 strcpy (string
, "brlz");
6692 strcpy (string
, "brlez");
6696 strcpy (string
, "brgz");
6703 p
= strchr (string
, '\0');
6705 /* Now add the annulling, reg, label, and nop. */
6712 if (insn
&& (note
= find_reg_note (insn
, REG_BR_PROB
, NULL_RTX
)))
6715 ((INTVAL (XEXP (note
, 0)) >= REG_BR_PROB_BASE
/ 2) ^ far
)
6720 *p
= p
< string
+ 8 ? '\t' : ' ';
6728 int veryfar
= 1, delta
;
6730 if (INSN_ADDRESSES_SET_P ())
6732 delta
= (INSN_ADDRESSES (INSN_UID (dest
))
6733 - INSN_ADDRESSES (INSN_UID (insn
)));
6734 /* Leave some instructions for "slop". */
6735 if (delta
>= -260000 && delta
< 260000)
6739 strcpy (p
, ".+12\n\t nop\n\t");
6750 strcpy (p
, "ba,pt\t%%xcc, ");
6760 strcpy (p
, "\n\t nop");
6765 /* Return 1, if any of the registers of the instruction are %l[0-7] or %o[0-7].
6766 Such instructions cannot be used in the delay slot of return insn on v9.
6767 If TEST is 0, also rename all %i[0-7] registers to their %o[0-7] counterparts.
6771 epilogue_renumber (register rtx
*where
, int test
)
6773 register const char *fmt
;
6775 register enum rtx_code code
;
6780 code
= GET_CODE (*where
);
6785 if (REGNO (*where
) >= 8 && REGNO (*where
) < 24) /* oX or lX */
6787 if (! test
&& REGNO (*where
) >= 24 && REGNO (*where
) < 32)
6788 *where
= gen_rtx_REG (GET_MODE (*where
), OUTGOING_REGNO (REGNO(*where
)));
6796 /* Do not replace the frame pointer with the stack pointer because
6797 it can cause the delayed instruction to load below the stack.
6798 This occurs when instructions like:
6800 (set (reg/i:SI 24 %i0)
6801 (mem/f:SI (plus:SI (reg/f:SI 30 %fp)
6802 (const_int -20 [0xffffffec])) 0))
6804 are in the return delayed slot. */
6806 if (GET_CODE (XEXP (*where
, 0)) == REG
6807 && REGNO (XEXP (*where
, 0)) == HARD_FRAME_POINTER_REGNUM
6808 && (GET_CODE (XEXP (*where
, 1)) != CONST_INT
6809 || INTVAL (XEXP (*where
, 1)) < SPARC_STACK_BIAS
))
6814 if (SPARC_STACK_BIAS
6815 && GET_CODE (XEXP (*where
, 0)) == REG
6816 && REGNO (XEXP (*where
, 0)) == HARD_FRAME_POINTER_REGNUM
)
6824 fmt
= GET_RTX_FORMAT (code
);
6826 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
6831 for (j
= XVECLEN (*where
, i
) - 1; j
>= 0; j
--)
6832 if (epilogue_renumber (&(XVECEXP (*where
, i
, j
)), test
))
6835 else if (fmt
[i
] == 'e'
6836 && epilogue_renumber (&(XEXP (*where
, i
)), test
))
6842 /* Leaf functions and non-leaf functions have different needs. */
6845 reg_leaf_alloc_order
[] = REG_LEAF_ALLOC_ORDER
;
6848 reg_nonleaf_alloc_order
[] = REG_ALLOC_ORDER
;
6850 static const int *const reg_alloc_orders
[] = {
6851 reg_leaf_alloc_order
,
6852 reg_nonleaf_alloc_order
};
6855 order_regs_for_local_alloc (void)
6857 static int last_order_nonleaf
= 1;
6859 if (regs_ever_live
[15] != last_order_nonleaf
)
6861 last_order_nonleaf
= !last_order_nonleaf
;
6862 memcpy ((char *) reg_alloc_order
,
6863 (const char *) reg_alloc_orders
[last_order_nonleaf
],
6864 FIRST_PSEUDO_REGISTER
* sizeof (int));
6868 /* Return 1 if REG and MEM are legitimate enough to allow the various
6869 mem<-->reg splits to be run. */
6872 sparc_splitdi_legitimate (rtx reg
, rtx mem
)
6874 /* Punt if we are here by mistake. */
6875 if (! reload_completed
)
6878 /* We must have an offsettable memory reference. */
6879 if (! offsettable_memref_p (mem
))
6882 /* If we have legitimate args for ldd/std, we do not want
6883 the split to happen. */
6884 if ((REGNO (reg
) % 2) == 0
6885 && mem_min_alignment (mem
, 8))
6892 /* Return 1 if x and y are some kind of REG and they refer to
6893 different hard registers. This test is guaranteed to be
6894 run after reload. */
6897 sparc_absnegfloat_split_legitimate (rtx x
, rtx y
)
6899 if (GET_CODE (x
) != REG
)
6901 if (GET_CODE (y
) != REG
)
6903 if (REGNO (x
) == REGNO (y
))
6908 /* Return 1 if REGNO (reg1) is even and REGNO (reg1) == REGNO (reg2) - 1.
6909 This makes them candidates for using ldd and std insns.
6911 Note reg1 and reg2 *must* be hard registers. */
6914 registers_ok_for_ldd_peep (rtx reg1
, rtx reg2
)
6916 /* We might have been passed a SUBREG. */
6917 if (GET_CODE (reg1
) != REG
|| GET_CODE (reg2
) != REG
)
6920 if (REGNO (reg1
) % 2 != 0)
6923 /* Integer ldd is deprecated in SPARC V9 */
6924 if (TARGET_V9
&& REGNO (reg1
) < 32)
6927 return (REGNO (reg1
) == REGNO (reg2
) - 1);
6930 /* Return 1 if the addresses in mem1 and mem2 are suitable for use in
6933 This can only happen when addr1 and addr2, the addresses in mem1
6934 and mem2, are consecutive memory locations (addr1 + 4 == addr2).
6935 addr1 must also be aligned on a 64-bit boundary.
6937 Also iff dependent_reg_rtx is not null it should not be used to
6938 compute the address for mem1, i.e. we cannot optimize a sequence
6950 But, note that the transformation from:
6955 is perfectly fine. Thus, the peephole2 patterns always pass us
6956 the destination register of the first load, never the second one.
6958 For stores we don't have a similar problem, so dependent_reg_rtx is
6962 mems_ok_for_ldd_peep (rtx mem1
, rtx mem2
, rtx dependent_reg_rtx
)
6966 HOST_WIDE_INT offset1
;
6968 /* The mems cannot be volatile. */
6969 if (MEM_VOLATILE_P (mem1
) || MEM_VOLATILE_P (mem2
))
6972 /* MEM1 should be aligned on a 64-bit boundary. */
6973 if (MEM_ALIGN (mem1
) < 64)
6976 addr1
= XEXP (mem1
, 0);
6977 addr2
= XEXP (mem2
, 0);
6979 /* Extract a register number and offset (if used) from the first addr. */
6980 if (GET_CODE (addr1
) == PLUS
)
6982 /* If not a REG, return zero. */
6983 if (GET_CODE (XEXP (addr1
, 0)) != REG
)
6987 reg1
= REGNO (XEXP (addr1
, 0));
6988 /* The offset must be constant! */
6989 if (GET_CODE (XEXP (addr1
, 1)) != CONST_INT
)
6991 offset1
= INTVAL (XEXP (addr1
, 1));
6994 else if (GET_CODE (addr1
) != REG
)
6998 reg1
= REGNO (addr1
);
6999 /* This was a simple (mem (reg)) expression. Offset is 0. */
7003 /* Make sure the second address is a (mem (plus (reg) (const_int). */
7004 if (GET_CODE (addr2
) != PLUS
)
7007 if (GET_CODE (XEXP (addr2
, 0)) != REG
7008 || GET_CODE (XEXP (addr2
, 1)) != CONST_INT
)
7011 if (reg1
!= REGNO (XEXP (addr2
, 0)))
7014 if (dependent_reg_rtx
!= NULL_RTX
&& reg1
== REGNO (dependent_reg_rtx
))
7017 /* The first offset must be evenly divisible by 8 to ensure the
7018 address is 64 bit aligned. */
7019 if (offset1
% 8 != 0)
7022 /* The offset for the second addr must be 4 more than the first addr. */
7023 if (INTVAL (XEXP (addr2
, 1)) != offset1
+ 4)
7026 /* All the tests passed. addr1 and addr2 are valid for ldd and std
7031 /* Return 1 if reg is a pseudo, or is the first register in
7032 a hard register pair. This makes it a candidate for use in
7033 ldd and std insns. */
7036 register_ok_for_ldd (rtx reg
)
7038 /* We might have been passed a SUBREG. */
7039 if (GET_CODE (reg
) != REG
)
7042 if (REGNO (reg
) < FIRST_PSEUDO_REGISTER
)
7043 return (REGNO (reg
) % 2 == 0);
7048 /* Print operand X (an rtx) in assembler syntax to file FILE.
7049 CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
7050 For `%' followed by punctuation, CODE is the punctuation and X is null. */
7053 print_operand (FILE *file
, rtx x
, int code
)
7058 /* Output a 'nop' if there's nothing for the delay slot. */
7059 if (dbr_sequence_length () == 0)
7060 fputs ("\n\t nop", file
);
7063 /* Output an annul flag if there's nothing for the delay slot and we
7064 are optimizing. This is always used with '(' below. */
7065 /* Sun OS 4.1.1 dbx can't handle an annulled unconditional branch;
7066 this is a dbx bug. So, we only do this when optimizing. */
7067 /* On UltraSPARC, a branch in a delay slot causes a pipeline flush.
7068 Always emit a nop in case the next instruction is a branch. */
7069 if (dbr_sequence_length () == 0
7070 && (optimize
&& (int)sparc_cpu
< PROCESSOR_V9
))
7074 /* Output a 'nop' if there's nothing for the delay slot and we are
7075 not optimizing. This is always used with '*' above. */
7076 if (dbr_sequence_length () == 0
7077 && ! (optimize
&& (int)sparc_cpu
< PROCESSOR_V9
))
7078 fputs ("\n\t nop", file
);
7081 /* Output the Embedded Medium/Anywhere code model base register. */
7082 fputs (EMBMEDANY_BASE_REG
, file
);
7085 /* Print out what we are using as the frame pointer. This might
7086 be %fp, or might be %sp+offset. */
7087 /* ??? What if offset is too big? Perhaps the caller knows it isn't? */
7088 fprintf (file
, "%s+"HOST_WIDE_INT_PRINT_DEC
,
7089 reg_names
[REGNO (frame_base_reg
)], frame_base_offset
);
7092 /* Print some local dynamic TLS name. */
7093 assemble_name (file
, get_some_local_dynamic_name ());
7096 /* Adjust the operand to take into account a RESTORE operation. */
7097 if (GET_CODE (x
) == CONST_INT
)
7099 else if (GET_CODE (x
) != REG
)
7100 output_operand_lossage ("invalid %%Y operand");
7101 else if (REGNO (x
) < 8)
7102 fputs (reg_names
[REGNO (x
)], file
);
7103 else if (REGNO (x
) >= 24 && REGNO (x
) < 32)
7104 fputs (reg_names
[REGNO (x
)-16], file
);
7106 output_operand_lossage ("invalid %%Y operand");
7109 /* Print out the low order register name of a register pair. */
7110 if (WORDS_BIG_ENDIAN
)
7111 fputs (reg_names
[REGNO (x
)+1], file
);
7113 fputs (reg_names
[REGNO (x
)], file
);
7116 /* Print out the high order register name of a register pair. */
7117 if (WORDS_BIG_ENDIAN
)
7118 fputs (reg_names
[REGNO (x
)], file
);
7120 fputs (reg_names
[REGNO (x
)+1], file
);
7123 /* Print out the second register name of a register pair or quad.
7124 I.e., R (%o0) => %o1. */
7125 fputs (reg_names
[REGNO (x
)+1], file
);
7128 /* Print out the third register name of a register quad.
7129 I.e., S (%o0) => %o2. */
7130 fputs (reg_names
[REGNO (x
)+2], file
);
7133 /* Print out the fourth register name of a register quad.
7134 I.e., T (%o0) => %o3. */
7135 fputs (reg_names
[REGNO (x
)+3], file
);
7138 /* Print a condition code register. */
7139 if (REGNO (x
) == SPARC_ICC_REG
)
7141 /* We don't handle CC[X]_NOOVmode because they're not supposed
7143 if (GET_MODE (x
) == CCmode
)
7144 fputs ("%icc", file
);
7145 else if (GET_MODE (x
) == CCXmode
)
7146 fputs ("%xcc", file
);
7151 /* %fccN register */
7152 fputs (reg_names
[REGNO (x
)], file
);
7155 /* Print the operand's address only. */
7156 output_address (XEXP (x
, 0));
7159 /* In this case we need a register. Use %g0 if the
7160 operand is const0_rtx. */
7162 || (GET_MODE (x
) != VOIDmode
&& x
== CONST0_RTX (GET_MODE (x
))))
7164 fputs ("%g0", file
);
7171 switch (GET_CODE (x
))
7173 case IOR
: fputs ("or", file
); break;
7174 case AND
: fputs ("and", file
); break;
7175 case XOR
: fputs ("xor", file
); break;
7176 default: output_operand_lossage ("invalid %%A operand");
7181 switch (GET_CODE (x
))
7183 case IOR
: fputs ("orn", file
); break;
7184 case AND
: fputs ("andn", file
); break;
7185 case XOR
: fputs ("xnor", file
); break;
7186 default: output_operand_lossage ("invalid %%B operand");
7190 /* These are used by the conditional move instructions. */
7194 enum rtx_code rc
= GET_CODE (x
);
7198 enum machine_mode mode
= GET_MODE (XEXP (x
, 0));
7199 if (mode
== CCFPmode
|| mode
== CCFPEmode
)
7200 rc
= reverse_condition_maybe_unordered (GET_CODE (x
));
7202 rc
= reverse_condition (GET_CODE (x
));
7206 case NE
: fputs ("ne", file
); break;
7207 case EQ
: fputs ("e", file
); break;
7208 case GE
: fputs ("ge", file
); break;
7209 case GT
: fputs ("g", file
); break;
7210 case LE
: fputs ("le", file
); break;
7211 case LT
: fputs ("l", file
); break;
7212 case GEU
: fputs ("geu", file
); break;
7213 case GTU
: fputs ("gu", file
); break;
7214 case LEU
: fputs ("leu", file
); break;
7215 case LTU
: fputs ("lu", file
); break;
7216 case LTGT
: fputs ("lg", file
); break;
7217 case UNORDERED
: fputs ("u", file
); break;
7218 case ORDERED
: fputs ("o", file
); break;
7219 case UNLT
: fputs ("ul", file
); break;
7220 case UNLE
: fputs ("ule", file
); break;
7221 case UNGT
: fputs ("ug", file
); break;
7222 case UNGE
: fputs ("uge", file
); break;
7223 case UNEQ
: fputs ("ue", file
); break;
7224 default: output_operand_lossage (code
== 'c'
7225 ? "invalid %%c operand"
7226 : "invalid %%C operand");
7231 /* These are used by the movr instruction pattern. */
7235 enum rtx_code rc
= (code
== 'd'
7236 ? reverse_condition (GET_CODE (x
))
7240 case NE
: fputs ("ne", file
); break;
7241 case EQ
: fputs ("e", file
); break;
7242 case GE
: fputs ("gez", file
); break;
7243 case LT
: fputs ("lz", file
); break;
7244 case LE
: fputs ("lez", file
); break;
7245 case GT
: fputs ("gz", file
); break;
7246 default: output_operand_lossage (code
== 'd'
7247 ? "invalid %%d operand"
7248 : "invalid %%D operand");
7255 /* Print a sign-extended character. */
7256 int i
= trunc_int_for_mode (INTVAL (x
), QImode
);
7257 fprintf (file
, "%d", i
);
7262 /* Operand must be a MEM; write its address. */
7263 if (GET_CODE (x
) != MEM
)
7264 output_operand_lossage ("invalid %%f operand");
7265 output_address (XEXP (x
, 0));
7270 /* Print a sign-extended 32-bit value. */
7272 if (GET_CODE(x
) == CONST_INT
)
7274 else if (GET_CODE(x
) == CONST_DOUBLE
)
7275 i
= CONST_DOUBLE_LOW (x
);
7278 output_operand_lossage ("invalid %%s operand");
7281 i
= trunc_int_for_mode (i
, SImode
);
7282 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, i
);
7287 /* Do nothing special. */
7291 /* Undocumented flag. */
7292 output_operand_lossage ("invalid operand output code");
7295 if (GET_CODE (x
) == REG
)
7296 fputs (reg_names
[REGNO (x
)], file
);
7297 else if (GET_CODE (x
) == MEM
)
7300 /* Poor Sun assembler doesn't understand absolute addressing. */
7301 if (CONSTANT_P (XEXP (x
, 0)))
7302 fputs ("%g0+", file
);
7303 output_address (XEXP (x
, 0));
7306 else if (GET_CODE (x
) == HIGH
)
7308 fputs ("%hi(", file
);
7309 output_addr_const (file
, XEXP (x
, 0));
7312 else if (GET_CODE (x
) == LO_SUM
)
7314 print_operand (file
, XEXP (x
, 0), 0);
7315 if (TARGET_CM_MEDMID
)
7316 fputs ("+%l44(", file
);
7318 fputs ("+%lo(", file
);
7319 output_addr_const (file
, XEXP (x
, 1));
7322 else if (GET_CODE (x
) == CONST_DOUBLE
7323 && (GET_MODE (x
) == VOIDmode
7324 || GET_MODE_CLASS (GET_MODE (x
)) == MODE_INT
))
7326 if (CONST_DOUBLE_HIGH (x
) == 0)
7327 fprintf (file
, "%u", (unsigned int) CONST_DOUBLE_LOW (x
));
7328 else if (CONST_DOUBLE_HIGH (x
) == -1
7329 && CONST_DOUBLE_LOW (x
) < 0)
7330 fprintf (file
, "%d", (int) CONST_DOUBLE_LOW (x
));
7332 output_operand_lossage ("long long constant not a valid immediate operand");
7334 else if (GET_CODE (x
) == CONST_DOUBLE
)
7335 output_operand_lossage ("floating point constant not a valid immediate operand");
7336 else { output_addr_const (file
, x
); }
7339 /* Target hook for assembling integer objects. The sparc version has
7340 special handling for aligned DI-mode objects. */
7343 sparc_assemble_integer (rtx x
, unsigned int size
, int aligned_p
)
7345 /* ??? We only output .xword's for symbols and only then in environments
7346 where the assembler can handle them. */
7347 if (aligned_p
&& size
== 8
7348 && (GET_CODE (x
) != CONST_INT
&& GET_CODE (x
) != CONST_DOUBLE
))
7352 assemble_integer_with_op ("\t.xword\t", x
);
7357 assemble_aligned_integer (4, const0_rtx
);
7358 assemble_aligned_integer (4, x
);
7362 return default_assemble_integer (x
, size
, aligned_p
);
7365 /* Return the value of a code used in the .proc pseudo-op that says
7366 what kind of result this function returns. For non-C types, we pick
7367 the closest C type. */
7369 #ifndef SHORT_TYPE_SIZE
7370 #define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
7373 #ifndef INT_TYPE_SIZE
7374 #define INT_TYPE_SIZE BITS_PER_WORD
7377 #ifndef LONG_TYPE_SIZE
7378 #define LONG_TYPE_SIZE BITS_PER_WORD
7381 #ifndef LONG_LONG_TYPE_SIZE
7382 #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
7385 #ifndef FLOAT_TYPE_SIZE
7386 #define FLOAT_TYPE_SIZE BITS_PER_WORD
7389 #ifndef DOUBLE_TYPE_SIZE
7390 #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
7393 #ifndef LONG_DOUBLE_TYPE_SIZE
7394 #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
7398 sparc_type_code (register tree type
)
7400 register unsigned long qualifiers
= 0;
7401 register unsigned shift
;
7403 /* Only the first 30 bits of the qualifier are valid. We must refrain from
7404 setting more, since some assemblers will give an error for this. Also,
7405 we must be careful to avoid shifts of 32 bits or more to avoid getting
7406 unpredictable results. */
7408 for (shift
= 6; shift
< 30; shift
+= 2, type
= TREE_TYPE (type
))
7410 switch (TREE_CODE (type
))
7416 qualifiers
|= (3 << shift
);
7421 qualifiers
|= (2 << shift
);
7425 case REFERENCE_TYPE
:
7427 qualifiers
|= (1 << shift
);
7431 return (qualifiers
| 8);
7434 case QUAL_UNION_TYPE
:
7435 return (qualifiers
| 9);
7438 return (qualifiers
| 10);
7441 return (qualifiers
| 16);
7444 /* If this is a range type, consider it to be the underlying
7446 if (TREE_TYPE (type
) != 0)
7449 /* Carefully distinguish all the standard types of C,
7450 without messing up if the language is not C. We do this by
7451 testing TYPE_PRECISION and TYPE_UNSIGNED. The old code used to
7452 look at both the names and the above fields, but that's redundant.
7453 Any type whose size is between two C types will be considered
7454 to be the wider of the two types. Also, we do not have a
7455 special code to use for "long long", so anything wider than
7456 long is treated the same. Note that we can't distinguish
7457 between "int" and "long" in this code if they are the same
7458 size, but that's fine, since neither can the assembler. */
7460 if (TYPE_PRECISION (type
) <= CHAR_TYPE_SIZE
)
7461 return (qualifiers
| (TYPE_UNSIGNED (type
) ? 12 : 2));
7463 else if (TYPE_PRECISION (type
) <= SHORT_TYPE_SIZE
)
7464 return (qualifiers
| (TYPE_UNSIGNED (type
) ? 13 : 3));
7466 else if (TYPE_PRECISION (type
) <= INT_TYPE_SIZE
)
7467 return (qualifiers
| (TYPE_UNSIGNED (type
) ? 14 : 4));
7470 return (qualifiers
| (TYPE_UNSIGNED (type
) ? 15 : 5));
7473 /* If this is a range type, consider it to be the underlying
7475 if (TREE_TYPE (type
) != 0)
7478 /* Carefully distinguish all the standard types of C,
7479 without messing up if the language is not C. */
7481 if (TYPE_PRECISION (type
) == FLOAT_TYPE_SIZE
)
7482 return (qualifiers
| 6);
7485 return (qualifiers
| 7);
7487 case COMPLEX_TYPE
: /* GNU Fortran COMPLEX type. */
7488 /* ??? We need to distinguish between double and float complex types,
7489 but I don't know how yet because I can't reach this code from
7490 existing front-ends. */
7491 return (qualifiers
| 7); /* Who knows? */
7494 case CHAR_TYPE
: /* GNU Pascal CHAR type. Not used in C. */
7495 case BOOLEAN_TYPE
: /* GNU Fortran BOOLEAN type. */
7496 case FILE_TYPE
: /* GNU Pascal FILE type. */
7497 case SET_TYPE
: /* GNU Pascal SET type. */
7498 case LANG_TYPE
: /* ? */
7502 abort (); /* Not a type! */
7509 /* Nested function support. */
7511 /* Emit RTL insns to initialize the variable parts of a trampoline.
7512 FNADDR is an RTX for the address of the function's pure code.
7513 CXT is an RTX for the static chain value for the function.
7515 This takes 16 insns: 2 shifts & 2 ands (to split up addresses), 4 sethi
7516 (to load in opcodes), 4 iors (to merge address and opcodes), and 4 writes
7517 (to store insns). This is a bit excessive. Perhaps a different
7518 mechanism would be better here.
7520 Emit enough FLUSH insns to synchronize the data and instruction caches. */
7523 sparc_initialize_trampoline (rtx tramp
, rtx fnaddr
, rtx cxt
)
7525 /* SPARC 32-bit trampoline:
7528 sethi %hi(static), %g2
7530 or %g2, %lo(static), %g2
7532 SETHI i,r = 00rr rrr1 00ii iiii iiii iiii iiii iiii
7533 JMPL r+i,d = 10dd ddd1 1100 0rrr rr1i iiii iiii iiii
7537 (gen_rtx_MEM (SImode
, plus_constant (tramp
, 0)),
7538 expand_binop (SImode
, ior_optab
,
7539 expand_shift (RSHIFT_EXPR
, SImode
, fnaddr
,
7540 size_int (10), 0, 1),
7541 GEN_INT (trunc_int_for_mode (0x03000000, SImode
)),
7542 NULL_RTX
, 1, OPTAB_DIRECT
));
7545 (gen_rtx_MEM (SImode
, plus_constant (tramp
, 4)),
7546 expand_binop (SImode
, ior_optab
,
7547 expand_shift (RSHIFT_EXPR
, SImode
, cxt
,
7548 size_int (10), 0, 1),
7549 GEN_INT (trunc_int_for_mode (0x05000000, SImode
)),
7550 NULL_RTX
, 1, OPTAB_DIRECT
));
7553 (gen_rtx_MEM (SImode
, plus_constant (tramp
, 8)),
7554 expand_binop (SImode
, ior_optab
,
7555 expand_and (SImode
, fnaddr
, GEN_INT (0x3ff), NULL_RTX
),
7556 GEN_INT (trunc_int_for_mode (0x81c06000, SImode
)),
7557 NULL_RTX
, 1, OPTAB_DIRECT
));
7560 (gen_rtx_MEM (SImode
, plus_constant (tramp
, 12)),
7561 expand_binop (SImode
, ior_optab
,
7562 expand_and (SImode
, cxt
, GEN_INT (0x3ff), NULL_RTX
),
7563 GEN_INT (trunc_int_for_mode (0x8410a000, SImode
)),
7564 NULL_RTX
, 1, OPTAB_DIRECT
));
7566 /* On UltraSPARC a flush flushes an entire cache line. The trampoline is
7567 aligned on a 16 byte boundary so one flush clears it all. */
7568 emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode
, tramp
))));
7569 if (sparc_cpu
!= PROCESSOR_ULTRASPARC
7570 && sparc_cpu
!= PROCESSOR_ULTRASPARC3
)
7571 emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode
,
7572 plus_constant (tramp
, 8)))));
7574 /* Call __enable_execute_stack after writing onto the stack to make sure
7575 the stack address is accessible. */
7576 #ifdef ENABLE_EXECUTE_STACK
7577 emit_library_call (gen_rtx_SYMBOL_REF (Pmode
, "__enable_execute_stack"),
7578 LCT_NORMAL
, VOIDmode
, 1, tramp
, Pmode
);
7583 /* The 64-bit version is simpler because it makes more sense to load the
7584 values as "immediate" data out of the trampoline. It's also easier since
7585 we can read the PC without clobbering a register. */
7588 sparc64_initialize_trampoline (rtx tramp
, rtx fnaddr
, rtx cxt
)
7590 /* SPARC 64-bit trampoline:
7599 emit_move_insn (gen_rtx_MEM (SImode
, tramp
),
7600 GEN_INT (trunc_int_for_mode (0x83414000, SImode
)));
7601 emit_move_insn (gen_rtx_MEM (SImode
, plus_constant (tramp
, 4)),
7602 GEN_INT (trunc_int_for_mode (0xca586018, SImode
)));
7603 emit_move_insn (gen_rtx_MEM (SImode
, plus_constant (tramp
, 8)),
7604 GEN_INT (trunc_int_for_mode (0x81c14000, SImode
)));
7605 emit_move_insn (gen_rtx_MEM (SImode
, plus_constant (tramp
, 12)),
7606 GEN_INT (trunc_int_for_mode (0xca586010, SImode
)));
7607 emit_move_insn (gen_rtx_MEM (DImode
, plus_constant (tramp
, 16)), cxt
);
7608 emit_move_insn (gen_rtx_MEM (DImode
, plus_constant (tramp
, 24)), fnaddr
);
7609 emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode
, tramp
))));
7611 if (sparc_cpu
!= PROCESSOR_ULTRASPARC
7612 && sparc_cpu
!= PROCESSOR_ULTRASPARC3
)
7613 emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode
, plus_constant (tramp
, 8)))));
7615 /* Call __enable_execute_stack after writing onto the stack to make sure
7616 the stack address is accessible. */
7617 #ifdef ENABLE_EXECUTE_STACK
7618 emit_library_call (gen_rtx_SYMBOL_REF (Pmode
, "__enable_execute_stack"),
7619 LCT_NORMAL
, VOIDmode
, 1, tramp
, Pmode
);
7623 /* Adjust the cost of a scheduling dependency. Return the new cost of
7624 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
7627 supersparc_adjust_cost (rtx insn
, rtx link
, rtx dep_insn
, int cost
)
7629 enum attr_type insn_type
;
7631 if (! recog_memoized (insn
))
7634 insn_type
= get_attr_type (insn
);
7636 if (REG_NOTE_KIND (link
) == 0)
7638 /* Data dependency; DEP_INSN writes a register that INSN reads some
7641 /* if a load, then the dependence must be on the memory address;
7642 add an extra "cycle". Note that the cost could be two cycles
7643 if the reg was written late in an instruction group; we ca not tell
7645 if (insn_type
== TYPE_LOAD
|| insn_type
== TYPE_FPLOAD
)
7648 /* Get the delay only if the address of the store is the dependence. */
7649 if (insn_type
== TYPE_STORE
|| insn_type
== TYPE_FPSTORE
)
7651 rtx pat
= PATTERN(insn
);
7652 rtx dep_pat
= PATTERN (dep_insn
);
7654 if (GET_CODE (pat
) != SET
|| GET_CODE (dep_pat
) != SET
)
7655 return cost
; /* This should not happen! */
7657 /* The dependency between the two instructions was on the data that
7658 is being stored. Assume that this implies that the address of the
7659 store is not dependent. */
7660 if (rtx_equal_p (SET_DEST (dep_pat
), SET_SRC (pat
)))
7663 return cost
+ 3; /* An approximation. */
7666 /* A shift instruction cannot receive its data from an instruction
7667 in the same cycle; add a one cycle penalty. */
7668 if (insn_type
== TYPE_SHIFT
)
7669 return cost
+ 3; /* Split before cascade into shift. */
7673 /* Anti- or output- dependency; DEP_INSN reads/writes a register that
7674 INSN writes some cycles later. */
7676 /* These are only significant for the fpu unit; writing a fp reg before
7677 the fpu has finished with it stalls the processor. */
7679 /* Reusing an integer register causes no problems. */
7680 if (insn_type
== TYPE_IALU
|| insn_type
== TYPE_SHIFT
)
7688 hypersparc_adjust_cost (rtx insn
, rtx link
, rtx dep_insn
, int cost
)
7690 enum attr_type insn_type
, dep_type
;
7691 rtx pat
= PATTERN(insn
);
7692 rtx dep_pat
= PATTERN (dep_insn
);
7694 if (recog_memoized (insn
) < 0 || recog_memoized (dep_insn
) < 0)
7697 insn_type
= get_attr_type (insn
);
7698 dep_type
= get_attr_type (dep_insn
);
7700 switch (REG_NOTE_KIND (link
))
7703 /* Data dependency; DEP_INSN writes a register that INSN reads some
7710 /* Get the delay iff the address of the store is the dependence. */
7711 if (GET_CODE (pat
) != SET
|| GET_CODE (dep_pat
) != SET
)
7714 if (rtx_equal_p (SET_DEST (dep_pat
), SET_SRC (pat
)))
7721 /* If a load, then the dependence must be on the memory address. If
7722 the addresses aren't equal, then it might be a false dependency */
7723 if (dep_type
== TYPE_STORE
|| dep_type
== TYPE_FPSTORE
)
7725 if (GET_CODE (pat
) != SET
|| GET_CODE (dep_pat
) != SET
7726 || GET_CODE (SET_DEST (dep_pat
)) != MEM
7727 || GET_CODE (SET_SRC (pat
)) != MEM
7728 || ! rtx_equal_p (XEXP (SET_DEST (dep_pat
), 0),
7729 XEXP (SET_SRC (pat
), 0)))
7737 /* Compare to branch latency is 0. There is no benefit from
7738 separating compare and branch. */
7739 if (dep_type
== TYPE_COMPARE
)
7741 /* Floating point compare to branch latency is less than
7742 compare to conditional move. */
7743 if (dep_type
== TYPE_FPCMP
)
7752 /* Anti-dependencies only penalize the fpu unit. */
7753 if (insn_type
== TYPE_IALU
|| insn_type
== TYPE_SHIFT
)
7765 sparc_adjust_cost(rtx insn
, rtx link
, rtx dep
, int cost
)
7769 case PROCESSOR_SUPERSPARC
:
7770 cost
= supersparc_adjust_cost (insn
, link
, dep
, cost
);
7772 case PROCESSOR_HYPERSPARC
:
7773 case PROCESSOR_SPARCLITE86X
:
7774 cost
= hypersparc_adjust_cost (insn
, link
, dep
, cost
);
7783 sparc_sched_init (FILE *dump ATTRIBUTE_UNUSED
,
7784 int sched_verbose ATTRIBUTE_UNUSED
,
7785 int max_ready ATTRIBUTE_UNUSED
)
7790 sparc_use_sched_lookahead (void)
7792 if (sparc_cpu
== PROCESSOR_ULTRASPARC
7793 || sparc_cpu
== PROCESSOR_ULTRASPARC3
)
7795 if ((1 << sparc_cpu
) &
7796 ((1 << PROCESSOR_SUPERSPARC
) | (1 << PROCESSOR_HYPERSPARC
) |
7797 (1 << PROCESSOR_SPARCLITE86X
)))
7803 sparc_issue_rate (void)
7810 /* Assume V9 processors are capable of at least dual-issue. */
7812 case PROCESSOR_SUPERSPARC
:
7814 case PROCESSOR_HYPERSPARC
:
7815 case PROCESSOR_SPARCLITE86X
:
7817 case PROCESSOR_ULTRASPARC
:
7818 case PROCESSOR_ULTRASPARC3
:
7824 set_extends (rtx insn
)
7826 register rtx pat
= PATTERN (insn
);
7828 switch (GET_CODE (SET_SRC (pat
)))
7830 /* Load and some shift instructions zero extend. */
7833 /* sethi clears the high bits */
7835 /* LO_SUM is used with sethi. sethi cleared the high
7836 bits and the values used with lo_sum are positive */
7838 /* Store flag stores 0 or 1 */
7848 rtx op0
= XEXP (SET_SRC (pat
), 0);
7849 rtx op1
= XEXP (SET_SRC (pat
), 1);
7850 if (GET_CODE (op1
) == CONST_INT
)
7851 return INTVAL (op1
) >= 0;
7852 if (GET_CODE (op0
) != REG
)
7854 if (sparc_check_64 (op0
, insn
) == 1)
7856 return (GET_CODE (op1
) == REG
&& sparc_check_64 (op1
, insn
) == 1);
7861 rtx op0
= XEXP (SET_SRC (pat
), 0);
7862 rtx op1
= XEXP (SET_SRC (pat
), 1);
7863 if (GET_CODE (op0
) != REG
|| sparc_check_64 (op0
, insn
) <= 0)
7865 if (GET_CODE (op1
) == CONST_INT
)
7866 return INTVAL (op1
) >= 0;
7867 return (GET_CODE (op1
) == REG
&& sparc_check_64 (op1
, insn
) == 1);
7870 return GET_MODE (SET_SRC (pat
)) == SImode
;
7871 /* Positive integers leave the high bits zero. */
7873 return ! (CONST_DOUBLE_LOW (SET_SRC (pat
)) & 0x80000000);
7875 return ! (INTVAL (SET_SRC (pat
)) & 0x80000000);
7878 return - (GET_MODE (SET_SRC (pat
)) == SImode
);
7880 return sparc_check_64 (SET_SRC (pat
), insn
);
7886 /* We _ought_ to have only one kind per function, but... */
7887 static GTY(()) rtx sparc_addr_diff_list
;
7888 static GTY(()) rtx sparc_addr_list
;
7891 sparc_defer_case_vector (rtx lab
, rtx vec
, int diff
)
7893 vec
= gen_rtx_EXPR_LIST (VOIDmode
, lab
, vec
);
7895 sparc_addr_diff_list
7896 = gen_rtx_EXPR_LIST (VOIDmode
, vec
, sparc_addr_diff_list
);
7898 sparc_addr_list
= gen_rtx_EXPR_LIST (VOIDmode
, vec
, sparc_addr_list
);
7902 sparc_output_addr_vec (rtx vec
)
7904 rtx lab
= XEXP (vec
, 0), body
= XEXP (vec
, 1);
7905 int idx
, vlen
= XVECLEN (body
, 0);
7907 #ifdef ASM_OUTPUT_ADDR_VEC_START
7908 ASM_OUTPUT_ADDR_VEC_START (asm_out_file
);
7911 #ifdef ASM_OUTPUT_CASE_LABEL
7912 ASM_OUTPUT_CASE_LABEL (asm_out_file
, "L", CODE_LABEL_NUMBER (lab
),
7915 (*targetm
.asm_out
.internal_label
) (asm_out_file
, "L", CODE_LABEL_NUMBER (lab
));
7918 for (idx
= 0; idx
< vlen
; idx
++)
7920 ASM_OUTPUT_ADDR_VEC_ELT
7921 (asm_out_file
, CODE_LABEL_NUMBER (XEXP (XVECEXP (body
, 0, idx
), 0)));
7924 #ifdef ASM_OUTPUT_ADDR_VEC_END
7925 ASM_OUTPUT_ADDR_VEC_END (asm_out_file
);
7930 sparc_output_addr_diff_vec (rtx vec
)
7932 rtx lab
= XEXP (vec
, 0), body
= XEXP (vec
, 1);
7933 rtx base
= XEXP (XEXP (body
, 0), 0);
7934 int idx
, vlen
= XVECLEN (body
, 1);
7936 #ifdef ASM_OUTPUT_ADDR_VEC_START
7937 ASM_OUTPUT_ADDR_VEC_START (asm_out_file
);
7940 #ifdef ASM_OUTPUT_CASE_LABEL
7941 ASM_OUTPUT_CASE_LABEL (asm_out_file
, "L", CODE_LABEL_NUMBER (lab
),
7944 (*targetm
.asm_out
.internal_label
) (asm_out_file
, "L", CODE_LABEL_NUMBER (lab
));
7947 for (idx
= 0; idx
< vlen
; idx
++)
7949 ASM_OUTPUT_ADDR_DIFF_ELT
7952 CODE_LABEL_NUMBER (XEXP (XVECEXP (body
, 1, idx
), 0)),
7953 CODE_LABEL_NUMBER (base
));
7956 #ifdef ASM_OUTPUT_ADDR_VEC_END
7957 ASM_OUTPUT_ADDR_VEC_END (asm_out_file
);
7962 sparc_output_deferred_case_vectors (void)
7967 if (sparc_addr_list
== NULL_RTX
7968 && sparc_addr_diff_list
== NULL_RTX
)
7971 /* Align to cache line in the function's code section. */
7972 function_section (current_function_decl
);
7974 align
= floor_log2 (FUNCTION_BOUNDARY
/ BITS_PER_UNIT
);
7976 ASM_OUTPUT_ALIGN (asm_out_file
, align
);
7978 for (t
= sparc_addr_list
; t
; t
= XEXP (t
, 1))
7979 sparc_output_addr_vec (XEXP (t
, 0));
7980 for (t
= sparc_addr_diff_list
; t
; t
= XEXP (t
, 1))
7981 sparc_output_addr_diff_vec (XEXP (t
, 0));
7983 sparc_addr_list
= sparc_addr_diff_list
= NULL_RTX
;
7986 /* Return 0 if the high 32 bits of X (the low word of X, if DImode) are
7987 unknown. Return 1 if the high bits are zero, -1 if the register is
7990 sparc_check_64 (rtx x
, rtx insn
)
7992 /* If a register is set only once it is safe to ignore insns this
7993 code does not know how to handle. The loop will either recognize
7994 the single set and return the correct value or fail to recognize
7999 if (GET_CODE (x
) != REG
)
8002 if (GET_MODE (x
) == DImode
)
8003 y
= gen_rtx_REG (SImode
, REGNO (x
) + WORDS_BIG_ENDIAN
);
8005 if (flag_expensive_optimizations
8006 && REG_N_SETS (REGNO (y
)) == 1)
8012 insn
= get_last_insn_anywhere ();
8017 while ((insn
= PREV_INSN (insn
)))
8019 switch (GET_CODE (insn
))
8032 rtx pat
= PATTERN (insn
);
8033 if (GET_CODE (pat
) != SET
)
8035 if (rtx_equal_p (x
, SET_DEST (pat
)))
8036 return set_extends (insn
);
8037 if (y
&& rtx_equal_p (y
, SET_DEST (pat
)))
8038 return set_extends (insn
);
8039 if (reg_overlap_mentioned_p (SET_DEST (pat
), y
))
8047 /* Returns assembly code to perform a DImode shift using
8048 a 64-bit global or out register on SPARC-V8+. */
8050 output_v8plus_shift (rtx
*operands
, rtx insn
, const char *opcode
)
8052 static char asm_code
[60];
8054 /* The scratch register is only required when the destination
8055 register is not a 64-bit global or out register. */
8056 if (which_alternative
!= 2)
8057 operands
[3] = operands
[0];
8059 /* We can only shift by constants <= 63. */
8060 if (GET_CODE (operands
[2]) == CONST_INT
)
8061 operands
[2] = GEN_INT (INTVAL (operands
[2]) & 0x3f);
8063 if (GET_CODE (operands
[1]) == CONST_INT
)
8065 output_asm_insn ("mov\t%1, %3", operands
);
8069 output_asm_insn ("sllx\t%H1, 32, %3", operands
);
8070 if (sparc_check_64 (operands
[1], insn
) <= 0)
8071 output_asm_insn ("srl\t%L1, 0, %L1", operands
);
8072 output_asm_insn ("or\t%L1, %3, %3", operands
);
8075 strcpy(asm_code
, opcode
);
8077 if (which_alternative
!= 2)
8078 return strcat (asm_code
, "\t%0, %2, %L0\n\tsrlx\t%L0, 32, %H0");
8080 return strcat (asm_code
, "\t%3, %2, %3\n\tsrlx\t%3, 32, %H0\n\tmov\t%3, %L0");
8083 /* Output rtl to increment the profiler label LABELNO
8084 for profiling a function entry. */
8087 sparc_profile_hook (int labelno
)
8092 ASM_GENERATE_INTERNAL_LABEL (buf
, "LP", labelno
);
8093 lab
= gen_rtx_SYMBOL_REF (Pmode
, ggc_strdup (buf
));
8094 fun
= gen_rtx_SYMBOL_REF (Pmode
, MCOUNT_FUNCTION
);
8096 emit_library_call (fun
, LCT_NORMAL
, VOIDmode
, 1, lab
, Pmode
);
8099 #ifdef OBJECT_FORMAT_ELF
8101 sparc_elf_asm_named_section (const char *name
, unsigned int flags
)
8103 if (flags
& SECTION_MERGE
)
8105 /* entsize cannot be expressed in this section attributes
8107 default_elf_asm_named_section (name
, flags
);
8111 fprintf (asm_out_file
, "\t.section\t\"%s\"", name
);
8113 if (!(flags
& SECTION_DEBUG
))
8114 fputs (",#alloc", asm_out_file
);
8115 if (flags
& SECTION_WRITE
)
8116 fputs (",#write", asm_out_file
);
8117 if (flags
& SECTION_TLS
)
8118 fputs (",#tls", asm_out_file
);
8119 if (flags
& SECTION_CODE
)
8120 fputs (",#execinstr", asm_out_file
);
8122 /* ??? Handle SECTION_BSS. */
8124 fputc ('\n', asm_out_file
);
8126 #endif /* OBJECT_FORMAT_ELF */
8128 /* We do not allow indirect calls to be optimized into sibling calls.
8130 We cannot use sibling calls when delayed branches are disabled
8131 because they will likely require the call delay slot to be filled.
8133 Also, on SPARC 32-bit we cannot emit a sibling call when the
8134 current function returns a structure. This is because the "unimp
8135 after call" convention would cause the callee to return to the
8136 wrong place. The generic code already disallows cases where the
8137 function being called returns a structure.
8139 It may seem strange how this last case could occur. Usually there
8140 is code after the call which jumps to epilogue code which dumps the
8141 return value into the struct return area. That ought to invalidate
8142 the sibling call right? Well, in the C++ case we can end up passing
8143 the pointer to the struct return area to a constructor (which returns
8144 void) and then nothing else happens. Such a sibling call would look
8145 valid without the added check here. */
8147 sparc_function_ok_for_sibcall (tree decl
, tree exp ATTRIBUTE_UNUSED
)
8150 && flag_delayed_branch
8151 && (TARGET_ARCH64
|| ! current_function_returns_struct
));
8154 /* libfunc renaming. */
8155 #include "config/gofast.h"
8158 sparc_init_libfuncs (void)
8162 /* Use the subroutines that Sun's library provides for integer
8163 multiply and divide. The `*' prevents an underscore from
8164 being prepended by the compiler. .umul is a little faster
8166 set_optab_libfunc (smul_optab
, SImode
, "*.umul");
8167 set_optab_libfunc (sdiv_optab
, SImode
, "*.div");
8168 set_optab_libfunc (udiv_optab
, SImode
, "*.udiv");
8169 set_optab_libfunc (smod_optab
, SImode
, "*.rem");
8170 set_optab_libfunc (umod_optab
, SImode
, "*.urem");
8172 /* TFmode arithmetic. These names are part of the SPARC 32bit ABI. */
8173 set_optab_libfunc (add_optab
, TFmode
, "_Q_add");
8174 set_optab_libfunc (sub_optab
, TFmode
, "_Q_sub");
8175 set_optab_libfunc (neg_optab
, TFmode
, "_Q_neg");
8176 set_optab_libfunc (smul_optab
, TFmode
, "_Q_mul");
8177 set_optab_libfunc (sdiv_optab
, TFmode
, "_Q_div");
8179 /* We can define the TFmode sqrt optab only if TARGET_FPU. This
8180 is because with soft-float, the SFmode and DFmode sqrt
8181 instructions will be absent, and the compiler will notice and
8182 try to use the TFmode sqrt instruction for calls to the
8183 builtin function sqrt, but this fails. */
8185 set_optab_libfunc (sqrt_optab
, TFmode
, "_Q_sqrt");
8187 set_optab_libfunc (eq_optab
, TFmode
, "_Q_feq");
8188 set_optab_libfunc (ne_optab
, TFmode
, "_Q_fne");
8189 set_optab_libfunc (gt_optab
, TFmode
, "_Q_fgt");
8190 set_optab_libfunc (ge_optab
, TFmode
, "_Q_fge");
8191 set_optab_libfunc (lt_optab
, TFmode
, "_Q_flt");
8192 set_optab_libfunc (le_optab
, TFmode
, "_Q_fle");
8194 set_conv_libfunc (sext_optab
, TFmode
, SFmode
, "_Q_stoq");
8195 set_conv_libfunc (sext_optab
, TFmode
, DFmode
, "_Q_dtoq");
8196 set_conv_libfunc (trunc_optab
, SFmode
, TFmode
, "_Q_qtos");
8197 set_conv_libfunc (trunc_optab
, DFmode
, TFmode
, "_Q_qtod");
8199 set_conv_libfunc (sfix_optab
, SImode
, TFmode
, "_Q_qtoi");
8200 set_conv_libfunc (ufix_optab
, SImode
, TFmode
, "_Q_qtou");
8201 set_conv_libfunc (sfloat_optab
, TFmode
, SImode
, "_Q_itoq");
8203 if (DITF_CONVERSION_LIBFUNCS
)
8205 set_conv_libfunc (sfix_optab
, DImode
, TFmode
, "_Q_qtoll");
8206 set_conv_libfunc (ufix_optab
, DImode
, TFmode
, "_Q_qtoull");
8207 set_conv_libfunc (sfloat_optab
, TFmode
, DImode
, "_Q_lltoq");
8210 if (SUN_CONVERSION_LIBFUNCS
)
8212 set_conv_libfunc (sfix_optab
, DImode
, SFmode
, "__ftoll");
8213 set_conv_libfunc (ufix_optab
, DImode
, SFmode
, "__ftoull");
8214 set_conv_libfunc (sfix_optab
, DImode
, DFmode
, "__dtoll");
8215 set_conv_libfunc (ufix_optab
, DImode
, DFmode
, "__dtoull");
8220 /* In the SPARC 64bit ABI, SImode multiply and divide functions
8221 do not exist in the library. Make sure the compiler does not
8222 emit calls to them by accident. (It should always use the
8223 hardware instructions.) */
8224 set_optab_libfunc (smul_optab
, SImode
, 0);
8225 set_optab_libfunc (sdiv_optab
, SImode
, 0);
8226 set_optab_libfunc (udiv_optab
, SImode
, 0);
8227 set_optab_libfunc (smod_optab
, SImode
, 0);
8228 set_optab_libfunc (umod_optab
, SImode
, 0);
8230 if (SUN_INTEGER_MULTIPLY_64
)
8232 set_optab_libfunc (smul_optab
, DImode
, "__mul64");
8233 set_optab_libfunc (sdiv_optab
, DImode
, "__div64");
8234 set_optab_libfunc (udiv_optab
, DImode
, "__udiv64");
8235 set_optab_libfunc (smod_optab
, DImode
, "__rem64");
8236 set_optab_libfunc (umod_optab
, DImode
, "__urem64");
8239 if (SUN_CONVERSION_LIBFUNCS
)
8241 set_conv_libfunc (sfix_optab
, DImode
, SFmode
, "__ftol");
8242 set_conv_libfunc (ufix_optab
, DImode
, SFmode
, "__ftoul");
8243 set_conv_libfunc (sfix_optab
, DImode
, DFmode
, "__dtol");
8244 set_conv_libfunc (ufix_optab
, DImode
, DFmode
, "__dtoul");
8248 gofast_maybe_init_libfuncs ();
8252 sparc_extra_constraint_check (rtx op
, int c
, int strict
)
8257 && (c
== 'T' || c
== 'U'))
8263 return fp_sethi_p (op
);
8266 return fp_mov_p (op
);
8269 return fp_high_losum_p (op
);
8273 || (GET_CODE (op
) == REG
8274 && (REGNO (op
) < FIRST_PSEUDO_REGISTER
8275 || reg_renumber
[REGNO (op
)] >= 0)))
8276 return register_ok_for_ldd (op
);
8288 /* Our memory extra constraints have to emulate the
8289 behavior of 'm' and 'o' in order for reload to work
8291 if (GET_CODE (op
) == MEM
)
8294 if ((TARGET_ARCH64
|| mem_min_alignment (op
, 8))
8296 || strict_memory_address_p (Pmode
, XEXP (op
, 0))))
8301 reload_ok_mem
= (reload_in_progress
8302 && GET_CODE (op
) == REG
8303 && REGNO (op
) >= FIRST_PSEUDO_REGISTER
8304 && reg_renumber
[REGNO (op
)] < 0);
8307 return reload_ok_mem
;
8310 /* ??? This duplicates information provided to the compiler by the
8311 ??? scheduler description. Some day, teach genautomata to output
8312 ??? the latencies and then CSE will just use that. */
8315 sparc_rtx_costs (rtx x
, int code
, int outer_code
, int *total
)
8317 enum machine_mode mode
= GET_MODE (x
);
8318 bool float_mode_p
= FLOAT_MODE_P (mode
);
8323 if (INTVAL (x
) < 0x1000 && INTVAL (x
) >= -0x1000)
8341 if (GET_MODE (x
) == DImode
8342 && ((XINT (x
, 3) == 0
8343 && (unsigned HOST_WIDE_INT
) XINT (x
, 2) < 0x1000)
8344 || (XINT (x
, 3) == -1
8346 && XINT (x
, 2) >= -0x1000)))
8353 /* If outer-code was a sign or zero extension, a cost
8354 of COSTS_N_INSNS (1) was already added in. This is
8355 why we are subtracting it back out. */
8356 if (outer_code
== ZERO_EXTEND
)
8358 *total
= sparc_costs
->int_zload
- COSTS_N_INSNS (1);
8360 else if (outer_code
== SIGN_EXTEND
)
8362 *total
= sparc_costs
->int_sload
- COSTS_N_INSNS (1);
8364 else if (float_mode_p
)
8366 *total
= sparc_costs
->float_load
;
8370 *total
= sparc_costs
->int_load
;
8378 *total
= sparc_costs
->float_plusminus
;
8380 *total
= COSTS_N_INSNS (1);
8385 *total
= sparc_costs
->float_mul
;
8386 else if (! TARGET_HARD_MUL
)
8387 return COSTS_N_INSNS (25);
8393 if (sparc_costs
->int_mul_bit_factor
)
8397 if (GET_CODE (XEXP (x
, 1)) == CONST_INT
)
8399 unsigned HOST_WIDE_INT value
= INTVAL (XEXP (x
, 1));
8400 for (nbits
= 0; value
!= 0; value
&= value
- 1)
8403 else if (GET_CODE (XEXP (x
, 1)) == CONST_DOUBLE
8404 && GET_MODE (XEXP (x
, 1)) == DImode
)
8406 rtx x1
= XEXP (x
, 1);
8407 unsigned HOST_WIDE_INT value1
= XINT (x1
, 2);
8408 unsigned HOST_WIDE_INT value2
= XINT (x1
, 3);
8410 for (nbits
= 0; value1
!= 0; value1
&= value1
- 1)
8412 for (; value2
!= 0; value2
&= value2
- 1)
8420 bit_cost
= (nbits
- 3) / sparc_costs
->int_mul_bit_factor
;
8421 bit_cost
= COSTS_N_INSNS (bit_cost
);
8425 *total
= sparc_costs
->int_mulX
+ bit_cost
;
8427 *total
= sparc_costs
->int_mul
+ bit_cost
;
8434 *total
= COSTS_N_INSNS (1) + sparc_costs
->shift_penalty
;
8444 *total
= sparc_costs
->float_div_df
;
8446 *total
= sparc_costs
->float_div_sf
;
8451 *total
= sparc_costs
->int_divX
;
8453 *total
= sparc_costs
->int_div
;
8460 *total
= COSTS_N_INSNS (1);
8467 case UNSIGNED_FLOAT
:
8471 case FLOAT_TRUNCATE
:
8472 *total
= sparc_costs
->float_move
;
8477 *total
= sparc_costs
->float_sqrt_df
;
8479 *total
= sparc_costs
->float_sqrt_sf
;
8484 *total
= sparc_costs
->float_cmp
;
8486 *total
= COSTS_N_INSNS (1);
8491 *total
= sparc_costs
->float_cmove
;
8493 *total
= sparc_costs
->int_cmove
;
8501 /* Emit the sequence of insns SEQ while preserving the register REG. */
8504 emit_and_preserve (rtx seq
, rtx reg
)
8506 rtx slot
= gen_rtx_MEM (word_mode
,
8507 plus_constant (stack_pointer_rtx
, SPARC_STACK_BIAS
));
8509 emit_stack_pointer_decrement (GEN_INT (UNITS_PER_WORD
));
8510 emit_insn (gen_rtx_SET (VOIDmode
, slot
, reg
));
8512 emit_insn (gen_rtx_SET (VOIDmode
, reg
, slot
));
8513 emit_stack_pointer_increment (GEN_INT (UNITS_PER_WORD
));
8516 /* Output code to add DELTA to the first argument, and then jump to FUNCTION.
8517 Used for C++ multiple inheritance. */
8520 sparc_output_mi_thunk (FILE *file
, tree thunk_fndecl ATTRIBUTE_UNUSED
,
8521 HOST_WIDE_INT delta
,
8522 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED
,
8525 rtx
this, insn
, funexp
, delta_rtx
;
8526 unsigned int int_arg_first
;
8528 reload_completed
= 1;
8529 epilogue_completed
= 1;
8531 reset_block_changes ();
8533 emit_note (NOTE_INSN_PROLOGUE_END
);
8535 if (flag_delayed_branch
)
8537 /* We will emit a regular sibcall below, so we need to instruct
8538 output_sibcall that we are in a leaf function. */
8539 current_function_uses_only_leaf_regs
= 1;
8541 /* This will cause final.c to invoke leaf_renumber_regs so we
8542 must behave as if we were in a not-yet-leafified function. */
8543 int_arg_first
= SPARC_INCOMING_INT_ARG_FIRST
;
8547 /* We will emit the sibcall manually below, so we will need to
8548 manually spill non-leaf registers. */
8549 current_function_uses_only_leaf_regs
= 0;
8551 /* We really are in a leaf function. */
8552 int_arg_first
= SPARC_OUTGOING_INT_ARG_FIRST
;
8555 /* Find the "this" pointer. Normally in %o0, but in ARCH64 if the function
8556 returns a structure, the structure return pointer is there instead. */
8557 if (TARGET_ARCH64
&& aggregate_value_p (TREE_TYPE (TREE_TYPE (function
)), function
))
8558 this = gen_rtx_REG (Pmode
, int_arg_first
+ 1);
8560 this = gen_rtx_REG (Pmode
, int_arg_first
);
8562 /* Add DELTA. When possible use a plain add, otherwise load it into
8563 a register first. */
8564 delta_rtx
= GEN_INT (delta
);
8565 if (!SPARC_SIMM13_P (delta
))
8567 rtx scratch
= gen_rtx_REG (Pmode
, 1);
8569 if (input_operand (delta_rtx
, GET_MODE (scratch
)))
8570 emit_insn (gen_rtx_SET (VOIDmode
, scratch
, delta_rtx
));
8574 sparc_emit_set_const64 (scratch
, delta_rtx
);
8576 sparc_emit_set_const32 (scratch
, delta_rtx
);
8579 delta_rtx
= scratch
;
8582 emit_insn (gen_rtx_SET (VOIDmode
,
8584 gen_rtx_PLUS (Pmode
, this, delta_rtx
)));
8586 /* Generate a tail call to the target function. */
8587 if (! TREE_USED (function
))
8589 assemble_external (function
);
8590 TREE_USED (function
) = 1;
8592 funexp
= XEXP (DECL_RTL (function
), 0);
8594 if (flag_delayed_branch
)
8596 funexp
= gen_rtx_MEM (FUNCTION_MODE
, funexp
);
8597 insn
= emit_call_insn (gen_sibcall (funexp
));
8598 SIBLING_CALL_P (insn
) = 1;
8602 /* The hoops we have to jump through in order to generate a sibcall
8603 without using delay slots... */
8604 rtx spill_reg
, seq
, scratch
= gen_rtx_REG (Pmode
, 1);
8608 spill_reg
= gen_rtx_REG (word_mode
, 15); /* %o7 */
8610 load_pic_register (); /* clobbers %o7 */
8611 scratch
= legitimize_pic_address (funexp
, Pmode
, scratch
);
8614 emit_and_preserve (seq
, spill_reg
);
8616 else if (TARGET_ARCH32
)
8618 emit_insn (gen_rtx_SET (VOIDmode
,
8620 gen_rtx_HIGH (SImode
, funexp
)));
8621 emit_insn (gen_rtx_SET (VOIDmode
,
8623 gen_rtx_LO_SUM (SImode
, scratch
, funexp
)));
8625 else /* TARGET_ARCH64 */
8627 switch (sparc_cmodel
)
8631 /* The destination can serve as a temporary. */
8632 sparc_emit_set_symbolic_const64 (scratch
, funexp
, scratch
);
8637 /* The destination cannot serve as a temporary. */
8638 spill_reg
= gen_rtx_REG (DImode
, 15); /* %o7 */
8640 sparc_emit_set_symbolic_const64 (scratch
, funexp
, spill_reg
);
8643 emit_and_preserve (seq
, spill_reg
);
8651 emit_jump_insn (gen_indirect_jump (scratch
));
8656 /* Run just enough of rest_of_compilation to get the insns emitted.
8657 There's not really enough bulk here to make other passes such as
8658 instruction scheduling worth while. Note that use_thunk calls
8659 assemble_start_function and assemble_end_function. */
8660 insn
= get_insns ();
8661 insn_locators_initialize ();
8662 shorten_branches (insn
);
8663 final_start_function (insn
, file
, 1);
8664 final (insn
, file
, 1, 0);
8665 final_end_function ();
8667 reload_completed
= 0;
8668 epilogue_completed
= 0;
8672 /* How to allocate a 'struct machine_function'. */
8674 static struct machine_function
*
8675 sparc_init_machine_status (void)
8677 return ggc_alloc_cleared (sizeof (struct machine_function
));
8680 /* Locate some local-dynamic symbol still in use by this function
8681 so that we can print its name in local-dynamic base patterns. */
8684 get_some_local_dynamic_name (void)
8688 if (cfun
->machine
->some_ld_name
)
8689 return cfun
->machine
->some_ld_name
;
8691 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
8693 && for_each_rtx (&PATTERN (insn
), get_some_local_dynamic_name_1
, 0))
8694 return cfun
->machine
->some_ld_name
;
8700 get_some_local_dynamic_name_1 (rtx
*px
, void *data ATTRIBUTE_UNUSED
)
8705 && GET_CODE (x
) == SYMBOL_REF
8706 && SYMBOL_REF_TLS_MODEL (x
) == TLS_MODEL_LOCAL_DYNAMIC
)
8708 cfun
->machine
->some_ld_name
= XSTR (x
, 0);
8715 /* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
8716 We need to emit DTP-relative relocations. */
8719 sparc_output_dwarf_dtprel (FILE *file
, int size
, rtx x
)
8724 fputs ("\t.word\t%r_tls_dtpoff32(", file
);
8727 fputs ("\t.xword\t%r_tls_dtpoff64(", file
);
8732 output_addr_const (file
, x
);
8736 #include "gt-sparc.h"