1 /* Subroutines for insn-output.c for SPARC.
2 Copyright (C) 1987-2013 Free Software Foundation, Inc.
3 Contributed by Michael Tiemann (tiemann@cygnus.com)
4 64-bit SPARC-V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
25 #include "coretypes.h"
30 #include "hard-reg-set.h"
31 #include "insn-config.h"
32 #include "insn-codes.h"
33 #include "conditions.h"
35 #include "insn-attr.h"
42 #include "diagnostic-core.h"
47 #include "target-def.h"
48 #include "common/common-target.h"
51 #include "langhooks.h"
56 #include "tree-pass.h"
61 struct processor_costs {
65 /* Integer signed load */
68 /* Integer zeroed load */
74 /* fmov, fneg, fabs */
78 const int float_plusminus;
84 const int float_cmove;
90 const int float_div_sf;
93 const int float_div_df;
96 const int float_sqrt_sf;
99 const int float_sqrt_df;
107 /* integer multiply cost for each bit set past the most
108 significant 3, so the formula for multiply cost becomes:
111 highest_bit = highest_clear_bit(rs1);
113 highest_bit = highest_set_bit(rs1);
116 cost = int_mul{,X} + ((highest_bit - 3) / int_mul_bit_factor);
118 A value of zero indicates that the multiply costs is fixed,
120 const int int_mul_bit_factor;
131 /* penalty for shifts, due to scheduling rules etc. */
132 const int shift_penalty;
136 struct processor_costs cypress_costs = {
137 COSTS_N_INSNS (2), /* int load */
138 COSTS_N_INSNS (2), /* int signed load */
139 COSTS_N_INSNS (2), /* int zeroed load */
140 COSTS_N_INSNS (2), /* float load */
141 COSTS_N_INSNS (5), /* fmov, fneg, fabs */
142 COSTS_N_INSNS (5), /* fadd, fsub */
143 COSTS_N_INSNS (1), /* fcmp */
144 COSTS_N_INSNS (1), /* fmov, fmovr */
145 COSTS_N_INSNS (7), /* fmul */
146 COSTS_N_INSNS (37), /* fdivs */
147 COSTS_N_INSNS (37), /* fdivd */
148 COSTS_N_INSNS (63), /* fsqrts */
149 COSTS_N_INSNS (63), /* fsqrtd */
150 COSTS_N_INSNS (1), /* imul */
151 COSTS_N_INSNS (1), /* imulX */
152 0, /* imul bit factor */
153 COSTS_N_INSNS (1), /* idiv */
154 COSTS_N_INSNS (1), /* idivX */
155 COSTS_N_INSNS (1), /* movcc/movr */
156 0, /* shift penalty */
160 struct processor_costs supersparc_costs = {
161 COSTS_N_INSNS (1), /* int load */
162 COSTS_N_INSNS (1), /* int signed load */
163 COSTS_N_INSNS (1), /* int zeroed load */
164 COSTS_N_INSNS (0), /* float load */
165 COSTS_N_INSNS (3), /* fmov, fneg, fabs */
166 COSTS_N_INSNS (3), /* fadd, fsub */
167 COSTS_N_INSNS (3), /* fcmp */
168 COSTS_N_INSNS (1), /* fmov, fmovr */
169 COSTS_N_INSNS (3), /* fmul */
170 COSTS_N_INSNS (6), /* fdivs */
171 COSTS_N_INSNS (9), /* fdivd */
172 COSTS_N_INSNS (12), /* fsqrts */
173 COSTS_N_INSNS (12), /* fsqrtd */
174 COSTS_N_INSNS (4), /* imul */
175 COSTS_N_INSNS (4), /* imulX */
176 0, /* imul bit factor */
177 COSTS_N_INSNS (4), /* idiv */
178 COSTS_N_INSNS (4), /* idivX */
179 COSTS_N_INSNS (1), /* movcc/movr */
180 1, /* shift penalty */
184 struct processor_costs hypersparc_costs = {
185 COSTS_N_INSNS (1), /* int load */
186 COSTS_N_INSNS (1), /* int signed load */
187 COSTS_N_INSNS (1), /* int zeroed load */
188 COSTS_N_INSNS (1), /* float load */
189 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
190 COSTS_N_INSNS (1), /* fadd, fsub */
191 COSTS_N_INSNS (1), /* fcmp */
192 COSTS_N_INSNS (1), /* fmov, fmovr */
193 COSTS_N_INSNS (1), /* fmul */
194 COSTS_N_INSNS (8), /* fdivs */
195 COSTS_N_INSNS (12), /* fdivd */
196 COSTS_N_INSNS (17), /* fsqrts */
197 COSTS_N_INSNS (17), /* fsqrtd */
198 COSTS_N_INSNS (17), /* imul */
199 COSTS_N_INSNS (17), /* imulX */
200 0, /* imul bit factor */
201 COSTS_N_INSNS (17), /* idiv */
202 COSTS_N_INSNS (17), /* idivX */
203 COSTS_N_INSNS (1), /* movcc/movr */
204 0, /* shift penalty */
208 struct processor_costs leon_costs = {
209 COSTS_N_INSNS (1), /* int load */
210 COSTS_N_INSNS (1), /* int signed load */
211 COSTS_N_INSNS (1), /* int zeroed load */
212 COSTS_N_INSNS (1), /* float load */
213 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
214 COSTS_N_INSNS (1), /* fadd, fsub */
215 COSTS_N_INSNS (1), /* fcmp */
216 COSTS_N_INSNS (1), /* fmov, fmovr */
217 COSTS_N_INSNS (1), /* fmul */
218 COSTS_N_INSNS (15), /* fdivs */
219 COSTS_N_INSNS (15), /* fdivd */
220 COSTS_N_INSNS (23), /* fsqrts */
221 COSTS_N_INSNS (23), /* fsqrtd */
222 COSTS_N_INSNS (5), /* imul */
223 COSTS_N_INSNS (5), /* imulX */
224 0, /* imul bit factor */
225 COSTS_N_INSNS (5), /* idiv */
226 COSTS_N_INSNS (5), /* idivX */
227 COSTS_N_INSNS (1), /* movcc/movr */
228 0, /* shift penalty */
232 struct processor_costs leon3_costs = {
233 COSTS_N_INSNS (1), /* int load */
234 COSTS_N_INSNS (1), /* int signed load */
235 COSTS_N_INSNS (1), /* int zeroed load */
236 COSTS_N_INSNS (1), /* float load */
237 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
238 COSTS_N_INSNS (1), /* fadd, fsub */
239 COSTS_N_INSNS (1), /* fcmp */
240 COSTS_N_INSNS (1), /* fmov, fmovr */
241 COSTS_N_INSNS (1), /* fmul */
242 COSTS_N_INSNS (14), /* fdivs */
243 COSTS_N_INSNS (15), /* fdivd */
244 COSTS_N_INSNS (22), /* fsqrts */
245 COSTS_N_INSNS (23), /* fsqrtd */
246 COSTS_N_INSNS (5), /* imul */
247 COSTS_N_INSNS (5), /* imulX */
248 0, /* imul bit factor */
249 COSTS_N_INSNS (35), /* idiv */
250 COSTS_N_INSNS (35), /* idivX */
251 COSTS_N_INSNS (1), /* movcc/movr */
252 0, /* shift penalty */
256 struct processor_costs sparclet_costs = {
257 COSTS_N_INSNS (3), /* int load */
258 COSTS_N_INSNS (3), /* int signed load */
259 COSTS_N_INSNS (1), /* int zeroed load */
260 COSTS_N_INSNS (1), /* float load */
261 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
262 COSTS_N_INSNS (1), /* fadd, fsub */
263 COSTS_N_INSNS (1), /* fcmp */
264 COSTS_N_INSNS (1), /* fmov, fmovr */
265 COSTS_N_INSNS (1), /* fmul */
266 COSTS_N_INSNS (1), /* fdivs */
267 COSTS_N_INSNS (1), /* fdivd */
268 COSTS_N_INSNS (1), /* fsqrts */
269 COSTS_N_INSNS (1), /* fsqrtd */
270 COSTS_N_INSNS (5), /* imul */
271 COSTS_N_INSNS (5), /* imulX */
272 0, /* imul bit factor */
273 COSTS_N_INSNS (5), /* idiv */
274 COSTS_N_INSNS (5), /* idivX */
275 COSTS_N_INSNS (1), /* movcc/movr */
276 0, /* shift penalty */
280 struct processor_costs ultrasparc_costs = {
281 COSTS_N_INSNS (2), /* int load */
282 COSTS_N_INSNS (3), /* int signed load */
283 COSTS_N_INSNS (2), /* int zeroed load */
284 COSTS_N_INSNS (2), /* float load */
285 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
286 COSTS_N_INSNS (4), /* fadd, fsub */
287 COSTS_N_INSNS (1), /* fcmp */
288 COSTS_N_INSNS (2), /* fmov, fmovr */
289 COSTS_N_INSNS (4), /* fmul */
290 COSTS_N_INSNS (13), /* fdivs */
291 COSTS_N_INSNS (23), /* fdivd */
292 COSTS_N_INSNS (13), /* fsqrts */
293 COSTS_N_INSNS (23), /* fsqrtd */
294 COSTS_N_INSNS (4), /* imul */
295 COSTS_N_INSNS (4), /* imulX */
296 2, /* imul bit factor */
297 COSTS_N_INSNS (37), /* idiv */
298 COSTS_N_INSNS (68), /* idivX */
299 COSTS_N_INSNS (2), /* movcc/movr */
300 2, /* shift penalty */
304 struct processor_costs ultrasparc3_costs = {
305 COSTS_N_INSNS (2), /* int load */
306 COSTS_N_INSNS (3), /* int signed load */
307 COSTS_N_INSNS (3), /* int zeroed load */
308 COSTS_N_INSNS (2), /* float load */
309 COSTS_N_INSNS (3), /* fmov, fneg, fabs */
310 COSTS_N_INSNS (4), /* fadd, fsub */
311 COSTS_N_INSNS (5), /* fcmp */
312 COSTS_N_INSNS (3), /* fmov, fmovr */
313 COSTS_N_INSNS (4), /* fmul */
314 COSTS_N_INSNS (17), /* fdivs */
315 COSTS_N_INSNS (20), /* fdivd */
316 COSTS_N_INSNS (20), /* fsqrts */
317 COSTS_N_INSNS (29), /* fsqrtd */
318 COSTS_N_INSNS (6), /* imul */
319 COSTS_N_INSNS (6), /* imulX */
320 0, /* imul bit factor */
321 COSTS_N_INSNS (40), /* idiv */
322 COSTS_N_INSNS (71), /* idivX */
323 COSTS_N_INSNS (2), /* movcc/movr */
324 0, /* shift penalty */
328 struct processor_costs niagara_costs = {
329 COSTS_N_INSNS (3), /* int load */
330 COSTS_N_INSNS (3), /* int signed load */
331 COSTS_N_INSNS (3), /* int zeroed load */
332 COSTS_N_INSNS (9), /* float load */
333 COSTS_N_INSNS (8), /* fmov, fneg, fabs */
334 COSTS_N_INSNS (8), /* fadd, fsub */
335 COSTS_N_INSNS (26), /* fcmp */
336 COSTS_N_INSNS (8), /* fmov, fmovr */
337 COSTS_N_INSNS (29), /* fmul */
338 COSTS_N_INSNS (54), /* fdivs */
339 COSTS_N_INSNS (83), /* fdivd */
340 COSTS_N_INSNS (100), /* fsqrts - not implemented in hardware */
341 COSTS_N_INSNS (100), /* fsqrtd - not implemented in hardware */
342 COSTS_N_INSNS (11), /* imul */
343 COSTS_N_INSNS (11), /* imulX */
344 0, /* imul bit factor */
345 COSTS_N_INSNS (72), /* idiv */
346 COSTS_N_INSNS (72), /* idivX */
347 COSTS_N_INSNS (1), /* movcc/movr */
348 0, /* shift penalty */
352 struct processor_costs niagara2_costs = {
353 COSTS_N_INSNS (3), /* int load */
354 COSTS_N_INSNS (3), /* int signed load */
355 COSTS_N_INSNS (3), /* int zeroed load */
356 COSTS_N_INSNS (3), /* float load */
357 COSTS_N_INSNS (6), /* fmov, fneg, fabs */
358 COSTS_N_INSNS (6), /* fadd, fsub */
359 COSTS_N_INSNS (6), /* fcmp */
360 COSTS_N_INSNS (6), /* fmov, fmovr */
361 COSTS_N_INSNS (6), /* fmul */
362 COSTS_N_INSNS (19), /* fdivs */
363 COSTS_N_INSNS (33), /* fdivd */
364 COSTS_N_INSNS (19), /* fsqrts */
365 COSTS_N_INSNS (33), /* fsqrtd */
366 COSTS_N_INSNS (5), /* imul */
367 COSTS_N_INSNS (5), /* imulX */
368 0, /* imul bit factor */
369 COSTS_N_INSNS (26), /* idiv, average of 12 - 41 cycle range */
370 COSTS_N_INSNS (26), /* idivX, average of 12 - 41 cycle range */
371 COSTS_N_INSNS (1), /* movcc/movr */
372 0, /* shift penalty */
376 struct processor_costs niagara3_costs = {
377 COSTS_N_INSNS (3), /* int load */
378 COSTS_N_INSNS (3), /* int signed load */
379 COSTS_N_INSNS (3), /* int zeroed load */
380 COSTS_N_INSNS (3), /* float load */
381 COSTS_N_INSNS (9), /* fmov, fneg, fabs */
382 COSTS_N_INSNS (9), /* fadd, fsub */
383 COSTS_N_INSNS (9), /* fcmp */
384 COSTS_N_INSNS (9), /* fmov, fmovr */
385 COSTS_N_INSNS (9), /* fmul */
386 COSTS_N_INSNS (23), /* fdivs */
387 COSTS_N_INSNS (37), /* fdivd */
388 COSTS_N_INSNS (23), /* fsqrts */
389 COSTS_N_INSNS (37), /* fsqrtd */
390 COSTS_N_INSNS (9), /* imul */
391 COSTS_N_INSNS (9), /* imulX */
392 0, /* imul bit factor */
393 COSTS_N_INSNS (31), /* idiv, average of 17 - 45 cycle range */
394 COSTS_N_INSNS (30), /* idivX, average of 16 - 44 cycle range */
395 COSTS_N_INSNS (1), /* movcc/movr */
396 0, /* shift penalty */
400 struct processor_costs niagara4_costs = {
401 COSTS_N_INSNS (5), /* int load */
402 COSTS_N_INSNS (5), /* int signed load */
403 COSTS_N_INSNS (5), /* int zeroed load */
404 COSTS_N_INSNS (5), /* float load */
405 COSTS_N_INSNS (11), /* fmov, fneg, fabs */
406 COSTS_N_INSNS (11), /* fadd, fsub */
407 COSTS_N_INSNS (11), /* fcmp */
408 COSTS_N_INSNS (11), /* fmov, fmovr */
409 COSTS_N_INSNS (11), /* fmul */
410 COSTS_N_INSNS (24), /* fdivs */
411 COSTS_N_INSNS (37), /* fdivd */
412 COSTS_N_INSNS (24), /* fsqrts */
413 COSTS_N_INSNS (37), /* fsqrtd */
414 COSTS_N_INSNS (12), /* imul */
415 COSTS_N_INSNS (12), /* imulX */
416 0, /* imul bit factor */
417 COSTS_N_INSNS (50), /* idiv, average of 41 - 60 cycle range */
418 COSTS_N_INSNS (35), /* idivX, average of 26 - 44 cycle range */
419 COSTS_N_INSNS (1), /* movcc/movr */
420 0, /* shift penalty */
423 static const struct processor_costs *sparc_costs = &cypress_costs;
425 #ifdef HAVE_AS_RELAX_OPTION
426 /* If 'as' and 'ld' are relaxing tail call insns into branch always, use
427 "or %o7,%g0,X; call Y; or X,%g0,%o7" always, so that it can be optimized.
428 With sethi/jmp, neither 'as' nor 'ld' has an easy way how to find out if
429 somebody does not branch between the sethi and jmp. */
430 #define LEAF_SIBCALL_SLOT_RESERVED_P 1
432 #define LEAF_SIBCALL_SLOT_RESERVED_P \
433 ((TARGET_ARCH64 && !TARGET_CM_MEDLOW) || flag_pic)
436 /* Vector to say how input registers are mapped to output registers.
437 HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
438 eliminate it. You must use -fomit-frame-pointer to get that. */
439 char leaf_reg_remap[] =
440 { 0, 1, 2, 3, 4, 5, 6, 7,
441 -1, -1, -1, -1, -1, -1, 14, -1,
442 -1, -1, -1, -1, -1, -1, -1, -1,
443 8, 9, 10, 11, 12, 13, -1, 15,
445 32, 33, 34, 35, 36, 37, 38, 39,
446 40, 41, 42, 43, 44, 45, 46, 47,
447 48, 49, 50, 51, 52, 53, 54, 55,
448 56, 57, 58, 59, 60, 61, 62, 63,
449 64, 65, 66, 67, 68, 69, 70, 71,
450 72, 73, 74, 75, 76, 77, 78, 79,
451 80, 81, 82, 83, 84, 85, 86, 87,
452 88, 89, 90, 91, 92, 93, 94, 95,
453 96, 97, 98, 99, 100, 101, 102};
455 /* Vector, indexed by hard register number, which contains 1
456 for a register that is allowable in a candidate for leaf
457 function treatment. */
458 char sparc_leaf_regs[] =
459 { 1, 1, 1, 1, 1, 1, 1, 1,
460 0, 0, 0, 0, 0, 0, 1, 0,
461 0, 0, 0, 0, 0, 0, 0, 0,
462 1, 1, 1, 1, 1, 1, 0, 1,
463 1, 1, 1, 1, 1, 1, 1, 1,
464 1, 1, 1, 1, 1, 1, 1, 1,
465 1, 1, 1, 1, 1, 1, 1, 1,
466 1, 1, 1, 1, 1, 1, 1, 1,
467 1, 1, 1, 1, 1, 1, 1, 1,
468 1, 1, 1, 1, 1, 1, 1, 1,
469 1, 1, 1, 1, 1, 1, 1, 1,
470 1, 1, 1, 1, 1, 1, 1, 1,
471 1, 1, 1, 1, 1, 1, 1};
473 struct GTY(()) machine_function
475 /* Size of the frame of the function. */
476 HOST_WIDE_INT frame_size;
478 /* Size of the frame of the function minus the register window save area
479 and the outgoing argument area. */
480 HOST_WIDE_INT apparent_frame_size;
482 /* Register we pretend the frame pointer is allocated to. Normally, this
483 is %fp, but if we are in a leaf procedure, this is (%sp + offset). We
484 record "offset" separately as it may be too big for (reg + disp). */
486 HOST_WIDE_INT frame_base_offset;
488 /* Some local-dynamic TLS symbol name. */
489 const char *some_ld_name;
491 /* Number of global or FP registers to be saved (as 4-byte quantities). */
492 int n_global_fp_regs;
494 /* True if the current function is leaf and uses only leaf regs,
495 so that the SPARC leaf function optimization can be applied.
496 Private version of crtl->uses_only_leaf_regs, see
497 sparc_expand_prologue for the rationale. */
500 /* True if the prologue saves local or in registers. */
501 bool save_local_in_regs_p;
503 /* True if the data calculated by sparc_expand_prologue are valid. */
504 bool prologue_data_valid_p;
507 #define sparc_frame_size cfun->machine->frame_size
508 #define sparc_apparent_frame_size cfun->machine->apparent_frame_size
509 #define sparc_frame_base_reg cfun->machine->frame_base_reg
510 #define sparc_frame_base_offset cfun->machine->frame_base_offset
511 #define sparc_n_global_fp_regs cfun->machine->n_global_fp_regs
512 #define sparc_leaf_function_p cfun->machine->leaf_function_p
513 #define sparc_save_local_in_regs_p cfun->machine->save_local_in_regs_p
514 #define sparc_prologue_data_valid_p cfun->machine->prologue_data_valid_p
516 /* 1 if the next opcode is to be specially indented. */
517 int sparc_indent_opcode = 0;
519 static void sparc_option_override (void);
520 static void sparc_init_modes (void);
521 static void scan_record_type (const_tree, int *, int *, int *);
522 static int function_arg_slotno (const CUMULATIVE_ARGS *, enum machine_mode,
523 const_tree, bool, bool, int *, int *);
525 static int supersparc_adjust_cost (rtx, rtx, rtx, int);
526 static int hypersparc_adjust_cost (rtx, rtx, rtx, int);
528 static void sparc_emit_set_const32 (rtx, rtx);
529 static void sparc_emit_set_const64 (rtx, rtx);
530 static void sparc_output_addr_vec (rtx);
531 static void sparc_output_addr_diff_vec (rtx);
532 static void sparc_output_deferred_case_vectors (void);
533 static bool sparc_legitimate_address_p (enum machine_mode, rtx, bool);
534 static bool sparc_legitimate_constant_p (enum machine_mode, rtx);
535 static rtx sparc_builtin_saveregs (void);
536 static int epilogue_renumber (rtx *, int);
537 static bool sparc_assemble_integer (rtx, unsigned int, int);
538 static int set_extends (rtx);
539 static void sparc_asm_function_prologue (FILE *, HOST_WIDE_INT);
540 static void sparc_asm_function_epilogue (FILE *, HOST_WIDE_INT);
541 #ifdef TARGET_SOLARIS
542 static void sparc_solaris_elf_asm_named_section (const char *, unsigned int,
543 tree) ATTRIBUTE_UNUSED;
545 static int sparc_adjust_cost (rtx, rtx, rtx, int);
546 static int sparc_issue_rate (void);
547 static void sparc_sched_init (FILE *, int, int);
548 static int sparc_use_sched_lookahead (void);
550 static void emit_soft_tfmode_libcall (const char *, int, rtx *);
551 static void emit_soft_tfmode_binop (enum rtx_code, rtx *);
552 static void emit_soft_tfmode_unop (enum rtx_code, rtx *);
553 static void emit_soft_tfmode_cvt (enum rtx_code, rtx *);
554 static void emit_hard_tfmode_operation (enum rtx_code, rtx *);
556 static bool sparc_function_ok_for_sibcall (tree, tree);
557 static void sparc_init_libfuncs (void);
558 static void sparc_init_builtins (void);
559 static void sparc_vis_init_builtins (void);
560 static rtx sparc_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
561 static tree sparc_fold_builtin (tree, int, tree *, bool);
562 static int sparc_vis_mul8x16 (int, int);
563 static void sparc_handle_vis_mul8x16 (tree *, int, tree, tree, tree);
564 static void sparc_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
565 HOST_WIDE_INT, tree);
566 static bool sparc_can_output_mi_thunk (const_tree, HOST_WIDE_INT,
567 HOST_WIDE_INT, const_tree);
568 static struct machine_function * sparc_init_machine_status (void);
569 static bool sparc_cannot_force_const_mem (enum machine_mode, rtx);
570 static rtx sparc_tls_get_addr (void);
571 static rtx sparc_tls_got (void);
572 static const char *get_some_local_dynamic_name (void);
573 static int get_some_local_dynamic_name_1 (rtx *, void *);
574 static int sparc_register_move_cost (enum machine_mode,
575 reg_class_t, reg_class_t);
576 static bool sparc_rtx_costs (rtx, int, int, int, int *, bool);
577 static rtx sparc_function_value (const_tree, const_tree, bool);
578 static rtx sparc_libcall_value (enum machine_mode, const_rtx);
579 static bool sparc_function_value_regno_p (const unsigned int);
580 static rtx sparc_struct_value_rtx (tree, int);
581 static enum machine_mode sparc_promote_function_mode (const_tree, enum machine_mode,
582 int *, const_tree, int);
583 static bool sparc_return_in_memory (const_tree, const_tree);
584 static bool sparc_strict_argument_naming (cumulative_args_t);
585 static void sparc_va_start (tree, rtx);
586 static tree sparc_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
587 static bool sparc_vector_mode_supported_p (enum machine_mode);
588 static bool sparc_tls_referenced_p (rtx);
589 static rtx sparc_legitimize_tls_address (rtx);
590 static rtx sparc_legitimize_pic_address (rtx, rtx);
591 static rtx sparc_legitimize_address (rtx, rtx, enum machine_mode);
592 static rtx sparc_delegitimize_address (rtx);
593 static bool sparc_mode_dependent_address_p (const_rtx, addr_space_t);
594 static bool sparc_pass_by_reference (cumulative_args_t,
595 enum machine_mode, const_tree, bool);
596 static void sparc_function_arg_advance (cumulative_args_t,
597 enum machine_mode, const_tree, bool);
598 static rtx sparc_function_arg_1 (cumulative_args_t,
599 enum machine_mode, const_tree, bool, bool);
600 static rtx sparc_function_arg (cumulative_args_t,
601 enum machine_mode, const_tree, bool);
602 static rtx sparc_function_incoming_arg (cumulative_args_t,
603 enum machine_mode, const_tree, bool);
604 static unsigned int sparc_function_arg_boundary (enum machine_mode,
606 static int sparc_arg_partial_bytes (cumulative_args_t,
607 enum machine_mode, tree, bool);
608 static void sparc_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
609 static void sparc_file_end (void);
610 static bool sparc_frame_pointer_required (void);
611 static bool sparc_can_eliminate (const int, const int);
612 static rtx sparc_builtin_setjmp_frame_value (void);
613 static void sparc_conditional_register_usage (void);
614 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
615 static const char *sparc_mangle_type (const_tree);
617 static void sparc_trampoline_init (rtx, tree, rtx);
618 static enum machine_mode sparc_preferred_simd_mode (enum machine_mode);
619 static reg_class_t sparc_preferred_reload_class (rtx x, reg_class_t rclass);
620 static bool sparc_print_operand_punct_valid_p (unsigned char);
621 static void sparc_print_operand (FILE *, rtx, int);
622 static void sparc_print_operand_address (FILE *, rtx);
623 static reg_class_t sparc_secondary_reload (bool, rtx, reg_class_t,
625 secondary_reload_info *);
626 static enum machine_mode sparc_cstore_mode (enum insn_code icode);
628 #ifdef SUBTARGET_ATTRIBUTE_TABLE
629 /* Table of valid machine attributes. */
630 static const struct attribute_spec sparc_attribute_table[] =
632 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
634 SUBTARGET_ATTRIBUTE_TABLE,
635 { NULL, 0, 0, false, false, false, NULL, false }
639 /* Option handling. */
642 enum cmodel sparc_cmodel;
644 char sparc_hard_reg_printed[8];
646 /* Initialize the GCC target structure. */
648 /* The default is to use .half rather than .short for aligned HI objects. */
649 #undef TARGET_ASM_ALIGNED_HI_OP
650 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
652 #undef TARGET_ASM_UNALIGNED_HI_OP
653 #define TARGET_ASM_UNALIGNED_HI_OP "\t.uahalf\t"
654 #undef TARGET_ASM_UNALIGNED_SI_OP
655 #define TARGET_ASM_UNALIGNED_SI_OP "\t.uaword\t"
656 #undef TARGET_ASM_UNALIGNED_DI_OP
657 #define TARGET_ASM_UNALIGNED_DI_OP "\t.uaxword\t"
659 /* The target hook has to handle DI-mode values. */
660 #undef TARGET_ASM_INTEGER
661 #define TARGET_ASM_INTEGER sparc_assemble_integer
663 #undef TARGET_ASM_FUNCTION_PROLOGUE
664 #define TARGET_ASM_FUNCTION_PROLOGUE sparc_asm_function_prologue
665 #undef TARGET_ASM_FUNCTION_EPILOGUE
666 #define TARGET_ASM_FUNCTION_EPILOGUE sparc_asm_function_epilogue
668 #undef TARGET_SCHED_ADJUST_COST
669 #define TARGET_SCHED_ADJUST_COST sparc_adjust_cost
670 #undef TARGET_SCHED_ISSUE_RATE
671 #define TARGET_SCHED_ISSUE_RATE sparc_issue_rate
672 #undef TARGET_SCHED_INIT
673 #define TARGET_SCHED_INIT sparc_sched_init
674 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
675 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD sparc_use_sched_lookahead
677 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
678 #define TARGET_FUNCTION_OK_FOR_SIBCALL sparc_function_ok_for_sibcall
680 #undef TARGET_INIT_LIBFUNCS
681 #define TARGET_INIT_LIBFUNCS sparc_init_libfuncs
682 #undef TARGET_INIT_BUILTINS
683 #define TARGET_INIT_BUILTINS sparc_init_builtins
685 #undef TARGET_LEGITIMIZE_ADDRESS
686 #define TARGET_LEGITIMIZE_ADDRESS sparc_legitimize_address
687 #undef TARGET_DELEGITIMIZE_ADDRESS
688 #define TARGET_DELEGITIMIZE_ADDRESS sparc_delegitimize_address
689 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
690 #define TARGET_MODE_DEPENDENT_ADDRESS_P sparc_mode_dependent_address_p
692 #undef TARGET_EXPAND_BUILTIN
693 #define TARGET_EXPAND_BUILTIN sparc_expand_builtin
694 #undef TARGET_FOLD_BUILTIN
695 #define TARGET_FOLD_BUILTIN sparc_fold_builtin
698 #undef TARGET_HAVE_TLS
699 #define TARGET_HAVE_TLS true
702 #undef TARGET_CANNOT_FORCE_CONST_MEM
703 #define TARGET_CANNOT_FORCE_CONST_MEM sparc_cannot_force_const_mem
705 #undef TARGET_ASM_OUTPUT_MI_THUNK
706 #define TARGET_ASM_OUTPUT_MI_THUNK sparc_output_mi_thunk
707 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
708 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK sparc_can_output_mi_thunk
710 #undef TARGET_RTX_COSTS
711 #define TARGET_RTX_COSTS sparc_rtx_costs
712 #undef TARGET_ADDRESS_COST
713 #define TARGET_ADDRESS_COST hook_int_rtx_mode_as_bool_0
714 #undef TARGET_REGISTER_MOVE_COST
715 #define TARGET_REGISTER_MOVE_COST sparc_register_move_cost
717 #undef TARGET_PROMOTE_FUNCTION_MODE
718 #define TARGET_PROMOTE_FUNCTION_MODE sparc_promote_function_mode
720 #undef TARGET_FUNCTION_VALUE
721 #define TARGET_FUNCTION_VALUE sparc_function_value
722 #undef TARGET_LIBCALL_VALUE
723 #define TARGET_LIBCALL_VALUE sparc_libcall_value
724 #undef TARGET_FUNCTION_VALUE_REGNO_P
725 #define TARGET_FUNCTION_VALUE_REGNO_P sparc_function_value_regno_p
727 #undef TARGET_STRUCT_VALUE_RTX
728 #define TARGET_STRUCT_VALUE_RTX sparc_struct_value_rtx
729 #undef TARGET_RETURN_IN_MEMORY
730 #define TARGET_RETURN_IN_MEMORY sparc_return_in_memory
731 #undef TARGET_MUST_PASS_IN_STACK
732 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
733 #undef TARGET_PASS_BY_REFERENCE
734 #define TARGET_PASS_BY_REFERENCE sparc_pass_by_reference
735 #undef TARGET_ARG_PARTIAL_BYTES
736 #define TARGET_ARG_PARTIAL_BYTES sparc_arg_partial_bytes
737 #undef TARGET_FUNCTION_ARG_ADVANCE
738 #define TARGET_FUNCTION_ARG_ADVANCE sparc_function_arg_advance
739 #undef TARGET_FUNCTION_ARG
740 #define TARGET_FUNCTION_ARG sparc_function_arg
741 #undef TARGET_FUNCTION_INCOMING_ARG
742 #define TARGET_FUNCTION_INCOMING_ARG sparc_function_incoming_arg
743 #undef TARGET_FUNCTION_ARG_BOUNDARY
744 #define TARGET_FUNCTION_ARG_BOUNDARY sparc_function_arg_boundary
746 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
747 #define TARGET_EXPAND_BUILTIN_SAVEREGS sparc_builtin_saveregs
748 #undef TARGET_STRICT_ARGUMENT_NAMING
749 #define TARGET_STRICT_ARGUMENT_NAMING sparc_strict_argument_naming
751 #undef TARGET_EXPAND_BUILTIN_VA_START
752 #define TARGET_EXPAND_BUILTIN_VA_START sparc_va_start
753 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
754 #define TARGET_GIMPLIFY_VA_ARG_EXPR sparc_gimplify_va_arg
756 #undef TARGET_VECTOR_MODE_SUPPORTED_P
757 #define TARGET_VECTOR_MODE_SUPPORTED_P sparc_vector_mode_supported_p
759 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
760 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE sparc_preferred_simd_mode
762 #ifdef SUBTARGET_INSERT_ATTRIBUTES
763 #undef TARGET_INSERT_ATTRIBUTES
764 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
767 #ifdef SUBTARGET_ATTRIBUTE_TABLE
768 #undef TARGET_ATTRIBUTE_TABLE
769 #define TARGET_ATTRIBUTE_TABLE sparc_attribute_table
772 #undef TARGET_RELAXED_ORDERING
773 #define TARGET_RELAXED_ORDERING SPARC_RELAXED_ORDERING
775 #undef TARGET_OPTION_OVERRIDE
776 #define TARGET_OPTION_OVERRIDE sparc_option_override
778 #if TARGET_GNU_TLS && defined(HAVE_AS_SPARC_UA_PCREL)
779 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
780 #define TARGET_ASM_OUTPUT_DWARF_DTPREL sparc_output_dwarf_dtprel
783 #undef TARGET_ASM_FILE_END
784 #define TARGET_ASM_FILE_END sparc_file_end
786 #undef TARGET_FRAME_POINTER_REQUIRED
787 #define TARGET_FRAME_POINTER_REQUIRED sparc_frame_pointer_required
789 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
790 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE sparc_builtin_setjmp_frame_value
792 #undef TARGET_CAN_ELIMINATE
793 #define TARGET_CAN_ELIMINATE sparc_can_eliminate
795 #undef TARGET_PREFERRED_RELOAD_CLASS
796 #define TARGET_PREFERRED_RELOAD_CLASS sparc_preferred_reload_class
798 #undef TARGET_SECONDARY_RELOAD
799 #define TARGET_SECONDARY_RELOAD sparc_secondary_reload
801 #undef TARGET_CONDITIONAL_REGISTER_USAGE
802 #define TARGET_CONDITIONAL_REGISTER_USAGE sparc_conditional_register_usage
804 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
805 #undef TARGET_MANGLE_TYPE
806 #define TARGET_MANGLE_TYPE sparc_mangle_type
809 #undef TARGET_LEGITIMATE_ADDRESS_P
810 #define TARGET_LEGITIMATE_ADDRESS_P sparc_legitimate_address_p
812 #undef TARGET_LEGITIMATE_CONSTANT_P
813 #define TARGET_LEGITIMATE_CONSTANT_P sparc_legitimate_constant_p
815 #undef TARGET_TRAMPOLINE_INIT
816 #define TARGET_TRAMPOLINE_INIT sparc_trampoline_init
818 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
819 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P sparc_print_operand_punct_valid_p
820 #undef TARGET_PRINT_OPERAND
821 #define TARGET_PRINT_OPERAND sparc_print_operand
822 #undef TARGET_PRINT_OPERAND_ADDRESS
823 #define TARGET_PRINT_OPERAND_ADDRESS sparc_print_operand_address
825 /* The value stored by LDSTUB. */
826 #undef TARGET_ATOMIC_TEST_AND_SET_TRUEVAL
827 #define TARGET_ATOMIC_TEST_AND_SET_TRUEVAL 0xff
829 #undef TARGET_CSTORE_MODE
830 #define TARGET_CSTORE_MODE sparc_cstore_mode
832 struct gcc_target targetm = TARGET_INITIALIZER;
834 /* Return the memory reference contained in X if any, zero otherwise. */
839 if (GET_CODE (x) == SIGN_EXTEND || GET_CODE (x) == ZERO_EXTEND)
848 /* We use a machine specific pass to enable workarounds for errata.
849 We need to have the (essentially) final form of the insn stream in order
850 to properly detect the various hazards. Therefore, this machine specific
851 pass runs as late as possible. The pass is inserted in the pass pipeline
852 at the end of sparc_option_override. */
855 sparc_gate_work_around_errata (void)
857 /* The only errata we handle are those of the AT697F and UT699. */
858 return sparc_fix_at697f != 0 || sparc_fix_ut699 != 0;
862 sparc_do_work_around_errata (void)
866 /* Force all instructions to be split into their final form. */
867 split_all_insns_noflow ();
869 /* Now look for specific patterns in the insn stream. */
870 for (insn = get_insns (); insn; insn = next)
872 bool insert_nop = false;
875 /* Look into the instruction in a delay slot. */
876 if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
877 insn = XVECEXP (PATTERN (insn), 0, 1);
879 /* Look for a single-word load into an odd-numbered FP register. */
881 && NONJUMP_INSN_P (insn)
882 && (set = single_set (insn)) != NULL_RTX
883 && GET_MODE_SIZE (GET_MODE (SET_SRC (set))) == 4
884 && MEM_P (SET_SRC (set))
885 && REG_P (SET_DEST (set))
886 && REGNO (SET_DEST (set)) > 31
887 && REGNO (SET_DEST (set)) % 2 != 0)
889 /* The wrong dependency is on the enclosing double register. */
890 unsigned int x = REGNO (SET_DEST (set)) - 1;
891 unsigned int src1, src2, dest;
894 /* If the insn has a delay slot, then it cannot be problematic. */
895 next = next_active_insn (insn);
898 if (NONJUMP_INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE)
902 code = INSN_CODE (next);
906 case CODE_FOR_adddf3:
907 case CODE_FOR_subdf3:
908 case CODE_FOR_muldf3:
909 case CODE_FOR_divdf3:
910 dest = REGNO (recog_data.operand[0]);
911 src1 = REGNO (recog_data.operand[1]);
912 src2 = REGNO (recog_data.operand[2]);
917 FPOPd %f{x,y}, %f{y,x}, %f{x,y} */
918 if ((src1 == x || src2 == x)
919 && (dest == src1 || dest == src2))
926 FPOPd %fx, %fx, %fx */
929 && (code == CODE_FOR_adddf3 || code == CODE_FOR_muldf3))
934 case CODE_FOR_sqrtdf2:
935 dest = REGNO (recog_data.operand[0]);
936 src1 = REGNO (recog_data.operand[1]);
940 if (src1 == x && dest == src1)
949 /* Look for a single-word load into an integer register. */
950 else if (sparc_fix_ut699
951 && NONJUMP_INSN_P (insn)
952 && (set = single_set (insn)) != NULL_RTX
953 && GET_MODE_SIZE (GET_MODE (SET_SRC (set))) <= 4
954 && mem_ref (SET_SRC (set)) != NULL_RTX
955 && REG_P (SET_DEST (set))
956 && REGNO (SET_DEST (set)) < 32)
958 /* There is no problem if the second memory access has a data
959 dependency on the first single-cycle load. */
960 rtx x = SET_DEST (set);
962 /* If the insn has a delay slot, then it cannot be problematic. */
963 next = next_active_insn (insn);
966 if (NONJUMP_INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE)
969 /* Look for a second memory access to/from an integer register. */
970 if ((set = single_set (next)) != NULL_RTX)
972 rtx src = SET_SRC (set);
973 rtx dest = SET_DEST (set);
976 /* LDD is affected. */
977 if ((mem = mem_ref (src)) != NULL_RTX
980 && !reg_mentioned_p (x, XEXP (mem, 0)))
983 /* STD is *not* affected. */
984 else if ((mem = mem_ref (dest)) != NULL_RTX
985 && GET_MODE_SIZE (GET_MODE (mem)) <= 4
986 && (src == const0_rtx
989 && REGNO (src) != REGNO (x)))
990 && !reg_mentioned_p (x, XEXP (mem, 0)))
996 next = NEXT_INSN (insn);
999 emit_insn_before (gen_nop (), next);
1007 const pass_data pass_data_work_around_errata =
1009 RTL_PASS, /* type */
1010 "errata", /* name */
1011 OPTGROUP_NONE, /* optinfo_flags */
1012 true, /* has_gate */
1013 true, /* has_execute */
1014 TV_MACH_DEP, /* tv_id */
1015 0, /* properties_required */
1016 0, /* properties_provided */
1017 0, /* properties_destroyed */
1018 0, /* todo_flags_start */
1019 TODO_verify_rtl_sharing, /* todo_flags_finish */
1022 class pass_work_around_errata : public rtl_opt_pass
1025 pass_work_around_errata(gcc::context *ctxt)
1026 : rtl_opt_pass(pass_data_work_around_errata, ctxt)
1029 /* opt_pass methods: */
1030 bool gate () { return sparc_gate_work_around_errata (); }
1031 unsigned int execute () { return sparc_do_work_around_errata (); }
1033 }; // class pass_work_around_errata
1038 make_pass_work_around_errata (gcc::context *ctxt)
1040 return new pass_work_around_errata (ctxt);
1043 /* Helpers for TARGET_DEBUG_OPTIONS. */
1045 dump_target_flag_bits (const int flags)
1047 if (flags & MASK_64BIT)
1048 fprintf (stderr, "64BIT ");
1049 if (flags & MASK_APP_REGS)
1050 fprintf (stderr, "APP_REGS ");
1051 if (flags & MASK_FASTER_STRUCTS)
1052 fprintf (stderr, "FASTER_STRUCTS ");
1053 if (flags & MASK_FLAT)
1054 fprintf (stderr, "FLAT ");
1055 if (flags & MASK_FMAF)
1056 fprintf (stderr, "FMAF ");
1057 if (flags & MASK_FPU)
1058 fprintf (stderr, "FPU ");
1059 if (flags & MASK_HARD_QUAD)
1060 fprintf (stderr, "HARD_QUAD ");
1061 if (flags & MASK_POPC)
1062 fprintf (stderr, "POPC ");
1063 if (flags & MASK_PTR64)
1064 fprintf (stderr, "PTR64 ");
1065 if (flags & MASK_STACK_BIAS)
1066 fprintf (stderr, "STACK_BIAS ");
1067 if (flags & MASK_UNALIGNED_DOUBLES)
1068 fprintf (stderr, "UNALIGNED_DOUBLES ");
1069 if (flags & MASK_V8PLUS)
1070 fprintf (stderr, "V8PLUS ");
1071 if (flags & MASK_VIS)
1072 fprintf (stderr, "VIS ");
1073 if (flags & MASK_VIS2)
1074 fprintf (stderr, "VIS2 ");
1075 if (flags & MASK_VIS3)
1076 fprintf (stderr, "VIS3 ");
1077 if (flags & MASK_CBCOND)
1078 fprintf (stderr, "CBCOND ");
1079 if (flags & MASK_DEPRECATED_V8_INSNS)
1080 fprintf (stderr, "DEPRECATED_V8_INSNS ");
1081 if (flags & MASK_SPARCLET)
1082 fprintf (stderr, "SPARCLET ");
1083 if (flags & MASK_SPARCLITE)
1084 fprintf (stderr, "SPARCLITE ");
1085 if (flags & MASK_V8)
1086 fprintf (stderr, "V8 ");
1087 if (flags & MASK_V9)
1088 fprintf (stderr, "V9 ");
1092 dump_target_flags (const char *prefix, const int flags)
1094 fprintf (stderr, "%s: (%08x) [ ", prefix, flags);
1095 dump_target_flag_bits (flags);
1096 fprintf(stderr, "]\n");
1099 /* Validate and override various options, and do some machine dependent
1103 sparc_option_override (void)
1105 static struct code_model {
1106 const char *const name;
1107 const enum cmodel value;
1108 } const cmodels[] = {
1110 { "medlow", CM_MEDLOW },
1111 { "medmid", CM_MEDMID },
1112 { "medany", CM_MEDANY },
1113 { "embmedany", CM_EMBMEDANY },
1114 { NULL, (enum cmodel) 0 }
1116 const struct code_model *cmodel;
1117 /* Map TARGET_CPU_DEFAULT to value for -m{cpu,tune}=. */
1118 static struct cpu_default {
1120 const enum processor_type processor;
1121 } const cpu_default[] = {
1122 /* There must be one entry here for each TARGET_CPU value. */
1123 { TARGET_CPU_sparc, PROCESSOR_CYPRESS },
1124 { TARGET_CPU_v8, PROCESSOR_V8 },
1125 { TARGET_CPU_supersparc, PROCESSOR_SUPERSPARC },
1126 { TARGET_CPU_hypersparc, PROCESSOR_HYPERSPARC },
1127 { TARGET_CPU_leon, PROCESSOR_LEON },
1128 { TARGET_CPU_leon3, PROCESSOR_LEON3 },
1129 { TARGET_CPU_sparclite, PROCESSOR_F930 },
1130 { TARGET_CPU_sparclite86x, PROCESSOR_SPARCLITE86X },
1131 { TARGET_CPU_sparclet, PROCESSOR_TSC701 },
1132 { TARGET_CPU_v9, PROCESSOR_V9 },
1133 { TARGET_CPU_ultrasparc, PROCESSOR_ULTRASPARC },
1134 { TARGET_CPU_ultrasparc3, PROCESSOR_ULTRASPARC3 },
1135 { TARGET_CPU_niagara, PROCESSOR_NIAGARA },
1136 { TARGET_CPU_niagara2, PROCESSOR_NIAGARA2 },
1137 { TARGET_CPU_niagara3, PROCESSOR_NIAGARA3 },
1138 { TARGET_CPU_niagara4, PROCESSOR_NIAGARA4 },
1139 { -1, PROCESSOR_V7 }
1141 const struct cpu_default *def;
1142 /* Table of values for -m{cpu,tune}=. This must match the order of
1143 the enum processor_type in sparc-opts.h. */
1144 static struct cpu_table {
1145 const char *const name;
1148 } const cpu_table[] = {
1149 { "v7", MASK_ISA, 0 },
1150 { "cypress", MASK_ISA, 0 },
1151 { "v8", MASK_ISA, MASK_V8 },
1152 /* TI TMS390Z55 supersparc */
1153 { "supersparc", MASK_ISA, MASK_V8 },
1154 { "hypersparc", MASK_ISA, MASK_V8|MASK_FPU },
1155 { "leon", MASK_ISA, MASK_V8|MASK_LEON|MASK_FPU },
1156 { "leon3", MASK_ISA, MASK_V8|MASK_LEON3|MASK_FPU },
1157 { "sparclite", MASK_ISA, MASK_SPARCLITE },
1158 /* The Fujitsu MB86930 is the original sparclite chip, with no FPU. */
1159 { "f930", MASK_ISA|MASK_FPU, MASK_SPARCLITE },
1160 /* The Fujitsu MB86934 is the recent sparclite chip, with an FPU. */
1161 { "f934", MASK_ISA, MASK_SPARCLITE|MASK_FPU },
1162 { "sparclite86x", MASK_ISA|MASK_FPU, MASK_SPARCLITE },
1163 { "sparclet", MASK_ISA, MASK_SPARCLET },
1164 /* TEMIC sparclet */
1165 { "tsc701", MASK_ISA, MASK_SPARCLET },
1166 { "v9", MASK_ISA, MASK_V9 },
1167 /* UltraSPARC I, II, IIi */
1168 { "ultrasparc", MASK_ISA,
1169 /* Although insns using %y are deprecated, it is a clear win. */
1170 MASK_V9|MASK_DEPRECATED_V8_INSNS },
1171 /* UltraSPARC III */
1172 /* ??? Check if %y issue still holds true. */
1173 { "ultrasparc3", MASK_ISA,
1174 MASK_V9|MASK_DEPRECATED_V8_INSNS|MASK_VIS2 },
1176 { "niagara", MASK_ISA,
1177 MASK_V9|MASK_DEPRECATED_V8_INSNS },
1179 { "niagara2", MASK_ISA,
1180 MASK_V9|MASK_POPC|MASK_VIS2 },
1182 { "niagara3", MASK_ISA,
1183 MASK_V9|MASK_POPC|MASK_VIS2|MASK_VIS3|MASK_FMAF },
1185 { "niagara4", MASK_ISA,
1186 MASK_V9|MASK_POPC|MASK_VIS2|MASK_VIS3|MASK_FMAF|MASK_CBCOND },
1188 const struct cpu_table *cpu;
1192 if (sparc_debug_string != NULL)
1197 p = ASTRDUP (sparc_debug_string);
1198 while ((q = strtok (p, ",")) != NULL)
1212 if (! strcmp (q, "all"))
1213 mask = MASK_DEBUG_ALL;
1214 else if (! strcmp (q, "options"))
1215 mask = MASK_DEBUG_OPTIONS;
1217 error ("unknown -mdebug-%s switch", q);
1220 sparc_debug &= ~mask;
1222 sparc_debug |= mask;
1226 if (TARGET_DEBUG_OPTIONS)
1228 dump_target_flags("Initial target_flags", target_flags);
1229 dump_target_flags("target_flags_explicit", target_flags_explicit);
1232 #ifdef SUBTARGET_OVERRIDE_OPTIONS
1233 SUBTARGET_OVERRIDE_OPTIONS;
1236 #ifndef SPARC_BI_ARCH
1237 /* Check for unsupported architecture size. */
1238 if (! TARGET_64BIT != DEFAULT_ARCH32_P)
1239 error ("%s is not supported by this configuration",
1240 DEFAULT_ARCH32_P ? "-m64" : "-m32");
1243 /* We force all 64bit archs to use 128 bit long double */
1244 if (TARGET_64BIT && ! TARGET_LONG_DOUBLE_128)
1246 error ("-mlong-double-64 not allowed with -m64");
1247 target_flags |= MASK_LONG_DOUBLE_128;
1250 /* Code model selection. */
1251 sparc_cmodel = SPARC_DEFAULT_CMODEL;
1253 #ifdef SPARC_BI_ARCH
1255 sparc_cmodel = CM_32;
1258 if (sparc_cmodel_string != NULL)
1262 for (cmodel = &cmodels[0]; cmodel->name; cmodel++)
1263 if (strcmp (sparc_cmodel_string, cmodel->name) == 0)
1265 if (cmodel->name == NULL)
1266 error ("bad value (%s) for -mcmodel= switch", sparc_cmodel_string);
1268 sparc_cmodel = cmodel->value;
1271 error ("-mcmodel= is not supported on 32 bit systems");
1274 /* Check that -fcall-saved-REG wasn't specified for out registers. */
1275 for (i = 8; i < 16; i++)
1276 if (!call_used_regs [i])
1278 error ("-fcall-saved-REG is not supported for out registers");
1279 call_used_regs [i] = 1;
1282 fpu = target_flags & MASK_FPU; /* save current -mfpu status */
1284 /* Set the default CPU. */
1285 if (!global_options_set.x_sparc_cpu_and_features)
1287 for (def = &cpu_default[0]; def->cpu != -1; ++def)
1288 if (def->cpu == TARGET_CPU_DEFAULT)
1290 gcc_assert (def->cpu != -1);
1291 sparc_cpu_and_features = def->processor;
1294 if (!global_options_set.x_sparc_cpu)
1295 sparc_cpu = sparc_cpu_and_features;
1297 cpu = &cpu_table[(int) sparc_cpu_and_features];
1299 if (TARGET_DEBUG_OPTIONS)
1301 fprintf (stderr, "sparc_cpu_and_features: %s\n", cpu->name);
1302 fprintf (stderr, "sparc_cpu: %s\n",
1303 cpu_table[(int) sparc_cpu].name);
1304 dump_target_flags ("cpu->disable", cpu->disable);
1305 dump_target_flags ("cpu->enable", cpu->enable);
1308 target_flags &= ~cpu->disable;
1309 target_flags |= (cpu->enable
1310 #ifndef HAVE_AS_FMAF_HPC_VIS3
1311 & ~(MASK_FMAF | MASK_VIS3)
1313 #ifndef HAVE_AS_SPARC4
1316 #ifndef HAVE_AS_LEON
1317 & ~(MASK_LEON | MASK_LEON3)
1321 /* If -mfpu or -mno-fpu was explicitly used, don't override with
1322 the processor default. */
1323 if (target_flags_explicit & MASK_FPU)
1324 target_flags = (target_flags & ~MASK_FPU) | fpu;
1326 /* -mvis2 implies -mvis */
1328 target_flags |= MASK_VIS;
1330 /* -mvis3 implies -mvis2 and -mvis */
1332 target_flags |= MASK_VIS2 | MASK_VIS;
1334 /* Don't allow -mvis, -mvis2, -mvis3, or -mfmaf if FPU is
1337 target_flags &= ~(MASK_VIS | MASK_VIS2 | MASK_VIS3 | MASK_FMAF);
1339 /* -mvis assumes UltraSPARC+, so we are sure v9 instructions
1341 -m64 also implies v9. */
1342 if (TARGET_VIS || TARGET_ARCH64)
1344 target_flags |= MASK_V9;
1345 target_flags &= ~(MASK_V8 | MASK_SPARCLET | MASK_SPARCLITE);
1348 /* -mvis also implies -mv8plus on 32-bit */
1349 if (TARGET_VIS && ! TARGET_ARCH64)
1350 target_flags |= MASK_V8PLUS;
1352 /* Use the deprecated v8 insns for sparc64 in 32 bit mode. */
1353 if (TARGET_V9 && TARGET_ARCH32)
1354 target_flags |= MASK_DEPRECATED_V8_INSNS;
1356 /* V8PLUS requires V9, makes no sense in 64 bit mode. */
1357 if (! TARGET_V9 || TARGET_ARCH64)
1358 target_flags &= ~MASK_V8PLUS;
1360 /* Don't use stack biasing in 32 bit mode. */
1362 target_flags &= ~MASK_STACK_BIAS;
1364 /* Supply a default value for align_functions. */
1365 if (align_functions == 0
1366 && (sparc_cpu == PROCESSOR_ULTRASPARC
1367 || sparc_cpu == PROCESSOR_ULTRASPARC3
1368 || sparc_cpu == PROCESSOR_NIAGARA
1369 || sparc_cpu == PROCESSOR_NIAGARA2
1370 || sparc_cpu == PROCESSOR_NIAGARA3
1371 || sparc_cpu == PROCESSOR_NIAGARA4))
1372 align_functions = 32;
1374 /* Validate PCC_STRUCT_RETURN. */
1375 if (flag_pcc_struct_return == DEFAULT_PCC_STRUCT_RETURN)
1376 flag_pcc_struct_return = (TARGET_ARCH64 ? 0 : 1);
1378 /* Only use .uaxword when compiling for a 64-bit target. */
1380 targetm.asm_out.unaligned_op.di = NULL;
1382 /* Do various machine dependent initializations. */
1383 sparc_init_modes ();
1385 /* Set up function hooks. */
1386 init_machine_status = sparc_init_machine_status;
1391 case PROCESSOR_CYPRESS:
1392 sparc_costs = &cypress_costs;
1395 case PROCESSOR_SPARCLITE:
1396 case PROCESSOR_SUPERSPARC:
1397 sparc_costs = &supersparc_costs;
1399 case PROCESSOR_F930:
1400 case PROCESSOR_F934:
1401 case PROCESSOR_HYPERSPARC:
1402 case PROCESSOR_SPARCLITE86X:
1403 sparc_costs = &hypersparc_costs;
1405 case PROCESSOR_LEON:
1406 sparc_costs = &leon_costs;
1408 case PROCESSOR_LEON3:
1409 sparc_costs = &leon3_costs;
1411 case PROCESSOR_SPARCLET:
1412 case PROCESSOR_TSC701:
1413 sparc_costs = &sparclet_costs;
1416 case PROCESSOR_ULTRASPARC:
1417 sparc_costs = &ultrasparc_costs;
1419 case PROCESSOR_ULTRASPARC3:
1420 sparc_costs = &ultrasparc3_costs;
1422 case PROCESSOR_NIAGARA:
1423 sparc_costs = &niagara_costs;
1425 case PROCESSOR_NIAGARA2:
1426 sparc_costs = &niagara2_costs;
1428 case PROCESSOR_NIAGARA3:
1429 sparc_costs = &niagara3_costs;
1431 case PROCESSOR_NIAGARA4:
1432 sparc_costs = &niagara4_costs;
1434 case PROCESSOR_NATIVE:
1438 if (sparc_memory_model == SMM_DEFAULT)
1440 /* Choose the memory model for the operating system. */
1441 enum sparc_memory_model_type os_default = SUBTARGET_DEFAULT_MEMORY_MODEL;
1442 if (os_default != SMM_DEFAULT)
1443 sparc_memory_model = os_default;
1444 /* Choose the most relaxed model for the processor. */
1446 sparc_memory_model = SMM_RMO;
1447 else if (TARGET_LEON3)
1448 sparc_memory_model = SMM_TSO;
1449 else if (TARGET_LEON)
1450 sparc_memory_model = SMM_SC;
1452 sparc_memory_model = SMM_PSO;
1454 sparc_memory_model = SMM_SC;
1457 #ifdef TARGET_DEFAULT_LONG_DOUBLE_128
1458 if (!(target_flags_explicit & MASK_LONG_DOUBLE_128))
1459 target_flags |= MASK_LONG_DOUBLE_128;
1462 if (TARGET_DEBUG_OPTIONS)
1463 dump_target_flags ("Final target_flags", target_flags);
1465 maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
1466 ((sparc_cpu == PROCESSOR_ULTRASPARC
1467 || sparc_cpu == PROCESSOR_NIAGARA
1468 || sparc_cpu == PROCESSOR_NIAGARA2
1469 || sparc_cpu == PROCESSOR_NIAGARA3
1470 || sparc_cpu == PROCESSOR_NIAGARA4)
1472 : (sparc_cpu == PROCESSOR_ULTRASPARC3
1474 global_options.x_param_values,
1475 global_options_set.x_param_values);
1476 maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
1477 ((sparc_cpu == PROCESSOR_ULTRASPARC
1478 || sparc_cpu == PROCESSOR_ULTRASPARC3
1479 || sparc_cpu == PROCESSOR_NIAGARA
1480 || sparc_cpu == PROCESSOR_NIAGARA2
1481 || sparc_cpu == PROCESSOR_NIAGARA3
1482 || sparc_cpu == PROCESSOR_NIAGARA4)
1484 global_options.x_param_values,
1485 global_options_set.x_param_values);
1487 /* Disable save slot sharing for call-clobbered registers by default.
1488 The IRA sharing algorithm works on single registers only and this
1489 pessimizes for double floating-point registers. */
1490 if (!global_options_set.x_flag_ira_share_save_slots)
1491 flag_ira_share_save_slots = 0;
1493 /* We register a machine specific pass to work around errata, if any.
1494 The pass mut be scheduled as late as possible so that we have the
1495 (essentially) final form of the insn stream to work on.
1496 Registering the pass must be done at start up. It's convenient to
1498 opt_pass *errata_pass = make_pass_work_around_errata (g);
1499 struct register_pass_info insert_pass_work_around_errata =
1501 errata_pass, /* pass */
1502 "dbr", /* reference_pass_name */
1503 1, /* ref_pass_instance_number */
1504 PASS_POS_INSERT_AFTER /* po_op */
1506 register_pass (&insert_pass_work_around_errata);
1509 /* Miscellaneous utilities. */
1511 /* Nonzero if CODE, a comparison, is suitable for use in v9 conditional move
1512 or branch on register contents instructions. */
1515 v9_regcmp_p (enum rtx_code code)
1517 return (code == EQ || code == NE || code == GE || code == LT
1518 || code == LE || code == GT);
1521 /* Nonzero if OP is a floating point constant which can
1522 be loaded into an integer register using a single
1523 sethi instruction. */
1528 if (GET_CODE (op) == CONST_DOUBLE)
1533 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
1534 REAL_VALUE_TO_TARGET_SINGLE (r, i);
1535 return !SPARC_SIMM13_P (i) && SPARC_SETHI_P (i);
1541 /* Nonzero if OP is a floating point constant which can
1542 be loaded into an integer register using a single
1548 if (GET_CODE (op) == CONST_DOUBLE)
1553 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
1554 REAL_VALUE_TO_TARGET_SINGLE (r, i);
1555 return SPARC_SIMM13_P (i);
1561 /* Nonzero if OP is a floating point constant which can
1562 be loaded into an integer register using a high/losum
1563 instruction sequence. */
1566 fp_high_losum_p (rtx op)
1568 /* The constraints calling this should only be in
1569 SFmode move insns, so any constant which cannot
1570 be moved using a single insn will do. */
1571 if (GET_CODE (op) == CONST_DOUBLE)
1576 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
1577 REAL_VALUE_TO_TARGET_SINGLE (r, i);
1578 return !SPARC_SIMM13_P (i) && !SPARC_SETHI_P (i);
1584 /* Return true if the address of LABEL can be loaded by means of the
1585 mov{si,di}_pic_label_ref patterns in PIC mode. */
1588 can_use_mov_pic_label_ref (rtx label)
1590 /* VxWorks does not impose a fixed gap between segments; the run-time
1591 gap can be different from the object-file gap. We therefore can't
1592 assume X - _GLOBAL_OFFSET_TABLE_ is a link-time constant unless we
1593 are absolutely sure that X is in the same segment as the GOT.
1594 Unfortunately, the flexibility of linker scripts means that we
1595 can't be sure of that in general, so assume that GOT-relative
1596 accesses are never valid on VxWorks. */
1597 if (TARGET_VXWORKS_RTP)
1600 /* Similarly, if the label is non-local, it might end up being placed
1601 in a different section than the current one; now mov_pic_label_ref
1602 requires the label and the code to be in the same section. */
1603 if (LABEL_REF_NONLOCAL_P (label))
1606 /* Finally, if we are reordering basic blocks and partition into hot
1607 and cold sections, this might happen for any label. */
1608 if (flag_reorder_blocks_and_partition)
1614 /* Expand a move instruction. Return true if all work is done. */
1617 sparc_expand_move (enum machine_mode mode, rtx *operands)
1619 /* Handle sets of MEM first. */
1620 if (GET_CODE (operands[0]) == MEM)
1622 /* 0 is a register (or a pair of registers) on SPARC. */
1623 if (register_or_zero_operand (operands[1], mode))
1626 if (!reload_in_progress)
1628 operands[0] = validize_mem (operands[0]);
1629 operands[1] = force_reg (mode, operands[1]);
1633 /* Fixup TLS cases. */
1635 && CONSTANT_P (operands[1])
1636 && sparc_tls_referenced_p (operands [1]))
1638 operands[1] = sparc_legitimize_tls_address (operands[1]);
1642 /* Fixup PIC cases. */
1643 if (flag_pic && CONSTANT_P (operands[1]))
1645 if (pic_address_needs_scratch (operands[1]))
1646 operands[1] = sparc_legitimize_pic_address (operands[1], NULL_RTX);
1648 /* We cannot use the mov{si,di}_pic_label_ref patterns in all cases. */
1649 if (GET_CODE (operands[1]) == LABEL_REF
1650 && can_use_mov_pic_label_ref (operands[1]))
1654 emit_insn (gen_movsi_pic_label_ref (operands[0], operands[1]));
1660 gcc_assert (TARGET_ARCH64);
1661 emit_insn (gen_movdi_pic_label_ref (operands[0], operands[1]));
1666 if (symbolic_operand (operands[1], mode))
1669 = sparc_legitimize_pic_address (operands[1],
1671 ? operands[0] : NULL_RTX);
1676 /* If we are trying to toss an integer constant into FP registers,
1677 or loading a FP or vector constant, force it into memory. */
1678 if (CONSTANT_P (operands[1])
1679 && REG_P (operands[0])
1680 && (SPARC_FP_REG_P (REGNO (operands[0]))
1681 || SCALAR_FLOAT_MODE_P (mode)
1682 || VECTOR_MODE_P (mode)))
1684 /* emit_group_store will send such bogosity to us when it is
1685 not storing directly into memory. So fix this up to avoid
1686 crashes in output_constant_pool. */
1687 if (operands [1] == const0_rtx)
1688 operands[1] = CONST0_RTX (mode);
1690 /* We can clear or set to all-ones FP registers if TARGET_VIS, and
1691 always other regs. */
1692 if ((TARGET_VIS || REGNO (operands[0]) < SPARC_FIRST_FP_REG)
1693 && (const_zero_operand (operands[1], mode)
1694 || const_all_ones_operand (operands[1], mode)))
1697 if (REGNO (operands[0]) < SPARC_FIRST_FP_REG
1698 /* We are able to build any SF constant in integer registers
1699 with at most 2 instructions. */
1701 /* And any DF constant in integer registers. */
1703 && ! can_create_pseudo_p ())))
1706 operands[1] = force_const_mem (mode, operands[1]);
1707 if (!reload_in_progress)
1708 operands[1] = validize_mem (operands[1]);
1712 /* Accept non-constants and valid constants unmodified. */
1713 if (!CONSTANT_P (operands[1])
1714 || GET_CODE (operands[1]) == HIGH
1715 || input_operand (operands[1], mode))
1721 /* All QImode constants require only one insn, so proceed. */
1726 sparc_emit_set_const32 (operands[0], operands[1]);
1730 /* input_operand should have filtered out 32-bit mode. */
1731 sparc_emit_set_const64 (operands[0], operands[1]);
1737 /* TImode isn't available in 32-bit mode. */
1738 split_double (operands[1], &high, &low);
1739 emit_insn (gen_movdi (operand_subword (operands[0], 0, 0, TImode),
1741 emit_insn (gen_movdi (operand_subword (operands[0], 1, 0, TImode),
1753 /* Load OP1, a 32-bit constant, into OP0, a register.
1754 We know it can't be done in one insn when we get
1755 here, the move expander guarantees this. */
1758 sparc_emit_set_const32 (rtx op0, rtx op1)
1760 enum machine_mode mode = GET_MODE (op0);
1763 if (can_create_pseudo_p ())
1764 temp = gen_reg_rtx (mode);
1766 if (GET_CODE (op1) == CONST_INT)
1768 gcc_assert (!small_int_operand (op1, mode)
1769 && !const_high_operand (op1, mode));
1771 /* Emit them as real moves instead of a HIGH/LO_SUM,
1772 this way CSE can see everything and reuse intermediate
1773 values if it wants. */
1774 emit_insn (gen_rtx_SET (VOIDmode, temp,
1775 GEN_INT (INTVAL (op1)
1776 & ~(HOST_WIDE_INT)0x3ff)));
1778 emit_insn (gen_rtx_SET (VOIDmode,
1780 gen_rtx_IOR (mode, temp,
1781 GEN_INT (INTVAL (op1) & 0x3ff))));
1785 /* A symbol, emit in the traditional way. */
1786 emit_insn (gen_rtx_SET (VOIDmode, temp,
1787 gen_rtx_HIGH (mode, op1)));
1788 emit_insn (gen_rtx_SET (VOIDmode,
1789 op0, gen_rtx_LO_SUM (mode, temp, op1)));
1793 /* Load OP1, a symbolic 64-bit constant, into OP0, a DImode register.
1794 If TEMP is nonzero, we are forbidden to use any other scratch
1795 registers. Otherwise, we are allowed to generate them as needed.
1797 Note that TEMP may have TImode if the code model is TARGET_CM_MEDANY
1798 or TARGET_CM_EMBMEDANY (see the reload_indi and reload_outdi patterns). */
1801 sparc_emit_set_symbolic_const64 (rtx op0, rtx op1, rtx temp)
1803 rtx temp1, temp2, temp3, temp4, temp5;
1806 if (temp && GET_MODE (temp) == TImode)
1809 temp = gen_rtx_REG (DImode, REGNO (temp));
1812 /* SPARC-V9 code-model support. */
1813 switch (sparc_cmodel)
1816 /* The range spanned by all instructions in the object is less
1817 than 2^31 bytes (2GB) and the distance from any instruction
1818 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1819 than 2^31 bytes (2GB).
1821 The executable must be in the low 4TB of the virtual address
1824 sethi %hi(symbol), %temp1
1825 or %temp1, %lo(symbol), %reg */
1827 temp1 = temp; /* op0 is allowed. */
1829 temp1 = gen_reg_rtx (DImode);
1831 emit_insn (gen_rtx_SET (VOIDmode, temp1, gen_rtx_HIGH (DImode, op1)));
1832 emit_insn (gen_rtx_SET (VOIDmode, op0, gen_rtx_LO_SUM (DImode, temp1, op1)));
1836 /* The range spanned by all instructions in the object is less
1837 than 2^31 bytes (2GB) and the distance from any instruction
1838 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1839 than 2^31 bytes (2GB).
1841 The executable must be in the low 16TB of the virtual address
1844 sethi %h44(symbol), %temp1
1845 or %temp1, %m44(symbol), %temp2
1846 sllx %temp2, 12, %temp3
1847 or %temp3, %l44(symbol), %reg */
1852 temp3 = temp; /* op0 is allowed. */
1856 temp1 = gen_reg_rtx (DImode);
1857 temp2 = gen_reg_rtx (DImode);
1858 temp3 = gen_reg_rtx (DImode);
1861 emit_insn (gen_seth44 (temp1, op1));
1862 emit_insn (gen_setm44 (temp2, temp1, op1));
1863 emit_insn (gen_rtx_SET (VOIDmode, temp3,
1864 gen_rtx_ASHIFT (DImode, temp2, GEN_INT (12))));
1865 emit_insn (gen_setl44 (op0, temp3, op1));
1869 /* The range spanned by all instructions in the object is less
1870 than 2^31 bytes (2GB) and the distance from any instruction
1871 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1872 than 2^31 bytes (2GB).
1874 The executable can be placed anywhere in the virtual address
1877 sethi %hh(symbol), %temp1
1878 sethi %lm(symbol), %temp2
1879 or %temp1, %hm(symbol), %temp3
1880 sllx %temp3, 32, %temp4
1881 or %temp4, %temp2, %temp5
1882 or %temp5, %lo(symbol), %reg */
1885 /* It is possible that one of the registers we got for operands[2]
1886 might coincide with that of operands[0] (which is why we made
1887 it TImode). Pick the other one to use as our scratch. */
1888 if (rtx_equal_p (temp, op0))
1890 gcc_assert (ti_temp);
1891 temp = gen_rtx_REG (DImode, REGNO (temp) + 1);
1894 temp2 = temp; /* op0 is _not_ allowed, see above. */
1901 temp1 = gen_reg_rtx (DImode);
1902 temp2 = gen_reg_rtx (DImode);
1903 temp3 = gen_reg_rtx (DImode);
1904 temp4 = gen_reg_rtx (DImode);
1905 temp5 = gen_reg_rtx (DImode);
1908 emit_insn (gen_sethh (temp1, op1));
1909 emit_insn (gen_setlm (temp2, op1));
1910 emit_insn (gen_sethm (temp3, temp1, op1));
1911 emit_insn (gen_rtx_SET (VOIDmode, temp4,
1912 gen_rtx_ASHIFT (DImode, temp3, GEN_INT (32))));
1913 emit_insn (gen_rtx_SET (VOIDmode, temp5,
1914 gen_rtx_PLUS (DImode, temp4, temp2)));
1915 emit_insn (gen_setlo (op0, temp5, op1));
1919 /* Old old old backwards compatibility kruft here.
1920 Essentially it is MEDLOW with a fixed 64-bit
1921 virtual base added to all data segment addresses.
1922 Text-segment stuff is computed like MEDANY, we can't
1923 reuse the code above because the relocation knobs
1926 Data segment: sethi %hi(symbol), %temp1
1927 add %temp1, EMBMEDANY_BASE_REG, %temp2
1928 or %temp2, %lo(symbol), %reg */
1929 if (data_segment_operand (op1, GET_MODE (op1)))
1933 temp1 = temp; /* op0 is allowed. */
1938 temp1 = gen_reg_rtx (DImode);
1939 temp2 = gen_reg_rtx (DImode);
1942 emit_insn (gen_embmedany_sethi (temp1, op1));
1943 emit_insn (gen_embmedany_brsum (temp2, temp1));
1944 emit_insn (gen_embmedany_losum (op0, temp2, op1));
1947 /* Text segment: sethi %uhi(symbol), %temp1
1948 sethi %hi(symbol), %temp2
1949 or %temp1, %ulo(symbol), %temp3
1950 sllx %temp3, 32, %temp4
1951 or %temp4, %temp2, %temp5
1952 or %temp5, %lo(symbol), %reg */
1957 /* It is possible that one of the registers we got for operands[2]
1958 might coincide with that of operands[0] (which is why we made
1959 it TImode). Pick the other one to use as our scratch. */
1960 if (rtx_equal_p (temp, op0))
1962 gcc_assert (ti_temp);
1963 temp = gen_rtx_REG (DImode, REGNO (temp) + 1);
1966 temp2 = temp; /* op0 is _not_ allowed, see above. */
1973 temp1 = gen_reg_rtx (DImode);
1974 temp2 = gen_reg_rtx (DImode);
1975 temp3 = gen_reg_rtx (DImode);
1976 temp4 = gen_reg_rtx (DImode);
1977 temp5 = gen_reg_rtx (DImode);
1980 emit_insn (gen_embmedany_textuhi (temp1, op1));
1981 emit_insn (gen_embmedany_texthi (temp2, op1));
1982 emit_insn (gen_embmedany_textulo (temp3, temp1, op1));
1983 emit_insn (gen_rtx_SET (VOIDmode, temp4,
1984 gen_rtx_ASHIFT (DImode, temp3, GEN_INT (32))));
1985 emit_insn (gen_rtx_SET (VOIDmode, temp5,
1986 gen_rtx_PLUS (DImode, temp4, temp2)));
1987 emit_insn (gen_embmedany_textlo (op0, temp5, op1));
1996 #if HOST_BITS_PER_WIDE_INT == 32
1998 sparc_emit_set_const64 (rtx op0 ATTRIBUTE_UNUSED, rtx op1 ATTRIBUTE_UNUSED)
2003 /* These avoid problems when cross compiling. If we do not
2004 go through all this hair then the optimizer will see
2005 invalid REG_EQUAL notes or in some cases none at all. */
2006 static rtx gen_safe_HIGH64 (rtx, HOST_WIDE_INT);
2007 static rtx gen_safe_SET64 (rtx, HOST_WIDE_INT);
2008 static rtx gen_safe_OR64 (rtx, HOST_WIDE_INT);
2009 static rtx gen_safe_XOR64 (rtx, HOST_WIDE_INT);
2011 /* The optimizer is not to assume anything about exactly
2012 which bits are set for a HIGH, they are unspecified.
2013 Unfortunately this leads to many missed optimizations
2014 during CSE. We mask out the non-HIGH bits, and matches
2015 a plain movdi, to alleviate this problem. */
2017 gen_safe_HIGH64 (rtx dest, HOST_WIDE_INT val)
2019 return gen_rtx_SET (VOIDmode, dest, GEN_INT (val & ~(HOST_WIDE_INT)0x3ff));
2023 gen_safe_SET64 (rtx dest, HOST_WIDE_INT val)
2025 return gen_rtx_SET (VOIDmode, dest, GEN_INT (val));
2029 gen_safe_OR64 (rtx src, HOST_WIDE_INT val)
2031 return gen_rtx_IOR (DImode, src, GEN_INT (val));
2035 gen_safe_XOR64 (rtx src, HOST_WIDE_INT val)
2037 return gen_rtx_XOR (DImode, src, GEN_INT (val));
2040 /* Worker routines for 64-bit constant formation on arch64.
2041 One of the key things to be doing in these emissions is
2042 to create as many temp REGs as possible. This makes it
2043 possible for half-built constants to be used later when
2044 such values are similar to something required later on.
2045 Without doing this, the optimizer cannot see such
2048 static void sparc_emit_set_const64_quick1 (rtx, rtx,
2049 unsigned HOST_WIDE_INT, int);
2052 sparc_emit_set_const64_quick1 (rtx op0, rtx temp,
2053 unsigned HOST_WIDE_INT low_bits, int is_neg)
2055 unsigned HOST_WIDE_INT high_bits;
2058 high_bits = (~low_bits) & 0xffffffff;
2060 high_bits = low_bits;
2062 emit_insn (gen_safe_HIGH64 (temp, high_bits));
2065 emit_insn (gen_rtx_SET (VOIDmode, op0,
2066 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
2070 /* If we are XOR'ing with -1, then we should emit a one's complement
2071 instead. This way the combiner will notice logical operations
2072 such as ANDN later on and substitute. */
2073 if ((low_bits & 0x3ff) == 0x3ff)
2075 emit_insn (gen_rtx_SET (VOIDmode, op0,
2076 gen_rtx_NOT (DImode, temp)));
2080 emit_insn (gen_rtx_SET (VOIDmode, op0,
2081 gen_safe_XOR64 (temp,
2082 (-(HOST_WIDE_INT)0x400
2083 | (low_bits & 0x3ff)))));
2088 static void sparc_emit_set_const64_quick2 (rtx, rtx, unsigned HOST_WIDE_INT,
2089 unsigned HOST_WIDE_INT, int);
2092 sparc_emit_set_const64_quick2 (rtx op0, rtx temp,
2093 unsigned HOST_WIDE_INT high_bits,
2094 unsigned HOST_WIDE_INT low_immediate,
2099 if ((high_bits & 0xfffffc00) != 0)
2101 emit_insn (gen_safe_HIGH64 (temp, high_bits));
2102 if ((high_bits & ~0xfffffc00) != 0)
2103 emit_insn (gen_rtx_SET (VOIDmode, op0,
2104 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
2110 emit_insn (gen_safe_SET64 (temp, high_bits));
2114 /* Now shift it up into place. */
2115 emit_insn (gen_rtx_SET (VOIDmode, op0,
2116 gen_rtx_ASHIFT (DImode, temp2,
2117 GEN_INT (shift_count))));
2119 /* If there is a low immediate part piece, finish up by
2120 putting that in as well. */
2121 if (low_immediate != 0)
2122 emit_insn (gen_rtx_SET (VOIDmode, op0,
2123 gen_safe_OR64 (op0, low_immediate)));
2126 static void sparc_emit_set_const64_longway (rtx, rtx, unsigned HOST_WIDE_INT,
2127 unsigned HOST_WIDE_INT);
2129 /* Full 64-bit constant decomposition. Even though this is the
2130 'worst' case, we still optimize a few things away. */
2132 sparc_emit_set_const64_longway (rtx op0, rtx temp,
2133 unsigned HOST_WIDE_INT high_bits,
2134 unsigned HOST_WIDE_INT low_bits)
2138 if (can_create_pseudo_p ())
2139 sub_temp = gen_reg_rtx (DImode);
2141 if ((high_bits & 0xfffffc00) != 0)
2143 emit_insn (gen_safe_HIGH64 (temp, high_bits));
2144 if ((high_bits & ~0xfffffc00) != 0)
2145 emit_insn (gen_rtx_SET (VOIDmode,
2147 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
2153 emit_insn (gen_safe_SET64 (temp, high_bits));
2157 if (can_create_pseudo_p ())
2159 rtx temp2 = gen_reg_rtx (DImode);
2160 rtx temp3 = gen_reg_rtx (DImode);
2161 rtx temp4 = gen_reg_rtx (DImode);
2163 emit_insn (gen_rtx_SET (VOIDmode, temp4,
2164 gen_rtx_ASHIFT (DImode, sub_temp,
2167 emit_insn (gen_safe_HIGH64 (temp2, low_bits));
2168 if ((low_bits & ~0xfffffc00) != 0)
2170 emit_insn (gen_rtx_SET (VOIDmode, temp3,
2171 gen_safe_OR64 (temp2, (low_bits & 0x3ff))));
2172 emit_insn (gen_rtx_SET (VOIDmode, op0,
2173 gen_rtx_PLUS (DImode, temp4, temp3)));
2177 emit_insn (gen_rtx_SET (VOIDmode, op0,
2178 gen_rtx_PLUS (DImode, temp4, temp2)));
2183 rtx low1 = GEN_INT ((low_bits >> (32 - 12)) & 0xfff);
2184 rtx low2 = GEN_INT ((low_bits >> (32 - 12 - 12)) & 0xfff);
2185 rtx low3 = GEN_INT ((low_bits >> (32 - 12 - 12 - 8)) & 0x0ff);
2188 /* We are in the middle of reload, so this is really
2189 painful. However we do still make an attempt to
2190 avoid emitting truly stupid code. */
2191 if (low1 != const0_rtx)
2193 emit_insn (gen_rtx_SET (VOIDmode, op0,
2194 gen_rtx_ASHIFT (DImode, sub_temp,
2195 GEN_INT (to_shift))));
2196 emit_insn (gen_rtx_SET (VOIDmode, op0,
2197 gen_rtx_IOR (DImode, op0, low1)));
2205 if (low2 != const0_rtx)
2207 emit_insn (gen_rtx_SET (VOIDmode, op0,
2208 gen_rtx_ASHIFT (DImode, sub_temp,
2209 GEN_INT (to_shift))));
2210 emit_insn (gen_rtx_SET (VOIDmode, op0,
2211 gen_rtx_IOR (DImode, op0, low2)));
2219 emit_insn (gen_rtx_SET (VOIDmode, op0,
2220 gen_rtx_ASHIFT (DImode, sub_temp,
2221 GEN_INT (to_shift))));
2222 if (low3 != const0_rtx)
2223 emit_insn (gen_rtx_SET (VOIDmode, op0,
2224 gen_rtx_IOR (DImode, op0, low3)));
2229 /* Analyze a 64-bit constant for certain properties. */
2230 static void analyze_64bit_constant (unsigned HOST_WIDE_INT,
2231 unsigned HOST_WIDE_INT,
2232 int *, int *, int *);
2235 analyze_64bit_constant (unsigned HOST_WIDE_INT high_bits,
2236 unsigned HOST_WIDE_INT low_bits,
2237 int *hbsp, int *lbsp, int *abbasp)
2239 int lowest_bit_set, highest_bit_set, all_bits_between_are_set;
2242 lowest_bit_set = highest_bit_set = -1;
2246 if ((lowest_bit_set == -1)
2247 && ((low_bits >> i) & 1))
2249 if ((highest_bit_set == -1)
2250 && ((high_bits >> (32 - i - 1)) & 1))
2251 highest_bit_set = (64 - i - 1);
2254 && ((highest_bit_set == -1)
2255 || (lowest_bit_set == -1)));
2261 if ((lowest_bit_set == -1)
2262 && ((high_bits >> i) & 1))
2263 lowest_bit_set = i + 32;
2264 if ((highest_bit_set == -1)
2265 && ((low_bits >> (32 - i - 1)) & 1))
2266 highest_bit_set = 32 - i - 1;
2269 && ((highest_bit_set == -1)
2270 || (lowest_bit_set == -1)));
2272 /* If there are no bits set this should have gone out
2273 as one instruction! */
2274 gcc_assert (lowest_bit_set != -1 && highest_bit_set != -1);
2275 all_bits_between_are_set = 1;
2276 for (i = lowest_bit_set; i <= highest_bit_set; i++)
2280 if ((low_bits & (1 << i)) != 0)
2285 if ((high_bits & (1 << (i - 32))) != 0)
2288 all_bits_between_are_set = 0;
2291 *hbsp = highest_bit_set;
2292 *lbsp = lowest_bit_set;
2293 *abbasp = all_bits_between_are_set;
2296 static int const64_is_2insns (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
2299 const64_is_2insns (unsigned HOST_WIDE_INT high_bits,
2300 unsigned HOST_WIDE_INT low_bits)
2302 int highest_bit_set, lowest_bit_set, all_bits_between_are_set;
2305 || high_bits == 0xffffffff)
2308 analyze_64bit_constant (high_bits, low_bits,
2309 &highest_bit_set, &lowest_bit_set,
2310 &all_bits_between_are_set);
2312 if ((highest_bit_set == 63
2313 || lowest_bit_set == 0)
2314 && all_bits_between_are_set != 0)
2317 if ((highest_bit_set - lowest_bit_set) < 21)
2323 static unsigned HOST_WIDE_INT create_simple_focus_bits (unsigned HOST_WIDE_INT,
2324 unsigned HOST_WIDE_INT,
2327 static unsigned HOST_WIDE_INT
2328 create_simple_focus_bits (unsigned HOST_WIDE_INT high_bits,
2329 unsigned HOST_WIDE_INT low_bits,
2330 int lowest_bit_set, int shift)
2332 HOST_WIDE_INT hi, lo;
2334 if (lowest_bit_set < 32)
2336 lo = (low_bits >> lowest_bit_set) << shift;
2337 hi = ((high_bits << (32 - lowest_bit_set)) << shift);
2342 hi = ((high_bits >> (lowest_bit_set - 32)) << shift);
2344 gcc_assert (! (hi & lo));
2348 /* Here we are sure to be arch64 and this is an integer constant
2349 being loaded into a register. Emit the most efficient
2350 insn sequence possible. Detection of all the 1-insn cases
2351 has been done already. */
2353 sparc_emit_set_const64 (rtx op0, rtx op1)
2355 unsigned HOST_WIDE_INT high_bits, low_bits;
2356 int lowest_bit_set, highest_bit_set;
2357 int all_bits_between_are_set;
2360 /* Sanity check that we know what we are working with. */
2361 gcc_assert (TARGET_ARCH64
2362 && (GET_CODE (op0) == SUBREG
2363 || (REG_P (op0) && ! SPARC_FP_REG_P (REGNO (op0)))));
2365 if (! can_create_pseudo_p ())
2368 if (GET_CODE (op1) != CONST_INT)
2370 sparc_emit_set_symbolic_const64 (op0, op1, temp);
2375 temp = gen_reg_rtx (DImode);
2377 high_bits = ((INTVAL (op1) >> 32) & 0xffffffff);
2378 low_bits = (INTVAL (op1) & 0xffffffff);
2380 /* low_bits bits 0 --> 31
2381 high_bits bits 32 --> 63 */
2383 analyze_64bit_constant (high_bits, low_bits,
2384 &highest_bit_set, &lowest_bit_set,
2385 &all_bits_between_are_set);
2387 /* First try for a 2-insn sequence. */
2389 /* These situations are preferred because the optimizer can
2390 * do more things with them:
2392 * sllx %reg, shift, %reg
2394 * srlx %reg, shift, %reg
2395 * 3) mov some_small_const, %reg
2396 * sllx %reg, shift, %reg
2398 if (((highest_bit_set == 63
2399 || lowest_bit_set == 0)
2400 && all_bits_between_are_set != 0)
2401 || ((highest_bit_set - lowest_bit_set) < 12))
2403 HOST_WIDE_INT the_const = -1;
2404 int shift = lowest_bit_set;
2406 if ((highest_bit_set != 63
2407 && lowest_bit_set != 0)
2408 || all_bits_between_are_set == 0)
2411 create_simple_focus_bits (high_bits, low_bits,
2414 else if (lowest_bit_set == 0)
2415 shift = -(63 - highest_bit_set);
2417 gcc_assert (SPARC_SIMM13_P (the_const));
2418 gcc_assert (shift != 0);
2420 emit_insn (gen_safe_SET64 (temp, the_const));
2422 emit_insn (gen_rtx_SET (VOIDmode,
2424 gen_rtx_ASHIFT (DImode,
2428 emit_insn (gen_rtx_SET (VOIDmode,
2430 gen_rtx_LSHIFTRT (DImode,
2432 GEN_INT (-shift))));
2436 /* Now a range of 22 or less bits set somewhere.
2437 * 1) sethi %hi(focus_bits), %reg
2438 * sllx %reg, shift, %reg
2439 * 2) sethi %hi(focus_bits), %reg
2440 * srlx %reg, shift, %reg
2442 if ((highest_bit_set - lowest_bit_set) < 21)
2444 unsigned HOST_WIDE_INT focus_bits =
2445 create_simple_focus_bits (high_bits, low_bits,
2446 lowest_bit_set, 10);
2448 gcc_assert (SPARC_SETHI_P (focus_bits));
2449 gcc_assert (lowest_bit_set != 10);
2451 emit_insn (gen_safe_HIGH64 (temp, focus_bits));
2453 /* If lowest_bit_set == 10 then a sethi alone could have done it. */
2454 if (lowest_bit_set < 10)
2455 emit_insn (gen_rtx_SET (VOIDmode,
2457 gen_rtx_LSHIFTRT (DImode, temp,
2458 GEN_INT (10 - lowest_bit_set))));
2459 else if (lowest_bit_set > 10)
2460 emit_insn (gen_rtx_SET (VOIDmode,
2462 gen_rtx_ASHIFT (DImode, temp,
2463 GEN_INT (lowest_bit_set - 10))));
2467 /* 1) sethi %hi(low_bits), %reg
2468 * or %reg, %lo(low_bits), %reg
2469 * 2) sethi %hi(~low_bits), %reg
2470 * xor %reg, %lo(-0x400 | (low_bits & 0x3ff)), %reg
2473 || high_bits == 0xffffffff)
2475 sparc_emit_set_const64_quick1 (op0, temp, low_bits,
2476 (high_bits == 0xffffffff));
2480 /* Now, try 3-insn sequences. */
2482 /* 1) sethi %hi(high_bits), %reg
2483 * or %reg, %lo(high_bits), %reg
2484 * sllx %reg, 32, %reg
2488 sparc_emit_set_const64_quick2 (op0, temp, high_bits, 0, 32);
2492 /* We may be able to do something quick
2493 when the constant is negated, so try that. */
2494 if (const64_is_2insns ((~high_bits) & 0xffffffff,
2495 (~low_bits) & 0xfffffc00))
2497 /* NOTE: The trailing bits get XOR'd so we need the
2498 non-negated bits, not the negated ones. */
2499 unsigned HOST_WIDE_INT trailing_bits = low_bits & 0x3ff;
2501 if ((((~high_bits) & 0xffffffff) == 0
2502 && ((~low_bits) & 0x80000000) == 0)
2503 || (((~high_bits) & 0xffffffff) == 0xffffffff
2504 && ((~low_bits) & 0x80000000) != 0))
2506 unsigned HOST_WIDE_INT fast_int = (~low_bits & 0xffffffff);
2508 if ((SPARC_SETHI_P (fast_int)
2509 && (~high_bits & 0xffffffff) == 0)
2510 || SPARC_SIMM13_P (fast_int))
2511 emit_insn (gen_safe_SET64 (temp, fast_int));
2513 sparc_emit_set_const64 (temp, GEN_INT (fast_int));
2518 negated_const = GEN_INT (((~low_bits) & 0xfffffc00) |
2519 (((HOST_WIDE_INT)((~high_bits) & 0xffffffff))<<32));
2520 sparc_emit_set_const64 (temp, negated_const);
2523 /* If we are XOR'ing with -1, then we should emit a one's complement
2524 instead. This way the combiner will notice logical operations
2525 such as ANDN later on and substitute. */
2526 if (trailing_bits == 0x3ff)
2528 emit_insn (gen_rtx_SET (VOIDmode, op0,
2529 gen_rtx_NOT (DImode, temp)));
2533 emit_insn (gen_rtx_SET (VOIDmode,
2535 gen_safe_XOR64 (temp,
2536 (-0x400 | trailing_bits))));
2541 /* 1) sethi %hi(xxx), %reg
2542 * or %reg, %lo(xxx), %reg
2543 * sllx %reg, yyy, %reg
2545 * ??? This is just a generalized version of the low_bits==0
2546 * thing above, FIXME...
2548 if ((highest_bit_set - lowest_bit_set) < 32)
2550 unsigned HOST_WIDE_INT focus_bits =
2551 create_simple_focus_bits (high_bits, low_bits,
2554 /* We can't get here in this state. */
2555 gcc_assert (highest_bit_set >= 32 && lowest_bit_set < 32);
2557 /* So what we know is that the set bits straddle the
2558 middle of the 64-bit word. */
2559 sparc_emit_set_const64_quick2 (op0, temp,
2565 /* 1) sethi %hi(high_bits), %reg
2566 * or %reg, %lo(high_bits), %reg
2567 * sllx %reg, 32, %reg
2568 * or %reg, low_bits, %reg
2570 if (SPARC_SIMM13_P(low_bits)
2571 && ((int)low_bits > 0))
2573 sparc_emit_set_const64_quick2 (op0, temp, high_bits, low_bits, 32);
2577 /* The easiest way when all else fails, is full decomposition. */
2578 sparc_emit_set_const64_longway (op0, temp, high_bits, low_bits);
2580 #endif /* HOST_BITS_PER_WIDE_INT == 32 */
2582 /* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
2583 return the mode to be used for the comparison. For floating-point,
2584 CCFP[E]mode is used. CC_NOOVmode should be used when the first operand
2585 is a PLUS, MINUS, NEG, or ASHIFT. CCmode should be used when no special
2586 processing is needed. */
2589 select_cc_mode (enum rtx_code op, rtx x, rtx y ATTRIBUTE_UNUSED)
2591 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2617 else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
2618 || GET_CODE (x) == NEG || GET_CODE (x) == ASHIFT)
2620 if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2621 return CCX_NOOVmode;
2627 if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2634 /* Emit the compare insn and return the CC reg for a CODE comparison
2635 with operands X and Y. */
2638 gen_compare_reg_1 (enum rtx_code code, rtx x, rtx y)
2640 enum machine_mode mode;
2643 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_CC)
2646 mode = SELECT_CC_MODE (code, x, y);
2648 /* ??? We don't have movcc patterns so we cannot generate pseudo regs for the
2649 fcc regs (cse can't tell they're really call clobbered regs and will
2650 remove a duplicate comparison even if there is an intervening function
2651 call - it will then try to reload the cc reg via an int reg which is why
2652 we need the movcc patterns). It is possible to provide the movcc
2653 patterns by using the ldxfsr/stxfsr v9 insns. I tried it: you need two
2654 registers (say %g1,%g5) and it takes about 6 insns. A better fix would be
2655 to tell cse that CCFPE mode registers (even pseudos) are call
2658 /* ??? This is an experiment. Rather than making changes to cse which may
2659 or may not be easy/clean, we do our own cse. This is possible because
2660 we will generate hard registers. Cse knows they're call clobbered (it
2661 doesn't know the same thing about pseudos). If we guess wrong, no big
2662 deal, but if we win, great! */
2664 if (TARGET_V9 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2665 #if 1 /* experiment */
2668 /* We cycle through the registers to ensure they're all exercised. */
2669 static int next_fcc_reg = 0;
2670 /* Previous x,y for each fcc reg. */
2671 static rtx prev_args[4][2];
2673 /* Scan prev_args for x,y. */
2674 for (reg = 0; reg < 4; reg++)
2675 if (prev_args[reg][0] == x && prev_args[reg][1] == y)
2680 prev_args[reg][0] = x;
2681 prev_args[reg][1] = y;
2682 next_fcc_reg = (next_fcc_reg + 1) & 3;
2684 cc_reg = gen_rtx_REG (mode, reg + SPARC_FIRST_V9_FCC_REG);
2687 cc_reg = gen_reg_rtx (mode);
2688 #endif /* ! experiment */
2689 else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2690 cc_reg = gen_rtx_REG (mode, SPARC_FCC_REG);
2692 cc_reg = gen_rtx_REG (mode, SPARC_ICC_REG);
2694 /* We shouldn't get there for TFmode if !TARGET_HARD_QUAD. If we do, this
2695 will only result in an unrecognizable insn so no point in asserting. */
2696 emit_insn (gen_rtx_SET (VOIDmode, cc_reg, gen_rtx_COMPARE (mode, x, y)));
2702 /* Emit the compare insn and return the CC reg for the comparison in CMP. */
2705 gen_compare_reg (rtx cmp)
2707 return gen_compare_reg_1 (GET_CODE (cmp), XEXP (cmp, 0), XEXP (cmp, 1));
2710 /* This function is used for v9 only.
2711 DEST is the target of the Scc insn.
2712 CODE is the code for an Scc's comparison.
2713 X and Y are the values we compare.
2715 This function is needed to turn
2718 (gt (reg:CCX 100 %icc)
2722 (gt:DI (reg:CCX 100 %icc)
2725 IE: The instruction recognizer needs to see the mode of the comparison to
2726 find the right instruction. We could use "gt:DI" right in the
2727 define_expand, but leaving it out allows us to handle DI, SI, etc. */
2730 gen_v9_scc (rtx dest, enum rtx_code compare_code, rtx x, rtx y)
2733 && (GET_MODE (x) == DImode
2734 || GET_MODE (dest) == DImode))
2737 /* Try to use the movrCC insns. */
2739 && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT
2741 && v9_regcmp_p (compare_code))
2746 /* Special case for op0 != 0. This can be done with one instruction if
2749 if (compare_code == NE
2750 && GET_MODE (dest) == DImode
2751 && rtx_equal_p (op0, dest))
2753 emit_insn (gen_rtx_SET (VOIDmode, dest,
2754 gen_rtx_IF_THEN_ELSE (DImode,
2755 gen_rtx_fmt_ee (compare_code, DImode,
2762 if (reg_overlap_mentioned_p (dest, op0))
2764 /* Handle the case where dest == x.
2765 We "early clobber" the result. */
2766 op0 = gen_reg_rtx (GET_MODE (x));
2767 emit_move_insn (op0, x);
2770 emit_insn (gen_rtx_SET (VOIDmode, dest, const0_rtx));
2771 if (GET_MODE (op0) != DImode)
2773 temp = gen_reg_rtx (DImode);
2774 convert_move (temp, op0, 0);
2778 emit_insn (gen_rtx_SET (VOIDmode, dest,
2779 gen_rtx_IF_THEN_ELSE (GET_MODE (dest),
2780 gen_rtx_fmt_ee (compare_code, DImode,
2788 x = gen_compare_reg_1 (compare_code, x, y);
2791 gcc_assert (GET_MODE (x) != CC_NOOVmode
2792 && GET_MODE (x) != CCX_NOOVmode);
2794 emit_insn (gen_rtx_SET (VOIDmode, dest, const0_rtx));
2795 emit_insn (gen_rtx_SET (VOIDmode, dest,
2796 gen_rtx_IF_THEN_ELSE (GET_MODE (dest),
2797 gen_rtx_fmt_ee (compare_code,
2798 GET_MODE (x), x, y),
2799 const1_rtx, dest)));
2805 /* Emit an scc insn. For seq, sne, sgeu, and sltu, we can do this
2806 without jumps using the addx/subx instructions. */
2809 emit_scc_insn (rtx operands[])
2816 /* The quad-word fp compare library routines all return nonzero to indicate
2817 true, which is different from the equivalent libgcc routines, so we must
2818 handle them specially here. */
2819 if (GET_MODE (operands[2]) == TFmode && ! TARGET_HARD_QUAD)
2821 operands[1] = sparc_emit_float_lib_cmp (operands[2], operands[3],
2822 GET_CODE (operands[1]));
2823 operands[2] = XEXP (operands[1], 0);
2824 operands[3] = XEXP (operands[1], 1);
2827 code = GET_CODE (operands[1]);
2831 /* For seq/sne on v9 we use the same code as v8 (the addx/subx method has
2832 more applications). The exception to this is "reg != 0" which can
2833 be done in one instruction on v9 (so we do it). */
2836 if (GET_MODE (x) == SImode)
2840 pat = gen_seqsidi_special (operands[0], x, y);
2842 pat = gen_seqsisi_special (operands[0], x, y);
2846 else if (GET_MODE (x) == DImode)
2848 rtx pat = gen_seqdi_special (operands[0], x, y);
2856 if (GET_MODE (x) == SImode)
2860 pat = gen_snesidi_special (operands[0], x, y);
2862 pat = gen_snesisi_special (operands[0], x, y);
2866 else if (GET_MODE (x) == DImode)
2870 pat = gen_snedi_special_vis3 (operands[0], x, y);
2872 pat = gen_snedi_special (operands[0], x, y);
2880 && GET_MODE (x) == DImode
2882 && (code == GTU || code == LTU))
2883 && gen_v9_scc (operands[0], code, x, y))
2886 /* We can do LTU and GEU using the addx/subx instructions too. And
2887 for GTU/LEU, if both operands are registers swap them and fall
2888 back to the easy case. */
2889 if (code == GTU || code == LEU)
2891 if ((GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
2892 && (GET_CODE (y) == REG || GET_CODE (y) == SUBREG))
2897 code = swap_condition (code);
2902 || (!TARGET_VIS3 && code == GEU))
2904 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
2905 gen_rtx_fmt_ee (code, GET_MODE (operands[0]),
2906 gen_compare_reg_1 (code, x, y),
2911 /* All the posibilities to use addx/subx based sequences has been
2912 exhausted, try for a 3 instruction sequence using v9 conditional
2914 if (TARGET_V9 && gen_v9_scc (operands[0], code, x, y))
2917 /* Nope, do branches. */
2921 /* Emit a conditional jump insn for the v9 architecture using comparison code
2922 CODE and jump target LABEL.
2923 This function exists to take advantage of the v9 brxx insns. */
2926 emit_v9_brxx_insn (enum rtx_code code, rtx op0, rtx label)
2928 emit_jump_insn (gen_rtx_SET (VOIDmode,
2930 gen_rtx_IF_THEN_ELSE (VOIDmode,
2931 gen_rtx_fmt_ee (code, GET_MODE (op0),
2933 gen_rtx_LABEL_REF (VOIDmode, label),
2937 /* Emit a conditional jump insn for the UA2011 architecture using
2938 comparison code CODE and jump target LABEL. This function exists
2939 to take advantage of the UA2011 Compare and Branch insns. */
2942 emit_cbcond_insn (enum rtx_code code, rtx op0, rtx op1, rtx label)
2946 if_then_else = gen_rtx_IF_THEN_ELSE (VOIDmode,
2947 gen_rtx_fmt_ee(code, GET_MODE(op0),
2949 gen_rtx_LABEL_REF (VOIDmode, label),
2952 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, if_then_else));
2956 emit_conditional_branch_insn (rtx operands[])
2958 /* The quad-word fp compare library routines all return nonzero to indicate
2959 true, which is different from the equivalent libgcc routines, so we must
2960 handle them specially here. */
2961 if (GET_MODE (operands[1]) == TFmode && ! TARGET_HARD_QUAD)
2963 operands[0] = sparc_emit_float_lib_cmp (operands[1], operands[2],
2964 GET_CODE (operands[0]));
2965 operands[1] = XEXP (operands[0], 0);
2966 operands[2] = XEXP (operands[0], 1);
2969 /* If we can tell early on that the comparison is against a constant
2970 that won't fit in the 5-bit signed immediate field of a cbcond,
2971 use one of the other v9 conditional branch sequences. */
2973 && GET_CODE (operands[1]) == REG
2974 && (GET_MODE (operands[1]) == SImode
2975 || (TARGET_ARCH64 && GET_MODE (operands[1]) == DImode))
2976 && (GET_CODE (operands[2]) != CONST_INT
2977 || SPARC_SIMM5_P (INTVAL (operands[2]))))
2979 emit_cbcond_insn (GET_CODE (operands[0]), operands[1], operands[2], operands[3]);
2983 if (TARGET_ARCH64 && operands[2] == const0_rtx
2984 && GET_CODE (operands[1]) == REG
2985 && GET_MODE (operands[1]) == DImode)
2987 emit_v9_brxx_insn (GET_CODE (operands[0]), operands[1], operands[3]);
2991 operands[1] = gen_compare_reg (operands[0]);
2992 operands[2] = const0_rtx;
2993 operands[0] = gen_rtx_fmt_ee (GET_CODE (operands[0]), VOIDmode,
2994 operands[1], operands[2]);
2995 emit_jump_insn (gen_cbranchcc4 (operands[0], operands[1], operands[2],
3000 /* Generate a DFmode part of a hard TFmode register.
3001 REG is the TFmode hard register, LOW is 1 for the
3002 low 64bit of the register and 0 otherwise.
3005 gen_df_reg (rtx reg, int low)
3007 int regno = REGNO (reg);
3009 if ((WORDS_BIG_ENDIAN == 0) ^ (low != 0))
3010 regno += (TARGET_ARCH64 && SPARC_INT_REG_P (regno)) ? 1 : 2;
3011 return gen_rtx_REG (DFmode, regno);
3014 /* Generate a call to FUNC with OPERANDS. Operand 0 is the return value.
3015 Unlike normal calls, TFmode operands are passed by reference. It is
3016 assumed that no more than 3 operands are required. */
3019 emit_soft_tfmode_libcall (const char *func_name, int nargs, rtx *operands)
3021 rtx ret_slot = NULL, arg[3], func_sym;
3024 /* We only expect to be called for conversions, unary, and binary ops. */
3025 gcc_assert (nargs == 2 || nargs == 3);
3027 for (i = 0; i < nargs; ++i)
3029 rtx this_arg = operands[i];
3032 /* TFmode arguments and return values are passed by reference. */
3033 if (GET_MODE (this_arg) == TFmode)
3035 int force_stack_temp;
3037 force_stack_temp = 0;
3038 if (TARGET_BUGGY_QP_LIB && i == 0)
3039 force_stack_temp = 1;
3041 if (GET_CODE (this_arg) == MEM
3042 && ! force_stack_temp)
3044 tree expr = MEM_EXPR (this_arg);
3046 mark_addressable (expr);
3047 this_arg = XEXP (this_arg, 0);
3049 else if (CONSTANT_P (this_arg)
3050 && ! force_stack_temp)
3052 this_slot = force_const_mem (TFmode, this_arg);
3053 this_arg = XEXP (this_slot, 0);
3057 this_slot = assign_stack_temp (TFmode, GET_MODE_SIZE (TFmode));
3059 /* Operand 0 is the return value. We'll copy it out later. */
3061 emit_move_insn (this_slot, this_arg);
3063 ret_slot = this_slot;
3065 this_arg = XEXP (this_slot, 0);
3072 func_sym = gen_rtx_SYMBOL_REF (Pmode, func_name);
3074 if (GET_MODE (operands[0]) == TFmode)
3077 emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 2,
3078 arg[0], GET_MODE (arg[0]),
3079 arg[1], GET_MODE (arg[1]));
3081 emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 3,
3082 arg[0], GET_MODE (arg[0]),
3083 arg[1], GET_MODE (arg[1]),
3084 arg[2], GET_MODE (arg[2]));
3087 emit_move_insn (operands[0], ret_slot);
3093 gcc_assert (nargs == 2);
3095 ret = emit_library_call_value (func_sym, operands[0], LCT_NORMAL,
3096 GET_MODE (operands[0]), 1,
3097 arg[1], GET_MODE (arg[1]));
3099 if (ret != operands[0])
3100 emit_move_insn (operands[0], ret);
3104 /* Expand soft-float TFmode calls to sparc abi routines. */
3107 emit_soft_tfmode_binop (enum rtx_code code, rtx *operands)
3129 emit_soft_tfmode_libcall (func, 3, operands);
3133 emit_soft_tfmode_unop (enum rtx_code code, rtx *operands)
3137 gcc_assert (code == SQRT);
3140 emit_soft_tfmode_libcall (func, 2, operands);
3144 emit_soft_tfmode_cvt (enum rtx_code code, rtx *operands)
3151 switch (GET_MODE (operands[1]))
3164 case FLOAT_TRUNCATE:
3165 switch (GET_MODE (operands[0]))
3179 switch (GET_MODE (operands[1]))
3184 operands[1] = gen_rtx_SIGN_EXTEND (DImode, operands[1]);
3194 case UNSIGNED_FLOAT:
3195 switch (GET_MODE (operands[1]))
3200 operands[1] = gen_rtx_ZERO_EXTEND (DImode, operands[1]);
3211 switch (GET_MODE (operands[0]))
3225 switch (GET_MODE (operands[0]))
3242 emit_soft_tfmode_libcall (func, 2, operands);
3245 /* Expand a hard-float tfmode operation. All arguments must be in
3249 emit_hard_tfmode_operation (enum rtx_code code, rtx *operands)
3253 if (GET_RTX_CLASS (code) == RTX_UNARY)
3255 operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
3256 op = gen_rtx_fmt_e (code, GET_MODE (operands[0]), operands[1]);
3260 operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
3261 operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
3262 op = gen_rtx_fmt_ee (code, GET_MODE (operands[0]),
3263 operands[1], operands[2]);
3266 if (register_operand (operands[0], VOIDmode))
3269 dest = gen_reg_rtx (GET_MODE (operands[0]));
3271 emit_insn (gen_rtx_SET (VOIDmode, dest, op));
3273 if (dest != operands[0])
3274 emit_move_insn (operands[0], dest);
3278 emit_tfmode_binop (enum rtx_code code, rtx *operands)
3280 if (TARGET_HARD_QUAD)
3281 emit_hard_tfmode_operation (code, operands);
3283 emit_soft_tfmode_binop (code, operands);
3287 emit_tfmode_unop (enum rtx_code code, rtx *operands)
3289 if (TARGET_HARD_QUAD)
3290 emit_hard_tfmode_operation (code, operands);
3292 emit_soft_tfmode_unop (code, operands);
3296 emit_tfmode_cvt (enum rtx_code code, rtx *operands)
3298 if (TARGET_HARD_QUAD)
3299 emit_hard_tfmode_operation (code, operands);
3301 emit_soft_tfmode_cvt (code, operands);
3304 /* Return nonzero if a branch/jump/call instruction will be emitting
3305 nop into its delay slot. */
3308 empty_delay_slot (rtx insn)
3312 /* If no previous instruction (should not happen), return true. */
3313 if (PREV_INSN (insn) == NULL)
3316 seq = NEXT_INSN (PREV_INSN (insn));
3317 if (GET_CODE (PATTERN (seq)) == SEQUENCE)
3323 /* Return nonzero if we should emit a nop after a cbcond instruction.
3324 The cbcond instruction does not have a delay slot, however there is
3325 a severe performance penalty if a control transfer appears right
3326 after a cbcond. Therefore we emit a nop when we detect this
3330 emit_cbcond_nop (rtx insn)
3332 rtx next = next_active_insn (insn);
3337 if (NONJUMP_INSN_P (next)
3338 && GET_CODE (PATTERN (next)) == SEQUENCE)
3339 next = XVECEXP (PATTERN (next), 0, 0);
3340 else if (CALL_P (next)
3341 && GET_CODE (PATTERN (next)) == PARALLEL)
3343 rtx delay = XVECEXP (PATTERN (next), 0, 1);
3345 if (GET_CODE (delay) == RETURN)
3347 /* It's a sibling call. Do not emit the nop if we're going
3348 to emit something other than the jump itself as the first
3349 instruction of the sibcall sequence. */
3350 if (sparc_leaf_function_p || TARGET_FLAT)
3355 if (NONJUMP_INSN_P (next))
3361 /* Return nonzero if TRIAL can go into the call delay slot. */
3364 tls_call_delay (rtx trial)
3369 call __tls_get_addr, %tgd_call (foo)
3370 add %l7, %o0, %o0, %tgd_add (foo)
3371 while Sun as/ld does not. */
3372 if (TARGET_GNU_TLS || !TARGET_TLS)
3375 pat = PATTERN (trial);
3377 /* We must reject tgd_add{32|64}, i.e.
3378 (set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSGD)))
3379 and tldm_add{32|64}, i.e.
3380 (set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSLDM)))
3382 if (GET_CODE (pat) == SET
3383 && GET_CODE (SET_SRC (pat)) == PLUS)
3385 rtx unspec = XEXP (SET_SRC (pat), 1);
3387 if (GET_CODE (unspec) == UNSPEC
3388 && (XINT (unspec, 1) == UNSPEC_TLSGD
3389 || XINT (unspec, 1) == UNSPEC_TLSLDM))
3396 /* Return nonzero if TRIAL, an insn, can be combined with a 'restore'
3397 instruction. RETURN_P is true if the v9 variant 'return' is to be
3398 considered in the test too.
3400 TRIAL must be a SET whose destination is a REG appropriate for the
3401 'restore' instruction or, if RETURN_P is true, for the 'return'
3405 eligible_for_restore_insn (rtx trial, bool return_p)
3407 rtx pat = PATTERN (trial);
3408 rtx src = SET_SRC (pat);
3409 bool src_is_freg = false;
3412 /* Since we now can do moves between float and integer registers when
3413 VIS3 is enabled, we have to catch this case. We can allow such
3414 moves when doing a 'return' however. */
3416 if (GET_CODE (src_reg) == SUBREG)
3417 src_reg = SUBREG_REG (src_reg);
3418 if (GET_CODE (src_reg) == REG
3419 && SPARC_FP_REG_P (REGNO (src_reg)))
3422 /* The 'restore src,%g0,dest' pattern for word mode and below. */
3423 if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
3424 && arith_operand (src, GET_MODE (src))
3428 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
3430 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (SImode);
3433 /* The 'restore src,%g0,dest' pattern for double-word mode. */
3434 else if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
3435 && arith_double_operand (src, GET_MODE (src))
3437 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
3439 /* The 'restore src,%g0,dest' pattern for float if no FPU. */
3440 else if (! TARGET_FPU && register_operand (src, SFmode))
3443 /* The 'restore src,%g0,dest' pattern for double if no FPU. */
3444 else if (! TARGET_FPU && TARGET_ARCH64 && register_operand (src, DFmode))
3447 /* If we have the 'return' instruction, anything that does not use
3448 local or output registers and can go into a delay slot wins. */
3451 && !epilogue_renumber (&pat, 1)
3452 && get_attr_in_uncond_branch_delay (trial)
3453 == IN_UNCOND_BRANCH_DELAY_TRUE)
3456 /* The 'restore src1,src2,dest' pattern for SImode. */
3457 else if (GET_CODE (src) == PLUS
3458 && register_operand (XEXP (src, 0), SImode)
3459 && arith_operand (XEXP (src, 1), SImode))
3462 /* The 'restore src1,src2,dest' pattern for DImode. */
3463 else if (GET_CODE (src) == PLUS
3464 && register_operand (XEXP (src, 0), DImode)
3465 && arith_double_operand (XEXP (src, 1), DImode))
3468 /* The 'restore src1,%lo(src2),dest' pattern. */
3469 else if (GET_CODE (src) == LO_SUM
3470 && ! TARGET_CM_MEDMID
3471 && ((register_operand (XEXP (src, 0), SImode)
3472 && immediate_operand (XEXP (src, 1), SImode))
3474 && register_operand (XEXP (src, 0), DImode)
3475 && immediate_operand (XEXP (src, 1), DImode))))
3478 /* The 'restore src,src,dest' pattern. */
3479 else if (GET_CODE (src) == ASHIFT
3480 && (register_operand (XEXP (src, 0), SImode)
3481 || register_operand (XEXP (src, 0), DImode))
3482 && XEXP (src, 1) == const1_rtx)
3488 /* Return nonzero if TRIAL can go into the function return's delay slot. */
3491 eligible_for_return_delay (rtx trial)
3496 if (! NONJUMP_INSN_P (trial))
3499 if (get_attr_length (trial) != 1)
3502 /* If the function uses __builtin_eh_return, the eh_return machinery
3503 occupies the delay slot. */
3504 if (crtl->calls_eh_return)
3507 /* In the case of a leaf or flat function, anything can go into the slot. */
3508 if (sparc_leaf_function_p || TARGET_FLAT)
3510 get_attr_in_uncond_branch_delay (trial) == IN_UNCOND_BRANCH_DELAY_TRUE;
3512 pat = PATTERN (trial);
3513 if (GET_CODE (pat) == PARALLEL)
3519 for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
3521 rtx expr = XVECEXP (pat, 0, i);
3522 if (GET_CODE (expr) != SET)
3524 if (GET_CODE (SET_DEST (expr)) != REG)
3526 regno = REGNO (SET_DEST (expr));
3527 if (regno >= 8 && regno < 24)
3530 return !epilogue_renumber (&pat, 1)
3531 && (get_attr_in_uncond_branch_delay (trial)
3532 == IN_UNCOND_BRANCH_DELAY_TRUE);
3535 if (GET_CODE (pat) != SET)
3538 if (GET_CODE (SET_DEST (pat)) != REG)
3541 regno = REGNO (SET_DEST (pat));
3543 /* Otherwise, only operations which can be done in tandem with
3544 a `restore' or `return' insn can go into the delay slot. */
3545 if (regno >= 8 && regno < 24)
3548 /* If this instruction sets up floating point register and we have a return
3549 instruction, it can probably go in. But restore will not work
3551 if (! SPARC_INT_REG_P (regno))
3553 && !epilogue_renumber (&pat, 1)
3554 && get_attr_in_uncond_branch_delay (trial)
3555 == IN_UNCOND_BRANCH_DELAY_TRUE);
3557 return eligible_for_restore_insn (trial, true);
3560 /* Return nonzero if TRIAL can go into the sibling call's delay slot. */
3563 eligible_for_sibcall_delay (rtx trial)
3567 if (! NONJUMP_INSN_P (trial) || GET_CODE (PATTERN (trial)) != SET)
3570 if (get_attr_length (trial) != 1)
3573 pat = PATTERN (trial);
3575 if (sparc_leaf_function_p || TARGET_FLAT)
3577 /* If the tail call is done using the call instruction,
3578 we have to restore %o7 in the delay slot. */
3579 if (LEAF_SIBCALL_SLOT_RESERVED_P)
3582 /* %g1 is used to build the function address */
3583 if (reg_mentioned_p (gen_rtx_REG (Pmode, 1), pat))
3589 /* Otherwise, only operations which can be done in tandem with
3590 a `restore' insn can go into the delay slot. */
3591 if (GET_CODE (SET_DEST (pat)) != REG
3592 || (REGNO (SET_DEST (pat)) >= 8 && REGNO (SET_DEST (pat)) < 24)
3593 || ! SPARC_INT_REG_P (REGNO (SET_DEST (pat))))
3596 /* If it mentions %o7, it can't go in, because sibcall will clobber it
3598 if (reg_mentioned_p (gen_rtx_REG (Pmode, 15), pat))
3601 return eligible_for_restore_insn (trial, false);
3604 /* Determine if it's legal to put X into the constant pool. This
3605 is not possible if X contains the address of a symbol that is
3606 not constant (TLS) or not known at final link time (PIC). */
3609 sparc_cannot_force_const_mem (enum machine_mode mode, rtx x)
3611 switch (GET_CODE (x))
3616 /* Accept all non-symbolic constants. */
3620 /* Labels are OK iff we are non-PIC. */
3621 return flag_pic != 0;
3624 /* 'Naked' TLS symbol references are never OK,
3625 non-TLS symbols are OK iff we are non-PIC. */
3626 if (SYMBOL_REF_TLS_MODEL (x))
3629 return flag_pic != 0;
3632 return sparc_cannot_force_const_mem (mode, XEXP (x, 0));
3635 return sparc_cannot_force_const_mem (mode, XEXP (x, 0))
3636 || sparc_cannot_force_const_mem (mode, XEXP (x, 1));
3644 /* Global Offset Table support. */
3645 static GTY(()) rtx got_helper_rtx = NULL_RTX;
3646 static GTY(()) rtx global_offset_table_rtx = NULL_RTX;
3648 /* Return the SYMBOL_REF for the Global Offset Table. */
3650 static GTY(()) rtx sparc_got_symbol = NULL_RTX;
3655 if (!sparc_got_symbol)
3656 sparc_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3658 return sparc_got_symbol;
3661 /* Ensure that we are not using patterns that are not OK with PIC. */
3671 op = recog_data.operand[i];
3672 gcc_assert (GET_CODE (op) != SYMBOL_REF
3673 && (GET_CODE (op) != CONST
3674 || (GET_CODE (XEXP (op, 0)) == MINUS
3675 && XEXP (XEXP (op, 0), 0) == sparc_got ()
3676 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST)));
3683 /* Return true if X is an address which needs a temporary register when
3684 reloaded while generating PIC code. */
3687 pic_address_needs_scratch (rtx x)
3689 /* An address which is a symbolic plus a non SMALL_INT needs a temp reg. */
3690 if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
3691 && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
3692 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3693 && ! SMALL_INT (XEXP (XEXP (x, 0), 1)))
3699 /* Determine if a given RTX is a valid constant. We already know this
3700 satisfies CONSTANT_P. */
3703 sparc_legitimate_constant_p (enum machine_mode mode, rtx x)
3705 switch (GET_CODE (x))
3709 if (sparc_tls_referenced_p (x))
3714 if (GET_MODE (x) == VOIDmode)
3717 /* Floating point constants are generally not ok.
3718 The only exception is 0.0 and all-ones in VIS. */
3720 && SCALAR_FLOAT_MODE_P (mode)
3721 && (const_zero_operand (x, mode)
3722 || const_all_ones_operand (x, mode)))
3728 /* Vector constants are generally not ok.
3729 The only exception is 0 or -1 in VIS. */
3731 && (const_zero_operand (x, mode)
3732 || const_all_ones_operand (x, mode)))
3744 /* Determine if a given RTX is a valid constant address. */
3747 constant_address_p (rtx x)
3749 switch (GET_CODE (x))
3757 if (flag_pic && pic_address_needs_scratch (x))
3759 return sparc_legitimate_constant_p (Pmode, x);
3762 return !flag_pic && sparc_legitimate_constant_p (Pmode, x);
3769 /* Nonzero if the constant value X is a legitimate general operand
3770 when generating PIC code. It is given that flag_pic is on and
3771 that X satisfies CONSTANT_P or is a CONST_DOUBLE. */
3774 legitimate_pic_operand_p (rtx x)
3776 if (pic_address_needs_scratch (x))
3778 if (sparc_tls_referenced_p (x))
3783 #define RTX_OK_FOR_OFFSET_P(X, MODE) \
3785 && INTVAL (X) >= -0x1000 \
3786 && INTVAL (X) < (0x1000 - GET_MODE_SIZE (MODE)))
3788 #define RTX_OK_FOR_OLO10_P(X, MODE) \
3790 && INTVAL (X) >= -0x1000 \
3791 && INTVAL (X) < (0xc00 - GET_MODE_SIZE (MODE)))
3793 /* Handle the TARGET_LEGITIMATE_ADDRESS_P target hook.
3795 On SPARC, the actual legitimate addresses must be REG+REG or REG+SMALLINT
3796 ordinarily. This changes a bit when generating PIC. */
3799 sparc_legitimate_address_p (enum machine_mode mode, rtx addr, bool strict)
3801 rtx rs1 = NULL, rs2 = NULL, imm1 = NULL;
3803 if (REG_P (addr) || GET_CODE (addr) == SUBREG)
3805 else if (GET_CODE (addr) == PLUS)
3807 rs1 = XEXP (addr, 0);
3808 rs2 = XEXP (addr, 1);
3810 /* Canonicalize. REG comes first, if there are no regs,
3811 LO_SUM comes first. */
3813 && GET_CODE (rs1) != SUBREG
3815 || GET_CODE (rs2) == SUBREG
3816 || (GET_CODE (rs2) == LO_SUM && GET_CODE (rs1) != LO_SUM)))
3818 rs1 = XEXP (addr, 1);
3819 rs2 = XEXP (addr, 0);
3823 && rs1 == pic_offset_table_rtx
3825 && GET_CODE (rs2) != SUBREG
3826 && GET_CODE (rs2) != LO_SUM
3827 && GET_CODE (rs2) != MEM
3828 && !(GET_CODE (rs2) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs2))
3829 && (! symbolic_operand (rs2, VOIDmode) || mode == Pmode)
3830 && (GET_CODE (rs2) != CONST_INT || SMALL_INT (rs2)))
3832 || GET_CODE (rs1) == SUBREG)
3833 && RTX_OK_FOR_OFFSET_P (rs2, mode)))
3838 else if ((REG_P (rs1) || GET_CODE (rs1) == SUBREG)
3839 && (REG_P (rs2) || GET_CODE (rs2) == SUBREG))
3841 /* We prohibit REG + REG for TFmode when there are no quad move insns
3842 and we consequently need to split. We do this because REG+REG
3843 is not an offsettable address. If we get the situation in reload
3844 where source and destination of a movtf pattern are both MEMs with
3845 REG+REG address, then only one of them gets converted to an
3846 offsettable address. */
3848 && ! (TARGET_ARCH64 && TARGET_HARD_QUAD))
3851 /* Likewise for TImode, but in all cases. */
3855 /* We prohibit REG + REG on ARCH32 if not optimizing for
3856 DFmode/DImode because then mem_min_alignment is likely to be zero
3857 after reload and the forced split would lack a matching splitter
3859 if (TARGET_ARCH32 && !optimize
3860 && (mode == DFmode || mode == DImode))
3863 else if (USE_AS_OFFSETABLE_LO10
3864 && GET_CODE (rs1) == LO_SUM
3866 && ! TARGET_CM_MEDMID
3867 && RTX_OK_FOR_OLO10_P (rs2, mode))
3870 imm1 = XEXP (rs1, 1);
3871 rs1 = XEXP (rs1, 0);
3872 if (!CONSTANT_P (imm1)
3873 || (GET_CODE (rs1) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs1)))
3877 else if (GET_CODE (addr) == LO_SUM)
3879 rs1 = XEXP (addr, 0);
3880 imm1 = XEXP (addr, 1);
3882 if (!CONSTANT_P (imm1)
3883 || (GET_CODE (rs1) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs1)))
3886 /* We can't allow TFmode in 32-bit mode, because an offset greater
3887 than the alignment (8) may cause the LO_SUM to overflow. */
3888 if (mode == TFmode && TARGET_ARCH32)
3891 else if (GET_CODE (addr) == CONST_INT && SMALL_INT (addr))
3896 if (GET_CODE (rs1) == SUBREG)
3897 rs1 = SUBREG_REG (rs1);
3903 if (GET_CODE (rs2) == SUBREG)
3904 rs2 = SUBREG_REG (rs2);
3911 if (!REGNO_OK_FOR_BASE_P (REGNO (rs1))
3912 || (rs2 && !REGNO_OK_FOR_BASE_P (REGNO (rs2))))
3917 if ((! SPARC_INT_REG_P (REGNO (rs1))
3918 && REGNO (rs1) != FRAME_POINTER_REGNUM
3919 && REGNO (rs1) < FIRST_PSEUDO_REGISTER)
3921 && (! SPARC_INT_REG_P (REGNO (rs2))
3922 && REGNO (rs2) != FRAME_POINTER_REGNUM
3923 && REGNO (rs2) < FIRST_PSEUDO_REGISTER)))
3929 /* Return the SYMBOL_REF for the tls_get_addr function. */
3931 static GTY(()) rtx sparc_tls_symbol = NULL_RTX;
3934 sparc_tls_get_addr (void)
3936 if (!sparc_tls_symbol)
3937 sparc_tls_symbol = gen_rtx_SYMBOL_REF (Pmode, "__tls_get_addr");
3939 return sparc_tls_symbol;
3942 /* Return the Global Offset Table to be used in TLS mode. */
3945 sparc_tls_got (void)
3947 /* In PIC mode, this is just the PIC offset table. */
3950 crtl->uses_pic_offset_table = 1;
3951 return pic_offset_table_rtx;
3954 /* In non-PIC mode, Sun as (unlike GNU as) emits PC-relative relocations for
3955 the GOT symbol with the 32-bit ABI, so we reload the GOT register. */
3956 if (TARGET_SUN_TLS && TARGET_ARCH32)
3958 load_got_register ();
3959 return global_offset_table_rtx;
3962 /* In all other cases, we load a new pseudo with the GOT symbol. */
3963 return copy_to_reg (sparc_got ());
3966 /* Return true if X contains a thread-local symbol. */
3969 sparc_tls_referenced_p (rtx x)
3971 if (!TARGET_HAVE_TLS)
3974 if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS)
3975 x = XEXP (XEXP (x, 0), 0);
3977 if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x))
3980 /* That's all we handle in sparc_legitimize_tls_address for now. */
3984 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
3985 this (thread-local) address. */
3988 sparc_legitimize_tls_address (rtx addr)
3990 rtx temp1, temp2, temp3, ret, o0, got, insn;
3992 gcc_assert (can_create_pseudo_p ());
3994 if (GET_CODE (addr) == SYMBOL_REF)
3995 switch (SYMBOL_REF_TLS_MODEL (addr))
3997 case TLS_MODEL_GLOBAL_DYNAMIC:
3999 temp1 = gen_reg_rtx (SImode);
4000 temp2 = gen_reg_rtx (SImode);
4001 ret = gen_reg_rtx (Pmode);
4002 o0 = gen_rtx_REG (Pmode, 8);
4003 got = sparc_tls_got ();
4004 emit_insn (gen_tgd_hi22 (temp1, addr));
4005 emit_insn (gen_tgd_lo10 (temp2, temp1, addr));
4008 emit_insn (gen_tgd_add32 (o0, got, temp2, addr));
4009 insn = emit_call_insn (gen_tgd_call32 (o0, sparc_tls_get_addr (),
4014 emit_insn (gen_tgd_add64 (o0, got, temp2, addr));
4015 insn = emit_call_insn (gen_tgd_call64 (o0, sparc_tls_get_addr (),
4018 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), o0);
4019 insn = get_insns ();
4021 emit_libcall_block (insn, ret, o0, addr);
4024 case TLS_MODEL_LOCAL_DYNAMIC:
4026 temp1 = gen_reg_rtx (SImode);
4027 temp2 = gen_reg_rtx (SImode);
4028 temp3 = gen_reg_rtx (Pmode);
4029 ret = gen_reg_rtx (Pmode);
4030 o0 = gen_rtx_REG (Pmode, 8);
4031 got = sparc_tls_got ();
4032 emit_insn (gen_tldm_hi22 (temp1));
4033 emit_insn (gen_tldm_lo10 (temp2, temp1));
4036 emit_insn (gen_tldm_add32 (o0, got, temp2));
4037 insn = emit_call_insn (gen_tldm_call32 (o0, sparc_tls_get_addr (),
4042 emit_insn (gen_tldm_add64 (o0, got, temp2));
4043 insn = emit_call_insn (gen_tldm_call64 (o0, sparc_tls_get_addr (),
4046 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), o0);
4047 insn = get_insns ();
4049 emit_libcall_block (insn, temp3, o0,
4050 gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
4051 UNSPEC_TLSLD_BASE));
4052 temp1 = gen_reg_rtx (SImode);
4053 temp2 = gen_reg_rtx (SImode);
4054 emit_insn (gen_tldo_hix22 (temp1, addr));
4055 emit_insn (gen_tldo_lox10 (temp2, temp1, addr));
4057 emit_insn (gen_tldo_add32 (ret, temp3, temp2, addr));
4059 emit_insn (gen_tldo_add64 (ret, temp3, temp2, addr));
4062 case TLS_MODEL_INITIAL_EXEC:
4063 temp1 = gen_reg_rtx (SImode);
4064 temp2 = gen_reg_rtx (SImode);
4065 temp3 = gen_reg_rtx (Pmode);
4066 got = sparc_tls_got ();
4067 emit_insn (gen_tie_hi22 (temp1, addr));
4068 emit_insn (gen_tie_lo10 (temp2, temp1, addr));
4070 emit_insn (gen_tie_ld32 (temp3, got, temp2, addr));
4072 emit_insn (gen_tie_ld64 (temp3, got, temp2, addr));
4075 ret = gen_reg_rtx (Pmode);
4077 emit_insn (gen_tie_add32 (ret, gen_rtx_REG (Pmode, 7),
4080 emit_insn (gen_tie_add64 (ret, gen_rtx_REG (Pmode, 7),
4084 ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp3);
4087 case TLS_MODEL_LOCAL_EXEC:
4088 temp1 = gen_reg_rtx (Pmode);
4089 temp2 = gen_reg_rtx (Pmode);
4092 emit_insn (gen_tle_hix22_sp32 (temp1, addr));
4093 emit_insn (gen_tle_lox10_sp32 (temp2, temp1, addr));
4097 emit_insn (gen_tle_hix22_sp64 (temp1, addr));
4098 emit_insn (gen_tle_lox10_sp64 (temp2, temp1, addr));
4100 ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp2);
4107 else if (GET_CODE (addr) == CONST)
4111 gcc_assert (GET_CODE (XEXP (addr, 0)) == PLUS);
4113 base = sparc_legitimize_tls_address (XEXP (XEXP (addr, 0), 0));
4114 offset = XEXP (XEXP (addr, 0), 1);
4116 base = force_operand (base, NULL_RTX);
4117 if (!(GET_CODE (offset) == CONST_INT && SMALL_INT (offset)))
4118 offset = force_reg (Pmode, offset);
4119 ret = gen_rtx_PLUS (Pmode, base, offset);
4123 gcc_unreachable (); /* for now ... */
4128 /* Legitimize PIC addresses. If the address is already position-independent,
4129 we return ORIG. Newly generated position-independent addresses go into a
4130 reg. This is REG if nonzero, otherwise we allocate register(s) as
4134 sparc_legitimize_pic_address (rtx orig, rtx reg)
4136 bool gotdata_op = false;
4138 if (GET_CODE (orig) == SYMBOL_REF
4139 /* See the comment in sparc_expand_move. */
4140 || (GET_CODE (orig) == LABEL_REF && !can_use_mov_pic_label_ref (orig)))
4142 rtx pic_ref, address;
4147 gcc_assert (can_create_pseudo_p ());
4148 reg = gen_reg_rtx (Pmode);
4153 /* If not during reload, allocate another temp reg here for loading
4154 in the address, so that these instructions can be optimized
4156 rtx temp_reg = (! can_create_pseudo_p ()
4157 ? reg : gen_reg_rtx (Pmode));
4159 /* Must put the SYMBOL_REF inside an UNSPEC here so that cse
4160 won't get confused into thinking that these two instructions
4161 are loading in the true address of the symbol. If in the
4162 future a PIC rtx exists, that should be used instead. */
4165 emit_insn (gen_movdi_high_pic (temp_reg, orig));
4166 emit_insn (gen_movdi_lo_sum_pic (temp_reg, temp_reg, orig));
4170 emit_insn (gen_movsi_high_pic (temp_reg, orig));
4171 emit_insn (gen_movsi_lo_sum_pic (temp_reg, temp_reg, orig));
4179 crtl->uses_pic_offset_table = 1;
4183 insn = emit_insn (gen_movdi_pic_gotdata_op (reg,
4184 pic_offset_table_rtx,
4187 insn = emit_insn (gen_movsi_pic_gotdata_op (reg,
4188 pic_offset_table_rtx,
4194 = gen_const_mem (Pmode,
4195 gen_rtx_PLUS (Pmode,
4196 pic_offset_table_rtx, address));
4197 insn = emit_move_insn (reg, pic_ref);
4200 /* Put a REG_EQUAL note on this insn, so that it can be optimized
4202 set_unique_reg_note (insn, REG_EQUAL, orig);
4205 else if (GET_CODE (orig) == CONST)
4209 if (GET_CODE (XEXP (orig, 0)) == PLUS
4210 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
4215 gcc_assert (can_create_pseudo_p ());
4216 reg = gen_reg_rtx (Pmode);
4219 gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
4220 base = sparc_legitimize_pic_address (XEXP (XEXP (orig, 0), 0), reg);
4221 offset = sparc_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
4222 base == reg ? NULL_RTX : reg);
4224 if (GET_CODE (offset) == CONST_INT)
4226 if (SMALL_INT (offset))
4227 return plus_constant (Pmode, base, INTVAL (offset));
4228 else if (can_create_pseudo_p ())
4229 offset = force_reg (Pmode, offset);
4231 /* If we reach here, then something is seriously wrong. */
4234 return gen_rtx_PLUS (Pmode, base, offset);
4236 else if (GET_CODE (orig) == LABEL_REF)
4237 /* ??? We ought to be checking that the register is live instead, in case
4238 it is eliminated. */
4239 crtl->uses_pic_offset_table = 1;
4244 /* Try machine-dependent ways of modifying an illegitimate address X
4245 to be legitimate. If we find one, return the new, valid address.
4247 OLDX is the address as it was before break_out_memory_refs was called.
4248 In some cases it is useful to look at this to decide what needs to be done.
4250 MODE is the mode of the operand pointed to by X.
4252 On SPARC, change REG+N into REG+REG, and REG+(X*Y) into REG+REG. */
4255 sparc_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
4256 enum machine_mode mode)
4260 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == MULT)
4261 x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
4262 force_operand (XEXP (x, 0), NULL_RTX));
4263 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == MULT)
4264 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
4265 force_operand (XEXP (x, 1), NULL_RTX));
4266 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS)
4267 x = gen_rtx_PLUS (Pmode, force_operand (XEXP (x, 0), NULL_RTX),
4269 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == PLUS)
4270 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
4271 force_operand (XEXP (x, 1), NULL_RTX));
4273 if (x != orig_x && sparc_legitimate_address_p (mode, x, FALSE))
4276 if (sparc_tls_referenced_p (x))
4277 x = sparc_legitimize_tls_address (x);
4279 x = sparc_legitimize_pic_address (x, NULL_RTX);
4280 else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 1)))
4281 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
4282 copy_to_mode_reg (Pmode, XEXP (x, 1)));
4283 else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 0)))
4284 x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
4285 copy_to_mode_reg (Pmode, XEXP (x, 0)));
4286 else if (GET_CODE (x) == SYMBOL_REF
4287 || GET_CODE (x) == CONST
4288 || GET_CODE (x) == LABEL_REF)
4289 x = copy_to_suggested_reg (x, NULL_RTX, Pmode);
4294 /* Delegitimize an address that was legitimized by the above function. */
4297 sparc_delegitimize_address (rtx x)
4299 x = delegitimize_mem_from_attrs (x);
4301 if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 1)) == UNSPEC)
4302 switch (XINT (XEXP (x, 1), 1))
4304 case UNSPEC_MOVE_PIC:
4306 x = XVECEXP (XEXP (x, 1), 0, 0);
4307 gcc_assert (GET_CODE (x) == SYMBOL_REF);
4313 /* This is generated by mov{si,di}_pic_label_ref in PIC mode. */
4314 if (GET_CODE (x) == MINUS
4315 && REG_P (XEXP (x, 0))
4316 && REGNO (XEXP (x, 0)) == PIC_OFFSET_TABLE_REGNUM
4317 && GET_CODE (XEXP (x, 1)) == LO_SUM
4318 && GET_CODE (XEXP (XEXP (x, 1), 1)) == UNSPEC
4319 && XINT (XEXP (XEXP (x, 1), 1), 1) == UNSPEC_MOVE_PIC_LABEL)
4321 x = XVECEXP (XEXP (XEXP (x, 1), 1), 0, 0);
4322 gcc_assert (GET_CODE (x) == LABEL_REF);
4328 /* SPARC implementation of LEGITIMIZE_RELOAD_ADDRESS. Returns a value to
4329 replace the input X, or the original X if no replacement is called for.
4330 The output parameter *WIN is 1 if the calling macro should goto WIN,
4333 For SPARC, we wish to handle addresses by splitting them into
4334 HIGH+LO_SUM pairs, retaining the LO_SUM in the memory reference.
4335 This cuts the number of extra insns by one.
4337 Do nothing when generating PIC code and the address is a symbolic
4338 operand or requires a scratch register. */
4341 sparc_legitimize_reload_address (rtx x, enum machine_mode mode,
4342 int opnum, int type,
4343 int ind_levels ATTRIBUTE_UNUSED, int *win)
4345 /* Decompose SImode constants into HIGH+LO_SUM. */
4347 && (mode != TFmode || TARGET_ARCH64)
4348 && GET_MODE (x) == SImode
4349 && GET_CODE (x) != LO_SUM
4350 && GET_CODE (x) != HIGH
4351 && sparc_cmodel <= CM_MEDLOW
4353 && (symbolic_operand (x, Pmode) || pic_address_needs_scratch (x))))
4355 x = gen_rtx_LO_SUM (GET_MODE (x), gen_rtx_HIGH (GET_MODE (x), x), x);
4356 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4357 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
4358 opnum, (enum reload_type)type);
4363 /* We have to recognize what we have already generated above. */
4364 if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == HIGH)
4366 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4367 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
4368 opnum, (enum reload_type)type);
4377 /* Return true if ADDR (a legitimate address expression)
4378 has an effect that depends on the machine mode it is used for.
4384 is not equivalent to
4386 (mem:QI [%l7+a]) (mem:QI [%l7+a+1])
4388 because [%l7+a+1] is interpreted as the address of (a+1). */
4392 sparc_mode_dependent_address_p (const_rtx addr,
4393 addr_space_t as ATTRIBUTE_UNUSED)
4395 if (flag_pic && GET_CODE (addr) == PLUS)
4397 rtx op0 = XEXP (addr, 0);
4398 rtx op1 = XEXP (addr, 1);
4399 if (op0 == pic_offset_table_rtx
4400 && symbolic_operand (op1, VOIDmode))
4407 #ifdef HAVE_GAS_HIDDEN
4408 # define USE_HIDDEN_LINKONCE 1
4410 # define USE_HIDDEN_LINKONCE 0
4414 get_pc_thunk_name (char name[32], unsigned int regno)
4416 const char *reg_name = reg_names[regno];
4418 /* Skip the leading '%' as that cannot be used in a
4422 if (USE_HIDDEN_LINKONCE)
4423 sprintf (name, "__sparc_get_pc_thunk.%s", reg_name);
4425 ASM_GENERATE_INTERNAL_LABEL (name, "LADDPC", regno);
4428 /* Wrapper around the load_pcrel_sym{si,di} patterns. */
4431 gen_load_pcrel_sym (rtx op0, rtx op1, rtx op2, rtx op3)
4433 int orig_flag_pic = flag_pic;
4436 /* The load_pcrel_sym{si,di} patterns require absolute addressing. */
4439 insn = gen_load_pcrel_symdi (op0, op1, op2, op3);
4441 insn = gen_load_pcrel_symsi (op0, op1, op2, op3);
4442 flag_pic = orig_flag_pic;
4447 /* Emit code to load the GOT register. */
4450 load_got_register (void)
4452 /* In PIC mode, this will retrieve pic_offset_table_rtx. */
4453 if (!global_offset_table_rtx)
4454 global_offset_table_rtx = gen_rtx_REG (Pmode, GLOBAL_OFFSET_TABLE_REGNUM);
4456 if (TARGET_VXWORKS_RTP)
4457 emit_insn (gen_vxworks_load_got ());
4460 /* The GOT symbol is subject to a PC-relative relocation so we need a
4461 helper function to add the PC value and thus get the final value. */
4462 if (!got_helper_rtx)
4465 get_pc_thunk_name (name, GLOBAL_OFFSET_TABLE_REGNUM);
4466 got_helper_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
4469 emit_insn (gen_load_pcrel_sym (global_offset_table_rtx, sparc_got (),
4471 GEN_INT (GLOBAL_OFFSET_TABLE_REGNUM)));
4474 /* Need to emit this whether or not we obey regdecls,
4475 since setjmp/longjmp can cause life info to screw up.
4476 ??? In the case where we don't obey regdecls, this is not sufficient
4477 since we may not fall out the bottom. */
4478 emit_use (global_offset_table_rtx);
4481 /* Emit a call instruction with the pattern given by PAT. ADDR is the
4482 address of the call target. */
4485 sparc_emit_call_insn (rtx pat, rtx addr)
4489 insn = emit_call_insn (pat);
4491 /* The PIC register is live on entry to VxWorks PIC PLT entries. */
4492 if (TARGET_VXWORKS_RTP
4494 && GET_CODE (addr) == SYMBOL_REF
4495 && (SYMBOL_REF_DECL (addr)
4496 ? !targetm.binds_local_p (SYMBOL_REF_DECL (addr))
4497 : !SYMBOL_REF_LOCAL_P (addr)))
4499 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
4500 crtl->uses_pic_offset_table = 1;
4504 /* Return 1 if RTX is a MEM which is known to be aligned to at
4505 least a DESIRED byte boundary. */
4508 mem_min_alignment (rtx mem, int desired)
4510 rtx addr, base, offset;
4512 /* If it's not a MEM we can't accept it. */
4513 if (GET_CODE (mem) != MEM)
4517 if (!TARGET_UNALIGNED_DOUBLES
4518 && MEM_ALIGN (mem) / BITS_PER_UNIT >= (unsigned)desired)
4521 /* ??? The rest of the function predates MEM_ALIGN so
4522 there is probably a bit of redundancy. */
4523 addr = XEXP (mem, 0);
4524 base = offset = NULL_RTX;
4525 if (GET_CODE (addr) == PLUS)
4527 if (GET_CODE (XEXP (addr, 0)) == REG)
4529 base = XEXP (addr, 0);
4531 /* What we are saying here is that if the base
4532 REG is aligned properly, the compiler will make
4533 sure any REG based index upon it will be so
4535 if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
4536 offset = XEXP (addr, 1);
4538 offset = const0_rtx;
4541 else if (GET_CODE (addr) == REG)
4544 offset = const0_rtx;
4547 if (base != NULL_RTX)
4549 int regno = REGNO (base);
4551 if (regno != HARD_FRAME_POINTER_REGNUM && regno != STACK_POINTER_REGNUM)
4553 /* Check if the compiler has recorded some information
4554 about the alignment of the base REG. If reload has
4555 completed, we already matched with proper alignments.
4556 If not running global_alloc, reload might give us
4557 unaligned pointer to local stack though. */
4559 && REGNO_POINTER_ALIGN (regno) >= desired * BITS_PER_UNIT)
4560 || (optimize && reload_completed))
4561 && (INTVAL (offset) & (desired - 1)) == 0)
4566 if (((INTVAL (offset) - SPARC_STACK_BIAS) & (desired - 1)) == 0)
4570 else if (! TARGET_UNALIGNED_DOUBLES
4571 || CONSTANT_P (addr)
4572 || GET_CODE (addr) == LO_SUM)
4574 /* Anything else we know is properly aligned unless TARGET_UNALIGNED_DOUBLES
4575 is true, in which case we can only assume that an access is aligned if
4576 it is to a constant address, or the address involves a LO_SUM. */
4580 /* An obviously unaligned address. */
4585 /* Vectors to keep interesting information about registers where it can easily
4586 be got. We used to use the actual mode value as the bit number, but there
4587 are more than 32 modes now. Instead we use two tables: one indexed by
4588 hard register number, and one indexed by mode. */
4590 /* The purpose of sparc_mode_class is to shrink the range of modes so that
4591 they all fit (as bit numbers) in a 32-bit word (again). Each real mode is
4592 mapped into one sparc_mode_class mode. */
4594 enum sparc_mode_class {
4595 H_MODE, S_MODE, D_MODE, T_MODE, O_MODE,
4596 SF_MODE, DF_MODE, TF_MODE, OF_MODE,
4600 /* Modes for single-word and smaller quantities. */
4602 ((1 << (int) H_MODE) | (1 << (int) S_MODE) | (1 << (int) SF_MODE))
4604 /* Modes for double-word and smaller quantities. */
4605 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
4607 /* Modes for quad-word and smaller quantities. */
4608 #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
4610 /* Modes for 8-word and smaller quantities. */
4611 #define O_MODES (T_MODES | (1 << (int) O_MODE) | (1 << (int) OF_MODE))
4613 /* Modes for single-float quantities. */
4614 #define SF_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
4616 /* Modes for double-float and smaller quantities. */
4617 #define DF_MODES (SF_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
4619 /* Modes for quad-float and smaller quantities. */
4620 #define TF_MODES (DF_MODES | (1 << (int) TF_MODE))
4622 /* Modes for quad-float pairs and smaller quantities. */
4623 #define OF_MODES (TF_MODES | (1 << (int) OF_MODE))
4625 /* Modes for double-float only quantities. */
4626 #define DF_MODES_NO_S ((1 << (int) D_MODE) | (1 << (int) DF_MODE))
4628 /* Modes for quad-float and double-float only quantities. */
4629 #define TF_MODES_NO_S (DF_MODES_NO_S | (1 << (int) TF_MODE))
4631 /* Modes for quad-float pairs and double-float only quantities. */
4632 #define OF_MODES_NO_S (TF_MODES_NO_S | (1 << (int) OF_MODE))
4634 /* Modes for condition codes. */
4635 #define CC_MODES (1 << (int) CC_MODE)
4636 #define CCFP_MODES (1 << (int) CCFP_MODE)
4638 /* Value is 1 if register/mode pair is acceptable on sparc.
4639 The funny mixture of D and T modes is because integer operations
4640 do not specially operate on tetra quantities, so non-quad-aligned
4641 registers can hold quadword quantities (except %o4 and %i4 because
4642 they cross fixed registers). */
4644 /* This points to either the 32 bit or the 64 bit version. */
4645 const int *hard_regno_mode_classes;
4647 static const int hard_32bit_mode_classes[] = {
4648 S_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
4649 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
4650 T_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
4651 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
4653 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4654 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4655 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4656 OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
4658 /* FP regs f32 to f63. Only the even numbered registers actually exist,
4659 and none can hold SFmode/SImode values. */
4660 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4661 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4662 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4663 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4666 CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
4668 /* %icc, %sfp, %gsr */
4669 CC_MODES, 0, D_MODES
4672 static const int hard_64bit_mode_classes[] = {
4673 D_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4674 O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4675 T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4676 O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4678 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4679 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4680 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4681 OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
4683 /* FP regs f32 to f63. Only the even numbered registers actually exist,
4684 and none can hold SFmode/SImode values. */
4685 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4686 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4687 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4688 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4691 CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
4693 /* %icc, %sfp, %gsr */
4694 CC_MODES, 0, D_MODES
4697 int sparc_mode_class [NUM_MACHINE_MODES];
4699 enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
4702 sparc_init_modes (void)
4706 for (i = 0; i < NUM_MACHINE_MODES; i++)
4708 switch (GET_MODE_CLASS (i))
4711 case MODE_PARTIAL_INT:
4712 case MODE_COMPLEX_INT:
4713 if (GET_MODE_SIZE (i) < 4)
4714 sparc_mode_class[i] = 1 << (int) H_MODE;
4715 else if (GET_MODE_SIZE (i) == 4)
4716 sparc_mode_class[i] = 1 << (int) S_MODE;
4717 else if (GET_MODE_SIZE (i) == 8)
4718 sparc_mode_class[i] = 1 << (int) D_MODE;
4719 else if (GET_MODE_SIZE (i) == 16)
4720 sparc_mode_class[i] = 1 << (int) T_MODE;
4721 else if (GET_MODE_SIZE (i) == 32)
4722 sparc_mode_class[i] = 1 << (int) O_MODE;
4724 sparc_mode_class[i] = 0;
4726 case MODE_VECTOR_INT:
4727 if (GET_MODE_SIZE (i) == 4)
4728 sparc_mode_class[i] = 1 << (int) SF_MODE;
4729 else if (GET_MODE_SIZE (i) == 8)
4730 sparc_mode_class[i] = 1 << (int) DF_MODE;
4732 sparc_mode_class[i] = 0;
4735 case MODE_COMPLEX_FLOAT:
4736 if (GET_MODE_SIZE (i) == 4)
4737 sparc_mode_class[i] = 1 << (int) SF_MODE;
4738 else if (GET_MODE_SIZE (i) == 8)
4739 sparc_mode_class[i] = 1 << (int) DF_MODE;
4740 else if (GET_MODE_SIZE (i) == 16)
4741 sparc_mode_class[i] = 1 << (int) TF_MODE;
4742 else if (GET_MODE_SIZE (i) == 32)
4743 sparc_mode_class[i] = 1 << (int) OF_MODE;
4745 sparc_mode_class[i] = 0;
4748 if (i == (int) CCFPmode || i == (int) CCFPEmode)
4749 sparc_mode_class[i] = 1 << (int) CCFP_MODE;
4751 sparc_mode_class[i] = 1 << (int) CC_MODE;
4754 sparc_mode_class[i] = 0;
4760 hard_regno_mode_classes = hard_64bit_mode_classes;
4762 hard_regno_mode_classes = hard_32bit_mode_classes;
4764 /* Initialize the array used by REGNO_REG_CLASS. */
4765 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4767 if (i < 16 && TARGET_V8PLUS)
4768 sparc_regno_reg_class[i] = I64_REGS;
4769 else if (i < 32 || i == FRAME_POINTER_REGNUM)
4770 sparc_regno_reg_class[i] = GENERAL_REGS;
4772 sparc_regno_reg_class[i] = FP_REGS;
4774 sparc_regno_reg_class[i] = EXTRA_FP_REGS;
4776 sparc_regno_reg_class[i] = FPCC_REGS;
4778 sparc_regno_reg_class[i] = NO_REGS;
4782 /* Return whether REGNO, a global or FP register, must be saved/restored. */
4785 save_global_or_fp_reg_p (unsigned int regno,
4786 int leaf_function ATTRIBUTE_UNUSED)
4788 return !call_used_regs[regno] && df_regs_ever_live_p (regno);
4791 /* Return whether the return address register (%i7) is needed. */
4794 return_addr_reg_needed_p (int leaf_function)
4796 /* If it is live, for example because of __builtin_return_address (0). */
4797 if (df_regs_ever_live_p (RETURN_ADDR_REGNUM))
4800 /* Otherwise, it is needed as save register if %o7 is clobbered. */
4802 /* Loading the GOT register clobbers %o7. */
4803 || crtl->uses_pic_offset_table
4804 || df_regs_ever_live_p (INCOMING_RETURN_ADDR_REGNUM))
4810 /* Return whether REGNO, a local or in register, must be saved/restored. */
4813 save_local_or_in_reg_p (unsigned int regno, int leaf_function)
4815 /* General case: call-saved registers live at some point. */
4816 if (!call_used_regs[regno] && df_regs_ever_live_p (regno))
4819 /* Frame pointer register (%fp) if needed. */
4820 if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
4823 /* Return address register (%i7) if needed. */
4824 if (regno == RETURN_ADDR_REGNUM && return_addr_reg_needed_p (leaf_function))
4827 /* GOT register (%l7) if needed. */
4828 if (regno == PIC_OFFSET_TABLE_REGNUM && crtl->uses_pic_offset_table)
4831 /* If the function accesses prior frames, the frame pointer and the return
4832 address of the previous frame must be saved on the stack. */
4833 if (crtl->accesses_prior_frames
4834 && (regno == HARD_FRAME_POINTER_REGNUM || regno == RETURN_ADDR_REGNUM))
4840 /* Compute the frame size required by the function. This function is called
4841 during the reload pass and also by sparc_expand_prologue. */
4844 sparc_compute_frame_size (HOST_WIDE_INT size, int leaf_function)
4846 HOST_WIDE_INT frame_size, apparent_frame_size;
4847 int args_size, n_global_fp_regs = 0;
4848 bool save_local_in_regs_p = false;
4851 /* If the function allocates dynamic stack space, the dynamic offset is
4852 computed early and contains REG_PARM_STACK_SPACE, so we need to cope. */
4853 if (leaf_function && !cfun->calls_alloca)
4856 args_size = crtl->outgoing_args_size + REG_PARM_STACK_SPACE (cfun->decl);
4858 /* Calculate space needed for global registers. */
4860 for (i = 0; i < 8; i++)
4861 if (save_global_or_fp_reg_p (i, 0))
4862 n_global_fp_regs += 2;
4864 for (i = 0; i < 8; i += 2)
4865 if (save_global_or_fp_reg_p (i, 0) || save_global_or_fp_reg_p (i + 1, 0))
4866 n_global_fp_regs += 2;
4868 /* In the flat window model, find out which local and in registers need to
4869 be saved. We don't reserve space in the current frame for them as they
4870 will be spilled into the register window save area of the caller's frame.
4871 However, as soon as we use this register window save area, we must create
4872 that of the current frame to make it the live one. */
4874 for (i = 16; i < 32; i++)
4875 if (save_local_or_in_reg_p (i, leaf_function))
4877 save_local_in_regs_p = true;
4881 /* Calculate space needed for FP registers. */
4882 for (i = 32; i < (TARGET_V9 ? 96 : 64); i += 2)
4883 if (save_global_or_fp_reg_p (i, 0) || save_global_or_fp_reg_p (i + 1, 0))
4884 n_global_fp_regs += 2;
4887 && n_global_fp_regs == 0
4889 && !save_local_in_regs_p)
4890 frame_size = apparent_frame_size = 0;
4893 /* We subtract STARTING_FRAME_OFFSET, remember it's negative. */
4894 apparent_frame_size = (size - STARTING_FRAME_OFFSET + 7) & -8;
4895 apparent_frame_size += n_global_fp_regs * 4;
4897 /* We need to add the size of the outgoing argument area. */
4898 frame_size = apparent_frame_size + ((args_size + 7) & -8);
4900 /* And that of the register window save area. */
4901 frame_size += FIRST_PARM_OFFSET (cfun->decl);
4903 /* Finally, bump to the appropriate alignment. */
4904 frame_size = SPARC_STACK_ALIGN (frame_size);
4907 /* Set up values for use in prologue and epilogue. */
4908 sparc_frame_size = frame_size;
4909 sparc_apparent_frame_size = apparent_frame_size;
4910 sparc_n_global_fp_regs = n_global_fp_regs;
4911 sparc_save_local_in_regs_p = save_local_in_regs_p;
4916 /* Implement the macro INITIAL_ELIMINATION_OFFSET, return the OFFSET. */
4919 sparc_initial_elimination_offset (int to)
4923 if (to == STACK_POINTER_REGNUM)
4924 offset = sparc_compute_frame_size (get_frame_size (), crtl->is_leaf);
4928 offset += SPARC_STACK_BIAS;
4932 /* Output any necessary .register pseudo-ops. */
4935 sparc_output_scratch_registers (FILE *file ATTRIBUTE_UNUSED)
4937 #ifdef HAVE_AS_REGISTER_PSEUDO_OP
4943 /* Check if %g[2367] were used without
4944 .register being printed for them already. */
4945 for (i = 2; i < 8; i++)
4947 if (df_regs_ever_live_p (i)
4948 && ! sparc_hard_reg_printed [i])
4950 sparc_hard_reg_printed [i] = 1;
4951 /* %g7 is used as TLS base register, use #ignore
4952 for it instead of #scratch. */
4953 fprintf (file, "\t.register\t%%g%d, #%s\n", i,
4954 i == 7 ? "ignore" : "scratch");
4961 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
4963 #if PROBE_INTERVAL > 4096
4964 #error Cannot use indexed addressing mode for stack probing
4967 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
4968 inclusive. These are offsets from the current stack pointer.
4970 Note that we don't use the REG+REG addressing mode for the probes because
4971 of the stack bias in 64-bit mode. And it doesn't really buy us anything
4972 so the advantages of having a single code win here. */
4975 sparc_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
4977 rtx g1 = gen_rtx_REG (Pmode, 1);
4979 /* See if we have a constant small number of probes to generate. If so,
4980 that's the easy case. */
4981 if (size <= PROBE_INTERVAL)
4983 emit_move_insn (g1, GEN_INT (first));
4984 emit_insn (gen_rtx_SET (VOIDmode, g1,
4985 gen_rtx_MINUS (Pmode, stack_pointer_rtx, g1)));
4986 emit_stack_probe (plus_constant (Pmode, g1, -size));
4989 /* The run-time loop is made up of 10 insns in the generic case while the
4990 compile-time loop is made up of 4+2*(n-2) insns for n # of intervals. */
4991 else if (size <= 5 * PROBE_INTERVAL)
4995 emit_move_insn (g1, GEN_INT (first + PROBE_INTERVAL));
4996 emit_insn (gen_rtx_SET (VOIDmode, g1,
4997 gen_rtx_MINUS (Pmode, stack_pointer_rtx, g1)));
4998 emit_stack_probe (g1);
5000 /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 2 until
5001 it exceeds SIZE. If only two probes are needed, this will not
5002 generate any code. Then probe at FIRST + SIZE. */
5003 for (i = 2 * PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
5005 emit_insn (gen_rtx_SET (VOIDmode, g1,
5006 plus_constant (Pmode, g1, -PROBE_INTERVAL)));
5007 emit_stack_probe (g1);
5010 emit_stack_probe (plus_constant (Pmode, g1,
5011 (i - PROBE_INTERVAL) - size));
5014 /* Otherwise, do the same as above, but in a loop. Note that we must be
5015 extra careful with variables wrapping around because we might be at
5016 the very top (or the very bottom) of the address space and we have
5017 to be able to handle this case properly; in particular, we use an
5018 equality test for the loop condition. */
5021 HOST_WIDE_INT rounded_size;
5022 rtx g4 = gen_rtx_REG (Pmode, 4);
5024 emit_move_insn (g1, GEN_INT (first));
5027 /* Step 1: round SIZE to the previous multiple of the interval. */
5029 rounded_size = size & -PROBE_INTERVAL;
5030 emit_move_insn (g4, GEN_INT (rounded_size));
5033 /* Step 2: compute initial and final value of the loop counter. */
5035 /* TEST_ADDR = SP + FIRST. */
5036 emit_insn (gen_rtx_SET (VOIDmode, g1,
5037 gen_rtx_MINUS (Pmode, stack_pointer_rtx, g1)));
5039 /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE. */
5040 emit_insn (gen_rtx_SET (VOIDmode, g4, gen_rtx_MINUS (Pmode, g1, g4)));
5045 while (TEST_ADDR != LAST_ADDR)
5047 TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
5051 probes at FIRST + N * PROBE_INTERVAL for values of N from 1
5052 until it is equal to ROUNDED_SIZE. */
5055 emit_insn (gen_probe_stack_rangedi (g1, g1, g4));
5057 emit_insn (gen_probe_stack_rangesi (g1, g1, g4));
5060 /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
5061 that SIZE is equal to ROUNDED_SIZE. */
5063 if (size != rounded_size)
5064 emit_stack_probe (plus_constant (Pmode, g4, rounded_size - size));
5067 /* Make sure nothing is scheduled before we are done. */
5068 emit_insn (gen_blockage ());
5071 /* Probe a range of stack addresses from REG1 to REG2 inclusive. These are
5072 absolute addresses. */
5075 output_probe_stack_range (rtx reg1, rtx reg2)
5077 static int labelno = 0;
5078 char loop_lab[32], end_lab[32];
5081 ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
5082 ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
5084 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
5086 /* Jump to END_LAB if TEST_ADDR == LAST_ADDR. */
5089 output_asm_insn ("cmp\t%0, %1", xops);
5091 fputs ("\tbe,pn\t%xcc,", asm_out_file);
5093 fputs ("\tbe\t", asm_out_file);
5094 assemble_name_raw (asm_out_file, end_lab);
5095 fputc ('\n', asm_out_file);
5097 /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL. */
5098 xops[1] = GEN_INT (-PROBE_INTERVAL);
5099 output_asm_insn (" add\t%0, %1, %0", xops);
5101 /* Probe at TEST_ADDR and branch. */
5103 fputs ("\tba,pt\t%xcc,", asm_out_file);
5105 fputs ("\tba\t", asm_out_file);
5106 assemble_name_raw (asm_out_file, loop_lab);
5107 fputc ('\n', asm_out_file);
5108 xops[1] = GEN_INT (SPARC_STACK_BIAS);
5109 output_asm_insn (" st\t%%g0, [%0+%1]", xops);
5111 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
5116 /* Emit code to save/restore registers from LOW to HIGH at BASE+OFFSET as
5117 needed. LOW is supposed to be double-word aligned for 32-bit registers.
5118 SAVE_P decides whether a register must be saved/restored. ACTION_TRUE
5119 is the action to be performed if SAVE_P returns true and ACTION_FALSE
5120 the action to be performed if it returns false. Return the new offset. */
5122 typedef bool (*sorr_pred_t) (unsigned int, int);
5123 typedef enum { SORR_NONE, SORR_ADVANCE, SORR_SAVE, SORR_RESTORE } sorr_act_t;
5126 emit_save_or_restore_regs (unsigned int low, unsigned int high, rtx base,
5127 int offset, int leaf_function, sorr_pred_t save_p,
5128 sorr_act_t action_true, sorr_act_t action_false)
5133 if (TARGET_ARCH64 && high <= 32)
5137 for (i = low; i < high; i++)
5139 if (save_p (i, leaf_function))
5141 mem = gen_frame_mem (DImode, plus_constant (Pmode,
5143 if (action_true == SORR_SAVE)
5145 insn = emit_move_insn (mem, gen_rtx_REG (DImode, i));
5146 RTX_FRAME_RELATED_P (insn) = 1;
5148 else /* action_true == SORR_RESTORE */
5150 /* The frame pointer must be restored last since its old
5151 value may be used as base address for the frame. This
5152 is problematic in 64-bit mode only because of the lack
5153 of double-word load instruction. */
5154 if (i == HARD_FRAME_POINTER_REGNUM)
5157 emit_move_insn (gen_rtx_REG (DImode, i), mem);
5161 else if (action_false == SORR_ADVANCE)
5167 mem = gen_frame_mem (DImode, plus_constant (Pmode, base, fp_offset));
5168 emit_move_insn (hard_frame_pointer_rtx, mem);
5173 for (i = low; i < high; i += 2)
5175 bool reg0 = save_p (i, leaf_function);
5176 bool reg1 = save_p (i + 1, leaf_function);
5177 enum machine_mode mode;
5182 mode = SPARC_INT_REG_P (i) ? DImode : DFmode;
5187 mode = SPARC_INT_REG_P (i) ? SImode : SFmode;
5192 mode = SPARC_INT_REG_P (i) ? SImode : SFmode;
5198 if (action_false == SORR_ADVANCE)
5203 mem = gen_frame_mem (mode, plus_constant (Pmode, base, offset));
5204 if (action_true == SORR_SAVE)
5206 insn = emit_move_insn (mem, gen_rtx_REG (mode, regno));
5207 RTX_FRAME_RELATED_P (insn) = 1;
5211 mem = gen_frame_mem (SImode, plus_constant (Pmode, base,
5213 set1 = gen_rtx_SET (VOIDmode, mem,
5214 gen_rtx_REG (SImode, regno));
5215 RTX_FRAME_RELATED_P (set1) = 1;
5217 = gen_frame_mem (SImode, plus_constant (Pmode, base,
5219 set2 = gen_rtx_SET (VOIDmode, mem,
5220 gen_rtx_REG (SImode, regno + 1));
5221 RTX_FRAME_RELATED_P (set2) = 1;
5222 add_reg_note (insn, REG_FRAME_RELATED_EXPR,
5223 gen_rtx_PARALLEL (VOIDmode,
5224 gen_rtvec (2, set1, set2)));
5227 else /* action_true == SORR_RESTORE */
5228 emit_move_insn (gen_rtx_REG (mode, regno), mem);
5230 /* Always preserve double-word alignment. */
5231 offset = (offset + 8) & -8;
5238 /* Emit code to adjust BASE to OFFSET. Return the new base. */
5241 emit_adjust_base_to_offset (rtx base, int offset)
5243 /* ??? This might be optimized a little as %g1 might already have a
5244 value close enough that a single add insn will do. */
5245 /* ??? Although, all of this is probably only a temporary fix because
5246 if %g1 can hold a function result, then sparc_expand_epilogue will
5247 lose (the result will be clobbered). */
5248 rtx new_base = gen_rtx_REG (Pmode, 1);
5249 emit_move_insn (new_base, GEN_INT (offset));
5250 emit_insn (gen_rtx_SET (VOIDmode,
5251 new_base, gen_rtx_PLUS (Pmode, base, new_base)));
5255 /* Emit code to save/restore call-saved global and FP registers. */
5258 emit_save_or_restore_global_fp_regs (rtx base, int offset, sorr_act_t action)
5260 if (offset < -4096 || offset + sparc_n_global_fp_regs * 4 > 4095)
5262 base = emit_adjust_base_to_offset (base, offset);
5267 = emit_save_or_restore_regs (0, 8, base, offset, 0,
5268 save_global_or_fp_reg_p, action, SORR_NONE);
5269 emit_save_or_restore_regs (32, TARGET_V9 ? 96 : 64, base, offset, 0,
5270 save_global_or_fp_reg_p, action, SORR_NONE);
5273 /* Emit code to save/restore call-saved local and in registers. */
5276 emit_save_or_restore_local_in_regs (rtx base, int offset, sorr_act_t action)
5278 if (offset < -4096 || offset + 16 * UNITS_PER_WORD > 4095)
5280 base = emit_adjust_base_to_offset (base, offset);
5284 emit_save_or_restore_regs (16, 32, base, offset, sparc_leaf_function_p,
5285 save_local_or_in_reg_p, action, SORR_ADVANCE);
5288 /* Emit a window_save insn. */
5291 emit_window_save (rtx increment)
5293 rtx insn = emit_insn (gen_window_save (increment));
5294 RTX_FRAME_RELATED_P (insn) = 1;
5296 /* The incoming return address (%o7) is saved in %i7. */
5297 add_reg_note (insn, REG_CFA_REGISTER,
5298 gen_rtx_SET (VOIDmode,
5299 gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM),
5301 INCOMING_RETURN_ADDR_REGNUM)));
5303 /* The window save event. */
5304 add_reg_note (insn, REG_CFA_WINDOW_SAVE, const0_rtx);
5306 /* The CFA is %fp, the hard frame pointer. */
5307 add_reg_note (insn, REG_CFA_DEF_CFA,
5308 plus_constant (Pmode, hard_frame_pointer_rtx,
5309 INCOMING_FRAME_SP_OFFSET));
5314 /* Generate an increment for the stack pointer. */
5317 gen_stack_pointer_inc (rtx increment)
5319 return gen_rtx_SET (VOIDmode,
5321 gen_rtx_PLUS (Pmode,
5326 /* Expand the function prologue. The prologue is responsible for reserving
5327 storage for the frame, saving the call-saved registers and loading the
5328 GOT register if needed. */
5331 sparc_expand_prologue (void)
5336 /* Compute a snapshot of crtl->uses_only_leaf_regs. Relying
5337 on the final value of the flag means deferring the prologue/epilogue
5338 expansion until just before the second scheduling pass, which is too
5339 late to emit multiple epilogues or return insns.
5341 Of course we are making the assumption that the value of the flag
5342 will not change between now and its final value. Of the three parts
5343 of the formula, only the last one can reasonably vary. Let's take a
5344 closer look, after assuming that the first two ones are set to true
5345 (otherwise the last value is effectively silenced).
5347 If only_leaf_regs_used returns false, the global predicate will also
5348 be false so the actual frame size calculated below will be positive.
5349 As a consequence, the save_register_window insn will be emitted in
5350 the instruction stream; now this insn explicitly references %fp
5351 which is not a leaf register so only_leaf_regs_used will always
5352 return false subsequently.
5354 If only_leaf_regs_used returns true, we hope that the subsequent
5355 optimization passes won't cause non-leaf registers to pop up. For
5356 example, the regrename pass has special provisions to not rename to
5357 non-leaf registers in a leaf function. */
5358 sparc_leaf_function_p
5359 = optimize > 0 && crtl->is_leaf && only_leaf_regs_used ();
5361 size = sparc_compute_frame_size (get_frame_size(), sparc_leaf_function_p);
5363 if (flag_stack_usage_info)
5364 current_function_static_stack_size = size;
5366 if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
5368 if (crtl->is_leaf && !cfun->calls_alloca)
5370 if (size > PROBE_INTERVAL && size > STACK_CHECK_PROTECT)
5371 sparc_emit_probe_stack_range (STACK_CHECK_PROTECT,
5372 size - STACK_CHECK_PROTECT);
5375 sparc_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
5380 else if (sparc_leaf_function_p)
5382 rtx size_int_rtx = GEN_INT (-size);
5385 insn = emit_insn (gen_stack_pointer_inc (size_int_rtx));
5386 else if (size <= 8192)
5388 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (-4096)));
5389 RTX_FRAME_RELATED_P (insn) = 1;
5391 /* %sp is still the CFA register. */
5392 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (4096 - size)));
5396 rtx size_rtx = gen_rtx_REG (Pmode, 1);
5397 emit_move_insn (size_rtx, size_int_rtx);
5398 insn = emit_insn (gen_stack_pointer_inc (size_rtx));
5399 add_reg_note (insn, REG_FRAME_RELATED_EXPR,
5400 gen_stack_pointer_inc (size_int_rtx));
5403 RTX_FRAME_RELATED_P (insn) = 1;
5407 rtx size_int_rtx = GEN_INT (-size);
5410 emit_window_save (size_int_rtx);
5411 else if (size <= 8192)
5413 emit_window_save (GEN_INT (-4096));
5415 /* %sp is not the CFA register anymore. */
5416 emit_insn (gen_stack_pointer_inc (GEN_INT (4096 - size)));
5418 /* Make sure no %fp-based store is issued until after the frame is
5419 established. The offset between the frame pointer and the stack
5420 pointer is calculated relative to the value of the stack pointer
5421 at the end of the function prologue, and moving instructions that
5422 access the stack via the frame pointer between the instructions
5423 that decrement the stack pointer could result in accessing the
5424 register window save area, which is volatile. */
5425 emit_insn (gen_frame_blockage ());
5429 rtx size_rtx = gen_rtx_REG (Pmode, 1);
5430 emit_move_insn (size_rtx, size_int_rtx);
5431 emit_window_save (size_rtx);
5435 if (sparc_leaf_function_p)
5437 sparc_frame_base_reg = stack_pointer_rtx;
5438 sparc_frame_base_offset = size + SPARC_STACK_BIAS;
5442 sparc_frame_base_reg = hard_frame_pointer_rtx;
5443 sparc_frame_base_offset = SPARC_STACK_BIAS;
5446 if (sparc_n_global_fp_regs > 0)
5447 emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5448 sparc_frame_base_offset
5449 - sparc_apparent_frame_size,
5452 /* Load the GOT register if needed. */
5453 if (crtl->uses_pic_offset_table)
5454 load_got_register ();
5456 /* Advertise that the data calculated just above are now valid. */
5457 sparc_prologue_data_valid_p = true;
5460 /* Expand the function prologue. The prologue is responsible for reserving
5461 storage for the frame, saving the call-saved registers and loading the
5462 GOT register if needed. */
5465 sparc_flat_expand_prologue (void)
5470 sparc_leaf_function_p = optimize > 0 && crtl->is_leaf;
5472 size = sparc_compute_frame_size (get_frame_size(), sparc_leaf_function_p);
5474 if (flag_stack_usage_info)
5475 current_function_static_stack_size = size;
5477 if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
5479 if (crtl->is_leaf && !cfun->calls_alloca)
5481 if (size > PROBE_INTERVAL && size > STACK_CHECK_PROTECT)
5482 sparc_emit_probe_stack_range (STACK_CHECK_PROTECT,
5483 size - STACK_CHECK_PROTECT);
5486 sparc_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
5489 if (sparc_save_local_in_regs_p)
5490 emit_save_or_restore_local_in_regs (stack_pointer_rtx, SPARC_STACK_BIAS,
5497 rtx size_int_rtx, size_rtx;
5499 size_rtx = size_int_rtx = GEN_INT (-size);
5501 /* We establish the frame (i.e. decrement the stack pointer) first, even
5502 if we use a frame pointer, because we cannot clobber any call-saved
5503 registers, including the frame pointer, if we haven't created a new
5504 register save area, for the sake of compatibility with the ABI. */
5506 insn = emit_insn (gen_stack_pointer_inc (size_int_rtx));
5507 else if (size <= 8192 && !frame_pointer_needed)
5509 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (-4096)));
5510 RTX_FRAME_RELATED_P (insn) = 1;
5511 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (4096 - size)));
5515 size_rtx = gen_rtx_REG (Pmode, 1);
5516 emit_move_insn (size_rtx, size_int_rtx);
5517 insn = emit_insn (gen_stack_pointer_inc (size_rtx));
5518 add_reg_note (insn, REG_CFA_ADJUST_CFA,
5519 gen_stack_pointer_inc (size_int_rtx));
5521 RTX_FRAME_RELATED_P (insn) = 1;
5523 /* Ensure nothing is scheduled until after the frame is established. */
5524 emit_insn (gen_blockage ());
5526 if (frame_pointer_needed)
5528 insn = emit_insn (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
5529 gen_rtx_MINUS (Pmode,
5532 RTX_FRAME_RELATED_P (insn) = 1;
5534 add_reg_note (insn, REG_CFA_ADJUST_CFA,
5535 gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
5536 plus_constant (Pmode, stack_pointer_rtx,
5540 if (return_addr_reg_needed_p (sparc_leaf_function_p))
5542 rtx o7 = gen_rtx_REG (Pmode, INCOMING_RETURN_ADDR_REGNUM);
5543 rtx i7 = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
5545 insn = emit_move_insn (i7, o7);
5546 RTX_FRAME_RELATED_P (insn) = 1;
5548 add_reg_note (insn, REG_CFA_REGISTER,
5549 gen_rtx_SET (VOIDmode, i7, o7));
5551 /* Prevent this instruction from ever being considered dead,
5552 even if this function has no epilogue. */
5557 if (frame_pointer_needed)
5559 sparc_frame_base_reg = hard_frame_pointer_rtx;
5560 sparc_frame_base_offset = SPARC_STACK_BIAS;
5564 sparc_frame_base_reg = stack_pointer_rtx;
5565 sparc_frame_base_offset = size + SPARC_STACK_BIAS;
5568 if (sparc_n_global_fp_regs > 0)
5569 emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5570 sparc_frame_base_offset
5571 - sparc_apparent_frame_size,
5574 /* Load the GOT register if needed. */
5575 if (crtl->uses_pic_offset_table)
5576 load_got_register ();
5578 /* Advertise that the data calculated just above are now valid. */
5579 sparc_prologue_data_valid_p = true;
5582 /* This function generates the assembly code for function entry, which boils
5583 down to emitting the necessary .register directives. */
5586 sparc_asm_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
5588 /* Check that the assumption we made in sparc_expand_prologue is valid. */
5590 gcc_assert (sparc_leaf_function_p == crtl->uses_only_leaf_regs);
5592 sparc_output_scratch_registers (file);
5595 /* Expand the function epilogue, either normal or part of a sibcall.
5596 We emit all the instructions except the return or the call. */
5599 sparc_expand_epilogue (bool for_eh)
5601 HOST_WIDE_INT size = sparc_frame_size;
5603 if (sparc_n_global_fp_regs > 0)
5604 emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5605 sparc_frame_base_offset
5606 - sparc_apparent_frame_size,
5609 if (size == 0 || for_eh)
5611 else if (sparc_leaf_function_p)
5614 emit_insn (gen_stack_pointer_inc (GEN_INT (size)));
5615 else if (size <= 8192)
5617 emit_insn (gen_stack_pointer_inc (GEN_INT (4096)));
5618 emit_insn (gen_stack_pointer_inc (GEN_INT (size - 4096)));
5622 rtx reg = gen_rtx_REG (Pmode, 1);
5623 emit_move_insn (reg, GEN_INT (size));
5624 emit_insn (gen_stack_pointer_inc (reg));
5629 /* Expand the function epilogue, either normal or part of a sibcall.
5630 We emit all the instructions except the return or the call. */
5633 sparc_flat_expand_epilogue (bool for_eh)
5635 HOST_WIDE_INT size = sparc_frame_size;
5637 if (sparc_n_global_fp_regs > 0)
5638 emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5639 sparc_frame_base_offset
5640 - sparc_apparent_frame_size,
5643 /* If we have a frame pointer, we'll need both to restore it before the
5644 frame is destroyed and use its current value in destroying the frame.
5645 Since we don't have an atomic way to do that in the flat window model,
5646 we save the current value into a temporary register (%g1). */
5647 if (frame_pointer_needed && !for_eh)
5648 emit_move_insn (gen_rtx_REG (Pmode, 1), hard_frame_pointer_rtx);
5650 if (return_addr_reg_needed_p (sparc_leaf_function_p))
5651 emit_move_insn (gen_rtx_REG (Pmode, INCOMING_RETURN_ADDR_REGNUM),
5652 gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM));
5654 if (sparc_save_local_in_regs_p)
5655 emit_save_or_restore_local_in_regs (sparc_frame_base_reg,
5656 sparc_frame_base_offset,
5659 if (size == 0 || for_eh)
5661 else if (frame_pointer_needed)
5663 /* Make sure the frame is destroyed after everything else is done. */
5664 emit_insn (gen_blockage ());
5666 emit_move_insn (stack_pointer_rtx, gen_rtx_REG (Pmode, 1));
5671 emit_insn (gen_blockage ());
5674 emit_insn (gen_stack_pointer_inc (GEN_INT (size)));
5675 else if (size <= 8192)
5677 emit_insn (gen_stack_pointer_inc (GEN_INT (4096)));
5678 emit_insn (gen_stack_pointer_inc (GEN_INT (size - 4096)));
5682 rtx reg = gen_rtx_REG (Pmode, 1);
5683 emit_move_insn (reg, GEN_INT (size));
5684 emit_insn (gen_stack_pointer_inc (reg));
5689 /* Return true if it is appropriate to emit `return' instructions in the
5690 body of a function. */
5693 sparc_can_use_return_insn_p (void)
5695 return sparc_prologue_data_valid_p
5696 && sparc_n_global_fp_regs == 0
5698 ? (sparc_frame_size == 0 && !sparc_save_local_in_regs_p)
5699 : (sparc_frame_size == 0 || !sparc_leaf_function_p);
5702 /* This function generates the assembly code for function exit. */
5705 sparc_asm_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
5707 /* If the last two instructions of a function are "call foo; dslot;"
5708 the return address might point to the first instruction in the next
5709 function and we have to output a dummy nop for the sake of sane
5710 backtraces in such cases. This is pointless for sibling calls since
5711 the return address is explicitly adjusted. */
5713 rtx insn, last_real_insn;
5715 insn = get_last_insn ();
5717 last_real_insn = prev_real_insn (insn);
5719 && NONJUMP_INSN_P (last_real_insn)
5720 && GET_CODE (PATTERN (last_real_insn)) == SEQUENCE)
5721 last_real_insn = XVECEXP (PATTERN (last_real_insn), 0, 0);
5724 && CALL_P (last_real_insn)
5725 && !SIBLING_CALL_P (last_real_insn))
5726 fputs("\tnop\n", file);
5728 sparc_output_deferred_case_vectors ();
5731 /* Output a 'restore' instruction. */
5734 output_restore (rtx pat)
5740 fputs ("\t restore\n", asm_out_file);
5744 gcc_assert (GET_CODE (pat) == SET);
5746 operands[0] = SET_DEST (pat);
5747 pat = SET_SRC (pat);
5749 switch (GET_CODE (pat))
5752 operands[1] = XEXP (pat, 0);
5753 operands[2] = XEXP (pat, 1);
5754 output_asm_insn (" restore %r1, %2, %Y0", operands);
5757 operands[1] = XEXP (pat, 0);
5758 operands[2] = XEXP (pat, 1);
5759 output_asm_insn (" restore %r1, %%lo(%a2), %Y0", operands);
5762 operands[1] = XEXP (pat, 0);
5763 gcc_assert (XEXP (pat, 1) == const1_rtx);
5764 output_asm_insn (" restore %r1, %r1, %Y0", operands);
5768 output_asm_insn (" restore %%g0, %1, %Y0", operands);
5773 /* Output a return. */
5776 output_return (rtx insn)
5778 if (crtl->calls_eh_return)
5780 /* If the function uses __builtin_eh_return, the eh_return
5781 machinery occupies the delay slot. */
5782 gcc_assert (!final_sequence);
5784 if (flag_delayed_branch)
5786 if (!TARGET_FLAT && TARGET_V9)
5787 fputs ("\treturn\t%i7+8\n", asm_out_file);
5791 fputs ("\trestore\n", asm_out_file);
5793 fputs ("\tjmp\t%o7+8\n", asm_out_file);
5796 fputs ("\t add\t%sp, %g1, %sp\n", asm_out_file);
5801 fputs ("\trestore\n", asm_out_file);
5803 fputs ("\tadd\t%sp, %g1, %sp\n", asm_out_file);
5804 fputs ("\tjmp\t%o7+8\n\t nop\n", asm_out_file);
5807 else if (sparc_leaf_function_p || TARGET_FLAT)
5809 /* This is a leaf or flat function so we don't have to bother restoring
5810 the register window, which frees us from dealing with the convoluted
5811 semantics of restore/return. We simply output the jump to the
5812 return address and the insn in the delay slot (if any). */
5814 return "jmp\t%%o7+%)%#";
5818 /* This is a regular function so we have to restore the register window.
5819 We may have a pending insn for the delay slot, which will be either
5820 combined with the 'restore' instruction or put in the delay slot of
5821 the 'return' instruction. */
5827 delay = NEXT_INSN (insn);
5830 pat = PATTERN (delay);
5832 if (TARGET_V9 && ! epilogue_renumber (&pat, 1))
5834 epilogue_renumber (&pat, 0);
5835 return "return\t%%i7+%)%#";
5839 output_asm_insn ("jmp\t%%i7+%)", NULL);
5840 output_restore (pat);
5841 PATTERN (delay) = gen_blockage ();
5842 INSN_CODE (delay) = -1;
5847 /* The delay slot is empty. */
5849 return "return\t%%i7+%)\n\t nop";
5850 else if (flag_delayed_branch)
5851 return "jmp\t%%i7+%)\n\t restore";
5853 return "restore\n\tjmp\t%%o7+%)\n\t nop";
5860 /* Output a sibling call. */
5863 output_sibcall (rtx insn, rtx call_operand)
5867 gcc_assert (flag_delayed_branch);
5869 operands[0] = call_operand;
5871 if (sparc_leaf_function_p || TARGET_FLAT)
5873 /* This is a leaf or flat function so we don't have to bother restoring
5874 the register window. We simply output the jump to the function and
5875 the insn in the delay slot (if any). */
5877 gcc_assert (!(LEAF_SIBCALL_SLOT_RESERVED_P && final_sequence));
5880 output_asm_insn ("sethi\t%%hi(%a0), %%g1\n\tjmp\t%%g1 + %%lo(%a0)%#",
5883 /* Use or with rs2 %%g0 instead of mov, so that as/ld can optimize
5884 it into branch if possible. */
5885 output_asm_insn ("or\t%%o7, %%g0, %%g1\n\tcall\t%a0, 0\n\t or\t%%g1, %%g0, %%o7",
5890 /* This is a regular function so we have to restore the register window.
5891 We may have a pending insn for the delay slot, which will be combined
5892 with the 'restore' instruction. */
5894 output_asm_insn ("call\t%a0, 0", operands);
5898 rtx delay = NEXT_INSN (insn);
5901 output_restore (PATTERN (delay));
5903 PATTERN (delay) = gen_blockage ();
5904 INSN_CODE (delay) = -1;
5907 output_restore (NULL_RTX);
5913 /* Functions for handling argument passing.
5915 For 32-bit, the first 6 args are normally in registers and the rest are
5916 pushed. Any arg that starts within the first 6 words is at least
5917 partially passed in a register unless its data type forbids.
5919 For 64-bit, the argument registers are laid out as an array of 16 elements
5920 and arguments are added sequentially. The first 6 int args and up to the
5921 first 16 fp args (depending on size) are passed in regs.
5923 Slot Stack Integral Float Float in structure Double Long Double
5924 ---- ----- -------- ----- ------------------ ------ -----------
5925 15 [SP+248] %f31 %f30,%f31 %d30
5926 14 [SP+240] %f29 %f28,%f29 %d28 %q28
5927 13 [SP+232] %f27 %f26,%f27 %d26
5928 12 [SP+224] %f25 %f24,%f25 %d24 %q24
5929 11 [SP+216] %f23 %f22,%f23 %d22
5930 10 [SP+208] %f21 %f20,%f21 %d20 %q20
5931 9 [SP+200] %f19 %f18,%f19 %d18
5932 8 [SP+192] %f17 %f16,%f17 %d16 %q16
5933 7 [SP+184] %f15 %f14,%f15 %d14
5934 6 [SP+176] %f13 %f12,%f13 %d12 %q12
5935 5 [SP+168] %o5 %f11 %f10,%f11 %d10
5936 4 [SP+160] %o4 %f9 %f8,%f9 %d8 %q8
5937 3 [SP+152] %o3 %f7 %f6,%f7 %d6
5938 2 [SP+144] %o2 %f5 %f4,%f5 %d4 %q4
5939 1 [SP+136] %o1 %f3 %f2,%f3 %d2
5940 0 [SP+128] %o0 %f1 %f0,%f1 %d0 %q0
5942 Here SP = %sp if -mno-stack-bias or %sp+stack_bias otherwise.
5944 Integral arguments are always passed as 64-bit quantities appropriately
5947 Passing of floating point values is handled as follows.
5948 If a prototype is in scope:
5949 If the value is in a named argument (i.e. not a stdarg function or a
5950 value not part of the `...') then the value is passed in the appropriate
5952 If the value is part of the `...' and is passed in one of the first 6
5953 slots then the value is passed in the appropriate int reg.
5954 If the value is part of the `...' and is not passed in one of the first 6
5955 slots then the value is passed in memory.
5956 If a prototype is not in scope:
5957 If the value is one of the first 6 arguments the value is passed in the
5958 appropriate integer reg and the appropriate fp reg.
5959 If the value is not one of the first 6 arguments the value is passed in
5960 the appropriate fp reg and in memory.
5963 Summary of the calling conventions implemented by GCC on the SPARC:
5966 size argument return value
5968 small integer <4 int. reg. int. reg.
5969 word 4 int. reg. int. reg.
5970 double word 8 int. reg. int. reg.
5972 _Complex small integer <8 int. reg. int. reg.
5973 _Complex word 8 int. reg. int. reg.
5974 _Complex double word 16 memory int. reg.
5976 vector integer <=8 int. reg. FP reg.
5977 vector integer >8 memory memory
5979 float 4 int. reg. FP reg.
5980 double 8 int. reg. FP reg.
5981 long double 16 memory memory
5983 _Complex float 8 memory FP reg.
5984 _Complex double 16 memory FP reg.
5985 _Complex long double 32 memory FP reg.
5987 vector float any memory memory
5989 aggregate any memory memory
5994 size argument return value
5996 small integer <8 int. reg. int. reg.
5997 word 8 int. reg. int. reg.
5998 double word 16 int. reg. int. reg.
6000 _Complex small integer <16 int. reg. int. reg.
6001 _Complex word 16 int. reg. int. reg.
6002 _Complex double word 32 memory int. reg.
6004 vector integer <=16 FP reg. FP reg.
6005 vector integer 16<s<=32 memory FP reg.
6006 vector integer >32 memory memory
6008 float 4 FP reg. FP reg.
6009 double 8 FP reg. FP reg.
6010 long double 16 FP reg. FP reg.
6012 _Complex float 8 FP reg. FP reg.
6013 _Complex double 16 FP reg. FP reg.
6014 _Complex long double 32 memory FP reg.
6016 vector float <=16 FP reg. FP reg.
6017 vector float 16<s<=32 memory FP reg.
6018 vector float >32 memory memory
6020 aggregate <=16 reg. reg.
6021 aggregate 16<s<=32 memory reg.
6022 aggregate >32 memory memory
6026 Note #1: complex floating-point types follow the extended SPARC ABIs as
6027 implemented by the Sun compiler.
6029 Note #2: integral vector types follow the scalar floating-point types
6030 conventions to match what is implemented by the Sun VIS SDK.
6032 Note #3: floating-point vector types follow the aggregate types
6036 /* Maximum number of int regs for args. */
6037 #define SPARC_INT_ARG_MAX 6
6038 /* Maximum number of fp regs for args. */
6039 #define SPARC_FP_ARG_MAX 16
6041 #define ROUND_ADVANCE(SIZE) (((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
6043 /* Handle the INIT_CUMULATIVE_ARGS macro.
6044 Initialize a variable CUM of type CUMULATIVE_ARGS
6045 for a call to a function whose data type is FNTYPE.
6046 For a library call, FNTYPE is 0. */
6049 init_cumulative_args (struct sparc_args *cum, tree fntype,
6050 rtx libname ATTRIBUTE_UNUSED,
6051 tree fndecl ATTRIBUTE_UNUSED)
6054 cum->prototype_p = fntype && prototype_p (fntype);
6055 cum->libcall_p = fntype == 0;
6058 /* Handle promotion of pointer and integer arguments. */
6060 static enum machine_mode
6061 sparc_promote_function_mode (const_tree type,
6062 enum machine_mode mode,
6064 const_tree fntype ATTRIBUTE_UNUSED,
6065 int for_return ATTRIBUTE_UNUSED)
6067 if (type != NULL_TREE && POINTER_TYPE_P (type))
6069 *punsignedp = POINTERS_EXTEND_UNSIGNED;
6073 /* Integral arguments are passed as full words, as per the ABI. */
6074 if (GET_MODE_CLASS (mode) == MODE_INT
6075 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
6081 /* Handle the TARGET_STRICT_ARGUMENT_NAMING target hook. */
6084 sparc_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
6086 return TARGET_ARCH64 ? true : false;
6089 /* Scan the record type TYPE and return the following predicates:
6090 - INTREGS_P: the record contains at least one field or sub-field
6091 that is eligible for promotion in integer registers.
6092 - FP_REGS_P: the record contains at least one field or sub-field
6093 that is eligible for promotion in floating-point registers.
6094 - PACKED_P: the record contains at least one field that is packed.
6096 Sub-fields are not taken into account for the PACKED_P predicate. */
6099 scan_record_type (const_tree type, int *intregs_p, int *fpregs_p,
6104 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6106 if (TREE_CODE (field) == FIELD_DECL)
6108 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
6109 scan_record_type (TREE_TYPE (field), intregs_p, fpregs_p, 0);
6110 else if ((FLOAT_TYPE_P (TREE_TYPE (field))
6111 || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
6117 if (packed_p && DECL_PACKED (field))
6123 /* Compute the slot number to pass an argument in.
6124 Return the slot number or -1 if passing on the stack.
6126 CUM is a variable of type CUMULATIVE_ARGS which gives info about
6127 the preceding args and about the function being called.
6128 MODE is the argument's machine mode.
6129 TYPE is the data type of the argument (as a tree).
6130 This is null for libcalls where that information may
6132 NAMED is nonzero if this argument is a named parameter
6133 (otherwise it is an extra parameter matching an ellipsis).
6134 INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG.
6135 *PREGNO records the register number to use if scalar type.
6136 *PPADDING records the amount of padding needed in words. */
6139 function_arg_slotno (const struct sparc_args *cum, enum machine_mode mode,
6140 const_tree type, bool named, bool incoming_p,
6141 int *pregno, int *ppadding)
6143 int regbase = (incoming_p
6144 ? SPARC_INCOMING_INT_ARG_FIRST
6145 : SPARC_OUTGOING_INT_ARG_FIRST);
6146 int slotno = cum->words;
6147 enum mode_class mclass;
6152 if (type && TREE_ADDRESSABLE (type))
6158 && TYPE_ALIGN (type) % PARM_BOUNDARY != 0)
6161 /* For SPARC64, objects requiring 16-byte alignment get it. */
6163 && (type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode)) >= 128
6164 && (slotno & 1) != 0)
6165 slotno++, *ppadding = 1;
6167 mclass = GET_MODE_CLASS (mode);
6168 if (type && TREE_CODE (type) == VECTOR_TYPE)
6170 /* Vector types deserve special treatment because they are
6171 polymorphic wrt their mode, depending upon whether VIS
6172 instructions are enabled. */
6173 if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
6175 /* The SPARC port defines no floating-point vector modes. */
6176 gcc_assert (mode == BLKmode);
6180 /* Integral vector types should either have a vector
6181 mode or an integral mode, because we are guaranteed
6182 by pass_by_reference that their size is not greater
6183 than 16 bytes and TImode is 16-byte wide. */
6184 gcc_assert (mode != BLKmode);
6186 /* Vector integers are handled like floats according to
6188 mclass = MODE_FLOAT;
6195 case MODE_COMPLEX_FLOAT:
6196 case MODE_VECTOR_INT:
6197 if (TARGET_ARCH64 && TARGET_FPU && named)
6199 if (slotno >= SPARC_FP_ARG_MAX)
6201 regno = SPARC_FP_ARG_FIRST + slotno * 2;
6202 /* Arguments filling only one single FP register are
6203 right-justified in the outer double FP register. */
6204 if (GET_MODE_SIZE (mode) <= 4)
6211 case MODE_COMPLEX_INT:
6212 if (slotno >= SPARC_INT_ARG_MAX)
6214 regno = regbase + slotno;
6218 if (mode == VOIDmode)
6219 /* MODE is VOIDmode when generating the actual call. */
6222 gcc_assert (mode == BLKmode);
6226 || (TREE_CODE (type) != VECTOR_TYPE
6227 && TREE_CODE (type) != RECORD_TYPE))
6229 if (slotno >= SPARC_INT_ARG_MAX)
6231 regno = regbase + slotno;
6233 else /* TARGET_ARCH64 && type */
6235 int intregs_p = 0, fpregs_p = 0, packed_p = 0;
6237 /* First see what kinds of registers we would need. */
6238 if (TREE_CODE (type) == VECTOR_TYPE)
6241 scan_record_type (type, &intregs_p, &fpregs_p, &packed_p);
6243 /* The ABI obviously doesn't specify how packed structures
6244 are passed. These are defined to be passed in int regs
6245 if possible, otherwise memory. */
6246 if (packed_p || !named)
6247 fpregs_p = 0, intregs_p = 1;
6249 /* If all arg slots are filled, then must pass on stack. */
6250 if (fpregs_p && slotno >= SPARC_FP_ARG_MAX)
6253 /* If there are only int args and all int arg slots are filled,
6254 then must pass on stack. */
6255 if (!fpregs_p && intregs_p && slotno >= SPARC_INT_ARG_MAX)
6258 /* Note that even if all int arg slots are filled, fp members may
6259 still be passed in regs if such regs are available.
6260 *PREGNO isn't set because there may be more than one, it's up
6261 to the caller to compute them. */
6274 /* Handle recursive register counting for structure field layout. */
6276 struct function_arg_record_value_parms
6278 rtx ret; /* return expression being built. */
6279 int slotno; /* slot number of the argument. */
6280 int named; /* whether the argument is named. */
6281 int regbase; /* regno of the base register. */
6282 int stack; /* 1 if part of the argument is on the stack. */
6283 int intoffset; /* offset of the first pending integer field. */
6284 unsigned int nregs; /* number of words passed in registers. */
6287 static void function_arg_record_value_3
6288 (HOST_WIDE_INT, struct function_arg_record_value_parms *);
6289 static void function_arg_record_value_2
6290 (const_tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool);
6291 static void function_arg_record_value_1
6292 (const_tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool);
6293 static rtx function_arg_record_value (const_tree, enum machine_mode, int, int, int);
6294 static rtx function_arg_union_value (int, enum machine_mode, int, int);
6296 /* A subroutine of function_arg_record_value. Traverse the structure
6297 recursively and determine how many registers will be required. */
6300 function_arg_record_value_1 (const_tree type, HOST_WIDE_INT startbitpos,
6301 struct function_arg_record_value_parms *parms,
6306 /* We need to compute how many registers are needed so we can
6307 allocate the PARALLEL but before we can do that we need to know
6308 whether there are any packed fields. The ABI obviously doesn't
6309 specify how structures are passed in this case, so they are
6310 defined to be passed in int regs if possible, otherwise memory,
6311 regardless of whether there are fp values present. */
6314 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
6316 if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
6323 /* Compute how many registers we need. */
6324 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6326 if (TREE_CODE (field) == FIELD_DECL)
6328 HOST_WIDE_INT bitpos = startbitpos;
6330 if (DECL_SIZE (field) != 0)
6332 if (integer_zerop (DECL_SIZE (field)))
6335 if (host_integerp (bit_position (field), 1))
6336 bitpos += int_bit_position (field);
6339 /* ??? FIXME: else assume zero offset. */
6341 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
6342 function_arg_record_value_1 (TREE_TYPE (field),
6346 else if ((FLOAT_TYPE_P (TREE_TYPE (field))
6347 || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
6352 if (parms->intoffset != -1)
6354 unsigned int startbit, endbit;
6355 int intslots, this_slotno;
6357 startbit = parms->intoffset & -BITS_PER_WORD;
6358 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
6360 intslots = (endbit - startbit) / BITS_PER_WORD;
6361 this_slotno = parms->slotno + parms->intoffset
6364 if (intslots > 0 && intslots > SPARC_INT_ARG_MAX - this_slotno)
6366 intslots = MAX (0, SPARC_INT_ARG_MAX - this_slotno);
6367 /* We need to pass this field on the stack. */
6371 parms->nregs += intslots;
6372 parms->intoffset = -1;
6375 /* There's no need to check this_slotno < SPARC_FP_ARG MAX.
6376 If it wasn't true we wouldn't be here. */
6377 if (TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE
6378 && DECL_MODE (field) == BLKmode)
6379 parms->nregs += TYPE_VECTOR_SUBPARTS (TREE_TYPE (field));
6380 else if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
6387 if (parms->intoffset == -1)
6388 parms->intoffset = bitpos;
6394 /* A subroutine of function_arg_record_value. Assign the bits of the
6395 structure between parms->intoffset and bitpos to integer registers. */
6398 function_arg_record_value_3 (HOST_WIDE_INT bitpos,
6399 struct function_arg_record_value_parms *parms)
6401 enum machine_mode mode;
6403 unsigned int startbit, endbit;
6404 int this_slotno, intslots, intoffset;
6407 if (parms->intoffset == -1)
6410 intoffset = parms->intoffset;
6411 parms->intoffset = -1;
6413 startbit = intoffset & -BITS_PER_WORD;
6414 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
6415 intslots = (endbit - startbit) / BITS_PER_WORD;
6416 this_slotno = parms->slotno + intoffset / BITS_PER_WORD;
6418 intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno);
6422 /* If this is the trailing part of a word, only load that much into
6423 the register. Otherwise load the whole register. Note that in
6424 the latter case we may pick up unwanted bits. It's not a problem
6425 at the moment but may wish to revisit. */
6427 if (intoffset % BITS_PER_WORD != 0)
6428 mode = smallest_mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
6433 intoffset /= BITS_PER_UNIT;
6436 regno = parms->regbase + this_slotno;
6437 reg = gen_rtx_REG (mode, regno);
6438 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
6439 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
6442 intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
6447 while (intslots > 0);
6450 /* A subroutine of function_arg_record_value. Traverse the structure
6451 recursively and assign bits to floating point registers. Track which
6452 bits in between need integer registers; invoke function_arg_record_value_3
6453 to make that happen. */
6456 function_arg_record_value_2 (const_tree type, HOST_WIDE_INT startbitpos,
6457 struct function_arg_record_value_parms *parms,
6463 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6465 if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
6472 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6474 if (TREE_CODE (field) == FIELD_DECL)
6476 HOST_WIDE_INT bitpos = startbitpos;
6478 if (DECL_SIZE (field) != 0)
6480 if (integer_zerop (DECL_SIZE (field)))
6483 if (host_integerp (bit_position (field), 1))
6484 bitpos += int_bit_position (field);
6487 /* ??? FIXME: else assume zero offset. */
6489 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
6490 function_arg_record_value_2 (TREE_TYPE (field),
6494 else if ((FLOAT_TYPE_P (TREE_TYPE (field))
6495 || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
6500 int this_slotno = parms->slotno + bitpos / BITS_PER_WORD;
6501 int regno, nregs, pos;
6502 enum machine_mode mode = DECL_MODE (field);
6505 function_arg_record_value_3 (bitpos, parms);
6507 if (TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE
6510 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field)));
6511 nregs = TYPE_VECTOR_SUBPARTS (TREE_TYPE (field));
6513 else if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
6515 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field)));
6521 regno = SPARC_FP_ARG_FIRST + this_slotno * 2;
6522 if (GET_MODE_SIZE (mode) <= 4 && (bitpos & 32) != 0)
6524 reg = gen_rtx_REG (mode, regno);
6525 pos = bitpos / BITS_PER_UNIT;
6526 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
6527 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (pos));
6531 regno += GET_MODE_SIZE (mode) / 4;
6532 reg = gen_rtx_REG (mode, regno);
6533 pos += GET_MODE_SIZE (mode);
6534 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
6535 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (pos));
6541 if (parms->intoffset == -1)
6542 parms->intoffset = bitpos;
6548 /* Used by function_arg and sparc_function_value_1 to implement the complex
6549 conventions of the 64-bit ABI for passing and returning structures.
6550 Return an expression valid as a return value for the FUNCTION_ARG
6551 and TARGET_FUNCTION_VALUE.
6553 TYPE is the data type of the argument (as a tree).
6554 This is null for libcalls where that information may
6556 MODE is the argument's machine mode.
6557 SLOTNO is the index number of the argument's slot in the parameter array.
6558 NAMED is nonzero if this argument is a named parameter
6559 (otherwise it is an extra parameter matching an ellipsis).
6560 REGBASE is the regno of the base register for the parameter array. */
6563 function_arg_record_value (const_tree type, enum machine_mode mode,
6564 int slotno, int named, int regbase)
6566 HOST_WIDE_INT typesize = int_size_in_bytes (type);
6567 struct function_arg_record_value_parms parms;
6570 parms.ret = NULL_RTX;
6571 parms.slotno = slotno;
6572 parms.named = named;
6573 parms.regbase = regbase;
6576 /* Compute how many registers we need. */
6578 parms.intoffset = 0;
6579 function_arg_record_value_1 (type, 0, &parms, false);
6581 /* Take into account pending integer fields. */
6582 if (parms.intoffset != -1)
6584 unsigned int startbit, endbit;
6585 int intslots, this_slotno;
6587 startbit = parms.intoffset & -BITS_PER_WORD;
6588 endbit = (typesize*BITS_PER_UNIT + BITS_PER_WORD - 1) & -BITS_PER_WORD;
6589 intslots = (endbit - startbit) / BITS_PER_WORD;
6590 this_slotno = slotno + parms.intoffset / BITS_PER_WORD;
6592 if (intslots > 0 && intslots > SPARC_INT_ARG_MAX - this_slotno)
6594 intslots = MAX (0, SPARC_INT_ARG_MAX - this_slotno);
6595 /* We need to pass this field on the stack. */
6599 parms.nregs += intslots;
6601 nregs = parms.nregs;
6603 /* Allocate the vector and handle some annoying special cases. */
6606 /* ??? Empty structure has no value? Duh? */
6609 /* Though there's nothing really to store, return a word register
6610 anyway so the rest of gcc doesn't go nuts. Returning a PARALLEL
6611 leads to breakage due to the fact that there are zero bytes to
6613 return gen_rtx_REG (mode, regbase);
6617 /* ??? C++ has structures with no fields, and yet a size. Give up
6618 for now and pass everything back in integer registers. */
6619 nregs = (typesize + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6621 if (nregs + slotno > SPARC_INT_ARG_MAX)
6622 nregs = SPARC_INT_ARG_MAX - slotno;
6624 gcc_assert (nregs != 0);
6626 parms.ret = gen_rtx_PARALLEL (mode, rtvec_alloc (parms.stack + nregs));
6628 /* If at least one field must be passed on the stack, generate
6629 (parallel [(expr_list (nil) ...) ...]) so that all fields will
6630 also be passed on the stack. We can't do much better because the
6631 semantics of TARGET_ARG_PARTIAL_BYTES doesn't handle the case
6632 of structures for which the fields passed exclusively in registers
6633 are not at the beginning of the structure. */
6635 XVECEXP (parms.ret, 0, 0)
6636 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
6638 /* Fill in the entries. */
6640 parms.intoffset = 0;
6641 function_arg_record_value_2 (type, 0, &parms, false);
6642 function_arg_record_value_3 (typesize * BITS_PER_UNIT, &parms);
6644 gcc_assert (parms.nregs == nregs);
6649 /* Used by function_arg and sparc_function_value_1 to implement the conventions
6650 of the 64-bit ABI for passing and returning unions.
6651 Return an expression valid as a return value for the FUNCTION_ARG
6652 and TARGET_FUNCTION_VALUE.
6654 SIZE is the size in bytes of the union.
6655 MODE is the argument's machine mode.
6656 REGNO is the hard register the union will be passed in. */
6659 function_arg_union_value (int size, enum machine_mode mode, int slotno,
6662 int nwords = ROUND_ADVANCE (size), i;
6665 /* See comment in previous function for empty structures. */
6667 return gen_rtx_REG (mode, regno);
6669 if (slotno == SPARC_INT_ARG_MAX - 1)
6672 regs = gen_rtx_PARALLEL (mode, rtvec_alloc (nwords));
6674 for (i = 0; i < nwords; i++)
6676 /* Unions are passed left-justified. */
6677 XVECEXP (regs, 0, i)
6678 = gen_rtx_EXPR_LIST (VOIDmode,
6679 gen_rtx_REG (word_mode, regno),
6680 GEN_INT (UNITS_PER_WORD * i));
6687 /* Used by function_arg and sparc_function_value_1 to implement the conventions
6688 for passing and returning large (BLKmode) vectors.
6689 Return an expression valid as a return value for the FUNCTION_ARG
6690 and TARGET_FUNCTION_VALUE.
6692 SIZE is the size in bytes of the vector (at least 8 bytes).
6693 REGNO is the FP hard register the vector will be passed in. */
6696 function_arg_vector_value (int size, int regno)
6698 int i, nregs = size / 8;
6701 regs = gen_rtx_PARALLEL (BLKmode, rtvec_alloc (nregs));
6703 for (i = 0; i < nregs; i++)
6705 XVECEXP (regs, 0, i)
6706 = gen_rtx_EXPR_LIST (VOIDmode,
6707 gen_rtx_REG (DImode, regno + 2*i),
6714 /* Determine where to put an argument to a function.
6715 Value is zero to push the argument on the stack,
6716 or a hard register in which to store the argument.
6718 CUM is a variable of type CUMULATIVE_ARGS which gives info about
6719 the preceding args and about the function being called.
6720 MODE is the argument's machine mode.
6721 TYPE is the data type of the argument (as a tree).
6722 This is null for libcalls where that information may
6724 NAMED is true if this argument is a named parameter
6725 (otherwise it is an extra parameter matching an ellipsis).
6726 INCOMING_P is false for TARGET_FUNCTION_ARG, true for
6727 TARGET_FUNCTION_INCOMING_ARG. */
6730 sparc_function_arg_1 (cumulative_args_t cum_v, enum machine_mode mode,
6731 const_tree type, bool named, bool incoming_p)
6733 const CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
6735 int regbase = (incoming_p
6736 ? SPARC_INCOMING_INT_ARG_FIRST
6737 : SPARC_OUTGOING_INT_ARG_FIRST);
6738 int slotno, regno, padding;
6739 enum mode_class mclass = GET_MODE_CLASS (mode);
6741 slotno = function_arg_slotno (cum, mode, type, named, incoming_p,
6746 /* Vector types deserve special treatment because they are polymorphic wrt
6747 their mode, depending upon whether VIS instructions are enabled. */
6748 if (type && TREE_CODE (type) == VECTOR_TYPE)
6750 HOST_WIDE_INT size = int_size_in_bytes (type);
6751 gcc_assert ((TARGET_ARCH32 && size <= 8)
6752 || (TARGET_ARCH64 && size <= 16));
6754 if (mode == BLKmode)
6755 return function_arg_vector_value (size,
6756 SPARC_FP_ARG_FIRST + 2*slotno);
6758 mclass = MODE_FLOAT;
6762 return gen_rtx_REG (mode, regno);
6764 /* Structures up to 16 bytes in size are passed in arg slots on the stack
6765 and are promoted to registers if possible. */
6766 if (type && TREE_CODE (type) == RECORD_TYPE)
6768 HOST_WIDE_INT size = int_size_in_bytes (type);
6769 gcc_assert (size <= 16);
6771 return function_arg_record_value (type, mode, slotno, named, regbase);
6774 /* Unions up to 16 bytes in size are passed in integer registers. */
6775 else if (type && TREE_CODE (type) == UNION_TYPE)
6777 HOST_WIDE_INT size = int_size_in_bytes (type);
6778 gcc_assert (size <= 16);
6780 return function_arg_union_value (size, mode, slotno, regno);
6783 /* v9 fp args in reg slots beyond the int reg slots get passed in regs
6784 but also have the slot allocated for them.
6785 If no prototype is in scope fp values in register slots get passed
6786 in two places, either fp regs and int regs or fp regs and memory. */
6787 else if ((mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
6788 && SPARC_FP_REG_P (regno))
6790 rtx reg = gen_rtx_REG (mode, regno);
6791 if (cum->prototype_p || cum->libcall_p)
6793 /* "* 2" because fp reg numbers are recorded in 4 byte
6796 /* ??? This will cause the value to be passed in the fp reg and
6797 in the stack. When a prototype exists we want to pass the
6798 value in the reg but reserve space on the stack. That's an
6799 optimization, and is deferred [for a bit]. */
6800 if ((regno - SPARC_FP_ARG_FIRST) >= SPARC_INT_ARG_MAX * 2)
6801 return gen_rtx_PARALLEL (mode,
6803 gen_rtx_EXPR_LIST (VOIDmode,
6804 NULL_RTX, const0_rtx),
6805 gen_rtx_EXPR_LIST (VOIDmode,
6809 /* ??? It seems that passing back a register even when past
6810 the area declared by REG_PARM_STACK_SPACE will allocate
6811 space appropriately, and will not copy the data onto the
6812 stack, exactly as we desire.
6814 This is due to locate_and_pad_parm being called in
6815 expand_call whenever reg_parm_stack_space > 0, which
6816 while beneficial to our example here, would seem to be
6817 in error from what had been intended. Ho hum... -- r~ */
6825 if ((regno - SPARC_FP_ARG_FIRST) < SPARC_INT_ARG_MAX * 2)
6829 /* On incoming, we don't need to know that the value
6830 is passed in %f0 and %i0, and it confuses other parts
6831 causing needless spillage even on the simplest cases. */
6835 intreg = (SPARC_OUTGOING_INT_ARG_FIRST
6836 + (regno - SPARC_FP_ARG_FIRST) / 2);
6838 v0 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
6839 v1 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (mode, intreg),
6841 return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
6845 v0 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
6846 v1 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
6847 return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
6852 /* All other aggregate types are passed in an integer register in a mode
6853 corresponding to the size of the type. */
6854 else if (type && AGGREGATE_TYPE_P (type))
6856 HOST_WIDE_INT size = int_size_in_bytes (type);
6857 gcc_assert (size <= 16);
6859 mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
6862 return gen_rtx_REG (mode, regno);
6865 /* Handle the TARGET_FUNCTION_ARG target hook. */
6868 sparc_function_arg (cumulative_args_t cum, enum machine_mode mode,
6869 const_tree type, bool named)
6871 return sparc_function_arg_1 (cum, mode, type, named, false);
6874 /* Handle the TARGET_FUNCTION_INCOMING_ARG target hook. */
6877 sparc_function_incoming_arg (cumulative_args_t cum, enum machine_mode mode,
6878 const_tree type, bool named)
6880 return sparc_function_arg_1 (cum, mode, type, named, true);
6883 /* For sparc64, objects requiring 16 byte alignment are passed that way. */
6886 sparc_function_arg_boundary (enum machine_mode mode, const_tree type)
6888 return ((TARGET_ARCH64
6889 && (GET_MODE_ALIGNMENT (mode) == 128
6890 || (type && TYPE_ALIGN (type) == 128)))
6895 /* For an arg passed partly in registers and partly in memory,
6896 this is the number of bytes of registers used.
6897 For args passed entirely in registers or entirely in memory, zero.
6899 Any arg that starts in the first 6 regs but won't entirely fit in them
6900 needs partial registers on v8. On v9, structures with integer
6901 values in arg slots 5,6 will be passed in %o5 and SP+176, and complex fp
6902 values that begin in the last fp reg [where "last fp reg" varies with the
6903 mode] will be split between that reg and memory. */
6906 sparc_arg_partial_bytes (cumulative_args_t cum, enum machine_mode mode,
6907 tree type, bool named)
6909 int slotno, regno, padding;
6911 /* We pass false for incoming_p here, it doesn't matter. */
6912 slotno = function_arg_slotno (get_cumulative_args (cum), mode, type, named,
6913 false, ®no, &padding);
6920 if ((slotno + (mode == BLKmode
6921 ? ROUND_ADVANCE (int_size_in_bytes (type))
6922 : ROUND_ADVANCE (GET_MODE_SIZE (mode))))
6923 > SPARC_INT_ARG_MAX)
6924 return (SPARC_INT_ARG_MAX - slotno) * UNITS_PER_WORD;
6928 /* We are guaranteed by pass_by_reference that the size of the
6929 argument is not greater than 16 bytes, so we only need to return
6930 one word if the argument is partially passed in registers. */
6932 if (type && AGGREGATE_TYPE_P (type))
6934 int size = int_size_in_bytes (type);
6936 if (size > UNITS_PER_WORD
6937 && slotno == SPARC_INT_ARG_MAX - 1)
6938 return UNITS_PER_WORD;
6940 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_INT
6941 || (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
6942 && ! (TARGET_FPU && named)))
6944 /* The complex types are passed as packed types. */
6945 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
6946 && slotno == SPARC_INT_ARG_MAX - 1)
6947 return UNITS_PER_WORD;
6949 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
6951 if ((slotno + GET_MODE_SIZE (mode) / UNITS_PER_WORD)
6953 return UNITS_PER_WORD;
6960 /* Handle the TARGET_PASS_BY_REFERENCE target hook.
6961 Specify whether to pass the argument by reference. */
6964 sparc_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
6965 enum machine_mode mode, const_tree type,
6966 bool named ATTRIBUTE_UNUSED)
6969 /* Original SPARC 32-bit ABI says that structures and unions,
6970 and quad-precision floats are passed by reference. For Pascal,
6971 also pass arrays by reference. All other base types are passed
6974 Extended ABI (as implemented by the Sun compiler) says that all
6975 complex floats are passed by reference. Pass complex integers
6976 in registers up to 8 bytes. More generally, enforce the 2-word
6977 cap for passing arguments in registers.
6979 Vector ABI (as implemented by the Sun VIS SDK) says that vector
6980 integers are passed like floats of the same size, that is in
6981 registers up to 8 bytes. Pass all vector floats by reference
6982 like structure and unions. */
6983 return ((type && (AGGREGATE_TYPE_P (type) || VECTOR_FLOAT_TYPE_P (type)))
6985 /* Catch CDImode, TFmode, DCmode and TCmode. */
6986 || GET_MODE_SIZE (mode) > 8
6988 && TREE_CODE (type) == VECTOR_TYPE
6989 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8));
6991 /* Original SPARC 64-bit ABI says that structures and unions
6992 smaller than 16 bytes are passed in registers, as well as
6993 all other base types.
6995 Extended ABI (as implemented by the Sun compiler) says that
6996 complex floats are passed in registers up to 16 bytes. Pass
6997 all complex integers in registers up to 16 bytes. More generally,
6998 enforce the 2-word cap for passing arguments in registers.
7000 Vector ABI (as implemented by the Sun VIS SDK) says that vector
7001 integers are passed like floats of the same size, that is in
7002 registers (up to 16 bytes). Pass all vector floats like structure
7005 && (AGGREGATE_TYPE_P (type) || TREE_CODE (type) == VECTOR_TYPE)
7006 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 16)
7007 /* Catch CTImode and TCmode. */
7008 || GET_MODE_SIZE (mode) > 16);
7011 /* Handle the TARGET_FUNCTION_ARG_ADVANCE hook.
7012 Update the data in CUM to advance over an argument
7013 of mode MODE and data type TYPE.
7014 TYPE is null for libcalls where that information may not be available. */
7017 sparc_function_arg_advance (cumulative_args_t cum_v, enum machine_mode mode,
7018 const_tree type, bool named)
7020 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
7023 /* We pass false for incoming_p here, it doesn't matter. */
7024 function_arg_slotno (cum, mode, type, named, false, ®no, &padding);
7026 /* If argument requires leading padding, add it. */
7027 cum->words += padding;
7031 cum->words += (mode != BLKmode
7032 ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
7033 : ROUND_ADVANCE (int_size_in_bytes (type)));
7037 if (type && AGGREGATE_TYPE_P (type))
7039 int size = int_size_in_bytes (type);
7043 else if (size <= 16)
7045 else /* passed by reference */
7050 cum->words += (mode != BLKmode
7051 ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
7052 : ROUND_ADVANCE (int_size_in_bytes (type)));
7057 /* Handle the FUNCTION_ARG_PADDING macro.
7058 For the 64 bit ABI structs are always stored left shifted in their
7062 function_arg_padding (enum machine_mode mode, const_tree type)
7064 if (TARGET_ARCH64 && type != 0 && AGGREGATE_TYPE_P (type))
7067 /* Fall back to the default. */
7068 return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
7071 /* Handle the TARGET_RETURN_IN_MEMORY target hook.
7072 Specify whether to return the return value in memory. */
7075 sparc_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
7078 /* Original SPARC 32-bit ABI says that structures and unions,
7079 and quad-precision floats are returned in memory. All other
7080 base types are returned in registers.
7082 Extended ABI (as implemented by the Sun compiler) says that
7083 all complex floats are returned in registers (8 FP registers
7084 at most for '_Complex long double'). Return all complex integers
7085 in registers (4 at most for '_Complex long long').
7087 Vector ABI (as implemented by the Sun VIS SDK) says that vector
7088 integers are returned like floats of the same size, that is in
7089 registers up to 8 bytes and in memory otherwise. Return all
7090 vector floats in memory like structure and unions; note that
7091 they always have BLKmode like the latter. */
7092 return (TYPE_MODE (type) == BLKmode
7093 || TYPE_MODE (type) == TFmode
7094 || (TREE_CODE (type) == VECTOR_TYPE
7095 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8));
7097 /* Original SPARC 64-bit ABI says that structures and unions
7098 smaller than 32 bytes are returned in registers, as well as
7099 all other base types.
7101 Extended ABI (as implemented by the Sun compiler) says that all
7102 complex floats are returned in registers (8 FP registers at most
7103 for '_Complex long double'). Return all complex integers in
7104 registers (4 at most for '_Complex TItype').
7106 Vector ABI (as implemented by the Sun VIS SDK) says that vector
7107 integers are returned like floats of the same size, that is in
7108 registers. Return all vector floats like structure and unions;
7109 note that they always have BLKmode like the latter. */
7110 return (TYPE_MODE (type) == BLKmode
7111 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 32);
7114 /* Handle the TARGET_STRUCT_VALUE target hook.
7115 Return where to find the structure return value address. */
7118 sparc_struct_value_rtx (tree fndecl, int incoming)
7127 mem = gen_frame_mem (Pmode, plus_constant (Pmode, frame_pointer_rtx,
7128 STRUCT_VALUE_OFFSET));
7130 mem = gen_frame_mem (Pmode, plus_constant (Pmode, stack_pointer_rtx,
7131 STRUCT_VALUE_OFFSET));
7133 /* Only follow the SPARC ABI for fixed-size structure returns.
7134 Variable size structure returns are handled per the normal
7135 procedures in GCC. This is enabled by -mstd-struct-return */
7137 && sparc_std_struct_return
7138 && TYPE_SIZE_UNIT (TREE_TYPE (fndecl))
7139 && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (fndecl))) == INTEGER_CST)
7141 /* We must check and adjust the return address, as it is
7142 optional as to whether the return object is really
7144 rtx ret_reg = gen_rtx_REG (Pmode, 31);
7145 rtx scratch = gen_reg_rtx (SImode);
7146 rtx endlab = gen_label_rtx ();
7148 /* Calculate the return object size */
7149 tree size = TYPE_SIZE_UNIT (TREE_TYPE (fndecl));
7150 rtx size_rtx = GEN_INT (TREE_INT_CST_LOW (size) & 0xfff);
7151 /* Construct a temporary return value */
7153 = assign_stack_local (Pmode, TREE_INT_CST_LOW (size), 0);
7155 /* Implement SPARC 32-bit psABI callee return struct checking:
7157 Fetch the instruction where we will return to and see if
7158 it's an unimp instruction (the most significant 10 bits
7160 emit_move_insn (scratch, gen_rtx_MEM (SImode,
7161 plus_constant (Pmode,
7163 /* Assume the size is valid and pre-adjust */
7164 emit_insn (gen_add3_insn (ret_reg, ret_reg, GEN_INT (4)));
7165 emit_cmp_and_jump_insns (scratch, size_rtx, EQ, const0_rtx, SImode,
7167 emit_insn (gen_sub3_insn (ret_reg, ret_reg, GEN_INT (4)));
7168 /* Write the address of the memory pointed to by temp_val into
7169 the memory pointed to by mem */
7170 emit_move_insn (mem, XEXP (temp_val, 0));
7171 emit_label (endlab);
7178 /* Handle TARGET_FUNCTION_VALUE, and TARGET_LIBCALL_VALUE target hook.
7179 For v9, function return values are subject to the same rules as arguments,
7180 except that up to 32 bytes may be returned in registers. */
7183 sparc_function_value_1 (const_tree type, enum machine_mode mode,
7186 /* Beware that the two values are swapped here wrt function_arg. */
7187 int regbase = (outgoing
7188 ? SPARC_INCOMING_INT_ARG_FIRST
7189 : SPARC_OUTGOING_INT_ARG_FIRST);
7190 enum mode_class mclass = GET_MODE_CLASS (mode);
7193 /* Vector types deserve special treatment because they are polymorphic wrt
7194 their mode, depending upon whether VIS instructions are enabled. */
7195 if (type && TREE_CODE (type) == VECTOR_TYPE)
7197 HOST_WIDE_INT size = int_size_in_bytes (type);
7198 gcc_assert ((TARGET_ARCH32 && size <= 8)
7199 || (TARGET_ARCH64 && size <= 32));
7201 if (mode == BLKmode)
7202 return function_arg_vector_value (size,
7203 SPARC_FP_ARG_FIRST);
7205 mclass = MODE_FLOAT;
7208 if (TARGET_ARCH64 && type)
7210 /* Structures up to 32 bytes in size are returned in registers. */
7211 if (TREE_CODE (type) == RECORD_TYPE)
7213 HOST_WIDE_INT size = int_size_in_bytes (type);
7214 gcc_assert (size <= 32);
7216 return function_arg_record_value (type, mode, 0, 1, regbase);
7219 /* Unions up to 32 bytes in size are returned in integer registers. */
7220 else if (TREE_CODE (type) == UNION_TYPE)
7222 HOST_WIDE_INT size = int_size_in_bytes (type);
7223 gcc_assert (size <= 32);
7225 return function_arg_union_value (size, mode, 0, regbase);
7228 /* Objects that require it are returned in FP registers. */
7229 else if (mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
7232 /* All other aggregate types are returned in an integer register in a
7233 mode corresponding to the size of the type. */
7234 else if (AGGREGATE_TYPE_P (type))
7236 /* All other aggregate types are passed in an integer register
7237 in a mode corresponding to the size of the type. */
7238 HOST_WIDE_INT size = int_size_in_bytes (type);
7239 gcc_assert (size <= 32);
7241 mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
7243 /* ??? We probably should have made the same ABI change in
7244 3.4.0 as the one we made for unions. The latter was
7245 required by the SCD though, while the former is not
7246 specified, so we favored compatibility and efficiency.
7248 Now we're stuck for aggregates larger than 16 bytes,
7249 because OImode vanished in the meantime. Let's not
7250 try to be unduly clever, and simply follow the ABI
7251 for unions in that case. */
7252 if (mode == BLKmode)
7253 return function_arg_union_value (size, mode, 0, regbase);
7258 /* We should only have pointer and integer types at this point. This
7259 must match sparc_promote_function_mode. */
7260 else if (mclass == MODE_INT && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
7264 /* We should only have pointer and integer types at this point. This must
7265 match sparc_promote_function_mode. */
7266 else if (TARGET_ARCH32
7267 && mclass == MODE_INT
7268 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
7271 if ((mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT) && TARGET_FPU)
7272 regno = SPARC_FP_ARG_FIRST;
7276 return gen_rtx_REG (mode, regno);
7279 /* Handle TARGET_FUNCTION_VALUE.
7280 On the SPARC, the value is found in the first "output" register, but the
7281 called function leaves it in the first "input" register. */
7284 sparc_function_value (const_tree valtype,
7285 const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
7288 return sparc_function_value_1 (valtype, TYPE_MODE (valtype), outgoing);
7291 /* Handle TARGET_LIBCALL_VALUE. */
7294 sparc_libcall_value (enum machine_mode mode,
7295 const_rtx fun ATTRIBUTE_UNUSED)
7297 return sparc_function_value_1 (NULL_TREE, mode, false);
7300 /* Handle FUNCTION_VALUE_REGNO_P.
7301 On the SPARC, the first "output" reg is used for integer values, and the
7302 first floating point register is used for floating point values. */
7305 sparc_function_value_regno_p (const unsigned int regno)
7307 return (regno == 8 || regno == 32);
7310 /* Do what is necessary for `va_start'. We look at the current function
7311 to determine if stdarg or varargs is used and return the address of
7312 the first unnamed parameter. */
7315 sparc_builtin_saveregs (void)
7317 int first_reg = crtl->args.info.words;
7321 for (regno = first_reg; regno < SPARC_INT_ARG_MAX; regno++)
7322 emit_move_insn (gen_rtx_MEM (word_mode,
7323 gen_rtx_PLUS (Pmode,
7325 GEN_INT (FIRST_PARM_OFFSET (0)
7328 gen_rtx_REG (word_mode,
7329 SPARC_INCOMING_INT_ARG_FIRST + regno));
7331 address = gen_rtx_PLUS (Pmode,
7333 GEN_INT (FIRST_PARM_OFFSET (0)
7334 + UNITS_PER_WORD * first_reg));
7339 /* Implement `va_start' for stdarg. */
7342 sparc_va_start (tree valist, rtx nextarg)
7344 nextarg = expand_builtin_saveregs ();
7345 std_expand_builtin_va_start (valist, nextarg);
7348 /* Implement `va_arg' for stdarg. */
7351 sparc_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
7354 HOST_WIDE_INT size, rsize, align;
7357 tree ptrtype = build_pointer_type (type);
7359 if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
7362 size = rsize = UNITS_PER_WORD;
7368 size = int_size_in_bytes (type);
7369 rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
7374 /* For SPARC64, objects requiring 16-byte alignment get it. */
7375 if (TYPE_ALIGN (type) >= 2 * (unsigned) BITS_PER_WORD)
7376 align = 2 * UNITS_PER_WORD;
7378 /* SPARC-V9 ABI states that structures up to 16 bytes in size
7379 are left-justified in their slots. */
7380 if (AGGREGATE_TYPE_P (type))
7383 size = rsize = UNITS_PER_WORD;
7393 incr = fold_build_pointer_plus_hwi (incr, align - 1);
7394 incr = fold_convert (sizetype, incr);
7395 incr = fold_build2 (BIT_AND_EXPR, sizetype, incr,
7397 incr = fold_convert (ptr_type_node, incr);
7400 gimplify_expr (&incr, pre_p, post_p, is_gimple_val, fb_rvalue);
7403 if (BYTES_BIG_ENDIAN && size < rsize)
7404 addr = fold_build_pointer_plus_hwi (incr, rsize - size);
7408 addr = fold_convert (build_pointer_type (ptrtype), addr);
7409 addr = build_va_arg_indirect_ref (addr);
7412 /* If the address isn't aligned properly for the type, we need a temporary.
7413 FIXME: This is inefficient, usually we can do this in registers. */
7414 else if (align == 0 && TYPE_ALIGN (type) > BITS_PER_WORD)
7416 tree tmp = create_tmp_var (type, "va_arg_tmp");
7417 tree dest_addr = build_fold_addr_expr (tmp);
7418 tree copy = build_call_expr (builtin_decl_implicit (BUILT_IN_MEMCPY),
7419 3, dest_addr, addr, size_int (rsize));
7420 TREE_ADDRESSABLE (tmp) = 1;
7421 gimplify_and_add (copy, pre_p);
7426 addr = fold_convert (ptrtype, addr);
7428 incr = fold_build_pointer_plus_hwi (incr, rsize);
7429 gimplify_assign (valist, incr, post_p);
7431 return build_va_arg_indirect_ref (addr);
7434 /* Implement the TARGET_VECTOR_MODE_SUPPORTED_P target hook.
7435 Specify whether the vector mode is supported by the hardware. */
7438 sparc_vector_mode_supported_p (enum machine_mode mode)
7440 return TARGET_VIS && VECTOR_MODE_P (mode) ? true : false;
7443 /* Implement the TARGET_VECTORIZE_PREFERRED_SIMD_MODE target hook. */
7445 static enum machine_mode
7446 sparc_preferred_simd_mode (enum machine_mode mode)
7464 /* Return the string to output an unconditional branch to LABEL, which is
7465 the operand number of the label.
7467 DEST is the destination insn (i.e. the label), INSN is the source. */
7470 output_ubranch (rtx dest, rtx insn)
7472 static char string[64];
7473 bool v9_form = false;
7477 /* Even if we are trying to use cbcond for this, evaluate
7478 whether we can use V9 branches as our backup plan. */
7481 if (INSN_ADDRESSES_SET_P ())
7482 delta = (INSN_ADDRESSES (INSN_UID (dest))
7483 - INSN_ADDRESSES (INSN_UID (insn)));
7485 /* Leave some instructions for "slop". */
7486 if (TARGET_V9 && delta >= -260000 && delta < 260000)
7491 bool emit_nop = emit_cbcond_nop (insn);
7495 if (delta < -500 || delta > 500)
7501 rval = "ba,a,pt\t%%xcc, %l0";
7508 rval = "cwbe\t%%g0, %%g0, %l0\n\tnop";
7510 rval = "cwbe\t%%g0, %%g0, %l0";
7516 strcpy (string, "ba%*,pt\t%%xcc, ");
7518 strcpy (string, "b%*\t");
7520 p = strchr (string, '\0');
7531 /* Return the string to output a conditional branch to LABEL, which is
7532 the operand number of the label. OP is the conditional expression.
7533 XEXP (OP, 0) is assumed to be a condition code register (integer or
7534 floating point) and its mode specifies what kind of comparison we made.
7536 DEST is the destination insn (i.e. the label), INSN is the source.
7538 REVERSED is nonzero if we should reverse the sense of the comparison.
7540 ANNUL is nonzero if we should generate an annulling branch. */
7543 output_cbranch (rtx op, rtx dest, int label, int reversed, int annul,
7546 static char string[64];
7547 enum rtx_code code = GET_CODE (op);
7548 rtx cc_reg = XEXP (op, 0);
7549 enum machine_mode mode = GET_MODE (cc_reg);
7550 const char *labelno, *branch;
7551 int spaces = 8, far;
7554 /* v9 branches are limited to +-1MB. If it is too far away,
7567 fbne,a,pn %fcc2, .LC29
7575 far = TARGET_V9 && (get_attr_length (insn) >= 3);
7578 /* Reversal of FP compares takes care -- an ordered compare
7579 becomes an unordered compare and vice versa. */
7580 if (mode == CCFPmode || mode == CCFPEmode)
7581 code = reverse_condition_maybe_unordered (code);
7583 code = reverse_condition (code);
7586 /* Start by writing the branch condition. */
7587 if (mode == CCFPmode || mode == CCFPEmode)
7638 /* ??? !v9: FP branches cannot be preceded by another floating point
7639 insn. Because there is currently no concept of pre-delay slots,
7640 we can fix this only by always emitting a nop before a floating
7645 strcpy (string, "nop\n\t");
7646 strcat (string, branch);
7659 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
7671 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
7692 strcpy (string, branch);
7694 spaces -= strlen (branch);
7695 p = strchr (string, '\0');
7697 /* Now add the annulling, the label, and a possible noop. */
7710 if (! far && insn && INSN_ADDRESSES_SET_P ())
7712 int delta = (INSN_ADDRESSES (INSN_UID (dest))
7713 - INSN_ADDRESSES (INSN_UID (insn)));
7714 /* Leave some instructions for "slop". */
7715 if (delta < -260000 || delta >= 260000)
7719 if (mode == CCFPmode || mode == CCFPEmode)
7721 static char v9_fcc_labelno[] = "%%fccX, ";
7722 /* Set the char indicating the number of the fcc reg to use. */
7723 v9_fcc_labelno[5] = REGNO (cc_reg) - SPARC_FIRST_V9_FCC_REG + '0';
7724 labelno = v9_fcc_labelno;
7727 gcc_assert (REGNO (cc_reg) == SPARC_FCC_REG);
7731 else if (mode == CCXmode || mode == CCX_NOOVmode)
7733 labelno = "%%xcc, ";
7738 labelno = "%%icc, ";
7743 if (*labelno && insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
7746 ((XINT (note, 0) >= REG_BR_PROB_BASE / 2) ^ far)
7759 strcpy (p, labelno);
7760 p = strchr (p, '\0');
7763 strcpy (p, ".+12\n\t nop\n\tb\t");
7764 /* Skip the next insn if requested or
7765 if we know that it will be a nop. */
7766 if (annul || ! final_sequence)
7780 /* Emit a library call comparison between floating point X and Y.
7781 COMPARISON is the operator to compare with (EQ, NE, GT, etc).
7782 Return the new operator to be used in the comparison sequence.
7784 TARGET_ARCH64 uses _Qp_* functions, which use pointers to TFmode
7785 values as arguments instead of the TFmode registers themselves,
7786 that's why we cannot call emit_float_lib_cmp. */
7789 sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
7792 rtx slot0, slot1, result, tem, tem2, libfunc;
7793 enum machine_mode mode;
7794 enum rtx_code new_comparison;
7799 qpfunc = (TARGET_ARCH64 ? "_Qp_feq" : "_Q_feq");
7803 qpfunc = (TARGET_ARCH64 ? "_Qp_fne" : "_Q_fne");
7807 qpfunc = (TARGET_ARCH64 ? "_Qp_fgt" : "_Q_fgt");
7811 qpfunc = (TARGET_ARCH64 ? "_Qp_fge" : "_Q_fge");
7815 qpfunc = (TARGET_ARCH64 ? "_Qp_flt" : "_Q_flt");
7819 qpfunc = (TARGET_ARCH64 ? "_Qp_fle" : "_Q_fle");
7830 qpfunc = (TARGET_ARCH64 ? "_Qp_cmp" : "_Q_cmp");
7841 tree expr = MEM_EXPR (x);
7843 mark_addressable (expr);
7848 slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode));
7849 emit_move_insn (slot0, x);
7854 tree expr = MEM_EXPR (y);
7856 mark_addressable (expr);
7861 slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode));
7862 emit_move_insn (slot1, y);
7865 libfunc = gen_rtx_SYMBOL_REF (Pmode, qpfunc);
7866 emit_library_call (libfunc, LCT_NORMAL,
7868 XEXP (slot0, 0), Pmode,
7869 XEXP (slot1, 0), Pmode);
7874 libfunc = gen_rtx_SYMBOL_REF (Pmode, qpfunc);
7875 emit_library_call (libfunc, LCT_NORMAL,
7877 x, TFmode, y, TFmode);
7882 /* Immediately move the result of the libcall into a pseudo
7883 register so reload doesn't clobber the value if it needs
7884 the return register for a spill reg. */
7885 result = gen_reg_rtx (mode);
7886 emit_move_insn (result, hard_libcall_value (mode, libfunc));
7891 return gen_rtx_NE (VOIDmode, result, const0_rtx);
7894 new_comparison = (comparison == UNORDERED ? EQ : NE);
7895 return gen_rtx_fmt_ee (new_comparison, VOIDmode, result, GEN_INT(3));
7898 new_comparison = (comparison == UNGT ? GT : NE);
7899 return gen_rtx_fmt_ee (new_comparison, VOIDmode, result, const1_rtx);
7901 return gen_rtx_NE (VOIDmode, result, const2_rtx);
7903 tem = gen_reg_rtx (mode);
7905 emit_insn (gen_andsi3 (tem, result, const1_rtx));
7907 emit_insn (gen_anddi3 (tem, result, const1_rtx));
7908 return gen_rtx_NE (VOIDmode, tem, const0_rtx);
7911 tem = gen_reg_rtx (mode);
7913 emit_insn (gen_addsi3 (tem, result, const1_rtx));
7915 emit_insn (gen_adddi3 (tem, result, const1_rtx));
7916 tem2 = gen_reg_rtx (mode);
7918 emit_insn (gen_andsi3 (tem2, tem, const2_rtx));
7920 emit_insn (gen_anddi3 (tem2, tem, const2_rtx));
7921 new_comparison = (comparison == UNEQ ? EQ : NE);
7922 return gen_rtx_fmt_ee (new_comparison, VOIDmode, tem2, const0_rtx);
7928 /* Generate an unsigned DImode to FP conversion. This is the same code
7929 optabs would emit if we didn't have TFmode patterns. */
7932 sparc_emit_floatunsdi (rtx *operands, enum machine_mode mode)
7934 rtx neglab, donelab, i0, i1, f0, in, out;
7937 in = force_reg (DImode, operands[1]);
7938 neglab = gen_label_rtx ();
7939 donelab = gen_label_rtx ();
7940 i0 = gen_reg_rtx (DImode);
7941 i1 = gen_reg_rtx (DImode);
7942 f0 = gen_reg_rtx (mode);
7944 emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, DImode, 0, neglab);
7946 emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_FLOAT (mode, in)));
7947 emit_jump_insn (gen_jump (donelab));
7950 emit_label (neglab);
7952 emit_insn (gen_lshrdi3 (i0, in, const1_rtx));
7953 emit_insn (gen_anddi3 (i1, in, const1_rtx));
7954 emit_insn (gen_iordi3 (i0, i0, i1));
7955 emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_FLOAT (mode, i0)));
7956 emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
7958 emit_label (donelab);
7961 /* Generate an FP to unsigned DImode conversion. This is the same code
7962 optabs would emit if we didn't have TFmode patterns. */
7965 sparc_emit_fixunsdi (rtx *operands, enum machine_mode mode)
7967 rtx neglab, donelab, i0, i1, f0, in, out, limit;
7970 in = force_reg (mode, operands[1]);
7971 neglab = gen_label_rtx ();
7972 donelab = gen_label_rtx ();
7973 i0 = gen_reg_rtx (DImode);
7974 i1 = gen_reg_rtx (DImode);
7975 limit = gen_reg_rtx (mode);
7976 f0 = gen_reg_rtx (mode);
7978 emit_move_insn (limit,
7979 CONST_DOUBLE_FROM_REAL_VALUE (
7980 REAL_VALUE_ATOF ("9223372036854775808.0", mode), mode));
7981 emit_cmp_and_jump_insns (in, limit, GE, NULL_RTX, mode, 0, neglab);
7983 emit_insn (gen_rtx_SET (VOIDmode,
7985 gen_rtx_FIX (DImode, gen_rtx_FIX (mode, in))));
7986 emit_jump_insn (gen_jump (donelab));
7989 emit_label (neglab);
7991 emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_MINUS (mode, in, limit)));
7992 emit_insn (gen_rtx_SET (VOIDmode,
7994 gen_rtx_FIX (DImode, gen_rtx_FIX (mode, f0))));
7995 emit_insn (gen_movdi (i1, const1_rtx));
7996 emit_insn (gen_ashldi3 (i1, i1, GEN_INT (63)));
7997 emit_insn (gen_xordi3 (out, i0, i1));
7999 emit_label (donelab);
8002 /* Return the string to output a compare and branch instruction to DEST.
8003 DEST is the destination insn (i.e. the label), INSN is the source,
8004 and OP is the conditional expression. */
8007 output_cbcond (rtx op, rtx dest, rtx insn)
8009 enum machine_mode mode = GET_MODE (XEXP (op, 0));
8010 enum rtx_code code = GET_CODE (op);
8011 const char *cond_str, *tmpl;
8012 int far, emit_nop, len;
8013 static char string[64];
8016 /* Compare and Branch is limited to +-2KB. If it is too far away,
8028 len = get_attr_length (insn);
8031 emit_nop = len == 2;
8034 code = reverse_condition (code);
8036 size_char = ((mode == SImode) ? 'w' : 'x');
8049 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
8064 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
8092 int veryfar = 1, delta;
8094 if (INSN_ADDRESSES_SET_P ())
8096 delta = (INSN_ADDRESSES (INSN_UID (dest))
8097 - INSN_ADDRESSES (INSN_UID (insn)));
8098 /* Leave some instructions for "slop". */
8099 if (delta >= -260000 && delta < 260000)
8104 tmpl = "c%cb%s\t%%1, %%2, .+16\n\tnop\n\tb\t%%3\n\tnop";
8106 tmpl = "c%cb%s\t%%1, %%2, .+16\n\tnop\n\tba,pt\t%%%%xcc, %%3\n\tnop";
8111 tmpl = "c%cb%s\t%%1, %%2, %%3\n\tnop";
8113 tmpl = "c%cb%s\t%%1, %%2, %%3";
8116 snprintf (string, sizeof(string), tmpl, size_char, cond_str);
8121 /* Return the string to output a conditional branch to LABEL, testing
8122 register REG. LABEL is the operand number of the label; REG is the
8123 operand number of the reg. OP is the conditional expression. The mode
8124 of REG says what kind of comparison we made.
8126 DEST is the destination insn (i.e. the label), INSN is the source.
8128 REVERSED is nonzero if we should reverse the sense of the comparison.
8130 ANNUL is nonzero if we should generate an annulling branch. */
8133 output_v9branch (rtx op, rtx dest, int reg, int label, int reversed,
8134 int annul, rtx insn)
8136 static char string[64];
8137 enum rtx_code code = GET_CODE (op);
8138 enum machine_mode mode = GET_MODE (XEXP (op, 0));
8143 /* branch on register are limited to +-128KB. If it is too far away,
8156 brgez,a,pn %o1, .LC29
8162 ba,pt %xcc, .LC29 */
8164 far = get_attr_length (insn) >= 3;
8166 /* If not floating-point or if EQ or NE, we can just reverse the code. */
8168 code = reverse_condition (code);
8170 /* Only 64 bit versions of these instructions exist. */
8171 gcc_assert (mode == DImode);
8173 /* Start by writing the branch condition. */
8178 strcpy (string, "brnz");
8182 strcpy (string, "brz");
8186 strcpy (string, "brgez");
8190 strcpy (string, "brlz");
8194 strcpy (string, "brlez");
8198 strcpy (string, "brgz");
8205 p = strchr (string, '\0');
8207 /* Now add the annulling, reg, label, and nop. */
8214 if (insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
8217 ((XINT (note, 0) >= REG_BR_PROB_BASE / 2) ^ far)
8222 *p = p < string + 8 ? '\t' : ' ';
8230 int veryfar = 1, delta;
8232 if (INSN_ADDRESSES_SET_P ())
8234 delta = (INSN_ADDRESSES (INSN_UID (dest))
8235 - INSN_ADDRESSES (INSN_UID (insn)));
8236 /* Leave some instructions for "slop". */
8237 if (delta >= -260000 && delta < 260000)
8241 strcpy (p, ".+12\n\t nop\n\t");
8242 /* Skip the next insn if requested or
8243 if we know that it will be a nop. */
8244 if (annul || ! final_sequence)
8254 strcpy (p, "ba,pt\t%%xcc, ");
8268 /* Return 1, if any of the registers of the instruction are %l[0-7] or %o[0-7].
8269 Such instructions cannot be used in the delay slot of return insn on v9.
8270 If TEST is 0, also rename all %i[0-7] registers to their %o[0-7] counterparts.
8274 epilogue_renumber (register rtx *where, int test)
8276 register const char *fmt;
8278 register enum rtx_code code;
8283 code = GET_CODE (*where);
8288 if (REGNO (*where) >= 8 && REGNO (*where) < 24) /* oX or lX */
8290 if (! test && REGNO (*where) >= 24 && REGNO (*where) < 32)
8291 *where = gen_rtx_REG (GET_MODE (*where), OUTGOING_REGNO (REGNO(*where)));
8299 /* Do not replace the frame pointer with the stack pointer because
8300 it can cause the delayed instruction to load below the stack.
8301 This occurs when instructions like:
8303 (set (reg/i:SI 24 %i0)
8304 (mem/f:SI (plus:SI (reg/f:SI 30 %fp)
8305 (const_int -20 [0xffffffec])) 0))
8307 are in the return delayed slot. */
8309 if (GET_CODE (XEXP (*where, 0)) == REG
8310 && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM
8311 && (GET_CODE (XEXP (*where, 1)) != CONST_INT
8312 || INTVAL (XEXP (*where, 1)) < SPARC_STACK_BIAS))
8317 if (SPARC_STACK_BIAS
8318 && GET_CODE (XEXP (*where, 0)) == REG
8319 && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM)
8327 fmt = GET_RTX_FORMAT (code);
8329 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8334 for (j = XVECLEN (*where, i) - 1; j >= 0; j--)
8335 if (epilogue_renumber (&(XVECEXP (*where, i, j)), test))
8338 else if (fmt[i] == 'e'
8339 && epilogue_renumber (&(XEXP (*where, i)), test))
8345 /* Leaf functions and non-leaf functions have different needs. */
8348 reg_leaf_alloc_order[] = REG_LEAF_ALLOC_ORDER;
8351 reg_nonleaf_alloc_order[] = REG_ALLOC_ORDER;
8353 static const int *const reg_alloc_orders[] = {
8354 reg_leaf_alloc_order,
8355 reg_nonleaf_alloc_order};
8358 order_regs_for_local_alloc (void)
8360 static int last_order_nonleaf = 1;
8362 if (df_regs_ever_live_p (15) != last_order_nonleaf)
8364 last_order_nonleaf = !last_order_nonleaf;
8365 memcpy ((char *) reg_alloc_order,
8366 (const char *) reg_alloc_orders[last_order_nonleaf],
8367 FIRST_PSEUDO_REGISTER * sizeof (int));
8371 /* Return 1 if REG and MEM are legitimate enough to allow the various
8372 mem<-->reg splits to be run. */
8375 sparc_splitdi_legitimate (rtx reg, rtx mem)
8377 /* Punt if we are here by mistake. */
8378 gcc_assert (reload_completed);
8380 /* We must have an offsettable memory reference. */
8381 if (! offsettable_memref_p (mem))
8384 /* If we have legitimate args for ldd/std, we do not want
8385 the split to happen. */
8386 if ((REGNO (reg) % 2) == 0
8387 && mem_min_alignment (mem, 8))
8394 /* Like sparc_splitdi_legitimate but for REG <--> REG moves. */
8397 sparc_split_regreg_legitimate (rtx reg1, rtx reg2)
8401 if (GET_CODE (reg1) == SUBREG)
8402 reg1 = SUBREG_REG (reg1);
8403 if (GET_CODE (reg1) != REG)
8405 regno1 = REGNO (reg1);
8407 if (GET_CODE (reg2) == SUBREG)
8408 reg2 = SUBREG_REG (reg2);
8409 if (GET_CODE (reg2) != REG)
8411 regno2 = REGNO (reg2);
8413 if (SPARC_INT_REG_P (regno1) && SPARC_INT_REG_P (regno2))
8418 if ((SPARC_INT_REG_P (regno1) && SPARC_FP_REG_P (regno2))
8419 || (SPARC_FP_REG_P (regno1) && SPARC_INT_REG_P (regno2)))
8426 /* Return 1 if x and y are some kind of REG and they refer to
8427 different hard registers. This test is guaranteed to be
8428 run after reload. */
8431 sparc_absnegfloat_split_legitimate (rtx x, rtx y)
8433 if (GET_CODE (x) != REG)
8435 if (GET_CODE (y) != REG)
8437 if (REGNO (x) == REGNO (y))
8442 /* Return 1 if REGNO (reg1) is even and REGNO (reg1) == REGNO (reg2) - 1.
8443 This makes them candidates for using ldd and std insns.
8445 Note reg1 and reg2 *must* be hard registers. */
8448 registers_ok_for_ldd_peep (rtx reg1, rtx reg2)
8450 /* We might have been passed a SUBREG. */
8451 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
8454 if (REGNO (reg1) % 2 != 0)
8457 /* Integer ldd is deprecated in SPARC V9 */
8458 if (TARGET_V9 && SPARC_INT_REG_P (REGNO (reg1)))
8461 return (REGNO (reg1) == REGNO (reg2) - 1);
8464 /* Return 1 if the addresses in mem1 and mem2 are suitable for use in
8467 This can only happen when addr1 and addr2, the addresses in mem1
8468 and mem2, are consecutive memory locations (addr1 + 4 == addr2).
8469 addr1 must also be aligned on a 64-bit boundary.
8471 Also iff dependent_reg_rtx is not null it should not be used to
8472 compute the address for mem1, i.e. we cannot optimize a sequence
8484 But, note that the transformation from:
8489 is perfectly fine. Thus, the peephole2 patterns always pass us
8490 the destination register of the first load, never the second one.
8492 For stores we don't have a similar problem, so dependent_reg_rtx is
8496 mems_ok_for_ldd_peep (rtx mem1, rtx mem2, rtx dependent_reg_rtx)
8500 HOST_WIDE_INT offset1;
8502 /* The mems cannot be volatile. */
8503 if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
8506 /* MEM1 should be aligned on a 64-bit boundary. */
8507 if (MEM_ALIGN (mem1) < 64)
8510 addr1 = XEXP (mem1, 0);
8511 addr2 = XEXP (mem2, 0);
8513 /* Extract a register number and offset (if used) from the first addr. */
8514 if (GET_CODE (addr1) == PLUS)
8516 /* If not a REG, return zero. */
8517 if (GET_CODE (XEXP (addr1, 0)) != REG)
8521 reg1 = REGNO (XEXP (addr1, 0));
8522 /* The offset must be constant! */
8523 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
8525 offset1 = INTVAL (XEXP (addr1, 1));
8528 else if (GET_CODE (addr1) != REG)
8532 reg1 = REGNO (addr1);
8533 /* This was a simple (mem (reg)) expression. Offset is 0. */
8537 /* Make sure the second address is a (mem (plus (reg) (const_int). */
8538 if (GET_CODE (addr2) != PLUS)
8541 if (GET_CODE (XEXP (addr2, 0)) != REG
8542 || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
8545 if (reg1 != REGNO (XEXP (addr2, 0)))
8548 if (dependent_reg_rtx != NULL_RTX && reg1 == REGNO (dependent_reg_rtx))
8551 /* The first offset must be evenly divisible by 8 to ensure the
8552 address is 64 bit aligned. */
8553 if (offset1 % 8 != 0)
8556 /* The offset for the second addr must be 4 more than the first addr. */
8557 if (INTVAL (XEXP (addr2, 1)) != offset1 + 4)
8560 /* All the tests passed. addr1 and addr2 are valid for ldd and std
8565 /* Return the widened memory access made of MEM1 and MEM2 in MODE. */
8568 widen_mem_for_ldd_peep (rtx mem1, rtx mem2, enum machine_mode mode)
8570 rtx x = widen_memory_access (mem1, mode, 0);
8571 MEM_NOTRAP_P (x) = MEM_NOTRAP_P (mem1) && MEM_NOTRAP_P (mem2);
8575 /* Return 1 if reg is a pseudo, or is the first register in
8576 a hard register pair. This makes it suitable for use in
8577 ldd and std insns. */
8580 register_ok_for_ldd (rtx reg)
8582 /* We might have been passed a SUBREG. */
8586 if (REGNO (reg) < FIRST_PSEUDO_REGISTER)
8587 return (REGNO (reg) % 2 == 0);
8592 /* Return 1 if OP, a MEM, has an address which is known to be
8593 aligned to an 8-byte boundary. */
8596 memory_ok_for_ldd (rtx op)
8598 /* In 64-bit mode, we assume that the address is word-aligned. */
8599 if (TARGET_ARCH32 && !mem_min_alignment (op, 8))
8602 if (! can_create_pseudo_p ()
8603 && !strict_memory_address_p (Pmode, XEXP (op, 0)))
8609 /* Implement TARGET_PRINT_OPERAND_PUNCT_VALID_P. */
8612 sparc_print_operand_punct_valid_p (unsigned char code)
8625 /* Implement TARGET_PRINT_OPERAND.
8626 Print operand X (an rtx) in assembler syntax to file FILE.
8627 CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
8628 For `%' followed by punctuation, CODE is the punctuation and X is null. */
8631 sparc_print_operand (FILE *file, rtx x, int code)
8636 /* Output an insn in a delay slot. */
8638 sparc_indent_opcode = 1;
8640 fputs ("\n\t nop", file);
8643 /* Output an annul flag if there's nothing for the delay slot and we
8644 are optimizing. This is always used with '(' below.
8645 Sun OS 4.1.1 dbx can't handle an annulled unconditional branch;
8646 this is a dbx bug. So, we only do this when optimizing.
8647 On UltraSPARC, a branch in a delay slot causes a pipeline flush.
8648 Always emit a nop in case the next instruction is a branch. */
8649 if (! final_sequence && (optimize && (int)sparc_cpu < PROCESSOR_V9))
8653 /* Output a 'nop' if there's nothing for the delay slot and we are
8654 not optimizing. This is always used with '*' above. */
8655 if (! final_sequence && ! (optimize && (int)sparc_cpu < PROCESSOR_V9))
8656 fputs ("\n\t nop", file);
8657 else if (final_sequence)
8658 sparc_indent_opcode = 1;
8661 /* Output the right displacement from the saved PC on function return.
8662 The caller may have placed an "unimp" insn immediately after the call
8663 so we have to account for it. This insn is used in the 32-bit ABI
8664 when calling a function that returns a non zero-sized structure. The
8665 64-bit ABI doesn't have it. Be careful to have this test be the same
8666 as that for the call. The exception is when sparc_std_struct_return
8667 is enabled, the psABI is followed exactly and the adjustment is made
8668 by the code in sparc_struct_value_rtx. The call emitted is the same
8669 when sparc_std_struct_return is enabled. */
8671 && cfun->returns_struct
8672 && !sparc_std_struct_return
8673 && DECL_SIZE (DECL_RESULT (current_function_decl))
8674 && TREE_CODE (DECL_SIZE (DECL_RESULT (current_function_decl)))
8676 && !integer_zerop (DECL_SIZE (DECL_RESULT (current_function_decl))))
8682 /* Output the Embedded Medium/Anywhere code model base register. */
8683 fputs (EMBMEDANY_BASE_REG, file);
8686 /* Print some local dynamic TLS name. */
8687 assemble_name (file, get_some_local_dynamic_name ());
8691 /* Adjust the operand to take into account a RESTORE operation. */
8692 if (GET_CODE (x) == CONST_INT)
8694 else if (GET_CODE (x) != REG)
8695 output_operand_lossage ("invalid %%Y operand");
8696 else if (REGNO (x) < 8)
8697 fputs (reg_names[REGNO (x)], file);
8698 else if (REGNO (x) >= 24 && REGNO (x) < 32)
8699 fputs (reg_names[REGNO (x)-16], file);
8701 output_operand_lossage ("invalid %%Y operand");
8704 /* Print out the low order register name of a register pair. */
8705 if (WORDS_BIG_ENDIAN)
8706 fputs (reg_names[REGNO (x)+1], file);
8708 fputs (reg_names[REGNO (x)], file);
8711 /* Print out the high order register name of a register pair. */
8712 if (WORDS_BIG_ENDIAN)
8713 fputs (reg_names[REGNO (x)], file);
8715 fputs (reg_names[REGNO (x)+1], file);
8718 /* Print out the second register name of a register pair or quad.
8719 I.e., R (%o0) => %o1. */
8720 fputs (reg_names[REGNO (x)+1], file);
8723 /* Print out the third register name of a register quad.
8724 I.e., S (%o0) => %o2. */
8725 fputs (reg_names[REGNO (x)+2], file);
8728 /* Print out the fourth register name of a register quad.
8729 I.e., T (%o0) => %o3. */
8730 fputs (reg_names[REGNO (x)+3], file);
8733 /* Print a condition code register. */
8734 if (REGNO (x) == SPARC_ICC_REG)
8736 /* We don't handle CC[X]_NOOVmode because they're not supposed
8738 if (GET_MODE (x) == CCmode)
8739 fputs ("%icc", file);
8740 else if (GET_MODE (x) == CCXmode)
8741 fputs ("%xcc", file);
8746 /* %fccN register */
8747 fputs (reg_names[REGNO (x)], file);
8750 /* Print the operand's address only. */
8751 output_address (XEXP (x, 0));
8754 /* In this case we need a register. Use %g0 if the
8755 operand is const0_rtx. */
8757 || (GET_MODE (x) != VOIDmode && x == CONST0_RTX (GET_MODE (x))))
8759 fputs ("%g0", file);
8766 switch (GET_CODE (x))
8768 case IOR: fputs ("or", file); break;
8769 case AND: fputs ("and", file); break;
8770 case XOR: fputs ("xor", file); break;
8771 default: output_operand_lossage ("invalid %%A operand");
8776 switch (GET_CODE (x))
8778 case IOR: fputs ("orn", file); break;
8779 case AND: fputs ("andn", file); break;
8780 case XOR: fputs ("xnor", file); break;
8781 default: output_operand_lossage ("invalid %%B operand");
8785 /* This is used by the conditional move instructions. */
8788 enum rtx_code rc = GET_CODE (x);
8792 case NE: fputs ("ne", file); break;
8793 case EQ: fputs ("e", file); break;
8794 case GE: fputs ("ge", file); break;
8795 case GT: fputs ("g", file); break;
8796 case LE: fputs ("le", file); break;
8797 case LT: fputs ("l", file); break;
8798 case GEU: fputs ("geu", file); break;
8799 case GTU: fputs ("gu", file); break;
8800 case LEU: fputs ("leu", file); break;
8801 case LTU: fputs ("lu", file); break;
8802 case LTGT: fputs ("lg", file); break;
8803 case UNORDERED: fputs ("u", file); break;
8804 case ORDERED: fputs ("o", file); break;
8805 case UNLT: fputs ("ul", file); break;
8806 case UNLE: fputs ("ule", file); break;
8807 case UNGT: fputs ("ug", file); break;
8808 case UNGE: fputs ("uge", file); break;
8809 case UNEQ: fputs ("ue", file); break;
8810 default: output_operand_lossage ("invalid %%C operand");
8815 /* This are used by the movr instruction pattern. */
8818 enum rtx_code rc = GET_CODE (x);
8821 case NE: fputs ("ne", file); break;
8822 case EQ: fputs ("e", file); break;
8823 case GE: fputs ("gez", file); break;
8824 case LT: fputs ("lz", file); break;
8825 case LE: fputs ("lez", file); break;
8826 case GT: fputs ("gz", file); break;
8827 default: output_operand_lossage ("invalid %%D operand");
8834 /* Print a sign-extended character. */
8835 int i = trunc_int_for_mode (INTVAL (x), QImode);
8836 fprintf (file, "%d", i);
8841 /* Operand must be a MEM; write its address. */
8842 if (GET_CODE (x) != MEM)
8843 output_operand_lossage ("invalid %%f operand");
8844 output_address (XEXP (x, 0));
8849 /* Print a sign-extended 32-bit value. */
8851 if (GET_CODE(x) == CONST_INT)
8853 else if (GET_CODE(x) == CONST_DOUBLE)
8854 i = CONST_DOUBLE_LOW (x);
8857 output_operand_lossage ("invalid %%s operand");
8860 i = trunc_int_for_mode (i, SImode);
8861 fprintf (file, HOST_WIDE_INT_PRINT_DEC, i);
8866 /* Do nothing special. */
8870 /* Undocumented flag. */
8871 output_operand_lossage ("invalid operand output code");
8874 if (GET_CODE (x) == REG)
8875 fputs (reg_names[REGNO (x)], file);
8876 else if (GET_CODE (x) == MEM)
8879 /* Poor Sun assembler doesn't understand absolute addressing. */
8880 if (CONSTANT_P (XEXP (x, 0)))
8881 fputs ("%g0+", file);
8882 output_address (XEXP (x, 0));
8885 else if (GET_CODE (x) == HIGH)
8887 fputs ("%hi(", file);
8888 output_addr_const (file, XEXP (x, 0));
8891 else if (GET_CODE (x) == LO_SUM)
8893 sparc_print_operand (file, XEXP (x, 0), 0);
8894 if (TARGET_CM_MEDMID)
8895 fputs ("+%l44(", file);
8897 fputs ("+%lo(", file);
8898 output_addr_const (file, XEXP (x, 1));
8901 else if (GET_CODE (x) == CONST_DOUBLE
8902 && (GET_MODE (x) == VOIDmode
8903 || GET_MODE_CLASS (GET_MODE (x)) == MODE_INT))
8905 if (CONST_DOUBLE_HIGH (x) == 0)
8906 fprintf (file, "%u", (unsigned int) CONST_DOUBLE_LOW (x));
8907 else if (CONST_DOUBLE_HIGH (x) == -1
8908 && CONST_DOUBLE_LOW (x) < 0)
8909 fprintf (file, "%d", (int) CONST_DOUBLE_LOW (x));
8911 output_operand_lossage ("long long constant not a valid immediate operand");
8913 else if (GET_CODE (x) == CONST_DOUBLE)
8914 output_operand_lossage ("floating point constant not a valid immediate operand");
8915 else { output_addr_const (file, x); }
8918 /* Implement TARGET_PRINT_OPERAND_ADDRESS. */
8921 sparc_print_operand_address (FILE *file, rtx x)
8923 register rtx base, index = 0;
8925 register rtx addr = x;
8928 fputs (reg_names[REGNO (addr)], file);
8929 else if (GET_CODE (addr) == PLUS)
8931 if (CONST_INT_P (XEXP (addr, 0)))
8932 offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1);
8933 else if (CONST_INT_P (XEXP (addr, 1)))
8934 offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);
8936 base = XEXP (addr, 0), index = XEXP (addr, 1);
8937 if (GET_CODE (base) == LO_SUM)
8939 gcc_assert (USE_AS_OFFSETABLE_LO10
8941 && ! TARGET_CM_MEDMID);
8942 output_operand (XEXP (base, 0), 0);
8943 fputs ("+%lo(", file);
8944 output_address (XEXP (base, 1));
8945 fprintf (file, ")+%d", offset);
8949 fputs (reg_names[REGNO (base)], file);
8951 fprintf (file, "%+d", offset);
8952 else if (REG_P (index))
8953 fprintf (file, "+%s", reg_names[REGNO (index)]);
8954 else if (GET_CODE (index) == SYMBOL_REF
8955 || GET_CODE (index) == LABEL_REF
8956 || GET_CODE (index) == CONST)
8957 fputc ('+', file), output_addr_const (file, index);
8958 else gcc_unreachable ();
8961 else if (GET_CODE (addr) == MINUS
8962 && GET_CODE (XEXP (addr, 1)) == LABEL_REF)
8964 output_addr_const (file, XEXP (addr, 0));
8966 output_addr_const (file, XEXP (addr, 1));
8967 fputs ("-.)", file);
8969 else if (GET_CODE (addr) == LO_SUM)
8971 output_operand (XEXP (addr, 0), 0);
8972 if (TARGET_CM_MEDMID)
8973 fputs ("+%l44(", file);
8975 fputs ("+%lo(", file);
8976 output_address (XEXP (addr, 1));
8980 && GET_CODE (addr) == CONST
8981 && GET_CODE (XEXP (addr, 0)) == MINUS
8982 && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST
8983 && GET_CODE (XEXP (XEXP (XEXP (addr, 0), 1), 0)) == MINUS
8984 && XEXP (XEXP (XEXP (XEXP (addr, 0), 1), 0), 1) == pc_rtx)
8986 addr = XEXP (addr, 0);
8987 output_addr_const (file, XEXP (addr, 0));
8988 /* Group the args of the second CONST in parenthesis. */
8990 /* Skip past the second CONST--it does nothing for us. */
8991 output_addr_const (file, XEXP (XEXP (addr, 1), 0));
8992 /* Close the parenthesis. */
8997 output_addr_const (file, addr);
9001 /* Target hook for assembling integer objects. The sparc version has
9002 special handling for aligned DI-mode objects. */
9005 sparc_assemble_integer (rtx x, unsigned int size, int aligned_p)
9007 /* ??? We only output .xword's for symbols and only then in environments
9008 where the assembler can handle them. */
9009 if (aligned_p && size == 8
9010 && (GET_CODE (x) != CONST_INT && GET_CODE (x) != CONST_DOUBLE))
9014 assemble_integer_with_op ("\t.xword\t", x);
9019 assemble_aligned_integer (4, const0_rtx);
9020 assemble_aligned_integer (4, x);
9024 return default_assemble_integer (x, size, aligned_p);
9027 /* Return the value of a code used in the .proc pseudo-op that says
9028 what kind of result this function returns. For non-C types, we pick
9029 the closest C type. */
9031 #ifndef SHORT_TYPE_SIZE
9032 #define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
9035 #ifndef INT_TYPE_SIZE
9036 #define INT_TYPE_SIZE BITS_PER_WORD
9039 #ifndef LONG_TYPE_SIZE
9040 #define LONG_TYPE_SIZE BITS_PER_WORD
9043 #ifndef LONG_LONG_TYPE_SIZE
9044 #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
9047 #ifndef FLOAT_TYPE_SIZE
9048 #define FLOAT_TYPE_SIZE BITS_PER_WORD
9051 #ifndef DOUBLE_TYPE_SIZE
9052 #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
9055 #ifndef LONG_DOUBLE_TYPE_SIZE
9056 #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
9060 sparc_type_code (register tree type)
9062 register unsigned long qualifiers = 0;
9063 register unsigned shift;
9065 /* Only the first 30 bits of the qualifier are valid. We must refrain from
9066 setting more, since some assemblers will give an error for this. Also,
9067 we must be careful to avoid shifts of 32 bits or more to avoid getting
9068 unpredictable results. */
9070 for (shift = 6; shift < 30; shift += 2, type = TREE_TYPE (type))
9072 switch (TREE_CODE (type))
9078 qualifiers |= (3 << shift);
9083 qualifiers |= (2 << shift);
9087 case REFERENCE_TYPE:
9089 qualifiers |= (1 << shift);
9093 return (qualifiers | 8);
9096 case QUAL_UNION_TYPE:
9097 return (qualifiers | 9);
9100 return (qualifiers | 10);
9103 return (qualifiers | 16);
9106 /* If this is a range type, consider it to be the underlying
9108 if (TREE_TYPE (type) != 0)
9111 /* Carefully distinguish all the standard types of C,
9112 without messing up if the language is not C. We do this by
9113 testing TYPE_PRECISION and TYPE_UNSIGNED. The old code used to
9114 look at both the names and the above fields, but that's redundant.
9115 Any type whose size is between two C types will be considered
9116 to be the wider of the two types. Also, we do not have a
9117 special code to use for "long long", so anything wider than
9118 long is treated the same. Note that we can't distinguish
9119 between "int" and "long" in this code if they are the same
9120 size, but that's fine, since neither can the assembler. */
9122 if (TYPE_PRECISION (type) <= CHAR_TYPE_SIZE)
9123 return (qualifiers | (TYPE_UNSIGNED (type) ? 12 : 2));
9125 else if (TYPE_PRECISION (type) <= SHORT_TYPE_SIZE)
9126 return (qualifiers | (TYPE_UNSIGNED (type) ? 13 : 3));
9128 else if (TYPE_PRECISION (type) <= INT_TYPE_SIZE)
9129 return (qualifiers | (TYPE_UNSIGNED (type) ? 14 : 4));
9132 return (qualifiers | (TYPE_UNSIGNED (type) ? 15 : 5));
9135 /* If this is a range type, consider it to be the underlying
9137 if (TREE_TYPE (type) != 0)
9140 /* Carefully distinguish all the standard types of C,
9141 without messing up if the language is not C. */
9143 if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
9144 return (qualifiers | 6);
9147 return (qualifiers | 7);
9149 case COMPLEX_TYPE: /* GNU Fortran COMPLEX type. */
9150 /* ??? We need to distinguish between double and float complex types,
9151 but I don't know how yet because I can't reach this code from
9152 existing front-ends. */
9153 return (qualifiers | 7); /* Who knows? */
9156 case BOOLEAN_TYPE: /* Boolean truth value type. */
9162 gcc_unreachable (); /* Not a type! */
9169 /* Nested function support. */
9171 /* Emit RTL insns to initialize the variable parts of a trampoline.
9172 FNADDR is an RTX for the address of the function's pure code.
9173 CXT is an RTX for the static chain value for the function.
9175 This takes 16 insns: 2 shifts & 2 ands (to split up addresses), 4 sethi
9176 (to load in opcodes), 4 iors (to merge address and opcodes), and 4 writes
9177 (to store insns). This is a bit excessive. Perhaps a different
9178 mechanism would be better here.
9180 Emit enough FLUSH insns to synchronize the data and instruction caches. */
9183 sparc32_initialize_trampoline (rtx m_tramp, rtx fnaddr, rtx cxt)
9185 /* SPARC 32-bit trampoline:
9188 sethi %hi(static), %g2
9190 or %g2, %lo(static), %g2
9192 SETHI i,r = 00rr rrr1 00ii iiii iiii iiii iiii iiii
9193 JMPL r+i,d = 10dd ddd1 1100 0rrr rr1i iiii iiii iiii
9197 (adjust_address (m_tramp, SImode, 0),
9198 expand_binop (SImode, ior_optab,
9199 expand_shift (RSHIFT_EXPR, SImode, fnaddr, 10, 0, 1),
9200 GEN_INT (trunc_int_for_mode (0x03000000, SImode)),
9201 NULL_RTX, 1, OPTAB_DIRECT));
9204 (adjust_address (m_tramp, SImode, 4),
9205 expand_binop (SImode, ior_optab,
9206 expand_shift (RSHIFT_EXPR, SImode, cxt, 10, 0, 1),
9207 GEN_INT (trunc_int_for_mode (0x05000000, SImode)),
9208 NULL_RTX, 1, OPTAB_DIRECT));
9211 (adjust_address (m_tramp, SImode, 8),
9212 expand_binop (SImode, ior_optab,
9213 expand_and (SImode, fnaddr, GEN_INT (0x3ff), NULL_RTX),
9214 GEN_INT (trunc_int_for_mode (0x81c06000, SImode)),
9215 NULL_RTX, 1, OPTAB_DIRECT));
9218 (adjust_address (m_tramp, SImode, 12),
9219 expand_binop (SImode, ior_optab,
9220 expand_and (SImode, cxt, GEN_INT (0x3ff), NULL_RTX),
9221 GEN_INT (trunc_int_for_mode (0x8410a000, SImode)),
9222 NULL_RTX, 1, OPTAB_DIRECT));
9224 /* On UltraSPARC a flush flushes an entire cache line. The trampoline is
9225 aligned on a 16 byte boundary so one flush clears it all. */
9226 emit_insn (gen_flush (validize_mem (adjust_address (m_tramp, SImode, 0))));
9227 if (sparc_cpu != PROCESSOR_ULTRASPARC
9228 && sparc_cpu != PROCESSOR_ULTRASPARC3
9229 && sparc_cpu != PROCESSOR_NIAGARA
9230 && sparc_cpu != PROCESSOR_NIAGARA2
9231 && sparc_cpu != PROCESSOR_NIAGARA3
9232 && sparc_cpu != PROCESSOR_NIAGARA4)
9233 emit_insn (gen_flush (validize_mem (adjust_address (m_tramp, SImode, 8))));
9235 /* Call __enable_execute_stack after writing onto the stack to make sure
9236 the stack address is accessible. */
9237 #ifdef HAVE_ENABLE_EXECUTE_STACK
9238 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
9239 LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
9244 /* The 64-bit version is simpler because it makes more sense to load the
9245 values as "immediate" data out of the trampoline. It's also easier since
9246 we can read the PC without clobbering a register. */
9249 sparc64_initialize_trampoline (rtx m_tramp, rtx fnaddr, rtx cxt)
9251 /* SPARC 64-bit trampoline:
9260 emit_move_insn (adjust_address (m_tramp, SImode, 0),
9261 GEN_INT (trunc_int_for_mode (0x83414000, SImode)));
9262 emit_move_insn (adjust_address (m_tramp, SImode, 4),
9263 GEN_INT (trunc_int_for_mode (0xca586018, SImode)));
9264 emit_move_insn (adjust_address (m_tramp, SImode, 8),
9265 GEN_INT (trunc_int_for_mode (0x81c14000, SImode)));
9266 emit_move_insn (adjust_address (m_tramp, SImode, 12),
9267 GEN_INT (trunc_int_for_mode (0xca586010, SImode)));
9268 emit_move_insn (adjust_address (m_tramp, DImode, 16), cxt);
9269 emit_move_insn (adjust_address (m_tramp, DImode, 24), fnaddr);
9270 emit_insn (gen_flushdi (validize_mem (adjust_address (m_tramp, DImode, 0))));
9272 if (sparc_cpu != PROCESSOR_ULTRASPARC
9273 && sparc_cpu != PROCESSOR_ULTRASPARC3
9274 && sparc_cpu != PROCESSOR_NIAGARA
9275 && sparc_cpu != PROCESSOR_NIAGARA2
9276 && sparc_cpu != PROCESSOR_NIAGARA3
9277 && sparc_cpu != PROCESSOR_NIAGARA4)
9278 emit_insn (gen_flushdi (validize_mem (adjust_address (m_tramp, DImode, 8))));
9280 /* Call __enable_execute_stack after writing onto the stack to make sure
9281 the stack address is accessible. */
9282 #ifdef HAVE_ENABLE_EXECUTE_STACK
9283 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
9284 LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
9288 /* Worker for TARGET_TRAMPOLINE_INIT. */
9291 sparc_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
9293 rtx fnaddr = force_reg (Pmode, XEXP (DECL_RTL (fndecl), 0));
9294 cxt = force_reg (Pmode, cxt);
9296 sparc64_initialize_trampoline (m_tramp, fnaddr, cxt);
9298 sparc32_initialize_trampoline (m_tramp, fnaddr, cxt);
9301 /* Adjust the cost of a scheduling dependency. Return the new cost of
9302 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
9305 supersparc_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
9307 enum attr_type insn_type;
9309 if (! recog_memoized (insn))
9312 insn_type = get_attr_type (insn);
9314 if (REG_NOTE_KIND (link) == 0)
9316 /* Data dependency; DEP_INSN writes a register that INSN reads some
9319 /* if a load, then the dependence must be on the memory address;
9320 add an extra "cycle". Note that the cost could be two cycles
9321 if the reg was written late in an instruction group; we ca not tell
9323 if (insn_type == TYPE_LOAD || insn_type == TYPE_FPLOAD)
9326 /* Get the delay only if the address of the store is the dependence. */
9327 if (insn_type == TYPE_STORE || insn_type == TYPE_FPSTORE)
9329 rtx pat = PATTERN(insn);
9330 rtx dep_pat = PATTERN (dep_insn);
9332 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
9333 return cost; /* This should not happen! */
9335 /* The dependency between the two instructions was on the data that
9336 is being stored. Assume that this implies that the address of the
9337 store is not dependent. */
9338 if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
9341 return cost + 3; /* An approximation. */
9344 /* A shift instruction cannot receive its data from an instruction
9345 in the same cycle; add a one cycle penalty. */
9346 if (insn_type == TYPE_SHIFT)
9347 return cost + 3; /* Split before cascade into shift. */
9351 /* Anti- or output- dependency; DEP_INSN reads/writes a register that
9352 INSN writes some cycles later. */
9354 /* These are only significant for the fpu unit; writing a fp reg before
9355 the fpu has finished with it stalls the processor. */
9357 /* Reusing an integer register causes no problems. */
9358 if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
9366 hypersparc_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
9368 enum attr_type insn_type, dep_type;
9369 rtx pat = PATTERN(insn);
9370 rtx dep_pat = PATTERN (dep_insn);
9372 if (recog_memoized (insn) < 0 || recog_memoized (dep_insn) < 0)
9375 insn_type = get_attr_type (insn);
9376 dep_type = get_attr_type (dep_insn);
9378 switch (REG_NOTE_KIND (link))
9381 /* Data dependency; DEP_INSN writes a register that INSN reads some
9388 /* Get the delay iff the address of the store is the dependence. */
9389 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
9392 if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
9399 /* If a load, then the dependence must be on the memory address. If
9400 the addresses aren't equal, then it might be a false dependency */
9401 if (dep_type == TYPE_STORE || dep_type == TYPE_FPSTORE)
9403 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET
9404 || GET_CODE (SET_DEST (dep_pat)) != MEM
9405 || GET_CODE (SET_SRC (pat)) != MEM
9406 || ! rtx_equal_p (XEXP (SET_DEST (dep_pat), 0),
9407 XEXP (SET_SRC (pat), 0)))
9415 /* Compare to branch latency is 0. There is no benefit from
9416 separating compare and branch. */
9417 if (dep_type == TYPE_COMPARE)
9419 /* Floating point compare to branch latency is less than
9420 compare to conditional move. */
9421 if (dep_type == TYPE_FPCMP)
9430 /* Anti-dependencies only penalize the fpu unit. */
9431 if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
9443 sparc_adjust_cost(rtx insn, rtx link, rtx dep, int cost)
9447 case PROCESSOR_SUPERSPARC:
9448 cost = supersparc_adjust_cost (insn, link, dep, cost);
9450 case PROCESSOR_HYPERSPARC:
9451 case PROCESSOR_SPARCLITE86X:
9452 cost = hypersparc_adjust_cost (insn, link, dep, cost);
9461 sparc_sched_init (FILE *dump ATTRIBUTE_UNUSED,
9462 int sched_verbose ATTRIBUTE_UNUSED,
9463 int max_ready ATTRIBUTE_UNUSED)
9467 sparc_use_sched_lookahead (void)
9469 if (sparc_cpu == PROCESSOR_NIAGARA
9470 || sparc_cpu == PROCESSOR_NIAGARA2
9471 || sparc_cpu == PROCESSOR_NIAGARA3)
9473 if (sparc_cpu == PROCESSOR_NIAGARA4)
9475 if (sparc_cpu == PROCESSOR_ULTRASPARC
9476 || sparc_cpu == PROCESSOR_ULTRASPARC3)
9478 if ((1 << sparc_cpu) &
9479 ((1 << PROCESSOR_SUPERSPARC) | (1 << PROCESSOR_HYPERSPARC) |
9480 (1 << PROCESSOR_SPARCLITE86X)))
9486 sparc_issue_rate (void)
9490 case PROCESSOR_NIAGARA:
9491 case PROCESSOR_NIAGARA2:
9492 case PROCESSOR_NIAGARA3:
9495 case PROCESSOR_NIAGARA4:
9497 /* Assume V9 processors are capable of at least dual-issue. */
9499 case PROCESSOR_SUPERSPARC:
9501 case PROCESSOR_HYPERSPARC:
9502 case PROCESSOR_SPARCLITE86X:
9504 case PROCESSOR_ULTRASPARC:
9505 case PROCESSOR_ULTRASPARC3:
9511 set_extends (rtx insn)
9513 register rtx pat = PATTERN (insn);
9515 switch (GET_CODE (SET_SRC (pat)))
9517 /* Load and some shift instructions zero extend. */
9520 /* sethi clears the high bits */
9522 /* LO_SUM is used with sethi. sethi cleared the high
9523 bits and the values used with lo_sum are positive */
9525 /* Store flag stores 0 or 1 */
9535 rtx op0 = XEXP (SET_SRC (pat), 0);
9536 rtx op1 = XEXP (SET_SRC (pat), 1);
9537 if (GET_CODE (op1) == CONST_INT)
9538 return INTVAL (op1) >= 0;
9539 if (GET_CODE (op0) != REG)
9541 if (sparc_check_64 (op0, insn) == 1)
9543 return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
9548 rtx op0 = XEXP (SET_SRC (pat), 0);
9549 rtx op1 = XEXP (SET_SRC (pat), 1);
9550 if (GET_CODE (op0) != REG || sparc_check_64 (op0, insn) <= 0)
9552 if (GET_CODE (op1) == CONST_INT)
9553 return INTVAL (op1) >= 0;
9554 return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
9557 return GET_MODE (SET_SRC (pat)) == SImode;
9558 /* Positive integers leave the high bits zero. */
9560 return ! (CONST_DOUBLE_LOW (SET_SRC (pat)) & 0x80000000);
9562 return ! (INTVAL (SET_SRC (pat)) & 0x80000000);
9565 return - (GET_MODE (SET_SRC (pat)) == SImode);
9567 return sparc_check_64 (SET_SRC (pat), insn);
9573 /* We _ought_ to have only one kind per function, but... */
9574 static GTY(()) rtx sparc_addr_diff_list;
9575 static GTY(()) rtx sparc_addr_list;
9578 sparc_defer_case_vector (rtx lab, rtx vec, int diff)
9580 vec = gen_rtx_EXPR_LIST (VOIDmode, lab, vec);
9582 sparc_addr_diff_list
9583 = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_diff_list);
9585 sparc_addr_list = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_list);
9589 sparc_output_addr_vec (rtx vec)
9591 rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
9592 int idx, vlen = XVECLEN (body, 0);
9594 #ifdef ASM_OUTPUT_ADDR_VEC_START
9595 ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
9598 #ifdef ASM_OUTPUT_CASE_LABEL
9599 ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
9602 (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
9605 for (idx = 0; idx < vlen; idx++)
9607 ASM_OUTPUT_ADDR_VEC_ELT
9608 (asm_out_file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
9611 #ifdef ASM_OUTPUT_ADDR_VEC_END
9612 ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
9617 sparc_output_addr_diff_vec (rtx vec)
9619 rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
9620 rtx base = XEXP (XEXP (body, 0), 0);
9621 int idx, vlen = XVECLEN (body, 1);
9623 #ifdef ASM_OUTPUT_ADDR_VEC_START
9624 ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
9627 #ifdef ASM_OUTPUT_CASE_LABEL
9628 ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
9631 (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
9634 for (idx = 0; idx < vlen; idx++)
9636 ASM_OUTPUT_ADDR_DIFF_ELT
9639 CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
9640 CODE_LABEL_NUMBER (base));
9643 #ifdef ASM_OUTPUT_ADDR_VEC_END
9644 ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
9649 sparc_output_deferred_case_vectors (void)
9654 if (sparc_addr_list == NULL_RTX
9655 && sparc_addr_diff_list == NULL_RTX)
9658 /* Align to cache line in the function's code section. */
9659 switch_to_section (current_function_section ());
9661 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
9663 ASM_OUTPUT_ALIGN (asm_out_file, align);
9665 for (t = sparc_addr_list; t ; t = XEXP (t, 1))
9666 sparc_output_addr_vec (XEXP (t, 0));
9667 for (t = sparc_addr_diff_list; t ; t = XEXP (t, 1))
9668 sparc_output_addr_diff_vec (XEXP (t, 0));
9670 sparc_addr_list = sparc_addr_diff_list = NULL_RTX;
9673 /* Return 0 if the high 32 bits of X (the low word of X, if DImode) are
9674 unknown. Return 1 if the high bits are zero, -1 if the register is
9677 sparc_check_64 (rtx x, rtx insn)
9679 /* If a register is set only once it is safe to ignore insns this
9680 code does not know how to handle. The loop will either recognize
9681 the single set and return the correct value or fail to recognize
9686 gcc_assert (GET_CODE (x) == REG);
9688 if (GET_MODE (x) == DImode)
9689 y = gen_rtx_REG (SImode, REGNO (x) + WORDS_BIG_ENDIAN);
9691 if (flag_expensive_optimizations
9692 && df && DF_REG_DEF_COUNT (REGNO (y)) == 1)
9698 insn = get_last_insn_anywhere ();
9703 while ((insn = PREV_INSN (insn)))
9705 switch (GET_CODE (insn))
9718 rtx pat = PATTERN (insn);
9719 if (GET_CODE (pat) != SET)
9721 if (rtx_equal_p (x, SET_DEST (pat)))
9722 return set_extends (insn);
9723 if (y && rtx_equal_p (y, SET_DEST (pat)))
9724 return set_extends (insn);
9725 if (reg_overlap_mentioned_p (SET_DEST (pat), y))
9733 /* Output a wide shift instruction in V8+ mode. INSN is the instruction,
9734 OPERANDS are its operands and OPCODE is the mnemonic to be used. */
9737 output_v8plus_shift (rtx insn, rtx *operands, const char *opcode)
9739 static char asm_code[60];
9741 /* The scratch register is only required when the destination
9742 register is not a 64-bit global or out register. */
9743 if (which_alternative != 2)
9744 operands[3] = operands[0];
9746 /* We can only shift by constants <= 63. */
9747 if (GET_CODE (operands[2]) == CONST_INT)
9748 operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
9750 if (GET_CODE (operands[1]) == CONST_INT)
9752 output_asm_insn ("mov\t%1, %3", operands);
9756 output_asm_insn ("sllx\t%H1, 32, %3", operands);
9757 if (sparc_check_64 (operands[1], insn) <= 0)
9758 output_asm_insn ("srl\t%L1, 0, %L1", operands);
9759 output_asm_insn ("or\t%L1, %3, %3", operands);
9762 strcpy (asm_code, opcode);
9764 if (which_alternative != 2)
9765 return strcat (asm_code, "\t%0, %2, %L0\n\tsrlx\t%L0, 32, %H0");
9768 strcat (asm_code, "\t%3, %2, %3\n\tsrlx\t%3, 32, %H0\n\tmov\t%3, %L0");
9771 /* Output rtl to increment the profiler label LABELNO
9772 for profiling a function entry. */
9775 sparc_profile_hook (int labelno)
9780 fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_FUNCTION);
9781 if (NO_PROFILE_COUNTERS)
9783 emit_library_call (fun, LCT_NORMAL, VOIDmode, 0);
9787 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
9788 lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9789 emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lab, Pmode);
9793 #ifdef TARGET_SOLARIS
9794 /* Solaris implementation of TARGET_ASM_NAMED_SECTION. */
9797 sparc_solaris_elf_asm_named_section (const char *name, unsigned int flags,
9798 tree decl ATTRIBUTE_UNUSED)
9800 if (HAVE_COMDAT_GROUP && flags & SECTION_LINKONCE)
9802 solaris_elf_asm_comdat_section (name, flags, decl);
9806 fprintf (asm_out_file, "\t.section\t\"%s\"", name);
9808 if (!(flags & SECTION_DEBUG))
9809 fputs (",#alloc", asm_out_file);
9810 if (flags & SECTION_WRITE)
9811 fputs (",#write", asm_out_file);
9812 if (flags & SECTION_TLS)
9813 fputs (",#tls", asm_out_file);
9814 if (flags & SECTION_CODE)
9815 fputs (",#execinstr", asm_out_file);
9817 /* Sun as only supports #nobits/#progbits since Solaris 10. */
9818 if (HAVE_AS_SPARC_NOBITS)
9820 if (flags & SECTION_BSS)
9821 fputs (",#nobits", asm_out_file);
9823 fputs (",#progbits", asm_out_file);
9826 fputc ('\n', asm_out_file);
9828 #endif /* TARGET_SOLARIS */
9830 /* We do not allow indirect calls to be optimized into sibling calls.
9832 We cannot use sibling calls when delayed branches are disabled
9833 because they will likely require the call delay slot to be filled.
9835 Also, on SPARC 32-bit we cannot emit a sibling call when the
9836 current function returns a structure. This is because the "unimp
9837 after call" convention would cause the callee to return to the
9838 wrong place. The generic code already disallows cases where the
9839 function being called returns a structure.
9841 It may seem strange how this last case could occur. Usually there
9842 is code after the call which jumps to epilogue code which dumps the
9843 return value into the struct return area. That ought to invalidate
9844 the sibling call right? Well, in the C++ case we can end up passing
9845 the pointer to the struct return area to a constructor (which returns
9846 void) and then nothing else happens. Such a sibling call would look
9847 valid without the added check here.
9849 VxWorks PIC PLT entries require the global pointer to be initialized
9850 on entry. We therefore can't emit sibling calls to them. */
9852 sparc_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
9855 && flag_delayed_branch
9856 && (TARGET_ARCH64 || ! cfun->returns_struct)
9857 && !(TARGET_VXWORKS_RTP
9859 && !targetm.binds_local_p (decl)));
9862 /* libfunc renaming. */
9865 sparc_init_libfuncs (void)
9869 /* Use the subroutines that Sun's library provides for integer
9870 multiply and divide. The `*' prevents an underscore from
9871 being prepended by the compiler. .umul is a little faster
9873 set_optab_libfunc (smul_optab, SImode, "*.umul");
9874 set_optab_libfunc (sdiv_optab, SImode, "*.div");
9875 set_optab_libfunc (udiv_optab, SImode, "*.udiv");
9876 set_optab_libfunc (smod_optab, SImode, "*.rem");
9877 set_optab_libfunc (umod_optab, SImode, "*.urem");
9879 /* TFmode arithmetic. These names are part of the SPARC 32bit ABI. */
9880 set_optab_libfunc (add_optab, TFmode, "_Q_add");
9881 set_optab_libfunc (sub_optab, TFmode, "_Q_sub");
9882 set_optab_libfunc (neg_optab, TFmode, "_Q_neg");
9883 set_optab_libfunc (smul_optab, TFmode, "_Q_mul");
9884 set_optab_libfunc (sdiv_optab, TFmode, "_Q_div");
9886 /* We can define the TFmode sqrt optab only if TARGET_FPU. This
9887 is because with soft-float, the SFmode and DFmode sqrt
9888 instructions will be absent, and the compiler will notice and
9889 try to use the TFmode sqrt instruction for calls to the
9890 builtin function sqrt, but this fails. */
9892 set_optab_libfunc (sqrt_optab, TFmode, "_Q_sqrt");
9894 set_optab_libfunc (eq_optab, TFmode, "_Q_feq");
9895 set_optab_libfunc (ne_optab, TFmode, "_Q_fne");
9896 set_optab_libfunc (gt_optab, TFmode, "_Q_fgt");
9897 set_optab_libfunc (ge_optab, TFmode, "_Q_fge");
9898 set_optab_libfunc (lt_optab, TFmode, "_Q_flt");
9899 set_optab_libfunc (le_optab, TFmode, "_Q_fle");
9901 set_conv_libfunc (sext_optab, TFmode, SFmode, "_Q_stoq");
9902 set_conv_libfunc (sext_optab, TFmode, DFmode, "_Q_dtoq");
9903 set_conv_libfunc (trunc_optab, SFmode, TFmode, "_Q_qtos");
9904 set_conv_libfunc (trunc_optab, DFmode, TFmode, "_Q_qtod");
9906 set_conv_libfunc (sfix_optab, SImode, TFmode, "_Q_qtoi");
9907 set_conv_libfunc (ufix_optab, SImode, TFmode, "_Q_qtou");
9908 set_conv_libfunc (sfloat_optab, TFmode, SImode, "_Q_itoq");
9909 set_conv_libfunc (ufloat_optab, TFmode, SImode, "_Q_utoq");
9911 if (DITF_CONVERSION_LIBFUNCS)
9913 set_conv_libfunc (sfix_optab, DImode, TFmode, "_Q_qtoll");
9914 set_conv_libfunc (ufix_optab, DImode, TFmode, "_Q_qtoull");
9915 set_conv_libfunc (sfloat_optab, TFmode, DImode, "_Q_lltoq");
9916 set_conv_libfunc (ufloat_optab, TFmode, DImode, "_Q_ulltoq");
9919 if (SUN_CONVERSION_LIBFUNCS)
9921 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftoll");
9922 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoull");
9923 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtoll");
9924 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoull");
9929 /* In the SPARC 64bit ABI, SImode multiply and divide functions
9930 do not exist in the library. Make sure the compiler does not
9931 emit calls to them by accident. (It should always use the
9932 hardware instructions.) */
9933 set_optab_libfunc (smul_optab, SImode, 0);
9934 set_optab_libfunc (sdiv_optab, SImode, 0);
9935 set_optab_libfunc (udiv_optab, SImode, 0);
9936 set_optab_libfunc (smod_optab, SImode, 0);
9937 set_optab_libfunc (umod_optab, SImode, 0);
9939 if (SUN_INTEGER_MULTIPLY_64)
9941 set_optab_libfunc (smul_optab, DImode, "__mul64");
9942 set_optab_libfunc (sdiv_optab, DImode, "__div64");
9943 set_optab_libfunc (udiv_optab, DImode, "__udiv64");
9944 set_optab_libfunc (smod_optab, DImode, "__rem64");
9945 set_optab_libfunc (umod_optab, DImode, "__urem64");
9948 if (SUN_CONVERSION_LIBFUNCS)
9950 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftol");
9951 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoul");
9952 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtol");
9953 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoul");
9958 static tree def_builtin(const char *name, int code, tree type)
9960 return add_builtin_function(name, type, code, BUILT_IN_MD, NULL,
9964 static tree def_builtin_const(const char *name, int code, tree type)
9966 tree t = def_builtin(name, code, type);
9969 TREE_READONLY (t) = 1;
9974 /* Implement the TARGET_INIT_BUILTINS target hook.
9975 Create builtin functions for special SPARC instructions. */
9978 sparc_init_builtins (void)
9981 sparc_vis_init_builtins ();
9984 /* Create builtin functions for VIS 1.0 instructions. */
9987 sparc_vis_init_builtins (void)
9989 tree v4qi = build_vector_type (unsigned_intQI_type_node, 4);
9990 tree v8qi = build_vector_type (unsigned_intQI_type_node, 8);
9991 tree v4hi = build_vector_type (intHI_type_node, 4);
9992 tree v2hi = build_vector_type (intHI_type_node, 2);
9993 tree v2si = build_vector_type (intSI_type_node, 2);
9994 tree v1si = build_vector_type (intSI_type_node, 1);
9996 tree v4qi_ftype_v4hi = build_function_type_list (v4qi, v4hi, 0);
9997 tree v8qi_ftype_v2si_v8qi = build_function_type_list (v8qi, v2si, v8qi, 0);
9998 tree v2hi_ftype_v2si = build_function_type_list (v2hi, v2si, 0);
9999 tree v4hi_ftype_v4qi = build_function_type_list (v4hi, v4qi, 0);
10000 tree v8qi_ftype_v4qi_v4qi = build_function_type_list (v8qi, v4qi, v4qi, 0);
10001 tree v4hi_ftype_v4qi_v4hi = build_function_type_list (v4hi, v4qi, v4hi, 0);
10002 tree v4hi_ftype_v4qi_v2hi = build_function_type_list (v4hi, v4qi, v2hi, 0);
10003 tree v2si_ftype_v4qi_v2hi = build_function_type_list (v2si, v4qi, v2hi, 0);
10004 tree v4hi_ftype_v8qi_v4hi = build_function_type_list (v4hi, v8qi, v4hi, 0);
10005 tree v4hi_ftype_v4hi_v4hi = build_function_type_list (v4hi, v4hi, v4hi, 0);
10006 tree v2si_ftype_v2si_v2si = build_function_type_list (v2si, v2si, v2si, 0);
10007 tree v8qi_ftype_v8qi_v8qi = build_function_type_list (v8qi, v8qi, v8qi, 0);
10008 tree v2hi_ftype_v2hi_v2hi = build_function_type_list (v2hi, v2hi, v2hi, 0);
10009 tree v1si_ftype_v1si_v1si = build_function_type_list (v1si, v1si, v1si, 0);
10010 tree di_ftype_v8qi_v8qi_di = build_function_type_list (intDI_type_node,
10012 intDI_type_node, 0);
10013 tree di_ftype_v8qi_v8qi = build_function_type_list (intDI_type_node,
10015 tree si_ftype_v8qi_v8qi = build_function_type_list (intSI_type_node,
10017 tree di_ftype_di_di = build_function_type_list (intDI_type_node,
10019 intDI_type_node, 0);
10020 tree si_ftype_si_si = build_function_type_list (intSI_type_node,
10022 intSI_type_node, 0);
10023 tree ptr_ftype_ptr_si = build_function_type_list (ptr_type_node,
10025 intSI_type_node, 0);
10026 tree ptr_ftype_ptr_di = build_function_type_list (ptr_type_node,
10028 intDI_type_node, 0);
10029 tree si_ftype_ptr_ptr = build_function_type_list (intSI_type_node,
10032 tree di_ftype_ptr_ptr = build_function_type_list (intDI_type_node,
10035 tree si_ftype_v4hi_v4hi = build_function_type_list (intSI_type_node,
10037 tree si_ftype_v2si_v2si = build_function_type_list (intSI_type_node,
10039 tree di_ftype_v4hi_v4hi = build_function_type_list (intDI_type_node,
10041 tree di_ftype_v2si_v2si = build_function_type_list (intDI_type_node,
10043 tree void_ftype_di = build_function_type_list (void_type_node,
10044 intDI_type_node, 0);
10045 tree di_ftype_void = build_function_type_list (intDI_type_node,
10046 void_type_node, 0);
10047 tree void_ftype_si = build_function_type_list (void_type_node,
10048 intSI_type_node, 0);
10049 tree sf_ftype_sf_sf = build_function_type_list (float_type_node,
10051 float_type_node, 0);
10052 tree df_ftype_df_df = build_function_type_list (double_type_node,
10054 double_type_node, 0);
10056 /* Packing and expanding vectors. */
10057 def_builtin ("__builtin_vis_fpack16", CODE_FOR_fpack16_vis,
10059 def_builtin ("__builtin_vis_fpack32", CODE_FOR_fpack32_vis,
10060 v8qi_ftype_v2si_v8qi);
10061 def_builtin ("__builtin_vis_fpackfix", CODE_FOR_fpackfix_vis,
10063 def_builtin_const ("__builtin_vis_fexpand", CODE_FOR_fexpand_vis,
10065 def_builtin_const ("__builtin_vis_fpmerge", CODE_FOR_fpmerge_vis,
10066 v8qi_ftype_v4qi_v4qi);
10068 /* Multiplications. */
10069 def_builtin_const ("__builtin_vis_fmul8x16", CODE_FOR_fmul8x16_vis,
10070 v4hi_ftype_v4qi_v4hi);
10071 def_builtin_const ("__builtin_vis_fmul8x16au", CODE_FOR_fmul8x16au_vis,
10072 v4hi_ftype_v4qi_v2hi);
10073 def_builtin_const ("__builtin_vis_fmul8x16al", CODE_FOR_fmul8x16al_vis,
10074 v4hi_ftype_v4qi_v2hi);
10075 def_builtin_const ("__builtin_vis_fmul8sux16", CODE_FOR_fmul8sux16_vis,
10076 v4hi_ftype_v8qi_v4hi);
10077 def_builtin_const ("__builtin_vis_fmul8ulx16", CODE_FOR_fmul8ulx16_vis,
10078 v4hi_ftype_v8qi_v4hi);
10079 def_builtin_const ("__builtin_vis_fmuld8sux16", CODE_FOR_fmuld8sux16_vis,
10080 v2si_ftype_v4qi_v2hi);
10081 def_builtin_const ("__builtin_vis_fmuld8ulx16", CODE_FOR_fmuld8ulx16_vis,
10082 v2si_ftype_v4qi_v2hi);
10084 /* Data aligning. */
10085 def_builtin ("__builtin_vis_faligndatav4hi", CODE_FOR_faligndatav4hi_vis,
10086 v4hi_ftype_v4hi_v4hi);
10087 def_builtin ("__builtin_vis_faligndatav8qi", CODE_FOR_faligndatav8qi_vis,
10088 v8qi_ftype_v8qi_v8qi);
10089 def_builtin ("__builtin_vis_faligndatav2si", CODE_FOR_faligndatav2si_vis,
10090 v2si_ftype_v2si_v2si);
10091 def_builtin ("__builtin_vis_faligndatadi", CODE_FOR_faligndatav1di_vis,
10094 def_builtin ("__builtin_vis_write_gsr", CODE_FOR_wrgsr_vis,
10096 def_builtin ("__builtin_vis_read_gsr", CODE_FOR_rdgsr_vis,
10101 def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrdi_vis,
10103 def_builtin ("__builtin_vis_alignaddrl", CODE_FOR_alignaddrldi_vis,
10108 def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrsi_vis,
10110 def_builtin ("__builtin_vis_alignaddrl", CODE_FOR_alignaddrlsi_vis,
10114 /* Pixel distance. */
10115 def_builtin_const ("__builtin_vis_pdist", CODE_FOR_pdist_vis,
10116 di_ftype_v8qi_v8qi_di);
10118 /* Edge handling. */
10121 def_builtin_const ("__builtin_vis_edge8", CODE_FOR_edge8di_vis,
10123 def_builtin_const ("__builtin_vis_edge8l", CODE_FOR_edge8ldi_vis,
10125 def_builtin_const ("__builtin_vis_edge16", CODE_FOR_edge16di_vis,
10127 def_builtin_const ("__builtin_vis_edge16l", CODE_FOR_edge16ldi_vis,
10129 def_builtin_const ("__builtin_vis_edge32", CODE_FOR_edge32di_vis,
10131 def_builtin_const ("__builtin_vis_edge32l", CODE_FOR_edge32ldi_vis,
10135 def_builtin_const ("__builtin_vis_edge8n", CODE_FOR_edge8ndi_vis,
10137 def_builtin_const ("__builtin_vis_edge8ln", CODE_FOR_edge8lndi_vis,
10139 def_builtin_const ("__builtin_vis_edge16n", CODE_FOR_edge16ndi_vis,
10141 def_builtin_const ("__builtin_vis_edge16ln", CODE_FOR_edge16lndi_vis,
10143 def_builtin_const ("__builtin_vis_edge32n", CODE_FOR_edge32ndi_vis,
10145 def_builtin_const ("__builtin_vis_edge32ln", CODE_FOR_edge32lndi_vis,
10151 def_builtin_const ("__builtin_vis_edge8", CODE_FOR_edge8si_vis,
10153 def_builtin_const ("__builtin_vis_edge8l", CODE_FOR_edge8lsi_vis,
10155 def_builtin_const ("__builtin_vis_edge16", CODE_FOR_edge16si_vis,
10157 def_builtin_const ("__builtin_vis_edge16l", CODE_FOR_edge16lsi_vis,
10159 def_builtin_const ("__builtin_vis_edge32", CODE_FOR_edge32si_vis,
10161 def_builtin_const ("__builtin_vis_edge32l", CODE_FOR_edge32lsi_vis,
10165 def_builtin_const ("__builtin_vis_edge8n", CODE_FOR_edge8nsi_vis,
10167 def_builtin_const ("__builtin_vis_edge8ln", CODE_FOR_edge8lnsi_vis,
10169 def_builtin_const ("__builtin_vis_edge16n", CODE_FOR_edge16nsi_vis,
10171 def_builtin_const ("__builtin_vis_edge16ln", CODE_FOR_edge16lnsi_vis,
10173 def_builtin_const ("__builtin_vis_edge32n", CODE_FOR_edge32nsi_vis,
10175 def_builtin_const ("__builtin_vis_edge32ln", CODE_FOR_edge32lnsi_vis,
10180 /* Pixel compare. */
10183 def_builtin_const ("__builtin_vis_fcmple16", CODE_FOR_fcmple16di_vis,
10184 di_ftype_v4hi_v4hi);
10185 def_builtin_const ("__builtin_vis_fcmple32", CODE_FOR_fcmple32di_vis,
10186 di_ftype_v2si_v2si);
10187 def_builtin_const ("__builtin_vis_fcmpne16", CODE_FOR_fcmpne16di_vis,
10188 di_ftype_v4hi_v4hi);
10189 def_builtin_const ("__builtin_vis_fcmpne32", CODE_FOR_fcmpne32di_vis,
10190 di_ftype_v2si_v2si);
10191 def_builtin_const ("__builtin_vis_fcmpgt16", CODE_FOR_fcmpgt16di_vis,
10192 di_ftype_v4hi_v4hi);
10193 def_builtin_const ("__builtin_vis_fcmpgt32", CODE_FOR_fcmpgt32di_vis,
10194 di_ftype_v2si_v2si);
10195 def_builtin_const ("__builtin_vis_fcmpeq16", CODE_FOR_fcmpeq16di_vis,
10196 di_ftype_v4hi_v4hi);
10197 def_builtin_const ("__builtin_vis_fcmpeq32", CODE_FOR_fcmpeq32di_vis,
10198 di_ftype_v2si_v2si);
10202 def_builtin_const ("__builtin_vis_fcmple16", CODE_FOR_fcmple16si_vis,
10203 si_ftype_v4hi_v4hi);
10204 def_builtin_const ("__builtin_vis_fcmple32", CODE_FOR_fcmple32si_vis,
10205 si_ftype_v2si_v2si);
10206 def_builtin_const ("__builtin_vis_fcmpne16", CODE_FOR_fcmpne16si_vis,
10207 si_ftype_v4hi_v4hi);
10208 def_builtin_const ("__builtin_vis_fcmpne32", CODE_FOR_fcmpne32si_vis,
10209 si_ftype_v2si_v2si);
10210 def_builtin_const ("__builtin_vis_fcmpgt16", CODE_FOR_fcmpgt16si_vis,
10211 si_ftype_v4hi_v4hi);
10212 def_builtin_const ("__builtin_vis_fcmpgt32", CODE_FOR_fcmpgt32si_vis,
10213 si_ftype_v2si_v2si);
10214 def_builtin_const ("__builtin_vis_fcmpeq16", CODE_FOR_fcmpeq16si_vis,
10215 si_ftype_v4hi_v4hi);
10216 def_builtin_const ("__builtin_vis_fcmpeq32", CODE_FOR_fcmpeq32si_vis,
10217 si_ftype_v2si_v2si);
10220 /* Addition and subtraction. */
10221 def_builtin_const ("__builtin_vis_fpadd16", CODE_FOR_addv4hi3,
10222 v4hi_ftype_v4hi_v4hi);
10223 def_builtin_const ("__builtin_vis_fpadd16s", CODE_FOR_addv2hi3,
10224 v2hi_ftype_v2hi_v2hi);
10225 def_builtin_const ("__builtin_vis_fpadd32", CODE_FOR_addv2si3,
10226 v2si_ftype_v2si_v2si);
10227 def_builtin_const ("__builtin_vis_fpadd32s", CODE_FOR_addv1si3,
10228 v1si_ftype_v1si_v1si);
10229 def_builtin_const ("__builtin_vis_fpsub16", CODE_FOR_subv4hi3,
10230 v4hi_ftype_v4hi_v4hi);
10231 def_builtin_const ("__builtin_vis_fpsub16s", CODE_FOR_subv2hi3,
10232 v2hi_ftype_v2hi_v2hi);
10233 def_builtin_const ("__builtin_vis_fpsub32", CODE_FOR_subv2si3,
10234 v2si_ftype_v2si_v2si);
10235 def_builtin_const ("__builtin_vis_fpsub32s", CODE_FOR_subv1si3,
10236 v1si_ftype_v1si_v1si);
10238 /* Three-dimensional array addressing. */
10241 def_builtin_const ("__builtin_vis_array8", CODE_FOR_array8di_vis,
10243 def_builtin_const ("__builtin_vis_array16", CODE_FOR_array16di_vis,
10245 def_builtin_const ("__builtin_vis_array32", CODE_FOR_array32di_vis,
10250 def_builtin_const ("__builtin_vis_array8", CODE_FOR_array8si_vis,
10252 def_builtin_const ("__builtin_vis_array16", CODE_FOR_array16si_vis,
10254 def_builtin_const ("__builtin_vis_array32", CODE_FOR_array32si_vis,
10260 /* Byte mask and shuffle */
10262 def_builtin ("__builtin_vis_bmask", CODE_FOR_bmaskdi_vis,
10265 def_builtin ("__builtin_vis_bmask", CODE_FOR_bmasksi_vis,
10267 def_builtin ("__builtin_vis_bshufflev4hi", CODE_FOR_bshufflev4hi_vis,
10268 v4hi_ftype_v4hi_v4hi);
10269 def_builtin ("__builtin_vis_bshufflev8qi", CODE_FOR_bshufflev8qi_vis,
10270 v8qi_ftype_v8qi_v8qi);
10271 def_builtin ("__builtin_vis_bshufflev2si", CODE_FOR_bshufflev2si_vis,
10272 v2si_ftype_v2si_v2si);
10273 def_builtin ("__builtin_vis_bshuffledi", CODE_FOR_bshufflev1di_vis,
10281 def_builtin ("__builtin_vis_cmask8", CODE_FOR_cmask8di_vis,
10283 def_builtin ("__builtin_vis_cmask16", CODE_FOR_cmask16di_vis,
10285 def_builtin ("__builtin_vis_cmask32", CODE_FOR_cmask32di_vis,
10290 def_builtin ("__builtin_vis_cmask8", CODE_FOR_cmask8si_vis,
10292 def_builtin ("__builtin_vis_cmask16", CODE_FOR_cmask16si_vis,
10294 def_builtin ("__builtin_vis_cmask32", CODE_FOR_cmask32si_vis,
10298 def_builtin_const ("__builtin_vis_fchksm16", CODE_FOR_fchksm16_vis,
10299 v4hi_ftype_v4hi_v4hi);
10301 def_builtin_const ("__builtin_vis_fsll16", CODE_FOR_vashlv4hi3,
10302 v4hi_ftype_v4hi_v4hi);
10303 def_builtin_const ("__builtin_vis_fslas16", CODE_FOR_vssashlv4hi3,
10304 v4hi_ftype_v4hi_v4hi);
10305 def_builtin_const ("__builtin_vis_fsrl16", CODE_FOR_vlshrv4hi3,
10306 v4hi_ftype_v4hi_v4hi);
10307 def_builtin_const ("__builtin_vis_fsra16", CODE_FOR_vashrv4hi3,
10308 v4hi_ftype_v4hi_v4hi);
10309 def_builtin_const ("__builtin_vis_fsll32", CODE_FOR_vashlv2si3,
10310 v2si_ftype_v2si_v2si);
10311 def_builtin_const ("__builtin_vis_fslas32", CODE_FOR_vssashlv2si3,
10312 v2si_ftype_v2si_v2si);
10313 def_builtin_const ("__builtin_vis_fsrl32", CODE_FOR_vlshrv2si3,
10314 v2si_ftype_v2si_v2si);
10315 def_builtin_const ("__builtin_vis_fsra32", CODE_FOR_vashrv2si3,
10316 v2si_ftype_v2si_v2si);
10319 def_builtin_const ("__builtin_vis_pdistn", CODE_FOR_pdistndi_vis,
10320 di_ftype_v8qi_v8qi);
10322 def_builtin_const ("__builtin_vis_pdistn", CODE_FOR_pdistnsi_vis,
10323 si_ftype_v8qi_v8qi);
10325 def_builtin_const ("__builtin_vis_fmean16", CODE_FOR_fmean16_vis,
10326 v4hi_ftype_v4hi_v4hi);
10327 def_builtin_const ("__builtin_vis_fpadd64", CODE_FOR_fpadd64_vis,
10329 def_builtin_const ("__builtin_vis_fpsub64", CODE_FOR_fpsub64_vis,
10332 def_builtin_const ("__builtin_vis_fpadds16", CODE_FOR_ssaddv4hi3,
10333 v4hi_ftype_v4hi_v4hi);
10334 def_builtin_const ("__builtin_vis_fpadds16s", CODE_FOR_ssaddv2hi3,
10335 v2hi_ftype_v2hi_v2hi);
10336 def_builtin_const ("__builtin_vis_fpsubs16", CODE_FOR_sssubv4hi3,
10337 v4hi_ftype_v4hi_v4hi);
10338 def_builtin_const ("__builtin_vis_fpsubs16s", CODE_FOR_sssubv2hi3,
10339 v2hi_ftype_v2hi_v2hi);
10340 def_builtin_const ("__builtin_vis_fpadds32", CODE_FOR_ssaddv2si3,
10341 v2si_ftype_v2si_v2si);
10342 def_builtin_const ("__builtin_vis_fpadds32s", CODE_FOR_ssaddv1si3,
10343 v1si_ftype_v1si_v1si);
10344 def_builtin_const ("__builtin_vis_fpsubs32", CODE_FOR_sssubv2si3,
10345 v2si_ftype_v2si_v2si);
10346 def_builtin_const ("__builtin_vis_fpsubs32s", CODE_FOR_sssubv1si3,
10347 v1si_ftype_v1si_v1si);
10351 def_builtin_const ("__builtin_vis_fucmple8", CODE_FOR_fucmple8di_vis,
10352 di_ftype_v8qi_v8qi);
10353 def_builtin_const ("__builtin_vis_fucmpne8", CODE_FOR_fucmpne8di_vis,
10354 di_ftype_v8qi_v8qi);
10355 def_builtin_const ("__builtin_vis_fucmpgt8", CODE_FOR_fucmpgt8di_vis,
10356 di_ftype_v8qi_v8qi);
10357 def_builtin_const ("__builtin_vis_fucmpeq8", CODE_FOR_fucmpeq8di_vis,
10358 di_ftype_v8qi_v8qi);
10362 def_builtin_const ("__builtin_vis_fucmple8", CODE_FOR_fucmple8si_vis,
10363 si_ftype_v8qi_v8qi);
10364 def_builtin_const ("__builtin_vis_fucmpne8", CODE_FOR_fucmpne8si_vis,
10365 si_ftype_v8qi_v8qi);
10366 def_builtin_const ("__builtin_vis_fucmpgt8", CODE_FOR_fucmpgt8si_vis,
10367 si_ftype_v8qi_v8qi);
10368 def_builtin_const ("__builtin_vis_fucmpeq8", CODE_FOR_fucmpeq8si_vis,
10369 si_ftype_v8qi_v8qi);
10372 def_builtin_const ("__builtin_vis_fhadds", CODE_FOR_fhaddsf_vis,
10374 def_builtin_const ("__builtin_vis_fhaddd", CODE_FOR_fhadddf_vis,
10376 def_builtin_const ("__builtin_vis_fhsubs", CODE_FOR_fhsubsf_vis,
10378 def_builtin_const ("__builtin_vis_fhsubd", CODE_FOR_fhsubdf_vis,
10380 def_builtin_const ("__builtin_vis_fnhadds", CODE_FOR_fnhaddsf_vis,
10382 def_builtin_const ("__builtin_vis_fnhaddd", CODE_FOR_fnhadddf_vis,
10385 def_builtin_const ("__builtin_vis_umulxhi", CODE_FOR_umulxhi_vis,
10387 def_builtin_const ("__builtin_vis_xmulx", CODE_FOR_xmulx_vis,
10389 def_builtin_const ("__builtin_vis_xmulxhi", CODE_FOR_xmulxhi_vis,
10394 /* Handle TARGET_EXPAND_BUILTIN target hook.
10395 Expand builtin functions for sparc intrinsics. */
10398 sparc_expand_builtin (tree exp, rtx target,
10399 rtx subtarget ATTRIBUTE_UNUSED,
10400 enum machine_mode tmode ATTRIBUTE_UNUSED,
10401 int ignore ATTRIBUTE_UNUSED)
10404 call_expr_arg_iterator iter;
10405 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10406 unsigned int icode = DECL_FUNCTION_CODE (fndecl);
10411 nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
10415 enum machine_mode tmode = insn_data[icode].operand[0].mode;
10417 || GET_MODE (target) != tmode
10418 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10419 op[0] = gen_reg_rtx (tmode);
10423 FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
10425 const struct insn_operand_data *insn_op;
10428 if (arg == error_mark_node)
10432 idx = arg_count - !nonvoid;
10433 insn_op = &insn_data[icode].operand[idx];
10434 op[arg_count] = expand_normal (arg);
10436 if (insn_op->mode == V1DImode
10437 && GET_MODE (op[arg_count]) == DImode)
10438 op[arg_count] = gen_lowpart (V1DImode, op[arg_count]);
10439 else if (insn_op->mode == V1SImode
10440 && GET_MODE (op[arg_count]) == SImode)
10441 op[arg_count] = gen_lowpart (V1SImode, op[arg_count]);
10443 if (! (*insn_data[icode].operand[idx].predicate) (op[arg_count],
10445 op[arg_count] = copy_to_mode_reg (insn_op->mode, op[arg_count]);
10451 pat = GEN_FCN (icode) (op[0]);
10455 pat = GEN_FCN (icode) (op[0], op[1]);
10457 pat = GEN_FCN (icode) (op[1]);
10460 pat = GEN_FCN (icode) (op[0], op[1], op[2]);
10463 pat = GEN_FCN (icode) (op[0], op[1], op[2], op[3]);
10466 gcc_unreachable ();
10481 sparc_vis_mul8x16 (int e8, int e16)
10483 return (e8 * e16 + 128) / 256;
10486 /* Multiply the VECTOR_CSTs CST0 and CST1 as specified by FNCODE and put
10487 the result into the array N_ELTS, whose elements are of INNER_TYPE. */
10490 sparc_handle_vis_mul8x16 (tree *n_elts, int fncode, tree inner_type,
10491 tree cst0, tree cst1)
10493 unsigned i, num = VECTOR_CST_NELTS (cst0);
10498 case CODE_FOR_fmul8x16_vis:
10499 for (i = 0; i < num; ++i)
10502 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (VECTOR_CST_ELT (cst0, i)),
10503 TREE_INT_CST_LOW (VECTOR_CST_ELT (cst1, i)));
10504 n_elts[i] = build_int_cst (inner_type, val);
10508 case CODE_FOR_fmul8x16au_vis:
10509 scale = TREE_INT_CST_LOW (VECTOR_CST_ELT (cst1, 0));
10511 for (i = 0; i < num; ++i)
10514 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (VECTOR_CST_ELT (cst0, i)),
10516 n_elts[i] = build_int_cst (inner_type, val);
10520 case CODE_FOR_fmul8x16al_vis:
10521 scale = TREE_INT_CST_LOW (VECTOR_CST_ELT (cst1, 1));
10523 for (i = 0; i < num; ++i)
10526 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (VECTOR_CST_ELT (cst0, i)),
10528 n_elts[i] = build_int_cst (inner_type, val);
10533 gcc_unreachable ();
10537 /* Handle TARGET_FOLD_BUILTIN target hook.
10538 Fold builtin functions for SPARC intrinsics. If IGNORE is true the
10539 result of the function call is ignored. NULL_TREE is returned if the
10540 function could not be folded. */
10543 sparc_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
10544 tree *args, bool ignore)
10546 tree arg0, arg1, arg2;
10547 tree rtype = TREE_TYPE (TREE_TYPE (fndecl));
10548 enum insn_code icode = (enum insn_code) DECL_FUNCTION_CODE (fndecl);
10552 /* Note that a switch statement instead of the sequence of tests would
10553 be incorrect as many of the CODE_FOR values could be CODE_FOR_nothing
10554 and that would yield multiple alternatives with identical values. */
10555 if (icode == CODE_FOR_alignaddrsi_vis
10556 || icode == CODE_FOR_alignaddrdi_vis
10557 || icode == CODE_FOR_wrgsr_vis
10558 || icode == CODE_FOR_bmasksi_vis
10559 || icode == CODE_FOR_bmaskdi_vis
10560 || icode == CODE_FOR_cmask8si_vis
10561 || icode == CODE_FOR_cmask8di_vis
10562 || icode == CODE_FOR_cmask16si_vis
10563 || icode == CODE_FOR_cmask16di_vis
10564 || icode == CODE_FOR_cmask32si_vis
10565 || icode == CODE_FOR_cmask32di_vis)
10568 return build_zero_cst (rtype);
10573 case CODE_FOR_fexpand_vis:
10577 if (TREE_CODE (arg0) == VECTOR_CST)
10579 tree inner_type = TREE_TYPE (rtype);
10583 n_elts = XALLOCAVEC (tree, VECTOR_CST_NELTS (arg0));
10584 for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
10585 n_elts[i] = build_int_cst (inner_type,
10587 (VECTOR_CST_ELT (arg0, i)) << 4);
10588 return build_vector (rtype, n_elts);
10592 case CODE_FOR_fmul8x16_vis:
10593 case CODE_FOR_fmul8x16au_vis:
10594 case CODE_FOR_fmul8x16al_vis:
10600 if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
10602 tree inner_type = TREE_TYPE (rtype);
10603 tree *n_elts = XALLOCAVEC (tree, VECTOR_CST_NELTS (arg0));
10604 sparc_handle_vis_mul8x16 (n_elts, icode, inner_type, arg0, arg1);
10605 return build_vector (rtype, n_elts);
10609 case CODE_FOR_fpmerge_vis:
10615 if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
10617 tree *n_elts = XALLOCAVEC (tree, 2 * VECTOR_CST_NELTS (arg0));
10619 for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
10621 n_elts[2*i] = VECTOR_CST_ELT (arg0, i);
10622 n_elts[2*i+1] = VECTOR_CST_ELT (arg1, i);
10625 return build_vector (rtype, n_elts);
10629 case CODE_FOR_pdist_vis:
10637 if (TREE_CODE (arg0) == VECTOR_CST
10638 && TREE_CODE (arg1) == VECTOR_CST
10639 && TREE_CODE (arg2) == INTEGER_CST)
10641 bool overflow = false;
10642 double_int result = TREE_INT_CST (arg2);
10646 for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
10648 double_int e0 = TREE_INT_CST (VECTOR_CST_ELT (arg0, i));
10649 double_int e1 = TREE_INT_CST (VECTOR_CST_ELT (arg1, i));
10651 bool neg1_ovf, neg2_ovf, add1_ovf, add2_ovf;
10653 tmp = e1.neg_with_overflow (&neg1_ovf);
10654 tmp = e0.add_with_sign (tmp, false, &add1_ovf);
10655 if (tmp.is_negative ())
10656 tmp = tmp.neg_with_overflow (&neg2_ovf);
10658 result = result.add_with_sign (tmp, false, &add2_ovf);
10659 overflow |= neg1_ovf | neg2_ovf | add1_ovf | add2_ovf;
10662 gcc_assert (!overflow);
10664 return build_int_cst_wide (rtype, result.low, result.high);
10674 /* ??? This duplicates information provided to the compiler by the
10675 ??? scheduler description. Some day, teach genautomata to output
10676 ??? the latencies and then CSE will just use that. */
10679 sparc_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
10680 int *total, bool speed ATTRIBUTE_UNUSED)
10682 enum machine_mode mode = GET_MODE (x);
10683 bool float_mode_p = FLOAT_MODE_P (mode);
10688 if (INTVAL (x) < 0x1000 && INTVAL (x) >= -0x1000)
10706 if (GET_MODE (x) == VOIDmode
10707 && ((CONST_DOUBLE_HIGH (x) == 0
10708 && CONST_DOUBLE_LOW (x) < 0x1000)
10709 || (CONST_DOUBLE_HIGH (x) == -1
10710 && CONST_DOUBLE_LOW (x) < 0
10711 && CONST_DOUBLE_LOW (x) >= -0x1000)))
10718 /* If outer-code was a sign or zero extension, a cost
10719 of COSTS_N_INSNS (1) was already added in. This is
10720 why we are subtracting it back out. */
10721 if (outer_code == ZERO_EXTEND)
10723 *total = sparc_costs->int_zload - COSTS_N_INSNS (1);
10725 else if (outer_code == SIGN_EXTEND)
10727 *total = sparc_costs->int_sload - COSTS_N_INSNS (1);
10729 else if (float_mode_p)
10731 *total = sparc_costs->float_load;
10735 *total = sparc_costs->int_load;
10743 *total = sparc_costs->float_plusminus;
10745 *total = COSTS_N_INSNS (1);
10752 gcc_assert (float_mode_p);
10753 *total = sparc_costs->float_mul;
10756 if (GET_CODE (sub) == NEG)
10757 sub = XEXP (sub, 0);
10758 *total += rtx_cost (sub, FMA, 0, speed);
10761 if (GET_CODE (sub) == NEG)
10762 sub = XEXP (sub, 0);
10763 *total += rtx_cost (sub, FMA, 2, speed);
10769 *total = sparc_costs->float_mul;
10770 else if (! TARGET_HARD_MUL)
10771 *total = COSTS_N_INSNS (25);
10777 if (sparc_costs->int_mul_bit_factor)
10781 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
10783 unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
10784 for (nbits = 0; value != 0; value &= value - 1)
10787 else if (GET_CODE (XEXP (x, 1)) == CONST_DOUBLE
10788 && GET_MODE (XEXP (x, 1)) == VOIDmode)
10790 rtx x1 = XEXP (x, 1);
10791 unsigned HOST_WIDE_INT value1 = CONST_DOUBLE_LOW (x1);
10792 unsigned HOST_WIDE_INT value2 = CONST_DOUBLE_HIGH (x1);
10794 for (nbits = 0; value1 != 0; value1 &= value1 - 1)
10796 for (; value2 != 0; value2 &= value2 - 1)
10804 bit_cost = (nbits - 3) / sparc_costs->int_mul_bit_factor;
10805 bit_cost = COSTS_N_INSNS (bit_cost);
10808 if (mode == DImode)
10809 *total = sparc_costs->int_mulX + bit_cost;
10811 *total = sparc_costs->int_mul + bit_cost;
10818 *total = COSTS_N_INSNS (1) + sparc_costs->shift_penalty;
10827 if (mode == DFmode)
10828 *total = sparc_costs->float_div_df;
10830 *total = sparc_costs->float_div_sf;
10834 if (mode == DImode)
10835 *total = sparc_costs->int_divX;
10837 *total = sparc_costs->int_div;
10842 if (! float_mode_p)
10844 *total = COSTS_N_INSNS (1);
10851 case UNSIGNED_FLOAT:
10855 case FLOAT_TRUNCATE:
10856 *total = sparc_costs->float_move;
10860 if (mode == DFmode)
10861 *total = sparc_costs->float_sqrt_df;
10863 *total = sparc_costs->float_sqrt_sf;
10868 *total = sparc_costs->float_cmp;
10870 *total = COSTS_N_INSNS (1);
10875 *total = sparc_costs->float_cmove;
10877 *total = sparc_costs->int_cmove;
10881 /* Handle the NAND vector patterns. */
10882 if (sparc_vector_mode_supported_p (GET_MODE (x))
10883 && GET_CODE (XEXP (x, 0)) == NOT
10884 && GET_CODE (XEXP (x, 1)) == NOT)
10886 *total = COSTS_N_INSNS (1);
10897 /* Return true if CLASS is either GENERAL_REGS or I64_REGS. */
10900 general_or_i64_p (reg_class_t rclass)
10902 return (rclass == GENERAL_REGS || rclass == I64_REGS);
10905 /* Implement TARGET_REGISTER_MOVE_COST. */
10908 sparc_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
10909 reg_class_t from, reg_class_t to)
10911 bool need_memory = false;
10913 if (from == FPCC_REGS || to == FPCC_REGS)
10914 need_memory = true;
10915 else if ((FP_REG_CLASS_P (from) && general_or_i64_p (to))
10916 || (general_or_i64_p (from) && FP_REG_CLASS_P (to)))
10920 int size = GET_MODE_SIZE (mode);
10921 if (size == 8 || size == 4)
10923 if (! TARGET_ARCH32 || size == 4)
10929 need_memory = true;
10934 if (sparc_cpu == PROCESSOR_ULTRASPARC
10935 || sparc_cpu == PROCESSOR_ULTRASPARC3
10936 || sparc_cpu == PROCESSOR_NIAGARA
10937 || sparc_cpu == PROCESSOR_NIAGARA2
10938 || sparc_cpu == PROCESSOR_NIAGARA3
10939 || sparc_cpu == PROCESSOR_NIAGARA4)
10948 /* Emit the sequence of insns SEQ while preserving the registers REG and REG2.
10949 This is achieved by means of a manual dynamic stack space allocation in
10950 the current frame. We make the assumption that SEQ doesn't contain any
10951 function calls, with the possible exception of calls to the GOT helper. */
10954 emit_and_preserve (rtx seq, rtx reg, rtx reg2)
10956 /* We must preserve the lowest 16 words for the register save area. */
10957 HOST_WIDE_INT offset = 16*UNITS_PER_WORD;
10958 /* We really need only 2 words of fresh stack space. */
10959 HOST_WIDE_INT size = SPARC_STACK_ALIGN (offset + 2*UNITS_PER_WORD);
10962 = gen_rtx_MEM (word_mode, plus_constant (Pmode, stack_pointer_rtx,
10963 SPARC_STACK_BIAS + offset));
10965 emit_insn (gen_stack_pointer_inc (GEN_INT (-size)));
10966 emit_insn (gen_rtx_SET (VOIDmode, slot, reg));
10968 emit_insn (gen_rtx_SET (VOIDmode,
10969 adjust_address (slot, word_mode, UNITS_PER_WORD),
10973 emit_insn (gen_rtx_SET (VOIDmode,
10975 adjust_address (slot, word_mode, UNITS_PER_WORD)));
10976 emit_insn (gen_rtx_SET (VOIDmode, reg, slot));
10977 emit_insn (gen_stack_pointer_inc (GEN_INT (size)));
10980 /* Output the assembler code for a thunk function. THUNK_DECL is the
10981 declaration for the thunk function itself, FUNCTION is the decl for
10982 the target function. DELTA is an immediate constant offset to be
10983 added to THIS. If VCALL_OFFSET is nonzero, the word at address
10984 (*THIS + VCALL_OFFSET) should be additionally added to THIS. */
10987 sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
10988 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
10991 rtx this_rtx, insn, funexp;
10992 unsigned int int_arg_first;
10994 reload_completed = 1;
10995 epilogue_completed = 1;
10997 emit_note (NOTE_INSN_PROLOGUE_END);
11001 sparc_leaf_function_p = 1;
11003 int_arg_first = SPARC_OUTGOING_INT_ARG_FIRST;
11005 else if (flag_delayed_branch)
11007 /* We will emit a regular sibcall below, so we need to instruct
11008 output_sibcall that we are in a leaf function. */
11009 sparc_leaf_function_p = crtl->uses_only_leaf_regs = 1;
11011 /* This will cause final.c to invoke leaf_renumber_regs so we
11012 must behave as if we were in a not-yet-leafified function. */
11013 int_arg_first = SPARC_INCOMING_INT_ARG_FIRST;
11017 /* We will emit the sibcall manually below, so we will need to
11018 manually spill non-leaf registers. */
11019 sparc_leaf_function_p = crtl->uses_only_leaf_regs = 0;
11021 /* We really are in a leaf function. */
11022 int_arg_first = SPARC_OUTGOING_INT_ARG_FIRST;
11025 /* Find the "this" pointer. Normally in %o0, but in ARCH64 if the function
11026 returns a structure, the structure return pointer is there instead. */
11028 && aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
11029 this_rtx = gen_rtx_REG (Pmode, int_arg_first + 1);
11031 this_rtx = gen_rtx_REG (Pmode, int_arg_first);
11033 /* Add DELTA. When possible use a plain add, otherwise load it into
11034 a register first. */
11037 rtx delta_rtx = GEN_INT (delta);
11039 if (! SPARC_SIMM13_P (delta))
11041 rtx scratch = gen_rtx_REG (Pmode, 1);
11042 emit_move_insn (scratch, delta_rtx);
11043 delta_rtx = scratch;
11046 /* THIS_RTX += DELTA. */
11047 emit_insn (gen_add2_insn (this_rtx, delta_rtx));
11050 /* Add the word at address (*THIS_RTX + VCALL_OFFSET). */
11053 rtx vcall_offset_rtx = GEN_INT (vcall_offset);
11054 rtx scratch = gen_rtx_REG (Pmode, 1);
11056 gcc_assert (vcall_offset < 0);
11058 /* SCRATCH = *THIS_RTX. */
11059 emit_move_insn (scratch, gen_rtx_MEM (Pmode, this_rtx));
11061 /* Prepare for adding VCALL_OFFSET. The difficulty is that we
11062 may not have any available scratch register at this point. */
11063 if (SPARC_SIMM13_P (vcall_offset))
11065 /* This is the case if ARCH64 (unless -ffixed-g5 is passed). */
11066 else if (! fixed_regs[5]
11067 /* The below sequence is made up of at least 2 insns,
11068 while the default method may need only one. */
11069 && vcall_offset < -8192)
11071 rtx scratch2 = gen_rtx_REG (Pmode, 5);
11072 emit_move_insn (scratch2, vcall_offset_rtx);
11073 vcall_offset_rtx = scratch2;
11077 rtx increment = GEN_INT (-4096);
11079 /* VCALL_OFFSET is a negative number whose typical range can be
11080 estimated as -32768..0 in 32-bit mode. In almost all cases
11081 it is therefore cheaper to emit multiple add insns than
11082 spilling and loading the constant into a register (at least
11084 while (! SPARC_SIMM13_P (vcall_offset))
11086 emit_insn (gen_add2_insn (scratch, increment));
11087 vcall_offset += 4096;
11089 vcall_offset_rtx = GEN_INT (vcall_offset); /* cannot be 0 */
11092 /* SCRATCH = *(*THIS_RTX + VCALL_OFFSET). */
11093 emit_move_insn (scratch, gen_rtx_MEM (Pmode,
11094 gen_rtx_PLUS (Pmode,
11096 vcall_offset_rtx)));
11098 /* THIS_RTX += *(*THIS_RTX + VCALL_OFFSET). */
11099 emit_insn (gen_add2_insn (this_rtx, scratch));
11102 /* Generate a tail call to the target function. */
11103 if (! TREE_USED (function))
11105 assemble_external (function);
11106 TREE_USED (function) = 1;
11108 funexp = XEXP (DECL_RTL (function), 0);
11110 if (flag_delayed_branch)
11112 funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
11113 insn = emit_call_insn (gen_sibcall (funexp));
11114 SIBLING_CALL_P (insn) = 1;
11118 /* The hoops we have to jump through in order to generate a sibcall
11119 without using delay slots... */
11120 rtx spill_reg, seq, scratch = gen_rtx_REG (Pmode, 1);
11124 spill_reg = gen_rtx_REG (word_mode, 15); /* %o7 */
11126 load_got_register (); /* clobbers %o7 */
11127 scratch = sparc_legitimize_pic_address (funexp, scratch);
11128 seq = get_insns ();
11130 emit_and_preserve (seq, spill_reg, pic_offset_table_rtx);
11132 else if (TARGET_ARCH32)
11134 emit_insn (gen_rtx_SET (VOIDmode,
11136 gen_rtx_HIGH (SImode, funexp)));
11137 emit_insn (gen_rtx_SET (VOIDmode,
11139 gen_rtx_LO_SUM (SImode, scratch, funexp)));
11141 else /* TARGET_ARCH64 */
11143 switch (sparc_cmodel)
11147 /* The destination can serve as a temporary. */
11148 sparc_emit_set_symbolic_const64 (scratch, funexp, scratch);
11153 /* The destination cannot serve as a temporary. */
11154 spill_reg = gen_rtx_REG (DImode, 15); /* %o7 */
11156 sparc_emit_set_symbolic_const64 (scratch, funexp, spill_reg);
11157 seq = get_insns ();
11159 emit_and_preserve (seq, spill_reg, 0);
11163 gcc_unreachable ();
11167 emit_jump_insn (gen_indirect_jump (scratch));
11172 /* Run just enough of rest_of_compilation to get the insns emitted.
11173 There's not really enough bulk here to make other passes such as
11174 instruction scheduling worth while. Note that use_thunk calls
11175 assemble_start_function and assemble_end_function. */
11176 insn = get_insns ();
11177 shorten_branches (insn);
11178 final_start_function (insn, file, 1);
11179 final (insn, file, 1);
11180 final_end_function ();
11182 reload_completed = 0;
11183 epilogue_completed = 0;
11186 /* Return true if sparc_output_mi_thunk would be able to output the
11187 assembler code for the thunk function specified by the arguments
11188 it is passed, and false otherwise. */
11190 sparc_can_output_mi_thunk (const_tree thunk_fndecl ATTRIBUTE_UNUSED,
11191 HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
11192 HOST_WIDE_INT vcall_offset,
11193 const_tree function ATTRIBUTE_UNUSED)
11195 /* Bound the loop used in the default method above. */
11196 return (vcall_offset >= -32768 || ! fixed_regs[5]);
11199 /* How to allocate a 'struct machine_function'. */
11201 static struct machine_function *
11202 sparc_init_machine_status (void)
11204 return ggc_alloc_cleared_machine_function ();
11207 /* Locate some local-dynamic symbol still in use by this function
11208 so that we can print its name in local-dynamic base patterns. */
11210 static const char *
11211 get_some_local_dynamic_name (void)
11215 if (cfun->machine->some_ld_name)
11216 return cfun->machine->some_ld_name;
11218 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
11220 && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
11221 return cfun->machine->some_ld_name;
11223 gcc_unreachable ();
11227 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
11232 && GET_CODE (x) == SYMBOL_REF
11233 && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
11235 cfun->machine->some_ld_name = XSTR (x, 0);
11242 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
11243 We need to emit DTP-relative relocations. */
11246 sparc_output_dwarf_dtprel (FILE *file, int size, rtx x)
11251 fputs ("\t.word\t%r_tls_dtpoff32(", file);
11254 fputs ("\t.xword\t%r_tls_dtpoff64(", file);
11257 gcc_unreachable ();
11259 output_addr_const (file, x);
11263 /* Do whatever processing is required at the end of a file. */
11266 sparc_file_end (void)
11268 /* If we need to emit the special GOT helper function, do so now. */
11269 if (got_helper_rtx)
11271 const char *name = XSTR (got_helper_rtx, 0);
11272 const char *reg_name = reg_names[GLOBAL_OFFSET_TABLE_REGNUM];
11273 #ifdef DWARF2_UNWIND_INFO
11277 if (USE_HIDDEN_LINKONCE)
11279 tree decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
11280 get_identifier (name),
11281 build_function_type_list (void_type_node,
11283 DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
11284 NULL_TREE, void_type_node);
11285 TREE_PUBLIC (decl) = 1;
11286 TREE_STATIC (decl) = 1;
11287 make_decl_one_only (decl, DECL_ASSEMBLER_NAME (decl));
11288 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
11289 DECL_VISIBILITY_SPECIFIED (decl) = 1;
11290 resolve_unique_section (decl, 0, flag_function_sections);
11291 allocate_struct_function (decl, true);
11292 cfun->is_thunk = 1;
11293 current_function_decl = decl;
11294 init_varasm_status ();
11295 assemble_start_function (decl, name);
11299 const int align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
11300 switch_to_section (text_section);
11302 ASM_OUTPUT_ALIGN (asm_out_file, align);
11303 ASM_OUTPUT_LABEL (asm_out_file, name);
11306 #ifdef DWARF2_UNWIND_INFO
11307 do_cfi = dwarf2out_do_cfi_asm ();
11309 fprintf (asm_out_file, "\t.cfi_startproc\n");
11311 if (flag_delayed_branch)
11312 fprintf (asm_out_file, "\tjmp\t%%o7+8\n\t add\t%%o7, %s, %s\n",
11313 reg_name, reg_name);
11315 fprintf (asm_out_file, "\tadd\t%%o7, %s, %s\n\tjmp\t%%o7+8\n\t nop\n",
11316 reg_name, reg_name);
11317 #ifdef DWARF2_UNWIND_INFO
11319 fprintf (asm_out_file, "\t.cfi_endproc\n");
11323 if (NEED_INDICATE_EXEC_STACK)
11324 file_end_indicate_exec_stack ();
11326 #ifdef TARGET_SOLARIS
11327 solaris_file_end ();
11331 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
11332 /* Implement TARGET_MANGLE_TYPE. */
11334 static const char *
11335 sparc_mangle_type (const_tree type)
11338 && TYPE_MAIN_VARIANT (type) == long_double_type_node
11339 && TARGET_LONG_DOUBLE_128)
11342 /* For all other types, use normal C++ mangling. */
11347 /* Expand a membar instruction for various use cases. Both the LOAD_STORE
11348 and BEFORE_AFTER arguments of the form X_Y. They are two-bit masks where
11349 bit 0 indicates that X is true, and bit 1 indicates Y is true. */
11352 sparc_emit_membar_for_model (enum memmodel model,
11353 int load_store, int before_after)
11355 /* Bits for the MEMBAR mmask field. */
11356 const int LoadLoad = 1;
11357 const int StoreLoad = 2;
11358 const int LoadStore = 4;
11359 const int StoreStore = 8;
11361 int mm = 0, implied = 0;
11363 switch (sparc_memory_model)
11366 /* Sequential Consistency. All memory transactions are immediately
11367 visible in sequential execution order. No barriers needed. */
11368 implied = LoadLoad | StoreLoad | LoadStore | StoreStore;
11372 /* Total Store Ordering: all memory transactions with store semantics
11373 are followed by an implied StoreStore. */
11374 implied |= StoreStore;
11376 /* If we're not looking for a raw barrer (before+after), then atomic
11377 operations get the benefit of being both load and store. */
11378 if (load_store == 3 && before_after == 1)
11379 implied |= StoreLoad;
11383 /* Partial Store Ordering: all memory transactions with load semantics
11384 are followed by an implied LoadLoad | LoadStore. */
11385 implied |= LoadLoad | LoadStore;
11387 /* If we're not looking for a raw barrer (before+after), then atomic
11388 operations get the benefit of being both load and store. */
11389 if (load_store == 3 && before_after == 2)
11390 implied |= StoreLoad | StoreStore;
11394 /* Relaxed Memory Ordering: no implicit bits. */
11398 gcc_unreachable ();
11401 if (before_after & 1)
11403 if (model == MEMMODEL_RELEASE
11404 || model == MEMMODEL_ACQ_REL
11405 || model == MEMMODEL_SEQ_CST)
11407 if (load_store & 1)
11408 mm |= LoadLoad | StoreLoad;
11409 if (load_store & 2)
11410 mm |= LoadStore | StoreStore;
11413 if (before_after & 2)
11415 if (model == MEMMODEL_ACQUIRE
11416 || model == MEMMODEL_ACQ_REL
11417 || model == MEMMODEL_SEQ_CST)
11419 if (load_store & 1)
11420 mm |= LoadLoad | LoadStore;
11421 if (load_store & 2)
11422 mm |= StoreLoad | StoreStore;
11426 /* Remove the bits implied by the system memory model. */
11429 /* For raw barriers (before+after), always emit a barrier.
11430 This will become a compile-time barrier if needed. */
11431 if (mm || before_after == 3)
11432 emit_insn (gen_membar (GEN_INT (mm)));
11435 /* Expand code to perform a 8 or 16-bit compare and swap by doing 32-bit
11436 compare and swap on the word containing the byte or half-word. */
11439 sparc_expand_compare_and_swap_12 (rtx bool_result, rtx result, rtx mem,
11440 rtx oldval, rtx newval)
11442 rtx addr1 = force_reg (Pmode, XEXP (mem, 0));
11443 rtx addr = gen_reg_rtx (Pmode);
11444 rtx off = gen_reg_rtx (SImode);
11445 rtx oldv = gen_reg_rtx (SImode);
11446 rtx newv = gen_reg_rtx (SImode);
11447 rtx oldvalue = gen_reg_rtx (SImode);
11448 rtx newvalue = gen_reg_rtx (SImode);
11449 rtx res = gen_reg_rtx (SImode);
11450 rtx resv = gen_reg_rtx (SImode);
11451 rtx memsi, val, mask, end_label, loop_label, cc;
11453 emit_insn (gen_rtx_SET (VOIDmode, addr,
11454 gen_rtx_AND (Pmode, addr1, GEN_INT (-4))));
11456 if (Pmode != SImode)
11457 addr1 = gen_lowpart (SImode, addr1);
11458 emit_insn (gen_rtx_SET (VOIDmode, off,
11459 gen_rtx_AND (SImode, addr1, GEN_INT (3))));
11461 memsi = gen_rtx_MEM (SImode, addr);
11462 set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
11463 MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
11465 val = copy_to_reg (memsi);
11467 emit_insn (gen_rtx_SET (VOIDmode, off,
11468 gen_rtx_XOR (SImode, off,
11469 GEN_INT (GET_MODE (mem) == QImode
11472 emit_insn (gen_rtx_SET (VOIDmode, off,
11473 gen_rtx_ASHIFT (SImode, off, GEN_INT (3))));
11475 if (GET_MODE (mem) == QImode)
11476 mask = force_reg (SImode, GEN_INT (0xff));
11478 mask = force_reg (SImode, GEN_INT (0xffff));
11480 emit_insn (gen_rtx_SET (VOIDmode, mask,
11481 gen_rtx_ASHIFT (SImode, mask, off)));
11483 emit_insn (gen_rtx_SET (VOIDmode, val,
11484 gen_rtx_AND (SImode, gen_rtx_NOT (SImode, mask),
11487 oldval = gen_lowpart (SImode, oldval);
11488 emit_insn (gen_rtx_SET (VOIDmode, oldv,
11489 gen_rtx_ASHIFT (SImode, oldval, off)));
11491 newval = gen_lowpart_common (SImode, newval);
11492 emit_insn (gen_rtx_SET (VOIDmode, newv,
11493 gen_rtx_ASHIFT (SImode, newval, off)));
11495 emit_insn (gen_rtx_SET (VOIDmode, oldv,
11496 gen_rtx_AND (SImode, oldv, mask)));
11498 emit_insn (gen_rtx_SET (VOIDmode, newv,
11499 gen_rtx_AND (SImode, newv, mask)));
11501 end_label = gen_label_rtx ();
11502 loop_label = gen_label_rtx ();
11503 emit_label (loop_label);
11505 emit_insn (gen_rtx_SET (VOIDmode, oldvalue,
11506 gen_rtx_IOR (SImode, oldv, val)));
11508 emit_insn (gen_rtx_SET (VOIDmode, newvalue,
11509 gen_rtx_IOR (SImode, newv, val)));
11511 emit_move_insn (bool_result, const1_rtx);
11513 emit_insn (gen_atomic_compare_and_swapsi_1 (res, memsi, oldvalue, newvalue));
11515 emit_cmp_and_jump_insns (res, oldvalue, EQ, NULL, SImode, 0, end_label);
11517 emit_insn (gen_rtx_SET (VOIDmode, resv,
11518 gen_rtx_AND (SImode, gen_rtx_NOT (SImode, mask),
11521 emit_move_insn (bool_result, const0_rtx);
11523 cc = gen_compare_reg_1 (NE, resv, val);
11524 emit_insn (gen_rtx_SET (VOIDmode, val, resv));
11526 /* Use cbranchcc4 to separate the compare and branch! */
11527 emit_jump_insn (gen_cbranchcc4 (gen_rtx_NE (VOIDmode, cc, const0_rtx),
11528 cc, const0_rtx, loop_label));
11530 emit_label (end_label);
11532 emit_insn (gen_rtx_SET (VOIDmode, res,
11533 gen_rtx_AND (SImode, res, mask)));
11535 emit_insn (gen_rtx_SET (VOIDmode, res,
11536 gen_rtx_LSHIFTRT (SImode, res, off)));
11538 emit_move_insn (result, gen_lowpart (GET_MODE (result), res));
11541 /* Expand code to perform a compare-and-swap. */
11544 sparc_expand_compare_and_swap (rtx operands[])
11546 rtx bval, retval, mem, oldval, newval;
11547 enum machine_mode mode;
11548 enum memmodel model;
11550 bval = operands[0];
11551 retval = operands[1];
11553 oldval = operands[3];
11554 newval = operands[4];
11555 model = (enum memmodel) INTVAL (operands[6]);
11556 mode = GET_MODE (mem);
11558 sparc_emit_membar_for_model (model, 3, 1);
11560 if (reg_overlap_mentioned_p (retval, oldval))
11561 oldval = copy_to_reg (oldval);
11563 if (mode == QImode || mode == HImode)
11564 sparc_expand_compare_and_swap_12 (bval, retval, mem, oldval, newval);
11567 rtx (*gen) (rtx, rtx, rtx, rtx);
11570 if (mode == SImode)
11571 gen = gen_atomic_compare_and_swapsi_1;
11573 gen = gen_atomic_compare_and_swapdi_1;
11574 emit_insn (gen (retval, mem, oldval, newval));
11576 x = emit_store_flag (bval, EQ, retval, oldval, mode, 1, 1);
11578 convert_move (bval, x, 1);
11581 sparc_emit_membar_for_model (model, 3, 2);
11585 sparc_expand_vec_perm_bmask (enum machine_mode vmode, rtx sel)
11589 sel = gen_lowpart (DImode, sel);
11593 /* inp = xxxxxxxAxxxxxxxB */
11594 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (16),
11595 NULL_RTX, 1, OPTAB_DIRECT);
11596 /* t_1 = ....xxxxxxxAxxx. */
11597 sel = expand_simple_binop (SImode, AND, gen_lowpart (SImode, sel),
11598 GEN_INT (3), NULL_RTX, 1, OPTAB_DIRECT);
11599 t_1 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_1),
11600 GEN_INT (0x30000), NULL_RTX, 1, OPTAB_DIRECT);
11601 /* sel = .......B */
11602 /* t_1 = ...A.... */
11603 sel = expand_simple_binop (SImode, IOR, sel, t_1, sel, 1, OPTAB_DIRECT);
11604 /* sel = ...A...B */
11605 sel = expand_mult (SImode, sel, GEN_INT (0x4444), sel, 1);
11606 /* sel = AAAABBBB * 4 */
11607 t_1 = force_reg (SImode, GEN_INT (0x01230123));
11608 /* sel = { A*4, A*4+1, A*4+2, ... } */
11612 /* inp = xxxAxxxBxxxCxxxD */
11613 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (8),
11614 NULL_RTX, 1, OPTAB_DIRECT);
11615 t_2 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (16),
11616 NULL_RTX, 1, OPTAB_DIRECT);
11617 t_3 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (24),
11618 NULL_RTX, 1, OPTAB_DIRECT);
11619 /* t_1 = ..xxxAxxxBxxxCxx */
11620 /* t_2 = ....xxxAxxxBxxxC */
11621 /* t_3 = ......xxxAxxxBxx */
11622 sel = expand_simple_binop (SImode, AND, gen_lowpart (SImode, sel),
11624 NULL_RTX, 1, OPTAB_DIRECT);
11625 t_1 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_1),
11627 NULL_RTX, 1, OPTAB_DIRECT);
11628 t_2 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_2),
11629 GEN_INT (0x070000),
11630 NULL_RTX, 1, OPTAB_DIRECT);
11631 t_3 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_3),
11632 GEN_INT (0x07000000),
11633 NULL_RTX, 1, OPTAB_DIRECT);
11634 /* sel = .......D */
11635 /* t_1 = .....C.. */
11636 /* t_2 = ...B.... */
11637 /* t_3 = .A...... */
11638 sel = expand_simple_binop (SImode, IOR, sel, t_1, sel, 1, OPTAB_DIRECT);
11639 t_2 = expand_simple_binop (SImode, IOR, t_2, t_3, t_2, 1, OPTAB_DIRECT);
11640 sel = expand_simple_binop (SImode, IOR, sel, t_2, sel, 1, OPTAB_DIRECT);
11641 /* sel = .A.B.C.D */
11642 sel = expand_mult (SImode, sel, GEN_INT (0x22), sel, 1);
11643 /* sel = AABBCCDD * 2 */
11644 t_1 = force_reg (SImode, GEN_INT (0x01010101));
11645 /* sel = { A*2, A*2+1, B*2, B*2+1, ... } */
11649 /* input = xAxBxCxDxExFxGxH */
11650 sel = expand_simple_binop (DImode, AND, sel,
11651 GEN_INT ((HOST_WIDE_INT)0x0f0f0f0f << 32
11653 NULL_RTX, 1, OPTAB_DIRECT);
11654 /* sel = .A.B.C.D.E.F.G.H */
11655 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (4),
11656 NULL_RTX, 1, OPTAB_DIRECT);
11657 /* t_1 = ..A.B.C.D.E.F.G. */
11658 sel = expand_simple_binop (DImode, IOR, sel, t_1,
11659 NULL_RTX, 1, OPTAB_DIRECT);
11660 /* sel = .AABBCCDDEEFFGGH */
11661 sel = expand_simple_binop (DImode, AND, sel,
11662 GEN_INT ((HOST_WIDE_INT)0xff00ff << 32
11664 NULL_RTX, 1, OPTAB_DIRECT);
11665 /* sel = ..AB..CD..EF..GH */
11666 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (8),
11667 NULL_RTX, 1, OPTAB_DIRECT);
11668 /* t_1 = ....AB..CD..EF.. */
11669 sel = expand_simple_binop (DImode, IOR, sel, t_1,
11670 NULL_RTX, 1, OPTAB_DIRECT);
11671 /* sel = ..ABABCDCDEFEFGH */
11672 sel = expand_simple_binop (DImode, AND, sel,
11673 GEN_INT ((HOST_WIDE_INT)0xffff << 32 | 0xffff),
11674 NULL_RTX, 1, OPTAB_DIRECT);
11675 /* sel = ....ABCD....EFGH */
11676 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (16),
11677 NULL_RTX, 1, OPTAB_DIRECT);
11678 /* t_1 = ........ABCD.... */
11679 sel = gen_lowpart (SImode, sel);
11680 t_1 = gen_lowpart (SImode, t_1);
11684 gcc_unreachable ();
11687 /* Always perform the final addition/merge within the bmask insn. */
11688 emit_insn (gen_bmasksi_vis (gen_rtx_REG (SImode, 0), sel, t_1));
11691 /* Implement TARGET_FRAME_POINTER_REQUIRED. */
11694 sparc_frame_pointer_required (void)
11696 /* If the stack pointer is dynamically modified in the function, it cannot
11697 serve as the frame pointer. */
11698 if (cfun->calls_alloca)
11701 /* If the function receives nonlocal gotos, it needs to save the frame
11702 pointer in the nonlocal_goto_save_area object. */
11703 if (cfun->has_nonlocal_label)
11706 /* In flat mode, that's it. */
11710 /* Otherwise, the frame pointer is required if the function isn't leaf. */
11711 return !(crtl->is_leaf && only_leaf_regs_used ());
11714 /* The way this is structured, we can't eliminate SFP in favor of SP
11715 if the frame pointer is required: we want to use the SFP->HFP elimination
11716 in that case. But the test in update_eliminables doesn't know we are
11717 assuming below that we only do the former elimination. */
11720 sparc_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
11722 return to == HARD_FRAME_POINTER_REGNUM || !sparc_frame_pointer_required ();
11725 /* Return the hard frame pointer directly to bypass the stack bias. */
11728 sparc_builtin_setjmp_frame_value (void)
11730 return hard_frame_pointer_rtx;
11733 /* If !TARGET_FPU, then make the fp registers and fp cc regs fixed so that
11734 they won't be allocated. */
11737 sparc_conditional_register_usage (void)
11739 if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
11741 fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
11742 call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
11744 /* If the user has passed -f{fixed,call-{used,saved}}-g5 */
11745 /* then honor it. */
11746 if (TARGET_ARCH32 && fixed_regs[5])
11748 else if (TARGET_ARCH64 && fixed_regs[5] == 2)
11753 for (regno = SPARC_FIRST_V9_FP_REG;
11754 regno <= SPARC_LAST_V9_FP_REG;
11756 fixed_regs[regno] = 1;
11757 /* %fcc0 is used by v8 and v9. */
11758 for (regno = SPARC_FIRST_V9_FCC_REG + 1;
11759 regno <= SPARC_LAST_V9_FCC_REG;
11761 fixed_regs[regno] = 1;
11766 for (regno = 32; regno < SPARC_LAST_V9_FCC_REG; regno++)
11767 fixed_regs[regno] = 1;
11769 /* If the user has passed -f{fixed,call-{used,saved}}-g2 */
11770 /* then honor it. Likewise with g3 and g4. */
11771 if (fixed_regs[2] == 2)
11772 fixed_regs[2] = ! TARGET_APP_REGS;
11773 if (fixed_regs[3] == 2)
11774 fixed_regs[3] = ! TARGET_APP_REGS;
11775 if (TARGET_ARCH32 && fixed_regs[4] == 2)
11776 fixed_regs[4] = ! TARGET_APP_REGS;
11777 else if (TARGET_CM_EMBMEDANY)
11779 else if (fixed_regs[4] == 2)
11784 /* Disable leaf functions. */
11785 memset (sparc_leaf_regs, 0, FIRST_PSEUDO_REGISTER);
11786 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
11787 leaf_reg_remap [regno] = regno;
11790 global_regs[SPARC_GSR_REG] = 1;
11793 /* Implement TARGET_PREFERRED_RELOAD_CLASS:
11795 - We can't load constants into FP registers.
11796 - We can't load FP constants into integer registers when soft-float,
11797 because there is no soft-float pattern with a r/F constraint.
11798 - We can't load FP constants into integer registers for TFmode unless
11799 it is 0.0L, because there is no movtf pattern with a r/F constraint.
11800 - Try and reload integer constants (symbolic or otherwise) back into
11801 registers directly, rather than having them dumped to memory. */
11804 sparc_preferred_reload_class (rtx x, reg_class_t rclass)
11806 enum machine_mode mode = GET_MODE (x);
11807 if (CONSTANT_P (x))
11809 if (FP_REG_CLASS_P (rclass)
11810 || rclass == GENERAL_OR_FP_REGS
11811 || rclass == GENERAL_OR_EXTRA_FP_REGS
11812 || (GET_MODE_CLASS (mode) == MODE_FLOAT && ! TARGET_FPU)
11813 || (mode == TFmode && ! const_zero_operand (x, mode)))
11816 if (GET_MODE_CLASS (mode) == MODE_INT)
11817 return GENERAL_REGS;
11819 if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
11821 if (! FP_REG_CLASS_P (rclass)
11822 || !(const_zero_operand (x, mode)
11823 || const_all_ones_operand (x, mode)))
11830 && (rclass == EXTRA_FP_REGS
11831 || rclass == GENERAL_OR_EXTRA_FP_REGS))
11833 int regno = true_regnum (x);
11835 if (SPARC_INT_REG_P (regno))
11836 return (rclass == EXTRA_FP_REGS
11837 ? FP_REGS : GENERAL_OR_FP_REGS);
11843 /* Output a wide multiply instruction in V8+ mode. INSN is the instruction,
11844 OPERANDS are its operands and OPCODE is the mnemonic to be used. */
11847 output_v8plus_mult (rtx insn, rtx *operands, const char *opcode)
11851 gcc_assert (! TARGET_ARCH64);
11853 if (sparc_check_64 (operands[1], insn) <= 0)
11854 output_asm_insn ("srl\t%L1, 0, %L1", operands);
11855 if (which_alternative == 1)
11856 output_asm_insn ("sllx\t%H1, 32, %H1", operands);
11857 if (GET_CODE (operands[2]) == CONST_INT)
11859 if (which_alternative == 1)
11861 output_asm_insn ("or\t%L1, %H1, %H1", operands);
11862 sprintf (mulstr, "%s\t%%H1, %%2, %%L0", opcode);
11863 output_asm_insn (mulstr, operands);
11864 return "srlx\t%L0, 32, %H0";
11868 output_asm_insn ("sllx\t%H1, 32, %3", operands);
11869 output_asm_insn ("or\t%L1, %3, %3", operands);
11870 sprintf (mulstr, "%s\t%%3, %%2, %%3", opcode);
11871 output_asm_insn (mulstr, operands);
11872 output_asm_insn ("srlx\t%3, 32, %H0", operands);
11873 return "mov\t%3, %L0";
11876 else if (rtx_equal_p (operands[1], operands[2]))
11878 if (which_alternative == 1)
11880 output_asm_insn ("or\t%L1, %H1, %H1", operands);
11881 sprintf (mulstr, "%s\t%%H1, %%H1, %%L0", opcode);
11882 output_asm_insn (mulstr, operands);
11883 return "srlx\t%L0, 32, %H0";
11887 output_asm_insn ("sllx\t%H1, 32, %3", operands);
11888 output_asm_insn ("or\t%L1, %3, %3", operands);
11889 sprintf (mulstr, "%s\t%%3, %%3, %%3", opcode);
11890 output_asm_insn (mulstr, operands);
11891 output_asm_insn ("srlx\t%3, 32, %H0", operands);
11892 return "mov\t%3, %L0";
11895 if (sparc_check_64 (operands[2], insn) <= 0)
11896 output_asm_insn ("srl\t%L2, 0, %L2", operands);
11897 if (which_alternative == 1)
11899 output_asm_insn ("or\t%L1, %H1, %H1", operands);
11900 output_asm_insn ("sllx\t%H2, 32, %L1", operands);
11901 output_asm_insn ("or\t%L2, %L1, %L1", operands);
11902 sprintf (mulstr, "%s\t%%H1, %%L1, %%L0", opcode);
11903 output_asm_insn (mulstr, operands);
11904 return "srlx\t%L0, 32, %H0";
11908 output_asm_insn ("sllx\t%H1, 32, %3", operands);
11909 output_asm_insn ("sllx\t%H2, 32, %4", operands);
11910 output_asm_insn ("or\t%L1, %3, %3", operands);
11911 output_asm_insn ("or\t%L2, %4, %4", operands);
11912 sprintf (mulstr, "%s\t%%3, %%4, %%3", opcode);
11913 output_asm_insn (mulstr, operands);
11914 output_asm_insn ("srlx\t%3, 32, %H0", operands);
11915 return "mov\t%3, %L0";
11919 /* Subroutine of sparc_expand_vector_init. Emit code to initialize
11920 all fields of TARGET to ELT by means of VIS2 BSHUFFLE insn. MODE
11921 and INNER_MODE are the modes describing TARGET. */
11924 vector_init_bshuffle (rtx target, rtx elt, enum machine_mode mode,
11925 enum machine_mode inner_mode)
11927 rtx t1, final_insn, sel;
11930 t1 = gen_reg_rtx (mode);
11932 elt = convert_modes (SImode, inner_mode, elt, true);
11933 emit_move_insn (gen_lowpart(SImode, t1), elt);
11938 final_insn = gen_bshufflev2si_vis (target, t1, t1);
11939 bmask = 0x45674567;
11942 final_insn = gen_bshufflev4hi_vis (target, t1, t1);
11943 bmask = 0x67676767;
11946 final_insn = gen_bshufflev8qi_vis (target, t1, t1);
11947 bmask = 0x77777777;
11950 gcc_unreachable ();
11953 sel = force_reg (SImode, GEN_INT (bmask));
11954 emit_insn (gen_bmasksi_vis (gen_rtx_REG (SImode, 0), sel, const0_rtx));
11955 emit_insn (final_insn);
11958 /* Subroutine of sparc_expand_vector_init. Emit code to initialize
11959 all fields of TARGET to ELT in V8QI by means of VIS FPMERGE insn. */
11962 vector_init_fpmerge (rtx target, rtx elt)
11964 rtx t1, t2, t2_low, t3, t3_low;
11966 t1 = gen_reg_rtx (V4QImode);
11967 elt = convert_modes (SImode, QImode, elt, true);
11968 emit_move_insn (gen_lowpart (SImode, t1), elt);
11970 t2 = gen_reg_rtx (V8QImode);
11971 t2_low = gen_lowpart (V4QImode, t2);
11972 emit_insn (gen_fpmerge_vis (t2, t1, t1));
11974 t3 = gen_reg_rtx (V8QImode);
11975 t3_low = gen_lowpart (V4QImode, t3);
11976 emit_insn (gen_fpmerge_vis (t3, t2_low, t2_low));
11978 emit_insn (gen_fpmerge_vis (target, t3_low, t3_low));
11981 /* Subroutine of sparc_expand_vector_init. Emit code to initialize
11982 all fields of TARGET to ELT in V4HI by means of VIS FALIGNDATA insn. */
11985 vector_init_faligndata (rtx target, rtx elt)
11987 rtx t1 = gen_reg_rtx (V4HImode);
11990 elt = convert_modes (SImode, HImode, elt, true);
11991 emit_move_insn (gen_lowpart (SImode, t1), elt);
11993 emit_insn (gen_alignaddrsi_vis (gen_reg_rtx (SImode),
11994 force_reg (SImode, GEN_INT (6)),
11997 for (i = 0; i < 4; i++)
11998 emit_insn (gen_faligndatav4hi_vis (target, t1, target));
12001 /* Emit code to initialize TARGET to values for individual fields VALS. */
12004 sparc_expand_vector_init (rtx target, rtx vals)
12006 const enum machine_mode mode = GET_MODE (target);
12007 const enum machine_mode inner_mode = GET_MODE_INNER (mode);
12008 const int n_elts = GET_MODE_NUNITS (mode);
12014 for (i = 0; i < n_elts; i++)
12016 rtx x = XVECEXP (vals, 0, i);
12017 if (!CONSTANT_P (x))
12020 if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
12026 emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
12030 if (GET_MODE_SIZE (inner_mode) == GET_MODE_SIZE (mode))
12032 if (GET_MODE_SIZE (inner_mode) == 4)
12034 emit_move_insn (gen_lowpart (SImode, target),
12035 gen_lowpart (SImode, XVECEXP (vals, 0, 0)));
12038 else if (GET_MODE_SIZE (inner_mode) == 8)
12040 emit_move_insn (gen_lowpart (DImode, target),
12041 gen_lowpart (DImode, XVECEXP (vals, 0, 0)));
12045 else if (GET_MODE_SIZE (inner_mode) == GET_MODE_SIZE (word_mode)
12046 && GET_MODE_SIZE (mode) == 2 * GET_MODE_SIZE (word_mode))
12048 emit_move_insn (gen_highpart (word_mode, target),
12049 gen_lowpart (word_mode, XVECEXP (vals, 0, 0)));
12050 emit_move_insn (gen_lowpart (word_mode, target),
12051 gen_lowpart (word_mode, XVECEXP (vals, 0, 1)));
12055 if (all_same && GET_MODE_SIZE (mode) == 8)
12059 vector_init_bshuffle (target, XVECEXP (vals, 0, 0), mode, inner_mode);
12062 if (mode == V8QImode)
12064 vector_init_fpmerge (target, XVECEXP (vals, 0, 0));
12067 if (mode == V4HImode)
12069 vector_init_faligndata (target, XVECEXP (vals, 0, 0));
12074 mem = assign_stack_temp (mode, GET_MODE_SIZE (mode));
12075 for (i = 0; i < n_elts; i++)
12076 emit_move_insn (adjust_address_nv (mem, inner_mode,
12077 i * GET_MODE_SIZE (inner_mode)),
12078 XVECEXP (vals, 0, i));
12079 emit_move_insn (target, mem);
12082 /* Implement TARGET_SECONDARY_RELOAD. */
12085 sparc_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
12086 enum machine_mode mode, secondary_reload_info *sri)
12088 enum reg_class rclass = (enum reg_class) rclass_i;
12090 sri->icode = CODE_FOR_nothing;
12091 sri->extra_cost = 0;
12093 /* We need a temporary when loading/storing a HImode/QImode value
12094 between memory and the FPU registers. This can happen when combine puts
12095 a paradoxical subreg in a float/fix conversion insn. */
12096 if (FP_REG_CLASS_P (rclass)
12097 && (mode == HImode || mode == QImode)
12098 && (GET_CODE (x) == MEM
12099 || ((GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
12100 && true_regnum (x) == -1)))
12101 return GENERAL_REGS;
12103 /* On 32-bit we need a temporary when loading/storing a DFmode value
12104 between unaligned memory and the upper FPU registers. */
12106 && rclass == EXTRA_FP_REGS
12108 && GET_CODE (x) == MEM
12109 && ! mem_min_alignment (x, 8))
12112 if (((TARGET_CM_MEDANY
12113 && symbolic_operand (x, mode))
12114 || (TARGET_CM_EMBMEDANY
12115 && text_segment_operand (x, mode)))
12119 sri->icode = direct_optab_handler (reload_in_optab, mode);
12121 sri->icode = direct_optab_handler (reload_out_optab, mode);
12125 if (TARGET_VIS3 && TARGET_ARCH32)
12127 int regno = true_regnum (x);
12129 /* When using VIS3 fp<-->int register moves, on 32-bit we have
12130 to move 8-byte values in 4-byte pieces. This only works via
12131 FP_REGS, and not via EXTRA_FP_REGS. Therefore if we try to
12132 move between EXTRA_FP_REGS and GENERAL_REGS, we will need
12133 an FP_REGS intermediate move. */
12134 if ((rclass == EXTRA_FP_REGS && SPARC_INT_REG_P (regno))
12135 || ((general_or_i64_p (rclass)
12136 || rclass == GENERAL_OR_FP_REGS)
12137 && SPARC_FP_REG_P (regno)))
12139 sri->extra_cost = 2;
12147 /* Emit code to conditionally move either OPERANDS[2] or OPERANDS[3] into
12148 OPERANDS[0] in MODE. OPERANDS[1] is the operator of the condition. */
12151 sparc_expand_conditional_move (enum machine_mode mode, rtx *operands)
12153 enum rtx_code rc = GET_CODE (operands[1]);
12154 enum machine_mode cmp_mode;
12155 rtx cc_reg, dst, cmp;
12158 if (GET_MODE (XEXP (cmp, 0)) == DImode && !TARGET_ARCH64)
12161 if (GET_MODE (XEXP (cmp, 0)) == TFmode && !TARGET_HARD_QUAD)
12162 cmp = sparc_emit_float_lib_cmp (XEXP (cmp, 0), XEXP (cmp, 1), rc);
12164 cmp_mode = GET_MODE (XEXP (cmp, 0));
12165 rc = GET_CODE (cmp);
12168 if (! rtx_equal_p (operands[2], dst)
12169 && ! rtx_equal_p (operands[3], dst))
12171 if (reg_overlap_mentioned_p (dst, cmp))
12172 dst = gen_reg_rtx (mode);
12174 emit_move_insn (dst, operands[3]);
12176 else if (operands[2] == dst)
12178 operands[2] = operands[3];
12180 if (GET_MODE_CLASS (cmp_mode) == MODE_FLOAT)
12181 rc = reverse_condition_maybe_unordered (rc);
12183 rc = reverse_condition (rc);
12186 if (XEXP (cmp, 1) == const0_rtx
12187 && GET_CODE (XEXP (cmp, 0)) == REG
12188 && cmp_mode == DImode
12189 && v9_regcmp_p (rc))
12190 cc_reg = XEXP (cmp, 0);
12192 cc_reg = gen_compare_reg_1 (rc, XEXP (cmp, 0), XEXP (cmp, 1));
12194 cmp = gen_rtx_fmt_ee (rc, GET_MODE (cc_reg), cc_reg, const0_rtx);
12196 emit_insn (gen_rtx_SET (VOIDmode, dst,
12197 gen_rtx_IF_THEN_ELSE (mode, cmp, operands[2], dst)));
12199 if (dst != operands[0])
12200 emit_move_insn (operands[0], dst);
12205 /* Emit code to conditionally move a combination of OPERANDS[1] and OPERANDS[2]
12206 into OPERANDS[0] in MODE, depending on the outcome of the comparison of
12207 OPERANDS[4] and OPERANDS[5]. OPERANDS[3] is the operator of the condition.
12208 FCODE is the machine code to be used for OPERANDS[3] and CCODE the machine
12209 code to be used for the condition mask. */
12212 sparc_expand_vcond (enum machine_mode mode, rtx *operands, int ccode, int fcode)
12214 rtx mask, cop0, cop1, fcmp, cmask, bshuf, gsr;
12215 enum rtx_code code = GET_CODE (operands[3]);
12217 mask = gen_reg_rtx (Pmode);
12218 cop0 = operands[4];
12219 cop1 = operands[5];
12220 if (code == LT || code == GE)
12224 code = swap_condition (code);
12225 t = cop0; cop0 = cop1; cop1 = t;
12228 gsr = gen_rtx_REG (DImode, SPARC_GSR_REG);
12230 fcmp = gen_rtx_UNSPEC (Pmode,
12231 gen_rtvec (1, gen_rtx_fmt_ee (code, mode, cop0, cop1)),
12234 cmask = gen_rtx_UNSPEC (DImode,
12235 gen_rtvec (2, mask, gsr),
12238 bshuf = gen_rtx_UNSPEC (mode,
12239 gen_rtvec (3, operands[1], operands[2], gsr),
12242 emit_insn (gen_rtx_SET (VOIDmode, mask, fcmp));
12243 emit_insn (gen_rtx_SET (VOIDmode, gsr, cmask));
12245 emit_insn (gen_rtx_SET (VOIDmode, operands[0], bshuf));
12248 /* On sparc, any mode which naturally allocates into the float
12249 registers should return 4 here. */
12252 sparc_regmode_natural_size (enum machine_mode mode)
12254 int size = UNITS_PER_WORD;
12258 enum mode_class mclass = GET_MODE_CLASS (mode);
12260 if (mclass == MODE_FLOAT || mclass == MODE_VECTOR_INT)
12267 /* Return TRUE if it is a good idea to tie two pseudo registers
12268 when one has mode MODE1 and one has mode MODE2.
12269 If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
12270 for any hard reg, then this must be FALSE for correct output.
12272 For V9 we have to deal with the fact that only the lower 32 floating
12273 point registers are 32-bit addressable. */
12276 sparc_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
12278 enum mode_class mclass1, mclass2;
12279 unsigned short size1, size2;
12281 if (mode1 == mode2)
12284 mclass1 = GET_MODE_CLASS (mode1);
12285 mclass2 = GET_MODE_CLASS (mode2);
12286 if (mclass1 != mclass2)
12292 /* Classes are the same and we are V9 so we have to deal with upper
12293 vs. lower floating point registers. If one of the modes is a
12294 4-byte mode, and the other is not, we have to mark them as not
12295 tieable because only the lower 32 floating point register are
12296 addressable 32-bits at a time.
12298 We can't just test explicitly for SFmode, otherwise we won't
12299 cover the vector mode cases properly. */
12301 if (mclass1 != MODE_FLOAT && mclass1 != MODE_VECTOR_INT)
12304 size1 = GET_MODE_SIZE (mode1);
12305 size2 = GET_MODE_SIZE (mode2);
12306 if ((size1 > 4 && size2 == 4)
12307 || (size2 > 4 && size1 == 4))
12313 static enum machine_mode sparc_cstore_mode (enum insn_code icode ATTRIBUTE_UNUSED)
12315 return (TARGET_ARCH64 ? DImode : SImode);
12318 #include "gt-sparc.h"