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, 2006, 2007, 2008, 2009, 2010,
5 Free Software Foundation, Inc.
6 Contributed by Michael Tiemann (tiemann@cygnus.com)
7 64-bit SPARC-V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
10 This file is part of GCC.
12 GCC is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 3, or (at your option)
17 GCC is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with GCC; see the file COPYING3. If not see
24 <http://www.gnu.org/licenses/>. */
28 #include "coretypes.h"
33 #include "hard-reg-set.h"
34 #include "insn-config.h"
35 #include "insn-codes.h"
36 #include "conditions.h"
38 #include "insn-attr.h"
45 #include "diagnostic-core.h"
50 #include "target-def.h"
51 #include "common/common-target.h"
52 #include "cfglayout.h"
54 #include "langhooks.h"
58 #include "dwarf2out.h"
63 struct processor_costs {
67 /* Integer signed load */
70 /* Integer zeroed load */
76 /* fmov, fneg, fabs */
80 const int float_plusminus;
86 const int float_cmove;
92 const int float_div_sf;
95 const int float_div_df;
98 const int float_sqrt_sf;
101 const int float_sqrt_df;
109 /* integer multiply cost for each bit set past the most
110 significant 3, so the formula for multiply cost becomes:
113 highest_bit = highest_clear_bit(rs1);
115 highest_bit = highest_set_bit(rs1);
118 cost = int_mul{,X} + ((highest_bit - 3) / int_mul_bit_factor);
120 A value of zero indicates that the multiply costs is fixed,
122 const int int_mul_bit_factor;
133 /* penalty for shifts, due to scheduling rules etc. */
134 const int shift_penalty;
138 struct processor_costs cypress_costs = {
139 COSTS_N_INSNS (2), /* int load */
140 COSTS_N_INSNS (2), /* int signed load */
141 COSTS_N_INSNS (2), /* int zeroed load */
142 COSTS_N_INSNS (2), /* float load */
143 COSTS_N_INSNS (5), /* fmov, fneg, fabs */
144 COSTS_N_INSNS (5), /* fadd, fsub */
145 COSTS_N_INSNS (1), /* fcmp */
146 COSTS_N_INSNS (1), /* fmov, fmovr */
147 COSTS_N_INSNS (7), /* fmul */
148 COSTS_N_INSNS (37), /* fdivs */
149 COSTS_N_INSNS (37), /* fdivd */
150 COSTS_N_INSNS (63), /* fsqrts */
151 COSTS_N_INSNS (63), /* fsqrtd */
152 COSTS_N_INSNS (1), /* imul */
153 COSTS_N_INSNS (1), /* imulX */
154 0, /* imul bit factor */
155 COSTS_N_INSNS (1), /* idiv */
156 COSTS_N_INSNS (1), /* idivX */
157 COSTS_N_INSNS (1), /* movcc/movr */
158 0, /* shift penalty */
162 struct processor_costs supersparc_costs = {
163 COSTS_N_INSNS (1), /* int load */
164 COSTS_N_INSNS (1), /* int signed load */
165 COSTS_N_INSNS (1), /* int zeroed load */
166 COSTS_N_INSNS (0), /* float load */
167 COSTS_N_INSNS (3), /* fmov, fneg, fabs */
168 COSTS_N_INSNS (3), /* fadd, fsub */
169 COSTS_N_INSNS (3), /* fcmp */
170 COSTS_N_INSNS (1), /* fmov, fmovr */
171 COSTS_N_INSNS (3), /* fmul */
172 COSTS_N_INSNS (6), /* fdivs */
173 COSTS_N_INSNS (9), /* fdivd */
174 COSTS_N_INSNS (12), /* fsqrts */
175 COSTS_N_INSNS (12), /* fsqrtd */
176 COSTS_N_INSNS (4), /* imul */
177 COSTS_N_INSNS (4), /* imulX */
178 0, /* imul bit factor */
179 COSTS_N_INSNS (4), /* idiv */
180 COSTS_N_INSNS (4), /* idivX */
181 COSTS_N_INSNS (1), /* movcc/movr */
182 1, /* shift penalty */
186 struct processor_costs hypersparc_costs = {
187 COSTS_N_INSNS (1), /* int load */
188 COSTS_N_INSNS (1), /* int signed load */
189 COSTS_N_INSNS (1), /* int zeroed load */
190 COSTS_N_INSNS (1), /* float load */
191 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
192 COSTS_N_INSNS (1), /* fadd, fsub */
193 COSTS_N_INSNS (1), /* fcmp */
194 COSTS_N_INSNS (1), /* fmov, fmovr */
195 COSTS_N_INSNS (1), /* fmul */
196 COSTS_N_INSNS (8), /* fdivs */
197 COSTS_N_INSNS (12), /* fdivd */
198 COSTS_N_INSNS (17), /* fsqrts */
199 COSTS_N_INSNS (17), /* fsqrtd */
200 COSTS_N_INSNS (17), /* imul */
201 COSTS_N_INSNS (17), /* imulX */
202 0, /* imul bit factor */
203 COSTS_N_INSNS (17), /* idiv */
204 COSTS_N_INSNS (17), /* idivX */
205 COSTS_N_INSNS (1), /* movcc/movr */
206 0, /* shift penalty */
210 struct processor_costs leon_costs = {
211 COSTS_N_INSNS (1), /* int load */
212 COSTS_N_INSNS (1), /* int signed load */
213 COSTS_N_INSNS (1), /* int zeroed load */
214 COSTS_N_INSNS (1), /* float load */
215 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
216 COSTS_N_INSNS (1), /* fadd, fsub */
217 COSTS_N_INSNS (1), /* fcmp */
218 COSTS_N_INSNS (1), /* fmov, fmovr */
219 COSTS_N_INSNS (1), /* fmul */
220 COSTS_N_INSNS (15), /* fdivs */
221 COSTS_N_INSNS (15), /* fdivd */
222 COSTS_N_INSNS (23), /* fsqrts */
223 COSTS_N_INSNS (23), /* fsqrtd */
224 COSTS_N_INSNS (5), /* imul */
225 COSTS_N_INSNS (5), /* imulX */
226 0, /* imul bit factor */
227 COSTS_N_INSNS (5), /* idiv */
228 COSTS_N_INSNS (5), /* idivX */
229 COSTS_N_INSNS (1), /* movcc/movr */
230 0, /* shift penalty */
234 struct processor_costs sparclet_costs = {
235 COSTS_N_INSNS (3), /* int load */
236 COSTS_N_INSNS (3), /* int signed load */
237 COSTS_N_INSNS (1), /* int zeroed load */
238 COSTS_N_INSNS (1), /* float load */
239 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
240 COSTS_N_INSNS (1), /* fadd, fsub */
241 COSTS_N_INSNS (1), /* fcmp */
242 COSTS_N_INSNS (1), /* fmov, fmovr */
243 COSTS_N_INSNS (1), /* fmul */
244 COSTS_N_INSNS (1), /* fdivs */
245 COSTS_N_INSNS (1), /* fdivd */
246 COSTS_N_INSNS (1), /* fsqrts */
247 COSTS_N_INSNS (1), /* fsqrtd */
248 COSTS_N_INSNS (5), /* imul */
249 COSTS_N_INSNS (5), /* imulX */
250 0, /* imul bit factor */
251 COSTS_N_INSNS (5), /* idiv */
252 COSTS_N_INSNS (5), /* idivX */
253 COSTS_N_INSNS (1), /* movcc/movr */
254 0, /* shift penalty */
258 struct processor_costs ultrasparc_costs = {
259 COSTS_N_INSNS (2), /* int load */
260 COSTS_N_INSNS (3), /* int signed load */
261 COSTS_N_INSNS (2), /* int zeroed load */
262 COSTS_N_INSNS (2), /* float load */
263 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
264 COSTS_N_INSNS (4), /* fadd, fsub */
265 COSTS_N_INSNS (1), /* fcmp */
266 COSTS_N_INSNS (2), /* fmov, fmovr */
267 COSTS_N_INSNS (4), /* fmul */
268 COSTS_N_INSNS (13), /* fdivs */
269 COSTS_N_INSNS (23), /* fdivd */
270 COSTS_N_INSNS (13), /* fsqrts */
271 COSTS_N_INSNS (23), /* fsqrtd */
272 COSTS_N_INSNS (4), /* imul */
273 COSTS_N_INSNS (4), /* imulX */
274 2, /* imul bit factor */
275 COSTS_N_INSNS (37), /* idiv */
276 COSTS_N_INSNS (68), /* idivX */
277 COSTS_N_INSNS (2), /* movcc/movr */
278 2, /* shift penalty */
282 struct processor_costs ultrasparc3_costs = {
283 COSTS_N_INSNS (2), /* int load */
284 COSTS_N_INSNS (3), /* int signed load */
285 COSTS_N_INSNS (3), /* int zeroed load */
286 COSTS_N_INSNS (2), /* float load */
287 COSTS_N_INSNS (3), /* fmov, fneg, fabs */
288 COSTS_N_INSNS (4), /* fadd, fsub */
289 COSTS_N_INSNS (5), /* fcmp */
290 COSTS_N_INSNS (3), /* fmov, fmovr */
291 COSTS_N_INSNS (4), /* fmul */
292 COSTS_N_INSNS (17), /* fdivs */
293 COSTS_N_INSNS (20), /* fdivd */
294 COSTS_N_INSNS (20), /* fsqrts */
295 COSTS_N_INSNS (29), /* fsqrtd */
296 COSTS_N_INSNS (6), /* imul */
297 COSTS_N_INSNS (6), /* imulX */
298 0, /* imul bit factor */
299 COSTS_N_INSNS (40), /* idiv */
300 COSTS_N_INSNS (71), /* idivX */
301 COSTS_N_INSNS (2), /* movcc/movr */
302 0, /* shift penalty */
306 struct processor_costs niagara_costs = {
307 COSTS_N_INSNS (3), /* int load */
308 COSTS_N_INSNS (3), /* int signed load */
309 COSTS_N_INSNS (3), /* int zeroed load */
310 COSTS_N_INSNS (9), /* float load */
311 COSTS_N_INSNS (8), /* fmov, fneg, fabs */
312 COSTS_N_INSNS (8), /* fadd, fsub */
313 COSTS_N_INSNS (26), /* fcmp */
314 COSTS_N_INSNS (8), /* fmov, fmovr */
315 COSTS_N_INSNS (29), /* fmul */
316 COSTS_N_INSNS (54), /* fdivs */
317 COSTS_N_INSNS (83), /* fdivd */
318 COSTS_N_INSNS (100), /* fsqrts - not implemented in hardware */
319 COSTS_N_INSNS (100), /* fsqrtd - not implemented in hardware */
320 COSTS_N_INSNS (11), /* imul */
321 COSTS_N_INSNS (11), /* imulX */
322 0, /* imul bit factor */
323 COSTS_N_INSNS (72), /* idiv */
324 COSTS_N_INSNS (72), /* idivX */
325 COSTS_N_INSNS (1), /* movcc/movr */
326 0, /* shift penalty */
330 struct processor_costs niagara2_costs = {
331 COSTS_N_INSNS (3), /* int load */
332 COSTS_N_INSNS (3), /* int signed load */
333 COSTS_N_INSNS (3), /* int zeroed load */
334 COSTS_N_INSNS (3), /* float load */
335 COSTS_N_INSNS (6), /* fmov, fneg, fabs */
336 COSTS_N_INSNS (6), /* fadd, fsub */
337 COSTS_N_INSNS (6), /* fcmp */
338 COSTS_N_INSNS (6), /* fmov, fmovr */
339 COSTS_N_INSNS (6), /* fmul */
340 COSTS_N_INSNS (19), /* fdivs */
341 COSTS_N_INSNS (33), /* fdivd */
342 COSTS_N_INSNS (19), /* fsqrts */
343 COSTS_N_INSNS (33), /* fsqrtd */
344 COSTS_N_INSNS (5), /* imul */
345 COSTS_N_INSNS (5), /* imulX */
346 0, /* imul bit factor */
347 COSTS_N_INSNS (26), /* idiv, average of 12 - 41 cycle range */
348 COSTS_N_INSNS (26), /* idivX, average of 12 - 41 cycle range */
349 COSTS_N_INSNS (1), /* movcc/movr */
350 0, /* shift penalty */
354 struct processor_costs niagara3_costs = {
355 COSTS_N_INSNS (3), /* int load */
356 COSTS_N_INSNS (3), /* int signed load */
357 COSTS_N_INSNS (3), /* int zeroed load */
358 COSTS_N_INSNS (3), /* float load */
359 COSTS_N_INSNS (9), /* fmov, fneg, fabs */
360 COSTS_N_INSNS (9), /* fadd, fsub */
361 COSTS_N_INSNS (9), /* fcmp */
362 COSTS_N_INSNS (9), /* fmov, fmovr */
363 COSTS_N_INSNS (9), /* fmul */
364 COSTS_N_INSNS (23), /* fdivs */
365 COSTS_N_INSNS (37), /* fdivd */
366 COSTS_N_INSNS (23), /* fsqrts */
367 COSTS_N_INSNS (37), /* fsqrtd */
368 COSTS_N_INSNS (9), /* imul */
369 COSTS_N_INSNS (9), /* imulX */
370 0, /* imul bit factor */
371 COSTS_N_INSNS (31), /* idiv, average of 17 - 45 cycle range */
372 COSTS_N_INSNS (30), /* idivX, average of 16 - 44 cycle range */
373 COSTS_N_INSNS (1), /* movcc/movr */
374 0, /* shift penalty */
377 static const struct processor_costs *sparc_costs = &cypress_costs;
379 #ifdef HAVE_AS_RELAX_OPTION
380 /* If 'as' and 'ld' are relaxing tail call insns into branch always, use
381 "or %o7,%g0,X; call Y; or X,%g0,%o7" always, so that it can be optimized.
382 With sethi/jmp, neither 'as' nor 'ld' has an easy way how to find out if
383 somebody does not branch between the sethi and jmp. */
384 #define LEAF_SIBCALL_SLOT_RESERVED_P 1
386 #define LEAF_SIBCALL_SLOT_RESERVED_P \
387 ((TARGET_ARCH64 && !TARGET_CM_MEDLOW) || flag_pic)
390 /* Vector to say how input registers are mapped to output registers.
391 HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
392 eliminate it. You must use -fomit-frame-pointer to get that. */
393 char leaf_reg_remap[] =
394 { 0, 1, 2, 3, 4, 5, 6, 7,
395 -1, -1, -1, -1, -1, -1, 14, -1,
396 -1, -1, -1, -1, -1, -1, -1, -1,
397 8, 9, 10, 11, 12, 13, -1, 15,
399 32, 33, 34, 35, 36, 37, 38, 39,
400 40, 41, 42, 43, 44, 45, 46, 47,
401 48, 49, 50, 51, 52, 53, 54, 55,
402 56, 57, 58, 59, 60, 61, 62, 63,
403 64, 65, 66, 67, 68, 69, 70, 71,
404 72, 73, 74, 75, 76, 77, 78, 79,
405 80, 81, 82, 83, 84, 85, 86, 87,
406 88, 89, 90, 91, 92, 93, 94, 95,
407 96, 97, 98, 99, 100, 101, 102};
409 /* Vector, indexed by hard register number, which contains 1
410 for a register that is allowable in a candidate for leaf
411 function treatment. */
412 char sparc_leaf_regs[] =
413 { 1, 1, 1, 1, 1, 1, 1, 1,
414 0, 0, 0, 0, 0, 0, 1, 0,
415 0, 0, 0, 0, 0, 0, 0, 0,
416 1, 1, 1, 1, 1, 1, 0, 1,
417 1, 1, 1, 1, 1, 1, 1, 1,
418 1, 1, 1, 1, 1, 1, 1, 1,
419 1, 1, 1, 1, 1, 1, 1, 1,
420 1, 1, 1, 1, 1, 1, 1, 1,
421 1, 1, 1, 1, 1, 1, 1, 1,
422 1, 1, 1, 1, 1, 1, 1, 1,
423 1, 1, 1, 1, 1, 1, 1, 1,
424 1, 1, 1, 1, 1, 1, 1, 1,
425 1, 1, 1, 1, 1, 1, 1};
427 struct GTY(()) machine_function
429 /* Size of the frame of the function. */
430 HOST_WIDE_INT frame_size;
432 /* Size of the frame of the function minus the register window save area
433 and the outgoing argument area. */
434 HOST_WIDE_INT apparent_frame_size;
436 /* Register we pretend the frame pointer is allocated to. Normally, this
437 is %fp, but if we are in a leaf procedure, this is (%sp + offset). We
438 record "offset" separately as it may be too big for (reg + disp). */
440 HOST_WIDE_INT frame_base_offset;
442 /* Some local-dynamic TLS symbol name. */
443 const char *some_ld_name;
445 /* Number of global or FP registers to be saved (as 4-byte quantities). */
446 int n_global_fp_regs;
448 /* True if the current function is leaf and uses only leaf regs,
449 so that the SPARC leaf function optimization can be applied.
450 Private version of current_function_uses_only_leaf_regs, see
451 sparc_expand_prologue for the rationale. */
454 /* True if the prologue saves local or in registers. */
455 bool save_local_in_regs_p;
457 /* True if the data calculated by sparc_expand_prologue are valid. */
458 bool prologue_data_valid_p;
461 #define sparc_frame_size cfun->machine->frame_size
462 #define sparc_apparent_frame_size cfun->machine->apparent_frame_size
463 #define sparc_frame_base_reg cfun->machine->frame_base_reg
464 #define sparc_frame_base_offset cfun->machine->frame_base_offset
465 #define sparc_n_global_fp_regs cfun->machine->n_global_fp_regs
466 #define sparc_leaf_function_p cfun->machine->leaf_function_p
467 #define sparc_save_local_in_regs_p cfun->machine->save_local_in_regs_p
468 #define sparc_prologue_data_valid_p cfun->machine->prologue_data_valid_p
470 /* 1 if the next opcode is to be specially indented. */
471 int sparc_indent_opcode = 0;
473 static void sparc_option_override (void);
474 static void sparc_init_modes (void);
475 static void scan_record_type (const_tree, int *, int *, int *);
476 static int function_arg_slotno (const CUMULATIVE_ARGS *, enum machine_mode,
477 const_tree, bool, bool, int *, int *);
479 static int supersparc_adjust_cost (rtx, rtx, rtx, int);
480 static int hypersparc_adjust_cost (rtx, rtx, rtx, int);
482 static void sparc_emit_set_const32 (rtx, rtx);
483 static void sparc_emit_set_const64 (rtx, rtx);
484 static void sparc_output_addr_vec (rtx);
485 static void sparc_output_addr_diff_vec (rtx);
486 static void sparc_output_deferred_case_vectors (void);
487 static bool sparc_legitimate_address_p (enum machine_mode, rtx, bool);
488 static bool sparc_legitimate_constant_p (enum machine_mode, rtx);
489 static rtx sparc_builtin_saveregs (void);
490 static int epilogue_renumber (rtx *, int);
491 static bool sparc_assemble_integer (rtx, unsigned int, int);
492 static int set_extends (rtx);
493 static void sparc_asm_function_prologue (FILE *, HOST_WIDE_INT);
494 static void sparc_asm_function_epilogue (FILE *, HOST_WIDE_INT);
495 #ifdef TARGET_SOLARIS
496 static void sparc_solaris_elf_asm_named_section (const char *, unsigned int,
497 tree) ATTRIBUTE_UNUSED;
499 static int sparc_adjust_cost (rtx, rtx, rtx, int);
500 static int sparc_issue_rate (void);
501 static void sparc_sched_init (FILE *, int, int);
502 static int sparc_use_sched_lookahead (void);
504 static void emit_soft_tfmode_libcall (const char *, int, rtx *);
505 static void emit_soft_tfmode_binop (enum rtx_code, rtx *);
506 static void emit_soft_tfmode_unop (enum rtx_code, rtx *);
507 static void emit_soft_tfmode_cvt (enum rtx_code, rtx *);
508 static void emit_hard_tfmode_operation (enum rtx_code, rtx *);
510 static bool sparc_function_ok_for_sibcall (tree, tree);
511 static void sparc_init_libfuncs (void);
512 static void sparc_init_builtins (void);
513 static void sparc_vis_init_builtins (void);
514 static rtx sparc_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
515 static tree sparc_fold_builtin (tree, int, tree *, bool);
516 static int sparc_vis_mul8x16 (int, int);
517 static tree sparc_handle_vis_mul8x16 (int, tree, tree, tree);
518 static void sparc_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
519 HOST_WIDE_INT, tree);
520 static bool sparc_can_output_mi_thunk (const_tree, HOST_WIDE_INT,
521 HOST_WIDE_INT, const_tree);
522 static void sparc_reorg (void);
523 static struct machine_function * sparc_init_machine_status (void);
524 static bool sparc_cannot_force_const_mem (enum machine_mode, rtx);
525 static rtx sparc_tls_get_addr (void);
526 static rtx sparc_tls_got (void);
527 static const char *get_some_local_dynamic_name (void);
528 static int get_some_local_dynamic_name_1 (rtx *, void *);
529 static int sparc_register_move_cost (enum machine_mode,
530 reg_class_t, reg_class_t);
531 static bool sparc_rtx_costs (rtx, int, int, int, int *, bool);
532 static rtx sparc_function_value (const_tree, const_tree, bool);
533 static rtx sparc_libcall_value (enum machine_mode, const_rtx);
534 static bool sparc_function_value_regno_p (const unsigned int);
535 static rtx sparc_struct_value_rtx (tree, int);
536 static enum machine_mode sparc_promote_function_mode (const_tree, enum machine_mode,
537 int *, const_tree, int);
538 static bool sparc_return_in_memory (const_tree, const_tree);
539 static bool sparc_strict_argument_naming (cumulative_args_t);
540 static void sparc_va_start (tree, rtx);
541 static tree sparc_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
542 static bool sparc_vector_mode_supported_p (enum machine_mode);
543 static bool sparc_tls_referenced_p (rtx);
544 static rtx sparc_legitimize_tls_address (rtx);
545 static rtx sparc_legitimize_pic_address (rtx, rtx);
546 static rtx sparc_legitimize_address (rtx, rtx, enum machine_mode);
547 static rtx sparc_delegitimize_address (rtx);
548 static bool sparc_mode_dependent_address_p (const_rtx);
549 static bool sparc_pass_by_reference (cumulative_args_t,
550 enum machine_mode, const_tree, bool);
551 static void sparc_function_arg_advance (cumulative_args_t,
552 enum machine_mode, const_tree, bool);
553 static rtx sparc_function_arg_1 (cumulative_args_t,
554 enum machine_mode, const_tree, bool, bool);
555 static rtx sparc_function_arg (cumulative_args_t,
556 enum machine_mode, const_tree, bool);
557 static rtx sparc_function_incoming_arg (cumulative_args_t,
558 enum machine_mode, const_tree, bool);
559 static unsigned int sparc_function_arg_boundary (enum machine_mode,
561 static int sparc_arg_partial_bytes (cumulative_args_t,
562 enum machine_mode, tree, bool);
563 static void sparc_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
564 static void sparc_file_end (void);
565 static bool sparc_frame_pointer_required (void);
566 static bool sparc_can_eliminate (const int, const int);
567 static rtx sparc_builtin_setjmp_frame_value (void);
568 static void sparc_conditional_register_usage (void);
569 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
570 static const char *sparc_mangle_type (const_tree);
572 static void sparc_trampoline_init (rtx, tree, rtx);
573 static enum machine_mode sparc_preferred_simd_mode (enum machine_mode);
574 static reg_class_t sparc_preferred_reload_class (rtx x, reg_class_t rclass);
575 static bool sparc_print_operand_punct_valid_p (unsigned char);
576 static void sparc_print_operand (FILE *, rtx, int);
577 static void sparc_print_operand_address (FILE *, rtx);
578 static reg_class_t sparc_secondary_reload (bool, rtx, reg_class_t,
580 secondary_reload_info *);
582 #ifdef SUBTARGET_ATTRIBUTE_TABLE
583 /* Table of valid machine attributes. */
584 static const struct attribute_spec sparc_attribute_table[] =
586 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
588 SUBTARGET_ATTRIBUTE_TABLE,
589 { NULL, 0, 0, false, false, false, NULL, false }
593 /* Option handling. */
596 enum cmodel sparc_cmodel;
598 char sparc_hard_reg_printed[8];
600 /* Initialize the GCC target structure. */
602 /* The default is to use .half rather than .short for aligned HI objects. */
603 #undef TARGET_ASM_ALIGNED_HI_OP
604 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
606 #undef TARGET_ASM_UNALIGNED_HI_OP
607 #define TARGET_ASM_UNALIGNED_HI_OP "\t.uahalf\t"
608 #undef TARGET_ASM_UNALIGNED_SI_OP
609 #define TARGET_ASM_UNALIGNED_SI_OP "\t.uaword\t"
610 #undef TARGET_ASM_UNALIGNED_DI_OP
611 #define TARGET_ASM_UNALIGNED_DI_OP "\t.uaxword\t"
613 /* The target hook has to handle DI-mode values. */
614 #undef TARGET_ASM_INTEGER
615 #define TARGET_ASM_INTEGER sparc_assemble_integer
617 #undef TARGET_ASM_FUNCTION_PROLOGUE
618 #define TARGET_ASM_FUNCTION_PROLOGUE sparc_asm_function_prologue
619 #undef TARGET_ASM_FUNCTION_EPILOGUE
620 #define TARGET_ASM_FUNCTION_EPILOGUE sparc_asm_function_epilogue
622 #undef TARGET_SCHED_ADJUST_COST
623 #define TARGET_SCHED_ADJUST_COST sparc_adjust_cost
624 #undef TARGET_SCHED_ISSUE_RATE
625 #define TARGET_SCHED_ISSUE_RATE sparc_issue_rate
626 #undef TARGET_SCHED_INIT
627 #define TARGET_SCHED_INIT sparc_sched_init
628 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
629 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD sparc_use_sched_lookahead
631 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
632 #define TARGET_FUNCTION_OK_FOR_SIBCALL sparc_function_ok_for_sibcall
634 #undef TARGET_INIT_LIBFUNCS
635 #define TARGET_INIT_LIBFUNCS sparc_init_libfuncs
636 #undef TARGET_INIT_BUILTINS
637 #define TARGET_INIT_BUILTINS sparc_init_builtins
639 #undef TARGET_LEGITIMIZE_ADDRESS
640 #define TARGET_LEGITIMIZE_ADDRESS sparc_legitimize_address
641 #undef TARGET_DELEGITIMIZE_ADDRESS
642 #define TARGET_DELEGITIMIZE_ADDRESS sparc_delegitimize_address
643 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
644 #define TARGET_MODE_DEPENDENT_ADDRESS_P sparc_mode_dependent_address_p
646 #undef TARGET_EXPAND_BUILTIN
647 #define TARGET_EXPAND_BUILTIN sparc_expand_builtin
648 #undef TARGET_FOLD_BUILTIN
649 #define TARGET_FOLD_BUILTIN sparc_fold_builtin
652 #undef TARGET_HAVE_TLS
653 #define TARGET_HAVE_TLS true
656 #undef TARGET_CANNOT_FORCE_CONST_MEM
657 #define TARGET_CANNOT_FORCE_CONST_MEM sparc_cannot_force_const_mem
659 #undef TARGET_ASM_OUTPUT_MI_THUNK
660 #define TARGET_ASM_OUTPUT_MI_THUNK sparc_output_mi_thunk
661 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
662 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK sparc_can_output_mi_thunk
664 #undef TARGET_MACHINE_DEPENDENT_REORG
665 #define TARGET_MACHINE_DEPENDENT_REORG sparc_reorg
667 #undef TARGET_RTX_COSTS
668 #define TARGET_RTX_COSTS sparc_rtx_costs
669 #undef TARGET_ADDRESS_COST
670 #define TARGET_ADDRESS_COST hook_int_rtx_bool_0
671 #undef TARGET_REGISTER_MOVE_COST
672 #define TARGET_REGISTER_MOVE_COST sparc_register_move_cost
674 #undef TARGET_PROMOTE_FUNCTION_MODE
675 #define TARGET_PROMOTE_FUNCTION_MODE sparc_promote_function_mode
677 #undef TARGET_FUNCTION_VALUE
678 #define TARGET_FUNCTION_VALUE sparc_function_value
679 #undef TARGET_LIBCALL_VALUE
680 #define TARGET_LIBCALL_VALUE sparc_libcall_value
681 #undef TARGET_FUNCTION_VALUE_REGNO_P
682 #define TARGET_FUNCTION_VALUE_REGNO_P sparc_function_value_regno_p
684 #undef TARGET_STRUCT_VALUE_RTX
685 #define TARGET_STRUCT_VALUE_RTX sparc_struct_value_rtx
686 #undef TARGET_RETURN_IN_MEMORY
687 #define TARGET_RETURN_IN_MEMORY sparc_return_in_memory
688 #undef TARGET_MUST_PASS_IN_STACK
689 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
690 #undef TARGET_PASS_BY_REFERENCE
691 #define TARGET_PASS_BY_REFERENCE sparc_pass_by_reference
692 #undef TARGET_ARG_PARTIAL_BYTES
693 #define TARGET_ARG_PARTIAL_BYTES sparc_arg_partial_bytes
694 #undef TARGET_FUNCTION_ARG_ADVANCE
695 #define TARGET_FUNCTION_ARG_ADVANCE sparc_function_arg_advance
696 #undef TARGET_FUNCTION_ARG
697 #define TARGET_FUNCTION_ARG sparc_function_arg
698 #undef TARGET_FUNCTION_INCOMING_ARG
699 #define TARGET_FUNCTION_INCOMING_ARG sparc_function_incoming_arg
700 #undef TARGET_FUNCTION_ARG_BOUNDARY
701 #define TARGET_FUNCTION_ARG_BOUNDARY sparc_function_arg_boundary
703 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
704 #define TARGET_EXPAND_BUILTIN_SAVEREGS sparc_builtin_saveregs
705 #undef TARGET_STRICT_ARGUMENT_NAMING
706 #define TARGET_STRICT_ARGUMENT_NAMING sparc_strict_argument_naming
708 #undef TARGET_EXPAND_BUILTIN_VA_START
709 #define TARGET_EXPAND_BUILTIN_VA_START sparc_va_start
710 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
711 #define TARGET_GIMPLIFY_VA_ARG_EXPR sparc_gimplify_va_arg
713 #undef TARGET_VECTOR_MODE_SUPPORTED_P
714 #define TARGET_VECTOR_MODE_SUPPORTED_P sparc_vector_mode_supported_p
716 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
717 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE sparc_preferred_simd_mode
719 #ifdef SUBTARGET_INSERT_ATTRIBUTES
720 #undef TARGET_INSERT_ATTRIBUTES
721 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
724 #ifdef SUBTARGET_ATTRIBUTE_TABLE
725 #undef TARGET_ATTRIBUTE_TABLE
726 #define TARGET_ATTRIBUTE_TABLE sparc_attribute_table
729 #undef TARGET_RELAXED_ORDERING
730 #define TARGET_RELAXED_ORDERING SPARC_RELAXED_ORDERING
732 #undef TARGET_OPTION_OVERRIDE
733 #define TARGET_OPTION_OVERRIDE sparc_option_override
735 #if TARGET_GNU_TLS && defined(HAVE_AS_SPARC_UA_PCREL)
736 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
737 #define TARGET_ASM_OUTPUT_DWARF_DTPREL sparc_output_dwarf_dtprel
740 #undef TARGET_ASM_FILE_END
741 #define TARGET_ASM_FILE_END sparc_file_end
743 #undef TARGET_FRAME_POINTER_REQUIRED
744 #define TARGET_FRAME_POINTER_REQUIRED sparc_frame_pointer_required
746 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
747 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE sparc_builtin_setjmp_frame_value
749 #undef TARGET_CAN_ELIMINATE
750 #define TARGET_CAN_ELIMINATE sparc_can_eliminate
752 #undef TARGET_PREFERRED_RELOAD_CLASS
753 #define TARGET_PREFERRED_RELOAD_CLASS sparc_preferred_reload_class
755 #undef TARGET_SECONDARY_RELOAD
756 #define TARGET_SECONDARY_RELOAD sparc_secondary_reload
758 #undef TARGET_CONDITIONAL_REGISTER_USAGE
759 #define TARGET_CONDITIONAL_REGISTER_USAGE sparc_conditional_register_usage
761 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
762 #undef TARGET_MANGLE_TYPE
763 #define TARGET_MANGLE_TYPE sparc_mangle_type
766 #undef TARGET_LEGITIMATE_ADDRESS_P
767 #define TARGET_LEGITIMATE_ADDRESS_P sparc_legitimate_address_p
769 #undef TARGET_LEGITIMATE_CONSTANT_P
770 #define TARGET_LEGITIMATE_CONSTANT_P sparc_legitimate_constant_p
772 #undef TARGET_TRAMPOLINE_INIT
773 #define TARGET_TRAMPOLINE_INIT sparc_trampoline_init
775 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
776 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P sparc_print_operand_punct_valid_p
777 #undef TARGET_PRINT_OPERAND
778 #define TARGET_PRINT_OPERAND sparc_print_operand
779 #undef TARGET_PRINT_OPERAND_ADDRESS
780 #define TARGET_PRINT_OPERAND_ADDRESS sparc_print_operand_address
782 struct gcc_target targetm = TARGET_INITIALIZER;
785 dump_target_flag_bits (const int flags)
787 if (flags & MASK_64BIT)
788 fprintf (stderr, "64BIT ");
789 if (flags & MASK_APP_REGS)
790 fprintf (stderr, "APP_REGS ");
791 if (flags & MASK_FASTER_STRUCTS)
792 fprintf (stderr, "FASTER_STRUCTS ");
793 if (flags & MASK_FLAT)
794 fprintf (stderr, "FLAT ");
795 if (flags & MASK_FMAF)
796 fprintf (stderr, "FMAF ");
797 if (flags & MASK_FPU)
798 fprintf (stderr, "FPU ");
799 if (flags & MASK_HARD_QUAD)
800 fprintf (stderr, "HARD_QUAD ");
801 if (flags & MASK_POPC)
802 fprintf (stderr, "POPC ");
803 if (flags & MASK_PTR64)
804 fprintf (stderr, "PTR64 ");
805 if (flags & MASK_STACK_BIAS)
806 fprintf (stderr, "STACK_BIAS ");
807 if (flags & MASK_UNALIGNED_DOUBLES)
808 fprintf (stderr, "UNALIGNED_DOUBLES ");
809 if (flags & MASK_V8PLUS)
810 fprintf (stderr, "V8PLUS ");
811 if (flags & MASK_VIS)
812 fprintf (stderr, "VIS ");
813 if (flags & MASK_VIS2)
814 fprintf (stderr, "VIS2 ");
815 if (flags & MASK_VIS3)
816 fprintf (stderr, "VIS3 ");
817 if (flags & MASK_DEPRECATED_V8_INSNS)
818 fprintf (stderr, "DEPRECATED_V8_INSNS ");
819 if (flags & MASK_SPARCLET)
820 fprintf (stderr, "SPARCLET ");
821 if (flags & MASK_SPARCLITE)
822 fprintf (stderr, "SPARCLITE ");
824 fprintf (stderr, "V8 ");
826 fprintf (stderr, "V9 ");
830 dump_target_flags (const char *prefix, const int flags)
832 fprintf (stderr, "%s: (%08x) [ ", prefix, flags);
833 dump_target_flag_bits (flags);
834 fprintf(stderr, "]\n");
837 /* Validate and override various options, and do some machine dependent
841 sparc_option_override (void)
843 static struct code_model {
844 const char *const name;
845 const enum cmodel value;
846 } const cmodels[] = {
848 { "medlow", CM_MEDLOW },
849 { "medmid", CM_MEDMID },
850 { "medany", CM_MEDANY },
851 { "embmedany", CM_EMBMEDANY },
852 { NULL, (enum cmodel) 0 }
854 const struct code_model *cmodel;
855 /* Map TARGET_CPU_DEFAULT to value for -m{cpu,tune}=. */
856 static struct cpu_default {
858 const enum processor_type processor;
859 } const cpu_default[] = {
860 /* There must be one entry here for each TARGET_CPU value. */
861 { TARGET_CPU_sparc, PROCESSOR_CYPRESS },
862 { TARGET_CPU_v8, PROCESSOR_V8 },
863 { TARGET_CPU_supersparc, PROCESSOR_SUPERSPARC },
864 { TARGET_CPU_hypersparc, PROCESSOR_HYPERSPARC },
865 { TARGET_CPU_leon, PROCESSOR_LEON },
866 { TARGET_CPU_sparclite, PROCESSOR_F930 },
867 { TARGET_CPU_sparclite86x, PROCESSOR_SPARCLITE86X },
868 { TARGET_CPU_sparclet, PROCESSOR_TSC701 },
869 { TARGET_CPU_v9, PROCESSOR_V9 },
870 { TARGET_CPU_ultrasparc, PROCESSOR_ULTRASPARC },
871 { TARGET_CPU_ultrasparc3, PROCESSOR_ULTRASPARC3 },
872 { TARGET_CPU_niagara, PROCESSOR_NIAGARA },
873 { TARGET_CPU_niagara2, PROCESSOR_NIAGARA2 },
874 { TARGET_CPU_niagara3, PROCESSOR_NIAGARA3 },
875 { TARGET_CPU_niagara4, PROCESSOR_NIAGARA4 },
878 const struct cpu_default *def;
879 /* Table of values for -m{cpu,tune}=. This must match the order of
880 the PROCESSOR_* enumeration. */
881 static struct cpu_table {
882 const char *const name;
885 } const cpu_table[] = {
886 { "v7", MASK_ISA, 0 },
887 { "cypress", MASK_ISA, 0 },
888 { "v8", MASK_ISA, MASK_V8 },
889 /* TI TMS390Z55 supersparc */
890 { "supersparc", MASK_ISA, MASK_V8 },
891 { "hypersparc", MASK_ISA, MASK_V8|MASK_FPU },
893 { "leon", MASK_ISA, MASK_V8|MASK_FPU },
894 { "sparclite", MASK_ISA, MASK_SPARCLITE },
895 /* The Fujitsu MB86930 is the original sparclite chip, with no FPU. */
896 { "f930", MASK_ISA|MASK_FPU, MASK_SPARCLITE },
897 /* The Fujitsu MB86934 is the recent sparclite chip, with an FPU. */
898 { "f934", MASK_ISA, MASK_SPARCLITE|MASK_FPU },
899 { "sparclite86x", MASK_ISA|MASK_FPU, MASK_SPARCLITE },
900 { "sparclet", MASK_ISA, MASK_SPARCLET },
902 { "tsc701", MASK_ISA, MASK_SPARCLET },
903 { "v9", MASK_ISA, MASK_V9 },
904 /* UltraSPARC I, II, IIi */
905 { "ultrasparc", MASK_ISA,
906 /* Although insns using %y are deprecated, it is a clear win. */
907 MASK_V9|MASK_DEPRECATED_V8_INSNS },
909 /* ??? Check if %y issue still holds true. */
910 { "ultrasparc3", MASK_ISA,
911 MASK_V9|MASK_DEPRECATED_V8_INSNS|MASK_VIS2 },
913 { "niagara", MASK_ISA,
914 MASK_V9|MASK_DEPRECATED_V8_INSNS },
916 { "niagara2", MASK_ISA,
917 MASK_V9|MASK_POPC|MASK_VIS2 },
919 { "niagara3", MASK_ISA,
920 MASK_V9|MASK_POPC|MASK_VIS2|MASK_VIS3|MASK_FMAF },
922 { "niagara4", MASK_ISA,
923 MASK_V9|MASK_POPC|MASK_VIS2|MASK_VIS3|MASK_FMAF },
925 const struct cpu_table *cpu;
929 if (sparc_debug_string != NULL)
934 p = ASTRDUP (sparc_debug_string);
935 while ((q = strtok (p, ",")) != NULL)
949 if (! strcmp (q, "all"))
950 mask = MASK_DEBUG_ALL;
951 else if (! strcmp (q, "options"))
952 mask = MASK_DEBUG_OPTIONS;
954 error ("unknown -mdebug-%s switch", q);
957 sparc_debug &= ~mask;
963 if (TARGET_DEBUG_OPTIONS)
965 dump_target_flags("Initial target_flags", target_flags);
966 dump_target_flags("target_flags_explicit", target_flags_explicit);
969 #ifdef SUBTARGET_OVERRIDE_OPTIONS
970 SUBTARGET_OVERRIDE_OPTIONS;
973 #ifndef SPARC_BI_ARCH
974 /* Check for unsupported architecture size. */
975 if (! TARGET_64BIT != DEFAULT_ARCH32_P)
976 error ("%s is not supported by this configuration",
977 DEFAULT_ARCH32_P ? "-m64" : "-m32");
980 /* We force all 64bit archs to use 128 bit long double */
981 if (TARGET_64BIT && ! TARGET_LONG_DOUBLE_128)
983 error ("-mlong-double-64 not allowed with -m64");
984 target_flags |= MASK_LONG_DOUBLE_128;
987 /* Code model selection. */
988 sparc_cmodel = SPARC_DEFAULT_CMODEL;
992 sparc_cmodel = CM_32;
995 if (sparc_cmodel_string != NULL)
999 for (cmodel = &cmodels[0]; cmodel->name; cmodel++)
1000 if (strcmp (sparc_cmodel_string, cmodel->name) == 0)
1002 if (cmodel->name == NULL)
1003 error ("bad value (%s) for -mcmodel= switch", sparc_cmodel_string);
1005 sparc_cmodel = cmodel->value;
1008 error ("-mcmodel= is not supported on 32 bit systems");
1011 /* Check that -fcall-saved-REG wasn't specified for out registers. */
1012 for (i = 8; i < 16; i++)
1013 if (!call_used_regs [i])
1015 error ("-fcall-saved-REG is not supported for out registers");
1016 call_used_regs [i] = 1;
1019 fpu = target_flags & MASK_FPU; /* save current -mfpu status */
1021 /* Set the default CPU. */
1022 if (!global_options_set.x_sparc_cpu_and_features)
1024 for (def = &cpu_default[0]; def->cpu != -1; ++def)
1025 if (def->cpu == TARGET_CPU_DEFAULT)
1027 gcc_assert (def->cpu != -1);
1028 sparc_cpu_and_features = def->processor;
1031 if (!global_options_set.x_sparc_cpu)
1032 sparc_cpu = sparc_cpu_and_features;
1034 cpu = &cpu_table[(int) sparc_cpu_and_features];
1036 if (TARGET_DEBUG_OPTIONS)
1038 fprintf (stderr, "sparc_cpu_and_features: %s\n", cpu->name);
1039 fprintf (stderr, "sparc_cpu: %s\n",
1040 cpu_table[(int) sparc_cpu].name);
1041 dump_target_flags ("cpu->disable", cpu->disable);
1042 dump_target_flags ("cpu->enable", cpu->enable);
1045 target_flags &= ~cpu->disable;
1046 target_flags |= (cpu->enable
1047 #ifndef HAVE_AS_FMAF_HPC_VIS3
1048 & ~(MASK_FMAF | MASK_VIS3)
1052 /* If -mfpu or -mno-fpu was explicitly used, don't override with
1053 the processor default. */
1054 if (target_flags_explicit & MASK_FPU)
1055 target_flags = (target_flags & ~MASK_FPU) | fpu;
1057 /* -mvis2 implies -mvis */
1059 target_flags |= MASK_VIS;
1061 /* -mvis3 implies -mvis2 and -mvis */
1063 target_flags |= MASK_VIS2 | MASK_VIS;
1065 /* Don't allow -mvis, -mvis2, -mvis3, or -mfmaf if FPU is disabled. */
1067 target_flags &= ~(MASK_VIS | MASK_VIS2 | MASK_VIS3 | MASK_FMAF);
1069 /* -mvis assumes UltraSPARC+, so we are sure v9 instructions
1071 -m64 also implies v9. */
1072 if (TARGET_VIS || TARGET_ARCH64)
1074 target_flags |= MASK_V9;
1075 target_flags &= ~(MASK_V8 | MASK_SPARCLET | MASK_SPARCLITE);
1078 /* -mvis also implies -mv8plus on 32-bit */
1079 if (TARGET_VIS && ! TARGET_ARCH64)
1080 target_flags |= MASK_V8PLUS;
1082 /* Use the deprecated v8 insns for sparc64 in 32 bit mode. */
1083 if (TARGET_V9 && TARGET_ARCH32)
1084 target_flags |= MASK_DEPRECATED_V8_INSNS;
1086 /* V8PLUS requires V9, makes no sense in 64 bit mode. */
1087 if (! TARGET_V9 || TARGET_ARCH64)
1088 target_flags &= ~MASK_V8PLUS;
1090 /* Don't use stack biasing in 32 bit mode. */
1092 target_flags &= ~MASK_STACK_BIAS;
1094 /* Supply a default value for align_functions. */
1095 if (align_functions == 0
1096 && (sparc_cpu == PROCESSOR_ULTRASPARC
1097 || sparc_cpu == PROCESSOR_ULTRASPARC3
1098 || sparc_cpu == PROCESSOR_NIAGARA
1099 || sparc_cpu == PROCESSOR_NIAGARA2
1100 || sparc_cpu == PROCESSOR_NIAGARA3
1101 || sparc_cpu == PROCESSOR_NIAGARA4))
1102 align_functions = 32;
1104 /* Validate PCC_STRUCT_RETURN. */
1105 if (flag_pcc_struct_return == DEFAULT_PCC_STRUCT_RETURN)
1106 flag_pcc_struct_return = (TARGET_ARCH64 ? 0 : 1);
1108 /* Only use .uaxword when compiling for a 64-bit target. */
1110 targetm.asm_out.unaligned_op.di = NULL;
1112 /* Do various machine dependent initializations. */
1113 sparc_init_modes ();
1115 /* Set up function hooks. */
1116 init_machine_status = sparc_init_machine_status;
1121 case PROCESSOR_CYPRESS:
1122 sparc_costs = &cypress_costs;
1125 case PROCESSOR_SPARCLITE:
1126 case PROCESSOR_SUPERSPARC:
1127 sparc_costs = &supersparc_costs;
1129 case PROCESSOR_F930:
1130 case PROCESSOR_F934:
1131 case PROCESSOR_HYPERSPARC:
1132 case PROCESSOR_SPARCLITE86X:
1133 sparc_costs = &hypersparc_costs;
1135 case PROCESSOR_LEON:
1136 sparc_costs = &leon_costs;
1138 case PROCESSOR_SPARCLET:
1139 case PROCESSOR_TSC701:
1140 sparc_costs = &sparclet_costs;
1143 case PROCESSOR_ULTRASPARC:
1144 sparc_costs = &ultrasparc_costs;
1146 case PROCESSOR_ULTRASPARC3:
1147 sparc_costs = &ultrasparc3_costs;
1149 case PROCESSOR_NIAGARA:
1150 sparc_costs = &niagara_costs;
1152 case PROCESSOR_NIAGARA2:
1153 sparc_costs = &niagara2_costs;
1155 case PROCESSOR_NIAGARA3:
1156 case PROCESSOR_NIAGARA4:
1157 sparc_costs = &niagara3_costs;
1159 case PROCESSOR_NATIVE:
1163 if (sparc_memory_model == SMM_DEFAULT)
1165 /* Choose the memory model for the operating system. */
1166 enum sparc_memory_model_type os_default = SUBTARGET_DEFAULT_MEMORY_MODEL;
1167 if (os_default != SMM_DEFAULT)
1168 sparc_memory_model = os_default;
1169 /* Choose the most relaxed model for the processor. */
1171 sparc_memory_model = SMM_RMO;
1173 sparc_memory_model = SMM_PSO;
1175 sparc_memory_model = SMM_SC;
1178 #ifdef TARGET_DEFAULT_LONG_DOUBLE_128
1179 if (!(target_flags_explicit & MASK_LONG_DOUBLE_128))
1180 target_flags |= MASK_LONG_DOUBLE_128;
1183 if (TARGET_DEBUG_OPTIONS)
1184 dump_target_flags ("Final target_flags", target_flags);
1186 maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
1187 ((sparc_cpu == PROCESSOR_ULTRASPARC
1188 || sparc_cpu == PROCESSOR_NIAGARA
1189 || sparc_cpu == PROCESSOR_NIAGARA2
1190 || sparc_cpu == PROCESSOR_NIAGARA3
1191 || sparc_cpu == PROCESSOR_NIAGARA4)
1193 : (sparc_cpu == PROCESSOR_ULTRASPARC3
1195 global_options.x_param_values,
1196 global_options_set.x_param_values);
1197 maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
1198 ((sparc_cpu == PROCESSOR_ULTRASPARC
1199 || sparc_cpu == PROCESSOR_ULTRASPARC3
1200 || sparc_cpu == PROCESSOR_NIAGARA
1201 || sparc_cpu == PROCESSOR_NIAGARA2
1202 || sparc_cpu == PROCESSOR_NIAGARA3
1203 || sparc_cpu == PROCESSOR_NIAGARA4)
1205 global_options.x_param_values,
1206 global_options_set.x_param_values);
1208 /* Disable save slot sharing for call-clobbered registers by default.
1209 The IRA sharing algorithm works on single registers only and this
1210 pessimizes for double floating-point registers. */
1211 if (!global_options_set.x_flag_ira_share_save_slots)
1212 flag_ira_share_save_slots = 0;
1215 /* Miscellaneous utilities. */
1217 /* Nonzero if CODE, a comparison, is suitable for use in v9 conditional move
1218 or branch on register contents instructions. */
1221 v9_regcmp_p (enum rtx_code code)
1223 return (code == EQ || code == NE || code == GE || code == LT
1224 || code == LE || code == GT);
1227 /* Nonzero if OP is a floating point constant which can
1228 be loaded into an integer register using a single
1229 sethi instruction. */
1234 if (GET_CODE (op) == CONST_DOUBLE)
1239 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
1240 REAL_VALUE_TO_TARGET_SINGLE (r, i);
1241 return !SPARC_SIMM13_P (i) && SPARC_SETHI_P (i);
1247 /* Nonzero if OP is a floating point constant which can
1248 be loaded into an integer register using a single
1254 if (GET_CODE (op) == CONST_DOUBLE)
1259 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
1260 REAL_VALUE_TO_TARGET_SINGLE (r, i);
1261 return SPARC_SIMM13_P (i);
1267 /* Nonzero if OP is a floating point constant which can
1268 be loaded into an integer register using a high/losum
1269 instruction sequence. */
1272 fp_high_losum_p (rtx op)
1274 /* The constraints calling this should only be in
1275 SFmode move insns, so any constant which cannot
1276 be moved using a single insn will do. */
1277 if (GET_CODE (op) == CONST_DOUBLE)
1282 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
1283 REAL_VALUE_TO_TARGET_SINGLE (r, i);
1284 return !SPARC_SIMM13_P (i) && !SPARC_SETHI_P (i);
1290 /* Return true if the address of LABEL can be loaded by means of the
1291 mov{si,di}_pic_label_ref patterns in PIC mode. */
1294 can_use_mov_pic_label_ref (rtx label)
1296 /* VxWorks does not impose a fixed gap between segments; the run-time
1297 gap can be different from the object-file gap. We therefore can't
1298 assume X - _GLOBAL_OFFSET_TABLE_ is a link-time constant unless we
1299 are absolutely sure that X is in the same segment as the GOT.
1300 Unfortunately, the flexibility of linker scripts means that we
1301 can't be sure of that in general, so assume that GOT-relative
1302 accesses are never valid on VxWorks. */
1303 if (TARGET_VXWORKS_RTP)
1306 /* Similarly, if the label is non-local, it might end up being placed
1307 in a different section than the current one; now mov_pic_label_ref
1308 requires the label and the code to be in the same section. */
1309 if (LABEL_REF_NONLOCAL_P (label))
1312 /* Finally, if we are reordering basic blocks and partition into hot
1313 and cold sections, this might happen for any label. */
1314 if (flag_reorder_blocks_and_partition)
1320 /* Expand a move instruction. Return true if all work is done. */
1323 sparc_expand_move (enum machine_mode mode, rtx *operands)
1325 /* Handle sets of MEM first. */
1326 if (GET_CODE (operands[0]) == MEM)
1328 /* 0 is a register (or a pair of registers) on SPARC. */
1329 if (register_or_zero_operand (operands[1], mode))
1332 if (!reload_in_progress)
1334 operands[0] = validize_mem (operands[0]);
1335 operands[1] = force_reg (mode, operands[1]);
1339 /* Fixup TLS cases. */
1341 && CONSTANT_P (operands[1])
1342 && sparc_tls_referenced_p (operands [1]))
1344 operands[1] = sparc_legitimize_tls_address (operands[1]);
1348 /* Fixup PIC cases. */
1349 if (flag_pic && CONSTANT_P (operands[1]))
1351 if (pic_address_needs_scratch (operands[1]))
1352 operands[1] = sparc_legitimize_pic_address (operands[1], NULL_RTX);
1354 /* We cannot use the mov{si,di}_pic_label_ref patterns in all cases. */
1355 if (GET_CODE (operands[1]) == LABEL_REF
1356 && can_use_mov_pic_label_ref (operands[1]))
1360 emit_insn (gen_movsi_pic_label_ref (operands[0], operands[1]));
1366 gcc_assert (TARGET_ARCH64);
1367 emit_insn (gen_movdi_pic_label_ref (operands[0], operands[1]));
1372 if (symbolic_operand (operands[1], mode))
1375 = sparc_legitimize_pic_address (operands[1],
1377 ? operands[0] : NULL_RTX);
1382 /* If we are trying to toss an integer constant into FP registers,
1383 or loading a FP or vector constant, force it into memory. */
1384 if (CONSTANT_P (operands[1])
1385 && REG_P (operands[0])
1386 && (SPARC_FP_REG_P (REGNO (operands[0]))
1387 || SCALAR_FLOAT_MODE_P (mode)
1388 || VECTOR_MODE_P (mode)))
1390 /* emit_group_store will send such bogosity to us when it is
1391 not storing directly into memory. So fix this up to avoid
1392 crashes in output_constant_pool. */
1393 if (operands [1] == const0_rtx)
1394 operands[1] = CONST0_RTX (mode);
1396 /* We can clear or set to all-ones FP registers if TARGET_VIS, and
1397 always other regs. */
1398 if ((TARGET_VIS || REGNO (operands[0]) < SPARC_FIRST_FP_REG)
1399 && (const_zero_operand (operands[1], mode)
1400 || const_all_ones_operand (operands[1], mode)))
1403 if (REGNO (operands[0]) < SPARC_FIRST_FP_REG
1404 /* We are able to build any SF constant in integer registers
1405 with at most 2 instructions. */
1407 /* And any DF constant in integer registers. */
1409 && ! can_create_pseudo_p ())))
1412 operands[1] = force_const_mem (mode, operands[1]);
1413 if (!reload_in_progress)
1414 operands[1] = validize_mem (operands[1]);
1418 /* Accept non-constants and valid constants unmodified. */
1419 if (!CONSTANT_P (operands[1])
1420 || GET_CODE (operands[1]) == HIGH
1421 || input_operand (operands[1], mode))
1427 /* All QImode constants require only one insn, so proceed. */
1432 sparc_emit_set_const32 (operands[0], operands[1]);
1436 /* input_operand should have filtered out 32-bit mode. */
1437 sparc_emit_set_const64 (operands[0], operands[1]);
1447 /* Load OP1, a 32-bit constant, into OP0, a register.
1448 We know it can't be done in one insn when we get
1449 here, the move expander guarantees this. */
1452 sparc_emit_set_const32 (rtx op0, rtx op1)
1454 enum machine_mode mode = GET_MODE (op0);
1457 if (can_create_pseudo_p ())
1458 temp = gen_reg_rtx (mode);
1460 if (GET_CODE (op1) == CONST_INT)
1462 gcc_assert (!small_int_operand (op1, mode)
1463 && !const_high_operand (op1, mode));
1465 /* Emit them as real moves instead of a HIGH/LO_SUM,
1466 this way CSE can see everything and reuse intermediate
1467 values if it wants. */
1468 emit_insn (gen_rtx_SET (VOIDmode, temp,
1469 GEN_INT (INTVAL (op1)
1470 & ~(HOST_WIDE_INT)0x3ff)));
1472 emit_insn (gen_rtx_SET (VOIDmode,
1474 gen_rtx_IOR (mode, temp,
1475 GEN_INT (INTVAL (op1) & 0x3ff))));
1479 /* A symbol, emit in the traditional way. */
1480 emit_insn (gen_rtx_SET (VOIDmode, temp,
1481 gen_rtx_HIGH (mode, op1)));
1482 emit_insn (gen_rtx_SET (VOIDmode,
1483 op0, gen_rtx_LO_SUM (mode, temp, op1)));
1487 /* Load OP1, a symbolic 64-bit constant, into OP0, a DImode register.
1488 If TEMP is nonzero, we are forbidden to use any other scratch
1489 registers. Otherwise, we are allowed to generate them as needed.
1491 Note that TEMP may have TImode if the code model is TARGET_CM_MEDANY
1492 or TARGET_CM_EMBMEDANY (see the reload_indi and reload_outdi patterns). */
1495 sparc_emit_set_symbolic_const64 (rtx op0, rtx op1, rtx temp)
1497 rtx temp1, temp2, temp3, temp4, temp5;
1500 if (temp && GET_MODE (temp) == TImode)
1503 temp = gen_rtx_REG (DImode, REGNO (temp));
1506 /* SPARC-V9 code-model support. */
1507 switch (sparc_cmodel)
1510 /* The range spanned by all instructions in the object is less
1511 than 2^31 bytes (2GB) and the distance from any instruction
1512 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1513 than 2^31 bytes (2GB).
1515 The executable must be in the low 4TB of the virtual address
1518 sethi %hi(symbol), %temp1
1519 or %temp1, %lo(symbol), %reg */
1521 temp1 = temp; /* op0 is allowed. */
1523 temp1 = gen_reg_rtx (DImode);
1525 emit_insn (gen_rtx_SET (VOIDmode, temp1, gen_rtx_HIGH (DImode, op1)));
1526 emit_insn (gen_rtx_SET (VOIDmode, op0, gen_rtx_LO_SUM (DImode, temp1, op1)));
1530 /* The range spanned by all instructions in the object is less
1531 than 2^31 bytes (2GB) and the distance from any instruction
1532 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1533 than 2^31 bytes (2GB).
1535 The executable must be in the low 16TB of the virtual address
1538 sethi %h44(symbol), %temp1
1539 or %temp1, %m44(symbol), %temp2
1540 sllx %temp2, 12, %temp3
1541 or %temp3, %l44(symbol), %reg */
1546 temp3 = temp; /* op0 is allowed. */
1550 temp1 = gen_reg_rtx (DImode);
1551 temp2 = gen_reg_rtx (DImode);
1552 temp3 = gen_reg_rtx (DImode);
1555 emit_insn (gen_seth44 (temp1, op1));
1556 emit_insn (gen_setm44 (temp2, temp1, op1));
1557 emit_insn (gen_rtx_SET (VOIDmode, temp3,
1558 gen_rtx_ASHIFT (DImode, temp2, GEN_INT (12))));
1559 emit_insn (gen_setl44 (op0, temp3, op1));
1563 /* The range spanned by all instructions in the object is less
1564 than 2^31 bytes (2GB) and the distance from any instruction
1565 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1566 than 2^31 bytes (2GB).
1568 The executable can be placed anywhere in the virtual address
1571 sethi %hh(symbol), %temp1
1572 sethi %lm(symbol), %temp2
1573 or %temp1, %hm(symbol), %temp3
1574 sllx %temp3, 32, %temp4
1575 or %temp4, %temp2, %temp5
1576 or %temp5, %lo(symbol), %reg */
1579 /* It is possible that one of the registers we got for operands[2]
1580 might coincide with that of operands[0] (which is why we made
1581 it TImode). Pick the other one to use as our scratch. */
1582 if (rtx_equal_p (temp, op0))
1584 gcc_assert (ti_temp);
1585 temp = gen_rtx_REG (DImode, REGNO (temp) + 1);
1588 temp2 = temp; /* op0 is _not_ allowed, see above. */
1595 temp1 = gen_reg_rtx (DImode);
1596 temp2 = gen_reg_rtx (DImode);
1597 temp3 = gen_reg_rtx (DImode);
1598 temp4 = gen_reg_rtx (DImode);
1599 temp5 = gen_reg_rtx (DImode);
1602 emit_insn (gen_sethh (temp1, op1));
1603 emit_insn (gen_setlm (temp2, op1));
1604 emit_insn (gen_sethm (temp3, temp1, op1));
1605 emit_insn (gen_rtx_SET (VOIDmode, temp4,
1606 gen_rtx_ASHIFT (DImode, temp3, GEN_INT (32))));
1607 emit_insn (gen_rtx_SET (VOIDmode, temp5,
1608 gen_rtx_PLUS (DImode, temp4, temp2)));
1609 emit_insn (gen_setlo (op0, temp5, op1));
1613 /* Old old old backwards compatibility kruft here.
1614 Essentially it is MEDLOW with a fixed 64-bit
1615 virtual base added to all data segment addresses.
1616 Text-segment stuff is computed like MEDANY, we can't
1617 reuse the code above because the relocation knobs
1620 Data segment: sethi %hi(symbol), %temp1
1621 add %temp1, EMBMEDANY_BASE_REG, %temp2
1622 or %temp2, %lo(symbol), %reg */
1623 if (data_segment_operand (op1, GET_MODE (op1)))
1627 temp1 = temp; /* op0 is allowed. */
1632 temp1 = gen_reg_rtx (DImode);
1633 temp2 = gen_reg_rtx (DImode);
1636 emit_insn (gen_embmedany_sethi (temp1, op1));
1637 emit_insn (gen_embmedany_brsum (temp2, temp1));
1638 emit_insn (gen_embmedany_losum (op0, temp2, op1));
1641 /* Text segment: sethi %uhi(symbol), %temp1
1642 sethi %hi(symbol), %temp2
1643 or %temp1, %ulo(symbol), %temp3
1644 sllx %temp3, 32, %temp4
1645 or %temp4, %temp2, %temp5
1646 or %temp5, %lo(symbol), %reg */
1651 /* It is possible that one of the registers we got for operands[2]
1652 might coincide with that of operands[0] (which is why we made
1653 it TImode). Pick the other one to use as our scratch. */
1654 if (rtx_equal_p (temp, op0))
1656 gcc_assert (ti_temp);
1657 temp = gen_rtx_REG (DImode, REGNO (temp) + 1);
1660 temp2 = temp; /* op0 is _not_ allowed, see above. */
1667 temp1 = gen_reg_rtx (DImode);
1668 temp2 = gen_reg_rtx (DImode);
1669 temp3 = gen_reg_rtx (DImode);
1670 temp4 = gen_reg_rtx (DImode);
1671 temp5 = gen_reg_rtx (DImode);
1674 emit_insn (gen_embmedany_textuhi (temp1, op1));
1675 emit_insn (gen_embmedany_texthi (temp2, op1));
1676 emit_insn (gen_embmedany_textulo (temp3, temp1, op1));
1677 emit_insn (gen_rtx_SET (VOIDmode, temp4,
1678 gen_rtx_ASHIFT (DImode, temp3, GEN_INT (32))));
1679 emit_insn (gen_rtx_SET (VOIDmode, temp5,
1680 gen_rtx_PLUS (DImode, temp4, temp2)));
1681 emit_insn (gen_embmedany_textlo (op0, temp5, op1));
1690 #if HOST_BITS_PER_WIDE_INT == 32
1692 sparc_emit_set_const64 (rtx op0 ATTRIBUTE_UNUSED, rtx op1 ATTRIBUTE_UNUSED)
1697 /* These avoid problems when cross compiling. If we do not
1698 go through all this hair then the optimizer will see
1699 invalid REG_EQUAL notes or in some cases none at all. */
1700 static rtx gen_safe_HIGH64 (rtx, HOST_WIDE_INT);
1701 static rtx gen_safe_SET64 (rtx, HOST_WIDE_INT);
1702 static rtx gen_safe_OR64 (rtx, HOST_WIDE_INT);
1703 static rtx gen_safe_XOR64 (rtx, HOST_WIDE_INT);
1705 /* The optimizer is not to assume anything about exactly
1706 which bits are set for a HIGH, they are unspecified.
1707 Unfortunately this leads to many missed optimizations
1708 during CSE. We mask out the non-HIGH bits, and matches
1709 a plain movdi, to alleviate this problem. */
1711 gen_safe_HIGH64 (rtx dest, HOST_WIDE_INT val)
1713 return gen_rtx_SET (VOIDmode, dest, GEN_INT (val & ~(HOST_WIDE_INT)0x3ff));
1717 gen_safe_SET64 (rtx dest, HOST_WIDE_INT val)
1719 return gen_rtx_SET (VOIDmode, dest, GEN_INT (val));
1723 gen_safe_OR64 (rtx src, HOST_WIDE_INT val)
1725 return gen_rtx_IOR (DImode, src, GEN_INT (val));
1729 gen_safe_XOR64 (rtx src, HOST_WIDE_INT val)
1731 return gen_rtx_XOR (DImode, src, GEN_INT (val));
1734 /* Worker routines for 64-bit constant formation on arch64.
1735 One of the key things to be doing in these emissions is
1736 to create as many temp REGs as possible. This makes it
1737 possible for half-built constants to be used later when
1738 such values are similar to something required later on.
1739 Without doing this, the optimizer cannot see such
1742 static void sparc_emit_set_const64_quick1 (rtx, rtx,
1743 unsigned HOST_WIDE_INT, int);
1746 sparc_emit_set_const64_quick1 (rtx op0, rtx temp,
1747 unsigned HOST_WIDE_INT low_bits, int is_neg)
1749 unsigned HOST_WIDE_INT high_bits;
1752 high_bits = (~low_bits) & 0xffffffff;
1754 high_bits = low_bits;
1756 emit_insn (gen_safe_HIGH64 (temp, high_bits));
1759 emit_insn (gen_rtx_SET (VOIDmode, op0,
1760 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
1764 /* If we are XOR'ing with -1, then we should emit a one's complement
1765 instead. This way the combiner will notice logical operations
1766 such as ANDN later on and substitute. */
1767 if ((low_bits & 0x3ff) == 0x3ff)
1769 emit_insn (gen_rtx_SET (VOIDmode, op0,
1770 gen_rtx_NOT (DImode, temp)));
1774 emit_insn (gen_rtx_SET (VOIDmode, op0,
1775 gen_safe_XOR64 (temp,
1776 (-(HOST_WIDE_INT)0x400
1777 | (low_bits & 0x3ff)))));
1782 static void sparc_emit_set_const64_quick2 (rtx, rtx, unsigned HOST_WIDE_INT,
1783 unsigned HOST_WIDE_INT, int);
1786 sparc_emit_set_const64_quick2 (rtx op0, rtx temp,
1787 unsigned HOST_WIDE_INT high_bits,
1788 unsigned HOST_WIDE_INT low_immediate,
1793 if ((high_bits & 0xfffffc00) != 0)
1795 emit_insn (gen_safe_HIGH64 (temp, high_bits));
1796 if ((high_bits & ~0xfffffc00) != 0)
1797 emit_insn (gen_rtx_SET (VOIDmode, op0,
1798 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
1804 emit_insn (gen_safe_SET64 (temp, high_bits));
1808 /* Now shift it up into place. */
1809 emit_insn (gen_rtx_SET (VOIDmode, op0,
1810 gen_rtx_ASHIFT (DImode, temp2,
1811 GEN_INT (shift_count))));
1813 /* If there is a low immediate part piece, finish up by
1814 putting that in as well. */
1815 if (low_immediate != 0)
1816 emit_insn (gen_rtx_SET (VOIDmode, op0,
1817 gen_safe_OR64 (op0, low_immediate)));
1820 static void sparc_emit_set_const64_longway (rtx, rtx, unsigned HOST_WIDE_INT,
1821 unsigned HOST_WIDE_INT);
1823 /* Full 64-bit constant decomposition. Even though this is the
1824 'worst' case, we still optimize a few things away. */
1826 sparc_emit_set_const64_longway (rtx op0, rtx temp,
1827 unsigned HOST_WIDE_INT high_bits,
1828 unsigned HOST_WIDE_INT low_bits)
1832 if (can_create_pseudo_p ())
1833 sub_temp = gen_reg_rtx (DImode);
1835 if ((high_bits & 0xfffffc00) != 0)
1837 emit_insn (gen_safe_HIGH64 (temp, high_bits));
1838 if ((high_bits & ~0xfffffc00) != 0)
1839 emit_insn (gen_rtx_SET (VOIDmode,
1841 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
1847 emit_insn (gen_safe_SET64 (temp, high_bits));
1851 if (can_create_pseudo_p ())
1853 rtx temp2 = gen_reg_rtx (DImode);
1854 rtx temp3 = gen_reg_rtx (DImode);
1855 rtx temp4 = gen_reg_rtx (DImode);
1857 emit_insn (gen_rtx_SET (VOIDmode, temp4,
1858 gen_rtx_ASHIFT (DImode, sub_temp,
1861 emit_insn (gen_safe_HIGH64 (temp2, low_bits));
1862 if ((low_bits & ~0xfffffc00) != 0)
1864 emit_insn (gen_rtx_SET (VOIDmode, temp3,
1865 gen_safe_OR64 (temp2, (low_bits & 0x3ff))));
1866 emit_insn (gen_rtx_SET (VOIDmode, op0,
1867 gen_rtx_PLUS (DImode, temp4, temp3)));
1871 emit_insn (gen_rtx_SET (VOIDmode, op0,
1872 gen_rtx_PLUS (DImode, temp4, temp2)));
1877 rtx low1 = GEN_INT ((low_bits >> (32 - 12)) & 0xfff);
1878 rtx low2 = GEN_INT ((low_bits >> (32 - 12 - 12)) & 0xfff);
1879 rtx low3 = GEN_INT ((low_bits >> (32 - 12 - 12 - 8)) & 0x0ff);
1882 /* We are in the middle of reload, so this is really
1883 painful. However we do still make an attempt to
1884 avoid emitting truly stupid code. */
1885 if (low1 != const0_rtx)
1887 emit_insn (gen_rtx_SET (VOIDmode, op0,
1888 gen_rtx_ASHIFT (DImode, sub_temp,
1889 GEN_INT (to_shift))));
1890 emit_insn (gen_rtx_SET (VOIDmode, op0,
1891 gen_rtx_IOR (DImode, op0, low1)));
1899 if (low2 != const0_rtx)
1901 emit_insn (gen_rtx_SET (VOIDmode, op0,
1902 gen_rtx_ASHIFT (DImode, sub_temp,
1903 GEN_INT (to_shift))));
1904 emit_insn (gen_rtx_SET (VOIDmode, op0,
1905 gen_rtx_IOR (DImode, op0, low2)));
1913 emit_insn (gen_rtx_SET (VOIDmode, op0,
1914 gen_rtx_ASHIFT (DImode, sub_temp,
1915 GEN_INT (to_shift))));
1916 if (low3 != const0_rtx)
1917 emit_insn (gen_rtx_SET (VOIDmode, op0,
1918 gen_rtx_IOR (DImode, op0, low3)));
1923 /* Analyze a 64-bit constant for certain properties. */
1924 static void analyze_64bit_constant (unsigned HOST_WIDE_INT,
1925 unsigned HOST_WIDE_INT,
1926 int *, int *, int *);
1929 analyze_64bit_constant (unsigned HOST_WIDE_INT high_bits,
1930 unsigned HOST_WIDE_INT low_bits,
1931 int *hbsp, int *lbsp, int *abbasp)
1933 int lowest_bit_set, highest_bit_set, all_bits_between_are_set;
1936 lowest_bit_set = highest_bit_set = -1;
1940 if ((lowest_bit_set == -1)
1941 && ((low_bits >> i) & 1))
1943 if ((highest_bit_set == -1)
1944 && ((high_bits >> (32 - i - 1)) & 1))
1945 highest_bit_set = (64 - i - 1);
1948 && ((highest_bit_set == -1)
1949 || (lowest_bit_set == -1)));
1955 if ((lowest_bit_set == -1)
1956 && ((high_bits >> i) & 1))
1957 lowest_bit_set = i + 32;
1958 if ((highest_bit_set == -1)
1959 && ((low_bits >> (32 - i - 1)) & 1))
1960 highest_bit_set = 32 - i - 1;
1963 && ((highest_bit_set == -1)
1964 || (lowest_bit_set == -1)));
1966 /* If there are no bits set this should have gone out
1967 as one instruction! */
1968 gcc_assert (lowest_bit_set != -1 && highest_bit_set != -1);
1969 all_bits_between_are_set = 1;
1970 for (i = lowest_bit_set; i <= highest_bit_set; i++)
1974 if ((low_bits & (1 << i)) != 0)
1979 if ((high_bits & (1 << (i - 32))) != 0)
1982 all_bits_between_are_set = 0;
1985 *hbsp = highest_bit_set;
1986 *lbsp = lowest_bit_set;
1987 *abbasp = all_bits_between_are_set;
1990 static int const64_is_2insns (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
1993 const64_is_2insns (unsigned HOST_WIDE_INT high_bits,
1994 unsigned HOST_WIDE_INT low_bits)
1996 int highest_bit_set, lowest_bit_set, all_bits_between_are_set;
1999 || high_bits == 0xffffffff)
2002 analyze_64bit_constant (high_bits, low_bits,
2003 &highest_bit_set, &lowest_bit_set,
2004 &all_bits_between_are_set);
2006 if ((highest_bit_set == 63
2007 || lowest_bit_set == 0)
2008 && all_bits_between_are_set != 0)
2011 if ((highest_bit_set - lowest_bit_set) < 21)
2017 static unsigned HOST_WIDE_INT create_simple_focus_bits (unsigned HOST_WIDE_INT,
2018 unsigned HOST_WIDE_INT,
2021 static unsigned HOST_WIDE_INT
2022 create_simple_focus_bits (unsigned HOST_WIDE_INT high_bits,
2023 unsigned HOST_WIDE_INT low_bits,
2024 int lowest_bit_set, int shift)
2026 HOST_WIDE_INT hi, lo;
2028 if (lowest_bit_set < 32)
2030 lo = (low_bits >> lowest_bit_set) << shift;
2031 hi = ((high_bits << (32 - lowest_bit_set)) << shift);
2036 hi = ((high_bits >> (lowest_bit_set - 32)) << shift);
2038 gcc_assert (! (hi & lo));
2042 /* Here we are sure to be arch64 and this is an integer constant
2043 being loaded into a register. Emit the most efficient
2044 insn sequence possible. Detection of all the 1-insn cases
2045 has been done already. */
2047 sparc_emit_set_const64 (rtx op0, rtx op1)
2049 unsigned HOST_WIDE_INT high_bits, low_bits;
2050 int lowest_bit_set, highest_bit_set;
2051 int all_bits_between_are_set;
2054 /* Sanity check that we know what we are working with. */
2055 gcc_assert (TARGET_ARCH64
2056 && (GET_CODE (op0) == SUBREG
2057 || (REG_P (op0) && ! SPARC_FP_REG_P (REGNO (op0)))));
2059 if (! can_create_pseudo_p ())
2062 if (GET_CODE (op1) != CONST_INT)
2064 sparc_emit_set_symbolic_const64 (op0, op1, temp);
2069 temp = gen_reg_rtx (DImode);
2071 high_bits = ((INTVAL (op1) >> 32) & 0xffffffff);
2072 low_bits = (INTVAL (op1) & 0xffffffff);
2074 /* low_bits bits 0 --> 31
2075 high_bits bits 32 --> 63 */
2077 analyze_64bit_constant (high_bits, low_bits,
2078 &highest_bit_set, &lowest_bit_set,
2079 &all_bits_between_are_set);
2081 /* First try for a 2-insn sequence. */
2083 /* These situations are preferred because the optimizer can
2084 * do more things with them:
2086 * sllx %reg, shift, %reg
2088 * srlx %reg, shift, %reg
2089 * 3) mov some_small_const, %reg
2090 * sllx %reg, shift, %reg
2092 if (((highest_bit_set == 63
2093 || lowest_bit_set == 0)
2094 && all_bits_between_are_set != 0)
2095 || ((highest_bit_set - lowest_bit_set) < 12))
2097 HOST_WIDE_INT the_const = -1;
2098 int shift = lowest_bit_set;
2100 if ((highest_bit_set != 63
2101 && lowest_bit_set != 0)
2102 || all_bits_between_are_set == 0)
2105 create_simple_focus_bits (high_bits, low_bits,
2108 else if (lowest_bit_set == 0)
2109 shift = -(63 - highest_bit_set);
2111 gcc_assert (SPARC_SIMM13_P (the_const));
2112 gcc_assert (shift != 0);
2114 emit_insn (gen_safe_SET64 (temp, the_const));
2116 emit_insn (gen_rtx_SET (VOIDmode,
2118 gen_rtx_ASHIFT (DImode,
2122 emit_insn (gen_rtx_SET (VOIDmode,
2124 gen_rtx_LSHIFTRT (DImode,
2126 GEN_INT (-shift))));
2130 /* Now a range of 22 or less bits set somewhere.
2131 * 1) sethi %hi(focus_bits), %reg
2132 * sllx %reg, shift, %reg
2133 * 2) sethi %hi(focus_bits), %reg
2134 * srlx %reg, shift, %reg
2136 if ((highest_bit_set - lowest_bit_set) < 21)
2138 unsigned HOST_WIDE_INT focus_bits =
2139 create_simple_focus_bits (high_bits, low_bits,
2140 lowest_bit_set, 10);
2142 gcc_assert (SPARC_SETHI_P (focus_bits));
2143 gcc_assert (lowest_bit_set != 10);
2145 emit_insn (gen_safe_HIGH64 (temp, focus_bits));
2147 /* If lowest_bit_set == 10 then a sethi alone could have done it. */
2148 if (lowest_bit_set < 10)
2149 emit_insn (gen_rtx_SET (VOIDmode,
2151 gen_rtx_LSHIFTRT (DImode, temp,
2152 GEN_INT (10 - lowest_bit_set))));
2153 else if (lowest_bit_set > 10)
2154 emit_insn (gen_rtx_SET (VOIDmode,
2156 gen_rtx_ASHIFT (DImode, temp,
2157 GEN_INT (lowest_bit_set - 10))));
2161 /* 1) sethi %hi(low_bits), %reg
2162 * or %reg, %lo(low_bits), %reg
2163 * 2) sethi %hi(~low_bits), %reg
2164 * xor %reg, %lo(-0x400 | (low_bits & 0x3ff)), %reg
2167 || high_bits == 0xffffffff)
2169 sparc_emit_set_const64_quick1 (op0, temp, low_bits,
2170 (high_bits == 0xffffffff));
2174 /* Now, try 3-insn sequences. */
2176 /* 1) sethi %hi(high_bits), %reg
2177 * or %reg, %lo(high_bits), %reg
2178 * sllx %reg, 32, %reg
2182 sparc_emit_set_const64_quick2 (op0, temp, high_bits, 0, 32);
2186 /* We may be able to do something quick
2187 when the constant is negated, so try that. */
2188 if (const64_is_2insns ((~high_bits) & 0xffffffff,
2189 (~low_bits) & 0xfffffc00))
2191 /* NOTE: The trailing bits get XOR'd so we need the
2192 non-negated bits, not the negated ones. */
2193 unsigned HOST_WIDE_INT trailing_bits = low_bits & 0x3ff;
2195 if ((((~high_bits) & 0xffffffff) == 0
2196 && ((~low_bits) & 0x80000000) == 0)
2197 || (((~high_bits) & 0xffffffff) == 0xffffffff
2198 && ((~low_bits) & 0x80000000) != 0))
2200 unsigned HOST_WIDE_INT fast_int = (~low_bits & 0xffffffff);
2202 if ((SPARC_SETHI_P (fast_int)
2203 && (~high_bits & 0xffffffff) == 0)
2204 || SPARC_SIMM13_P (fast_int))
2205 emit_insn (gen_safe_SET64 (temp, fast_int));
2207 sparc_emit_set_const64 (temp, GEN_INT (fast_int));
2212 negated_const = GEN_INT (((~low_bits) & 0xfffffc00) |
2213 (((HOST_WIDE_INT)((~high_bits) & 0xffffffff))<<32));
2214 sparc_emit_set_const64 (temp, negated_const);
2217 /* If we are XOR'ing with -1, then we should emit a one's complement
2218 instead. This way the combiner will notice logical operations
2219 such as ANDN later on and substitute. */
2220 if (trailing_bits == 0x3ff)
2222 emit_insn (gen_rtx_SET (VOIDmode, op0,
2223 gen_rtx_NOT (DImode, temp)));
2227 emit_insn (gen_rtx_SET (VOIDmode,
2229 gen_safe_XOR64 (temp,
2230 (-0x400 | trailing_bits))));
2235 /* 1) sethi %hi(xxx), %reg
2236 * or %reg, %lo(xxx), %reg
2237 * sllx %reg, yyy, %reg
2239 * ??? This is just a generalized version of the low_bits==0
2240 * thing above, FIXME...
2242 if ((highest_bit_set - lowest_bit_set) < 32)
2244 unsigned HOST_WIDE_INT focus_bits =
2245 create_simple_focus_bits (high_bits, low_bits,
2248 /* We can't get here in this state. */
2249 gcc_assert (highest_bit_set >= 32 && lowest_bit_set < 32);
2251 /* So what we know is that the set bits straddle the
2252 middle of the 64-bit word. */
2253 sparc_emit_set_const64_quick2 (op0, temp,
2259 /* 1) sethi %hi(high_bits), %reg
2260 * or %reg, %lo(high_bits), %reg
2261 * sllx %reg, 32, %reg
2262 * or %reg, low_bits, %reg
2264 if (SPARC_SIMM13_P(low_bits)
2265 && ((int)low_bits > 0))
2267 sparc_emit_set_const64_quick2 (op0, temp, high_bits, low_bits, 32);
2271 /* The easiest way when all else fails, is full decomposition. */
2272 sparc_emit_set_const64_longway (op0, temp, high_bits, low_bits);
2274 #endif /* HOST_BITS_PER_WIDE_INT == 32 */
2276 /* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
2277 return the mode to be used for the comparison. For floating-point,
2278 CCFP[E]mode is used. CC_NOOVmode should be used when the first operand
2279 is a PLUS, MINUS, NEG, or ASHIFT. CCmode should be used when no special
2280 processing is needed. */
2283 select_cc_mode (enum rtx_code op, rtx x, rtx y ATTRIBUTE_UNUSED)
2285 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2311 else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
2312 || GET_CODE (x) == NEG || GET_CODE (x) == ASHIFT)
2314 if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2315 return CCX_NOOVmode;
2321 if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2328 /* Emit the compare insn and return the CC reg for a CODE comparison
2329 with operands X and Y. */
2332 gen_compare_reg_1 (enum rtx_code code, rtx x, rtx y)
2334 enum machine_mode mode;
2337 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_CC)
2340 mode = SELECT_CC_MODE (code, x, y);
2342 /* ??? We don't have movcc patterns so we cannot generate pseudo regs for the
2343 fcc regs (cse can't tell they're really call clobbered regs and will
2344 remove a duplicate comparison even if there is an intervening function
2345 call - it will then try to reload the cc reg via an int reg which is why
2346 we need the movcc patterns). It is possible to provide the movcc
2347 patterns by using the ldxfsr/stxfsr v9 insns. I tried it: you need two
2348 registers (say %g1,%g5) and it takes about 6 insns. A better fix would be
2349 to tell cse that CCFPE mode registers (even pseudos) are call
2352 /* ??? This is an experiment. Rather than making changes to cse which may
2353 or may not be easy/clean, we do our own cse. This is possible because
2354 we will generate hard registers. Cse knows they're call clobbered (it
2355 doesn't know the same thing about pseudos). If we guess wrong, no big
2356 deal, but if we win, great! */
2358 if (TARGET_V9 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2359 #if 1 /* experiment */
2362 /* We cycle through the registers to ensure they're all exercised. */
2363 static int next_fcc_reg = 0;
2364 /* Previous x,y for each fcc reg. */
2365 static rtx prev_args[4][2];
2367 /* Scan prev_args for x,y. */
2368 for (reg = 0; reg < 4; reg++)
2369 if (prev_args[reg][0] == x && prev_args[reg][1] == y)
2374 prev_args[reg][0] = x;
2375 prev_args[reg][1] = y;
2376 next_fcc_reg = (next_fcc_reg + 1) & 3;
2378 cc_reg = gen_rtx_REG (mode, reg + SPARC_FIRST_V9_FCC_REG);
2381 cc_reg = gen_reg_rtx (mode);
2382 #endif /* ! experiment */
2383 else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2384 cc_reg = gen_rtx_REG (mode, SPARC_FCC_REG);
2386 cc_reg = gen_rtx_REG (mode, SPARC_ICC_REG);
2388 /* We shouldn't get there for TFmode if !TARGET_HARD_QUAD. If we do, this
2389 will only result in an unrecognizable insn so no point in asserting. */
2390 emit_insn (gen_rtx_SET (VOIDmode, cc_reg, gen_rtx_COMPARE (mode, x, y)));
2396 /* Emit the compare insn and return the CC reg for the comparison in CMP. */
2399 gen_compare_reg (rtx cmp)
2401 return gen_compare_reg_1 (GET_CODE (cmp), XEXP (cmp, 0), XEXP (cmp, 1));
2404 /* This function is used for v9 only.
2405 DEST is the target of the Scc insn.
2406 CODE is the code for an Scc's comparison.
2407 X and Y are the values we compare.
2409 This function is needed to turn
2412 (gt (reg:CCX 100 %icc)
2416 (gt:DI (reg:CCX 100 %icc)
2419 IE: The instruction recognizer needs to see the mode of the comparison to
2420 find the right instruction. We could use "gt:DI" right in the
2421 define_expand, but leaving it out allows us to handle DI, SI, etc. */
2424 gen_v9_scc (rtx dest, enum rtx_code compare_code, rtx x, rtx y)
2427 && (GET_MODE (x) == DImode
2428 || GET_MODE (dest) == DImode))
2431 /* Try to use the movrCC insns. */
2433 && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT
2435 && v9_regcmp_p (compare_code))
2440 /* Special case for op0 != 0. This can be done with one instruction if
2443 if (compare_code == NE
2444 && GET_MODE (dest) == DImode
2445 && rtx_equal_p (op0, dest))
2447 emit_insn (gen_rtx_SET (VOIDmode, dest,
2448 gen_rtx_IF_THEN_ELSE (DImode,
2449 gen_rtx_fmt_ee (compare_code, DImode,
2456 if (reg_overlap_mentioned_p (dest, op0))
2458 /* Handle the case where dest == x.
2459 We "early clobber" the result. */
2460 op0 = gen_reg_rtx (GET_MODE (x));
2461 emit_move_insn (op0, x);
2464 emit_insn (gen_rtx_SET (VOIDmode, dest, const0_rtx));
2465 if (GET_MODE (op0) != DImode)
2467 temp = gen_reg_rtx (DImode);
2468 convert_move (temp, op0, 0);
2472 emit_insn (gen_rtx_SET (VOIDmode, dest,
2473 gen_rtx_IF_THEN_ELSE (GET_MODE (dest),
2474 gen_rtx_fmt_ee (compare_code, DImode,
2482 x = gen_compare_reg_1 (compare_code, x, y);
2485 gcc_assert (GET_MODE (x) != CC_NOOVmode
2486 && GET_MODE (x) != CCX_NOOVmode);
2488 emit_insn (gen_rtx_SET (VOIDmode, dest, const0_rtx));
2489 emit_insn (gen_rtx_SET (VOIDmode, dest,
2490 gen_rtx_IF_THEN_ELSE (GET_MODE (dest),
2491 gen_rtx_fmt_ee (compare_code,
2492 GET_MODE (x), x, y),
2493 const1_rtx, dest)));
2499 /* Emit an scc insn. For seq, sne, sgeu, and sltu, we can do this
2500 without jumps using the addx/subx instructions. */
2503 emit_scc_insn (rtx operands[])
2510 /* The quad-word fp compare library routines all return nonzero to indicate
2511 true, which is different from the equivalent libgcc routines, so we must
2512 handle them specially here. */
2513 if (GET_MODE (operands[2]) == TFmode && ! TARGET_HARD_QUAD)
2515 operands[1] = sparc_emit_float_lib_cmp (operands[2], operands[3],
2516 GET_CODE (operands[1]));
2517 operands[2] = XEXP (operands[1], 0);
2518 operands[3] = XEXP (operands[1], 1);
2521 code = GET_CODE (operands[1]);
2525 /* For seq/sne on v9 we use the same code as v8 (the addx/subx method has
2526 more applications). The exception to this is "reg != 0" which can
2527 be done in one instruction on v9 (so we do it). */
2530 if (GET_MODE (x) == SImode)
2532 rtx pat = gen_seqsi_special (operands[0], x, y);
2536 else if (GET_MODE (x) == DImode)
2538 rtx pat = gen_seqdi_special (operands[0], x, y);
2546 if (GET_MODE (x) == SImode)
2548 rtx pat = gen_snesi_special (operands[0], x, y);
2552 else if (GET_MODE (x) == DImode)
2556 pat = gen_snedi_special_vis3 (operands[0], x, y);
2558 pat = gen_snedi_special (operands[0], x, y);
2566 && GET_MODE (x) == DImode
2568 && (code == GTU || code == LTU))
2569 && gen_v9_scc (operands[0], code, x, y))
2572 /* We can do LTU and GEU using the addx/subx instructions too. And
2573 for GTU/LEU, if both operands are registers swap them and fall
2574 back to the easy case. */
2575 if (code == GTU || code == LEU)
2577 if ((GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
2578 && (GET_CODE (y) == REG || GET_CODE (y) == SUBREG))
2583 code = swap_condition (code);
2588 || (!TARGET_VIS3 && code == GEU))
2590 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2591 gen_rtx_fmt_ee (code, SImode,
2592 gen_compare_reg_1 (code, x, y),
2597 /* All the posibilities to use addx/subx based sequences has been
2598 exhausted, try for a 3 instruction sequence using v9 conditional
2600 if (TARGET_V9 && gen_v9_scc (operands[0], code, x, y))
2603 /* Nope, do branches. */
2607 /* Emit a conditional jump insn for the v9 architecture using comparison code
2608 CODE and jump target LABEL.
2609 This function exists to take advantage of the v9 brxx insns. */
2612 emit_v9_brxx_insn (enum rtx_code code, rtx op0, rtx label)
2614 emit_jump_insn (gen_rtx_SET (VOIDmode,
2616 gen_rtx_IF_THEN_ELSE (VOIDmode,
2617 gen_rtx_fmt_ee (code, GET_MODE (op0),
2619 gen_rtx_LABEL_REF (VOIDmode, label),
2624 emit_conditional_branch_insn (rtx operands[])
2626 /* The quad-word fp compare library routines all return nonzero to indicate
2627 true, which is different from the equivalent libgcc routines, so we must
2628 handle them specially here. */
2629 if (GET_MODE (operands[1]) == TFmode && ! TARGET_HARD_QUAD)
2631 operands[0] = sparc_emit_float_lib_cmp (operands[1], operands[2],
2632 GET_CODE (operands[0]));
2633 operands[1] = XEXP (operands[0], 0);
2634 operands[2] = XEXP (operands[0], 1);
2637 if (TARGET_ARCH64 && operands[2] == const0_rtx
2638 && GET_CODE (operands[1]) == REG
2639 && GET_MODE (operands[1]) == DImode)
2641 emit_v9_brxx_insn (GET_CODE (operands[0]), operands[1], operands[3]);
2645 operands[1] = gen_compare_reg (operands[0]);
2646 operands[2] = const0_rtx;
2647 operands[0] = gen_rtx_fmt_ee (GET_CODE (operands[0]), VOIDmode,
2648 operands[1], operands[2]);
2649 emit_jump_insn (gen_cbranchcc4 (operands[0], operands[1], operands[2],
2654 /* Generate a DFmode part of a hard TFmode register.
2655 REG is the TFmode hard register, LOW is 1 for the
2656 low 64bit of the register and 0 otherwise.
2659 gen_df_reg (rtx reg, int low)
2661 int regno = REGNO (reg);
2663 if ((WORDS_BIG_ENDIAN == 0) ^ (low != 0))
2664 regno += (TARGET_ARCH64 && SPARC_INT_REG_P (regno)) ? 1 : 2;
2665 return gen_rtx_REG (DFmode, regno);
2668 /* Generate a call to FUNC with OPERANDS. Operand 0 is the return value.
2669 Unlike normal calls, TFmode operands are passed by reference. It is
2670 assumed that no more than 3 operands are required. */
2673 emit_soft_tfmode_libcall (const char *func_name, int nargs, rtx *operands)
2675 rtx ret_slot = NULL, arg[3], func_sym;
2678 /* We only expect to be called for conversions, unary, and binary ops. */
2679 gcc_assert (nargs == 2 || nargs == 3);
2681 for (i = 0; i < nargs; ++i)
2683 rtx this_arg = operands[i];
2686 /* TFmode arguments and return values are passed by reference. */
2687 if (GET_MODE (this_arg) == TFmode)
2689 int force_stack_temp;
2691 force_stack_temp = 0;
2692 if (TARGET_BUGGY_QP_LIB && i == 0)
2693 force_stack_temp = 1;
2695 if (GET_CODE (this_arg) == MEM
2696 && ! force_stack_temp)
2697 this_arg = XEXP (this_arg, 0);
2698 else if (CONSTANT_P (this_arg)
2699 && ! force_stack_temp)
2701 this_slot = force_const_mem (TFmode, this_arg);
2702 this_arg = XEXP (this_slot, 0);
2706 this_slot = assign_stack_temp (TFmode, GET_MODE_SIZE (TFmode), 0);
2708 /* Operand 0 is the return value. We'll copy it out later. */
2710 emit_move_insn (this_slot, this_arg);
2712 ret_slot = this_slot;
2714 this_arg = XEXP (this_slot, 0);
2721 func_sym = gen_rtx_SYMBOL_REF (Pmode, func_name);
2723 if (GET_MODE (operands[0]) == TFmode)
2726 emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 2,
2727 arg[0], GET_MODE (arg[0]),
2728 arg[1], GET_MODE (arg[1]));
2730 emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 3,
2731 arg[0], GET_MODE (arg[0]),
2732 arg[1], GET_MODE (arg[1]),
2733 arg[2], GET_MODE (arg[2]));
2736 emit_move_insn (operands[0], ret_slot);
2742 gcc_assert (nargs == 2);
2744 ret = emit_library_call_value (func_sym, operands[0], LCT_NORMAL,
2745 GET_MODE (operands[0]), 1,
2746 arg[1], GET_MODE (arg[1]));
2748 if (ret != operands[0])
2749 emit_move_insn (operands[0], ret);
2753 /* Expand soft-float TFmode calls to sparc abi routines. */
2756 emit_soft_tfmode_binop (enum rtx_code code, rtx *operands)
2778 emit_soft_tfmode_libcall (func, 3, operands);
2782 emit_soft_tfmode_unop (enum rtx_code code, rtx *operands)
2786 gcc_assert (code == SQRT);
2789 emit_soft_tfmode_libcall (func, 2, operands);
2793 emit_soft_tfmode_cvt (enum rtx_code code, rtx *operands)
2800 switch (GET_MODE (operands[1]))
2813 case FLOAT_TRUNCATE:
2814 switch (GET_MODE (operands[0]))
2828 switch (GET_MODE (operands[1]))
2833 operands[1] = gen_rtx_SIGN_EXTEND (DImode, operands[1]);
2843 case UNSIGNED_FLOAT:
2844 switch (GET_MODE (operands[1]))
2849 operands[1] = gen_rtx_ZERO_EXTEND (DImode, operands[1]);
2860 switch (GET_MODE (operands[0]))
2874 switch (GET_MODE (operands[0]))
2891 emit_soft_tfmode_libcall (func, 2, operands);
2894 /* Expand a hard-float tfmode operation. All arguments must be in
2898 emit_hard_tfmode_operation (enum rtx_code code, rtx *operands)
2902 if (GET_RTX_CLASS (code) == RTX_UNARY)
2904 operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
2905 op = gen_rtx_fmt_e (code, GET_MODE (operands[0]), operands[1]);
2909 operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
2910 operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
2911 op = gen_rtx_fmt_ee (code, GET_MODE (operands[0]),
2912 operands[1], operands[2]);
2915 if (register_operand (operands[0], VOIDmode))
2918 dest = gen_reg_rtx (GET_MODE (operands[0]));
2920 emit_insn (gen_rtx_SET (VOIDmode, dest, op));
2922 if (dest != operands[0])
2923 emit_move_insn (operands[0], dest);
2927 emit_tfmode_binop (enum rtx_code code, rtx *operands)
2929 if (TARGET_HARD_QUAD)
2930 emit_hard_tfmode_operation (code, operands);
2932 emit_soft_tfmode_binop (code, operands);
2936 emit_tfmode_unop (enum rtx_code code, rtx *operands)
2938 if (TARGET_HARD_QUAD)
2939 emit_hard_tfmode_operation (code, operands);
2941 emit_soft_tfmode_unop (code, operands);
2945 emit_tfmode_cvt (enum rtx_code code, rtx *operands)
2947 if (TARGET_HARD_QUAD)
2948 emit_hard_tfmode_operation (code, operands);
2950 emit_soft_tfmode_cvt (code, operands);
2953 /* Return nonzero if a branch/jump/call instruction will be emitting
2954 nop into its delay slot. */
2957 empty_delay_slot (rtx insn)
2961 /* If no previous instruction (should not happen), return true. */
2962 if (PREV_INSN (insn) == NULL)
2965 seq = NEXT_INSN (PREV_INSN (insn));
2966 if (GET_CODE (PATTERN (seq)) == SEQUENCE)
2972 /* Return nonzero if TRIAL can go into the call delay slot. */
2975 tls_call_delay (rtx trial)
2980 call __tls_get_addr, %tgd_call (foo)
2981 add %l7, %o0, %o0, %tgd_add (foo)
2982 while Sun as/ld does not. */
2983 if (TARGET_GNU_TLS || !TARGET_TLS)
2986 pat = PATTERN (trial);
2988 /* We must reject tgd_add{32|64}, i.e.
2989 (set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSGD)))
2990 and tldm_add{32|64}, i.e.
2991 (set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSLDM)))
2993 if (GET_CODE (pat) == SET
2994 && GET_CODE (SET_SRC (pat)) == PLUS)
2996 rtx unspec = XEXP (SET_SRC (pat), 1);
2998 if (GET_CODE (unspec) == UNSPEC
2999 && (XINT (unspec, 1) == UNSPEC_TLSGD
3000 || XINT (unspec, 1) == UNSPEC_TLSLDM))
3007 /* Return nonzero if TRIAL, an insn, can be combined with a 'restore'
3008 instruction. RETURN_P is true if the v9 variant 'return' is to be
3009 considered in the test too.
3011 TRIAL must be a SET whose destination is a REG appropriate for the
3012 'restore' instruction or, if RETURN_P is true, for the 'return'
3016 eligible_for_restore_insn (rtx trial, bool return_p)
3018 rtx pat = PATTERN (trial);
3019 rtx src = SET_SRC (pat);
3020 bool src_is_freg = false;
3023 /* Since we now can do moves between float and integer registers when
3024 VIS3 is enabled, we have to catch this case. We can allow such
3025 moves when doing a 'return' however. */
3027 if (GET_CODE (src_reg) == SUBREG)
3028 src_reg = SUBREG_REG (src_reg);
3029 if (GET_CODE (src_reg) == REG
3030 && SPARC_FP_REG_P (REGNO (src_reg)))
3033 /* The 'restore src,%g0,dest' pattern for word mode and below. */
3034 if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
3035 && arith_operand (src, GET_MODE (src))
3039 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
3041 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (SImode);
3044 /* The 'restore src,%g0,dest' pattern for double-word mode. */
3045 else if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
3046 && arith_double_operand (src, GET_MODE (src))
3048 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
3050 /* The 'restore src,%g0,dest' pattern for float if no FPU. */
3051 else if (! TARGET_FPU && register_operand (src, SFmode))
3054 /* The 'restore src,%g0,dest' pattern for double if no FPU. */
3055 else if (! TARGET_FPU && TARGET_ARCH64 && register_operand (src, DFmode))
3058 /* If we have the 'return' instruction, anything that does not use
3059 local or output registers and can go into a delay slot wins. */
3062 && !epilogue_renumber (&pat, 1)
3063 && get_attr_in_uncond_branch_delay (trial)
3064 == IN_UNCOND_BRANCH_DELAY_TRUE)
3067 /* The 'restore src1,src2,dest' pattern for SImode. */
3068 else if (GET_CODE (src) == PLUS
3069 && register_operand (XEXP (src, 0), SImode)
3070 && arith_operand (XEXP (src, 1), SImode))
3073 /* The 'restore src1,src2,dest' pattern for DImode. */
3074 else if (GET_CODE (src) == PLUS
3075 && register_operand (XEXP (src, 0), DImode)
3076 && arith_double_operand (XEXP (src, 1), DImode))
3079 /* The 'restore src1,%lo(src2),dest' pattern. */
3080 else if (GET_CODE (src) == LO_SUM
3081 && ! TARGET_CM_MEDMID
3082 && ((register_operand (XEXP (src, 0), SImode)
3083 && immediate_operand (XEXP (src, 1), SImode))
3085 && register_operand (XEXP (src, 0), DImode)
3086 && immediate_operand (XEXP (src, 1), DImode))))
3089 /* The 'restore src,src,dest' pattern. */
3090 else if (GET_CODE (src) == ASHIFT
3091 && (register_operand (XEXP (src, 0), SImode)
3092 || register_operand (XEXP (src, 0), DImode))
3093 && XEXP (src, 1) == const1_rtx)
3099 /* Return nonzero if TRIAL can go into the function return's delay slot. */
3102 eligible_for_return_delay (rtx trial)
3107 if (GET_CODE (trial) != INSN)
3110 if (get_attr_length (trial) != 1)
3113 /* If the function uses __builtin_eh_return, the eh_return machinery
3114 occupies the delay slot. */
3115 if (crtl->calls_eh_return)
3118 /* In the case of a leaf or flat function, anything can go into the slot. */
3119 if (sparc_leaf_function_p || TARGET_FLAT)
3121 get_attr_in_uncond_branch_delay (trial) == IN_UNCOND_BRANCH_DELAY_TRUE;
3123 pat = PATTERN (trial);
3124 if (GET_CODE (pat) == PARALLEL)
3130 for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
3132 rtx expr = XVECEXP (pat, 0, i);
3133 if (GET_CODE (expr) != SET)
3135 if (GET_CODE (SET_DEST (expr)) != REG)
3137 regno = REGNO (SET_DEST (expr));
3138 if (regno >= 8 && regno < 24)
3141 return !epilogue_renumber (&pat, 1)
3142 && (get_attr_in_uncond_branch_delay (trial)
3143 == IN_UNCOND_BRANCH_DELAY_TRUE);
3146 if (GET_CODE (pat) != SET)
3149 if (GET_CODE (SET_DEST (pat)) != REG)
3152 regno = REGNO (SET_DEST (pat));
3154 /* Otherwise, only operations which can be done in tandem with
3155 a `restore' or `return' insn can go into the delay slot. */
3156 if (regno >= 8 && regno < 24)
3159 /* If this instruction sets up floating point register and we have a return
3160 instruction, it can probably go in. But restore will not work
3162 if (! SPARC_INT_REG_P (regno))
3164 && !epilogue_renumber (&pat, 1)
3165 && get_attr_in_uncond_branch_delay (trial)
3166 == IN_UNCOND_BRANCH_DELAY_TRUE);
3168 return eligible_for_restore_insn (trial, true);
3171 /* Return nonzero if TRIAL can go into the sibling call's delay slot. */
3174 eligible_for_sibcall_delay (rtx trial)
3178 if (GET_CODE (trial) != INSN || GET_CODE (PATTERN (trial)) != SET)
3181 if (get_attr_length (trial) != 1)
3184 pat = PATTERN (trial);
3186 if (sparc_leaf_function_p || TARGET_FLAT)
3188 /* If the tail call is done using the call instruction,
3189 we have to restore %o7 in the delay slot. */
3190 if (LEAF_SIBCALL_SLOT_RESERVED_P)
3193 /* %g1 is used to build the function address */
3194 if (reg_mentioned_p (gen_rtx_REG (Pmode, 1), pat))
3200 /* Otherwise, only operations which can be done in tandem with
3201 a `restore' insn can go into the delay slot. */
3202 if (GET_CODE (SET_DEST (pat)) != REG
3203 || (REGNO (SET_DEST (pat)) >= 8 && REGNO (SET_DEST (pat)) < 24)
3204 || ! SPARC_INT_REG_P (REGNO (SET_DEST (pat))))
3207 /* If it mentions %o7, it can't go in, because sibcall will clobber it
3209 if (reg_mentioned_p (gen_rtx_REG (Pmode, 15), pat))
3212 return eligible_for_restore_insn (trial, false);
3215 /* Determine if it's legal to put X into the constant pool. This
3216 is not possible if X contains the address of a symbol that is
3217 not constant (TLS) or not known at final link time (PIC). */
3220 sparc_cannot_force_const_mem (enum machine_mode mode, rtx x)
3222 switch (GET_CODE (x))
3227 /* Accept all non-symbolic constants. */
3231 /* Labels are OK iff we are non-PIC. */
3232 return flag_pic != 0;
3235 /* 'Naked' TLS symbol references are never OK,
3236 non-TLS symbols are OK iff we are non-PIC. */
3237 if (SYMBOL_REF_TLS_MODEL (x))
3240 return flag_pic != 0;
3243 return sparc_cannot_force_const_mem (mode, XEXP (x, 0));
3246 return sparc_cannot_force_const_mem (mode, XEXP (x, 0))
3247 || sparc_cannot_force_const_mem (mode, XEXP (x, 1));
3255 /* Global Offset Table support. */
3256 static GTY(()) rtx got_helper_rtx = NULL_RTX;
3257 static GTY(()) rtx global_offset_table_rtx = NULL_RTX;
3259 /* Return the SYMBOL_REF for the Global Offset Table. */
3261 static GTY(()) rtx sparc_got_symbol = NULL_RTX;
3266 if (!sparc_got_symbol)
3267 sparc_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3269 return sparc_got_symbol;
3272 /* Ensure that we are not using patterns that are not OK with PIC. */
3282 op = recog_data.operand[i];
3283 gcc_assert (GET_CODE (op) != SYMBOL_REF
3284 && (GET_CODE (op) != CONST
3285 || (GET_CODE (XEXP (op, 0)) == MINUS
3286 && XEXP (XEXP (op, 0), 0) == sparc_got ()
3287 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST)));
3294 /* Return true if X is an address which needs a temporary register when
3295 reloaded while generating PIC code. */
3298 pic_address_needs_scratch (rtx x)
3300 /* An address which is a symbolic plus a non SMALL_INT needs a temp reg. */
3301 if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
3302 && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
3303 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3304 && ! SMALL_INT (XEXP (XEXP (x, 0), 1)))
3310 /* Determine if a given RTX is a valid constant. We already know this
3311 satisfies CONSTANT_P. */
3314 sparc_legitimate_constant_p (enum machine_mode mode, rtx x)
3316 switch (GET_CODE (x))
3320 if (sparc_tls_referenced_p (x))
3325 if (GET_MODE (x) == VOIDmode)
3328 /* Floating point constants are generally not ok.
3329 The only exception is 0.0 and all-ones in VIS. */
3331 && SCALAR_FLOAT_MODE_P (mode)
3332 && (const_zero_operand (x, mode)
3333 || const_all_ones_operand (x, mode)))
3339 /* Vector constants are generally not ok.
3340 The only exception is 0 or -1 in VIS. */
3342 && (const_zero_operand (x, mode)
3343 || const_all_ones_operand (x, mode)))
3355 /* Determine if a given RTX is a valid constant address. */
3358 constant_address_p (rtx x)
3360 switch (GET_CODE (x))
3368 if (flag_pic && pic_address_needs_scratch (x))
3370 return sparc_legitimate_constant_p (Pmode, x);
3373 return !flag_pic && sparc_legitimate_constant_p (Pmode, x);
3380 /* Nonzero if the constant value X is a legitimate general operand
3381 when generating PIC code. It is given that flag_pic is on and
3382 that X satisfies CONSTANT_P or is a CONST_DOUBLE. */
3385 legitimate_pic_operand_p (rtx x)
3387 if (pic_address_needs_scratch (x))
3389 if (sparc_tls_referenced_p (x))
3394 #define RTX_OK_FOR_OFFSET_P(X, MODE) \
3396 && INTVAL (X) >= -0x1000 \
3397 && INTVAL (X) < (0x1000 - GET_MODE_SIZE (MODE)))
3399 #define RTX_OK_FOR_OLO10_P(X, MODE) \
3401 && INTVAL (X) >= -0x1000 \
3402 && INTVAL (X) < (0xc00 - GET_MODE_SIZE (MODE)))
3404 /* Handle the TARGET_LEGITIMATE_ADDRESS_P target hook.
3406 On SPARC, the actual legitimate addresses must be REG+REG or REG+SMALLINT
3407 ordinarily. This changes a bit when generating PIC. */
3410 sparc_legitimate_address_p (enum machine_mode mode, rtx addr, bool strict)
3412 rtx rs1 = NULL, rs2 = NULL, imm1 = NULL;
3414 if (REG_P (addr) || GET_CODE (addr) == SUBREG)
3416 else if (GET_CODE (addr) == PLUS)
3418 rs1 = XEXP (addr, 0);
3419 rs2 = XEXP (addr, 1);
3421 /* Canonicalize. REG comes first, if there are no regs,
3422 LO_SUM comes first. */
3424 && GET_CODE (rs1) != SUBREG
3426 || GET_CODE (rs2) == SUBREG
3427 || (GET_CODE (rs2) == LO_SUM && GET_CODE (rs1) != LO_SUM)))
3429 rs1 = XEXP (addr, 1);
3430 rs2 = XEXP (addr, 0);
3434 && rs1 == pic_offset_table_rtx
3436 && GET_CODE (rs2) != SUBREG
3437 && GET_CODE (rs2) != LO_SUM
3438 && GET_CODE (rs2) != MEM
3439 && !(GET_CODE (rs2) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs2))
3440 && (! symbolic_operand (rs2, VOIDmode) || mode == Pmode)
3441 && (GET_CODE (rs2) != CONST_INT || SMALL_INT (rs2)))
3443 || GET_CODE (rs1) == SUBREG)
3444 && RTX_OK_FOR_OFFSET_P (rs2, mode)))
3449 else if ((REG_P (rs1) || GET_CODE (rs1) == SUBREG)
3450 && (REG_P (rs2) || GET_CODE (rs2) == SUBREG))
3452 /* We prohibit REG + REG for TFmode when there are no quad move insns
3453 and we consequently need to split. We do this because REG+REG
3454 is not an offsettable address. If we get the situation in reload
3455 where source and destination of a movtf pattern are both MEMs with
3456 REG+REG address, then only one of them gets converted to an
3457 offsettable address. */
3459 && ! (TARGET_ARCH64 && TARGET_HARD_QUAD))
3462 /* We prohibit REG + REG on ARCH32 if not optimizing for
3463 DFmode/DImode because then mem_min_alignment is likely to be zero
3464 after reload and the forced split would lack a matching splitter
3466 if (TARGET_ARCH32 && !optimize
3467 && (mode == DFmode || mode == DImode))
3470 else if (USE_AS_OFFSETABLE_LO10
3471 && GET_CODE (rs1) == LO_SUM
3473 && ! TARGET_CM_MEDMID
3474 && RTX_OK_FOR_OLO10_P (rs2, mode))
3477 imm1 = XEXP (rs1, 1);
3478 rs1 = XEXP (rs1, 0);
3479 if (!CONSTANT_P (imm1)
3480 || (GET_CODE (rs1) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs1)))
3484 else if (GET_CODE (addr) == LO_SUM)
3486 rs1 = XEXP (addr, 0);
3487 imm1 = XEXP (addr, 1);
3489 if (!CONSTANT_P (imm1)
3490 || (GET_CODE (rs1) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs1)))
3493 /* We can't allow TFmode in 32-bit mode, because an offset greater
3494 than the alignment (8) may cause the LO_SUM to overflow. */
3495 if (mode == TFmode && TARGET_ARCH32)
3498 else if (GET_CODE (addr) == CONST_INT && SMALL_INT (addr))
3503 if (GET_CODE (rs1) == SUBREG)
3504 rs1 = SUBREG_REG (rs1);
3510 if (GET_CODE (rs2) == SUBREG)
3511 rs2 = SUBREG_REG (rs2);
3518 if (!REGNO_OK_FOR_BASE_P (REGNO (rs1))
3519 || (rs2 && !REGNO_OK_FOR_BASE_P (REGNO (rs2))))
3524 if ((! SPARC_INT_REG_P (REGNO (rs1))
3525 && REGNO (rs1) != FRAME_POINTER_REGNUM
3526 && REGNO (rs1) < FIRST_PSEUDO_REGISTER)
3528 && (! SPARC_INT_REG_P (REGNO (rs2))
3529 && REGNO (rs2) != FRAME_POINTER_REGNUM
3530 && REGNO (rs2) < FIRST_PSEUDO_REGISTER)))
3536 /* Return the SYMBOL_REF for the tls_get_addr function. */
3538 static GTY(()) rtx sparc_tls_symbol = NULL_RTX;
3541 sparc_tls_get_addr (void)
3543 if (!sparc_tls_symbol)
3544 sparc_tls_symbol = gen_rtx_SYMBOL_REF (Pmode, "__tls_get_addr");
3546 return sparc_tls_symbol;
3549 /* Return the Global Offset Table to be used in TLS mode. */
3552 sparc_tls_got (void)
3554 /* In PIC mode, this is just the PIC offset table. */
3557 crtl->uses_pic_offset_table = 1;
3558 return pic_offset_table_rtx;
3561 /* In non-PIC mode, Sun as (unlike GNU as) emits PC-relative relocations for
3562 the GOT symbol with the 32-bit ABI, so we reload the GOT register. */
3563 if (TARGET_SUN_TLS && TARGET_ARCH32)
3565 load_got_register ();
3566 return global_offset_table_rtx;
3569 /* In all other cases, we load a new pseudo with the GOT symbol. */
3570 return copy_to_reg (sparc_got ());
3573 /* Return true if X contains a thread-local symbol. */
3576 sparc_tls_referenced_p (rtx x)
3578 if (!TARGET_HAVE_TLS)
3581 if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS)
3582 x = XEXP (XEXP (x, 0), 0);
3584 if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x))
3587 /* That's all we handle in sparc_legitimize_tls_address for now. */
3591 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
3592 this (thread-local) address. */
3595 sparc_legitimize_tls_address (rtx addr)
3597 rtx temp1, temp2, temp3, ret, o0, got, insn;
3599 gcc_assert (can_create_pseudo_p ());
3601 if (GET_CODE (addr) == SYMBOL_REF)
3602 switch (SYMBOL_REF_TLS_MODEL (addr))
3604 case TLS_MODEL_GLOBAL_DYNAMIC:
3606 temp1 = gen_reg_rtx (SImode);
3607 temp2 = gen_reg_rtx (SImode);
3608 ret = gen_reg_rtx (Pmode);
3609 o0 = gen_rtx_REG (Pmode, 8);
3610 got = sparc_tls_got ();
3611 emit_insn (gen_tgd_hi22 (temp1, addr));
3612 emit_insn (gen_tgd_lo10 (temp2, temp1, addr));
3615 emit_insn (gen_tgd_add32 (o0, got, temp2, addr));
3616 insn = emit_call_insn (gen_tgd_call32 (o0, sparc_tls_get_addr (),
3621 emit_insn (gen_tgd_add64 (o0, got, temp2, addr));
3622 insn = emit_call_insn (gen_tgd_call64 (o0, sparc_tls_get_addr (),
3625 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), o0);
3626 insn = get_insns ();
3628 emit_libcall_block (insn, ret, o0, addr);
3631 case TLS_MODEL_LOCAL_DYNAMIC:
3633 temp1 = gen_reg_rtx (SImode);
3634 temp2 = gen_reg_rtx (SImode);
3635 temp3 = gen_reg_rtx (Pmode);
3636 ret = gen_reg_rtx (Pmode);
3637 o0 = gen_rtx_REG (Pmode, 8);
3638 got = sparc_tls_got ();
3639 emit_insn (gen_tldm_hi22 (temp1));
3640 emit_insn (gen_tldm_lo10 (temp2, temp1));
3643 emit_insn (gen_tldm_add32 (o0, got, temp2));
3644 insn = emit_call_insn (gen_tldm_call32 (o0, sparc_tls_get_addr (),
3649 emit_insn (gen_tldm_add64 (o0, got, temp2));
3650 insn = emit_call_insn (gen_tldm_call64 (o0, sparc_tls_get_addr (),
3653 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), o0);
3654 insn = get_insns ();
3656 emit_libcall_block (insn, temp3, o0,
3657 gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
3658 UNSPEC_TLSLD_BASE));
3659 temp1 = gen_reg_rtx (SImode);
3660 temp2 = gen_reg_rtx (SImode);
3661 emit_insn (gen_tldo_hix22 (temp1, addr));
3662 emit_insn (gen_tldo_lox10 (temp2, temp1, addr));
3664 emit_insn (gen_tldo_add32 (ret, temp3, temp2, addr));
3666 emit_insn (gen_tldo_add64 (ret, temp3, temp2, addr));
3669 case TLS_MODEL_INITIAL_EXEC:
3670 temp1 = gen_reg_rtx (SImode);
3671 temp2 = gen_reg_rtx (SImode);
3672 temp3 = gen_reg_rtx (Pmode);
3673 got = sparc_tls_got ();
3674 emit_insn (gen_tie_hi22 (temp1, addr));
3675 emit_insn (gen_tie_lo10 (temp2, temp1, addr));
3677 emit_insn (gen_tie_ld32 (temp3, got, temp2, addr));
3679 emit_insn (gen_tie_ld64 (temp3, got, temp2, addr));
3682 ret = gen_reg_rtx (Pmode);
3684 emit_insn (gen_tie_add32 (ret, gen_rtx_REG (Pmode, 7),
3687 emit_insn (gen_tie_add64 (ret, gen_rtx_REG (Pmode, 7),
3691 ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp3);
3694 case TLS_MODEL_LOCAL_EXEC:
3695 temp1 = gen_reg_rtx (Pmode);
3696 temp2 = gen_reg_rtx (Pmode);
3699 emit_insn (gen_tle_hix22_sp32 (temp1, addr));
3700 emit_insn (gen_tle_lox10_sp32 (temp2, temp1, addr));
3704 emit_insn (gen_tle_hix22_sp64 (temp1, addr));
3705 emit_insn (gen_tle_lox10_sp64 (temp2, temp1, addr));
3707 ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp2);
3714 else if (GET_CODE (addr) == CONST)
3718 gcc_assert (GET_CODE (XEXP (addr, 0)) == PLUS);
3720 base = sparc_legitimize_tls_address (XEXP (XEXP (addr, 0), 0));
3721 offset = XEXP (XEXP (addr, 0), 1);
3723 base = force_operand (base, NULL_RTX);
3724 if (!(GET_CODE (offset) == CONST_INT && SMALL_INT (offset)))
3725 offset = force_reg (Pmode, offset);
3726 ret = gen_rtx_PLUS (Pmode, base, offset);
3730 gcc_unreachable (); /* for now ... */
3735 /* Legitimize PIC addresses. If the address is already position-independent,
3736 we return ORIG. Newly generated position-independent addresses go into a
3737 reg. This is REG if nonzero, otherwise we allocate register(s) as
3741 sparc_legitimize_pic_address (rtx orig, rtx reg)
3743 bool gotdata_op = false;
3745 if (GET_CODE (orig) == SYMBOL_REF
3746 /* See the comment in sparc_expand_move. */
3747 || (GET_CODE (orig) == LABEL_REF && !can_use_mov_pic_label_ref (orig)))
3749 rtx pic_ref, address;
3754 gcc_assert (can_create_pseudo_p ());
3755 reg = gen_reg_rtx (Pmode);
3760 /* If not during reload, allocate another temp reg here for loading
3761 in the address, so that these instructions can be optimized
3763 rtx temp_reg = (! can_create_pseudo_p ()
3764 ? reg : gen_reg_rtx (Pmode));
3766 /* Must put the SYMBOL_REF inside an UNSPEC here so that cse
3767 won't get confused into thinking that these two instructions
3768 are loading in the true address of the symbol. If in the
3769 future a PIC rtx exists, that should be used instead. */
3772 emit_insn (gen_movdi_high_pic (temp_reg, orig));
3773 emit_insn (gen_movdi_lo_sum_pic (temp_reg, temp_reg, orig));
3777 emit_insn (gen_movsi_high_pic (temp_reg, orig));
3778 emit_insn (gen_movsi_lo_sum_pic (temp_reg, temp_reg, orig));
3786 crtl->uses_pic_offset_table = 1;
3790 insn = emit_insn (gen_movdi_pic_gotdata_op (reg,
3791 pic_offset_table_rtx,
3794 insn = emit_insn (gen_movsi_pic_gotdata_op (reg,
3795 pic_offset_table_rtx,
3801 = gen_const_mem (Pmode,
3802 gen_rtx_PLUS (Pmode,
3803 pic_offset_table_rtx, address));
3804 insn = emit_move_insn (reg, pic_ref);
3807 /* Put a REG_EQUAL note on this insn, so that it can be optimized
3809 set_unique_reg_note (insn, REG_EQUAL, orig);
3812 else if (GET_CODE (orig) == CONST)
3816 if (GET_CODE (XEXP (orig, 0)) == PLUS
3817 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
3822 gcc_assert (can_create_pseudo_p ());
3823 reg = gen_reg_rtx (Pmode);
3826 gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
3827 base = sparc_legitimize_pic_address (XEXP (XEXP (orig, 0), 0), reg);
3828 offset = sparc_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
3829 base == reg ? NULL_RTX : reg);
3831 if (GET_CODE (offset) == CONST_INT)
3833 if (SMALL_INT (offset))
3834 return plus_constant (base, INTVAL (offset));
3835 else if (can_create_pseudo_p ())
3836 offset = force_reg (Pmode, offset);
3838 /* If we reach here, then something is seriously wrong. */
3841 return gen_rtx_PLUS (Pmode, base, offset);
3843 else if (GET_CODE (orig) == LABEL_REF)
3844 /* ??? We ought to be checking that the register is live instead, in case
3845 it is eliminated. */
3846 crtl->uses_pic_offset_table = 1;
3851 /* Try machine-dependent ways of modifying an illegitimate address X
3852 to be legitimate. If we find one, return the new, valid address.
3854 OLDX is the address as it was before break_out_memory_refs was called.
3855 In some cases it is useful to look at this to decide what needs to be done.
3857 MODE is the mode of the operand pointed to by X.
3859 On SPARC, change REG+N into REG+REG, and REG+(X*Y) into REG+REG. */
3862 sparc_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
3863 enum machine_mode mode)
3867 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == MULT)
3868 x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
3869 force_operand (XEXP (x, 0), NULL_RTX));
3870 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == MULT)
3871 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
3872 force_operand (XEXP (x, 1), NULL_RTX));
3873 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS)
3874 x = gen_rtx_PLUS (Pmode, force_operand (XEXP (x, 0), NULL_RTX),
3876 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == PLUS)
3877 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
3878 force_operand (XEXP (x, 1), NULL_RTX));
3880 if (x != orig_x && sparc_legitimate_address_p (mode, x, FALSE))
3883 if (sparc_tls_referenced_p (x))
3884 x = sparc_legitimize_tls_address (x);
3886 x = sparc_legitimize_pic_address (x, NULL_RTX);
3887 else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 1)))
3888 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
3889 copy_to_mode_reg (Pmode, XEXP (x, 1)));
3890 else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 0)))
3891 x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
3892 copy_to_mode_reg (Pmode, XEXP (x, 0)));
3893 else if (GET_CODE (x) == SYMBOL_REF
3894 || GET_CODE (x) == CONST
3895 || GET_CODE (x) == LABEL_REF)
3896 x = copy_to_suggested_reg (x, NULL_RTX, Pmode);
3901 /* Delegitimize an address that was legitimized by the above function. */
3904 sparc_delegitimize_address (rtx x)
3906 x = delegitimize_mem_from_attrs (x);
3908 if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 1)) == UNSPEC)
3909 switch (XINT (XEXP (x, 1), 1))
3911 case UNSPEC_MOVE_PIC:
3913 x = XVECEXP (XEXP (x, 1), 0, 0);
3914 gcc_assert (GET_CODE (x) == SYMBOL_REF);
3920 /* This is generated by mov{si,di}_pic_label_ref in PIC mode. */
3921 if (GET_CODE (x) == MINUS
3922 && REG_P (XEXP (x, 0))
3923 && REGNO (XEXP (x, 0)) == PIC_OFFSET_TABLE_REGNUM
3924 && GET_CODE (XEXP (x, 1)) == LO_SUM
3925 && GET_CODE (XEXP (XEXP (x, 1), 1)) == UNSPEC
3926 && XINT (XEXP (XEXP (x, 1), 1), 1) == UNSPEC_MOVE_PIC_LABEL)
3928 x = XVECEXP (XEXP (XEXP (x, 1), 1), 0, 0);
3929 gcc_assert (GET_CODE (x) == LABEL_REF);
3935 /* SPARC implementation of LEGITIMIZE_RELOAD_ADDRESS. Returns a value to
3936 replace the input X, or the original X if no replacement is called for.
3937 The output parameter *WIN is 1 if the calling macro should goto WIN,
3940 For SPARC, we wish to handle addresses by splitting them into
3941 HIGH+LO_SUM pairs, retaining the LO_SUM in the memory reference.
3942 This cuts the number of extra insns by one.
3944 Do nothing when generating PIC code and the address is a symbolic
3945 operand or requires a scratch register. */
3948 sparc_legitimize_reload_address (rtx x, enum machine_mode mode,
3949 int opnum, int type,
3950 int ind_levels ATTRIBUTE_UNUSED, int *win)
3952 /* Decompose SImode constants into HIGH+LO_SUM. */
3954 && (mode != TFmode || TARGET_ARCH64)
3955 && GET_MODE (x) == SImode
3956 && GET_CODE (x) != LO_SUM
3957 && GET_CODE (x) != HIGH
3958 && sparc_cmodel <= CM_MEDLOW
3960 && (symbolic_operand (x, Pmode) || pic_address_needs_scratch (x))))
3962 x = gen_rtx_LO_SUM (GET_MODE (x), gen_rtx_HIGH (GET_MODE (x), x), x);
3963 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3964 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3965 opnum, (enum reload_type)type);
3970 /* We have to recognize what we have already generated above. */
3971 if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == HIGH)
3973 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
3974 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
3975 opnum, (enum reload_type)type);
3984 /* Return true if ADDR (a legitimate address expression)
3985 has an effect that depends on the machine mode it is used for.
3991 is not equivalent to
3993 (mem:QI [%l7+a]) (mem:QI [%l7+a+1])
3995 because [%l7+a+1] is interpreted as the address of (a+1). */
3999 sparc_mode_dependent_address_p (const_rtx addr)
4001 if (flag_pic && GET_CODE (addr) == PLUS)
4003 rtx op0 = XEXP (addr, 0);
4004 rtx op1 = XEXP (addr, 1);
4005 if (op0 == pic_offset_table_rtx
4006 && symbolic_operand (op1, VOIDmode))
4013 #ifdef HAVE_GAS_HIDDEN
4014 # define USE_HIDDEN_LINKONCE 1
4016 # define USE_HIDDEN_LINKONCE 0
4020 get_pc_thunk_name (char name[32], unsigned int regno)
4022 const char *reg_name = reg_names[regno];
4024 /* Skip the leading '%' as that cannot be used in a
4028 if (USE_HIDDEN_LINKONCE)
4029 sprintf (name, "__sparc_get_pc_thunk.%s", reg_name);
4031 ASM_GENERATE_INTERNAL_LABEL (name, "LADDPC", regno);
4034 /* Wrapper around the load_pcrel_sym{si,di} patterns. */
4037 gen_load_pcrel_sym (rtx op0, rtx op1, rtx op2, rtx op3)
4039 int orig_flag_pic = flag_pic;
4042 /* The load_pcrel_sym{si,di} patterns require absolute addressing. */
4045 insn = gen_load_pcrel_symdi (op0, op1, op2, op3);
4047 insn = gen_load_pcrel_symsi (op0, op1, op2, op3);
4048 flag_pic = orig_flag_pic;
4053 /* Emit code to load the GOT register. */
4056 load_got_register (void)
4058 /* In PIC mode, this will retrieve pic_offset_table_rtx. */
4059 if (!global_offset_table_rtx)
4060 global_offset_table_rtx = gen_rtx_REG (Pmode, GLOBAL_OFFSET_TABLE_REGNUM);
4062 if (TARGET_VXWORKS_RTP)
4063 emit_insn (gen_vxworks_load_got ());
4066 /* The GOT symbol is subject to a PC-relative relocation so we need a
4067 helper function to add the PC value and thus get the final value. */
4068 if (!got_helper_rtx)
4071 get_pc_thunk_name (name, GLOBAL_OFFSET_TABLE_REGNUM);
4072 got_helper_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
4075 emit_insn (gen_load_pcrel_sym (global_offset_table_rtx, sparc_got (),
4077 GEN_INT (GLOBAL_OFFSET_TABLE_REGNUM)));
4080 /* Need to emit this whether or not we obey regdecls,
4081 since setjmp/longjmp can cause life info to screw up.
4082 ??? In the case where we don't obey regdecls, this is not sufficient
4083 since we may not fall out the bottom. */
4084 emit_use (global_offset_table_rtx);
4087 /* Emit a call instruction with the pattern given by PAT. ADDR is the
4088 address of the call target. */
4091 sparc_emit_call_insn (rtx pat, rtx addr)
4095 insn = emit_call_insn (pat);
4097 /* The PIC register is live on entry to VxWorks PIC PLT entries. */
4098 if (TARGET_VXWORKS_RTP
4100 && GET_CODE (addr) == SYMBOL_REF
4101 && (SYMBOL_REF_DECL (addr)
4102 ? !targetm.binds_local_p (SYMBOL_REF_DECL (addr))
4103 : !SYMBOL_REF_LOCAL_P (addr)))
4105 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
4106 crtl->uses_pic_offset_table = 1;
4110 /* Return 1 if RTX is a MEM which is known to be aligned to at
4111 least a DESIRED byte boundary. */
4114 mem_min_alignment (rtx mem, int desired)
4116 rtx addr, base, offset;
4118 /* If it's not a MEM we can't accept it. */
4119 if (GET_CODE (mem) != MEM)
4123 if (!TARGET_UNALIGNED_DOUBLES
4124 && MEM_ALIGN (mem) / BITS_PER_UNIT >= (unsigned)desired)
4127 /* ??? The rest of the function predates MEM_ALIGN so
4128 there is probably a bit of redundancy. */
4129 addr = XEXP (mem, 0);
4130 base = offset = NULL_RTX;
4131 if (GET_CODE (addr) == PLUS)
4133 if (GET_CODE (XEXP (addr, 0)) == REG)
4135 base = XEXP (addr, 0);
4137 /* What we are saying here is that if the base
4138 REG is aligned properly, the compiler will make
4139 sure any REG based index upon it will be so
4141 if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
4142 offset = XEXP (addr, 1);
4144 offset = const0_rtx;
4147 else if (GET_CODE (addr) == REG)
4150 offset = const0_rtx;
4153 if (base != NULL_RTX)
4155 int regno = REGNO (base);
4157 if (regno != HARD_FRAME_POINTER_REGNUM && regno != STACK_POINTER_REGNUM)
4159 /* Check if the compiler has recorded some information
4160 about the alignment of the base REG. If reload has
4161 completed, we already matched with proper alignments.
4162 If not running global_alloc, reload might give us
4163 unaligned pointer to local stack though. */
4165 && REGNO_POINTER_ALIGN (regno) >= desired * BITS_PER_UNIT)
4166 || (optimize && reload_completed))
4167 && (INTVAL (offset) & (desired - 1)) == 0)
4172 if (((INTVAL (offset) - SPARC_STACK_BIAS) & (desired - 1)) == 0)
4176 else if (! TARGET_UNALIGNED_DOUBLES
4177 || CONSTANT_P (addr)
4178 || GET_CODE (addr) == LO_SUM)
4180 /* Anything else we know is properly aligned unless TARGET_UNALIGNED_DOUBLES
4181 is true, in which case we can only assume that an access is aligned if
4182 it is to a constant address, or the address involves a LO_SUM. */
4186 /* An obviously unaligned address. */
4191 /* Vectors to keep interesting information about registers where it can easily
4192 be got. We used to use the actual mode value as the bit number, but there
4193 are more than 32 modes now. Instead we use two tables: one indexed by
4194 hard register number, and one indexed by mode. */
4196 /* The purpose of sparc_mode_class is to shrink the range of modes so that
4197 they all fit (as bit numbers) in a 32-bit word (again). Each real mode is
4198 mapped into one sparc_mode_class mode. */
4200 enum sparc_mode_class {
4201 S_MODE, D_MODE, T_MODE, O_MODE,
4202 SF_MODE, DF_MODE, TF_MODE, OF_MODE,
4206 /* Modes for single-word and smaller quantities. */
4207 #define S_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
4209 /* Modes for double-word and smaller quantities. */
4210 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
4212 /* Modes for quad-word and smaller quantities. */
4213 #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
4215 /* Modes for 8-word and smaller quantities. */
4216 #define O_MODES (T_MODES | (1 << (int) O_MODE) | (1 << (int) OF_MODE))
4218 /* Modes for single-float quantities. We must allow any single word or
4219 smaller quantity. This is because the fix/float conversion instructions
4220 take integer inputs/outputs from the float registers. */
4221 #define SF_MODES (S_MODES)
4223 /* Modes for double-float and smaller quantities. */
4224 #define DF_MODES (D_MODES)
4226 /* Modes for quad-float and smaller quantities. */
4227 #define TF_MODES (DF_MODES | (1 << (int) TF_MODE))
4229 /* Modes for quad-float pairs and smaller quantities. */
4230 #define OF_MODES (TF_MODES | (1 << (int) OF_MODE))
4232 /* Modes for double-float only quantities. */
4233 #define DF_MODES_NO_S ((1 << (int) D_MODE) | (1 << (int) DF_MODE))
4235 /* Modes for quad-float and double-float only quantities. */
4236 #define TF_MODES_NO_S (DF_MODES_NO_S | (1 << (int) TF_MODE))
4238 /* Modes for quad-float pairs and double-float only quantities. */
4239 #define OF_MODES_NO_S (TF_MODES_NO_S | (1 << (int) OF_MODE))
4241 /* Modes for condition codes. */
4242 #define CC_MODES (1 << (int) CC_MODE)
4243 #define CCFP_MODES (1 << (int) CCFP_MODE)
4245 /* Value is 1 if register/mode pair is acceptable on sparc.
4246 The funny mixture of D and T modes is because integer operations
4247 do not specially operate on tetra quantities, so non-quad-aligned
4248 registers can hold quadword quantities (except %o4 and %i4 because
4249 they cross fixed registers). */
4251 /* This points to either the 32 bit or the 64 bit version. */
4252 const int *hard_regno_mode_classes;
4254 static const int hard_32bit_mode_classes[] = {
4255 S_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
4256 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
4257 T_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
4258 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
4260 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4261 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4262 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4263 OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
4265 /* FP regs f32 to f63. Only the even numbered registers actually exist,
4266 and none can hold SFmode/SImode values. */
4267 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4268 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4269 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4270 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4273 CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
4275 /* %icc, %sfp, %gsr */
4276 CC_MODES, 0, D_MODES
4279 static const int hard_64bit_mode_classes[] = {
4280 D_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4281 O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4282 T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4283 O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4285 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4286 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4287 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4288 OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
4290 /* FP regs f32 to f63. Only the even numbered registers actually exist,
4291 and none can hold SFmode/SImode values. */
4292 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4293 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4294 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4295 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4298 CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
4300 /* %icc, %sfp, %gsr */
4301 CC_MODES, 0, D_MODES
4304 int sparc_mode_class [NUM_MACHINE_MODES];
4306 enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
4309 sparc_init_modes (void)
4313 for (i = 0; i < NUM_MACHINE_MODES; i++)
4315 switch (GET_MODE_CLASS (i))
4318 case MODE_PARTIAL_INT:
4319 case MODE_COMPLEX_INT:
4320 if (GET_MODE_SIZE (i) <= 4)
4321 sparc_mode_class[i] = 1 << (int) S_MODE;
4322 else if (GET_MODE_SIZE (i) == 8)
4323 sparc_mode_class[i] = 1 << (int) D_MODE;
4324 else if (GET_MODE_SIZE (i) == 16)
4325 sparc_mode_class[i] = 1 << (int) T_MODE;
4326 else if (GET_MODE_SIZE (i) == 32)
4327 sparc_mode_class[i] = 1 << (int) O_MODE;
4329 sparc_mode_class[i] = 0;
4331 case MODE_VECTOR_INT:
4332 if (GET_MODE_SIZE (i) <= 4)
4333 sparc_mode_class[i] = 1 << (int)SF_MODE;
4334 else if (GET_MODE_SIZE (i) == 8)
4335 sparc_mode_class[i] = 1 << (int)DF_MODE;
4338 case MODE_COMPLEX_FLOAT:
4339 if (GET_MODE_SIZE (i) <= 4)
4340 sparc_mode_class[i] = 1 << (int) SF_MODE;
4341 else if (GET_MODE_SIZE (i) == 8)
4342 sparc_mode_class[i] = 1 << (int) DF_MODE;
4343 else if (GET_MODE_SIZE (i) == 16)
4344 sparc_mode_class[i] = 1 << (int) TF_MODE;
4345 else if (GET_MODE_SIZE (i) == 32)
4346 sparc_mode_class[i] = 1 << (int) OF_MODE;
4348 sparc_mode_class[i] = 0;
4351 if (i == (int) CCFPmode || i == (int) CCFPEmode)
4352 sparc_mode_class[i] = 1 << (int) CCFP_MODE;
4354 sparc_mode_class[i] = 1 << (int) CC_MODE;
4357 sparc_mode_class[i] = 0;
4363 hard_regno_mode_classes = hard_64bit_mode_classes;
4365 hard_regno_mode_classes = hard_32bit_mode_classes;
4367 /* Initialize the array used by REGNO_REG_CLASS. */
4368 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4370 if (i < 16 && TARGET_V8PLUS)
4371 sparc_regno_reg_class[i] = I64_REGS;
4372 else if (i < 32 || i == FRAME_POINTER_REGNUM)
4373 sparc_regno_reg_class[i] = GENERAL_REGS;
4375 sparc_regno_reg_class[i] = FP_REGS;
4377 sparc_regno_reg_class[i] = EXTRA_FP_REGS;
4379 sparc_regno_reg_class[i] = FPCC_REGS;
4381 sparc_regno_reg_class[i] = NO_REGS;
4385 /* Return whether REGNO, a global or FP register, must be saved/restored. */
4388 save_global_or_fp_reg_p (unsigned int regno,
4389 int leaf_function ATTRIBUTE_UNUSED)
4391 return !call_used_regs[regno] && df_regs_ever_live_p (regno);
4394 /* Return whether the return address register (%i7) is needed. */
4397 return_addr_reg_needed_p (int leaf_function)
4399 /* If it is live, for example because of __builtin_return_address (0). */
4400 if (df_regs_ever_live_p (RETURN_ADDR_REGNUM))
4403 /* Otherwise, it is needed as save register if %o7 is clobbered. */
4405 /* Loading the GOT register clobbers %o7. */
4406 || crtl->uses_pic_offset_table
4407 || df_regs_ever_live_p (INCOMING_RETURN_ADDR_REGNUM))
4413 /* Return whether REGNO, a local or in register, must be saved/restored. */
4416 save_local_or_in_reg_p (unsigned int regno, int leaf_function)
4418 /* General case: call-saved registers live at some point. */
4419 if (!call_used_regs[regno] && df_regs_ever_live_p (regno))
4422 /* Frame pointer register (%fp) if needed. */
4423 if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
4426 /* Return address register (%i7) if needed. */
4427 if (regno == RETURN_ADDR_REGNUM && return_addr_reg_needed_p (leaf_function))
4430 /* GOT register (%l7) if needed. */
4431 if (regno == PIC_OFFSET_TABLE_REGNUM && crtl->uses_pic_offset_table)
4434 /* If the function accesses prior frames, the frame pointer and the return
4435 address of the previous frame must be saved on the stack. */
4436 if (crtl->accesses_prior_frames
4437 && (regno == HARD_FRAME_POINTER_REGNUM || regno == RETURN_ADDR_REGNUM))
4443 /* Compute the frame size required by the function. This function is called
4444 during the reload pass and also by sparc_expand_prologue. */
4447 sparc_compute_frame_size (HOST_WIDE_INT size, int leaf_function)
4449 HOST_WIDE_INT frame_size, apparent_frame_size;
4450 int args_size, n_global_fp_regs = 0;
4451 bool save_local_in_regs_p = false;
4454 /* If the function allocates dynamic stack space, the dynamic offset is
4455 computed early and contains REG_PARM_STACK_SPACE, so we need to cope. */
4456 if (leaf_function && !cfun->calls_alloca)
4459 args_size = crtl->outgoing_args_size + REG_PARM_STACK_SPACE (cfun->decl);
4461 /* Calculate space needed for global registers. */
4463 for (i = 0; i < 8; i++)
4464 if (save_global_or_fp_reg_p (i, 0))
4465 n_global_fp_regs += 2;
4467 for (i = 0; i < 8; i += 2)
4468 if (save_global_or_fp_reg_p (i, 0) || save_global_or_fp_reg_p (i + 1, 0))
4469 n_global_fp_regs += 2;
4471 /* In the flat window model, find out which local and in registers need to
4472 be saved. We don't reserve space in the current frame for them as they
4473 will be spilled into the register window save area of the caller's frame.
4474 However, as soon as we use this register window save area, we must create
4475 that of the current frame to make it the live one. */
4477 for (i = 16; i < 32; i++)
4478 if (save_local_or_in_reg_p (i, leaf_function))
4480 save_local_in_regs_p = true;
4484 /* Calculate space needed for FP registers. */
4485 for (i = 32; i < (TARGET_V9 ? 96 : 64); i += 2)
4486 if (save_global_or_fp_reg_p (i, 0) || save_global_or_fp_reg_p (i + 1, 0))
4487 n_global_fp_regs += 2;
4490 && n_global_fp_regs == 0
4492 && !save_local_in_regs_p)
4493 frame_size = apparent_frame_size = 0;
4496 /* We subtract STARTING_FRAME_OFFSET, remember it's negative. */
4497 apparent_frame_size = (size - STARTING_FRAME_OFFSET + 7) & -8;
4498 apparent_frame_size += n_global_fp_regs * 4;
4500 /* We need to add the size of the outgoing argument area. */
4501 frame_size = apparent_frame_size + ((args_size + 7) & -8);
4503 /* And that of the register window save area. */
4504 frame_size += FIRST_PARM_OFFSET (cfun->decl);
4506 /* Finally, bump to the appropriate alignment. */
4507 frame_size = SPARC_STACK_ALIGN (frame_size);
4510 /* Set up values for use in prologue and epilogue. */
4511 sparc_frame_size = frame_size;
4512 sparc_apparent_frame_size = apparent_frame_size;
4513 sparc_n_global_fp_regs = n_global_fp_regs;
4514 sparc_save_local_in_regs_p = save_local_in_regs_p;
4519 /* Output any necessary .register pseudo-ops. */
4522 sparc_output_scratch_registers (FILE *file ATTRIBUTE_UNUSED)
4524 #ifdef HAVE_AS_REGISTER_PSEUDO_OP
4530 /* Check if %g[2367] were used without
4531 .register being printed for them already. */
4532 for (i = 2; i < 8; i++)
4534 if (df_regs_ever_live_p (i)
4535 && ! sparc_hard_reg_printed [i])
4537 sparc_hard_reg_printed [i] = 1;
4538 /* %g7 is used as TLS base register, use #ignore
4539 for it instead of #scratch. */
4540 fprintf (file, "\t.register\t%%g%d, #%s\n", i,
4541 i == 7 ? "ignore" : "scratch");
4548 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
4550 #if PROBE_INTERVAL > 4096
4551 #error Cannot use indexed addressing mode for stack probing
4554 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
4555 inclusive. These are offsets from the current stack pointer.
4557 Note that we don't use the REG+REG addressing mode for the probes because
4558 of the stack bias in 64-bit mode. And it doesn't really buy us anything
4559 so the advantages of having a single code win here. */
4562 sparc_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
4564 rtx g1 = gen_rtx_REG (Pmode, 1);
4566 /* See if we have a constant small number of probes to generate. If so,
4567 that's the easy case. */
4568 if (size <= PROBE_INTERVAL)
4570 emit_move_insn (g1, GEN_INT (first));
4571 emit_insn (gen_rtx_SET (VOIDmode, g1,
4572 gen_rtx_MINUS (Pmode, stack_pointer_rtx, g1)));
4573 emit_stack_probe (plus_constant (g1, -size));
4576 /* The run-time loop is made up of 10 insns in the generic case while the
4577 compile-time loop is made up of 4+2*(n-2) insns for n # of intervals. */
4578 else if (size <= 5 * PROBE_INTERVAL)
4582 emit_move_insn (g1, GEN_INT (first + PROBE_INTERVAL));
4583 emit_insn (gen_rtx_SET (VOIDmode, g1,
4584 gen_rtx_MINUS (Pmode, stack_pointer_rtx, g1)));
4585 emit_stack_probe (g1);
4587 /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 2 until
4588 it exceeds SIZE. If only two probes are needed, this will not
4589 generate any code. Then probe at FIRST + SIZE. */
4590 for (i = 2 * PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
4592 emit_insn (gen_rtx_SET (VOIDmode, g1,
4593 plus_constant (g1, -PROBE_INTERVAL)));
4594 emit_stack_probe (g1);
4597 emit_stack_probe (plus_constant (g1, (i - PROBE_INTERVAL) - size));
4600 /* Otherwise, do the same as above, but in a loop. Note that we must be
4601 extra careful with variables wrapping around because we might be at
4602 the very top (or the very bottom) of the address space and we have
4603 to be able to handle this case properly; in particular, we use an
4604 equality test for the loop condition. */
4607 HOST_WIDE_INT rounded_size;
4608 rtx g4 = gen_rtx_REG (Pmode, 4);
4610 emit_move_insn (g1, GEN_INT (first));
4613 /* Step 1: round SIZE to the previous multiple of the interval. */
4615 rounded_size = size & -PROBE_INTERVAL;
4616 emit_move_insn (g4, GEN_INT (rounded_size));
4619 /* Step 2: compute initial and final value of the loop counter. */
4621 /* TEST_ADDR = SP + FIRST. */
4622 emit_insn (gen_rtx_SET (VOIDmode, g1,
4623 gen_rtx_MINUS (Pmode, stack_pointer_rtx, g1)));
4625 /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE. */
4626 emit_insn (gen_rtx_SET (VOIDmode, g4, gen_rtx_MINUS (Pmode, g1, g4)));
4631 while (TEST_ADDR != LAST_ADDR)
4633 TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
4637 probes at FIRST + N * PROBE_INTERVAL for values of N from 1
4638 until it is equal to ROUNDED_SIZE. */
4641 emit_insn (gen_probe_stack_rangedi (g1, g1, g4));
4643 emit_insn (gen_probe_stack_rangesi (g1, g1, g4));
4646 /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
4647 that SIZE is equal to ROUNDED_SIZE. */
4649 if (size != rounded_size)
4650 emit_stack_probe (plus_constant (g4, rounded_size - size));
4653 /* Make sure nothing is scheduled before we are done. */
4654 emit_insn (gen_blockage ());
4657 /* Probe a range of stack addresses from REG1 to REG2 inclusive. These are
4658 absolute addresses. */
4661 output_probe_stack_range (rtx reg1, rtx reg2)
4663 static int labelno = 0;
4664 char loop_lab[32], end_lab[32];
4667 ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
4668 ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
4670 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
4672 /* Jump to END_LAB if TEST_ADDR == LAST_ADDR. */
4675 output_asm_insn ("cmp\t%0, %1", xops);
4677 fputs ("\tbe,pn\t%xcc,", asm_out_file);
4679 fputs ("\tbe\t", asm_out_file);
4680 assemble_name_raw (asm_out_file, end_lab);
4681 fputc ('\n', asm_out_file);
4683 /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL. */
4684 xops[1] = GEN_INT (-PROBE_INTERVAL);
4685 output_asm_insn (" add\t%0, %1, %0", xops);
4687 /* Probe at TEST_ADDR and branch. */
4689 fputs ("\tba,pt\t%xcc,", asm_out_file);
4691 fputs ("\tba\t", asm_out_file);
4692 assemble_name_raw (asm_out_file, loop_lab);
4693 fputc ('\n', asm_out_file);
4694 xops[1] = GEN_INT (SPARC_STACK_BIAS);
4695 output_asm_insn (" st\t%%g0, [%0+%1]", xops);
4697 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
4702 /* Emit code to save/restore registers from LOW to HIGH at BASE+OFFSET as
4703 needed. LOW is supposed to be double-word aligned for 32-bit registers.
4704 SAVE_P decides whether a register must be saved/restored. ACTION_TRUE
4705 is the action to be performed if SAVE_P returns true and ACTION_FALSE
4706 the action to be performed if it returns false. Return the new offset. */
4708 typedef bool (*sorr_pred_t) (unsigned int, int);
4709 typedef enum { SORR_NONE, SORR_ADVANCE, SORR_SAVE, SORR_RESTORE } sorr_act_t;
4712 emit_save_or_restore_regs (unsigned int low, unsigned int high, rtx base,
4713 int offset, int leaf_function, sorr_pred_t save_p,
4714 sorr_act_t action_true, sorr_act_t action_false)
4719 if (TARGET_ARCH64 && high <= 32)
4723 for (i = low; i < high; i++)
4725 if (save_p (i, leaf_function))
4727 mem = gen_frame_mem (DImode, plus_constant (base, offset));
4728 if (action_true == SORR_SAVE)
4730 insn = emit_move_insn (mem, gen_rtx_REG (DImode, i));
4731 RTX_FRAME_RELATED_P (insn) = 1;
4733 else /* action_true == SORR_RESTORE */
4735 /* The frame pointer must be restored last since its old
4736 value may be used as base address for the frame. This
4737 is problematic in 64-bit mode only because of the lack
4738 of double-word load instruction. */
4739 if (i == HARD_FRAME_POINTER_REGNUM)
4742 emit_move_insn (gen_rtx_REG (DImode, i), mem);
4746 else if (action_false == SORR_ADVANCE)
4752 mem = gen_frame_mem (DImode, plus_constant (base, fp_offset));
4753 emit_move_insn (hard_frame_pointer_rtx, mem);
4758 for (i = low; i < high; i += 2)
4760 bool reg0 = save_p (i, leaf_function);
4761 bool reg1 = save_p (i + 1, leaf_function);
4762 enum machine_mode mode;
4767 mode = SPARC_INT_REG_P (i) ? DImode : DFmode;
4772 mode = SPARC_INT_REG_P (i) ? SImode : SFmode;
4777 mode = SPARC_INT_REG_P (i) ? SImode : SFmode;
4783 if (action_false == SORR_ADVANCE)
4788 mem = gen_frame_mem (mode, plus_constant (base, offset));
4789 if (action_true == SORR_SAVE)
4791 insn = emit_move_insn (mem, gen_rtx_REG (mode, regno));
4792 RTX_FRAME_RELATED_P (insn) = 1;
4796 mem = gen_frame_mem (SImode, plus_constant (base, offset));
4797 set1 = gen_rtx_SET (VOIDmode, mem,
4798 gen_rtx_REG (SImode, regno));
4799 RTX_FRAME_RELATED_P (set1) = 1;
4801 = gen_frame_mem (SImode, plus_constant (base, offset + 4));
4802 set2 = gen_rtx_SET (VOIDmode, mem,
4803 gen_rtx_REG (SImode, regno + 1));
4804 RTX_FRAME_RELATED_P (set2) = 1;
4805 add_reg_note (insn, REG_FRAME_RELATED_EXPR,
4806 gen_rtx_PARALLEL (VOIDmode,
4807 gen_rtvec (2, set1, set2)));
4810 else /* action_true == SORR_RESTORE */
4811 emit_move_insn (gen_rtx_REG (mode, regno), mem);
4813 /* Always preserve double-word alignment. */
4814 offset = (offset + 8) & -8;
4821 /* Emit code to adjust BASE to OFFSET. Return the new base. */
4824 emit_adjust_base_to_offset (rtx base, int offset)
4826 /* ??? This might be optimized a little as %g1 might already have a
4827 value close enough that a single add insn will do. */
4828 /* ??? Although, all of this is probably only a temporary fix because
4829 if %g1 can hold a function result, then sparc_expand_epilogue will
4830 lose (the result will be clobbered). */
4831 rtx new_base = gen_rtx_REG (Pmode, 1);
4832 emit_move_insn (new_base, GEN_INT (offset));
4833 emit_insn (gen_rtx_SET (VOIDmode,
4834 new_base, gen_rtx_PLUS (Pmode, base, new_base)));
4838 /* Emit code to save/restore call-saved global and FP registers. */
4841 emit_save_or_restore_global_fp_regs (rtx base, int offset, sorr_act_t action)
4843 if (offset < -4096 || offset + sparc_n_global_fp_regs * 4 > 4095)
4845 base = emit_adjust_base_to_offset (base, offset);
4850 = emit_save_or_restore_regs (0, 8, base, offset, 0,
4851 save_global_or_fp_reg_p, action, SORR_NONE);
4852 emit_save_or_restore_regs (32, TARGET_V9 ? 96 : 64, base, offset, 0,
4853 save_global_or_fp_reg_p, action, SORR_NONE);
4856 /* Emit code to save/restore call-saved local and in registers. */
4859 emit_save_or_restore_local_in_regs (rtx base, int offset, sorr_act_t action)
4861 if (offset < -4096 || offset + 16 * UNITS_PER_WORD > 4095)
4863 base = emit_adjust_base_to_offset (base, offset);
4867 emit_save_or_restore_regs (16, 32, base, offset, sparc_leaf_function_p,
4868 save_local_or_in_reg_p, action, SORR_ADVANCE);
4871 /* Emit a window_save insn. */
4874 emit_window_save (rtx increment)
4876 rtx insn = emit_insn (gen_window_save (increment));
4877 RTX_FRAME_RELATED_P (insn) = 1;
4879 /* The incoming return address (%o7) is saved in %i7. */
4880 add_reg_note (insn, REG_CFA_REGISTER,
4881 gen_rtx_SET (VOIDmode,
4882 gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM),
4884 INCOMING_RETURN_ADDR_REGNUM)));
4886 /* The window save event. */
4887 add_reg_note (insn, REG_CFA_WINDOW_SAVE, const0_rtx);
4889 /* The CFA is %fp, the hard frame pointer. */
4890 add_reg_note (insn, REG_CFA_DEF_CFA,
4891 plus_constant (hard_frame_pointer_rtx,
4892 INCOMING_FRAME_SP_OFFSET));
4897 /* Generate an increment for the stack pointer. */
4900 gen_stack_pointer_inc (rtx increment)
4902 return gen_rtx_SET (VOIDmode,
4904 gen_rtx_PLUS (Pmode,
4909 /* Generate a decrement for the stack pointer. */
4912 gen_stack_pointer_dec (rtx decrement)
4914 return gen_rtx_SET (VOIDmode,
4916 gen_rtx_MINUS (Pmode,
4921 /* Expand the function prologue. The prologue is responsible for reserving
4922 storage for the frame, saving the call-saved registers and loading the
4923 GOT register if needed. */
4926 sparc_expand_prologue (void)
4931 /* Compute a snapshot of current_function_uses_only_leaf_regs. Relying
4932 on the final value of the flag means deferring the prologue/epilogue
4933 expansion until just before the second scheduling pass, which is too
4934 late to emit multiple epilogues or return insns.
4936 Of course we are making the assumption that the value of the flag
4937 will not change between now and its final value. Of the three parts
4938 of the formula, only the last one can reasonably vary. Let's take a
4939 closer look, after assuming that the first two ones are set to true
4940 (otherwise the last value is effectively silenced).
4942 If only_leaf_regs_used returns false, the global predicate will also
4943 be false so the actual frame size calculated below will be positive.
4944 As a consequence, the save_register_window insn will be emitted in
4945 the instruction stream; now this insn explicitly references %fp
4946 which is not a leaf register so only_leaf_regs_used will always
4947 return false subsequently.
4949 If only_leaf_regs_used returns true, we hope that the subsequent
4950 optimization passes won't cause non-leaf registers to pop up. For
4951 example, the regrename pass has special provisions to not rename to
4952 non-leaf registers in a leaf function. */
4953 sparc_leaf_function_p
4954 = optimize > 0 && current_function_is_leaf && only_leaf_regs_used ();
4956 size = sparc_compute_frame_size (get_frame_size(), sparc_leaf_function_p);
4958 if (flag_stack_usage_info)
4959 current_function_static_stack_size = size;
4961 if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK && size)
4962 sparc_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
4966 else if (sparc_leaf_function_p)
4968 rtx size_int_rtx = GEN_INT (-size);
4971 insn = emit_insn (gen_stack_pointer_inc (size_int_rtx));
4972 else if (size <= 8192)
4974 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (-4096)));
4975 RTX_FRAME_RELATED_P (insn) = 1;
4977 /* %sp is still the CFA register. */
4978 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (4096 - size)));
4982 rtx size_rtx = gen_rtx_REG (Pmode, 1);
4983 emit_move_insn (size_rtx, size_int_rtx);
4984 insn = emit_insn (gen_stack_pointer_inc (size_rtx));
4985 add_reg_note (insn, REG_FRAME_RELATED_EXPR,
4986 gen_stack_pointer_inc (size_int_rtx));
4989 RTX_FRAME_RELATED_P (insn) = 1;
4993 rtx size_int_rtx = GEN_INT (-size);
4996 emit_window_save (size_int_rtx);
4997 else if (size <= 8192)
4999 emit_window_save (GEN_INT (-4096));
5001 /* %sp is not the CFA register anymore. */
5002 emit_insn (gen_stack_pointer_inc (GEN_INT (4096 - size)));
5004 /* Make sure no %fp-based store is issued until after the frame is
5005 established. The offset between the frame pointer and the stack
5006 pointer is calculated relative to the value of the stack pointer
5007 at the end of the function prologue, and moving instructions that
5008 access the stack via the frame pointer between the instructions
5009 that decrement the stack pointer could result in accessing the
5010 register window save area, which is volatile. */
5011 emit_insn (gen_frame_blockage ());
5015 rtx size_rtx = gen_rtx_REG (Pmode, 1);
5016 emit_move_insn (size_rtx, size_int_rtx);
5017 emit_window_save (size_rtx);
5021 if (sparc_leaf_function_p)
5023 sparc_frame_base_reg = stack_pointer_rtx;
5024 sparc_frame_base_offset = size + SPARC_STACK_BIAS;
5028 sparc_frame_base_reg = hard_frame_pointer_rtx;
5029 sparc_frame_base_offset = SPARC_STACK_BIAS;
5032 if (sparc_n_global_fp_regs > 0)
5033 emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5034 sparc_frame_base_offset
5035 - sparc_apparent_frame_size,
5038 /* Load the GOT register if needed. */
5039 if (crtl->uses_pic_offset_table)
5040 load_got_register ();
5042 /* Advertise that the data calculated just above are now valid. */
5043 sparc_prologue_data_valid_p = true;
5046 /* Expand the function prologue. The prologue is responsible for reserving
5047 storage for the frame, saving the call-saved registers and loading the
5048 GOT register if needed. */
5051 sparc_flat_expand_prologue (void)
5056 sparc_leaf_function_p = optimize > 0 && current_function_is_leaf;
5058 size = sparc_compute_frame_size (get_frame_size(), sparc_leaf_function_p);
5060 if (flag_stack_usage_info)
5061 current_function_static_stack_size = size;
5063 if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK && size)
5064 sparc_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
5066 if (sparc_save_local_in_regs_p)
5067 emit_save_or_restore_local_in_regs (stack_pointer_rtx, SPARC_STACK_BIAS,
5074 rtx size_int_rtx, size_rtx;
5076 size_rtx = size_int_rtx = GEN_INT (-size);
5078 /* We establish the frame (i.e. decrement the stack pointer) first, even
5079 if we use a frame pointer, because we cannot clobber any call-saved
5080 registers, including the frame pointer, if we haven't created a new
5081 register save area, for the sake of compatibility with the ABI. */
5083 insn = emit_insn (gen_stack_pointer_inc (size_int_rtx));
5084 else if (size <= 8192 && !frame_pointer_needed)
5086 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (-4096)));
5087 RTX_FRAME_RELATED_P (insn) = 1;
5088 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (4096 - size)));
5092 size_rtx = gen_rtx_REG (Pmode, 1);
5093 emit_move_insn (size_rtx, size_int_rtx);
5094 insn = emit_insn (gen_stack_pointer_inc (size_rtx));
5095 add_reg_note (insn, REG_CFA_ADJUST_CFA,
5096 gen_stack_pointer_inc (size_int_rtx));
5098 RTX_FRAME_RELATED_P (insn) = 1;
5100 /* Ensure nothing is scheduled until after the frame is established. */
5101 emit_insn (gen_blockage ());
5103 if (frame_pointer_needed)
5105 insn = emit_insn (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
5106 gen_rtx_MINUS (Pmode,
5109 RTX_FRAME_RELATED_P (insn) = 1;
5111 add_reg_note (insn, REG_CFA_ADJUST_CFA,
5112 gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
5113 plus_constant (stack_pointer_rtx,
5117 if (return_addr_reg_needed_p (sparc_leaf_function_p))
5119 rtx o7 = gen_rtx_REG (Pmode, INCOMING_RETURN_ADDR_REGNUM);
5120 rtx i7 = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
5122 insn = emit_move_insn (i7, o7);
5123 RTX_FRAME_RELATED_P (insn) = 1;
5125 add_reg_note (insn, REG_CFA_REGISTER,
5126 gen_rtx_SET (VOIDmode, i7, o7));
5128 /* Prevent this instruction from ever being considered dead,
5129 even if this function has no epilogue. */
5130 emit_insn (gen_rtx_USE (VOIDmode, i7));
5134 if (frame_pointer_needed)
5136 sparc_frame_base_reg = hard_frame_pointer_rtx;
5137 sparc_frame_base_offset = SPARC_STACK_BIAS;
5141 sparc_frame_base_reg = stack_pointer_rtx;
5142 sparc_frame_base_offset = size + SPARC_STACK_BIAS;
5145 if (sparc_n_global_fp_regs > 0)
5146 emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5147 sparc_frame_base_offset
5148 - sparc_apparent_frame_size,
5151 /* Load the GOT register if needed. */
5152 if (crtl->uses_pic_offset_table)
5153 load_got_register ();
5155 /* Advertise that the data calculated just above are now valid. */
5156 sparc_prologue_data_valid_p = true;
5159 /* This function generates the assembly code for function entry, which boils
5160 down to emitting the necessary .register directives. */
5163 sparc_asm_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
5165 /* Check that the assumption we made in sparc_expand_prologue is valid. */
5167 gcc_assert (sparc_leaf_function_p == current_function_uses_only_leaf_regs);
5169 sparc_output_scratch_registers (file);
5172 /* Expand the function epilogue, either normal or part of a sibcall.
5173 We emit all the instructions except the return or the call. */
5176 sparc_expand_epilogue (bool for_eh)
5178 HOST_WIDE_INT size = sparc_frame_size;
5180 if (sparc_n_global_fp_regs > 0)
5181 emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5182 sparc_frame_base_offset
5183 - sparc_apparent_frame_size,
5186 if (size == 0 || for_eh)
5188 else if (sparc_leaf_function_p)
5191 emit_insn (gen_stack_pointer_dec (GEN_INT (-size)));
5192 else if (size <= 8192)
5194 emit_insn (gen_stack_pointer_dec (GEN_INT (-4096)));
5195 emit_insn (gen_stack_pointer_dec (GEN_INT (4096 - size)));
5199 rtx reg = gen_rtx_REG (Pmode, 1);
5200 emit_move_insn (reg, GEN_INT (-size));
5201 emit_insn (gen_stack_pointer_dec (reg));
5206 /* Expand the function epilogue, either normal or part of a sibcall.
5207 We emit all the instructions except the return or the call. */
5210 sparc_flat_expand_epilogue (bool for_eh)
5212 HOST_WIDE_INT size = sparc_frame_size;
5214 if (sparc_n_global_fp_regs > 0)
5215 emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5216 sparc_frame_base_offset
5217 - sparc_apparent_frame_size,
5220 /* If we have a frame pointer, we'll need both to restore it before the
5221 frame is destroyed and use its current value in destroying the frame.
5222 Since we don't have an atomic way to do that in the flat window model,
5223 we save the current value into a temporary register (%g1). */
5224 if (frame_pointer_needed && !for_eh)
5225 emit_move_insn (gen_rtx_REG (Pmode, 1), hard_frame_pointer_rtx);
5227 if (return_addr_reg_needed_p (sparc_leaf_function_p))
5228 emit_move_insn (gen_rtx_REG (Pmode, INCOMING_RETURN_ADDR_REGNUM),
5229 gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM));
5231 if (sparc_save_local_in_regs_p)
5232 emit_save_or_restore_local_in_regs (sparc_frame_base_reg,
5233 sparc_frame_base_offset,
5236 if (size == 0 || for_eh)
5238 else if (frame_pointer_needed)
5240 /* Make sure the frame is destroyed after everything else is done. */
5241 emit_insn (gen_blockage ());
5243 emit_move_insn (stack_pointer_rtx, gen_rtx_REG (Pmode, 1));
5248 emit_insn (gen_blockage ());
5251 emit_insn (gen_stack_pointer_dec (GEN_INT (-size)));
5252 else if (size <= 8192)
5254 emit_insn (gen_stack_pointer_dec (GEN_INT (-4096)));
5255 emit_insn (gen_stack_pointer_dec (GEN_INT (4096 - size)));
5259 rtx reg = gen_rtx_REG (Pmode, 1);
5260 emit_move_insn (reg, GEN_INT (-size));
5261 emit_insn (gen_stack_pointer_dec (reg));
5266 /* Return true if it is appropriate to emit `return' instructions in the
5267 body of a function. */
5270 sparc_can_use_return_insn_p (void)
5272 return sparc_prologue_data_valid_p
5273 && sparc_n_global_fp_regs == 0
5275 ? (sparc_frame_size == 0 && !sparc_save_local_in_regs_p)
5276 : (sparc_frame_size == 0 || !sparc_leaf_function_p);
5279 /* This function generates the assembly code for function exit. */
5282 sparc_asm_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
5284 /* If the last two instructions of a function are "call foo; dslot;"
5285 the return address might point to the first instruction in the next
5286 function and we have to output a dummy nop for the sake of sane
5287 backtraces in such cases. This is pointless for sibling calls since
5288 the return address is explicitly adjusted. */
5290 rtx insn, last_real_insn;
5292 insn = get_last_insn ();
5294 last_real_insn = prev_real_insn (insn);
5296 && GET_CODE (last_real_insn) == INSN
5297 && GET_CODE (PATTERN (last_real_insn)) == SEQUENCE)
5298 last_real_insn = XVECEXP (PATTERN (last_real_insn), 0, 0);
5301 && CALL_P (last_real_insn)
5302 && !SIBLING_CALL_P (last_real_insn))
5303 fputs("\tnop\n", file);
5305 sparc_output_deferred_case_vectors ();
5308 /* Output a 'restore' instruction. */
5311 output_restore (rtx pat)
5317 fputs ("\t restore\n", asm_out_file);
5321 gcc_assert (GET_CODE (pat) == SET);
5323 operands[0] = SET_DEST (pat);
5324 pat = SET_SRC (pat);
5326 switch (GET_CODE (pat))
5329 operands[1] = XEXP (pat, 0);
5330 operands[2] = XEXP (pat, 1);
5331 output_asm_insn (" restore %r1, %2, %Y0", operands);
5334 operands[1] = XEXP (pat, 0);
5335 operands[2] = XEXP (pat, 1);
5336 output_asm_insn (" restore %r1, %%lo(%a2), %Y0", operands);
5339 operands[1] = XEXP (pat, 0);
5340 gcc_assert (XEXP (pat, 1) == const1_rtx);
5341 output_asm_insn (" restore %r1, %r1, %Y0", operands);
5345 output_asm_insn (" restore %%g0, %1, %Y0", operands);
5350 /* Output a return. */
5353 output_return (rtx insn)
5355 if (crtl->calls_eh_return)
5357 /* If the function uses __builtin_eh_return, the eh_return
5358 machinery occupies the delay slot. */
5359 gcc_assert (!final_sequence);
5361 if (flag_delayed_branch)
5363 if (!TARGET_FLAT && TARGET_V9)
5364 fputs ("\treturn\t%i7+8\n", asm_out_file);
5368 fputs ("\trestore\n", asm_out_file);
5370 fputs ("\tjmp\t%o7+8\n", asm_out_file);
5373 fputs ("\t add\t%sp, %g1, %sp\n", asm_out_file);
5378 fputs ("\trestore\n", asm_out_file);
5380 fputs ("\tadd\t%sp, %g1, %sp\n", asm_out_file);
5381 fputs ("\tjmp\t%o7+8\n\t nop\n", asm_out_file);
5384 else if (sparc_leaf_function_p || TARGET_FLAT)
5386 /* This is a leaf or flat function so we don't have to bother restoring
5387 the register window, which frees us from dealing with the convoluted
5388 semantics of restore/return. We simply output the jump to the
5389 return address and the insn in the delay slot (if any). */
5391 return "jmp\t%%o7+%)%#";
5395 /* This is a regular function so we have to restore the register window.
5396 We may have a pending insn for the delay slot, which will be either
5397 combined with the 'restore' instruction or put in the delay slot of
5398 the 'return' instruction. */
5404 delay = NEXT_INSN (insn);
5407 pat = PATTERN (delay);
5409 if (TARGET_V9 && ! epilogue_renumber (&pat, 1))
5411 epilogue_renumber (&pat, 0);
5412 return "return\t%%i7+%)%#";
5416 output_asm_insn ("jmp\t%%i7+%)", NULL);
5417 output_restore (pat);
5418 PATTERN (delay) = gen_blockage ();
5419 INSN_CODE (delay) = -1;
5424 /* The delay slot is empty. */
5426 return "return\t%%i7+%)\n\t nop";
5427 else if (flag_delayed_branch)
5428 return "jmp\t%%i7+%)\n\t restore";
5430 return "restore\n\tjmp\t%%o7+%)\n\t nop";
5437 /* Output a sibling call. */
5440 output_sibcall (rtx insn, rtx call_operand)
5444 gcc_assert (flag_delayed_branch);
5446 operands[0] = call_operand;
5448 if (sparc_leaf_function_p || TARGET_FLAT)
5450 /* This is a leaf or flat function so we don't have to bother restoring
5451 the register window. We simply output the jump to the function and
5452 the insn in the delay slot (if any). */
5454 gcc_assert (!(LEAF_SIBCALL_SLOT_RESERVED_P && final_sequence));
5457 output_asm_insn ("sethi\t%%hi(%a0), %%g1\n\tjmp\t%%g1 + %%lo(%a0)%#",
5460 /* Use or with rs2 %%g0 instead of mov, so that as/ld can optimize
5461 it into branch if possible. */
5462 output_asm_insn ("or\t%%o7, %%g0, %%g1\n\tcall\t%a0, 0\n\t or\t%%g1, %%g0, %%o7",
5467 /* This is a regular function so we have to restore the register window.
5468 We may have a pending insn for the delay slot, which will be combined
5469 with the 'restore' instruction. */
5471 output_asm_insn ("call\t%a0, 0", operands);
5475 rtx delay = NEXT_INSN (insn);
5478 output_restore (PATTERN (delay));
5480 PATTERN (delay) = gen_blockage ();
5481 INSN_CODE (delay) = -1;
5484 output_restore (NULL_RTX);
5490 /* Functions for handling argument passing.
5492 For 32-bit, the first 6 args are normally in registers and the rest are
5493 pushed. Any arg that starts within the first 6 words is at least
5494 partially passed in a register unless its data type forbids.
5496 For 64-bit, the argument registers are laid out as an array of 16 elements
5497 and arguments are added sequentially. The first 6 int args and up to the
5498 first 16 fp args (depending on size) are passed in regs.
5500 Slot Stack Integral Float Float in structure Double Long Double
5501 ---- ----- -------- ----- ------------------ ------ -----------
5502 15 [SP+248] %f31 %f30,%f31 %d30
5503 14 [SP+240] %f29 %f28,%f29 %d28 %q28
5504 13 [SP+232] %f27 %f26,%f27 %d26
5505 12 [SP+224] %f25 %f24,%f25 %d24 %q24
5506 11 [SP+216] %f23 %f22,%f23 %d22
5507 10 [SP+208] %f21 %f20,%f21 %d20 %q20
5508 9 [SP+200] %f19 %f18,%f19 %d18
5509 8 [SP+192] %f17 %f16,%f17 %d16 %q16
5510 7 [SP+184] %f15 %f14,%f15 %d14
5511 6 [SP+176] %f13 %f12,%f13 %d12 %q12
5512 5 [SP+168] %o5 %f11 %f10,%f11 %d10
5513 4 [SP+160] %o4 %f9 %f8,%f9 %d8 %q8
5514 3 [SP+152] %o3 %f7 %f6,%f7 %d6
5515 2 [SP+144] %o2 %f5 %f4,%f5 %d4 %q4
5516 1 [SP+136] %o1 %f3 %f2,%f3 %d2
5517 0 [SP+128] %o0 %f1 %f0,%f1 %d0 %q0
5519 Here SP = %sp if -mno-stack-bias or %sp+stack_bias otherwise.
5521 Integral arguments are always passed as 64-bit quantities appropriately
5524 Passing of floating point values is handled as follows.
5525 If a prototype is in scope:
5526 If the value is in a named argument (i.e. not a stdarg function or a
5527 value not part of the `...') then the value is passed in the appropriate
5529 If the value is part of the `...' and is passed in one of the first 6
5530 slots then the value is passed in the appropriate int reg.
5531 If the value is part of the `...' and is not passed in one of the first 6
5532 slots then the value is passed in memory.
5533 If a prototype is not in scope:
5534 If the value is one of the first 6 arguments the value is passed in the
5535 appropriate integer reg and the appropriate fp reg.
5536 If the value is not one of the first 6 arguments the value is passed in
5537 the appropriate fp reg and in memory.
5540 Summary of the calling conventions implemented by GCC on the SPARC:
5543 size argument return value
5545 small integer <4 int. reg. int. reg.
5546 word 4 int. reg. int. reg.
5547 double word 8 int. reg. int. reg.
5549 _Complex small integer <8 int. reg. int. reg.
5550 _Complex word 8 int. reg. int. reg.
5551 _Complex double word 16 memory int. reg.
5553 vector integer <=8 int. reg. FP reg.
5554 vector integer >8 memory memory
5556 float 4 int. reg. FP reg.
5557 double 8 int. reg. FP reg.
5558 long double 16 memory memory
5560 _Complex float 8 memory FP reg.
5561 _Complex double 16 memory FP reg.
5562 _Complex long double 32 memory FP reg.
5564 vector float any memory memory
5566 aggregate any memory memory
5571 size argument return value
5573 small integer <8 int. reg. int. reg.
5574 word 8 int. reg. int. reg.
5575 double word 16 int. reg. int. reg.
5577 _Complex small integer <16 int. reg. int. reg.
5578 _Complex word 16 int. reg. int. reg.
5579 _Complex double word 32 memory int. reg.
5581 vector integer <=16 FP reg. FP reg.
5582 vector integer 16<s<=32 memory FP reg.
5583 vector integer >32 memory memory
5585 float 4 FP reg. FP reg.
5586 double 8 FP reg. FP reg.
5587 long double 16 FP reg. FP reg.
5589 _Complex float 8 FP reg. FP reg.
5590 _Complex double 16 FP reg. FP reg.
5591 _Complex long double 32 memory FP reg.
5593 vector float <=16 FP reg. FP reg.
5594 vector float 16<s<=32 memory FP reg.
5595 vector float >32 memory memory
5597 aggregate <=16 reg. reg.
5598 aggregate 16<s<=32 memory reg.
5599 aggregate >32 memory memory
5603 Note #1: complex floating-point types follow the extended SPARC ABIs as
5604 implemented by the Sun compiler.
5606 Note #2: integral vector types follow the scalar floating-point types
5607 conventions to match what is implemented by the Sun VIS SDK.
5609 Note #3: floating-point vector types follow the aggregate types
5613 /* Maximum number of int regs for args. */
5614 #define SPARC_INT_ARG_MAX 6
5615 /* Maximum number of fp regs for args. */
5616 #define SPARC_FP_ARG_MAX 16
5618 #define ROUND_ADVANCE(SIZE) (((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
5620 /* Handle the INIT_CUMULATIVE_ARGS macro.
5621 Initialize a variable CUM of type CUMULATIVE_ARGS
5622 for a call to a function whose data type is FNTYPE.
5623 For a library call, FNTYPE is 0. */
5626 init_cumulative_args (struct sparc_args *cum, tree fntype,
5627 rtx libname ATTRIBUTE_UNUSED,
5628 tree fndecl ATTRIBUTE_UNUSED)
5631 cum->prototype_p = fntype && prototype_p (fntype);
5632 cum->libcall_p = fntype == 0;
5635 /* Handle promotion of pointer and integer arguments. */
5637 static enum machine_mode
5638 sparc_promote_function_mode (const_tree type,
5639 enum machine_mode mode,
5641 const_tree fntype ATTRIBUTE_UNUSED,
5642 int for_return ATTRIBUTE_UNUSED)
5644 if (type != NULL_TREE && POINTER_TYPE_P (type))
5646 *punsignedp = POINTERS_EXTEND_UNSIGNED;
5650 /* Integral arguments are passed as full words, as per the ABI. */
5651 if (GET_MODE_CLASS (mode) == MODE_INT
5652 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
5658 /* Handle the TARGET_STRICT_ARGUMENT_NAMING target hook. */
5661 sparc_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
5663 return TARGET_ARCH64 ? true : false;
5666 /* Scan the record type TYPE and return the following predicates:
5667 - INTREGS_P: the record contains at least one field or sub-field
5668 that is eligible for promotion in integer registers.
5669 - FP_REGS_P: the record contains at least one field or sub-field
5670 that is eligible for promotion in floating-point registers.
5671 - PACKED_P: the record contains at least one field that is packed.
5673 Sub-fields are not taken into account for the PACKED_P predicate. */
5676 scan_record_type (const_tree type, int *intregs_p, int *fpregs_p,
5681 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
5683 if (TREE_CODE (field) == FIELD_DECL)
5685 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
5686 scan_record_type (TREE_TYPE (field), intregs_p, fpregs_p, 0);
5687 else if ((FLOAT_TYPE_P (TREE_TYPE (field))
5688 || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
5694 if (packed_p && DECL_PACKED (field))
5700 /* Compute the slot number to pass an argument in.
5701 Return the slot number or -1 if passing on the stack.
5703 CUM is a variable of type CUMULATIVE_ARGS which gives info about
5704 the preceding args and about the function being called.
5705 MODE is the argument's machine mode.
5706 TYPE is the data type of the argument (as a tree).
5707 This is null for libcalls where that information may
5709 NAMED is nonzero if this argument is a named parameter
5710 (otherwise it is an extra parameter matching an ellipsis).
5711 INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG.
5712 *PREGNO records the register number to use if scalar type.
5713 *PPADDING records the amount of padding needed in words. */
5716 function_arg_slotno (const struct sparc_args *cum, enum machine_mode mode,
5717 const_tree type, bool named, bool incoming_p,
5718 int *pregno, int *ppadding)
5720 int regbase = (incoming_p
5721 ? SPARC_INCOMING_INT_ARG_FIRST
5722 : SPARC_OUTGOING_INT_ARG_FIRST);
5723 int slotno = cum->words;
5724 enum mode_class mclass;
5729 if (type && TREE_ADDRESSABLE (type))
5735 && TYPE_ALIGN (type) % PARM_BOUNDARY != 0)
5738 /* For SPARC64, objects requiring 16-byte alignment get it. */
5740 && (type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode)) >= 128
5741 && (slotno & 1) != 0)
5742 slotno++, *ppadding = 1;
5744 mclass = GET_MODE_CLASS (mode);
5745 if (type && TREE_CODE (type) == VECTOR_TYPE)
5747 /* Vector types deserve special treatment because they are
5748 polymorphic wrt their mode, depending upon whether VIS
5749 instructions are enabled. */
5750 if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
5752 /* The SPARC port defines no floating-point vector modes. */
5753 gcc_assert (mode == BLKmode);
5757 /* Integral vector types should either have a vector
5758 mode or an integral mode, because we are guaranteed
5759 by pass_by_reference that their size is not greater
5760 than 16 bytes and TImode is 16-byte wide. */
5761 gcc_assert (mode != BLKmode);
5763 /* Vector integers are handled like floats according to
5765 mclass = MODE_FLOAT;
5772 case MODE_COMPLEX_FLOAT:
5773 case MODE_VECTOR_INT:
5774 if (TARGET_ARCH64 && TARGET_FPU && named)
5776 if (slotno >= SPARC_FP_ARG_MAX)
5778 regno = SPARC_FP_ARG_FIRST + slotno * 2;
5779 /* Arguments filling only one single FP register are
5780 right-justified in the outer double FP register. */
5781 if (GET_MODE_SIZE (mode) <= 4)
5788 case MODE_COMPLEX_INT:
5789 if (slotno >= SPARC_INT_ARG_MAX)
5791 regno = regbase + slotno;
5795 if (mode == VOIDmode)
5796 /* MODE is VOIDmode when generating the actual call. */
5799 gcc_assert (mode == BLKmode);
5803 || (TREE_CODE (type) != VECTOR_TYPE
5804 && TREE_CODE (type) != RECORD_TYPE))
5806 if (slotno >= SPARC_INT_ARG_MAX)
5808 regno = regbase + slotno;
5810 else /* TARGET_ARCH64 && type */
5812 int intregs_p = 0, fpregs_p = 0, packed_p = 0;
5814 /* First see what kinds of registers we would need. */
5815 if (TREE_CODE (type) == VECTOR_TYPE)
5818 scan_record_type (type, &intregs_p, &fpregs_p, &packed_p);
5820 /* The ABI obviously doesn't specify how packed structures
5821 are passed. These are defined to be passed in int regs
5822 if possible, otherwise memory. */
5823 if (packed_p || !named)
5824 fpregs_p = 0, intregs_p = 1;
5826 /* If all arg slots are filled, then must pass on stack. */
5827 if (fpregs_p && slotno >= SPARC_FP_ARG_MAX)
5830 /* If there are only int args and all int arg slots are filled,
5831 then must pass on stack. */
5832 if (!fpregs_p && intregs_p && slotno >= SPARC_INT_ARG_MAX)
5835 /* Note that even if all int arg slots are filled, fp members may
5836 still be passed in regs if such regs are available.
5837 *PREGNO isn't set because there may be more than one, it's up
5838 to the caller to compute them. */
5851 /* Handle recursive register counting for structure field layout. */
5853 struct function_arg_record_value_parms
5855 rtx ret; /* return expression being built. */
5856 int slotno; /* slot number of the argument. */
5857 int named; /* whether the argument is named. */
5858 int regbase; /* regno of the base register. */
5859 int stack; /* 1 if part of the argument is on the stack. */
5860 int intoffset; /* offset of the first pending integer field. */
5861 unsigned int nregs; /* number of words passed in registers. */
5864 static void function_arg_record_value_3
5865 (HOST_WIDE_INT, struct function_arg_record_value_parms *);
5866 static void function_arg_record_value_2
5867 (const_tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool);
5868 static void function_arg_record_value_1
5869 (const_tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool);
5870 static rtx function_arg_record_value (const_tree, enum machine_mode, int, int, int);
5871 static rtx function_arg_union_value (int, enum machine_mode, int, int);
5873 /* A subroutine of function_arg_record_value. Traverse the structure
5874 recursively and determine how many registers will be required. */
5877 function_arg_record_value_1 (const_tree type, HOST_WIDE_INT startbitpos,
5878 struct function_arg_record_value_parms *parms,
5883 /* We need to compute how many registers are needed so we can
5884 allocate the PARALLEL but before we can do that we need to know
5885 whether there are any packed fields. The ABI obviously doesn't
5886 specify how structures are passed in this case, so they are
5887 defined to be passed in int regs if possible, otherwise memory,
5888 regardless of whether there are fp values present. */
5891 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
5893 if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
5900 /* Compute how many registers we need. */
5901 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
5903 if (TREE_CODE (field) == FIELD_DECL)
5905 HOST_WIDE_INT bitpos = startbitpos;
5907 if (DECL_SIZE (field) != 0)
5909 if (integer_zerop (DECL_SIZE (field)))
5912 if (host_integerp (bit_position (field), 1))
5913 bitpos += int_bit_position (field);
5916 /* ??? FIXME: else assume zero offset. */
5918 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
5919 function_arg_record_value_1 (TREE_TYPE (field),
5923 else if ((FLOAT_TYPE_P (TREE_TYPE (field))
5924 || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
5929 if (parms->intoffset != -1)
5931 unsigned int startbit, endbit;
5932 int intslots, this_slotno;
5934 startbit = parms->intoffset & -BITS_PER_WORD;
5935 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
5937 intslots = (endbit - startbit) / BITS_PER_WORD;
5938 this_slotno = parms->slotno + parms->intoffset
5941 if (intslots > 0 && intslots > SPARC_INT_ARG_MAX - this_slotno)
5943 intslots = MAX (0, SPARC_INT_ARG_MAX - this_slotno);
5944 /* We need to pass this field on the stack. */
5948 parms->nregs += intslots;
5949 parms->intoffset = -1;
5952 /* There's no need to check this_slotno < SPARC_FP_ARG MAX.
5953 If it wasn't true we wouldn't be here. */
5954 if (TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE
5955 && DECL_MODE (field) == BLKmode)
5956 parms->nregs += TYPE_VECTOR_SUBPARTS (TREE_TYPE (field));
5957 else if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
5964 if (parms->intoffset == -1)
5965 parms->intoffset = bitpos;
5971 /* A subroutine of function_arg_record_value. Assign the bits of the
5972 structure between parms->intoffset and bitpos to integer registers. */
5975 function_arg_record_value_3 (HOST_WIDE_INT bitpos,
5976 struct function_arg_record_value_parms *parms)
5978 enum machine_mode mode;
5980 unsigned int startbit, endbit;
5981 int this_slotno, intslots, intoffset;
5984 if (parms->intoffset == -1)
5987 intoffset = parms->intoffset;
5988 parms->intoffset = -1;
5990 startbit = intoffset & -BITS_PER_WORD;
5991 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
5992 intslots = (endbit - startbit) / BITS_PER_WORD;
5993 this_slotno = parms->slotno + intoffset / BITS_PER_WORD;
5995 intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno);
5999 /* If this is the trailing part of a word, only load that much into
6000 the register. Otherwise load the whole register. Note that in
6001 the latter case we may pick up unwanted bits. It's not a problem
6002 at the moment but may wish to revisit. */
6004 if (intoffset % BITS_PER_WORD != 0)
6005 mode = smallest_mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
6010 intoffset /= BITS_PER_UNIT;
6013 regno = parms->regbase + this_slotno;
6014 reg = gen_rtx_REG (mode, regno);
6015 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
6016 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
6019 intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
6024 while (intslots > 0);
6027 /* A subroutine of function_arg_record_value. Traverse the structure
6028 recursively and assign bits to floating point registers. Track which
6029 bits in between need integer registers; invoke function_arg_record_value_3
6030 to make that happen. */
6033 function_arg_record_value_2 (const_tree type, HOST_WIDE_INT startbitpos,
6034 struct function_arg_record_value_parms *parms,
6040 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6042 if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
6049 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6051 if (TREE_CODE (field) == FIELD_DECL)
6053 HOST_WIDE_INT bitpos = startbitpos;
6055 if (DECL_SIZE (field) != 0)
6057 if (integer_zerop (DECL_SIZE (field)))
6060 if (host_integerp (bit_position (field), 1))
6061 bitpos += int_bit_position (field);
6064 /* ??? FIXME: else assume zero offset. */
6066 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
6067 function_arg_record_value_2 (TREE_TYPE (field),
6071 else if ((FLOAT_TYPE_P (TREE_TYPE (field))
6072 || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
6077 int this_slotno = parms->slotno + bitpos / BITS_PER_WORD;
6078 int regno, nregs, pos;
6079 enum machine_mode mode = DECL_MODE (field);
6082 function_arg_record_value_3 (bitpos, parms);
6084 if (TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE
6087 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field)));
6088 nregs = TYPE_VECTOR_SUBPARTS (TREE_TYPE (field));
6090 else if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
6092 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field)));
6098 regno = SPARC_FP_ARG_FIRST + this_slotno * 2;
6099 if (GET_MODE_SIZE (mode) <= 4 && (bitpos & 32) != 0)
6101 reg = gen_rtx_REG (mode, regno);
6102 pos = bitpos / BITS_PER_UNIT;
6103 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
6104 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (pos));
6108 regno += GET_MODE_SIZE (mode) / 4;
6109 reg = gen_rtx_REG (mode, regno);
6110 pos += GET_MODE_SIZE (mode);
6111 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
6112 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (pos));
6118 if (parms->intoffset == -1)
6119 parms->intoffset = bitpos;
6125 /* Used by function_arg and sparc_function_value_1 to implement the complex
6126 conventions of the 64-bit ABI for passing and returning structures.
6127 Return an expression valid as a return value for the FUNCTION_ARG
6128 and TARGET_FUNCTION_VALUE.
6130 TYPE is the data type of the argument (as a tree).
6131 This is null for libcalls where that information may
6133 MODE is the argument's machine mode.
6134 SLOTNO is the index number of the argument's slot in the parameter array.
6135 NAMED is nonzero if this argument is a named parameter
6136 (otherwise it is an extra parameter matching an ellipsis).
6137 REGBASE is the regno of the base register for the parameter array. */
6140 function_arg_record_value (const_tree type, enum machine_mode mode,
6141 int slotno, int named, int regbase)
6143 HOST_WIDE_INT typesize = int_size_in_bytes (type);
6144 struct function_arg_record_value_parms parms;
6147 parms.ret = NULL_RTX;
6148 parms.slotno = slotno;
6149 parms.named = named;
6150 parms.regbase = regbase;
6153 /* Compute how many registers we need. */
6155 parms.intoffset = 0;
6156 function_arg_record_value_1 (type, 0, &parms, false);
6158 /* Take into account pending integer fields. */
6159 if (parms.intoffset != -1)
6161 unsigned int startbit, endbit;
6162 int intslots, this_slotno;
6164 startbit = parms.intoffset & -BITS_PER_WORD;
6165 endbit = (typesize*BITS_PER_UNIT + BITS_PER_WORD - 1) & -BITS_PER_WORD;
6166 intslots = (endbit - startbit) / BITS_PER_WORD;
6167 this_slotno = slotno + parms.intoffset / BITS_PER_WORD;
6169 if (intslots > 0 && intslots > SPARC_INT_ARG_MAX - this_slotno)
6171 intslots = MAX (0, SPARC_INT_ARG_MAX - this_slotno);
6172 /* We need to pass this field on the stack. */
6176 parms.nregs += intslots;
6178 nregs = parms.nregs;
6180 /* Allocate the vector and handle some annoying special cases. */
6183 /* ??? Empty structure has no value? Duh? */
6186 /* Though there's nothing really to store, return a word register
6187 anyway so the rest of gcc doesn't go nuts. Returning a PARALLEL
6188 leads to breakage due to the fact that there are zero bytes to
6190 return gen_rtx_REG (mode, regbase);
6194 /* ??? C++ has structures with no fields, and yet a size. Give up
6195 for now and pass everything back in integer registers. */
6196 nregs = (typesize + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6198 if (nregs + slotno > SPARC_INT_ARG_MAX)
6199 nregs = SPARC_INT_ARG_MAX - slotno;
6201 gcc_assert (nregs != 0);
6203 parms.ret = gen_rtx_PARALLEL (mode, rtvec_alloc (parms.stack + nregs));
6205 /* If at least one field must be passed on the stack, generate
6206 (parallel [(expr_list (nil) ...) ...]) so that all fields will
6207 also be passed on the stack. We can't do much better because the
6208 semantics of TARGET_ARG_PARTIAL_BYTES doesn't handle the case
6209 of structures for which the fields passed exclusively in registers
6210 are not at the beginning of the structure. */
6212 XVECEXP (parms.ret, 0, 0)
6213 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
6215 /* Fill in the entries. */
6217 parms.intoffset = 0;
6218 function_arg_record_value_2 (type, 0, &parms, false);
6219 function_arg_record_value_3 (typesize * BITS_PER_UNIT, &parms);
6221 gcc_assert (parms.nregs == nregs);
6226 /* Used by function_arg and sparc_function_value_1 to implement the conventions
6227 of the 64-bit ABI for passing and returning unions.
6228 Return an expression valid as a return value for the FUNCTION_ARG
6229 and TARGET_FUNCTION_VALUE.
6231 SIZE is the size in bytes of the union.
6232 MODE is the argument's machine mode.
6233 REGNO is the hard register the union will be passed in. */
6236 function_arg_union_value (int size, enum machine_mode mode, int slotno,
6239 int nwords = ROUND_ADVANCE (size), i;
6242 /* See comment in previous function for empty structures. */
6244 return gen_rtx_REG (mode, regno);
6246 if (slotno == SPARC_INT_ARG_MAX - 1)
6249 regs = gen_rtx_PARALLEL (mode, rtvec_alloc (nwords));
6251 for (i = 0; i < nwords; i++)
6253 /* Unions are passed left-justified. */
6254 XVECEXP (regs, 0, i)
6255 = gen_rtx_EXPR_LIST (VOIDmode,
6256 gen_rtx_REG (word_mode, regno),
6257 GEN_INT (UNITS_PER_WORD * i));
6264 /* Used by function_arg and sparc_function_value_1 to implement the conventions
6265 for passing and returning large (BLKmode) vectors.
6266 Return an expression valid as a return value for the FUNCTION_ARG
6267 and TARGET_FUNCTION_VALUE.
6269 SIZE is the size in bytes of the vector (at least 8 bytes).
6270 REGNO is the FP hard register the vector will be passed in. */
6273 function_arg_vector_value (int size, int regno)
6275 int i, nregs = size / 8;
6278 regs = gen_rtx_PARALLEL (BLKmode, rtvec_alloc (nregs));
6280 for (i = 0; i < nregs; i++)
6282 XVECEXP (regs, 0, i)
6283 = gen_rtx_EXPR_LIST (VOIDmode,
6284 gen_rtx_REG (DImode, regno + 2*i),
6291 /* Determine where to put an argument to a function.
6292 Value is zero to push the argument on the stack,
6293 or a hard register in which to store the argument.
6295 CUM is a variable of type CUMULATIVE_ARGS which gives info about
6296 the preceding args and about the function being called.
6297 MODE is the argument's machine mode.
6298 TYPE is the data type of the argument (as a tree).
6299 This is null for libcalls where that information may
6301 NAMED is true if this argument is a named parameter
6302 (otherwise it is an extra parameter matching an ellipsis).
6303 INCOMING_P is false for TARGET_FUNCTION_ARG, true for
6304 TARGET_FUNCTION_INCOMING_ARG. */
6307 sparc_function_arg_1 (cumulative_args_t cum_v, enum machine_mode mode,
6308 const_tree type, bool named, bool incoming_p)
6310 const CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
6312 int regbase = (incoming_p
6313 ? SPARC_INCOMING_INT_ARG_FIRST
6314 : SPARC_OUTGOING_INT_ARG_FIRST);
6315 int slotno, regno, padding;
6316 enum mode_class mclass = GET_MODE_CLASS (mode);
6318 slotno = function_arg_slotno (cum, mode, type, named, incoming_p,
6323 /* Vector types deserve special treatment because they are polymorphic wrt
6324 their mode, depending upon whether VIS instructions are enabled. */
6325 if (type && TREE_CODE (type) == VECTOR_TYPE)
6327 HOST_WIDE_INT size = int_size_in_bytes (type);
6328 gcc_assert ((TARGET_ARCH32 && size <= 8)
6329 || (TARGET_ARCH64 && size <= 16));
6331 if (mode == BLKmode)
6332 return function_arg_vector_value (size,
6333 SPARC_FP_ARG_FIRST + 2*slotno);
6335 mclass = MODE_FLOAT;
6339 return gen_rtx_REG (mode, regno);
6341 /* Structures up to 16 bytes in size are passed in arg slots on the stack
6342 and are promoted to registers if possible. */
6343 if (type && TREE_CODE (type) == RECORD_TYPE)
6345 HOST_WIDE_INT size = int_size_in_bytes (type);
6346 gcc_assert (size <= 16);
6348 return function_arg_record_value (type, mode, slotno, named, regbase);
6351 /* Unions up to 16 bytes in size are passed in integer registers. */
6352 else if (type && TREE_CODE (type) == UNION_TYPE)
6354 HOST_WIDE_INT size = int_size_in_bytes (type);
6355 gcc_assert (size <= 16);
6357 return function_arg_union_value (size, mode, slotno, regno);
6360 /* v9 fp args in reg slots beyond the int reg slots get passed in regs
6361 but also have the slot allocated for them.
6362 If no prototype is in scope fp values in register slots get passed
6363 in two places, either fp regs and int regs or fp regs and memory. */
6364 else if ((mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
6365 && SPARC_FP_REG_P (regno))
6367 rtx reg = gen_rtx_REG (mode, regno);
6368 if (cum->prototype_p || cum->libcall_p)
6370 /* "* 2" because fp reg numbers are recorded in 4 byte
6373 /* ??? This will cause the value to be passed in the fp reg and
6374 in the stack. When a prototype exists we want to pass the
6375 value in the reg but reserve space on the stack. That's an
6376 optimization, and is deferred [for a bit]. */
6377 if ((regno - SPARC_FP_ARG_FIRST) >= SPARC_INT_ARG_MAX * 2)
6378 return gen_rtx_PARALLEL (mode,
6380 gen_rtx_EXPR_LIST (VOIDmode,
6381 NULL_RTX, const0_rtx),
6382 gen_rtx_EXPR_LIST (VOIDmode,
6386 /* ??? It seems that passing back a register even when past
6387 the area declared by REG_PARM_STACK_SPACE will allocate
6388 space appropriately, and will not copy the data onto the
6389 stack, exactly as we desire.
6391 This is due to locate_and_pad_parm being called in
6392 expand_call whenever reg_parm_stack_space > 0, which
6393 while beneficial to our example here, would seem to be
6394 in error from what had been intended. Ho hum... -- r~ */
6402 if ((regno - SPARC_FP_ARG_FIRST) < SPARC_INT_ARG_MAX * 2)
6406 /* On incoming, we don't need to know that the value
6407 is passed in %f0 and %i0, and it confuses other parts
6408 causing needless spillage even on the simplest cases. */
6412 intreg = (SPARC_OUTGOING_INT_ARG_FIRST
6413 + (regno - SPARC_FP_ARG_FIRST) / 2);
6415 v0 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
6416 v1 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (mode, intreg),
6418 return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
6422 v0 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
6423 v1 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
6424 return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
6429 /* All other aggregate types are passed in an integer register in a mode
6430 corresponding to the size of the type. */
6431 else if (type && AGGREGATE_TYPE_P (type))
6433 HOST_WIDE_INT size = int_size_in_bytes (type);
6434 gcc_assert (size <= 16);
6436 mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
6439 return gen_rtx_REG (mode, regno);
6442 /* Handle the TARGET_FUNCTION_ARG target hook. */
6445 sparc_function_arg (cumulative_args_t cum, enum machine_mode mode,
6446 const_tree type, bool named)
6448 return sparc_function_arg_1 (cum, mode, type, named, false);
6451 /* Handle the TARGET_FUNCTION_INCOMING_ARG target hook. */
6454 sparc_function_incoming_arg (cumulative_args_t cum, enum machine_mode mode,
6455 const_tree type, bool named)
6457 return sparc_function_arg_1 (cum, mode, type, named, true);
6460 /* For sparc64, objects requiring 16 byte alignment are passed that way. */
6463 sparc_function_arg_boundary (enum machine_mode mode, const_tree type)
6465 return ((TARGET_ARCH64
6466 && (GET_MODE_ALIGNMENT (mode) == 128
6467 || (type && TYPE_ALIGN (type) == 128)))
6472 /* For an arg passed partly in registers and partly in memory,
6473 this is the number of bytes of registers used.
6474 For args passed entirely in registers or entirely in memory, zero.
6476 Any arg that starts in the first 6 regs but won't entirely fit in them
6477 needs partial registers on v8. On v9, structures with integer
6478 values in arg slots 5,6 will be passed in %o5 and SP+176, and complex fp
6479 values that begin in the last fp reg [where "last fp reg" varies with the
6480 mode] will be split between that reg and memory. */
6483 sparc_arg_partial_bytes (cumulative_args_t cum, enum machine_mode mode,
6484 tree type, bool named)
6486 int slotno, regno, padding;
6488 /* We pass false for incoming_p here, it doesn't matter. */
6489 slotno = function_arg_slotno (get_cumulative_args (cum), mode, type, named,
6490 false, ®no, &padding);
6497 if ((slotno + (mode == BLKmode
6498 ? ROUND_ADVANCE (int_size_in_bytes (type))
6499 : ROUND_ADVANCE (GET_MODE_SIZE (mode))))
6500 > SPARC_INT_ARG_MAX)
6501 return (SPARC_INT_ARG_MAX - slotno) * UNITS_PER_WORD;
6505 /* We are guaranteed by pass_by_reference that the size of the
6506 argument is not greater than 16 bytes, so we only need to return
6507 one word if the argument is partially passed in registers. */
6509 if (type && AGGREGATE_TYPE_P (type))
6511 int size = int_size_in_bytes (type);
6513 if (size > UNITS_PER_WORD
6514 && slotno == SPARC_INT_ARG_MAX - 1)
6515 return UNITS_PER_WORD;
6517 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_INT
6518 || (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
6519 && ! (TARGET_FPU && named)))
6521 /* The complex types are passed as packed types. */
6522 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
6523 && slotno == SPARC_INT_ARG_MAX - 1)
6524 return UNITS_PER_WORD;
6526 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
6528 if ((slotno + GET_MODE_SIZE (mode) / UNITS_PER_WORD)
6530 return UNITS_PER_WORD;
6537 /* Handle the TARGET_PASS_BY_REFERENCE target hook.
6538 Specify whether to pass the argument by reference. */
6541 sparc_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
6542 enum machine_mode mode, const_tree type,
6543 bool named ATTRIBUTE_UNUSED)
6546 /* Original SPARC 32-bit ABI says that structures and unions,
6547 and quad-precision floats are passed by reference. For Pascal,
6548 also pass arrays by reference. All other base types are passed
6551 Extended ABI (as implemented by the Sun compiler) says that all
6552 complex floats are passed by reference. Pass complex integers
6553 in registers up to 8 bytes. More generally, enforce the 2-word
6554 cap for passing arguments in registers.
6556 Vector ABI (as implemented by the Sun VIS SDK) says that vector
6557 integers are passed like floats of the same size, that is in
6558 registers up to 8 bytes. Pass all vector floats by reference
6559 like structure and unions. */
6560 return ((type && (AGGREGATE_TYPE_P (type) || VECTOR_FLOAT_TYPE_P (type)))
6562 /* Catch CDImode, TFmode, DCmode and TCmode. */
6563 || GET_MODE_SIZE (mode) > 8
6565 && TREE_CODE (type) == VECTOR_TYPE
6566 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8));
6568 /* Original SPARC 64-bit ABI says that structures and unions
6569 smaller than 16 bytes are passed in registers, as well as
6570 all other base types.
6572 Extended ABI (as implemented by the Sun compiler) says that
6573 complex floats are passed in registers up to 16 bytes. Pass
6574 all complex integers in registers up to 16 bytes. More generally,
6575 enforce the 2-word cap for passing arguments in registers.
6577 Vector ABI (as implemented by the Sun VIS SDK) says that vector
6578 integers are passed like floats of the same size, that is in
6579 registers (up to 16 bytes). Pass all vector floats like structure
6582 && (AGGREGATE_TYPE_P (type) || TREE_CODE (type) == VECTOR_TYPE)
6583 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 16)
6584 /* Catch CTImode and TCmode. */
6585 || GET_MODE_SIZE (mode) > 16);
6588 /* Handle the TARGET_FUNCTION_ARG_ADVANCE hook.
6589 Update the data in CUM to advance over an argument
6590 of mode MODE and data type TYPE.
6591 TYPE is null for libcalls where that information may not be available. */
6594 sparc_function_arg_advance (cumulative_args_t cum_v, enum machine_mode mode,
6595 const_tree type, bool named)
6597 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
6600 /* We pass false for incoming_p here, it doesn't matter. */
6601 function_arg_slotno (cum, mode, type, named, false, ®no, &padding);
6603 /* If argument requires leading padding, add it. */
6604 cum->words += padding;
6608 cum->words += (mode != BLKmode
6609 ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
6610 : ROUND_ADVANCE (int_size_in_bytes (type)));
6614 if (type && AGGREGATE_TYPE_P (type))
6616 int size = int_size_in_bytes (type);
6620 else if (size <= 16)
6622 else /* passed by reference */
6627 cum->words += (mode != BLKmode
6628 ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
6629 : ROUND_ADVANCE (int_size_in_bytes (type)));
6634 /* Handle the FUNCTION_ARG_PADDING macro.
6635 For the 64 bit ABI structs are always stored left shifted in their
6639 function_arg_padding (enum machine_mode mode, const_tree type)
6641 if (TARGET_ARCH64 && type != 0 && AGGREGATE_TYPE_P (type))
6644 /* Fall back to the default. */
6645 return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
6648 /* Handle the TARGET_RETURN_IN_MEMORY target hook.
6649 Specify whether to return the return value in memory. */
6652 sparc_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
6655 /* Original SPARC 32-bit ABI says that structures and unions,
6656 and quad-precision floats are returned in memory. All other
6657 base types are returned in registers.
6659 Extended ABI (as implemented by the Sun compiler) says that
6660 all complex floats are returned in registers (8 FP registers
6661 at most for '_Complex long double'). Return all complex integers
6662 in registers (4 at most for '_Complex long long').
6664 Vector ABI (as implemented by the Sun VIS SDK) says that vector
6665 integers are returned like floats of the same size, that is in
6666 registers up to 8 bytes and in memory otherwise. Return all
6667 vector floats in memory like structure and unions; note that
6668 they always have BLKmode like the latter. */
6669 return (TYPE_MODE (type) == BLKmode
6670 || TYPE_MODE (type) == TFmode
6671 || (TREE_CODE (type) == VECTOR_TYPE
6672 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8));
6674 /* Original SPARC 64-bit ABI says that structures and unions
6675 smaller than 32 bytes are returned in registers, as well as
6676 all other base types.
6678 Extended ABI (as implemented by the Sun compiler) says that all
6679 complex floats are returned in registers (8 FP registers at most
6680 for '_Complex long double'). Return all complex integers in
6681 registers (4 at most for '_Complex TItype').
6683 Vector ABI (as implemented by the Sun VIS SDK) says that vector
6684 integers are returned like floats of the same size, that is in
6685 registers. Return all vector floats like structure and unions;
6686 note that they always have BLKmode like the latter. */
6687 return (TYPE_MODE (type) == BLKmode
6688 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 32);
6691 /* Handle the TARGET_STRUCT_VALUE target hook.
6692 Return where to find the structure return value address. */
6695 sparc_struct_value_rtx (tree fndecl, int incoming)
6704 mem = gen_frame_mem (Pmode, plus_constant (frame_pointer_rtx,
6705 STRUCT_VALUE_OFFSET));
6707 mem = gen_frame_mem (Pmode, plus_constant (stack_pointer_rtx,
6708 STRUCT_VALUE_OFFSET));
6710 /* Only follow the SPARC ABI for fixed-size structure returns.
6711 Variable size structure returns are handled per the normal
6712 procedures in GCC. This is enabled by -mstd-struct-return */
6714 && sparc_std_struct_return
6715 && TYPE_SIZE_UNIT (TREE_TYPE (fndecl))
6716 && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (fndecl))) == INTEGER_CST)
6718 /* We must check and adjust the return address, as it is
6719 optional as to whether the return object is really
6721 rtx ret_reg = gen_rtx_REG (Pmode, 31);
6722 rtx scratch = gen_reg_rtx (SImode);
6723 rtx endlab = gen_label_rtx ();
6725 /* Calculate the return object size */
6726 tree size = TYPE_SIZE_UNIT (TREE_TYPE (fndecl));
6727 rtx size_rtx = GEN_INT (TREE_INT_CST_LOW (size) & 0xfff);
6728 /* Construct a temporary return value */
6730 = assign_stack_local (Pmode, TREE_INT_CST_LOW (size), 0);
6732 /* Implement SPARC 32-bit psABI callee return struct checking:
6734 Fetch the instruction where we will return to and see if
6735 it's an unimp instruction (the most significant 10 bits
6737 emit_move_insn (scratch, gen_rtx_MEM (SImode,
6738 plus_constant (ret_reg, 8)));
6739 /* Assume the size is valid and pre-adjust */
6740 emit_insn (gen_add3_insn (ret_reg, ret_reg, GEN_INT (4)));
6741 emit_cmp_and_jump_insns (scratch, size_rtx, EQ, const0_rtx, SImode,
6743 emit_insn (gen_sub3_insn (ret_reg, ret_reg, GEN_INT (4)));
6744 /* Write the address of the memory pointed to by temp_val into
6745 the memory pointed to by mem */
6746 emit_move_insn (mem, XEXP (temp_val, 0));
6747 emit_label (endlab);
6754 /* Handle TARGET_FUNCTION_VALUE, and TARGET_LIBCALL_VALUE target hook.
6755 For v9, function return values are subject to the same rules as arguments,
6756 except that up to 32 bytes may be returned in registers. */
6759 sparc_function_value_1 (const_tree type, enum machine_mode mode,
6762 /* Beware that the two values are swapped here wrt function_arg. */
6763 int regbase = (outgoing
6764 ? SPARC_INCOMING_INT_ARG_FIRST
6765 : SPARC_OUTGOING_INT_ARG_FIRST);
6766 enum mode_class mclass = GET_MODE_CLASS (mode);
6769 /* Vector types deserve special treatment because they are polymorphic wrt
6770 their mode, depending upon whether VIS instructions are enabled. */
6771 if (type && TREE_CODE (type) == VECTOR_TYPE)
6773 HOST_WIDE_INT size = int_size_in_bytes (type);
6774 gcc_assert ((TARGET_ARCH32 && size <= 8)
6775 || (TARGET_ARCH64 && size <= 32));
6777 if (mode == BLKmode)
6778 return function_arg_vector_value (size,
6779 SPARC_FP_ARG_FIRST);
6781 mclass = MODE_FLOAT;
6784 if (TARGET_ARCH64 && type)
6786 /* Structures up to 32 bytes in size are returned in registers. */
6787 if (TREE_CODE (type) == RECORD_TYPE)
6789 HOST_WIDE_INT size = int_size_in_bytes (type);
6790 gcc_assert (size <= 32);
6792 return function_arg_record_value (type, mode, 0, 1, regbase);
6795 /* Unions up to 32 bytes in size are returned in integer registers. */
6796 else if (TREE_CODE (type) == UNION_TYPE)
6798 HOST_WIDE_INT size = int_size_in_bytes (type);
6799 gcc_assert (size <= 32);
6801 return function_arg_union_value (size, mode, 0, regbase);
6804 /* Objects that require it are returned in FP registers. */
6805 else if (mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
6808 /* All other aggregate types are returned in an integer register in a
6809 mode corresponding to the size of the type. */
6810 else if (AGGREGATE_TYPE_P (type))
6812 /* All other aggregate types are passed in an integer register
6813 in a mode corresponding to the size of the type. */
6814 HOST_WIDE_INT size = int_size_in_bytes (type);
6815 gcc_assert (size <= 32);
6817 mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
6819 /* ??? We probably should have made the same ABI change in
6820 3.4.0 as the one we made for unions. The latter was
6821 required by the SCD though, while the former is not
6822 specified, so we favored compatibility and efficiency.
6824 Now we're stuck for aggregates larger than 16 bytes,
6825 because OImode vanished in the meantime. Let's not
6826 try to be unduly clever, and simply follow the ABI
6827 for unions in that case. */
6828 if (mode == BLKmode)
6829 return function_arg_union_value (size, mode, 0, regbase);
6834 /* We should only have pointer and integer types at this point. This
6835 must match sparc_promote_function_mode. */
6836 else if (mclass == MODE_INT && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
6840 /* We should only have pointer and integer types at this point. This must
6841 match sparc_promote_function_mode. */
6842 else if (TARGET_ARCH32
6843 && mclass == MODE_INT
6844 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
6847 if ((mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT) && TARGET_FPU)
6848 regno = SPARC_FP_ARG_FIRST;
6852 return gen_rtx_REG (mode, regno);
6855 /* Handle TARGET_FUNCTION_VALUE.
6856 On the SPARC, the value is found in the first "output" register, but the
6857 called function leaves it in the first "input" register. */
6860 sparc_function_value (const_tree valtype,
6861 const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
6864 return sparc_function_value_1 (valtype, TYPE_MODE (valtype), outgoing);
6867 /* Handle TARGET_LIBCALL_VALUE. */
6870 sparc_libcall_value (enum machine_mode mode,
6871 const_rtx fun ATTRIBUTE_UNUSED)
6873 return sparc_function_value_1 (NULL_TREE, mode, false);
6876 /* Handle FUNCTION_VALUE_REGNO_P.
6877 On the SPARC, the first "output" reg is used for integer values, and the
6878 first floating point register is used for floating point values. */
6881 sparc_function_value_regno_p (const unsigned int regno)
6883 return (regno == 8 || regno == 32);
6886 /* Do what is necessary for `va_start'. We look at the current function
6887 to determine if stdarg or varargs is used and return the address of
6888 the first unnamed parameter. */
6891 sparc_builtin_saveregs (void)
6893 int first_reg = crtl->args.info.words;
6897 for (regno = first_reg; regno < SPARC_INT_ARG_MAX; regno++)
6898 emit_move_insn (gen_rtx_MEM (word_mode,
6899 gen_rtx_PLUS (Pmode,
6901 GEN_INT (FIRST_PARM_OFFSET (0)
6904 gen_rtx_REG (word_mode,
6905 SPARC_INCOMING_INT_ARG_FIRST + regno));
6907 address = gen_rtx_PLUS (Pmode,
6909 GEN_INT (FIRST_PARM_OFFSET (0)
6910 + UNITS_PER_WORD * first_reg));
6915 /* Implement `va_start' for stdarg. */
6918 sparc_va_start (tree valist, rtx nextarg)
6920 nextarg = expand_builtin_saveregs ();
6921 std_expand_builtin_va_start (valist, nextarg);
6924 /* Implement `va_arg' for stdarg. */
6927 sparc_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
6930 HOST_WIDE_INT size, rsize, align;
6933 tree ptrtype = build_pointer_type (type);
6935 if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
6938 size = rsize = UNITS_PER_WORD;
6944 size = int_size_in_bytes (type);
6945 rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
6950 /* For SPARC64, objects requiring 16-byte alignment get it. */
6951 if (TYPE_ALIGN (type) >= 2 * (unsigned) BITS_PER_WORD)
6952 align = 2 * UNITS_PER_WORD;
6954 /* SPARC-V9 ABI states that structures up to 16 bytes in size
6955 are left-justified in their slots. */
6956 if (AGGREGATE_TYPE_P (type))
6959 size = rsize = UNITS_PER_WORD;
6969 incr = fold_build_pointer_plus_hwi (incr, align - 1);
6970 incr = fold_convert (sizetype, incr);
6971 incr = fold_build2 (BIT_AND_EXPR, sizetype, incr,
6973 incr = fold_convert (ptr_type_node, incr);
6976 gimplify_expr (&incr, pre_p, post_p, is_gimple_val, fb_rvalue);
6979 if (BYTES_BIG_ENDIAN && size < rsize)
6980 addr = fold_build_pointer_plus_hwi (incr, rsize - size);
6984 addr = fold_convert (build_pointer_type (ptrtype), addr);
6985 addr = build_va_arg_indirect_ref (addr);
6988 /* If the address isn't aligned properly for the type, we need a temporary.
6989 FIXME: This is inefficient, usually we can do this in registers. */
6990 else if (align == 0 && TYPE_ALIGN (type) > BITS_PER_WORD)
6992 tree tmp = create_tmp_var (type, "va_arg_tmp");
6993 tree dest_addr = build_fold_addr_expr (tmp);
6994 tree copy = build_call_expr (builtin_decl_implicit (BUILT_IN_MEMCPY),
6995 3, dest_addr, addr, size_int (rsize));
6996 TREE_ADDRESSABLE (tmp) = 1;
6997 gimplify_and_add (copy, pre_p);
7002 addr = fold_convert (ptrtype, addr);
7004 incr = fold_build_pointer_plus_hwi (incr, rsize);
7005 gimplify_assign (valist, incr, post_p);
7007 return build_va_arg_indirect_ref (addr);
7010 /* Implement the TARGET_VECTOR_MODE_SUPPORTED_P target hook.
7011 Specify whether the vector mode is supported by the hardware. */
7014 sparc_vector_mode_supported_p (enum machine_mode mode)
7016 return TARGET_VIS && VECTOR_MODE_P (mode) ? true : false;
7019 /* Implement the TARGET_VECTORIZE_PREFERRED_SIMD_MODE target hook. */
7021 static enum machine_mode
7022 sparc_preferred_simd_mode (enum machine_mode mode)
7040 /* Return the string to output an unconditional branch to LABEL, which is
7041 the operand number of the label.
7043 DEST is the destination insn (i.e. the label), INSN is the source. */
7046 output_ubranch (rtx dest, int label, rtx insn)
7048 static char string[64];
7049 bool v9_form = false;
7052 if (TARGET_V9 && INSN_ADDRESSES_SET_P ())
7054 int delta = (INSN_ADDRESSES (INSN_UID (dest))
7055 - INSN_ADDRESSES (INSN_UID (insn)));
7056 /* Leave some instructions for "slop". */
7057 if (delta >= -260000 && delta < 260000)
7062 strcpy (string, "ba%*,pt\t%%xcc, ");
7064 strcpy (string, "b%*\t");
7066 p = strchr (string, '\0');
7077 /* Return the string to output a conditional branch to LABEL, which is
7078 the operand number of the label. OP is the conditional expression.
7079 XEXP (OP, 0) is assumed to be a condition code register (integer or
7080 floating point) and its mode specifies what kind of comparison we made.
7082 DEST is the destination insn (i.e. the label), INSN is the source.
7084 REVERSED is nonzero if we should reverse the sense of the comparison.
7086 ANNUL is nonzero if we should generate an annulling branch. */
7089 output_cbranch (rtx op, rtx dest, int label, int reversed, int annul,
7092 static char string[64];
7093 enum rtx_code code = GET_CODE (op);
7094 rtx cc_reg = XEXP (op, 0);
7095 enum machine_mode mode = GET_MODE (cc_reg);
7096 const char *labelno, *branch;
7097 int spaces = 8, far;
7100 /* v9 branches are limited to +-1MB. If it is too far away,
7113 fbne,a,pn %fcc2, .LC29
7121 far = TARGET_V9 && (get_attr_length (insn) >= 3);
7124 /* Reversal of FP compares takes care -- an ordered compare
7125 becomes an unordered compare and vice versa. */
7126 if (mode == CCFPmode || mode == CCFPEmode)
7127 code = reverse_condition_maybe_unordered (code);
7129 code = reverse_condition (code);
7132 /* Start by writing the branch condition. */
7133 if (mode == CCFPmode || mode == CCFPEmode)
7184 /* ??? !v9: FP branches cannot be preceded by another floating point
7185 insn. Because there is currently no concept of pre-delay slots,
7186 we can fix this only by always emitting a nop before a floating
7191 strcpy (string, "nop\n\t");
7192 strcat (string, branch);
7205 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
7217 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
7238 strcpy (string, branch);
7240 spaces -= strlen (branch);
7241 p = strchr (string, '\0');
7243 /* Now add the annulling, the label, and a possible noop. */
7256 if (! far && insn && INSN_ADDRESSES_SET_P ())
7258 int delta = (INSN_ADDRESSES (INSN_UID (dest))
7259 - INSN_ADDRESSES (INSN_UID (insn)));
7260 /* Leave some instructions for "slop". */
7261 if (delta < -260000 || delta >= 260000)
7265 if (mode == CCFPmode || mode == CCFPEmode)
7267 static char v9_fcc_labelno[] = "%%fccX, ";
7268 /* Set the char indicating the number of the fcc reg to use. */
7269 v9_fcc_labelno[5] = REGNO (cc_reg) - SPARC_FIRST_V9_FCC_REG + '0';
7270 labelno = v9_fcc_labelno;
7273 gcc_assert (REGNO (cc_reg) == SPARC_FCC_REG);
7277 else if (mode == CCXmode || mode == CCX_NOOVmode)
7279 labelno = "%%xcc, ";
7284 labelno = "%%icc, ";
7289 if (*labelno && insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
7292 ((INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ^ far)
7305 strcpy (p, labelno);
7306 p = strchr (p, '\0');
7309 strcpy (p, ".+12\n\t nop\n\tb\t");
7310 /* Skip the next insn if requested or
7311 if we know that it will be a nop. */
7312 if (annul || ! final_sequence)
7326 /* Emit a library call comparison between floating point X and Y.
7327 COMPARISON is the operator to compare with (EQ, NE, GT, etc).
7328 Return the new operator to be used in the comparison sequence.
7330 TARGET_ARCH64 uses _Qp_* functions, which use pointers to TFmode
7331 values as arguments instead of the TFmode registers themselves,
7332 that's why we cannot call emit_float_lib_cmp. */
7335 sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
7338 rtx slot0, slot1, result, tem, tem2, libfunc;
7339 enum machine_mode mode;
7340 enum rtx_code new_comparison;
7345 qpfunc = (TARGET_ARCH64 ? "_Qp_feq" : "_Q_feq");
7349 qpfunc = (TARGET_ARCH64 ? "_Qp_fne" : "_Q_fne");
7353 qpfunc = (TARGET_ARCH64 ? "_Qp_fgt" : "_Q_fgt");
7357 qpfunc = (TARGET_ARCH64 ? "_Qp_fge" : "_Q_fge");
7361 qpfunc = (TARGET_ARCH64 ? "_Qp_flt" : "_Q_flt");
7365 qpfunc = (TARGET_ARCH64 ? "_Qp_fle" : "_Q_fle");
7376 qpfunc = (TARGET_ARCH64 ? "_Qp_cmp" : "_Q_cmp");
7389 slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
7390 emit_move_insn (slot0, x);
7397 slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
7398 emit_move_insn (slot1, y);
7401 libfunc = gen_rtx_SYMBOL_REF (Pmode, qpfunc);
7402 emit_library_call (libfunc, LCT_NORMAL,
7404 XEXP (slot0, 0), Pmode,
7405 XEXP (slot1, 0), Pmode);
7410 libfunc = gen_rtx_SYMBOL_REF (Pmode, qpfunc);
7411 emit_library_call (libfunc, LCT_NORMAL,
7413 x, TFmode, y, TFmode);
7418 /* Immediately move the result of the libcall into a pseudo
7419 register so reload doesn't clobber the value if it needs
7420 the return register for a spill reg. */
7421 result = gen_reg_rtx (mode);
7422 emit_move_insn (result, hard_libcall_value (mode, libfunc));
7427 return gen_rtx_NE (VOIDmode, result, const0_rtx);
7430 new_comparison = (comparison == UNORDERED ? EQ : NE);
7431 return gen_rtx_fmt_ee (new_comparison, VOIDmode, result, GEN_INT(3));
7434 new_comparison = (comparison == UNGT ? GT : NE);
7435 return gen_rtx_fmt_ee (new_comparison, VOIDmode, result, const1_rtx);
7437 return gen_rtx_NE (VOIDmode, result, const2_rtx);
7439 tem = gen_reg_rtx (mode);
7441 emit_insn (gen_andsi3 (tem, result, const1_rtx));
7443 emit_insn (gen_anddi3 (tem, result, const1_rtx));
7444 return gen_rtx_NE (VOIDmode, tem, const0_rtx);
7447 tem = gen_reg_rtx (mode);
7449 emit_insn (gen_addsi3 (tem, result, const1_rtx));
7451 emit_insn (gen_adddi3 (tem, result, const1_rtx));
7452 tem2 = gen_reg_rtx (mode);
7454 emit_insn (gen_andsi3 (tem2, tem, const2_rtx));
7456 emit_insn (gen_anddi3 (tem2, tem, const2_rtx));
7457 new_comparison = (comparison == UNEQ ? EQ : NE);
7458 return gen_rtx_fmt_ee (new_comparison, VOIDmode, tem2, const0_rtx);
7464 /* Generate an unsigned DImode to FP conversion. This is the same code
7465 optabs would emit if we didn't have TFmode patterns. */
7468 sparc_emit_floatunsdi (rtx *operands, enum machine_mode mode)
7470 rtx neglab, donelab, i0, i1, f0, in, out;
7473 in = force_reg (DImode, operands[1]);
7474 neglab = gen_label_rtx ();
7475 donelab = gen_label_rtx ();
7476 i0 = gen_reg_rtx (DImode);
7477 i1 = gen_reg_rtx (DImode);
7478 f0 = gen_reg_rtx (mode);
7480 emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, DImode, 0, neglab);
7482 emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_FLOAT (mode, in)));
7483 emit_jump_insn (gen_jump (donelab));
7486 emit_label (neglab);
7488 emit_insn (gen_lshrdi3 (i0, in, const1_rtx));
7489 emit_insn (gen_anddi3 (i1, in, const1_rtx));
7490 emit_insn (gen_iordi3 (i0, i0, i1));
7491 emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_FLOAT (mode, i0)));
7492 emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
7494 emit_label (donelab);
7497 /* Generate an FP to unsigned DImode conversion. This is the same code
7498 optabs would emit if we didn't have TFmode patterns. */
7501 sparc_emit_fixunsdi (rtx *operands, enum machine_mode mode)
7503 rtx neglab, donelab, i0, i1, f0, in, out, limit;
7506 in = force_reg (mode, operands[1]);
7507 neglab = gen_label_rtx ();
7508 donelab = gen_label_rtx ();
7509 i0 = gen_reg_rtx (DImode);
7510 i1 = gen_reg_rtx (DImode);
7511 limit = gen_reg_rtx (mode);
7512 f0 = gen_reg_rtx (mode);
7514 emit_move_insn (limit,
7515 CONST_DOUBLE_FROM_REAL_VALUE (
7516 REAL_VALUE_ATOF ("9223372036854775808.0", mode), mode));
7517 emit_cmp_and_jump_insns (in, limit, GE, NULL_RTX, mode, 0, neglab);
7519 emit_insn (gen_rtx_SET (VOIDmode,
7521 gen_rtx_FIX (DImode, gen_rtx_FIX (mode, in))));
7522 emit_jump_insn (gen_jump (donelab));
7525 emit_label (neglab);
7527 emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_MINUS (mode, in, limit)));
7528 emit_insn (gen_rtx_SET (VOIDmode,
7530 gen_rtx_FIX (DImode, gen_rtx_FIX (mode, f0))));
7531 emit_insn (gen_movdi (i1, const1_rtx));
7532 emit_insn (gen_ashldi3 (i1, i1, GEN_INT (63)));
7533 emit_insn (gen_xordi3 (out, i0, i1));
7535 emit_label (donelab);
7538 /* Return the string to output a conditional branch to LABEL, testing
7539 register REG. LABEL is the operand number of the label; REG is the
7540 operand number of the reg. OP is the conditional expression. The mode
7541 of REG says what kind of comparison we made.
7543 DEST is the destination insn (i.e. the label), INSN is the source.
7545 REVERSED is nonzero if we should reverse the sense of the comparison.
7547 ANNUL is nonzero if we should generate an annulling branch. */
7550 output_v9branch (rtx op, rtx dest, int reg, int label, int reversed,
7551 int annul, rtx insn)
7553 static char string[64];
7554 enum rtx_code code = GET_CODE (op);
7555 enum machine_mode mode = GET_MODE (XEXP (op, 0));
7560 /* branch on register are limited to +-128KB. If it is too far away,
7573 brgez,a,pn %o1, .LC29
7579 ba,pt %xcc, .LC29 */
7581 far = get_attr_length (insn) >= 3;
7583 /* If not floating-point or if EQ or NE, we can just reverse the code. */
7585 code = reverse_condition (code);
7587 /* Only 64 bit versions of these instructions exist. */
7588 gcc_assert (mode == DImode);
7590 /* Start by writing the branch condition. */
7595 strcpy (string, "brnz");
7599 strcpy (string, "brz");
7603 strcpy (string, "brgez");
7607 strcpy (string, "brlz");
7611 strcpy (string, "brlez");
7615 strcpy (string, "brgz");
7622 p = strchr (string, '\0');
7624 /* Now add the annulling, reg, label, and nop. */
7631 if (insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
7634 ((INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2) ^ far)
7639 *p = p < string + 8 ? '\t' : ' ';
7647 int veryfar = 1, delta;
7649 if (INSN_ADDRESSES_SET_P ())
7651 delta = (INSN_ADDRESSES (INSN_UID (dest))
7652 - INSN_ADDRESSES (INSN_UID (insn)));
7653 /* Leave some instructions for "slop". */
7654 if (delta >= -260000 && delta < 260000)
7658 strcpy (p, ".+12\n\t nop\n\t");
7659 /* Skip the next insn if requested or
7660 if we know that it will be a nop. */
7661 if (annul || ! final_sequence)
7671 strcpy (p, "ba,pt\t%%xcc, ");
7685 /* Return 1, if any of the registers of the instruction are %l[0-7] or %o[0-7].
7686 Such instructions cannot be used in the delay slot of return insn on v9.
7687 If TEST is 0, also rename all %i[0-7] registers to their %o[0-7] counterparts.
7691 epilogue_renumber (register rtx *where, int test)
7693 register const char *fmt;
7695 register enum rtx_code code;
7700 code = GET_CODE (*where);
7705 if (REGNO (*where) >= 8 && REGNO (*where) < 24) /* oX or lX */
7707 if (! test && REGNO (*where) >= 24 && REGNO (*where) < 32)
7708 *where = gen_rtx_REG (GET_MODE (*where), OUTGOING_REGNO (REGNO(*where)));
7716 /* Do not replace the frame pointer with the stack pointer because
7717 it can cause the delayed instruction to load below the stack.
7718 This occurs when instructions like:
7720 (set (reg/i:SI 24 %i0)
7721 (mem/f:SI (plus:SI (reg/f:SI 30 %fp)
7722 (const_int -20 [0xffffffec])) 0))
7724 are in the return delayed slot. */
7726 if (GET_CODE (XEXP (*where, 0)) == REG
7727 && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM
7728 && (GET_CODE (XEXP (*where, 1)) != CONST_INT
7729 || INTVAL (XEXP (*where, 1)) < SPARC_STACK_BIAS))
7734 if (SPARC_STACK_BIAS
7735 && GET_CODE (XEXP (*where, 0)) == REG
7736 && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM)
7744 fmt = GET_RTX_FORMAT (code);
7746 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
7751 for (j = XVECLEN (*where, i) - 1; j >= 0; j--)
7752 if (epilogue_renumber (&(XVECEXP (*where, i, j)), test))
7755 else if (fmt[i] == 'e'
7756 && epilogue_renumber (&(XEXP (*where, i)), test))
7762 /* Leaf functions and non-leaf functions have different needs. */
7765 reg_leaf_alloc_order[] = REG_LEAF_ALLOC_ORDER;
7768 reg_nonleaf_alloc_order[] = REG_ALLOC_ORDER;
7770 static const int *const reg_alloc_orders[] = {
7771 reg_leaf_alloc_order,
7772 reg_nonleaf_alloc_order};
7775 order_regs_for_local_alloc (void)
7777 static int last_order_nonleaf = 1;
7779 if (df_regs_ever_live_p (15) != last_order_nonleaf)
7781 last_order_nonleaf = !last_order_nonleaf;
7782 memcpy ((char *) reg_alloc_order,
7783 (const char *) reg_alloc_orders[last_order_nonleaf],
7784 FIRST_PSEUDO_REGISTER * sizeof (int));
7788 /* Return 1 if REG and MEM are legitimate enough to allow the various
7789 mem<-->reg splits to be run. */
7792 sparc_splitdi_legitimate (rtx reg, rtx mem)
7794 /* Punt if we are here by mistake. */
7795 gcc_assert (reload_completed);
7797 /* We must have an offsettable memory reference. */
7798 if (! offsettable_memref_p (mem))
7801 /* If we have legitimate args for ldd/std, we do not want
7802 the split to happen. */
7803 if ((REGNO (reg) % 2) == 0
7804 && mem_min_alignment (mem, 8))
7811 /* Like sparc_splitdi_legitimate but for REG <--> REG moves. */
7814 sparc_split_regreg_legitimate (rtx reg1, rtx reg2)
7818 if (GET_CODE (reg1) == SUBREG)
7819 reg1 = SUBREG_REG (reg1);
7820 if (GET_CODE (reg1) != REG)
7822 regno1 = REGNO (reg1);
7824 if (GET_CODE (reg2) == SUBREG)
7825 reg2 = SUBREG_REG (reg2);
7826 if (GET_CODE (reg2) != REG)
7828 regno2 = REGNO (reg2);
7830 if (SPARC_INT_REG_P (regno1) && SPARC_INT_REG_P (regno2))
7835 if ((SPARC_INT_REG_P (regno1) && SPARC_FP_REG_P (regno2))
7836 || (SPARC_FP_REG_P (regno1) && SPARC_INT_REG_P (regno2)))
7843 /* Return 1 if x and y are some kind of REG and they refer to
7844 different hard registers. This test is guaranteed to be
7845 run after reload. */
7848 sparc_absnegfloat_split_legitimate (rtx x, rtx y)
7850 if (GET_CODE (x) != REG)
7852 if (GET_CODE (y) != REG)
7854 if (REGNO (x) == REGNO (y))
7859 /* Return 1 if REGNO (reg1) is even and REGNO (reg1) == REGNO (reg2) - 1.
7860 This makes them candidates for using ldd and std insns.
7862 Note reg1 and reg2 *must* be hard registers. */
7865 registers_ok_for_ldd_peep (rtx reg1, rtx reg2)
7867 /* We might have been passed a SUBREG. */
7868 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
7871 if (REGNO (reg1) % 2 != 0)
7874 /* Integer ldd is deprecated in SPARC V9 */
7875 if (TARGET_V9 && SPARC_INT_REG_P (REGNO (reg1)))
7878 return (REGNO (reg1) == REGNO (reg2) - 1);
7881 /* Return 1 if the addresses in mem1 and mem2 are suitable for use in
7884 This can only happen when addr1 and addr2, the addresses in mem1
7885 and mem2, are consecutive memory locations (addr1 + 4 == addr2).
7886 addr1 must also be aligned on a 64-bit boundary.
7888 Also iff dependent_reg_rtx is not null it should not be used to
7889 compute the address for mem1, i.e. we cannot optimize a sequence
7901 But, note that the transformation from:
7906 is perfectly fine. Thus, the peephole2 patterns always pass us
7907 the destination register of the first load, never the second one.
7909 For stores we don't have a similar problem, so dependent_reg_rtx is
7913 mems_ok_for_ldd_peep (rtx mem1, rtx mem2, rtx dependent_reg_rtx)
7917 HOST_WIDE_INT offset1;
7919 /* The mems cannot be volatile. */
7920 if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
7923 /* MEM1 should be aligned on a 64-bit boundary. */
7924 if (MEM_ALIGN (mem1) < 64)
7927 addr1 = XEXP (mem1, 0);
7928 addr2 = XEXP (mem2, 0);
7930 /* Extract a register number and offset (if used) from the first addr. */
7931 if (GET_CODE (addr1) == PLUS)
7933 /* If not a REG, return zero. */
7934 if (GET_CODE (XEXP (addr1, 0)) != REG)
7938 reg1 = REGNO (XEXP (addr1, 0));
7939 /* The offset must be constant! */
7940 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
7942 offset1 = INTVAL (XEXP (addr1, 1));
7945 else if (GET_CODE (addr1) != REG)
7949 reg1 = REGNO (addr1);
7950 /* This was a simple (mem (reg)) expression. Offset is 0. */
7954 /* Make sure the second address is a (mem (plus (reg) (const_int). */
7955 if (GET_CODE (addr2) != PLUS)
7958 if (GET_CODE (XEXP (addr2, 0)) != REG
7959 || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
7962 if (reg1 != REGNO (XEXP (addr2, 0)))
7965 if (dependent_reg_rtx != NULL_RTX && reg1 == REGNO (dependent_reg_rtx))
7968 /* The first offset must be evenly divisible by 8 to ensure the
7969 address is 64 bit aligned. */
7970 if (offset1 % 8 != 0)
7973 /* The offset for the second addr must be 4 more than the first addr. */
7974 if (INTVAL (XEXP (addr2, 1)) != offset1 + 4)
7977 /* All the tests passed. addr1 and addr2 are valid for ldd and std
7982 /* Return 1 if reg is a pseudo, or is the first register in
7983 a hard register pair. This makes it suitable for use in
7984 ldd and std insns. */
7987 register_ok_for_ldd (rtx reg)
7989 /* We might have been passed a SUBREG. */
7993 if (REGNO (reg) < FIRST_PSEUDO_REGISTER)
7994 return (REGNO (reg) % 2 == 0);
7999 /* Return 1 if OP is a memory whose address is known to be
8000 aligned to 8-byte boundary, or a pseudo during reload.
8001 This makes it suitable for use in ldd and std insns. */
8004 memory_ok_for_ldd (rtx op)
8008 /* In 64-bit mode, we assume that the address is word-aligned. */
8009 if (TARGET_ARCH32 && !mem_min_alignment (op, 8))
8012 if (! can_create_pseudo_p ()
8013 && !strict_memory_address_p (Pmode, XEXP (op, 0)))
8016 else if (REG_P (op) && REGNO (op) >= FIRST_PSEUDO_REGISTER)
8018 if (!(reload_in_progress && reg_renumber [REGNO (op)] < 0))
8027 /* Implement TARGET_PRINT_OPERAND_PUNCT_VALID_P. */
8030 sparc_print_operand_punct_valid_p (unsigned char code)
8043 /* Implement TARGET_PRINT_OPERAND.
8044 Print operand X (an rtx) in assembler syntax to file FILE.
8045 CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
8046 For `%' followed by punctuation, CODE is the punctuation and X is null. */
8049 sparc_print_operand (FILE *file, rtx x, int code)
8054 /* Output an insn in a delay slot. */
8056 sparc_indent_opcode = 1;
8058 fputs ("\n\t nop", file);
8061 /* Output an annul flag if there's nothing for the delay slot and we
8062 are optimizing. This is always used with '(' below.
8063 Sun OS 4.1.1 dbx can't handle an annulled unconditional branch;
8064 this is a dbx bug. So, we only do this when optimizing.
8065 On UltraSPARC, a branch in a delay slot causes a pipeline flush.
8066 Always emit a nop in case the next instruction is a branch. */
8067 if (! final_sequence && (optimize && (int)sparc_cpu < PROCESSOR_V9))
8071 /* Output a 'nop' if there's nothing for the delay slot and we are
8072 not optimizing. This is always used with '*' above. */
8073 if (! final_sequence && ! (optimize && (int)sparc_cpu < PROCESSOR_V9))
8074 fputs ("\n\t nop", file);
8075 else if (final_sequence)
8076 sparc_indent_opcode = 1;
8079 /* Output the right displacement from the saved PC on function return.
8080 The caller may have placed an "unimp" insn immediately after the call
8081 so we have to account for it. This insn is used in the 32-bit ABI
8082 when calling a function that returns a non zero-sized structure. The
8083 64-bit ABI doesn't have it. Be careful to have this test be the same
8084 as that for the call. The exception is when sparc_std_struct_return
8085 is enabled, the psABI is followed exactly and the adjustment is made
8086 by the code in sparc_struct_value_rtx. The call emitted is the same
8087 when sparc_std_struct_return is enabled. */
8089 && cfun->returns_struct
8090 && !sparc_std_struct_return
8091 && DECL_SIZE (DECL_RESULT (current_function_decl))
8092 && TREE_CODE (DECL_SIZE (DECL_RESULT (current_function_decl)))
8094 && !integer_zerop (DECL_SIZE (DECL_RESULT (current_function_decl))))
8100 /* Output the Embedded Medium/Anywhere code model base register. */
8101 fputs (EMBMEDANY_BASE_REG, file);
8104 /* Print some local dynamic TLS name. */
8105 assemble_name (file, get_some_local_dynamic_name ());
8109 /* Adjust the operand to take into account a RESTORE operation. */
8110 if (GET_CODE (x) == CONST_INT)
8112 else if (GET_CODE (x) != REG)
8113 output_operand_lossage ("invalid %%Y operand");
8114 else if (REGNO (x) < 8)
8115 fputs (reg_names[REGNO (x)], file);
8116 else if (REGNO (x) >= 24 && REGNO (x) < 32)
8117 fputs (reg_names[REGNO (x)-16], file);
8119 output_operand_lossage ("invalid %%Y operand");
8122 /* Print out the low order register name of a register pair. */
8123 if (WORDS_BIG_ENDIAN)
8124 fputs (reg_names[REGNO (x)+1], file);
8126 fputs (reg_names[REGNO (x)], file);
8129 /* Print out the high order register name of a register pair. */
8130 if (WORDS_BIG_ENDIAN)
8131 fputs (reg_names[REGNO (x)], file);
8133 fputs (reg_names[REGNO (x)+1], file);
8136 /* Print out the second register name of a register pair or quad.
8137 I.e., R (%o0) => %o1. */
8138 fputs (reg_names[REGNO (x)+1], file);
8141 /* Print out the third register name of a register quad.
8142 I.e., S (%o0) => %o2. */
8143 fputs (reg_names[REGNO (x)+2], file);
8146 /* Print out the fourth register name of a register quad.
8147 I.e., T (%o0) => %o3. */
8148 fputs (reg_names[REGNO (x)+3], file);
8151 /* Print a condition code register. */
8152 if (REGNO (x) == SPARC_ICC_REG)
8154 /* We don't handle CC[X]_NOOVmode because they're not supposed
8156 if (GET_MODE (x) == CCmode)
8157 fputs ("%icc", file);
8158 else if (GET_MODE (x) == CCXmode)
8159 fputs ("%xcc", file);
8164 /* %fccN register */
8165 fputs (reg_names[REGNO (x)], file);
8168 /* Print the operand's address only. */
8169 output_address (XEXP (x, 0));
8172 /* In this case we need a register. Use %g0 if the
8173 operand is const0_rtx. */
8175 || (GET_MODE (x) != VOIDmode && x == CONST0_RTX (GET_MODE (x))))
8177 fputs ("%g0", file);
8184 switch (GET_CODE (x))
8186 case IOR: fputs ("or", file); break;
8187 case AND: fputs ("and", file); break;
8188 case XOR: fputs ("xor", file); break;
8189 default: output_operand_lossage ("invalid %%A operand");
8194 switch (GET_CODE (x))
8196 case IOR: fputs ("orn", file); break;
8197 case AND: fputs ("andn", file); break;
8198 case XOR: fputs ("xnor", file); break;
8199 default: output_operand_lossage ("invalid %%B operand");
8203 /* This is used by the conditional move instructions. */
8206 enum rtx_code rc = GET_CODE (x);
8210 case NE: fputs ("ne", file); break;
8211 case EQ: fputs ("e", file); break;
8212 case GE: fputs ("ge", file); break;
8213 case GT: fputs ("g", file); break;
8214 case LE: fputs ("le", file); break;
8215 case LT: fputs ("l", file); break;
8216 case GEU: fputs ("geu", file); break;
8217 case GTU: fputs ("gu", file); break;
8218 case LEU: fputs ("leu", file); break;
8219 case LTU: fputs ("lu", file); break;
8220 case LTGT: fputs ("lg", file); break;
8221 case UNORDERED: fputs ("u", file); break;
8222 case ORDERED: fputs ("o", file); break;
8223 case UNLT: fputs ("ul", file); break;
8224 case UNLE: fputs ("ule", file); break;
8225 case UNGT: fputs ("ug", file); break;
8226 case UNGE: fputs ("uge", file); break;
8227 case UNEQ: fputs ("ue", file); break;
8228 default: output_operand_lossage ("invalid %%C operand");
8233 /* This are used by the movr instruction pattern. */
8236 enum rtx_code rc = GET_CODE (x);
8239 case NE: fputs ("ne", file); break;
8240 case EQ: fputs ("e", file); break;
8241 case GE: fputs ("gez", file); break;
8242 case LT: fputs ("lz", file); break;
8243 case LE: fputs ("lez", file); break;
8244 case GT: fputs ("gz", file); break;
8245 default: output_operand_lossage ("invalid %%D operand");
8252 /* Print a sign-extended character. */
8253 int i = trunc_int_for_mode (INTVAL (x), QImode);
8254 fprintf (file, "%d", i);
8259 /* Operand must be a MEM; write its address. */
8260 if (GET_CODE (x) != MEM)
8261 output_operand_lossage ("invalid %%f operand");
8262 output_address (XEXP (x, 0));
8267 /* Print a sign-extended 32-bit value. */
8269 if (GET_CODE(x) == CONST_INT)
8271 else if (GET_CODE(x) == CONST_DOUBLE)
8272 i = CONST_DOUBLE_LOW (x);
8275 output_operand_lossage ("invalid %%s operand");
8278 i = trunc_int_for_mode (i, SImode);
8279 fprintf (file, HOST_WIDE_INT_PRINT_DEC, i);
8284 /* Do nothing special. */
8288 /* Undocumented flag. */
8289 output_operand_lossage ("invalid operand output code");
8292 if (GET_CODE (x) == REG)
8293 fputs (reg_names[REGNO (x)], file);
8294 else if (GET_CODE (x) == MEM)
8297 /* Poor Sun assembler doesn't understand absolute addressing. */
8298 if (CONSTANT_P (XEXP (x, 0)))
8299 fputs ("%g0+", file);
8300 output_address (XEXP (x, 0));
8303 else if (GET_CODE (x) == HIGH)
8305 fputs ("%hi(", file);
8306 output_addr_const (file, XEXP (x, 0));
8309 else if (GET_CODE (x) == LO_SUM)
8311 sparc_print_operand (file, XEXP (x, 0), 0);
8312 if (TARGET_CM_MEDMID)
8313 fputs ("+%l44(", file);
8315 fputs ("+%lo(", file);
8316 output_addr_const (file, XEXP (x, 1));
8319 else if (GET_CODE (x) == CONST_DOUBLE
8320 && (GET_MODE (x) == VOIDmode
8321 || GET_MODE_CLASS (GET_MODE (x)) == MODE_INT))
8323 if (CONST_DOUBLE_HIGH (x) == 0)
8324 fprintf (file, "%u", (unsigned int) CONST_DOUBLE_LOW (x));
8325 else if (CONST_DOUBLE_HIGH (x) == -1
8326 && CONST_DOUBLE_LOW (x) < 0)
8327 fprintf (file, "%d", (int) CONST_DOUBLE_LOW (x));
8329 output_operand_lossage ("long long constant not a valid immediate operand");
8331 else if (GET_CODE (x) == CONST_DOUBLE)
8332 output_operand_lossage ("floating point constant not a valid immediate operand");
8333 else { output_addr_const (file, x); }
8336 /* Implement TARGET_PRINT_OPERAND_ADDRESS. */
8339 sparc_print_operand_address (FILE *file, rtx x)
8341 register rtx base, index = 0;
8343 register rtx addr = x;
8346 fputs (reg_names[REGNO (addr)], file);
8347 else if (GET_CODE (addr) == PLUS)
8349 if (CONST_INT_P (XEXP (addr, 0)))
8350 offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1);
8351 else if (CONST_INT_P (XEXP (addr, 1)))
8352 offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);
8354 base = XEXP (addr, 0), index = XEXP (addr, 1);
8355 if (GET_CODE (base) == LO_SUM)
8357 gcc_assert (USE_AS_OFFSETABLE_LO10
8359 && ! TARGET_CM_MEDMID);
8360 output_operand (XEXP (base, 0), 0);
8361 fputs ("+%lo(", file);
8362 output_address (XEXP (base, 1));
8363 fprintf (file, ")+%d", offset);
8367 fputs (reg_names[REGNO (base)], file);
8369 fprintf (file, "%+d", offset);
8370 else if (REG_P (index))
8371 fprintf (file, "+%s", reg_names[REGNO (index)]);
8372 else if (GET_CODE (index) == SYMBOL_REF
8373 || GET_CODE (index) == LABEL_REF
8374 || GET_CODE (index) == CONST)
8375 fputc ('+', file), output_addr_const (file, index);
8376 else gcc_unreachable ();
8379 else if (GET_CODE (addr) == MINUS
8380 && GET_CODE (XEXP (addr, 1)) == LABEL_REF)
8382 output_addr_const (file, XEXP (addr, 0));
8384 output_addr_const (file, XEXP (addr, 1));
8385 fputs ("-.)", file);
8387 else if (GET_CODE (addr) == LO_SUM)
8389 output_operand (XEXP (addr, 0), 0);
8390 if (TARGET_CM_MEDMID)
8391 fputs ("+%l44(", file);
8393 fputs ("+%lo(", file);
8394 output_address (XEXP (addr, 1));
8398 && GET_CODE (addr) == CONST
8399 && GET_CODE (XEXP (addr, 0)) == MINUS
8400 && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST
8401 && GET_CODE (XEXP (XEXP (XEXP (addr, 0), 1), 0)) == MINUS
8402 && XEXP (XEXP (XEXP (XEXP (addr, 0), 1), 0), 1) == pc_rtx)
8404 addr = XEXP (addr, 0);
8405 output_addr_const (file, XEXP (addr, 0));
8406 /* Group the args of the second CONST in parenthesis. */
8408 /* Skip past the second CONST--it does nothing for us. */
8409 output_addr_const (file, XEXP (XEXP (addr, 1), 0));
8410 /* Close the parenthesis. */
8415 output_addr_const (file, addr);
8419 /* Target hook for assembling integer objects. The sparc version has
8420 special handling for aligned DI-mode objects. */
8423 sparc_assemble_integer (rtx x, unsigned int size, int aligned_p)
8425 /* ??? We only output .xword's for symbols and only then in environments
8426 where the assembler can handle them. */
8427 if (aligned_p && size == 8
8428 && (GET_CODE (x) != CONST_INT && GET_CODE (x) != CONST_DOUBLE))
8432 assemble_integer_with_op ("\t.xword\t", x);
8437 assemble_aligned_integer (4, const0_rtx);
8438 assemble_aligned_integer (4, x);
8442 return default_assemble_integer (x, size, aligned_p);
8445 /* Return the value of a code used in the .proc pseudo-op that says
8446 what kind of result this function returns. For non-C types, we pick
8447 the closest C type. */
8449 #ifndef SHORT_TYPE_SIZE
8450 #define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
8453 #ifndef INT_TYPE_SIZE
8454 #define INT_TYPE_SIZE BITS_PER_WORD
8457 #ifndef LONG_TYPE_SIZE
8458 #define LONG_TYPE_SIZE BITS_PER_WORD
8461 #ifndef LONG_LONG_TYPE_SIZE
8462 #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
8465 #ifndef FLOAT_TYPE_SIZE
8466 #define FLOAT_TYPE_SIZE BITS_PER_WORD
8469 #ifndef DOUBLE_TYPE_SIZE
8470 #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
8473 #ifndef LONG_DOUBLE_TYPE_SIZE
8474 #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
8478 sparc_type_code (register tree type)
8480 register unsigned long qualifiers = 0;
8481 register unsigned shift;
8483 /* Only the first 30 bits of the qualifier are valid. We must refrain from
8484 setting more, since some assemblers will give an error for this. Also,
8485 we must be careful to avoid shifts of 32 bits or more to avoid getting
8486 unpredictable results. */
8488 for (shift = 6; shift < 30; shift += 2, type = TREE_TYPE (type))
8490 switch (TREE_CODE (type))
8496 qualifiers |= (3 << shift);
8501 qualifiers |= (2 << shift);
8505 case REFERENCE_TYPE:
8507 qualifiers |= (1 << shift);
8511 return (qualifiers | 8);
8514 case QUAL_UNION_TYPE:
8515 return (qualifiers | 9);
8518 return (qualifiers | 10);
8521 return (qualifiers | 16);
8524 /* If this is a range type, consider it to be the underlying
8526 if (TREE_TYPE (type) != 0)
8529 /* Carefully distinguish all the standard types of C,
8530 without messing up if the language is not C. We do this by
8531 testing TYPE_PRECISION and TYPE_UNSIGNED. The old code used to
8532 look at both the names and the above fields, but that's redundant.
8533 Any type whose size is between two C types will be considered
8534 to be the wider of the two types. Also, we do not have a
8535 special code to use for "long long", so anything wider than
8536 long is treated the same. Note that we can't distinguish
8537 between "int" and "long" in this code if they are the same
8538 size, but that's fine, since neither can the assembler. */
8540 if (TYPE_PRECISION (type) <= CHAR_TYPE_SIZE)
8541 return (qualifiers | (TYPE_UNSIGNED (type) ? 12 : 2));
8543 else if (TYPE_PRECISION (type) <= SHORT_TYPE_SIZE)
8544 return (qualifiers | (TYPE_UNSIGNED (type) ? 13 : 3));
8546 else if (TYPE_PRECISION (type) <= INT_TYPE_SIZE)
8547 return (qualifiers | (TYPE_UNSIGNED (type) ? 14 : 4));
8550 return (qualifiers | (TYPE_UNSIGNED (type) ? 15 : 5));
8553 /* If this is a range type, consider it to be the underlying
8555 if (TREE_TYPE (type) != 0)
8558 /* Carefully distinguish all the standard types of C,
8559 without messing up if the language is not C. */
8561 if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
8562 return (qualifiers | 6);
8565 return (qualifiers | 7);
8567 case COMPLEX_TYPE: /* GNU Fortran COMPLEX type. */
8568 /* ??? We need to distinguish between double and float complex types,
8569 but I don't know how yet because I can't reach this code from
8570 existing front-ends. */
8571 return (qualifiers | 7); /* Who knows? */
8574 case BOOLEAN_TYPE: /* Boolean truth value type. */
8580 gcc_unreachable (); /* Not a type! */
8587 /* Nested function support. */
8589 /* Emit RTL insns to initialize the variable parts of a trampoline.
8590 FNADDR is an RTX for the address of the function's pure code.
8591 CXT is an RTX for the static chain value for the function.
8593 This takes 16 insns: 2 shifts & 2 ands (to split up addresses), 4 sethi
8594 (to load in opcodes), 4 iors (to merge address and opcodes), and 4 writes
8595 (to store insns). This is a bit excessive. Perhaps a different
8596 mechanism would be better here.
8598 Emit enough FLUSH insns to synchronize the data and instruction caches. */
8601 sparc32_initialize_trampoline (rtx m_tramp, rtx fnaddr, rtx cxt)
8603 /* SPARC 32-bit trampoline:
8606 sethi %hi(static), %g2
8608 or %g2, %lo(static), %g2
8610 SETHI i,r = 00rr rrr1 00ii iiii iiii iiii iiii iiii
8611 JMPL r+i,d = 10dd ddd1 1100 0rrr rr1i iiii iiii iiii
8615 (adjust_address (m_tramp, SImode, 0),
8616 expand_binop (SImode, ior_optab,
8617 expand_shift (RSHIFT_EXPR, SImode, fnaddr, 10, 0, 1),
8618 GEN_INT (trunc_int_for_mode (0x03000000, SImode)),
8619 NULL_RTX, 1, OPTAB_DIRECT));
8622 (adjust_address (m_tramp, SImode, 4),
8623 expand_binop (SImode, ior_optab,
8624 expand_shift (RSHIFT_EXPR, SImode, cxt, 10, 0, 1),
8625 GEN_INT (trunc_int_for_mode (0x05000000, SImode)),
8626 NULL_RTX, 1, OPTAB_DIRECT));
8629 (adjust_address (m_tramp, SImode, 8),
8630 expand_binop (SImode, ior_optab,
8631 expand_and (SImode, fnaddr, GEN_INT (0x3ff), NULL_RTX),
8632 GEN_INT (trunc_int_for_mode (0x81c06000, SImode)),
8633 NULL_RTX, 1, OPTAB_DIRECT));
8636 (adjust_address (m_tramp, SImode, 12),
8637 expand_binop (SImode, ior_optab,
8638 expand_and (SImode, cxt, GEN_INT (0x3ff), NULL_RTX),
8639 GEN_INT (trunc_int_for_mode (0x8410a000, SImode)),
8640 NULL_RTX, 1, OPTAB_DIRECT));
8642 /* On UltraSPARC a flush flushes an entire cache line. The trampoline is
8643 aligned on a 16 byte boundary so one flush clears it all. */
8644 emit_insn (gen_flush (validize_mem (adjust_address (m_tramp, SImode, 0))));
8645 if (sparc_cpu != PROCESSOR_ULTRASPARC
8646 && sparc_cpu != PROCESSOR_ULTRASPARC3
8647 && sparc_cpu != PROCESSOR_NIAGARA
8648 && sparc_cpu != PROCESSOR_NIAGARA2
8649 && sparc_cpu != PROCESSOR_NIAGARA3
8650 && sparc_cpu != PROCESSOR_NIAGARA4)
8651 emit_insn (gen_flush (validize_mem (adjust_address (m_tramp, SImode, 8))));
8653 /* Call __enable_execute_stack after writing onto the stack to make sure
8654 the stack address is accessible. */
8655 #ifdef HAVE_ENABLE_EXECUTE_STACK
8656 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
8657 LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
8662 /* The 64-bit version is simpler because it makes more sense to load the
8663 values as "immediate" data out of the trampoline. It's also easier since
8664 we can read the PC without clobbering a register. */
8667 sparc64_initialize_trampoline (rtx m_tramp, rtx fnaddr, rtx cxt)
8669 /* SPARC 64-bit trampoline:
8678 emit_move_insn (adjust_address (m_tramp, SImode, 0),
8679 GEN_INT (trunc_int_for_mode (0x83414000, SImode)));
8680 emit_move_insn (adjust_address (m_tramp, SImode, 4),
8681 GEN_INT (trunc_int_for_mode (0xca586018, SImode)));
8682 emit_move_insn (adjust_address (m_tramp, SImode, 8),
8683 GEN_INT (trunc_int_for_mode (0x81c14000, SImode)));
8684 emit_move_insn (adjust_address (m_tramp, SImode, 12),
8685 GEN_INT (trunc_int_for_mode (0xca586010, SImode)));
8686 emit_move_insn (adjust_address (m_tramp, DImode, 16), cxt);
8687 emit_move_insn (adjust_address (m_tramp, DImode, 24), fnaddr);
8688 emit_insn (gen_flushdi (validize_mem (adjust_address (m_tramp, DImode, 0))));
8690 if (sparc_cpu != PROCESSOR_ULTRASPARC
8691 && sparc_cpu != PROCESSOR_ULTRASPARC3
8692 && sparc_cpu != PROCESSOR_NIAGARA
8693 && sparc_cpu != PROCESSOR_NIAGARA2
8694 && sparc_cpu != PROCESSOR_NIAGARA3
8695 && sparc_cpu != PROCESSOR_NIAGARA4)
8696 emit_insn (gen_flushdi (validize_mem (adjust_address (m_tramp, DImode, 8))));
8698 /* Call __enable_execute_stack after writing onto the stack to make sure
8699 the stack address is accessible. */
8700 #ifdef HAVE_ENABLE_EXECUTE_STACK
8701 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
8702 LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
8706 /* Worker for TARGET_TRAMPOLINE_INIT. */
8709 sparc_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
8711 rtx fnaddr = force_reg (Pmode, XEXP (DECL_RTL (fndecl), 0));
8712 cxt = force_reg (Pmode, cxt);
8714 sparc64_initialize_trampoline (m_tramp, fnaddr, cxt);
8716 sparc32_initialize_trampoline (m_tramp, fnaddr, cxt);
8719 /* Adjust the cost of a scheduling dependency. Return the new cost of
8720 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
8723 supersparc_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
8725 enum attr_type insn_type;
8727 if (! recog_memoized (insn))
8730 insn_type = get_attr_type (insn);
8732 if (REG_NOTE_KIND (link) == 0)
8734 /* Data dependency; DEP_INSN writes a register that INSN reads some
8737 /* if a load, then the dependence must be on the memory address;
8738 add an extra "cycle". Note that the cost could be two cycles
8739 if the reg was written late in an instruction group; we ca not tell
8741 if (insn_type == TYPE_LOAD || insn_type == TYPE_FPLOAD)
8744 /* Get the delay only if the address of the store is the dependence. */
8745 if (insn_type == TYPE_STORE || insn_type == TYPE_FPSTORE)
8747 rtx pat = PATTERN(insn);
8748 rtx dep_pat = PATTERN (dep_insn);
8750 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
8751 return cost; /* This should not happen! */
8753 /* The dependency between the two instructions was on the data that
8754 is being stored. Assume that this implies that the address of the
8755 store is not dependent. */
8756 if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
8759 return cost + 3; /* An approximation. */
8762 /* A shift instruction cannot receive its data from an instruction
8763 in the same cycle; add a one cycle penalty. */
8764 if (insn_type == TYPE_SHIFT)
8765 return cost + 3; /* Split before cascade into shift. */
8769 /* Anti- or output- dependency; DEP_INSN reads/writes a register that
8770 INSN writes some cycles later. */
8772 /* These are only significant for the fpu unit; writing a fp reg before
8773 the fpu has finished with it stalls the processor. */
8775 /* Reusing an integer register causes no problems. */
8776 if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
8784 hypersparc_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
8786 enum attr_type insn_type, dep_type;
8787 rtx pat = PATTERN(insn);
8788 rtx dep_pat = PATTERN (dep_insn);
8790 if (recog_memoized (insn) < 0 || recog_memoized (dep_insn) < 0)
8793 insn_type = get_attr_type (insn);
8794 dep_type = get_attr_type (dep_insn);
8796 switch (REG_NOTE_KIND (link))
8799 /* Data dependency; DEP_INSN writes a register that INSN reads some
8806 /* Get the delay iff the address of the store is the dependence. */
8807 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
8810 if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
8817 /* If a load, then the dependence must be on the memory address. If
8818 the addresses aren't equal, then it might be a false dependency */
8819 if (dep_type == TYPE_STORE || dep_type == TYPE_FPSTORE)
8821 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET
8822 || GET_CODE (SET_DEST (dep_pat)) != MEM
8823 || GET_CODE (SET_SRC (pat)) != MEM
8824 || ! rtx_equal_p (XEXP (SET_DEST (dep_pat), 0),
8825 XEXP (SET_SRC (pat), 0)))
8833 /* Compare to branch latency is 0. There is no benefit from
8834 separating compare and branch. */
8835 if (dep_type == TYPE_COMPARE)
8837 /* Floating point compare to branch latency is less than
8838 compare to conditional move. */
8839 if (dep_type == TYPE_FPCMP)
8848 /* Anti-dependencies only penalize the fpu unit. */
8849 if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
8861 sparc_adjust_cost(rtx insn, rtx link, rtx dep, int cost)
8865 case PROCESSOR_SUPERSPARC:
8866 cost = supersparc_adjust_cost (insn, link, dep, cost);
8868 case PROCESSOR_HYPERSPARC:
8869 case PROCESSOR_SPARCLITE86X:
8870 cost = hypersparc_adjust_cost (insn, link, dep, cost);
8879 sparc_sched_init (FILE *dump ATTRIBUTE_UNUSED,
8880 int sched_verbose ATTRIBUTE_UNUSED,
8881 int max_ready ATTRIBUTE_UNUSED)
8885 sparc_use_sched_lookahead (void)
8887 if (sparc_cpu == PROCESSOR_NIAGARA
8888 || sparc_cpu == PROCESSOR_NIAGARA2
8889 || sparc_cpu == PROCESSOR_NIAGARA3
8890 || sparc_cpu == PROCESSOR_NIAGARA4)
8892 if (sparc_cpu == PROCESSOR_ULTRASPARC
8893 || sparc_cpu == PROCESSOR_ULTRASPARC3)
8895 if ((1 << sparc_cpu) &
8896 ((1 << PROCESSOR_SUPERSPARC) | (1 << PROCESSOR_HYPERSPARC) |
8897 (1 << PROCESSOR_SPARCLITE86X)))
8903 sparc_issue_rate (void)
8907 case PROCESSOR_NIAGARA:
8908 case PROCESSOR_NIAGARA2:
8909 case PROCESSOR_NIAGARA3:
8910 case PROCESSOR_NIAGARA4:
8914 /* Assume V9 processors are capable of at least dual-issue. */
8916 case PROCESSOR_SUPERSPARC:
8918 case PROCESSOR_HYPERSPARC:
8919 case PROCESSOR_SPARCLITE86X:
8921 case PROCESSOR_ULTRASPARC:
8922 case PROCESSOR_ULTRASPARC3:
8928 set_extends (rtx insn)
8930 register rtx pat = PATTERN (insn);
8932 switch (GET_CODE (SET_SRC (pat)))
8934 /* Load and some shift instructions zero extend. */
8937 /* sethi clears the high bits */
8939 /* LO_SUM is used with sethi. sethi cleared the high
8940 bits and the values used with lo_sum are positive */
8942 /* Store flag stores 0 or 1 */
8952 rtx op0 = XEXP (SET_SRC (pat), 0);
8953 rtx op1 = XEXP (SET_SRC (pat), 1);
8954 if (GET_CODE (op1) == CONST_INT)
8955 return INTVAL (op1) >= 0;
8956 if (GET_CODE (op0) != REG)
8958 if (sparc_check_64 (op0, insn) == 1)
8960 return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
8965 rtx op0 = XEXP (SET_SRC (pat), 0);
8966 rtx op1 = XEXP (SET_SRC (pat), 1);
8967 if (GET_CODE (op0) != REG || sparc_check_64 (op0, insn) <= 0)
8969 if (GET_CODE (op1) == CONST_INT)
8970 return INTVAL (op1) >= 0;
8971 return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
8974 return GET_MODE (SET_SRC (pat)) == SImode;
8975 /* Positive integers leave the high bits zero. */
8977 return ! (CONST_DOUBLE_LOW (SET_SRC (pat)) & 0x80000000);
8979 return ! (INTVAL (SET_SRC (pat)) & 0x80000000);
8982 return - (GET_MODE (SET_SRC (pat)) == SImode);
8984 return sparc_check_64 (SET_SRC (pat), insn);
8990 /* We _ought_ to have only one kind per function, but... */
8991 static GTY(()) rtx sparc_addr_diff_list;
8992 static GTY(()) rtx sparc_addr_list;
8995 sparc_defer_case_vector (rtx lab, rtx vec, int diff)
8997 vec = gen_rtx_EXPR_LIST (VOIDmode, lab, vec);
8999 sparc_addr_diff_list
9000 = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_diff_list);
9002 sparc_addr_list = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_list);
9006 sparc_output_addr_vec (rtx vec)
9008 rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
9009 int idx, vlen = XVECLEN (body, 0);
9011 #ifdef ASM_OUTPUT_ADDR_VEC_START
9012 ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
9015 #ifdef ASM_OUTPUT_CASE_LABEL
9016 ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
9019 (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
9022 for (idx = 0; idx < vlen; idx++)
9024 ASM_OUTPUT_ADDR_VEC_ELT
9025 (asm_out_file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
9028 #ifdef ASM_OUTPUT_ADDR_VEC_END
9029 ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
9034 sparc_output_addr_diff_vec (rtx vec)
9036 rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
9037 rtx base = XEXP (XEXP (body, 0), 0);
9038 int idx, vlen = XVECLEN (body, 1);
9040 #ifdef ASM_OUTPUT_ADDR_VEC_START
9041 ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
9044 #ifdef ASM_OUTPUT_CASE_LABEL
9045 ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
9048 (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
9051 for (idx = 0; idx < vlen; idx++)
9053 ASM_OUTPUT_ADDR_DIFF_ELT
9056 CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
9057 CODE_LABEL_NUMBER (base));
9060 #ifdef ASM_OUTPUT_ADDR_VEC_END
9061 ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
9066 sparc_output_deferred_case_vectors (void)
9071 if (sparc_addr_list == NULL_RTX
9072 && sparc_addr_diff_list == NULL_RTX)
9075 /* Align to cache line in the function's code section. */
9076 switch_to_section (current_function_section ());
9078 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
9080 ASM_OUTPUT_ALIGN (asm_out_file, align);
9082 for (t = sparc_addr_list; t ; t = XEXP (t, 1))
9083 sparc_output_addr_vec (XEXP (t, 0));
9084 for (t = sparc_addr_diff_list; t ; t = XEXP (t, 1))
9085 sparc_output_addr_diff_vec (XEXP (t, 0));
9087 sparc_addr_list = sparc_addr_diff_list = NULL_RTX;
9090 /* Return 0 if the high 32 bits of X (the low word of X, if DImode) are
9091 unknown. Return 1 if the high bits are zero, -1 if the register is
9094 sparc_check_64 (rtx x, rtx insn)
9096 /* If a register is set only once it is safe to ignore insns this
9097 code does not know how to handle. The loop will either recognize
9098 the single set and return the correct value or fail to recognize
9103 gcc_assert (GET_CODE (x) == REG);
9105 if (GET_MODE (x) == DImode)
9106 y = gen_rtx_REG (SImode, REGNO (x) + WORDS_BIG_ENDIAN);
9108 if (flag_expensive_optimizations
9109 && df && DF_REG_DEF_COUNT (REGNO (y)) == 1)
9115 insn = get_last_insn_anywhere ();
9120 while ((insn = PREV_INSN (insn)))
9122 switch (GET_CODE (insn))
9135 rtx pat = PATTERN (insn);
9136 if (GET_CODE (pat) != SET)
9138 if (rtx_equal_p (x, SET_DEST (pat)))
9139 return set_extends (insn);
9140 if (y && rtx_equal_p (y, SET_DEST (pat)))
9141 return set_extends (insn);
9142 if (reg_overlap_mentioned_p (SET_DEST (pat), y))
9150 /* Output a wide shift instruction in V8+ mode. INSN is the instruction,
9151 OPERANDS are its operands and OPCODE is the mnemonic to be used. */
9154 output_v8plus_shift (rtx insn, rtx *operands, const char *opcode)
9156 static char asm_code[60];
9158 /* The scratch register is only required when the destination
9159 register is not a 64-bit global or out register. */
9160 if (which_alternative != 2)
9161 operands[3] = operands[0];
9163 /* We can only shift by constants <= 63. */
9164 if (GET_CODE (operands[2]) == CONST_INT)
9165 operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
9167 if (GET_CODE (operands[1]) == CONST_INT)
9169 output_asm_insn ("mov\t%1, %3", operands);
9173 output_asm_insn ("sllx\t%H1, 32, %3", operands);
9174 if (sparc_check_64 (operands[1], insn) <= 0)
9175 output_asm_insn ("srl\t%L1, 0, %L1", operands);
9176 output_asm_insn ("or\t%L1, %3, %3", operands);
9179 strcpy (asm_code, opcode);
9181 if (which_alternative != 2)
9182 return strcat (asm_code, "\t%0, %2, %L0\n\tsrlx\t%L0, 32, %H0");
9185 strcat (asm_code, "\t%3, %2, %3\n\tsrlx\t%3, 32, %H0\n\tmov\t%3, %L0");
9188 /* Output rtl to increment the profiler label LABELNO
9189 for profiling a function entry. */
9192 sparc_profile_hook (int labelno)
9197 fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_FUNCTION);
9198 if (NO_PROFILE_COUNTERS)
9200 emit_library_call (fun, LCT_NORMAL, VOIDmode, 0);
9204 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
9205 lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9206 emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lab, Pmode);
9210 #ifdef TARGET_SOLARIS
9211 /* Solaris implementation of TARGET_ASM_NAMED_SECTION. */
9214 sparc_solaris_elf_asm_named_section (const char *name, unsigned int flags,
9215 tree decl ATTRIBUTE_UNUSED)
9217 if (HAVE_COMDAT_GROUP && flags & SECTION_LINKONCE)
9219 solaris_elf_asm_comdat_section (name, flags, decl);
9223 fprintf (asm_out_file, "\t.section\t\"%s\"", name);
9225 if (!(flags & SECTION_DEBUG))
9226 fputs (",#alloc", asm_out_file);
9227 if (flags & SECTION_WRITE)
9228 fputs (",#write", asm_out_file);
9229 if (flags & SECTION_TLS)
9230 fputs (",#tls", asm_out_file);
9231 if (flags & SECTION_CODE)
9232 fputs (",#execinstr", asm_out_file);
9234 /* ??? Handle SECTION_BSS. */
9236 fputc ('\n', asm_out_file);
9238 #endif /* TARGET_SOLARIS */
9240 /* We do not allow indirect calls to be optimized into sibling calls.
9242 We cannot use sibling calls when delayed branches are disabled
9243 because they will likely require the call delay slot to be filled.
9245 Also, on SPARC 32-bit we cannot emit a sibling call when the
9246 current function returns a structure. This is because the "unimp
9247 after call" convention would cause the callee to return to the
9248 wrong place. The generic code already disallows cases where the
9249 function being called returns a structure.
9251 It may seem strange how this last case could occur. Usually there
9252 is code after the call which jumps to epilogue code which dumps the
9253 return value into the struct return area. That ought to invalidate
9254 the sibling call right? Well, in the C++ case we can end up passing
9255 the pointer to the struct return area to a constructor (which returns
9256 void) and then nothing else happens. Such a sibling call would look
9257 valid without the added check here.
9259 VxWorks PIC PLT entries require the global pointer to be initialized
9260 on entry. We therefore can't emit sibling calls to them. */
9262 sparc_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
9265 && flag_delayed_branch
9266 && (TARGET_ARCH64 || ! cfun->returns_struct)
9267 && !(TARGET_VXWORKS_RTP
9269 && !targetm.binds_local_p (decl)));
9272 /* libfunc renaming. */
9275 sparc_init_libfuncs (void)
9279 /* Use the subroutines that Sun's library provides for integer
9280 multiply and divide. The `*' prevents an underscore from
9281 being prepended by the compiler. .umul is a little faster
9283 set_optab_libfunc (smul_optab, SImode, "*.umul");
9284 set_optab_libfunc (sdiv_optab, SImode, "*.div");
9285 set_optab_libfunc (udiv_optab, SImode, "*.udiv");
9286 set_optab_libfunc (smod_optab, SImode, "*.rem");
9287 set_optab_libfunc (umod_optab, SImode, "*.urem");
9289 /* TFmode arithmetic. These names are part of the SPARC 32bit ABI. */
9290 set_optab_libfunc (add_optab, TFmode, "_Q_add");
9291 set_optab_libfunc (sub_optab, TFmode, "_Q_sub");
9292 set_optab_libfunc (neg_optab, TFmode, "_Q_neg");
9293 set_optab_libfunc (smul_optab, TFmode, "_Q_mul");
9294 set_optab_libfunc (sdiv_optab, TFmode, "_Q_div");
9296 /* We can define the TFmode sqrt optab only if TARGET_FPU. This
9297 is because with soft-float, the SFmode and DFmode sqrt
9298 instructions will be absent, and the compiler will notice and
9299 try to use the TFmode sqrt instruction for calls to the
9300 builtin function sqrt, but this fails. */
9302 set_optab_libfunc (sqrt_optab, TFmode, "_Q_sqrt");
9304 set_optab_libfunc (eq_optab, TFmode, "_Q_feq");
9305 set_optab_libfunc (ne_optab, TFmode, "_Q_fne");
9306 set_optab_libfunc (gt_optab, TFmode, "_Q_fgt");
9307 set_optab_libfunc (ge_optab, TFmode, "_Q_fge");
9308 set_optab_libfunc (lt_optab, TFmode, "_Q_flt");
9309 set_optab_libfunc (le_optab, TFmode, "_Q_fle");
9311 set_conv_libfunc (sext_optab, TFmode, SFmode, "_Q_stoq");
9312 set_conv_libfunc (sext_optab, TFmode, DFmode, "_Q_dtoq");
9313 set_conv_libfunc (trunc_optab, SFmode, TFmode, "_Q_qtos");
9314 set_conv_libfunc (trunc_optab, DFmode, TFmode, "_Q_qtod");
9316 set_conv_libfunc (sfix_optab, SImode, TFmode, "_Q_qtoi");
9317 set_conv_libfunc (ufix_optab, SImode, TFmode, "_Q_qtou");
9318 set_conv_libfunc (sfloat_optab, TFmode, SImode, "_Q_itoq");
9319 set_conv_libfunc (ufloat_optab, TFmode, SImode, "_Q_utoq");
9321 if (DITF_CONVERSION_LIBFUNCS)
9323 set_conv_libfunc (sfix_optab, DImode, TFmode, "_Q_qtoll");
9324 set_conv_libfunc (ufix_optab, DImode, TFmode, "_Q_qtoull");
9325 set_conv_libfunc (sfloat_optab, TFmode, DImode, "_Q_lltoq");
9326 set_conv_libfunc (ufloat_optab, TFmode, DImode, "_Q_ulltoq");
9329 if (SUN_CONVERSION_LIBFUNCS)
9331 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftoll");
9332 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoull");
9333 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtoll");
9334 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoull");
9339 /* In the SPARC 64bit ABI, SImode multiply and divide functions
9340 do not exist in the library. Make sure the compiler does not
9341 emit calls to them by accident. (It should always use the
9342 hardware instructions.) */
9343 set_optab_libfunc (smul_optab, SImode, 0);
9344 set_optab_libfunc (sdiv_optab, SImode, 0);
9345 set_optab_libfunc (udiv_optab, SImode, 0);
9346 set_optab_libfunc (smod_optab, SImode, 0);
9347 set_optab_libfunc (umod_optab, SImode, 0);
9349 if (SUN_INTEGER_MULTIPLY_64)
9351 set_optab_libfunc (smul_optab, DImode, "__mul64");
9352 set_optab_libfunc (sdiv_optab, DImode, "__div64");
9353 set_optab_libfunc (udiv_optab, DImode, "__udiv64");
9354 set_optab_libfunc (smod_optab, DImode, "__rem64");
9355 set_optab_libfunc (umod_optab, DImode, "__urem64");
9358 if (SUN_CONVERSION_LIBFUNCS)
9360 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftol");
9361 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoul");
9362 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtol");
9363 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoul");
9368 static tree def_builtin(const char *name, int code, tree type)
9370 return add_builtin_function(name, type, code, BUILT_IN_MD, NULL,
9374 static tree def_builtin_const(const char *name, int code, tree type)
9376 tree t = def_builtin(name, code, type);
9379 TREE_READONLY (t) = 1;
9384 /* Implement the TARGET_INIT_BUILTINS target hook.
9385 Create builtin functions for special SPARC instructions. */
9388 sparc_init_builtins (void)
9391 sparc_vis_init_builtins ();
9394 /* Create builtin functions for VIS 1.0 instructions. */
9397 sparc_vis_init_builtins (void)
9399 tree v4qi = build_vector_type (unsigned_intQI_type_node, 4);
9400 tree v8qi = build_vector_type (unsigned_intQI_type_node, 8);
9401 tree v4hi = build_vector_type (intHI_type_node, 4);
9402 tree v2hi = build_vector_type (intHI_type_node, 2);
9403 tree v2si = build_vector_type (intSI_type_node, 2);
9404 tree v1si = build_vector_type (intSI_type_node, 1);
9406 tree v4qi_ftype_v4hi = build_function_type_list (v4qi, v4hi, 0);
9407 tree v8qi_ftype_v2si_v8qi = build_function_type_list (v8qi, v2si, v8qi, 0);
9408 tree v2hi_ftype_v2si = build_function_type_list (v2hi, v2si, 0);
9409 tree v4hi_ftype_v4qi = build_function_type_list (v4hi, v4qi, 0);
9410 tree v8qi_ftype_v4qi_v4qi = build_function_type_list (v8qi, v4qi, v4qi, 0);
9411 tree v4hi_ftype_v4qi_v4hi = build_function_type_list (v4hi, v4qi, v4hi, 0);
9412 tree v4hi_ftype_v4qi_v2hi = build_function_type_list (v4hi, v4qi, v2hi, 0);
9413 tree v2si_ftype_v4qi_v2hi = build_function_type_list (v2si, v4qi, v2hi, 0);
9414 tree v4hi_ftype_v8qi_v4hi = build_function_type_list (v4hi, v8qi, v4hi, 0);
9415 tree v4hi_ftype_v4hi_v4hi = build_function_type_list (v4hi, v4hi, v4hi, 0);
9416 tree v2si_ftype_v2si_v2si = build_function_type_list (v2si, v2si, v2si, 0);
9417 tree v8qi_ftype_v8qi_v8qi = build_function_type_list (v8qi, v8qi, v8qi, 0);
9418 tree v2hi_ftype_v2hi_v2hi = build_function_type_list (v2hi, v2hi, v2hi, 0);
9419 tree v1si_ftype_v1si_v1si = build_function_type_list (v1si, v1si, v1si, 0);
9420 tree di_ftype_v8qi_v8qi_di = build_function_type_list (intDI_type_node,
9422 intDI_type_node, 0);
9423 tree di_ftype_v8qi_v8qi = build_function_type_list (intDI_type_node,
9425 tree si_ftype_v8qi_v8qi = build_function_type_list (intSI_type_node,
9427 tree di_ftype_di_di = build_function_type_list (intDI_type_node,
9429 intDI_type_node, 0);
9430 tree si_ftype_si_si = build_function_type_list (intSI_type_node,
9432 intSI_type_node, 0);
9433 tree ptr_ftype_ptr_si = build_function_type_list (ptr_type_node,
9435 intSI_type_node, 0);
9436 tree ptr_ftype_ptr_di = build_function_type_list (ptr_type_node,
9438 intDI_type_node, 0);
9439 tree si_ftype_ptr_ptr = build_function_type_list (intSI_type_node,
9442 tree di_ftype_ptr_ptr = build_function_type_list (intDI_type_node,
9445 tree si_ftype_v4hi_v4hi = build_function_type_list (intSI_type_node,
9447 tree si_ftype_v2si_v2si = build_function_type_list (intSI_type_node,
9449 tree di_ftype_v4hi_v4hi = build_function_type_list (intDI_type_node,
9451 tree di_ftype_v2si_v2si = build_function_type_list (intDI_type_node,
9453 tree void_ftype_di = build_function_type_list (void_type_node,
9454 intDI_type_node, 0);
9455 tree di_ftype_void = build_function_type_list (intDI_type_node,
9457 tree void_ftype_si = build_function_type_list (void_type_node,
9458 intSI_type_node, 0);
9459 tree sf_ftype_sf_sf = build_function_type_list (float_type_node,
9461 float_type_node, 0);
9462 tree df_ftype_df_df = build_function_type_list (double_type_node,
9464 double_type_node, 0);
9466 /* Packing and expanding vectors. */
9467 def_builtin ("__builtin_vis_fpack16", CODE_FOR_fpack16_vis,
9469 def_builtin ("__builtin_vis_fpack32", CODE_FOR_fpack32_vis,
9470 v8qi_ftype_v2si_v8qi);
9471 def_builtin ("__builtin_vis_fpackfix", CODE_FOR_fpackfix_vis,
9473 def_builtin_const ("__builtin_vis_fexpand", CODE_FOR_fexpand_vis,
9475 def_builtin_const ("__builtin_vis_fpmerge", CODE_FOR_fpmerge_vis,
9476 v8qi_ftype_v4qi_v4qi);
9478 /* Multiplications. */
9479 def_builtin_const ("__builtin_vis_fmul8x16", CODE_FOR_fmul8x16_vis,
9480 v4hi_ftype_v4qi_v4hi);
9481 def_builtin_const ("__builtin_vis_fmul8x16au", CODE_FOR_fmul8x16au_vis,
9482 v4hi_ftype_v4qi_v2hi);
9483 def_builtin_const ("__builtin_vis_fmul8x16al", CODE_FOR_fmul8x16al_vis,
9484 v4hi_ftype_v4qi_v2hi);
9485 def_builtin_const ("__builtin_vis_fmul8sux16", CODE_FOR_fmul8sux16_vis,
9486 v4hi_ftype_v8qi_v4hi);
9487 def_builtin_const ("__builtin_vis_fmul8ulx16", CODE_FOR_fmul8ulx16_vis,
9488 v4hi_ftype_v8qi_v4hi);
9489 def_builtin_const ("__builtin_vis_fmuld8sux16", CODE_FOR_fmuld8sux16_vis,
9490 v2si_ftype_v4qi_v2hi);
9491 def_builtin_const ("__builtin_vis_fmuld8ulx16", CODE_FOR_fmuld8ulx16_vis,
9492 v2si_ftype_v4qi_v2hi);
9494 /* Data aligning. */
9495 def_builtin ("__builtin_vis_faligndatav4hi", CODE_FOR_faligndatav4hi_vis,
9496 v4hi_ftype_v4hi_v4hi);
9497 def_builtin ("__builtin_vis_faligndatav8qi", CODE_FOR_faligndatav8qi_vis,
9498 v8qi_ftype_v8qi_v8qi);
9499 def_builtin ("__builtin_vis_faligndatav2si", CODE_FOR_faligndatav2si_vis,
9500 v2si_ftype_v2si_v2si);
9501 def_builtin ("__builtin_vis_faligndatadi", CODE_FOR_faligndatav1di_vis,
9504 def_builtin ("__builtin_vis_write_gsr", CODE_FOR_wrgsr_vis,
9506 def_builtin ("__builtin_vis_read_gsr", CODE_FOR_rdgsr_vis,
9511 def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrdi_vis,
9513 def_builtin ("__builtin_vis_alignaddrl", CODE_FOR_alignaddrldi_vis,
9518 def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrsi_vis,
9520 def_builtin ("__builtin_vis_alignaddrl", CODE_FOR_alignaddrlsi_vis,
9524 /* Pixel distance. */
9525 def_builtin_const ("__builtin_vis_pdist", CODE_FOR_pdist_vis,
9526 di_ftype_v8qi_v8qi_di);
9528 /* Edge handling. */
9531 def_builtin_const ("__builtin_vis_edge8", CODE_FOR_edge8di_vis,
9533 def_builtin_const ("__builtin_vis_edge8l", CODE_FOR_edge8ldi_vis,
9535 def_builtin_const ("__builtin_vis_edge16", CODE_FOR_edge16di_vis,
9537 def_builtin_const ("__builtin_vis_edge16l", CODE_FOR_edge16ldi_vis,
9539 def_builtin_const ("__builtin_vis_edge32", CODE_FOR_edge32di_vis,
9541 def_builtin_const ("__builtin_vis_edge32l", CODE_FOR_edge32ldi_vis,
9545 def_builtin_const ("__builtin_vis_edge8n", CODE_FOR_edge8ndi_vis,
9547 def_builtin_const ("__builtin_vis_edge8ln", CODE_FOR_edge8lndi_vis,
9549 def_builtin_const ("__builtin_vis_edge16n", CODE_FOR_edge16ndi_vis,
9551 def_builtin_const ("__builtin_vis_edge16ln", CODE_FOR_edge16lndi_vis,
9553 def_builtin_const ("__builtin_vis_edge32n", CODE_FOR_edge32ndi_vis,
9555 def_builtin_const ("__builtin_vis_edge32ln", CODE_FOR_edge32lndi_vis,
9561 def_builtin_const ("__builtin_vis_edge8", CODE_FOR_edge8si_vis,
9563 def_builtin_const ("__builtin_vis_edge8l", CODE_FOR_edge8lsi_vis,
9565 def_builtin_const ("__builtin_vis_edge16", CODE_FOR_edge16si_vis,
9567 def_builtin_const ("__builtin_vis_edge16l", CODE_FOR_edge16lsi_vis,
9569 def_builtin_const ("__builtin_vis_edge32", CODE_FOR_edge32si_vis,
9571 def_builtin_const ("__builtin_vis_edge32l", CODE_FOR_edge32lsi_vis,
9575 def_builtin_const ("__builtin_vis_edge8n", CODE_FOR_edge8nsi_vis,
9577 def_builtin_const ("__builtin_vis_edge8ln", CODE_FOR_edge8lnsi_vis,
9579 def_builtin_const ("__builtin_vis_edge16n", CODE_FOR_edge16nsi_vis,
9581 def_builtin_const ("__builtin_vis_edge16ln", CODE_FOR_edge16lnsi_vis,
9583 def_builtin_const ("__builtin_vis_edge32n", CODE_FOR_edge32nsi_vis,
9585 def_builtin_const ("__builtin_vis_edge32ln", CODE_FOR_edge32lnsi_vis,
9590 /* Pixel compare. */
9593 def_builtin_const ("__builtin_vis_fcmple16", CODE_FOR_fcmple16di_vis,
9594 di_ftype_v4hi_v4hi);
9595 def_builtin_const ("__builtin_vis_fcmple32", CODE_FOR_fcmple32di_vis,
9596 di_ftype_v2si_v2si);
9597 def_builtin_const ("__builtin_vis_fcmpne16", CODE_FOR_fcmpne16di_vis,
9598 di_ftype_v4hi_v4hi);
9599 def_builtin_const ("__builtin_vis_fcmpne32", CODE_FOR_fcmpne32di_vis,
9600 di_ftype_v2si_v2si);
9601 def_builtin_const ("__builtin_vis_fcmpgt16", CODE_FOR_fcmpgt16di_vis,
9602 di_ftype_v4hi_v4hi);
9603 def_builtin_const ("__builtin_vis_fcmpgt32", CODE_FOR_fcmpgt32di_vis,
9604 di_ftype_v2si_v2si);
9605 def_builtin_const ("__builtin_vis_fcmpeq16", CODE_FOR_fcmpeq16di_vis,
9606 di_ftype_v4hi_v4hi);
9607 def_builtin_const ("__builtin_vis_fcmpeq32", CODE_FOR_fcmpeq32di_vis,
9608 di_ftype_v2si_v2si);
9612 def_builtin_const ("__builtin_vis_fcmple16", CODE_FOR_fcmple16si_vis,
9613 si_ftype_v4hi_v4hi);
9614 def_builtin_const ("__builtin_vis_fcmple32", CODE_FOR_fcmple32si_vis,
9615 si_ftype_v2si_v2si);
9616 def_builtin_const ("__builtin_vis_fcmpne16", CODE_FOR_fcmpne16si_vis,
9617 si_ftype_v4hi_v4hi);
9618 def_builtin_const ("__builtin_vis_fcmpne32", CODE_FOR_fcmpne32si_vis,
9619 si_ftype_v2si_v2si);
9620 def_builtin_const ("__builtin_vis_fcmpgt16", CODE_FOR_fcmpgt16si_vis,
9621 si_ftype_v4hi_v4hi);
9622 def_builtin_const ("__builtin_vis_fcmpgt32", CODE_FOR_fcmpgt32si_vis,
9623 si_ftype_v2si_v2si);
9624 def_builtin_const ("__builtin_vis_fcmpeq16", CODE_FOR_fcmpeq16si_vis,
9625 si_ftype_v4hi_v4hi);
9626 def_builtin_const ("__builtin_vis_fcmpeq32", CODE_FOR_fcmpeq32si_vis,
9627 si_ftype_v2si_v2si);
9630 /* Addition and subtraction. */
9631 def_builtin_const ("__builtin_vis_fpadd16", CODE_FOR_addv4hi3,
9632 v4hi_ftype_v4hi_v4hi);
9633 def_builtin_const ("__builtin_vis_fpadd16s", CODE_FOR_addv2hi3,
9634 v2hi_ftype_v2hi_v2hi);
9635 def_builtin_const ("__builtin_vis_fpadd32", CODE_FOR_addv2si3,
9636 v2si_ftype_v2si_v2si);
9637 def_builtin_const ("__builtin_vis_fpadd32s", CODE_FOR_addv1si3,
9638 v1si_ftype_v1si_v1si);
9639 def_builtin_const ("__builtin_vis_fpsub16", CODE_FOR_subv4hi3,
9640 v4hi_ftype_v4hi_v4hi);
9641 def_builtin_const ("__builtin_vis_fpsub16s", CODE_FOR_subv2hi3,
9642 v2hi_ftype_v2hi_v2hi);
9643 def_builtin_const ("__builtin_vis_fpsub32", CODE_FOR_subv2si3,
9644 v2si_ftype_v2si_v2si);
9645 def_builtin_const ("__builtin_vis_fpsub32s", CODE_FOR_subv1si3,
9646 v1si_ftype_v1si_v1si);
9648 /* Three-dimensional array addressing. */
9651 def_builtin_const ("__builtin_vis_array8", CODE_FOR_array8di_vis,
9653 def_builtin_const ("__builtin_vis_array16", CODE_FOR_array16di_vis,
9655 def_builtin_const ("__builtin_vis_array32", CODE_FOR_array32di_vis,
9660 def_builtin_const ("__builtin_vis_array8", CODE_FOR_array8si_vis,
9662 def_builtin_const ("__builtin_vis_array16", CODE_FOR_array16si_vis,
9664 def_builtin_const ("__builtin_vis_array32", CODE_FOR_array32si_vis,
9670 /* Byte mask and shuffle */
9672 def_builtin ("__builtin_vis_bmask", CODE_FOR_bmaskdi_vis,
9675 def_builtin ("__builtin_vis_bmask", CODE_FOR_bmasksi_vis,
9677 def_builtin ("__builtin_vis_bshufflev4hi", CODE_FOR_bshufflev4hi_vis,
9678 v4hi_ftype_v4hi_v4hi);
9679 def_builtin ("__builtin_vis_bshufflev8qi", CODE_FOR_bshufflev8qi_vis,
9680 v8qi_ftype_v8qi_v8qi);
9681 def_builtin ("__builtin_vis_bshufflev2si", CODE_FOR_bshufflev2si_vis,
9682 v2si_ftype_v2si_v2si);
9683 def_builtin ("__builtin_vis_bshuffledi", CODE_FOR_bshufflev1di_vis,
9691 def_builtin ("__builtin_vis_cmask8", CODE_FOR_cmask8di_vis,
9693 def_builtin ("__builtin_vis_cmask16", CODE_FOR_cmask16di_vis,
9695 def_builtin ("__builtin_vis_cmask32", CODE_FOR_cmask32di_vis,
9700 def_builtin ("__builtin_vis_cmask8", CODE_FOR_cmask8si_vis,
9702 def_builtin ("__builtin_vis_cmask16", CODE_FOR_cmask16si_vis,
9704 def_builtin ("__builtin_vis_cmask32", CODE_FOR_cmask32si_vis,
9708 def_builtin_const ("__builtin_vis_fchksm16", CODE_FOR_fchksm16_vis,
9709 v4hi_ftype_v4hi_v4hi);
9711 def_builtin_const ("__builtin_vis_fsll16", CODE_FOR_vashlv4hi3,
9712 v4hi_ftype_v4hi_v4hi);
9713 def_builtin_const ("__builtin_vis_fslas16", CODE_FOR_vssashlv4hi3,
9714 v4hi_ftype_v4hi_v4hi);
9715 def_builtin_const ("__builtin_vis_fsrl16", CODE_FOR_vlshrv4hi3,
9716 v4hi_ftype_v4hi_v4hi);
9717 def_builtin_const ("__builtin_vis_fsra16", CODE_FOR_vashrv4hi3,
9718 v4hi_ftype_v4hi_v4hi);
9719 def_builtin_const ("__builtin_vis_fsll32", CODE_FOR_vashlv2si3,
9720 v2si_ftype_v2si_v2si);
9721 def_builtin_const ("__builtin_vis_fslas32", CODE_FOR_vssashlv2si3,
9722 v2si_ftype_v2si_v2si);
9723 def_builtin_const ("__builtin_vis_fsrl32", CODE_FOR_vlshrv2si3,
9724 v2si_ftype_v2si_v2si);
9725 def_builtin_const ("__builtin_vis_fsra32", CODE_FOR_vashrv2si3,
9726 v2si_ftype_v2si_v2si);
9729 def_builtin_const ("__builtin_vis_pdistn", CODE_FOR_pdistndi_vis,
9730 di_ftype_v8qi_v8qi);
9732 def_builtin_const ("__builtin_vis_pdistn", CODE_FOR_pdistnsi_vis,
9733 si_ftype_v8qi_v8qi);
9735 def_builtin_const ("__builtin_vis_fmean16", CODE_FOR_fmean16_vis,
9736 v4hi_ftype_v4hi_v4hi);
9737 def_builtin_const ("__builtin_vis_fpadd64", CODE_FOR_fpadd64_vis,
9739 def_builtin_const ("__builtin_vis_fpsub64", CODE_FOR_fpsub64_vis,
9742 def_builtin_const ("__builtin_vis_fpadds16", CODE_FOR_ssaddv4hi3,
9743 v4hi_ftype_v4hi_v4hi);
9744 def_builtin_const ("__builtin_vis_fpadds16s", CODE_FOR_ssaddv2hi3,
9745 v2hi_ftype_v2hi_v2hi);
9746 def_builtin_const ("__builtin_vis_fpsubs16", CODE_FOR_sssubv4hi3,
9747 v4hi_ftype_v4hi_v4hi);
9748 def_builtin_const ("__builtin_vis_fpsubs16s", CODE_FOR_sssubv2hi3,
9749 v2hi_ftype_v2hi_v2hi);
9750 def_builtin_const ("__builtin_vis_fpadds32", CODE_FOR_ssaddv2si3,
9751 v2si_ftype_v2si_v2si);
9752 def_builtin_const ("__builtin_vis_fpadds32s", CODE_FOR_ssaddv1si3,
9753 v1si_ftype_v1si_v1si);
9754 def_builtin_const ("__builtin_vis_fpsubs32", CODE_FOR_sssubv2si3,
9755 v2si_ftype_v2si_v2si);
9756 def_builtin_const ("__builtin_vis_fpsubs32s", CODE_FOR_sssubv1si3,
9757 v1si_ftype_v1si_v1si);
9761 def_builtin_const ("__builtin_vis_fucmple8", CODE_FOR_fucmple8di_vis,
9762 di_ftype_v8qi_v8qi);
9763 def_builtin_const ("__builtin_vis_fucmpne8", CODE_FOR_fucmpne8di_vis,
9764 di_ftype_v8qi_v8qi);
9765 def_builtin_const ("__builtin_vis_fucmpgt8", CODE_FOR_fucmpgt8di_vis,
9766 di_ftype_v8qi_v8qi);
9767 def_builtin_const ("__builtin_vis_fucmpeq8", CODE_FOR_fucmpeq8di_vis,
9768 di_ftype_v8qi_v8qi);
9772 def_builtin_const ("__builtin_vis_fucmple8", CODE_FOR_fucmple8si_vis,
9773 si_ftype_v8qi_v8qi);
9774 def_builtin_const ("__builtin_vis_fucmpne8", CODE_FOR_fucmpne8si_vis,
9775 si_ftype_v8qi_v8qi);
9776 def_builtin_const ("__builtin_vis_fucmpgt8", CODE_FOR_fucmpgt8si_vis,
9777 si_ftype_v8qi_v8qi);
9778 def_builtin_const ("__builtin_vis_fucmpeq8", CODE_FOR_fucmpeq8si_vis,
9779 si_ftype_v8qi_v8qi);
9782 def_builtin_const ("__builtin_vis_fhadds", CODE_FOR_fhaddsf_vis,
9784 def_builtin_const ("__builtin_vis_fhaddd", CODE_FOR_fhadddf_vis,
9786 def_builtin_const ("__builtin_vis_fhsubs", CODE_FOR_fhsubsf_vis,
9788 def_builtin_const ("__builtin_vis_fhsubd", CODE_FOR_fhsubdf_vis,
9790 def_builtin_const ("__builtin_vis_fnhadds", CODE_FOR_fnhaddsf_vis,
9792 def_builtin_const ("__builtin_vis_fnhaddd", CODE_FOR_fnhadddf_vis,
9795 def_builtin_const ("__builtin_vis_umulxhi", CODE_FOR_umulxhi_vis,
9797 def_builtin_const ("__builtin_vis_xmulx", CODE_FOR_xmulx_vis,
9799 def_builtin_const ("__builtin_vis_xmulxhi", CODE_FOR_xmulxhi_vis,
9804 /* Handle TARGET_EXPAND_BUILTIN target hook.
9805 Expand builtin functions for sparc intrinsics. */
9808 sparc_expand_builtin (tree exp, rtx target,
9809 rtx subtarget ATTRIBUTE_UNUSED,
9810 enum machine_mode tmode ATTRIBUTE_UNUSED,
9811 int ignore ATTRIBUTE_UNUSED)
9814 call_expr_arg_iterator iter;
9815 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
9816 unsigned int icode = DECL_FUNCTION_CODE (fndecl);
9821 nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
9825 enum machine_mode tmode = insn_data[icode].operand[0].mode;
9827 || GET_MODE (target) != tmode
9828 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
9829 op[0] = gen_reg_rtx (tmode);
9833 FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
9835 const struct insn_operand_data *insn_op;
9838 if (arg == error_mark_node)
9842 idx = arg_count - !nonvoid;
9843 insn_op = &insn_data[icode].operand[idx];
9844 op[arg_count] = expand_normal (arg);
9846 if (insn_op->mode == V1DImode
9847 && GET_MODE (op[arg_count]) == DImode)
9848 op[arg_count] = gen_lowpart (V1DImode, op[arg_count]);
9849 else if (insn_op->mode == V1SImode
9850 && GET_MODE (op[arg_count]) == SImode)
9851 op[arg_count] = gen_lowpart (V1SImode, op[arg_count]);
9853 if (! (*insn_data[icode].operand[idx].predicate) (op[arg_count],
9855 op[arg_count] = copy_to_mode_reg (insn_op->mode, op[arg_count]);
9861 pat = GEN_FCN (icode) (op[0]);
9865 pat = GEN_FCN (icode) (op[0], op[1]);
9867 pat = GEN_FCN (icode) (op[1]);
9870 pat = GEN_FCN (icode) (op[0], op[1], op[2]);
9873 pat = GEN_FCN (icode) (op[0], op[1], op[2], op[3]);
9891 sparc_vis_mul8x16 (int e8, int e16)
9893 return (e8 * e16 + 128) / 256;
9896 /* Multiply the vector elements in ELTS0 to the elements in ELTS1 as specified
9897 by FNCODE. All of the elements in ELTS0 and ELTS1 lists must be integer
9898 constants. A tree list with the results of the multiplications is returned,
9899 and each element in the list is of INNER_TYPE. */
9902 sparc_handle_vis_mul8x16 (int fncode, tree inner_type, tree elts0, tree elts1)
9904 tree n_elts = NULL_TREE;
9909 case CODE_FOR_fmul8x16_vis:
9910 for (; elts0 && elts1;
9911 elts0 = TREE_CHAIN (elts0), elts1 = TREE_CHAIN (elts1))
9914 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (TREE_VALUE (elts0)),
9915 TREE_INT_CST_LOW (TREE_VALUE (elts1)));
9916 n_elts = tree_cons (NULL_TREE,
9917 build_int_cst (inner_type, val),
9922 case CODE_FOR_fmul8x16au_vis:
9923 scale = TREE_INT_CST_LOW (TREE_VALUE (elts1));
9925 for (; elts0; elts0 = TREE_CHAIN (elts0))
9928 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (TREE_VALUE (elts0)),
9930 n_elts = tree_cons (NULL_TREE,
9931 build_int_cst (inner_type, val),
9936 case CODE_FOR_fmul8x16al_vis:
9937 scale = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (elts1)));
9939 for (; elts0; elts0 = TREE_CHAIN (elts0))
9942 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (TREE_VALUE (elts0)),
9944 n_elts = tree_cons (NULL_TREE,
9945 build_int_cst (inner_type, val),
9954 return nreverse (n_elts);
9957 /* Handle TARGET_FOLD_BUILTIN target hook.
9958 Fold builtin functions for SPARC intrinsics. If IGNORE is true the
9959 result of the function call is ignored. NULL_TREE is returned if the
9960 function could not be folded. */
9963 sparc_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
9964 tree *args, bool ignore)
9966 tree arg0, arg1, arg2;
9967 tree rtype = TREE_TYPE (TREE_TYPE (fndecl));
9968 enum insn_code icode = (enum insn_code) DECL_FUNCTION_CODE (fndecl);
9972 /* Note that a switch statement instead of the sequence of tests would
9973 be incorrect as many of the CODE_FOR values could be CODE_FOR_nothing
9974 and that would yield multiple alternatives with identical values. */
9975 if (icode == CODE_FOR_alignaddrsi_vis
9976 || icode == CODE_FOR_alignaddrdi_vis
9977 || icode == CODE_FOR_wrgsr_vis
9978 || icode == CODE_FOR_bmasksi_vis
9979 || icode == CODE_FOR_bmaskdi_vis
9980 || icode == CODE_FOR_cmask8si_vis
9981 || icode == CODE_FOR_cmask8di_vis
9982 || icode == CODE_FOR_cmask16si_vis
9983 || icode == CODE_FOR_cmask16di_vis
9984 || icode == CODE_FOR_cmask32si_vis
9985 || icode == CODE_FOR_cmask32di_vis)
9988 return build_zero_cst (rtype);
9993 case CODE_FOR_fexpand_vis:
9997 if (TREE_CODE (arg0) == VECTOR_CST)
9999 tree inner_type = TREE_TYPE (rtype);
10000 tree elts = TREE_VECTOR_CST_ELTS (arg0);
10001 tree n_elts = NULL_TREE;
10003 for (; elts; elts = TREE_CHAIN (elts))
10005 unsigned int val = TREE_INT_CST_LOW (TREE_VALUE (elts)) << 4;
10006 n_elts = tree_cons (NULL_TREE,
10007 build_int_cst (inner_type, val),
10010 return build_vector (rtype, nreverse (n_elts));
10014 case CODE_FOR_fmul8x16_vis:
10015 case CODE_FOR_fmul8x16au_vis:
10016 case CODE_FOR_fmul8x16al_vis:
10022 if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
10024 tree inner_type = TREE_TYPE (rtype);
10025 tree elts0 = TREE_VECTOR_CST_ELTS (arg0);
10026 tree elts1 = TREE_VECTOR_CST_ELTS (arg1);
10027 tree n_elts = sparc_handle_vis_mul8x16 (icode, inner_type, elts0,
10030 return build_vector (rtype, n_elts);
10034 case CODE_FOR_fpmerge_vis:
10040 if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
10042 tree elts0 = TREE_VECTOR_CST_ELTS (arg0);
10043 tree elts1 = TREE_VECTOR_CST_ELTS (arg1);
10044 tree n_elts = NULL_TREE;
10046 for (; elts0 && elts1;
10047 elts0 = TREE_CHAIN (elts0), elts1 = TREE_CHAIN (elts1))
10049 n_elts = tree_cons (NULL_TREE, TREE_VALUE (elts0), n_elts);
10050 n_elts = tree_cons (NULL_TREE, TREE_VALUE (elts1), n_elts);
10053 return build_vector (rtype, nreverse (n_elts));
10057 case CODE_FOR_pdist_vis:
10065 if (TREE_CODE (arg0) == VECTOR_CST
10066 && TREE_CODE (arg1) == VECTOR_CST
10067 && TREE_CODE (arg2) == INTEGER_CST)
10070 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg2);
10071 HOST_WIDE_INT high = TREE_INT_CST_HIGH (arg2);
10072 tree elts0 = TREE_VECTOR_CST_ELTS (arg0);
10073 tree elts1 = TREE_VECTOR_CST_ELTS (arg1);
10075 for (; elts0 && elts1;
10076 elts0 = TREE_CHAIN (elts0), elts1 = TREE_CHAIN (elts1))
10078 unsigned HOST_WIDE_INT
10079 low0 = TREE_INT_CST_LOW (TREE_VALUE (elts0)),
10080 low1 = TREE_INT_CST_LOW (TREE_VALUE (elts1));
10081 HOST_WIDE_INT high0 = TREE_INT_CST_HIGH (TREE_VALUE (elts0));
10082 HOST_WIDE_INT high1 = TREE_INT_CST_HIGH (TREE_VALUE (elts1));
10084 unsigned HOST_WIDE_INT l;
10087 overflow |= neg_double (low1, high1, &l, &h);
10088 overflow |= add_double (low0, high0, l, h, &l, &h);
10090 overflow |= neg_double (l, h, &l, &h);
10092 overflow |= add_double (low, high, l, h, &low, &high);
10095 gcc_assert (overflow == 0);
10097 return build_int_cst_wide (rtype, low, high);
10107 /* ??? This duplicates information provided to the compiler by the
10108 ??? scheduler description. Some day, teach genautomata to output
10109 ??? the latencies and then CSE will just use that. */
10112 sparc_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
10113 int *total, bool speed ATTRIBUTE_UNUSED)
10115 enum machine_mode mode = GET_MODE (x);
10116 bool float_mode_p = FLOAT_MODE_P (mode);
10121 if (INTVAL (x) < 0x1000 && INTVAL (x) >= -0x1000)
10139 if (GET_MODE (x) == VOIDmode
10140 && ((CONST_DOUBLE_HIGH (x) == 0
10141 && CONST_DOUBLE_LOW (x) < 0x1000)
10142 || (CONST_DOUBLE_HIGH (x) == -1
10143 && CONST_DOUBLE_LOW (x) < 0
10144 && CONST_DOUBLE_LOW (x) >= -0x1000)))
10151 /* If outer-code was a sign or zero extension, a cost
10152 of COSTS_N_INSNS (1) was already added in. This is
10153 why we are subtracting it back out. */
10154 if (outer_code == ZERO_EXTEND)
10156 *total = sparc_costs->int_zload - COSTS_N_INSNS (1);
10158 else if (outer_code == SIGN_EXTEND)
10160 *total = sparc_costs->int_sload - COSTS_N_INSNS (1);
10162 else if (float_mode_p)
10164 *total = sparc_costs->float_load;
10168 *total = sparc_costs->int_load;
10176 *total = sparc_costs->float_plusminus;
10178 *total = COSTS_N_INSNS (1);
10185 gcc_assert (float_mode_p);
10186 *total = sparc_costs->float_mul;
10189 if (GET_CODE (sub) == NEG)
10190 sub = XEXP (sub, 0);
10191 *total += rtx_cost (sub, FMA, 0, speed);
10194 if (GET_CODE (sub) == NEG)
10195 sub = XEXP (sub, 0);
10196 *total += rtx_cost (sub, FMA, 2, speed);
10202 *total = sparc_costs->float_mul;
10203 else if (! TARGET_HARD_MUL)
10204 *total = COSTS_N_INSNS (25);
10210 if (sparc_costs->int_mul_bit_factor)
10214 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
10216 unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
10217 for (nbits = 0; value != 0; value &= value - 1)
10220 else if (GET_CODE (XEXP (x, 1)) == CONST_DOUBLE
10221 && GET_MODE (XEXP (x, 1)) == VOIDmode)
10223 rtx x1 = XEXP (x, 1);
10224 unsigned HOST_WIDE_INT value1 = CONST_DOUBLE_LOW (x1);
10225 unsigned HOST_WIDE_INT value2 = CONST_DOUBLE_HIGH (x1);
10227 for (nbits = 0; value1 != 0; value1 &= value1 - 1)
10229 for (; value2 != 0; value2 &= value2 - 1)
10237 bit_cost = (nbits - 3) / sparc_costs->int_mul_bit_factor;
10238 bit_cost = COSTS_N_INSNS (bit_cost);
10241 if (mode == DImode)
10242 *total = sparc_costs->int_mulX + bit_cost;
10244 *total = sparc_costs->int_mul + bit_cost;
10251 *total = COSTS_N_INSNS (1) + sparc_costs->shift_penalty;
10260 if (mode == DFmode)
10261 *total = sparc_costs->float_div_df;
10263 *total = sparc_costs->float_div_sf;
10267 if (mode == DImode)
10268 *total = sparc_costs->int_divX;
10270 *total = sparc_costs->int_div;
10275 if (! float_mode_p)
10277 *total = COSTS_N_INSNS (1);
10284 case UNSIGNED_FLOAT:
10288 case FLOAT_TRUNCATE:
10289 *total = sparc_costs->float_move;
10293 if (mode == DFmode)
10294 *total = sparc_costs->float_sqrt_df;
10296 *total = sparc_costs->float_sqrt_sf;
10301 *total = sparc_costs->float_cmp;
10303 *total = COSTS_N_INSNS (1);
10308 *total = sparc_costs->float_cmove;
10310 *total = sparc_costs->int_cmove;
10314 /* Handle the NAND vector patterns. */
10315 if (sparc_vector_mode_supported_p (GET_MODE (x))
10316 && GET_CODE (XEXP (x, 0)) == NOT
10317 && GET_CODE (XEXP (x, 1)) == NOT)
10319 *total = COSTS_N_INSNS (1);
10330 /* Return true if CLASS is either GENERAL_REGS or I64_REGS. */
10333 general_or_i64_p (reg_class_t rclass)
10335 return (rclass == GENERAL_REGS || rclass == I64_REGS);
10338 /* Implement TARGET_REGISTER_MOVE_COST. */
10341 sparc_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
10342 reg_class_t from, reg_class_t to)
10344 bool need_memory = false;
10346 if (from == FPCC_REGS || to == FPCC_REGS)
10347 need_memory = true;
10348 else if ((FP_REG_CLASS_P (from) && general_or_i64_p (to))
10349 || (general_or_i64_p (from) && FP_REG_CLASS_P (to)))
10353 int size = GET_MODE_SIZE (mode);
10354 if (size == 8 || size == 4)
10356 if (! TARGET_ARCH32 || size == 4)
10362 need_memory = true;
10367 if (sparc_cpu == PROCESSOR_ULTRASPARC
10368 || sparc_cpu == PROCESSOR_ULTRASPARC3
10369 || sparc_cpu == PROCESSOR_NIAGARA
10370 || sparc_cpu == PROCESSOR_NIAGARA2
10371 || sparc_cpu == PROCESSOR_NIAGARA3
10372 || sparc_cpu == PROCESSOR_NIAGARA4)
10381 /* Emit the sequence of insns SEQ while preserving the registers REG and REG2.
10382 This is achieved by means of a manual dynamic stack space allocation in
10383 the current frame. We make the assumption that SEQ doesn't contain any
10384 function calls, with the possible exception of calls to the GOT helper. */
10387 emit_and_preserve (rtx seq, rtx reg, rtx reg2)
10389 /* We must preserve the lowest 16 words for the register save area. */
10390 HOST_WIDE_INT offset = 16*UNITS_PER_WORD;
10391 /* We really need only 2 words of fresh stack space. */
10392 HOST_WIDE_INT size = SPARC_STACK_ALIGN (offset + 2*UNITS_PER_WORD);
10395 = gen_rtx_MEM (word_mode, plus_constant (stack_pointer_rtx,
10396 SPARC_STACK_BIAS + offset));
10398 emit_insn (gen_stack_pointer_dec (GEN_INT (size)));
10399 emit_insn (gen_rtx_SET (VOIDmode, slot, reg));
10401 emit_insn (gen_rtx_SET (VOIDmode,
10402 adjust_address (slot, word_mode, UNITS_PER_WORD),
10406 emit_insn (gen_rtx_SET (VOIDmode,
10408 adjust_address (slot, word_mode, UNITS_PER_WORD)));
10409 emit_insn (gen_rtx_SET (VOIDmode, reg, slot));
10410 emit_insn (gen_stack_pointer_inc (GEN_INT (size)));
10413 /* Output the assembler code for a thunk function. THUNK_DECL is the
10414 declaration for the thunk function itself, FUNCTION is the decl for
10415 the target function. DELTA is an immediate constant offset to be
10416 added to THIS. If VCALL_OFFSET is nonzero, the word at address
10417 (*THIS + VCALL_OFFSET) should be additionally added to THIS. */
10420 sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
10421 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
10424 rtx this_rtx, insn, funexp;
10425 unsigned int int_arg_first;
10427 reload_completed = 1;
10428 epilogue_completed = 1;
10430 emit_note (NOTE_INSN_PROLOGUE_END);
10434 sparc_leaf_function_p = 1;
10436 int_arg_first = SPARC_OUTGOING_INT_ARG_FIRST;
10438 else if (flag_delayed_branch)
10440 /* We will emit a regular sibcall below, so we need to instruct
10441 output_sibcall that we are in a leaf function. */
10442 sparc_leaf_function_p = current_function_uses_only_leaf_regs = 1;
10444 /* This will cause final.c to invoke leaf_renumber_regs so we
10445 must behave as if we were in a not-yet-leafified function. */
10446 int_arg_first = SPARC_INCOMING_INT_ARG_FIRST;
10450 /* We will emit the sibcall manually below, so we will need to
10451 manually spill non-leaf registers. */
10452 sparc_leaf_function_p = current_function_uses_only_leaf_regs = 0;
10454 /* We really are in a leaf function. */
10455 int_arg_first = SPARC_OUTGOING_INT_ARG_FIRST;
10458 /* Find the "this" pointer. Normally in %o0, but in ARCH64 if the function
10459 returns a structure, the structure return pointer is there instead. */
10461 && aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
10462 this_rtx = gen_rtx_REG (Pmode, int_arg_first + 1);
10464 this_rtx = gen_rtx_REG (Pmode, int_arg_first);
10466 /* Add DELTA. When possible use a plain add, otherwise load it into
10467 a register first. */
10470 rtx delta_rtx = GEN_INT (delta);
10472 if (! SPARC_SIMM13_P (delta))
10474 rtx scratch = gen_rtx_REG (Pmode, 1);
10475 emit_move_insn (scratch, delta_rtx);
10476 delta_rtx = scratch;
10479 /* THIS_RTX += DELTA. */
10480 emit_insn (gen_add2_insn (this_rtx, delta_rtx));
10483 /* Add the word at address (*THIS_RTX + VCALL_OFFSET). */
10486 rtx vcall_offset_rtx = GEN_INT (vcall_offset);
10487 rtx scratch = gen_rtx_REG (Pmode, 1);
10489 gcc_assert (vcall_offset < 0);
10491 /* SCRATCH = *THIS_RTX. */
10492 emit_move_insn (scratch, gen_rtx_MEM (Pmode, this_rtx));
10494 /* Prepare for adding VCALL_OFFSET. The difficulty is that we
10495 may not have any available scratch register at this point. */
10496 if (SPARC_SIMM13_P (vcall_offset))
10498 /* This is the case if ARCH64 (unless -ffixed-g5 is passed). */
10499 else if (! fixed_regs[5]
10500 /* The below sequence is made up of at least 2 insns,
10501 while the default method may need only one. */
10502 && vcall_offset < -8192)
10504 rtx scratch2 = gen_rtx_REG (Pmode, 5);
10505 emit_move_insn (scratch2, vcall_offset_rtx);
10506 vcall_offset_rtx = scratch2;
10510 rtx increment = GEN_INT (-4096);
10512 /* VCALL_OFFSET is a negative number whose typical range can be
10513 estimated as -32768..0 in 32-bit mode. In almost all cases
10514 it is therefore cheaper to emit multiple add insns than
10515 spilling and loading the constant into a register (at least
10517 while (! SPARC_SIMM13_P (vcall_offset))
10519 emit_insn (gen_add2_insn (scratch, increment));
10520 vcall_offset += 4096;
10522 vcall_offset_rtx = GEN_INT (vcall_offset); /* cannot be 0 */
10525 /* SCRATCH = *(*THIS_RTX + VCALL_OFFSET). */
10526 emit_move_insn (scratch, gen_rtx_MEM (Pmode,
10527 gen_rtx_PLUS (Pmode,
10529 vcall_offset_rtx)));
10531 /* THIS_RTX += *(*THIS_RTX + VCALL_OFFSET). */
10532 emit_insn (gen_add2_insn (this_rtx, scratch));
10535 /* Generate a tail call to the target function. */
10536 if (! TREE_USED (function))
10538 assemble_external (function);
10539 TREE_USED (function) = 1;
10541 funexp = XEXP (DECL_RTL (function), 0);
10543 if (flag_delayed_branch)
10545 funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
10546 insn = emit_call_insn (gen_sibcall (funexp));
10547 SIBLING_CALL_P (insn) = 1;
10551 /* The hoops we have to jump through in order to generate a sibcall
10552 without using delay slots... */
10553 rtx spill_reg, seq, scratch = gen_rtx_REG (Pmode, 1);
10557 spill_reg = gen_rtx_REG (word_mode, 15); /* %o7 */
10559 load_got_register (); /* clobbers %o7 */
10560 scratch = sparc_legitimize_pic_address (funexp, scratch);
10561 seq = get_insns ();
10563 emit_and_preserve (seq, spill_reg, pic_offset_table_rtx);
10565 else if (TARGET_ARCH32)
10567 emit_insn (gen_rtx_SET (VOIDmode,
10569 gen_rtx_HIGH (SImode, funexp)));
10570 emit_insn (gen_rtx_SET (VOIDmode,
10572 gen_rtx_LO_SUM (SImode, scratch, funexp)));
10574 else /* TARGET_ARCH64 */
10576 switch (sparc_cmodel)
10580 /* The destination can serve as a temporary. */
10581 sparc_emit_set_symbolic_const64 (scratch, funexp, scratch);
10586 /* The destination cannot serve as a temporary. */
10587 spill_reg = gen_rtx_REG (DImode, 15); /* %o7 */
10589 sparc_emit_set_symbolic_const64 (scratch, funexp, spill_reg);
10590 seq = get_insns ();
10592 emit_and_preserve (seq, spill_reg, 0);
10596 gcc_unreachable ();
10600 emit_jump_insn (gen_indirect_jump (scratch));
10605 /* Run just enough of rest_of_compilation to get the insns emitted.
10606 There's not really enough bulk here to make other passes such as
10607 instruction scheduling worth while. Note that use_thunk calls
10608 assemble_start_function and assemble_end_function. */
10609 insn = get_insns ();
10610 insn_locators_alloc ();
10611 shorten_branches (insn);
10612 final_start_function (insn, file, 1);
10613 final (insn, file, 1);
10614 final_end_function ();
10616 reload_completed = 0;
10617 epilogue_completed = 0;
10620 /* Return true if sparc_output_mi_thunk would be able to output the
10621 assembler code for the thunk function specified by the arguments
10622 it is passed, and false otherwise. */
10624 sparc_can_output_mi_thunk (const_tree thunk_fndecl ATTRIBUTE_UNUSED,
10625 HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
10626 HOST_WIDE_INT vcall_offset,
10627 const_tree function ATTRIBUTE_UNUSED)
10629 /* Bound the loop used in the default method above. */
10630 return (vcall_offset >= -32768 || ! fixed_regs[5]);
10633 /* We use the machine specific reorg pass to enable workarounds for errata. */
10640 /* The only erratum we handle for now is that of the AT697F processor. */
10641 if (!sparc_fix_at697f)
10644 /* We need to have the (essentially) final form of the insn stream in order
10645 to properly detect the various hazards. Run delay slot scheduling. */
10646 if (optimize > 0 && flag_delayed_branch)
10647 dbr_schedule (get_insns ());
10649 /* Now look for specific patterns in the insn stream. */
10650 for (insn = get_insns (); insn; insn = next)
10652 bool insert_nop = false;
10655 /* Look for a single-word load into an odd-numbered FP register. */
10656 if (NONJUMP_INSN_P (insn)
10657 && (set = single_set (insn)) != NULL_RTX
10658 && GET_MODE_SIZE (GET_MODE (SET_SRC (set))) == 4
10659 && MEM_P (SET_SRC (set))
10660 && REG_P (SET_DEST (set))
10661 && REGNO (SET_DEST (set)) > 31
10662 && REGNO (SET_DEST (set)) % 2 != 0)
10664 /* The wrong dependency is on the enclosing double register. */
10665 unsigned int x = REGNO (SET_DEST (set)) - 1;
10666 unsigned int src1, src2, dest;
10669 /* If the insn has a delay slot, then it cannot be problematic. */
10670 next = next_active_insn (insn);
10671 if (NONJUMP_INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE)
10675 extract_insn (next);
10676 code = INSN_CODE (next);
10681 case CODE_FOR_adddf3:
10682 case CODE_FOR_subdf3:
10683 case CODE_FOR_muldf3:
10684 case CODE_FOR_divdf3:
10685 dest = REGNO (recog_data.operand[0]);
10686 src1 = REGNO (recog_data.operand[1]);
10687 src2 = REGNO (recog_data.operand[2]);
10691 ld [address], %fx+1
10692 FPOPd %f{x,y}, %f{y,x}, %f{x,y} */
10693 if ((src1 == x || src2 == x)
10694 && (dest == src1 || dest == src2))
10700 ld [address], %fx+1
10701 FPOPd %fx, %fx, %fx */
10704 && (code == CODE_FOR_adddf3 || code == CODE_FOR_muldf3))
10709 case CODE_FOR_sqrtdf2:
10710 dest = REGNO (recog_data.operand[0]);
10711 src1 = REGNO (recog_data.operand[1]);
10713 ld [address], %fx+1
10715 if (src1 == x && dest == src1)
10724 next = NEXT_INSN (insn);
10727 emit_insn_after (gen_nop (), insn);
10731 /* How to allocate a 'struct machine_function'. */
10733 static struct machine_function *
10734 sparc_init_machine_status (void)
10736 return ggc_alloc_cleared_machine_function ();
10739 /* Locate some local-dynamic symbol still in use by this function
10740 so that we can print its name in local-dynamic base patterns. */
10742 static const char *
10743 get_some_local_dynamic_name (void)
10747 if (cfun->machine->some_ld_name)
10748 return cfun->machine->some_ld_name;
10750 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
10752 && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
10753 return cfun->machine->some_ld_name;
10755 gcc_unreachable ();
10759 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
10764 && GET_CODE (x) == SYMBOL_REF
10765 && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
10767 cfun->machine->some_ld_name = XSTR (x, 0);
10774 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
10775 We need to emit DTP-relative relocations. */
10778 sparc_output_dwarf_dtprel (FILE *file, int size, rtx x)
10783 fputs ("\t.word\t%r_tls_dtpoff32(", file);
10786 fputs ("\t.xword\t%r_tls_dtpoff64(", file);
10789 gcc_unreachable ();
10791 output_addr_const (file, x);
10795 /* Do whatever processing is required at the end of a file. */
10798 sparc_file_end (void)
10800 /* If we need to emit the special GOT helper function, do so now. */
10801 if (got_helper_rtx)
10803 const char *name = XSTR (got_helper_rtx, 0);
10804 const char *reg_name = reg_names[GLOBAL_OFFSET_TABLE_REGNUM];
10805 #ifdef DWARF2_UNWIND_INFO
10809 if (USE_HIDDEN_LINKONCE)
10811 tree decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
10812 get_identifier (name),
10813 build_function_type_list (void_type_node,
10815 DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
10816 NULL_TREE, void_type_node);
10817 TREE_STATIC (decl) = 1;
10818 make_decl_one_only (decl, DECL_ASSEMBLER_NAME (decl));
10819 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
10820 DECL_VISIBILITY_SPECIFIED (decl) = 1;
10821 resolve_unique_section (decl, 0, flag_function_sections);
10822 allocate_struct_function (decl, true);
10823 cfun->is_thunk = 1;
10824 current_function_decl = decl;
10825 init_varasm_status ();
10826 assemble_start_function (decl, name);
10830 const int align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
10831 switch_to_section (text_section);
10833 ASM_OUTPUT_ALIGN (asm_out_file, align);
10834 ASM_OUTPUT_LABEL (asm_out_file, name);
10837 #ifdef DWARF2_UNWIND_INFO
10838 do_cfi = dwarf2out_do_cfi_asm ();
10840 fprintf (asm_out_file, "\t.cfi_startproc\n");
10842 if (flag_delayed_branch)
10843 fprintf (asm_out_file, "\tjmp\t%%o7+8\n\t add\t%%o7, %s, %s\n",
10844 reg_name, reg_name);
10846 fprintf (asm_out_file, "\tadd\t%%o7, %s, %s\n\tjmp\t%%o7+8\n\t nop\n",
10847 reg_name, reg_name);
10848 #ifdef DWARF2_UNWIND_INFO
10850 fprintf (asm_out_file, "\t.cfi_endproc\n");
10854 if (NEED_INDICATE_EXEC_STACK)
10855 file_end_indicate_exec_stack ();
10857 #ifdef TARGET_SOLARIS
10858 solaris_file_end ();
10862 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
10863 /* Implement TARGET_MANGLE_TYPE. */
10865 static const char *
10866 sparc_mangle_type (const_tree type)
10869 && TYPE_MAIN_VARIANT (type) == long_double_type_node
10870 && TARGET_LONG_DOUBLE_128)
10873 /* For all other types, use normal C++ mangling. */
10878 /* Expand a membar instruction for various use cases. Both the LOAD_STORE
10879 and BEFORE_AFTER arguments of the form X_Y. They are two-bit masks where
10880 bit 0 indicates that X is true, and bit 1 indicates Y is true. */
10883 sparc_emit_membar_for_model (enum memmodel model,
10884 int load_store, int before_after)
10886 /* Bits for the MEMBAR mmask field. */
10887 const int LoadLoad = 1;
10888 const int StoreLoad = 2;
10889 const int LoadStore = 4;
10890 const int StoreStore = 8;
10892 int mm = 0, implied = 0;
10894 switch (sparc_memory_model)
10897 /* Sequential Consistency. All memory transactions are immediately
10898 visible in sequential execution order. No barriers needed. */
10899 implied = LoadLoad | StoreLoad | LoadStore | StoreStore;
10903 /* Total Store Ordering: all memory transactions with store semantics
10904 are followed by an implied StoreStore. */
10905 implied |= StoreStore;
10909 /* Partial Store Ordering: all memory transactions with load semantics
10910 are followed by an implied LoadLoad | LoadStore. */
10911 implied |= LoadLoad | LoadStore;
10913 /* If we're not looking for a raw barrer (before+after), then atomic
10914 operations get the benefit of being both load and store. */
10915 if (load_store == 3 && before_after == 2)
10916 implied |= StoreLoad | StoreStore;
10920 /* Relaxed Memory Ordering: no implicit bits. */
10924 gcc_unreachable ();
10927 if (before_after & 1)
10929 if (model == MEMMODEL_ACQUIRE
10930 || model == MEMMODEL_ACQ_REL
10931 || model == MEMMODEL_SEQ_CST)
10933 if (load_store & 1)
10934 mm |= LoadLoad | LoadStore;
10935 if (load_store & 2)
10936 mm |= StoreLoad | StoreStore;
10939 if (before_after & 2)
10941 if (model == MEMMODEL_RELEASE
10942 || model == MEMMODEL_ACQ_REL
10943 || model == MEMMODEL_SEQ_CST)
10945 if (load_store & 1)
10946 mm |= LoadLoad | StoreLoad;
10947 if (load_store & 2)
10948 mm |= LoadStore | StoreStore;
10952 /* Remove the bits implied by the system memory model. */
10955 /* For raw barriers (before+after), always emit a barrier.
10956 This will become a compile-time barrier if needed. */
10957 if (mm || before_after == 3)
10958 emit_insn (gen_membar (GEN_INT (mm)));
10961 /* Expand code to perform a 8 or 16-bit compare and swap by doing 32-bit
10962 compare and swap on the word containing the byte or half-word. */
10965 sparc_expand_compare_and_swap_12 (rtx bool_result, rtx result, rtx mem,
10966 rtx oldval, rtx newval)
10968 rtx addr1 = force_reg (Pmode, XEXP (mem, 0));
10969 rtx addr = gen_reg_rtx (Pmode);
10970 rtx off = gen_reg_rtx (SImode);
10971 rtx oldv = gen_reg_rtx (SImode);
10972 rtx newv = gen_reg_rtx (SImode);
10973 rtx oldvalue = gen_reg_rtx (SImode);
10974 rtx newvalue = gen_reg_rtx (SImode);
10975 rtx res = gen_reg_rtx (SImode);
10976 rtx resv = gen_reg_rtx (SImode);
10977 rtx memsi, val, mask, end_label, loop_label, cc;
10979 emit_insn (gen_rtx_SET (VOIDmode, addr,
10980 gen_rtx_AND (Pmode, addr1, GEN_INT (-4))));
10982 if (Pmode != SImode)
10983 addr1 = gen_lowpart (SImode, addr1);
10984 emit_insn (gen_rtx_SET (VOIDmode, off,
10985 gen_rtx_AND (SImode, addr1, GEN_INT (3))));
10987 memsi = gen_rtx_MEM (SImode, addr);
10988 set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
10989 MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
10991 val = copy_to_reg (memsi);
10993 emit_insn (gen_rtx_SET (VOIDmode, off,
10994 gen_rtx_XOR (SImode, off,
10995 GEN_INT (GET_MODE (mem) == QImode
10998 emit_insn (gen_rtx_SET (VOIDmode, off,
10999 gen_rtx_ASHIFT (SImode, off, GEN_INT (3))));
11001 if (GET_MODE (mem) == QImode)
11002 mask = force_reg (SImode, GEN_INT (0xff));
11004 mask = force_reg (SImode, GEN_INT (0xffff));
11006 emit_insn (gen_rtx_SET (VOIDmode, mask,
11007 gen_rtx_ASHIFT (SImode, mask, off)));
11009 emit_insn (gen_rtx_SET (VOIDmode, val,
11010 gen_rtx_AND (SImode, gen_rtx_NOT (SImode, mask),
11013 oldval = gen_lowpart (SImode, oldval);
11014 emit_insn (gen_rtx_SET (VOIDmode, oldv,
11015 gen_rtx_ASHIFT (SImode, oldval, off)));
11017 newval = gen_lowpart_common (SImode, newval);
11018 emit_insn (gen_rtx_SET (VOIDmode, newv,
11019 gen_rtx_ASHIFT (SImode, newval, off)));
11021 emit_insn (gen_rtx_SET (VOIDmode, oldv,
11022 gen_rtx_AND (SImode, oldv, mask)));
11024 emit_insn (gen_rtx_SET (VOIDmode, newv,
11025 gen_rtx_AND (SImode, newv, mask)));
11027 end_label = gen_label_rtx ();
11028 loop_label = gen_label_rtx ();
11029 emit_label (loop_label);
11031 emit_insn (gen_rtx_SET (VOIDmode, oldvalue,
11032 gen_rtx_IOR (SImode, oldv, val)));
11034 emit_insn (gen_rtx_SET (VOIDmode, newvalue,
11035 gen_rtx_IOR (SImode, newv, val)));
11037 emit_move_insn (bool_result, const1_rtx);
11039 emit_insn (gen_atomic_compare_and_swapsi_1 (res, memsi, oldvalue, newvalue));
11041 emit_cmp_and_jump_insns (res, oldvalue, EQ, NULL, SImode, 0, end_label);
11043 emit_insn (gen_rtx_SET (VOIDmode, resv,
11044 gen_rtx_AND (SImode, gen_rtx_NOT (SImode, mask),
11047 emit_move_insn (bool_result, const0_rtx);
11049 cc = gen_compare_reg_1 (NE, resv, val);
11050 emit_insn (gen_rtx_SET (VOIDmode, val, resv));
11052 /* Use cbranchcc4 to separate the compare and branch! */
11053 emit_jump_insn (gen_cbranchcc4 (gen_rtx_NE (VOIDmode, cc, const0_rtx),
11054 cc, const0_rtx, loop_label));
11056 emit_label (end_label);
11058 emit_insn (gen_rtx_SET (VOIDmode, res,
11059 gen_rtx_AND (SImode, res, mask)));
11061 emit_insn (gen_rtx_SET (VOIDmode, res,
11062 gen_rtx_LSHIFTRT (SImode, res, off)));
11064 emit_move_insn (result, gen_lowpart (GET_MODE (result), res));
11067 /* Expand code to perform a compare-and-swap. */
11070 sparc_expand_compare_and_swap (rtx operands[])
11072 rtx bval, retval, mem, oldval, newval;
11073 enum machine_mode mode;
11074 enum memmodel model;
11076 bval = operands[0];
11077 retval = operands[1];
11079 oldval = operands[3];
11080 newval = operands[4];
11081 model = (enum memmodel) INTVAL (operands[6]);
11082 mode = GET_MODE (mem);
11084 sparc_emit_membar_for_model (model, 3, 1);
11086 if (reg_overlap_mentioned_p (retval, oldval))
11087 oldval = copy_to_reg (oldval);
11089 if (mode == QImode || mode == HImode)
11090 sparc_expand_compare_and_swap_12 (bval, retval, mem, oldval, newval);
11093 rtx (*gen) (rtx, rtx, rtx, rtx);
11096 if (mode == SImode)
11097 gen = gen_atomic_compare_and_swapsi_1;
11099 gen = gen_atomic_compare_and_swapdi_1;
11100 emit_insn (gen (retval, mem, oldval, newval));
11102 x = emit_store_flag (bval, EQ, retval, oldval, mode, 1, 1);
11104 convert_move (bval, x, 1);
11107 sparc_emit_membar_for_model (model, 3, 2);
11111 sparc_expand_vec_perm_bmask (enum machine_mode vmode, rtx sel)
11115 sel = gen_lowpart (DImode, sel);
11119 /* inp = xxxxxxxAxxxxxxxB */
11120 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (16),
11121 NULL_RTX, 1, OPTAB_DIRECT);
11122 /* t_1 = ....xxxxxxxAxxx. */
11123 sel = expand_simple_binop (SImode, AND, gen_lowpart (SImode, sel),
11124 GEN_INT (3), NULL_RTX, 1, OPTAB_DIRECT);
11125 t_1 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_1),
11126 GEN_INT (0x30000), NULL_RTX, 1, OPTAB_DIRECT);
11127 /* sel = .......B */
11128 /* t_1 = ...A.... */
11129 sel = expand_simple_binop (SImode, IOR, sel, t_1, sel, 1, OPTAB_DIRECT);
11130 /* sel = ...A...B */
11131 sel = expand_mult (SImode, sel, GEN_INT (0x4444), sel, 1);
11132 /* sel = AAAABBBB * 4 */
11133 t_1 = force_reg (SImode, GEN_INT (0x01230123));
11134 /* sel = { A*4, A*4+1, A*4+2, ... } */
11138 /* inp = xxxAxxxBxxxCxxxD */
11139 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (8),
11140 NULL_RTX, 1, OPTAB_DIRECT);
11141 t_2 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (16),
11142 NULL_RTX, 1, OPTAB_DIRECT);
11143 t_3 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (24),
11144 NULL_RTX, 1, OPTAB_DIRECT);
11145 /* t_1 = ..xxxAxxxBxxxCxx */
11146 /* t_2 = ....xxxAxxxBxxxC */
11147 /* t_3 = ......xxxAxxxBxx */
11148 sel = expand_simple_binop (SImode, AND, gen_lowpart (SImode, sel),
11150 NULL_RTX, 1, OPTAB_DIRECT);
11151 t_1 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_1),
11153 NULL_RTX, 1, OPTAB_DIRECT);
11154 t_2 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_2),
11155 GEN_INT (0x070000),
11156 NULL_RTX, 1, OPTAB_DIRECT);
11157 t_3 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_3),
11158 GEN_INT (0x07000000),
11159 NULL_RTX, 1, OPTAB_DIRECT);
11160 /* sel = .......D */
11161 /* t_1 = .....C.. */
11162 /* t_2 = ...B.... */
11163 /* t_3 = .A...... */
11164 sel = expand_simple_binop (SImode, IOR, sel, t_1, sel, 1, OPTAB_DIRECT);
11165 t_2 = expand_simple_binop (SImode, IOR, t_2, t_3, t_2, 1, OPTAB_DIRECT);
11166 sel = expand_simple_binop (SImode, IOR, sel, t_2, sel, 1, OPTAB_DIRECT);
11167 /* sel = .A.B.C.D */
11168 sel = expand_mult (SImode, sel, GEN_INT (0x22), sel, 1);
11169 /* sel = AABBCCDD * 2 */
11170 t_1 = force_reg (SImode, GEN_INT (0x01010101));
11171 /* sel = { A*2, A*2+1, B*2, B*2+1, ... } */
11175 /* input = xAxBxCxDxExFxGxH */
11176 sel = expand_simple_binop (DImode, AND, sel,
11177 GEN_INT ((HOST_WIDE_INT)0x0f0f0f0f << 32
11179 NULL_RTX, 1, OPTAB_DIRECT);
11180 /* sel = .A.B.C.D.E.F.G.H */
11181 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (4),
11182 NULL_RTX, 1, OPTAB_DIRECT);
11183 /* t_1 = ..A.B.C.D.E.F.G. */
11184 sel = expand_simple_binop (DImode, IOR, sel, t_1,
11185 NULL_RTX, 1, OPTAB_DIRECT);
11186 /* sel = .AABBCCDDEEFFGGH */
11187 sel = expand_simple_binop (DImode, AND, sel,
11188 GEN_INT ((HOST_WIDE_INT)0xff00ff << 32
11190 NULL_RTX, 1, OPTAB_DIRECT);
11191 /* sel = ..AB..CD..EF..GH */
11192 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (8),
11193 NULL_RTX, 1, OPTAB_DIRECT);
11194 /* t_1 = ....AB..CD..EF.. */
11195 sel = expand_simple_binop (DImode, IOR, sel, t_1,
11196 NULL_RTX, 1, OPTAB_DIRECT);
11197 /* sel = ..ABABCDCDEFEFGH */
11198 sel = expand_simple_binop (DImode, AND, sel,
11199 GEN_INT ((HOST_WIDE_INT)0xffff << 32 | 0xffff),
11200 NULL_RTX, 1, OPTAB_DIRECT);
11201 /* sel = ....ABCD....EFGH */
11202 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (16),
11203 NULL_RTX, 1, OPTAB_DIRECT);
11204 /* t_1 = ........ABCD.... */
11205 sel = gen_lowpart (SImode, sel);
11206 t_1 = gen_lowpart (SImode, t_1);
11210 gcc_unreachable ();
11213 /* Always perform the final addition/merge within the bmask insn. */
11214 emit_insn (gen_bmasksi_vis (gen_reg_rtx (SImode), sel, t_1));
11217 /* Implement TARGET_FRAME_POINTER_REQUIRED. */
11220 sparc_frame_pointer_required (void)
11222 /* If the stack pointer is dynamically modified in the function, it cannot
11223 serve as the frame pointer. */
11224 if (cfun->calls_alloca)
11227 /* If the function receives nonlocal gotos, it needs to save the frame
11228 pointer in the nonlocal_goto_save_area object. */
11229 if (cfun->has_nonlocal_label)
11232 /* In flat mode, that's it. */
11236 /* Otherwise, the frame pointer is required if the function isn't leaf. */
11237 return !(current_function_is_leaf && only_leaf_regs_used ());
11240 /* The way this is structured, we can't eliminate SFP in favor of SP
11241 if the frame pointer is required: we want to use the SFP->HFP elimination
11242 in that case. But the test in update_eliminables doesn't know we are
11243 assuming below that we only do the former elimination. */
11246 sparc_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
11248 return to == HARD_FRAME_POINTER_REGNUM || !sparc_frame_pointer_required ();
11251 /* Return the hard frame pointer directly to bypass the stack bias. */
11254 sparc_builtin_setjmp_frame_value (void)
11256 return hard_frame_pointer_rtx;
11259 /* If !TARGET_FPU, then make the fp registers and fp cc regs fixed so that
11260 they won't be allocated. */
11263 sparc_conditional_register_usage (void)
11265 if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
11267 fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
11268 call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
11270 /* If the user has passed -f{fixed,call-{used,saved}}-g5 */
11271 /* then honor it. */
11272 if (TARGET_ARCH32 && fixed_regs[5])
11274 else if (TARGET_ARCH64 && fixed_regs[5] == 2)
11279 for (regno = SPARC_FIRST_V9_FP_REG;
11280 regno <= SPARC_LAST_V9_FP_REG;
11282 fixed_regs[regno] = 1;
11283 /* %fcc0 is used by v8 and v9. */
11284 for (regno = SPARC_FIRST_V9_FCC_REG + 1;
11285 regno <= SPARC_LAST_V9_FCC_REG;
11287 fixed_regs[regno] = 1;
11292 for (regno = 32; regno < SPARC_LAST_V9_FCC_REG; regno++)
11293 fixed_regs[regno] = 1;
11295 /* If the user has passed -f{fixed,call-{used,saved}}-g2 */
11296 /* then honor it. Likewise with g3 and g4. */
11297 if (fixed_regs[2] == 2)
11298 fixed_regs[2] = ! TARGET_APP_REGS;
11299 if (fixed_regs[3] == 2)
11300 fixed_regs[3] = ! TARGET_APP_REGS;
11301 if (TARGET_ARCH32 && fixed_regs[4] == 2)
11302 fixed_regs[4] = ! TARGET_APP_REGS;
11303 else if (TARGET_CM_EMBMEDANY)
11305 else if (fixed_regs[4] == 2)
11310 /* Disable leaf functions. */
11311 memset (sparc_leaf_regs, 0, FIRST_PSEUDO_REGISTER);
11312 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
11313 leaf_reg_remap [regno] = regno;
11316 global_regs[SPARC_GSR_REG] = 1;
11319 /* Implement TARGET_PREFERRED_RELOAD_CLASS:
11321 - We can't load constants into FP registers.
11322 - We can't load FP constants into integer registers when soft-float,
11323 because there is no soft-float pattern with a r/F constraint.
11324 - We can't load FP constants into integer registers for TFmode unless
11325 it is 0.0L, because there is no movtf pattern with a r/F constraint.
11326 - Try and reload integer constants (symbolic or otherwise) back into
11327 registers directly, rather than having them dumped to memory. */
11330 sparc_preferred_reload_class (rtx x, reg_class_t rclass)
11332 enum machine_mode mode = GET_MODE (x);
11333 if (CONSTANT_P (x))
11335 if (FP_REG_CLASS_P (rclass)
11336 || rclass == GENERAL_OR_FP_REGS
11337 || rclass == GENERAL_OR_EXTRA_FP_REGS
11338 || (GET_MODE_CLASS (mode) == MODE_FLOAT && ! TARGET_FPU)
11339 || (mode == TFmode && ! const_zero_operand (x, mode)))
11342 if (GET_MODE_CLASS (mode) == MODE_INT)
11343 return GENERAL_REGS;
11345 if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
11347 if (! FP_REG_CLASS_P (rclass)
11348 || !(const_zero_operand (x, mode)
11349 || const_all_ones_operand (x, mode)))
11356 && (rclass == EXTRA_FP_REGS
11357 || rclass == GENERAL_OR_EXTRA_FP_REGS))
11359 int regno = true_regnum (x);
11361 if (SPARC_INT_REG_P (regno))
11362 return (rclass == EXTRA_FP_REGS
11363 ? FP_REGS : GENERAL_OR_FP_REGS);
11369 /* Output a wide multiply instruction in V8+ mode. INSN is the instruction,
11370 OPERANDS are its operands and OPCODE is the mnemonic to be used. */
11373 output_v8plus_mult (rtx insn, rtx *operands, const char *opcode)
11377 gcc_assert (! TARGET_ARCH64);
11379 if (sparc_check_64 (operands[1], insn) <= 0)
11380 output_asm_insn ("srl\t%L1, 0, %L1", operands);
11381 if (which_alternative == 1)
11382 output_asm_insn ("sllx\t%H1, 32, %H1", operands);
11383 if (GET_CODE (operands[2]) == CONST_INT)
11385 if (which_alternative == 1)
11387 output_asm_insn ("or\t%L1, %H1, %H1", operands);
11388 sprintf (mulstr, "%s\t%%H1, %%2, %%L0", opcode);
11389 output_asm_insn (mulstr, operands);
11390 return "srlx\t%L0, 32, %H0";
11394 output_asm_insn ("sllx\t%H1, 32, %3", operands);
11395 output_asm_insn ("or\t%L1, %3, %3", operands);
11396 sprintf (mulstr, "%s\t%%3, %%2, %%3", opcode);
11397 output_asm_insn (mulstr, operands);
11398 output_asm_insn ("srlx\t%3, 32, %H0", operands);
11399 return "mov\t%3, %L0";
11402 else if (rtx_equal_p (operands[1], operands[2]))
11404 if (which_alternative == 1)
11406 output_asm_insn ("or\t%L1, %H1, %H1", operands);
11407 sprintf (mulstr, "%s\t%%H1, %%H1, %%L0", opcode);
11408 output_asm_insn (mulstr, operands);
11409 return "srlx\t%L0, 32, %H0";
11413 output_asm_insn ("sllx\t%H1, 32, %3", operands);
11414 output_asm_insn ("or\t%L1, %3, %3", operands);
11415 sprintf (mulstr, "%s\t%%3, %%3, %%3", opcode);
11416 output_asm_insn (mulstr, operands);
11417 output_asm_insn ("srlx\t%3, 32, %H0", operands);
11418 return "mov\t%3, %L0";
11421 if (sparc_check_64 (operands[2], insn) <= 0)
11422 output_asm_insn ("srl\t%L2, 0, %L2", operands);
11423 if (which_alternative == 1)
11425 output_asm_insn ("or\t%L1, %H1, %H1", operands);
11426 output_asm_insn ("sllx\t%H2, 32, %L1", operands);
11427 output_asm_insn ("or\t%L2, %L1, %L1", operands);
11428 sprintf (mulstr, "%s\t%%H1, %%L1, %%L0", opcode);
11429 output_asm_insn (mulstr, operands);
11430 return "srlx\t%L0, 32, %H0";
11434 output_asm_insn ("sllx\t%H1, 32, %3", operands);
11435 output_asm_insn ("sllx\t%H2, 32, %4", operands);
11436 output_asm_insn ("or\t%L1, %3, %3", operands);
11437 output_asm_insn ("or\t%L2, %4, %4", operands);
11438 sprintf (mulstr, "%s\t%%3, %%4, %%3", opcode);
11439 output_asm_insn (mulstr, operands);
11440 output_asm_insn ("srlx\t%3, 32, %H0", operands);
11441 return "mov\t%3, %L0";
11445 /* Subroutine of sparc_expand_vector_init. Emit code to initialize
11446 all fields of TARGET to ELT by means of VIS2 BSHUFFLE insn. MODE
11447 and INNER_MODE are the modes describing TARGET. */
11450 vector_init_bshuffle (rtx target, rtx elt, enum machine_mode mode,
11451 enum machine_mode inner_mode)
11453 rtx t1, final_insn;
11456 t1 = gen_reg_rtx (mode);
11458 elt = convert_modes (SImode, inner_mode, elt, true);
11459 emit_move_insn (gen_lowpart(SImode, t1), elt);
11464 final_insn = gen_bshufflev2si_vis (target, t1, t1);
11465 bmask = 0x45674567;
11468 final_insn = gen_bshufflev4hi_vis (target, t1, t1);
11469 bmask = 0x67676767;
11472 final_insn = gen_bshufflev8qi_vis (target, t1, t1);
11473 bmask = 0x77777777;
11476 gcc_unreachable ();
11479 emit_insn (gen_bmasksi_vis (gen_reg_rtx (SImode), CONST0_RTX (SImode),
11480 force_reg (SImode, GEN_INT (bmask))));
11481 emit_insn (final_insn);
11485 vector_init_fpmerge (rtx target, rtx elt, enum machine_mode inner_mode)
11487 rtx t1, t2, t3, t3_low;
11489 t1 = gen_reg_rtx (V4QImode);
11490 elt = convert_modes (SImode, inner_mode, elt, true);
11491 emit_move_insn (gen_lowpart (SImode, t1), elt);
11493 t2 = gen_reg_rtx (V4QImode);
11494 emit_move_insn (t2, t1);
11496 t3 = gen_reg_rtx (V8QImode);
11497 t3_low = gen_lowpart (V4QImode, t3);
11499 emit_insn (gen_fpmerge_vis (t3, t1, t2));
11500 emit_move_insn (t1, t3_low);
11501 emit_move_insn (t2, t3_low);
11503 emit_insn (gen_fpmerge_vis (t3, t1, t2));
11504 emit_move_insn (t1, t3_low);
11505 emit_move_insn (t2, t3_low);
11507 emit_insn (gen_fpmerge_vis (gen_lowpart (V8QImode, target), t1, t2));
11511 vector_init_faligndata (rtx target, rtx elt, enum machine_mode inner_mode)
11513 rtx t1 = gen_reg_rtx (V4HImode);
11515 elt = convert_modes (SImode, inner_mode, elt, true);
11517 emit_move_insn (gen_lowpart (SImode, t1), elt);
11519 emit_insn (gen_alignaddrsi_vis (gen_reg_rtx (SImode),
11520 force_reg (SImode, GEN_INT (6)),
11521 CONST0_RTX (SImode)));
11523 emit_insn (gen_faligndatav4hi_vis (target, t1, target));
11524 emit_insn (gen_faligndatav4hi_vis (target, t1, target));
11525 emit_insn (gen_faligndatav4hi_vis (target, t1, target));
11526 emit_insn (gen_faligndatav4hi_vis (target, t1, target));
11529 /* Emit code to initialize TARGET to values for individual fields VALS. */
11532 sparc_expand_vector_init (rtx target, rtx vals)
11534 enum machine_mode mode = GET_MODE (target);
11535 enum machine_mode inner_mode = GET_MODE_INNER (mode);
11536 int n_elts = GET_MODE_NUNITS (mode);
11542 for (i = 0; i < n_elts; i++)
11544 rtx x = XVECEXP (vals, 0, i);
11545 if (!CONSTANT_P (x))
11548 if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
11554 emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
11558 if (GET_MODE_SIZE (inner_mode) == GET_MODE_SIZE (mode))
11560 if (GET_MODE_SIZE (inner_mode) == 4)
11562 emit_move_insn (gen_lowpart (SImode, target),
11563 gen_lowpart (SImode, XVECEXP (vals, 0, 0)));
11566 else if (GET_MODE_SIZE (inner_mode) == 8)
11568 emit_move_insn (gen_lowpart (DImode, target),
11569 gen_lowpart (DImode, XVECEXP (vals, 0, 0)));
11573 else if (GET_MODE_SIZE (inner_mode) == GET_MODE_SIZE (word_mode)
11574 && GET_MODE_SIZE (mode) == 2 * GET_MODE_SIZE (word_mode))
11576 emit_move_insn (gen_highpart (word_mode, target),
11577 gen_lowpart (word_mode, XVECEXP (vals, 0, 0)));
11578 emit_move_insn (gen_lowpart (word_mode, target),
11579 gen_lowpart (word_mode, XVECEXP (vals, 0, 1)));
11583 if (all_same && GET_MODE_SIZE (mode) == 8)
11587 vector_init_bshuffle (target, XVECEXP (vals, 0, 0), mode, inner_mode);
11590 if (mode == V8QImode)
11592 vector_init_fpmerge (target, XVECEXP (vals, 0, 0), inner_mode);
11595 if (mode == V4HImode)
11597 vector_init_faligndata (target, XVECEXP (vals, 0, 0), inner_mode);
11602 mem = assign_stack_temp (mode, GET_MODE_SIZE (mode), 0);
11603 for (i = 0; i < n_elts; i++)
11604 emit_move_insn (adjust_address_nv (mem, inner_mode,
11605 i * GET_MODE_SIZE (inner_mode)),
11606 XVECEXP (vals, 0, i));
11607 emit_move_insn (target, mem);
11610 /* Implement TARGET_SECONDARY_RELOAD. */
11613 sparc_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
11614 enum machine_mode mode, secondary_reload_info *sri)
11616 enum reg_class rclass = (enum reg_class) rclass_i;
11618 sri->icode = CODE_FOR_nothing;
11619 sri->extra_cost = 0;
11621 /* We need a temporary when loading/storing a HImode/QImode value
11622 between memory and the FPU registers. This can happen when combine puts
11623 a paradoxical subreg in a float/fix conversion insn. */
11624 if (FP_REG_CLASS_P (rclass)
11625 && (mode == HImode || mode == QImode)
11626 && (GET_CODE (x) == MEM
11627 || ((GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
11628 && true_regnum (x) == -1)))
11629 return GENERAL_REGS;
11631 /* On 32-bit we need a temporary when loading/storing a DFmode value
11632 between unaligned memory and the upper FPU registers. */
11634 && rclass == EXTRA_FP_REGS
11636 && GET_CODE (x) == MEM
11637 && ! mem_min_alignment (x, 8))
11640 if (((TARGET_CM_MEDANY
11641 && symbolic_operand (x, mode))
11642 || (TARGET_CM_EMBMEDANY
11643 && text_segment_operand (x, mode)))
11647 sri->icode = direct_optab_handler (reload_in_optab, mode);
11649 sri->icode = direct_optab_handler (reload_out_optab, mode);
11653 if (TARGET_VIS3 && TARGET_ARCH32)
11655 int regno = true_regnum (x);
11657 /* When using VIS3 fp<-->int register moves, on 32-bit we have
11658 to move 8-byte values in 4-byte pieces. This only works via
11659 FP_REGS, and not via EXTRA_FP_REGS. Therefore if we try to
11660 move between EXTRA_FP_REGS and GENERAL_REGS, we will need
11661 an FP_REGS intermediate move. */
11662 if ((rclass == EXTRA_FP_REGS && SPARC_INT_REG_P (regno))
11663 || ((general_or_i64_p (rclass)
11664 || rclass == GENERAL_OR_FP_REGS)
11665 && SPARC_FP_REG_P (regno)))
11667 sri->extra_cost = 2;
11675 /* Emit code to conditionally move either OPERANDS[2] or OPERANDS[3] into
11676 OPERANDS[0] in MODE. OPERANDS[1] is the operator of the condition. */
11679 sparc_expand_conditional_move (enum machine_mode mode, rtx *operands)
11681 enum rtx_code rc = GET_CODE (operands[1]);
11682 enum machine_mode cmp_mode;
11683 rtx cc_reg, dst, cmp;
11686 if (GET_MODE (XEXP (cmp, 0)) == DImode && !TARGET_ARCH64)
11689 if (GET_MODE (XEXP (cmp, 0)) == TFmode && !TARGET_HARD_QUAD)
11690 cmp = sparc_emit_float_lib_cmp (XEXP (cmp, 0), XEXP (cmp, 1), rc);
11692 cmp_mode = GET_MODE (XEXP (cmp, 0));
11693 rc = GET_CODE (cmp);
11696 if (! rtx_equal_p (operands[2], dst)
11697 && ! rtx_equal_p (operands[3], dst))
11699 if (reg_overlap_mentioned_p (dst, cmp))
11700 dst = gen_reg_rtx (mode);
11702 emit_move_insn (dst, operands[3]);
11704 else if (operands[2] == dst)
11706 operands[2] = operands[3];
11708 if (GET_MODE_CLASS (cmp_mode) == MODE_FLOAT)
11709 rc = reverse_condition_maybe_unordered (rc);
11711 rc = reverse_condition (rc);
11714 if (XEXP (cmp, 1) == const0_rtx
11715 && GET_CODE (XEXP (cmp, 0)) == REG
11716 && cmp_mode == DImode
11717 && v9_regcmp_p (rc))
11718 cc_reg = XEXP (cmp, 0);
11720 cc_reg = gen_compare_reg_1 (rc, XEXP (cmp, 0), XEXP (cmp, 1));
11722 cmp = gen_rtx_fmt_ee (rc, GET_MODE (cc_reg), cc_reg, const0_rtx);
11724 emit_insn (gen_rtx_SET (VOIDmode, dst,
11725 gen_rtx_IF_THEN_ELSE (mode, cmp, operands[2], dst)));
11727 if (dst != operands[0])
11728 emit_move_insn (operands[0], dst);
11733 /* Emit code to conditionally move a combination of OPERANDS[1] and OPERANDS[2]
11734 into OPERANDS[0] in MODE, depending on the outcome of the comparison of
11735 OPERANDS[4] and OPERANDS[5]. OPERANDS[3] is the operator of the condition.
11736 FCODE is the machine code to be used for OPERANDS[3] and CCODE the machine
11737 code to be used for the condition mask. */
11740 sparc_expand_vcond (enum machine_mode mode, rtx *operands, int ccode, int fcode)
11742 rtx mask, cop0, cop1, fcmp, cmask, bshuf, gsr;
11743 enum rtx_code code = GET_CODE (operands[3]);
11745 mask = gen_reg_rtx (Pmode);
11746 cop0 = operands[4];
11747 cop1 = operands[5];
11748 if (code == LT || code == GE)
11752 code = swap_condition (code);
11753 t = cop0; cop0 = cop1; cop1 = t;
11756 gsr = gen_rtx_REG (DImode, SPARC_GSR_REG);
11758 fcmp = gen_rtx_UNSPEC (Pmode,
11759 gen_rtvec (1, gen_rtx_fmt_ee (code, mode, cop0, cop1)),
11762 cmask = gen_rtx_UNSPEC (DImode,
11763 gen_rtvec (2, mask, gsr),
11766 bshuf = gen_rtx_UNSPEC (mode,
11767 gen_rtvec (3, operands[1], operands[2], gsr),
11770 emit_insn (gen_rtx_SET (VOIDmode, mask, fcmp));
11771 emit_insn (gen_rtx_SET (VOIDmode, gsr, cmask));
11773 emit_insn (gen_rtx_SET (VOIDmode, operands[0], bshuf));
11776 /* On sparc, any mode which naturally allocates into the float
11777 registers should return 4 here. */
11780 sparc_regmode_natural_size (enum machine_mode mode)
11782 int size = UNITS_PER_WORD;
11786 enum mode_class mclass = GET_MODE_CLASS (mode);
11788 if (mclass == MODE_FLOAT || mclass == MODE_VECTOR_INT)
11795 /* Return TRUE if it is a good idea to tie two pseudo registers
11796 when one has mode MODE1 and one has mode MODE2.
11797 If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
11798 for any hard reg, then this must be FALSE for correct output.
11800 For V9 we have to deal with the fact that only the lower 32 floating
11801 point registers are 32-bit addressable. */
11804 sparc_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
11806 enum mode_class mclass1, mclass2;
11807 unsigned short size1, size2;
11809 if (mode1 == mode2)
11812 mclass1 = GET_MODE_CLASS (mode1);
11813 mclass2 = GET_MODE_CLASS (mode2);
11814 if (mclass1 != mclass2)
11820 /* Classes are the same and we are V9 so we have to deal with upper
11821 vs. lower floating point registers. If one of the modes is a
11822 4-byte mode, and the other is not, we have to mark them as not
11823 tieable because only the lower 32 floating point register are
11824 addressable 32-bits at a time.
11826 We can't just test explicitly for SFmode, otherwise we won't
11827 cover the vector mode cases properly. */
11829 if (mclass1 != MODE_FLOAT && mclass1 != MODE_VECTOR_INT)
11832 size1 = GET_MODE_SIZE (mode1);
11833 size2 = GET_MODE_SIZE (mode2);
11834 if ((size1 > 4 && size2 == 4)
11835 || (size2 > 4 && size1 == 4))
11841 #include "gt-sparc.h"