Sync usage with man page.
[netbsd-mini2440.git] / gnu / dist / gcc4 / gcc / config / sparc / sparc.c
blob1360594bb9b4ffa92194e406e3deee0418114bbf
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, 2005 Free Software Foundation, Inc.
4 Contributed by Michael Tiemann (tiemann@cygnus.com)
5 64-bit SPARC-V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
6 at Cygnus Support.
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2, or (at your option)
13 any later version.
15 GCC is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING. If not, write to
22 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
23 Boston, MA 02110-1301, USA. */
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "tm.h"
29 #include "tree.h"
30 #include "rtl.h"
31 #include "regs.h"
32 #include "hard-reg-set.h"
33 #include "real.h"
34 #include "insn-config.h"
35 #include "insn-codes.h"
36 #include "conditions.h"
37 #include "output.h"
38 #include "insn-attr.h"
39 #include "flags.h"
40 #include "function.h"
41 #include "expr.h"
42 #include "optabs.h"
43 #include "recog.h"
44 #include "toplev.h"
45 #include "ggc.h"
46 #include "tm_p.h"
47 #include "debug.h"
48 #include "target.h"
49 #include "target-def.h"
50 #include "cfglayout.h"
51 #include "tree-gimple.h"
52 #include "langhooks.h"
54 /* Processor costs */
55 static const
56 struct processor_costs cypress_costs = {
57 COSTS_N_INSNS (2), /* int load */
58 COSTS_N_INSNS (2), /* int signed load */
59 COSTS_N_INSNS (2), /* int zeroed load */
60 COSTS_N_INSNS (2), /* float load */
61 COSTS_N_INSNS (5), /* fmov, fneg, fabs */
62 COSTS_N_INSNS (5), /* fadd, fsub */
63 COSTS_N_INSNS (1), /* fcmp */
64 COSTS_N_INSNS (1), /* fmov, fmovr */
65 COSTS_N_INSNS (7), /* fmul */
66 COSTS_N_INSNS (37), /* fdivs */
67 COSTS_N_INSNS (37), /* fdivd */
68 COSTS_N_INSNS (63), /* fsqrts */
69 COSTS_N_INSNS (63), /* fsqrtd */
70 COSTS_N_INSNS (1), /* imul */
71 COSTS_N_INSNS (1), /* imulX */
72 0, /* imul bit factor */
73 COSTS_N_INSNS (1), /* idiv */
74 COSTS_N_INSNS (1), /* idivX */
75 COSTS_N_INSNS (1), /* movcc/movr */
76 0, /* shift penalty */
79 static const
80 struct processor_costs supersparc_costs = {
81 COSTS_N_INSNS (1), /* int load */
82 COSTS_N_INSNS (1), /* int signed load */
83 COSTS_N_INSNS (1), /* int zeroed load */
84 COSTS_N_INSNS (0), /* float load */
85 COSTS_N_INSNS (3), /* fmov, fneg, fabs */
86 COSTS_N_INSNS (3), /* fadd, fsub */
87 COSTS_N_INSNS (3), /* fcmp */
88 COSTS_N_INSNS (1), /* fmov, fmovr */
89 COSTS_N_INSNS (3), /* fmul */
90 COSTS_N_INSNS (6), /* fdivs */
91 COSTS_N_INSNS (9), /* fdivd */
92 COSTS_N_INSNS (12), /* fsqrts */
93 COSTS_N_INSNS (12), /* fsqrtd */
94 COSTS_N_INSNS (4), /* imul */
95 COSTS_N_INSNS (4), /* imulX */
96 0, /* imul bit factor */
97 COSTS_N_INSNS (4), /* idiv */
98 COSTS_N_INSNS (4), /* idivX */
99 COSTS_N_INSNS (1), /* movcc/movr */
100 1, /* shift penalty */
103 static const
104 struct processor_costs hypersparc_costs = {
105 COSTS_N_INSNS (1), /* int load */
106 COSTS_N_INSNS (1), /* int signed load */
107 COSTS_N_INSNS (1), /* int zeroed load */
108 COSTS_N_INSNS (1), /* float load */
109 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
110 COSTS_N_INSNS (1), /* fadd, fsub */
111 COSTS_N_INSNS (1), /* fcmp */
112 COSTS_N_INSNS (1), /* fmov, fmovr */
113 COSTS_N_INSNS (1), /* fmul */
114 COSTS_N_INSNS (8), /* fdivs */
115 COSTS_N_INSNS (12), /* fdivd */
116 COSTS_N_INSNS (17), /* fsqrts */
117 COSTS_N_INSNS (17), /* fsqrtd */
118 COSTS_N_INSNS (17), /* imul */
119 COSTS_N_INSNS (17), /* imulX */
120 0, /* imul bit factor */
121 COSTS_N_INSNS (17), /* idiv */
122 COSTS_N_INSNS (17), /* idivX */
123 COSTS_N_INSNS (1), /* movcc/movr */
124 0, /* shift penalty */
127 static const
128 struct processor_costs sparclet_costs = {
129 COSTS_N_INSNS (3), /* int load */
130 COSTS_N_INSNS (3), /* int signed load */
131 COSTS_N_INSNS (1), /* int zeroed load */
132 COSTS_N_INSNS (1), /* float load */
133 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
134 COSTS_N_INSNS (1), /* fadd, fsub */
135 COSTS_N_INSNS (1), /* fcmp */
136 COSTS_N_INSNS (1), /* fmov, fmovr */
137 COSTS_N_INSNS (1), /* fmul */
138 COSTS_N_INSNS (1), /* fdivs */
139 COSTS_N_INSNS (1), /* fdivd */
140 COSTS_N_INSNS (1), /* fsqrts */
141 COSTS_N_INSNS (1), /* fsqrtd */
142 COSTS_N_INSNS (5), /* imul */
143 COSTS_N_INSNS (5), /* imulX */
144 0, /* imul bit factor */
145 COSTS_N_INSNS (5), /* idiv */
146 COSTS_N_INSNS (5), /* idivX */
147 COSTS_N_INSNS (1), /* movcc/movr */
148 0, /* shift penalty */
151 static const
152 struct processor_costs ultrasparc_costs = {
153 COSTS_N_INSNS (2), /* int load */
154 COSTS_N_INSNS (3), /* int signed load */
155 COSTS_N_INSNS (2), /* int zeroed load */
156 COSTS_N_INSNS (2), /* float load */
157 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
158 COSTS_N_INSNS (4), /* fadd, fsub */
159 COSTS_N_INSNS (1), /* fcmp */
160 COSTS_N_INSNS (2), /* fmov, fmovr */
161 COSTS_N_INSNS (4), /* fmul */
162 COSTS_N_INSNS (13), /* fdivs */
163 COSTS_N_INSNS (23), /* fdivd */
164 COSTS_N_INSNS (13), /* fsqrts */
165 COSTS_N_INSNS (23), /* fsqrtd */
166 COSTS_N_INSNS (4), /* imul */
167 COSTS_N_INSNS (4), /* imulX */
168 2, /* imul bit factor */
169 COSTS_N_INSNS (37), /* idiv */
170 COSTS_N_INSNS (68), /* idivX */
171 COSTS_N_INSNS (2), /* movcc/movr */
172 2, /* shift penalty */
175 static const
176 struct processor_costs ultrasparc3_costs = {
177 COSTS_N_INSNS (2), /* int load */
178 COSTS_N_INSNS (3), /* int signed load */
179 COSTS_N_INSNS (3), /* int zeroed load */
180 COSTS_N_INSNS (2), /* float load */
181 COSTS_N_INSNS (3), /* fmov, fneg, fabs */
182 COSTS_N_INSNS (4), /* fadd, fsub */
183 COSTS_N_INSNS (5), /* fcmp */
184 COSTS_N_INSNS (3), /* fmov, fmovr */
185 COSTS_N_INSNS (4), /* fmul */
186 COSTS_N_INSNS (17), /* fdivs */
187 COSTS_N_INSNS (20), /* fdivd */
188 COSTS_N_INSNS (20), /* fsqrts */
189 COSTS_N_INSNS (29), /* fsqrtd */
190 COSTS_N_INSNS (6), /* imul */
191 COSTS_N_INSNS (6), /* imulX */
192 0, /* imul bit factor */
193 COSTS_N_INSNS (40), /* idiv */
194 COSTS_N_INSNS (71), /* idivX */
195 COSTS_N_INSNS (2), /* movcc/movr */
196 0, /* shift penalty */
199 const struct processor_costs *sparc_costs = &cypress_costs;
201 #ifdef HAVE_AS_RELAX_OPTION
202 /* If 'as' and 'ld' are relaxing tail call insns into branch always, use
203 "or %o7,%g0,X; call Y; or X,%g0,%o7" always, so that it can be optimized.
204 With sethi/jmp, neither 'as' nor 'ld' has an easy way how to find out if
205 somebody does not branch between the sethi and jmp. */
206 #define LEAF_SIBCALL_SLOT_RESERVED_P 1
207 #else
208 #define LEAF_SIBCALL_SLOT_RESERVED_P \
209 ((TARGET_ARCH64 && !TARGET_CM_MEDLOW) || flag_pic)
210 #endif
212 /* Global variables for machine-dependent things. */
214 /* Size of frame. Need to know this to emit return insns from leaf procedures.
215 ACTUAL_FSIZE is set by sparc_compute_frame_size() which is called during the
216 reload pass. This is important as the value is later used for scheduling
217 (to see what can go in a delay slot).
218 APPARENT_FSIZE is the size of the stack less the register save area and less
219 the outgoing argument area. It is used when saving call preserved regs. */
220 static HOST_WIDE_INT apparent_fsize;
221 static HOST_WIDE_INT actual_fsize;
223 /* Number of live general or floating point registers needed to be
224 saved (as 4-byte quantities). */
225 static int num_gfregs;
227 /* The alias set for prologue/epilogue register save/restore. */
228 static GTY(()) int sparc_sr_alias_set;
230 /* The alias set for the structure return value. */
231 static GTY(()) int struct_value_alias_set;
233 /* Save the operands last given to a compare for use when we
234 generate a scc or bcc insn. */
235 rtx sparc_compare_op0, sparc_compare_op1, sparc_compare_emitted;
237 /* Vector to say how input registers are mapped to output registers.
238 HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
239 eliminate it. You must use -fomit-frame-pointer to get that. */
240 char leaf_reg_remap[] =
241 { 0, 1, 2, 3, 4, 5, 6, 7,
242 -1, -1, -1, -1, -1, -1, 14, -1,
243 -1, -1, -1, -1, -1, -1, -1, -1,
244 8, 9, 10, 11, 12, 13, -1, 15,
246 32, 33, 34, 35, 36, 37, 38, 39,
247 40, 41, 42, 43, 44, 45, 46, 47,
248 48, 49, 50, 51, 52, 53, 54, 55,
249 56, 57, 58, 59, 60, 61, 62, 63,
250 64, 65, 66, 67, 68, 69, 70, 71,
251 72, 73, 74, 75, 76, 77, 78, 79,
252 80, 81, 82, 83, 84, 85, 86, 87,
253 88, 89, 90, 91, 92, 93, 94, 95,
254 96, 97, 98, 99, 100};
256 /* Vector, indexed by hard register number, which contains 1
257 for a register that is allowable in a candidate for leaf
258 function treatment. */
259 char sparc_leaf_regs[] =
260 { 1, 1, 1, 1, 1, 1, 1, 1,
261 0, 0, 0, 0, 0, 0, 1, 0,
262 0, 0, 0, 0, 0, 0, 0, 0,
263 1, 1, 1, 1, 1, 1, 0, 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,
267 1, 1, 1, 1, 1, 1, 1, 1,
268 1, 1, 1, 1, 1, 1, 1, 1,
269 1, 1, 1, 1, 1, 1, 1, 1,
270 1, 1, 1, 1, 1, 1, 1, 1,
271 1, 1, 1, 1, 1, 1, 1, 1,
272 1, 1, 1, 1, 1};
274 struct machine_function GTY(())
276 /* Some local-dynamic TLS symbol name. */
277 const char *some_ld_name;
279 /* True if the current function is leaf and uses only leaf regs,
280 so that the SPARC leaf function optimization can be applied.
281 Private version of current_function_uses_only_leaf_regs, see
282 sparc_expand_prologue for the rationale. */
283 int leaf_function_p;
285 /* True if the data calculated by sparc_expand_prologue are valid. */
286 bool prologue_data_valid_p;
289 #define sparc_leaf_function_p cfun->machine->leaf_function_p
290 #define sparc_prologue_data_valid_p cfun->machine->prologue_data_valid_p
292 /* Register we pretend to think the frame pointer is allocated to.
293 Normally, this is %fp, but if we are in a leaf procedure, this
294 is %sp+"something". We record "something" separately as it may
295 be too big for reg+constant addressing. */
296 static rtx frame_base_reg;
297 static HOST_WIDE_INT frame_base_offset;
299 /* 1 if the next opcode is to be specially indented. */
300 int sparc_indent_opcode = 0;
302 static bool sparc_handle_option (size_t, const char *, int);
303 static void sparc_init_modes (void);
304 static void scan_record_type (tree, int *, int *, int *);
305 static int function_arg_slotno (const CUMULATIVE_ARGS *, enum machine_mode,
306 tree, int, int, int *, int *);
308 static int supersparc_adjust_cost (rtx, rtx, rtx, int);
309 static int hypersparc_adjust_cost (rtx, rtx, rtx, int);
311 static void sparc_output_addr_vec (rtx);
312 static void sparc_output_addr_diff_vec (rtx);
313 static void sparc_output_deferred_case_vectors (void);
314 static rtx sparc_builtin_saveregs (void);
315 static int epilogue_renumber (rtx *, int);
316 static bool sparc_assemble_integer (rtx, unsigned int, int);
317 static int set_extends (rtx);
318 static void emit_pic_helper (void);
319 static void load_pic_register (bool);
320 static int save_or_restore_regs (int, int, rtx, int, int);
321 static void emit_save_or_restore_regs (int);
322 static void sparc_asm_function_prologue (FILE *, HOST_WIDE_INT);
323 static void sparc_asm_function_epilogue (FILE *, HOST_WIDE_INT);
324 #ifdef OBJECT_FORMAT_ELF
325 static void sparc_elf_asm_named_section (const char *, unsigned int, tree);
326 #endif
328 static int sparc_adjust_cost (rtx, rtx, rtx, int);
329 static int sparc_issue_rate (void);
330 static void sparc_sched_init (FILE *, int, int);
331 static int sparc_use_sched_lookahead (void);
333 static void emit_soft_tfmode_libcall (const char *, int, rtx *);
334 static void emit_soft_tfmode_binop (enum rtx_code, rtx *);
335 static void emit_soft_tfmode_unop (enum rtx_code, rtx *);
336 static void emit_soft_tfmode_cvt (enum rtx_code, rtx *);
337 static void emit_hard_tfmode_operation (enum rtx_code, rtx *);
339 static bool sparc_function_ok_for_sibcall (tree, tree);
340 static void sparc_init_libfuncs (void);
341 static void sparc_init_builtins (void);
342 static void sparc_vis_init_builtins (void);
343 static rtx sparc_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
344 static tree sparc_fold_builtin (tree, tree, bool);
345 static int sparc_vis_mul8x16 (int, int);
346 static tree sparc_handle_vis_mul8x16 (int, tree, tree, tree);
347 static void sparc_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
348 HOST_WIDE_INT, tree);
349 static bool sparc_can_output_mi_thunk (tree, HOST_WIDE_INT,
350 HOST_WIDE_INT, tree);
351 static struct machine_function * sparc_init_machine_status (void);
352 static bool sparc_cannot_force_const_mem (rtx);
353 static rtx sparc_tls_get_addr (void);
354 static rtx sparc_tls_got (void);
355 static const char *get_some_local_dynamic_name (void);
356 static int get_some_local_dynamic_name_1 (rtx *, void *);
357 static bool sparc_rtx_costs (rtx, int, int, int *);
358 static bool sparc_promote_prototypes (tree);
359 static rtx sparc_struct_value_rtx (tree, int);
360 static bool sparc_return_in_memory (tree, tree);
361 static bool sparc_strict_argument_naming (CUMULATIVE_ARGS *);
362 static tree sparc_gimplify_va_arg (tree, tree, tree *, tree *);
363 static bool sparc_vector_mode_supported_p (enum machine_mode);
364 static bool sparc_pass_by_reference (CUMULATIVE_ARGS *,
365 enum machine_mode, tree, bool);
366 static int sparc_arg_partial_bytes (CUMULATIVE_ARGS *,
367 enum machine_mode, tree, bool);
368 static void sparc_dwarf_handle_frame_unspec (const char *, rtx, int);
369 static void sparc_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
370 static void sparc_file_end (void);
371 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
372 static const char *sparc_mangle_fundamental_type (tree);
373 #endif
374 #ifdef SUBTARGET_ATTRIBUTE_TABLE
375 const struct attribute_spec sparc_attribute_table[];
376 #endif
378 /* Option handling. */
380 /* Parsed value. */
381 enum cmodel sparc_cmodel;
383 char sparc_hard_reg_printed[8];
385 struct sparc_cpu_select sparc_select[] =
387 /* switch name, tune arch */
388 { (char *)0, "default", 1, 1 },
389 { (char *)0, "-mcpu=", 1, 1 },
390 { (char *)0, "-mtune=", 1, 0 },
391 { 0, 0, 0, 0 }
394 /* CPU type. This is set from TARGET_CPU_DEFAULT and -m{cpu,tune}=xxx. */
395 enum processor_type sparc_cpu;
397 /* Whether\fan FPU option was specified. */
398 static bool fpu_option_set = false;
400 /* Initialize the GCC target structure. */
402 /* The sparc default is to use .half rather than .short for aligned
403 HI objects. Use .word instead of .long on non-ELF systems. */
404 #undef TARGET_ASM_ALIGNED_HI_OP
405 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
406 #ifndef OBJECT_FORMAT_ELF
407 #undef TARGET_ASM_ALIGNED_SI_OP
408 #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
409 #endif
411 #undef TARGET_ASM_UNALIGNED_HI_OP
412 #define TARGET_ASM_UNALIGNED_HI_OP "\t.uahalf\t"
413 #undef TARGET_ASM_UNALIGNED_SI_OP
414 #define TARGET_ASM_UNALIGNED_SI_OP "\t.uaword\t"
415 #undef TARGET_ASM_UNALIGNED_DI_OP
416 #define TARGET_ASM_UNALIGNED_DI_OP "\t.uaxword\t"
418 /* The target hook has to handle DI-mode values. */
419 #undef TARGET_ASM_INTEGER
420 #define TARGET_ASM_INTEGER sparc_assemble_integer
422 #undef TARGET_ASM_FUNCTION_PROLOGUE
423 #define TARGET_ASM_FUNCTION_PROLOGUE sparc_asm_function_prologue
424 #undef TARGET_ASM_FUNCTION_EPILOGUE
425 #define TARGET_ASM_FUNCTION_EPILOGUE sparc_asm_function_epilogue
427 #undef TARGET_SCHED_ADJUST_COST
428 #define TARGET_SCHED_ADJUST_COST sparc_adjust_cost
429 #undef TARGET_SCHED_ISSUE_RATE
430 #define TARGET_SCHED_ISSUE_RATE sparc_issue_rate
431 #undef TARGET_SCHED_INIT
432 #define TARGET_SCHED_INIT sparc_sched_init
433 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
434 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD sparc_use_sched_lookahead
436 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
437 #define TARGET_FUNCTION_OK_FOR_SIBCALL sparc_function_ok_for_sibcall
439 #undef TARGET_INIT_LIBFUNCS
440 #define TARGET_INIT_LIBFUNCS sparc_init_libfuncs
441 #undef TARGET_INIT_BUILTINS
442 #define TARGET_INIT_BUILTINS sparc_init_builtins
444 #undef TARGET_EXPAND_BUILTIN
445 #define TARGET_EXPAND_BUILTIN sparc_expand_builtin
446 #undef TARGET_FOLD_BUILTIN
447 #define TARGET_FOLD_BUILTIN sparc_fold_builtin
449 #if TARGET_TLS
450 #undef TARGET_HAVE_TLS
451 #define TARGET_HAVE_TLS true
452 #endif
454 #undef TARGET_CANNOT_FORCE_CONST_MEM
455 #define TARGET_CANNOT_FORCE_CONST_MEM sparc_cannot_force_const_mem
457 #undef TARGET_ASM_OUTPUT_MI_THUNK
458 #define TARGET_ASM_OUTPUT_MI_THUNK sparc_output_mi_thunk
459 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
460 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK sparc_can_output_mi_thunk
462 #undef TARGET_RTX_COSTS
463 #define TARGET_RTX_COSTS sparc_rtx_costs
464 #undef TARGET_ADDRESS_COST
465 #define TARGET_ADDRESS_COST hook_int_rtx_0
467 /* This is only needed for TARGET_ARCH64, but since PROMOTE_FUNCTION_MODE is a
468 no-op for TARGET_ARCH32 this is ok. Otherwise we'd need to add a runtime
469 test for this value. */
470 #undef TARGET_PROMOTE_FUNCTION_ARGS
471 #define TARGET_PROMOTE_FUNCTION_ARGS hook_bool_tree_true
473 /* This is only needed for TARGET_ARCH64, but since PROMOTE_FUNCTION_MODE is a
474 no-op for TARGET_ARCH32 this is ok. Otherwise we'd need to add a runtime
475 test for this value. */
476 #undef TARGET_PROMOTE_FUNCTION_RETURN
477 #define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
479 #undef TARGET_PROMOTE_PROTOTYPES
480 #define TARGET_PROMOTE_PROTOTYPES sparc_promote_prototypes
482 #undef TARGET_STRUCT_VALUE_RTX
483 #define TARGET_STRUCT_VALUE_RTX sparc_struct_value_rtx
484 #undef TARGET_RETURN_IN_MEMORY
485 #define TARGET_RETURN_IN_MEMORY sparc_return_in_memory
486 #undef TARGET_MUST_PASS_IN_STACK
487 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
488 #undef TARGET_PASS_BY_REFERENCE
489 #define TARGET_PASS_BY_REFERENCE sparc_pass_by_reference
490 #undef TARGET_ARG_PARTIAL_BYTES
491 #define TARGET_ARG_PARTIAL_BYTES sparc_arg_partial_bytes
493 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
494 #define TARGET_EXPAND_BUILTIN_SAVEREGS sparc_builtin_saveregs
495 #undef TARGET_STRICT_ARGUMENT_NAMING
496 #define TARGET_STRICT_ARGUMENT_NAMING sparc_strict_argument_naming
498 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
499 #define TARGET_GIMPLIFY_VA_ARG_EXPR sparc_gimplify_va_arg
501 #undef TARGET_VECTOR_MODE_SUPPORTED_P
502 #define TARGET_VECTOR_MODE_SUPPORTED_P sparc_vector_mode_supported_p
504 #undef TARGET_DWARF_HANDLE_FRAME_UNSPEC
505 #define TARGET_DWARF_HANDLE_FRAME_UNSPEC sparc_dwarf_handle_frame_unspec
507 #ifdef SUBTARGET_INSERT_ATTRIBUTES
508 #undef TARGET_INSERT_ATTRIBUTES
509 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
510 #endif
512 #ifdef SUBTARGET_ATTRIBUTE_TABLE
513 #undef TARGET_ATTRIBUTE_TABLE
514 #define TARGET_ATTRIBUTE_TABLE sparc_attribute_table
515 #endif
517 #undef TARGET_RELAXED_ORDERING
518 #define TARGET_RELAXED_ORDERING SPARC_RELAXED_ORDERING
520 #undef TARGET_DEFAULT_TARGET_FLAGS
521 #define TARGET_DEFAULT_TARGET_FLAGS TARGET_DEFAULT
522 #undef TARGET_HANDLE_OPTION
523 #define TARGET_HANDLE_OPTION sparc_handle_option
525 #if TARGET_GNU_TLS
526 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
527 #define TARGET_ASM_OUTPUT_DWARF_DTPREL sparc_output_dwarf_dtprel
528 #endif
530 #undef TARGET_ASM_FILE_END
531 #define TARGET_ASM_FILE_END sparc_file_end
533 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
534 #undef TARGET_MANGLE_FUNDAMENTAL_TYPE
535 #define TARGET_MANGLE_FUNDAMENTAL_TYPE sparc_mangle_fundamental_type
536 #endif
538 struct gcc_target targetm = TARGET_INITIALIZER;
540 /* Implement TARGET_HANDLE_OPTION. */
542 static bool
543 sparc_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
545 switch (code)
547 case OPT_mfpu:
548 case OPT_mhard_float:
549 case OPT_msoft_float:
550 fpu_option_set = true;
551 break;
553 case OPT_mcpu_:
554 sparc_select[1].string = arg;
555 break;
557 case OPT_mtune_:
558 sparc_select[2].string = arg;
559 break;
562 return true;
565 /* Validate and override various options, and do some machine dependent
566 initialization. */
568 void
569 sparc_override_options (void)
571 static struct code_model {
572 const char *const name;
573 const int value;
574 } const cmodels[] = {
575 { "32", CM_32 },
576 { "medlow", CM_MEDLOW },
577 { "medmid", CM_MEDMID },
578 { "medany", CM_MEDANY },
579 { "embmedany", CM_EMBMEDANY },
580 { 0, 0 }
582 const struct code_model *cmodel;
583 /* Map TARGET_CPU_DEFAULT to value for -m{arch,tune}=. */
584 static struct cpu_default {
585 const int cpu;
586 const char *const name;
587 } const cpu_default[] = {
588 /* There must be one entry here for each TARGET_CPU value. */
589 { TARGET_CPU_sparc, "cypress" },
590 { TARGET_CPU_sparclet, "tsc701" },
591 { TARGET_CPU_sparclite, "f930" },
592 { TARGET_CPU_v8, "v8" },
593 { TARGET_CPU_hypersparc, "hypersparc" },
594 { TARGET_CPU_sparclite86x, "sparclite86x" },
595 { TARGET_CPU_supersparc, "supersparc" },
596 { TARGET_CPU_v9, "v9" },
597 { TARGET_CPU_ultrasparc, "ultrasparc" },
598 { TARGET_CPU_ultrasparc3, "ultrasparc3" },
599 { 0, 0 }
601 const struct cpu_default *def;
602 /* Table of values for -m{cpu,tune}=. */
603 static struct cpu_table {
604 const char *const name;
605 const enum processor_type processor;
606 const int disable;
607 const int enable;
608 } const cpu_table[] = {
609 { "v7", PROCESSOR_V7, MASK_ISA, 0 },
610 { "cypress", PROCESSOR_CYPRESS, MASK_ISA, 0 },
611 { "v8", PROCESSOR_V8, MASK_ISA, MASK_V8 },
612 /* TI TMS390Z55 supersparc */
613 { "supersparc", PROCESSOR_SUPERSPARC, MASK_ISA, MASK_V8 },
614 { "sparclite", PROCESSOR_SPARCLITE, MASK_ISA, MASK_SPARCLITE },
615 /* The Fujitsu MB86930 is the original sparclite chip, with no fpu.
616 The Fujitsu MB86934 is the recent sparclite chip, with an fpu. */
617 { "f930", PROCESSOR_F930, MASK_ISA|MASK_FPU, MASK_SPARCLITE },
618 { "f934", PROCESSOR_F934, MASK_ISA, MASK_SPARCLITE|MASK_FPU },
619 { "hypersparc", PROCESSOR_HYPERSPARC, MASK_ISA, MASK_V8|MASK_FPU },
620 { "sparclite86x", PROCESSOR_SPARCLITE86X, MASK_ISA|MASK_FPU,
621 MASK_SPARCLITE },
622 { "sparclet", PROCESSOR_SPARCLET, MASK_ISA, MASK_SPARCLET },
623 /* TEMIC sparclet */
624 { "tsc701", PROCESSOR_TSC701, MASK_ISA, MASK_SPARCLET },
625 { "v9", PROCESSOR_V9, MASK_ISA, MASK_V9 },
626 /* TI ultrasparc I, II, IIi */
627 { "ultrasparc", PROCESSOR_ULTRASPARC, MASK_ISA, MASK_V9
628 /* Although insns using %y are deprecated, it is a clear win on current
629 ultrasparcs. */
630 |MASK_DEPRECATED_V8_INSNS},
631 /* TI ultrasparc III */
632 /* ??? Check if %y issue still holds true in ultra3. */
633 { "ultrasparc3", PROCESSOR_ULTRASPARC3, MASK_ISA, MASK_V9|MASK_DEPRECATED_V8_INSNS},
634 { 0, 0, 0, 0 }
636 const struct cpu_table *cpu;
637 const struct sparc_cpu_select *sel;
638 int fpu;
640 #ifndef SPARC_BI_ARCH
641 /* Check for unsupported architecture size. */
642 if (! TARGET_64BIT != DEFAULT_ARCH32_P)
643 error ("%s is not supported by this configuration",
644 DEFAULT_ARCH32_P ? "-m64" : "-m32");
645 #endif
647 /* We force all 64bit archs to use 128 bit long double */
648 if (TARGET_64BIT && ! TARGET_LONG_DOUBLE_128)
650 error ("-mlong-double-64 not allowed with -m64");
651 target_flags |= MASK_LONG_DOUBLE_128;
654 /* Code model selection. */
655 sparc_cmodel = SPARC_DEFAULT_CMODEL;
657 #ifdef SPARC_BI_ARCH
658 if (TARGET_ARCH32)
659 sparc_cmodel = CM_32;
660 #endif
662 if (sparc_cmodel_string != NULL)
664 if (TARGET_ARCH64)
666 for (cmodel = &cmodels[0]; cmodel->name; cmodel++)
667 if (strcmp (sparc_cmodel_string, cmodel->name) == 0)
668 break;
669 if (cmodel->name == NULL)
670 error ("bad value (%s) for -mcmodel= switch", sparc_cmodel_string);
671 else
672 sparc_cmodel = cmodel->value;
674 else
675 error ("-mcmodel= is not supported on 32 bit systems");
678 fpu = target_flags & MASK_FPU; /* save current -mfpu status */
680 /* Set the default CPU. */
681 for (def = &cpu_default[0]; def->name; ++def)
682 if (def->cpu == TARGET_CPU_DEFAULT)
683 break;
684 gcc_assert (def->name);
685 sparc_select[0].string = def->name;
687 for (sel = &sparc_select[0]; sel->name; ++sel)
689 if (sel->string)
691 for (cpu = &cpu_table[0]; cpu->name; ++cpu)
692 if (! strcmp (sel->string, cpu->name))
694 if (sel->set_tune_p)
695 sparc_cpu = cpu->processor;
697 if (sel->set_arch_p)
699 target_flags &= ~cpu->disable;
700 target_flags |= cpu->enable;
702 break;
705 if (! cpu->name)
706 error ("bad value (%s) for %s switch", sel->string, sel->name);
710 /* If -mfpu or -mno-fpu was explicitly used, don't override with
711 the processor default. */
712 if (fpu_option_set)
713 target_flags = (target_flags & ~MASK_FPU) | fpu;
715 /* Don't allow -mvis if FPU is disabled. */
716 if (! TARGET_FPU)
717 target_flags &= ~MASK_VIS;
719 /* -mvis assumes UltraSPARC+, so we are sure v9 instructions
720 are available.
721 -m64 also implies v9. */
722 if (TARGET_VIS || TARGET_ARCH64)
724 target_flags |= MASK_V9;
725 target_flags &= ~(MASK_V8 | MASK_SPARCLET | MASK_SPARCLITE);
728 /* Use the deprecated v8 insns for sparc64 in 32 bit mode. */
729 if (TARGET_V9 && TARGET_ARCH32)
730 target_flags |= MASK_DEPRECATED_V8_INSNS;
732 /* V8PLUS requires V9, makes no sense in 64 bit mode. */
733 if (! TARGET_V9 || TARGET_ARCH64)
734 target_flags &= ~MASK_V8PLUS;
736 /* Don't use stack biasing in 32 bit mode. */
737 if (TARGET_ARCH32)
738 target_flags &= ~MASK_STACK_BIAS;
740 /* Supply a default value for align_functions. */
741 if (align_functions == 0
742 && (sparc_cpu == PROCESSOR_ULTRASPARC
743 || sparc_cpu == PROCESSOR_ULTRASPARC3))
744 align_functions = 32;
746 /* Validate PCC_STRUCT_RETURN. */
747 if (flag_pcc_struct_return == DEFAULT_PCC_STRUCT_RETURN)
748 flag_pcc_struct_return = (TARGET_ARCH64 ? 0 : 1);
750 /* Only use .uaxword when compiling for a 64-bit target. */
751 if (!TARGET_ARCH64)
752 targetm.asm_out.unaligned_op.di = NULL;
754 /* Do various machine dependent initializations. */
755 sparc_init_modes ();
757 /* Acquire unique alias sets for our private stuff. */
758 sparc_sr_alias_set = new_alias_set ();
759 struct_value_alias_set = new_alias_set ();
761 /* Set up function hooks. */
762 init_machine_status = sparc_init_machine_status;
764 switch (sparc_cpu)
766 case PROCESSOR_V7:
767 case PROCESSOR_CYPRESS:
768 sparc_costs = &cypress_costs;
769 break;
770 case PROCESSOR_V8:
771 case PROCESSOR_SPARCLITE:
772 case PROCESSOR_SUPERSPARC:
773 sparc_costs = &supersparc_costs;
774 break;
775 case PROCESSOR_F930:
776 case PROCESSOR_F934:
777 case PROCESSOR_HYPERSPARC:
778 case PROCESSOR_SPARCLITE86X:
779 sparc_costs = &hypersparc_costs;
780 break;
781 case PROCESSOR_SPARCLET:
782 case PROCESSOR_TSC701:
783 sparc_costs = &sparclet_costs;
784 break;
785 case PROCESSOR_V9:
786 case PROCESSOR_ULTRASPARC:
787 sparc_costs = &ultrasparc_costs;
788 break;
789 case PROCESSOR_ULTRASPARC3:
790 sparc_costs = &ultrasparc3_costs;
791 break;
795 #ifdef SUBTARGET_ATTRIBUTE_TABLE
796 /* Table of valid machine attributes. */
797 const struct attribute_spec sparc_attribute_table[] =
799 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
800 SUBTARGET_ATTRIBUTE_TABLE,
801 { NULL, 0, 0, false, false, false, NULL }
803 #endif
805 /* Miscellaneous utilities. */
807 /* Nonzero if CODE, a comparison, is suitable for use in v9 conditional move
808 or branch on register contents instructions. */
811 v9_regcmp_p (enum rtx_code code)
813 return (code == EQ || code == NE || code == GE || code == LT
814 || code == LE || code == GT);
817 /* Nonzero if OP is a floating point constant which can
818 be loaded into an integer register using a single
819 sethi instruction. */
822 fp_sethi_p (rtx op)
824 if (GET_CODE (op) == CONST_DOUBLE)
826 REAL_VALUE_TYPE r;
827 long i;
829 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
830 REAL_VALUE_TO_TARGET_SINGLE (r, i);
831 return !SPARC_SIMM13_P (i) && SPARC_SETHI_P (i);
834 return 0;
837 /* Nonzero if OP is a floating point constant which can
838 be loaded into an integer register using a single
839 mov instruction. */
842 fp_mov_p (rtx op)
844 if (GET_CODE (op) == CONST_DOUBLE)
846 REAL_VALUE_TYPE r;
847 long i;
849 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
850 REAL_VALUE_TO_TARGET_SINGLE (r, i);
851 return SPARC_SIMM13_P (i);
854 return 0;
857 /* Nonzero if OP is a floating point constant which can
858 be loaded into an integer register using a high/losum
859 instruction sequence. */
862 fp_high_losum_p (rtx op)
864 /* The constraints calling this should only be in
865 SFmode move insns, so any constant which cannot
866 be moved using a single insn will do. */
867 if (GET_CODE (op) == CONST_DOUBLE)
869 REAL_VALUE_TYPE r;
870 long i;
872 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
873 REAL_VALUE_TO_TARGET_SINGLE (r, i);
874 return !SPARC_SIMM13_P (i) && !SPARC_SETHI_P (i);
877 return 0;
880 /* Expand a move instruction. Return true if all work is done. */
882 bool
883 sparc_expand_move (enum machine_mode mode, rtx *operands)
885 /* Handle sets of MEM first. */
886 if (GET_CODE (operands[0]) == MEM)
888 /* 0 is a register (or a pair of registers) on SPARC. */
889 if (register_or_zero_operand (operands[1], mode))
890 return false;
892 if (!reload_in_progress)
894 operands[0] = validize_mem (operands[0]);
895 operands[1] = force_reg (mode, operands[1]);
899 /* Fixup TLS cases. */
900 if (TARGET_HAVE_TLS
901 && CONSTANT_P (operands[1])
902 && GET_CODE (operands[1]) != HIGH
903 && sparc_tls_referenced_p (operands [1]))
905 rtx sym = operands[1];
906 rtx addend = NULL;
908 if (GET_CODE (sym) == CONST && GET_CODE (XEXP (sym, 0)) == PLUS)
910 addend = XEXP (XEXP (sym, 0), 1);
911 sym = XEXP (XEXP (sym, 0), 0);
914 gcc_assert (SPARC_SYMBOL_REF_TLS_P (sym));
916 sym = legitimize_tls_address (sym);
917 if (addend)
919 sym = gen_rtx_PLUS (mode, sym, addend);
920 sym = force_operand (sym, operands[0]);
922 operands[1] = sym;
925 /* Fixup PIC cases. */
926 if (flag_pic && CONSTANT_P (operands[1]))
928 if (pic_address_needs_scratch (operands[1]))
929 operands[1] = legitimize_pic_address (operands[1], mode, 0);
931 if (GET_CODE (operands[1]) == LABEL_REF && mode == SImode)
933 emit_insn (gen_movsi_pic_label_ref (operands[0], operands[1]));
934 return true;
937 if (GET_CODE (operands[1]) == LABEL_REF && mode == DImode)
939 gcc_assert (TARGET_ARCH64);
940 emit_insn (gen_movdi_pic_label_ref (operands[0], operands[1]));
941 return true;
944 if (symbolic_operand (operands[1], mode))
946 operands[1] = legitimize_pic_address (operands[1],
947 mode,
948 (reload_in_progress ?
949 operands[0] :
950 NULL_RTX));
951 return false;
955 /* If we are trying to toss an integer constant into FP registers,
956 or loading a FP or vector constant, force it into memory. */
957 if (CONSTANT_P (operands[1])
958 && REG_P (operands[0])
959 && (SPARC_FP_REG_P (REGNO (operands[0]))
960 || SCALAR_FLOAT_MODE_P (mode)
961 || VECTOR_MODE_P (mode)))
963 /* emit_group_store will send such bogosity to us when it is
964 not storing directly into memory. So fix this up to avoid
965 crashes in output_constant_pool. */
966 if (operands [1] == const0_rtx)
967 operands[1] = CONST0_RTX (mode);
969 /* We can clear FP registers if TARGET_VIS, and always other regs. */
970 if ((TARGET_VIS || REGNO (operands[0]) < SPARC_FIRST_FP_REG)
971 && const_zero_operand (operands[1], mode))
972 return false;
974 if (REGNO (operands[0]) < SPARC_FIRST_FP_REG
975 /* We are able to build any SF constant in integer registers
976 with at most 2 instructions. */
977 && (mode == SFmode
978 /* And any DF constant in integer registers. */
979 || (mode == DFmode
980 && (reload_completed || reload_in_progress))))
981 return false;
983 operands[1] = force_const_mem (mode, operands[1]);
984 if (!reload_in_progress)
985 operands[1] = validize_mem (operands[1]);
986 return false;
989 /* Accept non-constants and valid constants unmodified. */
990 if (!CONSTANT_P (operands[1])
991 || GET_CODE (operands[1]) == HIGH
992 || input_operand (operands[1], mode))
993 return false;
995 switch (mode)
997 case QImode:
998 /* All QImode constants require only one insn, so proceed. */
999 break;
1001 case HImode:
1002 case SImode:
1003 sparc_emit_set_const32 (operands[0], operands[1]);
1004 return true;
1006 case DImode:
1007 /* input_operand should have filtered out 32-bit mode. */
1008 sparc_emit_set_const64 (operands[0], operands[1]);
1009 return true;
1011 default:
1012 gcc_unreachable ();
1015 return false;
1018 /* Load OP1, a 32-bit constant, into OP0, a register.
1019 We know it can't be done in one insn when we get
1020 here, the move expander guarantees this. */
1022 void
1023 sparc_emit_set_const32 (rtx op0, rtx op1)
1025 enum machine_mode mode = GET_MODE (op0);
1026 rtx temp;
1028 if (reload_in_progress || reload_completed)
1029 temp = op0;
1030 else
1031 temp = gen_reg_rtx (mode);
1033 if (GET_CODE (op1) == CONST_INT)
1035 gcc_assert (!small_int_operand (op1, mode)
1036 && !const_high_operand (op1, mode));
1038 /* Emit them as real moves instead of a HIGH/LO_SUM,
1039 this way CSE can see everything and reuse intermediate
1040 values if it wants. */
1041 emit_insn (gen_rtx_SET (VOIDmode, temp,
1042 GEN_INT (INTVAL (op1)
1043 & ~(HOST_WIDE_INT)0x3ff)));
1045 emit_insn (gen_rtx_SET (VOIDmode,
1046 op0,
1047 gen_rtx_IOR (mode, temp,
1048 GEN_INT (INTVAL (op1) & 0x3ff))));
1050 else
1052 /* A symbol, emit in the traditional way. */
1053 emit_insn (gen_rtx_SET (VOIDmode, temp,
1054 gen_rtx_HIGH (mode, op1)));
1055 emit_insn (gen_rtx_SET (VOIDmode,
1056 op0, gen_rtx_LO_SUM (mode, temp, op1)));
1060 /* Load OP1, a symbolic 64-bit constant, into OP0, a DImode register.
1061 If TEMP is nonzero, we are forbidden to use any other scratch
1062 registers. Otherwise, we are allowed to generate them as needed.
1064 Note that TEMP may have TImode if the code model is TARGET_CM_MEDANY
1065 or TARGET_CM_EMBMEDANY (see the reload_indi and reload_outdi patterns). */
1067 void
1068 sparc_emit_set_symbolic_const64 (rtx op0, rtx op1, rtx temp)
1070 rtx temp1, temp2, temp3, temp4, temp5;
1071 rtx ti_temp = 0;
1073 if (temp && GET_MODE (temp) == TImode)
1075 ti_temp = temp;
1076 temp = gen_rtx_REG (DImode, REGNO (temp));
1079 /* SPARC-V9 code-model support. */
1080 switch (sparc_cmodel)
1082 case CM_MEDLOW:
1083 /* The range spanned by all instructions in the object is less
1084 than 2^31 bytes (2GB) and the distance from any instruction
1085 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1086 than 2^31 bytes (2GB).
1088 The executable must be in the low 4TB of the virtual address
1089 space.
1091 sethi %hi(symbol), %temp1
1092 or %temp1, %lo(symbol), %reg */
1093 if (temp)
1094 temp1 = temp; /* op0 is allowed. */
1095 else
1096 temp1 = gen_reg_rtx (DImode);
1098 emit_insn (gen_rtx_SET (VOIDmode, temp1, gen_rtx_HIGH (DImode, op1)));
1099 emit_insn (gen_rtx_SET (VOIDmode, op0, gen_rtx_LO_SUM (DImode, temp1, op1)));
1100 break;
1102 case CM_MEDMID:
1103 /* The range spanned by all instructions in the object is less
1104 than 2^31 bytes (2GB) and the distance from any instruction
1105 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1106 than 2^31 bytes (2GB).
1108 The executable must be in the low 16TB of the virtual address
1109 space.
1111 sethi %h44(symbol), %temp1
1112 or %temp1, %m44(symbol), %temp2
1113 sllx %temp2, 12, %temp3
1114 or %temp3, %l44(symbol), %reg */
1115 if (temp)
1117 temp1 = op0;
1118 temp2 = op0;
1119 temp3 = temp; /* op0 is allowed. */
1121 else
1123 temp1 = gen_reg_rtx (DImode);
1124 temp2 = gen_reg_rtx (DImode);
1125 temp3 = gen_reg_rtx (DImode);
1128 emit_insn (gen_seth44 (temp1, op1));
1129 emit_insn (gen_setm44 (temp2, temp1, op1));
1130 emit_insn (gen_rtx_SET (VOIDmode, temp3,
1131 gen_rtx_ASHIFT (DImode, temp2, GEN_INT (12))));
1132 emit_insn (gen_setl44 (op0, temp3, op1));
1133 break;
1135 case CM_MEDANY:
1136 /* The range spanned by all instructions in the object is less
1137 than 2^31 bytes (2GB) and the distance from any instruction
1138 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1139 than 2^31 bytes (2GB).
1141 The executable can be placed anywhere in the virtual address
1142 space.
1144 sethi %hh(symbol), %temp1
1145 sethi %lm(symbol), %temp2
1146 or %temp1, %hm(symbol), %temp3
1147 sllx %temp3, 32, %temp4
1148 or %temp4, %temp2, %temp5
1149 or %temp5, %lo(symbol), %reg */
1150 if (temp)
1152 /* It is possible that one of the registers we got for operands[2]
1153 might coincide with that of operands[0] (which is why we made
1154 it TImode). Pick the other one to use as our scratch. */
1155 if (rtx_equal_p (temp, op0))
1157 gcc_assert (ti_temp);
1158 temp = gen_rtx_REG (DImode, REGNO (temp) + 1);
1160 temp1 = op0;
1161 temp2 = temp; /* op0 is _not_ allowed, see above. */
1162 temp3 = op0;
1163 temp4 = op0;
1164 temp5 = op0;
1166 else
1168 temp1 = gen_reg_rtx (DImode);
1169 temp2 = gen_reg_rtx (DImode);
1170 temp3 = gen_reg_rtx (DImode);
1171 temp4 = gen_reg_rtx (DImode);
1172 temp5 = gen_reg_rtx (DImode);
1175 emit_insn (gen_sethh (temp1, op1));
1176 emit_insn (gen_setlm (temp2, op1));
1177 emit_insn (gen_sethm (temp3, temp1, op1));
1178 emit_insn (gen_rtx_SET (VOIDmode, temp4,
1179 gen_rtx_ASHIFT (DImode, temp3, GEN_INT (32))));
1180 emit_insn (gen_rtx_SET (VOIDmode, temp5,
1181 gen_rtx_PLUS (DImode, temp4, temp2)));
1182 emit_insn (gen_setlo (op0, temp5, op1));
1183 break;
1185 case CM_EMBMEDANY:
1186 /* Old old old backwards compatibility kruft here.
1187 Essentially it is MEDLOW with a fixed 64-bit
1188 virtual base added to all data segment addresses.
1189 Text-segment stuff is computed like MEDANY, we can't
1190 reuse the code above because the relocation knobs
1191 look different.
1193 Data segment: sethi %hi(symbol), %temp1
1194 add %temp1, EMBMEDANY_BASE_REG, %temp2
1195 or %temp2, %lo(symbol), %reg */
1196 if (data_segment_operand (op1, GET_MODE (op1)))
1198 if (temp)
1200 temp1 = temp; /* op0 is allowed. */
1201 temp2 = op0;
1203 else
1205 temp1 = gen_reg_rtx (DImode);
1206 temp2 = gen_reg_rtx (DImode);
1209 emit_insn (gen_embmedany_sethi (temp1, op1));
1210 emit_insn (gen_embmedany_brsum (temp2, temp1));
1211 emit_insn (gen_embmedany_losum (op0, temp2, op1));
1214 /* Text segment: sethi %uhi(symbol), %temp1
1215 sethi %hi(symbol), %temp2
1216 or %temp1, %ulo(symbol), %temp3
1217 sllx %temp3, 32, %temp4
1218 or %temp4, %temp2, %temp5
1219 or %temp5, %lo(symbol), %reg */
1220 else
1222 if (temp)
1224 /* It is possible that one of the registers we got for operands[2]
1225 might coincide with that of operands[0] (which is why we made
1226 it TImode). Pick the other one to use as our scratch. */
1227 if (rtx_equal_p (temp, op0))
1229 gcc_assert (ti_temp);
1230 temp = gen_rtx_REG (DImode, REGNO (temp) + 1);
1232 temp1 = op0;
1233 temp2 = temp; /* op0 is _not_ allowed, see above. */
1234 temp3 = op0;
1235 temp4 = op0;
1236 temp5 = op0;
1238 else
1240 temp1 = gen_reg_rtx (DImode);
1241 temp2 = gen_reg_rtx (DImode);
1242 temp3 = gen_reg_rtx (DImode);
1243 temp4 = gen_reg_rtx (DImode);
1244 temp5 = gen_reg_rtx (DImode);
1247 emit_insn (gen_embmedany_textuhi (temp1, op1));
1248 emit_insn (gen_embmedany_texthi (temp2, op1));
1249 emit_insn (gen_embmedany_textulo (temp3, temp1, op1));
1250 emit_insn (gen_rtx_SET (VOIDmode, temp4,
1251 gen_rtx_ASHIFT (DImode, temp3, GEN_INT (32))));
1252 emit_insn (gen_rtx_SET (VOIDmode, temp5,
1253 gen_rtx_PLUS (DImode, temp4, temp2)));
1254 emit_insn (gen_embmedany_textlo (op0, temp5, op1));
1256 break;
1258 default:
1259 gcc_unreachable ();
1263 #if HOST_BITS_PER_WIDE_INT == 32
1264 void
1265 sparc_emit_set_const64 (rtx op0 ATTRIBUTE_UNUSED, rtx op1 ATTRIBUTE_UNUSED)
1267 gcc_unreachable ();
1269 #else
1270 /* These avoid problems when cross compiling. If we do not
1271 go through all this hair then the optimizer will see
1272 invalid REG_EQUAL notes or in some cases none at all. */
1273 static rtx gen_safe_HIGH64 (rtx, HOST_WIDE_INT);
1274 static rtx gen_safe_SET64 (rtx, HOST_WIDE_INT);
1275 static rtx gen_safe_OR64 (rtx, HOST_WIDE_INT);
1276 static rtx gen_safe_XOR64 (rtx, HOST_WIDE_INT);
1278 /* The optimizer is not to assume anything about exactly
1279 which bits are set for a HIGH, they are unspecified.
1280 Unfortunately this leads to many missed optimizations
1281 during CSE. We mask out the non-HIGH bits, and matches
1282 a plain movdi, to alleviate this problem. */
1283 static rtx
1284 gen_safe_HIGH64 (rtx dest, HOST_WIDE_INT val)
1286 return gen_rtx_SET (VOIDmode, dest, GEN_INT (val & ~(HOST_WIDE_INT)0x3ff));
1289 static rtx
1290 gen_safe_SET64 (rtx dest, HOST_WIDE_INT val)
1292 return gen_rtx_SET (VOIDmode, dest, GEN_INT (val));
1295 static rtx
1296 gen_safe_OR64 (rtx src, HOST_WIDE_INT val)
1298 return gen_rtx_IOR (DImode, src, GEN_INT (val));
1301 static rtx
1302 gen_safe_XOR64 (rtx src, HOST_WIDE_INT val)
1304 return gen_rtx_XOR (DImode, src, GEN_INT (val));
1307 /* Worker routines for 64-bit constant formation on arch64.
1308 One of the key things to be doing in these emissions is
1309 to create as many temp REGs as possible. This makes it
1310 possible for half-built constants to be used later when
1311 such values are similar to something required later on.
1312 Without doing this, the optimizer cannot see such
1313 opportunities. */
1315 static void sparc_emit_set_const64_quick1 (rtx, rtx,
1316 unsigned HOST_WIDE_INT, int);
1318 static void
1319 sparc_emit_set_const64_quick1 (rtx op0, rtx temp,
1320 unsigned HOST_WIDE_INT low_bits, int is_neg)
1322 unsigned HOST_WIDE_INT high_bits;
1324 if (is_neg)
1325 high_bits = (~low_bits) & 0xffffffff;
1326 else
1327 high_bits = low_bits;
1329 emit_insn (gen_safe_HIGH64 (temp, high_bits));
1330 if (!is_neg)
1332 emit_insn (gen_rtx_SET (VOIDmode, op0,
1333 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
1335 else
1337 /* If we are XOR'ing with -1, then we should emit a one's complement
1338 instead. This way the combiner will notice logical operations
1339 such as ANDN later on and substitute. */
1340 if ((low_bits & 0x3ff) == 0x3ff)
1342 emit_insn (gen_rtx_SET (VOIDmode, op0,
1343 gen_rtx_NOT (DImode, temp)));
1345 else
1347 emit_insn (gen_rtx_SET (VOIDmode, op0,
1348 gen_safe_XOR64 (temp,
1349 (-(HOST_WIDE_INT)0x400
1350 | (low_bits & 0x3ff)))));
1355 static void sparc_emit_set_const64_quick2 (rtx, rtx, unsigned HOST_WIDE_INT,
1356 unsigned HOST_WIDE_INT, int);
1358 static void
1359 sparc_emit_set_const64_quick2 (rtx op0, rtx temp,
1360 unsigned HOST_WIDE_INT high_bits,
1361 unsigned HOST_WIDE_INT low_immediate,
1362 int shift_count)
1364 rtx temp2 = op0;
1366 if ((high_bits & 0xfffffc00) != 0)
1368 emit_insn (gen_safe_HIGH64 (temp, high_bits));
1369 if ((high_bits & ~0xfffffc00) != 0)
1370 emit_insn (gen_rtx_SET (VOIDmode, op0,
1371 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
1372 else
1373 temp2 = temp;
1375 else
1377 emit_insn (gen_safe_SET64 (temp, high_bits));
1378 temp2 = temp;
1381 /* Now shift it up into place. */
1382 emit_insn (gen_rtx_SET (VOIDmode, op0,
1383 gen_rtx_ASHIFT (DImode, temp2,
1384 GEN_INT (shift_count))));
1386 /* If there is a low immediate part piece, finish up by
1387 putting that in as well. */
1388 if (low_immediate != 0)
1389 emit_insn (gen_rtx_SET (VOIDmode, op0,
1390 gen_safe_OR64 (op0, low_immediate)));
1393 static void sparc_emit_set_const64_longway (rtx, rtx, unsigned HOST_WIDE_INT,
1394 unsigned HOST_WIDE_INT);
1396 /* Full 64-bit constant decomposition. Even though this is the
1397 'worst' case, we still optimize a few things away. */
1398 static void
1399 sparc_emit_set_const64_longway (rtx op0, rtx temp,
1400 unsigned HOST_WIDE_INT high_bits,
1401 unsigned HOST_WIDE_INT low_bits)
1403 rtx sub_temp;
1405 if (reload_in_progress || reload_completed)
1406 sub_temp = op0;
1407 else
1408 sub_temp = gen_reg_rtx (DImode);
1410 if ((high_bits & 0xfffffc00) != 0)
1412 emit_insn (gen_safe_HIGH64 (temp, high_bits));
1413 if ((high_bits & ~0xfffffc00) != 0)
1414 emit_insn (gen_rtx_SET (VOIDmode,
1415 sub_temp,
1416 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
1417 else
1418 sub_temp = temp;
1420 else
1422 emit_insn (gen_safe_SET64 (temp, high_bits));
1423 sub_temp = temp;
1426 if (!reload_in_progress && !reload_completed)
1428 rtx temp2 = gen_reg_rtx (DImode);
1429 rtx temp3 = gen_reg_rtx (DImode);
1430 rtx temp4 = gen_reg_rtx (DImode);
1432 emit_insn (gen_rtx_SET (VOIDmode, temp4,
1433 gen_rtx_ASHIFT (DImode, sub_temp,
1434 GEN_INT (32))));
1436 emit_insn (gen_safe_HIGH64 (temp2, low_bits));
1437 if ((low_bits & ~0xfffffc00) != 0)
1439 emit_insn (gen_rtx_SET (VOIDmode, temp3,
1440 gen_safe_OR64 (temp2, (low_bits & 0x3ff))));
1441 emit_insn (gen_rtx_SET (VOIDmode, op0,
1442 gen_rtx_PLUS (DImode, temp4, temp3)));
1444 else
1446 emit_insn (gen_rtx_SET (VOIDmode, op0,
1447 gen_rtx_PLUS (DImode, temp4, temp2)));
1450 else
1452 rtx low1 = GEN_INT ((low_bits >> (32 - 12)) & 0xfff);
1453 rtx low2 = GEN_INT ((low_bits >> (32 - 12 - 12)) & 0xfff);
1454 rtx low3 = GEN_INT ((low_bits >> (32 - 12 - 12 - 8)) & 0x0ff);
1455 int to_shift = 12;
1457 /* We are in the middle of reload, so this is really
1458 painful. However we do still make an attempt to
1459 avoid emitting truly stupid code. */
1460 if (low1 != const0_rtx)
1462 emit_insn (gen_rtx_SET (VOIDmode, op0,
1463 gen_rtx_ASHIFT (DImode, sub_temp,
1464 GEN_INT (to_shift))));
1465 emit_insn (gen_rtx_SET (VOIDmode, op0,
1466 gen_rtx_IOR (DImode, op0, low1)));
1467 sub_temp = op0;
1468 to_shift = 12;
1470 else
1472 to_shift += 12;
1474 if (low2 != const0_rtx)
1476 emit_insn (gen_rtx_SET (VOIDmode, op0,
1477 gen_rtx_ASHIFT (DImode, sub_temp,
1478 GEN_INT (to_shift))));
1479 emit_insn (gen_rtx_SET (VOIDmode, op0,
1480 gen_rtx_IOR (DImode, op0, low2)));
1481 sub_temp = op0;
1482 to_shift = 8;
1484 else
1486 to_shift += 8;
1488 emit_insn (gen_rtx_SET (VOIDmode, op0,
1489 gen_rtx_ASHIFT (DImode, sub_temp,
1490 GEN_INT (to_shift))));
1491 if (low3 != const0_rtx)
1492 emit_insn (gen_rtx_SET (VOIDmode, op0,
1493 gen_rtx_IOR (DImode, op0, low3)));
1494 /* phew... */
1498 /* Analyze a 64-bit constant for certain properties. */
1499 static void analyze_64bit_constant (unsigned HOST_WIDE_INT,
1500 unsigned HOST_WIDE_INT,
1501 int *, int *, int *);
1503 static void
1504 analyze_64bit_constant (unsigned HOST_WIDE_INT high_bits,
1505 unsigned HOST_WIDE_INT low_bits,
1506 int *hbsp, int *lbsp, int *abbasp)
1508 int lowest_bit_set, highest_bit_set, all_bits_between_are_set;
1509 int i;
1511 lowest_bit_set = highest_bit_set = -1;
1512 i = 0;
1515 if ((lowest_bit_set == -1)
1516 && ((low_bits >> i) & 1))
1517 lowest_bit_set = i;
1518 if ((highest_bit_set == -1)
1519 && ((high_bits >> (32 - i - 1)) & 1))
1520 highest_bit_set = (64 - i - 1);
1522 while (++i < 32
1523 && ((highest_bit_set == -1)
1524 || (lowest_bit_set == -1)));
1525 if (i == 32)
1527 i = 0;
1530 if ((lowest_bit_set == -1)
1531 && ((high_bits >> i) & 1))
1532 lowest_bit_set = i + 32;
1533 if ((highest_bit_set == -1)
1534 && ((low_bits >> (32 - i - 1)) & 1))
1535 highest_bit_set = 32 - i - 1;
1537 while (++i < 32
1538 && ((highest_bit_set == -1)
1539 || (lowest_bit_set == -1)));
1541 /* If there are no bits set this should have gone out
1542 as one instruction! */
1543 gcc_assert (lowest_bit_set != -1 && highest_bit_set != -1);
1544 all_bits_between_are_set = 1;
1545 for (i = lowest_bit_set; i <= highest_bit_set; i++)
1547 if (i < 32)
1549 if ((low_bits & (1 << i)) != 0)
1550 continue;
1552 else
1554 if ((high_bits & (1 << (i - 32))) != 0)
1555 continue;
1557 all_bits_between_are_set = 0;
1558 break;
1560 *hbsp = highest_bit_set;
1561 *lbsp = lowest_bit_set;
1562 *abbasp = all_bits_between_are_set;
1565 static int const64_is_2insns (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
1567 static int
1568 const64_is_2insns (unsigned HOST_WIDE_INT high_bits,
1569 unsigned HOST_WIDE_INT low_bits)
1571 int highest_bit_set, lowest_bit_set, all_bits_between_are_set;
1573 if (high_bits == 0
1574 || high_bits == 0xffffffff)
1575 return 1;
1577 analyze_64bit_constant (high_bits, low_bits,
1578 &highest_bit_set, &lowest_bit_set,
1579 &all_bits_between_are_set);
1581 if ((highest_bit_set == 63
1582 || lowest_bit_set == 0)
1583 && all_bits_between_are_set != 0)
1584 return 1;
1586 if ((highest_bit_set - lowest_bit_set) < 21)
1587 return 1;
1589 return 0;
1592 static unsigned HOST_WIDE_INT create_simple_focus_bits (unsigned HOST_WIDE_INT,
1593 unsigned HOST_WIDE_INT,
1594 int, int);
1596 static unsigned HOST_WIDE_INT
1597 create_simple_focus_bits (unsigned HOST_WIDE_INT high_bits,
1598 unsigned HOST_WIDE_INT low_bits,
1599 int lowest_bit_set, int shift)
1601 HOST_WIDE_INT hi, lo;
1603 if (lowest_bit_set < 32)
1605 lo = (low_bits >> lowest_bit_set) << shift;
1606 hi = ((high_bits << (32 - lowest_bit_set)) << shift);
1608 else
1610 lo = 0;
1611 hi = ((high_bits >> (lowest_bit_set - 32)) << shift);
1613 gcc_assert (! (hi & lo));
1614 return (hi | lo);
1617 /* Here we are sure to be arch64 and this is an integer constant
1618 being loaded into a register. Emit the most efficient
1619 insn sequence possible. Detection of all the 1-insn cases
1620 has been done already. */
1621 void
1622 sparc_emit_set_const64 (rtx op0, rtx op1)
1624 unsigned HOST_WIDE_INT high_bits, low_bits;
1625 int lowest_bit_set, highest_bit_set;
1626 int all_bits_between_are_set;
1627 rtx temp = 0;
1629 /* Sanity check that we know what we are working with. */
1630 gcc_assert (TARGET_ARCH64
1631 && (GET_CODE (op0) == SUBREG
1632 || (REG_P (op0) && ! SPARC_FP_REG_P (REGNO (op0)))));
1634 if (reload_in_progress || reload_completed)
1635 temp = op0;
1637 if (GET_CODE (op1) != CONST_INT)
1639 sparc_emit_set_symbolic_const64 (op0, op1, temp);
1640 return;
1643 if (! temp)
1644 temp = gen_reg_rtx (DImode);
1646 high_bits = ((INTVAL (op1) >> 32) & 0xffffffff);
1647 low_bits = (INTVAL (op1) & 0xffffffff);
1649 /* low_bits bits 0 --> 31
1650 high_bits bits 32 --> 63 */
1652 analyze_64bit_constant (high_bits, low_bits,
1653 &highest_bit_set, &lowest_bit_set,
1654 &all_bits_between_are_set);
1656 /* First try for a 2-insn sequence. */
1658 /* These situations are preferred because the optimizer can
1659 * do more things with them:
1660 * 1) mov -1, %reg
1661 * sllx %reg, shift, %reg
1662 * 2) mov -1, %reg
1663 * srlx %reg, shift, %reg
1664 * 3) mov some_small_const, %reg
1665 * sllx %reg, shift, %reg
1667 if (((highest_bit_set == 63
1668 || lowest_bit_set == 0)
1669 && all_bits_between_are_set != 0)
1670 || ((highest_bit_set - lowest_bit_set) < 12))
1672 HOST_WIDE_INT the_const = -1;
1673 int shift = lowest_bit_set;
1675 if ((highest_bit_set != 63
1676 && lowest_bit_set != 0)
1677 || all_bits_between_are_set == 0)
1679 the_const =
1680 create_simple_focus_bits (high_bits, low_bits,
1681 lowest_bit_set, 0);
1683 else if (lowest_bit_set == 0)
1684 shift = -(63 - highest_bit_set);
1686 gcc_assert (SPARC_SIMM13_P (the_const));
1687 gcc_assert (shift != 0);
1689 emit_insn (gen_safe_SET64 (temp, the_const));
1690 if (shift > 0)
1691 emit_insn (gen_rtx_SET (VOIDmode,
1692 op0,
1693 gen_rtx_ASHIFT (DImode,
1694 temp,
1695 GEN_INT (shift))));
1696 else if (shift < 0)
1697 emit_insn (gen_rtx_SET (VOIDmode,
1698 op0,
1699 gen_rtx_LSHIFTRT (DImode,
1700 temp,
1701 GEN_INT (-shift))));
1702 return;
1705 /* Now a range of 22 or less bits set somewhere.
1706 * 1) sethi %hi(focus_bits), %reg
1707 * sllx %reg, shift, %reg
1708 * 2) sethi %hi(focus_bits), %reg
1709 * srlx %reg, shift, %reg
1711 if ((highest_bit_set - lowest_bit_set) < 21)
1713 unsigned HOST_WIDE_INT focus_bits =
1714 create_simple_focus_bits (high_bits, low_bits,
1715 lowest_bit_set, 10);
1717 gcc_assert (SPARC_SETHI_P (focus_bits));
1718 gcc_assert (lowest_bit_set != 10);
1720 emit_insn (gen_safe_HIGH64 (temp, focus_bits));
1722 /* If lowest_bit_set == 10 then a sethi alone could have done it. */
1723 if (lowest_bit_set < 10)
1724 emit_insn (gen_rtx_SET (VOIDmode,
1725 op0,
1726 gen_rtx_LSHIFTRT (DImode, temp,
1727 GEN_INT (10 - lowest_bit_set))));
1728 else if (lowest_bit_set > 10)
1729 emit_insn (gen_rtx_SET (VOIDmode,
1730 op0,
1731 gen_rtx_ASHIFT (DImode, temp,
1732 GEN_INT (lowest_bit_set - 10))));
1733 return;
1736 /* 1) sethi %hi(low_bits), %reg
1737 * or %reg, %lo(low_bits), %reg
1738 * 2) sethi %hi(~low_bits), %reg
1739 * xor %reg, %lo(-0x400 | (low_bits & 0x3ff)), %reg
1741 if (high_bits == 0
1742 || high_bits == 0xffffffff)
1744 sparc_emit_set_const64_quick1 (op0, temp, low_bits,
1745 (high_bits == 0xffffffff));
1746 return;
1749 /* Now, try 3-insn sequences. */
1751 /* 1) sethi %hi(high_bits), %reg
1752 * or %reg, %lo(high_bits), %reg
1753 * sllx %reg, 32, %reg
1755 if (low_bits == 0)
1757 sparc_emit_set_const64_quick2 (op0, temp, high_bits, 0, 32);
1758 return;
1761 /* We may be able to do something quick
1762 when the constant is negated, so try that. */
1763 if (const64_is_2insns ((~high_bits) & 0xffffffff,
1764 (~low_bits) & 0xfffffc00))
1766 /* NOTE: The trailing bits get XOR'd so we need the
1767 non-negated bits, not the negated ones. */
1768 unsigned HOST_WIDE_INT trailing_bits = low_bits & 0x3ff;
1770 if ((((~high_bits) & 0xffffffff) == 0
1771 && ((~low_bits) & 0x80000000) == 0)
1772 || (((~high_bits) & 0xffffffff) == 0xffffffff
1773 && ((~low_bits) & 0x80000000) != 0))
1775 unsigned HOST_WIDE_INT fast_int = (~low_bits & 0xffffffff);
1777 if ((SPARC_SETHI_P (fast_int)
1778 && (~high_bits & 0xffffffff) == 0)
1779 || SPARC_SIMM13_P (fast_int))
1780 emit_insn (gen_safe_SET64 (temp, fast_int));
1781 else
1782 sparc_emit_set_const64 (temp, GEN_INT (fast_int));
1784 else
1786 rtx negated_const;
1787 negated_const = GEN_INT (((~low_bits) & 0xfffffc00) |
1788 (((HOST_WIDE_INT)((~high_bits) & 0xffffffff))<<32));
1789 sparc_emit_set_const64 (temp, negated_const);
1792 /* If we are XOR'ing with -1, then we should emit a one's complement
1793 instead. This way the combiner will notice logical operations
1794 such as ANDN later on and substitute. */
1795 if (trailing_bits == 0x3ff)
1797 emit_insn (gen_rtx_SET (VOIDmode, op0,
1798 gen_rtx_NOT (DImode, temp)));
1800 else
1802 emit_insn (gen_rtx_SET (VOIDmode,
1803 op0,
1804 gen_safe_XOR64 (temp,
1805 (-0x400 | trailing_bits))));
1807 return;
1810 /* 1) sethi %hi(xxx), %reg
1811 * or %reg, %lo(xxx), %reg
1812 * sllx %reg, yyy, %reg
1814 * ??? This is just a generalized version of the low_bits==0
1815 * thing above, FIXME...
1817 if ((highest_bit_set - lowest_bit_set) < 32)
1819 unsigned HOST_WIDE_INT focus_bits =
1820 create_simple_focus_bits (high_bits, low_bits,
1821 lowest_bit_set, 0);
1823 /* We can't get here in this state. */
1824 gcc_assert (highest_bit_set >= 32 && lowest_bit_set < 32);
1826 /* So what we know is that the set bits straddle the
1827 middle of the 64-bit word. */
1828 sparc_emit_set_const64_quick2 (op0, temp,
1829 focus_bits, 0,
1830 lowest_bit_set);
1831 return;
1834 /* 1) sethi %hi(high_bits), %reg
1835 * or %reg, %lo(high_bits), %reg
1836 * sllx %reg, 32, %reg
1837 * or %reg, low_bits, %reg
1839 if (SPARC_SIMM13_P(low_bits)
1840 && ((int)low_bits > 0))
1842 sparc_emit_set_const64_quick2 (op0, temp, high_bits, low_bits, 32);
1843 return;
1846 /* The easiest way when all else fails, is full decomposition. */
1847 #if 0
1848 printf ("sparc_emit_set_const64: Hard constant [%08lx%08lx] neg[%08lx%08lx]\n",
1849 high_bits, low_bits, ~high_bits, ~low_bits);
1850 #endif
1851 sparc_emit_set_const64_longway (op0, temp, high_bits, low_bits);
1853 #endif /* HOST_BITS_PER_WIDE_INT == 32 */
1855 /* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
1856 return the mode to be used for the comparison. For floating-point,
1857 CCFP[E]mode is used. CC_NOOVmode should be used when the first operand
1858 is a PLUS, MINUS, NEG, or ASHIFT. CCmode should be used when no special
1859 processing is needed. */
1861 enum machine_mode
1862 select_cc_mode (enum rtx_code op, rtx x, rtx y ATTRIBUTE_UNUSED)
1864 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1866 switch (op)
1868 case EQ:
1869 case NE:
1870 case UNORDERED:
1871 case ORDERED:
1872 case UNLT:
1873 case UNLE:
1874 case UNGT:
1875 case UNGE:
1876 case UNEQ:
1877 case LTGT:
1878 return CCFPmode;
1880 case LT:
1881 case LE:
1882 case GT:
1883 case GE:
1884 return CCFPEmode;
1886 default:
1887 gcc_unreachable ();
1890 else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
1891 || GET_CODE (x) == NEG || GET_CODE (x) == ASHIFT)
1893 if (TARGET_ARCH64 && GET_MODE (x) == DImode)
1894 return CCX_NOOVmode;
1895 else
1896 return CC_NOOVmode;
1898 else
1900 if (TARGET_ARCH64 && GET_MODE (x) == DImode)
1901 return CCXmode;
1902 else
1903 return CCmode;
1907 /* X and Y are two things to compare using CODE. Emit the compare insn and
1908 return the rtx for the cc reg in the proper mode. */
1911 gen_compare_reg (enum rtx_code code, rtx x, rtx y)
1913 enum machine_mode mode = SELECT_CC_MODE (code, x, y);
1914 rtx cc_reg;
1916 if (sparc_compare_emitted != NULL_RTX)
1918 cc_reg = sparc_compare_emitted;
1919 sparc_compare_emitted = NULL_RTX;
1920 return cc_reg;
1923 /* ??? We don't have movcc patterns so we cannot generate pseudo regs for the
1924 fcc regs (cse can't tell they're really call clobbered regs and will
1925 remove a duplicate comparison even if there is an intervening function
1926 call - it will then try to reload the cc reg via an int reg which is why
1927 we need the movcc patterns). It is possible to provide the movcc
1928 patterns by using the ldxfsr/stxfsr v9 insns. I tried it: you need two
1929 registers (say %g1,%g5) and it takes about 6 insns. A better fix would be
1930 to tell cse that CCFPE mode registers (even pseudos) are call
1931 clobbered. */
1933 /* ??? This is an experiment. Rather than making changes to cse which may
1934 or may not be easy/clean, we do our own cse. This is possible because
1935 we will generate hard registers. Cse knows they're call clobbered (it
1936 doesn't know the same thing about pseudos). If we guess wrong, no big
1937 deal, but if we win, great! */
1939 if (TARGET_V9 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1940 #if 1 /* experiment */
1942 int reg;
1943 /* We cycle through the registers to ensure they're all exercised. */
1944 static int next_fcc_reg = 0;
1945 /* Previous x,y for each fcc reg. */
1946 static rtx prev_args[4][2];
1948 /* Scan prev_args for x,y. */
1949 for (reg = 0; reg < 4; reg++)
1950 if (prev_args[reg][0] == x && prev_args[reg][1] == y)
1951 break;
1952 if (reg == 4)
1954 reg = next_fcc_reg;
1955 prev_args[reg][0] = x;
1956 prev_args[reg][1] = y;
1957 next_fcc_reg = (next_fcc_reg + 1) & 3;
1959 cc_reg = gen_rtx_REG (mode, reg + SPARC_FIRST_V9_FCC_REG);
1961 #else
1962 cc_reg = gen_reg_rtx (mode);
1963 #endif /* ! experiment */
1964 else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
1965 cc_reg = gen_rtx_REG (mode, SPARC_FCC_REG);
1966 else
1967 cc_reg = gen_rtx_REG (mode, SPARC_ICC_REG);
1969 emit_insn (gen_rtx_SET (VOIDmode, cc_reg,
1970 gen_rtx_COMPARE (mode, x, y)));
1972 return cc_reg;
1975 /* This function is used for v9 only.
1976 CODE is the code for an Scc's comparison.
1977 OPERANDS[0] is the target of the Scc insn.
1978 OPERANDS[1] is the value we compare against const0_rtx (which hasn't
1979 been generated yet).
1981 This function is needed to turn
1983 (set (reg:SI 110)
1984 (gt (reg:CCX 100 %icc)
1985 (const_int 0)))
1986 into
1987 (set (reg:SI 110)
1988 (gt:DI (reg:CCX 100 %icc)
1989 (const_int 0)))
1991 IE: The instruction recognizer needs to see the mode of the comparison to
1992 find the right instruction. We could use "gt:DI" right in the
1993 define_expand, but leaving it out allows us to handle DI, SI, etc.
1995 We refer to the global sparc compare operands sparc_compare_op0 and
1996 sparc_compare_op1. */
1999 gen_v9_scc (enum rtx_code compare_code, register rtx *operands)
2001 rtx temp, op0, op1;
2003 if (! TARGET_ARCH64
2004 && (GET_MODE (sparc_compare_op0) == DImode
2005 || GET_MODE (operands[0]) == DImode))
2006 return 0;
2008 op0 = sparc_compare_op0;
2009 op1 = sparc_compare_op1;
2011 /* Try to use the movrCC insns. */
2012 if (TARGET_ARCH64
2013 && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT
2014 && op1 == const0_rtx
2015 && v9_regcmp_p (compare_code))
2017 /* Special case for op0 != 0. This can be done with one instruction if
2018 operands[0] == sparc_compare_op0. */
2020 if (compare_code == NE
2021 && GET_MODE (operands[0]) == DImode
2022 && rtx_equal_p (op0, operands[0]))
2024 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2025 gen_rtx_IF_THEN_ELSE (DImode,
2026 gen_rtx_fmt_ee (compare_code, DImode,
2027 op0, const0_rtx),
2028 const1_rtx,
2029 operands[0])));
2030 return 1;
2033 if (reg_overlap_mentioned_p (operands[0], op0))
2035 /* Handle the case where operands[0] == sparc_compare_op0.
2036 We "early clobber" the result. */
2037 op0 = gen_reg_rtx (GET_MODE (sparc_compare_op0));
2038 emit_move_insn (op0, sparc_compare_op0);
2041 emit_insn (gen_rtx_SET (VOIDmode, operands[0], const0_rtx));
2042 if (GET_MODE (op0) != DImode)
2044 temp = gen_reg_rtx (DImode);
2045 convert_move (temp, op0, 0);
2047 else
2048 temp = op0;
2049 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2050 gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
2051 gen_rtx_fmt_ee (compare_code, DImode,
2052 temp, const0_rtx),
2053 const1_rtx,
2054 operands[0])));
2055 return 1;
2057 else
2059 operands[1] = gen_compare_reg (compare_code, op0, op1);
2061 switch (GET_MODE (operands[1]))
2063 case CCmode :
2064 case CCXmode :
2065 case CCFPEmode :
2066 case CCFPmode :
2067 break;
2068 default :
2069 gcc_unreachable ();
2071 emit_insn (gen_rtx_SET (VOIDmode, operands[0], const0_rtx));
2072 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2073 gen_rtx_IF_THEN_ELSE (GET_MODE (operands[0]),
2074 gen_rtx_fmt_ee (compare_code,
2075 GET_MODE (operands[1]),
2076 operands[1], const0_rtx),
2077 const1_rtx, operands[0])));
2078 return 1;
2082 /* Emit a conditional jump insn for the v9 architecture using comparison code
2083 CODE and jump target LABEL.
2084 This function exists to take advantage of the v9 brxx insns. */
2086 void
2087 emit_v9_brxx_insn (enum rtx_code code, rtx op0, rtx label)
2089 gcc_assert (sparc_compare_emitted == NULL_RTX);
2090 emit_jump_insn (gen_rtx_SET (VOIDmode,
2091 pc_rtx,
2092 gen_rtx_IF_THEN_ELSE (VOIDmode,
2093 gen_rtx_fmt_ee (code, GET_MODE (op0),
2094 op0, const0_rtx),
2095 gen_rtx_LABEL_REF (VOIDmode, label),
2096 pc_rtx)));
2099 /* Generate a DFmode part of a hard TFmode register.
2100 REG is the TFmode hard register, LOW is 1 for the
2101 low 64bit of the register and 0 otherwise.
2104 gen_df_reg (rtx reg, int low)
2106 int regno = REGNO (reg);
2108 if ((WORDS_BIG_ENDIAN == 0) ^ (low != 0))
2109 regno += (TARGET_ARCH64 && regno < 32) ? 1 : 2;
2110 return gen_rtx_REG (DFmode, regno);
2113 /* Generate a call to FUNC with OPERANDS. Operand 0 is the return value.
2114 Unlike normal calls, TFmode operands are passed by reference. It is
2115 assumed that no more than 3 operands are required. */
2117 static void
2118 emit_soft_tfmode_libcall (const char *func_name, int nargs, rtx *operands)
2120 rtx ret_slot = NULL, arg[3], func_sym;
2121 int i;
2123 /* We only expect to be called for conversions, unary, and binary ops. */
2124 gcc_assert (nargs == 2 || nargs == 3);
2126 for (i = 0; i < nargs; ++i)
2128 rtx this_arg = operands[i];
2129 rtx this_slot;
2131 /* TFmode arguments and return values are passed by reference. */
2132 if (GET_MODE (this_arg) == TFmode)
2134 int force_stack_temp;
2136 force_stack_temp = 0;
2137 if (TARGET_BUGGY_QP_LIB && i == 0)
2138 force_stack_temp = 1;
2140 if (GET_CODE (this_arg) == MEM
2141 && ! force_stack_temp)
2142 this_arg = XEXP (this_arg, 0);
2143 else if (CONSTANT_P (this_arg)
2144 && ! force_stack_temp)
2146 this_slot = force_const_mem (TFmode, this_arg);
2147 this_arg = XEXP (this_slot, 0);
2149 else
2151 this_slot = assign_stack_temp (TFmode, GET_MODE_SIZE (TFmode), 0);
2153 /* Operand 0 is the return value. We'll copy it out later. */
2154 if (i > 0)
2155 emit_move_insn (this_slot, this_arg);
2156 else
2157 ret_slot = this_slot;
2159 this_arg = XEXP (this_slot, 0);
2163 arg[i] = this_arg;
2166 func_sym = gen_rtx_SYMBOL_REF (Pmode, func_name);
2168 if (GET_MODE (operands[0]) == TFmode)
2170 if (nargs == 2)
2171 emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 2,
2172 arg[0], GET_MODE (arg[0]),
2173 arg[1], GET_MODE (arg[1]));
2174 else
2175 emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 3,
2176 arg[0], GET_MODE (arg[0]),
2177 arg[1], GET_MODE (arg[1]),
2178 arg[2], GET_MODE (arg[2]));
2180 if (ret_slot)
2181 emit_move_insn (operands[0], ret_slot);
2183 else
2185 rtx ret;
2187 gcc_assert (nargs == 2);
2189 ret = emit_library_call_value (func_sym, operands[0], LCT_NORMAL,
2190 GET_MODE (operands[0]), 1,
2191 arg[1], GET_MODE (arg[1]));
2193 if (ret != operands[0])
2194 emit_move_insn (operands[0], ret);
2198 /* Expand soft-float TFmode calls to sparc abi routines. */
2200 static void
2201 emit_soft_tfmode_binop (enum rtx_code code, rtx *operands)
2203 const char *func;
2205 switch (code)
2207 case PLUS:
2208 func = "_Qp_add";
2209 break;
2210 case MINUS:
2211 func = "_Qp_sub";
2212 break;
2213 case MULT:
2214 func = "_Qp_mul";
2215 break;
2216 case DIV:
2217 func = "_Qp_div";
2218 break;
2219 default:
2220 gcc_unreachable ();
2223 emit_soft_tfmode_libcall (func, 3, operands);
2226 static void
2227 emit_soft_tfmode_unop (enum rtx_code code, rtx *operands)
2229 const char *func;
2231 gcc_assert (code == SQRT);
2232 func = "_Qp_sqrt";
2234 emit_soft_tfmode_libcall (func, 2, operands);
2237 static void
2238 emit_soft_tfmode_cvt (enum rtx_code code, rtx *operands)
2240 const char *func;
2242 switch (code)
2244 case FLOAT_EXTEND:
2245 switch (GET_MODE (operands[1]))
2247 case SFmode:
2248 func = "_Qp_stoq";
2249 break;
2250 case DFmode:
2251 func = "_Qp_dtoq";
2252 break;
2253 default:
2254 gcc_unreachable ();
2256 break;
2258 case FLOAT_TRUNCATE:
2259 switch (GET_MODE (operands[0]))
2261 case SFmode:
2262 func = "_Qp_qtos";
2263 break;
2264 case DFmode:
2265 func = "_Qp_qtod";
2266 break;
2267 default:
2268 gcc_unreachable ();
2270 break;
2272 case FLOAT:
2273 switch (GET_MODE (operands[1]))
2275 case SImode:
2276 func = "_Qp_itoq";
2277 break;
2278 case DImode:
2279 func = "_Qp_xtoq";
2280 break;
2281 default:
2282 gcc_unreachable ();
2284 break;
2286 case UNSIGNED_FLOAT:
2287 switch (GET_MODE (operands[1]))
2289 case SImode:
2290 func = "_Qp_uitoq";
2291 break;
2292 case DImode:
2293 func = "_Qp_uxtoq";
2294 break;
2295 default:
2296 gcc_unreachable ();
2298 break;
2300 case FIX:
2301 switch (GET_MODE (operands[0]))
2303 case SImode:
2304 func = "_Qp_qtoi";
2305 break;
2306 case DImode:
2307 func = "_Qp_qtox";
2308 break;
2309 default:
2310 gcc_unreachable ();
2312 break;
2314 case UNSIGNED_FIX:
2315 switch (GET_MODE (operands[0]))
2317 case SImode:
2318 func = "_Qp_qtoui";
2319 break;
2320 case DImode:
2321 func = "_Qp_qtoux";
2322 break;
2323 default:
2324 gcc_unreachable ();
2326 break;
2328 default:
2329 gcc_unreachable ();
2332 emit_soft_tfmode_libcall (func, 2, operands);
2335 /* Expand a hard-float tfmode operation. All arguments must be in
2336 registers. */
2338 static void
2339 emit_hard_tfmode_operation (enum rtx_code code, rtx *operands)
2341 rtx op, dest;
2343 if (GET_RTX_CLASS (code) == RTX_UNARY)
2345 operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
2346 op = gen_rtx_fmt_e (code, GET_MODE (operands[0]), operands[1]);
2348 else
2350 operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
2351 operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
2352 op = gen_rtx_fmt_ee (code, GET_MODE (operands[0]),
2353 operands[1], operands[2]);
2356 if (register_operand (operands[0], VOIDmode))
2357 dest = operands[0];
2358 else
2359 dest = gen_reg_rtx (GET_MODE (operands[0]));
2361 emit_insn (gen_rtx_SET (VOIDmode, dest, op));
2363 if (dest != operands[0])
2364 emit_move_insn (operands[0], dest);
2367 void
2368 emit_tfmode_binop (enum rtx_code code, rtx *operands)
2370 if (TARGET_HARD_QUAD)
2371 emit_hard_tfmode_operation (code, operands);
2372 else
2373 emit_soft_tfmode_binop (code, operands);
2376 void
2377 emit_tfmode_unop (enum rtx_code code, rtx *operands)
2379 if (TARGET_HARD_QUAD)
2380 emit_hard_tfmode_operation (code, operands);
2381 else
2382 emit_soft_tfmode_unop (code, operands);
2385 void
2386 emit_tfmode_cvt (enum rtx_code code, rtx *operands)
2388 if (TARGET_HARD_QUAD)
2389 emit_hard_tfmode_operation (code, operands);
2390 else
2391 emit_soft_tfmode_cvt (code, operands);
2394 /* Return nonzero if a branch/jump/call instruction will be emitting
2395 nop into its delay slot. */
2398 empty_delay_slot (rtx insn)
2400 rtx seq;
2402 /* If no previous instruction (should not happen), return true. */
2403 if (PREV_INSN (insn) == NULL)
2404 return 1;
2406 seq = NEXT_INSN (PREV_INSN (insn));
2407 if (GET_CODE (PATTERN (seq)) == SEQUENCE)
2408 return 0;
2410 return 1;
2413 /* Return nonzero if TRIAL can go into the call delay slot. */
2416 tls_call_delay (rtx trial)
2418 rtx pat;
2420 /* Binutils allows
2421 call __tls_get_addr, %tgd_call (foo)
2422 add %l7, %o0, %o0, %tgd_add (foo)
2423 while Sun as/ld does not. */
2424 if (TARGET_GNU_TLS || !TARGET_TLS)
2425 return 1;
2427 pat = PATTERN (trial);
2429 /* We must reject tgd_add{32|64}, i.e.
2430 (set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSGD)))
2431 and tldm_add{32|64}, i.e.
2432 (set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSLDM)))
2433 for Sun as/ld. */
2434 if (GET_CODE (pat) == SET
2435 && GET_CODE (SET_SRC (pat)) == PLUS)
2437 rtx unspec = XEXP (SET_SRC (pat), 1);
2439 if (GET_CODE (unspec) == UNSPEC
2440 && (XINT (unspec, 1) == UNSPEC_TLSGD
2441 || XINT (unspec, 1) == UNSPEC_TLSLDM))
2442 return 0;
2445 return 1;
2448 /* Return nonzero if TRIAL, an insn, can be combined with a 'restore'
2449 instruction. RETURN_P is true if the v9 variant 'return' is to be
2450 considered in the test too.
2452 TRIAL must be a SET whose destination is a REG appropriate for the
2453 'restore' instruction or, if RETURN_P is true, for the 'return'
2454 instruction. */
2456 static int
2457 eligible_for_restore_insn (rtx trial, bool return_p)
2459 rtx pat = PATTERN (trial);
2460 rtx src = SET_SRC (pat);
2462 /* The 'restore src,%g0,dest' pattern for word mode and below. */
2463 if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
2464 && arith_operand (src, GET_MODE (src)))
2466 if (TARGET_ARCH64)
2467 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
2468 else
2469 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (SImode);
2472 /* The 'restore src,%g0,dest' pattern for double-word mode. */
2473 else if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
2474 && arith_double_operand (src, GET_MODE (src)))
2475 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
2477 /* The 'restore src,%g0,dest' pattern for float if no FPU. */
2478 else if (! TARGET_FPU && register_operand (src, SFmode))
2479 return 1;
2481 /* The 'restore src,%g0,dest' pattern for double if no FPU. */
2482 else if (! TARGET_FPU && TARGET_ARCH64 && register_operand (src, DFmode))
2483 return 1;
2485 /* If we have the 'return' instruction, anything that does not use
2486 local or output registers and can go into a delay slot wins. */
2487 else if (return_p && TARGET_V9 && ! epilogue_renumber (&pat, 1)
2488 && (get_attr_in_uncond_branch_delay (trial)
2489 == IN_UNCOND_BRANCH_DELAY_TRUE))
2490 return 1;
2492 /* The 'restore src1,src2,dest' pattern for SImode. */
2493 else if (GET_CODE (src) == PLUS
2494 && register_operand (XEXP (src, 0), SImode)
2495 && arith_operand (XEXP (src, 1), SImode))
2496 return 1;
2498 /* The 'restore src1,src2,dest' pattern for DImode. */
2499 else if (GET_CODE (src) == PLUS
2500 && register_operand (XEXP (src, 0), DImode)
2501 && arith_double_operand (XEXP (src, 1), DImode))
2502 return 1;
2504 /* The 'restore src1,%lo(src2),dest' pattern. */
2505 else if (GET_CODE (src) == LO_SUM
2506 && ! TARGET_CM_MEDMID
2507 && ((register_operand (XEXP (src, 0), SImode)
2508 && immediate_operand (XEXP (src, 1), SImode))
2509 || (TARGET_ARCH64
2510 && register_operand (XEXP (src, 0), DImode)
2511 && immediate_operand (XEXP (src, 1), DImode))))
2512 return 1;
2514 /* The 'restore src,src,dest' pattern. */
2515 else if (GET_CODE (src) == ASHIFT
2516 && (register_operand (XEXP (src, 0), SImode)
2517 || register_operand (XEXP (src, 0), DImode))
2518 && XEXP (src, 1) == const1_rtx)
2519 return 1;
2521 return 0;
2524 /* Return nonzero if TRIAL can go into the function return's
2525 delay slot. */
2528 eligible_for_return_delay (rtx trial)
2530 rtx pat;
2532 if (GET_CODE (trial) != INSN || GET_CODE (PATTERN (trial)) != SET)
2533 return 0;
2535 if (get_attr_length (trial) != 1)
2536 return 0;
2538 /* If there are any call-saved registers, we should scan TRIAL if it
2539 does not reference them. For now just make it easy. */
2540 if (num_gfregs)
2541 return 0;
2543 /* If the function uses __builtin_eh_return, the eh_return machinery
2544 occupies the delay slot. */
2545 if (current_function_calls_eh_return)
2546 return 0;
2548 /* In the case of a true leaf function, anything can go into the slot. */
2549 if (sparc_leaf_function_p)
2550 return get_attr_in_uncond_branch_delay (trial)
2551 == IN_UNCOND_BRANCH_DELAY_TRUE;
2553 pat = PATTERN (trial);
2555 /* Otherwise, only operations which can be done in tandem with
2556 a `restore' or `return' insn can go into the delay slot. */
2557 if (GET_CODE (SET_DEST (pat)) != REG
2558 || (REGNO (SET_DEST (pat)) >= 8 && REGNO (SET_DEST (pat)) < 24))
2559 return 0;
2561 /* If this instruction sets up floating point register and we have a return
2562 instruction, it can probably go in. But restore will not work
2563 with FP_REGS. */
2564 if (REGNO (SET_DEST (pat)) >= 32)
2565 return (TARGET_V9
2566 && ! epilogue_renumber (&pat, 1)
2567 && (get_attr_in_uncond_branch_delay (trial)
2568 == IN_UNCOND_BRANCH_DELAY_TRUE));
2570 return eligible_for_restore_insn (trial, true);
2573 /* Return nonzero if TRIAL can go into the sibling call's
2574 delay slot. */
2577 eligible_for_sibcall_delay (rtx trial)
2579 rtx pat;
2581 if (GET_CODE (trial) != INSN || GET_CODE (PATTERN (trial)) != SET)
2582 return 0;
2584 if (get_attr_length (trial) != 1)
2585 return 0;
2587 pat = PATTERN (trial);
2589 if (sparc_leaf_function_p)
2591 /* If the tail call is done using the call instruction,
2592 we have to restore %o7 in the delay slot. */
2593 if (LEAF_SIBCALL_SLOT_RESERVED_P)
2594 return 0;
2596 /* %g1 is used to build the function address */
2597 if (reg_mentioned_p (gen_rtx_REG (Pmode, 1), pat))
2598 return 0;
2600 return 1;
2603 /* Otherwise, only operations which can be done in tandem with
2604 a `restore' insn can go into the delay slot. */
2605 if (GET_CODE (SET_DEST (pat)) != REG
2606 || (REGNO (SET_DEST (pat)) >= 8 && REGNO (SET_DEST (pat)) < 24)
2607 || REGNO (SET_DEST (pat)) >= 32)
2608 return 0;
2610 /* If it mentions %o7, it can't go in, because sibcall will clobber it
2611 in most cases. */
2612 if (reg_mentioned_p (gen_rtx_REG (Pmode, 15), pat))
2613 return 0;
2615 return eligible_for_restore_insn (trial, false);
2619 short_branch (int uid1, int uid2)
2621 int delta = INSN_ADDRESSES (uid1) - INSN_ADDRESSES (uid2);
2623 /* Leave a few words of "slop". */
2624 if (delta >= -1023 && delta <= 1022)
2625 return 1;
2627 return 0;
2630 /* Return nonzero if REG is not used after INSN.
2631 We assume REG is a reload reg, and therefore does
2632 not live past labels or calls or jumps. */
2634 reg_unused_after (rtx reg, rtx insn)
2636 enum rtx_code code, prev_code = UNKNOWN;
2638 while ((insn = NEXT_INSN (insn)))
2640 if (prev_code == CALL_INSN && call_used_regs[REGNO (reg)])
2641 return 1;
2643 code = GET_CODE (insn);
2644 if (GET_CODE (insn) == CODE_LABEL)
2645 return 1;
2647 if (INSN_P (insn))
2649 rtx set = single_set (insn);
2650 int in_src = set && reg_overlap_mentioned_p (reg, SET_SRC (set));
2651 if (set && in_src)
2652 return 0;
2653 if (set && reg_overlap_mentioned_p (reg, SET_DEST (set)))
2654 return 1;
2655 if (set == 0 && reg_overlap_mentioned_p (reg, PATTERN (insn)))
2656 return 0;
2658 prev_code = code;
2660 return 1;
2663 /* Determine if it's legal to put X into the constant pool. This
2664 is not possible if X contains the address of a symbol that is
2665 not constant (TLS) or not known at final link time (PIC). */
2667 static bool
2668 sparc_cannot_force_const_mem (rtx x)
2670 switch (GET_CODE (x))
2672 case CONST_INT:
2673 case CONST_DOUBLE:
2674 case CONST_VECTOR:
2675 /* Accept all non-symbolic constants. */
2676 return false;
2678 case LABEL_REF:
2679 /* Labels are OK iff we are non-PIC. */
2680 return flag_pic != 0;
2682 case SYMBOL_REF:
2683 /* 'Naked' TLS symbol references are never OK,
2684 non-TLS symbols are OK iff we are non-PIC. */
2685 if (SYMBOL_REF_TLS_MODEL (x))
2686 return true;
2687 else
2688 return flag_pic != 0;
2690 case CONST:
2691 return sparc_cannot_force_const_mem (XEXP (x, 0));
2692 case PLUS:
2693 case MINUS:
2694 return sparc_cannot_force_const_mem (XEXP (x, 0))
2695 || sparc_cannot_force_const_mem (XEXP (x, 1));
2696 case UNSPEC:
2697 return true;
2698 default:
2699 gcc_unreachable ();
2703 /* PIC support. */
2704 static GTY(()) char pic_helper_symbol_name[256];
2705 static GTY(()) rtx pic_helper_symbol;
2706 static GTY(()) bool pic_helper_emitted_p = false;
2707 static GTY(()) rtx global_offset_table;
2709 /* Ensure that we are not using patterns that are not OK with PIC. */
2712 check_pic (int i)
2714 switch (flag_pic)
2716 case 1:
2717 gcc_assert (GET_CODE (recog_data.operand[i]) != SYMBOL_REF
2718 && (GET_CODE (recog_data.operand[i]) != CONST
2719 || (GET_CODE (XEXP (recog_data.operand[i], 0)) == MINUS
2720 && (XEXP (XEXP (recog_data.operand[i], 0), 0)
2721 == global_offset_table)
2722 && (GET_CODE (XEXP (XEXP (recog_data.operand[i], 0), 1))
2723 == CONST))));
2724 case 2:
2725 default:
2726 return 1;
2730 /* Return true if X is an address which needs a temporary register when
2731 reloaded while generating PIC code. */
2734 pic_address_needs_scratch (rtx x)
2736 /* An address which is a symbolic plus a non SMALL_INT needs a temp reg. */
2737 if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
2738 && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
2739 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2740 && ! SMALL_INT (XEXP (XEXP (x, 0), 1)))
2741 return 1;
2743 return 0;
2746 /* Determine if a given RTX is a valid constant. We already know this
2747 satisfies CONSTANT_P. */
2749 bool
2750 legitimate_constant_p (rtx x)
2752 rtx inner;
2754 switch (GET_CODE (x))
2756 case SYMBOL_REF:
2757 /* TLS symbols are not constant. */
2758 if (SYMBOL_REF_TLS_MODEL (x))
2759 return false;
2760 break;
2762 case CONST:
2763 inner = XEXP (x, 0);
2765 /* Offsets of TLS symbols are never valid.
2766 Discourage CSE from creating them. */
2767 if (GET_CODE (inner) == PLUS
2768 && SPARC_SYMBOL_REF_TLS_P (XEXP (inner, 0)))
2769 return false;
2770 break;
2772 case CONST_DOUBLE:
2773 if (GET_MODE (x) == VOIDmode)
2774 return true;
2776 /* Floating point constants are generally not ok.
2777 The only exception is 0.0 in VIS. */
2778 if (TARGET_VIS
2779 && SCALAR_FLOAT_MODE_P (GET_MODE (x))
2780 && const_zero_operand (x, GET_MODE (x)))
2781 return true;
2783 return false;
2785 case CONST_VECTOR:
2786 /* Vector constants are generally not ok.
2787 The only exception is 0 in VIS. */
2788 if (TARGET_VIS
2789 && const_zero_operand (x, GET_MODE (x)))
2790 return true;
2792 return false;
2794 default:
2795 break;
2798 return true;
2801 /* Determine if a given RTX is a valid constant address. */
2803 bool
2804 constant_address_p (rtx x)
2806 switch (GET_CODE (x))
2808 case LABEL_REF:
2809 case CONST_INT:
2810 case HIGH:
2811 return true;
2813 case CONST:
2814 if (flag_pic && pic_address_needs_scratch (x))
2815 return false;
2816 return legitimate_constant_p (x);
2818 case SYMBOL_REF:
2819 return !flag_pic && legitimate_constant_p (x);
2821 default:
2822 return false;
2826 /* Nonzero if the constant value X is a legitimate general operand
2827 when generating PIC code. It is given that flag_pic is on and
2828 that X satisfies CONSTANT_P or is a CONST_DOUBLE. */
2830 bool
2831 legitimate_pic_operand_p (rtx x)
2833 if (pic_address_needs_scratch (x))
2834 return false;
2835 if (SPARC_SYMBOL_REF_TLS_P (x)
2836 || (GET_CODE (x) == CONST
2837 && GET_CODE (XEXP (x, 0)) == PLUS
2838 && SPARC_SYMBOL_REF_TLS_P (XEXP (XEXP (x, 0), 0))))
2839 return false;
2840 return true;
2843 /* Return nonzero if ADDR is a valid memory address.
2844 STRICT specifies whether strict register checking applies. */
2847 legitimate_address_p (enum machine_mode mode, rtx addr, int strict)
2849 rtx rs1 = NULL, rs2 = NULL, imm1 = NULL;
2851 if (REG_P (addr) || GET_CODE (addr) == SUBREG)
2852 rs1 = addr;
2853 else if (GET_CODE (addr) == PLUS)
2855 rs1 = XEXP (addr, 0);
2856 rs2 = XEXP (addr, 1);
2858 /* Canonicalize. REG comes first, if there are no regs,
2859 LO_SUM comes first. */
2860 if (!REG_P (rs1)
2861 && GET_CODE (rs1) != SUBREG
2862 && (REG_P (rs2)
2863 || GET_CODE (rs2) == SUBREG
2864 || (GET_CODE (rs2) == LO_SUM && GET_CODE (rs1) != LO_SUM)))
2866 rs1 = XEXP (addr, 1);
2867 rs2 = XEXP (addr, 0);
2870 if ((flag_pic == 1
2871 && rs1 == pic_offset_table_rtx
2872 && !REG_P (rs2)
2873 && GET_CODE (rs2) != SUBREG
2874 && GET_CODE (rs2) != LO_SUM
2875 && GET_CODE (rs2) != MEM
2876 && ! SPARC_SYMBOL_REF_TLS_P (rs2)
2877 && (! symbolic_operand (rs2, VOIDmode) || mode == Pmode)
2878 && (GET_CODE (rs2) != CONST_INT || SMALL_INT (rs2)))
2879 || ((REG_P (rs1)
2880 || GET_CODE (rs1) == SUBREG)
2881 && RTX_OK_FOR_OFFSET_P (rs2)))
2883 imm1 = rs2;
2884 rs2 = NULL;
2886 else if ((REG_P (rs1) || GET_CODE (rs1) == SUBREG)
2887 && (REG_P (rs2) || GET_CODE (rs2) == SUBREG))
2889 /* We prohibit REG + REG for TFmode when there are no quad move insns
2890 and we consequently need to split. We do this because REG+REG
2891 is not an offsettable address. If we get the situation in reload
2892 where source and destination of a movtf pattern are both MEMs with
2893 REG+REG address, then only one of them gets converted to an
2894 offsettable address. */
2895 if (mode == TFmode
2896 && ! (TARGET_FPU && TARGET_ARCH64 && TARGET_HARD_QUAD))
2897 return 0;
2899 /* We prohibit REG + REG on ARCH32 if not optimizing for
2900 DFmode/DImode because then mem_min_alignment is likely to be zero
2901 after reload and the forced split would lack a matching splitter
2902 pattern. */
2903 if (TARGET_ARCH32 && !optimize
2904 && (mode == DFmode || mode == DImode))
2905 return 0;
2907 else if (USE_AS_OFFSETABLE_LO10
2908 && GET_CODE (rs1) == LO_SUM
2909 && TARGET_ARCH64
2910 && ! TARGET_CM_MEDMID
2911 && RTX_OK_FOR_OLO10_P (rs2))
2913 rs2 = NULL;
2914 imm1 = XEXP (rs1, 1);
2915 rs1 = XEXP (rs1, 0);
2916 if (! CONSTANT_P (imm1) || SPARC_SYMBOL_REF_TLS_P (rs1))
2917 return 0;
2920 else if (GET_CODE (addr) == LO_SUM)
2922 rs1 = XEXP (addr, 0);
2923 imm1 = XEXP (addr, 1);
2925 if (! CONSTANT_P (imm1) || SPARC_SYMBOL_REF_TLS_P (rs1))
2926 return 0;
2928 /* We can't allow TFmode in 32-bit mode, because an offset greater
2929 than the alignment (8) may cause the LO_SUM to overflow. */
2930 if (mode == TFmode && TARGET_ARCH32)
2931 return 0;
2933 else if (GET_CODE (addr) == CONST_INT && SMALL_INT (addr))
2934 return 1;
2935 else
2936 return 0;
2938 if (GET_CODE (rs1) == SUBREG)
2939 rs1 = SUBREG_REG (rs1);
2940 if (!REG_P (rs1))
2941 return 0;
2943 if (rs2)
2945 if (GET_CODE (rs2) == SUBREG)
2946 rs2 = SUBREG_REG (rs2);
2947 if (!REG_P (rs2))
2948 return 0;
2951 if (strict)
2953 if (!REGNO_OK_FOR_BASE_P (REGNO (rs1))
2954 || (rs2 && !REGNO_OK_FOR_BASE_P (REGNO (rs2))))
2955 return 0;
2957 else
2959 if ((REGNO (rs1) >= 32
2960 && REGNO (rs1) != FRAME_POINTER_REGNUM
2961 && REGNO (rs1) < FIRST_PSEUDO_REGISTER)
2962 || (rs2
2963 && (REGNO (rs2) >= 32
2964 && REGNO (rs2) != FRAME_POINTER_REGNUM
2965 && REGNO (rs2) < FIRST_PSEUDO_REGISTER)))
2966 return 0;
2968 return 1;
2971 /* Construct the SYMBOL_REF for the tls_get_offset function. */
2973 static GTY(()) rtx sparc_tls_symbol;
2975 static rtx
2976 sparc_tls_get_addr (void)
2978 if (!sparc_tls_symbol)
2979 sparc_tls_symbol = gen_rtx_SYMBOL_REF (Pmode, "__tls_get_addr");
2981 return sparc_tls_symbol;
2984 static rtx
2985 sparc_tls_got (void)
2987 rtx temp;
2988 if (flag_pic)
2990 current_function_uses_pic_offset_table = 1;
2991 return pic_offset_table_rtx;
2994 if (!global_offset_table)
2995 global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
2996 temp = gen_reg_rtx (Pmode);
2997 emit_move_insn (temp, global_offset_table);
2998 return temp;
3001 /* Return 1 if *X is a thread-local symbol. */
3003 static int
3004 sparc_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
3006 return SPARC_SYMBOL_REF_TLS_P (*x);
3009 /* Return 1 if X contains a thread-local symbol. */
3011 bool
3012 sparc_tls_referenced_p (rtx x)
3014 if (!TARGET_HAVE_TLS)
3015 return false;
3017 return for_each_rtx (&x, &sparc_tls_symbol_ref_1, 0);
3020 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
3021 this (thread-local) address. */
3024 legitimize_tls_address (rtx addr)
3026 rtx temp1, temp2, temp3, ret, o0, got, insn;
3028 gcc_assert (! no_new_pseudos);
3030 if (GET_CODE (addr) == SYMBOL_REF)
3031 switch (SYMBOL_REF_TLS_MODEL (addr))
3033 case TLS_MODEL_GLOBAL_DYNAMIC:
3034 start_sequence ();
3035 temp1 = gen_reg_rtx (SImode);
3036 temp2 = gen_reg_rtx (SImode);
3037 ret = gen_reg_rtx (Pmode);
3038 o0 = gen_rtx_REG (Pmode, 8);
3039 got = sparc_tls_got ();
3040 emit_insn (gen_tgd_hi22 (temp1, addr));
3041 emit_insn (gen_tgd_lo10 (temp2, temp1, addr));
3042 if (TARGET_ARCH32)
3044 emit_insn (gen_tgd_add32 (o0, got, temp2, addr));
3045 insn = emit_call_insn (gen_tgd_call32 (o0, sparc_tls_get_addr (),
3046 addr, const1_rtx));
3048 else
3050 emit_insn (gen_tgd_add64 (o0, got, temp2, addr));
3051 insn = emit_call_insn (gen_tgd_call64 (o0, sparc_tls_get_addr (),
3052 addr, const1_rtx));
3054 CALL_INSN_FUNCTION_USAGE (insn)
3055 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_USE (VOIDmode, o0),
3056 CALL_INSN_FUNCTION_USAGE (insn));
3057 insn = get_insns ();
3058 end_sequence ();
3059 emit_libcall_block (insn, ret, o0, addr);
3060 break;
3062 case TLS_MODEL_LOCAL_DYNAMIC:
3063 start_sequence ();
3064 temp1 = gen_reg_rtx (SImode);
3065 temp2 = gen_reg_rtx (SImode);
3066 temp3 = gen_reg_rtx (Pmode);
3067 ret = gen_reg_rtx (Pmode);
3068 o0 = gen_rtx_REG (Pmode, 8);
3069 got = sparc_tls_got ();
3070 emit_insn (gen_tldm_hi22 (temp1));
3071 emit_insn (gen_tldm_lo10 (temp2, temp1));
3072 if (TARGET_ARCH32)
3074 emit_insn (gen_tldm_add32 (o0, got, temp2));
3075 insn = emit_call_insn (gen_tldm_call32 (o0, sparc_tls_get_addr (),
3076 const1_rtx));
3078 else
3080 emit_insn (gen_tldm_add64 (o0, got, temp2));
3081 insn = emit_call_insn (gen_tldm_call64 (o0, sparc_tls_get_addr (),
3082 const1_rtx));
3084 CALL_INSN_FUNCTION_USAGE (insn)
3085 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_USE (VOIDmode, o0),
3086 CALL_INSN_FUNCTION_USAGE (insn));
3087 insn = get_insns ();
3088 end_sequence ();
3089 emit_libcall_block (insn, temp3, o0,
3090 gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
3091 UNSPEC_TLSLD_BASE));
3092 temp1 = gen_reg_rtx (SImode);
3093 temp2 = gen_reg_rtx (SImode);
3094 emit_insn (gen_tldo_hix22 (temp1, addr));
3095 emit_insn (gen_tldo_lox10 (temp2, temp1, addr));
3096 if (TARGET_ARCH32)
3097 emit_insn (gen_tldo_add32 (ret, temp3, temp2, addr));
3098 else
3099 emit_insn (gen_tldo_add64 (ret, temp3, temp2, addr));
3100 break;
3102 case TLS_MODEL_INITIAL_EXEC:
3103 temp1 = gen_reg_rtx (SImode);
3104 temp2 = gen_reg_rtx (SImode);
3105 temp3 = gen_reg_rtx (Pmode);
3106 got = sparc_tls_got ();
3107 emit_insn (gen_tie_hi22 (temp1, addr));
3108 emit_insn (gen_tie_lo10 (temp2, temp1, addr));
3109 if (TARGET_ARCH32)
3110 emit_insn (gen_tie_ld32 (temp3, got, temp2, addr));
3111 else
3112 emit_insn (gen_tie_ld64 (temp3, got, temp2, addr));
3113 if (TARGET_SUN_TLS)
3115 ret = gen_reg_rtx (Pmode);
3116 if (TARGET_ARCH32)
3117 emit_insn (gen_tie_add32 (ret, gen_rtx_REG (Pmode, 7),
3118 temp3, addr));
3119 else
3120 emit_insn (gen_tie_add64 (ret, gen_rtx_REG (Pmode, 7),
3121 temp3, addr));
3123 else
3124 ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp3);
3125 break;
3127 case TLS_MODEL_LOCAL_EXEC:
3128 temp1 = gen_reg_rtx (Pmode);
3129 temp2 = gen_reg_rtx (Pmode);
3130 if (TARGET_ARCH32)
3132 emit_insn (gen_tle_hix22_sp32 (temp1, addr));
3133 emit_insn (gen_tle_lox10_sp32 (temp2, temp1, addr));
3135 else
3137 emit_insn (gen_tle_hix22_sp64 (temp1, addr));
3138 emit_insn (gen_tle_lox10_sp64 (temp2, temp1, addr));
3140 ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp2);
3141 break;
3143 default:
3144 gcc_unreachable ();
3147 else
3148 gcc_unreachable (); /* for now ... */
3150 return ret;
3154 /* Legitimize PIC addresses. If the address is already position-independent,
3155 we return ORIG. Newly generated position-independent addresses go into a
3156 reg. This is REG if nonzero, otherwise we allocate register(s) as
3157 necessary. */
3160 legitimize_pic_address (rtx orig, enum machine_mode mode ATTRIBUTE_UNUSED,
3161 rtx reg)
3163 if (GET_CODE (orig) == SYMBOL_REF)
3165 rtx pic_ref, address;
3166 rtx insn;
3168 if (reg == 0)
3170 gcc_assert (! reload_in_progress && ! reload_completed);
3171 reg = gen_reg_rtx (Pmode);
3174 if (flag_pic == 2)
3176 /* If not during reload, allocate another temp reg here for loading
3177 in the address, so that these instructions can be optimized
3178 properly. */
3179 rtx temp_reg = ((reload_in_progress || reload_completed)
3180 ? reg : gen_reg_rtx (Pmode));
3182 /* Must put the SYMBOL_REF inside an UNSPEC here so that cse
3183 won't get confused into thinking that these two instructions
3184 are loading in the true address of the symbol. If in the
3185 future a PIC rtx exists, that should be used instead. */
3186 if (TARGET_ARCH64)
3188 emit_insn (gen_movdi_high_pic (temp_reg, orig));
3189 emit_insn (gen_movdi_lo_sum_pic (temp_reg, temp_reg, orig));
3191 else
3193 emit_insn (gen_movsi_high_pic (temp_reg, orig));
3194 emit_insn (gen_movsi_lo_sum_pic (temp_reg, temp_reg, orig));
3196 address = temp_reg;
3198 else
3199 address = orig;
3201 pic_ref = gen_const_mem (Pmode,
3202 gen_rtx_PLUS (Pmode,
3203 pic_offset_table_rtx, address));
3204 current_function_uses_pic_offset_table = 1;
3205 insn = emit_move_insn (reg, pic_ref);
3206 /* Put a REG_EQUAL note on this insn, so that it can be optimized
3207 by loop. */
3208 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, orig,
3209 REG_NOTES (insn));
3210 return reg;
3212 else if (GET_CODE (orig) == CONST)
3214 rtx base, offset;
3216 if (GET_CODE (XEXP (orig, 0)) == PLUS
3217 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
3218 return orig;
3220 if (reg == 0)
3222 gcc_assert (! reload_in_progress && ! reload_completed);
3223 reg = gen_reg_rtx (Pmode);
3226 gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
3227 base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode, reg);
3228 offset = legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode,
3229 base == reg ? 0 : reg);
3231 if (GET_CODE (offset) == CONST_INT)
3233 if (SMALL_INT (offset))
3234 return plus_constant (base, INTVAL (offset));
3235 else if (! reload_in_progress && ! reload_completed)
3236 offset = force_reg (Pmode, offset);
3237 else
3238 /* If we reach here, then something is seriously wrong. */
3239 gcc_unreachable ();
3241 return gen_rtx_PLUS (Pmode, base, offset);
3243 else if (GET_CODE (orig) == LABEL_REF)
3244 /* ??? Why do we do this? */
3245 /* Now movsi_pic_label_ref uses it, but we ought to be checking that
3246 the register is live instead, in case it is eliminated. */
3247 current_function_uses_pic_offset_table = 1;
3249 return orig;
3252 /* Try machine-dependent ways of modifying an illegitimate address X
3253 to be legitimate. If we find one, return the new, valid address.
3255 OLDX is the address as it was before break_out_memory_refs was called.
3256 In some cases it is useful to look at this to decide what needs to be done.
3258 MODE is the mode of the operand pointed to by X. */
3261 legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
3263 rtx orig_x = x;
3265 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == MULT)
3266 x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
3267 force_operand (XEXP (x, 0), NULL_RTX));
3268 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == MULT)
3269 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
3270 force_operand (XEXP (x, 1), NULL_RTX));
3271 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS)
3272 x = gen_rtx_PLUS (Pmode, force_operand (XEXP (x, 0), NULL_RTX),
3273 XEXP (x, 1));
3274 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == PLUS)
3275 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
3276 force_operand (XEXP (x, 1), NULL_RTX));
3278 if (x != orig_x && legitimate_address_p (mode, x, FALSE))
3279 return x;
3281 if (SPARC_SYMBOL_REF_TLS_P (x))
3282 x = legitimize_tls_address (x);
3283 else if (flag_pic)
3284 x = legitimize_pic_address (x, mode, 0);
3285 else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 1)))
3286 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
3287 copy_to_mode_reg (Pmode, XEXP (x, 1)));
3288 else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 0)))
3289 x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
3290 copy_to_mode_reg (Pmode, XEXP (x, 0)));
3291 else if (GET_CODE (x) == SYMBOL_REF
3292 || GET_CODE (x) == CONST
3293 || GET_CODE (x) == LABEL_REF)
3294 x = copy_to_suggested_reg (x, NULL_RTX, Pmode);
3295 return x;
3298 /* Emit the special PIC helper function. */
3300 static void
3301 emit_pic_helper (void)
3303 const char *pic_name = reg_names[REGNO (pic_offset_table_rtx)];
3304 int align;
3306 text_section ();
3308 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
3309 if (align > 0)
3310 ASM_OUTPUT_ALIGN (asm_out_file, align);
3311 ASM_OUTPUT_LABEL (asm_out_file, pic_helper_symbol_name);
3312 if (flag_delayed_branch)
3313 fprintf (asm_out_file, "\tjmp\t%%o7+8\n\t add\t%%o7, %s, %s\n",
3314 pic_name, pic_name);
3315 else
3316 fprintf (asm_out_file, "\tadd\t%%o7, %s, %s\n\tjmp\t%%o7+8\n\t nop\n",
3317 pic_name, pic_name);
3319 pic_helper_emitted_p = true;
3322 /* Emit code to load the PIC register. */
3324 static void
3325 load_pic_register (bool delay_pic_helper)
3327 int orig_flag_pic = flag_pic;
3329 /* If we haven't initialized the special PIC symbols, do so now. */
3330 if (!pic_helper_symbol_name[0])
3332 ASM_GENERATE_INTERNAL_LABEL (pic_helper_symbol_name, "LADDPC", 0);
3333 pic_helper_symbol = gen_rtx_SYMBOL_REF (Pmode, pic_helper_symbol_name);
3334 global_offset_table = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3337 /* If we haven't emitted the special PIC helper function, do so now unless
3338 we are requested to delay it. */
3339 if (!delay_pic_helper && !pic_helper_emitted_p)
3340 emit_pic_helper ();
3342 flag_pic = 0;
3343 if (TARGET_ARCH64)
3344 emit_insn (gen_load_pcrel_symdi (pic_offset_table_rtx, global_offset_table,
3345 pic_helper_symbol));
3346 else
3347 emit_insn (gen_load_pcrel_symsi (pic_offset_table_rtx, global_offset_table,
3348 pic_helper_symbol));
3349 flag_pic = orig_flag_pic;
3351 /* Need to emit this whether or not we obey regdecls,
3352 since setjmp/longjmp can cause life info to screw up.
3353 ??? In the case where we don't obey regdecls, this is not sufficient
3354 since we may not fall out the bottom. */
3355 emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
3358 /* Return 1 if RTX is a MEM which is known to be aligned to at
3359 least a DESIRED byte boundary. */
3362 mem_min_alignment (rtx mem, int desired)
3364 rtx addr, base, offset;
3366 /* If it's not a MEM we can't accept it. */
3367 if (GET_CODE (mem) != MEM)
3368 return 0;
3370 /* Obviously... */
3371 if (!TARGET_UNALIGNED_DOUBLES
3372 && MEM_ALIGN (mem) / BITS_PER_UNIT >= (unsigned)desired)
3373 return 1;
3375 /* ??? The rest of the function predates MEM_ALIGN so
3376 there is probably a bit of redundancy. */
3377 addr = XEXP (mem, 0);
3378 base = offset = NULL_RTX;
3379 if (GET_CODE (addr) == PLUS)
3381 if (GET_CODE (XEXP (addr, 0)) == REG)
3383 base = XEXP (addr, 0);
3385 /* What we are saying here is that if the base
3386 REG is aligned properly, the compiler will make
3387 sure any REG based index upon it will be so
3388 as well. */
3389 if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
3390 offset = XEXP (addr, 1);
3391 else
3392 offset = const0_rtx;
3395 else if (GET_CODE (addr) == REG)
3397 base = addr;
3398 offset = const0_rtx;
3401 if (base != NULL_RTX)
3403 int regno = REGNO (base);
3405 if (regno != HARD_FRAME_POINTER_REGNUM && regno != STACK_POINTER_REGNUM)
3407 /* Check if the compiler has recorded some information
3408 about the alignment of the base REG. If reload has
3409 completed, we already matched with proper alignments.
3410 If not running global_alloc, reload might give us
3411 unaligned pointer to local stack though. */
3412 if (((cfun != 0
3413 && REGNO_POINTER_ALIGN (regno) >= desired * BITS_PER_UNIT)
3414 || (optimize && reload_completed))
3415 && (INTVAL (offset) & (desired - 1)) == 0)
3416 return 1;
3418 else
3420 if (((INTVAL (offset) - SPARC_STACK_BIAS) & (desired - 1)) == 0)
3421 return 1;
3424 else if (! TARGET_UNALIGNED_DOUBLES
3425 || CONSTANT_P (addr)
3426 || GET_CODE (addr) == LO_SUM)
3428 /* Anything else we know is properly aligned unless TARGET_UNALIGNED_DOUBLES
3429 is true, in which case we can only assume that an access is aligned if
3430 it is to a constant address, or the address involves a LO_SUM. */
3431 return 1;
3434 /* An obviously unaligned address. */
3435 return 0;
3439 /* Vectors to keep interesting information about registers where it can easily
3440 be got. We used to use the actual mode value as the bit number, but there
3441 are more than 32 modes now. Instead we use two tables: one indexed by
3442 hard register number, and one indexed by mode. */
3444 /* The purpose of sparc_mode_class is to shrink the range of modes so that
3445 they all fit (as bit numbers) in a 32 bit word (again). Each real mode is
3446 mapped into one sparc_mode_class mode. */
3448 enum sparc_mode_class {
3449 S_MODE, D_MODE, T_MODE, O_MODE,
3450 SF_MODE, DF_MODE, TF_MODE, OF_MODE,
3451 CC_MODE, CCFP_MODE
3454 /* Modes for single-word and smaller quantities. */
3455 #define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
3457 /* Modes for double-word and smaller quantities. */
3458 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
3460 /* Modes for quad-word and smaller quantities. */
3461 #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
3463 /* Modes for 8-word and smaller quantities. */
3464 #define O_MODES (T_MODES | (1 << (int) O_MODE) | (1 << (int) OF_MODE))
3466 /* Modes for single-float quantities. We must allow any single word or
3467 smaller quantity. This is because the fix/float conversion instructions
3468 take integer inputs/outputs from the float registers. */
3469 #define SF_MODES (S_MODES)
3471 /* Modes for double-float and smaller quantities. */
3472 #define DF_MODES (S_MODES | D_MODES)
3474 /* Modes for double-float only quantities. */
3475 #define DF_MODES_NO_S ((1 << (int) D_MODE) | (1 << (int) DF_MODE))
3477 /* Modes for quad-float only quantities. */
3478 #define TF_ONLY_MODES (1 << (int) TF_MODE)
3480 /* Modes for quad-float and smaller quantities. */
3481 #define TF_MODES (DF_MODES | TF_ONLY_MODES)
3483 /* Modes for quad-float and double-float quantities. */
3484 #define TF_MODES_NO_S (DF_MODES_NO_S | TF_ONLY_MODES)
3486 /* Modes for quad-float pair only quantities. */
3487 #define OF_ONLY_MODES (1 << (int) OF_MODE)
3489 /* Modes for quad-float pairs and smaller quantities. */
3490 #define OF_MODES (TF_MODES | OF_ONLY_MODES)
3492 #define OF_MODES_NO_S (TF_MODES_NO_S | OF_ONLY_MODES)
3494 /* Modes for condition codes. */
3495 #define CC_MODES (1 << (int) CC_MODE)
3496 #define CCFP_MODES (1 << (int) CCFP_MODE)
3498 /* Value is 1 if register/mode pair is acceptable on sparc.
3499 The funny mixture of D and T modes is because integer operations
3500 do not specially operate on tetra quantities, so non-quad-aligned
3501 registers can hold quadword quantities (except %o4 and %i4 because
3502 they cross fixed registers). */
3504 /* This points to either the 32 bit or the 64 bit version. */
3505 const int *hard_regno_mode_classes;
3507 static const int hard_32bit_mode_classes[] = {
3508 S_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
3509 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
3510 T_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
3511 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
3513 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3514 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3515 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3516 OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
3518 /* FP regs f32 to f63. Only the even numbered registers actually exist,
3519 and none can hold SFmode/SImode values. */
3520 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3521 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3522 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3523 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3525 /* %fcc[0123] */
3526 CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
3528 /* %icc */
3529 CC_MODES
3532 static const int hard_64bit_mode_classes[] = {
3533 D_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
3534 O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
3535 T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
3536 O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
3538 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3539 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3540 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
3541 OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
3543 /* FP regs f32 to f63. Only the even numbered registers actually exist,
3544 and none can hold SFmode/SImode values. */
3545 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3546 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3547 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3548 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
3550 /* %fcc[0123] */
3551 CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
3553 /* %icc */
3554 CC_MODES
3557 int sparc_mode_class [NUM_MACHINE_MODES];
3559 enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
3561 static void
3562 sparc_init_modes (void)
3564 int i;
3566 for (i = 0; i < NUM_MACHINE_MODES; i++)
3568 switch (GET_MODE_CLASS (i))
3570 case MODE_INT:
3571 case MODE_PARTIAL_INT:
3572 case MODE_COMPLEX_INT:
3573 if (GET_MODE_SIZE (i) <= 4)
3574 sparc_mode_class[i] = 1 << (int) S_MODE;
3575 else if (GET_MODE_SIZE (i) == 8)
3576 sparc_mode_class[i] = 1 << (int) D_MODE;
3577 else if (GET_MODE_SIZE (i) == 16)
3578 sparc_mode_class[i] = 1 << (int) T_MODE;
3579 else if (GET_MODE_SIZE (i) == 32)
3580 sparc_mode_class[i] = 1 << (int) O_MODE;
3581 else
3582 sparc_mode_class[i] = 0;
3583 break;
3584 case MODE_VECTOR_INT:
3585 if (GET_MODE_SIZE (i) <= 4)
3586 sparc_mode_class[i] = 1 << (int)SF_MODE;
3587 else if (GET_MODE_SIZE (i) == 8)
3588 sparc_mode_class[i] = 1 << (int)DF_MODE;
3589 break;
3590 case MODE_FLOAT:
3591 case MODE_COMPLEX_FLOAT:
3592 if (GET_MODE_SIZE (i) <= 4)
3593 sparc_mode_class[i] = 1 << (int) SF_MODE;
3594 else if (GET_MODE_SIZE (i) == 8)
3595 sparc_mode_class[i] = 1 << (int) DF_MODE;
3596 else if (GET_MODE_SIZE (i) == 16)
3597 sparc_mode_class[i] = 1 << (int) TF_MODE;
3598 else if (GET_MODE_SIZE (i) == 32)
3599 sparc_mode_class[i] = 1 << (int) OF_MODE;
3600 else
3601 sparc_mode_class[i] = 0;
3602 break;
3603 case MODE_CC:
3604 if (i == (int) CCFPmode || i == (int) CCFPEmode)
3605 sparc_mode_class[i] = 1 << (int) CCFP_MODE;
3606 else
3607 sparc_mode_class[i] = 1 << (int) CC_MODE;
3608 break;
3609 default:
3610 sparc_mode_class[i] = 0;
3611 break;
3615 if (TARGET_ARCH64)
3616 hard_regno_mode_classes = hard_64bit_mode_classes;
3617 else
3618 hard_regno_mode_classes = hard_32bit_mode_classes;
3620 /* Initialize the array used by REGNO_REG_CLASS. */
3621 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
3623 if (i < 16 && TARGET_V8PLUS)
3624 sparc_regno_reg_class[i] = I64_REGS;
3625 else if (i < 32 || i == FRAME_POINTER_REGNUM)
3626 sparc_regno_reg_class[i] = GENERAL_REGS;
3627 else if (i < 64)
3628 sparc_regno_reg_class[i] = FP_REGS;
3629 else if (i < 96)
3630 sparc_regno_reg_class[i] = EXTRA_FP_REGS;
3631 else if (i < 100)
3632 sparc_regno_reg_class[i] = FPCC_REGS;
3633 else
3634 sparc_regno_reg_class[i] = NO_REGS;
3638 /* Compute the frame size required by the function. This function is called
3639 during the reload pass and also by sparc_expand_prologue. */
3641 HOST_WIDE_INT
3642 sparc_compute_frame_size (HOST_WIDE_INT size, int leaf_function_p)
3644 int outgoing_args_size = (current_function_outgoing_args_size
3645 + REG_PARM_STACK_SPACE (current_function_decl));
3646 int n_regs = 0; /* N_REGS is the number of 4-byte regs saved thus far. */
3647 int i;
3649 if (TARGET_ARCH64)
3651 for (i = 0; i < 8; i++)
3652 if (regs_ever_live[i] && ! call_used_regs[i])
3653 n_regs += 2;
3655 else
3657 for (i = 0; i < 8; i += 2)
3658 if ((regs_ever_live[i] && ! call_used_regs[i])
3659 || (regs_ever_live[i+1] && ! call_used_regs[i+1]))
3660 n_regs += 2;
3663 for (i = 32; i < (TARGET_V9 ? 96 : 64); i += 2)
3664 if ((regs_ever_live[i] && ! call_used_regs[i])
3665 || (regs_ever_live[i+1] && ! call_used_regs[i+1]))
3666 n_regs += 2;
3668 /* Set up values for use in prologue and epilogue. */
3669 num_gfregs = n_regs;
3671 if (leaf_function_p
3672 && n_regs == 0
3673 && size == 0
3674 && current_function_outgoing_args_size == 0)
3675 actual_fsize = apparent_fsize = 0;
3676 else
3678 /* We subtract STARTING_FRAME_OFFSET, remember it's negative. */
3679 apparent_fsize = (size - STARTING_FRAME_OFFSET + 7) & -8;
3680 apparent_fsize += n_regs * 4;
3681 actual_fsize = apparent_fsize + ((outgoing_args_size + 7) & -8);
3684 /* Make sure nothing can clobber our register windows.
3685 If a SAVE must be done, or there is a stack-local variable,
3686 the register window area must be allocated. */
3687 if (! leaf_function_p || size > 0)
3688 actual_fsize += FIRST_PARM_OFFSET (current_function_decl);
3690 return SPARC_STACK_ALIGN (actual_fsize);
3693 /* Output any necessary .register pseudo-ops. */
3695 void
3696 sparc_output_scratch_registers (FILE *file ATTRIBUTE_UNUSED)
3698 #ifdef HAVE_AS_REGISTER_PSEUDO_OP
3699 int i;
3701 if (TARGET_ARCH32)
3702 return;
3704 /* Check if %g[2367] were used without
3705 .register being printed for them already. */
3706 for (i = 2; i < 8; i++)
3708 if (regs_ever_live [i]
3709 && ! sparc_hard_reg_printed [i])
3711 sparc_hard_reg_printed [i] = 1;
3712 fprintf (file, "\t.register\t%%g%d, #scratch\n", i);
3714 if (i == 3) i = 5;
3716 #endif
3719 /* Save/restore call-saved registers from LOW to HIGH at BASE+OFFSET
3720 as needed. LOW should be double-word aligned for 32-bit registers.
3721 Return the new OFFSET. */
3723 #define SORR_SAVE 0
3724 #define SORR_RESTORE 1
3726 static int
3727 save_or_restore_regs (int low, int high, rtx base, int offset, int action)
3729 rtx mem, insn;
3730 int i;
3732 if (TARGET_ARCH64 && high <= 32)
3734 for (i = low; i < high; i++)
3736 if (regs_ever_live[i] && ! call_used_regs[i])
3738 mem = gen_rtx_MEM (DImode, plus_constant (base, offset));
3739 set_mem_alias_set (mem, sparc_sr_alias_set);
3740 if (action == SORR_SAVE)
3742 insn = emit_move_insn (mem, gen_rtx_REG (DImode, i));
3743 RTX_FRAME_RELATED_P (insn) = 1;
3745 else /* action == SORR_RESTORE */
3746 emit_move_insn (gen_rtx_REG (DImode, i), mem);
3747 offset += 8;
3751 else
3753 for (i = low; i < high; i += 2)
3755 bool reg0 = regs_ever_live[i] && ! call_used_regs[i];
3756 bool reg1 = regs_ever_live[i+1] && ! call_used_regs[i+1];
3757 enum machine_mode mode;
3758 int regno;
3760 if (reg0 && reg1)
3762 mode = i < 32 ? DImode : DFmode;
3763 regno = i;
3765 else if (reg0)
3767 mode = i < 32 ? SImode : SFmode;
3768 regno = i;
3770 else if (reg1)
3772 mode = i < 32 ? SImode : SFmode;
3773 regno = i + 1;
3774 offset += 4;
3776 else
3777 continue;
3779 mem = gen_rtx_MEM (mode, plus_constant (base, offset));
3780 set_mem_alias_set (mem, sparc_sr_alias_set);
3781 if (action == SORR_SAVE)
3783 insn = emit_move_insn (mem, gen_rtx_REG (mode, regno));
3784 RTX_FRAME_RELATED_P (insn) = 1;
3786 else /* action == SORR_RESTORE */
3787 emit_move_insn (gen_rtx_REG (mode, regno), mem);
3789 /* Always preserve double-word alignment. */
3790 offset = (offset + 7) & -8;
3794 return offset;
3797 /* Emit code to save call-saved registers. */
3799 static void
3800 emit_save_or_restore_regs (int action)
3802 HOST_WIDE_INT offset;
3803 rtx base;
3805 offset = frame_base_offset - apparent_fsize;
3807 if (offset < -4096 || offset + num_gfregs * 4 > 4095)
3809 /* ??? This might be optimized a little as %g1 might already have a
3810 value close enough that a single add insn will do. */
3811 /* ??? Although, all of this is probably only a temporary fix
3812 because if %g1 can hold a function result, then
3813 sparc_expand_epilogue will lose (the result will be
3814 clobbered). */
3815 base = gen_rtx_REG (Pmode, 1);
3816 emit_move_insn (base, GEN_INT (offset));
3817 emit_insn (gen_rtx_SET (VOIDmode,
3818 base,
3819 gen_rtx_PLUS (Pmode, frame_base_reg, base)));
3820 offset = 0;
3822 else
3823 base = frame_base_reg;
3825 offset = save_or_restore_regs (0, 8, base, offset, action);
3826 save_or_restore_regs (32, TARGET_V9 ? 96 : 64, base, offset, action);
3829 /* Generate a save_register_window insn. */
3831 static rtx
3832 gen_save_register_window (rtx increment)
3834 if (TARGET_ARCH64)
3835 return gen_save_register_windowdi (increment);
3836 else
3837 return gen_save_register_windowsi (increment);
3840 /* Generate an increment for the stack pointer. */
3842 static rtx
3843 gen_stack_pointer_inc (rtx increment)
3845 return gen_rtx_SET (VOIDmode,
3846 stack_pointer_rtx,
3847 gen_rtx_PLUS (Pmode,
3848 stack_pointer_rtx,
3849 increment));
3852 /* Generate a decrement for the stack pointer. */
3854 static rtx
3855 gen_stack_pointer_dec (rtx decrement)
3857 return gen_rtx_SET (VOIDmode,
3858 stack_pointer_rtx,
3859 gen_rtx_MINUS (Pmode,
3860 stack_pointer_rtx,
3861 decrement));
3864 /* Expand the function prologue. The prologue is responsible for reserving
3865 storage for the frame, saving the call-saved registers and loading the
3866 PIC register if needed. */
3868 void
3869 sparc_expand_prologue (void)
3871 rtx insn;
3872 int i;
3874 /* Compute a snapshot of current_function_uses_only_leaf_regs. Relying
3875 on the final value of the flag means deferring the prologue/epilogue
3876 expansion until just before the second scheduling pass, which is too
3877 late to emit multiple epilogues or return insns.
3879 Of course we are making the assumption that the value of the flag
3880 will not change between now and its final value. Of the three parts
3881 of the formula, only the last one can reasonably vary. Let's take a
3882 closer look, after assuming that the first two ones are set to true
3883 (otherwise the last value is effectively silenced).
3885 If only_leaf_regs_used returns false, the global predicate will also
3886 be false so the actual frame size calculated below will be positive.
3887 As a consequence, the save_register_window insn will be emitted in
3888 the instruction stream; now this insn explicitly references %fp
3889 which is not a leaf register so only_leaf_regs_used will always
3890 return false subsequently.
3892 If only_leaf_regs_used returns true, we hope that the subsequent
3893 optimization passes won't cause non-leaf registers to pop up. For
3894 example, the regrename pass has special provisions to not rename to
3895 non-leaf registers in a leaf function. */
3896 sparc_leaf_function_p
3897 = optimize > 0 && leaf_function_p () && only_leaf_regs_used ();
3899 /* Need to use actual_fsize, since we are also allocating
3900 space for our callee (and our own register save area). */
3901 actual_fsize
3902 = sparc_compute_frame_size (get_frame_size(), sparc_leaf_function_p);
3904 /* Advertise that the data calculated just above are now valid. */
3905 sparc_prologue_data_valid_p = true;
3907 if (sparc_leaf_function_p)
3909 frame_base_reg = stack_pointer_rtx;
3910 frame_base_offset = actual_fsize + SPARC_STACK_BIAS;
3912 else
3914 frame_base_reg = hard_frame_pointer_rtx;
3915 frame_base_offset = SPARC_STACK_BIAS;
3918 if (actual_fsize == 0)
3919 /* do nothing. */ ;
3920 else if (sparc_leaf_function_p)
3922 if (actual_fsize <= 4096)
3923 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (-actual_fsize)));
3924 else if (actual_fsize <= 8192)
3926 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (-4096)));
3927 /* %sp is still the CFA register. */
3928 RTX_FRAME_RELATED_P (insn) = 1;
3929 insn
3930 = emit_insn (gen_stack_pointer_inc (GEN_INT (4096-actual_fsize)));
3932 else
3934 rtx reg = gen_rtx_REG (Pmode, 1);
3935 emit_move_insn (reg, GEN_INT (-actual_fsize));
3936 insn = emit_insn (gen_stack_pointer_inc (reg));
3937 REG_NOTES (insn) =
3938 gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
3939 gen_stack_pointer_inc (GEN_INT (-actual_fsize)),
3940 REG_NOTES (insn));
3943 RTX_FRAME_RELATED_P (insn) = 1;
3945 else
3947 if (actual_fsize <= 4096)
3948 insn = emit_insn (gen_save_register_window (GEN_INT (-actual_fsize)));
3949 else if (actual_fsize <= 8192)
3951 insn = emit_insn (gen_save_register_window (GEN_INT (-4096)));
3952 /* %sp is not the CFA register anymore. */
3953 emit_insn (gen_stack_pointer_inc (GEN_INT (4096-actual_fsize)));
3955 else
3957 rtx reg = gen_rtx_REG (Pmode, 1);
3958 emit_move_insn (reg, GEN_INT (-actual_fsize));
3959 insn = emit_insn (gen_save_register_window (reg));
3962 RTX_FRAME_RELATED_P (insn) = 1;
3963 for (i=0; i < XVECLEN (PATTERN (insn), 0); i++)
3964 RTX_FRAME_RELATED_P (XVECEXP (PATTERN (insn), 0, i)) = 1;
3967 if (num_gfregs)
3968 emit_save_or_restore_regs (SORR_SAVE);
3970 /* Load the PIC register if needed. */
3971 if (flag_pic && current_function_uses_pic_offset_table)
3972 load_pic_register (false);
3975 /* This function generates the assembly code for function entry, which boils
3976 down to emitting the necessary .register directives. */
3978 static void
3979 sparc_asm_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
3981 /* Check that the assumption we made in sparc_expand_prologue is valid. */
3982 gcc_assert (sparc_leaf_function_p == current_function_uses_only_leaf_regs);
3984 sparc_output_scratch_registers (file);
3987 /* Expand the function epilogue, either normal or part of a sibcall.
3988 We emit all the instructions except the return or the call. */
3990 void
3991 sparc_expand_epilogue (void)
3993 if (num_gfregs)
3994 emit_save_or_restore_regs (SORR_RESTORE);
3996 if (actual_fsize == 0)
3997 /* do nothing. */ ;
3998 else if (sparc_leaf_function_p)
4000 if (actual_fsize <= 4096)
4001 emit_insn (gen_stack_pointer_dec (GEN_INT (- actual_fsize)));
4002 else if (actual_fsize <= 8192)
4004 emit_insn (gen_stack_pointer_dec (GEN_INT (-4096)));
4005 emit_insn (gen_stack_pointer_dec (GEN_INT (4096 - actual_fsize)));
4007 else
4009 rtx reg = gen_rtx_REG (Pmode, 1);
4010 emit_move_insn (reg, GEN_INT (-actual_fsize));
4011 emit_insn (gen_stack_pointer_dec (reg));
4016 /* Return true if it is appropriate to emit `return' instructions in the
4017 body of a function. */
4019 bool
4020 sparc_can_use_return_insn_p (void)
4022 return sparc_prologue_data_valid_p
4023 && (actual_fsize == 0 || !sparc_leaf_function_p);
4026 /* This function generates the assembly code for function exit. */
4028 static void
4029 sparc_asm_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
4031 /* If code does not drop into the epilogue, we have to still output
4032 a dummy nop for the sake of sane backtraces. Otherwise, if the
4033 last two instructions of a function were "call foo; dslot;" this
4034 can make the return PC of foo (i.e. address of call instruction
4035 plus 8) point to the first instruction in the next function. */
4037 rtx insn, last_real_insn;
4039 insn = get_last_insn ();
4041 last_real_insn = prev_real_insn (insn);
4042 if (last_real_insn
4043 && GET_CODE (last_real_insn) == INSN
4044 && GET_CODE (PATTERN (last_real_insn)) == SEQUENCE)
4045 last_real_insn = XVECEXP (PATTERN (last_real_insn), 0, 0);
4047 if (last_real_insn && GET_CODE (last_real_insn) == CALL_INSN)
4048 fputs("\tnop\n", file);
4050 sparc_output_deferred_case_vectors ();
4053 /* Output a 'restore' instruction. */
4055 static void
4056 output_restore (rtx pat)
4058 rtx operands[3];
4060 if (! pat)
4062 fputs ("\t restore\n", asm_out_file);
4063 return;
4066 gcc_assert (GET_CODE (pat) == SET);
4068 operands[0] = SET_DEST (pat);
4069 pat = SET_SRC (pat);
4071 switch (GET_CODE (pat))
4073 case PLUS:
4074 operands[1] = XEXP (pat, 0);
4075 operands[2] = XEXP (pat, 1);
4076 output_asm_insn (" restore %r1, %2, %Y0", operands);
4077 break;
4078 case LO_SUM:
4079 operands[1] = XEXP (pat, 0);
4080 operands[2] = XEXP (pat, 1);
4081 output_asm_insn (" restore %r1, %%lo(%a2), %Y0", operands);
4082 break;
4083 case ASHIFT:
4084 operands[1] = XEXP (pat, 0);
4085 gcc_assert (XEXP (pat, 1) == const1_rtx);
4086 output_asm_insn (" restore %r1, %r1, %Y0", operands);
4087 break;
4088 default:
4089 operands[1] = pat;
4090 output_asm_insn (" restore %%g0, %1, %Y0", operands);
4091 break;
4095 /* Output a return. */
4097 const char *
4098 output_return (rtx insn)
4100 if (sparc_leaf_function_p)
4102 /* This is a leaf function so we don't have to bother restoring the
4103 register window, which frees us from dealing with the convoluted
4104 semantics of restore/return. We simply output the jump to the
4105 return address and the insn in the delay slot (if any). */
4107 gcc_assert (! current_function_calls_eh_return);
4109 return "jmp\t%%o7+%)%#";
4111 else
4113 /* This is a regular function so we have to restore the register window.
4114 We may have a pending insn for the delay slot, which will be either
4115 combined with the 'restore' instruction or put in the delay slot of
4116 the 'return' instruction. */
4118 if (current_function_calls_eh_return)
4120 /* If the function uses __builtin_eh_return, the eh_return
4121 machinery occupies the delay slot. */
4122 gcc_assert (! final_sequence);
4124 if (! flag_delayed_branch)
4125 fputs ("\tadd\t%fp, %g1, %fp\n", asm_out_file);
4127 if (TARGET_V9)
4128 fputs ("\treturn\t%i7+8\n", asm_out_file);
4129 else
4130 fputs ("\trestore\n\tjmp\t%o7+8\n", asm_out_file);
4132 if (flag_delayed_branch)
4133 fputs ("\t add\t%sp, %g1, %sp\n", asm_out_file);
4134 else
4135 fputs ("\t nop\n", asm_out_file);
4137 else if (final_sequence)
4139 rtx delay, pat;
4141 delay = NEXT_INSN (insn);
4142 gcc_assert (delay);
4144 pat = PATTERN (delay);
4146 if (TARGET_V9 && ! epilogue_renumber (&pat, 1))
4148 epilogue_renumber (&pat, 0);
4149 return "return\t%%i7+%)%#";
4151 else
4153 output_asm_insn ("jmp\t%%i7+%)", NULL);
4154 output_restore (pat);
4155 PATTERN (delay) = gen_blockage ();
4156 INSN_CODE (delay) = -1;
4159 else
4161 /* The delay slot is empty. */
4162 if (TARGET_V9)
4163 return "return\t%%i7+%)\n\t nop";
4164 else if (flag_delayed_branch)
4165 return "jmp\t%%i7+%)\n\t restore";
4166 else
4167 return "restore\n\tjmp\t%%o7+%)\n\t nop";
4171 return "";
4174 /* Output a sibling call. */
4176 const char *
4177 output_sibcall (rtx insn, rtx call_operand)
4179 rtx operands[1];
4181 gcc_assert (flag_delayed_branch);
4183 operands[0] = call_operand;
4185 if (sparc_leaf_function_p)
4187 /* This is a leaf function so we don't have to bother restoring the
4188 register window. We simply output the jump to the function and
4189 the insn in the delay slot (if any). */
4191 gcc_assert (!(LEAF_SIBCALL_SLOT_RESERVED_P && final_sequence));
4193 if (final_sequence)
4194 output_asm_insn ("sethi\t%%hi(%a0), %%g1\n\tjmp\t%%g1 + %%lo(%a0)%#",
4195 operands);
4196 else
4197 /* Use or with rs2 %%g0 instead of mov, so that as/ld can optimize
4198 it into branch if possible. */
4199 output_asm_insn ("or\t%%o7, %%g0, %%g1\n\tcall\t%a0, 0\n\t or\t%%g1, %%g0, %%o7",
4200 operands);
4202 else
4204 /* This is a regular function so we have to restore the register window.
4205 We may have a pending insn for the delay slot, which will be combined
4206 with the 'restore' instruction. */
4208 output_asm_insn ("call\t%a0, 0", operands);
4210 if (final_sequence)
4212 rtx delay = NEXT_INSN (insn);
4213 gcc_assert (delay);
4215 output_restore (PATTERN (delay));
4217 PATTERN (delay) = gen_blockage ();
4218 INSN_CODE (delay) = -1;
4220 else
4221 output_restore (NULL_RTX);
4224 return "";
4227 /* Functions for handling argument passing.
4229 For 32-bit, the first 6 args are normally in registers and the rest are
4230 pushed. Any arg that starts within the first 6 words is at least
4231 partially passed in a register unless its data type forbids.
4233 For 64-bit, the argument registers are laid out as an array of 16 elements
4234 and arguments are added sequentially. The first 6 int args and up to the
4235 first 16 fp args (depending on size) are passed in regs.
4237 Slot Stack Integral Float Float in structure Double Long Double
4238 ---- ----- -------- ----- ------------------ ------ -----------
4239 15 [SP+248] %f31 %f30,%f31 %d30
4240 14 [SP+240] %f29 %f28,%f29 %d28 %q28
4241 13 [SP+232] %f27 %f26,%f27 %d26
4242 12 [SP+224] %f25 %f24,%f25 %d24 %q24
4243 11 [SP+216] %f23 %f22,%f23 %d22
4244 10 [SP+208] %f21 %f20,%f21 %d20 %q20
4245 9 [SP+200] %f19 %f18,%f19 %d18
4246 8 [SP+192] %f17 %f16,%f17 %d16 %q16
4247 7 [SP+184] %f15 %f14,%f15 %d14
4248 6 [SP+176] %f13 %f12,%f13 %d12 %q12
4249 5 [SP+168] %o5 %f11 %f10,%f11 %d10
4250 4 [SP+160] %o4 %f9 %f8,%f9 %d8 %q8
4251 3 [SP+152] %o3 %f7 %f6,%f7 %d6
4252 2 [SP+144] %o2 %f5 %f4,%f5 %d4 %q4
4253 1 [SP+136] %o1 %f3 %f2,%f3 %d2
4254 0 [SP+128] %o0 %f1 %f0,%f1 %d0 %q0
4256 Here SP = %sp if -mno-stack-bias or %sp+stack_bias otherwise.
4258 Integral arguments are always passed as 64-bit quantities appropriately
4259 extended.
4261 Passing of floating point values is handled as follows.
4262 If a prototype is in scope:
4263 If the value is in a named argument (i.e. not a stdarg function or a
4264 value not part of the `...') then the value is passed in the appropriate
4265 fp reg.
4266 If the value is part of the `...' and is passed in one of the first 6
4267 slots then the value is passed in the appropriate int reg.
4268 If the value is part of the `...' and is not passed in one of the first 6
4269 slots then the value is passed in memory.
4270 If a prototype is not in scope:
4271 If the value is one of the first 6 arguments the value is passed in the
4272 appropriate integer reg and the appropriate fp reg.
4273 If the value is not one of the first 6 arguments the value is passed in
4274 the appropriate fp reg and in memory.
4277 Summary of the calling conventions implemented by GCC on SPARC:
4279 32-bit ABI:
4280 size argument return value
4282 small integer <4 int. reg. int. reg.
4283 word 4 int. reg. int. reg.
4284 double word 8 int. reg. int. reg.
4286 _Complex small integer <8 int. reg. int. reg.
4287 _Complex word 8 int. reg. int. reg.
4288 _Complex double word 16 memory int. reg.
4290 vector integer <=8 int. reg. FP reg.
4291 vector integer >8 memory memory
4293 float 4 int. reg. FP reg.
4294 double 8 int. reg. FP reg.
4295 long double 16 memory memory
4297 _Complex float 8 memory FP reg.
4298 _Complex double 16 memory FP reg.
4299 _Complex long double 32 memory FP reg.
4301 vector float any memory memory
4303 aggregate any memory memory
4307 64-bit ABI:
4308 size argument return value
4310 small integer <8 int. reg. int. reg.
4311 word 8 int. reg. int. reg.
4312 double word 16 int. reg. int. reg.
4314 _Complex small integer <16 int. reg. int. reg.
4315 _Complex word 16 int. reg. int. reg.
4316 _Complex double word 32 memory int. reg.
4318 vector integer <=16 FP reg. FP reg.
4319 vector integer 16<s<=32 memory FP reg.
4320 vector integer >32 memory memory
4322 float 4 FP reg. FP reg.
4323 double 8 FP reg. FP reg.
4324 long double 16 FP reg. FP reg.
4326 _Complex float 8 FP reg. FP reg.
4327 _Complex double 16 FP reg. FP reg.
4328 _Complex long double 32 memory FP reg.
4330 vector float <=16 FP reg. FP reg.
4331 vector float 16<s<=32 memory FP reg.
4332 vector float >32 memory memory
4334 aggregate <=16 reg. reg.
4335 aggregate 16<s<=32 memory reg.
4336 aggregate >32 memory memory
4340 Note #1: complex floating-point types follow the extended SPARC ABIs as
4341 implemented by the Sun compiler.
4343 Note #2: integral vector types follow the scalar floating-point types
4344 conventions to match what is implemented by the Sun VIS SDK.
4346 Note #3: floating-point vector types follow the aggregate types
4347 conventions. */
4350 /* Maximum number of int regs for args. */
4351 #define SPARC_INT_ARG_MAX 6
4352 /* Maximum number of fp regs for args. */
4353 #define SPARC_FP_ARG_MAX 16
4355 #define ROUND_ADVANCE(SIZE) (((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
4357 /* Handle the INIT_CUMULATIVE_ARGS macro.
4358 Initialize a variable CUM of type CUMULATIVE_ARGS
4359 for a call to a function whose data type is FNTYPE.
4360 For a library call, FNTYPE is 0. */
4362 void
4363 init_cumulative_args (struct sparc_args *cum, tree fntype,
4364 rtx libname ATTRIBUTE_UNUSED,
4365 tree fndecl ATTRIBUTE_UNUSED)
4367 cum->words = 0;
4368 cum->prototype_p = fntype && TYPE_ARG_TYPES (fntype);
4369 cum->libcall_p = fntype == 0;
4372 /* Handle the TARGET_PROMOTE_PROTOTYPES target hook.
4373 When a prototype says `char' or `short', really pass an `int'. */
4375 static bool
4376 sparc_promote_prototypes (tree fntype ATTRIBUTE_UNUSED)
4378 return TARGET_ARCH32 ? true : false;
4381 /* Handle the TARGET_STRICT_ARGUMENT_NAMING target hook. */
4383 static bool
4384 sparc_strict_argument_naming (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
4386 return TARGET_ARCH64 ? true : false;
4389 /* Scan the record type TYPE and return the following predicates:
4390 - INTREGS_P: the record contains at least one field or sub-field
4391 that is eligible for promotion in integer registers.
4392 - FP_REGS_P: the record contains at least one field or sub-field
4393 that is eligible for promotion in floating-point registers.
4394 - PACKED_P: the record contains at least one field that is packed.
4396 Sub-fields are not taken into account for the PACKED_P predicate. */
4398 static void
4399 scan_record_type (tree type, int *intregs_p, int *fpregs_p, int *packed_p)
4401 tree field;
4403 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4405 if (TREE_CODE (field) == FIELD_DECL)
4407 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
4408 scan_record_type (TREE_TYPE (field), intregs_p, fpregs_p, 0);
4409 else if ((FLOAT_TYPE_P (TREE_TYPE (field))
4410 || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
4411 && TARGET_FPU)
4412 *fpregs_p = 1;
4413 else
4414 *intregs_p = 1;
4416 if (packed_p && DECL_PACKED (field))
4417 *packed_p = 1;
4422 /* Compute the slot number to pass an argument in.
4423 Return the slot number or -1 if passing on the stack.
4425 CUM is a variable of type CUMULATIVE_ARGS which gives info about
4426 the preceding args and about the function being called.
4427 MODE is the argument's machine mode.
4428 TYPE is the data type of the argument (as a tree).
4429 This is null for libcalls where that information may
4430 not be available.
4431 NAMED is nonzero if this argument is a named parameter
4432 (otherwise it is an extra parameter matching an ellipsis).
4433 INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG.
4434 *PREGNO records the register number to use if scalar type.
4435 *PPADDING records the amount of padding needed in words. */
4437 static int
4438 function_arg_slotno (const struct sparc_args *cum, enum machine_mode mode,
4439 tree type, int named, int incoming_p,
4440 int *pregno, int *ppadding)
4442 int regbase = (incoming_p
4443 ? SPARC_INCOMING_INT_ARG_FIRST
4444 : SPARC_OUTGOING_INT_ARG_FIRST);
4445 int slotno = cum->words;
4446 enum mode_class mclass;
4447 int regno;
4449 *ppadding = 0;
4451 if (type && TREE_ADDRESSABLE (type))
4452 return -1;
4454 if (TARGET_ARCH32
4455 && mode == BLKmode
4456 && type
4457 && TYPE_ALIGN (type) % PARM_BOUNDARY != 0)
4458 return -1;
4460 /* For SPARC64, objects requiring 16-byte alignment get it. */
4461 if (TARGET_ARCH64
4462 && (type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode)) >= 128
4463 && (slotno & 1) != 0)
4464 slotno++, *ppadding = 1;
4466 mclass = GET_MODE_CLASS (mode);
4467 if (type && TREE_CODE (type) == VECTOR_TYPE)
4469 /* Vector types deserve special treatment because they are
4470 polymorphic wrt their mode, depending upon whether VIS
4471 instructions are enabled. */
4472 if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
4474 /* The SPARC port defines no floating-point vector modes. */
4475 gcc_assert (mode == BLKmode);
4477 else
4479 /* Integral vector types should either have a vector
4480 mode or an integral mode, because we are guaranteed
4481 by pass_by_reference that their size is not greater
4482 than 16 bytes and TImode is 16-byte wide. */
4483 gcc_assert (mode != BLKmode);
4485 /* Vector integers are handled like floats according to
4486 the Sun VIS SDK. */
4487 mclass = MODE_FLOAT;
4491 switch (mclass)
4493 case MODE_FLOAT:
4494 case MODE_COMPLEX_FLOAT:
4495 if (TARGET_ARCH64 && TARGET_FPU && named)
4497 if (slotno >= SPARC_FP_ARG_MAX)
4498 return -1;
4499 regno = SPARC_FP_ARG_FIRST + slotno * 2;
4500 /* Arguments filling only one single FP register are
4501 right-justified in the outer double FP register. */
4502 if (GET_MODE_SIZE (mode) <= 4)
4503 regno++;
4504 break;
4506 /* fallthrough */
4508 case MODE_INT:
4509 case MODE_COMPLEX_INT:
4510 if (slotno >= SPARC_INT_ARG_MAX)
4511 return -1;
4512 regno = regbase + slotno;
4513 break;
4515 case MODE_RANDOM:
4516 if (mode == VOIDmode)
4517 /* MODE is VOIDmode when generating the actual call. */
4518 return -1;
4520 gcc_assert (mode == BLKmode);
4522 if (TARGET_ARCH32 || !type || (TREE_CODE (type) == UNION_TYPE))
4524 if (slotno >= SPARC_INT_ARG_MAX)
4525 return -1;
4526 regno = regbase + slotno;
4528 else /* TARGET_ARCH64 && type */
4530 int intregs_p = 0, fpregs_p = 0, packed_p = 0;
4532 /* First see what kinds of registers we would need. */
4533 if (TREE_CODE (type) == VECTOR_TYPE)
4534 fpregs_p = 1;
4535 else
4536 scan_record_type (type, &intregs_p, &fpregs_p, &packed_p);
4538 /* The ABI obviously doesn't specify how packed structures
4539 are passed. These are defined to be passed in int regs
4540 if possible, otherwise memory. */
4541 if (packed_p || !named)
4542 fpregs_p = 0, intregs_p = 1;
4544 /* If all arg slots are filled, then must pass on stack. */
4545 if (fpregs_p && slotno >= SPARC_FP_ARG_MAX)
4546 return -1;
4548 /* If there are only int args and all int arg slots are filled,
4549 then must pass on stack. */
4550 if (!fpregs_p && intregs_p && slotno >= SPARC_INT_ARG_MAX)
4551 return -1;
4553 /* Note that even if all int arg slots are filled, fp members may
4554 still be passed in regs if such regs are available.
4555 *PREGNO isn't set because there may be more than one, it's up
4556 to the caller to compute them. */
4557 return slotno;
4559 break;
4561 default :
4562 gcc_unreachable ();
4565 *pregno = regno;
4566 return slotno;
4569 /* Handle recursive register counting for structure field layout. */
4571 struct function_arg_record_value_parms
4573 rtx ret; /* return expression being built. */
4574 int slotno; /* slot number of the argument. */
4575 int named; /* whether the argument is named. */
4576 int regbase; /* regno of the base register. */
4577 int stack; /* 1 if part of the argument is on the stack. */
4578 int intoffset; /* offset of the first pending integer field. */
4579 unsigned int nregs; /* number of words passed in registers. */
4582 static void function_arg_record_value_3
4583 (HOST_WIDE_INT, struct function_arg_record_value_parms *);
4584 static void function_arg_record_value_2
4585 (tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool);
4586 static void function_arg_record_value_1
4587 (tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool);
4588 static rtx function_arg_record_value (tree, enum machine_mode, int, int, int);
4589 static rtx function_arg_union_value (int, enum machine_mode, int, int);
4591 /* A subroutine of function_arg_record_value. Traverse the structure
4592 recursively and determine how many registers will be required. */
4594 static void
4595 function_arg_record_value_1 (tree type, HOST_WIDE_INT startbitpos,
4596 struct function_arg_record_value_parms *parms,
4597 bool packed_p)
4599 tree field;
4601 /* We need to compute how many registers are needed so we can
4602 allocate the PARALLEL but before we can do that we need to know
4603 whether there are any packed fields. The ABI obviously doesn't
4604 specify how structures are passed in this case, so they are
4605 defined to be passed in int regs if possible, otherwise memory,
4606 regardless of whether there are fp values present. */
4608 if (! packed_p)
4609 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4611 if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
4613 packed_p = true;
4614 break;
4618 /* Compute how many registers we need. */
4619 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4621 if (TREE_CODE (field) == FIELD_DECL)
4623 HOST_WIDE_INT bitpos = startbitpos;
4625 if (DECL_SIZE (field) != 0)
4627 if (integer_zerop (DECL_SIZE (field)))
4628 continue;
4630 if (host_integerp (bit_position (field), 1))
4631 bitpos += int_bit_position (field);
4634 /* ??? FIXME: else assume zero offset. */
4636 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
4637 function_arg_record_value_1 (TREE_TYPE (field),
4638 bitpos,
4639 parms,
4640 packed_p);
4641 else if ((FLOAT_TYPE_P (TREE_TYPE (field))
4642 || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
4643 && TARGET_FPU
4644 && parms->named
4645 && ! packed_p)
4647 if (parms->intoffset != -1)
4649 unsigned int startbit, endbit;
4650 int intslots, this_slotno;
4652 startbit = parms->intoffset & -BITS_PER_WORD;
4653 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
4655 intslots = (endbit - startbit) / BITS_PER_WORD;
4656 this_slotno = parms->slotno + parms->intoffset
4657 / BITS_PER_WORD;
4659 if (intslots > 0 && intslots > SPARC_INT_ARG_MAX - this_slotno)
4661 intslots = MAX (0, SPARC_INT_ARG_MAX - this_slotno);
4662 /* We need to pass this field on the stack. */
4663 parms->stack = 1;
4666 parms->nregs += intslots;
4667 parms->intoffset = -1;
4670 /* There's no need to check this_slotno < SPARC_FP_ARG MAX.
4671 If it wasn't true we wouldn't be here. */
4672 if (TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE
4673 && DECL_MODE (field) == BLKmode)
4674 parms->nregs += TYPE_VECTOR_SUBPARTS (TREE_TYPE (field));
4675 else if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
4676 parms->nregs += 2;
4677 else
4678 parms->nregs += 1;
4680 else
4682 if (parms->intoffset == -1)
4683 parms->intoffset = bitpos;
4689 /* A subroutine of function_arg_record_value. Assign the bits of the
4690 structure between parms->intoffset and bitpos to integer registers. */
4692 static void
4693 function_arg_record_value_3 (HOST_WIDE_INT bitpos,
4694 struct function_arg_record_value_parms *parms)
4696 enum machine_mode mode;
4697 unsigned int regno;
4698 unsigned int startbit, endbit;
4699 int this_slotno, intslots, intoffset;
4700 rtx reg;
4702 if (parms->intoffset == -1)
4703 return;
4705 intoffset = parms->intoffset;
4706 parms->intoffset = -1;
4708 startbit = intoffset & -BITS_PER_WORD;
4709 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
4710 intslots = (endbit - startbit) / BITS_PER_WORD;
4711 this_slotno = parms->slotno + intoffset / BITS_PER_WORD;
4713 intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno);
4714 if (intslots <= 0)
4715 return;
4717 /* If this is the trailing part of a word, only load that much into
4718 the register. Otherwise load the whole register. Note that in
4719 the latter case we may pick up unwanted bits. It's not a problem
4720 at the moment but may wish to revisit. */
4722 if (intoffset % BITS_PER_WORD != 0)
4723 mode = smallest_mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
4724 MODE_INT);
4725 else
4726 mode = word_mode;
4728 intoffset /= BITS_PER_UNIT;
4731 regno = parms->regbase + this_slotno;
4732 reg = gen_rtx_REG (mode, regno);
4733 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
4734 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
4736 this_slotno += 1;
4737 intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
4738 mode = word_mode;
4739 parms->nregs += 1;
4740 intslots -= 1;
4742 while (intslots > 0);
4745 /* A subroutine of function_arg_record_value. Traverse the structure
4746 recursively and assign bits to floating point registers. Track which
4747 bits in between need integer registers; invoke function_arg_record_value_3
4748 to make that happen. */
4750 static void
4751 function_arg_record_value_2 (tree type, HOST_WIDE_INT startbitpos,
4752 struct function_arg_record_value_parms *parms,
4753 bool packed_p)
4755 tree field;
4757 if (! packed_p)
4758 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4760 if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
4762 packed_p = true;
4763 break;
4767 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
4769 if (TREE_CODE (field) == FIELD_DECL)
4771 HOST_WIDE_INT bitpos = startbitpos;
4773 if (DECL_SIZE (field) != 0)
4775 if (integer_zerop (DECL_SIZE (field)))
4776 continue;
4778 if (host_integerp (bit_position (field), 1))
4779 bitpos += int_bit_position (field);
4782 /* ??? FIXME: else assume zero offset. */
4784 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
4785 function_arg_record_value_2 (TREE_TYPE (field),
4786 bitpos,
4787 parms,
4788 packed_p);
4789 else if ((FLOAT_TYPE_P (TREE_TYPE (field))
4790 || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
4791 && TARGET_FPU
4792 && parms->named
4793 && ! packed_p)
4795 int this_slotno = parms->slotno + bitpos / BITS_PER_WORD;
4796 int regno, nregs, pos;
4797 enum machine_mode mode = DECL_MODE (field);
4798 rtx reg;
4800 function_arg_record_value_3 (bitpos, parms);
4802 if (TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE
4803 && mode == BLKmode)
4805 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field)));
4806 nregs = TYPE_VECTOR_SUBPARTS (TREE_TYPE (field));
4808 else if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
4810 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field)));
4811 nregs = 2;
4813 else
4814 nregs = 1;
4816 regno = SPARC_FP_ARG_FIRST + this_slotno * 2;
4817 if (GET_MODE_SIZE (mode) <= 4 && (bitpos & 32) != 0)
4818 regno++;
4819 reg = gen_rtx_REG (mode, regno);
4820 pos = bitpos / BITS_PER_UNIT;
4821 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
4822 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (pos));
4823 parms->nregs += 1;
4824 while (--nregs > 0)
4826 regno += GET_MODE_SIZE (mode) / 4;
4827 reg = gen_rtx_REG (mode, regno);
4828 pos += GET_MODE_SIZE (mode);
4829 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
4830 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (pos));
4831 parms->nregs += 1;
4834 else
4836 if (parms->intoffset == -1)
4837 parms->intoffset = bitpos;
4843 /* Used by function_arg and function_value to implement the complex
4844 conventions of the 64-bit ABI for passing and returning structures.
4845 Return an expression valid as a return value for the two macros
4846 FUNCTION_ARG and FUNCTION_VALUE.
4848 TYPE is the data type of the argument (as a tree).
4849 This is null for libcalls where that information may
4850 not be available.
4851 MODE is the argument's machine mode.
4852 SLOTNO is the index number of the argument's slot in the parameter array.
4853 NAMED is nonzero if this argument is a named parameter
4854 (otherwise it is an extra parameter matching an ellipsis).
4855 REGBASE is the regno of the base register for the parameter array. */
4857 static rtx
4858 function_arg_record_value (tree type, enum machine_mode mode,
4859 int slotno, int named, int regbase)
4861 HOST_WIDE_INT typesize = int_size_in_bytes (type);
4862 struct function_arg_record_value_parms parms;
4863 unsigned int nregs;
4865 parms.ret = NULL_RTX;
4866 parms.slotno = slotno;
4867 parms.named = named;
4868 parms.regbase = regbase;
4869 parms.stack = 0;
4871 /* Compute how many registers we need. */
4872 parms.nregs = 0;
4873 parms.intoffset = 0;
4874 function_arg_record_value_1 (type, 0, &parms, false);
4876 /* Take into account pending integer fields. */
4877 if (parms.intoffset != -1)
4879 unsigned int startbit, endbit;
4880 int intslots, this_slotno;
4882 startbit = parms.intoffset & -BITS_PER_WORD;
4883 endbit = (typesize*BITS_PER_UNIT + BITS_PER_WORD - 1) & -BITS_PER_WORD;
4884 intslots = (endbit - startbit) / BITS_PER_WORD;
4885 this_slotno = slotno + parms.intoffset / BITS_PER_WORD;
4887 if (intslots > 0 && intslots > SPARC_INT_ARG_MAX - this_slotno)
4889 intslots = MAX (0, SPARC_INT_ARG_MAX - this_slotno);
4890 /* We need to pass this field on the stack. */
4891 parms.stack = 1;
4894 parms.nregs += intslots;
4896 nregs = parms.nregs;
4898 /* Allocate the vector and handle some annoying special cases. */
4899 if (nregs == 0)
4901 /* ??? Empty structure has no value? Duh? */
4902 if (typesize <= 0)
4904 /* Though there's nothing really to store, return a word register
4905 anyway so the rest of gcc doesn't go nuts. Returning a PARALLEL
4906 leads to breakage due to the fact that there are zero bytes to
4907 load. */
4908 return gen_rtx_REG (mode, regbase);
4910 else
4912 /* ??? C++ has structures with no fields, and yet a size. Give up
4913 for now and pass everything back in integer registers. */
4914 nregs = (typesize + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4916 if (nregs + slotno > SPARC_INT_ARG_MAX)
4917 nregs = SPARC_INT_ARG_MAX - slotno;
4919 gcc_assert (nregs != 0);
4921 parms.ret = gen_rtx_PARALLEL (mode, rtvec_alloc (parms.stack + nregs));
4923 /* If at least one field must be passed on the stack, generate
4924 (parallel [(expr_list (nil) ...) ...]) so that all fields will
4925 also be passed on the stack. We can't do much better because the
4926 semantics of TARGET_ARG_PARTIAL_BYTES doesn't handle the case
4927 of structures for which the fields passed exclusively in registers
4928 are not at the beginning of the structure. */
4929 if (parms.stack)
4930 XVECEXP (parms.ret, 0, 0)
4931 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
4933 /* Fill in the entries. */
4934 parms.nregs = 0;
4935 parms.intoffset = 0;
4936 function_arg_record_value_2 (type, 0, &parms, false);
4937 function_arg_record_value_3 (typesize * BITS_PER_UNIT, &parms);
4939 gcc_assert (parms.nregs == nregs);
4941 return parms.ret;
4944 /* Used by function_arg and function_value to implement the conventions
4945 of the 64-bit ABI for passing and returning unions.
4946 Return an expression valid as a return value for the two macros
4947 FUNCTION_ARG and FUNCTION_VALUE.
4949 SIZE is the size in bytes of the union.
4950 MODE is the argument's machine mode.
4951 REGNO is the hard register the union will be passed in. */
4953 static rtx
4954 function_arg_union_value (int size, enum machine_mode mode, int slotno,
4955 int regno)
4957 int nwords = ROUND_ADVANCE (size), i;
4958 rtx regs;
4960 /* See comment in previous function for empty structures. */
4961 if (nwords == 0)
4962 return gen_rtx_REG (mode, regno);
4964 if (slotno == SPARC_INT_ARG_MAX - 1)
4965 nwords = 1;
4967 regs = gen_rtx_PARALLEL (mode, rtvec_alloc (nwords));
4969 for (i = 0; i < nwords; i++)
4971 /* Unions are passed left-justified. */
4972 XVECEXP (regs, 0, i)
4973 = gen_rtx_EXPR_LIST (VOIDmode,
4974 gen_rtx_REG (word_mode, regno),
4975 GEN_INT (UNITS_PER_WORD * i));
4976 regno++;
4979 return regs;
4982 /* Used by function_arg and function_value to implement the conventions
4983 for passing and returning large (BLKmode) vectors.
4984 Return an expression valid as a return value for the two macros
4985 FUNCTION_ARG and FUNCTION_VALUE.
4987 SIZE is the size in bytes of the vector.
4988 BASE_MODE is the argument's base machine mode.
4989 REGNO is the FP hard register the vector will be passed in. */
4991 static rtx
4992 function_arg_vector_value (int size, enum machine_mode base_mode, int regno)
4994 unsigned short base_mode_size = GET_MODE_SIZE (base_mode);
4995 int nregs = size / base_mode_size, i;
4996 rtx regs;
4998 regs = gen_rtx_PARALLEL (BLKmode, rtvec_alloc (nregs));
5000 for (i = 0; i < nregs; i++)
5002 XVECEXP (regs, 0, i)
5003 = gen_rtx_EXPR_LIST (VOIDmode,
5004 gen_rtx_REG (base_mode, regno),
5005 GEN_INT (base_mode_size * i));
5006 regno += base_mode_size / 4;
5009 return regs;
5012 /* Handle the FUNCTION_ARG macro.
5013 Determine where to put an argument to a function.
5014 Value is zero to push the argument on the stack,
5015 or a hard register in which to store the argument.
5017 CUM is a variable of type CUMULATIVE_ARGS which gives info about
5018 the preceding args and about the function being called.
5019 MODE is the argument's machine mode.
5020 TYPE is the data type of the argument (as a tree).
5021 This is null for libcalls where that information may
5022 not be available.
5023 NAMED is nonzero if this argument is a named parameter
5024 (otherwise it is an extra parameter matching an ellipsis).
5025 INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG. */
5028 function_arg (const struct sparc_args *cum, enum machine_mode mode,
5029 tree type, int named, int incoming_p)
5031 int regbase = (incoming_p
5032 ? SPARC_INCOMING_INT_ARG_FIRST
5033 : SPARC_OUTGOING_INT_ARG_FIRST);
5034 int slotno, regno, padding;
5035 enum mode_class mclass = GET_MODE_CLASS (mode);
5036 rtx reg;
5038 slotno = function_arg_slotno (cum, mode, type, named, incoming_p,
5039 &regno, &padding);
5041 if (slotno == -1)
5042 return 0;
5044 if (TARGET_ARCH32)
5046 reg = gen_rtx_REG (mode, regno);
5047 return reg;
5050 if (type && TREE_CODE (type) == RECORD_TYPE)
5052 /* Structures up to 16 bytes in size are passed in arg slots on the
5053 stack and are promoted to registers where possible. */
5055 gcc_assert (int_size_in_bytes (type) <= 16);
5057 return function_arg_record_value (type, mode, slotno, named, regbase);
5059 else if (type && TREE_CODE (type) == UNION_TYPE)
5061 HOST_WIDE_INT size = int_size_in_bytes (type);
5063 gcc_assert (size <= 16);
5065 return function_arg_union_value (size, mode, slotno, regno);
5067 else if (type && TREE_CODE (type) == VECTOR_TYPE)
5069 /* Vector types deserve special treatment because they are
5070 polymorphic wrt their mode, depending upon whether VIS
5071 instructions are enabled. */
5072 HOST_WIDE_INT size = int_size_in_bytes (type);
5074 gcc_assert (size <= 16);
5076 if (mode == BLKmode)
5077 return function_arg_vector_value (size,
5078 TYPE_MODE (TREE_TYPE (type)),
5079 SPARC_FP_ARG_FIRST + 2*slotno);
5080 else
5081 mclass = MODE_FLOAT;
5084 /* v9 fp args in reg slots beyond the int reg slots get passed in regs
5085 but also have the slot allocated for them.
5086 If no prototype is in scope fp values in register slots get passed
5087 in two places, either fp regs and int regs or fp regs and memory. */
5088 if ((mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
5089 && SPARC_FP_REG_P (regno))
5091 reg = gen_rtx_REG (mode, regno);
5092 if (cum->prototype_p || cum->libcall_p)
5094 /* "* 2" because fp reg numbers are recorded in 4 byte
5095 quantities. */
5096 #if 0
5097 /* ??? This will cause the value to be passed in the fp reg and
5098 in the stack. When a prototype exists we want to pass the
5099 value in the reg but reserve space on the stack. That's an
5100 optimization, and is deferred [for a bit]. */
5101 if ((regno - SPARC_FP_ARG_FIRST) >= SPARC_INT_ARG_MAX * 2)
5102 return gen_rtx_PARALLEL (mode,
5103 gen_rtvec (2,
5104 gen_rtx_EXPR_LIST (VOIDmode,
5105 NULL_RTX, const0_rtx),
5106 gen_rtx_EXPR_LIST (VOIDmode,
5107 reg, const0_rtx)));
5108 else
5109 #else
5110 /* ??? It seems that passing back a register even when past
5111 the area declared by REG_PARM_STACK_SPACE will allocate
5112 space appropriately, and will not copy the data onto the
5113 stack, exactly as we desire.
5115 This is due to locate_and_pad_parm being called in
5116 expand_call whenever reg_parm_stack_space > 0, which
5117 while beneficial to our example here, would seem to be
5118 in error from what had been intended. Ho hum... -- r~ */
5119 #endif
5120 return reg;
5122 else
5124 rtx v0, v1;
5126 if ((regno - SPARC_FP_ARG_FIRST) < SPARC_INT_ARG_MAX * 2)
5128 int intreg;
5130 /* On incoming, we don't need to know that the value
5131 is passed in %f0 and %i0, and it confuses other parts
5132 causing needless spillage even on the simplest cases. */
5133 if (incoming_p)
5134 return reg;
5136 intreg = (SPARC_OUTGOING_INT_ARG_FIRST
5137 + (regno - SPARC_FP_ARG_FIRST) / 2);
5139 v0 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
5140 v1 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (mode, intreg),
5141 const0_rtx);
5142 return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
5144 else
5146 v0 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
5147 v1 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
5148 return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
5152 else
5154 /* Scalar or complex int. */
5155 reg = gen_rtx_REG (mode, regno);
5158 return reg;
5161 /* For an arg passed partly in registers and partly in memory,
5162 this is the number of bytes of registers used.
5163 For args passed entirely in registers or entirely in memory, zero.
5165 Any arg that starts in the first 6 regs but won't entirely fit in them
5166 needs partial registers on v8. On v9, structures with integer
5167 values in arg slots 5,6 will be passed in %o5 and SP+176, and complex fp
5168 values that begin in the last fp reg [where "last fp reg" varies with the
5169 mode] will be split between that reg and memory. */
5171 static int
5172 sparc_arg_partial_bytes (CUMULATIVE_ARGS *cum, enum machine_mode mode,
5173 tree type, bool named)
5175 int slotno, regno, padding;
5177 /* We pass 0 for incoming_p here, it doesn't matter. */
5178 slotno = function_arg_slotno (cum, mode, type, named, 0, &regno, &padding);
5180 if (slotno == -1)
5181 return 0;
5183 if (TARGET_ARCH32)
5185 if ((slotno + (mode == BLKmode
5186 ? ROUND_ADVANCE (int_size_in_bytes (type))
5187 : ROUND_ADVANCE (GET_MODE_SIZE (mode))))
5188 > SPARC_INT_ARG_MAX)
5189 return (SPARC_INT_ARG_MAX - slotno) * UNITS_PER_WORD;
5191 else
5193 /* We are guaranteed by pass_by_reference that the size of the
5194 argument is not greater than 16 bytes, so we only need to return
5195 one word if the argument is partially passed in registers. */
5197 if (type && AGGREGATE_TYPE_P (type))
5199 int size = int_size_in_bytes (type);
5201 if (size > UNITS_PER_WORD
5202 && slotno == SPARC_INT_ARG_MAX - 1)
5203 return UNITS_PER_WORD;
5205 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_INT
5206 || (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
5207 && ! (TARGET_FPU && named)))
5209 /* The complex types are passed as packed types. */
5210 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
5211 && slotno == SPARC_INT_ARG_MAX - 1)
5212 return UNITS_PER_WORD;
5214 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
5216 if ((slotno + GET_MODE_SIZE (mode) / UNITS_PER_WORD)
5217 > SPARC_FP_ARG_MAX)
5218 return UNITS_PER_WORD;
5222 return 0;
5225 /* Handle the TARGET_PASS_BY_REFERENCE target hook.
5226 Specify whether to pass the argument by reference. */
5228 static bool
5229 sparc_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
5230 enum machine_mode mode, tree type,
5231 bool named ATTRIBUTE_UNUSED)
5233 if (TARGET_ARCH32)
5235 /* Original SPARC 32-bit ABI says that structures and unions,
5236 and quad-precision floats are passed by reference. For Pascal,
5237 also pass arrays by reference. All other base types are passed
5238 in registers.
5240 Extended ABI (as implemented by the Sun compiler) says that all
5241 complex floats are passed by reference. Pass complex integers
5242 in registers up to 8 bytes. More generally, enforce the 2-word
5243 cap for passing arguments in registers.
5245 Vector ABI (as implemented by the Sun VIS SDK) says that vector
5246 integers are passed like floats of the same size, that is in
5247 registers up to 8 bytes. Pass all vector floats by reference
5248 like structure and unions. */
5249 return ((type && (AGGREGATE_TYPE_P (type) || VECTOR_FLOAT_TYPE_P (type)))
5250 || mode == SCmode
5251 /* Catch CDImode, TFmode, DCmode and TCmode. */
5252 || GET_MODE_SIZE (mode) > 8
5253 || (type
5254 && TREE_CODE (type) == VECTOR_TYPE
5255 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8));
5257 else
5259 /* Original SPARC 64-bit ABI says that structures and unions
5260 smaller than 16 bytes are passed in registers, as well as
5261 all other base types. For Pascal, pass arrays by reference.
5263 Extended ABI (as implemented by the Sun compiler) says that
5264 complex floats are passed in registers up to 16 bytes. Pass
5265 all complex integers in registers up to 16 bytes. More generally,
5266 enforce the 2-word cap for passing arguments in registers.
5268 Vector ABI (as implemented by the Sun VIS SDK) says that vector
5269 integers are passed like floats of the same size, that is in
5270 registers (up to 16 bytes). Pass all vector floats like structure
5271 and unions. */
5272 return ((type && TREE_CODE (type) == ARRAY_TYPE)
5273 || (type
5274 && (AGGREGATE_TYPE_P (type) || TREE_CODE (type) == VECTOR_TYPE)
5275 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 16)
5276 /* Catch CTImode and TCmode. */
5277 || GET_MODE_SIZE (mode) > 16);
5281 /* Handle the FUNCTION_ARG_ADVANCE macro.
5282 Update the data in CUM to advance over an argument
5283 of mode MODE and data type TYPE.
5284 TYPE is null for libcalls where that information may not be available. */
5286 void
5287 function_arg_advance (struct sparc_args *cum, enum machine_mode mode,
5288 tree type, int named)
5290 int slotno, regno, padding;
5292 /* We pass 0 for incoming_p here, it doesn't matter. */
5293 slotno = function_arg_slotno (cum, mode, type, named, 0, &regno, &padding);
5295 /* If register required leading padding, add it. */
5296 if (slotno != -1)
5297 cum->words += padding;
5299 if (TARGET_ARCH32)
5301 cum->words += (mode != BLKmode
5302 ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
5303 : ROUND_ADVANCE (int_size_in_bytes (type)));
5305 else
5307 if (type && AGGREGATE_TYPE_P (type))
5309 int size = int_size_in_bytes (type);
5311 if (size <= 8)
5312 ++cum->words;
5313 else if (size <= 16)
5314 cum->words += 2;
5315 else /* passed by reference */
5316 ++cum->words;
5318 else
5320 cum->words += (mode != BLKmode
5321 ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
5322 : ROUND_ADVANCE (int_size_in_bytes (type)));
5327 /* Handle the FUNCTION_ARG_PADDING macro.
5328 For the 64 bit ABI structs are always stored left shifted in their
5329 argument slot. */
5331 enum direction
5332 function_arg_padding (enum machine_mode mode, tree type)
5334 if (TARGET_ARCH64 && type != 0 && AGGREGATE_TYPE_P (type))
5335 return upward;
5337 /* Fall back to the default. */
5338 return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
5341 /* Handle the TARGET_RETURN_IN_MEMORY target hook.
5342 Specify whether to return the return value in memory. */
5344 static bool
5345 sparc_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
5347 if (TARGET_ARCH32)
5348 /* Original SPARC 32-bit ABI says that structures and unions,
5349 and quad-precision floats are returned in memory. All other
5350 base types are returned in registers.
5352 Extended ABI (as implemented by the Sun compiler) says that
5353 all complex floats are returned in registers (8 FP registers
5354 at most for '_Complex long double'). Return all complex integers
5355 in registers (4 at most for '_Complex long long').
5357 Vector ABI (as implemented by the Sun VIS SDK) says that vector
5358 integers are returned like floats of the same size, that is in
5359 registers up to 8 bytes and in memory otherwise. Return all
5360 vector floats in memory like structure and unions; note that
5361 they always have BLKmode like the latter. */
5362 return (TYPE_MODE (type) == BLKmode
5363 || TYPE_MODE (type) == TFmode
5364 || (TREE_CODE (type) == VECTOR_TYPE
5365 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8));
5366 else
5367 /* Original SPARC 64-bit ABI says that structures and unions
5368 smaller than 32 bytes are returned in registers, as well as
5369 all other base types.
5371 Extended ABI (as implemented by the Sun compiler) says that all
5372 complex floats are returned in registers (8 FP registers at most
5373 for '_Complex long double'). Return all complex integers in
5374 registers (4 at most for '_Complex TItype').
5376 Vector ABI (as implemented by the Sun VIS SDK) says that vector
5377 integers are returned like floats of the same size, that is in
5378 registers. Return all vector floats like structure and unions;
5379 note that they always have BLKmode like the latter. */
5380 return ((TYPE_MODE (type) == BLKmode
5381 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 32));
5384 /* Handle the TARGET_STRUCT_VALUE target hook.
5385 Return where to find the structure return value address. */
5387 static rtx
5388 sparc_struct_value_rtx (tree fndecl ATTRIBUTE_UNUSED, int incoming)
5390 if (TARGET_ARCH64)
5391 return 0;
5392 else
5394 rtx mem;
5396 if (incoming)
5397 mem = gen_rtx_MEM (Pmode, plus_constant (frame_pointer_rtx,
5398 STRUCT_VALUE_OFFSET));
5399 else
5400 mem = gen_rtx_MEM (Pmode, plus_constant (stack_pointer_rtx,
5401 STRUCT_VALUE_OFFSET));
5403 set_mem_alias_set (mem, struct_value_alias_set);
5404 return mem;
5408 /* Handle FUNCTION_VALUE, FUNCTION_OUTGOING_VALUE, and LIBCALL_VALUE macros.
5409 For v9, function return values are subject to the same rules as arguments,
5410 except that up to 32 bytes may be returned in registers. */
5413 function_value (tree type, enum machine_mode mode, int incoming_p)
5415 /* Beware that the two values are swapped here wrt function_arg. */
5416 int regbase = (incoming_p
5417 ? SPARC_OUTGOING_INT_ARG_FIRST
5418 : SPARC_INCOMING_INT_ARG_FIRST);
5419 enum mode_class mclass = GET_MODE_CLASS (mode);
5420 int regno;
5422 if (type && TREE_CODE (type) == VECTOR_TYPE)
5424 /* Vector types deserve special treatment because they are
5425 polymorphic wrt their mode, depending upon whether VIS
5426 instructions are enabled. */
5427 HOST_WIDE_INT size = int_size_in_bytes (type);
5429 gcc_assert ((TARGET_ARCH32 && size <= 8)
5430 || (TARGET_ARCH64 && size <= 32));
5432 if (mode == BLKmode)
5433 return function_arg_vector_value (size,
5434 TYPE_MODE (TREE_TYPE (type)),
5435 SPARC_FP_ARG_FIRST);
5436 else
5437 mclass = MODE_FLOAT;
5439 else if (type && TARGET_ARCH64)
5441 if (TREE_CODE (type) == RECORD_TYPE)
5443 /* Structures up to 32 bytes in size are passed in registers,
5444 promoted to fp registers where possible. */
5446 gcc_assert (int_size_in_bytes (type) <= 32);
5448 return function_arg_record_value (type, mode, 0, 1, regbase);
5450 else if (TREE_CODE (type) == UNION_TYPE)
5452 HOST_WIDE_INT size = int_size_in_bytes (type);
5454 gcc_assert (size <= 32);
5456 return function_arg_union_value (size, mode, 0, regbase);
5458 else if (AGGREGATE_TYPE_P (type))
5460 /* All other aggregate types are passed in an integer register
5461 in a mode corresponding to the size of the type. */
5462 HOST_WIDE_INT bytes = int_size_in_bytes (type);
5464 gcc_assert (bytes <= 32);
5466 mode = mode_for_size (bytes * BITS_PER_UNIT, MODE_INT, 0);
5468 /* ??? We probably should have made the same ABI change in
5469 3.4.0 as the one we made for unions. The latter was
5470 required by the SCD though, while the former is not
5471 specified, so we favored compatibility and efficiency.
5473 Now we're stuck for aggregates larger than 16 bytes,
5474 because OImode vanished in the meantime. Let's not
5475 try to be unduly clever, and simply follow the ABI
5476 for unions in that case. */
5477 if (mode == BLKmode)
5478 return function_arg_union_value (bytes, mode, 0, regbase);
5479 else
5480 mclass = MODE_INT;
5482 else if (mclass == MODE_INT
5483 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
5484 mode = word_mode;
5487 if ((mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
5488 && TARGET_FPU)
5489 regno = SPARC_FP_ARG_FIRST;
5490 else
5491 regno = regbase;
5493 return gen_rtx_REG (mode, regno);
5496 /* Do what is necessary for `va_start'. We look at the current function
5497 to determine if stdarg or varargs is used and return the address of
5498 the first unnamed parameter. */
5500 static rtx
5501 sparc_builtin_saveregs (void)
5503 int first_reg = current_function_args_info.words;
5504 rtx address;
5505 int regno;
5507 for (regno = first_reg; regno < SPARC_INT_ARG_MAX; regno++)
5508 emit_move_insn (gen_rtx_MEM (word_mode,
5509 gen_rtx_PLUS (Pmode,
5510 frame_pointer_rtx,
5511 GEN_INT (FIRST_PARM_OFFSET (0)
5512 + (UNITS_PER_WORD
5513 * regno)))),
5514 gen_rtx_REG (word_mode,
5515 SPARC_INCOMING_INT_ARG_FIRST + regno));
5517 address = gen_rtx_PLUS (Pmode,
5518 frame_pointer_rtx,
5519 GEN_INT (FIRST_PARM_OFFSET (0)
5520 + UNITS_PER_WORD * first_reg));
5522 return address;
5525 /* Implement `va_start' for stdarg. */
5527 void
5528 sparc_va_start (tree valist, rtx nextarg)
5530 nextarg = expand_builtin_saveregs ();
5531 std_expand_builtin_va_start (valist, nextarg);
5534 /* Implement `va_arg' for stdarg. */
5536 static tree
5537 sparc_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p)
5539 HOST_WIDE_INT size, rsize, align;
5540 tree addr, incr;
5541 bool indirect;
5542 tree ptrtype = build_pointer_type (type);
5544 if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
5546 indirect = true;
5547 size = rsize = UNITS_PER_WORD;
5548 align = 0;
5550 else
5552 indirect = false;
5553 size = int_size_in_bytes (type);
5554 rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
5555 align = 0;
5557 if (TARGET_ARCH64)
5559 /* For SPARC64, objects requiring 16-byte alignment get it. */
5560 if (TYPE_ALIGN (type) >= 2 * (unsigned) BITS_PER_WORD)
5561 align = 2 * UNITS_PER_WORD;
5563 /* SPARC-V9 ABI states that structures up to 16 bytes in size
5564 are left-justified in their slots. */
5565 if (AGGREGATE_TYPE_P (type))
5567 if (size == 0)
5568 size = rsize = UNITS_PER_WORD;
5569 else
5570 size = rsize;
5575 incr = valist;
5576 if (align)
5578 incr = fold (build2 (PLUS_EXPR, ptr_type_node, incr,
5579 ssize_int (align - 1)));
5580 incr = fold (build2 (BIT_AND_EXPR, ptr_type_node, incr,
5581 ssize_int (-align)));
5584 gimplify_expr (&incr, pre_p, post_p, is_gimple_val, fb_rvalue);
5585 addr = incr;
5587 if (BYTES_BIG_ENDIAN && size < rsize)
5588 addr = fold (build2 (PLUS_EXPR, ptr_type_node, incr,
5589 ssize_int (rsize - size)));
5591 if (indirect)
5593 addr = fold_convert (build_pointer_type (ptrtype), addr);
5594 addr = build_va_arg_indirect_ref (addr);
5596 /* If the address isn't aligned properly for the type,
5597 we may need to copy to a temporary.
5598 FIXME: This is inefficient. Usually we can do this
5599 in registers. */
5600 else if (align == 0
5601 && TYPE_ALIGN (type) > BITS_PER_WORD)
5603 tree tmp = create_tmp_var (type, "va_arg_tmp");
5604 tree dest_addr = build_fold_addr_expr (tmp);
5606 tree copy = build_function_call_expr
5607 (implicit_built_in_decls[BUILT_IN_MEMCPY],
5608 tree_cons (NULL_TREE, dest_addr,
5609 tree_cons (NULL_TREE, addr,
5610 tree_cons (NULL_TREE, size_int (rsize),
5611 NULL_TREE))));
5613 gimplify_and_add (copy, pre_p);
5614 addr = dest_addr;
5616 else
5617 addr = fold_convert (ptrtype, addr);
5619 incr = fold (build2 (PLUS_EXPR, ptr_type_node, incr, ssize_int (rsize)));
5620 incr = build2 (MODIFY_EXPR, ptr_type_node, valist, incr);
5621 gimplify_and_add (incr, post_p);
5623 return build_va_arg_indirect_ref (addr);
5626 /* Implement the TARGET_VECTOR_MODE_SUPPORTED_P target hook.
5627 Specify whether the vector mode is supported by the hardware. */
5629 static bool
5630 sparc_vector_mode_supported_p (enum machine_mode mode)
5632 return TARGET_VIS && VECTOR_MODE_P (mode) ? true : false;
5635 /* Return the string to output an unconditional branch to LABEL, which is
5636 the operand number of the label.
5638 DEST is the destination insn (i.e. the label), INSN is the source. */
5640 const char *
5641 output_ubranch (rtx dest, int label, rtx insn)
5643 static char string[64];
5644 bool v9_form = false;
5645 char *p;
5647 if (TARGET_V9 && INSN_ADDRESSES_SET_P ())
5649 int delta = (INSN_ADDRESSES (INSN_UID (dest))
5650 - INSN_ADDRESSES (INSN_UID (insn)));
5651 /* Leave some instructions for "slop". */
5652 if (delta >= -260000 && delta < 260000)
5653 v9_form = true;
5656 if (v9_form)
5657 strcpy (string, "ba%*,pt\t%%xcc, ");
5658 else
5659 strcpy (string, "b%*\t");
5661 p = strchr (string, '\0');
5662 *p++ = '%';
5663 *p++ = 'l';
5664 *p++ = '0' + label;
5665 *p++ = '%';
5666 *p++ = '(';
5667 *p = '\0';
5669 return string;
5672 /* Return the string to output a conditional branch to LABEL, which is
5673 the operand number of the label. OP is the conditional expression.
5674 XEXP (OP, 0) is assumed to be a condition code register (integer or
5675 floating point) and its mode specifies what kind of comparison we made.
5677 DEST is the destination insn (i.e. the label), INSN is the source.
5679 REVERSED is nonzero if we should reverse the sense of the comparison.
5681 ANNUL is nonzero if we should generate an annulling branch. */
5683 const char *
5684 output_cbranch (rtx op, rtx dest, int label, int reversed, int annul,
5685 rtx insn)
5687 static char string[64];
5688 enum rtx_code code = GET_CODE (op);
5689 rtx cc_reg = XEXP (op, 0);
5690 enum machine_mode mode = GET_MODE (cc_reg);
5691 const char *labelno, *branch;
5692 int spaces = 8, far;
5693 char *p;
5695 /* v9 branches are limited to +-1MB. If it is too far away,
5696 change
5698 bne,pt %xcc, .LC30
5702 be,pn %xcc, .+12
5704 ba .LC30
5708 fbne,a,pn %fcc2, .LC29
5712 fbe,pt %fcc2, .+16
5714 ba .LC29 */
5716 far = TARGET_V9 && (get_attr_length (insn) >= 3);
5717 if (reversed ^ far)
5719 /* Reversal of FP compares takes care -- an ordered compare
5720 becomes an unordered compare and vice versa. */
5721 if (mode == CCFPmode || mode == CCFPEmode)
5722 code = reverse_condition_maybe_unordered (code);
5723 else
5724 code = reverse_condition (code);
5727 /* Start by writing the branch condition. */
5728 if (mode == CCFPmode || mode == CCFPEmode)
5730 switch (code)
5732 case NE:
5733 branch = "fbne";
5734 break;
5735 case EQ:
5736 branch = "fbe";
5737 break;
5738 case GE:
5739 branch = "fbge";
5740 break;
5741 case GT:
5742 branch = "fbg";
5743 break;
5744 case LE:
5745 branch = "fble";
5746 break;
5747 case LT:
5748 branch = "fbl";
5749 break;
5750 case UNORDERED:
5751 branch = "fbu";
5752 break;
5753 case ORDERED:
5754 branch = "fbo";
5755 break;
5756 case UNGT:
5757 branch = "fbug";
5758 break;
5759 case UNLT:
5760 branch = "fbul";
5761 break;
5762 case UNEQ:
5763 branch = "fbue";
5764 break;
5765 case UNGE:
5766 branch = "fbuge";
5767 break;
5768 case UNLE:
5769 branch = "fbule";
5770 break;
5771 case LTGT:
5772 branch = "fblg";
5773 break;
5775 default:
5776 gcc_unreachable ();
5779 /* ??? !v9: FP branches cannot be preceded by another floating point
5780 insn. Because there is currently no concept of pre-delay slots,
5781 we can fix this only by always emitting a nop before a floating
5782 point branch. */
5784 string[0] = '\0';
5785 if (! TARGET_V9)
5786 strcpy (string, "nop\n\t");
5787 strcat (string, branch);
5789 else
5791 switch (code)
5793 case NE:
5794 branch = "bne";
5795 break;
5796 case EQ:
5797 branch = "be";
5798 break;
5799 case GE:
5800 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
5801 branch = "bpos";
5802 else
5803 branch = "bge";
5804 break;
5805 case GT:
5806 branch = "bg";
5807 break;
5808 case LE:
5809 branch = "ble";
5810 break;
5811 case LT:
5812 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
5813 branch = "bneg";
5814 else
5815 branch = "bl";
5816 break;
5817 case GEU:
5818 branch = "bgeu";
5819 break;
5820 case GTU:
5821 branch = "bgu";
5822 break;
5823 case LEU:
5824 branch = "bleu";
5825 break;
5826 case LTU:
5827 branch = "blu";
5828 break;
5830 default:
5831 gcc_unreachable ();
5833 strcpy (string, branch);
5835 spaces -= strlen (branch);
5836 p = strchr (string, '\0');
5838 /* Now add the annulling, the label, and a possible noop. */
5839 if (annul && ! far)
5841 strcpy (p, ",a");
5842 p += 2;
5843 spaces -= 2;
5846 if (TARGET_V9)
5848 rtx note;
5849 int v8 = 0;
5851 if (! far && insn && INSN_ADDRESSES_SET_P ())
5853 int delta = (INSN_ADDRESSES (INSN_UID (dest))
5854 - INSN_ADDRESSES (INSN_UID (insn)));
5855 /* Leave some instructions for "slop". */
5856 if (delta < -260000 || delta >= 260000)
5857 v8 = 1;
5860 if (mode == CCFPmode || mode == CCFPEmode)
5862 static char v9_fcc_labelno[] = "%%fccX, ";
5863 /* Set the char indicating the number of the fcc reg to use. */
5864 v9_fcc_labelno[5] = REGNO (cc_reg) - SPARC_FIRST_V9_FCC_REG + '0';
5865 labelno = v9_fcc_labelno;
5866 if (v8)
5868 gcc_assert (REGNO (cc_reg) == SPARC_FCC_REG);
5869 labelno = "";
5872 else if (mode == CCXmode || mode == CCX_NOOVmode)
5874 labelno = "%%xcc, ";
5875 gcc_assert (! v8);
5877 else
5879 labelno = "%%icc, ";
5880 if (v8)
5881 labelno = "";
5884 if (*labelno && insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
5886 strcpy (p,
5887 ((INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ^ far)
5888 ? ",pt" : ",pn");
5889 p += 3;
5890 spaces -= 3;
5893 else
5894 labelno = "";
5896 if (spaces > 0)
5897 *p++ = '\t';
5898 else
5899 *p++ = ' ';
5900 strcpy (p, labelno);
5901 p = strchr (p, '\0');
5902 if (far)
5904 strcpy (p, ".+12\n\t nop\n\tb\t");
5905 /* Skip the next insn if requested or
5906 if we know that it will be a nop. */
5907 if (annul || ! final_sequence)
5908 p[3] = '6';
5909 p += 14;
5911 *p++ = '%';
5912 *p++ = 'l';
5913 *p++ = label + '0';
5914 *p++ = '%';
5915 *p++ = '#';
5916 *p = '\0';
5918 return string;
5921 /* Emit a library call comparison between floating point X and Y.
5922 COMPARISON is the rtl operator to compare with (EQ, NE, GT, etc.).
5923 TARGET_ARCH64 uses _Qp_* functions, which use pointers to TFmode
5924 values as arguments instead of the TFmode registers themselves,
5925 that's why we cannot call emit_float_lib_cmp. */
5926 void
5927 sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
5929 const char *qpfunc;
5930 rtx slot0, slot1, result, tem, tem2;
5931 enum machine_mode mode;
5933 switch (comparison)
5935 case EQ:
5936 qpfunc = (TARGET_ARCH64) ? "_Qp_feq" : "_Q_feq";
5937 break;
5939 case NE:
5940 qpfunc = (TARGET_ARCH64) ? "_Qp_fne" : "_Q_fne";
5941 break;
5943 case GT:
5944 qpfunc = (TARGET_ARCH64) ? "_Qp_fgt" : "_Q_fgt";
5945 break;
5947 case GE:
5948 qpfunc = (TARGET_ARCH64) ? "_Qp_fge" : "_Q_fge";
5949 break;
5951 case LT:
5952 qpfunc = (TARGET_ARCH64) ? "_Qp_flt" : "_Q_flt";
5953 break;
5955 case LE:
5956 qpfunc = (TARGET_ARCH64) ? "_Qp_fle" : "_Q_fle";
5957 break;
5959 case ORDERED:
5960 case UNORDERED:
5961 case UNGT:
5962 case UNLT:
5963 case UNEQ:
5964 case UNGE:
5965 case UNLE:
5966 case LTGT:
5967 qpfunc = (TARGET_ARCH64) ? "_Qp_cmp" : "_Q_cmp";
5968 break;
5970 default:
5971 gcc_unreachable ();
5974 if (TARGET_ARCH64)
5976 if (GET_CODE (x) != MEM)
5978 slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
5979 emit_move_insn (slot0, x);
5981 else
5982 slot0 = x;
5984 if (GET_CODE (y) != MEM)
5986 slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
5987 emit_move_insn (slot1, y);
5989 else
5990 slot1 = y;
5992 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), LCT_NORMAL,
5993 DImode, 2,
5994 XEXP (slot0, 0), Pmode,
5995 XEXP (slot1, 0), Pmode);
5997 mode = DImode;
5999 else
6001 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, qpfunc), LCT_NORMAL,
6002 SImode, 2,
6003 x, TFmode, y, TFmode);
6005 mode = SImode;
6009 /* Immediately move the result of the libcall into a pseudo
6010 register so reload doesn't clobber the value if it needs
6011 the return register for a spill reg. */
6012 result = gen_reg_rtx (mode);
6013 emit_move_insn (result, hard_libcall_value (mode));
6015 switch (comparison)
6017 default:
6018 emit_cmp_insn (result, const0_rtx, NE, NULL_RTX, mode, 0);
6019 break;
6020 case ORDERED:
6021 case UNORDERED:
6022 emit_cmp_insn (result, GEN_INT(3), comparison == UNORDERED ? EQ : NE,
6023 NULL_RTX, mode, 0);
6024 break;
6025 case UNGT:
6026 case UNGE:
6027 emit_cmp_insn (result, const1_rtx,
6028 comparison == UNGT ? GT : NE, NULL_RTX, mode, 0);
6029 break;
6030 case UNLE:
6031 emit_cmp_insn (result, const2_rtx, NE, NULL_RTX, mode, 0);
6032 break;
6033 case UNLT:
6034 tem = gen_reg_rtx (mode);
6035 if (TARGET_ARCH32)
6036 emit_insn (gen_andsi3 (tem, result, const1_rtx));
6037 else
6038 emit_insn (gen_anddi3 (tem, result, const1_rtx));
6039 emit_cmp_insn (tem, const0_rtx, NE, NULL_RTX, mode, 0);
6040 break;
6041 case UNEQ:
6042 case LTGT:
6043 tem = gen_reg_rtx (mode);
6044 if (TARGET_ARCH32)
6045 emit_insn (gen_addsi3 (tem, result, const1_rtx));
6046 else
6047 emit_insn (gen_adddi3 (tem, result, const1_rtx));
6048 tem2 = gen_reg_rtx (mode);
6049 if (TARGET_ARCH32)
6050 emit_insn (gen_andsi3 (tem2, tem, const2_rtx));
6051 else
6052 emit_insn (gen_anddi3 (tem2, tem, const2_rtx));
6053 emit_cmp_insn (tem2, const0_rtx, comparison == UNEQ ? EQ : NE,
6054 NULL_RTX, mode, 0);
6055 break;
6059 /* Generate an unsigned DImode to FP conversion. This is the same code
6060 optabs would emit if we didn't have TFmode patterns. */
6062 void
6063 sparc_emit_floatunsdi (rtx *operands, enum machine_mode mode)
6065 rtx neglab, donelab, i0, i1, f0, in, out;
6067 out = operands[0];
6068 in = force_reg (DImode, operands[1]);
6069 neglab = gen_label_rtx ();
6070 donelab = gen_label_rtx ();
6071 i0 = gen_reg_rtx (DImode);
6072 i1 = gen_reg_rtx (DImode);
6073 f0 = gen_reg_rtx (mode);
6075 emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, DImode, 0, neglab);
6077 emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_FLOAT (mode, in)));
6078 emit_jump_insn (gen_jump (donelab));
6079 emit_barrier ();
6081 emit_label (neglab);
6083 emit_insn (gen_lshrdi3 (i0, in, const1_rtx));
6084 emit_insn (gen_anddi3 (i1, in, const1_rtx));
6085 emit_insn (gen_iordi3 (i0, i0, i1));
6086 emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_FLOAT (mode, i0)));
6087 emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
6089 emit_label (donelab);
6092 /* Generate an FP to unsigned DImode conversion. This is the same code
6093 optabs would emit if we didn't have TFmode patterns. */
6095 void
6096 sparc_emit_fixunsdi (rtx *operands, enum machine_mode mode)
6098 rtx neglab, donelab, i0, i1, f0, in, out, limit;
6100 out = operands[0];
6101 in = force_reg (mode, operands[1]);
6102 neglab = gen_label_rtx ();
6103 donelab = gen_label_rtx ();
6104 i0 = gen_reg_rtx (DImode);
6105 i1 = gen_reg_rtx (DImode);
6106 limit = gen_reg_rtx (mode);
6107 f0 = gen_reg_rtx (mode);
6109 emit_move_insn (limit,
6110 CONST_DOUBLE_FROM_REAL_VALUE (
6111 REAL_VALUE_ATOF ("9223372036854775808.0", mode), mode));
6112 emit_cmp_and_jump_insns (in, limit, GE, NULL_RTX, mode, 0, neglab);
6114 emit_insn (gen_rtx_SET (VOIDmode,
6115 out,
6116 gen_rtx_FIX (DImode, gen_rtx_FIX (mode, in))));
6117 emit_jump_insn (gen_jump (donelab));
6118 emit_barrier ();
6120 emit_label (neglab);
6122 emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_MINUS (mode, in, limit)));
6123 emit_insn (gen_rtx_SET (VOIDmode,
6125 gen_rtx_FIX (DImode, gen_rtx_FIX (mode, f0))));
6126 emit_insn (gen_movdi (i1, const1_rtx));
6127 emit_insn (gen_ashldi3 (i1, i1, GEN_INT (63)));
6128 emit_insn (gen_xordi3 (out, i0, i1));
6130 emit_label (donelab);
6133 /* Return the string to output a conditional branch to LABEL, testing
6134 register REG. LABEL is the operand number of the label; REG is the
6135 operand number of the reg. OP is the conditional expression. The mode
6136 of REG says what kind of comparison we made.
6138 DEST is the destination insn (i.e. the label), INSN is the source.
6140 REVERSED is nonzero if we should reverse the sense of the comparison.
6142 ANNUL is nonzero if we should generate an annulling branch. */
6144 const char *
6145 output_v9branch (rtx op, rtx dest, int reg, int label, int reversed,
6146 int annul, rtx insn)
6148 static char string[64];
6149 enum rtx_code code = GET_CODE (op);
6150 enum machine_mode mode = GET_MODE (XEXP (op, 0));
6151 rtx note;
6152 int far;
6153 char *p;
6155 /* branch on register are limited to +-128KB. If it is too far away,
6156 change
6158 brnz,pt %g1, .LC30
6162 brz,pn %g1, .+12
6164 ba,pt %xcc, .LC30
6168 brgez,a,pn %o1, .LC29
6172 brlz,pt %o1, .+16
6174 ba,pt %xcc, .LC29 */
6176 far = get_attr_length (insn) >= 3;
6178 /* If not floating-point or if EQ or NE, we can just reverse the code. */
6179 if (reversed ^ far)
6180 code = reverse_condition (code);
6182 /* Only 64 bit versions of these instructions exist. */
6183 gcc_assert (mode == DImode);
6185 /* Start by writing the branch condition. */
6187 switch (code)
6189 case NE:
6190 strcpy (string, "brnz");
6191 break;
6193 case EQ:
6194 strcpy (string, "brz");
6195 break;
6197 case GE:
6198 strcpy (string, "brgez");
6199 break;
6201 case LT:
6202 strcpy (string, "brlz");
6203 break;
6205 case LE:
6206 strcpy (string, "brlez");
6207 break;
6209 case GT:
6210 strcpy (string, "brgz");
6211 break;
6213 default:
6214 gcc_unreachable ();
6217 p = strchr (string, '\0');
6219 /* Now add the annulling, reg, label, and nop. */
6220 if (annul && ! far)
6222 strcpy (p, ",a");
6223 p += 2;
6226 if (insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
6228 strcpy (p,
6229 ((INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ^ far)
6230 ? ",pt" : ",pn");
6231 p += 3;
6234 *p = p < string + 8 ? '\t' : ' ';
6235 p++;
6236 *p++ = '%';
6237 *p++ = '0' + reg;
6238 *p++ = ',';
6239 *p++ = ' ';
6240 if (far)
6242 int veryfar = 1, delta;
6244 if (INSN_ADDRESSES_SET_P ())
6246 delta = (INSN_ADDRESSES (INSN_UID (dest))
6247 - INSN_ADDRESSES (INSN_UID (insn)));
6248 /* Leave some instructions for "slop". */
6249 if (delta >= -260000 && delta < 260000)
6250 veryfar = 0;
6253 strcpy (p, ".+12\n\t nop\n\t");
6254 /* Skip the next insn if requested or
6255 if we know that it will be a nop. */
6256 if (annul || ! final_sequence)
6257 p[3] = '6';
6258 p += 12;
6259 if (veryfar)
6261 strcpy (p, "b\t");
6262 p += 2;
6264 else
6266 strcpy (p, "ba,pt\t%%xcc, ");
6267 p += 13;
6270 *p++ = '%';
6271 *p++ = 'l';
6272 *p++ = '0' + label;
6273 *p++ = '%';
6274 *p++ = '#';
6275 *p = '\0';
6277 return string;
6280 /* Return 1, if any of the registers of the instruction are %l[0-7] or %o[0-7].
6281 Such instructions cannot be used in the delay slot of return insn on v9.
6282 If TEST is 0, also rename all %i[0-7] registers to their %o[0-7] counterparts.
6285 static int
6286 epilogue_renumber (register rtx *where, int test)
6288 register const char *fmt;
6289 register int i;
6290 register enum rtx_code code;
6292 if (*where == 0)
6293 return 0;
6295 code = GET_CODE (*where);
6297 switch (code)
6299 case REG:
6300 if (REGNO (*where) >= 8 && REGNO (*where) < 24) /* oX or lX */
6301 return 1;
6302 if (! test && REGNO (*where) >= 24 && REGNO (*where) < 32)
6303 *where = gen_rtx_REG (GET_MODE (*where), OUTGOING_REGNO (REGNO(*where)));
6304 case SCRATCH:
6305 case CC0:
6306 case PC:
6307 case CONST_INT:
6308 case CONST_DOUBLE:
6309 return 0;
6311 /* Do not replace the frame pointer with the stack pointer because
6312 it can cause the delayed instruction to load below the stack.
6313 This occurs when instructions like:
6315 (set (reg/i:SI 24 %i0)
6316 (mem/f:SI (plus:SI (reg/f:SI 30 %fp)
6317 (const_int -20 [0xffffffec])) 0))
6319 are in the return delayed slot. */
6320 case PLUS:
6321 if (GET_CODE (XEXP (*where, 0)) == REG
6322 && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM
6323 && (GET_CODE (XEXP (*where, 1)) != CONST_INT
6324 || INTVAL (XEXP (*where, 1)) < SPARC_STACK_BIAS))
6325 return 1;
6326 break;
6328 case MEM:
6329 if (SPARC_STACK_BIAS
6330 && GET_CODE (XEXP (*where, 0)) == REG
6331 && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM)
6332 return 1;
6333 break;
6335 default:
6336 break;
6339 fmt = GET_RTX_FORMAT (code);
6341 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
6343 if (fmt[i] == 'E')
6345 register int j;
6346 for (j = XVECLEN (*where, i) - 1; j >= 0; j--)
6347 if (epilogue_renumber (&(XVECEXP (*where, i, j)), test))
6348 return 1;
6350 else if (fmt[i] == 'e'
6351 && epilogue_renumber (&(XEXP (*where, i)), test))
6352 return 1;
6354 return 0;
6357 /* Leaf functions and non-leaf functions have different needs. */
6359 static const int
6360 reg_leaf_alloc_order[] = REG_LEAF_ALLOC_ORDER;
6362 static const int
6363 reg_nonleaf_alloc_order[] = REG_ALLOC_ORDER;
6365 static const int *const reg_alloc_orders[] = {
6366 reg_leaf_alloc_order,
6367 reg_nonleaf_alloc_order};
6369 void
6370 order_regs_for_local_alloc (void)
6372 static int last_order_nonleaf = 1;
6374 if (regs_ever_live[15] != last_order_nonleaf)
6376 last_order_nonleaf = !last_order_nonleaf;
6377 memcpy ((char *) reg_alloc_order,
6378 (const char *) reg_alloc_orders[last_order_nonleaf],
6379 FIRST_PSEUDO_REGISTER * sizeof (int));
6383 /* Return 1 if REG and MEM are legitimate enough to allow the various
6384 mem<-->reg splits to be run. */
6387 sparc_splitdi_legitimate (rtx reg, rtx mem)
6389 /* Punt if we are here by mistake. */
6390 gcc_assert (reload_completed);
6392 /* We must have an offsettable memory reference. */
6393 if (! offsettable_memref_p (mem))
6394 return 0;
6396 /* If we have legitimate args for ldd/std, we do not want
6397 the split to happen. */
6398 if ((REGNO (reg) % 2) == 0
6399 && mem_min_alignment (mem, 8))
6400 return 0;
6402 /* Success. */
6403 return 1;
6406 /* Return 1 if x and y are some kind of REG and they refer to
6407 different hard registers. This test is guaranteed to be
6408 run after reload. */
6411 sparc_absnegfloat_split_legitimate (rtx x, rtx y)
6413 if (GET_CODE (x) != REG)
6414 return 0;
6415 if (GET_CODE (y) != REG)
6416 return 0;
6417 if (REGNO (x) == REGNO (y))
6418 return 0;
6419 return 1;
6422 /* Return 1 if REGNO (reg1) is even and REGNO (reg1) == REGNO (reg2) - 1.
6423 This makes them candidates for using ldd and std insns.
6425 Note reg1 and reg2 *must* be hard registers. */
6428 registers_ok_for_ldd_peep (rtx reg1, rtx reg2)
6430 /* We might have been passed a SUBREG. */
6431 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
6432 return 0;
6434 if (REGNO (reg1) % 2 != 0)
6435 return 0;
6437 /* Integer ldd is deprecated in SPARC V9 */
6438 if (TARGET_V9 && REGNO (reg1) < 32)
6439 return 0;
6441 return (REGNO (reg1) == REGNO (reg2) - 1);
6444 /* Return 1 if the addresses in mem1 and mem2 are suitable for use in
6445 an ldd or std insn.
6447 This can only happen when addr1 and addr2, the addresses in mem1
6448 and mem2, are consecutive memory locations (addr1 + 4 == addr2).
6449 addr1 must also be aligned on a 64-bit boundary.
6451 Also iff dependent_reg_rtx is not null it should not be used to
6452 compute the address for mem1, i.e. we cannot optimize a sequence
6453 like:
6454 ld [%o0], %o0
6455 ld [%o0 + 4], %o1
6457 ldd [%o0], %o0
6458 nor:
6459 ld [%g3 + 4], %g3
6460 ld [%g3], %g2
6462 ldd [%g3], %g2
6464 But, note that the transformation from:
6465 ld [%g2 + 4], %g3
6466 ld [%g2], %g2
6468 ldd [%g2], %g2
6469 is perfectly fine. Thus, the peephole2 patterns always pass us
6470 the destination register of the first load, never the second one.
6472 For stores we don't have a similar problem, so dependent_reg_rtx is
6473 NULL_RTX. */
6476 mems_ok_for_ldd_peep (rtx mem1, rtx mem2, rtx dependent_reg_rtx)
6478 rtx addr1, addr2;
6479 unsigned int reg1;
6480 HOST_WIDE_INT offset1;
6482 /* The mems cannot be volatile. */
6483 if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
6484 return 0;
6486 /* MEM1 should be aligned on a 64-bit boundary. */
6487 if (MEM_ALIGN (mem1) < 64)
6488 return 0;
6490 addr1 = XEXP (mem1, 0);
6491 addr2 = XEXP (mem2, 0);
6493 /* Extract a register number and offset (if used) from the first addr. */
6494 if (GET_CODE (addr1) == PLUS)
6496 /* If not a REG, return zero. */
6497 if (GET_CODE (XEXP (addr1, 0)) != REG)
6498 return 0;
6499 else
6501 reg1 = REGNO (XEXP (addr1, 0));
6502 /* The offset must be constant! */
6503 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
6504 return 0;
6505 offset1 = INTVAL (XEXP (addr1, 1));
6508 else if (GET_CODE (addr1) != REG)
6509 return 0;
6510 else
6512 reg1 = REGNO (addr1);
6513 /* This was a simple (mem (reg)) expression. Offset is 0. */
6514 offset1 = 0;
6517 /* Make sure the second address is a (mem (plus (reg) (const_int). */
6518 if (GET_CODE (addr2) != PLUS)
6519 return 0;
6521 if (GET_CODE (XEXP (addr2, 0)) != REG
6522 || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
6523 return 0;
6525 if (reg1 != REGNO (XEXP (addr2, 0)))
6526 return 0;
6528 if (dependent_reg_rtx != NULL_RTX && reg1 == REGNO (dependent_reg_rtx))
6529 return 0;
6531 /* The first offset must be evenly divisible by 8 to ensure the
6532 address is 64 bit aligned. */
6533 if (offset1 % 8 != 0)
6534 return 0;
6536 /* The offset for the second addr must be 4 more than the first addr. */
6537 if (INTVAL (XEXP (addr2, 1)) != offset1 + 4)
6538 return 0;
6540 /* All the tests passed. addr1 and addr2 are valid for ldd and std
6541 instructions. */
6542 return 1;
6545 /* Return 1 if reg is a pseudo, or is the first register in
6546 a hard register pair. This makes it a candidate for use in
6547 ldd and std insns. */
6550 register_ok_for_ldd (rtx reg)
6552 /* We might have been passed a SUBREG. */
6553 if (GET_CODE (reg) != REG)
6554 return 0;
6556 if (REGNO (reg) < FIRST_PSEUDO_REGISTER)
6557 return (REGNO (reg) % 2 == 0);
6558 else
6559 return 1;
6562 /* Print operand X (an rtx) in assembler syntax to file FILE.
6563 CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
6564 For `%' followed by punctuation, CODE is the punctuation and X is null. */
6566 void
6567 print_operand (FILE *file, rtx x, int code)
6569 switch (code)
6571 case '#':
6572 /* Output an insn in a delay slot. */
6573 if (final_sequence)
6574 sparc_indent_opcode = 1;
6575 else
6576 fputs ("\n\t nop", file);
6577 return;
6578 case '*':
6579 /* Output an annul flag if there's nothing for the delay slot and we
6580 are optimizing. This is always used with '(' below.
6581 Sun OS 4.1.1 dbx can't handle an annulled unconditional branch;
6582 this is a dbx bug. So, we only do this when optimizing.
6583 On UltraSPARC, a branch in a delay slot causes a pipeline flush.
6584 Always emit a nop in case the next instruction is a branch. */
6585 if (! final_sequence && (optimize && (int)sparc_cpu < PROCESSOR_V9))
6586 fputs (",a", file);
6587 return;
6588 case '(':
6589 /* Output a 'nop' if there's nothing for the delay slot and we are
6590 not optimizing. This is always used with '*' above. */
6591 if (! final_sequence && ! (optimize && (int)sparc_cpu < PROCESSOR_V9))
6592 fputs ("\n\t nop", file);
6593 else if (final_sequence)
6594 sparc_indent_opcode = 1;
6595 return;
6596 case ')':
6597 /* Output the right displacement from the saved PC on function return.
6598 The caller may have placed an "unimp" insn immediately after the call
6599 so we have to account for it. This insn is used in the 32-bit ABI
6600 when calling a function that returns a non zero-sized structure. The
6601 64-bit ABI doesn't have it. Be careful to have this test be the same
6602 as that used on the call. */
6603 if (! TARGET_ARCH64
6604 && current_function_returns_struct
6605 && (TREE_CODE (DECL_SIZE (DECL_RESULT (current_function_decl)))
6606 == INTEGER_CST)
6607 && ! integer_zerop (DECL_SIZE (DECL_RESULT (current_function_decl))))
6608 fputs ("12", file);
6609 else
6610 fputc ('8', file);
6611 return;
6612 case '_':
6613 /* Output the Embedded Medium/Anywhere code model base register. */
6614 fputs (EMBMEDANY_BASE_REG, file);
6615 return;
6616 case '&':
6617 /* Print some local dynamic TLS name. */
6618 assemble_name (file, get_some_local_dynamic_name ());
6619 return;
6621 case 'Y':
6622 /* Adjust the operand to take into account a RESTORE operation. */
6623 if (GET_CODE (x) == CONST_INT)
6624 break;
6625 else if (GET_CODE (x) != REG)
6626 output_operand_lossage ("invalid %%Y operand");
6627 else if (REGNO (x) < 8)
6628 fputs (reg_names[REGNO (x)], file);
6629 else if (REGNO (x) >= 24 && REGNO (x) < 32)
6630 fputs (reg_names[REGNO (x)-16], file);
6631 else
6632 output_operand_lossage ("invalid %%Y operand");
6633 return;
6634 case 'L':
6635 /* Print out the low order register name of a register pair. */
6636 if (WORDS_BIG_ENDIAN)
6637 fputs (reg_names[REGNO (x)+1], file);
6638 else
6639 fputs (reg_names[REGNO (x)], file);
6640 return;
6641 case 'H':
6642 /* Print out the high order register name of a register pair. */
6643 if (WORDS_BIG_ENDIAN)
6644 fputs (reg_names[REGNO (x)], file);
6645 else
6646 fputs (reg_names[REGNO (x)+1], file);
6647 return;
6648 case 'R':
6649 /* Print out the second register name of a register pair or quad.
6650 I.e., R (%o0) => %o1. */
6651 fputs (reg_names[REGNO (x)+1], file);
6652 return;
6653 case 'S':
6654 /* Print out the third register name of a register quad.
6655 I.e., S (%o0) => %o2. */
6656 fputs (reg_names[REGNO (x)+2], file);
6657 return;
6658 case 'T':
6659 /* Print out the fourth register name of a register quad.
6660 I.e., T (%o0) => %o3. */
6661 fputs (reg_names[REGNO (x)+3], file);
6662 return;
6663 case 'x':
6664 /* Print a condition code register. */
6665 if (REGNO (x) == SPARC_ICC_REG)
6667 /* We don't handle CC[X]_NOOVmode because they're not supposed
6668 to occur here. */
6669 if (GET_MODE (x) == CCmode)
6670 fputs ("%icc", file);
6671 else if (GET_MODE (x) == CCXmode)
6672 fputs ("%xcc", file);
6673 else
6674 gcc_unreachable ();
6676 else
6677 /* %fccN register */
6678 fputs (reg_names[REGNO (x)], file);
6679 return;
6680 case 'm':
6681 /* Print the operand's address only. */
6682 output_address (XEXP (x, 0));
6683 return;
6684 case 'r':
6685 /* In this case we need a register. Use %g0 if the
6686 operand is const0_rtx. */
6687 if (x == const0_rtx
6688 || (GET_MODE (x) != VOIDmode && x == CONST0_RTX (GET_MODE (x))))
6690 fputs ("%g0", file);
6691 return;
6693 else
6694 break;
6696 case 'A':
6697 switch (GET_CODE (x))
6699 case IOR: fputs ("or", file); break;
6700 case AND: fputs ("and", file); break;
6701 case XOR: fputs ("xor", file); break;
6702 default: output_operand_lossage ("invalid %%A operand");
6704 return;
6706 case 'B':
6707 switch (GET_CODE (x))
6709 case IOR: fputs ("orn", file); break;
6710 case AND: fputs ("andn", file); break;
6711 case XOR: fputs ("xnor", file); break;
6712 default: output_operand_lossage ("invalid %%B operand");
6714 return;
6716 /* These are used by the conditional move instructions. */
6717 case 'c' :
6718 case 'C':
6720 enum rtx_code rc = GET_CODE (x);
6722 if (code == 'c')
6724 enum machine_mode mode = GET_MODE (XEXP (x, 0));
6725 if (mode == CCFPmode || mode == CCFPEmode)
6726 rc = reverse_condition_maybe_unordered (GET_CODE (x));
6727 else
6728 rc = reverse_condition (GET_CODE (x));
6730 switch (rc)
6732 case NE: fputs ("ne", file); break;
6733 case EQ: fputs ("e", file); break;
6734 case GE: fputs ("ge", file); break;
6735 case GT: fputs ("g", file); break;
6736 case LE: fputs ("le", file); break;
6737 case LT: fputs ("l", file); break;
6738 case GEU: fputs ("geu", file); break;
6739 case GTU: fputs ("gu", file); break;
6740 case LEU: fputs ("leu", file); break;
6741 case LTU: fputs ("lu", file); break;
6742 case LTGT: fputs ("lg", file); break;
6743 case UNORDERED: fputs ("u", file); break;
6744 case ORDERED: fputs ("o", file); break;
6745 case UNLT: fputs ("ul", file); break;
6746 case UNLE: fputs ("ule", file); break;
6747 case UNGT: fputs ("ug", file); break;
6748 case UNGE: fputs ("uge", file); break;
6749 case UNEQ: fputs ("ue", file); break;
6750 default: output_operand_lossage (code == 'c'
6751 ? "invalid %%c operand"
6752 : "invalid %%C operand");
6754 return;
6757 /* These are used by the movr instruction pattern. */
6758 case 'd':
6759 case 'D':
6761 enum rtx_code rc = (code == 'd'
6762 ? reverse_condition (GET_CODE (x))
6763 : GET_CODE (x));
6764 switch (rc)
6766 case NE: fputs ("ne", file); break;
6767 case EQ: fputs ("e", file); break;
6768 case GE: fputs ("gez", file); break;
6769 case LT: fputs ("lz", file); break;
6770 case LE: fputs ("lez", file); break;
6771 case GT: fputs ("gz", file); break;
6772 default: output_operand_lossage (code == 'd'
6773 ? "invalid %%d operand"
6774 : "invalid %%D operand");
6776 return;
6779 case 'b':
6781 /* Print a sign-extended character. */
6782 int i = trunc_int_for_mode (INTVAL (x), QImode);
6783 fprintf (file, "%d", i);
6784 return;
6787 case 'f':
6788 /* Operand must be a MEM; write its address. */
6789 if (GET_CODE (x) != MEM)
6790 output_operand_lossage ("invalid %%f operand");
6791 output_address (XEXP (x, 0));
6792 return;
6794 case 's':
6796 /* Print a sign-extended 32-bit value. */
6797 HOST_WIDE_INT i;
6798 if (GET_CODE(x) == CONST_INT)
6799 i = INTVAL (x);
6800 else if (GET_CODE(x) == CONST_DOUBLE)
6801 i = CONST_DOUBLE_LOW (x);
6802 else
6804 output_operand_lossage ("invalid %%s operand");
6805 return;
6807 i = trunc_int_for_mode (i, SImode);
6808 fprintf (file, HOST_WIDE_INT_PRINT_DEC, i);
6809 return;
6812 case 0:
6813 /* Do nothing special. */
6814 break;
6816 default:
6817 /* Undocumented flag. */
6818 output_operand_lossage ("invalid operand output code");
6821 if (GET_CODE (x) == REG)
6822 fputs (reg_names[REGNO (x)], file);
6823 else if (GET_CODE (x) == MEM)
6825 fputc ('[', file);
6826 /* Poor Sun assembler doesn't understand absolute addressing. */
6827 if (CONSTANT_P (XEXP (x, 0)))
6828 fputs ("%g0+", file);
6829 output_address (XEXP (x, 0));
6830 fputc (']', file);
6832 else if (GET_CODE (x) == HIGH)
6834 fputs ("%hi(", file);
6835 output_addr_const (file, XEXP (x, 0));
6836 fputc (')', file);
6838 else if (GET_CODE (x) == LO_SUM)
6840 print_operand (file, XEXP (x, 0), 0);
6841 if (TARGET_CM_MEDMID)
6842 fputs ("+%l44(", file);
6843 else
6844 fputs ("+%lo(", file);
6845 output_addr_const (file, XEXP (x, 1));
6846 fputc (')', file);
6848 else if (GET_CODE (x) == CONST_DOUBLE
6849 && (GET_MODE (x) == VOIDmode
6850 || GET_MODE_CLASS (GET_MODE (x)) == MODE_INT))
6852 if (CONST_DOUBLE_HIGH (x) == 0)
6853 fprintf (file, "%u", (unsigned int) CONST_DOUBLE_LOW (x));
6854 else if (CONST_DOUBLE_HIGH (x) == -1
6855 && CONST_DOUBLE_LOW (x) < 0)
6856 fprintf (file, "%d", (int) CONST_DOUBLE_LOW (x));
6857 else
6858 output_operand_lossage ("long long constant not a valid immediate operand");
6860 else if (GET_CODE (x) == CONST_DOUBLE)
6861 output_operand_lossage ("floating point constant not a valid immediate operand");
6862 else { output_addr_const (file, x); }
6865 /* Target hook for assembling integer objects. The sparc version has
6866 special handling for aligned DI-mode objects. */
6868 static bool
6869 sparc_assemble_integer (rtx x, unsigned int size, int aligned_p)
6871 /* ??? We only output .xword's for symbols and only then in environments
6872 where the assembler can handle them. */
6873 if (aligned_p && size == 8
6874 && (GET_CODE (x) != CONST_INT && GET_CODE (x) != CONST_DOUBLE))
6876 if (TARGET_V9)
6878 assemble_integer_with_op ("\t.xword\t", x);
6879 return true;
6881 else
6883 assemble_aligned_integer (4, const0_rtx);
6884 assemble_aligned_integer (4, x);
6885 return true;
6888 return default_assemble_integer (x, size, aligned_p);
6891 /* Return the value of a code used in the .proc pseudo-op that says
6892 what kind of result this function returns. For non-C types, we pick
6893 the closest C type. */
6895 #ifndef SHORT_TYPE_SIZE
6896 #define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
6897 #endif
6899 #ifndef INT_TYPE_SIZE
6900 #define INT_TYPE_SIZE BITS_PER_WORD
6901 #endif
6903 #ifndef LONG_TYPE_SIZE
6904 #define LONG_TYPE_SIZE BITS_PER_WORD
6905 #endif
6907 #ifndef LONG_LONG_TYPE_SIZE
6908 #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
6909 #endif
6911 #ifndef FLOAT_TYPE_SIZE
6912 #define FLOAT_TYPE_SIZE BITS_PER_WORD
6913 #endif
6915 #ifndef DOUBLE_TYPE_SIZE
6916 #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
6917 #endif
6919 #ifndef LONG_DOUBLE_TYPE_SIZE
6920 #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
6921 #endif
6923 unsigned long
6924 sparc_type_code (register tree type)
6926 register unsigned long qualifiers = 0;
6927 register unsigned shift;
6929 /* Only the first 30 bits of the qualifier are valid. We must refrain from
6930 setting more, since some assemblers will give an error for this. Also,
6931 we must be careful to avoid shifts of 32 bits or more to avoid getting
6932 unpredictable results. */
6934 for (shift = 6; shift < 30; shift += 2, type = TREE_TYPE (type))
6936 switch (TREE_CODE (type))
6938 case ERROR_MARK:
6939 return qualifiers;
6941 case ARRAY_TYPE:
6942 qualifiers |= (3 << shift);
6943 break;
6945 case FUNCTION_TYPE:
6946 case METHOD_TYPE:
6947 qualifiers |= (2 << shift);
6948 break;
6950 case POINTER_TYPE:
6951 case REFERENCE_TYPE:
6952 case OFFSET_TYPE:
6953 qualifiers |= (1 << shift);
6954 break;
6956 case RECORD_TYPE:
6957 return (qualifiers | 8);
6959 case UNION_TYPE:
6960 case QUAL_UNION_TYPE:
6961 return (qualifiers | 9);
6963 case ENUMERAL_TYPE:
6964 return (qualifiers | 10);
6966 case VOID_TYPE:
6967 return (qualifiers | 16);
6969 case INTEGER_TYPE:
6970 /* If this is a range type, consider it to be the underlying
6971 type. */
6972 if (TREE_TYPE (type) != 0)
6973 break;
6975 /* Carefully distinguish all the standard types of C,
6976 without messing up if the language is not C. We do this by
6977 testing TYPE_PRECISION and TYPE_UNSIGNED. The old code used to
6978 look at both the names and the above fields, but that's redundant.
6979 Any type whose size is between two C types will be considered
6980 to be the wider of the two types. Also, we do not have a
6981 special code to use for "long long", so anything wider than
6982 long is treated the same. Note that we can't distinguish
6983 between "int" and "long" in this code if they are the same
6984 size, but that's fine, since neither can the assembler. */
6986 if (TYPE_PRECISION (type) <= CHAR_TYPE_SIZE)
6987 return (qualifiers | (TYPE_UNSIGNED (type) ? 12 : 2));
6989 else if (TYPE_PRECISION (type) <= SHORT_TYPE_SIZE)
6990 return (qualifiers | (TYPE_UNSIGNED (type) ? 13 : 3));
6992 else if (TYPE_PRECISION (type) <= INT_TYPE_SIZE)
6993 return (qualifiers | (TYPE_UNSIGNED (type) ? 14 : 4));
6995 else
6996 return (qualifiers | (TYPE_UNSIGNED (type) ? 15 : 5));
6998 case REAL_TYPE:
6999 /* If this is a range type, consider it to be the underlying
7000 type. */
7001 if (TREE_TYPE (type) != 0)
7002 break;
7004 /* Carefully distinguish all the standard types of C,
7005 without messing up if the language is not C. */
7007 if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
7008 return (qualifiers | 6);
7010 else
7011 return (qualifiers | 7);
7013 case COMPLEX_TYPE: /* GNU Fortran COMPLEX type. */
7014 /* ??? We need to distinguish between double and float complex types,
7015 but I don't know how yet because I can't reach this code from
7016 existing front-ends. */
7017 return (qualifiers | 7); /* Who knows? */
7019 case VECTOR_TYPE:
7020 case CHAR_TYPE: /* GNU Pascal CHAR type. Not used in C. */
7021 case BOOLEAN_TYPE: /* GNU Fortran BOOLEAN type. */
7022 case LANG_TYPE: /* ? */
7023 return qualifiers;
7025 default:
7026 gcc_unreachable (); /* Not a type! */
7030 return qualifiers;
7033 /* Nested function support. */
7035 /* Emit RTL insns to initialize the variable parts of a trampoline.
7036 FNADDR is an RTX for the address of the function's pure code.
7037 CXT is an RTX for the static chain value for the function.
7039 This takes 16 insns: 2 shifts & 2 ands (to split up addresses), 4 sethi
7040 (to load in opcodes), 4 iors (to merge address and opcodes), and 4 writes
7041 (to store insns). This is a bit excessive. Perhaps a different
7042 mechanism would be better here.
7044 Emit enough FLUSH insns to synchronize the data and instruction caches. */
7046 void
7047 sparc_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
7049 /* SPARC 32-bit trampoline:
7051 sethi %hi(fn), %g1
7052 sethi %hi(static), %g2
7053 jmp %g1+%lo(fn)
7054 or %g2, %lo(static), %g2
7056 SETHI i,r = 00rr rrr1 00ii iiii iiii iiii iiii iiii
7057 JMPL r+i,d = 10dd ddd1 1100 0rrr rr1i iiii iiii iiii
7060 emit_move_insn
7061 (gen_rtx_MEM (SImode, plus_constant (tramp, 0)),
7062 expand_binop (SImode, ior_optab,
7063 expand_shift (RSHIFT_EXPR, SImode, fnaddr,
7064 size_int (10), 0, 1),
7065 GEN_INT (trunc_int_for_mode (0x03000000, SImode)),
7066 NULL_RTX, 1, OPTAB_DIRECT));
7068 emit_move_insn
7069 (gen_rtx_MEM (SImode, plus_constant (tramp, 4)),
7070 expand_binop (SImode, ior_optab,
7071 expand_shift (RSHIFT_EXPR, SImode, cxt,
7072 size_int (10), 0, 1),
7073 GEN_INT (trunc_int_for_mode (0x05000000, SImode)),
7074 NULL_RTX, 1, OPTAB_DIRECT));
7076 emit_move_insn
7077 (gen_rtx_MEM (SImode, plus_constant (tramp, 8)),
7078 expand_binop (SImode, ior_optab,
7079 expand_and (SImode, fnaddr, GEN_INT (0x3ff), NULL_RTX),
7080 GEN_INT (trunc_int_for_mode (0x81c06000, SImode)),
7081 NULL_RTX, 1, OPTAB_DIRECT));
7083 emit_move_insn
7084 (gen_rtx_MEM (SImode, plus_constant (tramp, 12)),
7085 expand_binop (SImode, ior_optab,
7086 expand_and (SImode, cxt, GEN_INT (0x3ff), NULL_RTX),
7087 GEN_INT (trunc_int_for_mode (0x8410a000, SImode)),
7088 NULL_RTX, 1, OPTAB_DIRECT));
7090 /* On UltraSPARC a flush flushes an entire cache line. The trampoline is
7091 aligned on a 16 byte boundary so one flush clears it all. */
7092 emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode, tramp))));
7093 if (sparc_cpu != PROCESSOR_ULTRASPARC
7094 && sparc_cpu != PROCESSOR_ULTRASPARC3)
7095 emit_insn (gen_flush (validize_mem (gen_rtx_MEM (SImode,
7096 plus_constant (tramp, 8)))));
7098 /* Call __enable_execute_stack after writing onto the stack to make sure
7099 the stack address is accessible. */
7100 #ifdef ENABLE_EXECUTE_STACK
7101 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
7102 LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
7103 #endif
7107 /* The 64-bit version is simpler because it makes more sense to load the
7108 values as "immediate" data out of the trampoline. It's also easier since
7109 we can read the PC without clobbering a register. */
7111 void
7112 sparc64_initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
7114 /* SPARC 64-bit trampoline:
7116 rd %pc, %g1
7117 ldx [%g1+24], %g5
7118 jmp %g5
7119 ldx [%g1+16], %g5
7120 +16 bytes data
7123 emit_move_insn (gen_rtx_MEM (SImode, tramp),
7124 GEN_INT (trunc_int_for_mode (0x83414000, SImode)));
7125 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 4)),
7126 GEN_INT (trunc_int_for_mode (0xca586018, SImode)));
7127 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 8)),
7128 GEN_INT (trunc_int_for_mode (0x81c14000, SImode)));
7129 emit_move_insn (gen_rtx_MEM (SImode, plus_constant (tramp, 12)),
7130 GEN_INT (trunc_int_for_mode (0xca586010, SImode)));
7131 emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, 16)), cxt);
7132 emit_move_insn (gen_rtx_MEM (DImode, plus_constant (tramp, 24)), fnaddr);
7133 emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, tramp))));
7135 if (sparc_cpu != PROCESSOR_ULTRASPARC
7136 && sparc_cpu != PROCESSOR_ULTRASPARC3)
7137 emit_insn (gen_flushdi (validize_mem (gen_rtx_MEM (DImode, plus_constant (tramp, 8)))));
7139 /* Call __enable_execute_stack after writing onto the stack to make sure
7140 the stack address is accessible. */
7141 #ifdef ENABLE_EXECUTE_STACK
7142 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
7143 LCT_NORMAL, VOIDmode, 1, tramp, Pmode);
7144 #endif
7147 /* Adjust the cost of a scheduling dependency. Return the new cost of
7148 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
7150 static int
7151 supersparc_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
7153 enum attr_type insn_type;
7155 if (! recog_memoized (insn))
7156 return 0;
7158 insn_type = get_attr_type (insn);
7160 if (REG_NOTE_KIND (link) == 0)
7162 /* Data dependency; DEP_INSN writes a register that INSN reads some
7163 cycles later. */
7165 /* if a load, then the dependence must be on the memory address;
7166 add an extra "cycle". Note that the cost could be two cycles
7167 if the reg was written late in an instruction group; we ca not tell
7168 here. */
7169 if (insn_type == TYPE_LOAD || insn_type == TYPE_FPLOAD)
7170 return cost + 3;
7172 /* Get the delay only if the address of the store is the dependence. */
7173 if (insn_type == TYPE_STORE || insn_type == TYPE_FPSTORE)
7175 rtx pat = PATTERN(insn);
7176 rtx dep_pat = PATTERN (dep_insn);
7178 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
7179 return cost; /* This should not happen! */
7181 /* The dependency between the two instructions was on the data that
7182 is being stored. Assume that this implies that the address of the
7183 store is not dependent. */
7184 if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
7185 return cost;
7187 return cost + 3; /* An approximation. */
7190 /* A shift instruction cannot receive its data from an instruction
7191 in the same cycle; add a one cycle penalty. */
7192 if (insn_type == TYPE_SHIFT)
7193 return cost + 3; /* Split before cascade into shift. */
7195 else
7197 /* Anti- or output- dependency; DEP_INSN reads/writes a register that
7198 INSN writes some cycles later. */
7200 /* These are only significant for the fpu unit; writing a fp reg before
7201 the fpu has finished with it stalls the processor. */
7203 /* Reusing an integer register causes no problems. */
7204 if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
7205 return 0;
7208 return cost;
7211 static int
7212 hypersparc_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
7214 enum attr_type insn_type, dep_type;
7215 rtx pat = PATTERN(insn);
7216 rtx dep_pat = PATTERN (dep_insn);
7218 if (recog_memoized (insn) < 0 || recog_memoized (dep_insn) < 0)
7219 return cost;
7221 insn_type = get_attr_type (insn);
7222 dep_type = get_attr_type (dep_insn);
7224 switch (REG_NOTE_KIND (link))
7226 case 0:
7227 /* Data dependency; DEP_INSN writes a register that INSN reads some
7228 cycles later. */
7230 switch (insn_type)
7232 case TYPE_STORE:
7233 case TYPE_FPSTORE:
7234 /* Get the delay iff the address of the store is the dependence. */
7235 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
7236 return cost;
7238 if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
7239 return cost;
7240 return cost + 3;
7242 case TYPE_LOAD:
7243 case TYPE_SLOAD:
7244 case TYPE_FPLOAD:
7245 /* If a load, then the dependence must be on the memory address. If
7246 the addresses aren't equal, then it might be a false dependency */
7247 if (dep_type == TYPE_STORE || dep_type == TYPE_FPSTORE)
7249 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET
7250 || GET_CODE (SET_DEST (dep_pat)) != MEM
7251 || GET_CODE (SET_SRC (pat)) != MEM
7252 || ! rtx_equal_p (XEXP (SET_DEST (dep_pat), 0),
7253 XEXP (SET_SRC (pat), 0)))
7254 return cost + 2;
7256 return cost + 8;
7258 break;
7260 case TYPE_BRANCH:
7261 /* Compare to branch latency is 0. There is no benefit from
7262 separating compare and branch. */
7263 if (dep_type == TYPE_COMPARE)
7264 return 0;
7265 /* Floating point compare to branch latency is less than
7266 compare to conditional move. */
7267 if (dep_type == TYPE_FPCMP)
7268 return cost - 1;
7269 break;
7270 default:
7271 break;
7273 break;
7275 case REG_DEP_ANTI:
7276 /* Anti-dependencies only penalize the fpu unit. */
7277 if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
7278 return 0;
7279 break;
7281 default:
7282 break;
7285 return cost;
7288 static int
7289 sparc_adjust_cost(rtx insn, rtx link, rtx dep, int cost)
7291 switch (sparc_cpu)
7293 case PROCESSOR_SUPERSPARC:
7294 cost = supersparc_adjust_cost (insn, link, dep, cost);
7295 break;
7296 case PROCESSOR_HYPERSPARC:
7297 case PROCESSOR_SPARCLITE86X:
7298 cost = hypersparc_adjust_cost (insn, link, dep, cost);
7299 break;
7300 default:
7301 break;
7303 return cost;
7306 static void
7307 sparc_sched_init (FILE *dump ATTRIBUTE_UNUSED,
7308 int sched_verbose ATTRIBUTE_UNUSED,
7309 int max_ready ATTRIBUTE_UNUSED)
7313 static int
7314 sparc_use_sched_lookahead (void)
7316 if (sparc_cpu == PROCESSOR_ULTRASPARC
7317 || sparc_cpu == PROCESSOR_ULTRASPARC3)
7318 return 4;
7319 if ((1 << sparc_cpu) &
7320 ((1 << PROCESSOR_SUPERSPARC) | (1 << PROCESSOR_HYPERSPARC) |
7321 (1 << PROCESSOR_SPARCLITE86X)))
7322 return 3;
7323 return 0;
7326 static int
7327 sparc_issue_rate (void)
7329 switch (sparc_cpu)
7331 default:
7332 return 1;
7333 case PROCESSOR_V9:
7334 /* Assume V9 processors are capable of at least dual-issue. */
7335 return 2;
7336 case PROCESSOR_SUPERSPARC:
7337 return 3;
7338 case PROCESSOR_HYPERSPARC:
7339 case PROCESSOR_SPARCLITE86X:
7340 return 2;
7341 case PROCESSOR_ULTRASPARC:
7342 case PROCESSOR_ULTRASPARC3:
7343 return 4;
7347 static int
7348 set_extends (rtx insn)
7350 register rtx pat = PATTERN (insn);
7352 switch (GET_CODE (SET_SRC (pat)))
7354 /* Load and some shift instructions zero extend. */
7355 case MEM:
7356 case ZERO_EXTEND:
7357 /* sethi clears the high bits */
7358 case HIGH:
7359 /* LO_SUM is used with sethi. sethi cleared the high
7360 bits and the values used with lo_sum are positive */
7361 case LO_SUM:
7362 /* Store flag stores 0 or 1 */
7363 case LT: case LTU:
7364 case GT: case GTU:
7365 case LE: case LEU:
7366 case GE: case GEU:
7367 case EQ:
7368 case NE:
7369 return 1;
7370 case AND:
7372 rtx op0 = XEXP (SET_SRC (pat), 0);
7373 rtx op1 = XEXP (SET_SRC (pat), 1);
7374 if (GET_CODE (op1) == CONST_INT)
7375 return INTVAL (op1) >= 0;
7376 if (GET_CODE (op0) != REG)
7377 return 0;
7378 if (sparc_check_64 (op0, insn) == 1)
7379 return 1;
7380 return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
7382 case IOR:
7383 case XOR:
7385 rtx op0 = XEXP (SET_SRC (pat), 0);
7386 rtx op1 = XEXP (SET_SRC (pat), 1);
7387 if (GET_CODE (op0) != REG || sparc_check_64 (op0, insn) <= 0)
7388 return 0;
7389 if (GET_CODE (op1) == CONST_INT)
7390 return INTVAL (op1) >= 0;
7391 return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
7393 case LSHIFTRT:
7394 return GET_MODE (SET_SRC (pat)) == SImode;
7395 /* Positive integers leave the high bits zero. */
7396 case CONST_DOUBLE:
7397 return ! (CONST_DOUBLE_LOW (SET_SRC (pat)) & 0x80000000);
7398 case CONST_INT:
7399 return ! (INTVAL (SET_SRC (pat)) & 0x80000000);
7400 case ASHIFTRT:
7401 case SIGN_EXTEND:
7402 return - (GET_MODE (SET_SRC (pat)) == SImode);
7403 case REG:
7404 return sparc_check_64 (SET_SRC (pat), insn);
7405 default:
7406 return 0;
7410 /* We _ought_ to have only one kind per function, but... */
7411 static GTY(()) rtx sparc_addr_diff_list;
7412 static GTY(()) rtx sparc_addr_list;
7414 void
7415 sparc_defer_case_vector (rtx lab, rtx vec, int diff)
7417 vec = gen_rtx_EXPR_LIST (VOIDmode, lab, vec);
7418 if (diff)
7419 sparc_addr_diff_list
7420 = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_diff_list);
7421 else
7422 sparc_addr_list = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_list);
7425 static void
7426 sparc_output_addr_vec (rtx vec)
7428 rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
7429 int idx, vlen = XVECLEN (body, 0);
7431 #ifdef ASM_OUTPUT_ADDR_VEC_START
7432 ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
7433 #endif
7435 #ifdef ASM_OUTPUT_CASE_LABEL
7436 ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
7437 NEXT_INSN (lab));
7438 #else
7439 (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
7440 #endif
7442 for (idx = 0; idx < vlen; idx++)
7444 ASM_OUTPUT_ADDR_VEC_ELT
7445 (asm_out_file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
7448 #ifdef ASM_OUTPUT_ADDR_VEC_END
7449 ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
7450 #endif
7453 static void
7454 sparc_output_addr_diff_vec (rtx vec)
7456 rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
7457 rtx base = XEXP (XEXP (body, 0), 0);
7458 int idx, vlen = XVECLEN (body, 1);
7460 #ifdef ASM_OUTPUT_ADDR_VEC_START
7461 ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
7462 #endif
7464 #ifdef ASM_OUTPUT_CASE_LABEL
7465 ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
7466 NEXT_INSN (lab));
7467 #else
7468 (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
7469 #endif
7471 for (idx = 0; idx < vlen; idx++)
7473 ASM_OUTPUT_ADDR_DIFF_ELT
7474 (asm_out_file,
7475 body,
7476 CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
7477 CODE_LABEL_NUMBER (base));
7480 #ifdef ASM_OUTPUT_ADDR_VEC_END
7481 ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
7482 #endif
7485 static void
7486 sparc_output_deferred_case_vectors (void)
7488 rtx t;
7489 int align;
7491 if (sparc_addr_list == NULL_RTX
7492 && sparc_addr_diff_list == NULL_RTX)
7493 return;
7495 /* Align to cache line in the function's code section. */
7496 current_function_section (current_function_decl);
7498 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
7499 if (align > 0)
7500 ASM_OUTPUT_ALIGN (asm_out_file, align);
7502 for (t = sparc_addr_list; t ; t = XEXP (t, 1))
7503 sparc_output_addr_vec (XEXP (t, 0));
7504 for (t = sparc_addr_diff_list; t ; t = XEXP (t, 1))
7505 sparc_output_addr_diff_vec (XEXP (t, 0));
7507 sparc_addr_list = sparc_addr_diff_list = NULL_RTX;
7510 /* Return 0 if the high 32 bits of X (the low word of X, if DImode) are
7511 unknown. Return 1 if the high bits are zero, -1 if the register is
7512 sign extended. */
7514 sparc_check_64 (rtx x, rtx insn)
7516 /* If a register is set only once it is safe to ignore insns this
7517 code does not know how to handle. The loop will either recognize
7518 the single set and return the correct value or fail to recognize
7519 it and return 0. */
7520 int set_once = 0;
7521 rtx y = x;
7523 gcc_assert (GET_CODE (x) == REG);
7525 if (GET_MODE (x) == DImode)
7526 y = gen_rtx_REG (SImode, REGNO (x) + WORDS_BIG_ENDIAN);
7528 if (flag_expensive_optimizations
7529 && REG_N_SETS (REGNO (y)) == 1)
7530 set_once = 1;
7532 if (insn == 0)
7534 if (set_once)
7535 insn = get_last_insn_anywhere ();
7536 else
7537 return 0;
7540 while ((insn = PREV_INSN (insn)))
7542 switch (GET_CODE (insn))
7544 case JUMP_INSN:
7545 case NOTE:
7546 break;
7547 case CODE_LABEL:
7548 case CALL_INSN:
7549 default:
7550 if (! set_once)
7551 return 0;
7552 break;
7553 case INSN:
7555 rtx pat = PATTERN (insn);
7556 if (GET_CODE (pat) != SET)
7557 return 0;
7558 if (rtx_equal_p (x, SET_DEST (pat)))
7559 return set_extends (insn);
7560 if (y && rtx_equal_p (y, SET_DEST (pat)))
7561 return set_extends (insn);
7562 if (reg_overlap_mentioned_p (SET_DEST (pat), y))
7563 return 0;
7567 return 0;
7570 /* Returns assembly code to perform a DImode shift using
7571 a 64-bit global or out register on SPARC-V8+. */
7572 const char *
7573 output_v8plus_shift (rtx *operands, rtx insn, const char *opcode)
7575 static char asm_code[60];
7577 /* The scratch register is only required when the destination
7578 register is not a 64-bit global or out register. */
7579 if (which_alternative != 2)
7580 operands[3] = operands[0];
7582 /* We can only shift by constants <= 63. */
7583 if (GET_CODE (operands[2]) == CONST_INT)
7584 operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
7586 if (GET_CODE (operands[1]) == CONST_INT)
7588 output_asm_insn ("mov\t%1, %3", operands);
7590 else
7592 output_asm_insn ("sllx\t%H1, 32, %3", operands);
7593 if (sparc_check_64 (operands[1], insn) <= 0)
7594 output_asm_insn ("srl\t%L1, 0, %L1", operands);
7595 output_asm_insn ("or\t%L1, %3, %3", operands);
7598 strcpy(asm_code, opcode);
7600 if (which_alternative != 2)
7601 return strcat (asm_code, "\t%0, %2, %L0\n\tsrlx\t%L0, 32, %H0");
7602 else
7603 return strcat (asm_code, "\t%3, %2, %3\n\tsrlx\t%3, 32, %H0\n\tmov\t%3, %L0");
7606 /* Output rtl to increment the profiler label LABELNO
7607 for profiling a function entry. */
7609 void
7610 sparc_profile_hook (int labelno)
7612 char buf[32];
7613 rtx lab, fun;
7615 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
7616 lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
7617 fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_FUNCTION);
7619 emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lab, Pmode);
7622 #ifdef OBJECT_FORMAT_ELF
7623 static void
7624 sparc_elf_asm_named_section (const char *name, unsigned int flags,
7625 tree decl)
7627 if (flags & SECTION_MERGE)
7629 /* entsize cannot be expressed in this section attributes
7630 encoding style. */
7631 default_elf_asm_named_section (name, flags, decl);
7632 return;
7635 fprintf (asm_out_file, "\t.section\t\"%s\"", name);
7637 if (!(flags & SECTION_DEBUG))
7638 fputs (",#alloc", asm_out_file);
7639 if (flags & SECTION_WRITE)
7640 fputs (",#write", asm_out_file);
7641 if (flags & SECTION_TLS)
7642 fputs (",#tls", asm_out_file);
7643 if (flags & SECTION_CODE)
7644 fputs (",#execinstr", asm_out_file);
7646 /* ??? Handle SECTION_BSS. */
7648 fputc ('\n', asm_out_file);
7650 #endif /* OBJECT_FORMAT_ELF */
7652 /* We do not allow indirect calls to be optimized into sibling calls.
7654 We cannot use sibling calls when delayed branches are disabled
7655 because they will likely require the call delay slot to be filled.
7657 Also, on SPARC 32-bit we cannot emit a sibling call when the
7658 current function returns a structure. This is because the "unimp
7659 after call" convention would cause the callee to return to the
7660 wrong place. The generic code already disallows cases where the
7661 function being called returns a structure.
7663 It may seem strange how this last case could occur. Usually there
7664 is code after the call which jumps to epilogue code which dumps the
7665 return value into the struct return area. That ought to invalidate
7666 the sibling call right? Well, in the C++ case we can end up passing
7667 the pointer to the struct return area to a constructor (which returns
7668 void) and then nothing else happens. Such a sibling call would look
7669 valid without the added check here. */
7670 static bool
7671 sparc_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
7673 return (decl
7674 && flag_delayed_branch
7675 && (TARGET_ARCH64 || ! current_function_returns_struct));
7678 /* libfunc renaming. */
7679 #include "config/gofast.h"
7681 static void
7682 sparc_init_libfuncs (void)
7684 if (TARGET_ARCH32)
7686 /* Use the subroutines that Sun's library provides for integer
7687 multiply and divide. The `*' prevents an underscore from
7688 being prepended by the compiler. .umul is a little faster
7689 than .mul. */
7690 set_optab_libfunc (smul_optab, SImode, "*.umul");
7691 set_optab_libfunc (sdiv_optab, SImode, "*.div");
7692 set_optab_libfunc (udiv_optab, SImode, "*.udiv");
7693 set_optab_libfunc (smod_optab, SImode, "*.rem");
7694 set_optab_libfunc (umod_optab, SImode, "*.urem");
7696 /* TFmode arithmetic. These names are part of the SPARC 32bit ABI. */
7697 set_optab_libfunc (add_optab, TFmode, "_Q_add");
7698 set_optab_libfunc (sub_optab, TFmode, "_Q_sub");
7699 set_optab_libfunc (neg_optab, TFmode, "_Q_neg");
7700 set_optab_libfunc (smul_optab, TFmode, "_Q_mul");
7701 set_optab_libfunc (sdiv_optab, TFmode, "_Q_div");
7703 /* We can define the TFmode sqrt optab only if TARGET_FPU. This
7704 is because with soft-float, the SFmode and DFmode sqrt
7705 instructions will be absent, and the compiler will notice and
7706 try to use the TFmode sqrt instruction for calls to the
7707 builtin function sqrt, but this fails. */
7708 if (TARGET_FPU)
7709 set_optab_libfunc (sqrt_optab, TFmode, "_Q_sqrt");
7711 set_optab_libfunc (eq_optab, TFmode, "_Q_feq");
7712 set_optab_libfunc (ne_optab, TFmode, "_Q_fne");
7713 set_optab_libfunc (gt_optab, TFmode, "_Q_fgt");
7714 set_optab_libfunc (ge_optab, TFmode, "_Q_fge");
7715 set_optab_libfunc (lt_optab, TFmode, "_Q_flt");
7716 set_optab_libfunc (le_optab, TFmode, "_Q_fle");
7718 set_conv_libfunc (sext_optab, TFmode, SFmode, "_Q_stoq");
7719 set_conv_libfunc (sext_optab, TFmode, DFmode, "_Q_dtoq");
7720 set_conv_libfunc (trunc_optab, SFmode, TFmode, "_Q_qtos");
7721 set_conv_libfunc (trunc_optab, DFmode, TFmode, "_Q_qtod");
7723 set_conv_libfunc (sfix_optab, SImode, TFmode, "_Q_qtoi");
7724 set_conv_libfunc (ufix_optab, SImode, TFmode, "_Q_qtou");
7725 set_conv_libfunc (sfloat_optab, TFmode, SImode, "_Q_itoq");
7727 if (DITF_CONVERSION_LIBFUNCS)
7729 set_conv_libfunc (sfix_optab, DImode, TFmode, "_Q_qtoll");
7730 set_conv_libfunc (ufix_optab, DImode, TFmode, "_Q_qtoull");
7731 set_conv_libfunc (sfloat_optab, TFmode, DImode, "_Q_lltoq");
7734 if (SUN_CONVERSION_LIBFUNCS)
7736 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftoll");
7737 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoull");
7738 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtoll");
7739 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoull");
7742 if (TARGET_ARCH64)
7744 /* In the SPARC 64bit ABI, SImode multiply and divide functions
7745 do not exist in the library. Make sure the compiler does not
7746 emit calls to them by accident. (It should always use the
7747 hardware instructions.) */
7748 set_optab_libfunc (smul_optab, SImode, 0);
7749 set_optab_libfunc (sdiv_optab, SImode, 0);
7750 set_optab_libfunc (udiv_optab, SImode, 0);
7751 set_optab_libfunc (smod_optab, SImode, 0);
7752 set_optab_libfunc (umod_optab, SImode, 0);
7754 if (SUN_INTEGER_MULTIPLY_64)
7756 set_optab_libfunc (smul_optab, DImode, "__mul64");
7757 set_optab_libfunc (sdiv_optab, DImode, "__div64");
7758 set_optab_libfunc (udiv_optab, DImode, "__udiv64");
7759 set_optab_libfunc (smod_optab, DImode, "__rem64");
7760 set_optab_libfunc (umod_optab, DImode, "__urem64");
7763 if (SUN_CONVERSION_LIBFUNCS)
7765 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftol");
7766 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoul");
7767 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtol");
7768 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoul");
7772 gofast_maybe_init_libfuncs ();
7775 #define def_builtin(NAME, CODE, TYPE) \
7776 lang_hooks.builtin_function((NAME), (TYPE), (CODE), BUILT_IN_MD, NULL, \
7777 NULL_TREE)
7779 /* Implement the TARGET_INIT_BUILTINS target hook.
7780 Create builtin functions for special SPARC instructions. */
7782 static void
7783 sparc_init_builtins (void)
7785 if (TARGET_VIS)
7786 sparc_vis_init_builtins ();
7789 /* Create builtin functions for VIS 1.0 instructions. */
7791 static void
7792 sparc_vis_init_builtins (void)
7794 tree v4qi = build_vector_type (unsigned_intQI_type_node, 4);
7795 tree v8qi = build_vector_type (unsigned_intQI_type_node, 8);
7796 tree v4hi = build_vector_type (intHI_type_node, 4);
7797 tree v2hi = build_vector_type (intHI_type_node, 2);
7798 tree v2si = build_vector_type (intSI_type_node, 2);
7800 tree v4qi_ftype_v4hi = build_function_type_list (v4qi, v4hi, 0);
7801 tree v8qi_ftype_v2si_v8qi = build_function_type_list (v8qi, v2si, v8qi, 0);
7802 tree v2hi_ftype_v2si = build_function_type_list (v2hi, v2si, 0);
7803 tree v4hi_ftype_v4qi = build_function_type_list (v4hi, v4qi, 0);
7804 tree v8qi_ftype_v4qi_v4qi = build_function_type_list (v8qi, v4qi, v4qi, 0);
7805 tree v4hi_ftype_v4qi_v4hi = build_function_type_list (v4hi, v4qi, v4hi, 0);
7806 tree v4hi_ftype_v4qi_v2hi = build_function_type_list (v4hi, v4qi, v2hi, 0);
7807 tree v2si_ftype_v4qi_v2hi = build_function_type_list (v2si, v4qi, v2hi, 0);
7808 tree v4hi_ftype_v8qi_v4hi = build_function_type_list (v4hi, v8qi, v4hi, 0);
7809 tree v4hi_ftype_v4hi_v4hi = build_function_type_list (v4hi, v4hi, v4hi, 0);
7810 tree v2si_ftype_v2si_v2si = build_function_type_list (v2si, v2si, v2si, 0);
7811 tree v8qi_ftype_v8qi_v8qi = build_function_type_list (v8qi, v8qi, v8qi, 0);
7812 tree di_ftype_v8qi_v8qi_di = build_function_type_list (intDI_type_node,
7813 v8qi, v8qi,
7814 intDI_type_node, 0);
7815 tree di_ftype_di_di = build_function_type_list (intDI_type_node,
7816 intDI_type_node,
7817 intDI_type_node, 0);
7818 tree ptr_ftype_ptr_si = build_function_type_list (ptr_type_node,
7819 ptr_type_node,
7820 intSI_type_node, 0);
7821 tree ptr_ftype_ptr_di = build_function_type_list (ptr_type_node,
7822 ptr_type_node,
7823 intDI_type_node, 0);
7825 /* Packing and expanding vectors. */
7826 def_builtin ("__builtin_vis_fpack16", CODE_FOR_fpack16_vis, v4qi_ftype_v4hi);
7827 def_builtin ("__builtin_vis_fpack32", CODE_FOR_fpack32_vis,
7828 v8qi_ftype_v2si_v8qi);
7829 def_builtin ("__builtin_vis_fpackfix", CODE_FOR_fpackfix_vis,
7830 v2hi_ftype_v2si);
7831 def_builtin ("__builtin_vis_fexpand", CODE_FOR_fexpand_vis, v4hi_ftype_v4qi);
7832 def_builtin ("__builtin_vis_fpmerge", CODE_FOR_fpmerge_vis,
7833 v8qi_ftype_v4qi_v4qi);
7835 /* Multiplications. */
7836 def_builtin ("__builtin_vis_fmul8x16", CODE_FOR_fmul8x16_vis,
7837 v4hi_ftype_v4qi_v4hi);
7838 def_builtin ("__builtin_vis_fmul8x16au", CODE_FOR_fmul8x16au_vis,
7839 v4hi_ftype_v4qi_v2hi);
7840 def_builtin ("__builtin_vis_fmul8x16al", CODE_FOR_fmul8x16al_vis,
7841 v4hi_ftype_v4qi_v2hi);
7842 def_builtin ("__builtin_vis_fmul8sux16", CODE_FOR_fmul8sux16_vis,
7843 v4hi_ftype_v8qi_v4hi);
7844 def_builtin ("__builtin_vis_fmul8ulx16", CODE_FOR_fmul8ulx16_vis,
7845 v4hi_ftype_v8qi_v4hi);
7846 def_builtin ("__builtin_vis_fmuld8sux16", CODE_FOR_fmuld8sux16_vis,
7847 v2si_ftype_v4qi_v2hi);
7848 def_builtin ("__builtin_vis_fmuld8ulx16", CODE_FOR_fmuld8ulx16_vis,
7849 v2si_ftype_v4qi_v2hi);
7851 /* Data aligning. */
7852 def_builtin ("__builtin_vis_faligndatav4hi", CODE_FOR_faligndatav4hi_vis,
7853 v4hi_ftype_v4hi_v4hi);
7854 def_builtin ("__builtin_vis_faligndatav8qi", CODE_FOR_faligndatav8qi_vis,
7855 v8qi_ftype_v8qi_v8qi);
7856 def_builtin ("__builtin_vis_faligndatav2si", CODE_FOR_faligndatav2si_vis,
7857 v2si_ftype_v2si_v2si);
7858 def_builtin ("__builtin_vis_faligndatadi", CODE_FOR_faligndatadi_vis,
7859 di_ftype_di_di);
7860 if (TARGET_ARCH64)
7861 def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrdi_vis,
7862 ptr_ftype_ptr_di);
7863 else
7864 def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrsi_vis,
7865 ptr_ftype_ptr_si);
7867 /* Pixel distance. */
7868 def_builtin ("__builtin_vis_pdist", CODE_FOR_pdist_vis,
7869 di_ftype_v8qi_v8qi_di);
7872 /* Handle TARGET_EXPAND_BUILTIN target hook.
7873 Expand builtin functions for sparc intrinsics. */
7875 static rtx
7876 sparc_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
7877 enum machine_mode tmode, int ignore ATTRIBUTE_UNUSED)
7879 tree arglist;
7880 tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7881 unsigned int icode = DECL_FUNCTION_CODE (fndecl);
7882 rtx pat, op[4];
7883 enum machine_mode mode[4];
7884 int arg_count = 0;
7886 mode[arg_count] = tmode;
7888 if (target == 0
7889 || GET_MODE (target) != tmode
7890 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
7891 op[arg_count] = gen_reg_rtx (tmode);
7892 else
7893 op[arg_count] = target;
7895 for (arglist = TREE_OPERAND (exp, 1); arglist;
7896 arglist = TREE_CHAIN (arglist))
7898 tree arg = TREE_VALUE (arglist);
7900 arg_count++;
7901 mode[arg_count] = insn_data[icode].operand[arg_count].mode;
7902 op[arg_count] = expand_expr (arg, NULL_RTX, VOIDmode, 0);
7904 if (! (*insn_data[icode].operand[arg_count].predicate) (op[arg_count],
7905 mode[arg_count]))
7906 op[arg_count] = copy_to_mode_reg (mode[arg_count], op[arg_count]);
7909 switch (arg_count)
7911 case 1:
7912 pat = GEN_FCN (icode) (op[0], op[1]);
7913 break;
7914 case 2:
7915 pat = GEN_FCN (icode) (op[0], op[1], op[2]);
7916 break;
7917 case 3:
7918 pat = GEN_FCN (icode) (op[0], op[1], op[2], op[3]);
7919 break;
7920 default:
7921 gcc_unreachable ();
7924 if (!pat)
7925 return NULL_RTX;
7927 emit_insn (pat);
7929 return op[0];
7932 static int
7933 sparc_vis_mul8x16 (int e8, int e16)
7935 return (e8 * e16 + 128) / 256;
7938 /* Multiply the vector elements in ELTS0 to the elements in ELTS1 as specified
7939 by FNCODE. All of the elements in ELTS0 and ELTS1 lists must be integer
7940 constants. A tree list with the results of the multiplications is returned,
7941 and each element in the list is of INNER_TYPE. */
7943 static tree
7944 sparc_handle_vis_mul8x16 (int fncode, tree inner_type, tree elts0, tree elts1)
7946 tree n_elts = NULL_TREE;
7947 int scale;
7949 switch (fncode)
7951 case CODE_FOR_fmul8x16_vis:
7952 for (; elts0 && elts1;
7953 elts0 = TREE_CHAIN (elts0), elts1 = TREE_CHAIN (elts1))
7955 int val
7956 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (TREE_VALUE (elts0)),
7957 TREE_INT_CST_LOW (TREE_VALUE (elts1)));
7958 n_elts = tree_cons (NULL_TREE,
7959 build_int_cst (inner_type, val),
7960 n_elts);
7962 break;
7964 case CODE_FOR_fmul8x16au_vis:
7965 scale = TREE_INT_CST_LOW (TREE_VALUE (elts1));
7967 for (; elts0; elts0 = TREE_CHAIN (elts0))
7969 int val
7970 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (TREE_VALUE (elts0)),
7971 scale);
7972 n_elts = tree_cons (NULL_TREE,
7973 build_int_cst (inner_type, val),
7974 n_elts);
7976 break;
7978 case CODE_FOR_fmul8x16al_vis:
7979 scale = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (elts1)));
7981 for (; elts0; elts0 = TREE_CHAIN (elts0))
7983 int val
7984 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (TREE_VALUE (elts0)),
7985 scale);
7986 n_elts = tree_cons (NULL_TREE,
7987 build_int_cst (inner_type, val),
7988 n_elts);
7990 break;
7992 default:
7993 gcc_unreachable ();
7996 return nreverse (n_elts);
7999 /* Handle TARGET_FOLD_BUILTIN target hook.
8000 Fold builtin functions for SPARC intrinsics. If IGNORE is true the
8001 result of the function call is ignored. NULL_TREE is returned if the
8002 function could not be folded. */
8004 static tree
8005 sparc_fold_builtin (tree fndecl, tree arglist, bool ignore)
8007 tree arg0, arg1, arg2;
8008 tree rtype = TREE_TYPE (TREE_TYPE (fndecl));
8011 if (ignore && DECL_FUNCTION_CODE (fndecl) != CODE_FOR_alignaddrsi_vis
8012 && DECL_FUNCTION_CODE (fndecl) != CODE_FOR_alignaddrdi_vis)
8013 return build_int_cst (rtype, 0);
8015 switch (DECL_FUNCTION_CODE (fndecl))
8017 case CODE_FOR_fexpand_vis:
8018 arg0 = TREE_VALUE (arglist);
8019 STRIP_NOPS (arg0);
8021 if (TREE_CODE (arg0) == VECTOR_CST)
8023 tree inner_type = TREE_TYPE (rtype);
8024 tree elts = TREE_VECTOR_CST_ELTS (arg0);
8025 tree n_elts = NULL_TREE;
8027 for (; elts; elts = TREE_CHAIN (elts))
8029 unsigned int val = TREE_INT_CST_LOW (TREE_VALUE (elts)) << 4;
8030 n_elts = tree_cons (NULL_TREE,
8031 build_int_cst (inner_type, val),
8032 n_elts);
8034 return build_vector (rtype, nreverse (n_elts));
8036 break;
8038 case CODE_FOR_fmul8x16_vis:
8039 case CODE_FOR_fmul8x16au_vis:
8040 case CODE_FOR_fmul8x16al_vis:
8041 arg0 = TREE_VALUE (arglist);
8042 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
8043 STRIP_NOPS (arg0);
8044 STRIP_NOPS (arg1);
8046 if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
8048 tree inner_type = TREE_TYPE (rtype);
8049 tree elts0 = TREE_VECTOR_CST_ELTS (arg0);
8050 tree elts1 = TREE_VECTOR_CST_ELTS (arg1);
8051 tree n_elts = sparc_handle_vis_mul8x16 (DECL_FUNCTION_CODE (fndecl),
8052 inner_type, elts0, elts1);
8054 return build_vector (rtype, n_elts);
8056 break;
8058 case CODE_FOR_fpmerge_vis:
8059 arg0 = TREE_VALUE (arglist);
8060 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
8061 STRIP_NOPS (arg0);
8062 STRIP_NOPS (arg1);
8064 if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
8066 tree elts0 = TREE_VECTOR_CST_ELTS (arg0);
8067 tree elts1 = TREE_VECTOR_CST_ELTS (arg1);
8068 tree n_elts = NULL_TREE;
8070 for (; elts0 && elts1;
8071 elts0 = TREE_CHAIN (elts0), elts1 = TREE_CHAIN (elts1))
8073 n_elts = tree_cons (NULL_TREE, TREE_VALUE (elts0), n_elts);
8074 n_elts = tree_cons (NULL_TREE, TREE_VALUE (elts1), n_elts);
8077 return build_vector (rtype, nreverse (n_elts));
8079 break;
8081 case CODE_FOR_pdist_vis:
8082 arg0 = TREE_VALUE (arglist);
8083 arg1 = TREE_VALUE (TREE_CHAIN (arglist));
8084 arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
8085 STRIP_NOPS (arg0);
8086 STRIP_NOPS (arg1);
8087 STRIP_NOPS (arg2);
8089 if (TREE_CODE (arg0) == VECTOR_CST
8090 && TREE_CODE (arg1) == VECTOR_CST
8091 && TREE_CODE (arg2) == INTEGER_CST)
8093 int overflow = 0;
8094 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg2);
8095 HOST_WIDE_INT high = TREE_INT_CST_HIGH (arg2);
8096 tree elts0 = TREE_VECTOR_CST_ELTS (arg0);
8097 tree elts1 = TREE_VECTOR_CST_ELTS (arg1);
8099 for (; elts0 && elts1;
8100 elts0 = TREE_CHAIN (elts0), elts1 = TREE_CHAIN (elts1))
8102 unsigned HOST_WIDE_INT
8103 low0 = TREE_INT_CST_LOW (TREE_VALUE (elts0)),
8104 low1 = TREE_INT_CST_LOW (TREE_VALUE (elts1));
8105 HOST_WIDE_INT high0 = TREE_INT_CST_HIGH (TREE_VALUE (elts0));
8106 HOST_WIDE_INT high1 = TREE_INT_CST_HIGH (TREE_VALUE (elts1));
8108 unsigned HOST_WIDE_INT l;
8109 HOST_WIDE_INT h;
8111 overflow |= neg_double (low1, high1, &l, &h);
8112 overflow |= add_double (low0, high0, l, h, &l, &h);
8113 if (h < 0)
8114 overflow |= neg_double (l, h, &l, &h);
8116 overflow |= add_double (low, high, l, h, &low, &high);
8119 gcc_assert (overflow == 0);
8121 return build_int_cst_wide (rtype, low, high);
8124 default:
8125 break;
8127 return NULL_TREE;
8131 sparc_extra_constraint_check (rtx op, int c, int strict)
8133 int reload_ok_mem;
8135 if (TARGET_ARCH64
8136 && (c == 'T' || c == 'U'))
8137 return 0;
8139 switch (c)
8141 case 'Q':
8142 return fp_sethi_p (op);
8144 case 'R':
8145 return fp_mov_p (op);
8147 case 'S':
8148 return fp_high_losum_p (op);
8150 case 'U':
8151 if (! strict
8152 || (GET_CODE (op) == REG
8153 && (REGNO (op) < FIRST_PSEUDO_REGISTER
8154 || reg_renumber[REGNO (op)] >= 0)))
8155 return register_ok_for_ldd (op);
8157 return 0;
8159 case 'W':
8160 case 'T':
8161 break;
8163 case 'Y':
8164 return const_zero_operand (op, GET_MODE (op));
8166 default:
8167 return 0;
8170 /* Our memory extra constraints have to emulate the
8171 behavior of 'm' and 'o' in order for reload to work
8172 correctly. */
8173 if (GET_CODE (op) == MEM)
8175 reload_ok_mem = 0;
8176 if ((TARGET_ARCH64 || mem_min_alignment (op, 8))
8177 && (! strict
8178 || strict_memory_address_p (Pmode, XEXP (op, 0))))
8179 reload_ok_mem = 1;
8181 else
8183 reload_ok_mem = (reload_in_progress
8184 && GET_CODE (op) == REG
8185 && REGNO (op) >= FIRST_PSEUDO_REGISTER
8186 && reg_renumber [REGNO (op)] < 0);
8189 return reload_ok_mem;
8192 /* ??? This duplicates information provided to the compiler by the
8193 ??? scheduler description. Some day, teach genautomata to output
8194 ??? the latencies and then CSE will just use that. */
8196 static bool
8197 sparc_rtx_costs (rtx x, int code, int outer_code, int *total)
8199 enum machine_mode mode = GET_MODE (x);
8200 bool float_mode_p = FLOAT_MODE_P (mode);
8202 switch (code)
8204 case CONST_INT:
8205 if (INTVAL (x) < 0x1000 && INTVAL (x) >= -0x1000)
8207 *total = 0;
8208 return true;
8210 /* FALLTHRU */
8212 case HIGH:
8213 *total = 2;
8214 return true;
8216 case CONST:
8217 case LABEL_REF:
8218 case SYMBOL_REF:
8219 *total = 4;
8220 return true;
8222 case CONST_DOUBLE:
8223 if (GET_MODE (x) == VOIDmode
8224 && ((CONST_DOUBLE_HIGH (x) == 0
8225 && CONST_DOUBLE_LOW (x) < 0x1000)
8226 || (CONST_DOUBLE_HIGH (x) == -1
8227 && CONST_DOUBLE_LOW (x) < 0
8228 && CONST_DOUBLE_LOW (x) >= -0x1000)))
8229 *total = 0;
8230 else
8231 *total = 8;
8232 return true;
8234 case MEM:
8235 /* If outer-code was a sign or zero extension, a cost
8236 of COSTS_N_INSNS (1) was already added in. This is
8237 why we are subtracting it back out. */
8238 if (outer_code == ZERO_EXTEND)
8240 *total = sparc_costs->int_zload - COSTS_N_INSNS (1);
8242 else if (outer_code == SIGN_EXTEND)
8244 *total = sparc_costs->int_sload - COSTS_N_INSNS (1);
8246 else if (float_mode_p)
8248 *total = sparc_costs->float_load;
8250 else
8252 *total = sparc_costs->int_load;
8255 return true;
8257 case PLUS:
8258 case MINUS:
8259 if (float_mode_p)
8260 *total = sparc_costs->float_plusminus;
8261 else
8262 *total = COSTS_N_INSNS (1);
8263 return false;
8265 case MULT:
8266 if (float_mode_p)
8267 *total = sparc_costs->float_mul;
8268 else if (! TARGET_HARD_MUL)
8269 *total = COSTS_N_INSNS (25);
8270 else
8272 int bit_cost;
8274 bit_cost = 0;
8275 if (sparc_costs->int_mul_bit_factor)
8277 int nbits;
8279 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
8281 unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
8282 for (nbits = 0; value != 0; value &= value - 1)
8283 nbits++;
8285 else if (GET_CODE (XEXP (x, 1)) == CONST_DOUBLE
8286 && GET_MODE (XEXP (x, 1)) == VOIDmode)
8288 rtx x1 = XEXP (x, 1);
8289 unsigned HOST_WIDE_INT value1 = CONST_DOUBLE_LOW (x1);
8290 unsigned HOST_WIDE_INT value2 = CONST_DOUBLE_HIGH (x1);
8292 for (nbits = 0; value1 != 0; value1 &= value1 - 1)
8293 nbits++;
8294 for (; value2 != 0; value2 &= value2 - 1)
8295 nbits++;
8297 else
8298 nbits = 7;
8300 if (nbits < 3)
8301 nbits = 3;
8302 bit_cost = (nbits - 3) / sparc_costs->int_mul_bit_factor;
8303 bit_cost = COSTS_N_INSNS (bit_cost);
8306 if (mode == DImode)
8307 *total = sparc_costs->int_mulX + bit_cost;
8308 else
8309 *total = sparc_costs->int_mul + bit_cost;
8311 return false;
8313 case ASHIFT:
8314 case ASHIFTRT:
8315 case LSHIFTRT:
8316 *total = COSTS_N_INSNS (1) + sparc_costs->shift_penalty;
8317 return false;
8319 case DIV:
8320 case UDIV:
8321 case MOD:
8322 case UMOD:
8323 if (float_mode_p)
8325 if (mode == DFmode)
8326 *total = sparc_costs->float_div_df;
8327 else
8328 *total = sparc_costs->float_div_sf;
8330 else
8332 if (mode == DImode)
8333 *total = sparc_costs->int_divX;
8334 else
8335 *total = sparc_costs->int_div;
8337 return false;
8339 case NEG:
8340 if (! float_mode_p)
8342 *total = COSTS_N_INSNS (1);
8343 return false;
8345 /* FALLTHRU */
8347 case ABS:
8348 case FLOAT:
8349 case UNSIGNED_FLOAT:
8350 case FIX:
8351 case UNSIGNED_FIX:
8352 case FLOAT_EXTEND:
8353 case FLOAT_TRUNCATE:
8354 *total = sparc_costs->float_move;
8355 return false;
8357 case SQRT:
8358 if (mode == DFmode)
8359 *total = sparc_costs->float_sqrt_df;
8360 else
8361 *total = sparc_costs->float_sqrt_sf;
8362 return false;
8364 case COMPARE:
8365 if (float_mode_p)
8366 *total = sparc_costs->float_cmp;
8367 else
8368 *total = COSTS_N_INSNS (1);
8369 return false;
8371 case IF_THEN_ELSE:
8372 if (float_mode_p)
8373 *total = sparc_costs->float_cmove;
8374 else
8375 *total = sparc_costs->int_cmove;
8376 return false;
8378 case IOR:
8379 /* Handle the NAND vector patterns. */
8380 if (sparc_vector_mode_supported_p (GET_MODE (x))
8381 && GET_CODE (XEXP (x, 0)) == NOT
8382 && GET_CODE (XEXP (x, 1)) == NOT)
8384 *total = COSTS_N_INSNS (1);
8385 return true;
8387 else
8388 return false;
8390 default:
8391 return false;
8395 /* Emit the sequence of insns SEQ while preserving the registers REG and REG2.
8396 This is achieved by means of a manual dynamic stack space allocation in
8397 the current frame. We make the assumption that SEQ doesn't contain any
8398 function calls, with the possible exception of calls to the PIC helper. */
8400 static void
8401 emit_and_preserve (rtx seq, rtx reg, rtx reg2)
8403 /* We must preserve the lowest 16 words for the register save area. */
8404 HOST_WIDE_INT offset = 16*UNITS_PER_WORD;
8405 /* We really need only 2 words of fresh stack space. */
8406 HOST_WIDE_INT size = SPARC_STACK_ALIGN (offset + 2*UNITS_PER_WORD);
8408 rtx slot
8409 = gen_rtx_MEM (word_mode, plus_constant (stack_pointer_rtx,
8410 SPARC_STACK_BIAS + offset));
8412 emit_insn (gen_stack_pointer_dec (GEN_INT (size)));
8413 emit_insn (gen_rtx_SET (VOIDmode, slot, reg));
8414 if (reg2)
8415 emit_insn (gen_rtx_SET (VOIDmode,
8416 adjust_address (slot, word_mode, UNITS_PER_WORD),
8417 reg2));
8418 emit_insn (seq);
8419 if (reg2)
8420 emit_insn (gen_rtx_SET (VOIDmode,
8421 reg2,
8422 adjust_address (slot, word_mode, UNITS_PER_WORD)));
8423 emit_insn (gen_rtx_SET (VOIDmode, reg, slot));
8424 emit_insn (gen_stack_pointer_inc (GEN_INT (size)));
8427 /* Output the assembler code for a thunk function. THUNK_DECL is the
8428 declaration for the thunk function itself, FUNCTION is the decl for
8429 the target function. DELTA is an immediate constant offset to be
8430 added to THIS. If VCALL_OFFSET is nonzero, the word at address
8431 (*THIS + VCALL_OFFSET) should be additionally added to THIS. */
8433 static void
8434 sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
8435 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
8436 tree function)
8438 rtx this, insn, funexp;
8439 unsigned int int_arg_first;
8441 reload_completed = 1;
8442 epilogue_completed = 1;
8443 no_new_pseudos = 1;
8444 reset_block_changes ();
8446 emit_note (NOTE_INSN_PROLOGUE_END);
8448 if (flag_delayed_branch)
8450 /* We will emit a regular sibcall below, so we need to instruct
8451 output_sibcall that we are in a leaf function. */
8452 sparc_leaf_function_p = current_function_uses_only_leaf_regs = 1;
8454 /* This will cause final.c to invoke leaf_renumber_regs so we
8455 must behave as if we were in a not-yet-leafified function. */
8456 int_arg_first = SPARC_INCOMING_INT_ARG_FIRST;
8458 else
8460 /* We will emit the sibcall manually below, so we will need to
8461 manually spill non-leaf registers. */
8462 sparc_leaf_function_p = current_function_uses_only_leaf_regs = 0;
8464 /* We really are in a leaf function. */
8465 int_arg_first = SPARC_OUTGOING_INT_ARG_FIRST;
8468 /* Find the "this" pointer. Normally in %o0, but in ARCH64 if the function
8469 returns a structure, the structure return pointer is there instead. */
8470 if (TARGET_ARCH64 && aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
8471 this = gen_rtx_REG (Pmode, int_arg_first + 1);
8472 else
8473 this = gen_rtx_REG (Pmode, int_arg_first);
8475 /* Add DELTA. When possible use a plain add, otherwise load it into
8476 a register first. */
8477 if (delta)
8479 rtx delta_rtx = GEN_INT (delta);
8481 if (! SPARC_SIMM13_P (delta))
8483 rtx scratch = gen_rtx_REG (Pmode, 1);
8484 emit_move_insn (scratch, delta_rtx);
8485 delta_rtx = scratch;
8488 /* THIS += DELTA. */
8489 emit_insn (gen_add2_insn (this, delta_rtx));
8492 /* Add the word at address (*THIS + VCALL_OFFSET). */
8493 if (vcall_offset)
8495 rtx vcall_offset_rtx = GEN_INT (vcall_offset);
8496 rtx scratch = gen_rtx_REG (Pmode, 1);
8498 gcc_assert (vcall_offset < 0);
8500 /* SCRATCH = *THIS. */
8501 emit_move_insn (scratch, gen_rtx_MEM (Pmode, this));
8503 /* Prepare for adding VCALL_OFFSET. The difficulty is that we
8504 may not have any available scratch register at this point. */
8505 if (SPARC_SIMM13_P (vcall_offset))
8507 /* This is the case if ARCH64 (unless -ffixed-g5 is passed). */
8508 else if (! fixed_regs[5]
8509 /* The below sequence is made up of at least 2 insns,
8510 while the default method may need only one. */
8511 && vcall_offset < -8192)
8513 rtx scratch2 = gen_rtx_REG (Pmode, 5);
8514 emit_move_insn (scratch2, vcall_offset_rtx);
8515 vcall_offset_rtx = scratch2;
8517 else
8519 rtx increment = GEN_INT (-4096);
8521 /* VCALL_OFFSET is a negative number whose typical range can be
8522 estimated as -32768..0 in 32-bit mode. In almost all cases
8523 it is therefore cheaper to emit multiple add insns than
8524 spilling and loading the constant into a register (at least
8525 6 insns). */
8526 while (! SPARC_SIMM13_P (vcall_offset))
8528 emit_insn (gen_add2_insn (scratch, increment));
8529 vcall_offset += 4096;
8531 vcall_offset_rtx = GEN_INT (vcall_offset); /* cannot be 0 */
8534 /* SCRATCH = *(*THIS + VCALL_OFFSET). */
8535 emit_move_insn (scratch, gen_rtx_MEM (Pmode,
8536 gen_rtx_PLUS (Pmode,
8537 scratch,
8538 vcall_offset_rtx)));
8540 /* THIS += *(*THIS + VCALL_OFFSET). */
8541 emit_insn (gen_add2_insn (this, scratch));
8544 /* Generate a tail call to the target function. */
8545 if (! TREE_USED (function))
8547 assemble_external (function);
8548 TREE_USED (function) = 1;
8550 funexp = XEXP (DECL_RTL (function), 0);
8552 if (flag_delayed_branch)
8554 funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
8555 insn = emit_call_insn (gen_sibcall (funexp));
8556 SIBLING_CALL_P (insn) = 1;
8558 else
8560 /* The hoops we have to jump through in order to generate a sibcall
8561 without using delay slots... */
8562 rtx spill_reg, spill_reg2, seq, scratch = gen_rtx_REG (Pmode, 1);
8564 if (flag_pic)
8566 spill_reg = gen_rtx_REG (word_mode, 15); /* %o7 */
8567 spill_reg2 = gen_rtx_REG (word_mode, PIC_OFFSET_TABLE_REGNUM);
8568 start_sequence ();
8569 /* Delay emitting the PIC helper function because it needs to
8570 change the section and we are emitting assembly code. */
8571 load_pic_register (true); /* clobbers %o7 */
8572 scratch = legitimize_pic_address (funexp, Pmode, scratch);
8573 seq = get_insns ();
8574 end_sequence ();
8575 emit_and_preserve (seq, spill_reg, spill_reg2);
8577 else if (TARGET_ARCH32)
8579 emit_insn (gen_rtx_SET (VOIDmode,
8580 scratch,
8581 gen_rtx_HIGH (SImode, funexp)));
8582 emit_insn (gen_rtx_SET (VOIDmode,
8583 scratch,
8584 gen_rtx_LO_SUM (SImode, scratch, funexp)));
8586 else /* TARGET_ARCH64 */
8588 switch (sparc_cmodel)
8590 case CM_MEDLOW:
8591 case CM_MEDMID:
8592 /* The destination can serve as a temporary. */
8593 sparc_emit_set_symbolic_const64 (scratch, funexp, scratch);
8594 break;
8596 case CM_MEDANY:
8597 case CM_EMBMEDANY:
8598 /* The destination cannot serve as a temporary. */
8599 spill_reg = gen_rtx_REG (DImode, 15); /* %o7 */
8600 start_sequence ();
8601 sparc_emit_set_symbolic_const64 (scratch, funexp, spill_reg);
8602 seq = get_insns ();
8603 end_sequence ();
8604 emit_and_preserve (seq, spill_reg, 0);
8605 break;
8607 default:
8608 gcc_unreachable ();
8612 emit_jump_insn (gen_indirect_jump (scratch));
8615 emit_barrier ();
8617 /* Run just enough of rest_of_compilation to get the insns emitted.
8618 There's not really enough bulk here to make other passes such as
8619 instruction scheduling worth while. Note that use_thunk calls
8620 assemble_start_function and assemble_end_function. */
8621 insn = get_insns ();
8622 insn_locators_initialize ();
8623 shorten_branches (insn);
8624 final_start_function (insn, file, 1);
8625 final (insn, file, 1);
8626 final_end_function ();
8628 reload_completed = 0;
8629 epilogue_completed = 0;
8630 no_new_pseudos = 0;
8633 /* Return true if sparc_output_mi_thunk would be able to output the
8634 assembler code for the thunk function specified by the arguments
8635 it is passed, and false otherwise. */
8636 static bool
8637 sparc_can_output_mi_thunk (tree thunk_fndecl ATTRIBUTE_UNUSED,
8638 HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
8639 HOST_WIDE_INT vcall_offset,
8640 tree function ATTRIBUTE_UNUSED)
8642 /* Bound the loop used in the default method above. */
8643 return (vcall_offset >= -32768 || ! fixed_regs[5]);
8646 /* How to allocate a 'struct machine_function'. */
8648 static struct machine_function *
8649 sparc_init_machine_status (void)
8651 return ggc_alloc_cleared (sizeof (struct machine_function));
8654 /* Locate some local-dynamic symbol still in use by this function
8655 so that we can print its name in local-dynamic base patterns. */
8657 static const char *
8658 get_some_local_dynamic_name (void)
8660 rtx insn;
8662 if (cfun->machine->some_ld_name)
8663 return cfun->machine->some_ld_name;
8665 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
8666 if (INSN_P (insn)
8667 && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
8668 return cfun->machine->some_ld_name;
8670 gcc_unreachable ();
8673 static int
8674 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
8676 rtx x = *px;
8678 if (x
8679 && GET_CODE (x) == SYMBOL_REF
8680 && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
8682 cfun->machine->some_ld_name = XSTR (x, 0);
8683 return 1;
8686 return 0;
8689 /* Handle the TARGET_DWARF_HANDLE_FRAME_UNSPEC hook.
8690 This is called from dwarf2out.c to emit call frame instructions
8691 for frame-related insns containing UNSPECs and UNSPEC_VOLATILEs. */
8692 static void
8693 sparc_dwarf_handle_frame_unspec (const char *label,
8694 rtx pattern ATTRIBUTE_UNUSED,
8695 int index ATTRIBUTE_UNUSED)
8697 gcc_assert (index == UNSPECV_SAVEW);
8698 dwarf2out_window_save (label);
8701 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
8702 We need to emit DTP-relative relocations. */
8704 static void
8705 sparc_output_dwarf_dtprel (FILE *file, int size, rtx x)
8707 switch (size)
8709 case 4:
8710 fputs ("\t.word\t%r_tls_dtpoff32(", file);
8711 break;
8712 case 8:
8713 fputs ("\t.xword\t%r_tls_dtpoff64(", file);
8714 break;
8715 default:
8716 gcc_unreachable ();
8718 output_addr_const (file, x);
8719 fputs (")", file);
8722 /* Do whatever processing is required at the end of a file. */
8724 static void
8725 sparc_file_end (void)
8727 /* If we haven't emitted the special PIC helper function, do so now. */
8728 if (pic_helper_symbol_name[0] && !pic_helper_emitted_p)
8729 emit_pic_helper ();
8731 if (NEED_INDICATE_EXEC_STACK)
8732 file_end_indicate_exec_stack ();
8735 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
8736 /* Implement TARGET_MANGLE_FUNDAMENTAL_TYPE. */
8738 static const char *
8739 sparc_mangle_fundamental_type (tree type)
8741 if (!TARGET_64BIT
8742 && TYPE_MAIN_VARIANT (type) == long_double_type_node
8743 && TARGET_LONG_DOUBLE_128)
8744 return "g";
8746 /* For all other types, use normal C++ mangling. */
8747 return NULL;
8749 #endif
8751 #include "gt-sparc.h"