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,
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2, or (at your option)
15 GCC is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING. If not, write to
22 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
23 Boston, MA 02110-1301, USA. */
27 #include "coretypes.h"
32 #include "hard-reg-set.h"
34 #include "insn-config.h"
35 #include "insn-codes.h"
36 #include "conditions.h"
38 #include "insn-attr.h"
49 #include "target-def.h"
50 #include "cfglayout.h"
51 #include "tree-gimple.h"
52 #include "langhooks.h"
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 */
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 */
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 */
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 */
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 */
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
208 #define LEAF_SIBCALL_SLOT_RESERVED_P \
209 ((TARGET_ARCH64 && !TARGET_CM_MEDLOW) || flag_pic)
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,
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. */
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
);
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
);
374 #ifdef SUBTARGET_ATTRIBUTE_TABLE
375 const struct attribute_spec sparc_attribute_table
[];
378 /* Option handling. */
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 },
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"
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
450 #undef TARGET_HAVE_TLS
451 #define TARGET_HAVE_TLS true
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
512 #ifdef SUBTARGET_ATTRIBUTE_TABLE
513 #undef TARGET_ATTRIBUTE_TABLE
514 #define TARGET_ATTRIBUTE_TABLE sparc_attribute_table
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
526 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
527 #define TARGET_ASM_OUTPUT_DWARF_DTPREL sparc_output_dwarf_dtprel
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
538 struct gcc_target targetm
= TARGET_INITIALIZER
;
540 /* Implement TARGET_HANDLE_OPTION. */
543 sparc_handle_option (size_t code
, const char *arg
, int value ATTRIBUTE_UNUSED
)
548 case OPT_mhard_float
:
549 case OPT_msoft_float
:
550 fpu_option_set
= true;
554 sparc_select
[1].string
= arg
;
558 sparc_select
[2].string
= arg
;
565 /* Validate and override various options, and do some machine dependent
569 sparc_override_options (void)
571 static struct code_model
{
572 const char *const name
;
574 } const cmodels
[] = {
576 { "medlow", CM_MEDLOW
},
577 { "medmid", CM_MEDMID
},
578 { "medany", CM_MEDANY
},
579 { "embmedany", CM_EMBMEDANY
},
582 const struct code_model
*cmodel
;
583 /* Map TARGET_CPU_DEFAULT to value for -m{arch,tune}=. */
584 static struct cpu_default
{
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" },
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
;
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
,
622 { "sparclet", PROCESSOR_SPARCLET
, MASK_ISA
, MASK_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
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
},
636 const struct cpu_table
*cpu
;
637 const struct sparc_cpu_select
*sel
;
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");
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
;
659 sparc_cmodel
= CM_32
;
662 if (sparc_cmodel_string
!= NULL
)
666 for (cmodel
= &cmodels
[0]; cmodel
->name
; cmodel
++)
667 if (strcmp (sparc_cmodel_string
, cmodel
->name
) == 0)
669 if (cmodel
->name
== NULL
)
670 error ("bad value (%s) for -mcmodel= switch", sparc_cmodel_string
);
672 sparc_cmodel
= cmodel
->value
;
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
)
684 gcc_assert (def
->name
);
685 sparc_select
[0].string
= def
->name
;
687 for (sel
= &sparc_select
[0]; sel
->name
; ++sel
)
691 for (cpu
= &cpu_table
[0]; cpu
->name
; ++cpu
)
692 if (! strcmp (sel
->string
, cpu
->name
))
695 sparc_cpu
= cpu
->processor
;
699 target_flags
&= ~cpu
->disable
;
700 target_flags
|= cpu
->enable
;
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. */
713 target_flags
= (target_flags
& ~MASK_FPU
) | fpu
;
715 /* Don't allow -mvis if FPU is disabled. */
717 target_flags
&= ~MASK_VIS
;
719 /* -mvis assumes UltraSPARC+, so we are sure v9 instructions
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. */
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. */
752 targetm
.asm_out
.unaligned_op
.di
= NULL
;
754 /* Do various machine dependent initializations. */
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
;
767 case PROCESSOR_CYPRESS
:
768 sparc_costs
= &cypress_costs
;
771 case PROCESSOR_SPARCLITE
:
772 case PROCESSOR_SUPERSPARC
:
773 sparc_costs
= &supersparc_costs
;
777 case PROCESSOR_HYPERSPARC
:
778 case PROCESSOR_SPARCLITE86X
:
779 sparc_costs
= &hypersparc_costs
;
781 case PROCESSOR_SPARCLET
:
782 case PROCESSOR_TSC701
:
783 sparc_costs
= &sparclet_costs
;
786 case PROCESSOR_ULTRASPARC
:
787 sparc_costs
= &ultrasparc_costs
;
789 case PROCESSOR_ULTRASPARC3
:
790 sparc_costs
= &ultrasparc3_costs
;
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
}
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. */
824 if (GET_CODE (op
) == CONST_DOUBLE
)
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
);
837 /* Nonzero if OP is a floating point constant which can
838 be loaded into an integer register using a single
844 if (GET_CODE (op
) == CONST_DOUBLE
)
849 REAL_VALUE_FROM_CONST_DOUBLE (r
, op
);
850 REAL_VALUE_TO_TARGET_SINGLE (r
, i
);
851 return SPARC_SIMM13_P (i
);
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
)
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
);
880 /* Expand a move instruction. Return true if all work is done. */
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
))
892 if (!reload_in_progress
)
894 operands
[0] = validize_mem (operands
[0]);
895 operands
[1] = force_reg (mode
, operands
[1]);
899 /* Fixup TLS cases. */
901 && CONSTANT_P (operands
[1])
902 && GET_CODE (operands
[1]) != HIGH
903 && sparc_tls_referenced_p (operands
[1]))
905 rtx sym
= operands
[1];
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
);
919 sym
= gen_rtx_PLUS (mode
, sym
, addend
);
920 sym
= force_operand (sym
, operands
[0]);
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]));
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]));
944 if (symbolic_operand (operands
[1], mode
))
946 operands
[1] = legitimize_pic_address (operands
[1],
948 (reload_in_progress
?
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
))
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. */
978 /* And any DF constant in integer registers. */
980 && (reload_completed
|| reload_in_progress
))))
983 operands
[1] = force_const_mem (mode
, operands
[1]);
984 if (!reload_in_progress
)
985 operands
[1] = validize_mem (operands
[1]);
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
))
998 /* All QImode constants require only one insn, so proceed. */
1003 sparc_emit_set_const32 (operands
[0], operands
[1]);
1007 /* input_operand should have filtered out 32-bit mode. */
1008 sparc_emit_set_const64 (operands
[0], operands
[1]);
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. */
1023 sparc_emit_set_const32 (rtx op0
, rtx op1
)
1025 enum machine_mode mode
= GET_MODE (op0
);
1028 if (reload_in_progress
|| reload_completed
)
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
,
1047 gen_rtx_IOR (mode
, temp
,
1048 GEN_INT (INTVAL (op1
) & 0x3ff))));
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). */
1068 sparc_emit_set_symbolic_const64 (rtx op0
, rtx op1
, rtx temp
)
1070 rtx temp1
, temp2
, temp3
, temp4
, temp5
;
1073 if (temp
&& GET_MODE (temp
) == TImode
)
1076 temp
= gen_rtx_REG (DImode
, REGNO (temp
));
1079 /* SPARC-V9 code-model support. */
1080 switch (sparc_cmodel
)
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
1091 sethi %hi(symbol), %temp1
1092 or %temp1, %lo(symbol), %reg */
1094 temp1
= temp
; /* op0 is allowed. */
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
)));
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
1111 sethi %h44(symbol), %temp1
1112 or %temp1, %m44(symbol), %temp2
1113 sllx %temp2, 12, %temp3
1114 or %temp3, %l44(symbol), %reg */
1119 temp3
= temp
; /* op0 is allowed. */
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
));
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
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 */
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);
1161 temp2
= temp
; /* op0 is _not_ allowed, see above. */
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
));
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
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
)))
1200 temp1
= temp
; /* op0 is allowed. */
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 */
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);
1233 temp2
= temp
; /* op0 is _not_ allowed, see above. */
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
));
1263 #if HOST_BITS_PER_WIDE_INT == 32
1265 sparc_emit_set_const64 (rtx op0 ATTRIBUTE_UNUSED
, rtx op1 ATTRIBUTE_UNUSED
)
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. */
1284 gen_safe_HIGH64 (rtx dest
, HOST_WIDE_INT val
)
1286 return gen_rtx_SET (VOIDmode
, dest
, GEN_INT (val
& ~(HOST_WIDE_INT
)0x3ff));
1290 gen_safe_SET64 (rtx dest
, HOST_WIDE_INT val
)
1292 return gen_rtx_SET (VOIDmode
, dest
, GEN_INT (val
));
1296 gen_safe_OR64 (rtx src
, HOST_WIDE_INT val
)
1298 return gen_rtx_IOR (DImode
, src
, GEN_INT (val
));
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
1315 static void sparc_emit_set_const64_quick1 (rtx
, rtx
,
1316 unsigned HOST_WIDE_INT
, int);
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
;
1325 high_bits
= (~low_bits
) & 0xffffffff;
1327 high_bits
= low_bits
;
1329 emit_insn (gen_safe_HIGH64 (temp
, high_bits
));
1332 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
1333 gen_safe_OR64 (temp
, (high_bits
& 0x3ff))));
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
)));
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);
1359 sparc_emit_set_const64_quick2 (rtx op0
, rtx temp
,
1360 unsigned HOST_WIDE_INT high_bits
,
1361 unsigned HOST_WIDE_INT low_immediate
,
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))));
1377 emit_insn (gen_safe_SET64 (temp
, high_bits
));
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. */
1399 sparc_emit_set_const64_longway (rtx op0
, rtx temp
,
1400 unsigned HOST_WIDE_INT high_bits
,
1401 unsigned HOST_WIDE_INT low_bits
)
1405 if (reload_in_progress
|| reload_completed
)
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
,
1416 gen_safe_OR64 (temp
, (high_bits
& 0x3ff))));
1422 emit_insn (gen_safe_SET64 (temp
, high_bits
));
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
,
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
)));
1446 emit_insn (gen_rtx_SET (VOIDmode
, op0
,
1447 gen_rtx_PLUS (DImode
, temp4
, temp2
)));
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);
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
)));
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
)));
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
)));
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 *);
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
;
1511 lowest_bit_set
= highest_bit_set
= -1;
1515 if ((lowest_bit_set
== -1)
1516 && ((low_bits
>> i
) & 1))
1518 if ((highest_bit_set
== -1)
1519 && ((high_bits
>> (32 - i
- 1)) & 1))
1520 highest_bit_set
= (64 - i
- 1);
1523 && ((highest_bit_set
== -1)
1524 || (lowest_bit_set
== -1)));
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;
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
++)
1549 if ((low_bits
& (1 << i
)) != 0)
1554 if ((high_bits
& (1 << (i
- 32))) != 0)
1557 all_bits_between_are_set
= 0;
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
);
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
;
1574 || high_bits
== 0xffffffff)
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)
1586 if ((highest_bit_set
- lowest_bit_set
) < 21)
1592 static unsigned HOST_WIDE_INT
create_simple_focus_bits (unsigned HOST_WIDE_INT
,
1593 unsigned HOST_WIDE_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
);
1611 hi
= ((high_bits
>> (lowest_bit_set
- 32)) << shift
);
1613 gcc_assert (! (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. */
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
;
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
)
1637 if (GET_CODE (op1
) != CONST_INT
)
1639 sparc_emit_set_symbolic_const64 (op0
, op1
, 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:
1661 * sllx %reg, shift, %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)
1680 create_simple_focus_bits (high_bits
, low_bits
,
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
));
1691 emit_insn (gen_rtx_SET (VOIDmode
,
1693 gen_rtx_ASHIFT (DImode
,
1697 emit_insn (gen_rtx_SET (VOIDmode
,
1699 gen_rtx_LSHIFTRT (DImode
,
1701 GEN_INT (-shift
))));
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
,
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
,
1731 gen_rtx_ASHIFT (DImode
, temp
,
1732 GEN_INT (lowest_bit_set
- 10))));
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
1742 || high_bits
== 0xffffffff)
1744 sparc_emit_set_const64_quick1 (op0
, temp
, low_bits
,
1745 (high_bits
== 0xffffffff));
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
1757 sparc_emit_set_const64_quick2 (op0
, temp
, high_bits
, 0, 32);
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
));
1782 sparc_emit_set_const64 (temp
, GEN_INT (fast_int
));
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
)));
1802 emit_insn (gen_rtx_SET (VOIDmode
,
1804 gen_safe_XOR64 (temp
,
1805 (-0x400 | trailing_bits
))));
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
,
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
,
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);
1846 /* The easiest way when all else fails, is full decomposition. */
1848 printf ("sparc_emit_set_const64: Hard constant [%08lx%08lx] neg[%08lx%08lx]\n",
1849 high_bits
, low_bits
, ~high_bits
, ~low_bits
);
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. */
1862 select_cc_mode (enum rtx_code op
, rtx x
, rtx y ATTRIBUTE_UNUSED
)
1864 if (GET_MODE_CLASS (GET_MODE (x
)) == MODE_FLOAT
)
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
;
1900 if (TARGET_ARCH64
&& GET_MODE (x
) == DImode
)
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
);
1916 if (sparc_compare_emitted
!= NULL_RTX
)
1918 cc_reg
= sparc_compare_emitted
;
1919 sparc_compare_emitted
= NULL_RTX
;
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
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 */
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
)
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
);
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
);
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
)));
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
1984 (gt (reg:CCX 100 %icc)
1988 (gt:DI (reg:CCX 100 %icc)
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
)
2004 && (GET_MODE (sparc_compare_op0
) == DImode
2005 || GET_MODE (operands
[0]) == DImode
))
2008 op0
= sparc_compare_op0
;
2009 op1
= sparc_compare_op1
;
2011 /* Try to use the movrCC insns. */
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
,
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);
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
,
2059 operands
[1] = gen_compare_reg (compare_code
, op0
, op1
);
2061 switch (GET_MODE (operands
[1]))
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])));
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. */
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
,
2092 gen_rtx_IF_THEN_ELSE (VOIDmode
,
2093 gen_rtx_fmt_ee (code
, GET_MODE (op0
),
2095 gen_rtx_LABEL_REF (VOIDmode
, label
),
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. */
2118 emit_soft_tfmode_libcall (const char *func_name
, int nargs
, rtx
*operands
)
2120 rtx ret_slot
= NULL
, arg
[3], func_sym
;
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
];
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);
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. */
2155 emit_move_insn (this_slot
, this_arg
);
2157 ret_slot
= this_slot
;
2159 this_arg
= XEXP (this_slot
, 0);
2166 func_sym
= gen_rtx_SYMBOL_REF (Pmode
, func_name
);
2168 if (GET_MODE (operands
[0]) == TFmode
)
2171 emit_library_call (func_sym
, LCT_NORMAL
, VOIDmode
, 2,
2172 arg
[0], GET_MODE (arg
[0]),
2173 arg
[1], GET_MODE (arg
[1]));
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]));
2181 emit_move_insn (operands
[0], ret_slot
);
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. */
2201 emit_soft_tfmode_binop (enum rtx_code code
, rtx
*operands
)
2223 emit_soft_tfmode_libcall (func
, 3, operands
);
2227 emit_soft_tfmode_unop (enum rtx_code code
, rtx
*operands
)
2231 gcc_assert (code
== SQRT
);
2234 emit_soft_tfmode_libcall (func
, 2, operands
);
2238 emit_soft_tfmode_cvt (enum rtx_code code
, rtx
*operands
)
2245 switch (GET_MODE (operands
[1]))
2258 case FLOAT_TRUNCATE
:
2259 switch (GET_MODE (operands
[0]))
2273 switch (GET_MODE (operands
[1]))
2286 case UNSIGNED_FLOAT
:
2287 switch (GET_MODE (operands
[1]))
2301 switch (GET_MODE (operands
[0]))
2315 switch (GET_MODE (operands
[0]))
2332 emit_soft_tfmode_libcall (func
, 2, operands
);
2335 /* Expand a hard-float tfmode operation. All arguments must be in
2339 emit_hard_tfmode_operation (enum rtx_code code
, rtx
*operands
)
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]);
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
))
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
);
2368 emit_tfmode_binop (enum rtx_code code
, rtx
*operands
)
2370 if (TARGET_HARD_QUAD
)
2371 emit_hard_tfmode_operation (code
, operands
);
2373 emit_soft_tfmode_binop (code
, operands
);
2377 emit_tfmode_unop (enum rtx_code code
, rtx
*operands
)
2379 if (TARGET_HARD_QUAD
)
2380 emit_hard_tfmode_operation (code
, operands
);
2382 emit_soft_tfmode_unop (code
, operands
);
2386 emit_tfmode_cvt (enum rtx_code code
, rtx
*operands
)
2388 if (TARGET_HARD_QUAD
)
2389 emit_hard_tfmode_operation (code
, operands
);
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
)
2402 /* If no previous instruction (should not happen), return true. */
2403 if (PREV_INSN (insn
) == NULL
)
2406 seq
= NEXT_INSN (PREV_INSN (insn
));
2407 if (GET_CODE (PATTERN (seq
)) == SEQUENCE
)
2413 /* Return nonzero if TRIAL can go into the call delay slot. */
2416 tls_call_delay (rtx trial
)
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
)
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)))
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
))
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'
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
)))
2467 return GET_MODE_SIZE (GET_MODE (src
)) <= GET_MODE_SIZE (DImode
);
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
))
2481 /* The 'restore src,%g0,dest' pattern for double if no FPU. */
2482 else if (! TARGET_FPU
&& TARGET_ARCH64
&& register_operand (src
, DFmode
))
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
))
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
))
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
))
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
))
2510 && register_operand (XEXP (src
, 0), DImode
)
2511 && immediate_operand (XEXP (src
, 1), DImode
))))
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
)
2524 /* Return nonzero if TRIAL can go into the function return's
2528 eligible_for_return_delay (rtx trial
)
2532 if (GET_CODE (trial
) != INSN
|| GET_CODE (PATTERN (trial
)) != SET
)
2535 if (get_attr_length (trial
) != 1)
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. */
2543 /* If the function uses __builtin_eh_return, the eh_return machinery
2544 occupies the delay slot. */
2545 if (current_function_calls_eh_return
)
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))
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
2564 if (REGNO (SET_DEST (pat
)) >= 32)
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
2577 eligible_for_sibcall_delay (rtx trial
)
2581 if (GET_CODE (trial
) != INSN
|| GET_CODE (PATTERN (trial
)) != SET
)
2584 if (get_attr_length (trial
) != 1)
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
)
2596 /* %g1 is used to build the function address */
2597 if (reg_mentioned_p (gen_rtx_REG (Pmode
, 1), pat
))
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)
2610 /* If it mentions %o7, it can't go in, because sibcall will clobber it
2612 if (reg_mentioned_p (gen_rtx_REG (Pmode
, 15), pat
))
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)
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
)])
2643 code
= GET_CODE (insn
);
2644 if (GET_CODE (insn
) == CODE_LABEL
)
2649 rtx set
= single_set (insn
);
2650 int in_src
= set
&& reg_overlap_mentioned_p (reg
, SET_SRC (set
));
2653 if (set
&& reg_overlap_mentioned_p (reg
, SET_DEST (set
)))
2655 if (set
== 0 && reg_overlap_mentioned_p (reg
, PATTERN (insn
)))
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). */
2668 sparc_cannot_force_const_mem (rtx x
)
2670 switch (GET_CODE (x
))
2675 /* Accept all non-symbolic constants. */
2679 /* Labels are OK iff we are non-PIC. */
2680 return flag_pic
!= 0;
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
))
2688 return flag_pic
!= 0;
2691 return sparc_cannot_force_const_mem (XEXP (x
, 0));
2694 return sparc_cannot_force_const_mem (XEXP (x
, 0))
2695 || sparc_cannot_force_const_mem (XEXP (x
, 1));
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. */
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))
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)))
2746 /* Determine if a given RTX is a valid constant. We already know this
2747 satisfies CONSTANT_P. */
2750 legitimate_constant_p (rtx x
)
2754 switch (GET_CODE (x
))
2757 /* TLS symbols are not constant. */
2758 if (SYMBOL_REF_TLS_MODEL (x
))
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)))
2773 if (GET_MODE (x
) == VOIDmode
)
2776 /* Floating point constants are generally not ok.
2777 The only exception is 0.0 in VIS. */
2779 && SCALAR_FLOAT_MODE_P (GET_MODE (x
))
2780 && const_zero_operand (x
, GET_MODE (x
)))
2786 /* Vector constants are generally not ok.
2787 The only exception is 0 in VIS. */
2789 && const_zero_operand (x
, GET_MODE (x
)))
2801 /* Determine if a given RTX is a valid constant address. */
2804 constant_address_p (rtx x
)
2806 switch (GET_CODE (x
))
2814 if (flag_pic
&& pic_address_needs_scratch (x
))
2816 return legitimate_constant_p (x
);
2819 return !flag_pic
&& legitimate_constant_p (x
);
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. */
2831 legitimate_pic_operand_p (rtx x
)
2833 if (pic_address_needs_scratch (x
))
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))))
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
)
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. */
2861 && GET_CODE (rs1
) != SUBREG
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);
2871 && rs1
== pic_offset_table_rtx
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
)))
2880 || GET_CODE (rs1
) == SUBREG
)
2881 && RTX_OK_FOR_OFFSET_P (rs2
)))
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. */
2896 && ! (TARGET_FPU
&& TARGET_ARCH64
&& TARGET_HARD_QUAD
))
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
2903 if (TARGET_ARCH32
&& !optimize
2904 && (mode
== DFmode
|| mode
== DImode
))
2907 else if (USE_AS_OFFSETABLE_LO10
2908 && GET_CODE (rs1
) == LO_SUM
2910 && ! TARGET_CM_MEDMID
2911 && RTX_OK_FOR_OLO10_P (rs2
))
2914 imm1
= XEXP (rs1
, 1);
2915 rs1
= XEXP (rs1
, 0);
2916 if (! CONSTANT_P (imm1
) || SPARC_SYMBOL_REF_TLS_P (rs1
))
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
))
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
)
2933 else if (GET_CODE (addr
) == CONST_INT
&& SMALL_INT (addr
))
2938 if (GET_CODE (rs1
) == SUBREG
)
2939 rs1
= SUBREG_REG (rs1
);
2945 if (GET_CODE (rs2
) == SUBREG
)
2946 rs2
= SUBREG_REG (rs2
);
2953 if (!REGNO_OK_FOR_BASE_P (REGNO (rs1
))
2954 || (rs2
&& !REGNO_OK_FOR_BASE_P (REGNO (rs2
))))
2959 if ((REGNO (rs1
) >= 32
2960 && REGNO (rs1
) != FRAME_POINTER_REGNUM
2961 && REGNO (rs1
) < FIRST_PSEUDO_REGISTER
)
2963 && (REGNO (rs2
) >= 32
2964 && REGNO (rs2
) != FRAME_POINTER_REGNUM
2965 && REGNO (rs2
) < FIRST_PSEUDO_REGISTER
)))
2971 /* Construct the SYMBOL_REF for the tls_get_offset function. */
2973 static GTY(()) rtx sparc_tls_symbol
;
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
;
2985 sparc_tls_got (void)
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
);
3001 /* Return 1 if *X is a thread-local symbol. */
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. */
3012 sparc_tls_referenced_p (rtx x
)
3014 if (!TARGET_HAVE_TLS
)
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
:
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
));
3044 emit_insn (gen_tgd_add32 (o0
, got
, temp2
, addr
));
3045 insn
= emit_call_insn (gen_tgd_call32 (o0
, sparc_tls_get_addr (),
3050 emit_insn (gen_tgd_add64 (o0
, got
, temp2
, addr
));
3051 insn
= emit_call_insn (gen_tgd_call64 (o0
, sparc_tls_get_addr (),
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 ();
3059 emit_libcall_block (insn
, ret
, o0
, addr
);
3062 case TLS_MODEL_LOCAL_DYNAMIC
:
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
));
3074 emit_insn (gen_tldm_add32 (o0
, got
, temp2
));
3075 insn
= emit_call_insn (gen_tldm_call32 (o0
, sparc_tls_get_addr (),
3080 emit_insn (gen_tldm_add64 (o0
, got
, temp2
));
3081 insn
= emit_call_insn (gen_tldm_call64 (o0
, sparc_tls_get_addr (),
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 ();
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
));
3097 emit_insn (gen_tldo_add32 (ret
, temp3
, temp2
, addr
));
3099 emit_insn (gen_tldo_add64 (ret
, temp3
, temp2
, addr
));
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
));
3110 emit_insn (gen_tie_ld32 (temp3
, got
, temp2
, addr
));
3112 emit_insn (gen_tie_ld64 (temp3
, got
, temp2
, addr
));
3115 ret
= gen_reg_rtx (Pmode
);
3117 emit_insn (gen_tie_add32 (ret
, gen_rtx_REG (Pmode
, 7),
3120 emit_insn (gen_tie_add64 (ret
, gen_rtx_REG (Pmode
, 7),
3124 ret
= gen_rtx_PLUS (Pmode
, gen_rtx_REG (Pmode
, 7), temp3
);
3127 case TLS_MODEL_LOCAL_EXEC
:
3128 temp1
= gen_reg_rtx (Pmode
);
3129 temp2
= gen_reg_rtx (Pmode
);
3132 emit_insn (gen_tle_hix22_sp32 (temp1
, addr
));
3133 emit_insn (gen_tle_lox10_sp32 (temp2
, temp1
, addr
));
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
);
3148 gcc_unreachable (); /* for now ... */
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
3160 legitimize_pic_address (rtx orig
, enum machine_mode mode ATTRIBUTE_UNUSED
,
3163 if (GET_CODE (orig
) == SYMBOL_REF
)
3165 rtx pic_ref
, address
;
3170 gcc_assert (! reload_in_progress
&& ! reload_completed
);
3171 reg
= gen_reg_rtx (Pmode
);
3176 /* If not during reload, allocate another temp reg here for loading
3177 in the address, so that these instructions can be optimized
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. */
3188 emit_insn (gen_movdi_high_pic (temp_reg
, orig
));
3189 emit_insn (gen_movdi_lo_sum_pic (temp_reg
, temp_reg
, orig
));
3193 emit_insn (gen_movsi_high_pic (temp_reg
, orig
));
3194 emit_insn (gen_movsi_lo_sum_pic (temp_reg
, temp_reg
, 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
3208 REG_NOTES (insn
) = gen_rtx_EXPR_LIST (REG_EQUAL
, orig
,
3212 else if (GET_CODE (orig
) == CONST
)
3216 if (GET_CODE (XEXP (orig
, 0)) == PLUS
3217 && XEXP (XEXP (orig
, 0), 0) == pic_offset_table_rtx
)
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
);
3238 /* If we reach here, then something is seriously wrong. */
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;
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
)
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
),
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
))
3281 if (SPARC_SYMBOL_REF_TLS_P (x
))
3282 x
= legitimize_tls_address (x
);
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
);
3298 /* Emit the special PIC helper function. */
3301 emit_pic_helper (void)
3303 const char *pic_name
= reg_names
[REGNO (pic_offset_table_rtx
)];
3308 align
= floor_log2 (FUNCTION_BOUNDARY
/ BITS_PER_UNIT
);
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
);
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. */
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
)
3344 emit_insn (gen_load_pcrel_symdi (pic_offset_table_rtx
, global_offset_table
,
3345 pic_helper_symbol
));
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
)
3371 if (!TARGET_UNALIGNED_DOUBLES
3372 && MEM_ALIGN (mem
) / BITS_PER_UNIT
>= (unsigned)desired
)
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
3389 if (GET_CODE (XEXP (addr
, 1)) == CONST_INT
)
3390 offset
= XEXP (addr
, 1);
3392 offset
= const0_rtx
;
3395 else if (GET_CODE (addr
) == REG
)
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. */
3413 && REGNO_POINTER_ALIGN (regno
) >= desired
* BITS_PER_UNIT
)
3414 || (optimize
&& reload_completed
))
3415 && (INTVAL (offset
) & (desired
- 1)) == 0)
3420 if (((INTVAL (offset
) - SPARC_STACK_BIAS
) & (desired
- 1)) == 0)
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. */
3434 /* An obviously unaligned address. */
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
,
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,
3526 CCFP_MODES
, CCFP_MODES
, CCFP_MODES
, CCFP_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,
3551 CCFP_MODES
, CCFP_MODES
, CCFP_MODES
, CCFP_MODES
,
3557 int sparc_mode_class
[NUM_MACHINE_MODES
];
3559 enum reg_class sparc_regno_reg_class
[FIRST_PSEUDO_REGISTER
];
3562 sparc_init_modes (void)
3566 for (i
= 0; i
< NUM_MACHINE_MODES
; i
++)
3568 switch (GET_MODE_CLASS (i
))
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
;
3582 sparc_mode_class
[i
] = 0;
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
;
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
;
3601 sparc_mode_class
[i
] = 0;
3604 if (i
== (int) CCFPmode
|| i
== (int) CCFPEmode
)
3605 sparc_mode_class
[i
] = 1 << (int) CCFP_MODE
;
3607 sparc_mode_class
[i
] = 1 << (int) CC_MODE
;
3610 sparc_mode_class
[i
] = 0;
3616 hard_regno_mode_classes
= hard_64bit_mode_classes
;
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
;
3628 sparc_regno_reg_class
[i
] = FP_REGS
;
3630 sparc_regno_reg_class
[i
] = EXTRA_FP_REGS
;
3632 sparc_regno_reg_class
[i
] = FPCC_REGS
;
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. */
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. */
3651 for (i
= 0; i
< 8; i
++)
3652 if (regs_ever_live
[i
] && ! call_used_regs
[i
])
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]))
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]))
3668 /* Set up values for use in prologue and epilogue. */
3669 num_gfregs
= n_regs
;
3674 && current_function_outgoing_args_size
== 0)
3675 actual_fsize
= apparent_fsize
= 0;
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. */
3696 sparc_output_scratch_registers (FILE *file ATTRIBUTE_UNUSED
)
3698 #ifdef HAVE_AS_REGISTER_PSEUDO_OP
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
);
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. */
3724 #define SORR_RESTORE 1
3727 save_or_restore_regs (int low
, int high
, rtx base
, int offset
, int action
)
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
);
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
;
3762 mode
= i
< 32 ? DImode
: DFmode
;
3767 mode
= i
< 32 ? SImode
: SFmode
;
3772 mode
= i
< 32 ? SImode
: SFmode
;
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;
3797 /* Emit code to save call-saved registers. */
3800 emit_save_or_restore_regs (int action
)
3802 HOST_WIDE_INT offset
;
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
3815 base
= gen_rtx_REG (Pmode
, 1);
3816 emit_move_insn (base
, GEN_INT (offset
));
3817 emit_insn (gen_rtx_SET (VOIDmode
,
3819 gen_rtx_PLUS (Pmode
, frame_base_reg
, base
)));
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. */
3832 gen_save_register_window (rtx increment
)
3835 return gen_save_register_windowdi (increment
);
3837 return gen_save_register_windowsi (increment
);
3840 /* Generate an increment for the stack pointer. */
3843 gen_stack_pointer_inc (rtx increment
)
3845 return gen_rtx_SET (VOIDmode
,
3847 gen_rtx_PLUS (Pmode
,
3852 /* Generate a decrement for the stack pointer. */
3855 gen_stack_pointer_dec (rtx decrement
)
3857 return gen_rtx_SET (VOIDmode
,
3859 gen_rtx_MINUS (Pmode
,
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. */
3869 sparc_expand_prologue (void)
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). */
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
;
3914 frame_base_reg
= hard_frame_pointer_rtx
;
3915 frame_base_offset
= SPARC_STACK_BIAS
;
3918 if (actual_fsize
== 0)
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;
3930 = emit_insn (gen_stack_pointer_inc (GEN_INT (4096-actual_fsize
)));
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
));
3938 gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR
,
3939 gen_stack_pointer_inc (GEN_INT (-actual_fsize
)),
3943 RTX_FRAME_RELATED_P (insn
) = 1;
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
)));
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;
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. */
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. */
3991 sparc_expand_epilogue (void)
3994 emit_save_or_restore_regs (SORR_RESTORE
);
3996 if (actual_fsize
== 0)
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
)));
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. */
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. */
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
);
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. */
4056 output_restore (rtx pat
)
4062 fputs ("\t restore\n", asm_out_file
);
4066 gcc_assert (GET_CODE (pat
) == SET
);
4068 operands
[0] = SET_DEST (pat
);
4069 pat
= SET_SRC (pat
);
4071 switch (GET_CODE (pat
))
4074 operands
[1] = XEXP (pat
, 0);
4075 operands
[2] = XEXP (pat
, 1);
4076 output_asm_insn (" restore %r1, %2, %Y0", operands
);
4079 operands
[1] = XEXP (pat
, 0);
4080 operands
[2] = XEXP (pat
, 1);
4081 output_asm_insn (" restore %r1, %%lo(%a2), %Y0", operands
);
4084 operands
[1] = XEXP (pat
, 0);
4085 gcc_assert (XEXP (pat
, 1) == const1_rtx
);
4086 output_asm_insn (" restore %r1, %r1, %Y0", operands
);
4090 output_asm_insn (" restore %%g0, %1, %Y0", operands
);
4095 /* Output a return. */
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+%)%#";
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
);
4128 fputs ("\treturn\t%i7+8\n", asm_out_file
);
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
);
4135 fputs ("\t nop\n", asm_out_file
);
4137 else if (final_sequence
)
4141 delay
= NEXT_INSN (insn
);
4144 pat
= PATTERN (delay
);
4146 if (TARGET_V9
&& ! epilogue_renumber (&pat
, 1))
4148 epilogue_renumber (&pat
, 0);
4149 return "return\t%%i7+%)%#";
4153 output_asm_insn ("jmp\t%%i7+%)", NULL
);
4154 output_restore (pat
);
4155 PATTERN (delay
) = gen_blockage ();
4156 INSN_CODE (delay
) = -1;
4161 /* The delay slot is empty. */
4163 return "return\t%%i7+%)\n\t nop";
4164 else if (flag_delayed_branch
)
4165 return "jmp\t%%i7+%)\n\t restore";
4167 return "restore\n\tjmp\t%%o7+%)\n\t nop";
4174 /* Output a sibling call. */
4177 output_sibcall (rtx insn
, rtx call_operand
)
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
));
4194 output_asm_insn ("sethi\t%%hi(%a0), %%g1\n\tjmp\t%%g1 + %%lo(%a0)%#",
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",
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
);
4212 rtx delay
= NEXT_INSN (insn
);
4215 output_restore (PATTERN (delay
));
4217 PATTERN (delay
) = gen_blockage ();
4218 INSN_CODE (delay
) = -1;
4221 output_restore (NULL_RTX
);
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
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
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:
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
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
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. */
4363 init_cumulative_args (struct sparc_args
*cum
, tree fntype
,
4364 rtx libname ATTRIBUTE_UNUSED
,
4365 tree fndecl ATTRIBUTE_UNUSED
)
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'. */
4376 sparc_promote_prototypes (tree fntype ATTRIBUTE_UNUSED
)
4378 return TARGET_ARCH32
? true : false;
4381 /* Handle the TARGET_STRICT_ARGUMENT_NAMING target hook. */
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. */
4399 scan_record_type (tree type
, int *intregs_p
, int *fpregs_p
, int *packed_p
)
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
)
4416 if (packed_p
&& DECL_PACKED (field
))
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
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. */
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
;
4451 if (type
&& TREE_ADDRESSABLE (type
))
4457 && TYPE_ALIGN (type
) % PARM_BOUNDARY
!= 0)
4460 /* For SPARC64, objects requiring 16-byte alignment get it. */
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
);
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
4487 mclass
= MODE_FLOAT
;
4494 case MODE_COMPLEX_FLOAT
:
4495 if (TARGET_ARCH64
&& TARGET_FPU
&& named
)
4497 if (slotno
>= SPARC_FP_ARG_MAX
)
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)
4509 case MODE_COMPLEX_INT
:
4510 if (slotno
>= SPARC_INT_ARG_MAX
)
4512 regno
= regbase
+ slotno
;
4516 if (mode
== VOIDmode
)
4517 /* MODE is VOIDmode when generating the actual call. */
4520 gcc_assert (mode
== BLKmode
);
4522 if (TARGET_ARCH32
|| !type
|| (TREE_CODE (type
) == UNION_TYPE
))
4524 if (slotno
>= SPARC_INT_ARG_MAX
)
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
)
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
)
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
)
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. */
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. */
4595 function_arg_record_value_1 (tree type
, HOST_WIDE_INT startbitpos
,
4596 struct function_arg_record_value_parms
*parms
,
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. */
4609 for (field
= TYPE_FIELDS (type
); field
; field
= TREE_CHAIN (field
))
4611 if (TREE_CODE (field
) == FIELD_DECL
&& DECL_PACKED (field
))
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
)))
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
),
4641 else if ((FLOAT_TYPE_P (TREE_TYPE (field
))
4642 || TREE_CODE (TREE_TYPE (field
)) == VECTOR_TYPE
)
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
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. */
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
)
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. */
4693 function_arg_record_value_3 (HOST_WIDE_INT bitpos
,
4694 struct function_arg_record_value_parms
*parms
)
4696 enum machine_mode mode
;
4698 unsigned int startbit
, endbit
;
4699 int this_slotno
, intslots
, intoffset
;
4702 if (parms
->intoffset
== -1)
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
);
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
,
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
));
4737 intoffset
= (intoffset
| (UNITS_PER_WORD
-1)) + 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. */
4751 function_arg_record_value_2 (tree type
, HOST_WIDE_INT startbitpos
,
4752 struct function_arg_record_value_parms
*parms
,
4758 for (field
= TYPE_FIELDS (type
); field
; field
= TREE_CHAIN (field
))
4760 if (TREE_CODE (field
) == FIELD_DECL
&& DECL_PACKED (field
))
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
)))
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
),
4789 else if ((FLOAT_TYPE_P (TREE_TYPE (field
))
4790 || TREE_CODE (TREE_TYPE (field
)) == VECTOR_TYPE
)
4795 int this_slotno
= parms
->slotno
+ bitpos
/ BITS_PER_WORD
;
4796 int regno
, nregs
, pos
;
4797 enum machine_mode mode
= DECL_MODE (field
);
4800 function_arg_record_value_3 (bitpos
, parms
);
4802 if (TREE_CODE (TREE_TYPE (field
)) == VECTOR_TYPE
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
)));
4816 regno
= SPARC_FP_ARG_FIRST
+ this_slotno
* 2;
4817 if (GET_MODE_SIZE (mode
) <= 4 && (bitpos
& 32) != 0)
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
));
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
));
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
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. */
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
;
4865 parms
.ret
= NULL_RTX
;
4866 parms
.slotno
= slotno
;
4867 parms
.named
= named
;
4868 parms
.regbase
= regbase
;
4871 /* Compute how many registers we need. */
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. */
4894 parms
.nregs
+= intslots
;
4896 nregs
= parms
.nregs
;
4898 /* Allocate the vector and handle some annoying special cases. */
4901 /* ??? Empty structure has no value? Duh? */
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
4908 return gen_rtx_REG (mode
, regbase
);
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. */
4930 XVECEXP (parms
.ret
, 0, 0)
4931 = gen_rtx_EXPR_LIST (VOIDmode
, NULL_RTX
, const0_rtx
);
4933 /* Fill in the entries. */
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
);
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. */
4954 function_arg_union_value (int size
, enum machine_mode mode
, int slotno
,
4957 int nwords
= ROUND_ADVANCE (size
), i
;
4960 /* See comment in previous function for empty structures. */
4962 return gen_rtx_REG (mode
, regno
);
4964 if (slotno
== SPARC_INT_ARG_MAX
- 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
));
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. */
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
;
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;
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
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
);
5038 slotno
= function_arg_slotno (cum
, mode
, type
, named
, incoming_p
,
5046 reg
= gen_rtx_REG (mode
, regno
);
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
);
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
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
,
5104 gen_rtx_EXPR_LIST (VOIDmode
,
5105 NULL_RTX
, const0_rtx
),
5106 gen_rtx_EXPR_LIST (VOIDmode
,
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~ */
5126 if ((regno
- SPARC_FP_ARG_FIRST
) < SPARC_INT_ARG_MAX
* 2)
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. */
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
),
5142 return gen_rtx_PARALLEL (mode
, gen_rtvec (2, v0
, v1
));
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
));
5154 /* Scalar or complex int. */
5155 reg
= gen_rtx_REG (mode
, regno
);
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. */
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, ®no
, &padding
);
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
;
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
)
5218 return UNITS_PER_WORD
;
5225 /* Handle the TARGET_PASS_BY_REFERENCE target hook.
5226 Specify whether to pass the argument by reference. */
5229 sparc_pass_by_reference (CUMULATIVE_ARGS
*cum ATTRIBUTE_UNUSED
,
5230 enum machine_mode mode
, tree type
,
5231 bool named ATTRIBUTE_UNUSED
)
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
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
)))
5251 /* Catch CDImode, TFmode, DCmode and TCmode. */
5252 || GET_MODE_SIZE (mode
) > 8
5254 && TREE_CODE (type
) == VECTOR_TYPE
5255 && (unsigned HOST_WIDE_INT
) int_size_in_bytes (type
) > 8));
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
5272 return ((type
&& TREE_CODE (type
) == ARRAY_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. */
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, ®no
, &padding
);
5295 /* If register required leading padding, add it. */
5297 cum
->words
+= padding
;
5301 cum
->words
+= (mode
!= BLKmode
5302 ? ROUND_ADVANCE (GET_MODE_SIZE (mode
))
5303 : ROUND_ADVANCE (int_size_in_bytes (type
)));
5307 if (type
&& AGGREGATE_TYPE_P (type
))
5309 int size
= int_size_in_bytes (type
);
5313 else if (size
<= 16)
5315 else /* passed by reference */
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
5332 function_arg_padding (enum machine_mode mode
, tree type
)
5334 if (TARGET_ARCH64
&& type
!= 0 && AGGREGATE_TYPE_P (type
))
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. */
5345 sparc_return_in_memory (tree type
, tree fntype ATTRIBUTE_UNUSED
)
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));
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. */
5388 sparc_struct_value_rtx (tree fndecl ATTRIBUTE_UNUSED
, int incoming
)
5397 mem
= gen_rtx_MEM (Pmode
, plus_constant (frame_pointer_rtx
,
5398 STRUCT_VALUE_OFFSET
));
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
);
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
);
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
);
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
);
5482 else if (mclass
== MODE_INT
5483 && GET_MODE_SIZE (mode
) < UNITS_PER_WORD
)
5487 if ((mclass
== MODE_FLOAT
|| mclass
== MODE_COMPLEX_FLOAT
)
5489 regno
= SPARC_FP_ARG_FIRST
;
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. */
5501 sparc_builtin_saveregs (void)
5503 int first_reg
= current_function_args_info
.words
;
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
,
5511 GEN_INT (FIRST_PARM_OFFSET (0)
5514 gen_rtx_REG (word_mode
,
5515 SPARC_INCOMING_INT_ARG_FIRST
+ regno
));
5517 address
= gen_rtx_PLUS (Pmode
,
5519 GEN_INT (FIRST_PARM_OFFSET (0)
5520 + UNITS_PER_WORD
* first_reg
));
5525 /* Implement `va_start' for stdarg. */
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. */
5537 sparc_gimplify_va_arg (tree valist
, tree type
, tree
*pre_p
, tree
*post_p
)
5539 HOST_WIDE_INT size
, rsize
, align
;
5542 tree ptrtype
= build_pointer_type (type
);
5544 if (pass_by_reference (NULL
, TYPE_MODE (type
), type
, false))
5547 size
= rsize
= UNITS_PER_WORD
;
5553 size
= int_size_in_bytes (type
);
5554 rsize
= (size
+ UNITS_PER_WORD
- 1) & -UNITS_PER_WORD
;
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
))
5568 size
= rsize
= UNITS_PER_WORD
;
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
);
5587 if (BYTES_BIG_ENDIAN
&& size
< rsize
)
5588 addr
= fold (build2 (PLUS_EXPR
, ptr_type_node
, incr
,
5589 ssize_int (rsize
- size
)));
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
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
),
5613 gimplify_and_add (copy
, pre_p
);
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. */
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. */
5641 output_ubranch (rtx dest
, int label
, rtx insn
)
5643 static char string
[64];
5644 bool v9_form
= false;
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)
5657 strcpy (string
, "ba%*,pt\t%%xcc, ");
5659 strcpy (string
, "b%*\t");
5661 p
= strchr (string
, '\0');
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. */
5684 output_cbranch (rtx op
, rtx dest
, int label
, int reversed
, int annul
,
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
;
5695 /* v9 branches are limited to +-1MB. If it is too far away,
5708 fbne,a,pn %fcc2, .LC29
5716 far
= TARGET_V9
&& (get_attr_length (insn
) >= 3);
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
);
5724 code
= reverse_condition (code
);
5727 /* Start by writing the branch condition. */
5728 if (mode
== CCFPmode
|| mode
== CCFPEmode
)
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
5786 strcpy (string
, "nop\n\t");
5787 strcat (string
, branch
);
5800 if (mode
== CC_NOOVmode
|| mode
== CCX_NOOVmode
)
5812 if (mode
== CC_NOOVmode
|| mode
== CCX_NOOVmode
)
5833 strcpy (string
, branch
);
5835 spaces
-= strlen (branch
);
5836 p
= strchr (string
, '\0');
5838 /* Now add the annulling, the label, and a possible noop. */
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)
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
;
5868 gcc_assert (REGNO (cc_reg
) == SPARC_FCC_REG
);
5872 else if (mode
== CCXmode
|| mode
== CCX_NOOVmode
)
5874 labelno
= "%%xcc, ";
5879 labelno
= "%%icc, ";
5884 if (*labelno
&& insn
&& (note
= find_reg_note (insn
, REG_BR_PROB
, NULL_RTX
)))
5887 ((INTVAL (XEXP (note
, 0)) >= REG_BR_PROB_BASE
/ 2) ^ far
)
5900 strcpy (p
, labelno
);
5901 p
= strchr (p
, '\0');
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
)
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. */
5927 sparc_emit_float_lib_cmp (rtx x
, rtx y
, enum rtx_code comparison
)
5930 rtx slot0
, slot1
, result
, tem
, tem2
;
5931 enum machine_mode mode
;
5936 qpfunc
= (TARGET_ARCH64
) ? "_Qp_feq" : "_Q_feq";
5940 qpfunc
= (TARGET_ARCH64
) ? "_Qp_fne" : "_Q_fne";
5944 qpfunc
= (TARGET_ARCH64
) ? "_Qp_fgt" : "_Q_fgt";
5948 qpfunc
= (TARGET_ARCH64
) ? "_Qp_fge" : "_Q_fge";
5952 qpfunc
= (TARGET_ARCH64
) ? "_Qp_flt" : "_Q_flt";
5956 qpfunc
= (TARGET_ARCH64
) ? "_Qp_fle" : "_Q_fle";
5967 qpfunc
= (TARGET_ARCH64
) ? "_Qp_cmp" : "_Q_cmp";
5976 if (GET_CODE (x
) != MEM
)
5978 slot0
= assign_stack_temp (TFmode
, GET_MODE_SIZE(TFmode
), 0);
5979 emit_move_insn (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
);
5992 emit_library_call (gen_rtx_SYMBOL_REF (Pmode
, qpfunc
), LCT_NORMAL
,
5994 XEXP (slot0
, 0), Pmode
,
5995 XEXP (slot1
, 0), Pmode
);
6001 emit_library_call (gen_rtx_SYMBOL_REF (Pmode
, qpfunc
), LCT_NORMAL
,
6003 x
, TFmode
, y
, TFmode
);
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
));
6018 emit_cmp_insn (result
, const0_rtx
, NE
, NULL_RTX
, mode
, 0);
6022 emit_cmp_insn (result
, GEN_INT(3), comparison
== UNORDERED
? EQ
: NE
,
6027 emit_cmp_insn (result
, const1_rtx
,
6028 comparison
== UNGT
? GT
: NE
, NULL_RTX
, mode
, 0);
6031 emit_cmp_insn (result
, const2_rtx
, NE
, NULL_RTX
, mode
, 0);
6034 tem
= gen_reg_rtx (mode
);
6036 emit_insn (gen_andsi3 (tem
, result
, const1_rtx
));
6038 emit_insn (gen_anddi3 (tem
, result
, const1_rtx
));
6039 emit_cmp_insn (tem
, const0_rtx
, NE
, NULL_RTX
, mode
, 0);
6043 tem
= gen_reg_rtx (mode
);
6045 emit_insn (gen_addsi3 (tem
, result
, const1_rtx
));
6047 emit_insn (gen_adddi3 (tem
, result
, const1_rtx
));
6048 tem2
= gen_reg_rtx (mode
);
6050 emit_insn (gen_andsi3 (tem2
, tem
, const2_rtx
));
6052 emit_insn (gen_anddi3 (tem2
, tem
, const2_rtx
));
6053 emit_cmp_insn (tem2
, const0_rtx
, comparison
== UNEQ
? EQ
: NE
,
6059 /* Generate an unsigned DImode to FP conversion. This is the same code
6060 optabs would emit if we didn't have TFmode patterns. */
6063 sparc_emit_floatunsdi (rtx
*operands
, enum machine_mode mode
)
6065 rtx neglab
, donelab
, i0
, i1
, f0
, in
, out
;
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
));
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. */
6096 sparc_emit_fixunsdi (rtx
*operands
, enum machine_mode mode
)
6098 rtx neglab
, donelab
, i0
, i1
, f0
, in
, out
, limit
;
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
,
6116 gen_rtx_FIX (DImode
, gen_rtx_FIX (mode
, in
))));
6117 emit_jump_insn (gen_jump (donelab
));
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. */
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));
6155 /* branch on register are limited to +-128KB. If it is too far away,
6168 brgez,a,pn %o1, .LC29
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. */
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. */
6190 strcpy (string
, "brnz");
6194 strcpy (string
, "brz");
6198 strcpy (string
, "brgez");
6202 strcpy (string
, "brlz");
6206 strcpy (string
, "brlez");
6210 strcpy (string
, "brgz");
6217 p
= strchr (string
, '\0');
6219 /* Now add the annulling, reg, label, and nop. */
6226 if (insn
&& (note
= find_reg_note (insn
, REG_BR_PROB
, NULL_RTX
)))
6229 ((INTVAL (XEXP (note
, 0)) >= REG_BR_PROB_BASE
/ 2) ^ far
)
6234 *p
= p
< string
+ 8 ? '\t' : ' ';
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)
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
)
6266 strcpy (p
, "ba,pt\t%%xcc, ");
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.
6286 epilogue_renumber (register rtx
*where
, int test
)
6288 register const char *fmt
;
6290 register enum rtx_code code
;
6295 code
= GET_CODE (*where
);
6300 if (REGNO (*where
) >= 8 && REGNO (*where
) < 24) /* oX or lX */
6302 if (! test
&& REGNO (*where
) >= 24 && REGNO (*where
) < 32)
6303 *where
= gen_rtx_REG (GET_MODE (*where
), OUTGOING_REGNO (REGNO(*where
)));
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. */
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
))
6329 if (SPARC_STACK_BIAS
6330 && GET_CODE (XEXP (*where
, 0)) == REG
6331 && REGNO (XEXP (*where
, 0)) == HARD_FRAME_POINTER_REGNUM
)
6339 fmt
= GET_RTX_FORMAT (code
);
6341 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
6346 for (j
= XVECLEN (*where
, i
) - 1; j
>= 0; j
--)
6347 if (epilogue_renumber (&(XVECEXP (*where
, i
, j
)), test
))
6350 else if (fmt
[i
] == 'e'
6351 && epilogue_renumber (&(XEXP (*where
, i
)), test
))
6357 /* Leaf functions and non-leaf functions have different needs. */
6360 reg_leaf_alloc_order
[] = REG_LEAF_ALLOC_ORDER
;
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
};
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
))
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))
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
)
6415 if (GET_CODE (y
) != REG
)
6417 if (REGNO (x
) == REGNO (y
))
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
)
6434 if (REGNO (reg1
) % 2 != 0)
6437 /* Integer ldd is deprecated in SPARC V9 */
6438 if (TARGET_V9
&& REGNO (reg1
) < 32)
6441 return (REGNO (reg1
) == REGNO (reg2
) - 1);
6444 /* Return 1 if the addresses in mem1 and mem2 are suitable for use in
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
6464 But, note that the transformation from:
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
6476 mems_ok_for_ldd_peep (rtx mem1
, rtx mem2
, rtx dependent_reg_rtx
)
6480 HOST_WIDE_INT offset1
;
6482 /* The mems cannot be volatile. */
6483 if (MEM_VOLATILE_P (mem1
) || MEM_VOLATILE_P (mem2
))
6486 /* MEM1 should be aligned on a 64-bit boundary. */
6487 if (MEM_ALIGN (mem1
) < 64)
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
)
6501 reg1
= REGNO (XEXP (addr1
, 0));
6502 /* The offset must be constant! */
6503 if (GET_CODE (XEXP (addr1
, 1)) != CONST_INT
)
6505 offset1
= INTVAL (XEXP (addr1
, 1));
6508 else if (GET_CODE (addr1
) != REG
)
6512 reg1
= REGNO (addr1
);
6513 /* This was a simple (mem (reg)) expression. Offset is 0. */
6517 /* Make sure the second address is a (mem (plus (reg) (const_int). */
6518 if (GET_CODE (addr2
) != PLUS
)
6521 if (GET_CODE (XEXP (addr2
, 0)) != REG
6522 || GET_CODE (XEXP (addr2
, 1)) != CONST_INT
)
6525 if (reg1
!= REGNO (XEXP (addr2
, 0)))
6528 if (dependent_reg_rtx
!= NULL_RTX
&& reg1
== REGNO (dependent_reg_rtx
))
6531 /* The first offset must be evenly divisible by 8 to ensure the
6532 address is 64 bit aligned. */
6533 if (offset1
% 8 != 0)
6536 /* The offset for the second addr must be 4 more than the first addr. */
6537 if (INTVAL (XEXP (addr2
, 1)) != offset1
+ 4)
6540 /* All the tests passed. addr1 and addr2 are valid for ldd and std
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
)
6556 if (REGNO (reg
) < FIRST_PSEUDO_REGISTER
)
6557 return (REGNO (reg
) % 2 == 0);
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. */
6567 print_operand (FILE *file
, rtx x
, int code
)
6572 /* Output an insn in a delay slot. */
6574 sparc_indent_opcode
= 1;
6576 fputs ("\n\t nop", file
);
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
))
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;
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. */
6604 && current_function_returns_struct
6605 && (TREE_CODE (DECL_SIZE (DECL_RESULT (current_function_decl
)))
6607 && ! integer_zerop (DECL_SIZE (DECL_RESULT (current_function_decl
))))
6613 /* Output the Embedded Medium/Anywhere code model base register. */
6614 fputs (EMBMEDANY_BASE_REG
, file
);
6617 /* Print some local dynamic TLS name. */
6618 assemble_name (file
, get_some_local_dynamic_name ());
6622 /* Adjust the operand to take into account a RESTORE operation. */
6623 if (GET_CODE (x
) == CONST_INT
)
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
);
6632 output_operand_lossage ("invalid %%Y operand");
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
);
6639 fputs (reg_names
[REGNO (x
)], file
);
6642 /* Print out the high order register name of a register pair. */
6643 if (WORDS_BIG_ENDIAN
)
6644 fputs (reg_names
[REGNO (x
)], file
);
6646 fputs (reg_names
[REGNO (x
)+1], file
);
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
);
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
);
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
);
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
6669 if (GET_MODE (x
) == CCmode
)
6670 fputs ("%icc", file
);
6671 else if (GET_MODE (x
) == CCXmode
)
6672 fputs ("%xcc", file
);
6677 /* %fccN register */
6678 fputs (reg_names
[REGNO (x
)], file
);
6681 /* Print the operand's address only. */
6682 output_address (XEXP (x
, 0));
6685 /* In this case we need a register. Use %g0 if the
6686 operand is const0_rtx. */
6688 || (GET_MODE (x
) != VOIDmode
&& x
== CONST0_RTX (GET_MODE (x
))))
6690 fputs ("%g0", file
);
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");
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");
6716 /* These are used by the conditional move instructions. */
6720 enum rtx_code rc
= GET_CODE (x
);
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
));
6728 rc
= reverse_condition (GET_CODE (x
));
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");
6757 /* These are used by the movr instruction pattern. */
6761 enum rtx_code rc
= (code
== 'd'
6762 ? reverse_condition (GET_CODE (x
))
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");
6781 /* Print a sign-extended character. */
6782 int i
= trunc_int_for_mode (INTVAL (x
), QImode
);
6783 fprintf (file
, "%d", i
);
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));
6796 /* Print a sign-extended 32-bit value. */
6798 if (GET_CODE(x
) == CONST_INT
)
6800 else if (GET_CODE(x
) == CONST_DOUBLE
)
6801 i
= CONST_DOUBLE_LOW (x
);
6804 output_operand_lossage ("invalid %%s operand");
6807 i
= trunc_int_for_mode (i
, SImode
);
6808 fprintf (file
, HOST_WIDE_INT_PRINT_DEC
, i
);
6813 /* Do nothing special. */
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
)
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));
6832 else if (GET_CODE (x
) == HIGH
)
6834 fputs ("%hi(", file
);
6835 output_addr_const (file
, XEXP (x
, 0));
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
);
6844 fputs ("+%lo(", file
);
6845 output_addr_const (file
, XEXP (x
, 1));
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
));
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. */
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
))
6878 assemble_integer_with_op ("\t.xword\t", x
);
6883 assemble_aligned_integer (4, const0_rtx
);
6884 assemble_aligned_integer (4, x
);
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)
6899 #ifndef INT_TYPE_SIZE
6900 #define INT_TYPE_SIZE BITS_PER_WORD
6903 #ifndef LONG_TYPE_SIZE
6904 #define LONG_TYPE_SIZE BITS_PER_WORD
6907 #ifndef LONG_LONG_TYPE_SIZE
6908 #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
6911 #ifndef FLOAT_TYPE_SIZE
6912 #define FLOAT_TYPE_SIZE BITS_PER_WORD
6915 #ifndef DOUBLE_TYPE_SIZE
6916 #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
6919 #ifndef LONG_DOUBLE_TYPE_SIZE
6920 #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
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
))
6942 qualifiers
|= (3 << shift
);
6947 qualifiers
|= (2 << shift
);
6951 case REFERENCE_TYPE
:
6953 qualifiers
|= (1 << shift
);
6957 return (qualifiers
| 8);
6960 case QUAL_UNION_TYPE
:
6961 return (qualifiers
| 9);
6964 return (qualifiers
| 10);
6967 return (qualifiers
| 16);
6970 /* If this is a range type, consider it to be the underlying
6972 if (TREE_TYPE (type
) != 0)
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));
6996 return (qualifiers
| (TYPE_UNSIGNED (type
) ? 15 : 5));
6999 /* If this is a range type, consider it to be the underlying
7001 if (TREE_TYPE (type
) != 0)
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);
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? */
7020 case CHAR_TYPE
: /* GNU Pascal CHAR type. Not used in C. */
7021 case BOOLEAN_TYPE
: /* GNU Fortran BOOLEAN type. */
7022 case LANG_TYPE
: /* ? */
7026 gcc_unreachable (); /* Not a type! */
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. */
7047 sparc_initialize_trampoline (rtx tramp
, rtx fnaddr
, rtx cxt
)
7049 /* SPARC 32-bit trampoline:
7052 sethi %hi(static), %g2
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
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
));
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
));
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
));
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
);
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. */
7112 sparc64_initialize_trampoline (rtx tramp
, rtx fnaddr
, rtx cxt
)
7114 /* SPARC 64-bit trampoline:
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
);
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. */
7151 supersparc_adjust_cost (rtx insn
, rtx link
, rtx dep_insn
, int cost
)
7153 enum attr_type insn_type
;
7155 if (! recog_memoized (insn
))
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
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
7169 if (insn_type
== TYPE_LOAD
|| insn_type
== TYPE_FPLOAD
)
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
)))
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. */
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
)
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)
7221 insn_type
= get_attr_type (insn
);
7222 dep_type
= get_attr_type (dep_insn
);
7224 switch (REG_NOTE_KIND (link
))
7227 /* Data dependency; DEP_INSN writes a register that INSN reads some
7234 /* Get the delay iff the address of the store is the dependence. */
7235 if (GET_CODE (pat
) != SET
|| GET_CODE (dep_pat
) != SET
)
7238 if (rtx_equal_p (SET_DEST (dep_pat
), SET_SRC (pat
)))
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)))
7261 /* Compare to branch latency is 0. There is no benefit from
7262 separating compare and branch. */
7263 if (dep_type
== TYPE_COMPARE
)
7265 /* Floating point compare to branch latency is less than
7266 compare to conditional move. */
7267 if (dep_type
== TYPE_FPCMP
)
7276 /* Anti-dependencies only penalize the fpu unit. */
7277 if (insn_type
== TYPE_IALU
|| insn_type
== TYPE_SHIFT
)
7289 sparc_adjust_cost(rtx insn
, rtx link
, rtx dep
, int cost
)
7293 case PROCESSOR_SUPERSPARC
:
7294 cost
= supersparc_adjust_cost (insn
, link
, dep
, cost
);
7296 case PROCESSOR_HYPERSPARC
:
7297 case PROCESSOR_SPARCLITE86X
:
7298 cost
= hypersparc_adjust_cost (insn
, link
, dep
, cost
);
7307 sparc_sched_init (FILE *dump ATTRIBUTE_UNUSED
,
7308 int sched_verbose ATTRIBUTE_UNUSED
,
7309 int max_ready ATTRIBUTE_UNUSED
)
7314 sparc_use_sched_lookahead (void)
7316 if (sparc_cpu
== PROCESSOR_ULTRASPARC
7317 || sparc_cpu
== PROCESSOR_ULTRASPARC3
)
7319 if ((1 << sparc_cpu
) &
7320 ((1 << PROCESSOR_SUPERSPARC
) | (1 << PROCESSOR_HYPERSPARC
) |
7321 (1 << PROCESSOR_SPARCLITE86X
)))
7327 sparc_issue_rate (void)
7334 /* Assume V9 processors are capable of at least dual-issue. */
7336 case PROCESSOR_SUPERSPARC
:
7338 case PROCESSOR_HYPERSPARC
:
7339 case PROCESSOR_SPARCLITE86X
:
7341 case PROCESSOR_ULTRASPARC
:
7342 case PROCESSOR_ULTRASPARC3
:
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. */
7357 /* sethi clears the high bits */
7359 /* LO_SUM is used with sethi. sethi cleared the high
7360 bits and the values used with lo_sum are positive */
7362 /* Store flag stores 0 or 1 */
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
)
7378 if (sparc_check_64 (op0
, insn
) == 1)
7380 return (GET_CODE (op1
) == REG
&& sparc_check_64 (op1
, insn
) == 1);
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)
7389 if (GET_CODE (op1
) == CONST_INT
)
7390 return INTVAL (op1
) >= 0;
7391 return (GET_CODE (op1
) == REG
&& sparc_check_64 (op1
, insn
) == 1);
7394 return GET_MODE (SET_SRC (pat
)) == SImode
;
7395 /* Positive integers leave the high bits zero. */
7397 return ! (CONST_DOUBLE_LOW (SET_SRC (pat
)) & 0x80000000);
7399 return ! (INTVAL (SET_SRC (pat
)) & 0x80000000);
7402 return - (GET_MODE (SET_SRC (pat
)) == SImode
);
7404 return sparc_check_64 (SET_SRC (pat
), insn
);
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
;
7415 sparc_defer_case_vector (rtx lab
, rtx vec
, int diff
)
7417 vec
= gen_rtx_EXPR_LIST (VOIDmode
, lab
, vec
);
7419 sparc_addr_diff_list
7420 = gen_rtx_EXPR_LIST (VOIDmode
, vec
, sparc_addr_diff_list
);
7422 sparc_addr_list
= gen_rtx_EXPR_LIST (VOIDmode
, vec
, sparc_addr_list
);
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
);
7435 #ifdef ASM_OUTPUT_CASE_LABEL
7436 ASM_OUTPUT_CASE_LABEL (asm_out_file
, "L", CODE_LABEL_NUMBER (lab
),
7439 (*targetm
.asm_out
.internal_label
) (asm_out_file
, "L", CODE_LABEL_NUMBER (lab
));
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
);
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
);
7464 #ifdef ASM_OUTPUT_CASE_LABEL
7465 ASM_OUTPUT_CASE_LABEL (asm_out_file
, "L", CODE_LABEL_NUMBER (lab
),
7468 (*targetm
.asm_out
.internal_label
) (asm_out_file
, "L", CODE_LABEL_NUMBER (lab
));
7471 for (idx
= 0; idx
< vlen
; idx
++)
7473 ASM_OUTPUT_ADDR_DIFF_ELT
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
);
7486 sparc_output_deferred_case_vectors (void)
7491 if (sparc_addr_list
== NULL_RTX
7492 && sparc_addr_diff_list
== NULL_RTX
)
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
);
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
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
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)
7535 insn
= get_last_insn_anywhere ();
7540 while ((insn
= PREV_INSN (insn
)))
7542 switch (GET_CODE (insn
))
7555 rtx pat
= PATTERN (insn
);
7556 if (GET_CODE (pat
) != SET
)
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
))
7570 /* Returns assembly code to perform a DImode shift using
7571 a 64-bit global or out register on SPARC-V8+. */
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
);
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");
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. */
7610 sparc_profile_hook (int labelno
)
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
7624 sparc_elf_asm_named_section (const char *name
, unsigned int flags
,
7627 if (flags
& SECTION_MERGE
)
7629 /* entsize cannot be expressed in this section attributes
7631 default_elf_asm_named_section (name
, flags
, decl
);
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. */
7671 sparc_function_ok_for_sibcall (tree decl
, tree exp ATTRIBUTE_UNUSED
)
7674 && flag_delayed_branch
7675 && (TARGET_ARCH64
|| ! current_function_returns_struct
));
7678 /* libfunc renaming. */
7679 #include "config/gofast.h"
7682 sparc_init_libfuncs (void)
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
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. */
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");
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, \
7779 /* Implement the TARGET_INIT_BUILTINS target hook.
7780 Create builtin functions for special SPARC instructions. */
7783 sparc_init_builtins (void)
7786 sparc_vis_init_builtins ();
7789 /* Create builtin functions for VIS 1.0 instructions. */
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
,
7814 intDI_type_node
, 0);
7815 tree di_ftype_di_di
= build_function_type_list (intDI_type_node
,
7817 intDI_type_node
, 0);
7818 tree ptr_ftype_ptr_si
= build_function_type_list (ptr_type_node
,
7820 intSI_type_node
, 0);
7821 tree ptr_ftype_ptr_di
= build_function_type_list (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
,
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
,
7861 def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrdi_vis
,
7864 def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrsi_vis
,
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. */
7876 sparc_expand_builtin (tree exp
, rtx target
, rtx subtarget ATTRIBUTE_UNUSED
,
7877 enum machine_mode tmode
, int ignore ATTRIBUTE_UNUSED
)
7880 tree fndecl
= TREE_OPERAND (TREE_OPERAND (exp
, 0), 0);
7881 unsigned int icode
= DECL_FUNCTION_CODE (fndecl
);
7883 enum machine_mode mode
[4];
7886 mode
[arg_count
] = tmode
;
7889 || GET_MODE (target
) != tmode
7890 || ! (*insn_data
[icode
].operand
[0].predicate
) (target
, tmode
))
7891 op
[arg_count
] = gen_reg_rtx (tmode
);
7893 op
[arg_count
] = target
;
7895 for (arglist
= TREE_OPERAND (exp
, 1); arglist
;
7896 arglist
= TREE_CHAIN (arglist
))
7898 tree arg
= TREE_VALUE (arglist
);
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
],
7906 op
[arg_count
] = copy_to_mode_reg (mode
[arg_count
], op
[arg_count
]);
7912 pat
= GEN_FCN (icode
) (op
[0], op
[1]);
7915 pat
= GEN_FCN (icode
) (op
[0], op
[1], op
[2]);
7918 pat
= GEN_FCN (icode
) (op
[0], op
[1], op
[2], op
[3]);
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. */
7944 sparc_handle_vis_mul8x16 (int fncode
, tree inner_type
, tree elts0
, tree elts1
)
7946 tree n_elts
= NULL_TREE
;
7951 case CODE_FOR_fmul8x16_vis
:
7952 for (; elts0
&& elts1
;
7953 elts0
= TREE_CHAIN (elts0
), elts1
= TREE_CHAIN (elts1
))
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
),
7964 case CODE_FOR_fmul8x16au_vis
:
7965 scale
= TREE_INT_CST_LOW (TREE_VALUE (elts1
));
7967 for (; elts0
; elts0
= TREE_CHAIN (elts0
))
7970 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (TREE_VALUE (elts0
)),
7972 n_elts
= tree_cons (NULL_TREE
,
7973 build_int_cst (inner_type
, val
),
7978 case CODE_FOR_fmul8x16al_vis
:
7979 scale
= TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (elts1
)));
7981 for (; elts0
; elts0
= TREE_CHAIN (elts0
))
7984 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (TREE_VALUE (elts0
)),
7986 n_elts
= tree_cons (NULL_TREE
,
7987 build_int_cst (inner_type
, val
),
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. */
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
);
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
),
8034 return build_vector (rtype
, nreverse (n_elts
));
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
));
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
);
8058 case CODE_FOR_fpmerge_vis
:
8059 arg0
= TREE_VALUE (arglist
);
8060 arg1
= TREE_VALUE (TREE_CHAIN (arglist
));
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
));
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
)));
8089 if (TREE_CODE (arg0
) == VECTOR_CST
8090 && TREE_CODE (arg1
) == VECTOR_CST
8091 && TREE_CODE (arg2
) == INTEGER_CST
)
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
;
8111 overflow
|= neg_double (low1
, high1
, &l
, &h
);
8112 overflow
|= add_double (low0
, high0
, l
, h
, &l
, &h
);
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
);
8131 sparc_extra_constraint_check (rtx op
, int c
, int strict
)
8136 && (c
== 'T' || c
== 'U'))
8142 return fp_sethi_p (op
);
8145 return fp_mov_p (op
);
8148 return fp_high_losum_p (op
);
8152 || (GET_CODE (op
) == REG
8153 && (REGNO (op
) < FIRST_PSEUDO_REGISTER
8154 || reg_renumber
[REGNO (op
)] >= 0)))
8155 return register_ok_for_ldd (op
);
8164 return const_zero_operand (op
, GET_MODE (op
));
8170 /* Our memory extra constraints have to emulate the
8171 behavior of 'm' and 'o' in order for reload to work
8173 if (GET_CODE (op
) == MEM
)
8176 if ((TARGET_ARCH64
|| mem_min_alignment (op
, 8))
8178 || strict_memory_address_p (Pmode
, XEXP (op
, 0))))
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. */
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
);
8205 if (INTVAL (x
) < 0x1000 && INTVAL (x
) >= -0x1000)
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)))
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
;
8252 *total
= sparc_costs
->int_load
;
8260 *total
= sparc_costs
->float_plusminus
;
8262 *total
= COSTS_N_INSNS (1);
8267 *total
= sparc_costs
->float_mul
;
8268 else if (! TARGET_HARD_MUL
)
8269 *total
= COSTS_N_INSNS (25);
8275 if (sparc_costs
->int_mul_bit_factor
)
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)
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)
8294 for (; value2
!= 0; value2
&= value2
- 1)
8302 bit_cost
= (nbits
- 3) / sparc_costs
->int_mul_bit_factor
;
8303 bit_cost
= COSTS_N_INSNS (bit_cost
);
8307 *total
= sparc_costs
->int_mulX
+ bit_cost
;
8309 *total
= sparc_costs
->int_mul
+ bit_cost
;
8316 *total
= COSTS_N_INSNS (1) + sparc_costs
->shift_penalty
;
8326 *total
= sparc_costs
->float_div_df
;
8328 *total
= sparc_costs
->float_div_sf
;
8333 *total
= sparc_costs
->int_divX
;
8335 *total
= sparc_costs
->int_div
;
8342 *total
= COSTS_N_INSNS (1);
8349 case UNSIGNED_FLOAT
:
8353 case FLOAT_TRUNCATE
:
8354 *total
= sparc_costs
->float_move
;
8359 *total
= sparc_costs
->float_sqrt_df
;
8361 *total
= sparc_costs
->float_sqrt_sf
;
8366 *total
= sparc_costs
->float_cmp
;
8368 *total
= COSTS_N_INSNS (1);
8373 *total
= sparc_costs
->float_cmove
;
8375 *total
= sparc_costs
->int_cmove
;
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);
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. */
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
);
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
));
8415 emit_insn (gen_rtx_SET (VOIDmode
,
8416 adjust_address (slot
, word_mode
, UNITS_PER_WORD
),
8420 emit_insn (gen_rtx_SET (VOIDmode
,
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. */
8434 sparc_output_mi_thunk (FILE *file
, tree thunk_fndecl ATTRIBUTE_UNUSED
,
8435 HOST_WIDE_INT delta
, HOST_WIDE_INT vcall_offset
,
8438 rtx
this, insn
, funexp
;
8439 unsigned int int_arg_first
;
8441 reload_completed
= 1;
8442 epilogue_completed
= 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
;
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);
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. */
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). */
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
;
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
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
,
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;
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);
8566 spill_reg
= gen_rtx_REG (word_mode
, 15); /* %o7 */
8567 spill_reg2
= gen_rtx_REG (word_mode
, PIC_OFFSET_TABLE_REGNUM
);
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
);
8575 emit_and_preserve (seq
, spill_reg
, spill_reg2
);
8577 else if (TARGET_ARCH32
)
8579 emit_insn (gen_rtx_SET (VOIDmode
,
8581 gen_rtx_HIGH (SImode
, funexp
)));
8582 emit_insn (gen_rtx_SET (VOIDmode
,
8584 gen_rtx_LO_SUM (SImode
, scratch
, funexp
)));
8586 else /* TARGET_ARCH64 */
8588 switch (sparc_cmodel
)
8592 /* The destination can serve as a temporary. */
8593 sparc_emit_set_symbolic_const64 (scratch
, funexp
, scratch
);
8598 /* The destination cannot serve as a temporary. */
8599 spill_reg
= gen_rtx_REG (DImode
, 15); /* %o7 */
8601 sparc_emit_set_symbolic_const64 (scratch
, funexp
, spill_reg
);
8604 emit_and_preserve (seq
, spill_reg
, 0);
8612 emit_jump_insn (gen_indirect_jump (scratch
));
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;
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. */
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. */
8658 get_some_local_dynamic_name (void)
8662 if (cfun
->machine
->some_ld_name
)
8663 return cfun
->machine
->some_ld_name
;
8665 for (insn
= get_insns (); insn
; insn
= NEXT_INSN (insn
))
8667 && for_each_rtx (&PATTERN (insn
), get_some_local_dynamic_name_1
, 0))
8668 return cfun
->machine
->some_ld_name
;
8674 get_some_local_dynamic_name_1 (rtx
*px
, void *data ATTRIBUTE_UNUSED
)
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);
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. */
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. */
8705 sparc_output_dwarf_dtprel (FILE *file
, int size
, rtx x
)
8710 fputs ("\t.word\t%r_tls_dtpoff32(", file
);
8713 fputs ("\t.xword\t%r_tls_dtpoff64(", file
);
8718 output_addr_const (file
, x
);
8722 /* Do whatever processing is required at the end of a file. */
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
)
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. */
8739 sparc_mangle_fundamental_type (tree type
)
8742 && TYPE_MAIN_VARIANT (type
) == long_double_type_node
8743 && TARGET_LONG_DOUBLE_128
)
8746 /* For all other types, use normal C++ mangling. */
8751 #include "gt-sparc.h"