1 /* Subroutines for insn-output.c for SPARC.
2 Copyright (C) 1987-2014 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"
28 #include "stringpool.h"
29 #include "stor-layout.h"
34 #include "hard-reg-set.h"
35 #include "insn-config.h"
36 #include "insn-codes.h"
37 #include "conditions.h"
39 #include "insn-attr.h"
46 #include "diagnostic-core.h"
51 #include "target-def.h"
52 #include "common/common-target.h"
53 #include "pointer-set.h"
54 #include "hash-table.h"
56 #include "basic-block.h"
57 #include "tree-ssa-alias.h"
58 #include "internal-fn.h"
59 #include "gimple-fold.h"
61 #include "gimple-expr.h"
65 #include "langhooks.h"
70 #include "tree-pass.h"
75 struct processor_costs {
79 /* Integer signed load */
82 /* Integer zeroed load */
88 /* fmov, fneg, fabs */
92 const int float_plusminus;
98 const int float_cmove;
104 const int float_div_sf;
107 const int float_div_df;
110 const int float_sqrt_sf;
113 const int float_sqrt_df;
121 /* integer multiply cost for each bit set past the most
122 significant 3, so the formula for multiply cost becomes:
125 highest_bit = highest_clear_bit(rs1);
127 highest_bit = highest_set_bit(rs1);
130 cost = int_mul{,X} + ((highest_bit - 3) / int_mul_bit_factor);
132 A value of zero indicates that the multiply costs is fixed,
134 const int int_mul_bit_factor;
145 /* penalty for shifts, due to scheduling rules etc. */
146 const int shift_penalty;
150 struct processor_costs cypress_costs = {
151 COSTS_N_INSNS (2), /* int load */
152 COSTS_N_INSNS (2), /* int signed load */
153 COSTS_N_INSNS (2), /* int zeroed load */
154 COSTS_N_INSNS (2), /* float load */
155 COSTS_N_INSNS (5), /* fmov, fneg, fabs */
156 COSTS_N_INSNS (5), /* fadd, fsub */
157 COSTS_N_INSNS (1), /* fcmp */
158 COSTS_N_INSNS (1), /* fmov, fmovr */
159 COSTS_N_INSNS (7), /* fmul */
160 COSTS_N_INSNS (37), /* fdivs */
161 COSTS_N_INSNS (37), /* fdivd */
162 COSTS_N_INSNS (63), /* fsqrts */
163 COSTS_N_INSNS (63), /* fsqrtd */
164 COSTS_N_INSNS (1), /* imul */
165 COSTS_N_INSNS (1), /* imulX */
166 0, /* imul bit factor */
167 COSTS_N_INSNS (1), /* idiv */
168 COSTS_N_INSNS (1), /* idivX */
169 COSTS_N_INSNS (1), /* movcc/movr */
170 0, /* shift penalty */
174 struct processor_costs supersparc_costs = {
175 COSTS_N_INSNS (1), /* int load */
176 COSTS_N_INSNS (1), /* int signed load */
177 COSTS_N_INSNS (1), /* int zeroed load */
178 COSTS_N_INSNS (0), /* float load */
179 COSTS_N_INSNS (3), /* fmov, fneg, fabs */
180 COSTS_N_INSNS (3), /* fadd, fsub */
181 COSTS_N_INSNS (3), /* fcmp */
182 COSTS_N_INSNS (1), /* fmov, fmovr */
183 COSTS_N_INSNS (3), /* fmul */
184 COSTS_N_INSNS (6), /* fdivs */
185 COSTS_N_INSNS (9), /* fdivd */
186 COSTS_N_INSNS (12), /* fsqrts */
187 COSTS_N_INSNS (12), /* fsqrtd */
188 COSTS_N_INSNS (4), /* imul */
189 COSTS_N_INSNS (4), /* imulX */
190 0, /* imul bit factor */
191 COSTS_N_INSNS (4), /* idiv */
192 COSTS_N_INSNS (4), /* idivX */
193 COSTS_N_INSNS (1), /* movcc/movr */
194 1, /* shift penalty */
198 struct processor_costs hypersparc_costs = {
199 COSTS_N_INSNS (1), /* int load */
200 COSTS_N_INSNS (1), /* int signed load */
201 COSTS_N_INSNS (1), /* int zeroed load */
202 COSTS_N_INSNS (1), /* float load */
203 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
204 COSTS_N_INSNS (1), /* fadd, fsub */
205 COSTS_N_INSNS (1), /* fcmp */
206 COSTS_N_INSNS (1), /* fmov, fmovr */
207 COSTS_N_INSNS (1), /* fmul */
208 COSTS_N_INSNS (8), /* fdivs */
209 COSTS_N_INSNS (12), /* fdivd */
210 COSTS_N_INSNS (17), /* fsqrts */
211 COSTS_N_INSNS (17), /* fsqrtd */
212 COSTS_N_INSNS (17), /* imul */
213 COSTS_N_INSNS (17), /* imulX */
214 0, /* imul bit factor */
215 COSTS_N_INSNS (17), /* idiv */
216 COSTS_N_INSNS (17), /* idivX */
217 COSTS_N_INSNS (1), /* movcc/movr */
218 0, /* shift penalty */
222 struct processor_costs leon_costs = {
223 COSTS_N_INSNS (1), /* int load */
224 COSTS_N_INSNS (1), /* int signed load */
225 COSTS_N_INSNS (1), /* int zeroed load */
226 COSTS_N_INSNS (1), /* float load */
227 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
228 COSTS_N_INSNS (1), /* fadd, fsub */
229 COSTS_N_INSNS (1), /* fcmp */
230 COSTS_N_INSNS (1), /* fmov, fmovr */
231 COSTS_N_INSNS (1), /* fmul */
232 COSTS_N_INSNS (15), /* fdivs */
233 COSTS_N_INSNS (15), /* fdivd */
234 COSTS_N_INSNS (23), /* fsqrts */
235 COSTS_N_INSNS (23), /* fsqrtd */
236 COSTS_N_INSNS (5), /* imul */
237 COSTS_N_INSNS (5), /* imulX */
238 0, /* imul bit factor */
239 COSTS_N_INSNS (5), /* idiv */
240 COSTS_N_INSNS (5), /* idivX */
241 COSTS_N_INSNS (1), /* movcc/movr */
242 0, /* shift penalty */
246 struct processor_costs leon3_costs = {
247 COSTS_N_INSNS (1), /* int load */
248 COSTS_N_INSNS (1), /* int signed load */
249 COSTS_N_INSNS (1), /* int zeroed load */
250 COSTS_N_INSNS (1), /* float load */
251 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
252 COSTS_N_INSNS (1), /* fadd, fsub */
253 COSTS_N_INSNS (1), /* fcmp */
254 COSTS_N_INSNS (1), /* fmov, fmovr */
255 COSTS_N_INSNS (1), /* fmul */
256 COSTS_N_INSNS (14), /* fdivs */
257 COSTS_N_INSNS (15), /* fdivd */
258 COSTS_N_INSNS (22), /* fsqrts */
259 COSTS_N_INSNS (23), /* fsqrtd */
260 COSTS_N_INSNS (5), /* imul */
261 COSTS_N_INSNS (5), /* imulX */
262 0, /* imul bit factor */
263 COSTS_N_INSNS (35), /* idiv */
264 COSTS_N_INSNS (35), /* idivX */
265 COSTS_N_INSNS (1), /* movcc/movr */
266 0, /* shift penalty */
270 struct processor_costs sparclet_costs = {
271 COSTS_N_INSNS (3), /* int load */
272 COSTS_N_INSNS (3), /* int signed load */
273 COSTS_N_INSNS (1), /* int zeroed load */
274 COSTS_N_INSNS (1), /* float load */
275 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
276 COSTS_N_INSNS (1), /* fadd, fsub */
277 COSTS_N_INSNS (1), /* fcmp */
278 COSTS_N_INSNS (1), /* fmov, fmovr */
279 COSTS_N_INSNS (1), /* fmul */
280 COSTS_N_INSNS (1), /* fdivs */
281 COSTS_N_INSNS (1), /* fdivd */
282 COSTS_N_INSNS (1), /* fsqrts */
283 COSTS_N_INSNS (1), /* fsqrtd */
284 COSTS_N_INSNS (5), /* imul */
285 COSTS_N_INSNS (5), /* imulX */
286 0, /* imul bit factor */
287 COSTS_N_INSNS (5), /* idiv */
288 COSTS_N_INSNS (5), /* idivX */
289 COSTS_N_INSNS (1), /* movcc/movr */
290 0, /* shift penalty */
294 struct processor_costs ultrasparc_costs = {
295 COSTS_N_INSNS (2), /* int load */
296 COSTS_N_INSNS (3), /* int signed load */
297 COSTS_N_INSNS (2), /* int zeroed load */
298 COSTS_N_INSNS (2), /* float load */
299 COSTS_N_INSNS (1), /* fmov, fneg, fabs */
300 COSTS_N_INSNS (4), /* fadd, fsub */
301 COSTS_N_INSNS (1), /* fcmp */
302 COSTS_N_INSNS (2), /* fmov, fmovr */
303 COSTS_N_INSNS (4), /* fmul */
304 COSTS_N_INSNS (13), /* fdivs */
305 COSTS_N_INSNS (23), /* fdivd */
306 COSTS_N_INSNS (13), /* fsqrts */
307 COSTS_N_INSNS (23), /* fsqrtd */
308 COSTS_N_INSNS (4), /* imul */
309 COSTS_N_INSNS (4), /* imulX */
310 2, /* imul bit factor */
311 COSTS_N_INSNS (37), /* idiv */
312 COSTS_N_INSNS (68), /* idivX */
313 COSTS_N_INSNS (2), /* movcc/movr */
314 2, /* shift penalty */
318 struct processor_costs ultrasparc3_costs = {
319 COSTS_N_INSNS (2), /* int load */
320 COSTS_N_INSNS (3), /* int signed load */
321 COSTS_N_INSNS (3), /* int zeroed load */
322 COSTS_N_INSNS (2), /* float load */
323 COSTS_N_INSNS (3), /* fmov, fneg, fabs */
324 COSTS_N_INSNS (4), /* fadd, fsub */
325 COSTS_N_INSNS (5), /* fcmp */
326 COSTS_N_INSNS (3), /* fmov, fmovr */
327 COSTS_N_INSNS (4), /* fmul */
328 COSTS_N_INSNS (17), /* fdivs */
329 COSTS_N_INSNS (20), /* fdivd */
330 COSTS_N_INSNS (20), /* fsqrts */
331 COSTS_N_INSNS (29), /* fsqrtd */
332 COSTS_N_INSNS (6), /* imul */
333 COSTS_N_INSNS (6), /* imulX */
334 0, /* imul bit factor */
335 COSTS_N_INSNS (40), /* idiv */
336 COSTS_N_INSNS (71), /* idivX */
337 COSTS_N_INSNS (2), /* movcc/movr */
338 0, /* shift penalty */
342 struct processor_costs niagara_costs = {
343 COSTS_N_INSNS (3), /* int load */
344 COSTS_N_INSNS (3), /* int signed load */
345 COSTS_N_INSNS (3), /* int zeroed load */
346 COSTS_N_INSNS (9), /* float load */
347 COSTS_N_INSNS (8), /* fmov, fneg, fabs */
348 COSTS_N_INSNS (8), /* fadd, fsub */
349 COSTS_N_INSNS (26), /* fcmp */
350 COSTS_N_INSNS (8), /* fmov, fmovr */
351 COSTS_N_INSNS (29), /* fmul */
352 COSTS_N_INSNS (54), /* fdivs */
353 COSTS_N_INSNS (83), /* fdivd */
354 COSTS_N_INSNS (100), /* fsqrts - not implemented in hardware */
355 COSTS_N_INSNS (100), /* fsqrtd - not implemented in hardware */
356 COSTS_N_INSNS (11), /* imul */
357 COSTS_N_INSNS (11), /* imulX */
358 0, /* imul bit factor */
359 COSTS_N_INSNS (72), /* idiv */
360 COSTS_N_INSNS (72), /* idivX */
361 COSTS_N_INSNS (1), /* movcc/movr */
362 0, /* shift penalty */
366 struct processor_costs niagara2_costs = {
367 COSTS_N_INSNS (3), /* int load */
368 COSTS_N_INSNS (3), /* int signed load */
369 COSTS_N_INSNS (3), /* int zeroed load */
370 COSTS_N_INSNS (3), /* float load */
371 COSTS_N_INSNS (6), /* fmov, fneg, fabs */
372 COSTS_N_INSNS (6), /* fadd, fsub */
373 COSTS_N_INSNS (6), /* fcmp */
374 COSTS_N_INSNS (6), /* fmov, fmovr */
375 COSTS_N_INSNS (6), /* fmul */
376 COSTS_N_INSNS (19), /* fdivs */
377 COSTS_N_INSNS (33), /* fdivd */
378 COSTS_N_INSNS (19), /* fsqrts */
379 COSTS_N_INSNS (33), /* fsqrtd */
380 COSTS_N_INSNS (5), /* imul */
381 COSTS_N_INSNS (5), /* imulX */
382 0, /* imul bit factor */
383 COSTS_N_INSNS (26), /* idiv, average of 12 - 41 cycle range */
384 COSTS_N_INSNS (26), /* idivX, average of 12 - 41 cycle range */
385 COSTS_N_INSNS (1), /* movcc/movr */
386 0, /* shift penalty */
390 struct processor_costs niagara3_costs = {
391 COSTS_N_INSNS (3), /* int load */
392 COSTS_N_INSNS (3), /* int signed load */
393 COSTS_N_INSNS (3), /* int zeroed load */
394 COSTS_N_INSNS (3), /* float load */
395 COSTS_N_INSNS (9), /* fmov, fneg, fabs */
396 COSTS_N_INSNS (9), /* fadd, fsub */
397 COSTS_N_INSNS (9), /* fcmp */
398 COSTS_N_INSNS (9), /* fmov, fmovr */
399 COSTS_N_INSNS (9), /* fmul */
400 COSTS_N_INSNS (23), /* fdivs */
401 COSTS_N_INSNS (37), /* fdivd */
402 COSTS_N_INSNS (23), /* fsqrts */
403 COSTS_N_INSNS (37), /* fsqrtd */
404 COSTS_N_INSNS (9), /* imul */
405 COSTS_N_INSNS (9), /* imulX */
406 0, /* imul bit factor */
407 COSTS_N_INSNS (31), /* idiv, average of 17 - 45 cycle range */
408 COSTS_N_INSNS (30), /* idivX, average of 16 - 44 cycle range */
409 COSTS_N_INSNS (1), /* movcc/movr */
410 0, /* shift penalty */
414 struct processor_costs niagara4_costs = {
415 COSTS_N_INSNS (5), /* int load */
416 COSTS_N_INSNS (5), /* int signed load */
417 COSTS_N_INSNS (5), /* int zeroed load */
418 COSTS_N_INSNS (5), /* float load */
419 COSTS_N_INSNS (11), /* fmov, fneg, fabs */
420 COSTS_N_INSNS (11), /* fadd, fsub */
421 COSTS_N_INSNS (11), /* fcmp */
422 COSTS_N_INSNS (11), /* fmov, fmovr */
423 COSTS_N_INSNS (11), /* fmul */
424 COSTS_N_INSNS (24), /* fdivs */
425 COSTS_N_INSNS (37), /* fdivd */
426 COSTS_N_INSNS (24), /* fsqrts */
427 COSTS_N_INSNS (37), /* fsqrtd */
428 COSTS_N_INSNS (12), /* imul */
429 COSTS_N_INSNS (12), /* imulX */
430 0, /* imul bit factor */
431 COSTS_N_INSNS (50), /* idiv, average of 41 - 60 cycle range */
432 COSTS_N_INSNS (35), /* idivX, average of 26 - 44 cycle range */
433 COSTS_N_INSNS (1), /* movcc/movr */
434 0, /* shift penalty */
437 static const struct processor_costs *sparc_costs = &cypress_costs;
439 #ifdef HAVE_AS_RELAX_OPTION
440 /* If 'as' and 'ld' are relaxing tail call insns into branch always, use
441 "or %o7,%g0,X; call Y; or X,%g0,%o7" always, so that it can be optimized.
442 With sethi/jmp, neither 'as' nor 'ld' has an easy way how to find out if
443 somebody does not branch between the sethi and jmp. */
444 #define LEAF_SIBCALL_SLOT_RESERVED_P 1
446 #define LEAF_SIBCALL_SLOT_RESERVED_P \
447 ((TARGET_ARCH64 && !TARGET_CM_MEDLOW) || flag_pic)
450 /* Vector to say how input registers are mapped to output registers.
451 HARD_FRAME_POINTER_REGNUM cannot be remapped by this function to
452 eliminate it. You must use -fomit-frame-pointer to get that. */
453 char leaf_reg_remap[] =
454 { 0, 1, 2, 3, 4, 5, 6, 7,
455 -1, -1, -1, -1, -1, -1, 14, -1,
456 -1, -1, -1, -1, -1, -1, -1, -1,
457 8, 9, 10, 11, 12, 13, -1, 15,
459 32, 33, 34, 35, 36, 37, 38, 39,
460 40, 41, 42, 43, 44, 45, 46, 47,
461 48, 49, 50, 51, 52, 53, 54, 55,
462 56, 57, 58, 59, 60, 61, 62, 63,
463 64, 65, 66, 67, 68, 69, 70, 71,
464 72, 73, 74, 75, 76, 77, 78, 79,
465 80, 81, 82, 83, 84, 85, 86, 87,
466 88, 89, 90, 91, 92, 93, 94, 95,
467 96, 97, 98, 99, 100, 101, 102};
469 /* Vector, indexed by hard register number, which contains 1
470 for a register that is allowable in a candidate for leaf
471 function treatment. */
472 char sparc_leaf_regs[] =
473 { 1, 1, 1, 1, 1, 1, 1, 1,
474 0, 0, 0, 0, 0, 0, 1, 0,
475 0, 0, 0, 0, 0, 0, 0, 0,
476 1, 1, 1, 1, 1, 1, 0, 1,
477 1, 1, 1, 1, 1, 1, 1, 1,
478 1, 1, 1, 1, 1, 1, 1, 1,
479 1, 1, 1, 1, 1, 1, 1, 1,
480 1, 1, 1, 1, 1, 1, 1, 1,
481 1, 1, 1, 1, 1, 1, 1, 1,
482 1, 1, 1, 1, 1, 1, 1, 1,
483 1, 1, 1, 1, 1, 1, 1, 1,
484 1, 1, 1, 1, 1, 1, 1, 1,
485 1, 1, 1, 1, 1, 1, 1};
487 struct GTY(()) machine_function
489 /* Size of the frame of the function. */
490 HOST_WIDE_INT frame_size;
492 /* Size of the frame of the function minus the register window save area
493 and the outgoing argument area. */
494 HOST_WIDE_INT apparent_frame_size;
496 /* Register we pretend the frame pointer is allocated to. Normally, this
497 is %fp, but if we are in a leaf procedure, this is (%sp + offset). We
498 record "offset" separately as it may be too big for (reg + disp). */
500 HOST_WIDE_INT frame_base_offset;
502 /* Some local-dynamic TLS symbol name. */
503 const char *some_ld_name;
505 /* Number of global or FP registers to be saved (as 4-byte quantities). */
506 int n_global_fp_regs;
508 /* True if the current function is leaf and uses only leaf regs,
509 so that the SPARC leaf function optimization can be applied.
510 Private version of crtl->uses_only_leaf_regs, see
511 sparc_expand_prologue for the rationale. */
514 /* True if the prologue saves local or in registers. */
515 bool save_local_in_regs_p;
517 /* True if the data calculated by sparc_expand_prologue are valid. */
518 bool prologue_data_valid_p;
521 #define sparc_frame_size cfun->machine->frame_size
522 #define sparc_apparent_frame_size cfun->machine->apparent_frame_size
523 #define sparc_frame_base_reg cfun->machine->frame_base_reg
524 #define sparc_frame_base_offset cfun->machine->frame_base_offset
525 #define sparc_n_global_fp_regs cfun->machine->n_global_fp_regs
526 #define sparc_leaf_function_p cfun->machine->leaf_function_p
527 #define sparc_save_local_in_regs_p cfun->machine->save_local_in_regs_p
528 #define sparc_prologue_data_valid_p cfun->machine->prologue_data_valid_p
530 /* 1 if the next opcode is to be specially indented. */
531 int sparc_indent_opcode = 0;
533 static void sparc_option_override (void);
534 static void sparc_init_modes (void);
535 static void scan_record_type (const_tree, int *, int *, int *);
536 static int function_arg_slotno (const CUMULATIVE_ARGS *, enum machine_mode,
537 const_tree, bool, bool, int *, int *);
539 static int supersparc_adjust_cost (rtx, rtx, rtx, int);
540 static int hypersparc_adjust_cost (rtx, rtx, rtx, int);
542 static void sparc_emit_set_const32 (rtx, rtx);
543 static void sparc_emit_set_const64 (rtx, rtx);
544 static void sparc_output_addr_vec (rtx);
545 static void sparc_output_addr_diff_vec (rtx);
546 static void sparc_output_deferred_case_vectors (void);
547 static bool sparc_legitimate_address_p (enum machine_mode, rtx, bool);
548 static bool sparc_legitimate_constant_p (enum machine_mode, rtx);
549 static rtx sparc_builtin_saveregs (void);
550 static int epilogue_renumber (rtx *, int);
551 static bool sparc_assemble_integer (rtx, unsigned int, int);
552 static int set_extends (rtx);
553 static void sparc_asm_function_prologue (FILE *, HOST_WIDE_INT);
554 static void sparc_asm_function_epilogue (FILE *, HOST_WIDE_INT);
555 #ifdef TARGET_SOLARIS
556 static void sparc_solaris_elf_asm_named_section (const char *, unsigned int,
557 tree) ATTRIBUTE_UNUSED;
559 static int sparc_adjust_cost (rtx, rtx, rtx, int);
560 static int sparc_issue_rate (void);
561 static void sparc_sched_init (FILE *, int, int);
562 static int sparc_use_sched_lookahead (void);
564 static void emit_soft_tfmode_libcall (const char *, int, rtx *);
565 static void emit_soft_tfmode_binop (enum rtx_code, rtx *);
566 static void emit_soft_tfmode_unop (enum rtx_code, rtx *);
567 static void emit_soft_tfmode_cvt (enum rtx_code, rtx *);
568 static void emit_hard_tfmode_operation (enum rtx_code, rtx *);
570 static bool sparc_function_ok_for_sibcall (tree, tree);
571 static void sparc_init_libfuncs (void);
572 static void sparc_init_builtins (void);
573 static void sparc_fpu_init_builtins (void);
574 static void sparc_vis_init_builtins (void);
575 static tree sparc_builtin_decl (unsigned, bool);
576 static rtx sparc_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
577 static tree sparc_fold_builtin (tree, int, tree *, bool);
578 static void sparc_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
579 HOST_WIDE_INT, tree);
580 static bool sparc_can_output_mi_thunk (const_tree, HOST_WIDE_INT,
581 HOST_WIDE_INT, const_tree);
582 static struct machine_function * sparc_init_machine_status (void);
583 static bool sparc_cannot_force_const_mem (enum machine_mode, rtx);
584 static rtx sparc_tls_get_addr (void);
585 static rtx sparc_tls_got (void);
586 static const char *get_some_local_dynamic_name (void);
587 static int get_some_local_dynamic_name_1 (rtx *, void *);
588 static int sparc_register_move_cost (enum machine_mode,
589 reg_class_t, reg_class_t);
590 static bool sparc_rtx_costs (rtx, int, int, int, int *, bool);
591 static rtx sparc_function_value (const_tree, const_tree, bool);
592 static rtx sparc_libcall_value (enum machine_mode, const_rtx);
593 static bool sparc_function_value_regno_p (const unsigned int);
594 static rtx sparc_struct_value_rtx (tree, int);
595 static enum machine_mode sparc_promote_function_mode (const_tree, enum machine_mode,
596 int *, const_tree, int);
597 static bool sparc_return_in_memory (const_tree, const_tree);
598 static bool sparc_strict_argument_naming (cumulative_args_t);
599 static void sparc_va_start (tree, rtx);
600 static tree sparc_gimplify_va_arg (tree, tree, gimple_seq *, gimple_seq *);
601 static bool sparc_vector_mode_supported_p (enum machine_mode);
602 static bool sparc_tls_referenced_p (rtx);
603 static rtx sparc_legitimize_tls_address (rtx);
604 static rtx sparc_legitimize_pic_address (rtx, rtx);
605 static rtx sparc_legitimize_address (rtx, rtx, enum machine_mode);
606 static rtx sparc_delegitimize_address (rtx);
607 static bool sparc_mode_dependent_address_p (const_rtx, addr_space_t);
608 static bool sparc_pass_by_reference (cumulative_args_t,
609 enum machine_mode, const_tree, bool);
610 static void sparc_function_arg_advance (cumulative_args_t,
611 enum machine_mode, const_tree, bool);
612 static rtx sparc_function_arg_1 (cumulative_args_t,
613 enum machine_mode, const_tree, bool, bool);
614 static rtx sparc_function_arg (cumulative_args_t,
615 enum machine_mode, const_tree, bool);
616 static rtx sparc_function_incoming_arg (cumulative_args_t,
617 enum machine_mode, const_tree, bool);
618 static unsigned int sparc_function_arg_boundary (enum machine_mode,
620 static int sparc_arg_partial_bytes (cumulative_args_t,
621 enum machine_mode, tree, bool);
622 static void sparc_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
623 static void sparc_file_end (void);
624 static bool sparc_frame_pointer_required (void);
625 static bool sparc_can_eliminate (const int, const int);
626 static rtx sparc_builtin_setjmp_frame_value (void);
627 static void sparc_conditional_register_usage (void);
628 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
629 static const char *sparc_mangle_type (const_tree);
631 static void sparc_trampoline_init (rtx, tree, rtx);
632 static enum machine_mode sparc_preferred_simd_mode (enum machine_mode);
633 static reg_class_t sparc_preferred_reload_class (rtx x, reg_class_t rclass);
634 static bool sparc_print_operand_punct_valid_p (unsigned char);
635 static void sparc_print_operand (FILE *, rtx, int);
636 static void sparc_print_operand_address (FILE *, rtx);
637 static reg_class_t sparc_secondary_reload (bool, rtx, reg_class_t,
639 secondary_reload_info *);
640 static enum machine_mode sparc_cstore_mode (enum insn_code icode);
641 static void sparc_atomic_assign_expand_fenv (tree *, tree *, tree *);
643 #ifdef SUBTARGET_ATTRIBUTE_TABLE
644 /* Table of valid machine attributes. */
645 static const struct attribute_spec sparc_attribute_table[] =
647 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
649 SUBTARGET_ATTRIBUTE_TABLE,
650 { NULL, 0, 0, false, false, false, NULL, false }
654 /* Option handling. */
657 enum cmodel sparc_cmodel;
659 char sparc_hard_reg_printed[8];
661 /* Initialize the GCC target structure. */
663 /* The default is to use .half rather than .short for aligned HI objects. */
664 #undef TARGET_ASM_ALIGNED_HI_OP
665 #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
667 #undef TARGET_ASM_UNALIGNED_HI_OP
668 #define TARGET_ASM_UNALIGNED_HI_OP "\t.uahalf\t"
669 #undef TARGET_ASM_UNALIGNED_SI_OP
670 #define TARGET_ASM_UNALIGNED_SI_OP "\t.uaword\t"
671 #undef TARGET_ASM_UNALIGNED_DI_OP
672 #define TARGET_ASM_UNALIGNED_DI_OP "\t.uaxword\t"
674 /* The target hook has to handle DI-mode values. */
675 #undef TARGET_ASM_INTEGER
676 #define TARGET_ASM_INTEGER sparc_assemble_integer
678 #undef TARGET_ASM_FUNCTION_PROLOGUE
679 #define TARGET_ASM_FUNCTION_PROLOGUE sparc_asm_function_prologue
680 #undef TARGET_ASM_FUNCTION_EPILOGUE
681 #define TARGET_ASM_FUNCTION_EPILOGUE sparc_asm_function_epilogue
683 #undef TARGET_SCHED_ADJUST_COST
684 #define TARGET_SCHED_ADJUST_COST sparc_adjust_cost
685 #undef TARGET_SCHED_ISSUE_RATE
686 #define TARGET_SCHED_ISSUE_RATE sparc_issue_rate
687 #undef TARGET_SCHED_INIT
688 #define TARGET_SCHED_INIT sparc_sched_init
689 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
690 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD sparc_use_sched_lookahead
692 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
693 #define TARGET_FUNCTION_OK_FOR_SIBCALL sparc_function_ok_for_sibcall
695 #undef TARGET_INIT_LIBFUNCS
696 #define TARGET_INIT_LIBFUNCS sparc_init_libfuncs
698 #undef TARGET_LEGITIMIZE_ADDRESS
699 #define TARGET_LEGITIMIZE_ADDRESS sparc_legitimize_address
700 #undef TARGET_DELEGITIMIZE_ADDRESS
701 #define TARGET_DELEGITIMIZE_ADDRESS sparc_delegitimize_address
702 #undef TARGET_MODE_DEPENDENT_ADDRESS_P
703 #define TARGET_MODE_DEPENDENT_ADDRESS_P sparc_mode_dependent_address_p
705 #undef TARGET_INIT_BUILTINS
706 #define TARGET_INIT_BUILTINS sparc_init_builtins
707 #undef TARGET_BUILTIN_DECL
708 #define TARGET_BUILTIN_DECL sparc_builtin_decl
709 #undef TARGET_EXPAND_BUILTIN
710 #define TARGET_EXPAND_BUILTIN sparc_expand_builtin
711 #undef TARGET_FOLD_BUILTIN
712 #define TARGET_FOLD_BUILTIN sparc_fold_builtin
715 #undef TARGET_HAVE_TLS
716 #define TARGET_HAVE_TLS true
719 #undef TARGET_CANNOT_FORCE_CONST_MEM
720 #define TARGET_CANNOT_FORCE_CONST_MEM sparc_cannot_force_const_mem
722 #undef TARGET_ASM_OUTPUT_MI_THUNK
723 #define TARGET_ASM_OUTPUT_MI_THUNK sparc_output_mi_thunk
724 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
725 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK sparc_can_output_mi_thunk
727 #undef TARGET_RTX_COSTS
728 #define TARGET_RTX_COSTS sparc_rtx_costs
729 #undef TARGET_ADDRESS_COST
730 #define TARGET_ADDRESS_COST hook_int_rtx_mode_as_bool_0
731 #undef TARGET_REGISTER_MOVE_COST
732 #define TARGET_REGISTER_MOVE_COST sparc_register_move_cost
734 #undef TARGET_PROMOTE_FUNCTION_MODE
735 #define TARGET_PROMOTE_FUNCTION_MODE sparc_promote_function_mode
737 #undef TARGET_FUNCTION_VALUE
738 #define TARGET_FUNCTION_VALUE sparc_function_value
739 #undef TARGET_LIBCALL_VALUE
740 #define TARGET_LIBCALL_VALUE sparc_libcall_value
741 #undef TARGET_FUNCTION_VALUE_REGNO_P
742 #define TARGET_FUNCTION_VALUE_REGNO_P sparc_function_value_regno_p
744 #undef TARGET_STRUCT_VALUE_RTX
745 #define TARGET_STRUCT_VALUE_RTX sparc_struct_value_rtx
746 #undef TARGET_RETURN_IN_MEMORY
747 #define TARGET_RETURN_IN_MEMORY sparc_return_in_memory
748 #undef TARGET_MUST_PASS_IN_STACK
749 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
750 #undef TARGET_PASS_BY_REFERENCE
751 #define TARGET_PASS_BY_REFERENCE sparc_pass_by_reference
752 #undef TARGET_ARG_PARTIAL_BYTES
753 #define TARGET_ARG_PARTIAL_BYTES sparc_arg_partial_bytes
754 #undef TARGET_FUNCTION_ARG_ADVANCE
755 #define TARGET_FUNCTION_ARG_ADVANCE sparc_function_arg_advance
756 #undef TARGET_FUNCTION_ARG
757 #define TARGET_FUNCTION_ARG sparc_function_arg
758 #undef TARGET_FUNCTION_INCOMING_ARG
759 #define TARGET_FUNCTION_INCOMING_ARG sparc_function_incoming_arg
760 #undef TARGET_FUNCTION_ARG_BOUNDARY
761 #define TARGET_FUNCTION_ARG_BOUNDARY sparc_function_arg_boundary
763 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
764 #define TARGET_EXPAND_BUILTIN_SAVEREGS sparc_builtin_saveregs
765 #undef TARGET_STRICT_ARGUMENT_NAMING
766 #define TARGET_STRICT_ARGUMENT_NAMING sparc_strict_argument_naming
768 #undef TARGET_EXPAND_BUILTIN_VA_START
769 #define TARGET_EXPAND_BUILTIN_VA_START sparc_va_start
770 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
771 #define TARGET_GIMPLIFY_VA_ARG_EXPR sparc_gimplify_va_arg
773 #undef TARGET_VECTOR_MODE_SUPPORTED_P
774 #define TARGET_VECTOR_MODE_SUPPORTED_P sparc_vector_mode_supported_p
776 #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE
777 #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE sparc_preferred_simd_mode
779 #ifdef SUBTARGET_INSERT_ATTRIBUTES
780 #undef TARGET_INSERT_ATTRIBUTES
781 #define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
784 #ifdef SUBTARGET_ATTRIBUTE_TABLE
785 #undef TARGET_ATTRIBUTE_TABLE
786 #define TARGET_ATTRIBUTE_TABLE sparc_attribute_table
789 #undef TARGET_RELAXED_ORDERING
790 #define TARGET_RELAXED_ORDERING SPARC_RELAXED_ORDERING
792 #undef TARGET_OPTION_OVERRIDE
793 #define TARGET_OPTION_OVERRIDE sparc_option_override
795 #if TARGET_GNU_TLS && defined(HAVE_AS_SPARC_UA_PCREL)
796 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
797 #define TARGET_ASM_OUTPUT_DWARF_DTPREL sparc_output_dwarf_dtprel
800 #undef TARGET_ASM_FILE_END
801 #define TARGET_ASM_FILE_END sparc_file_end
803 #undef TARGET_FRAME_POINTER_REQUIRED
804 #define TARGET_FRAME_POINTER_REQUIRED sparc_frame_pointer_required
806 #undef TARGET_BUILTIN_SETJMP_FRAME_VALUE
807 #define TARGET_BUILTIN_SETJMP_FRAME_VALUE sparc_builtin_setjmp_frame_value
809 #undef TARGET_CAN_ELIMINATE
810 #define TARGET_CAN_ELIMINATE sparc_can_eliminate
812 #undef TARGET_PREFERRED_RELOAD_CLASS
813 #define TARGET_PREFERRED_RELOAD_CLASS sparc_preferred_reload_class
815 #undef TARGET_SECONDARY_RELOAD
816 #define TARGET_SECONDARY_RELOAD sparc_secondary_reload
818 #undef TARGET_CONDITIONAL_REGISTER_USAGE
819 #define TARGET_CONDITIONAL_REGISTER_USAGE sparc_conditional_register_usage
821 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
822 #undef TARGET_MANGLE_TYPE
823 #define TARGET_MANGLE_TYPE sparc_mangle_type
826 #undef TARGET_LEGITIMATE_ADDRESS_P
827 #define TARGET_LEGITIMATE_ADDRESS_P sparc_legitimate_address_p
829 #undef TARGET_LEGITIMATE_CONSTANT_P
830 #define TARGET_LEGITIMATE_CONSTANT_P sparc_legitimate_constant_p
832 #undef TARGET_TRAMPOLINE_INIT
833 #define TARGET_TRAMPOLINE_INIT sparc_trampoline_init
835 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
836 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P sparc_print_operand_punct_valid_p
837 #undef TARGET_PRINT_OPERAND
838 #define TARGET_PRINT_OPERAND sparc_print_operand
839 #undef TARGET_PRINT_OPERAND_ADDRESS
840 #define TARGET_PRINT_OPERAND_ADDRESS sparc_print_operand_address
842 /* The value stored by LDSTUB. */
843 #undef TARGET_ATOMIC_TEST_AND_SET_TRUEVAL
844 #define TARGET_ATOMIC_TEST_AND_SET_TRUEVAL 0xff
846 #undef TARGET_CSTORE_MODE
847 #define TARGET_CSTORE_MODE sparc_cstore_mode
849 #undef TARGET_ATOMIC_ASSIGN_EXPAND_FENV
850 #define TARGET_ATOMIC_ASSIGN_EXPAND_FENV sparc_atomic_assign_expand_fenv
852 struct gcc_target targetm = TARGET_INITIALIZER;
854 /* Return the memory reference contained in X if any, zero otherwise. */
859 if (GET_CODE (x) == SIGN_EXTEND || GET_CODE (x) == ZERO_EXTEND)
868 /* We use a machine specific pass to enable workarounds for errata.
869 We need to have the (essentially) final form of the insn stream in order
870 to properly detect the various hazards. Therefore, this machine specific
871 pass runs as late as possible. The pass is inserted in the pass pipeline
872 at the end of sparc_option_override. */
875 sparc_do_work_around_errata (void)
879 /* Force all instructions to be split into their final form. */
880 split_all_insns_noflow ();
882 /* Now look for specific patterns in the insn stream. */
883 for (insn = get_insns (); insn; insn = next)
885 bool insert_nop = false;
888 /* Look into the instruction in a delay slot. */
889 if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
890 insn = XVECEXP (PATTERN (insn), 0, 1);
892 /* Look for a single-word load into an odd-numbered FP register. */
894 && NONJUMP_INSN_P (insn)
895 && (set = single_set (insn)) != NULL_RTX
896 && GET_MODE_SIZE (GET_MODE (SET_SRC (set))) == 4
897 && MEM_P (SET_SRC (set))
898 && REG_P (SET_DEST (set))
899 && REGNO (SET_DEST (set)) > 31
900 && REGNO (SET_DEST (set)) % 2 != 0)
902 /* The wrong dependency is on the enclosing double register. */
903 const unsigned int x = REGNO (SET_DEST (set)) - 1;
904 unsigned int src1, src2, dest;
907 next = next_active_insn (insn);
910 /* If the insn is a branch, then it cannot be problematic. */
911 if (!NONJUMP_INSN_P (next) || GET_CODE (PATTERN (next)) == SEQUENCE)
915 code = INSN_CODE (next);
919 case CODE_FOR_adddf3:
920 case CODE_FOR_subdf3:
921 case CODE_FOR_muldf3:
922 case CODE_FOR_divdf3:
923 dest = REGNO (recog_data.operand[0]);
924 src1 = REGNO (recog_data.operand[1]);
925 src2 = REGNO (recog_data.operand[2]);
930 FPOPd %f{x,y}, %f{y,x}, %f{x,y} */
931 if ((src1 == x || src2 == x)
932 && (dest == src1 || dest == src2))
939 FPOPd %fx, %fx, %fx */
942 && (code == CODE_FOR_adddf3 || code == CODE_FOR_muldf3))
947 case CODE_FOR_sqrtdf2:
948 dest = REGNO (recog_data.operand[0]);
949 src1 = REGNO (recog_data.operand[1]);
953 if (src1 == x && dest == src1)
962 /* Look for a single-word load into an integer register. */
963 else if (sparc_fix_ut699
964 && NONJUMP_INSN_P (insn)
965 && (set = single_set (insn)) != NULL_RTX
966 && GET_MODE_SIZE (GET_MODE (SET_SRC (set))) <= 4
967 && mem_ref (SET_SRC (set)) != NULL_RTX
968 && REG_P (SET_DEST (set))
969 && REGNO (SET_DEST (set)) < 32)
971 /* There is no problem if the second memory access has a data
972 dependency on the first single-cycle load. */
973 rtx x = SET_DEST (set);
975 next = next_active_insn (insn);
978 /* If the insn is a branch, then it cannot be problematic. */
979 if (!NONJUMP_INSN_P (next) || GET_CODE (PATTERN (next)) == SEQUENCE)
982 /* Look for a second memory access to/from an integer register. */
983 if ((set = single_set (next)) != NULL_RTX)
985 rtx src = SET_SRC (set);
986 rtx dest = SET_DEST (set);
989 /* LDD is affected. */
990 if ((mem = mem_ref (src)) != NULL_RTX
993 && !reg_mentioned_p (x, XEXP (mem, 0)))
996 /* STD is *not* affected. */
997 else if (MEM_P (dest)
998 && GET_MODE_SIZE (GET_MODE (dest)) <= 4
999 && (src == CONST0_RTX (GET_MODE (dest))
1002 && REGNO (src) != REGNO (x)))
1003 && !reg_mentioned_p (x, XEXP (dest, 0)))
1008 /* Look for a single-word load/operation into an FP register. */
1009 else if (sparc_fix_ut699
1010 && NONJUMP_INSN_P (insn)
1011 && (set = single_set (insn)) != NULL_RTX
1012 && GET_MODE_SIZE (GET_MODE (SET_SRC (set))) == 4
1013 && REG_P (SET_DEST (set))
1014 && REGNO (SET_DEST (set)) > 31)
1016 /* Number of instructions in the problematic window. */
1017 const int n_insns = 4;
1018 /* The problematic combination is with the sibling FP register. */
1019 const unsigned int x = REGNO (SET_DEST (set));
1020 const unsigned int y = x ^ 1;
1024 next = next_active_insn (insn);
1027 /* If the insn is a branch, then it cannot be problematic. */
1028 if (!NONJUMP_INSN_P (next) || GET_CODE (PATTERN (next)) == SEQUENCE)
1031 /* Look for a second load/operation into the sibling FP register. */
1032 if (!((set = single_set (next)) != NULL_RTX
1033 && GET_MODE_SIZE (GET_MODE (SET_SRC (set))) == 4
1034 && REG_P (SET_DEST (set))
1035 && REGNO (SET_DEST (set)) == y))
1038 /* Look for a (possible) store from the FP register in the next N
1039 instructions, but bail out if it is again modified or if there
1040 is a store from the sibling FP register before this store. */
1041 for (after = next, i = 0; i < n_insns; i++)
1045 after = next_active_insn (after);
1049 /* This is a branch with an empty delay slot. */
1050 if (!NONJUMP_INSN_P (after))
1057 /* This is a branch with a filled delay slot. */
1058 else if (GET_CODE (PATTERN (after)) == SEQUENCE)
1063 after = XVECEXP (PATTERN (after), 0, 1);
1065 /* This is a regular instruction. */
1069 if (after && (set = single_set (after)) != NULL_RTX)
1071 const rtx src = SET_SRC (set);
1072 const rtx dest = SET_DEST (set);
1073 const unsigned int size = GET_MODE_SIZE (GET_MODE (dest));
1075 /* If the FP register is again modified before the store,
1076 then the store isn't affected. */
1078 && (REGNO (dest) == x
1079 || (REGNO (dest) == y && size == 8)))
1082 if (MEM_P (dest) && REG_P (src))
1084 /* If there is a store from the sibling FP register
1085 before the store, then the store is not affected. */
1086 if (REGNO (src) == y || (REGNO (src) == x && size == 8))
1089 /* Otherwise, the store is affected. */
1090 if (REGNO (src) == x && size == 4)
1098 /* If we have a branch in the first M instructions, then we
1099 cannot see the (M+2)th instruction so we play safe. */
1100 if (branch_p && i <= (n_insns - 2))
1109 next = NEXT_INSN (insn);
1112 emit_insn_before (gen_nop (), next);
1120 const pass_data pass_data_work_around_errata =
1122 RTL_PASS, /* type */
1123 "errata", /* name */
1124 OPTGROUP_NONE, /* optinfo_flags */
1125 true, /* has_execute */
1126 TV_MACH_DEP, /* tv_id */
1127 0, /* properties_required */
1128 0, /* properties_provided */
1129 0, /* properties_destroyed */
1130 0, /* todo_flags_start */
1131 0, /* todo_flags_finish */
1134 class pass_work_around_errata : public rtl_opt_pass
1137 pass_work_around_errata(gcc::context *ctxt)
1138 : rtl_opt_pass(pass_data_work_around_errata, ctxt)
1141 /* opt_pass methods: */
1142 virtual bool gate (function *)
1144 /* The only errata we handle are those of the AT697F and UT699. */
1145 return sparc_fix_at697f != 0 || sparc_fix_ut699 != 0;
1148 virtual unsigned int execute (function *)
1150 return sparc_do_work_around_errata ();
1153 }; // class pass_work_around_errata
1158 make_pass_work_around_errata (gcc::context *ctxt)
1160 return new pass_work_around_errata (ctxt);
1163 /* Helpers for TARGET_DEBUG_OPTIONS. */
1165 dump_target_flag_bits (const int flags)
1167 if (flags & MASK_64BIT)
1168 fprintf (stderr, "64BIT ");
1169 if (flags & MASK_APP_REGS)
1170 fprintf (stderr, "APP_REGS ");
1171 if (flags & MASK_FASTER_STRUCTS)
1172 fprintf (stderr, "FASTER_STRUCTS ");
1173 if (flags & MASK_FLAT)
1174 fprintf (stderr, "FLAT ");
1175 if (flags & MASK_FMAF)
1176 fprintf (stderr, "FMAF ");
1177 if (flags & MASK_FPU)
1178 fprintf (stderr, "FPU ");
1179 if (flags & MASK_HARD_QUAD)
1180 fprintf (stderr, "HARD_QUAD ");
1181 if (flags & MASK_POPC)
1182 fprintf (stderr, "POPC ");
1183 if (flags & MASK_PTR64)
1184 fprintf (stderr, "PTR64 ");
1185 if (flags & MASK_STACK_BIAS)
1186 fprintf (stderr, "STACK_BIAS ");
1187 if (flags & MASK_UNALIGNED_DOUBLES)
1188 fprintf (stderr, "UNALIGNED_DOUBLES ");
1189 if (flags & MASK_V8PLUS)
1190 fprintf (stderr, "V8PLUS ");
1191 if (flags & MASK_VIS)
1192 fprintf (stderr, "VIS ");
1193 if (flags & MASK_VIS2)
1194 fprintf (stderr, "VIS2 ");
1195 if (flags & MASK_VIS3)
1196 fprintf (stderr, "VIS3 ");
1197 if (flags & MASK_CBCOND)
1198 fprintf (stderr, "CBCOND ");
1199 if (flags & MASK_DEPRECATED_V8_INSNS)
1200 fprintf (stderr, "DEPRECATED_V8_INSNS ");
1201 if (flags & MASK_SPARCLET)
1202 fprintf (stderr, "SPARCLET ");
1203 if (flags & MASK_SPARCLITE)
1204 fprintf (stderr, "SPARCLITE ");
1205 if (flags & MASK_V8)
1206 fprintf (stderr, "V8 ");
1207 if (flags & MASK_V9)
1208 fprintf (stderr, "V9 ");
1212 dump_target_flags (const char *prefix, const int flags)
1214 fprintf (stderr, "%s: (%08x) [ ", prefix, flags);
1215 dump_target_flag_bits (flags);
1216 fprintf(stderr, "]\n");
1219 /* Validate and override various options, and do some machine dependent
1223 sparc_option_override (void)
1225 static struct code_model {
1226 const char *const name;
1227 const enum cmodel value;
1228 } const cmodels[] = {
1230 { "medlow", CM_MEDLOW },
1231 { "medmid", CM_MEDMID },
1232 { "medany", CM_MEDANY },
1233 { "embmedany", CM_EMBMEDANY },
1234 { NULL, (enum cmodel) 0 }
1236 const struct code_model *cmodel;
1237 /* Map TARGET_CPU_DEFAULT to value for -m{cpu,tune}=. */
1238 static struct cpu_default {
1240 const enum processor_type processor;
1241 } const cpu_default[] = {
1242 /* There must be one entry here for each TARGET_CPU value. */
1243 { TARGET_CPU_sparc, PROCESSOR_CYPRESS },
1244 { TARGET_CPU_v8, PROCESSOR_V8 },
1245 { TARGET_CPU_supersparc, PROCESSOR_SUPERSPARC },
1246 { TARGET_CPU_hypersparc, PROCESSOR_HYPERSPARC },
1247 { TARGET_CPU_leon, PROCESSOR_LEON },
1248 { TARGET_CPU_leon3, PROCESSOR_LEON3 },
1249 { TARGET_CPU_sparclite, PROCESSOR_F930 },
1250 { TARGET_CPU_sparclite86x, PROCESSOR_SPARCLITE86X },
1251 { TARGET_CPU_sparclet, PROCESSOR_TSC701 },
1252 { TARGET_CPU_v9, PROCESSOR_V9 },
1253 { TARGET_CPU_ultrasparc, PROCESSOR_ULTRASPARC },
1254 { TARGET_CPU_ultrasparc3, PROCESSOR_ULTRASPARC3 },
1255 { TARGET_CPU_niagara, PROCESSOR_NIAGARA },
1256 { TARGET_CPU_niagara2, PROCESSOR_NIAGARA2 },
1257 { TARGET_CPU_niagara3, PROCESSOR_NIAGARA3 },
1258 { TARGET_CPU_niagara4, PROCESSOR_NIAGARA4 },
1259 { -1, PROCESSOR_V7 }
1261 const struct cpu_default *def;
1262 /* Table of values for -m{cpu,tune}=. This must match the order of
1263 the enum processor_type in sparc-opts.h. */
1264 static struct cpu_table {
1265 const char *const name;
1268 } const cpu_table[] = {
1269 { "v7", MASK_ISA, 0 },
1270 { "cypress", MASK_ISA, 0 },
1271 { "v8", MASK_ISA, MASK_V8 },
1272 /* TI TMS390Z55 supersparc */
1273 { "supersparc", MASK_ISA, MASK_V8 },
1274 { "hypersparc", MASK_ISA, MASK_V8|MASK_FPU },
1275 { "leon", MASK_ISA, MASK_V8|MASK_LEON|MASK_FPU },
1276 { "leon3", MASK_ISA, MASK_V8|MASK_LEON3|MASK_FPU },
1277 { "sparclite", MASK_ISA, MASK_SPARCLITE },
1278 /* The Fujitsu MB86930 is the original sparclite chip, with no FPU. */
1279 { "f930", MASK_ISA|MASK_FPU, MASK_SPARCLITE },
1280 /* The Fujitsu MB86934 is the recent sparclite chip, with an FPU. */
1281 { "f934", MASK_ISA, MASK_SPARCLITE|MASK_FPU },
1282 { "sparclite86x", MASK_ISA|MASK_FPU, MASK_SPARCLITE },
1283 { "sparclet", MASK_ISA, MASK_SPARCLET },
1284 /* TEMIC sparclet */
1285 { "tsc701", MASK_ISA, MASK_SPARCLET },
1286 { "v9", MASK_ISA, MASK_V9 },
1287 /* UltraSPARC I, II, IIi */
1288 { "ultrasparc", MASK_ISA,
1289 /* Although insns using %y are deprecated, it is a clear win. */
1290 MASK_V9|MASK_DEPRECATED_V8_INSNS },
1291 /* UltraSPARC III */
1292 /* ??? Check if %y issue still holds true. */
1293 { "ultrasparc3", MASK_ISA,
1294 MASK_V9|MASK_DEPRECATED_V8_INSNS|MASK_VIS2 },
1296 { "niagara", MASK_ISA,
1297 MASK_V9|MASK_DEPRECATED_V8_INSNS },
1299 { "niagara2", MASK_ISA,
1300 MASK_V9|MASK_POPC|MASK_VIS2 },
1302 { "niagara3", MASK_ISA,
1303 MASK_V9|MASK_POPC|MASK_VIS2|MASK_VIS3|MASK_FMAF },
1305 { "niagara4", MASK_ISA,
1306 MASK_V9|MASK_POPC|MASK_VIS2|MASK_VIS3|MASK_FMAF|MASK_CBCOND },
1308 const struct cpu_table *cpu;
1312 if (sparc_debug_string != NULL)
1317 p = ASTRDUP (sparc_debug_string);
1318 while ((q = strtok (p, ",")) != NULL)
1332 if (! strcmp (q, "all"))
1333 mask = MASK_DEBUG_ALL;
1334 else if (! strcmp (q, "options"))
1335 mask = MASK_DEBUG_OPTIONS;
1337 error ("unknown -mdebug-%s switch", q);
1340 sparc_debug &= ~mask;
1342 sparc_debug |= mask;
1346 if (TARGET_DEBUG_OPTIONS)
1348 dump_target_flags("Initial target_flags", target_flags);
1349 dump_target_flags("target_flags_explicit", target_flags_explicit);
1352 #ifdef SUBTARGET_OVERRIDE_OPTIONS
1353 SUBTARGET_OVERRIDE_OPTIONS;
1356 #ifndef SPARC_BI_ARCH
1357 /* Check for unsupported architecture size. */
1358 if (! TARGET_64BIT != DEFAULT_ARCH32_P)
1359 error ("%s is not supported by this configuration",
1360 DEFAULT_ARCH32_P ? "-m64" : "-m32");
1363 /* We force all 64bit archs to use 128 bit long double */
1364 if (TARGET_64BIT && ! TARGET_LONG_DOUBLE_128)
1366 error ("-mlong-double-64 not allowed with -m64");
1367 target_flags |= MASK_LONG_DOUBLE_128;
1370 /* Code model selection. */
1371 sparc_cmodel = SPARC_DEFAULT_CMODEL;
1373 #ifdef SPARC_BI_ARCH
1375 sparc_cmodel = CM_32;
1378 if (sparc_cmodel_string != NULL)
1382 for (cmodel = &cmodels[0]; cmodel->name; cmodel++)
1383 if (strcmp (sparc_cmodel_string, cmodel->name) == 0)
1385 if (cmodel->name == NULL)
1386 error ("bad value (%s) for -mcmodel= switch", sparc_cmodel_string);
1388 sparc_cmodel = cmodel->value;
1391 error ("-mcmodel= is not supported on 32 bit systems");
1394 /* Check that -fcall-saved-REG wasn't specified for out registers. */
1395 for (i = 8; i < 16; i++)
1396 if (!call_used_regs [i])
1398 error ("-fcall-saved-REG is not supported for out registers");
1399 call_used_regs [i] = 1;
1402 fpu = target_flags & MASK_FPU; /* save current -mfpu status */
1404 /* Set the default CPU. */
1405 if (!global_options_set.x_sparc_cpu_and_features)
1407 for (def = &cpu_default[0]; def->cpu != -1; ++def)
1408 if (def->cpu == TARGET_CPU_DEFAULT)
1410 gcc_assert (def->cpu != -1);
1411 sparc_cpu_and_features = def->processor;
1414 if (!global_options_set.x_sparc_cpu)
1415 sparc_cpu = sparc_cpu_and_features;
1417 cpu = &cpu_table[(int) sparc_cpu_and_features];
1419 if (TARGET_DEBUG_OPTIONS)
1421 fprintf (stderr, "sparc_cpu_and_features: %s\n", cpu->name);
1422 fprintf (stderr, "sparc_cpu: %s\n",
1423 cpu_table[(int) sparc_cpu].name);
1424 dump_target_flags ("cpu->disable", cpu->disable);
1425 dump_target_flags ("cpu->enable", cpu->enable);
1428 target_flags &= ~cpu->disable;
1429 target_flags |= (cpu->enable
1430 #ifndef HAVE_AS_FMAF_HPC_VIS3
1431 & ~(MASK_FMAF | MASK_VIS3)
1433 #ifndef HAVE_AS_SPARC4
1436 #ifndef HAVE_AS_LEON
1437 & ~(MASK_LEON | MASK_LEON3)
1441 /* If -mfpu or -mno-fpu was explicitly used, don't override with
1442 the processor default. */
1443 if (target_flags_explicit & MASK_FPU)
1444 target_flags = (target_flags & ~MASK_FPU) | fpu;
1446 /* -mvis2 implies -mvis */
1448 target_flags |= MASK_VIS;
1450 /* -mvis3 implies -mvis2 and -mvis */
1452 target_flags |= MASK_VIS2 | MASK_VIS;
1454 /* Don't allow -mvis, -mvis2, -mvis3, or -mfmaf if FPU is
1457 target_flags &= ~(MASK_VIS | MASK_VIS2 | MASK_VIS3 | MASK_FMAF);
1459 /* -mvis assumes UltraSPARC+, so we are sure v9 instructions
1461 -m64 also implies v9. */
1462 if (TARGET_VIS || TARGET_ARCH64)
1464 target_flags |= MASK_V9;
1465 target_flags &= ~(MASK_V8 | MASK_SPARCLET | MASK_SPARCLITE);
1468 /* -mvis also implies -mv8plus on 32-bit */
1469 if (TARGET_VIS && ! TARGET_ARCH64)
1470 target_flags |= MASK_V8PLUS;
1472 /* Use the deprecated v8 insns for sparc64 in 32 bit mode. */
1473 if (TARGET_V9 && TARGET_ARCH32)
1474 target_flags |= MASK_DEPRECATED_V8_INSNS;
1476 /* V8PLUS requires V9, makes no sense in 64 bit mode. */
1477 if (! TARGET_V9 || TARGET_ARCH64)
1478 target_flags &= ~MASK_V8PLUS;
1480 /* Don't use stack biasing in 32 bit mode. */
1482 target_flags &= ~MASK_STACK_BIAS;
1484 /* Supply a default value for align_functions. */
1485 if (align_functions == 0
1486 && (sparc_cpu == PROCESSOR_ULTRASPARC
1487 || sparc_cpu == PROCESSOR_ULTRASPARC3
1488 || sparc_cpu == PROCESSOR_NIAGARA
1489 || sparc_cpu == PROCESSOR_NIAGARA2
1490 || sparc_cpu == PROCESSOR_NIAGARA3
1491 || sparc_cpu == PROCESSOR_NIAGARA4))
1492 align_functions = 32;
1494 /* Validate PCC_STRUCT_RETURN. */
1495 if (flag_pcc_struct_return == DEFAULT_PCC_STRUCT_RETURN)
1496 flag_pcc_struct_return = (TARGET_ARCH64 ? 0 : 1);
1498 /* Only use .uaxword when compiling for a 64-bit target. */
1500 targetm.asm_out.unaligned_op.di = NULL;
1502 /* Do various machine dependent initializations. */
1503 sparc_init_modes ();
1505 /* Set up function hooks. */
1506 init_machine_status = sparc_init_machine_status;
1511 case PROCESSOR_CYPRESS:
1512 sparc_costs = &cypress_costs;
1515 case PROCESSOR_SPARCLITE:
1516 case PROCESSOR_SUPERSPARC:
1517 sparc_costs = &supersparc_costs;
1519 case PROCESSOR_F930:
1520 case PROCESSOR_F934:
1521 case PROCESSOR_HYPERSPARC:
1522 case PROCESSOR_SPARCLITE86X:
1523 sparc_costs = &hypersparc_costs;
1525 case PROCESSOR_LEON:
1526 sparc_costs = &leon_costs;
1528 case PROCESSOR_LEON3:
1529 sparc_costs = &leon3_costs;
1531 case PROCESSOR_SPARCLET:
1532 case PROCESSOR_TSC701:
1533 sparc_costs = &sparclet_costs;
1536 case PROCESSOR_ULTRASPARC:
1537 sparc_costs = &ultrasparc_costs;
1539 case PROCESSOR_ULTRASPARC3:
1540 sparc_costs = &ultrasparc3_costs;
1542 case PROCESSOR_NIAGARA:
1543 sparc_costs = &niagara_costs;
1545 case PROCESSOR_NIAGARA2:
1546 sparc_costs = &niagara2_costs;
1548 case PROCESSOR_NIAGARA3:
1549 sparc_costs = &niagara3_costs;
1551 case PROCESSOR_NIAGARA4:
1552 sparc_costs = &niagara4_costs;
1554 case PROCESSOR_NATIVE:
1558 if (sparc_memory_model == SMM_DEFAULT)
1560 /* Choose the memory model for the operating system. */
1561 enum sparc_memory_model_type os_default = SUBTARGET_DEFAULT_MEMORY_MODEL;
1562 if (os_default != SMM_DEFAULT)
1563 sparc_memory_model = os_default;
1564 /* Choose the most relaxed model for the processor. */
1566 sparc_memory_model = SMM_RMO;
1567 else if (TARGET_LEON3)
1568 sparc_memory_model = SMM_TSO;
1569 else if (TARGET_LEON)
1570 sparc_memory_model = SMM_SC;
1572 sparc_memory_model = SMM_PSO;
1574 sparc_memory_model = SMM_SC;
1577 #ifdef TARGET_DEFAULT_LONG_DOUBLE_128
1578 if (!(target_flags_explicit & MASK_LONG_DOUBLE_128))
1579 target_flags |= MASK_LONG_DOUBLE_128;
1582 if (TARGET_DEBUG_OPTIONS)
1583 dump_target_flags ("Final target_flags", target_flags);
1585 maybe_set_param_value (PARAM_SIMULTANEOUS_PREFETCHES,
1586 ((sparc_cpu == PROCESSOR_ULTRASPARC
1587 || sparc_cpu == PROCESSOR_NIAGARA
1588 || sparc_cpu == PROCESSOR_NIAGARA2
1589 || sparc_cpu == PROCESSOR_NIAGARA3
1590 || sparc_cpu == PROCESSOR_NIAGARA4)
1592 : (sparc_cpu == PROCESSOR_ULTRASPARC3
1594 global_options.x_param_values,
1595 global_options_set.x_param_values);
1596 maybe_set_param_value (PARAM_L1_CACHE_LINE_SIZE,
1597 ((sparc_cpu == PROCESSOR_ULTRASPARC
1598 || sparc_cpu == PROCESSOR_ULTRASPARC3
1599 || sparc_cpu == PROCESSOR_NIAGARA
1600 || sparc_cpu == PROCESSOR_NIAGARA2
1601 || sparc_cpu == PROCESSOR_NIAGARA3
1602 || sparc_cpu == PROCESSOR_NIAGARA4)
1604 global_options.x_param_values,
1605 global_options_set.x_param_values);
1607 /* Disable save slot sharing for call-clobbered registers by default.
1608 The IRA sharing algorithm works on single registers only and this
1609 pessimizes for double floating-point registers. */
1610 if (!global_options_set.x_flag_ira_share_save_slots)
1611 flag_ira_share_save_slots = 0;
1613 /* We register a machine specific pass to work around errata, if any.
1614 The pass mut be scheduled as late as possible so that we have the
1615 (essentially) final form of the insn stream to work on.
1616 Registering the pass must be done at start up. It's convenient to
1618 opt_pass *errata_pass = make_pass_work_around_errata (g);
1619 struct register_pass_info insert_pass_work_around_errata =
1621 errata_pass, /* pass */
1622 "dbr", /* reference_pass_name */
1623 1, /* ref_pass_instance_number */
1624 PASS_POS_INSERT_AFTER /* po_op */
1626 register_pass (&insert_pass_work_around_errata);
1629 /* Miscellaneous utilities. */
1631 /* Nonzero if CODE, a comparison, is suitable for use in v9 conditional move
1632 or branch on register contents instructions. */
1635 v9_regcmp_p (enum rtx_code code)
1637 return (code == EQ || code == NE || code == GE || code == LT
1638 || code == LE || code == GT);
1641 /* Nonzero if OP is a floating point constant which can
1642 be loaded into an integer register using a single
1643 sethi instruction. */
1648 if (GET_CODE (op) == CONST_DOUBLE)
1653 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
1654 REAL_VALUE_TO_TARGET_SINGLE (r, i);
1655 return !SPARC_SIMM13_P (i) && SPARC_SETHI_P (i);
1661 /* Nonzero if OP is a floating point constant which can
1662 be loaded into an integer register using a single
1668 if (GET_CODE (op) == CONST_DOUBLE)
1673 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
1674 REAL_VALUE_TO_TARGET_SINGLE (r, i);
1675 return SPARC_SIMM13_P (i);
1681 /* Nonzero if OP is a floating point constant which can
1682 be loaded into an integer register using a high/losum
1683 instruction sequence. */
1686 fp_high_losum_p (rtx op)
1688 /* The constraints calling this should only be in
1689 SFmode move insns, so any constant which cannot
1690 be moved using a single insn will do. */
1691 if (GET_CODE (op) == CONST_DOUBLE)
1696 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
1697 REAL_VALUE_TO_TARGET_SINGLE (r, i);
1698 return !SPARC_SIMM13_P (i) && !SPARC_SETHI_P (i);
1704 /* Return true if the address of LABEL can be loaded by means of the
1705 mov{si,di}_pic_label_ref patterns in PIC mode. */
1708 can_use_mov_pic_label_ref (rtx label)
1710 /* VxWorks does not impose a fixed gap between segments; the run-time
1711 gap can be different from the object-file gap. We therefore can't
1712 assume X - _GLOBAL_OFFSET_TABLE_ is a link-time constant unless we
1713 are absolutely sure that X is in the same segment as the GOT.
1714 Unfortunately, the flexibility of linker scripts means that we
1715 can't be sure of that in general, so assume that GOT-relative
1716 accesses are never valid on VxWorks. */
1717 if (TARGET_VXWORKS_RTP)
1720 /* Similarly, if the label is non-local, it might end up being placed
1721 in a different section than the current one; now mov_pic_label_ref
1722 requires the label and the code to be in the same section. */
1723 if (LABEL_REF_NONLOCAL_P (label))
1726 /* Finally, if we are reordering basic blocks and partition into hot
1727 and cold sections, this might happen for any label. */
1728 if (flag_reorder_blocks_and_partition)
1734 /* Expand a move instruction. Return true if all work is done. */
1737 sparc_expand_move (enum machine_mode mode, rtx *operands)
1739 /* Handle sets of MEM first. */
1740 if (GET_CODE (operands[0]) == MEM)
1742 /* 0 is a register (or a pair of registers) on SPARC. */
1743 if (register_or_zero_operand (operands[1], mode))
1746 if (!reload_in_progress)
1748 operands[0] = validize_mem (operands[0]);
1749 operands[1] = force_reg (mode, operands[1]);
1753 /* Fixup TLS cases. */
1755 && CONSTANT_P (operands[1])
1756 && sparc_tls_referenced_p (operands [1]))
1758 operands[1] = sparc_legitimize_tls_address (operands[1]);
1762 /* Fixup PIC cases. */
1763 if (flag_pic && CONSTANT_P (operands[1]))
1765 if (pic_address_needs_scratch (operands[1]))
1766 operands[1] = sparc_legitimize_pic_address (operands[1], NULL_RTX);
1768 /* We cannot use the mov{si,di}_pic_label_ref patterns in all cases. */
1769 if (GET_CODE (operands[1]) == LABEL_REF
1770 && can_use_mov_pic_label_ref (operands[1]))
1774 emit_insn (gen_movsi_pic_label_ref (operands[0], operands[1]));
1780 gcc_assert (TARGET_ARCH64);
1781 emit_insn (gen_movdi_pic_label_ref (operands[0], operands[1]));
1786 if (symbolic_operand (operands[1], mode))
1789 = sparc_legitimize_pic_address (operands[1],
1791 ? operands[0] : NULL_RTX);
1796 /* If we are trying to toss an integer constant into FP registers,
1797 or loading a FP or vector constant, force it into memory. */
1798 if (CONSTANT_P (operands[1])
1799 && REG_P (operands[0])
1800 && (SPARC_FP_REG_P (REGNO (operands[0]))
1801 || SCALAR_FLOAT_MODE_P (mode)
1802 || VECTOR_MODE_P (mode)))
1804 /* emit_group_store will send such bogosity to us when it is
1805 not storing directly into memory. So fix this up to avoid
1806 crashes in output_constant_pool. */
1807 if (operands [1] == const0_rtx)
1808 operands[1] = CONST0_RTX (mode);
1810 /* We can clear or set to all-ones FP registers if TARGET_VIS, and
1811 always other regs. */
1812 if ((TARGET_VIS || REGNO (operands[0]) < SPARC_FIRST_FP_REG)
1813 && (const_zero_operand (operands[1], mode)
1814 || const_all_ones_operand (operands[1], mode)))
1817 if (REGNO (operands[0]) < SPARC_FIRST_FP_REG
1818 /* We are able to build any SF constant in integer registers
1819 with at most 2 instructions. */
1821 /* And any DF constant in integer registers. */
1823 && ! can_create_pseudo_p ())))
1826 operands[1] = force_const_mem (mode, operands[1]);
1827 if (!reload_in_progress)
1828 operands[1] = validize_mem (operands[1]);
1832 /* Accept non-constants and valid constants unmodified. */
1833 if (!CONSTANT_P (operands[1])
1834 || GET_CODE (operands[1]) == HIGH
1835 || input_operand (operands[1], mode))
1841 /* All QImode constants require only one insn, so proceed. */
1846 sparc_emit_set_const32 (operands[0], operands[1]);
1850 /* input_operand should have filtered out 32-bit mode. */
1851 sparc_emit_set_const64 (operands[0], operands[1]);
1857 /* TImode isn't available in 32-bit mode. */
1858 split_double (operands[1], &high, &low);
1859 emit_insn (gen_movdi (operand_subword (operands[0], 0, 0, TImode),
1861 emit_insn (gen_movdi (operand_subword (operands[0], 1, 0, TImode),
1873 /* Load OP1, a 32-bit constant, into OP0, a register.
1874 We know it can't be done in one insn when we get
1875 here, the move expander guarantees this. */
1878 sparc_emit_set_const32 (rtx op0, rtx op1)
1880 enum machine_mode mode = GET_MODE (op0);
1883 if (can_create_pseudo_p ())
1884 temp = gen_reg_rtx (mode);
1886 if (GET_CODE (op1) == CONST_INT)
1888 gcc_assert (!small_int_operand (op1, mode)
1889 && !const_high_operand (op1, mode));
1891 /* Emit them as real moves instead of a HIGH/LO_SUM,
1892 this way CSE can see everything and reuse intermediate
1893 values if it wants. */
1894 emit_insn (gen_rtx_SET (VOIDmode, temp,
1895 GEN_INT (INTVAL (op1)
1896 & ~(HOST_WIDE_INT)0x3ff)));
1898 emit_insn (gen_rtx_SET (VOIDmode,
1900 gen_rtx_IOR (mode, temp,
1901 GEN_INT (INTVAL (op1) & 0x3ff))));
1905 /* A symbol, emit in the traditional way. */
1906 emit_insn (gen_rtx_SET (VOIDmode, temp,
1907 gen_rtx_HIGH (mode, op1)));
1908 emit_insn (gen_rtx_SET (VOIDmode,
1909 op0, gen_rtx_LO_SUM (mode, temp, op1)));
1913 /* Load OP1, a symbolic 64-bit constant, into OP0, a DImode register.
1914 If TEMP is nonzero, we are forbidden to use any other scratch
1915 registers. Otherwise, we are allowed to generate them as needed.
1917 Note that TEMP may have TImode if the code model is TARGET_CM_MEDANY
1918 or TARGET_CM_EMBMEDANY (see the reload_indi and reload_outdi patterns). */
1921 sparc_emit_set_symbolic_const64 (rtx op0, rtx op1, rtx temp)
1923 rtx temp1, temp2, temp3, temp4, temp5;
1926 if (temp && GET_MODE (temp) == TImode)
1929 temp = gen_rtx_REG (DImode, REGNO (temp));
1932 /* SPARC-V9 code-model support. */
1933 switch (sparc_cmodel)
1936 /* The range spanned by all instructions in the object is less
1937 than 2^31 bytes (2GB) and the distance from any instruction
1938 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1939 than 2^31 bytes (2GB).
1941 The executable must be in the low 4TB of the virtual address
1944 sethi %hi(symbol), %temp1
1945 or %temp1, %lo(symbol), %reg */
1947 temp1 = temp; /* op0 is allowed. */
1949 temp1 = gen_reg_rtx (DImode);
1951 emit_insn (gen_rtx_SET (VOIDmode, temp1, gen_rtx_HIGH (DImode, op1)));
1952 emit_insn (gen_rtx_SET (VOIDmode, op0, gen_rtx_LO_SUM (DImode, temp1, op1)));
1956 /* The range spanned by all instructions in the object is less
1957 than 2^31 bytes (2GB) and the distance from any instruction
1958 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1959 than 2^31 bytes (2GB).
1961 The executable must be in the low 16TB of the virtual address
1964 sethi %h44(symbol), %temp1
1965 or %temp1, %m44(symbol), %temp2
1966 sllx %temp2, 12, %temp3
1967 or %temp3, %l44(symbol), %reg */
1972 temp3 = temp; /* op0 is allowed. */
1976 temp1 = gen_reg_rtx (DImode);
1977 temp2 = gen_reg_rtx (DImode);
1978 temp3 = gen_reg_rtx (DImode);
1981 emit_insn (gen_seth44 (temp1, op1));
1982 emit_insn (gen_setm44 (temp2, temp1, op1));
1983 emit_insn (gen_rtx_SET (VOIDmode, temp3,
1984 gen_rtx_ASHIFT (DImode, temp2, GEN_INT (12))));
1985 emit_insn (gen_setl44 (op0, temp3, op1));
1989 /* The range spanned by all instructions in the object is less
1990 than 2^31 bytes (2GB) and the distance from any instruction
1991 to the location of the label _GLOBAL_OFFSET_TABLE_ is less
1992 than 2^31 bytes (2GB).
1994 The executable can be placed anywhere in the virtual address
1997 sethi %hh(symbol), %temp1
1998 sethi %lm(symbol), %temp2
1999 or %temp1, %hm(symbol), %temp3
2000 sllx %temp3, 32, %temp4
2001 or %temp4, %temp2, %temp5
2002 or %temp5, %lo(symbol), %reg */
2005 /* It is possible that one of the registers we got for operands[2]
2006 might coincide with that of operands[0] (which is why we made
2007 it TImode). Pick the other one to use as our scratch. */
2008 if (rtx_equal_p (temp, op0))
2010 gcc_assert (ti_temp);
2011 temp = gen_rtx_REG (DImode, REGNO (temp) + 1);
2014 temp2 = temp; /* op0 is _not_ allowed, see above. */
2021 temp1 = gen_reg_rtx (DImode);
2022 temp2 = gen_reg_rtx (DImode);
2023 temp3 = gen_reg_rtx (DImode);
2024 temp4 = gen_reg_rtx (DImode);
2025 temp5 = gen_reg_rtx (DImode);
2028 emit_insn (gen_sethh (temp1, op1));
2029 emit_insn (gen_setlm (temp2, op1));
2030 emit_insn (gen_sethm (temp3, temp1, op1));
2031 emit_insn (gen_rtx_SET (VOIDmode, temp4,
2032 gen_rtx_ASHIFT (DImode, temp3, GEN_INT (32))));
2033 emit_insn (gen_rtx_SET (VOIDmode, temp5,
2034 gen_rtx_PLUS (DImode, temp4, temp2)));
2035 emit_insn (gen_setlo (op0, temp5, op1));
2039 /* Old old old backwards compatibility kruft here.
2040 Essentially it is MEDLOW with a fixed 64-bit
2041 virtual base added to all data segment addresses.
2042 Text-segment stuff is computed like MEDANY, we can't
2043 reuse the code above because the relocation knobs
2046 Data segment: sethi %hi(symbol), %temp1
2047 add %temp1, EMBMEDANY_BASE_REG, %temp2
2048 or %temp2, %lo(symbol), %reg */
2049 if (data_segment_operand (op1, GET_MODE (op1)))
2053 temp1 = temp; /* op0 is allowed. */
2058 temp1 = gen_reg_rtx (DImode);
2059 temp2 = gen_reg_rtx (DImode);
2062 emit_insn (gen_embmedany_sethi (temp1, op1));
2063 emit_insn (gen_embmedany_brsum (temp2, temp1));
2064 emit_insn (gen_embmedany_losum (op0, temp2, op1));
2067 /* Text segment: sethi %uhi(symbol), %temp1
2068 sethi %hi(symbol), %temp2
2069 or %temp1, %ulo(symbol), %temp3
2070 sllx %temp3, 32, %temp4
2071 or %temp4, %temp2, %temp5
2072 or %temp5, %lo(symbol), %reg */
2077 /* It is possible that one of the registers we got for operands[2]
2078 might coincide with that of operands[0] (which is why we made
2079 it TImode). Pick the other one to use as our scratch. */
2080 if (rtx_equal_p (temp, op0))
2082 gcc_assert (ti_temp);
2083 temp = gen_rtx_REG (DImode, REGNO (temp) + 1);
2086 temp2 = temp; /* op0 is _not_ allowed, see above. */
2093 temp1 = gen_reg_rtx (DImode);
2094 temp2 = gen_reg_rtx (DImode);
2095 temp3 = gen_reg_rtx (DImode);
2096 temp4 = gen_reg_rtx (DImode);
2097 temp5 = gen_reg_rtx (DImode);
2100 emit_insn (gen_embmedany_textuhi (temp1, op1));
2101 emit_insn (gen_embmedany_texthi (temp2, op1));
2102 emit_insn (gen_embmedany_textulo (temp3, temp1, op1));
2103 emit_insn (gen_rtx_SET (VOIDmode, temp4,
2104 gen_rtx_ASHIFT (DImode, temp3, GEN_INT (32))));
2105 emit_insn (gen_rtx_SET (VOIDmode, temp5,
2106 gen_rtx_PLUS (DImode, temp4, temp2)));
2107 emit_insn (gen_embmedany_textlo (op0, temp5, op1));
2116 #if HOST_BITS_PER_WIDE_INT == 32
2118 sparc_emit_set_const64 (rtx op0 ATTRIBUTE_UNUSED, rtx op1 ATTRIBUTE_UNUSED)
2123 /* These avoid problems when cross compiling. If we do not
2124 go through all this hair then the optimizer will see
2125 invalid REG_EQUAL notes or in some cases none at all. */
2126 static rtx gen_safe_HIGH64 (rtx, HOST_WIDE_INT);
2127 static rtx gen_safe_SET64 (rtx, HOST_WIDE_INT);
2128 static rtx gen_safe_OR64 (rtx, HOST_WIDE_INT);
2129 static rtx gen_safe_XOR64 (rtx, HOST_WIDE_INT);
2131 /* The optimizer is not to assume anything about exactly
2132 which bits are set for a HIGH, they are unspecified.
2133 Unfortunately this leads to many missed optimizations
2134 during CSE. We mask out the non-HIGH bits, and matches
2135 a plain movdi, to alleviate this problem. */
2137 gen_safe_HIGH64 (rtx dest, HOST_WIDE_INT val)
2139 return gen_rtx_SET (VOIDmode, dest, GEN_INT (val & ~(HOST_WIDE_INT)0x3ff));
2143 gen_safe_SET64 (rtx dest, HOST_WIDE_INT val)
2145 return gen_rtx_SET (VOIDmode, dest, GEN_INT (val));
2149 gen_safe_OR64 (rtx src, HOST_WIDE_INT val)
2151 return gen_rtx_IOR (DImode, src, GEN_INT (val));
2155 gen_safe_XOR64 (rtx src, HOST_WIDE_INT val)
2157 return gen_rtx_XOR (DImode, src, GEN_INT (val));
2160 /* Worker routines for 64-bit constant formation on arch64.
2161 One of the key things to be doing in these emissions is
2162 to create as many temp REGs as possible. This makes it
2163 possible for half-built constants to be used later when
2164 such values are similar to something required later on.
2165 Without doing this, the optimizer cannot see such
2168 static void sparc_emit_set_const64_quick1 (rtx, rtx,
2169 unsigned HOST_WIDE_INT, int);
2172 sparc_emit_set_const64_quick1 (rtx op0, rtx temp,
2173 unsigned HOST_WIDE_INT low_bits, int is_neg)
2175 unsigned HOST_WIDE_INT high_bits;
2178 high_bits = (~low_bits) & 0xffffffff;
2180 high_bits = low_bits;
2182 emit_insn (gen_safe_HIGH64 (temp, high_bits));
2185 emit_insn (gen_rtx_SET (VOIDmode, op0,
2186 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
2190 /* If we are XOR'ing with -1, then we should emit a one's complement
2191 instead. This way the combiner will notice logical operations
2192 such as ANDN later on and substitute. */
2193 if ((low_bits & 0x3ff) == 0x3ff)
2195 emit_insn (gen_rtx_SET (VOIDmode, op0,
2196 gen_rtx_NOT (DImode, temp)));
2200 emit_insn (gen_rtx_SET (VOIDmode, op0,
2201 gen_safe_XOR64 (temp,
2202 (-(HOST_WIDE_INT)0x400
2203 | (low_bits & 0x3ff)))));
2208 static void sparc_emit_set_const64_quick2 (rtx, rtx, unsigned HOST_WIDE_INT,
2209 unsigned HOST_WIDE_INT, int);
2212 sparc_emit_set_const64_quick2 (rtx op0, rtx temp,
2213 unsigned HOST_WIDE_INT high_bits,
2214 unsigned HOST_WIDE_INT low_immediate,
2219 if ((high_bits & 0xfffffc00) != 0)
2221 emit_insn (gen_safe_HIGH64 (temp, high_bits));
2222 if ((high_bits & ~0xfffffc00) != 0)
2223 emit_insn (gen_rtx_SET (VOIDmode, op0,
2224 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
2230 emit_insn (gen_safe_SET64 (temp, high_bits));
2234 /* Now shift it up into place. */
2235 emit_insn (gen_rtx_SET (VOIDmode, op0,
2236 gen_rtx_ASHIFT (DImode, temp2,
2237 GEN_INT (shift_count))));
2239 /* If there is a low immediate part piece, finish up by
2240 putting that in as well. */
2241 if (low_immediate != 0)
2242 emit_insn (gen_rtx_SET (VOIDmode, op0,
2243 gen_safe_OR64 (op0, low_immediate)));
2246 static void sparc_emit_set_const64_longway (rtx, rtx, unsigned HOST_WIDE_INT,
2247 unsigned HOST_WIDE_INT);
2249 /* Full 64-bit constant decomposition. Even though this is the
2250 'worst' case, we still optimize a few things away. */
2252 sparc_emit_set_const64_longway (rtx op0, rtx temp,
2253 unsigned HOST_WIDE_INT high_bits,
2254 unsigned HOST_WIDE_INT low_bits)
2258 if (can_create_pseudo_p ())
2259 sub_temp = gen_reg_rtx (DImode);
2261 if ((high_bits & 0xfffffc00) != 0)
2263 emit_insn (gen_safe_HIGH64 (temp, high_bits));
2264 if ((high_bits & ~0xfffffc00) != 0)
2265 emit_insn (gen_rtx_SET (VOIDmode,
2267 gen_safe_OR64 (temp, (high_bits & 0x3ff))));
2273 emit_insn (gen_safe_SET64 (temp, high_bits));
2277 if (can_create_pseudo_p ())
2279 rtx temp2 = gen_reg_rtx (DImode);
2280 rtx temp3 = gen_reg_rtx (DImode);
2281 rtx temp4 = gen_reg_rtx (DImode);
2283 emit_insn (gen_rtx_SET (VOIDmode, temp4,
2284 gen_rtx_ASHIFT (DImode, sub_temp,
2287 emit_insn (gen_safe_HIGH64 (temp2, low_bits));
2288 if ((low_bits & ~0xfffffc00) != 0)
2290 emit_insn (gen_rtx_SET (VOIDmode, temp3,
2291 gen_safe_OR64 (temp2, (low_bits & 0x3ff))));
2292 emit_insn (gen_rtx_SET (VOIDmode, op0,
2293 gen_rtx_PLUS (DImode, temp4, temp3)));
2297 emit_insn (gen_rtx_SET (VOIDmode, op0,
2298 gen_rtx_PLUS (DImode, temp4, temp2)));
2303 rtx low1 = GEN_INT ((low_bits >> (32 - 12)) & 0xfff);
2304 rtx low2 = GEN_INT ((low_bits >> (32 - 12 - 12)) & 0xfff);
2305 rtx low3 = GEN_INT ((low_bits >> (32 - 12 - 12 - 8)) & 0x0ff);
2308 /* We are in the middle of reload, so this is really
2309 painful. However we do still make an attempt to
2310 avoid emitting truly stupid code. */
2311 if (low1 != const0_rtx)
2313 emit_insn (gen_rtx_SET (VOIDmode, op0,
2314 gen_rtx_ASHIFT (DImode, sub_temp,
2315 GEN_INT (to_shift))));
2316 emit_insn (gen_rtx_SET (VOIDmode, op0,
2317 gen_rtx_IOR (DImode, op0, low1)));
2325 if (low2 != const0_rtx)
2327 emit_insn (gen_rtx_SET (VOIDmode, op0,
2328 gen_rtx_ASHIFT (DImode, sub_temp,
2329 GEN_INT (to_shift))));
2330 emit_insn (gen_rtx_SET (VOIDmode, op0,
2331 gen_rtx_IOR (DImode, op0, low2)));
2339 emit_insn (gen_rtx_SET (VOIDmode, op0,
2340 gen_rtx_ASHIFT (DImode, sub_temp,
2341 GEN_INT (to_shift))));
2342 if (low3 != const0_rtx)
2343 emit_insn (gen_rtx_SET (VOIDmode, op0,
2344 gen_rtx_IOR (DImode, op0, low3)));
2349 /* Analyze a 64-bit constant for certain properties. */
2350 static void analyze_64bit_constant (unsigned HOST_WIDE_INT,
2351 unsigned HOST_WIDE_INT,
2352 int *, int *, int *);
2355 analyze_64bit_constant (unsigned HOST_WIDE_INT high_bits,
2356 unsigned HOST_WIDE_INT low_bits,
2357 int *hbsp, int *lbsp, int *abbasp)
2359 int lowest_bit_set, highest_bit_set, all_bits_between_are_set;
2362 lowest_bit_set = highest_bit_set = -1;
2366 if ((lowest_bit_set == -1)
2367 && ((low_bits >> i) & 1))
2369 if ((highest_bit_set == -1)
2370 && ((high_bits >> (32 - i - 1)) & 1))
2371 highest_bit_set = (64 - i - 1);
2374 && ((highest_bit_set == -1)
2375 || (lowest_bit_set == -1)));
2381 if ((lowest_bit_set == -1)
2382 && ((high_bits >> i) & 1))
2383 lowest_bit_set = i + 32;
2384 if ((highest_bit_set == -1)
2385 && ((low_bits >> (32 - i - 1)) & 1))
2386 highest_bit_set = 32 - i - 1;
2389 && ((highest_bit_set == -1)
2390 || (lowest_bit_set == -1)));
2392 /* If there are no bits set this should have gone out
2393 as one instruction! */
2394 gcc_assert (lowest_bit_set != -1 && highest_bit_set != -1);
2395 all_bits_between_are_set = 1;
2396 for (i = lowest_bit_set; i <= highest_bit_set; i++)
2400 if ((low_bits & (1 << i)) != 0)
2405 if ((high_bits & (1 << (i - 32))) != 0)
2408 all_bits_between_are_set = 0;
2411 *hbsp = highest_bit_set;
2412 *lbsp = lowest_bit_set;
2413 *abbasp = all_bits_between_are_set;
2416 static int const64_is_2insns (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT);
2419 const64_is_2insns (unsigned HOST_WIDE_INT high_bits,
2420 unsigned HOST_WIDE_INT low_bits)
2422 int highest_bit_set, lowest_bit_set, all_bits_between_are_set;
2425 || high_bits == 0xffffffff)
2428 analyze_64bit_constant (high_bits, low_bits,
2429 &highest_bit_set, &lowest_bit_set,
2430 &all_bits_between_are_set);
2432 if ((highest_bit_set == 63
2433 || lowest_bit_set == 0)
2434 && all_bits_between_are_set != 0)
2437 if ((highest_bit_set - lowest_bit_set) < 21)
2443 static unsigned HOST_WIDE_INT create_simple_focus_bits (unsigned HOST_WIDE_INT,
2444 unsigned HOST_WIDE_INT,
2447 static unsigned HOST_WIDE_INT
2448 create_simple_focus_bits (unsigned HOST_WIDE_INT high_bits,
2449 unsigned HOST_WIDE_INT low_bits,
2450 int lowest_bit_set, int shift)
2452 HOST_WIDE_INT hi, lo;
2454 if (lowest_bit_set < 32)
2456 lo = (low_bits >> lowest_bit_set) << shift;
2457 hi = ((high_bits << (32 - lowest_bit_set)) << shift);
2462 hi = ((high_bits >> (lowest_bit_set - 32)) << shift);
2464 gcc_assert (! (hi & lo));
2468 /* Here we are sure to be arch64 and this is an integer constant
2469 being loaded into a register. Emit the most efficient
2470 insn sequence possible. Detection of all the 1-insn cases
2471 has been done already. */
2473 sparc_emit_set_const64 (rtx op0, rtx op1)
2475 unsigned HOST_WIDE_INT high_bits, low_bits;
2476 int lowest_bit_set, highest_bit_set;
2477 int all_bits_between_are_set;
2480 /* Sanity check that we know what we are working with. */
2481 gcc_assert (TARGET_ARCH64
2482 && (GET_CODE (op0) == SUBREG
2483 || (REG_P (op0) && ! SPARC_FP_REG_P (REGNO (op0)))));
2485 if (! can_create_pseudo_p ())
2488 if (GET_CODE (op1) != CONST_INT)
2490 sparc_emit_set_symbolic_const64 (op0, op1, temp);
2495 temp = gen_reg_rtx (DImode);
2497 high_bits = ((INTVAL (op1) >> 32) & 0xffffffff);
2498 low_bits = (INTVAL (op1) & 0xffffffff);
2500 /* low_bits bits 0 --> 31
2501 high_bits bits 32 --> 63 */
2503 analyze_64bit_constant (high_bits, low_bits,
2504 &highest_bit_set, &lowest_bit_set,
2505 &all_bits_between_are_set);
2507 /* First try for a 2-insn sequence. */
2509 /* These situations are preferred because the optimizer can
2510 * do more things with them:
2512 * sllx %reg, shift, %reg
2514 * srlx %reg, shift, %reg
2515 * 3) mov some_small_const, %reg
2516 * sllx %reg, shift, %reg
2518 if (((highest_bit_set == 63
2519 || lowest_bit_set == 0)
2520 && all_bits_between_are_set != 0)
2521 || ((highest_bit_set - lowest_bit_set) < 12))
2523 HOST_WIDE_INT the_const = -1;
2524 int shift = lowest_bit_set;
2526 if ((highest_bit_set != 63
2527 && lowest_bit_set != 0)
2528 || all_bits_between_are_set == 0)
2531 create_simple_focus_bits (high_bits, low_bits,
2534 else if (lowest_bit_set == 0)
2535 shift = -(63 - highest_bit_set);
2537 gcc_assert (SPARC_SIMM13_P (the_const));
2538 gcc_assert (shift != 0);
2540 emit_insn (gen_safe_SET64 (temp, the_const));
2542 emit_insn (gen_rtx_SET (VOIDmode,
2544 gen_rtx_ASHIFT (DImode,
2548 emit_insn (gen_rtx_SET (VOIDmode,
2550 gen_rtx_LSHIFTRT (DImode,
2552 GEN_INT (-shift))));
2556 /* Now a range of 22 or less bits set somewhere.
2557 * 1) sethi %hi(focus_bits), %reg
2558 * sllx %reg, shift, %reg
2559 * 2) sethi %hi(focus_bits), %reg
2560 * srlx %reg, shift, %reg
2562 if ((highest_bit_set - lowest_bit_set) < 21)
2564 unsigned HOST_WIDE_INT focus_bits =
2565 create_simple_focus_bits (high_bits, low_bits,
2566 lowest_bit_set, 10);
2568 gcc_assert (SPARC_SETHI_P (focus_bits));
2569 gcc_assert (lowest_bit_set != 10);
2571 emit_insn (gen_safe_HIGH64 (temp, focus_bits));
2573 /* If lowest_bit_set == 10 then a sethi alone could have done it. */
2574 if (lowest_bit_set < 10)
2575 emit_insn (gen_rtx_SET (VOIDmode,
2577 gen_rtx_LSHIFTRT (DImode, temp,
2578 GEN_INT (10 - lowest_bit_set))));
2579 else if (lowest_bit_set > 10)
2580 emit_insn (gen_rtx_SET (VOIDmode,
2582 gen_rtx_ASHIFT (DImode, temp,
2583 GEN_INT (lowest_bit_set - 10))));
2587 /* 1) sethi %hi(low_bits), %reg
2588 * or %reg, %lo(low_bits), %reg
2589 * 2) sethi %hi(~low_bits), %reg
2590 * xor %reg, %lo(-0x400 | (low_bits & 0x3ff)), %reg
2593 || high_bits == 0xffffffff)
2595 sparc_emit_set_const64_quick1 (op0, temp, low_bits,
2596 (high_bits == 0xffffffff));
2600 /* Now, try 3-insn sequences. */
2602 /* 1) sethi %hi(high_bits), %reg
2603 * or %reg, %lo(high_bits), %reg
2604 * sllx %reg, 32, %reg
2608 sparc_emit_set_const64_quick2 (op0, temp, high_bits, 0, 32);
2612 /* We may be able to do something quick
2613 when the constant is negated, so try that. */
2614 if (const64_is_2insns ((~high_bits) & 0xffffffff,
2615 (~low_bits) & 0xfffffc00))
2617 /* NOTE: The trailing bits get XOR'd so we need the
2618 non-negated bits, not the negated ones. */
2619 unsigned HOST_WIDE_INT trailing_bits = low_bits & 0x3ff;
2621 if ((((~high_bits) & 0xffffffff) == 0
2622 && ((~low_bits) & 0x80000000) == 0)
2623 || (((~high_bits) & 0xffffffff) == 0xffffffff
2624 && ((~low_bits) & 0x80000000) != 0))
2626 unsigned HOST_WIDE_INT fast_int = (~low_bits & 0xffffffff);
2628 if ((SPARC_SETHI_P (fast_int)
2629 && (~high_bits & 0xffffffff) == 0)
2630 || SPARC_SIMM13_P (fast_int))
2631 emit_insn (gen_safe_SET64 (temp, fast_int));
2633 sparc_emit_set_const64 (temp, GEN_INT (fast_int));
2638 negated_const = GEN_INT (((~low_bits) & 0xfffffc00) |
2639 (((HOST_WIDE_INT)((~high_bits) & 0xffffffff))<<32));
2640 sparc_emit_set_const64 (temp, negated_const);
2643 /* If we are XOR'ing with -1, then we should emit a one's complement
2644 instead. This way the combiner will notice logical operations
2645 such as ANDN later on and substitute. */
2646 if (trailing_bits == 0x3ff)
2648 emit_insn (gen_rtx_SET (VOIDmode, op0,
2649 gen_rtx_NOT (DImode, temp)));
2653 emit_insn (gen_rtx_SET (VOIDmode,
2655 gen_safe_XOR64 (temp,
2656 (-0x400 | trailing_bits))));
2661 /* 1) sethi %hi(xxx), %reg
2662 * or %reg, %lo(xxx), %reg
2663 * sllx %reg, yyy, %reg
2665 * ??? This is just a generalized version of the low_bits==0
2666 * thing above, FIXME...
2668 if ((highest_bit_set - lowest_bit_set) < 32)
2670 unsigned HOST_WIDE_INT focus_bits =
2671 create_simple_focus_bits (high_bits, low_bits,
2674 /* We can't get here in this state. */
2675 gcc_assert (highest_bit_set >= 32 && lowest_bit_set < 32);
2677 /* So what we know is that the set bits straddle the
2678 middle of the 64-bit word. */
2679 sparc_emit_set_const64_quick2 (op0, temp,
2685 /* 1) sethi %hi(high_bits), %reg
2686 * or %reg, %lo(high_bits), %reg
2687 * sllx %reg, 32, %reg
2688 * or %reg, low_bits, %reg
2690 if (SPARC_SIMM13_P(low_bits)
2691 && ((int)low_bits > 0))
2693 sparc_emit_set_const64_quick2 (op0, temp, high_bits, low_bits, 32);
2697 /* The easiest way when all else fails, is full decomposition. */
2698 sparc_emit_set_const64_longway (op0, temp, high_bits, low_bits);
2700 #endif /* HOST_BITS_PER_WIDE_INT == 32 */
2702 /* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
2703 return the mode to be used for the comparison. For floating-point,
2704 CCFP[E]mode is used. CC_NOOVmode should be used when the first operand
2705 is a PLUS, MINUS, NEG, or ASHIFT. CCmode should be used when no special
2706 processing is needed. */
2709 select_cc_mode (enum rtx_code op, rtx x, rtx y ATTRIBUTE_UNUSED)
2711 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2737 else if (GET_CODE (x) == PLUS || GET_CODE (x) == MINUS
2738 || GET_CODE (x) == NEG || GET_CODE (x) == ASHIFT)
2740 if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2741 return CCX_NOOVmode;
2747 if (TARGET_ARCH64 && GET_MODE (x) == DImode)
2754 /* Emit the compare insn and return the CC reg for a CODE comparison
2755 with operands X and Y. */
2758 gen_compare_reg_1 (enum rtx_code code, rtx x, rtx y)
2760 enum machine_mode mode;
2763 if (GET_MODE_CLASS (GET_MODE (x)) == MODE_CC)
2766 mode = SELECT_CC_MODE (code, x, y);
2768 /* ??? We don't have movcc patterns so we cannot generate pseudo regs for the
2769 fcc regs (cse can't tell they're really call clobbered regs and will
2770 remove a duplicate comparison even if there is an intervening function
2771 call - it will then try to reload the cc reg via an int reg which is why
2772 we need the movcc patterns). It is possible to provide the movcc
2773 patterns by using the ldxfsr/stxfsr v9 insns. I tried it: you need two
2774 registers (say %g1,%g5) and it takes about 6 insns. A better fix would be
2775 to tell cse that CCFPE mode registers (even pseudos) are call
2778 /* ??? This is an experiment. Rather than making changes to cse which may
2779 or may not be easy/clean, we do our own cse. This is possible because
2780 we will generate hard registers. Cse knows they're call clobbered (it
2781 doesn't know the same thing about pseudos). If we guess wrong, no big
2782 deal, but if we win, great! */
2784 if (TARGET_V9 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2785 #if 1 /* experiment */
2788 /* We cycle through the registers to ensure they're all exercised. */
2789 static int next_fcc_reg = 0;
2790 /* Previous x,y for each fcc reg. */
2791 static rtx prev_args[4][2];
2793 /* Scan prev_args for x,y. */
2794 for (reg = 0; reg < 4; reg++)
2795 if (prev_args[reg][0] == x && prev_args[reg][1] == y)
2800 prev_args[reg][0] = x;
2801 prev_args[reg][1] = y;
2802 next_fcc_reg = (next_fcc_reg + 1) & 3;
2804 cc_reg = gen_rtx_REG (mode, reg + SPARC_FIRST_V9_FCC_REG);
2807 cc_reg = gen_reg_rtx (mode);
2808 #endif /* ! experiment */
2809 else if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2810 cc_reg = gen_rtx_REG (mode, SPARC_FCC_REG);
2812 cc_reg = gen_rtx_REG (mode, SPARC_ICC_REG);
2814 /* We shouldn't get there for TFmode if !TARGET_HARD_QUAD. If we do, this
2815 will only result in an unrecognizable insn so no point in asserting. */
2816 emit_insn (gen_rtx_SET (VOIDmode, cc_reg, gen_rtx_COMPARE (mode, x, y)));
2822 /* Emit the compare insn and return the CC reg for the comparison in CMP. */
2825 gen_compare_reg (rtx cmp)
2827 return gen_compare_reg_1 (GET_CODE (cmp), XEXP (cmp, 0), XEXP (cmp, 1));
2830 /* This function is used for v9 only.
2831 DEST is the target of the Scc insn.
2832 CODE is the code for an Scc's comparison.
2833 X and Y are the values we compare.
2835 This function is needed to turn
2838 (gt (reg:CCX 100 %icc)
2842 (gt:DI (reg:CCX 100 %icc)
2845 IE: The instruction recognizer needs to see the mode of the comparison to
2846 find the right instruction. We could use "gt:DI" right in the
2847 define_expand, but leaving it out allows us to handle DI, SI, etc. */
2850 gen_v9_scc (rtx dest, enum rtx_code compare_code, rtx x, rtx y)
2853 && (GET_MODE (x) == DImode
2854 || GET_MODE (dest) == DImode))
2857 /* Try to use the movrCC insns. */
2859 && GET_MODE_CLASS (GET_MODE (x)) == MODE_INT
2861 && v9_regcmp_p (compare_code))
2866 /* Special case for op0 != 0. This can be done with one instruction if
2869 if (compare_code == NE
2870 && GET_MODE (dest) == DImode
2871 && rtx_equal_p (op0, dest))
2873 emit_insn (gen_rtx_SET (VOIDmode, dest,
2874 gen_rtx_IF_THEN_ELSE (DImode,
2875 gen_rtx_fmt_ee (compare_code, DImode,
2882 if (reg_overlap_mentioned_p (dest, op0))
2884 /* Handle the case where dest == x.
2885 We "early clobber" the result. */
2886 op0 = gen_reg_rtx (GET_MODE (x));
2887 emit_move_insn (op0, x);
2890 emit_insn (gen_rtx_SET (VOIDmode, dest, const0_rtx));
2891 if (GET_MODE (op0) != DImode)
2893 temp = gen_reg_rtx (DImode);
2894 convert_move (temp, op0, 0);
2898 emit_insn (gen_rtx_SET (VOIDmode, dest,
2899 gen_rtx_IF_THEN_ELSE (GET_MODE (dest),
2900 gen_rtx_fmt_ee (compare_code, DImode,
2908 x = gen_compare_reg_1 (compare_code, x, y);
2911 gcc_assert (GET_MODE (x) != CC_NOOVmode
2912 && GET_MODE (x) != CCX_NOOVmode);
2914 emit_insn (gen_rtx_SET (VOIDmode, dest, const0_rtx));
2915 emit_insn (gen_rtx_SET (VOIDmode, dest,
2916 gen_rtx_IF_THEN_ELSE (GET_MODE (dest),
2917 gen_rtx_fmt_ee (compare_code,
2918 GET_MODE (x), x, y),
2919 const1_rtx, dest)));
2925 /* Emit an scc insn. For seq, sne, sgeu, and sltu, we can do this
2926 without jumps using the addx/subx instructions. */
2929 emit_scc_insn (rtx operands[])
2936 /* The quad-word fp compare library routines all return nonzero to indicate
2937 true, which is different from the equivalent libgcc routines, so we must
2938 handle them specially here. */
2939 if (GET_MODE (operands[2]) == TFmode && ! TARGET_HARD_QUAD)
2941 operands[1] = sparc_emit_float_lib_cmp (operands[2], operands[3],
2942 GET_CODE (operands[1]));
2943 operands[2] = XEXP (operands[1], 0);
2944 operands[3] = XEXP (operands[1], 1);
2947 code = GET_CODE (operands[1]);
2951 /* For seq/sne on v9 we use the same code as v8 (the addx/subx method has
2952 more applications). The exception to this is "reg != 0" which can
2953 be done in one instruction on v9 (so we do it). */
2956 if (GET_MODE (x) == SImode)
2960 pat = gen_seqsidi_special (operands[0], x, y);
2962 pat = gen_seqsisi_special (operands[0], x, y);
2966 else if (GET_MODE (x) == DImode)
2968 rtx pat = gen_seqdi_special (operands[0], x, y);
2976 if (GET_MODE (x) == SImode)
2980 pat = gen_snesidi_special (operands[0], x, y);
2982 pat = gen_snesisi_special (operands[0], x, y);
2986 else if (GET_MODE (x) == DImode)
2990 pat = gen_snedi_special_vis3 (operands[0], x, y);
2992 pat = gen_snedi_special (operands[0], x, y);
3000 && GET_MODE (x) == DImode
3002 && (code == GTU || code == LTU))
3003 && gen_v9_scc (operands[0], code, x, y))
3006 /* We can do LTU and GEU using the addx/subx instructions too. And
3007 for GTU/LEU, if both operands are registers swap them and fall
3008 back to the easy case. */
3009 if (code == GTU || code == LEU)
3011 if ((GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
3012 && (GET_CODE (y) == REG || GET_CODE (y) == SUBREG))
3017 code = swap_condition (code);
3022 || (!TARGET_VIS3 && code == GEU))
3024 emit_insn (gen_rtx_SET (VOIDmode, operands[0],
3025 gen_rtx_fmt_ee (code, GET_MODE (operands[0]),
3026 gen_compare_reg_1 (code, x, y),
3031 /* All the posibilities to use addx/subx based sequences has been
3032 exhausted, try for a 3 instruction sequence using v9 conditional
3034 if (TARGET_V9 && gen_v9_scc (operands[0], code, x, y))
3037 /* Nope, do branches. */
3041 /* Emit a conditional jump insn for the v9 architecture using comparison code
3042 CODE and jump target LABEL.
3043 This function exists to take advantage of the v9 brxx insns. */
3046 emit_v9_brxx_insn (enum rtx_code code, rtx op0, rtx label)
3048 emit_jump_insn (gen_rtx_SET (VOIDmode,
3050 gen_rtx_IF_THEN_ELSE (VOIDmode,
3051 gen_rtx_fmt_ee (code, GET_MODE (op0),
3053 gen_rtx_LABEL_REF (VOIDmode, label),
3057 /* Emit a conditional jump insn for the UA2011 architecture using
3058 comparison code CODE and jump target LABEL. This function exists
3059 to take advantage of the UA2011 Compare and Branch insns. */
3062 emit_cbcond_insn (enum rtx_code code, rtx op0, rtx op1, rtx label)
3066 if_then_else = gen_rtx_IF_THEN_ELSE (VOIDmode,
3067 gen_rtx_fmt_ee(code, GET_MODE(op0),
3069 gen_rtx_LABEL_REF (VOIDmode, label),
3072 emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, if_then_else));
3076 emit_conditional_branch_insn (rtx operands[])
3078 /* The quad-word fp compare library routines all return nonzero to indicate
3079 true, which is different from the equivalent libgcc routines, so we must
3080 handle them specially here. */
3081 if (GET_MODE (operands[1]) == TFmode && ! TARGET_HARD_QUAD)
3083 operands[0] = sparc_emit_float_lib_cmp (operands[1], operands[2],
3084 GET_CODE (operands[0]));
3085 operands[1] = XEXP (operands[0], 0);
3086 operands[2] = XEXP (operands[0], 1);
3089 /* If we can tell early on that the comparison is against a constant
3090 that won't fit in the 5-bit signed immediate field of a cbcond,
3091 use one of the other v9 conditional branch sequences. */
3093 && GET_CODE (operands[1]) == REG
3094 && (GET_MODE (operands[1]) == SImode
3095 || (TARGET_ARCH64 && GET_MODE (operands[1]) == DImode))
3096 && (GET_CODE (operands[2]) != CONST_INT
3097 || SPARC_SIMM5_P (INTVAL (operands[2]))))
3099 emit_cbcond_insn (GET_CODE (operands[0]), operands[1], operands[2], operands[3]);
3103 if (TARGET_ARCH64 && operands[2] == const0_rtx
3104 && GET_CODE (operands[1]) == REG
3105 && GET_MODE (operands[1]) == DImode)
3107 emit_v9_brxx_insn (GET_CODE (operands[0]), operands[1], operands[3]);
3111 operands[1] = gen_compare_reg (operands[0]);
3112 operands[2] = const0_rtx;
3113 operands[0] = gen_rtx_fmt_ee (GET_CODE (operands[0]), VOIDmode,
3114 operands[1], operands[2]);
3115 emit_jump_insn (gen_cbranchcc4 (operands[0], operands[1], operands[2],
3120 /* Generate a DFmode part of a hard TFmode register.
3121 REG is the TFmode hard register, LOW is 1 for the
3122 low 64bit of the register and 0 otherwise.
3125 gen_df_reg (rtx reg, int low)
3127 int regno = REGNO (reg);
3129 if ((WORDS_BIG_ENDIAN == 0) ^ (low != 0))
3130 regno += (TARGET_ARCH64 && SPARC_INT_REG_P (regno)) ? 1 : 2;
3131 return gen_rtx_REG (DFmode, regno);
3134 /* Generate a call to FUNC with OPERANDS. Operand 0 is the return value.
3135 Unlike normal calls, TFmode operands are passed by reference. It is
3136 assumed that no more than 3 operands are required. */
3139 emit_soft_tfmode_libcall (const char *func_name, int nargs, rtx *operands)
3141 rtx ret_slot = NULL, arg[3], func_sym;
3144 /* We only expect to be called for conversions, unary, and binary ops. */
3145 gcc_assert (nargs == 2 || nargs == 3);
3147 for (i = 0; i < nargs; ++i)
3149 rtx this_arg = operands[i];
3152 /* TFmode arguments and return values are passed by reference. */
3153 if (GET_MODE (this_arg) == TFmode)
3155 int force_stack_temp;
3157 force_stack_temp = 0;
3158 if (TARGET_BUGGY_QP_LIB && i == 0)
3159 force_stack_temp = 1;
3161 if (GET_CODE (this_arg) == MEM
3162 && ! force_stack_temp)
3164 tree expr = MEM_EXPR (this_arg);
3166 mark_addressable (expr);
3167 this_arg = XEXP (this_arg, 0);
3169 else if (CONSTANT_P (this_arg)
3170 && ! force_stack_temp)
3172 this_slot = force_const_mem (TFmode, this_arg);
3173 this_arg = XEXP (this_slot, 0);
3177 this_slot = assign_stack_temp (TFmode, GET_MODE_SIZE (TFmode));
3179 /* Operand 0 is the return value. We'll copy it out later. */
3181 emit_move_insn (this_slot, this_arg);
3183 ret_slot = this_slot;
3185 this_arg = XEXP (this_slot, 0);
3192 func_sym = gen_rtx_SYMBOL_REF (Pmode, func_name);
3194 if (GET_MODE (operands[0]) == TFmode)
3197 emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 2,
3198 arg[0], GET_MODE (arg[0]),
3199 arg[1], GET_MODE (arg[1]));
3201 emit_library_call (func_sym, LCT_NORMAL, VOIDmode, 3,
3202 arg[0], GET_MODE (arg[0]),
3203 arg[1], GET_MODE (arg[1]),
3204 arg[2], GET_MODE (arg[2]));
3207 emit_move_insn (operands[0], ret_slot);
3213 gcc_assert (nargs == 2);
3215 ret = emit_library_call_value (func_sym, operands[0], LCT_NORMAL,
3216 GET_MODE (operands[0]), 1,
3217 arg[1], GET_MODE (arg[1]));
3219 if (ret != operands[0])
3220 emit_move_insn (operands[0], ret);
3224 /* Expand soft-float TFmode calls to sparc abi routines. */
3227 emit_soft_tfmode_binop (enum rtx_code code, rtx *operands)
3249 emit_soft_tfmode_libcall (func, 3, operands);
3253 emit_soft_tfmode_unop (enum rtx_code code, rtx *operands)
3257 gcc_assert (code == SQRT);
3260 emit_soft_tfmode_libcall (func, 2, operands);
3264 emit_soft_tfmode_cvt (enum rtx_code code, rtx *operands)
3271 switch (GET_MODE (operands[1]))
3284 case FLOAT_TRUNCATE:
3285 switch (GET_MODE (operands[0]))
3299 switch (GET_MODE (operands[1]))
3304 operands[1] = gen_rtx_SIGN_EXTEND (DImode, operands[1]);
3314 case UNSIGNED_FLOAT:
3315 switch (GET_MODE (operands[1]))
3320 operands[1] = gen_rtx_ZERO_EXTEND (DImode, operands[1]);
3331 switch (GET_MODE (operands[0]))
3345 switch (GET_MODE (operands[0]))
3362 emit_soft_tfmode_libcall (func, 2, operands);
3365 /* Expand a hard-float tfmode operation. All arguments must be in
3369 emit_hard_tfmode_operation (enum rtx_code code, rtx *operands)
3373 if (GET_RTX_CLASS (code) == RTX_UNARY)
3375 operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
3376 op = gen_rtx_fmt_e (code, GET_MODE (operands[0]), operands[1]);
3380 operands[1] = force_reg (GET_MODE (operands[1]), operands[1]);
3381 operands[2] = force_reg (GET_MODE (operands[2]), operands[2]);
3382 op = gen_rtx_fmt_ee (code, GET_MODE (operands[0]),
3383 operands[1], operands[2]);
3386 if (register_operand (operands[0], VOIDmode))
3389 dest = gen_reg_rtx (GET_MODE (operands[0]));
3391 emit_insn (gen_rtx_SET (VOIDmode, dest, op));
3393 if (dest != operands[0])
3394 emit_move_insn (operands[0], dest);
3398 emit_tfmode_binop (enum rtx_code code, rtx *operands)
3400 if (TARGET_HARD_QUAD)
3401 emit_hard_tfmode_operation (code, operands);
3403 emit_soft_tfmode_binop (code, operands);
3407 emit_tfmode_unop (enum rtx_code code, rtx *operands)
3409 if (TARGET_HARD_QUAD)
3410 emit_hard_tfmode_operation (code, operands);
3412 emit_soft_tfmode_unop (code, operands);
3416 emit_tfmode_cvt (enum rtx_code code, rtx *operands)
3418 if (TARGET_HARD_QUAD)
3419 emit_hard_tfmode_operation (code, operands);
3421 emit_soft_tfmode_cvt (code, operands);
3424 /* Return nonzero if a branch/jump/call instruction will be emitting
3425 nop into its delay slot. */
3428 empty_delay_slot (rtx insn)
3432 /* If no previous instruction (should not happen), return true. */
3433 if (PREV_INSN (insn) == NULL)
3436 seq = NEXT_INSN (PREV_INSN (insn));
3437 if (GET_CODE (PATTERN (seq)) == SEQUENCE)
3443 /* Return nonzero if we should emit a nop after a cbcond instruction.
3444 The cbcond instruction does not have a delay slot, however there is
3445 a severe performance penalty if a control transfer appears right
3446 after a cbcond. Therefore we emit a nop when we detect this
3450 emit_cbcond_nop (rtx insn)
3452 rtx next = next_active_insn (insn);
3457 if (NONJUMP_INSN_P (next)
3458 && GET_CODE (PATTERN (next)) == SEQUENCE)
3459 next = XVECEXP (PATTERN (next), 0, 0);
3460 else if (CALL_P (next)
3461 && GET_CODE (PATTERN (next)) == PARALLEL)
3463 rtx delay = XVECEXP (PATTERN (next), 0, 1);
3465 if (GET_CODE (delay) == RETURN)
3467 /* It's a sibling call. Do not emit the nop if we're going
3468 to emit something other than the jump itself as the first
3469 instruction of the sibcall sequence. */
3470 if (sparc_leaf_function_p || TARGET_FLAT)
3475 if (NONJUMP_INSN_P (next))
3481 /* Return nonzero if TRIAL can go into the call delay slot. */
3484 eligible_for_call_delay (rtx trial)
3488 if (get_attr_in_branch_delay (trial) == IN_BRANCH_DELAY_FALSE)
3492 call __tls_get_addr, %tgd_call (foo)
3493 add %l7, %o0, %o0, %tgd_add (foo)
3494 while Sun as/ld does not. */
3495 if (TARGET_GNU_TLS || !TARGET_TLS)
3498 pat = PATTERN (trial);
3500 /* We must reject tgd_add{32|64}, i.e.
3501 (set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSGD)))
3502 and tldm_add{32|64}, i.e.
3503 (set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSLDM)))
3505 if (GET_CODE (pat) == SET
3506 && GET_CODE (SET_SRC (pat)) == PLUS)
3508 rtx unspec = XEXP (SET_SRC (pat), 1);
3510 if (GET_CODE (unspec) == UNSPEC
3511 && (XINT (unspec, 1) == UNSPEC_TLSGD
3512 || XINT (unspec, 1) == UNSPEC_TLSLDM))
3519 /* Return nonzero if TRIAL, an insn, can be combined with a 'restore'
3520 instruction. RETURN_P is true if the v9 variant 'return' is to be
3521 considered in the test too.
3523 TRIAL must be a SET whose destination is a REG appropriate for the
3524 'restore' instruction or, if RETURN_P is true, for the 'return'
3528 eligible_for_restore_insn (rtx trial, bool return_p)
3530 rtx pat = PATTERN (trial);
3531 rtx src = SET_SRC (pat);
3532 bool src_is_freg = false;
3535 /* Since we now can do moves between float and integer registers when
3536 VIS3 is enabled, we have to catch this case. We can allow such
3537 moves when doing a 'return' however. */
3539 if (GET_CODE (src_reg) == SUBREG)
3540 src_reg = SUBREG_REG (src_reg);
3541 if (GET_CODE (src_reg) == REG
3542 && SPARC_FP_REG_P (REGNO (src_reg)))
3545 /* The 'restore src,%g0,dest' pattern for word mode and below. */
3546 if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
3547 && arith_operand (src, GET_MODE (src))
3551 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
3553 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (SImode);
3556 /* The 'restore src,%g0,dest' pattern for double-word mode. */
3557 else if (GET_MODE_CLASS (GET_MODE (src)) != MODE_FLOAT
3558 && arith_double_operand (src, GET_MODE (src))
3560 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
3562 /* The 'restore src,%g0,dest' pattern for float if no FPU. */
3563 else if (! TARGET_FPU && register_operand (src, SFmode))
3566 /* The 'restore src,%g0,dest' pattern for double if no FPU. */
3567 else if (! TARGET_FPU && TARGET_ARCH64 && register_operand (src, DFmode))
3570 /* If we have the 'return' instruction, anything that does not use
3571 local or output registers and can go into a delay slot wins. */
3572 else if (return_p && TARGET_V9 && !epilogue_renumber (&pat, 1))
3575 /* The 'restore src1,src2,dest' pattern for SImode. */
3576 else if (GET_CODE (src) == PLUS
3577 && register_operand (XEXP (src, 0), SImode)
3578 && arith_operand (XEXP (src, 1), SImode))
3581 /* The 'restore src1,src2,dest' pattern for DImode. */
3582 else if (GET_CODE (src) == PLUS
3583 && register_operand (XEXP (src, 0), DImode)
3584 && arith_double_operand (XEXP (src, 1), DImode))
3587 /* The 'restore src1,%lo(src2),dest' pattern. */
3588 else if (GET_CODE (src) == LO_SUM
3589 && ! TARGET_CM_MEDMID
3590 && ((register_operand (XEXP (src, 0), SImode)
3591 && immediate_operand (XEXP (src, 1), SImode))
3593 && register_operand (XEXP (src, 0), DImode)
3594 && immediate_operand (XEXP (src, 1), DImode))))
3597 /* The 'restore src,src,dest' pattern. */
3598 else if (GET_CODE (src) == ASHIFT
3599 && (register_operand (XEXP (src, 0), SImode)
3600 || register_operand (XEXP (src, 0), DImode))
3601 && XEXP (src, 1) == const1_rtx)
3607 /* Return nonzero if TRIAL can go into the function return's delay slot. */
3610 eligible_for_return_delay (rtx trial)
3615 /* If the function uses __builtin_eh_return, the eh_return machinery
3616 occupies the delay slot. */
3617 if (crtl->calls_eh_return)
3620 if (get_attr_in_branch_delay (trial) == IN_BRANCH_DELAY_FALSE)
3623 /* In the case of a leaf or flat function, anything can go into the slot. */
3624 if (sparc_leaf_function_p || TARGET_FLAT)
3627 if (!NONJUMP_INSN_P (trial))
3630 pat = PATTERN (trial);
3631 if (GET_CODE (pat) == PARALLEL)
3637 for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)
3639 rtx expr = XVECEXP (pat, 0, i);
3640 if (GET_CODE (expr) != SET)
3642 if (GET_CODE (SET_DEST (expr)) != REG)
3644 regno = REGNO (SET_DEST (expr));
3645 if (regno >= 8 && regno < 24)
3648 return !epilogue_renumber (&pat, 1);
3651 if (GET_CODE (pat) != SET)
3654 if (GET_CODE (SET_DEST (pat)) != REG)
3657 regno = REGNO (SET_DEST (pat));
3659 /* Otherwise, only operations which can be done in tandem with
3660 a `restore' or `return' insn can go into the delay slot. */
3661 if (regno >= 8 && regno < 24)
3664 /* If this instruction sets up floating point register and we have a return
3665 instruction, it can probably go in. But restore will not work
3667 if (! SPARC_INT_REG_P (regno))
3668 return TARGET_V9 && !epilogue_renumber (&pat, 1);
3670 return eligible_for_restore_insn (trial, true);
3673 /* Return nonzero if TRIAL can go into the sibling call's delay slot. */
3676 eligible_for_sibcall_delay (rtx trial)
3680 if (get_attr_in_branch_delay (trial) == IN_BRANCH_DELAY_FALSE)
3683 if (!NONJUMP_INSN_P (trial))
3686 pat = PATTERN (trial);
3688 if (sparc_leaf_function_p || TARGET_FLAT)
3690 /* If the tail call is done using the call instruction,
3691 we have to restore %o7 in the delay slot. */
3692 if (LEAF_SIBCALL_SLOT_RESERVED_P)
3695 /* %g1 is used to build the function address */
3696 if (reg_mentioned_p (gen_rtx_REG (Pmode, 1), pat))
3702 if (GET_CODE (pat) != SET)
3705 /* Otherwise, only operations which can be done in tandem with
3706 a `restore' insn can go into the delay slot. */
3707 if (GET_CODE (SET_DEST (pat)) != REG
3708 || (REGNO (SET_DEST (pat)) >= 8 && REGNO (SET_DEST (pat)) < 24)
3709 || ! SPARC_INT_REG_P (REGNO (SET_DEST (pat))))
3712 /* If it mentions %o7, it can't go in, because sibcall will clobber it
3714 if (reg_mentioned_p (gen_rtx_REG (Pmode, 15), pat))
3717 return eligible_for_restore_insn (trial, false);
3720 /* Determine if it's legal to put X into the constant pool. This
3721 is not possible if X contains the address of a symbol that is
3722 not constant (TLS) or not known at final link time (PIC). */
3725 sparc_cannot_force_const_mem (enum machine_mode mode, rtx x)
3727 switch (GET_CODE (x))
3732 /* Accept all non-symbolic constants. */
3736 /* Labels are OK iff we are non-PIC. */
3737 return flag_pic != 0;
3740 /* 'Naked' TLS symbol references are never OK,
3741 non-TLS symbols are OK iff we are non-PIC. */
3742 if (SYMBOL_REF_TLS_MODEL (x))
3745 return flag_pic != 0;
3748 return sparc_cannot_force_const_mem (mode, XEXP (x, 0));
3751 return sparc_cannot_force_const_mem (mode, XEXP (x, 0))
3752 || sparc_cannot_force_const_mem (mode, XEXP (x, 1));
3760 /* Global Offset Table support. */
3761 static GTY(()) rtx got_helper_rtx = NULL_RTX;
3762 static GTY(()) rtx global_offset_table_rtx = NULL_RTX;
3764 /* Return the SYMBOL_REF for the Global Offset Table. */
3766 static GTY(()) rtx sparc_got_symbol = NULL_RTX;
3771 if (!sparc_got_symbol)
3772 sparc_got_symbol = gen_rtx_SYMBOL_REF (Pmode, "_GLOBAL_OFFSET_TABLE_");
3774 return sparc_got_symbol;
3777 /* Ensure that we are not using patterns that are not OK with PIC. */
3787 op = recog_data.operand[i];
3788 gcc_assert (GET_CODE (op) != SYMBOL_REF
3789 && (GET_CODE (op) != CONST
3790 || (GET_CODE (XEXP (op, 0)) == MINUS
3791 && XEXP (XEXP (op, 0), 0) == sparc_got ()
3792 && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST)));
3799 /* Return true if X is an address which needs a temporary register when
3800 reloaded while generating PIC code. */
3803 pic_address_needs_scratch (rtx x)
3805 /* An address which is a symbolic plus a non SMALL_INT needs a temp reg. */
3806 if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
3807 && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
3808 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
3809 && ! SMALL_INT (XEXP (XEXP (x, 0), 1)))
3815 /* Determine if a given RTX is a valid constant. We already know this
3816 satisfies CONSTANT_P. */
3819 sparc_legitimate_constant_p (enum machine_mode mode, rtx x)
3821 switch (GET_CODE (x))
3825 if (sparc_tls_referenced_p (x))
3830 if (GET_MODE (x) == VOIDmode)
3833 /* Floating point constants are generally not ok.
3834 The only exception is 0.0 and all-ones in VIS. */
3836 && SCALAR_FLOAT_MODE_P (mode)
3837 && (const_zero_operand (x, mode)
3838 || const_all_ones_operand (x, mode)))
3844 /* Vector constants are generally not ok.
3845 The only exception is 0 or -1 in VIS. */
3847 && (const_zero_operand (x, mode)
3848 || const_all_ones_operand (x, mode)))
3860 /* Determine if a given RTX is a valid constant address. */
3863 constant_address_p (rtx x)
3865 switch (GET_CODE (x))
3873 if (flag_pic && pic_address_needs_scratch (x))
3875 return sparc_legitimate_constant_p (Pmode, x);
3878 return !flag_pic && sparc_legitimate_constant_p (Pmode, x);
3885 /* Nonzero if the constant value X is a legitimate general operand
3886 when generating PIC code. It is given that flag_pic is on and
3887 that X satisfies CONSTANT_P or is a CONST_DOUBLE. */
3890 legitimate_pic_operand_p (rtx x)
3892 if (pic_address_needs_scratch (x))
3894 if (sparc_tls_referenced_p (x))
3899 #define RTX_OK_FOR_OFFSET_P(X, MODE) \
3901 && INTVAL (X) >= -0x1000 \
3902 && INTVAL (X) < (0x1000 - GET_MODE_SIZE (MODE)))
3904 #define RTX_OK_FOR_OLO10_P(X, MODE) \
3906 && INTVAL (X) >= -0x1000 \
3907 && INTVAL (X) < (0xc00 - GET_MODE_SIZE (MODE)))
3909 /* Handle the TARGET_LEGITIMATE_ADDRESS_P target hook.
3911 On SPARC, the actual legitimate addresses must be REG+REG or REG+SMALLINT
3912 ordinarily. This changes a bit when generating PIC. */
3915 sparc_legitimate_address_p (enum machine_mode mode, rtx addr, bool strict)
3917 rtx rs1 = NULL, rs2 = NULL, imm1 = NULL;
3919 if (REG_P (addr) || GET_CODE (addr) == SUBREG)
3921 else if (GET_CODE (addr) == PLUS)
3923 rs1 = XEXP (addr, 0);
3924 rs2 = XEXP (addr, 1);
3926 /* Canonicalize. REG comes first, if there are no regs,
3927 LO_SUM comes first. */
3929 && GET_CODE (rs1) != SUBREG
3931 || GET_CODE (rs2) == SUBREG
3932 || (GET_CODE (rs2) == LO_SUM && GET_CODE (rs1) != LO_SUM)))
3934 rs1 = XEXP (addr, 1);
3935 rs2 = XEXP (addr, 0);
3939 && rs1 == pic_offset_table_rtx
3941 && GET_CODE (rs2) != SUBREG
3942 && GET_CODE (rs2) != LO_SUM
3943 && GET_CODE (rs2) != MEM
3944 && !(GET_CODE (rs2) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs2))
3945 && (! symbolic_operand (rs2, VOIDmode) || mode == Pmode)
3946 && (GET_CODE (rs2) != CONST_INT || SMALL_INT (rs2)))
3948 || GET_CODE (rs1) == SUBREG)
3949 && RTX_OK_FOR_OFFSET_P (rs2, mode)))
3954 else if ((REG_P (rs1) || GET_CODE (rs1) == SUBREG)
3955 && (REG_P (rs2) || GET_CODE (rs2) == SUBREG))
3957 /* We prohibit REG + REG for TFmode when there are no quad move insns
3958 and we consequently need to split. We do this because REG+REG
3959 is not an offsettable address. If we get the situation in reload
3960 where source and destination of a movtf pattern are both MEMs with
3961 REG+REG address, then only one of them gets converted to an
3962 offsettable address. */
3964 && ! (TARGET_ARCH64 && TARGET_HARD_QUAD))
3967 /* Likewise for TImode, but in all cases. */
3971 /* We prohibit REG + REG on ARCH32 if not optimizing for
3972 DFmode/DImode because then mem_min_alignment is likely to be zero
3973 after reload and the forced split would lack a matching splitter
3975 if (TARGET_ARCH32 && !optimize
3976 && (mode == DFmode || mode == DImode))
3979 else if (USE_AS_OFFSETABLE_LO10
3980 && GET_CODE (rs1) == LO_SUM
3982 && ! TARGET_CM_MEDMID
3983 && RTX_OK_FOR_OLO10_P (rs2, mode))
3986 imm1 = XEXP (rs1, 1);
3987 rs1 = XEXP (rs1, 0);
3988 if (!CONSTANT_P (imm1)
3989 || (GET_CODE (rs1) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs1)))
3993 else if (GET_CODE (addr) == LO_SUM)
3995 rs1 = XEXP (addr, 0);
3996 imm1 = XEXP (addr, 1);
3998 if (!CONSTANT_P (imm1)
3999 || (GET_CODE (rs1) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (rs1)))
4002 /* We can't allow TFmode in 32-bit mode, because an offset greater
4003 than the alignment (8) may cause the LO_SUM to overflow. */
4004 if (mode == TFmode && TARGET_ARCH32)
4007 else if (GET_CODE (addr) == CONST_INT && SMALL_INT (addr))
4012 if (GET_CODE (rs1) == SUBREG)
4013 rs1 = SUBREG_REG (rs1);
4019 if (GET_CODE (rs2) == SUBREG)
4020 rs2 = SUBREG_REG (rs2);
4027 if (!REGNO_OK_FOR_BASE_P (REGNO (rs1))
4028 || (rs2 && !REGNO_OK_FOR_BASE_P (REGNO (rs2))))
4033 if ((! SPARC_INT_REG_P (REGNO (rs1))
4034 && REGNO (rs1) != FRAME_POINTER_REGNUM
4035 && REGNO (rs1) < FIRST_PSEUDO_REGISTER)
4037 && (! SPARC_INT_REG_P (REGNO (rs2))
4038 && REGNO (rs2) != FRAME_POINTER_REGNUM
4039 && REGNO (rs2) < FIRST_PSEUDO_REGISTER)))
4045 /* Return the SYMBOL_REF for the tls_get_addr function. */
4047 static GTY(()) rtx sparc_tls_symbol = NULL_RTX;
4050 sparc_tls_get_addr (void)
4052 if (!sparc_tls_symbol)
4053 sparc_tls_symbol = gen_rtx_SYMBOL_REF (Pmode, "__tls_get_addr");
4055 return sparc_tls_symbol;
4058 /* Return the Global Offset Table to be used in TLS mode. */
4061 sparc_tls_got (void)
4063 /* In PIC mode, this is just the PIC offset table. */
4066 crtl->uses_pic_offset_table = 1;
4067 return pic_offset_table_rtx;
4070 /* In non-PIC mode, Sun as (unlike GNU as) emits PC-relative relocations for
4071 the GOT symbol with the 32-bit ABI, so we reload the GOT register. */
4072 if (TARGET_SUN_TLS && TARGET_ARCH32)
4074 load_got_register ();
4075 return global_offset_table_rtx;
4078 /* In all other cases, we load a new pseudo with the GOT symbol. */
4079 return copy_to_reg (sparc_got ());
4082 /* Return true if X contains a thread-local symbol. */
4085 sparc_tls_referenced_p (rtx x)
4087 if (!TARGET_HAVE_TLS)
4090 if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS)
4091 x = XEXP (XEXP (x, 0), 0);
4093 if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (x))
4096 /* That's all we handle in sparc_legitimize_tls_address for now. */
4100 /* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
4101 this (thread-local) address. */
4104 sparc_legitimize_tls_address (rtx addr)
4106 rtx temp1, temp2, temp3, ret, o0, got, insn;
4108 gcc_assert (can_create_pseudo_p ());
4110 if (GET_CODE (addr) == SYMBOL_REF)
4111 switch (SYMBOL_REF_TLS_MODEL (addr))
4113 case TLS_MODEL_GLOBAL_DYNAMIC:
4115 temp1 = gen_reg_rtx (SImode);
4116 temp2 = gen_reg_rtx (SImode);
4117 ret = gen_reg_rtx (Pmode);
4118 o0 = gen_rtx_REG (Pmode, 8);
4119 got = sparc_tls_got ();
4120 emit_insn (gen_tgd_hi22 (temp1, addr));
4121 emit_insn (gen_tgd_lo10 (temp2, temp1, addr));
4124 emit_insn (gen_tgd_add32 (o0, got, temp2, addr));
4125 insn = emit_call_insn (gen_tgd_call32 (o0, sparc_tls_get_addr (),
4130 emit_insn (gen_tgd_add64 (o0, got, temp2, addr));
4131 insn = emit_call_insn (gen_tgd_call64 (o0, sparc_tls_get_addr (),
4134 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), o0);
4135 insn = get_insns ();
4137 emit_libcall_block (insn, ret, o0, addr);
4140 case TLS_MODEL_LOCAL_DYNAMIC:
4142 temp1 = gen_reg_rtx (SImode);
4143 temp2 = gen_reg_rtx (SImode);
4144 temp3 = gen_reg_rtx (Pmode);
4145 ret = gen_reg_rtx (Pmode);
4146 o0 = gen_rtx_REG (Pmode, 8);
4147 got = sparc_tls_got ();
4148 emit_insn (gen_tldm_hi22 (temp1));
4149 emit_insn (gen_tldm_lo10 (temp2, temp1));
4152 emit_insn (gen_tldm_add32 (o0, got, temp2));
4153 insn = emit_call_insn (gen_tldm_call32 (o0, sparc_tls_get_addr (),
4158 emit_insn (gen_tldm_add64 (o0, got, temp2));
4159 insn = emit_call_insn (gen_tldm_call64 (o0, sparc_tls_get_addr (),
4162 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), o0);
4163 insn = get_insns ();
4165 emit_libcall_block (insn, temp3, o0,
4166 gen_rtx_UNSPEC (Pmode, gen_rtvec (1, const0_rtx),
4167 UNSPEC_TLSLD_BASE));
4168 temp1 = gen_reg_rtx (SImode);
4169 temp2 = gen_reg_rtx (SImode);
4170 emit_insn (gen_tldo_hix22 (temp1, addr));
4171 emit_insn (gen_tldo_lox10 (temp2, temp1, addr));
4173 emit_insn (gen_tldo_add32 (ret, temp3, temp2, addr));
4175 emit_insn (gen_tldo_add64 (ret, temp3, temp2, addr));
4178 case TLS_MODEL_INITIAL_EXEC:
4179 temp1 = gen_reg_rtx (SImode);
4180 temp2 = gen_reg_rtx (SImode);
4181 temp3 = gen_reg_rtx (Pmode);
4182 got = sparc_tls_got ();
4183 emit_insn (gen_tie_hi22 (temp1, addr));
4184 emit_insn (gen_tie_lo10 (temp2, temp1, addr));
4186 emit_insn (gen_tie_ld32 (temp3, got, temp2, addr));
4188 emit_insn (gen_tie_ld64 (temp3, got, temp2, addr));
4191 ret = gen_reg_rtx (Pmode);
4193 emit_insn (gen_tie_add32 (ret, gen_rtx_REG (Pmode, 7),
4196 emit_insn (gen_tie_add64 (ret, gen_rtx_REG (Pmode, 7),
4200 ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp3);
4203 case TLS_MODEL_LOCAL_EXEC:
4204 temp1 = gen_reg_rtx (Pmode);
4205 temp2 = gen_reg_rtx (Pmode);
4208 emit_insn (gen_tle_hix22_sp32 (temp1, addr));
4209 emit_insn (gen_tle_lox10_sp32 (temp2, temp1, addr));
4213 emit_insn (gen_tle_hix22_sp64 (temp1, addr));
4214 emit_insn (gen_tle_lox10_sp64 (temp2, temp1, addr));
4216 ret = gen_rtx_PLUS (Pmode, gen_rtx_REG (Pmode, 7), temp2);
4223 else if (GET_CODE (addr) == CONST)
4227 gcc_assert (GET_CODE (XEXP (addr, 0)) == PLUS);
4229 base = sparc_legitimize_tls_address (XEXP (XEXP (addr, 0), 0));
4230 offset = XEXP (XEXP (addr, 0), 1);
4232 base = force_operand (base, NULL_RTX);
4233 if (!(GET_CODE (offset) == CONST_INT && SMALL_INT (offset)))
4234 offset = force_reg (Pmode, offset);
4235 ret = gen_rtx_PLUS (Pmode, base, offset);
4239 gcc_unreachable (); /* for now ... */
4244 /* Legitimize PIC addresses. If the address is already position-independent,
4245 we return ORIG. Newly generated position-independent addresses go into a
4246 reg. This is REG if nonzero, otherwise we allocate register(s) as
4250 sparc_legitimize_pic_address (rtx orig, rtx reg)
4252 bool gotdata_op = false;
4254 if (GET_CODE (orig) == SYMBOL_REF
4255 /* See the comment in sparc_expand_move. */
4256 || (GET_CODE (orig) == LABEL_REF && !can_use_mov_pic_label_ref (orig)))
4258 rtx pic_ref, address;
4263 gcc_assert (can_create_pseudo_p ());
4264 reg = gen_reg_rtx (Pmode);
4269 /* If not during reload, allocate another temp reg here for loading
4270 in the address, so that these instructions can be optimized
4272 rtx temp_reg = (! can_create_pseudo_p ()
4273 ? reg : gen_reg_rtx (Pmode));
4275 /* Must put the SYMBOL_REF inside an UNSPEC here so that cse
4276 won't get confused into thinking that these two instructions
4277 are loading in the true address of the symbol. If in the
4278 future a PIC rtx exists, that should be used instead. */
4281 emit_insn (gen_movdi_high_pic (temp_reg, orig));
4282 emit_insn (gen_movdi_lo_sum_pic (temp_reg, temp_reg, orig));
4286 emit_insn (gen_movsi_high_pic (temp_reg, orig));
4287 emit_insn (gen_movsi_lo_sum_pic (temp_reg, temp_reg, orig));
4295 crtl->uses_pic_offset_table = 1;
4299 insn = emit_insn (gen_movdi_pic_gotdata_op (reg,
4300 pic_offset_table_rtx,
4303 insn = emit_insn (gen_movsi_pic_gotdata_op (reg,
4304 pic_offset_table_rtx,
4310 = gen_const_mem (Pmode,
4311 gen_rtx_PLUS (Pmode,
4312 pic_offset_table_rtx, address));
4313 insn = emit_move_insn (reg, pic_ref);
4316 /* Put a REG_EQUAL note on this insn, so that it can be optimized
4318 set_unique_reg_note (insn, REG_EQUAL, orig);
4321 else if (GET_CODE (orig) == CONST)
4325 if (GET_CODE (XEXP (orig, 0)) == PLUS
4326 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
4331 gcc_assert (can_create_pseudo_p ());
4332 reg = gen_reg_rtx (Pmode);
4335 gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
4336 base = sparc_legitimize_pic_address (XEXP (XEXP (orig, 0), 0), reg);
4337 offset = sparc_legitimize_pic_address (XEXP (XEXP (orig, 0), 1),
4338 base == reg ? NULL_RTX : reg);
4340 if (GET_CODE (offset) == CONST_INT)
4342 if (SMALL_INT (offset))
4343 return plus_constant (Pmode, base, INTVAL (offset));
4344 else if (can_create_pseudo_p ())
4345 offset = force_reg (Pmode, offset);
4347 /* If we reach here, then something is seriously wrong. */
4350 return gen_rtx_PLUS (Pmode, base, offset);
4352 else if (GET_CODE (orig) == LABEL_REF)
4353 /* ??? We ought to be checking that the register is live instead, in case
4354 it is eliminated. */
4355 crtl->uses_pic_offset_table = 1;
4360 /* Try machine-dependent ways of modifying an illegitimate address X
4361 to be legitimate. If we find one, return the new, valid address.
4363 OLDX is the address as it was before break_out_memory_refs was called.
4364 In some cases it is useful to look at this to decide what needs to be done.
4366 MODE is the mode of the operand pointed to by X.
4368 On SPARC, change REG+N into REG+REG, and REG+(X*Y) into REG+REG. */
4371 sparc_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
4372 enum machine_mode mode)
4376 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == MULT)
4377 x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
4378 force_operand (XEXP (x, 0), NULL_RTX));
4379 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == MULT)
4380 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
4381 force_operand (XEXP (x, 1), NULL_RTX));
4382 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == PLUS)
4383 x = gen_rtx_PLUS (Pmode, force_operand (XEXP (x, 0), NULL_RTX),
4385 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == PLUS)
4386 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
4387 force_operand (XEXP (x, 1), NULL_RTX));
4389 if (x != orig_x && sparc_legitimate_address_p (mode, x, FALSE))
4392 if (sparc_tls_referenced_p (x))
4393 x = sparc_legitimize_tls_address (x);
4395 x = sparc_legitimize_pic_address (x, NULL_RTX);
4396 else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 1)))
4397 x = gen_rtx_PLUS (Pmode, XEXP (x, 0),
4398 copy_to_mode_reg (Pmode, XEXP (x, 1)));
4399 else if (GET_CODE (x) == PLUS && CONSTANT_ADDRESS_P (XEXP (x, 0)))
4400 x = gen_rtx_PLUS (Pmode, XEXP (x, 1),
4401 copy_to_mode_reg (Pmode, XEXP (x, 0)));
4402 else if (GET_CODE (x) == SYMBOL_REF
4403 || GET_CODE (x) == CONST
4404 || GET_CODE (x) == LABEL_REF)
4405 x = copy_to_suggested_reg (x, NULL_RTX, Pmode);
4410 /* Delegitimize an address that was legitimized by the above function. */
4413 sparc_delegitimize_address (rtx x)
4415 x = delegitimize_mem_from_attrs (x);
4417 if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 1)) == UNSPEC)
4418 switch (XINT (XEXP (x, 1), 1))
4420 case UNSPEC_MOVE_PIC:
4422 x = XVECEXP (XEXP (x, 1), 0, 0);
4423 gcc_assert (GET_CODE (x) == SYMBOL_REF);
4429 /* This is generated by mov{si,di}_pic_label_ref in PIC mode. */
4430 if (GET_CODE (x) == MINUS
4431 && REG_P (XEXP (x, 0))
4432 && REGNO (XEXP (x, 0)) == PIC_OFFSET_TABLE_REGNUM
4433 && GET_CODE (XEXP (x, 1)) == LO_SUM
4434 && GET_CODE (XEXP (XEXP (x, 1), 1)) == UNSPEC
4435 && XINT (XEXP (XEXP (x, 1), 1), 1) == UNSPEC_MOVE_PIC_LABEL)
4437 x = XVECEXP (XEXP (XEXP (x, 1), 1), 0, 0);
4438 gcc_assert (GET_CODE (x) == LABEL_REF);
4444 /* SPARC implementation of LEGITIMIZE_RELOAD_ADDRESS. Returns a value to
4445 replace the input X, or the original X if no replacement is called for.
4446 The output parameter *WIN is 1 if the calling macro should goto WIN,
4449 For SPARC, we wish to handle addresses by splitting them into
4450 HIGH+LO_SUM pairs, retaining the LO_SUM in the memory reference.
4451 This cuts the number of extra insns by one.
4453 Do nothing when generating PIC code and the address is a symbolic
4454 operand or requires a scratch register. */
4457 sparc_legitimize_reload_address (rtx x, enum machine_mode mode,
4458 int opnum, int type,
4459 int ind_levels ATTRIBUTE_UNUSED, int *win)
4461 /* Decompose SImode constants into HIGH+LO_SUM. */
4463 && (mode != TFmode || TARGET_ARCH64)
4464 && GET_MODE (x) == SImode
4465 && GET_CODE (x) != LO_SUM
4466 && GET_CODE (x) != HIGH
4467 && sparc_cmodel <= CM_MEDLOW
4469 && (symbolic_operand (x, Pmode) || pic_address_needs_scratch (x))))
4471 x = gen_rtx_LO_SUM (GET_MODE (x), gen_rtx_HIGH (GET_MODE (x), x), x);
4472 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4473 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
4474 opnum, (enum reload_type)type);
4479 /* We have to recognize what we have already generated above. */
4480 if (GET_CODE (x) == LO_SUM && GET_CODE (XEXP (x, 0)) == HIGH)
4482 push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
4483 BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
4484 opnum, (enum reload_type)type);
4493 /* Return true if ADDR (a legitimate address expression)
4494 has an effect that depends on the machine mode it is used for.
4500 is not equivalent to
4502 (mem:QI [%l7+a]) (mem:QI [%l7+a+1])
4504 because [%l7+a+1] is interpreted as the address of (a+1). */
4508 sparc_mode_dependent_address_p (const_rtx addr,
4509 addr_space_t as ATTRIBUTE_UNUSED)
4511 if (flag_pic && GET_CODE (addr) == PLUS)
4513 rtx op0 = XEXP (addr, 0);
4514 rtx op1 = XEXP (addr, 1);
4515 if (op0 == pic_offset_table_rtx
4516 && symbolic_operand (op1, VOIDmode))
4523 #ifdef HAVE_GAS_HIDDEN
4524 # define USE_HIDDEN_LINKONCE 1
4526 # define USE_HIDDEN_LINKONCE 0
4530 get_pc_thunk_name (char name[32], unsigned int regno)
4532 const char *reg_name = reg_names[regno];
4534 /* Skip the leading '%' as that cannot be used in a
4538 if (USE_HIDDEN_LINKONCE)
4539 sprintf (name, "__sparc_get_pc_thunk.%s", reg_name);
4541 ASM_GENERATE_INTERNAL_LABEL (name, "LADDPC", regno);
4544 /* Wrapper around the load_pcrel_sym{si,di} patterns. */
4547 gen_load_pcrel_sym (rtx op0, rtx op1, rtx op2, rtx op3)
4549 int orig_flag_pic = flag_pic;
4552 /* The load_pcrel_sym{si,di} patterns require absolute addressing. */
4555 insn = gen_load_pcrel_symdi (op0, op1, op2, op3);
4557 insn = gen_load_pcrel_symsi (op0, op1, op2, op3);
4558 flag_pic = orig_flag_pic;
4563 /* Emit code to load the GOT register. */
4566 load_got_register (void)
4568 /* In PIC mode, this will retrieve pic_offset_table_rtx. */
4569 if (!global_offset_table_rtx)
4570 global_offset_table_rtx = gen_rtx_REG (Pmode, GLOBAL_OFFSET_TABLE_REGNUM);
4572 if (TARGET_VXWORKS_RTP)
4573 emit_insn (gen_vxworks_load_got ());
4576 /* The GOT symbol is subject to a PC-relative relocation so we need a
4577 helper function to add the PC value and thus get the final value. */
4578 if (!got_helper_rtx)
4581 get_pc_thunk_name (name, GLOBAL_OFFSET_TABLE_REGNUM);
4582 got_helper_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (name));
4585 emit_insn (gen_load_pcrel_sym (global_offset_table_rtx, sparc_got (),
4587 GEN_INT (GLOBAL_OFFSET_TABLE_REGNUM)));
4590 /* Need to emit this whether or not we obey regdecls,
4591 since setjmp/longjmp can cause life info to screw up.
4592 ??? In the case where we don't obey regdecls, this is not sufficient
4593 since we may not fall out the bottom. */
4594 emit_use (global_offset_table_rtx);
4597 /* Emit a call instruction with the pattern given by PAT. ADDR is the
4598 address of the call target. */
4601 sparc_emit_call_insn (rtx pat, rtx addr)
4605 insn = emit_call_insn (pat);
4607 /* The PIC register is live on entry to VxWorks PIC PLT entries. */
4608 if (TARGET_VXWORKS_RTP
4610 && GET_CODE (addr) == SYMBOL_REF
4611 && (SYMBOL_REF_DECL (addr)
4612 ? !targetm.binds_local_p (SYMBOL_REF_DECL (addr))
4613 : !SYMBOL_REF_LOCAL_P (addr)))
4615 use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx);
4616 crtl->uses_pic_offset_table = 1;
4620 /* Return 1 if RTX is a MEM which is known to be aligned to at
4621 least a DESIRED byte boundary. */
4624 mem_min_alignment (rtx mem, int desired)
4626 rtx addr, base, offset;
4628 /* If it's not a MEM we can't accept it. */
4629 if (GET_CODE (mem) != MEM)
4633 if (!TARGET_UNALIGNED_DOUBLES
4634 && MEM_ALIGN (mem) / BITS_PER_UNIT >= (unsigned)desired)
4637 /* ??? The rest of the function predates MEM_ALIGN so
4638 there is probably a bit of redundancy. */
4639 addr = XEXP (mem, 0);
4640 base = offset = NULL_RTX;
4641 if (GET_CODE (addr) == PLUS)
4643 if (GET_CODE (XEXP (addr, 0)) == REG)
4645 base = XEXP (addr, 0);
4647 /* What we are saying here is that if the base
4648 REG is aligned properly, the compiler will make
4649 sure any REG based index upon it will be so
4651 if (GET_CODE (XEXP (addr, 1)) == CONST_INT)
4652 offset = XEXP (addr, 1);
4654 offset = const0_rtx;
4657 else if (GET_CODE (addr) == REG)
4660 offset = const0_rtx;
4663 if (base != NULL_RTX)
4665 int regno = REGNO (base);
4667 if (regno != HARD_FRAME_POINTER_REGNUM && regno != STACK_POINTER_REGNUM)
4669 /* Check if the compiler has recorded some information
4670 about the alignment of the base REG. If reload has
4671 completed, we already matched with proper alignments.
4672 If not running global_alloc, reload might give us
4673 unaligned pointer to local stack though. */
4675 && REGNO_POINTER_ALIGN (regno) >= desired * BITS_PER_UNIT)
4676 || (optimize && reload_completed))
4677 && (INTVAL (offset) & (desired - 1)) == 0)
4682 if (((INTVAL (offset) - SPARC_STACK_BIAS) & (desired - 1)) == 0)
4686 else if (! TARGET_UNALIGNED_DOUBLES
4687 || CONSTANT_P (addr)
4688 || GET_CODE (addr) == LO_SUM)
4690 /* Anything else we know is properly aligned unless TARGET_UNALIGNED_DOUBLES
4691 is true, in which case we can only assume that an access is aligned if
4692 it is to a constant address, or the address involves a LO_SUM. */
4696 /* An obviously unaligned address. */
4701 /* Vectors to keep interesting information about registers where it can easily
4702 be got. We used to use the actual mode value as the bit number, but there
4703 are more than 32 modes now. Instead we use two tables: one indexed by
4704 hard register number, and one indexed by mode. */
4706 /* The purpose of sparc_mode_class is to shrink the range of modes so that
4707 they all fit (as bit numbers) in a 32-bit word (again). Each real mode is
4708 mapped into one sparc_mode_class mode. */
4710 enum sparc_mode_class {
4711 H_MODE, S_MODE, D_MODE, T_MODE, O_MODE,
4712 SF_MODE, DF_MODE, TF_MODE, OF_MODE,
4716 /* Modes for single-word and smaller quantities. */
4718 ((1 << (int) H_MODE) | (1 << (int) S_MODE) | (1 << (int) SF_MODE))
4720 /* Modes for double-word and smaller quantities. */
4721 #define D_MODES (S_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
4723 /* Modes for quad-word and smaller quantities. */
4724 #define T_MODES (D_MODES | (1 << (int) T_MODE) | (1 << (int) TF_MODE))
4726 /* Modes for 8-word and smaller quantities. */
4727 #define O_MODES (T_MODES | (1 << (int) O_MODE) | (1 << (int) OF_MODE))
4729 /* Modes for single-float quantities. */
4730 #define SF_MODES ((1 << (int) S_MODE) | (1 << (int) SF_MODE))
4732 /* Modes for double-float and smaller quantities. */
4733 #define DF_MODES (SF_MODES | (1 << (int) D_MODE) | (1 << DF_MODE))
4735 /* Modes for quad-float and smaller quantities. */
4736 #define TF_MODES (DF_MODES | (1 << (int) TF_MODE))
4738 /* Modes for quad-float pairs and smaller quantities. */
4739 #define OF_MODES (TF_MODES | (1 << (int) OF_MODE))
4741 /* Modes for double-float only quantities. */
4742 #define DF_MODES_NO_S ((1 << (int) D_MODE) | (1 << (int) DF_MODE))
4744 /* Modes for quad-float and double-float only quantities. */
4745 #define TF_MODES_NO_S (DF_MODES_NO_S | (1 << (int) TF_MODE))
4747 /* Modes for quad-float pairs and double-float only quantities. */
4748 #define OF_MODES_NO_S (TF_MODES_NO_S | (1 << (int) OF_MODE))
4750 /* Modes for condition codes. */
4751 #define CC_MODES (1 << (int) CC_MODE)
4752 #define CCFP_MODES (1 << (int) CCFP_MODE)
4754 /* Value is 1 if register/mode pair is acceptable on sparc.
4755 The funny mixture of D and T modes is because integer operations
4756 do not specially operate on tetra quantities, so non-quad-aligned
4757 registers can hold quadword quantities (except %o4 and %i4 because
4758 they cross fixed registers). */
4760 /* This points to either the 32 bit or the 64 bit version. */
4761 const int *hard_regno_mode_classes;
4763 static const int hard_32bit_mode_classes[] = {
4764 S_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
4765 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
4766 T_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
4767 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
4769 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4770 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4771 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4772 OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
4774 /* FP regs f32 to f63. Only the even numbered registers actually exist,
4775 and none can hold SFmode/SImode values. */
4776 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4777 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4778 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4779 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4782 CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
4784 /* %icc, %sfp, %gsr */
4785 CC_MODES, 0, D_MODES
4788 static const int hard_64bit_mode_classes[] = {
4789 D_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4790 O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4791 T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4792 O_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES, T_MODES, D_MODES,
4794 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4795 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4796 OF_MODES, SF_MODES, DF_MODES, SF_MODES, OF_MODES, SF_MODES, DF_MODES, SF_MODES,
4797 OF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
4799 /* FP regs f32 to f63. Only the even numbered registers actually exist,
4800 and none can hold SFmode/SImode values. */
4801 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4802 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4803 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, OF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4804 OF_MODES_NO_S, 0, DF_MODES_NO_S, 0, TF_MODES_NO_S, 0, DF_MODES_NO_S, 0,
4807 CCFP_MODES, CCFP_MODES, CCFP_MODES, CCFP_MODES,
4809 /* %icc, %sfp, %gsr */
4810 CC_MODES, 0, D_MODES
4813 int sparc_mode_class [NUM_MACHINE_MODES];
4815 enum reg_class sparc_regno_reg_class[FIRST_PSEUDO_REGISTER];
4818 sparc_init_modes (void)
4822 for (i = 0; i < NUM_MACHINE_MODES; i++)
4824 enum machine_mode m = (enum machine_mode) i;
4825 unsigned int size = GET_MODE_SIZE (m);
4827 switch (GET_MODE_CLASS (m))
4830 case MODE_PARTIAL_INT:
4831 case MODE_COMPLEX_INT:
4833 sparc_mode_class[i] = 1 << (int) H_MODE;
4835 sparc_mode_class[i] = 1 << (int) S_MODE;
4837 sparc_mode_class[i] = 1 << (int) D_MODE;
4838 else if (size == 16)
4839 sparc_mode_class[i] = 1 << (int) T_MODE;
4840 else if (size == 32)
4841 sparc_mode_class[i] = 1 << (int) O_MODE;
4843 sparc_mode_class[i] = 0;
4845 case MODE_VECTOR_INT:
4847 sparc_mode_class[i] = 1 << (int) SF_MODE;
4849 sparc_mode_class[i] = 1 << (int) DF_MODE;
4851 sparc_mode_class[i] = 0;
4854 case MODE_COMPLEX_FLOAT:
4856 sparc_mode_class[i] = 1 << (int) SF_MODE;
4858 sparc_mode_class[i] = 1 << (int) DF_MODE;
4859 else if (size == 16)
4860 sparc_mode_class[i] = 1 << (int) TF_MODE;
4861 else if (size == 32)
4862 sparc_mode_class[i] = 1 << (int) OF_MODE;
4864 sparc_mode_class[i] = 0;
4867 if (m == CCFPmode || m == CCFPEmode)
4868 sparc_mode_class[i] = 1 << (int) CCFP_MODE;
4870 sparc_mode_class[i] = 1 << (int) CC_MODE;
4873 sparc_mode_class[i] = 0;
4879 hard_regno_mode_classes = hard_64bit_mode_classes;
4881 hard_regno_mode_classes = hard_32bit_mode_classes;
4883 /* Initialize the array used by REGNO_REG_CLASS. */
4884 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
4886 if (i < 16 && TARGET_V8PLUS)
4887 sparc_regno_reg_class[i] = I64_REGS;
4888 else if (i < 32 || i == FRAME_POINTER_REGNUM)
4889 sparc_regno_reg_class[i] = GENERAL_REGS;
4891 sparc_regno_reg_class[i] = FP_REGS;
4893 sparc_regno_reg_class[i] = EXTRA_FP_REGS;
4895 sparc_regno_reg_class[i] = FPCC_REGS;
4897 sparc_regno_reg_class[i] = NO_REGS;
4901 /* Return whether REGNO, a global or FP register, must be saved/restored. */
4904 save_global_or_fp_reg_p (unsigned int regno,
4905 int leaf_function ATTRIBUTE_UNUSED)
4907 return !call_used_regs[regno] && df_regs_ever_live_p (regno);
4910 /* Return whether the return address register (%i7) is needed. */
4913 return_addr_reg_needed_p (int leaf_function)
4915 /* If it is live, for example because of __builtin_return_address (0). */
4916 if (df_regs_ever_live_p (RETURN_ADDR_REGNUM))
4919 /* Otherwise, it is needed as save register if %o7 is clobbered. */
4921 /* Loading the GOT register clobbers %o7. */
4922 || crtl->uses_pic_offset_table
4923 || df_regs_ever_live_p (INCOMING_RETURN_ADDR_REGNUM))
4929 /* Return whether REGNO, a local or in register, must be saved/restored. */
4932 save_local_or_in_reg_p (unsigned int regno, int leaf_function)
4934 /* General case: call-saved registers live at some point. */
4935 if (!call_used_regs[regno] && df_regs_ever_live_p (regno))
4938 /* Frame pointer register (%fp) if needed. */
4939 if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
4942 /* Return address register (%i7) if needed. */
4943 if (regno == RETURN_ADDR_REGNUM && return_addr_reg_needed_p (leaf_function))
4946 /* GOT register (%l7) if needed. */
4947 if (regno == PIC_OFFSET_TABLE_REGNUM && crtl->uses_pic_offset_table)
4950 /* If the function accesses prior frames, the frame pointer and the return
4951 address of the previous frame must be saved on the stack. */
4952 if (crtl->accesses_prior_frames
4953 && (regno == HARD_FRAME_POINTER_REGNUM || regno == RETURN_ADDR_REGNUM))
4959 /* Compute the frame size required by the function. This function is called
4960 during the reload pass and also by sparc_expand_prologue. */
4963 sparc_compute_frame_size (HOST_WIDE_INT size, int leaf_function)
4965 HOST_WIDE_INT frame_size, apparent_frame_size;
4966 int args_size, n_global_fp_regs = 0;
4967 bool save_local_in_regs_p = false;
4970 /* If the function allocates dynamic stack space, the dynamic offset is
4971 computed early and contains REG_PARM_STACK_SPACE, so we need to cope. */
4972 if (leaf_function && !cfun->calls_alloca)
4975 args_size = crtl->outgoing_args_size + REG_PARM_STACK_SPACE (cfun->decl);
4977 /* Calculate space needed for global registers. */
4979 for (i = 0; i < 8; i++)
4980 if (save_global_or_fp_reg_p (i, 0))
4981 n_global_fp_regs += 2;
4983 for (i = 0; i < 8; i += 2)
4984 if (save_global_or_fp_reg_p (i, 0) || save_global_or_fp_reg_p (i + 1, 0))
4985 n_global_fp_regs += 2;
4987 /* In the flat window model, find out which local and in registers need to
4988 be saved. We don't reserve space in the current frame for them as they
4989 will be spilled into the register window save area of the caller's frame.
4990 However, as soon as we use this register window save area, we must create
4991 that of the current frame to make it the live one. */
4993 for (i = 16; i < 32; i++)
4994 if (save_local_or_in_reg_p (i, leaf_function))
4996 save_local_in_regs_p = true;
5000 /* Calculate space needed for FP registers. */
5001 for (i = 32; i < (TARGET_V9 ? 96 : 64); i += 2)
5002 if (save_global_or_fp_reg_p (i, 0) || save_global_or_fp_reg_p (i + 1, 0))
5003 n_global_fp_regs += 2;
5006 && n_global_fp_regs == 0
5008 && !save_local_in_regs_p)
5009 frame_size = apparent_frame_size = 0;
5012 /* We subtract STARTING_FRAME_OFFSET, remember it's negative. */
5013 apparent_frame_size = (size - STARTING_FRAME_OFFSET + 7) & -8;
5014 apparent_frame_size += n_global_fp_regs * 4;
5016 /* We need to add the size of the outgoing argument area. */
5017 frame_size = apparent_frame_size + ((args_size + 7) & -8);
5019 /* And that of the register window save area. */
5020 frame_size += FIRST_PARM_OFFSET (cfun->decl);
5022 /* Finally, bump to the appropriate alignment. */
5023 frame_size = SPARC_STACK_ALIGN (frame_size);
5026 /* Set up values for use in prologue and epilogue. */
5027 sparc_frame_size = frame_size;
5028 sparc_apparent_frame_size = apparent_frame_size;
5029 sparc_n_global_fp_regs = n_global_fp_regs;
5030 sparc_save_local_in_regs_p = save_local_in_regs_p;
5035 /* Implement the macro INITIAL_ELIMINATION_OFFSET, return the OFFSET. */
5038 sparc_initial_elimination_offset (int to)
5042 if (to == STACK_POINTER_REGNUM)
5043 offset = sparc_compute_frame_size (get_frame_size (), crtl->is_leaf);
5047 offset += SPARC_STACK_BIAS;
5051 /* Output any necessary .register pseudo-ops. */
5054 sparc_output_scratch_registers (FILE *file ATTRIBUTE_UNUSED)
5056 #ifdef HAVE_AS_REGISTER_PSEUDO_OP
5062 /* Check if %g[2367] were used without
5063 .register being printed for them already. */
5064 for (i = 2; i < 8; i++)
5066 if (df_regs_ever_live_p (i)
5067 && ! sparc_hard_reg_printed [i])
5069 sparc_hard_reg_printed [i] = 1;
5070 /* %g7 is used as TLS base register, use #ignore
5071 for it instead of #scratch. */
5072 fprintf (file, "\t.register\t%%g%d, #%s\n", i,
5073 i == 7 ? "ignore" : "scratch");
5080 #define PROBE_INTERVAL (1 << STACK_CHECK_PROBE_INTERVAL_EXP)
5082 #if PROBE_INTERVAL > 4096
5083 #error Cannot use indexed addressing mode for stack probing
5086 /* Emit code to probe a range of stack addresses from FIRST to FIRST+SIZE,
5087 inclusive. These are offsets from the current stack pointer.
5089 Note that we don't use the REG+REG addressing mode for the probes because
5090 of the stack bias in 64-bit mode. And it doesn't really buy us anything
5091 so the advantages of having a single code win here. */
5094 sparc_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
5096 rtx g1 = gen_rtx_REG (Pmode, 1);
5098 /* See if we have a constant small number of probes to generate. If so,
5099 that's the easy case. */
5100 if (size <= PROBE_INTERVAL)
5102 emit_move_insn (g1, GEN_INT (first));
5103 emit_insn (gen_rtx_SET (VOIDmode, g1,
5104 gen_rtx_MINUS (Pmode, stack_pointer_rtx, g1)));
5105 emit_stack_probe (plus_constant (Pmode, g1, -size));
5108 /* The run-time loop is made up of 10 insns in the generic case while the
5109 compile-time loop is made up of 4+2*(n-2) insns for n # of intervals. */
5110 else if (size <= 5 * PROBE_INTERVAL)
5114 emit_move_insn (g1, GEN_INT (first + PROBE_INTERVAL));
5115 emit_insn (gen_rtx_SET (VOIDmode, g1,
5116 gen_rtx_MINUS (Pmode, stack_pointer_rtx, g1)));
5117 emit_stack_probe (g1);
5119 /* Probe at FIRST + N * PROBE_INTERVAL for values of N from 2 until
5120 it exceeds SIZE. If only two probes are needed, this will not
5121 generate any code. Then probe at FIRST + SIZE. */
5122 for (i = 2 * PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
5124 emit_insn (gen_rtx_SET (VOIDmode, g1,
5125 plus_constant (Pmode, g1, -PROBE_INTERVAL)));
5126 emit_stack_probe (g1);
5129 emit_stack_probe (plus_constant (Pmode, g1,
5130 (i - PROBE_INTERVAL) - size));
5133 /* Otherwise, do the same as above, but in a loop. Note that we must be
5134 extra careful with variables wrapping around because we might be at
5135 the very top (or the very bottom) of the address space and we have
5136 to be able to handle this case properly; in particular, we use an
5137 equality test for the loop condition. */
5140 HOST_WIDE_INT rounded_size;
5141 rtx g4 = gen_rtx_REG (Pmode, 4);
5143 emit_move_insn (g1, GEN_INT (first));
5146 /* Step 1: round SIZE to the previous multiple of the interval. */
5148 rounded_size = size & -PROBE_INTERVAL;
5149 emit_move_insn (g4, GEN_INT (rounded_size));
5152 /* Step 2: compute initial and final value of the loop counter. */
5154 /* TEST_ADDR = SP + FIRST. */
5155 emit_insn (gen_rtx_SET (VOIDmode, g1,
5156 gen_rtx_MINUS (Pmode, stack_pointer_rtx, g1)));
5158 /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE. */
5159 emit_insn (gen_rtx_SET (VOIDmode, g4, gen_rtx_MINUS (Pmode, g1, g4)));
5164 while (TEST_ADDR != LAST_ADDR)
5166 TEST_ADDR = TEST_ADDR + PROBE_INTERVAL
5170 probes at FIRST + N * PROBE_INTERVAL for values of N from 1
5171 until it is equal to ROUNDED_SIZE. */
5174 emit_insn (gen_probe_stack_rangedi (g1, g1, g4));
5176 emit_insn (gen_probe_stack_rangesi (g1, g1, g4));
5179 /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
5180 that SIZE is equal to ROUNDED_SIZE. */
5182 if (size != rounded_size)
5183 emit_stack_probe (plus_constant (Pmode, g4, rounded_size - size));
5186 /* Make sure nothing is scheduled before we are done. */
5187 emit_insn (gen_blockage ());
5190 /* Probe a range of stack addresses from REG1 to REG2 inclusive. These are
5191 absolute addresses. */
5194 output_probe_stack_range (rtx reg1, rtx reg2)
5196 static int labelno = 0;
5197 char loop_lab[32], end_lab[32];
5200 ASM_GENERATE_INTERNAL_LABEL (loop_lab, "LPSRL", labelno);
5201 ASM_GENERATE_INTERNAL_LABEL (end_lab, "LPSRE", labelno++);
5203 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, loop_lab);
5205 /* Jump to END_LAB if TEST_ADDR == LAST_ADDR. */
5208 output_asm_insn ("cmp\t%0, %1", xops);
5210 fputs ("\tbe,pn\t%xcc,", asm_out_file);
5212 fputs ("\tbe\t", asm_out_file);
5213 assemble_name_raw (asm_out_file, end_lab);
5214 fputc ('\n', asm_out_file);
5216 /* TEST_ADDR = TEST_ADDR + PROBE_INTERVAL. */
5217 xops[1] = GEN_INT (-PROBE_INTERVAL);
5218 output_asm_insn (" add\t%0, %1, %0", xops);
5220 /* Probe at TEST_ADDR and branch. */
5222 fputs ("\tba,pt\t%xcc,", asm_out_file);
5224 fputs ("\tba\t", asm_out_file);
5225 assemble_name_raw (asm_out_file, loop_lab);
5226 fputc ('\n', asm_out_file);
5227 xops[1] = GEN_INT (SPARC_STACK_BIAS);
5228 output_asm_insn (" st\t%%g0, [%0+%1]", xops);
5230 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, end_lab);
5235 /* Emit code to save/restore registers from LOW to HIGH at BASE+OFFSET as
5236 needed. LOW is supposed to be double-word aligned for 32-bit registers.
5237 SAVE_P decides whether a register must be saved/restored. ACTION_TRUE
5238 is the action to be performed if SAVE_P returns true and ACTION_FALSE
5239 the action to be performed if it returns false. Return the new offset. */
5241 typedef bool (*sorr_pred_t) (unsigned int, int);
5242 typedef enum { SORR_NONE, SORR_ADVANCE, SORR_SAVE, SORR_RESTORE } sorr_act_t;
5245 emit_save_or_restore_regs (unsigned int low, unsigned int high, rtx base,
5246 int offset, int leaf_function, sorr_pred_t save_p,
5247 sorr_act_t action_true, sorr_act_t action_false)
5252 if (TARGET_ARCH64 && high <= 32)
5256 for (i = low; i < high; i++)
5258 if (save_p (i, leaf_function))
5260 mem = gen_frame_mem (DImode, plus_constant (Pmode,
5262 if (action_true == SORR_SAVE)
5264 insn = emit_move_insn (mem, gen_rtx_REG (DImode, i));
5265 RTX_FRAME_RELATED_P (insn) = 1;
5267 else /* action_true == SORR_RESTORE */
5269 /* The frame pointer must be restored last since its old
5270 value may be used as base address for the frame. This
5271 is problematic in 64-bit mode only because of the lack
5272 of double-word load instruction. */
5273 if (i == HARD_FRAME_POINTER_REGNUM)
5276 emit_move_insn (gen_rtx_REG (DImode, i), mem);
5280 else if (action_false == SORR_ADVANCE)
5286 mem = gen_frame_mem (DImode, plus_constant (Pmode, base, fp_offset));
5287 emit_move_insn (hard_frame_pointer_rtx, mem);
5292 for (i = low; i < high; i += 2)
5294 bool reg0 = save_p (i, leaf_function);
5295 bool reg1 = save_p (i + 1, leaf_function);
5296 enum machine_mode mode;
5301 mode = SPARC_INT_REG_P (i) ? DImode : DFmode;
5306 mode = SPARC_INT_REG_P (i) ? SImode : SFmode;
5311 mode = SPARC_INT_REG_P (i) ? SImode : SFmode;
5317 if (action_false == SORR_ADVANCE)
5322 mem = gen_frame_mem (mode, plus_constant (Pmode, base, offset));
5323 if (action_true == SORR_SAVE)
5325 insn = emit_move_insn (mem, gen_rtx_REG (mode, regno));
5326 RTX_FRAME_RELATED_P (insn) = 1;
5330 mem = gen_frame_mem (SImode, plus_constant (Pmode, base,
5332 set1 = gen_rtx_SET (VOIDmode, mem,
5333 gen_rtx_REG (SImode, regno));
5334 RTX_FRAME_RELATED_P (set1) = 1;
5336 = gen_frame_mem (SImode, plus_constant (Pmode, base,
5338 set2 = gen_rtx_SET (VOIDmode, mem,
5339 gen_rtx_REG (SImode, regno + 1));
5340 RTX_FRAME_RELATED_P (set2) = 1;
5341 add_reg_note (insn, REG_FRAME_RELATED_EXPR,
5342 gen_rtx_PARALLEL (VOIDmode,
5343 gen_rtvec (2, set1, set2)));
5346 else /* action_true == SORR_RESTORE */
5347 emit_move_insn (gen_rtx_REG (mode, regno), mem);
5349 /* Always preserve double-word alignment. */
5350 offset = (offset + 8) & -8;
5357 /* Emit code to adjust BASE to OFFSET. Return the new base. */
5360 emit_adjust_base_to_offset (rtx base, int offset)
5362 /* ??? This might be optimized a little as %g1 might already have a
5363 value close enough that a single add insn will do. */
5364 /* ??? Although, all of this is probably only a temporary fix because
5365 if %g1 can hold a function result, then sparc_expand_epilogue will
5366 lose (the result will be clobbered). */
5367 rtx new_base = gen_rtx_REG (Pmode, 1);
5368 emit_move_insn (new_base, GEN_INT (offset));
5369 emit_insn (gen_rtx_SET (VOIDmode,
5370 new_base, gen_rtx_PLUS (Pmode, base, new_base)));
5374 /* Emit code to save/restore call-saved global and FP registers. */
5377 emit_save_or_restore_global_fp_regs (rtx base, int offset, sorr_act_t action)
5379 if (offset < -4096 || offset + sparc_n_global_fp_regs * 4 > 4095)
5381 base = emit_adjust_base_to_offset (base, offset);
5386 = emit_save_or_restore_regs (0, 8, base, offset, 0,
5387 save_global_or_fp_reg_p, action, SORR_NONE);
5388 emit_save_or_restore_regs (32, TARGET_V9 ? 96 : 64, base, offset, 0,
5389 save_global_or_fp_reg_p, action, SORR_NONE);
5392 /* Emit code to save/restore call-saved local and in registers. */
5395 emit_save_or_restore_local_in_regs (rtx base, int offset, sorr_act_t action)
5397 if (offset < -4096 || offset + 16 * UNITS_PER_WORD > 4095)
5399 base = emit_adjust_base_to_offset (base, offset);
5403 emit_save_or_restore_regs (16, 32, base, offset, sparc_leaf_function_p,
5404 save_local_or_in_reg_p, action, SORR_ADVANCE);
5407 /* Emit a window_save insn. */
5410 emit_window_save (rtx increment)
5412 rtx insn = emit_insn (gen_window_save (increment));
5413 RTX_FRAME_RELATED_P (insn) = 1;
5415 /* The incoming return address (%o7) is saved in %i7. */
5416 add_reg_note (insn, REG_CFA_REGISTER,
5417 gen_rtx_SET (VOIDmode,
5418 gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM),
5420 INCOMING_RETURN_ADDR_REGNUM)));
5422 /* The window save event. */
5423 add_reg_note (insn, REG_CFA_WINDOW_SAVE, const0_rtx);
5425 /* The CFA is %fp, the hard frame pointer. */
5426 add_reg_note (insn, REG_CFA_DEF_CFA,
5427 plus_constant (Pmode, hard_frame_pointer_rtx,
5428 INCOMING_FRAME_SP_OFFSET));
5433 /* Generate an increment for the stack pointer. */
5436 gen_stack_pointer_inc (rtx increment)
5438 return gen_rtx_SET (VOIDmode,
5440 gen_rtx_PLUS (Pmode,
5445 /* Expand the function prologue. The prologue is responsible for reserving
5446 storage for the frame, saving the call-saved registers and loading the
5447 GOT register if needed. */
5450 sparc_expand_prologue (void)
5455 /* Compute a snapshot of crtl->uses_only_leaf_regs. Relying
5456 on the final value of the flag means deferring the prologue/epilogue
5457 expansion until just before the second scheduling pass, which is too
5458 late to emit multiple epilogues or return insns.
5460 Of course we are making the assumption that the value of the flag
5461 will not change between now and its final value. Of the three parts
5462 of the formula, only the last one can reasonably vary. Let's take a
5463 closer look, after assuming that the first two ones are set to true
5464 (otherwise the last value is effectively silenced).
5466 If only_leaf_regs_used returns false, the global predicate will also
5467 be false so the actual frame size calculated below will be positive.
5468 As a consequence, the save_register_window insn will be emitted in
5469 the instruction stream; now this insn explicitly references %fp
5470 which is not a leaf register so only_leaf_regs_used will always
5471 return false subsequently.
5473 If only_leaf_regs_used returns true, we hope that the subsequent
5474 optimization passes won't cause non-leaf registers to pop up. For
5475 example, the regrename pass has special provisions to not rename to
5476 non-leaf registers in a leaf function. */
5477 sparc_leaf_function_p
5478 = optimize > 0 && crtl->is_leaf && only_leaf_regs_used ();
5480 size = sparc_compute_frame_size (get_frame_size(), sparc_leaf_function_p);
5482 if (flag_stack_usage_info)
5483 current_function_static_stack_size = size;
5485 if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
5487 if (crtl->is_leaf && !cfun->calls_alloca)
5489 if (size > PROBE_INTERVAL && size > STACK_CHECK_PROTECT)
5490 sparc_emit_probe_stack_range (STACK_CHECK_PROTECT,
5491 size - STACK_CHECK_PROTECT);
5494 sparc_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
5499 else if (sparc_leaf_function_p)
5501 rtx size_int_rtx = GEN_INT (-size);
5504 insn = emit_insn (gen_stack_pointer_inc (size_int_rtx));
5505 else if (size <= 8192)
5507 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (-4096)));
5508 RTX_FRAME_RELATED_P (insn) = 1;
5510 /* %sp is still the CFA register. */
5511 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (4096 - size)));
5515 rtx 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_FRAME_RELATED_EXPR,
5519 gen_stack_pointer_inc (size_int_rtx));
5522 RTX_FRAME_RELATED_P (insn) = 1;
5526 rtx size_int_rtx = GEN_INT (-size);
5529 emit_window_save (size_int_rtx);
5530 else if (size <= 8192)
5532 emit_window_save (GEN_INT (-4096));
5534 /* %sp is not the CFA register anymore. */
5535 emit_insn (gen_stack_pointer_inc (GEN_INT (4096 - size)));
5537 /* Make sure no %fp-based store is issued until after the frame is
5538 established. The offset between the frame pointer and the stack
5539 pointer is calculated relative to the value of the stack pointer
5540 at the end of the function prologue, and moving instructions that
5541 access the stack via the frame pointer between the instructions
5542 that decrement the stack pointer could result in accessing the
5543 register window save area, which is volatile. */
5544 emit_insn (gen_frame_blockage ());
5548 rtx size_rtx = gen_rtx_REG (Pmode, 1);
5549 emit_move_insn (size_rtx, size_int_rtx);
5550 emit_window_save (size_rtx);
5554 if (sparc_leaf_function_p)
5556 sparc_frame_base_reg = stack_pointer_rtx;
5557 sparc_frame_base_offset = size + SPARC_STACK_BIAS;
5561 sparc_frame_base_reg = hard_frame_pointer_rtx;
5562 sparc_frame_base_offset = SPARC_STACK_BIAS;
5565 if (sparc_n_global_fp_regs > 0)
5566 emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5567 sparc_frame_base_offset
5568 - sparc_apparent_frame_size,
5571 /* Load the GOT register if needed. */
5572 if (crtl->uses_pic_offset_table)
5573 load_got_register ();
5575 /* Advertise that the data calculated just above are now valid. */
5576 sparc_prologue_data_valid_p = true;
5579 /* Expand the function prologue. The prologue is responsible for reserving
5580 storage for the frame, saving the call-saved registers and loading the
5581 GOT register if needed. */
5584 sparc_flat_expand_prologue (void)
5589 sparc_leaf_function_p = optimize > 0 && crtl->is_leaf;
5591 size = sparc_compute_frame_size (get_frame_size(), sparc_leaf_function_p);
5593 if (flag_stack_usage_info)
5594 current_function_static_stack_size = size;
5596 if (flag_stack_check == STATIC_BUILTIN_STACK_CHECK)
5598 if (crtl->is_leaf && !cfun->calls_alloca)
5600 if (size > PROBE_INTERVAL && size > STACK_CHECK_PROTECT)
5601 sparc_emit_probe_stack_range (STACK_CHECK_PROTECT,
5602 size - STACK_CHECK_PROTECT);
5605 sparc_emit_probe_stack_range (STACK_CHECK_PROTECT, size);
5608 if (sparc_save_local_in_regs_p)
5609 emit_save_or_restore_local_in_regs (stack_pointer_rtx, SPARC_STACK_BIAS,
5616 rtx size_int_rtx, size_rtx;
5618 size_rtx = size_int_rtx = GEN_INT (-size);
5620 /* We establish the frame (i.e. decrement the stack pointer) first, even
5621 if we use a frame pointer, because we cannot clobber any call-saved
5622 registers, including the frame pointer, if we haven't created a new
5623 register save area, for the sake of compatibility with the ABI. */
5625 insn = emit_insn (gen_stack_pointer_inc (size_int_rtx));
5626 else if (size <= 8192 && !frame_pointer_needed)
5628 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (-4096)));
5629 RTX_FRAME_RELATED_P (insn) = 1;
5630 insn = emit_insn (gen_stack_pointer_inc (GEN_INT (4096 - size)));
5634 size_rtx = gen_rtx_REG (Pmode, 1);
5635 emit_move_insn (size_rtx, size_int_rtx);
5636 insn = emit_insn (gen_stack_pointer_inc (size_rtx));
5637 add_reg_note (insn, REG_CFA_ADJUST_CFA,
5638 gen_stack_pointer_inc (size_int_rtx));
5640 RTX_FRAME_RELATED_P (insn) = 1;
5642 /* Ensure nothing is scheduled until after the frame is established. */
5643 emit_insn (gen_blockage ());
5645 if (frame_pointer_needed)
5647 insn = emit_insn (gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
5648 gen_rtx_MINUS (Pmode,
5651 RTX_FRAME_RELATED_P (insn) = 1;
5653 add_reg_note (insn, REG_CFA_ADJUST_CFA,
5654 gen_rtx_SET (VOIDmode, hard_frame_pointer_rtx,
5655 plus_constant (Pmode, stack_pointer_rtx,
5659 if (return_addr_reg_needed_p (sparc_leaf_function_p))
5661 rtx o7 = gen_rtx_REG (Pmode, INCOMING_RETURN_ADDR_REGNUM);
5662 rtx i7 = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
5664 insn = emit_move_insn (i7, o7);
5665 RTX_FRAME_RELATED_P (insn) = 1;
5667 add_reg_note (insn, REG_CFA_REGISTER,
5668 gen_rtx_SET (VOIDmode, i7, o7));
5670 /* Prevent this instruction from ever being considered dead,
5671 even if this function has no epilogue. */
5676 if (frame_pointer_needed)
5678 sparc_frame_base_reg = hard_frame_pointer_rtx;
5679 sparc_frame_base_offset = SPARC_STACK_BIAS;
5683 sparc_frame_base_reg = stack_pointer_rtx;
5684 sparc_frame_base_offset = size + SPARC_STACK_BIAS;
5687 if (sparc_n_global_fp_regs > 0)
5688 emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5689 sparc_frame_base_offset
5690 - sparc_apparent_frame_size,
5693 /* Load the GOT register if needed. */
5694 if (crtl->uses_pic_offset_table)
5695 load_got_register ();
5697 /* Advertise that the data calculated just above are now valid. */
5698 sparc_prologue_data_valid_p = true;
5701 /* This function generates the assembly code for function entry, which boils
5702 down to emitting the necessary .register directives. */
5705 sparc_asm_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
5707 /* Check that the assumption we made in sparc_expand_prologue is valid. */
5709 gcc_assert (sparc_leaf_function_p == crtl->uses_only_leaf_regs);
5711 sparc_output_scratch_registers (file);
5714 /* Expand the function epilogue, either normal or part of a sibcall.
5715 We emit all the instructions except the return or the call. */
5718 sparc_expand_epilogue (bool for_eh)
5720 HOST_WIDE_INT size = sparc_frame_size;
5722 if (sparc_n_global_fp_regs > 0)
5723 emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5724 sparc_frame_base_offset
5725 - sparc_apparent_frame_size,
5728 if (size == 0 || for_eh)
5730 else if (sparc_leaf_function_p)
5733 emit_insn (gen_stack_pointer_inc (GEN_INT (size)));
5734 else if (size <= 8192)
5736 emit_insn (gen_stack_pointer_inc (GEN_INT (4096)));
5737 emit_insn (gen_stack_pointer_inc (GEN_INT (size - 4096)));
5741 rtx reg = gen_rtx_REG (Pmode, 1);
5742 emit_move_insn (reg, GEN_INT (size));
5743 emit_insn (gen_stack_pointer_inc (reg));
5748 /* Expand the function epilogue, either normal or part of a sibcall.
5749 We emit all the instructions except the return or the call. */
5752 sparc_flat_expand_epilogue (bool for_eh)
5754 HOST_WIDE_INT size = sparc_frame_size;
5756 if (sparc_n_global_fp_regs > 0)
5757 emit_save_or_restore_global_fp_regs (sparc_frame_base_reg,
5758 sparc_frame_base_offset
5759 - sparc_apparent_frame_size,
5762 /* If we have a frame pointer, we'll need both to restore it before the
5763 frame is destroyed and use its current value in destroying the frame.
5764 Since we don't have an atomic way to do that in the flat window model,
5765 we save the current value into a temporary register (%g1). */
5766 if (frame_pointer_needed && !for_eh)
5767 emit_move_insn (gen_rtx_REG (Pmode, 1), hard_frame_pointer_rtx);
5769 if (return_addr_reg_needed_p (sparc_leaf_function_p))
5770 emit_move_insn (gen_rtx_REG (Pmode, INCOMING_RETURN_ADDR_REGNUM),
5771 gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM));
5773 if (sparc_save_local_in_regs_p)
5774 emit_save_or_restore_local_in_regs (sparc_frame_base_reg,
5775 sparc_frame_base_offset,
5778 if (size == 0 || for_eh)
5780 else if (frame_pointer_needed)
5782 /* Make sure the frame is destroyed after everything else is done. */
5783 emit_insn (gen_blockage ());
5785 emit_move_insn (stack_pointer_rtx, gen_rtx_REG (Pmode, 1));
5790 emit_insn (gen_blockage ());
5793 emit_insn (gen_stack_pointer_inc (GEN_INT (size)));
5794 else if (size <= 8192)
5796 emit_insn (gen_stack_pointer_inc (GEN_INT (4096)));
5797 emit_insn (gen_stack_pointer_inc (GEN_INT (size - 4096)));
5801 rtx reg = gen_rtx_REG (Pmode, 1);
5802 emit_move_insn (reg, GEN_INT (size));
5803 emit_insn (gen_stack_pointer_inc (reg));
5808 /* Return true if it is appropriate to emit `return' instructions in the
5809 body of a function. */
5812 sparc_can_use_return_insn_p (void)
5814 return sparc_prologue_data_valid_p
5815 && sparc_n_global_fp_regs == 0
5817 ? (sparc_frame_size == 0 && !sparc_save_local_in_regs_p)
5818 : (sparc_frame_size == 0 || !sparc_leaf_function_p);
5821 /* This function generates the assembly code for function exit. */
5824 sparc_asm_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
5826 /* If the last two instructions of a function are "call foo; dslot;"
5827 the return address might point to the first instruction in the next
5828 function and we have to output a dummy nop for the sake of sane
5829 backtraces in such cases. This is pointless for sibling calls since
5830 the return address is explicitly adjusted. */
5832 rtx insn, last_real_insn;
5834 insn = get_last_insn ();
5836 last_real_insn = prev_real_insn (insn);
5838 && NONJUMP_INSN_P (last_real_insn)
5839 && GET_CODE (PATTERN (last_real_insn)) == SEQUENCE)
5840 last_real_insn = XVECEXP (PATTERN (last_real_insn), 0, 0);
5843 && CALL_P (last_real_insn)
5844 && !SIBLING_CALL_P (last_real_insn))
5845 fputs("\tnop\n", file);
5847 sparc_output_deferred_case_vectors ();
5850 /* Output a 'restore' instruction. */
5853 output_restore (rtx pat)
5859 fputs ("\t restore\n", asm_out_file);
5863 gcc_assert (GET_CODE (pat) == SET);
5865 operands[0] = SET_DEST (pat);
5866 pat = SET_SRC (pat);
5868 switch (GET_CODE (pat))
5871 operands[1] = XEXP (pat, 0);
5872 operands[2] = XEXP (pat, 1);
5873 output_asm_insn (" restore %r1, %2, %Y0", operands);
5876 operands[1] = XEXP (pat, 0);
5877 operands[2] = XEXP (pat, 1);
5878 output_asm_insn (" restore %r1, %%lo(%a2), %Y0", operands);
5881 operands[1] = XEXP (pat, 0);
5882 gcc_assert (XEXP (pat, 1) == const1_rtx);
5883 output_asm_insn (" restore %r1, %r1, %Y0", operands);
5887 output_asm_insn (" restore %%g0, %1, %Y0", operands);
5892 /* Output a return. */
5895 output_return (rtx insn)
5897 if (crtl->calls_eh_return)
5899 /* If the function uses __builtin_eh_return, the eh_return
5900 machinery occupies the delay slot. */
5901 gcc_assert (!final_sequence);
5903 if (flag_delayed_branch)
5905 if (!TARGET_FLAT && TARGET_V9)
5906 fputs ("\treturn\t%i7+8\n", asm_out_file);
5910 fputs ("\trestore\n", asm_out_file);
5912 fputs ("\tjmp\t%o7+8\n", asm_out_file);
5915 fputs ("\t add\t%sp, %g1, %sp\n", asm_out_file);
5920 fputs ("\trestore\n", asm_out_file);
5922 fputs ("\tadd\t%sp, %g1, %sp\n", asm_out_file);
5923 fputs ("\tjmp\t%o7+8\n\t nop\n", asm_out_file);
5926 else if (sparc_leaf_function_p || TARGET_FLAT)
5928 /* This is a leaf or flat function so we don't have to bother restoring
5929 the register window, which frees us from dealing with the convoluted
5930 semantics of restore/return. We simply output the jump to the
5931 return address and the insn in the delay slot (if any). */
5933 return "jmp\t%%o7+%)%#";
5937 /* This is a regular function so we have to restore the register window.
5938 We may have a pending insn for the delay slot, which will be either
5939 combined with the 'restore' instruction or put in the delay slot of
5940 the 'return' instruction. */
5946 delay = NEXT_INSN (insn);
5949 pat = PATTERN (delay);
5951 if (TARGET_V9 && ! epilogue_renumber (&pat, 1))
5953 epilogue_renumber (&pat, 0);
5954 return "return\t%%i7+%)%#";
5958 output_asm_insn ("jmp\t%%i7+%)", NULL);
5959 output_restore (pat);
5960 PATTERN (delay) = gen_blockage ();
5961 INSN_CODE (delay) = -1;
5966 /* The delay slot is empty. */
5968 return "return\t%%i7+%)\n\t nop";
5969 else if (flag_delayed_branch)
5970 return "jmp\t%%i7+%)\n\t restore";
5972 return "restore\n\tjmp\t%%o7+%)\n\t nop";
5979 /* Output a sibling call. */
5982 output_sibcall (rtx insn, rtx call_operand)
5986 gcc_assert (flag_delayed_branch);
5988 operands[0] = call_operand;
5990 if (sparc_leaf_function_p || TARGET_FLAT)
5992 /* This is a leaf or flat function so we don't have to bother restoring
5993 the register window. We simply output the jump to the function and
5994 the insn in the delay slot (if any). */
5996 gcc_assert (!(LEAF_SIBCALL_SLOT_RESERVED_P && final_sequence));
5999 output_asm_insn ("sethi\t%%hi(%a0), %%g1\n\tjmp\t%%g1 + %%lo(%a0)%#",
6002 /* Use or with rs2 %%g0 instead of mov, so that as/ld can optimize
6003 it into branch if possible. */
6004 output_asm_insn ("or\t%%o7, %%g0, %%g1\n\tcall\t%a0, 0\n\t or\t%%g1, %%g0, %%o7",
6009 /* This is a regular function so we have to restore the register window.
6010 We may have a pending insn for the delay slot, which will be combined
6011 with the 'restore' instruction. */
6013 output_asm_insn ("call\t%a0, 0", operands);
6017 rtx delay = NEXT_INSN (insn);
6020 output_restore (PATTERN (delay));
6022 PATTERN (delay) = gen_blockage ();
6023 INSN_CODE (delay) = -1;
6026 output_restore (NULL_RTX);
6032 /* Functions for handling argument passing.
6034 For 32-bit, the first 6 args are normally in registers and the rest are
6035 pushed. Any arg that starts within the first 6 words is at least
6036 partially passed in a register unless its data type forbids.
6038 For 64-bit, the argument registers are laid out as an array of 16 elements
6039 and arguments are added sequentially. The first 6 int args and up to the
6040 first 16 fp args (depending on size) are passed in regs.
6042 Slot Stack Integral Float Float in structure Double Long Double
6043 ---- ----- -------- ----- ------------------ ------ -----------
6044 15 [SP+248] %f31 %f30,%f31 %d30
6045 14 [SP+240] %f29 %f28,%f29 %d28 %q28
6046 13 [SP+232] %f27 %f26,%f27 %d26
6047 12 [SP+224] %f25 %f24,%f25 %d24 %q24
6048 11 [SP+216] %f23 %f22,%f23 %d22
6049 10 [SP+208] %f21 %f20,%f21 %d20 %q20
6050 9 [SP+200] %f19 %f18,%f19 %d18
6051 8 [SP+192] %f17 %f16,%f17 %d16 %q16
6052 7 [SP+184] %f15 %f14,%f15 %d14
6053 6 [SP+176] %f13 %f12,%f13 %d12 %q12
6054 5 [SP+168] %o5 %f11 %f10,%f11 %d10
6055 4 [SP+160] %o4 %f9 %f8,%f9 %d8 %q8
6056 3 [SP+152] %o3 %f7 %f6,%f7 %d6
6057 2 [SP+144] %o2 %f5 %f4,%f5 %d4 %q4
6058 1 [SP+136] %o1 %f3 %f2,%f3 %d2
6059 0 [SP+128] %o0 %f1 %f0,%f1 %d0 %q0
6061 Here SP = %sp if -mno-stack-bias or %sp+stack_bias otherwise.
6063 Integral arguments are always passed as 64-bit quantities appropriately
6066 Passing of floating point values is handled as follows.
6067 If a prototype is in scope:
6068 If the value is in a named argument (i.e. not a stdarg function or a
6069 value not part of the `...') then the value is passed in the appropriate
6071 If the value is part of the `...' and is passed in one of the first 6
6072 slots then the value is passed in the appropriate int reg.
6073 If the value is part of the `...' and is not passed in one of the first 6
6074 slots then the value is passed in memory.
6075 If a prototype is not in scope:
6076 If the value is one of the first 6 arguments the value is passed in the
6077 appropriate integer reg and the appropriate fp reg.
6078 If the value is not one of the first 6 arguments the value is passed in
6079 the appropriate fp reg and in memory.
6082 Summary of the calling conventions implemented by GCC on the SPARC:
6085 size argument return value
6087 small integer <4 int. reg. int. reg.
6088 word 4 int. reg. int. reg.
6089 double word 8 int. reg. int. reg.
6091 _Complex small integer <8 int. reg. int. reg.
6092 _Complex word 8 int. reg. int. reg.
6093 _Complex double word 16 memory int. reg.
6095 vector integer <=8 int. reg. FP reg.
6096 vector integer >8 memory memory
6098 float 4 int. reg. FP reg.
6099 double 8 int. reg. FP reg.
6100 long double 16 memory memory
6102 _Complex float 8 memory FP reg.
6103 _Complex double 16 memory FP reg.
6104 _Complex long double 32 memory FP reg.
6106 vector float any memory memory
6108 aggregate any memory memory
6113 size argument return value
6115 small integer <8 int. reg. int. reg.
6116 word 8 int. reg. int. reg.
6117 double word 16 int. reg. int. reg.
6119 _Complex small integer <16 int. reg. int. reg.
6120 _Complex word 16 int. reg. int. reg.
6121 _Complex double word 32 memory int. reg.
6123 vector integer <=16 FP reg. FP reg.
6124 vector integer 16<s<=32 memory FP reg.
6125 vector integer >32 memory memory
6127 float 4 FP reg. FP reg.
6128 double 8 FP reg. FP reg.
6129 long double 16 FP reg. FP reg.
6131 _Complex float 8 FP reg. FP reg.
6132 _Complex double 16 FP reg. FP reg.
6133 _Complex long double 32 memory FP reg.
6135 vector float <=16 FP reg. FP reg.
6136 vector float 16<s<=32 memory FP reg.
6137 vector float >32 memory memory
6139 aggregate <=16 reg. reg.
6140 aggregate 16<s<=32 memory reg.
6141 aggregate >32 memory memory
6145 Note #1: complex floating-point types follow the extended SPARC ABIs as
6146 implemented by the Sun compiler.
6148 Note #2: integral vector types follow the scalar floating-point types
6149 conventions to match what is implemented by the Sun VIS SDK.
6151 Note #3: floating-point vector types follow the aggregate types
6155 /* Maximum number of int regs for args. */
6156 #define SPARC_INT_ARG_MAX 6
6157 /* Maximum number of fp regs for args. */
6158 #define SPARC_FP_ARG_MAX 16
6160 #define ROUND_ADVANCE(SIZE) (((SIZE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
6162 /* Handle the INIT_CUMULATIVE_ARGS macro.
6163 Initialize a variable CUM of type CUMULATIVE_ARGS
6164 for a call to a function whose data type is FNTYPE.
6165 For a library call, FNTYPE is 0. */
6168 init_cumulative_args (struct sparc_args *cum, tree fntype,
6169 rtx libname ATTRIBUTE_UNUSED,
6170 tree fndecl ATTRIBUTE_UNUSED)
6173 cum->prototype_p = fntype && prototype_p (fntype);
6174 cum->libcall_p = fntype == 0;
6177 /* Handle promotion of pointer and integer arguments. */
6179 static enum machine_mode
6180 sparc_promote_function_mode (const_tree type,
6181 enum machine_mode mode,
6183 const_tree fntype ATTRIBUTE_UNUSED,
6184 int for_return ATTRIBUTE_UNUSED)
6186 if (type != NULL_TREE && POINTER_TYPE_P (type))
6188 *punsignedp = POINTERS_EXTEND_UNSIGNED;
6192 /* Integral arguments are passed as full words, as per the ABI. */
6193 if (GET_MODE_CLASS (mode) == MODE_INT
6194 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
6200 /* Handle the TARGET_STRICT_ARGUMENT_NAMING target hook. */
6203 sparc_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
6205 return TARGET_ARCH64 ? true : false;
6208 /* Scan the record type TYPE and return the following predicates:
6209 - INTREGS_P: the record contains at least one field or sub-field
6210 that is eligible for promotion in integer registers.
6211 - FP_REGS_P: the record contains at least one field or sub-field
6212 that is eligible for promotion in floating-point registers.
6213 - PACKED_P: the record contains at least one field that is packed.
6215 Sub-fields are not taken into account for the PACKED_P predicate. */
6218 scan_record_type (const_tree type, int *intregs_p, int *fpregs_p,
6223 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6225 if (TREE_CODE (field) == FIELD_DECL)
6227 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
6228 scan_record_type (TREE_TYPE (field), intregs_p, fpregs_p, 0);
6229 else if ((FLOAT_TYPE_P (TREE_TYPE (field))
6230 || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
6236 if (packed_p && DECL_PACKED (field))
6242 /* Compute the slot number to pass an argument in.
6243 Return the slot number or -1 if passing on the stack.
6245 CUM is a variable of type CUMULATIVE_ARGS which gives info about
6246 the preceding args and about the function being called.
6247 MODE is the argument's machine mode.
6248 TYPE is the data type of the argument (as a tree).
6249 This is null for libcalls where that information may
6251 NAMED is nonzero if this argument is a named parameter
6252 (otherwise it is an extra parameter matching an ellipsis).
6253 INCOMING_P is zero for FUNCTION_ARG, nonzero for FUNCTION_INCOMING_ARG.
6254 *PREGNO records the register number to use if scalar type.
6255 *PPADDING records the amount of padding needed in words. */
6258 function_arg_slotno (const struct sparc_args *cum, enum machine_mode mode,
6259 const_tree type, bool named, bool incoming_p,
6260 int *pregno, int *ppadding)
6262 int regbase = (incoming_p
6263 ? SPARC_INCOMING_INT_ARG_FIRST
6264 : SPARC_OUTGOING_INT_ARG_FIRST);
6265 int slotno = cum->words;
6266 enum mode_class mclass;
6271 if (type && TREE_ADDRESSABLE (type))
6277 && TYPE_ALIGN (type) % PARM_BOUNDARY != 0)
6280 /* For SPARC64, objects requiring 16-byte alignment get it. */
6282 && (type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode)) >= 128
6283 && (slotno & 1) != 0)
6284 slotno++, *ppadding = 1;
6286 mclass = GET_MODE_CLASS (mode);
6287 if (type && TREE_CODE (type) == VECTOR_TYPE)
6289 /* Vector types deserve special treatment because they are
6290 polymorphic wrt their mode, depending upon whether VIS
6291 instructions are enabled. */
6292 if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
6294 /* The SPARC port defines no floating-point vector modes. */
6295 gcc_assert (mode == BLKmode);
6299 /* Integral vector types should either have a vector
6300 mode or an integral mode, because we are guaranteed
6301 by pass_by_reference that their size is not greater
6302 than 16 bytes and TImode is 16-byte wide. */
6303 gcc_assert (mode != BLKmode);
6305 /* Vector integers are handled like floats according to
6307 mclass = MODE_FLOAT;
6314 case MODE_COMPLEX_FLOAT:
6315 case MODE_VECTOR_INT:
6316 if (TARGET_ARCH64 && TARGET_FPU && named)
6318 if (slotno >= SPARC_FP_ARG_MAX)
6320 regno = SPARC_FP_ARG_FIRST + slotno * 2;
6321 /* Arguments filling only one single FP register are
6322 right-justified in the outer double FP register. */
6323 if (GET_MODE_SIZE (mode) <= 4)
6330 case MODE_COMPLEX_INT:
6331 if (slotno >= SPARC_INT_ARG_MAX)
6333 regno = regbase + slotno;
6337 if (mode == VOIDmode)
6338 /* MODE is VOIDmode when generating the actual call. */
6341 gcc_assert (mode == BLKmode);
6345 || (TREE_CODE (type) != VECTOR_TYPE
6346 && TREE_CODE (type) != RECORD_TYPE))
6348 if (slotno >= SPARC_INT_ARG_MAX)
6350 regno = regbase + slotno;
6352 else /* TARGET_ARCH64 && type */
6354 int intregs_p = 0, fpregs_p = 0, packed_p = 0;
6356 /* First see what kinds of registers we would need. */
6357 if (TREE_CODE (type) == VECTOR_TYPE)
6360 scan_record_type (type, &intregs_p, &fpregs_p, &packed_p);
6362 /* The ABI obviously doesn't specify how packed structures
6363 are passed. These are defined to be passed in int regs
6364 if possible, otherwise memory. */
6365 if (packed_p || !named)
6366 fpregs_p = 0, intregs_p = 1;
6368 /* If all arg slots are filled, then must pass on stack. */
6369 if (fpregs_p && slotno >= SPARC_FP_ARG_MAX)
6372 /* If there are only int args and all int arg slots are filled,
6373 then must pass on stack. */
6374 if (!fpregs_p && intregs_p && slotno >= SPARC_INT_ARG_MAX)
6377 /* Note that even if all int arg slots are filled, fp members may
6378 still be passed in regs if such regs are available.
6379 *PREGNO isn't set because there may be more than one, it's up
6380 to the caller to compute them. */
6393 /* Handle recursive register counting for structure field layout. */
6395 struct function_arg_record_value_parms
6397 rtx ret; /* return expression being built. */
6398 int slotno; /* slot number of the argument. */
6399 int named; /* whether the argument is named. */
6400 int regbase; /* regno of the base register. */
6401 int stack; /* 1 if part of the argument is on the stack. */
6402 int intoffset; /* offset of the first pending integer field. */
6403 unsigned int nregs; /* number of words passed in registers. */
6406 static void function_arg_record_value_3
6407 (HOST_WIDE_INT, struct function_arg_record_value_parms *);
6408 static void function_arg_record_value_2
6409 (const_tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool);
6410 static void function_arg_record_value_1
6411 (const_tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool);
6412 static rtx function_arg_record_value (const_tree, enum machine_mode, int, int, int);
6413 static rtx function_arg_union_value (int, enum machine_mode, int, int);
6415 /* A subroutine of function_arg_record_value. Traverse the structure
6416 recursively and determine how many registers will be required. */
6419 function_arg_record_value_1 (const_tree type, HOST_WIDE_INT startbitpos,
6420 struct function_arg_record_value_parms *parms,
6425 /* We need to compute how many registers are needed so we can
6426 allocate the PARALLEL but before we can do that we need to know
6427 whether there are any packed fields. The ABI obviously doesn't
6428 specify how structures are passed in this case, so they are
6429 defined to be passed in int regs if possible, otherwise memory,
6430 regardless of whether there are fp values present. */
6433 for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
6435 if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
6442 /* Compute how many registers we need. */
6443 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6445 if (TREE_CODE (field) == FIELD_DECL)
6447 HOST_WIDE_INT bitpos = startbitpos;
6449 if (DECL_SIZE (field) != 0)
6451 if (integer_zerop (DECL_SIZE (field)))
6454 if (tree_fits_uhwi_p (bit_position (field)))
6455 bitpos += int_bit_position (field);
6458 /* ??? FIXME: else assume zero offset. */
6460 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
6461 function_arg_record_value_1 (TREE_TYPE (field),
6465 else if ((FLOAT_TYPE_P (TREE_TYPE (field))
6466 || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
6471 if (parms->intoffset != -1)
6473 unsigned int startbit, endbit;
6474 int intslots, this_slotno;
6476 startbit = parms->intoffset & -BITS_PER_WORD;
6477 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
6479 intslots = (endbit - startbit) / BITS_PER_WORD;
6480 this_slotno = parms->slotno + parms->intoffset
6483 if (intslots > 0 && intslots > SPARC_INT_ARG_MAX - this_slotno)
6485 intslots = MAX (0, SPARC_INT_ARG_MAX - this_slotno);
6486 /* We need to pass this field on the stack. */
6490 parms->nregs += intslots;
6491 parms->intoffset = -1;
6494 /* There's no need to check this_slotno < SPARC_FP_ARG MAX.
6495 If it wasn't true we wouldn't be here. */
6496 if (TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE
6497 && DECL_MODE (field) == BLKmode)
6498 parms->nregs += TYPE_VECTOR_SUBPARTS (TREE_TYPE (field));
6499 else if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
6506 if (parms->intoffset == -1)
6507 parms->intoffset = bitpos;
6513 /* A subroutine of function_arg_record_value. Assign the bits of the
6514 structure between parms->intoffset and bitpos to integer registers. */
6517 function_arg_record_value_3 (HOST_WIDE_INT bitpos,
6518 struct function_arg_record_value_parms *parms)
6520 enum machine_mode mode;
6522 unsigned int startbit, endbit;
6523 int this_slotno, intslots, intoffset;
6526 if (parms->intoffset == -1)
6529 intoffset = parms->intoffset;
6530 parms->intoffset = -1;
6532 startbit = intoffset & -BITS_PER_WORD;
6533 endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD;
6534 intslots = (endbit - startbit) / BITS_PER_WORD;
6535 this_slotno = parms->slotno + intoffset / BITS_PER_WORD;
6537 intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno);
6541 /* If this is the trailing part of a word, only load that much into
6542 the register. Otherwise load the whole register. Note that in
6543 the latter case we may pick up unwanted bits. It's not a problem
6544 at the moment but may wish to revisit. */
6546 if (intoffset % BITS_PER_WORD != 0)
6547 mode = smallest_mode_for_size (BITS_PER_WORD - intoffset % BITS_PER_WORD,
6552 intoffset /= BITS_PER_UNIT;
6555 regno = parms->regbase + this_slotno;
6556 reg = gen_rtx_REG (mode, regno);
6557 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
6558 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (intoffset));
6561 intoffset = (intoffset | (UNITS_PER_WORD-1)) + 1;
6566 while (intslots > 0);
6569 /* A subroutine of function_arg_record_value. Traverse the structure
6570 recursively and assign bits to floating point registers. Track which
6571 bits in between need integer registers; invoke function_arg_record_value_3
6572 to make that happen. */
6575 function_arg_record_value_2 (const_tree type, HOST_WIDE_INT startbitpos,
6576 struct function_arg_record_value_parms *parms,
6582 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6584 if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field))
6591 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
6593 if (TREE_CODE (field) == FIELD_DECL)
6595 HOST_WIDE_INT bitpos = startbitpos;
6597 if (DECL_SIZE (field) != 0)
6599 if (integer_zerop (DECL_SIZE (field)))
6602 if (tree_fits_uhwi_p (bit_position (field)))
6603 bitpos += int_bit_position (field);
6606 /* ??? FIXME: else assume zero offset. */
6608 if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
6609 function_arg_record_value_2 (TREE_TYPE (field),
6613 else if ((FLOAT_TYPE_P (TREE_TYPE (field))
6614 || TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
6619 int this_slotno = parms->slotno + bitpos / BITS_PER_WORD;
6620 int regno, nregs, pos;
6621 enum machine_mode mode = DECL_MODE (field);
6624 function_arg_record_value_3 (bitpos, parms);
6626 if (TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE
6629 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field)));
6630 nregs = TYPE_VECTOR_SUBPARTS (TREE_TYPE (field));
6632 else if (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE)
6634 mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (field)));
6640 regno = SPARC_FP_ARG_FIRST + this_slotno * 2;
6641 if (GET_MODE_SIZE (mode) <= 4 && (bitpos & 32) != 0)
6643 reg = gen_rtx_REG (mode, regno);
6644 pos = bitpos / BITS_PER_UNIT;
6645 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
6646 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (pos));
6650 regno += GET_MODE_SIZE (mode) / 4;
6651 reg = gen_rtx_REG (mode, regno);
6652 pos += GET_MODE_SIZE (mode);
6653 XVECEXP (parms->ret, 0, parms->stack + parms->nregs)
6654 = gen_rtx_EXPR_LIST (VOIDmode, reg, GEN_INT (pos));
6660 if (parms->intoffset == -1)
6661 parms->intoffset = bitpos;
6667 /* Used by function_arg and sparc_function_value_1 to implement the complex
6668 conventions of the 64-bit ABI for passing and returning structures.
6669 Return an expression valid as a return value for the FUNCTION_ARG
6670 and TARGET_FUNCTION_VALUE.
6672 TYPE is the data type of the argument (as a tree).
6673 This is null for libcalls where that information may
6675 MODE is the argument's machine mode.
6676 SLOTNO is the index number of the argument's slot in the parameter array.
6677 NAMED is nonzero if this argument is a named parameter
6678 (otherwise it is an extra parameter matching an ellipsis).
6679 REGBASE is the regno of the base register for the parameter array. */
6682 function_arg_record_value (const_tree type, enum machine_mode mode,
6683 int slotno, int named, int regbase)
6685 HOST_WIDE_INT typesize = int_size_in_bytes (type);
6686 struct function_arg_record_value_parms parms;
6689 parms.ret = NULL_RTX;
6690 parms.slotno = slotno;
6691 parms.named = named;
6692 parms.regbase = regbase;
6695 /* Compute how many registers we need. */
6697 parms.intoffset = 0;
6698 function_arg_record_value_1 (type, 0, &parms, false);
6700 /* Take into account pending integer fields. */
6701 if (parms.intoffset != -1)
6703 unsigned int startbit, endbit;
6704 int intslots, this_slotno;
6706 startbit = parms.intoffset & -BITS_PER_WORD;
6707 endbit = (typesize*BITS_PER_UNIT + BITS_PER_WORD - 1) & -BITS_PER_WORD;
6708 intslots = (endbit - startbit) / BITS_PER_WORD;
6709 this_slotno = slotno + parms.intoffset / BITS_PER_WORD;
6711 if (intslots > 0 && intslots > SPARC_INT_ARG_MAX - this_slotno)
6713 intslots = MAX (0, SPARC_INT_ARG_MAX - this_slotno);
6714 /* We need to pass this field on the stack. */
6718 parms.nregs += intslots;
6720 nregs = parms.nregs;
6722 /* Allocate the vector and handle some annoying special cases. */
6725 /* ??? Empty structure has no value? Duh? */
6728 /* Though there's nothing really to store, return a word register
6729 anyway so the rest of gcc doesn't go nuts. Returning a PARALLEL
6730 leads to breakage due to the fact that there are zero bytes to
6732 return gen_rtx_REG (mode, regbase);
6736 /* ??? C++ has structures with no fields, and yet a size. Give up
6737 for now and pass everything back in integer registers. */
6738 nregs = (typesize + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
6740 if (nregs + slotno > SPARC_INT_ARG_MAX)
6741 nregs = SPARC_INT_ARG_MAX - slotno;
6743 gcc_assert (nregs != 0);
6745 parms.ret = gen_rtx_PARALLEL (mode, rtvec_alloc (parms.stack + nregs));
6747 /* If at least one field must be passed on the stack, generate
6748 (parallel [(expr_list (nil) ...) ...]) so that all fields will
6749 also be passed on the stack. We can't do much better because the
6750 semantics of TARGET_ARG_PARTIAL_BYTES doesn't handle the case
6751 of structures for which the fields passed exclusively in registers
6752 are not at the beginning of the structure. */
6754 XVECEXP (parms.ret, 0, 0)
6755 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
6757 /* Fill in the entries. */
6759 parms.intoffset = 0;
6760 function_arg_record_value_2 (type, 0, &parms, false);
6761 function_arg_record_value_3 (typesize * BITS_PER_UNIT, &parms);
6763 gcc_assert (parms.nregs == nregs);
6768 /* Used by function_arg and sparc_function_value_1 to implement the conventions
6769 of the 64-bit ABI for passing and returning unions.
6770 Return an expression valid as a return value for the FUNCTION_ARG
6771 and TARGET_FUNCTION_VALUE.
6773 SIZE is the size in bytes of the union.
6774 MODE is the argument's machine mode.
6775 REGNO is the hard register the union will be passed in. */
6778 function_arg_union_value (int size, enum machine_mode mode, int slotno,
6781 int nwords = ROUND_ADVANCE (size), i;
6784 /* See comment in previous function for empty structures. */
6786 return gen_rtx_REG (mode, regno);
6788 if (slotno == SPARC_INT_ARG_MAX - 1)
6791 regs = gen_rtx_PARALLEL (mode, rtvec_alloc (nwords));
6793 for (i = 0; i < nwords; i++)
6795 /* Unions are passed left-justified. */
6796 XVECEXP (regs, 0, i)
6797 = gen_rtx_EXPR_LIST (VOIDmode,
6798 gen_rtx_REG (word_mode, regno),
6799 GEN_INT (UNITS_PER_WORD * i));
6806 /* Used by function_arg and sparc_function_value_1 to implement the conventions
6807 for passing and returning large (BLKmode) vectors.
6808 Return an expression valid as a return value for the FUNCTION_ARG
6809 and TARGET_FUNCTION_VALUE.
6811 SIZE is the size in bytes of the vector (at least 8 bytes).
6812 REGNO is the FP hard register the vector will be passed in. */
6815 function_arg_vector_value (int size, int regno)
6817 int i, nregs = size / 8;
6820 regs = gen_rtx_PARALLEL (BLKmode, rtvec_alloc (nregs));
6822 for (i = 0; i < nregs; i++)
6824 XVECEXP (regs, 0, i)
6825 = gen_rtx_EXPR_LIST (VOIDmode,
6826 gen_rtx_REG (DImode, regno + 2*i),
6833 /* Determine where to put an argument to a function.
6834 Value is zero to push the argument on the stack,
6835 or a hard register in which to store the argument.
6837 CUM is a variable of type CUMULATIVE_ARGS which gives info about
6838 the preceding args and about the function being called.
6839 MODE is the argument's machine mode.
6840 TYPE is the data type of the argument (as a tree).
6841 This is null for libcalls where that information may
6843 NAMED is true if this argument is a named parameter
6844 (otherwise it is an extra parameter matching an ellipsis).
6845 INCOMING_P is false for TARGET_FUNCTION_ARG, true for
6846 TARGET_FUNCTION_INCOMING_ARG. */
6849 sparc_function_arg_1 (cumulative_args_t cum_v, enum machine_mode mode,
6850 const_tree type, bool named, bool incoming_p)
6852 const CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
6854 int regbase = (incoming_p
6855 ? SPARC_INCOMING_INT_ARG_FIRST
6856 : SPARC_OUTGOING_INT_ARG_FIRST);
6857 int slotno, regno, padding;
6858 enum mode_class mclass = GET_MODE_CLASS (mode);
6860 slotno = function_arg_slotno (cum, mode, type, named, incoming_p,
6865 /* Vector types deserve special treatment because they are polymorphic wrt
6866 their mode, depending upon whether VIS instructions are enabled. */
6867 if (type && TREE_CODE (type) == VECTOR_TYPE)
6869 HOST_WIDE_INT size = int_size_in_bytes (type);
6870 gcc_assert ((TARGET_ARCH32 && size <= 8)
6871 || (TARGET_ARCH64 && size <= 16));
6873 if (mode == BLKmode)
6874 return function_arg_vector_value (size,
6875 SPARC_FP_ARG_FIRST + 2*slotno);
6877 mclass = MODE_FLOAT;
6881 return gen_rtx_REG (mode, regno);
6883 /* Structures up to 16 bytes in size are passed in arg slots on the stack
6884 and are promoted to registers if possible. */
6885 if (type && TREE_CODE (type) == RECORD_TYPE)
6887 HOST_WIDE_INT size = int_size_in_bytes (type);
6888 gcc_assert (size <= 16);
6890 return function_arg_record_value (type, mode, slotno, named, regbase);
6893 /* Unions up to 16 bytes in size are passed in integer registers. */
6894 else if (type && TREE_CODE (type) == UNION_TYPE)
6896 HOST_WIDE_INT size = int_size_in_bytes (type);
6897 gcc_assert (size <= 16);
6899 return function_arg_union_value (size, mode, slotno, regno);
6902 /* v9 fp args in reg slots beyond the int reg slots get passed in regs
6903 but also have the slot allocated for them.
6904 If no prototype is in scope fp values in register slots get passed
6905 in two places, either fp regs and int regs or fp regs and memory. */
6906 else if ((mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
6907 && SPARC_FP_REG_P (regno))
6909 rtx reg = gen_rtx_REG (mode, regno);
6910 if (cum->prototype_p || cum->libcall_p)
6912 /* "* 2" because fp reg numbers are recorded in 4 byte
6915 /* ??? This will cause the value to be passed in the fp reg and
6916 in the stack. When a prototype exists we want to pass the
6917 value in the reg but reserve space on the stack. That's an
6918 optimization, and is deferred [for a bit]. */
6919 if ((regno - SPARC_FP_ARG_FIRST) >= SPARC_INT_ARG_MAX * 2)
6920 return gen_rtx_PARALLEL (mode,
6922 gen_rtx_EXPR_LIST (VOIDmode,
6923 NULL_RTX, const0_rtx),
6924 gen_rtx_EXPR_LIST (VOIDmode,
6928 /* ??? It seems that passing back a register even when past
6929 the area declared by REG_PARM_STACK_SPACE will allocate
6930 space appropriately, and will not copy the data onto the
6931 stack, exactly as we desire.
6933 This is due to locate_and_pad_parm being called in
6934 expand_call whenever reg_parm_stack_space > 0, which
6935 while beneficial to our example here, would seem to be
6936 in error from what had been intended. Ho hum... -- r~ */
6944 if ((regno - SPARC_FP_ARG_FIRST) < SPARC_INT_ARG_MAX * 2)
6948 /* On incoming, we don't need to know that the value
6949 is passed in %f0 and %i0, and it confuses other parts
6950 causing needless spillage even on the simplest cases. */
6954 intreg = (SPARC_OUTGOING_INT_ARG_FIRST
6955 + (regno - SPARC_FP_ARG_FIRST) / 2);
6957 v0 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
6958 v1 = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (mode, intreg),
6960 return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
6964 v0 = gen_rtx_EXPR_LIST (VOIDmode, NULL_RTX, const0_rtx);
6965 v1 = gen_rtx_EXPR_LIST (VOIDmode, reg, const0_rtx);
6966 return gen_rtx_PARALLEL (mode, gen_rtvec (2, v0, v1));
6971 /* All other aggregate types are passed in an integer register in a mode
6972 corresponding to the size of the type. */
6973 else if (type && AGGREGATE_TYPE_P (type))
6975 HOST_WIDE_INT size = int_size_in_bytes (type);
6976 gcc_assert (size <= 16);
6978 mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
6981 return gen_rtx_REG (mode, regno);
6984 /* Handle the TARGET_FUNCTION_ARG target hook. */
6987 sparc_function_arg (cumulative_args_t cum, enum machine_mode mode,
6988 const_tree type, bool named)
6990 return sparc_function_arg_1 (cum, mode, type, named, false);
6993 /* Handle the TARGET_FUNCTION_INCOMING_ARG target hook. */
6996 sparc_function_incoming_arg (cumulative_args_t cum, enum machine_mode mode,
6997 const_tree type, bool named)
6999 return sparc_function_arg_1 (cum, mode, type, named, true);
7002 /* For sparc64, objects requiring 16 byte alignment are passed that way. */
7005 sparc_function_arg_boundary (enum machine_mode mode, const_tree type)
7007 return ((TARGET_ARCH64
7008 && (GET_MODE_ALIGNMENT (mode) == 128
7009 || (type && TYPE_ALIGN (type) == 128)))
7014 /* For an arg passed partly in registers and partly in memory,
7015 this is the number of bytes of registers used.
7016 For args passed entirely in registers or entirely in memory, zero.
7018 Any arg that starts in the first 6 regs but won't entirely fit in them
7019 needs partial registers on v8. On v9, structures with integer
7020 values in arg slots 5,6 will be passed in %o5 and SP+176, and complex fp
7021 values that begin in the last fp reg [where "last fp reg" varies with the
7022 mode] will be split between that reg and memory. */
7025 sparc_arg_partial_bytes (cumulative_args_t cum, enum machine_mode mode,
7026 tree type, bool named)
7028 int slotno, regno, padding;
7030 /* We pass false for incoming_p here, it doesn't matter. */
7031 slotno = function_arg_slotno (get_cumulative_args (cum), mode, type, named,
7032 false, ®no, &padding);
7039 if ((slotno + (mode == BLKmode
7040 ? ROUND_ADVANCE (int_size_in_bytes (type))
7041 : ROUND_ADVANCE (GET_MODE_SIZE (mode))))
7042 > SPARC_INT_ARG_MAX)
7043 return (SPARC_INT_ARG_MAX - slotno) * UNITS_PER_WORD;
7047 /* We are guaranteed by pass_by_reference that the size of the
7048 argument is not greater than 16 bytes, so we only need to return
7049 one word if the argument is partially passed in registers. */
7051 if (type && AGGREGATE_TYPE_P (type))
7053 int size = int_size_in_bytes (type);
7055 if (size > UNITS_PER_WORD
7056 && slotno == SPARC_INT_ARG_MAX - 1)
7057 return UNITS_PER_WORD;
7059 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_INT
7060 || (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
7061 && ! (TARGET_FPU && named)))
7063 /* The complex types are passed as packed types. */
7064 if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
7065 && slotno == SPARC_INT_ARG_MAX - 1)
7066 return UNITS_PER_WORD;
7068 else if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
7070 if ((slotno + GET_MODE_SIZE (mode) / UNITS_PER_WORD)
7072 return UNITS_PER_WORD;
7079 /* Handle the TARGET_PASS_BY_REFERENCE target hook.
7080 Specify whether to pass the argument by reference. */
7083 sparc_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED,
7084 enum machine_mode mode, const_tree type,
7085 bool named ATTRIBUTE_UNUSED)
7088 /* Original SPARC 32-bit ABI says that structures and unions,
7089 and quad-precision floats are passed by reference. For Pascal,
7090 also pass arrays by reference. All other base types are passed
7093 Extended ABI (as implemented by the Sun compiler) says that all
7094 complex floats are passed by reference. Pass complex integers
7095 in registers up to 8 bytes. More generally, enforce the 2-word
7096 cap for passing arguments in registers.
7098 Vector ABI (as implemented by the Sun VIS SDK) says that vector
7099 integers are passed like floats of the same size, that is in
7100 registers up to 8 bytes. Pass all vector floats by reference
7101 like structure and unions. */
7102 return ((type && (AGGREGATE_TYPE_P (type) || VECTOR_FLOAT_TYPE_P (type)))
7104 /* Catch CDImode, TFmode, DCmode and TCmode. */
7105 || GET_MODE_SIZE (mode) > 8
7107 && TREE_CODE (type) == VECTOR_TYPE
7108 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8));
7110 /* Original SPARC 64-bit ABI says that structures and unions
7111 smaller than 16 bytes are passed in registers, as well as
7112 all other base types.
7114 Extended ABI (as implemented by the Sun compiler) says that
7115 complex floats are passed in registers up to 16 bytes. Pass
7116 all complex integers in registers up to 16 bytes. More generally,
7117 enforce the 2-word cap for passing arguments in registers.
7119 Vector ABI (as implemented by the Sun VIS SDK) says that vector
7120 integers are passed like floats of the same size, that is in
7121 registers (up to 16 bytes). Pass all vector floats like structure
7124 && (AGGREGATE_TYPE_P (type) || TREE_CODE (type) == VECTOR_TYPE)
7125 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 16)
7126 /* Catch CTImode and TCmode. */
7127 || GET_MODE_SIZE (mode) > 16);
7130 /* Handle the TARGET_FUNCTION_ARG_ADVANCE hook.
7131 Update the data in CUM to advance over an argument
7132 of mode MODE and data type TYPE.
7133 TYPE is null for libcalls where that information may not be available. */
7136 sparc_function_arg_advance (cumulative_args_t cum_v, enum machine_mode mode,
7137 const_tree type, bool named)
7139 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
7142 /* We pass false for incoming_p here, it doesn't matter. */
7143 function_arg_slotno (cum, mode, type, named, false, ®no, &padding);
7145 /* If argument requires leading padding, add it. */
7146 cum->words += padding;
7150 cum->words += (mode != BLKmode
7151 ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
7152 : ROUND_ADVANCE (int_size_in_bytes (type)));
7156 if (type && AGGREGATE_TYPE_P (type))
7158 int size = int_size_in_bytes (type);
7162 else if (size <= 16)
7164 else /* passed by reference */
7169 cum->words += (mode != BLKmode
7170 ? ROUND_ADVANCE (GET_MODE_SIZE (mode))
7171 : ROUND_ADVANCE (int_size_in_bytes (type)));
7176 /* Handle the FUNCTION_ARG_PADDING macro.
7177 For the 64 bit ABI structs are always stored left shifted in their
7181 function_arg_padding (enum machine_mode mode, const_tree type)
7183 if (TARGET_ARCH64 && type != 0 && AGGREGATE_TYPE_P (type))
7186 /* Fall back to the default. */
7187 return DEFAULT_FUNCTION_ARG_PADDING (mode, type);
7190 /* Handle the TARGET_RETURN_IN_MEMORY target hook.
7191 Specify whether to return the return value in memory. */
7194 sparc_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
7197 /* Original SPARC 32-bit ABI says that structures and unions,
7198 and quad-precision floats are returned in memory. All other
7199 base types are returned in registers.
7201 Extended ABI (as implemented by the Sun compiler) says that
7202 all complex floats are returned in registers (8 FP registers
7203 at most for '_Complex long double'). Return all complex integers
7204 in registers (4 at most for '_Complex long long').
7206 Vector ABI (as implemented by the Sun VIS SDK) says that vector
7207 integers are returned like floats of the same size, that is in
7208 registers up to 8 bytes and in memory otherwise. Return all
7209 vector floats in memory like structure and unions; note that
7210 they always have BLKmode like the latter. */
7211 return (TYPE_MODE (type) == BLKmode
7212 || TYPE_MODE (type) == TFmode
7213 || (TREE_CODE (type) == VECTOR_TYPE
7214 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 8));
7216 /* Original SPARC 64-bit ABI says that structures and unions
7217 smaller than 32 bytes are returned in registers, as well as
7218 all other base types.
7220 Extended ABI (as implemented by the Sun compiler) says that all
7221 complex floats are returned in registers (8 FP registers at most
7222 for '_Complex long double'). Return all complex integers in
7223 registers (4 at most for '_Complex TItype').
7225 Vector ABI (as implemented by the Sun VIS SDK) says that vector
7226 integers are returned like floats of the same size, that is in
7227 registers. Return all vector floats like structure and unions;
7228 note that they always have BLKmode like the latter. */
7229 return (TYPE_MODE (type) == BLKmode
7230 && (unsigned HOST_WIDE_INT) int_size_in_bytes (type) > 32);
7233 /* Handle the TARGET_STRUCT_VALUE target hook.
7234 Return where to find the structure return value address. */
7237 sparc_struct_value_rtx (tree fndecl, int incoming)
7246 mem = gen_frame_mem (Pmode, plus_constant (Pmode, frame_pointer_rtx,
7247 STRUCT_VALUE_OFFSET));
7249 mem = gen_frame_mem (Pmode, plus_constant (Pmode, stack_pointer_rtx,
7250 STRUCT_VALUE_OFFSET));
7252 /* Only follow the SPARC ABI for fixed-size structure returns.
7253 Variable size structure returns are handled per the normal
7254 procedures in GCC. This is enabled by -mstd-struct-return */
7256 && sparc_std_struct_return
7257 && TYPE_SIZE_UNIT (TREE_TYPE (fndecl))
7258 && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (fndecl))) == INTEGER_CST)
7260 /* We must check and adjust the return address, as it is
7261 optional as to whether the return object is really
7263 rtx ret_reg = gen_rtx_REG (Pmode, 31);
7264 rtx scratch = gen_reg_rtx (SImode);
7265 rtx endlab = gen_label_rtx ();
7267 /* Calculate the return object size */
7268 tree size = TYPE_SIZE_UNIT (TREE_TYPE (fndecl));
7269 rtx size_rtx = GEN_INT (TREE_INT_CST_LOW (size) & 0xfff);
7270 /* Construct a temporary return value */
7272 = assign_stack_local (Pmode, TREE_INT_CST_LOW (size), 0);
7274 /* Implement SPARC 32-bit psABI callee return struct checking:
7276 Fetch the instruction where we will return to and see if
7277 it's an unimp instruction (the most significant 10 bits
7279 emit_move_insn (scratch, gen_rtx_MEM (SImode,
7280 plus_constant (Pmode,
7282 /* Assume the size is valid and pre-adjust */
7283 emit_insn (gen_add3_insn (ret_reg, ret_reg, GEN_INT (4)));
7284 emit_cmp_and_jump_insns (scratch, size_rtx, EQ, const0_rtx, SImode,
7286 emit_insn (gen_sub3_insn (ret_reg, ret_reg, GEN_INT (4)));
7287 /* Write the address of the memory pointed to by temp_val into
7288 the memory pointed to by mem */
7289 emit_move_insn (mem, XEXP (temp_val, 0));
7290 emit_label (endlab);
7297 /* Handle TARGET_FUNCTION_VALUE, and TARGET_LIBCALL_VALUE target hook.
7298 For v9, function return values are subject to the same rules as arguments,
7299 except that up to 32 bytes may be returned in registers. */
7302 sparc_function_value_1 (const_tree type, enum machine_mode mode,
7305 /* Beware that the two values are swapped here wrt function_arg. */
7306 int regbase = (outgoing
7307 ? SPARC_INCOMING_INT_ARG_FIRST
7308 : SPARC_OUTGOING_INT_ARG_FIRST);
7309 enum mode_class mclass = GET_MODE_CLASS (mode);
7312 /* Vector types deserve special treatment because they are polymorphic wrt
7313 their mode, depending upon whether VIS instructions are enabled. */
7314 if (type && TREE_CODE (type) == VECTOR_TYPE)
7316 HOST_WIDE_INT size = int_size_in_bytes (type);
7317 gcc_assert ((TARGET_ARCH32 && size <= 8)
7318 || (TARGET_ARCH64 && size <= 32));
7320 if (mode == BLKmode)
7321 return function_arg_vector_value (size,
7322 SPARC_FP_ARG_FIRST);
7324 mclass = MODE_FLOAT;
7327 if (TARGET_ARCH64 && type)
7329 /* Structures up to 32 bytes in size are returned in registers. */
7330 if (TREE_CODE (type) == RECORD_TYPE)
7332 HOST_WIDE_INT size = int_size_in_bytes (type);
7333 gcc_assert (size <= 32);
7335 return function_arg_record_value (type, mode, 0, 1, regbase);
7338 /* Unions up to 32 bytes in size are returned in integer registers. */
7339 else if (TREE_CODE (type) == UNION_TYPE)
7341 HOST_WIDE_INT size = int_size_in_bytes (type);
7342 gcc_assert (size <= 32);
7344 return function_arg_union_value (size, mode, 0, regbase);
7347 /* Objects that require it are returned in FP registers. */
7348 else if (mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT)
7351 /* All other aggregate types are returned in an integer register in a
7352 mode corresponding to the size of the type. */
7353 else if (AGGREGATE_TYPE_P (type))
7355 /* All other aggregate types are passed in an integer register
7356 in a mode corresponding to the size of the type. */
7357 HOST_WIDE_INT size = int_size_in_bytes (type);
7358 gcc_assert (size <= 32);
7360 mode = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
7362 /* ??? We probably should have made the same ABI change in
7363 3.4.0 as the one we made for unions. The latter was
7364 required by the SCD though, while the former is not
7365 specified, so we favored compatibility and efficiency.
7367 Now we're stuck for aggregates larger than 16 bytes,
7368 because OImode vanished in the meantime. Let's not
7369 try to be unduly clever, and simply follow the ABI
7370 for unions in that case. */
7371 if (mode == BLKmode)
7372 return function_arg_union_value (size, mode, 0, regbase);
7377 /* We should only have pointer and integer types at this point. This
7378 must match sparc_promote_function_mode. */
7379 else if (mclass == MODE_INT && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
7383 /* We should only have pointer and integer types at this point. This must
7384 match sparc_promote_function_mode. */
7385 else if (TARGET_ARCH32
7386 && mclass == MODE_INT
7387 && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
7390 if ((mclass == MODE_FLOAT || mclass == MODE_COMPLEX_FLOAT) && TARGET_FPU)
7391 regno = SPARC_FP_ARG_FIRST;
7395 return gen_rtx_REG (mode, regno);
7398 /* Handle TARGET_FUNCTION_VALUE.
7399 On the SPARC, the value is found in the first "output" register, but the
7400 called function leaves it in the first "input" register. */
7403 sparc_function_value (const_tree valtype,
7404 const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
7407 return sparc_function_value_1 (valtype, TYPE_MODE (valtype), outgoing);
7410 /* Handle TARGET_LIBCALL_VALUE. */
7413 sparc_libcall_value (enum machine_mode mode,
7414 const_rtx fun ATTRIBUTE_UNUSED)
7416 return sparc_function_value_1 (NULL_TREE, mode, false);
7419 /* Handle FUNCTION_VALUE_REGNO_P.
7420 On the SPARC, the first "output" reg is used for integer values, and the
7421 first floating point register is used for floating point values. */
7424 sparc_function_value_regno_p (const unsigned int regno)
7426 return (regno == 8 || regno == 32);
7429 /* Do what is necessary for `va_start'. We look at the current function
7430 to determine if stdarg or varargs is used and return the address of
7431 the first unnamed parameter. */
7434 sparc_builtin_saveregs (void)
7436 int first_reg = crtl->args.info.words;
7440 for (regno = first_reg; regno < SPARC_INT_ARG_MAX; regno++)
7441 emit_move_insn (gen_rtx_MEM (word_mode,
7442 gen_rtx_PLUS (Pmode,
7444 GEN_INT (FIRST_PARM_OFFSET (0)
7447 gen_rtx_REG (word_mode,
7448 SPARC_INCOMING_INT_ARG_FIRST + regno));
7450 address = gen_rtx_PLUS (Pmode,
7452 GEN_INT (FIRST_PARM_OFFSET (0)
7453 + UNITS_PER_WORD * first_reg));
7458 /* Implement `va_start' for stdarg. */
7461 sparc_va_start (tree valist, rtx nextarg)
7463 nextarg = expand_builtin_saveregs ();
7464 std_expand_builtin_va_start (valist, nextarg);
7467 /* Implement `va_arg' for stdarg. */
7470 sparc_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
7473 HOST_WIDE_INT size, rsize, align;
7476 tree ptrtype = build_pointer_type (type);
7478 if (pass_by_reference (NULL, TYPE_MODE (type), type, false))
7481 size = rsize = UNITS_PER_WORD;
7487 size = int_size_in_bytes (type);
7488 rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
7493 /* For SPARC64, objects requiring 16-byte alignment get it. */
7494 if (TYPE_ALIGN (type) >= 2 * (unsigned) BITS_PER_WORD)
7495 align = 2 * UNITS_PER_WORD;
7497 /* SPARC-V9 ABI states that structures up to 16 bytes in size
7498 are left-justified in their slots. */
7499 if (AGGREGATE_TYPE_P (type))
7502 size = rsize = UNITS_PER_WORD;
7512 incr = fold_build_pointer_plus_hwi (incr, align - 1);
7513 incr = fold_convert (sizetype, incr);
7514 incr = fold_build2 (BIT_AND_EXPR, sizetype, incr,
7516 incr = fold_convert (ptr_type_node, incr);
7519 gimplify_expr (&incr, pre_p, post_p, is_gimple_val, fb_rvalue);
7522 if (BYTES_BIG_ENDIAN && size < rsize)
7523 addr = fold_build_pointer_plus_hwi (incr, rsize - size);
7527 addr = fold_convert (build_pointer_type (ptrtype), addr);
7528 addr = build_va_arg_indirect_ref (addr);
7531 /* If the address isn't aligned properly for the type, we need a temporary.
7532 FIXME: This is inefficient, usually we can do this in registers. */
7533 else if (align == 0 && TYPE_ALIGN (type) > BITS_PER_WORD)
7535 tree tmp = create_tmp_var (type, "va_arg_tmp");
7536 tree dest_addr = build_fold_addr_expr (tmp);
7537 tree copy = build_call_expr (builtin_decl_implicit (BUILT_IN_MEMCPY),
7538 3, dest_addr, addr, size_int (rsize));
7539 TREE_ADDRESSABLE (tmp) = 1;
7540 gimplify_and_add (copy, pre_p);
7545 addr = fold_convert (ptrtype, addr);
7547 incr = fold_build_pointer_plus_hwi (incr, rsize);
7548 gimplify_assign (valist, incr, post_p);
7550 return build_va_arg_indirect_ref (addr);
7553 /* Implement the TARGET_VECTOR_MODE_SUPPORTED_P target hook.
7554 Specify whether the vector mode is supported by the hardware. */
7557 sparc_vector_mode_supported_p (enum machine_mode mode)
7559 return TARGET_VIS && VECTOR_MODE_P (mode) ? true : false;
7562 /* Implement the TARGET_VECTORIZE_PREFERRED_SIMD_MODE target hook. */
7564 static enum machine_mode
7565 sparc_preferred_simd_mode (enum machine_mode mode)
7583 /* Return the string to output an unconditional branch to LABEL, which is
7584 the operand number of the label.
7586 DEST is the destination insn (i.e. the label), INSN is the source. */
7589 output_ubranch (rtx dest, rtx insn)
7591 static char string[64];
7592 bool v9_form = false;
7596 /* Even if we are trying to use cbcond for this, evaluate
7597 whether we can use V9 branches as our backup plan. */
7600 if (INSN_ADDRESSES_SET_P ())
7601 delta = (INSN_ADDRESSES (INSN_UID (dest))
7602 - INSN_ADDRESSES (INSN_UID (insn)));
7604 /* Leave some instructions for "slop". */
7605 if (TARGET_V9 && delta >= -260000 && delta < 260000)
7610 bool emit_nop = emit_cbcond_nop (insn);
7614 if (delta < -500 || delta > 500)
7620 rval = "ba,a,pt\t%%xcc, %l0";
7627 rval = "cwbe\t%%g0, %%g0, %l0\n\tnop";
7629 rval = "cwbe\t%%g0, %%g0, %l0";
7635 strcpy (string, "ba%*,pt\t%%xcc, ");
7637 strcpy (string, "b%*\t");
7639 p = strchr (string, '\0');
7650 /* Return the string to output a conditional branch to LABEL, which is
7651 the operand number of the label. OP is the conditional expression.
7652 XEXP (OP, 0) is assumed to be a condition code register (integer or
7653 floating point) and its mode specifies what kind of comparison we made.
7655 DEST is the destination insn (i.e. the label), INSN is the source.
7657 REVERSED is nonzero if we should reverse the sense of the comparison.
7659 ANNUL is nonzero if we should generate an annulling branch. */
7662 output_cbranch (rtx op, rtx dest, int label, int reversed, int annul,
7665 static char string[64];
7666 enum rtx_code code = GET_CODE (op);
7667 rtx cc_reg = XEXP (op, 0);
7668 enum machine_mode mode = GET_MODE (cc_reg);
7669 const char *labelno, *branch;
7670 int spaces = 8, far;
7673 /* v9 branches are limited to +-1MB. If it is too far away,
7686 fbne,a,pn %fcc2, .LC29
7694 far = TARGET_V9 && (get_attr_length (insn) >= 3);
7697 /* Reversal of FP compares takes care -- an ordered compare
7698 becomes an unordered compare and vice versa. */
7699 if (mode == CCFPmode || mode == CCFPEmode)
7700 code = reverse_condition_maybe_unordered (code);
7702 code = reverse_condition (code);
7705 /* Start by writing the branch condition. */
7706 if (mode == CCFPmode || mode == CCFPEmode)
7757 /* ??? !v9: FP branches cannot be preceded by another floating point
7758 insn. Because there is currently no concept of pre-delay slots,
7759 we can fix this only by always emitting a nop before a floating
7764 strcpy (string, "nop\n\t");
7765 strcat (string, branch);
7778 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
7790 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
7811 strcpy (string, branch);
7813 spaces -= strlen (branch);
7814 p = strchr (string, '\0');
7816 /* Now add the annulling, the label, and a possible noop. */
7829 if (! far && insn && INSN_ADDRESSES_SET_P ())
7831 int delta = (INSN_ADDRESSES (INSN_UID (dest))
7832 - INSN_ADDRESSES (INSN_UID (insn)));
7833 /* Leave some instructions for "slop". */
7834 if (delta < -260000 || delta >= 260000)
7838 if (mode == CCFPmode || mode == CCFPEmode)
7840 static char v9_fcc_labelno[] = "%%fccX, ";
7841 /* Set the char indicating the number of the fcc reg to use. */
7842 v9_fcc_labelno[5] = REGNO (cc_reg) - SPARC_FIRST_V9_FCC_REG + '0';
7843 labelno = v9_fcc_labelno;
7846 gcc_assert (REGNO (cc_reg) == SPARC_FCC_REG);
7850 else if (mode == CCXmode || mode == CCX_NOOVmode)
7852 labelno = "%%xcc, ";
7857 labelno = "%%icc, ";
7862 if (*labelno && insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
7865 ((XINT (note, 0) >= REG_BR_PROB_BASE / 2) ^ far)
7878 strcpy (p, labelno);
7879 p = strchr (p, '\0');
7882 strcpy (p, ".+12\n\t nop\n\tb\t");
7883 /* Skip the next insn if requested or
7884 if we know that it will be a nop. */
7885 if (annul || ! final_sequence)
7899 /* Emit a library call comparison between floating point X and Y.
7900 COMPARISON is the operator to compare with (EQ, NE, GT, etc).
7901 Return the new operator to be used in the comparison sequence.
7903 TARGET_ARCH64 uses _Qp_* functions, which use pointers to TFmode
7904 values as arguments instead of the TFmode registers themselves,
7905 that's why we cannot call emit_float_lib_cmp. */
7908 sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
7911 rtx slot0, slot1, result, tem, tem2, libfunc;
7912 enum machine_mode mode;
7913 enum rtx_code new_comparison;
7918 qpfunc = (TARGET_ARCH64 ? "_Qp_feq" : "_Q_feq");
7922 qpfunc = (TARGET_ARCH64 ? "_Qp_fne" : "_Q_fne");
7926 qpfunc = (TARGET_ARCH64 ? "_Qp_fgt" : "_Q_fgt");
7930 qpfunc = (TARGET_ARCH64 ? "_Qp_fge" : "_Q_fge");
7934 qpfunc = (TARGET_ARCH64 ? "_Qp_flt" : "_Q_flt");
7938 qpfunc = (TARGET_ARCH64 ? "_Qp_fle" : "_Q_fle");
7949 qpfunc = (TARGET_ARCH64 ? "_Qp_cmp" : "_Q_cmp");
7960 tree expr = MEM_EXPR (x);
7962 mark_addressable (expr);
7967 slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode));
7968 emit_move_insn (slot0, x);
7973 tree expr = MEM_EXPR (y);
7975 mark_addressable (expr);
7980 slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode));
7981 emit_move_insn (slot1, y);
7984 libfunc = gen_rtx_SYMBOL_REF (Pmode, qpfunc);
7985 emit_library_call (libfunc, LCT_NORMAL,
7987 XEXP (slot0, 0), Pmode,
7988 XEXP (slot1, 0), Pmode);
7993 libfunc = gen_rtx_SYMBOL_REF (Pmode, qpfunc);
7994 emit_library_call (libfunc, LCT_NORMAL,
7996 x, TFmode, y, TFmode);
8001 /* Immediately move the result of the libcall into a pseudo
8002 register so reload doesn't clobber the value if it needs
8003 the return register for a spill reg. */
8004 result = gen_reg_rtx (mode);
8005 emit_move_insn (result, hard_libcall_value (mode, libfunc));
8010 return gen_rtx_NE (VOIDmode, result, const0_rtx);
8013 new_comparison = (comparison == UNORDERED ? EQ : NE);
8014 return gen_rtx_fmt_ee (new_comparison, VOIDmode, result, GEN_INT(3));
8017 new_comparison = (comparison == UNGT ? GT : NE);
8018 return gen_rtx_fmt_ee (new_comparison, VOIDmode, result, const1_rtx);
8020 return gen_rtx_NE (VOIDmode, result, const2_rtx);
8022 tem = gen_reg_rtx (mode);
8024 emit_insn (gen_andsi3 (tem, result, const1_rtx));
8026 emit_insn (gen_anddi3 (tem, result, const1_rtx));
8027 return gen_rtx_NE (VOIDmode, tem, const0_rtx);
8030 tem = gen_reg_rtx (mode);
8032 emit_insn (gen_addsi3 (tem, result, const1_rtx));
8034 emit_insn (gen_adddi3 (tem, result, const1_rtx));
8035 tem2 = gen_reg_rtx (mode);
8037 emit_insn (gen_andsi3 (tem2, tem, const2_rtx));
8039 emit_insn (gen_anddi3 (tem2, tem, const2_rtx));
8040 new_comparison = (comparison == UNEQ ? EQ : NE);
8041 return gen_rtx_fmt_ee (new_comparison, VOIDmode, tem2, const0_rtx);
8047 /* Generate an unsigned DImode to FP conversion. This is the same code
8048 optabs would emit if we didn't have TFmode patterns. */
8051 sparc_emit_floatunsdi (rtx *operands, enum machine_mode mode)
8053 rtx neglab, donelab, i0, i1, f0, in, out;
8056 in = force_reg (DImode, operands[1]);
8057 neglab = gen_label_rtx ();
8058 donelab = gen_label_rtx ();
8059 i0 = gen_reg_rtx (DImode);
8060 i1 = gen_reg_rtx (DImode);
8061 f0 = gen_reg_rtx (mode);
8063 emit_cmp_and_jump_insns (in, const0_rtx, LT, const0_rtx, DImode, 0, neglab);
8065 emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_FLOAT (mode, in)));
8066 emit_jump_insn (gen_jump (donelab));
8069 emit_label (neglab);
8071 emit_insn (gen_lshrdi3 (i0, in, const1_rtx));
8072 emit_insn (gen_anddi3 (i1, in, const1_rtx));
8073 emit_insn (gen_iordi3 (i0, i0, i1));
8074 emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_FLOAT (mode, i0)));
8075 emit_insn (gen_rtx_SET (VOIDmode, out, gen_rtx_PLUS (mode, f0, f0)));
8077 emit_label (donelab);
8080 /* Generate an FP to unsigned DImode conversion. This is the same code
8081 optabs would emit if we didn't have TFmode patterns. */
8084 sparc_emit_fixunsdi (rtx *operands, enum machine_mode mode)
8086 rtx neglab, donelab, i0, i1, f0, in, out, limit;
8089 in = force_reg (mode, operands[1]);
8090 neglab = gen_label_rtx ();
8091 donelab = gen_label_rtx ();
8092 i0 = gen_reg_rtx (DImode);
8093 i1 = gen_reg_rtx (DImode);
8094 limit = gen_reg_rtx (mode);
8095 f0 = gen_reg_rtx (mode);
8097 emit_move_insn (limit,
8098 CONST_DOUBLE_FROM_REAL_VALUE (
8099 REAL_VALUE_ATOF ("9223372036854775808.0", mode), mode));
8100 emit_cmp_and_jump_insns (in, limit, GE, NULL_RTX, mode, 0, neglab);
8102 emit_insn (gen_rtx_SET (VOIDmode,
8104 gen_rtx_FIX (DImode, gen_rtx_FIX (mode, in))));
8105 emit_jump_insn (gen_jump (donelab));
8108 emit_label (neglab);
8110 emit_insn (gen_rtx_SET (VOIDmode, f0, gen_rtx_MINUS (mode, in, limit)));
8111 emit_insn (gen_rtx_SET (VOIDmode,
8113 gen_rtx_FIX (DImode, gen_rtx_FIX (mode, f0))));
8114 emit_insn (gen_movdi (i1, const1_rtx));
8115 emit_insn (gen_ashldi3 (i1, i1, GEN_INT (63)));
8116 emit_insn (gen_xordi3 (out, i0, i1));
8118 emit_label (donelab);
8121 /* Return the string to output a compare and branch instruction to DEST.
8122 DEST is the destination insn (i.e. the label), INSN is the source,
8123 and OP is the conditional expression. */
8126 output_cbcond (rtx op, rtx dest, rtx insn)
8128 enum machine_mode mode = GET_MODE (XEXP (op, 0));
8129 enum rtx_code code = GET_CODE (op);
8130 const char *cond_str, *tmpl;
8131 int far, emit_nop, len;
8132 static char string[64];
8135 /* Compare and Branch is limited to +-2KB. If it is too far away,
8147 len = get_attr_length (insn);
8150 emit_nop = len == 2;
8153 code = reverse_condition (code);
8155 size_char = ((mode == SImode) ? 'w' : 'x');
8168 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
8183 if (mode == CC_NOOVmode || mode == CCX_NOOVmode)
8211 int veryfar = 1, delta;
8213 if (INSN_ADDRESSES_SET_P ())
8215 delta = (INSN_ADDRESSES (INSN_UID (dest))
8216 - INSN_ADDRESSES (INSN_UID (insn)));
8217 /* Leave some instructions for "slop". */
8218 if (delta >= -260000 && delta < 260000)
8223 tmpl = "c%cb%s\t%%1, %%2, .+16\n\tnop\n\tb\t%%3\n\tnop";
8225 tmpl = "c%cb%s\t%%1, %%2, .+16\n\tnop\n\tba,pt\t%%%%xcc, %%3\n\tnop";
8230 tmpl = "c%cb%s\t%%1, %%2, %%3\n\tnop";
8232 tmpl = "c%cb%s\t%%1, %%2, %%3";
8235 snprintf (string, sizeof(string), tmpl, size_char, cond_str);
8240 /* Return the string to output a conditional branch to LABEL, testing
8241 register REG. LABEL is the operand number of the label; REG is the
8242 operand number of the reg. OP is the conditional expression. The mode
8243 of REG says what kind of comparison we made.
8245 DEST is the destination insn (i.e. the label), INSN is the source.
8247 REVERSED is nonzero if we should reverse the sense of the comparison.
8249 ANNUL is nonzero if we should generate an annulling branch. */
8252 output_v9branch (rtx op, rtx dest, int reg, int label, int reversed,
8253 int annul, rtx insn)
8255 static char string[64];
8256 enum rtx_code code = GET_CODE (op);
8257 enum machine_mode mode = GET_MODE (XEXP (op, 0));
8262 /* branch on register are limited to +-128KB. If it is too far away,
8275 brgez,a,pn %o1, .LC29
8281 ba,pt %xcc, .LC29 */
8283 far = get_attr_length (insn) >= 3;
8285 /* If not floating-point or if EQ or NE, we can just reverse the code. */
8287 code = reverse_condition (code);
8289 /* Only 64 bit versions of these instructions exist. */
8290 gcc_assert (mode == DImode);
8292 /* Start by writing the branch condition. */
8297 strcpy (string, "brnz");
8301 strcpy (string, "brz");
8305 strcpy (string, "brgez");
8309 strcpy (string, "brlz");
8313 strcpy (string, "brlez");
8317 strcpy (string, "brgz");
8324 p = strchr (string, '\0');
8326 /* Now add the annulling, reg, label, and nop. */
8333 if (insn && (note = find_reg_note (insn, REG_BR_PROB, NULL_RTX)))
8336 ((XINT (note, 0) >= REG_BR_PROB_BASE / 2) ^ far)
8341 *p = p < string + 8 ? '\t' : ' ';
8349 int veryfar = 1, delta;
8351 if (INSN_ADDRESSES_SET_P ())
8353 delta = (INSN_ADDRESSES (INSN_UID (dest))
8354 - INSN_ADDRESSES (INSN_UID (insn)));
8355 /* Leave some instructions for "slop". */
8356 if (delta >= -260000 && delta < 260000)
8360 strcpy (p, ".+12\n\t nop\n\t");
8361 /* Skip the next insn if requested or
8362 if we know that it will be a nop. */
8363 if (annul || ! final_sequence)
8373 strcpy (p, "ba,pt\t%%xcc, ");
8387 /* Return 1, if any of the registers of the instruction are %l[0-7] or %o[0-7].
8388 Such instructions cannot be used in the delay slot of return insn on v9.
8389 If TEST is 0, also rename all %i[0-7] registers to their %o[0-7] counterparts.
8393 epilogue_renumber (register rtx *where, int test)
8395 register const char *fmt;
8397 register enum rtx_code code;
8402 code = GET_CODE (*where);
8407 if (REGNO (*where) >= 8 && REGNO (*where) < 24) /* oX or lX */
8409 if (! test && REGNO (*where) >= 24 && REGNO (*where) < 32)
8410 *where = gen_rtx_REG (GET_MODE (*where), OUTGOING_REGNO (REGNO(*where)));
8418 /* Do not replace the frame pointer with the stack pointer because
8419 it can cause the delayed instruction to load below the stack.
8420 This occurs when instructions like:
8422 (set (reg/i:SI 24 %i0)
8423 (mem/f:SI (plus:SI (reg/f:SI 30 %fp)
8424 (const_int -20 [0xffffffec])) 0))
8426 are in the return delayed slot. */
8428 if (GET_CODE (XEXP (*where, 0)) == REG
8429 && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM
8430 && (GET_CODE (XEXP (*where, 1)) != CONST_INT
8431 || INTVAL (XEXP (*where, 1)) < SPARC_STACK_BIAS))
8436 if (SPARC_STACK_BIAS
8437 && GET_CODE (XEXP (*where, 0)) == REG
8438 && REGNO (XEXP (*where, 0)) == HARD_FRAME_POINTER_REGNUM)
8446 fmt = GET_RTX_FORMAT (code);
8448 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
8453 for (j = XVECLEN (*where, i) - 1; j >= 0; j--)
8454 if (epilogue_renumber (&(XVECEXP (*where, i, j)), test))
8457 else if (fmt[i] == 'e'
8458 && epilogue_renumber (&(XEXP (*where, i)), test))
8464 /* Leaf functions and non-leaf functions have different needs. */
8467 reg_leaf_alloc_order[] = REG_LEAF_ALLOC_ORDER;
8470 reg_nonleaf_alloc_order[] = REG_ALLOC_ORDER;
8472 static const int *const reg_alloc_orders[] = {
8473 reg_leaf_alloc_order,
8474 reg_nonleaf_alloc_order};
8477 order_regs_for_local_alloc (void)
8479 static int last_order_nonleaf = 1;
8481 if (df_regs_ever_live_p (15) != last_order_nonleaf)
8483 last_order_nonleaf = !last_order_nonleaf;
8484 memcpy ((char *) reg_alloc_order,
8485 (const char *) reg_alloc_orders[last_order_nonleaf],
8486 FIRST_PSEUDO_REGISTER * sizeof (int));
8490 /* Return 1 if REG and MEM are legitimate enough to allow the various
8491 mem<-->reg splits to be run. */
8494 sparc_splitdi_legitimate (rtx reg, rtx mem)
8496 /* Punt if we are here by mistake. */
8497 gcc_assert (reload_completed);
8499 /* We must have an offsettable memory reference. */
8500 if (! offsettable_memref_p (mem))
8503 /* If we have legitimate args for ldd/std, we do not want
8504 the split to happen. */
8505 if ((REGNO (reg) % 2) == 0
8506 && mem_min_alignment (mem, 8))
8513 /* Like sparc_splitdi_legitimate but for REG <--> REG moves. */
8516 sparc_split_regreg_legitimate (rtx reg1, rtx reg2)
8520 if (GET_CODE (reg1) == SUBREG)
8521 reg1 = SUBREG_REG (reg1);
8522 if (GET_CODE (reg1) != REG)
8524 regno1 = REGNO (reg1);
8526 if (GET_CODE (reg2) == SUBREG)
8527 reg2 = SUBREG_REG (reg2);
8528 if (GET_CODE (reg2) != REG)
8530 regno2 = REGNO (reg2);
8532 if (SPARC_INT_REG_P (regno1) && SPARC_INT_REG_P (regno2))
8537 if ((SPARC_INT_REG_P (regno1) && SPARC_FP_REG_P (regno2))
8538 || (SPARC_FP_REG_P (regno1) && SPARC_INT_REG_P (regno2)))
8545 /* Return 1 if x and y are some kind of REG and they refer to
8546 different hard registers. This test is guaranteed to be
8547 run after reload. */
8550 sparc_absnegfloat_split_legitimate (rtx x, rtx y)
8552 if (GET_CODE (x) != REG)
8554 if (GET_CODE (y) != REG)
8556 if (REGNO (x) == REGNO (y))
8561 /* Return 1 if REGNO (reg1) is even and REGNO (reg1) == REGNO (reg2) - 1.
8562 This makes them candidates for using ldd and std insns.
8564 Note reg1 and reg2 *must* be hard registers. */
8567 registers_ok_for_ldd_peep (rtx reg1, rtx reg2)
8569 /* We might have been passed a SUBREG. */
8570 if (GET_CODE (reg1) != REG || GET_CODE (reg2) != REG)
8573 if (REGNO (reg1) % 2 != 0)
8576 /* Integer ldd is deprecated in SPARC V9 */
8577 if (TARGET_V9 && SPARC_INT_REG_P (REGNO (reg1)))
8580 return (REGNO (reg1) == REGNO (reg2) - 1);
8583 /* Return 1 if the addresses in mem1 and mem2 are suitable for use in
8586 This can only happen when addr1 and addr2, the addresses in mem1
8587 and mem2, are consecutive memory locations (addr1 + 4 == addr2).
8588 addr1 must also be aligned on a 64-bit boundary.
8590 Also iff dependent_reg_rtx is not null it should not be used to
8591 compute the address for mem1, i.e. we cannot optimize a sequence
8603 But, note that the transformation from:
8608 is perfectly fine. Thus, the peephole2 patterns always pass us
8609 the destination register of the first load, never the second one.
8611 For stores we don't have a similar problem, so dependent_reg_rtx is
8615 mems_ok_for_ldd_peep (rtx mem1, rtx mem2, rtx dependent_reg_rtx)
8619 HOST_WIDE_INT offset1;
8621 /* The mems cannot be volatile. */
8622 if (MEM_VOLATILE_P (mem1) || MEM_VOLATILE_P (mem2))
8625 /* MEM1 should be aligned on a 64-bit boundary. */
8626 if (MEM_ALIGN (mem1) < 64)
8629 addr1 = XEXP (mem1, 0);
8630 addr2 = XEXP (mem2, 0);
8632 /* Extract a register number and offset (if used) from the first addr. */
8633 if (GET_CODE (addr1) == PLUS)
8635 /* If not a REG, return zero. */
8636 if (GET_CODE (XEXP (addr1, 0)) != REG)
8640 reg1 = REGNO (XEXP (addr1, 0));
8641 /* The offset must be constant! */
8642 if (GET_CODE (XEXP (addr1, 1)) != CONST_INT)
8644 offset1 = INTVAL (XEXP (addr1, 1));
8647 else if (GET_CODE (addr1) != REG)
8651 reg1 = REGNO (addr1);
8652 /* This was a simple (mem (reg)) expression. Offset is 0. */
8656 /* Make sure the second address is a (mem (plus (reg) (const_int). */
8657 if (GET_CODE (addr2) != PLUS)
8660 if (GET_CODE (XEXP (addr2, 0)) != REG
8661 || GET_CODE (XEXP (addr2, 1)) != CONST_INT)
8664 if (reg1 != REGNO (XEXP (addr2, 0)))
8667 if (dependent_reg_rtx != NULL_RTX && reg1 == REGNO (dependent_reg_rtx))
8670 /* The first offset must be evenly divisible by 8 to ensure the
8671 address is 64 bit aligned. */
8672 if (offset1 % 8 != 0)
8675 /* The offset for the second addr must be 4 more than the first addr. */
8676 if (INTVAL (XEXP (addr2, 1)) != offset1 + 4)
8679 /* All the tests passed. addr1 and addr2 are valid for ldd and std
8684 /* Return the widened memory access made of MEM1 and MEM2 in MODE. */
8687 widen_mem_for_ldd_peep (rtx mem1, rtx mem2, enum machine_mode mode)
8689 rtx x = widen_memory_access (mem1, mode, 0);
8690 MEM_NOTRAP_P (x) = MEM_NOTRAP_P (mem1) && MEM_NOTRAP_P (mem2);
8694 /* Return 1 if reg is a pseudo, or is the first register in
8695 a hard register pair. This makes it suitable for use in
8696 ldd and std insns. */
8699 register_ok_for_ldd (rtx reg)
8701 /* We might have been passed a SUBREG. */
8705 if (REGNO (reg) < FIRST_PSEUDO_REGISTER)
8706 return (REGNO (reg) % 2 == 0);
8711 /* Return 1 if OP, a MEM, has an address which is known to be
8712 aligned to an 8-byte boundary. */
8715 memory_ok_for_ldd (rtx op)
8717 /* In 64-bit mode, we assume that the address is word-aligned. */
8718 if (TARGET_ARCH32 && !mem_min_alignment (op, 8))
8721 if (! can_create_pseudo_p ()
8722 && !strict_memory_address_p (Pmode, XEXP (op, 0)))
8728 /* Implement TARGET_PRINT_OPERAND_PUNCT_VALID_P. */
8731 sparc_print_operand_punct_valid_p (unsigned char code)
8744 /* Implement TARGET_PRINT_OPERAND.
8745 Print operand X (an rtx) in assembler syntax to file FILE.
8746 CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
8747 For `%' followed by punctuation, CODE is the punctuation and X is null. */
8750 sparc_print_operand (FILE *file, rtx x, int code)
8755 /* Output an insn in a delay slot. */
8757 sparc_indent_opcode = 1;
8759 fputs ("\n\t nop", file);
8762 /* Output an annul flag if there's nothing for the delay slot and we
8763 are optimizing. This is always used with '(' below.
8764 Sun OS 4.1.1 dbx can't handle an annulled unconditional branch;
8765 this is a dbx bug. So, we only do this when optimizing.
8766 On UltraSPARC, a branch in a delay slot causes a pipeline flush.
8767 Always emit a nop in case the next instruction is a branch. */
8768 if (! final_sequence && (optimize && (int)sparc_cpu < PROCESSOR_V9))
8772 /* Output a 'nop' if there's nothing for the delay slot and we are
8773 not optimizing. This is always used with '*' above. */
8774 if (! final_sequence && ! (optimize && (int)sparc_cpu < PROCESSOR_V9))
8775 fputs ("\n\t nop", file);
8776 else if (final_sequence)
8777 sparc_indent_opcode = 1;
8780 /* Output the right displacement from the saved PC on function return.
8781 The caller may have placed an "unimp" insn immediately after the call
8782 so we have to account for it. This insn is used in the 32-bit ABI
8783 when calling a function that returns a non zero-sized structure. The
8784 64-bit ABI doesn't have it. Be careful to have this test be the same
8785 as that for the call. The exception is when sparc_std_struct_return
8786 is enabled, the psABI is followed exactly and the adjustment is made
8787 by the code in sparc_struct_value_rtx. The call emitted is the same
8788 when sparc_std_struct_return is enabled. */
8790 && cfun->returns_struct
8791 && !sparc_std_struct_return
8792 && DECL_SIZE (DECL_RESULT (current_function_decl))
8793 && TREE_CODE (DECL_SIZE (DECL_RESULT (current_function_decl)))
8795 && !integer_zerop (DECL_SIZE (DECL_RESULT (current_function_decl))))
8801 /* Output the Embedded Medium/Anywhere code model base register. */
8802 fputs (EMBMEDANY_BASE_REG, file);
8805 /* Print some local dynamic TLS name. */
8806 assemble_name (file, get_some_local_dynamic_name ());
8810 /* Adjust the operand to take into account a RESTORE operation. */
8811 if (GET_CODE (x) == CONST_INT)
8813 else if (GET_CODE (x) != REG)
8814 output_operand_lossage ("invalid %%Y operand");
8815 else if (REGNO (x) < 8)
8816 fputs (reg_names[REGNO (x)], file);
8817 else if (REGNO (x) >= 24 && REGNO (x) < 32)
8818 fputs (reg_names[REGNO (x)-16], file);
8820 output_operand_lossage ("invalid %%Y operand");
8823 /* Print out the low order register name of a register pair. */
8824 if (WORDS_BIG_ENDIAN)
8825 fputs (reg_names[REGNO (x)+1], file);
8827 fputs (reg_names[REGNO (x)], file);
8830 /* Print out the high order register name of a register pair. */
8831 if (WORDS_BIG_ENDIAN)
8832 fputs (reg_names[REGNO (x)], file);
8834 fputs (reg_names[REGNO (x)+1], file);
8837 /* Print out the second register name of a register pair or quad.
8838 I.e., R (%o0) => %o1. */
8839 fputs (reg_names[REGNO (x)+1], file);
8842 /* Print out the third register name of a register quad.
8843 I.e., S (%o0) => %o2. */
8844 fputs (reg_names[REGNO (x)+2], file);
8847 /* Print out the fourth register name of a register quad.
8848 I.e., T (%o0) => %o3. */
8849 fputs (reg_names[REGNO (x)+3], file);
8852 /* Print a condition code register. */
8853 if (REGNO (x) == SPARC_ICC_REG)
8855 /* We don't handle CC[X]_NOOVmode because they're not supposed
8857 if (GET_MODE (x) == CCmode)
8858 fputs ("%icc", file);
8859 else if (GET_MODE (x) == CCXmode)
8860 fputs ("%xcc", file);
8865 /* %fccN register */
8866 fputs (reg_names[REGNO (x)], file);
8869 /* Print the operand's address only. */
8870 output_address (XEXP (x, 0));
8873 /* In this case we need a register. Use %g0 if the
8874 operand is const0_rtx. */
8876 || (GET_MODE (x) != VOIDmode && x == CONST0_RTX (GET_MODE (x))))
8878 fputs ("%g0", file);
8885 switch (GET_CODE (x))
8887 case IOR: fputs ("or", file); break;
8888 case AND: fputs ("and", file); break;
8889 case XOR: fputs ("xor", file); break;
8890 default: output_operand_lossage ("invalid %%A operand");
8895 switch (GET_CODE (x))
8897 case IOR: fputs ("orn", file); break;
8898 case AND: fputs ("andn", file); break;
8899 case XOR: fputs ("xnor", file); break;
8900 default: output_operand_lossage ("invalid %%B operand");
8904 /* This is used by the conditional move instructions. */
8907 enum rtx_code rc = GET_CODE (x);
8911 case NE: fputs ("ne", file); break;
8912 case EQ: fputs ("e", file); break;
8913 case GE: fputs ("ge", file); break;
8914 case GT: fputs ("g", file); break;
8915 case LE: fputs ("le", file); break;
8916 case LT: fputs ("l", file); break;
8917 case GEU: fputs ("geu", file); break;
8918 case GTU: fputs ("gu", file); break;
8919 case LEU: fputs ("leu", file); break;
8920 case LTU: fputs ("lu", file); break;
8921 case LTGT: fputs ("lg", file); break;
8922 case UNORDERED: fputs ("u", file); break;
8923 case ORDERED: fputs ("o", file); break;
8924 case UNLT: fputs ("ul", file); break;
8925 case UNLE: fputs ("ule", file); break;
8926 case UNGT: fputs ("ug", file); break;
8927 case UNGE: fputs ("uge", file); break;
8928 case UNEQ: fputs ("ue", file); break;
8929 default: output_operand_lossage ("invalid %%C operand");
8934 /* This are used by the movr instruction pattern. */
8937 enum rtx_code rc = GET_CODE (x);
8940 case NE: fputs ("ne", file); break;
8941 case EQ: fputs ("e", file); break;
8942 case GE: fputs ("gez", file); break;
8943 case LT: fputs ("lz", file); break;
8944 case LE: fputs ("lez", file); break;
8945 case GT: fputs ("gz", file); break;
8946 default: output_operand_lossage ("invalid %%D operand");
8953 /* Print a sign-extended character. */
8954 int i = trunc_int_for_mode (INTVAL (x), QImode);
8955 fprintf (file, "%d", i);
8960 /* Operand must be a MEM; write its address. */
8961 if (GET_CODE (x) != MEM)
8962 output_operand_lossage ("invalid %%f operand");
8963 output_address (XEXP (x, 0));
8968 /* Print a sign-extended 32-bit value. */
8970 if (GET_CODE(x) == CONST_INT)
8972 else if (GET_CODE(x) == CONST_DOUBLE)
8973 i = CONST_DOUBLE_LOW (x);
8976 output_operand_lossage ("invalid %%s operand");
8979 i = trunc_int_for_mode (i, SImode);
8980 fprintf (file, HOST_WIDE_INT_PRINT_DEC, i);
8985 /* Do nothing special. */
8989 /* Undocumented flag. */
8990 output_operand_lossage ("invalid operand output code");
8993 if (GET_CODE (x) == REG)
8994 fputs (reg_names[REGNO (x)], file);
8995 else if (GET_CODE (x) == MEM)
8998 /* Poor Sun assembler doesn't understand absolute addressing. */
8999 if (CONSTANT_P (XEXP (x, 0)))
9000 fputs ("%g0+", file);
9001 output_address (XEXP (x, 0));
9004 else if (GET_CODE (x) == HIGH)
9006 fputs ("%hi(", file);
9007 output_addr_const (file, XEXP (x, 0));
9010 else if (GET_CODE (x) == LO_SUM)
9012 sparc_print_operand (file, XEXP (x, 0), 0);
9013 if (TARGET_CM_MEDMID)
9014 fputs ("+%l44(", file);
9016 fputs ("+%lo(", file);
9017 output_addr_const (file, XEXP (x, 1));
9020 else if (GET_CODE (x) == CONST_DOUBLE
9021 && (GET_MODE (x) == VOIDmode
9022 || GET_MODE_CLASS (GET_MODE (x)) == MODE_INT))
9024 if (CONST_DOUBLE_HIGH (x) == 0)
9025 fprintf (file, "%u", (unsigned int) CONST_DOUBLE_LOW (x));
9026 else if (CONST_DOUBLE_HIGH (x) == -1
9027 && CONST_DOUBLE_LOW (x) < 0)
9028 fprintf (file, "%d", (int) CONST_DOUBLE_LOW (x));
9030 output_operand_lossage ("long long constant not a valid immediate operand");
9032 else if (GET_CODE (x) == CONST_DOUBLE)
9033 output_operand_lossage ("floating point constant not a valid immediate operand");
9034 else { output_addr_const (file, x); }
9037 /* Implement TARGET_PRINT_OPERAND_ADDRESS. */
9040 sparc_print_operand_address (FILE *file, rtx x)
9042 register rtx base, index = 0;
9044 register rtx addr = x;
9047 fputs (reg_names[REGNO (addr)], file);
9048 else if (GET_CODE (addr) == PLUS)
9050 if (CONST_INT_P (XEXP (addr, 0)))
9051 offset = INTVAL (XEXP (addr, 0)), base = XEXP (addr, 1);
9052 else if (CONST_INT_P (XEXP (addr, 1)))
9053 offset = INTVAL (XEXP (addr, 1)), base = XEXP (addr, 0);
9055 base = XEXP (addr, 0), index = XEXP (addr, 1);
9056 if (GET_CODE (base) == LO_SUM)
9058 gcc_assert (USE_AS_OFFSETABLE_LO10
9060 && ! TARGET_CM_MEDMID);
9061 output_operand (XEXP (base, 0), 0);
9062 fputs ("+%lo(", file);
9063 output_address (XEXP (base, 1));
9064 fprintf (file, ")+%d", offset);
9068 fputs (reg_names[REGNO (base)], file);
9070 fprintf (file, "%+d", offset);
9071 else if (REG_P (index))
9072 fprintf (file, "+%s", reg_names[REGNO (index)]);
9073 else if (GET_CODE (index) == SYMBOL_REF
9074 || GET_CODE (index) == LABEL_REF
9075 || GET_CODE (index) == CONST)
9076 fputc ('+', file), output_addr_const (file, index);
9077 else gcc_unreachable ();
9080 else if (GET_CODE (addr) == MINUS
9081 && GET_CODE (XEXP (addr, 1)) == LABEL_REF)
9083 output_addr_const (file, XEXP (addr, 0));
9085 output_addr_const (file, XEXP (addr, 1));
9086 fputs ("-.)", file);
9088 else if (GET_CODE (addr) == LO_SUM)
9090 output_operand (XEXP (addr, 0), 0);
9091 if (TARGET_CM_MEDMID)
9092 fputs ("+%l44(", file);
9094 fputs ("+%lo(", file);
9095 output_address (XEXP (addr, 1));
9099 && GET_CODE (addr) == CONST
9100 && GET_CODE (XEXP (addr, 0)) == MINUS
9101 && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST
9102 && GET_CODE (XEXP (XEXP (XEXP (addr, 0), 1), 0)) == MINUS
9103 && XEXP (XEXP (XEXP (XEXP (addr, 0), 1), 0), 1) == pc_rtx)
9105 addr = XEXP (addr, 0);
9106 output_addr_const (file, XEXP (addr, 0));
9107 /* Group the args of the second CONST in parenthesis. */
9109 /* Skip past the second CONST--it does nothing for us. */
9110 output_addr_const (file, XEXP (XEXP (addr, 1), 0));
9111 /* Close the parenthesis. */
9116 output_addr_const (file, addr);
9120 /* Target hook for assembling integer objects. The sparc version has
9121 special handling for aligned DI-mode objects. */
9124 sparc_assemble_integer (rtx x, unsigned int size, int aligned_p)
9126 /* ??? We only output .xword's for symbols and only then in environments
9127 where the assembler can handle them. */
9128 if (aligned_p && size == 8
9129 && (GET_CODE (x) != CONST_INT && GET_CODE (x) != CONST_DOUBLE))
9133 assemble_integer_with_op ("\t.xword\t", x);
9138 assemble_aligned_integer (4, const0_rtx);
9139 assemble_aligned_integer (4, x);
9143 return default_assemble_integer (x, size, aligned_p);
9146 /* Return the value of a code used in the .proc pseudo-op that says
9147 what kind of result this function returns. For non-C types, we pick
9148 the closest C type. */
9150 #ifndef SHORT_TYPE_SIZE
9151 #define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
9154 #ifndef INT_TYPE_SIZE
9155 #define INT_TYPE_SIZE BITS_PER_WORD
9158 #ifndef LONG_TYPE_SIZE
9159 #define LONG_TYPE_SIZE BITS_PER_WORD
9162 #ifndef LONG_LONG_TYPE_SIZE
9163 #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
9166 #ifndef FLOAT_TYPE_SIZE
9167 #define FLOAT_TYPE_SIZE BITS_PER_WORD
9170 #ifndef DOUBLE_TYPE_SIZE
9171 #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
9174 #ifndef LONG_DOUBLE_TYPE_SIZE
9175 #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
9179 sparc_type_code (register tree type)
9181 register unsigned long qualifiers = 0;
9182 register unsigned shift;
9184 /* Only the first 30 bits of the qualifier are valid. We must refrain from
9185 setting more, since some assemblers will give an error for this. Also,
9186 we must be careful to avoid shifts of 32 bits or more to avoid getting
9187 unpredictable results. */
9189 for (shift = 6; shift < 30; shift += 2, type = TREE_TYPE (type))
9191 switch (TREE_CODE (type))
9197 qualifiers |= (3 << shift);
9202 qualifiers |= (2 << shift);
9206 case REFERENCE_TYPE:
9208 qualifiers |= (1 << shift);
9212 return (qualifiers | 8);
9215 case QUAL_UNION_TYPE:
9216 return (qualifiers | 9);
9219 return (qualifiers | 10);
9222 return (qualifiers | 16);
9225 /* If this is a range type, consider it to be the underlying
9227 if (TREE_TYPE (type) != 0)
9230 /* Carefully distinguish all the standard types of C,
9231 without messing up if the language is not C. We do this by
9232 testing TYPE_PRECISION and TYPE_UNSIGNED. The old code used to
9233 look at both the names and the above fields, but that's redundant.
9234 Any type whose size is between two C types will be considered
9235 to be the wider of the two types. Also, we do not have a
9236 special code to use for "long long", so anything wider than
9237 long is treated the same. Note that we can't distinguish
9238 between "int" and "long" in this code if they are the same
9239 size, but that's fine, since neither can the assembler. */
9241 if (TYPE_PRECISION (type) <= CHAR_TYPE_SIZE)
9242 return (qualifiers | (TYPE_UNSIGNED (type) ? 12 : 2));
9244 else if (TYPE_PRECISION (type) <= SHORT_TYPE_SIZE)
9245 return (qualifiers | (TYPE_UNSIGNED (type) ? 13 : 3));
9247 else if (TYPE_PRECISION (type) <= INT_TYPE_SIZE)
9248 return (qualifiers | (TYPE_UNSIGNED (type) ? 14 : 4));
9251 return (qualifiers | (TYPE_UNSIGNED (type) ? 15 : 5));
9254 /* If this is a range type, consider it to be the underlying
9256 if (TREE_TYPE (type) != 0)
9259 /* Carefully distinguish all the standard types of C,
9260 without messing up if the language is not C. */
9262 if (TYPE_PRECISION (type) == FLOAT_TYPE_SIZE)
9263 return (qualifiers | 6);
9266 return (qualifiers | 7);
9268 case COMPLEX_TYPE: /* GNU Fortran COMPLEX type. */
9269 /* ??? We need to distinguish between double and float complex types,
9270 but I don't know how yet because I can't reach this code from
9271 existing front-ends. */
9272 return (qualifiers | 7); /* Who knows? */
9275 case BOOLEAN_TYPE: /* Boolean truth value type. */
9281 gcc_unreachable (); /* Not a type! */
9288 /* Nested function support. */
9290 /* Emit RTL insns to initialize the variable parts of a trampoline.
9291 FNADDR is an RTX for the address of the function's pure code.
9292 CXT is an RTX for the static chain value for the function.
9294 This takes 16 insns: 2 shifts & 2 ands (to split up addresses), 4 sethi
9295 (to load in opcodes), 4 iors (to merge address and opcodes), and 4 writes
9296 (to store insns). This is a bit excessive. Perhaps a different
9297 mechanism would be better here.
9299 Emit enough FLUSH insns to synchronize the data and instruction caches. */
9302 sparc32_initialize_trampoline (rtx m_tramp, rtx fnaddr, rtx cxt)
9304 /* SPARC 32-bit trampoline:
9307 sethi %hi(static), %g2
9309 or %g2, %lo(static), %g2
9311 SETHI i,r = 00rr rrr1 00ii iiii iiii iiii iiii iiii
9312 JMPL r+i,d = 10dd ddd1 1100 0rrr rr1i iiii iiii iiii
9316 (adjust_address (m_tramp, SImode, 0),
9317 expand_binop (SImode, ior_optab,
9318 expand_shift (RSHIFT_EXPR, SImode, fnaddr, 10, 0, 1),
9319 GEN_INT (trunc_int_for_mode (0x03000000, SImode)),
9320 NULL_RTX, 1, OPTAB_DIRECT));
9323 (adjust_address (m_tramp, SImode, 4),
9324 expand_binop (SImode, ior_optab,
9325 expand_shift (RSHIFT_EXPR, SImode, cxt, 10, 0, 1),
9326 GEN_INT (trunc_int_for_mode (0x05000000, SImode)),
9327 NULL_RTX, 1, OPTAB_DIRECT));
9330 (adjust_address (m_tramp, SImode, 8),
9331 expand_binop (SImode, ior_optab,
9332 expand_and (SImode, fnaddr, GEN_INT (0x3ff), NULL_RTX),
9333 GEN_INT (trunc_int_for_mode (0x81c06000, SImode)),
9334 NULL_RTX, 1, OPTAB_DIRECT));
9337 (adjust_address (m_tramp, SImode, 12),
9338 expand_binop (SImode, ior_optab,
9339 expand_and (SImode, cxt, GEN_INT (0x3ff), NULL_RTX),
9340 GEN_INT (trunc_int_for_mode (0x8410a000, SImode)),
9341 NULL_RTX, 1, OPTAB_DIRECT));
9343 /* On UltraSPARC a flush flushes an entire cache line. The trampoline is
9344 aligned on a 16 byte boundary so one flush clears it all. */
9345 emit_insn (gen_flushsi (validize_mem (adjust_address (m_tramp, SImode, 0))));
9346 if (sparc_cpu != PROCESSOR_ULTRASPARC
9347 && sparc_cpu != PROCESSOR_ULTRASPARC3
9348 && sparc_cpu != PROCESSOR_NIAGARA
9349 && sparc_cpu != PROCESSOR_NIAGARA2
9350 && sparc_cpu != PROCESSOR_NIAGARA3
9351 && sparc_cpu != PROCESSOR_NIAGARA4)
9352 emit_insn (gen_flushsi (validize_mem (adjust_address (m_tramp, SImode, 8))));
9354 /* Call __enable_execute_stack after writing onto the stack to make sure
9355 the stack address is accessible. */
9356 #ifdef HAVE_ENABLE_EXECUTE_STACK
9357 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
9358 LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
9363 /* The 64-bit version is simpler because it makes more sense to load the
9364 values as "immediate" data out of the trampoline. It's also easier since
9365 we can read the PC without clobbering a register. */
9368 sparc64_initialize_trampoline (rtx m_tramp, rtx fnaddr, rtx cxt)
9370 /* SPARC 64-bit trampoline:
9379 emit_move_insn (adjust_address (m_tramp, SImode, 0),
9380 GEN_INT (trunc_int_for_mode (0x83414000, SImode)));
9381 emit_move_insn (adjust_address (m_tramp, SImode, 4),
9382 GEN_INT (trunc_int_for_mode (0xca586018, SImode)));
9383 emit_move_insn (adjust_address (m_tramp, SImode, 8),
9384 GEN_INT (trunc_int_for_mode (0x81c14000, SImode)));
9385 emit_move_insn (adjust_address (m_tramp, SImode, 12),
9386 GEN_INT (trunc_int_for_mode (0xca586010, SImode)));
9387 emit_move_insn (adjust_address (m_tramp, DImode, 16), cxt);
9388 emit_move_insn (adjust_address (m_tramp, DImode, 24), fnaddr);
9389 emit_insn (gen_flushdi (validize_mem (adjust_address (m_tramp, DImode, 0))));
9391 if (sparc_cpu != PROCESSOR_ULTRASPARC
9392 && sparc_cpu != PROCESSOR_ULTRASPARC3
9393 && sparc_cpu != PROCESSOR_NIAGARA
9394 && sparc_cpu != PROCESSOR_NIAGARA2
9395 && sparc_cpu != PROCESSOR_NIAGARA3
9396 && sparc_cpu != PROCESSOR_NIAGARA4)
9397 emit_insn (gen_flushdi (validize_mem (adjust_address (m_tramp, DImode, 8))));
9399 /* Call __enable_execute_stack after writing onto the stack to make sure
9400 the stack address is accessible. */
9401 #ifdef HAVE_ENABLE_EXECUTE_STACK
9402 emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
9403 LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
9407 /* Worker for TARGET_TRAMPOLINE_INIT. */
9410 sparc_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
9412 rtx fnaddr = force_reg (Pmode, XEXP (DECL_RTL (fndecl), 0));
9413 cxt = force_reg (Pmode, cxt);
9415 sparc64_initialize_trampoline (m_tramp, fnaddr, cxt);
9417 sparc32_initialize_trampoline (m_tramp, fnaddr, cxt);
9420 /* Adjust the cost of a scheduling dependency. Return the new cost of
9421 a dependency LINK or INSN on DEP_INSN. COST is the current cost. */
9424 supersparc_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
9426 enum attr_type insn_type;
9428 if (! recog_memoized (insn))
9431 insn_type = get_attr_type (insn);
9433 if (REG_NOTE_KIND (link) == 0)
9435 /* Data dependency; DEP_INSN writes a register that INSN reads some
9438 /* if a load, then the dependence must be on the memory address;
9439 add an extra "cycle". Note that the cost could be two cycles
9440 if the reg was written late in an instruction group; we ca not tell
9442 if (insn_type == TYPE_LOAD || insn_type == TYPE_FPLOAD)
9445 /* Get the delay only if the address of the store is the dependence. */
9446 if (insn_type == TYPE_STORE || insn_type == TYPE_FPSTORE)
9448 rtx pat = PATTERN(insn);
9449 rtx dep_pat = PATTERN (dep_insn);
9451 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
9452 return cost; /* This should not happen! */
9454 /* The dependency between the two instructions was on the data that
9455 is being stored. Assume that this implies that the address of the
9456 store is not dependent. */
9457 if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
9460 return cost + 3; /* An approximation. */
9463 /* A shift instruction cannot receive its data from an instruction
9464 in the same cycle; add a one cycle penalty. */
9465 if (insn_type == TYPE_SHIFT)
9466 return cost + 3; /* Split before cascade into shift. */
9470 /* Anti- or output- dependency; DEP_INSN reads/writes a register that
9471 INSN writes some cycles later. */
9473 /* These are only significant for the fpu unit; writing a fp reg before
9474 the fpu has finished with it stalls the processor. */
9476 /* Reusing an integer register causes no problems. */
9477 if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
9485 hypersparc_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
9487 enum attr_type insn_type, dep_type;
9488 rtx pat = PATTERN(insn);
9489 rtx dep_pat = PATTERN (dep_insn);
9491 if (recog_memoized (insn) < 0 || recog_memoized (dep_insn) < 0)
9494 insn_type = get_attr_type (insn);
9495 dep_type = get_attr_type (dep_insn);
9497 switch (REG_NOTE_KIND (link))
9500 /* Data dependency; DEP_INSN writes a register that INSN reads some
9507 /* Get the delay iff the address of the store is the dependence. */
9508 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET)
9511 if (rtx_equal_p (SET_DEST (dep_pat), SET_SRC (pat)))
9518 /* If a load, then the dependence must be on the memory address. If
9519 the addresses aren't equal, then it might be a false dependency */
9520 if (dep_type == TYPE_STORE || dep_type == TYPE_FPSTORE)
9522 if (GET_CODE (pat) != SET || GET_CODE (dep_pat) != SET
9523 || GET_CODE (SET_DEST (dep_pat)) != MEM
9524 || GET_CODE (SET_SRC (pat)) != MEM
9525 || ! rtx_equal_p (XEXP (SET_DEST (dep_pat), 0),
9526 XEXP (SET_SRC (pat), 0)))
9534 /* Compare to branch latency is 0. There is no benefit from
9535 separating compare and branch. */
9536 if (dep_type == TYPE_COMPARE)
9538 /* Floating point compare to branch latency is less than
9539 compare to conditional move. */
9540 if (dep_type == TYPE_FPCMP)
9549 /* Anti-dependencies only penalize the fpu unit. */
9550 if (insn_type == TYPE_IALU || insn_type == TYPE_SHIFT)
9562 sparc_adjust_cost(rtx insn, rtx link, rtx dep, int cost)
9566 case PROCESSOR_SUPERSPARC:
9567 cost = supersparc_adjust_cost (insn, link, dep, cost);
9569 case PROCESSOR_HYPERSPARC:
9570 case PROCESSOR_SPARCLITE86X:
9571 cost = hypersparc_adjust_cost (insn, link, dep, cost);
9580 sparc_sched_init (FILE *dump ATTRIBUTE_UNUSED,
9581 int sched_verbose ATTRIBUTE_UNUSED,
9582 int max_ready ATTRIBUTE_UNUSED)
9586 sparc_use_sched_lookahead (void)
9588 if (sparc_cpu == PROCESSOR_NIAGARA
9589 || sparc_cpu == PROCESSOR_NIAGARA2
9590 || sparc_cpu == PROCESSOR_NIAGARA3)
9592 if (sparc_cpu == PROCESSOR_NIAGARA4)
9594 if (sparc_cpu == PROCESSOR_ULTRASPARC
9595 || sparc_cpu == PROCESSOR_ULTRASPARC3)
9597 if ((1 << sparc_cpu) &
9598 ((1 << PROCESSOR_SUPERSPARC) | (1 << PROCESSOR_HYPERSPARC) |
9599 (1 << PROCESSOR_SPARCLITE86X)))
9605 sparc_issue_rate (void)
9609 case PROCESSOR_NIAGARA:
9610 case PROCESSOR_NIAGARA2:
9611 case PROCESSOR_NIAGARA3:
9614 case PROCESSOR_NIAGARA4:
9616 /* Assume V9 processors are capable of at least dual-issue. */
9618 case PROCESSOR_SUPERSPARC:
9620 case PROCESSOR_HYPERSPARC:
9621 case PROCESSOR_SPARCLITE86X:
9623 case PROCESSOR_ULTRASPARC:
9624 case PROCESSOR_ULTRASPARC3:
9630 set_extends (rtx insn)
9632 register rtx pat = PATTERN (insn);
9634 switch (GET_CODE (SET_SRC (pat)))
9636 /* Load and some shift instructions zero extend. */
9639 /* sethi clears the high bits */
9641 /* LO_SUM is used with sethi. sethi cleared the high
9642 bits and the values used with lo_sum are positive */
9644 /* Store flag stores 0 or 1 */
9654 rtx op0 = XEXP (SET_SRC (pat), 0);
9655 rtx op1 = XEXP (SET_SRC (pat), 1);
9656 if (GET_CODE (op1) == CONST_INT)
9657 return INTVAL (op1) >= 0;
9658 if (GET_CODE (op0) != REG)
9660 if (sparc_check_64 (op0, insn) == 1)
9662 return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
9667 rtx op0 = XEXP (SET_SRC (pat), 0);
9668 rtx op1 = XEXP (SET_SRC (pat), 1);
9669 if (GET_CODE (op0) != REG || sparc_check_64 (op0, insn) <= 0)
9671 if (GET_CODE (op1) == CONST_INT)
9672 return INTVAL (op1) >= 0;
9673 return (GET_CODE (op1) == REG && sparc_check_64 (op1, insn) == 1);
9676 return GET_MODE (SET_SRC (pat)) == SImode;
9677 /* Positive integers leave the high bits zero. */
9679 return ! (CONST_DOUBLE_LOW (SET_SRC (pat)) & 0x80000000);
9681 return ! (INTVAL (SET_SRC (pat)) & 0x80000000);
9684 return - (GET_MODE (SET_SRC (pat)) == SImode);
9686 return sparc_check_64 (SET_SRC (pat), insn);
9692 /* We _ought_ to have only one kind per function, but... */
9693 static GTY(()) rtx sparc_addr_diff_list;
9694 static GTY(()) rtx sparc_addr_list;
9697 sparc_defer_case_vector (rtx lab, rtx vec, int diff)
9699 vec = gen_rtx_EXPR_LIST (VOIDmode, lab, vec);
9701 sparc_addr_diff_list
9702 = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_diff_list);
9704 sparc_addr_list = gen_rtx_EXPR_LIST (VOIDmode, vec, sparc_addr_list);
9708 sparc_output_addr_vec (rtx vec)
9710 rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
9711 int idx, vlen = XVECLEN (body, 0);
9713 #ifdef ASM_OUTPUT_ADDR_VEC_START
9714 ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
9717 #ifdef ASM_OUTPUT_CASE_LABEL
9718 ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
9721 (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
9724 for (idx = 0; idx < vlen; idx++)
9726 ASM_OUTPUT_ADDR_VEC_ELT
9727 (asm_out_file, CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 0, idx), 0)));
9730 #ifdef ASM_OUTPUT_ADDR_VEC_END
9731 ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
9736 sparc_output_addr_diff_vec (rtx vec)
9738 rtx lab = XEXP (vec, 0), body = XEXP (vec, 1);
9739 rtx base = XEXP (XEXP (body, 0), 0);
9740 int idx, vlen = XVECLEN (body, 1);
9742 #ifdef ASM_OUTPUT_ADDR_VEC_START
9743 ASM_OUTPUT_ADDR_VEC_START (asm_out_file);
9746 #ifdef ASM_OUTPUT_CASE_LABEL
9747 ASM_OUTPUT_CASE_LABEL (asm_out_file, "L", CODE_LABEL_NUMBER (lab),
9750 (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (lab));
9753 for (idx = 0; idx < vlen; idx++)
9755 ASM_OUTPUT_ADDR_DIFF_ELT
9758 CODE_LABEL_NUMBER (XEXP (XVECEXP (body, 1, idx), 0)),
9759 CODE_LABEL_NUMBER (base));
9762 #ifdef ASM_OUTPUT_ADDR_VEC_END
9763 ASM_OUTPUT_ADDR_VEC_END (asm_out_file);
9768 sparc_output_deferred_case_vectors (void)
9773 if (sparc_addr_list == NULL_RTX
9774 && sparc_addr_diff_list == NULL_RTX)
9777 /* Align to cache line in the function's code section. */
9778 switch_to_section (current_function_section ());
9780 align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
9782 ASM_OUTPUT_ALIGN (asm_out_file, align);
9784 for (t = sparc_addr_list; t ; t = XEXP (t, 1))
9785 sparc_output_addr_vec (XEXP (t, 0));
9786 for (t = sparc_addr_diff_list; t ; t = XEXP (t, 1))
9787 sparc_output_addr_diff_vec (XEXP (t, 0));
9789 sparc_addr_list = sparc_addr_diff_list = NULL_RTX;
9792 /* Return 0 if the high 32 bits of X (the low word of X, if DImode) are
9793 unknown. Return 1 if the high bits are zero, -1 if the register is
9796 sparc_check_64 (rtx x, rtx insn)
9798 /* If a register is set only once it is safe to ignore insns this
9799 code does not know how to handle. The loop will either recognize
9800 the single set and return the correct value or fail to recognize
9805 gcc_assert (GET_CODE (x) == REG);
9807 if (GET_MODE (x) == DImode)
9808 y = gen_rtx_REG (SImode, REGNO (x) + WORDS_BIG_ENDIAN);
9810 if (flag_expensive_optimizations
9811 && df && DF_REG_DEF_COUNT (REGNO (y)) == 1)
9817 insn = get_last_insn_anywhere ();
9822 while ((insn = PREV_INSN (insn)))
9824 switch (GET_CODE (insn))
9837 rtx pat = PATTERN (insn);
9838 if (GET_CODE (pat) != SET)
9840 if (rtx_equal_p (x, SET_DEST (pat)))
9841 return set_extends (insn);
9842 if (y && rtx_equal_p (y, SET_DEST (pat)))
9843 return set_extends (insn);
9844 if (reg_overlap_mentioned_p (SET_DEST (pat), y))
9852 /* Output a wide shift instruction in V8+ mode. INSN is the instruction,
9853 OPERANDS are its operands and OPCODE is the mnemonic to be used. */
9856 output_v8plus_shift (rtx insn, rtx *operands, const char *opcode)
9858 static char asm_code[60];
9860 /* The scratch register is only required when the destination
9861 register is not a 64-bit global or out register. */
9862 if (which_alternative != 2)
9863 operands[3] = operands[0];
9865 /* We can only shift by constants <= 63. */
9866 if (GET_CODE (operands[2]) == CONST_INT)
9867 operands[2] = GEN_INT (INTVAL (operands[2]) & 0x3f);
9869 if (GET_CODE (operands[1]) == CONST_INT)
9871 output_asm_insn ("mov\t%1, %3", operands);
9875 output_asm_insn ("sllx\t%H1, 32, %3", operands);
9876 if (sparc_check_64 (operands[1], insn) <= 0)
9877 output_asm_insn ("srl\t%L1, 0, %L1", operands);
9878 output_asm_insn ("or\t%L1, %3, %3", operands);
9881 strcpy (asm_code, opcode);
9883 if (which_alternative != 2)
9884 return strcat (asm_code, "\t%0, %2, %L0\n\tsrlx\t%L0, 32, %H0");
9887 strcat (asm_code, "\t%3, %2, %3\n\tsrlx\t%3, 32, %H0\n\tmov\t%3, %L0");
9890 /* Output rtl to increment the profiler label LABELNO
9891 for profiling a function entry. */
9894 sparc_profile_hook (int labelno)
9899 fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_FUNCTION);
9900 if (NO_PROFILE_COUNTERS)
9902 emit_library_call (fun, LCT_NORMAL, VOIDmode, 0);
9906 ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
9907 lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
9908 emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lab, Pmode);
9912 #ifdef TARGET_SOLARIS
9913 /* Solaris implementation of TARGET_ASM_NAMED_SECTION. */
9916 sparc_solaris_elf_asm_named_section (const char *name, unsigned int flags,
9917 tree decl ATTRIBUTE_UNUSED)
9919 if (HAVE_COMDAT_GROUP && flags & SECTION_LINKONCE)
9921 solaris_elf_asm_comdat_section (name, flags, decl);
9925 fprintf (asm_out_file, "\t.section\t\"%s\"", name);
9927 if (!(flags & SECTION_DEBUG))
9928 fputs (",#alloc", asm_out_file);
9929 if (flags & SECTION_WRITE)
9930 fputs (",#write", asm_out_file);
9931 if (flags & SECTION_TLS)
9932 fputs (",#tls", asm_out_file);
9933 if (flags & SECTION_CODE)
9934 fputs (",#execinstr", asm_out_file);
9936 /* Sun as only supports #nobits/#progbits since Solaris 10. */
9937 if (HAVE_AS_SPARC_NOBITS)
9939 if (flags & SECTION_BSS)
9940 fputs (",#nobits", asm_out_file);
9942 fputs (",#progbits", asm_out_file);
9945 fputc ('\n', asm_out_file);
9947 #endif /* TARGET_SOLARIS */
9949 /* We do not allow indirect calls to be optimized into sibling calls.
9951 We cannot use sibling calls when delayed branches are disabled
9952 because they will likely require the call delay slot to be filled.
9954 Also, on SPARC 32-bit we cannot emit a sibling call when the
9955 current function returns a structure. This is because the "unimp
9956 after call" convention would cause the callee to return to the
9957 wrong place. The generic code already disallows cases where the
9958 function being called returns a structure.
9960 It may seem strange how this last case could occur. Usually there
9961 is code after the call which jumps to epilogue code which dumps the
9962 return value into the struct return area. That ought to invalidate
9963 the sibling call right? Well, in the C++ case we can end up passing
9964 the pointer to the struct return area to a constructor (which returns
9965 void) and then nothing else happens. Such a sibling call would look
9966 valid without the added check here.
9968 VxWorks PIC PLT entries require the global pointer to be initialized
9969 on entry. We therefore can't emit sibling calls to them. */
9971 sparc_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
9974 && flag_delayed_branch
9975 && (TARGET_ARCH64 || ! cfun->returns_struct)
9976 && !(TARGET_VXWORKS_RTP
9978 && !targetm.binds_local_p (decl)));
9981 /* libfunc renaming. */
9984 sparc_init_libfuncs (void)
9988 /* Use the subroutines that Sun's library provides for integer
9989 multiply and divide. The `*' prevents an underscore from
9990 being prepended by the compiler. .umul is a little faster
9992 set_optab_libfunc (smul_optab, SImode, "*.umul");
9993 set_optab_libfunc (sdiv_optab, SImode, "*.div");
9994 set_optab_libfunc (udiv_optab, SImode, "*.udiv");
9995 set_optab_libfunc (smod_optab, SImode, "*.rem");
9996 set_optab_libfunc (umod_optab, SImode, "*.urem");
9998 /* TFmode arithmetic. These names are part of the SPARC 32bit ABI. */
9999 set_optab_libfunc (add_optab, TFmode, "_Q_add");
10000 set_optab_libfunc (sub_optab, TFmode, "_Q_sub");
10001 set_optab_libfunc (neg_optab, TFmode, "_Q_neg");
10002 set_optab_libfunc (smul_optab, TFmode, "_Q_mul");
10003 set_optab_libfunc (sdiv_optab, TFmode, "_Q_div");
10005 /* We can define the TFmode sqrt optab only if TARGET_FPU. This
10006 is because with soft-float, the SFmode and DFmode sqrt
10007 instructions will be absent, and the compiler will notice and
10008 try to use the TFmode sqrt instruction for calls to the
10009 builtin function sqrt, but this fails. */
10011 set_optab_libfunc (sqrt_optab, TFmode, "_Q_sqrt");
10013 set_optab_libfunc (eq_optab, TFmode, "_Q_feq");
10014 set_optab_libfunc (ne_optab, TFmode, "_Q_fne");
10015 set_optab_libfunc (gt_optab, TFmode, "_Q_fgt");
10016 set_optab_libfunc (ge_optab, TFmode, "_Q_fge");
10017 set_optab_libfunc (lt_optab, TFmode, "_Q_flt");
10018 set_optab_libfunc (le_optab, TFmode, "_Q_fle");
10020 set_conv_libfunc (sext_optab, TFmode, SFmode, "_Q_stoq");
10021 set_conv_libfunc (sext_optab, TFmode, DFmode, "_Q_dtoq");
10022 set_conv_libfunc (trunc_optab, SFmode, TFmode, "_Q_qtos");
10023 set_conv_libfunc (trunc_optab, DFmode, TFmode, "_Q_qtod");
10025 set_conv_libfunc (sfix_optab, SImode, TFmode, "_Q_qtoi");
10026 set_conv_libfunc (ufix_optab, SImode, TFmode, "_Q_qtou");
10027 set_conv_libfunc (sfloat_optab, TFmode, SImode, "_Q_itoq");
10028 set_conv_libfunc (ufloat_optab, TFmode, SImode, "_Q_utoq");
10030 if (DITF_CONVERSION_LIBFUNCS)
10032 set_conv_libfunc (sfix_optab, DImode, TFmode, "_Q_qtoll");
10033 set_conv_libfunc (ufix_optab, DImode, TFmode, "_Q_qtoull");
10034 set_conv_libfunc (sfloat_optab, TFmode, DImode, "_Q_lltoq");
10035 set_conv_libfunc (ufloat_optab, TFmode, DImode, "_Q_ulltoq");
10038 if (SUN_CONVERSION_LIBFUNCS)
10040 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftoll");
10041 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoull");
10042 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtoll");
10043 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoull");
10048 /* In the SPARC 64bit ABI, SImode multiply and divide functions
10049 do not exist in the library. Make sure the compiler does not
10050 emit calls to them by accident. (It should always use the
10051 hardware instructions.) */
10052 set_optab_libfunc (smul_optab, SImode, 0);
10053 set_optab_libfunc (sdiv_optab, SImode, 0);
10054 set_optab_libfunc (udiv_optab, SImode, 0);
10055 set_optab_libfunc (smod_optab, SImode, 0);
10056 set_optab_libfunc (umod_optab, SImode, 0);
10058 if (SUN_INTEGER_MULTIPLY_64)
10060 set_optab_libfunc (smul_optab, DImode, "__mul64");
10061 set_optab_libfunc (sdiv_optab, DImode, "__div64");
10062 set_optab_libfunc (udiv_optab, DImode, "__udiv64");
10063 set_optab_libfunc (smod_optab, DImode, "__rem64");
10064 set_optab_libfunc (umod_optab, DImode, "__urem64");
10067 if (SUN_CONVERSION_LIBFUNCS)
10069 set_conv_libfunc (sfix_optab, DImode, SFmode, "__ftol");
10070 set_conv_libfunc (ufix_optab, DImode, SFmode, "__ftoul");
10071 set_conv_libfunc (sfix_optab, DImode, DFmode, "__dtol");
10072 set_conv_libfunc (ufix_optab, DImode, DFmode, "__dtoul");
10077 /* SPARC builtins. */
10078 enum sparc_builtins
10080 /* FPU builtins. */
10081 SPARC_BUILTIN_LDFSR,
10082 SPARC_BUILTIN_STFSR,
10084 /* VIS 1.0 builtins. */
10085 SPARC_BUILTIN_FPACK16,
10086 SPARC_BUILTIN_FPACK32,
10087 SPARC_BUILTIN_FPACKFIX,
10088 SPARC_BUILTIN_FEXPAND,
10089 SPARC_BUILTIN_FPMERGE,
10090 SPARC_BUILTIN_FMUL8X16,
10091 SPARC_BUILTIN_FMUL8X16AU,
10092 SPARC_BUILTIN_FMUL8X16AL,
10093 SPARC_BUILTIN_FMUL8SUX16,
10094 SPARC_BUILTIN_FMUL8ULX16,
10095 SPARC_BUILTIN_FMULD8SUX16,
10096 SPARC_BUILTIN_FMULD8ULX16,
10097 SPARC_BUILTIN_FALIGNDATAV4HI,
10098 SPARC_BUILTIN_FALIGNDATAV8QI,
10099 SPARC_BUILTIN_FALIGNDATAV2SI,
10100 SPARC_BUILTIN_FALIGNDATADI,
10101 SPARC_BUILTIN_WRGSR,
10102 SPARC_BUILTIN_RDGSR,
10103 SPARC_BUILTIN_ALIGNADDR,
10104 SPARC_BUILTIN_ALIGNADDRL,
10105 SPARC_BUILTIN_PDIST,
10106 SPARC_BUILTIN_EDGE8,
10107 SPARC_BUILTIN_EDGE8L,
10108 SPARC_BUILTIN_EDGE16,
10109 SPARC_BUILTIN_EDGE16L,
10110 SPARC_BUILTIN_EDGE32,
10111 SPARC_BUILTIN_EDGE32L,
10112 SPARC_BUILTIN_FCMPLE16,
10113 SPARC_BUILTIN_FCMPLE32,
10114 SPARC_BUILTIN_FCMPNE16,
10115 SPARC_BUILTIN_FCMPNE32,
10116 SPARC_BUILTIN_FCMPGT16,
10117 SPARC_BUILTIN_FCMPGT32,
10118 SPARC_BUILTIN_FCMPEQ16,
10119 SPARC_BUILTIN_FCMPEQ32,
10120 SPARC_BUILTIN_FPADD16,
10121 SPARC_BUILTIN_FPADD16S,
10122 SPARC_BUILTIN_FPADD32,
10123 SPARC_BUILTIN_FPADD32S,
10124 SPARC_BUILTIN_FPSUB16,
10125 SPARC_BUILTIN_FPSUB16S,
10126 SPARC_BUILTIN_FPSUB32,
10127 SPARC_BUILTIN_FPSUB32S,
10128 SPARC_BUILTIN_ARRAY8,
10129 SPARC_BUILTIN_ARRAY16,
10130 SPARC_BUILTIN_ARRAY32,
10132 /* VIS 2.0 builtins. */
10133 SPARC_BUILTIN_EDGE8N,
10134 SPARC_BUILTIN_EDGE8LN,
10135 SPARC_BUILTIN_EDGE16N,
10136 SPARC_BUILTIN_EDGE16LN,
10137 SPARC_BUILTIN_EDGE32N,
10138 SPARC_BUILTIN_EDGE32LN,
10139 SPARC_BUILTIN_BMASK,
10140 SPARC_BUILTIN_BSHUFFLEV4HI,
10141 SPARC_BUILTIN_BSHUFFLEV8QI,
10142 SPARC_BUILTIN_BSHUFFLEV2SI,
10143 SPARC_BUILTIN_BSHUFFLEDI,
10145 /* VIS 3.0 builtins. */
10146 SPARC_BUILTIN_CMASK8,
10147 SPARC_BUILTIN_CMASK16,
10148 SPARC_BUILTIN_CMASK32,
10149 SPARC_BUILTIN_FCHKSM16,
10150 SPARC_BUILTIN_FSLL16,
10151 SPARC_BUILTIN_FSLAS16,
10152 SPARC_BUILTIN_FSRL16,
10153 SPARC_BUILTIN_FSRA16,
10154 SPARC_BUILTIN_FSLL32,
10155 SPARC_BUILTIN_FSLAS32,
10156 SPARC_BUILTIN_FSRL32,
10157 SPARC_BUILTIN_FSRA32,
10158 SPARC_BUILTIN_PDISTN,
10159 SPARC_BUILTIN_FMEAN16,
10160 SPARC_BUILTIN_FPADD64,
10161 SPARC_BUILTIN_FPSUB64,
10162 SPARC_BUILTIN_FPADDS16,
10163 SPARC_BUILTIN_FPADDS16S,
10164 SPARC_BUILTIN_FPSUBS16,
10165 SPARC_BUILTIN_FPSUBS16S,
10166 SPARC_BUILTIN_FPADDS32,
10167 SPARC_BUILTIN_FPADDS32S,
10168 SPARC_BUILTIN_FPSUBS32,
10169 SPARC_BUILTIN_FPSUBS32S,
10170 SPARC_BUILTIN_FUCMPLE8,
10171 SPARC_BUILTIN_FUCMPNE8,
10172 SPARC_BUILTIN_FUCMPGT8,
10173 SPARC_BUILTIN_FUCMPEQ8,
10174 SPARC_BUILTIN_FHADDS,
10175 SPARC_BUILTIN_FHADDD,
10176 SPARC_BUILTIN_FHSUBS,
10177 SPARC_BUILTIN_FHSUBD,
10178 SPARC_BUILTIN_FNHADDS,
10179 SPARC_BUILTIN_FNHADDD,
10180 SPARC_BUILTIN_UMULXHI,
10181 SPARC_BUILTIN_XMULX,
10182 SPARC_BUILTIN_XMULXHI,
10187 static GTY (()) tree sparc_builtins[(int) SPARC_BUILTIN_MAX];
10188 static enum insn_code sparc_builtins_icode[(int) SPARC_BUILTIN_MAX];
10190 /* Add a SPARC builtin function with NAME, ICODE, CODE and TYPE. Return the
10191 function decl or NULL_TREE if the builtin was not added. */
10194 def_builtin (const char *name, enum insn_code icode, enum sparc_builtins code,
10198 = add_builtin_function (name, type, code, BUILT_IN_MD, NULL, NULL_TREE);
10202 sparc_builtins[code] = t;
10203 sparc_builtins_icode[code] = icode;
10209 /* Likewise, but also marks the function as "const". */
10212 def_builtin_const (const char *name, enum insn_code icode,
10213 enum sparc_builtins code, tree type)
10215 tree t = def_builtin (name, icode, code, type);
10218 TREE_READONLY (t) = 1;
10223 /* Implement the TARGET_INIT_BUILTINS target hook.
10224 Create builtin functions for special SPARC instructions. */
10227 sparc_init_builtins (void)
10230 sparc_fpu_init_builtins ();
10233 sparc_vis_init_builtins ();
10236 /* Create builtin functions for FPU instructions. */
10239 sparc_fpu_init_builtins (void)
10242 = build_function_type_list (void_type_node,
10243 build_pointer_type (unsigned_type_node), 0);
10244 def_builtin ("__builtin_load_fsr", CODE_FOR_ldfsr,
10245 SPARC_BUILTIN_LDFSR, ftype);
10246 def_builtin ("__builtin_store_fsr", CODE_FOR_stfsr,
10247 SPARC_BUILTIN_STFSR, ftype);
10250 /* Create builtin functions for VIS instructions. */
10253 sparc_vis_init_builtins (void)
10255 tree v4qi = build_vector_type (unsigned_intQI_type_node, 4);
10256 tree v8qi = build_vector_type (unsigned_intQI_type_node, 8);
10257 tree v4hi = build_vector_type (intHI_type_node, 4);
10258 tree v2hi = build_vector_type (intHI_type_node, 2);
10259 tree v2si = build_vector_type (intSI_type_node, 2);
10260 tree v1si = build_vector_type (intSI_type_node, 1);
10262 tree v4qi_ftype_v4hi = build_function_type_list (v4qi, v4hi, 0);
10263 tree v8qi_ftype_v2si_v8qi = build_function_type_list (v8qi, v2si, v8qi, 0);
10264 tree v2hi_ftype_v2si = build_function_type_list (v2hi, v2si, 0);
10265 tree v4hi_ftype_v4qi = build_function_type_list (v4hi, v4qi, 0);
10266 tree v8qi_ftype_v4qi_v4qi = build_function_type_list (v8qi, v4qi, v4qi, 0);
10267 tree v4hi_ftype_v4qi_v4hi = build_function_type_list (v4hi, v4qi, v4hi, 0);
10268 tree v4hi_ftype_v4qi_v2hi = build_function_type_list (v4hi, v4qi, v2hi, 0);
10269 tree v2si_ftype_v4qi_v2hi = build_function_type_list (v2si, v4qi, v2hi, 0);
10270 tree v4hi_ftype_v8qi_v4hi = build_function_type_list (v4hi, v8qi, v4hi, 0);
10271 tree v4hi_ftype_v4hi_v4hi = build_function_type_list (v4hi, v4hi, v4hi, 0);
10272 tree v2si_ftype_v2si_v2si = build_function_type_list (v2si, v2si, v2si, 0);
10273 tree v8qi_ftype_v8qi_v8qi = build_function_type_list (v8qi, v8qi, v8qi, 0);
10274 tree v2hi_ftype_v2hi_v2hi = build_function_type_list (v2hi, v2hi, v2hi, 0);
10275 tree v1si_ftype_v1si_v1si = build_function_type_list (v1si, v1si, v1si, 0);
10276 tree di_ftype_v8qi_v8qi_di = build_function_type_list (intDI_type_node,
10278 intDI_type_node, 0);
10279 tree di_ftype_v8qi_v8qi = build_function_type_list (intDI_type_node,
10281 tree si_ftype_v8qi_v8qi = build_function_type_list (intSI_type_node,
10283 tree di_ftype_di_di = build_function_type_list (intDI_type_node,
10285 intDI_type_node, 0);
10286 tree si_ftype_si_si = build_function_type_list (intSI_type_node,
10288 intSI_type_node, 0);
10289 tree ptr_ftype_ptr_si = build_function_type_list (ptr_type_node,
10291 intSI_type_node, 0);
10292 tree ptr_ftype_ptr_di = build_function_type_list (ptr_type_node,
10294 intDI_type_node, 0);
10295 tree si_ftype_ptr_ptr = build_function_type_list (intSI_type_node,
10298 tree di_ftype_ptr_ptr = build_function_type_list (intDI_type_node,
10301 tree si_ftype_v4hi_v4hi = build_function_type_list (intSI_type_node,
10303 tree si_ftype_v2si_v2si = build_function_type_list (intSI_type_node,
10305 tree di_ftype_v4hi_v4hi = build_function_type_list (intDI_type_node,
10307 tree di_ftype_v2si_v2si = build_function_type_list (intDI_type_node,
10309 tree void_ftype_di = build_function_type_list (void_type_node,
10310 intDI_type_node, 0);
10311 tree di_ftype_void = build_function_type_list (intDI_type_node,
10312 void_type_node, 0);
10313 tree void_ftype_si = build_function_type_list (void_type_node,
10314 intSI_type_node, 0);
10315 tree sf_ftype_sf_sf = build_function_type_list (float_type_node,
10317 float_type_node, 0);
10318 tree df_ftype_df_df = build_function_type_list (double_type_node,
10320 double_type_node, 0);
10322 /* Packing and expanding vectors. */
10323 def_builtin ("__builtin_vis_fpack16", CODE_FOR_fpack16_vis,
10324 SPARC_BUILTIN_FPACK16, v4qi_ftype_v4hi);
10325 def_builtin ("__builtin_vis_fpack32", CODE_FOR_fpack32_vis,
10326 SPARC_BUILTIN_FPACK32, v8qi_ftype_v2si_v8qi);
10327 def_builtin ("__builtin_vis_fpackfix", CODE_FOR_fpackfix_vis,
10328 SPARC_BUILTIN_FPACKFIX, v2hi_ftype_v2si);
10329 def_builtin_const ("__builtin_vis_fexpand", CODE_FOR_fexpand_vis,
10330 SPARC_BUILTIN_FEXPAND, v4hi_ftype_v4qi);
10331 def_builtin_const ("__builtin_vis_fpmerge", CODE_FOR_fpmerge_vis,
10332 SPARC_BUILTIN_FPMERGE, v8qi_ftype_v4qi_v4qi);
10334 /* Multiplications. */
10335 def_builtin_const ("__builtin_vis_fmul8x16", CODE_FOR_fmul8x16_vis,
10336 SPARC_BUILTIN_FMUL8X16, v4hi_ftype_v4qi_v4hi);
10337 def_builtin_const ("__builtin_vis_fmul8x16au", CODE_FOR_fmul8x16au_vis,
10338 SPARC_BUILTIN_FMUL8X16AU, v4hi_ftype_v4qi_v2hi);
10339 def_builtin_const ("__builtin_vis_fmul8x16al", CODE_FOR_fmul8x16al_vis,
10340 SPARC_BUILTIN_FMUL8X16AL, v4hi_ftype_v4qi_v2hi);
10341 def_builtin_const ("__builtin_vis_fmul8sux16", CODE_FOR_fmul8sux16_vis,
10342 SPARC_BUILTIN_FMUL8SUX16, v4hi_ftype_v8qi_v4hi);
10343 def_builtin_const ("__builtin_vis_fmul8ulx16", CODE_FOR_fmul8ulx16_vis,
10344 SPARC_BUILTIN_FMUL8ULX16, v4hi_ftype_v8qi_v4hi);
10345 def_builtin_const ("__builtin_vis_fmuld8sux16", CODE_FOR_fmuld8sux16_vis,
10346 SPARC_BUILTIN_FMULD8SUX16, v2si_ftype_v4qi_v2hi);
10347 def_builtin_const ("__builtin_vis_fmuld8ulx16", CODE_FOR_fmuld8ulx16_vis,
10348 SPARC_BUILTIN_FMULD8ULX16, v2si_ftype_v4qi_v2hi);
10350 /* Data aligning. */
10351 def_builtin ("__builtin_vis_faligndatav4hi", CODE_FOR_faligndatav4hi_vis,
10352 SPARC_BUILTIN_FALIGNDATAV4HI, v4hi_ftype_v4hi_v4hi);
10353 def_builtin ("__builtin_vis_faligndatav8qi", CODE_FOR_faligndatav8qi_vis,
10354 SPARC_BUILTIN_FALIGNDATAV8QI, v8qi_ftype_v8qi_v8qi);
10355 def_builtin ("__builtin_vis_faligndatav2si", CODE_FOR_faligndatav2si_vis,
10356 SPARC_BUILTIN_FALIGNDATAV2SI, v2si_ftype_v2si_v2si);
10357 def_builtin ("__builtin_vis_faligndatadi", CODE_FOR_faligndatav1di_vis,
10358 SPARC_BUILTIN_FALIGNDATADI, di_ftype_di_di);
10360 def_builtin ("__builtin_vis_write_gsr", CODE_FOR_wrgsr_vis,
10361 SPARC_BUILTIN_WRGSR, void_ftype_di);
10362 def_builtin ("__builtin_vis_read_gsr", CODE_FOR_rdgsr_vis,
10363 SPARC_BUILTIN_RDGSR, di_ftype_void);
10367 def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrdi_vis,
10368 SPARC_BUILTIN_ALIGNADDR, ptr_ftype_ptr_di);
10369 def_builtin ("__builtin_vis_alignaddrl", CODE_FOR_alignaddrldi_vis,
10370 SPARC_BUILTIN_ALIGNADDRL, ptr_ftype_ptr_di);
10374 def_builtin ("__builtin_vis_alignaddr", CODE_FOR_alignaddrsi_vis,
10375 SPARC_BUILTIN_ALIGNADDR, ptr_ftype_ptr_si);
10376 def_builtin ("__builtin_vis_alignaddrl", CODE_FOR_alignaddrlsi_vis,
10377 SPARC_BUILTIN_ALIGNADDRL, ptr_ftype_ptr_si);
10380 /* Pixel distance. */
10381 def_builtin_const ("__builtin_vis_pdist", CODE_FOR_pdist_vis,
10382 SPARC_BUILTIN_PDIST, di_ftype_v8qi_v8qi_di);
10384 /* Edge handling. */
10387 def_builtin_const ("__builtin_vis_edge8", CODE_FOR_edge8di_vis,
10388 SPARC_BUILTIN_EDGE8, di_ftype_ptr_ptr);
10389 def_builtin_const ("__builtin_vis_edge8l", CODE_FOR_edge8ldi_vis,
10390 SPARC_BUILTIN_EDGE8L, di_ftype_ptr_ptr);
10391 def_builtin_const ("__builtin_vis_edge16", CODE_FOR_edge16di_vis,
10392 SPARC_BUILTIN_EDGE16, di_ftype_ptr_ptr);
10393 def_builtin_const ("__builtin_vis_edge16l", CODE_FOR_edge16ldi_vis,
10394 SPARC_BUILTIN_EDGE16L, di_ftype_ptr_ptr);
10395 def_builtin_const ("__builtin_vis_edge32", CODE_FOR_edge32di_vis,
10396 SPARC_BUILTIN_EDGE32, di_ftype_ptr_ptr);
10397 def_builtin_const ("__builtin_vis_edge32l", CODE_FOR_edge32ldi_vis,
10398 SPARC_BUILTIN_EDGE32L, di_ftype_ptr_ptr);
10402 def_builtin_const ("__builtin_vis_edge8", CODE_FOR_edge8si_vis,
10403 SPARC_BUILTIN_EDGE8, si_ftype_ptr_ptr);
10404 def_builtin_const ("__builtin_vis_edge8l", CODE_FOR_edge8lsi_vis,
10405 SPARC_BUILTIN_EDGE8L, si_ftype_ptr_ptr);
10406 def_builtin_const ("__builtin_vis_edge16", CODE_FOR_edge16si_vis,
10407 SPARC_BUILTIN_EDGE16, si_ftype_ptr_ptr);
10408 def_builtin_const ("__builtin_vis_edge16l", CODE_FOR_edge16lsi_vis,
10409 SPARC_BUILTIN_EDGE16L, si_ftype_ptr_ptr);
10410 def_builtin_const ("__builtin_vis_edge32", CODE_FOR_edge32si_vis,
10411 SPARC_BUILTIN_EDGE32, si_ftype_ptr_ptr);
10412 def_builtin_const ("__builtin_vis_edge32l", CODE_FOR_edge32lsi_vis,
10413 SPARC_BUILTIN_EDGE32L, si_ftype_ptr_ptr);
10416 /* Pixel compare. */
10419 def_builtin_const ("__builtin_vis_fcmple16", CODE_FOR_fcmple16di_vis,
10420 SPARC_BUILTIN_FCMPLE16, di_ftype_v4hi_v4hi);
10421 def_builtin_const ("__builtin_vis_fcmple32", CODE_FOR_fcmple32di_vis,
10422 SPARC_BUILTIN_FCMPLE32, di_ftype_v2si_v2si);
10423 def_builtin_const ("__builtin_vis_fcmpne16", CODE_FOR_fcmpne16di_vis,
10424 SPARC_BUILTIN_FCMPNE16, di_ftype_v4hi_v4hi);
10425 def_builtin_const ("__builtin_vis_fcmpne32", CODE_FOR_fcmpne32di_vis,
10426 SPARC_BUILTIN_FCMPNE32, di_ftype_v2si_v2si);
10427 def_builtin_const ("__builtin_vis_fcmpgt16", CODE_FOR_fcmpgt16di_vis,
10428 SPARC_BUILTIN_FCMPGT16, di_ftype_v4hi_v4hi);
10429 def_builtin_const ("__builtin_vis_fcmpgt32", CODE_FOR_fcmpgt32di_vis,
10430 SPARC_BUILTIN_FCMPGT32, di_ftype_v2si_v2si);
10431 def_builtin_const ("__builtin_vis_fcmpeq16", CODE_FOR_fcmpeq16di_vis,
10432 SPARC_BUILTIN_FCMPEQ16, di_ftype_v4hi_v4hi);
10433 def_builtin_const ("__builtin_vis_fcmpeq32", CODE_FOR_fcmpeq32di_vis,
10434 SPARC_BUILTIN_FCMPEQ32, di_ftype_v2si_v2si);
10438 def_builtin_const ("__builtin_vis_fcmple16", CODE_FOR_fcmple16si_vis,
10439 SPARC_BUILTIN_FCMPLE16, si_ftype_v4hi_v4hi);
10440 def_builtin_const ("__builtin_vis_fcmple32", CODE_FOR_fcmple32si_vis,
10441 SPARC_BUILTIN_FCMPLE32, si_ftype_v2si_v2si);
10442 def_builtin_const ("__builtin_vis_fcmpne16", CODE_FOR_fcmpne16si_vis,
10443 SPARC_BUILTIN_FCMPNE16, si_ftype_v4hi_v4hi);
10444 def_builtin_const ("__builtin_vis_fcmpne32", CODE_FOR_fcmpne32si_vis,
10445 SPARC_BUILTIN_FCMPNE32, si_ftype_v2si_v2si);
10446 def_builtin_const ("__builtin_vis_fcmpgt16", CODE_FOR_fcmpgt16si_vis,
10447 SPARC_BUILTIN_FCMPGT16, si_ftype_v4hi_v4hi);
10448 def_builtin_const ("__builtin_vis_fcmpgt32", CODE_FOR_fcmpgt32si_vis,
10449 SPARC_BUILTIN_FCMPGT32, si_ftype_v2si_v2si);
10450 def_builtin_const ("__builtin_vis_fcmpeq16", CODE_FOR_fcmpeq16si_vis,
10451 SPARC_BUILTIN_FCMPEQ16, si_ftype_v4hi_v4hi);
10452 def_builtin_const ("__builtin_vis_fcmpeq32", CODE_FOR_fcmpeq32si_vis,
10453 SPARC_BUILTIN_FCMPEQ32, si_ftype_v2si_v2si);
10456 /* Addition and subtraction. */
10457 def_builtin_const ("__builtin_vis_fpadd16", CODE_FOR_addv4hi3,
10458 SPARC_BUILTIN_FPADD16, v4hi_ftype_v4hi_v4hi);
10459 def_builtin_const ("__builtin_vis_fpadd16s", CODE_FOR_addv2hi3,
10460 SPARC_BUILTIN_FPADD16S, v2hi_ftype_v2hi_v2hi);
10461 def_builtin_const ("__builtin_vis_fpadd32", CODE_FOR_addv2si3,
10462 SPARC_BUILTIN_FPADD32, v2si_ftype_v2si_v2si);
10463 def_builtin_const ("__builtin_vis_fpadd32s", CODE_FOR_addv1si3,
10464 SPARC_BUILTIN_FPADD32S, v1si_ftype_v1si_v1si);
10465 def_builtin_const ("__builtin_vis_fpsub16", CODE_FOR_subv4hi3,
10466 SPARC_BUILTIN_FPSUB16, v4hi_ftype_v4hi_v4hi);
10467 def_builtin_const ("__builtin_vis_fpsub16s", CODE_FOR_subv2hi3,
10468 SPARC_BUILTIN_FPSUB16S, v2hi_ftype_v2hi_v2hi);
10469 def_builtin_const ("__builtin_vis_fpsub32", CODE_FOR_subv2si3,
10470 SPARC_BUILTIN_FPSUB32, v2si_ftype_v2si_v2si);
10471 def_builtin_const ("__builtin_vis_fpsub32s", CODE_FOR_subv1si3,
10472 SPARC_BUILTIN_FPSUB32S, v1si_ftype_v1si_v1si);
10474 /* Three-dimensional array addressing. */
10477 def_builtin_const ("__builtin_vis_array8", CODE_FOR_array8di_vis,
10478 SPARC_BUILTIN_ARRAY8, di_ftype_di_di);
10479 def_builtin_const ("__builtin_vis_array16", CODE_FOR_array16di_vis,
10480 SPARC_BUILTIN_ARRAY16, di_ftype_di_di);
10481 def_builtin_const ("__builtin_vis_array32", CODE_FOR_array32di_vis,
10482 SPARC_BUILTIN_ARRAY32, di_ftype_di_di);
10486 def_builtin_const ("__builtin_vis_array8", CODE_FOR_array8si_vis,
10487 SPARC_BUILTIN_ARRAY8, si_ftype_si_si);
10488 def_builtin_const ("__builtin_vis_array16", CODE_FOR_array16si_vis,
10489 SPARC_BUILTIN_ARRAY16, si_ftype_si_si);
10490 def_builtin_const ("__builtin_vis_array32", CODE_FOR_array32si_vis,
10491 SPARC_BUILTIN_ARRAY32, si_ftype_si_si);
10496 /* Edge handling. */
10499 def_builtin_const ("__builtin_vis_edge8n", CODE_FOR_edge8ndi_vis,
10500 SPARC_BUILTIN_EDGE8N, di_ftype_ptr_ptr);
10501 def_builtin_const ("__builtin_vis_edge8ln", CODE_FOR_edge8lndi_vis,
10502 SPARC_BUILTIN_EDGE8LN, di_ftype_ptr_ptr);
10503 def_builtin_const ("__builtin_vis_edge16n", CODE_FOR_edge16ndi_vis,
10504 SPARC_BUILTIN_EDGE16N, di_ftype_ptr_ptr);
10505 def_builtin_const ("__builtin_vis_edge16ln", CODE_FOR_edge16lndi_vis,
10506 SPARC_BUILTIN_EDGE16LN, di_ftype_ptr_ptr);
10507 def_builtin_const ("__builtin_vis_edge32n", CODE_FOR_edge32ndi_vis,
10508 SPARC_BUILTIN_EDGE32N, di_ftype_ptr_ptr);
10509 def_builtin_const ("__builtin_vis_edge32ln", CODE_FOR_edge32lndi_vis,
10510 SPARC_BUILTIN_EDGE32LN, di_ftype_ptr_ptr);
10514 def_builtin_const ("__builtin_vis_edge8n", CODE_FOR_edge8nsi_vis,
10515 SPARC_BUILTIN_EDGE8N, si_ftype_ptr_ptr);
10516 def_builtin_const ("__builtin_vis_edge8ln", CODE_FOR_edge8lnsi_vis,
10517 SPARC_BUILTIN_EDGE8LN, si_ftype_ptr_ptr);
10518 def_builtin_const ("__builtin_vis_edge16n", CODE_FOR_edge16nsi_vis,
10519 SPARC_BUILTIN_EDGE16N, si_ftype_ptr_ptr);
10520 def_builtin_const ("__builtin_vis_edge16ln", CODE_FOR_edge16lnsi_vis,
10521 SPARC_BUILTIN_EDGE16LN, si_ftype_ptr_ptr);
10522 def_builtin_const ("__builtin_vis_edge32n", CODE_FOR_edge32nsi_vis,
10523 SPARC_BUILTIN_EDGE32N, si_ftype_ptr_ptr);
10524 def_builtin_const ("__builtin_vis_edge32ln", CODE_FOR_edge32lnsi_vis,
10525 SPARC_BUILTIN_EDGE32LN, si_ftype_ptr_ptr);
10528 /* Byte mask and shuffle. */
10530 def_builtin ("__builtin_vis_bmask", CODE_FOR_bmaskdi_vis,
10531 SPARC_BUILTIN_BMASK, di_ftype_di_di);
10533 def_builtin ("__builtin_vis_bmask", CODE_FOR_bmasksi_vis,
10534 SPARC_BUILTIN_BMASK, si_ftype_si_si);
10535 def_builtin ("__builtin_vis_bshufflev4hi", CODE_FOR_bshufflev4hi_vis,
10536 SPARC_BUILTIN_BSHUFFLEV4HI, v4hi_ftype_v4hi_v4hi);
10537 def_builtin ("__builtin_vis_bshufflev8qi", CODE_FOR_bshufflev8qi_vis,
10538 SPARC_BUILTIN_BSHUFFLEV8QI, v8qi_ftype_v8qi_v8qi);
10539 def_builtin ("__builtin_vis_bshufflev2si", CODE_FOR_bshufflev2si_vis,
10540 SPARC_BUILTIN_BSHUFFLEV2SI, v2si_ftype_v2si_v2si);
10541 def_builtin ("__builtin_vis_bshuffledi", CODE_FOR_bshufflev1di_vis,
10542 SPARC_BUILTIN_BSHUFFLEDI, di_ftype_di_di);
10549 def_builtin ("__builtin_vis_cmask8", CODE_FOR_cmask8di_vis,
10550 SPARC_BUILTIN_CMASK8, void_ftype_di);
10551 def_builtin ("__builtin_vis_cmask16", CODE_FOR_cmask16di_vis,
10552 SPARC_BUILTIN_CMASK16, void_ftype_di);
10553 def_builtin ("__builtin_vis_cmask32", CODE_FOR_cmask32di_vis,
10554 SPARC_BUILTIN_CMASK32, void_ftype_di);
10558 def_builtin ("__builtin_vis_cmask8", CODE_FOR_cmask8si_vis,
10559 SPARC_BUILTIN_CMASK8, void_ftype_si);
10560 def_builtin ("__builtin_vis_cmask16", CODE_FOR_cmask16si_vis,
10561 SPARC_BUILTIN_CMASK16, void_ftype_si);
10562 def_builtin ("__builtin_vis_cmask32", CODE_FOR_cmask32si_vis,
10563 SPARC_BUILTIN_CMASK32, void_ftype_si);
10566 def_builtin_const ("__builtin_vis_fchksm16", CODE_FOR_fchksm16_vis,
10567 SPARC_BUILTIN_FCHKSM16, v4hi_ftype_v4hi_v4hi);
10569 def_builtin_const ("__builtin_vis_fsll16", CODE_FOR_vashlv4hi3,
10570 SPARC_BUILTIN_FSLL16, v4hi_ftype_v4hi_v4hi);
10571 def_builtin_const ("__builtin_vis_fslas16", CODE_FOR_vssashlv4hi3,
10572 SPARC_BUILTIN_FSLAS16, v4hi_ftype_v4hi_v4hi);
10573 def_builtin_const ("__builtin_vis_fsrl16", CODE_FOR_vlshrv4hi3,
10574 SPARC_BUILTIN_FSRL16, v4hi_ftype_v4hi_v4hi);
10575 def_builtin_const ("__builtin_vis_fsra16", CODE_FOR_vashrv4hi3,
10576 SPARC_BUILTIN_FSRA16, v4hi_ftype_v4hi_v4hi);
10577 def_builtin_const ("__builtin_vis_fsll32", CODE_FOR_vashlv2si3,
10578 SPARC_BUILTIN_FSLL32, v2si_ftype_v2si_v2si);
10579 def_builtin_const ("__builtin_vis_fslas32", CODE_FOR_vssashlv2si3,
10580 SPARC_BUILTIN_FSLAS32, v2si_ftype_v2si_v2si);
10581 def_builtin_const ("__builtin_vis_fsrl32", CODE_FOR_vlshrv2si3,
10582 SPARC_BUILTIN_FSRL32, v2si_ftype_v2si_v2si);
10583 def_builtin_const ("__builtin_vis_fsra32", CODE_FOR_vashrv2si3,
10584 SPARC_BUILTIN_FSRA32, v2si_ftype_v2si_v2si);
10587 def_builtin_const ("__builtin_vis_pdistn", CODE_FOR_pdistndi_vis,
10588 SPARC_BUILTIN_PDISTN, di_ftype_v8qi_v8qi);
10590 def_builtin_const ("__builtin_vis_pdistn", CODE_FOR_pdistnsi_vis,
10591 SPARC_BUILTIN_PDISTN, si_ftype_v8qi_v8qi);
10593 def_builtin_const ("__builtin_vis_fmean16", CODE_FOR_fmean16_vis,
10594 SPARC_BUILTIN_FMEAN16, v4hi_ftype_v4hi_v4hi);
10595 def_builtin_const ("__builtin_vis_fpadd64", CODE_FOR_fpadd64_vis,
10596 SPARC_BUILTIN_FPADD64, di_ftype_di_di);
10597 def_builtin_const ("__builtin_vis_fpsub64", CODE_FOR_fpsub64_vis,
10598 SPARC_BUILTIN_FPSUB64, di_ftype_di_di);
10600 def_builtin_const ("__builtin_vis_fpadds16", CODE_FOR_ssaddv4hi3,
10601 SPARC_BUILTIN_FPADDS16, v4hi_ftype_v4hi_v4hi);
10602 def_builtin_const ("__builtin_vis_fpadds16s", CODE_FOR_ssaddv2hi3,
10603 SPARC_BUILTIN_FPADDS16S, v2hi_ftype_v2hi_v2hi);
10604 def_builtin_const ("__builtin_vis_fpsubs16", CODE_FOR_sssubv4hi3,
10605 SPARC_BUILTIN_FPSUBS16, v4hi_ftype_v4hi_v4hi);
10606 def_builtin_const ("__builtin_vis_fpsubs16s", CODE_FOR_sssubv2hi3,
10607 SPARC_BUILTIN_FPSUBS16S, v2hi_ftype_v2hi_v2hi);
10608 def_builtin_const ("__builtin_vis_fpadds32", CODE_FOR_ssaddv2si3,
10609 SPARC_BUILTIN_FPADDS32, v2si_ftype_v2si_v2si);
10610 def_builtin_const ("__builtin_vis_fpadds32s", CODE_FOR_ssaddv1si3,
10611 SPARC_BUILTIN_FPADDS32S, v1si_ftype_v1si_v1si);
10612 def_builtin_const ("__builtin_vis_fpsubs32", CODE_FOR_sssubv2si3,
10613 SPARC_BUILTIN_FPSUBS32, v2si_ftype_v2si_v2si);
10614 def_builtin_const ("__builtin_vis_fpsubs32s", CODE_FOR_sssubv1si3,
10615 SPARC_BUILTIN_FPSUBS32S, v1si_ftype_v1si_v1si);
10619 def_builtin_const ("__builtin_vis_fucmple8", CODE_FOR_fucmple8di_vis,
10620 SPARC_BUILTIN_FUCMPLE8, di_ftype_v8qi_v8qi);
10621 def_builtin_const ("__builtin_vis_fucmpne8", CODE_FOR_fucmpne8di_vis,
10622 SPARC_BUILTIN_FUCMPNE8, di_ftype_v8qi_v8qi);
10623 def_builtin_const ("__builtin_vis_fucmpgt8", CODE_FOR_fucmpgt8di_vis,
10624 SPARC_BUILTIN_FUCMPGT8, di_ftype_v8qi_v8qi);
10625 def_builtin_const ("__builtin_vis_fucmpeq8", CODE_FOR_fucmpeq8di_vis,
10626 SPARC_BUILTIN_FUCMPEQ8, di_ftype_v8qi_v8qi);
10630 def_builtin_const ("__builtin_vis_fucmple8", CODE_FOR_fucmple8si_vis,
10631 SPARC_BUILTIN_FUCMPLE8, si_ftype_v8qi_v8qi);
10632 def_builtin_const ("__builtin_vis_fucmpne8", CODE_FOR_fucmpne8si_vis,
10633 SPARC_BUILTIN_FUCMPNE8, si_ftype_v8qi_v8qi);
10634 def_builtin_const ("__builtin_vis_fucmpgt8", CODE_FOR_fucmpgt8si_vis,
10635 SPARC_BUILTIN_FUCMPGT8, si_ftype_v8qi_v8qi);
10636 def_builtin_const ("__builtin_vis_fucmpeq8", CODE_FOR_fucmpeq8si_vis,
10637 SPARC_BUILTIN_FUCMPEQ8, si_ftype_v8qi_v8qi);
10640 def_builtin_const ("__builtin_vis_fhadds", CODE_FOR_fhaddsf_vis,
10641 SPARC_BUILTIN_FHADDS, sf_ftype_sf_sf);
10642 def_builtin_const ("__builtin_vis_fhaddd", CODE_FOR_fhadddf_vis,
10643 SPARC_BUILTIN_FHADDD, df_ftype_df_df);
10644 def_builtin_const ("__builtin_vis_fhsubs", CODE_FOR_fhsubsf_vis,
10645 SPARC_BUILTIN_FHSUBS, sf_ftype_sf_sf);
10646 def_builtin_const ("__builtin_vis_fhsubd", CODE_FOR_fhsubdf_vis,
10647 SPARC_BUILTIN_FHSUBD, df_ftype_df_df);
10648 def_builtin_const ("__builtin_vis_fnhadds", CODE_FOR_fnhaddsf_vis,
10649 SPARC_BUILTIN_FNHADDS, sf_ftype_sf_sf);
10650 def_builtin_const ("__builtin_vis_fnhaddd", CODE_FOR_fnhadddf_vis,
10651 SPARC_BUILTIN_FNHADDD, df_ftype_df_df);
10653 def_builtin_const ("__builtin_vis_umulxhi", CODE_FOR_umulxhi_vis,
10654 SPARC_BUILTIN_UMULXHI, di_ftype_di_di);
10655 def_builtin_const ("__builtin_vis_xmulx", CODE_FOR_xmulx_vis,
10656 SPARC_BUILTIN_XMULX, di_ftype_di_di);
10657 def_builtin_const ("__builtin_vis_xmulxhi", CODE_FOR_xmulxhi_vis,
10658 SPARC_BUILTIN_XMULXHI, di_ftype_di_di);
10662 /* Implement TARGET_BUILTIN_DECL hook. */
10665 sparc_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
10667 if (code >= SPARC_BUILTIN_MAX)
10668 return error_mark_node;
10670 return sparc_builtins[code];
10673 /* Implemented TARGET_EXPAND_BUILTIN hook. */
10676 sparc_expand_builtin (tree exp, rtx target,
10677 rtx subtarget ATTRIBUTE_UNUSED,
10678 enum machine_mode tmode ATTRIBUTE_UNUSED,
10679 int ignore ATTRIBUTE_UNUSED)
10681 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10682 enum sparc_builtins code = (enum sparc_builtins) DECL_FUNCTION_CODE (fndecl);
10683 enum insn_code icode = sparc_builtins_icode[code];
10684 bool nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
10685 call_expr_arg_iterator iter;
10692 enum machine_mode tmode = insn_data[icode].operand[0].mode;
10694 || GET_MODE (target) != tmode
10695 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10696 op[0] = gen_reg_rtx (tmode);
10701 FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
10703 const struct insn_operand_data *insn_op;
10706 if (arg == error_mark_node)
10710 idx = arg_count - !nonvoid;
10711 insn_op = &insn_data[icode].operand[idx];
10712 op[arg_count] = expand_normal (arg);
10714 if (code == SPARC_BUILTIN_LDFSR || code == SPARC_BUILTIN_STFSR)
10716 if (!address_operand (op[arg_count], SImode))
10718 op[arg_count] = convert_memory_address (Pmode, op[arg_count]);
10719 op[arg_count] = copy_addr_to_reg (op[arg_count]);
10721 op[arg_count] = gen_rtx_MEM (SImode, op[arg_count]);
10724 else if (insn_op->mode == V1DImode
10725 && GET_MODE (op[arg_count]) == DImode)
10726 op[arg_count] = gen_lowpart (V1DImode, op[arg_count]);
10728 else if (insn_op->mode == V1SImode
10729 && GET_MODE (op[arg_count]) == SImode)
10730 op[arg_count] = gen_lowpart (V1SImode, op[arg_count]);
10732 if (! (*insn_data[icode].operand[idx].predicate) (op[arg_count],
10734 op[arg_count] = copy_to_mode_reg (insn_op->mode, op[arg_count]);
10740 pat = GEN_FCN (icode) (op[0]);
10744 pat = GEN_FCN (icode) (op[0], op[1]);
10746 pat = GEN_FCN (icode) (op[1]);
10749 pat = GEN_FCN (icode) (op[0], op[1], op[2]);
10752 pat = GEN_FCN (icode) (op[0], op[1], op[2], op[3]);
10755 gcc_unreachable ();
10763 return (nonvoid ? op[0] : const0_rtx);
10766 /* Return the upper 16 bits of the 8x16 multiplication. */
10769 sparc_vis_mul8x16 (int e8, int e16)
10771 return (e8 * e16 + 128) / 256;
10774 /* Multiply the VECTOR_CSTs CST0 and CST1 as specified by FNCODE and put
10775 the result into the array N_ELTS, whose elements are of INNER_TYPE. */
10778 sparc_handle_vis_mul8x16 (tree *n_elts, enum sparc_builtins fncode,
10779 tree inner_type, tree cst0, tree cst1)
10781 unsigned i, num = VECTOR_CST_NELTS (cst0);
10786 case SPARC_BUILTIN_FMUL8X16:
10787 for (i = 0; i < num; ++i)
10790 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (VECTOR_CST_ELT (cst0, i)),
10791 TREE_INT_CST_LOW (VECTOR_CST_ELT (cst1, i)));
10792 n_elts[i] = build_int_cst (inner_type, val);
10796 case SPARC_BUILTIN_FMUL8X16AU:
10797 scale = TREE_INT_CST_LOW (VECTOR_CST_ELT (cst1, 0));
10799 for (i = 0; i < num; ++i)
10802 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (VECTOR_CST_ELT (cst0, i)),
10804 n_elts[i] = build_int_cst (inner_type, val);
10808 case SPARC_BUILTIN_FMUL8X16AL:
10809 scale = TREE_INT_CST_LOW (VECTOR_CST_ELT (cst1, 1));
10811 for (i = 0; i < num; ++i)
10814 = sparc_vis_mul8x16 (TREE_INT_CST_LOW (VECTOR_CST_ELT (cst0, i)),
10816 n_elts[i] = build_int_cst (inner_type, val);
10821 gcc_unreachable ();
10825 /* Implement TARGET_FOLD_BUILTIN hook.
10827 Fold builtin functions for SPARC intrinsics. If IGNORE is true the
10828 result of the function call is ignored. NULL_TREE is returned if the
10829 function could not be folded. */
10832 sparc_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED,
10833 tree *args, bool ignore)
10835 enum sparc_builtins code = (enum sparc_builtins) DECL_FUNCTION_CODE (fndecl);
10836 tree rtype = TREE_TYPE (TREE_TYPE (fndecl));
10837 tree arg0, arg1, arg2;
10842 case SPARC_BUILTIN_LDFSR:
10843 case SPARC_BUILTIN_STFSR:
10844 case SPARC_BUILTIN_ALIGNADDR:
10845 case SPARC_BUILTIN_WRGSR:
10846 case SPARC_BUILTIN_BMASK:
10847 case SPARC_BUILTIN_CMASK8:
10848 case SPARC_BUILTIN_CMASK16:
10849 case SPARC_BUILTIN_CMASK32:
10853 return build_zero_cst (rtype);
10858 case SPARC_BUILTIN_FEXPAND:
10862 if (TREE_CODE (arg0) == VECTOR_CST)
10864 tree inner_type = TREE_TYPE (rtype);
10868 n_elts = XALLOCAVEC (tree, VECTOR_CST_NELTS (arg0));
10869 for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
10870 n_elts[i] = build_int_cst (inner_type,
10872 (VECTOR_CST_ELT (arg0, i)) << 4);
10873 return build_vector (rtype, n_elts);
10877 case SPARC_BUILTIN_FMUL8X16:
10878 case SPARC_BUILTIN_FMUL8X16AU:
10879 case SPARC_BUILTIN_FMUL8X16AL:
10885 if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
10887 tree inner_type = TREE_TYPE (rtype);
10888 tree *n_elts = XALLOCAVEC (tree, VECTOR_CST_NELTS (arg0));
10889 sparc_handle_vis_mul8x16 (n_elts, code, inner_type, arg0, arg1);
10890 return build_vector (rtype, n_elts);
10894 case SPARC_BUILTIN_FPMERGE:
10900 if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
10902 tree *n_elts = XALLOCAVEC (tree, 2 * VECTOR_CST_NELTS (arg0));
10904 for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
10906 n_elts[2*i] = VECTOR_CST_ELT (arg0, i);
10907 n_elts[2*i+1] = VECTOR_CST_ELT (arg1, i);
10910 return build_vector (rtype, n_elts);
10914 case SPARC_BUILTIN_PDIST:
10915 case SPARC_BUILTIN_PDISTN:
10920 if (code == SPARC_BUILTIN_PDIST)
10926 arg2 = integer_zero_node;
10928 if (TREE_CODE (arg0) == VECTOR_CST
10929 && TREE_CODE (arg1) == VECTOR_CST
10930 && TREE_CODE (arg2) == INTEGER_CST)
10932 bool overflow = false;
10933 double_int result = TREE_INT_CST (arg2);
10937 for (i = 0; i < VECTOR_CST_NELTS (arg0); ++i)
10939 double_int e0 = TREE_INT_CST (VECTOR_CST_ELT (arg0, i));
10940 double_int e1 = TREE_INT_CST (VECTOR_CST_ELT (arg1, i));
10942 bool neg1_ovf, neg2_ovf, add1_ovf, add2_ovf;
10944 tmp = e1.neg_with_overflow (&neg1_ovf);
10945 tmp = e0.add_with_sign (tmp, false, &add1_ovf);
10946 if (tmp.is_negative ())
10947 tmp = tmp.neg_with_overflow (&neg2_ovf);
10950 result = result.add_with_sign (tmp, false, &add2_ovf);
10951 overflow |= neg1_ovf | neg2_ovf | add1_ovf | add2_ovf;
10954 gcc_assert (!overflow);
10956 return build_int_cst_wide (rtype, result.low, result.high);
10966 /* ??? This duplicates information provided to the compiler by the
10967 ??? scheduler description. Some day, teach genautomata to output
10968 ??? the latencies and then CSE will just use that. */
10971 sparc_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
10972 int *total, bool speed ATTRIBUTE_UNUSED)
10974 enum machine_mode mode = GET_MODE (x);
10975 bool float_mode_p = FLOAT_MODE_P (mode);
10980 if (INTVAL (x) < 0x1000 && INTVAL (x) >= -0x1000)
10998 if (GET_MODE (x) == VOIDmode
10999 && ((CONST_DOUBLE_HIGH (x) == 0
11000 && CONST_DOUBLE_LOW (x) < 0x1000)
11001 || (CONST_DOUBLE_HIGH (x) == -1
11002 && CONST_DOUBLE_LOW (x) < 0
11003 && CONST_DOUBLE_LOW (x) >= -0x1000)))
11010 /* If outer-code was a sign or zero extension, a cost
11011 of COSTS_N_INSNS (1) was already added in. This is
11012 why we are subtracting it back out. */
11013 if (outer_code == ZERO_EXTEND)
11015 *total = sparc_costs->int_zload - COSTS_N_INSNS (1);
11017 else if (outer_code == SIGN_EXTEND)
11019 *total = sparc_costs->int_sload - COSTS_N_INSNS (1);
11021 else if (float_mode_p)
11023 *total = sparc_costs->float_load;
11027 *total = sparc_costs->int_load;
11035 *total = sparc_costs->float_plusminus;
11037 *total = COSTS_N_INSNS (1);
11044 gcc_assert (float_mode_p);
11045 *total = sparc_costs->float_mul;
11048 if (GET_CODE (sub) == NEG)
11049 sub = XEXP (sub, 0);
11050 *total += rtx_cost (sub, FMA, 0, speed);
11053 if (GET_CODE (sub) == NEG)
11054 sub = XEXP (sub, 0);
11055 *total += rtx_cost (sub, FMA, 2, speed);
11061 *total = sparc_costs->float_mul;
11062 else if (! TARGET_HARD_MUL)
11063 *total = COSTS_N_INSNS (25);
11069 if (sparc_costs->int_mul_bit_factor)
11073 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
11075 unsigned HOST_WIDE_INT value = INTVAL (XEXP (x, 1));
11076 for (nbits = 0; value != 0; value &= value - 1)
11079 else if (GET_CODE (XEXP (x, 1)) == CONST_DOUBLE
11080 && GET_MODE (XEXP (x, 1)) == VOIDmode)
11082 rtx x1 = XEXP (x, 1);
11083 unsigned HOST_WIDE_INT value1 = CONST_DOUBLE_LOW (x1);
11084 unsigned HOST_WIDE_INT value2 = CONST_DOUBLE_HIGH (x1);
11086 for (nbits = 0; value1 != 0; value1 &= value1 - 1)
11088 for (; value2 != 0; value2 &= value2 - 1)
11096 bit_cost = (nbits - 3) / sparc_costs->int_mul_bit_factor;
11097 bit_cost = COSTS_N_INSNS (bit_cost);
11100 if (mode == DImode)
11101 *total = sparc_costs->int_mulX + bit_cost;
11103 *total = sparc_costs->int_mul + bit_cost;
11110 *total = COSTS_N_INSNS (1) + sparc_costs->shift_penalty;
11119 if (mode == DFmode)
11120 *total = sparc_costs->float_div_df;
11122 *total = sparc_costs->float_div_sf;
11126 if (mode == DImode)
11127 *total = sparc_costs->int_divX;
11129 *total = sparc_costs->int_div;
11134 if (! float_mode_p)
11136 *total = COSTS_N_INSNS (1);
11143 case UNSIGNED_FLOAT:
11147 case FLOAT_TRUNCATE:
11148 *total = sparc_costs->float_move;
11152 if (mode == DFmode)
11153 *total = sparc_costs->float_sqrt_df;
11155 *total = sparc_costs->float_sqrt_sf;
11160 *total = sparc_costs->float_cmp;
11162 *total = COSTS_N_INSNS (1);
11167 *total = sparc_costs->float_cmove;
11169 *total = sparc_costs->int_cmove;
11173 /* Handle the NAND vector patterns. */
11174 if (sparc_vector_mode_supported_p (GET_MODE (x))
11175 && GET_CODE (XEXP (x, 0)) == NOT
11176 && GET_CODE (XEXP (x, 1)) == NOT)
11178 *total = COSTS_N_INSNS (1);
11189 /* Return true if CLASS is either GENERAL_REGS or I64_REGS. */
11192 general_or_i64_p (reg_class_t rclass)
11194 return (rclass == GENERAL_REGS || rclass == I64_REGS);
11197 /* Implement TARGET_REGISTER_MOVE_COST. */
11200 sparc_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
11201 reg_class_t from, reg_class_t to)
11203 bool need_memory = false;
11205 if (from == FPCC_REGS || to == FPCC_REGS)
11206 need_memory = true;
11207 else if ((FP_REG_CLASS_P (from) && general_or_i64_p (to))
11208 || (general_or_i64_p (from) && FP_REG_CLASS_P (to)))
11212 int size = GET_MODE_SIZE (mode);
11213 if (size == 8 || size == 4)
11215 if (! TARGET_ARCH32 || size == 4)
11221 need_memory = true;
11226 if (sparc_cpu == PROCESSOR_ULTRASPARC
11227 || sparc_cpu == PROCESSOR_ULTRASPARC3
11228 || sparc_cpu == PROCESSOR_NIAGARA
11229 || sparc_cpu == PROCESSOR_NIAGARA2
11230 || sparc_cpu == PROCESSOR_NIAGARA3
11231 || sparc_cpu == PROCESSOR_NIAGARA4)
11240 /* Emit the sequence of insns SEQ while preserving the registers REG and REG2.
11241 This is achieved by means of a manual dynamic stack space allocation in
11242 the current frame. We make the assumption that SEQ doesn't contain any
11243 function calls, with the possible exception of calls to the GOT helper. */
11246 emit_and_preserve (rtx seq, rtx reg, rtx reg2)
11248 /* We must preserve the lowest 16 words for the register save area. */
11249 HOST_WIDE_INT offset = 16*UNITS_PER_WORD;
11250 /* We really need only 2 words of fresh stack space. */
11251 HOST_WIDE_INT size = SPARC_STACK_ALIGN (offset + 2*UNITS_PER_WORD);
11254 = gen_rtx_MEM (word_mode, plus_constant (Pmode, stack_pointer_rtx,
11255 SPARC_STACK_BIAS + offset));
11257 emit_insn (gen_stack_pointer_inc (GEN_INT (-size)));
11258 emit_insn (gen_rtx_SET (VOIDmode, slot, reg));
11260 emit_insn (gen_rtx_SET (VOIDmode,
11261 adjust_address (slot, word_mode, UNITS_PER_WORD),
11265 emit_insn (gen_rtx_SET (VOIDmode,
11267 adjust_address (slot, word_mode, UNITS_PER_WORD)));
11268 emit_insn (gen_rtx_SET (VOIDmode, reg, slot));
11269 emit_insn (gen_stack_pointer_inc (GEN_INT (size)));
11272 /* Output the assembler code for a thunk function. THUNK_DECL is the
11273 declaration for the thunk function itself, FUNCTION is the decl for
11274 the target function. DELTA is an immediate constant offset to be
11275 added to THIS. If VCALL_OFFSET is nonzero, the word at address
11276 (*THIS + VCALL_OFFSET) should be additionally added to THIS. */
11279 sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
11280 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
11283 rtx this_rtx, insn, funexp;
11284 unsigned int int_arg_first;
11286 reload_completed = 1;
11287 epilogue_completed = 1;
11289 emit_note (NOTE_INSN_PROLOGUE_END);
11293 sparc_leaf_function_p = 1;
11295 int_arg_first = SPARC_OUTGOING_INT_ARG_FIRST;
11297 else if (flag_delayed_branch)
11299 /* We will emit a regular sibcall below, so we need to instruct
11300 output_sibcall that we are in a leaf function. */
11301 sparc_leaf_function_p = crtl->uses_only_leaf_regs = 1;
11303 /* This will cause final.c to invoke leaf_renumber_regs so we
11304 must behave as if we were in a not-yet-leafified function. */
11305 int_arg_first = SPARC_INCOMING_INT_ARG_FIRST;
11309 /* We will emit the sibcall manually below, so we will need to
11310 manually spill non-leaf registers. */
11311 sparc_leaf_function_p = crtl->uses_only_leaf_regs = 0;
11313 /* We really are in a leaf function. */
11314 int_arg_first = SPARC_OUTGOING_INT_ARG_FIRST;
11317 /* Find the "this" pointer. Normally in %o0, but in ARCH64 if the function
11318 returns a structure, the structure return pointer is there instead. */
11320 && aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
11321 this_rtx = gen_rtx_REG (Pmode, int_arg_first + 1);
11323 this_rtx = gen_rtx_REG (Pmode, int_arg_first);
11325 /* Add DELTA. When possible use a plain add, otherwise load it into
11326 a register first. */
11329 rtx delta_rtx = GEN_INT (delta);
11331 if (! SPARC_SIMM13_P (delta))
11333 rtx scratch = gen_rtx_REG (Pmode, 1);
11334 emit_move_insn (scratch, delta_rtx);
11335 delta_rtx = scratch;
11338 /* THIS_RTX += DELTA. */
11339 emit_insn (gen_add2_insn (this_rtx, delta_rtx));
11342 /* Add the word at address (*THIS_RTX + VCALL_OFFSET). */
11345 rtx vcall_offset_rtx = GEN_INT (vcall_offset);
11346 rtx scratch = gen_rtx_REG (Pmode, 1);
11348 gcc_assert (vcall_offset < 0);
11350 /* SCRATCH = *THIS_RTX. */
11351 emit_move_insn (scratch, gen_rtx_MEM (Pmode, this_rtx));
11353 /* Prepare for adding VCALL_OFFSET. The difficulty is that we
11354 may not have any available scratch register at this point. */
11355 if (SPARC_SIMM13_P (vcall_offset))
11357 /* This is the case if ARCH64 (unless -ffixed-g5 is passed). */
11358 else if (! fixed_regs[5]
11359 /* The below sequence is made up of at least 2 insns,
11360 while the default method may need only one. */
11361 && vcall_offset < -8192)
11363 rtx scratch2 = gen_rtx_REG (Pmode, 5);
11364 emit_move_insn (scratch2, vcall_offset_rtx);
11365 vcall_offset_rtx = scratch2;
11369 rtx increment = GEN_INT (-4096);
11371 /* VCALL_OFFSET is a negative number whose typical range can be
11372 estimated as -32768..0 in 32-bit mode. In almost all cases
11373 it is therefore cheaper to emit multiple add insns than
11374 spilling and loading the constant into a register (at least
11376 while (! SPARC_SIMM13_P (vcall_offset))
11378 emit_insn (gen_add2_insn (scratch, increment));
11379 vcall_offset += 4096;
11381 vcall_offset_rtx = GEN_INT (vcall_offset); /* cannot be 0 */
11384 /* SCRATCH = *(*THIS_RTX + VCALL_OFFSET). */
11385 emit_move_insn (scratch, gen_rtx_MEM (Pmode,
11386 gen_rtx_PLUS (Pmode,
11388 vcall_offset_rtx)));
11390 /* THIS_RTX += *(*THIS_RTX + VCALL_OFFSET). */
11391 emit_insn (gen_add2_insn (this_rtx, scratch));
11394 /* Generate a tail call to the target function. */
11395 if (! TREE_USED (function))
11397 assemble_external (function);
11398 TREE_USED (function) = 1;
11400 funexp = XEXP (DECL_RTL (function), 0);
11402 if (flag_delayed_branch)
11404 funexp = gen_rtx_MEM (FUNCTION_MODE, funexp);
11405 insn = emit_call_insn (gen_sibcall (funexp));
11406 SIBLING_CALL_P (insn) = 1;
11410 /* The hoops we have to jump through in order to generate a sibcall
11411 without using delay slots... */
11412 rtx spill_reg, seq, scratch = gen_rtx_REG (Pmode, 1);
11416 spill_reg = gen_rtx_REG (word_mode, 15); /* %o7 */
11418 load_got_register (); /* clobbers %o7 */
11419 scratch = sparc_legitimize_pic_address (funexp, scratch);
11420 seq = get_insns ();
11422 emit_and_preserve (seq, spill_reg, pic_offset_table_rtx);
11424 else if (TARGET_ARCH32)
11426 emit_insn (gen_rtx_SET (VOIDmode,
11428 gen_rtx_HIGH (SImode, funexp)));
11429 emit_insn (gen_rtx_SET (VOIDmode,
11431 gen_rtx_LO_SUM (SImode, scratch, funexp)));
11433 else /* TARGET_ARCH64 */
11435 switch (sparc_cmodel)
11439 /* The destination can serve as a temporary. */
11440 sparc_emit_set_symbolic_const64 (scratch, funexp, scratch);
11445 /* The destination cannot serve as a temporary. */
11446 spill_reg = gen_rtx_REG (DImode, 15); /* %o7 */
11448 sparc_emit_set_symbolic_const64 (scratch, funexp, spill_reg);
11449 seq = get_insns ();
11451 emit_and_preserve (seq, spill_reg, 0);
11455 gcc_unreachable ();
11459 emit_jump_insn (gen_indirect_jump (scratch));
11464 /* Run just enough of rest_of_compilation to get the insns emitted.
11465 There's not really enough bulk here to make other passes such as
11466 instruction scheduling worth while. Note that use_thunk calls
11467 assemble_start_function and assemble_end_function. */
11468 insn = get_insns ();
11469 shorten_branches (insn);
11470 final_start_function (insn, file, 1);
11471 final (insn, file, 1);
11472 final_end_function ();
11474 reload_completed = 0;
11475 epilogue_completed = 0;
11478 /* Return true if sparc_output_mi_thunk would be able to output the
11479 assembler code for the thunk function specified by the arguments
11480 it is passed, and false otherwise. */
11482 sparc_can_output_mi_thunk (const_tree thunk_fndecl ATTRIBUTE_UNUSED,
11483 HOST_WIDE_INT delta ATTRIBUTE_UNUSED,
11484 HOST_WIDE_INT vcall_offset,
11485 const_tree function ATTRIBUTE_UNUSED)
11487 /* Bound the loop used in the default method above. */
11488 return (vcall_offset >= -32768 || ! fixed_regs[5]);
11491 /* How to allocate a 'struct machine_function'. */
11493 static struct machine_function *
11494 sparc_init_machine_status (void)
11496 return ggc_alloc_cleared_machine_function ();
11499 /* Locate some local-dynamic symbol still in use by this function
11500 so that we can print its name in local-dynamic base patterns. */
11502 static const char *
11503 get_some_local_dynamic_name (void)
11507 if (cfun->machine->some_ld_name)
11508 return cfun->machine->some_ld_name;
11510 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
11512 && for_each_rtx (&PATTERN (insn), get_some_local_dynamic_name_1, 0))
11513 return cfun->machine->some_ld_name;
11515 gcc_unreachable ();
11519 get_some_local_dynamic_name_1 (rtx *px, void *data ATTRIBUTE_UNUSED)
11524 && GET_CODE (x) == SYMBOL_REF
11525 && SYMBOL_REF_TLS_MODEL (x) == TLS_MODEL_LOCAL_DYNAMIC)
11527 cfun->machine->some_ld_name = XSTR (x, 0);
11534 /* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
11535 We need to emit DTP-relative relocations. */
11538 sparc_output_dwarf_dtprel (FILE *file, int size, rtx x)
11543 fputs ("\t.word\t%r_tls_dtpoff32(", file);
11546 fputs ("\t.xword\t%r_tls_dtpoff64(", file);
11549 gcc_unreachable ();
11551 output_addr_const (file, x);
11555 /* Do whatever processing is required at the end of a file. */
11558 sparc_file_end (void)
11560 /* If we need to emit the special GOT helper function, do so now. */
11561 if (got_helper_rtx)
11563 const char *name = XSTR (got_helper_rtx, 0);
11564 const char *reg_name = reg_names[GLOBAL_OFFSET_TABLE_REGNUM];
11565 #ifdef DWARF2_UNWIND_INFO
11569 if (USE_HIDDEN_LINKONCE)
11571 tree decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL,
11572 get_identifier (name),
11573 build_function_type_list (void_type_node,
11575 DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
11576 NULL_TREE, void_type_node);
11577 TREE_PUBLIC (decl) = 1;
11578 TREE_STATIC (decl) = 1;
11579 make_decl_one_only (decl, DECL_ASSEMBLER_NAME (decl));
11580 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
11581 DECL_VISIBILITY_SPECIFIED (decl) = 1;
11582 resolve_unique_section (decl, 0, flag_function_sections);
11583 allocate_struct_function (decl, true);
11584 cfun->is_thunk = 1;
11585 current_function_decl = decl;
11586 init_varasm_status ();
11587 assemble_start_function (decl, name);
11591 const int align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
11592 switch_to_section (text_section);
11594 ASM_OUTPUT_ALIGN (asm_out_file, align);
11595 ASM_OUTPUT_LABEL (asm_out_file, name);
11598 #ifdef DWARF2_UNWIND_INFO
11599 do_cfi = dwarf2out_do_cfi_asm ();
11601 fprintf (asm_out_file, "\t.cfi_startproc\n");
11603 if (flag_delayed_branch)
11604 fprintf (asm_out_file, "\tjmp\t%%o7+8\n\t add\t%%o7, %s, %s\n",
11605 reg_name, reg_name);
11607 fprintf (asm_out_file, "\tadd\t%%o7, %s, %s\n\tjmp\t%%o7+8\n\t nop\n",
11608 reg_name, reg_name);
11609 #ifdef DWARF2_UNWIND_INFO
11611 fprintf (asm_out_file, "\t.cfi_endproc\n");
11615 if (NEED_INDICATE_EXEC_STACK)
11616 file_end_indicate_exec_stack ();
11618 #ifdef TARGET_SOLARIS
11619 solaris_file_end ();
11623 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
11624 /* Implement TARGET_MANGLE_TYPE. */
11626 static const char *
11627 sparc_mangle_type (const_tree type)
11630 && TYPE_MAIN_VARIANT (type) == long_double_type_node
11631 && TARGET_LONG_DOUBLE_128)
11634 /* For all other types, use normal C++ mangling. */
11639 /* Expand a membar instruction for various use cases. Both the LOAD_STORE
11640 and BEFORE_AFTER arguments of the form X_Y. They are two-bit masks where
11641 bit 0 indicates that X is true, and bit 1 indicates Y is true. */
11644 sparc_emit_membar_for_model (enum memmodel model,
11645 int load_store, int before_after)
11647 /* Bits for the MEMBAR mmask field. */
11648 const int LoadLoad = 1;
11649 const int StoreLoad = 2;
11650 const int LoadStore = 4;
11651 const int StoreStore = 8;
11653 int mm = 0, implied = 0;
11655 switch (sparc_memory_model)
11658 /* Sequential Consistency. All memory transactions are immediately
11659 visible in sequential execution order. No barriers needed. */
11660 implied = LoadLoad | StoreLoad | LoadStore | StoreStore;
11664 /* Total Store Ordering: all memory transactions with store semantics
11665 are followed by an implied StoreStore. */
11666 implied |= StoreStore;
11668 /* If we're not looking for a raw barrer (before+after), then atomic
11669 operations get the benefit of being both load and store. */
11670 if (load_store == 3 && before_after == 1)
11671 implied |= StoreLoad;
11675 /* Partial Store Ordering: all memory transactions with load semantics
11676 are followed by an implied LoadLoad | LoadStore. */
11677 implied |= LoadLoad | LoadStore;
11679 /* If we're not looking for a raw barrer (before+after), then atomic
11680 operations get the benefit of being both load and store. */
11681 if (load_store == 3 && before_after == 2)
11682 implied |= StoreLoad | StoreStore;
11686 /* Relaxed Memory Ordering: no implicit bits. */
11690 gcc_unreachable ();
11693 if (before_after & 1)
11695 if (model == MEMMODEL_RELEASE
11696 || model == MEMMODEL_ACQ_REL
11697 || model == MEMMODEL_SEQ_CST)
11699 if (load_store & 1)
11700 mm |= LoadLoad | StoreLoad;
11701 if (load_store & 2)
11702 mm |= LoadStore | StoreStore;
11705 if (before_after & 2)
11707 if (model == MEMMODEL_ACQUIRE
11708 || model == MEMMODEL_ACQ_REL
11709 || model == MEMMODEL_SEQ_CST)
11711 if (load_store & 1)
11712 mm |= LoadLoad | LoadStore;
11713 if (load_store & 2)
11714 mm |= StoreLoad | StoreStore;
11718 /* Remove the bits implied by the system memory model. */
11721 /* For raw barriers (before+after), always emit a barrier.
11722 This will become a compile-time barrier if needed. */
11723 if (mm || before_after == 3)
11724 emit_insn (gen_membar (GEN_INT (mm)));
11727 /* Expand code to perform a 8 or 16-bit compare and swap by doing 32-bit
11728 compare and swap on the word containing the byte or half-word. */
11731 sparc_expand_compare_and_swap_12 (rtx bool_result, rtx result, rtx mem,
11732 rtx oldval, rtx newval)
11734 rtx addr1 = force_reg (Pmode, XEXP (mem, 0));
11735 rtx addr = gen_reg_rtx (Pmode);
11736 rtx off = gen_reg_rtx (SImode);
11737 rtx oldv = gen_reg_rtx (SImode);
11738 rtx newv = gen_reg_rtx (SImode);
11739 rtx oldvalue = gen_reg_rtx (SImode);
11740 rtx newvalue = gen_reg_rtx (SImode);
11741 rtx res = gen_reg_rtx (SImode);
11742 rtx resv = gen_reg_rtx (SImode);
11743 rtx memsi, val, mask, end_label, loop_label, cc;
11745 emit_insn (gen_rtx_SET (VOIDmode, addr,
11746 gen_rtx_AND (Pmode, addr1, GEN_INT (-4))));
11748 if (Pmode != SImode)
11749 addr1 = gen_lowpart (SImode, addr1);
11750 emit_insn (gen_rtx_SET (VOIDmode, off,
11751 gen_rtx_AND (SImode, addr1, GEN_INT (3))));
11753 memsi = gen_rtx_MEM (SImode, addr);
11754 set_mem_alias_set (memsi, ALIAS_SET_MEMORY_BARRIER);
11755 MEM_VOLATILE_P (memsi) = MEM_VOLATILE_P (mem);
11757 val = copy_to_reg (memsi);
11759 emit_insn (gen_rtx_SET (VOIDmode, off,
11760 gen_rtx_XOR (SImode, off,
11761 GEN_INT (GET_MODE (mem) == QImode
11764 emit_insn (gen_rtx_SET (VOIDmode, off,
11765 gen_rtx_ASHIFT (SImode, off, GEN_INT (3))));
11767 if (GET_MODE (mem) == QImode)
11768 mask = force_reg (SImode, GEN_INT (0xff));
11770 mask = force_reg (SImode, GEN_INT (0xffff));
11772 emit_insn (gen_rtx_SET (VOIDmode, mask,
11773 gen_rtx_ASHIFT (SImode, mask, off)));
11775 emit_insn (gen_rtx_SET (VOIDmode, val,
11776 gen_rtx_AND (SImode, gen_rtx_NOT (SImode, mask),
11779 oldval = gen_lowpart (SImode, oldval);
11780 emit_insn (gen_rtx_SET (VOIDmode, oldv,
11781 gen_rtx_ASHIFT (SImode, oldval, off)));
11783 newval = gen_lowpart_common (SImode, newval);
11784 emit_insn (gen_rtx_SET (VOIDmode, newv,
11785 gen_rtx_ASHIFT (SImode, newval, off)));
11787 emit_insn (gen_rtx_SET (VOIDmode, oldv,
11788 gen_rtx_AND (SImode, oldv, mask)));
11790 emit_insn (gen_rtx_SET (VOIDmode, newv,
11791 gen_rtx_AND (SImode, newv, mask)));
11793 end_label = gen_label_rtx ();
11794 loop_label = gen_label_rtx ();
11795 emit_label (loop_label);
11797 emit_insn (gen_rtx_SET (VOIDmode, oldvalue,
11798 gen_rtx_IOR (SImode, oldv, val)));
11800 emit_insn (gen_rtx_SET (VOIDmode, newvalue,
11801 gen_rtx_IOR (SImode, newv, val)));
11803 emit_move_insn (bool_result, const1_rtx);
11805 emit_insn (gen_atomic_compare_and_swapsi_1 (res, memsi, oldvalue, newvalue));
11807 emit_cmp_and_jump_insns (res, oldvalue, EQ, NULL, SImode, 0, end_label);
11809 emit_insn (gen_rtx_SET (VOIDmode, resv,
11810 gen_rtx_AND (SImode, gen_rtx_NOT (SImode, mask),
11813 emit_move_insn (bool_result, const0_rtx);
11815 cc = gen_compare_reg_1 (NE, resv, val);
11816 emit_insn (gen_rtx_SET (VOIDmode, val, resv));
11818 /* Use cbranchcc4 to separate the compare and branch! */
11819 emit_jump_insn (gen_cbranchcc4 (gen_rtx_NE (VOIDmode, cc, const0_rtx),
11820 cc, const0_rtx, loop_label));
11822 emit_label (end_label);
11824 emit_insn (gen_rtx_SET (VOIDmode, res,
11825 gen_rtx_AND (SImode, res, mask)));
11827 emit_insn (gen_rtx_SET (VOIDmode, res,
11828 gen_rtx_LSHIFTRT (SImode, res, off)));
11830 emit_move_insn (result, gen_lowpart (GET_MODE (result), res));
11833 /* Expand code to perform a compare-and-swap. */
11836 sparc_expand_compare_and_swap (rtx operands[])
11838 rtx bval, retval, mem, oldval, newval;
11839 enum machine_mode mode;
11840 enum memmodel model;
11842 bval = operands[0];
11843 retval = operands[1];
11845 oldval = operands[3];
11846 newval = operands[4];
11847 model = (enum memmodel) INTVAL (operands[6]);
11848 mode = GET_MODE (mem);
11850 sparc_emit_membar_for_model (model, 3, 1);
11852 if (reg_overlap_mentioned_p (retval, oldval))
11853 oldval = copy_to_reg (oldval);
11855 if (mode == QImode || mode == HImode)
11856 sparc_expand_compare_and_swap_12 (bval, retval, mem, oldval, newval);
11859 rtx (*gen) (rtx, rtx, rtx, rtx);
11862 if (mode == SImode)
11863 gen = gen_atomic_compare_and_swapsi_1;
11865 gen = gen_atomic_compare_and_swapdi_1;
11866 emit_insn (gen (retval, mem, oldval, newval));
11868 x = emit_store_flag (bval, EQ, retval, oldval, mode, 1, 1);
11870 convert_move (bval, x, 1);
11873 sparc_emit_membar_for_model (model, 3, 2);
11877 sparc_expand_vec_perm_bmask (enum machine_mode vmode, rtx sel)
11881 sel = gen_lowpart (DImode, sel);
11885 /* inp = xxxxxxxAxxxxxxxB */
11886 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (16),
11887 NULL_RTX, 1, OPTAB_DIRECT);
11888 /* t_1 = ....xxxxxxxAxxx. */
11889 sel = expand_simple_binop (SImode, AND, gen_lowpart (SImode, sel),
11890 GEN_INT (3), NULL_RTX, 1, OPTAB_DIRECT);
11891 t_1 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_1),
11892 GEN_INT (0x30000), NULL_RTX, 1, OPTAB_DIRECT);
11893 /* sel = .......B */
11894 /* t_1 = ...A.... */
11895 sel = expand_simple_binop (SImode, IOR, sel, t_1, sel, 1, OPTAB_DIRECT);
11896 /* sel = ...A...B */
11897 sel = expand_mult (SImode, sel, GEN_INT (0x4444), sel, 1);
11898 /* sel = AAAABBBB * 4 */
11899 t_1 = force_reg (SImode, GEN_INT (0x01230123));
11900 /* sel = { A*4, A*4+1, A*4+2, ... } */
11904 /* inp = xxxAxxxBxxxCxxxD */
11905 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (8),
11906 NULL_RTX, 1, OPTAB_DIRECT);
11907 t_2 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (16),
11908 NULL_RTX, 1, OPTAB_DIRECT);
11909 t_3 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (24),
11910 NULL_RTX, 1, OPTAB_DIRECT);
11911 /* t_1 = ..xxxAxxxBxxxCxx */
11912 /* t_2 = ....xxxAxxxBxxxC */
11913 /* t_3 = ......xxxAxxxBxx */
11914 sel = expand_simple_binop (SImode, AND, gen_lowpart (SImode, sel),
11916 NULL_RTX, 1, OPTAB_DIRECT);
11917 t_1 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_1),
11919 NULL_RTX, 1, OPTAB_DIRECT);
11920 t_2 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_2),
11921 GEN_INT (0x070000),
11922 NULL_RTX, 1, OPTAB_DIRECT);
11923 t_3 = expand_simple_binop (SImode, AND, gen_lowpart (SImode, t_3),
11924 GEN_INT (0x07000000),
11925 NULL_RTX, 1, OPTAB_DIRECT);
11926 /* sel = .......D */
11927 /* t_1 = .....C.. */
11928 /* t_2 = ...B.... */
11929 /* t_3 = .A...... */
11930 sel = expand_simple_binop (SImode, IOR, sel, t_1, sel, 1, OPTAB_DIRECT);
11931 t_2 = expand_simple_binop (SImode, IOR, t_2, t_3, t_2, 1, OPTAB_DIRECT);
11932 sel = expand_simple_binop (SImode, IOR, sel, t_2, sel, 1, OPTAB_DIRECT);
11933 /* sel = .A.B.C.D */
11934 sel = expand_mult (SImode, sel, GEN_INT (0x22), sel, 1);
11935 /* sel = AABBCCDD * 2 */
11936 t_1 = force_reg (SImode, GEN_INT (0x01010101));
11937 /* sel = { A*2, A*2+1, B*2, B*2+1, ... } */
11941 /* input = xAxBxCxDxExFxGxH */
11942 sel = expand_simple_binop (DImode, AND, sel,
11943 GEN_INT ((HOST_WIDE_INT)0x0f0f0f0f << 32
11945 NULL_RTX, 1, OPTAB_DIRECT);
11946 /* sel = .A.B.C.D.E.F.G.H */
11947 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (4),
11948 NULL_RTX, 1, OPTAB_DIRECT);
11949 /* t_1 = ..A.B.C.D.E.F.G. */
11950 sel = expand_simple_binop (DImode, IOR, sel, t_1,
11951 NULL_RTX, 1, OPTAB_DIRECT);
11952 /* sel = .AABBCCDDEEFFGGH */
11953 sel = expand_simple_binop (DImode, AND, sel,
11954 GEN_INT ((HOST_WIDE_INT)0xff00ff << 32
11956 NULL_RTX, 1, OPTAB_DIRECT);
11957 /* sel = ..AB..CD..EF..GH */
11958 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (8),
11959 NULL_RTX, 1, OPTAB_DIRECT);
11960 /* t_1 = ....AB..CD..EF.. */
11961 sel = expand_simple_binop (DImode, IOR, sel, t_1,
11962 NULL_RTX, 1, OPTAB_DIRECT);
11963 /* sel = ..ABABCDCDEFEFGH */
11964 sel = expand_simple_binop (DImode, AND, sel,
11965 GEN_INT ((HOST_WIDE_INT)0xffff << 32 | 0xffff),
11966 NULL_RTX, 1, OPTAB_DIRECT);
11967 /* sel = ....ABCD....EFGH */
11968 t_1 = expand_simple_binop (DImode, LSHIFTRT, sel, GEN_INT (16),
11969 NULL_RTX, 1, OPTAB_DIRECT);
11970 /* t_1 = ........ABCD.... */
11971 sel = gen_lowpart (SImode, sel);
11972 t_1 = gen_lowpart (SImode, t_1);
11976 gcc_unreachable ();
11979 /* Always perform the final addition/merge within the bmask insn. */
11980 emit_insn (gen_bmasksi_vis (gen_rtx_REG (SImode, 0), sel, t_1));
11983 /* Implement TARGET_FRAME_POINTER_REQUIRED. */
11986 sparc_frame_pointer_required (void)
11988 /* If the stack pointer is dynamically modified in the function, it cannot
11989 serve as the frame pointer. */
11990 if (cfun->calls_alloca)
11993 /* If the function receives nonlocal gotos, it needs to save the frame
11994 pointer in the nonlocal_goto_save_area object. */
11995 if (cfun->has_nonlocal_label)
11998 /* In flat mode, that's it. */
12002 /* Otherwise, the frame pointer is required if the function isn't leaf. */
12003 return !(crtl->is_leaf && only_leaf_regs_used ());
12006 /* The way this is structured, we can't eliminate SFP in favor of SP
12007 if the frame pointer is required: we want to use the SFP->HFP elimination
12008 in that case. But the test in update_eliminables doesn't know we are
12009 assuming below that we only do the former elimination. */
12012 sparc_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
12014 return to == HARD_FRAME_POINTER_REGNUM || !sparc_frame_pointer_required ();
12017 /* Return the hard frame pointer directly to bypass the stack bias. */
12020 sparc_builtin_setjmp_frame_value (void)
12022 return hard_frame_pointer_rtx;
12025 /* If !TARGET_FPU, then make the fp registers and fp cc regs fixed so that
12026 they won't be allocated. */
12029 sparc_conditional_register_usage (void)
12031 if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
12033 fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
12034 call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
12036 /* If the user has passed -f{fixed,call-{used,saved}}-g5 */
12037 /* then honor it. */
12038 if (TARGET_ARCH32 && fixed_regs[5])
12040 else if (TARGET_ARCH64 && fixed_regs[5] == 2)
12045 for (regno = SPARC_FIRST_V9_FP_REG;
12046 regno <= SPARC_LAST_V9_FP_REG;
12048 fixed_regs[regno] = 1;
12049 /* %fcc0 is used by v8 and v9. */
12050 for (regno = SPARC_FIRST_V9_FCC_REG + 1;
12051 regno <= SPARC_LAST_V9_FCC_REG;
12053 fixed_regs[regno] = 1;
12058 for (regno = 32; regno < SPARC_LAST_V9_FCC_REG; regno++)
12059 fixed_regs[regno] = 1;
12061 /* If the user has passed -f{fixed,call-{used,saved}}-g2 */
12062 /* then honor it. Likewise with g3 and g4. */
12063 if (fixed_regs[2] == 2)
12064 fixed_regs[2] = ! TARGET_APP_REGS;
12065 if (fixed_regs[3] == 2)
12066 fixed_regs[3] = ! TARGET_APP_REGS;
12067 if (TARGET_ARCH32 && fixed_regs[4] == 2)
12068 fixed_regs[4] = ! TARGET_APP_REGS;
12069 else if (TARGET_CM_EMBMEDANY)
12071 else if (fixed_regs[4] == 2)
12076 /* Disable leaf functions. */
12077 memset (sparc_leaf_regs, 0, FIRST_PSEUDO_REGISTER);
12078 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
12079 leaf_reg_remap [regno] = regno;
12082 global_regs[SPARC_GSR_REG] = 1;
12085 /* Implement TARGET_PREFERRED_RELOAD_CLASS:
12087 - We can't load constants into FP registers.
12088 - We can't load FP constants into integer registers when soft-float,
12089 because there is no soft-float pattern with a r/F constraint.
12090 - We can't load FP constants into integer registers for TFmode unless
12091 it is 0.0L, because there is no movtf pattern with a r/F constraint.
12092 - Try and reload integer constants (symbolic or otherwise) back into
12093 registers directly, rather than having them dumped to memory. */
12096 sparc_preferred_reload_class (rtx x, reg_class_t rclass)
12098 enum machine_mode mode = GET_MODE (x);
12099 if (CONSTANT_P (x))
12101 if (FP_REG_CLASS_P (rclass)
12102 || rclass == GENERAL_OR_FP_REGS
12103 || rclass == GENERAL_OR_EXTRA_FP_REGS
12104 || (GET_MODE_CLASS (mode) == MODE_FLOAT && ! TARGET_FPU)
12105 || (mode == TFmode && ! const_zero_operand (x, mode)))
12108 if (GET_MODE_CLASS (mode) == MODE_INT)
12109 return GENERAL_REGS;
12111 if (GET_MODE_CLASS (mode) == MODE_VECTOR_INT)
12113 if (! FP_REG_CLASS_P (rclass)
12114 || !(const_zero_operand (x, mode)
12115 || const_all_ones_operand (x, mode)))
12122 && (rclass == EXTRA_FP_REGS
12123 || rclass == GENERAL_OR_EXTRA_FP_REGS))
12125 int regno = true_regnum (x);
12127 if (SPARC_INT_REG_P (regno))
12128 return (rclass == EXTRA_FP_REGS
12129 ? FP_REGS : GENERAL_OR_FP_REGS);
12135 /* Output a wide multiply instruction in V8+ mode. INSN is the instruction,
12136 OPERANDS are its operands and OPCODE is the mnemonic to be used. */
12139 output_v8plus_mult (rtx insn, rtx *operands, const char *opcode)
12143 gcc_assert (! TARGET_ARCH64);
12145 if (sparc_check_64 (operands[1], insn) <= 0)
12146 output_asm_insn ("srl\t%L1, 0, %L1", operands);
12147 if (which_alternative == 1)
12148 output_asm_insn ("sllx\t%H1, 32, %H1", operands);
12149 if (GET_CODE (operands[2]) == CONST_INT)
12151 if (which_alternative == 1)
12153 output_asm_insn ("or\t%L1, %H1, %H1", operands);
12154 sprintf (mulstr, "%s\t%%H1, %%2, %%L0", opcode);
12155 output_asm_insn (mulstr, operands);
12156 return "srlx\t%L0, 32, %H0";
12160 output_asm_insn ("sllx\t%H1, 32, %3", operands);
12161 output_asm_insn ("or\t%L1, %3, %3", operands);
12162 sprintf (mulstr, "%s\t%%3, %%2, %%3", opcode);
12163 output_asm_insn (mulstr, operands);
12164 output_asm_insn ("srlx\t%3, 32, %H0", operands);
12165 return "mov\t%3, %L0";
12168 else if (rtx_equal_p (operands[1], operands[2]))
12170 if (which_alternative == 1)
12172 output_asm_insn ("or\t%L1, %H1, %H1", operands);
12173 sprintf (mulstr, "%s\t%%H1, %%H1, %%L0", opcode);
12174 output_asm_insn (mulstr, operands);
12175 return "srlx\t%L0, 32, %H0";
12179 output_asm_insn ("sllx\t%H1, 32, %3", operands);
12180 output_asm_insn ("or\t%L1, %3, %3", operands);
12181 sprintf (mulstr, "%s\t%%3, %%3, %%3", opcode);
12182 output_asm_insn (mulstr, operands);
12183 output_asm_insn ("srlx\t%3, 32, %H0", operands);
12184 return "mov\t%3, %L0";
12187 if (sparc_check_64 (operands[2], insn) <= 0)
12188 output_asm_insn ("srl\t%L2, 0, %L2", operands);
12189 if (which_alternative == 1)
12191 output_asm_insn ("or\t%L1, %H1, %H1", operands);
12192 output_asm_insn ("sllx\t%H2, 32, %L1", operands);
12193 output_asm_insn ("or\t%L2, %L1, %L1", operands);
12194 sprintf (mulstr, "%s\t%%H1, %%L1, %%L0", opcode);
12195 output_asm_insn (mulstr, operands);
12196 return "srlx\t%L0, 32, %H0";
12200 output_asm_insn ("sllx\t%H1, 32, %3", operands);
12201 output_asm_insn ("sllx\t%H2, 32, %4", operands);
12202 output_asm_insn ("or\t%L1, %3, %3", operands);
12203 output_asm_insn ("or\t%L2, %4, %4", operands);
12204 sprintf (mulstr, "%s\t%%3, %%4, %%3", opcode);
12205 output_asm_insn (mulstr, operands);
12206 output_asm_insn ("srlx\t%3, 32, %H0", operands);
12207 return "mov\t%3, %L0";
12211 /* Subroutine of sparc_expand_vector_init. Emit code to initialize
12212 all fields of TARGET to ELT by means of VIS2 BSHUFFLE insn. MODE
12213 and INNER_MODE are the modes describing TARGET. */
12216 vector_init_bshuffle (rtx target, rtx elt, enum machine_mode mode,
12217 enum machine_mode inner_mode)
12219 rtx t1, final_insn, sel;
12222 t1 = gen_reg_rtx (mode);
12224 elt = convert_modes (SImode, inner_mode, elt, true);
12225 emit_move_insn (gen_lowpart(SImode, t1), elt);
12230 final_insn = gen_bshufflev2si_vis (target, t1, t1);
12231 bmask = 0x45674567;
12234 final_insn = gen_bshufflev4hi_vis (target, t1, t1);
12235 bmask = 0x67676767;
12238 final_insn = gen_bshufflev8qi_vis (target, t1, t1);
12239 bmask = 0x77777777;
12242 gcc_unreachable ();
12245 sel = force_reg (SImode, GEN_INT (bmask));
12246 emit_insn (gen_bmasksi_vis (gen_rtx_REG (SImode, 0), sel, const0_rtx));
12247 emit_insn (final_insn);
12250 /* Subroutine of sparc_expand_vector_init. Emit code to initialize
12251 all fields of TARGET to ELT in V8QI by means of VIS FPMERGE insn. */
12254 vector_init_fpmerge (rtx target, rtx elt)
12256 rtx t1, t2, t2_low, t3, t3_low;
12258 t1 = gen_reg_rtx (V4QImode);
12259 elt = convert_modes (SImode, QImode, elt, true);
12260 emit_move_insn (gen_lowpart (SImode, t1), elt);
12262 t2 = gen_reg_rtx (V8QImode);
12263 t2_low = gen_lowpart (V4QImode, t2);
12264 emit_insn (gen_fpmerge_vis (t2, t1, t1));
12266 t3 = gen_reg_rtx (V8QImode);
12267 t3_low = gen_lowpart (V4QImode, t3);
12268 emit_insn (gen_fpmerge_vis (t3, t2_low, t2_low));
12270 emit_insn (gen_fpmerge_vis (target, t3_low, t3_low));
12273 /* Subroutine of sparc_expand_vector_init. Emit code to initialize
12274 all fields of TARGET to ELT in V4HI by means of VIS FALIGNDATA insn. */
12277 vector_init_faligndata (rtx target, rtx elt)
12279 rtx t1 = gen_reg_rtx (V4HImode);
12282 elt = convert_modes (SImode, HImode, elt, true);
12283 emit_move_insn (gen_lowpart (SImode, t1), elt);
12285 emit_insn (gen_alignaddrsi_vis (gen_reg_rtx (SImode),
12286 force_reg (SImode, GEN_INT (6)),
12289 for (i = 0; i < 4; i++)
12290 emit_insn (gen_faligndatav4hi_vis (target, t1, target));
12293 /* Emit code to initialize TARGET to values for individual fields VALS. */
12296 sparc_expand_vector_init (rtx target, rtx vals)
12298 const enum machine_mode mode = GET_MODE (target);
12299 const enum machine_mode inner_mode = GET_MODE_INNER (mode);
12300 const int n_elts = GET_MODE_NUNITS (mode);
12306 for (i = 0; i < n_elts; i++)
12308 rtx x = XVECEXP (vals, 0, i);
12309 if (!CONSTANT_P (x))
12312 if (i > 0 && !rtx_equal_p (x, XVECEXP (vals, 0, 0)))
12318 emit_move_insn (target, gen_rtx_CONST_VECTOR (mode, XVEC (vals, 0)));
12322 if (GET_MODE_SIZE (inner_mode) == GET_MODE_SIZE (mode))
12324 if (GET_MODE_SIZE (inner_mode) == 4)
12326 emit_move_insn (gen_lowpart (SImode, target),
12327 gen_lowpart (SImode, XVECEXP (vals, 0, 0)));
12330 else if (GET_MODE_SIZE (inner_mode) == 8)
12332 emit_move_insn (gen_lowpart (DImode, target),
12333 gen_lowpart (DImode, XVECEXP (vals, 0, 0)));
12337 else if (GET_MODE_SIZE (inner_mode) == GET_MODE_SIZE (word_mode)
12338 && GET_MODE_SIZE (mode) == 2 * GET_MODE_SIZE (word_mode))
12340 emit_move_insn (gen_highpart (word_mode, target),
12341 gen_lowpart (word_mode, XVECEXP (vals, 0, 0)));
12342 emit_move_insn (gen_lowpart (word_mode, target),
12343 gen_lowpart (word_mode, XVECEXP (vals, 0, 1)));
12347 if (all_same && GET_MODE_SIZE (mode) == 8)
12351 vector_init_bshuffle (target, XVECEXP (vals, 0, 0), mode, inner_mode);
12354 if (mode == V8QImode)
12356 vector_init_fpmerge (target, XVECEXP (vals, 0, 0));
12359 if (mode == V4HImode)
12361 vector_init_faligndata (target, XVECEXP (vals, 0, 0));
12366 mem = assign_stack_temp (mode, GET_MODE_SIZE (mode));
12367 for (i = 0; i < n_elts; i++)
12368 emit_move_insn (adjust_address_nv (mem, inner_mode,
12369 i * GET_MODE_SIZE (inner_mode)),
12370 XVECEXP (vals, 0, i));
12371 emit_move_insn (target, mem);
12374 /* Implement TARGET_SECONDARY_RELOAD. */
12377 sparc_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
12378 enum machine_mode mode, secondary_reload_info *sri)
12380 enum reg_class rclass = (enum reg_class) rclass_i;
12382 sri->icode = CODE_FOR_nothing;
12383 sri->extra_cost = 0;
12385 /* We need a temporary when loading/storing a HImode/QImode value
12386 between memory and the FPU registers. This can happen when combine puts
12387 a paradoxical subreg in a float/fix conversion insn. */
12388 if (FP_REG_CLASS_P (rclass)
12389 && (mode == HImode || mode == QImode)
12390 && (GET_CODE (x) == MEM
12391 || ((GET_CODE (x) == REG || GET_CODE (x) == SUBREG)
12392 && true_regnum (x) == -1)))
12393 return GENERAL_REGS;
12395 /* On 32-bit we need a temporary when loading/storing a DFmode value
12396 between unaligned memory and the upper FPU registers. */
12398 && rclass == EXTRA_FP_REGS
12400 && GET_CODE (x) == MEM
12401 && ! mem_min_alignment (x, 8))
12404 if (((TARGET_CM_MEDANY
12405 && symbolic_operand (x, mode))
12406 || (TARGET_CM_EMBMEDANY
12407 && text_segment_operand (x, mode)))
12411 sri->icode = direct_optab_handler (reload_in_optab, mode);
12413 sri->icode = direct_optab_handler (reload_out_optab, mode);
12417 if (TARGET_VIS3 && TARGET_ARCH32)
12419 int regno = true_regnum (x);
12421 /* When using VIS3 fp<-->int register moves, on 32-bit we have
12422 to move 8-byte values in 4-byte pieces. This only works via
12423 FP_REGS, and not via EXTRA_FP_REGS. Therefore if we try to
12424 move between EXTRA_FP_REGS and GENERAL_REGS, we will need
12425 an FP_REGS intermediate move. */
12426 if ((rclass == EXTRA_FP_REGS && SPARC_INT_REG_P (regno))
12427 || ((general_or_i64_p (rclass)
12428 || rclass == GENERAL_OR_FP_REGS)
12429 && SPARC_FP_REG_P (regno)))
12431 sri->extra_cost = 2;
12439 /* Emit code to conditionally move either OPERANDS[2] or OPERANDS[3] into
12440 OPERANDS[0] in MODE. OPERANDS[1] is the operator of the condition. */
12443 sparc_expand_conditional_move (enum machine_mode mode, rtx *operands)
12445 enum rtx_code rc = GET_CODE (operands[1]);
12446 enum machine_mode cmp_mode;
12447 rtx cc_reg, dst, cmp;
12450 if (GET_MODE (XEXP (cmp, 0)) == DImode && !TARGET_ARCH64)
12453 if (GET_MODE (XEXP (cmp, 0)) == TFmode && !TARGET_HARD_QUAD)
12454 cmp = sparc_emit_float_lib_cmp (XEXP (cmp, 0), XEXP (cmp, 1), rc);
12456 cmp_mode = GET_MODE (XEXP (cmp, 0));
12457 rc = GET_CODE (cmp);
12460 if (! rtx_equal_p (operands[2], dst)
12461 && ! rtx_equal_p (operands[3], dst))
12463 if (reg_overlap_mentioned_p (dst, cmp))
12464 dst = gen_reg_rtx (mode);
12466 emit_move_insn (dst, operands[3]);
12468 else if (operands[2] == dst)
12470 operands[2] = operands[3];
12472 if (GET_MODE_CLASS (cmp_mode) == MODE_FLOAT)
12473 rc = reverse_condition_maybe_unordered (rc);
12475 rc = reverse_condition (rc);
12478 if (XEXP (cmp, 1) == const0_rtx
12479 && GET_CODE (XEXP (cmp, 0)) == REG
12480 && cmp_mode == DImode
12481 && v9_regcmp_p (rc))
12482 cc_reg = XEXP (cmp, 0);
12484 cc_reg = gen_compare_reg_1 (rc, XEXP (cmp, 0), XEXP (cmp, 1));
12486 cmp = gen_rtx_fmt_ee (rc, GET_MODE (cc_reg), cc_reg, const0_rtx);
12488 emit_insn (gen_rtx_SET (VOIDmode, dst,
12489 gen_rtx_IF_THEN_ELSE (mode, cmp, operands[2], dst)));
12491 if (dst != operands[0])
12492 emit_move_insn (operands[0], dst);
12497 /* Emit code to conditionally move a combination of OPERANDS[1] and OPERANDS[2]
12498 into OPERANDS[0] in MODE, depending on the outcome of the comparison of
12499 OPERANDS[4] and OPERANDS[5]. OPERANDS[3] is the operator of the condition.
12500 FCODE is the machine code to be used for OPERANDS[3] and CCODE the machine
12501 code to be used for the condition mask. */
12504 sparc_expand_vcond (enum machine_mode mode, rtx *operands, int ccode, int fcode)
12506 rtx mask, cop0, cop1, fcmp, cmask, bshuf, gsr;
12507 enum rtx_code code = GET_CODE (operands[3]);
12509 mask = gen_reg_rtx (Pmode);
12510 cop0 = operands[4];
12511 cop1 = operands[5];
12512 if (code == LT || code == GE)
12516 code = swap_condition (code);
12517 t = cop0; cop0 = cop1; cop1 = t;
12520 gsr = gen_rtx_REG (DImode, SPARC_GSR_REG);
12522 fcmp = gen_rtx_UNSPEC (Pmode,
12523 gen_rtvec (1, gen_rtx_fmt_ee (code, mode, cop0, cop1)),
12526 cmask = gen_rtx_UNSPEC (DImode,
12527 gen_rtvec (2, mask, gsr),
12530 bshuf = gen_rtx_UNSPEC (mode,
12531 gen_rtvec (3, operands[1], operands[2], gsr),
12534 emit_insn (gen_rtx_SET (VOIDmode, mask, fcmp));
12535 emit_insn (gen_rtx_SET (VOIDmode, gsr, cmask));
12537 emit_insn (gen_rtx_SET (VOIDmode, operands[0], bshuf));
12540 /* On sparc, any mode which naturally allocates into the float
12541 registers should return 4 here. */
12544 sparc_regmode_natural_size (enum machine_mode mode)
12546 int size = UNITS_PER_WORD;
12550 enum mode_class mclass = GET_MODE_CLASS (mode);
12552 if (mclass == MODE_FLOAT || mclass == MODE_VECTOR_INT)
12559 /* Return TRUE if it is a good idea to tie two pseudo registers
12560 when one has mode MODE1 and one has mode MODE2.
12561 If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
12562 for any hard reg, then this must be FALSE for correct output.
12564 For V9 we have to deal with the fact that only the lower 32 floating
12565 point registers are 32-bit addressable. */
12568 sparc_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
12570 enum mode_class mclass1, mclass2;
12571 unsigned short size1, size2;
12573 if (mode1 == mode2)
12576 mclass1 = GET_MODE_CLASS (mode1);
12577 mclass2 = GET_MODE_CLASS (mode2);
12578 if (mclass1 != mclass2)
12584 /* Classes are the same and we are V9 so we have to deal with upper
12585 vs. lower floating point registers. If one of the modes is a
12586 4-byte mode, and the other is not, we have to mark them as not
12587 tieable because only the lower 32 floating point register are
12588 addressable 32-bits at a time.
12590 We can't just test explicitly for SFmode, otherwise we won't
12591 cover the vector mode cases properly. */
12593 if (mclass1 != MODE_FLOAT && mclass1 != MODE_VECTOR_INT)
12596 size1 = GET_MODE_SIZE (mode1);
12597 size2 = GET_MODE_SIZE (mode2);
12598 if ((size1 > 4 && size2 == 4)
12599 || (size2 > 4 && size1 == 4))
12605 /* Implement TARGET_CSTORE_MODE. */
12607 static enum machine_mode
12608 sparc_cstore_mode (enum insn_code icode ATTRIBUTE_UNUSED)
12610 return (TARGET_ARCH64 ? DImode : SImode);
12613 /* Return the compound expression made of T1 and T2. */
12616 compound_expr (tree t1, tree t2)
12618 return build2 (COMPOUND_EXPR, void_type_node, t1, t2);
12621 /* Implement TARGET_ATOMIC_ASSIGN_EXPAND_FENV hook. */
12624 sparc_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update)
12629 const unsigned HOST_WIDE_INT accrued_exception_mask = 0x1f << 5;
12630 const unsigned HOST_WIDE_INT trap_enable_mask = 0x1f << 23;
12632 /* We generate the equivalent of feholdexcept (&fenv_var):
12634 unsigned int fenv_var;
12635 __builtin_store_fsr (&fenv_var);
12637 unsigned int tmp1_var;
12638 tmp1_var = fenv_var & ~(accrued_exception_mask | trap_enable_mask);
12640 __builtin_load_fsr (&tmp1_var); */
12642 tree fenv_var = create_tmp_var (unsigned_type_node, NULL);
12643 mark_addressable (fenv_var);
12644 tree fenv_addr = build_fold_addr_expr (fenv_var);
12645 tree stfsr = sparc_builtins[SPARC_BUILTIN_STFSR];
12646 tree hold_stfsr = build_call_expr (stfsr, 1, fenv_addr);
12648 tree tmp1_var = create_tmp_var (unsigned_type_node, NULL);
12649 mark_addressable (tmp1_var);
12650 tree masked_fenv_var
12651 = build2 (BIT_AND_EXPR, unsigned_type_node, fenv_var,
12652 build_int_cst (unsigned_type_node,
12653 ~(accrued_exception_mask | trap_enable_mask)));
12655 = build2 (MODIFY_EXPR, void_type_node, tmp1_var, masked_fenv_var);
12657 tree tmp1_addr = build_fold_addr_expr (tmp1_var);
12658 tree ldfsr = sparc_builtins[SPARC_BUILTIN_LDFSR];
12659 tree hold_ldfsr = build_call_expr (ldfsr, 1, tmp1_addr);
12661 *hold = compound_expr (compound_expr (hold_stfsr, hold_mask), hold_ldfsr);
12663 /* We reload the value of tmp1_var to clear the exceptions:
12665 __builtin_load_fsr (&tmp1_var); */
12667 *clear = build_call_expr (ldfsr, 1, tmp1_addr);
12669 /* We generate the equivalent of feupdateenv (&fenv_var):
12671 unsigned int tmp2_var;
12672 __builtin_store_fsr (&tmp2_var);
12674 __builtin_load_fsr (&fenv_var);
12676 if (SPARC_LOW_FE_EXCEPT_VALUES)
12678 __atomic_feraiseexcept ((int) tmp2_var); */
12680 tree tmp2_var = create_tmp_var (unsigned_type_node, NULL);
12681 mark_addressable (tmp2_var);
12682 tree tmp3_addr = build_fold_addr_expr (tmp2_var);
12683 tree update_stfsr = build_call_expr (stfsr, 1, tmp3_addr);
12685 tree update_ldfsr = build_call_expr (ldfsr, 1, fenv_addr);
12687 tree atomic_feraiseexcept
12688 = builtin_decl_implicit (BUILT_IN_ATOMIC_FERAISEEXCEPT);
12690 = build_call_expr (atomic_feraiseexcept, 1,
12691 fold_convert (integer_type_node, tmp2_var));
12693 if (SPARC_LOW_FE_EXCEPT_VALUES)
12695 tree shifted_tmp2_var
12696 = build2 (RSHIFT_EXPR, unsigned_type_node, tmp2_var,
12697 build_int_cst (unsigned_type_node, 5));
12699 = build2 (MODIFY_EXPR, void_type_node, tmp2_var, shifted_tmp2_var);
12700 update_call = compound_expr (update_shift, update_call);
12704 = compound_expr (compound_expr (update_stfsr, update_ldfsr), update_call);
12707 #include "gt-sparc.h"