]> gcc.gnu.org Git - gcc.git/blob - gcc/config/sparc/sparc.c
*** empty log message ***
[gcc.git] / gcc / config / sparc / sparc.c
1 /* Subroutines for insn-output.c for Sun SPARC.
2 Copyright (C) 1987, 1988, 1989, 1992 Free Software Foundation, Inc.
3 Contributed by Michael Tiemann (tiemann@cygnus.com)
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21 #include <stdio.h>
22 #include "config.h"
23 #include "tree.h"
24 #include "rtl.h"
25 #include "regs.h"
26 #include "hard-reg-set.h"
27 #include "real.h"
28 #include "insn-config.h"
29 #include "conditions.h"
30 #include "insn-flags.h"
31 #include "output.h"
32 #include "insn-attr.h"
33 #include "flags.h"
34 #include "expr.h"
35 #include "recog.h"
36
37 /* Global variables for machine-dependent things. */
38
39 /* Save the operands last given to a compare for use when we
40 generate a scc or bcc insn. */
41
42 rtx sparc_compare_op0, sparc_compare_op1;
43
44 /* We may need an epilogue if we spill too many registers.
45 If this is non-zero, then we branch here for the epilogue. */
46 static rtx leaf_label;
47
48 #ifdef LEAF_REGISTERS
49
50 /* Vector to say how input registers are mapped to output
51 registers. FRAME_POINTER_REGNUM cannot be remapped by
52 this function to eliminate it. You must use -fomit-frame-pointer
53 to get that. */
54 char leaf_reg_remap[] =
55 { 0, 1, 2, 3, 4, 5, 6, 7,
56 -1, -1, -1, -1, -1, -1, 14, -1,
57 -1, -1, -1, -1, -1, -1, -1, -1,
58 8, 9, 10, 11, 12, 13, -1, 15,
59
60 32, 33, 34, 35, 36, 37, 38, 39,
61 40, 41, 42, 43, 44, 45, 46, 47,
62 48, 49, 50, 51, 52, 53, 54, 55,
63 56, 57, 58, 59, 60, 61, 62, 63};
64
65 char leaf_reg_backmap[] =
66 { 0, 1, 2, 3, 4, 5, 6, 7,
67 24, 25, 26, 27, 28, 29, 14, 31,
68 -1, -1, -1, -1, -1, -1, -1, -1,
69 -1, -1, -1, -1, -1, -1, -1, -1,
70
71 32, 33, 34, 35, 36, 37, 38, 39,
72 40, 41, 42, 43, 44, 45, 46, 47,
73 48, 49, 50, 51, 52, 53, 54, 55,
74 56, 57, 58, 59, 60, 61, 62, 63};
75 #endif
76
77 /* Global variables set by FUNCTION_PROLOGUE. */
78 /* Size of frame. Need to know this to emit return insns from
79 leaf procedures. */
80 int apparent_fsize;
81 int actual_fsize;
82
83 /* Name of where we pretend to think the frame pointer points.
84 Normally, this is "%fp", but if we are in a leaf procedure,
85 this is "%sp+something". */
86 char *frame_base_name;
87
88 static rtx find_addr_reg ();
89
90 /* Return non-zero only if OP is a register of mode MODE,
91 or const0_rtx. */
92 int
93 reg_or_0_operand (op, mode)
94 rtx op;
95 enum machine_mode mode;
96 {
97 if (op == const0_rtx || register_operand (op, mode))
98 return 1;
99 if (GET_CODE (op) == CONST_DOUBLE
100 && CONST_DOUBLE_HIGH (op) == 0
101 && CONST_DOUBLE_LOW (op) == 0)
102 return 1;
103 return 0;
104 }
105
106 /* Nonzero if OP can appear as the dest of a RESTORE insn. */
107 int
108 restore_operand (op, mode)
109 rtx op;
110 enum machine_mode mode;
111 {
112 return (GET_CODE (op) == REG && GET_MODE (op) == mode
113 && (REGNO (op) < 8 || (REGNO (op) >= 24 && REGNO (op) < 32)));
114 }
115
116 /* PC-relative call insn on SPARC is independent of `memory_operand'. */
117
118 int
119 call_operand (op, mode)
120 rtx op;
121 enum machine_mode mode;
122 {
123 if (GET_CODE (op) != MEM)
124 abort ();
125 op = XEXP (op, 0);
126 return (REG_P (op) || CONSTANT_P (op));
127 }
128
129 int
130 call_operand_address (op, mode)
131 rtx op;
132 enum machine_mode mode;
133 {
134 return (REG_P (op) || CONSTANT_P (op));
135 }
136
137 /* Returns 1 if OP is either a symbol reference or a sum of a symbol
138 reference and a constant. */
139
140 int
141 symbolic_operand (op, mode)
142 register rtx op;
143 enum machine_mode mode;
144 {
145 switch (GET_CODE (op))
146 {
147 case SYMBOL_REF:
148 case LABEL_REF:
149 return 1;
150
151 case CONST:
152 op = XEXP (op, 0);
153 return ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
154 || GET_CODE (XEXP (op, 0)) == LABEL_REF)
155 && GET_CODE (XEXP (op, 1)) == CONST_INT);
156
157 /* This clause seems to be irrelevant. */
158 case CONST_DOUBLE:
159 return GET_MODE (op) == mode;
160
161 default:
162 return 0;
163 }
164 }
165
166 /* Return truth value of statement that OP is a symbolic memory
167 operand of mode MODE. */
168
169 int
170 symbolic_memory_operand (op, mode)
171 rtx op;
172 enum machine_mode mode;
173 {
174 if (GET_CODE (op) == SUBREG)
175 op = SUBREG_REG (op);
176 if (GET_CODE (op) != MEM)
177 return 0;
178 op = XEXP (op, 0);
179 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST
180 || GET_CODE (op) == HIGH || GET_CODE (op) == LABEL_REF);
181 }
182
183 /* Return 1 if the operand is either a register or a memory operand that is
184 not symbolic. */
185
186 int
187 reg_or_nonsymb_mem_operand (op, mode)
188 register rtx op;
189 enum machine_mode mode;
190 {
191 if (register_operand (op, mode))
192 return 1;
193
194 if (memory_operand (op, mode) && ! symbolic_memory_operand (op, mode))
195 return 1;
196
197 return 0;
198 }
199
200 int
201 sparc_operand (op, mode)
202 rtx op;
203 enum machine_mode mode;
204 {
205 if (register_operand (op, mode))
206 return 1;
207 if (GET_CODE (op) == CONST_INT)
208 return SMALL_INT (op);
209 if (GET_MODE (op) != mode)
210 return 0;
211 if (GET_CODE (op) == SUBREG)
212 op = SUBREG_REG (op);
213 if (GET_CODE (op) != MEM)
214 return 0;
215
216 op = XEXP (op, 0);
217 if (GET_CODE (op) == LO_SUM)
218 return (GET_CODE (XEXP (op, 0)) == REG
219 && symbolic_operand (XEXP (op, 1), Pmode));
220 return memory_address_p (mode, op);
221 }
222
223 int
224 move_operand (op, mode)
225 rtx op;
226 enum machine_mode mode;
227 {
228 if (mode == DImode && arith_double_operand (op, mode))
229 return 1;
230 if (register_operand (op, mode))
231 return 1;
232 if (GET_CODE (op) == CONST_INT)
233 return (SMALL_INT (op) || (INTVAL (op) & 0x3ff) == 0);
234
235 if (GET_MODE (op) != mode)
236 return 0;
237 if (GET_CODE (op) == SUBREG)
238 op = SUBREG_REG (op);
239 if (GET_CODE (op) != MEM)
240 return 0;
241 op = XEXP (op, 0);
242 if (GET_CODE (op) == LO_SUM)
243 return (register_operand (XEXP (op, 0), Pmode)
244 && CONSTANT_P (XEXP (op, 1)));
245 return memory_address_p (mode, op);
246 }
247
248 int
249 move_pic_label (op, mode)
250 rtx op;
251 enum machine_mode mode;
252 {
253 /* Special case for PIC. */
254 if (flag_pic && GET_CODE (op) == LABEL_REF)
255 return 1;
256 return 0;
257 }
258 \f
259 /* The rtx for the global offset table which is a special form
260 that *is* a position independent symbolic constant. */
261 rtx pic_pc_rtx;
262
263 /* Ensure that we are not using patterns that are not OK with PIC. */
264
265 int
266 check_pic (i)
267 int i;
268 {
269 switch (flag_pic)
270 {
271 case 1:
272 if (GET_CODE (recog_operand[i]) == SYMBOL_REF
273 || (GET_CODE (recog_operand[i]) == CONST
274 && ! rtx_equal_p (pic_pc_rtx, recog_operand[i])))
275 abort ();
276 case 2:
277 default:
278 return 1;
279 }
280 }
281
282 /* Return true if X is an address which needs a temporary register when
283 reloaded while generating PIC code. */
284
285 int
286 pic_address_needs_scratch (x)
287 rtx x;
288 {
289 /* An address which is a symbolic plus a non SMALL_INT needs a temp reg. */
290 if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
291 && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF
292 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
293 && ! SMALL_INT (XEXP (XEXP (x, 0), 1)))
294 return 1;
295
296 return 0;
297 }
298
299 int
300 memop (op, mode)
301 rtx op;
302 enum machine_mode mode;
303 {
304 if (GET_CODE (op) == MEM)
305 return (mode == VOIDmode || mode == GET_MODE (op));
306 return 0;
307 }
308
309 /* Return truth value of whether OP is EQ or NE. */
310
311 int
312 eq_or_neq (op, mode)
313 rtx op;
314 enum machine_mode mode;
315 {
316 return (GET_CODE (op) == EQ || GET_CODE (op) == NE);
317 }
318
319 /* Return 1 if this is a comparison operator, but not an EQ, NE, GEU,
320 or LTU for non-floating-point. We handle those specially. */
321
322 int
323 normal_comp_operator (op, mode)
324 rtx op;
325 enum machine_mode mode;
326 {
327 enum rtx_code code = GET_CODE (op);
328
329 if (GET_RTX_CLASS (code) != '<')
330 return 0;
331
332 if (GET_MODE (XEXP (op, 0)) == CCFPmode)
333 return 1;
334
335 return (code != NE && code != EQ && code != GEU && code != LTU);
336 }
337
338 /* Return 1 if this is a comparison operator. This allows the use of
339 MATCH_OPERATOR to recognize all the branch insns. */
340
341 int
342 noov_compare_op (op, mode)
343 register rtx op;
344 enum machine_mode mode;
345 {
346 enum rtx_code code = GET_CODE (op);
347
348 if (GET_RTX_CLASS (code) != '<')
349 return 0;
350
351 if (GET_MODE (XEXP (op, 0)) == CC_NOOVmode)
352 /* These are the only branches which work with CC_NOOVmode. */
353 return (code == EQ || code == NE || code == GE || code == LT);
354 return 1;
355 }
356
357 /* Return 1 if this is a SIGN_EXTEND or ZERO_EXTEND operation. */
358
359 int
360 extend_op (op, mode)
361 rtx op;
362 enum machine_mode mode;
363 {
364 return GET_CODE (op) == SIGN_EXTEND || GET_CODE (op) == ZERO_EXTEND;
365 }
366
367 /* Return nonzero if OP is an operator of mode MODE which can set
368 the condition codes explicitly. We do not include PLUS and MINUS
369 because these require CC_NOOVmode, which we handle explicitly. */
370
371 int
372 cc_arithop (op, mode)
373 rtx op;
374 enum machine_mode mode;
375 {
376 if (GET_CODE (op) == AND
377 || GET_CODE (op) == IOR
378 || GET_CODE (op) == XOR)
379 return 1;
380
381 return 0;
382 }
383
384 /* Return nonzero if OP is an operator of mode MODE which can bitwise
385 complement its second operand and set the condition codes explicitly. */
386
387 int
388 cc_arithopn (op, mode)
389 rtx op;
390 enum machine_mode mode;
391 {
392 /* XOR is not here because combine canonicalizes (xor (not ...) ...)
393 and (xor ... (not ...)) to (not (xor ...)). */
394 return (GET_CODE (op) == AND
395 || GET_CODE (op) == IOR);
396 }
397 \f
398 /* Return truth value of whether OP can be used as an operands in a three
399 address arithmetic insn (such as add %o1,7,%l2) of mode MODE. */
400
401 int
402 arith_operand (op, mode)
403 rtx op;
404 enum machine_mode mode;
405 {
406 return (register_operand (op, mode)
407 || (GET_CODE (op) == CONST_INT && SMALL_INT (op)));
408 }
409
410 /* Return truth value of whether OP is a register or a CONST_DOUBLE. */
411
412 int
413 arith_double_operand (op, mode)
414 rtx op;
415 enum machine_mode mode;
416 {
417 return (register_operand (op, mode)
418 || (GET_CODE (op) == CONST_DOUBLE
419 && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
420 && (unsigned) (CONST_DOUBLE_LOW (op) + 0x1000) < 0x2000
421 && ((CONST_DOUBLE_HIGH (op) == -1
422 && (CONST_DOUBLE_LOW (op) & 0x1000) == 0x1000)
423 || (CONST_DOUBLE_HIGH (op) == 0
424 && (CONST_DOUBLE_LOW (op) & 0x1000) == 0)))
425 || (GET_CODE (op) == CONST_INT
426 && (GET_MODE (op) == mode || GET_MODE (op) == VOIDmode)
427 && (unsigned) (INTVAL (op) + 0x1000) < 0x2000));
428 }
429
430 /* Return truth value of whether OP is a integer which fits the
431 range constraining immediate operands in three-address insns. */
432
433 int
434 small_int (op, mode)
435 rtx op;
436 enum machine_mode mode;
437 {
438 return (GET_CODE (op) == CONST_INT && SMALL_INT (op));
439 }
440
441 /* Return truth value of statement that OP is a call-clobbered register. */
442 int
443 clobbered_register (op, mode)
444 rtx op;
445 enum machine_mode mode;
446 {
447 return (GET_CODE (op) == REG && call_used_regs[REGNO (op)]);
448 }
449 \f
450 /* X and Y are two things to compare using CODE. Emit the compare insn and
451 return the rtx for register 0 in the proper mode. */
452
453 rtx
454 gen_compare_reg (code, x, y)
455 enum rtx_code code;
456 rtx x, y;
457 {
458 enum machine_mode mode = SELECT_CC_MODE (code, x);
459 rtx cc_reg = gen_rtx (REG, mode, 0);
460
461 emit_insn (gen_rtx (SET, VOIDmode, cc_reg,
462 gen_rtx (COMPARE, mode, x, y)));
463
464 return cc_reg;
465 }
466 \f
467 /* Return nonzero if a return peephole merging return with
468 setting of output register is ok. */
469 int
470 leaf_return_peephole_ok ()
471 {
472 return (actual_fsize == 0);
473 }
474
475 /* Return nonzero if TRIAL can go into the function epilogue's
476 delay slot. SLOT is the slot we are trying to fill. */
477
478 int
479 eligible_for_epilogue_delay (trial, slot)
480 rtx trial;
481 int slot;
482 {
483 static char *this_function_name;
484 rtx pat, src;
485
486 if (slot >= 1)
487 return 0;
488 if (GET_CODE (trial) != INSN
489 || GET_CODE (PATTERN (trial)) != SET)
490 return 0;
491 if (get_attr_length (trial) != 1)
492 return 0;
493
494 /* In the case of a true leaf function, anything can go into the delay slot.
495 A delay slot only exists however if the frame size is zero, otherwise
496 we will put an insn to adjust the stack after the return. */
497 if (leaf_function)
498 {
499 if (leaf_return_peephole_ok ())
500 return (get_attr_in_branch_delay (trial) == IN_BRANCH_DELAY_TRUE);
501 return 0;
502 }
503
504 /* Otherwise, only operations which can be done in tandem with
505 a `restore' insn can go into the delay slot. */
506 pat = PATTERN (trial);
507 if (GET_CODE (SET_DEST (pat)) != REG
508 || REGNO (SET_DEST (pat)) == 0
509 || REGNO (SET_DEST (pat)) >= 32
510 || REGNO (SET_DEST (pat)) < 24)
511 return 0;
512
513 src = SET_SRC (pat);
514 if (arith_operand (src, GET_MODE (src)))
515 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (SImode);
516 if (arith_double_operand (src, GET_MODE (src)))
517 return GET_MODE_SIZE (GET_MODE (src)) <= GET_MODE_SIZE (DImode);
518 if (GET_CODE (src) == PLUS)
519 {
520 if (register_operand (XEXP (src, 0), SImode)
521 && arith_operand (XEXP (src, 1), SImode))
522 return 1;
523 if (register_operand (XEXP (src, 1), SImode)
524 && arith_operand (XEXP (src, 0), SImode))
525 return 1;
526 if (register_operand (XEXP (src, 0), DImode)
527 && arith_double_operand (XEXP (src, 1), DImode))
528 return 1;
529 if (register_operand (XEXP (src, 1), DImode)
530 && arith_double_operand (XEXP (src, 0), DImode))
531 return 1;
532 }
533 if (GET_CODE (src) == MINUS
534 && register_operand (XEXP (src, 0), SImode)
535 && small_int (XEXP (src, 1), VOIDmode))
536 return 1;
537 if (GET_CODE (src) == MINUS
538 && register_operand (XEXP (src, 0), DImode)
539 && !register_operand (XEXP (src, 1), DImode)
540 && arith_double_operand (XEXP (src, 1), DImode))
541 return 1;
542 return 0;
543 }
544
545 int
546 short_branch (uid1, uid2)
547 int uid1, uid2;
548 {
549 unsigned int delta = insn_addresses[uid1] - insn_addresses[uid2];
550 if (delta + 1024 < 2048)
551 return 1;
552 /* warning ("long branch, distance %d", delta); */
553 return 0;
554 }
555
556 /* Return non-zero if REG is not used after INSN.
557 We assume REG is a reload reg, and therefore does
558 not live past labels or calls or jumps. */
559 int
560 reg_unused_after (reg, insn)
561 rtx reg;
562 rtx insn;
563 {
564 enum rtx_code code, prev_code = UNKNOWN;
565
566 while (insn = NEXT_INSN (insn))
567 {
568 if (prev_code == CALL_INSN && call_used_regs[REGNO (reg)])
569 return 1;
570
571 code = GET_CODE (insn);
572 if (GET_CODE (insn) == CODE_LABEL)
573 return 1;
574
575 if (GET_RTX_CLASS (code) == 'i')
576 {
577 rtx set = single_set (insn);
578 int in_src = set && reg_overlap_mentioned_p (reg, SET_SRC (set));
579 if (set && in_src)
580 return 0;
581 if (set && reg_overlap_mentioned_p (reg, SET_DEST (set)))
582 return 1;
583 if (set == 0 && reg_overlap_mentioned_p (reg, PATTERN (insn)))
584 return 0;
585 }
586 prev_code = code;
587 }
588 return 1;
589 }
590 \f
591 /* Legitimize PIC addresses. If the address is already position-independent,
592 we return ORIG. Newly generated position-independent addresses go into a
593 reg. This is REG if non zero, otherwise we allocate register(s) as
594 necessary. If this is called during reload, and we need a second temp
595 register, then we use SCRATCH, which is provided via the
596 SECONDARY_INPUT_RELOAD_CLASS mechanism. */
597
598 rtx
599 legitimize_pic_address (orig, mode, reg, scratch)
600 rtx orig;
601 enum machine_mode mode;
602 rtx reg, scratch;
603 {
604 if (GET_CODE (orig) == SYMBOL_REF)
605 {
606 rtx pic_ref, address;
607 rtx insn;
608
609 if (reg == 0)
610 {
611 if (reload_in_progress || reload_completed)
612 abort ();
613 else
614 reg = gen_reg_rtx (Pmode);
615 }
616
617 if (flag_pic == 2)
618 {
619 /* If not during reload, allocate another temp reg here for loading
620 in the address, so that these instructions can be optimized
621 properly. */
622 rtx temp_reg = ((reload_in_progress || reload_completed)
623 ? reg : gen_reg_rtx (Pmode));
624
625 /* Must put the SYMBOL_REF inside an UNSPEC here so that cse
626 won't get confused into thinking that these two instructions
627 are loading in the true address of the symbol. If in the
628 future a PIC rtx exists, that should be used instead. */
629 emit_insn (gen_rtx (SET, VOIDmode, temp_reg,
630 gen_rtx (HIGH, Pmode,
631 gen_rtx (UNSPEC, Pmode,
632 gen_rtvec (1, orig),
633 0))));
634 emit_insn (gen_rtx (SET, VOIDmode, temp_reg,
635 gen_rtx (LO_SUM, Pmode, temp_reg,
636 gen_rtx (UNSPEC, Pmode,
637 gen_rtvec (1, orig),
638 0))));
639 address = temp_reg;
640 }
641 else
642 address = orig;
643
644 pic_ref = gen_rtx (MEM, Pmode,
645 gen_rtx (PLUS, Pmode,
646 pic_offset_table_rtx, address));
647 current_function_uses_pic_offset_table = 1;
648 RTX_UNCHANGING_P (pic_ref) = 1;
649 insn = emit_move_insn (reg, pic_ref);
650 /* Put a REG_EQUAL note on this insn, so that it can be optimized
651 by loop. */
652 REG_NOTES (insn) = gen_rtx (EXPR_LIST, REG_EQUAL, orig,
653 REG_NOTES (insn));
654 return reg;
655 }
656 else if (GET_CODE (orig) == CONST)
657 {
658 rtx base, offset;
659
660 if (GET_CODE (XEXP (orig, 0)) == PLUS
661 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
662 return orig;
663
664 if (reg == 0)
665 {
666 if (reload_in_progress || reload_completed)
667 abort ();
668 else
669 reg = gen_reg_rtx (Pmode);
670 }
671
672 if (GET_CODE (XEXP (orig, 0)) == PLUS)
673 {
674 base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode,
675 reg, 0);
676 offset = legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode,
677 base == reg ? 0 : reg, 0);
678 }
679 else
680 abort ();
681
682 if (GET_CODE (offset) == CONST_INT)
683 {
684 if (SMALL_INT (offset))
685 return plus_constant_for_output (base, INTVAL (offset));
686 else if (! reload_in_progress && ! reload_completed)
687 offset = force_reg (Pmode, offset);
688 /* We can't create any new registers during reload, so use the
689 SCRATCH reg provided by the reload_insi pattern. */
690 else if (scratch)
691 {
692 emit_move_insn (scratch, offset);
693 offset = scratch;
694 }
695 else
696 /* If we reach here, then the SECONDARY_INPUT_RELOAD_CLASS
697 macro needs to be adjusted so that a scratch reg is provided
698 for this address. */
699 abort ();
700 }
701 return gen_rtx (PLUS, Pmode, base, offset);
702 }
703 else if (GET_CODE (orig) == LABEL_REF)
704 current_function_uses_pic_offset_table = 1;
705
706 return orig;
707 }
708
709 /* Set up PIC-specific rtl. This should not cause any insns
710 to be emitted. */
711
712 void
713 initialize_pic ()
714 {
715 }
716
717 /* Emit special PIC prologues and epilogues. */
718
719 void
720 finalize_pic ()
721 {
722 /* The table we use to reference PIC data. */
723 rtx global_offset_table;
724 /* Labels to get the PC in the prologue of this function. */
725 rtx l1, l2;
726 rtx seq;
727 int orig_flag_pic = flag_pic;
728
729 if (current_function_uses_pic_offset_table == 0)
730 return;
731
732 if (! flag_pic)
733 abort ();
734
735 flag_pic = 0;
736 l1 = gen_label_rtx ();
737 l2 = gen_label_rtx ();
738
739 start_sequence ();
740
741 emit_label (l1);
742 /* Note that we pun calls and jumps here! */
743 emit_jump_insn (gen_rtx (PARALLEL, VOIDmode,
744 gen_rtvec (2,
745 gen_rtx (SET, VOIDmode, pc_rtx, gen_rtx (LABEL_REF, VOIDmode, l2)),
746 gen_rtx (SET, VOIDmode, gen_rtx (REG, SImode, 15), gen_rtx (LABEL_REF, VOIDmode, l2)))));
747 emit_label (l2);
748
749 /* Initialize every time through, since we can't easily
750 know this to be permanent. */
751 global_offset_table = gen_rtx (SYMBOL_REF, Pmode, "*__GLOBAL_OFFSET_TABLE_");
752 pic_pc_rtx = gen_rtx (CONST, Pmode,
753 gen_rtx (MINUS, Pmode,
754 global_offset_table,
755 gen_rtx (CONST, Pmode,
756 gen_rtx (MINUS, Pmode,
757 gen_rtx (LABEL_REF, VOIDmode, l1),
758 pc_rtx))));
759
760 emit_insn (gen_rtx (SET, VOIDmode, pic_offset_table_rtx,
761 gen_rtx (HIGH, Pmode, pic_pc_rtx)));
762 emit_insn (gen_rtx (SET, VOIDmode,
763 pic_offset_table_rtx,
764 gen_rtx (LO_SUM, Pmode,
765 pic_offset_table_rtx, pic_pc_rtx)));
766 emit_insn (gen_rtx (SET, VOIDmode,
767 pic_offset_table_rtx,
768 gen_rtx (PLUS, Pmode,
769 pic_offset_table_rtx, gen_rtx (REG, Pmode, 15))));
770 /* emit_insn (gen_rtx (ASM_INPUT, VOIDmode, "!#PROLOGUE# 1")); */
771 LABEL_PRESERVE_P (l1) = 1;
772 LABEL_PRESERVE_P (l2) = 1;
773 flag_pic = orig_flag_pic;
774
775 seq = gen_sequence ();
776 end_sequence ();
777 emit_insn_after (seq, get_insns ());
778
779 /* Need to emit this whether or not we obey regdecls,
780 since setjmp/longjmp can cause life info to screw up. */
781 emit_insn (gen_rtx (USE, VOIDmode, pic_offset_table_rtx));
782 }
783 \f
784 /* For the SPARC, REG and REG+CONST is cost 0, REG+REG is cost 1,
785 and addresses involving symbolic constants are cost 2.
786
787 We make REG+REG slightly more expensive because it might keep
788 a register live for longer than we might like.
789
790 PIC addresses are very expensive.
791
792 It is no coincidence that this has the same structure
793 as GO_IF_LEGITIMATE_ADDRESS. */
794 int
795 sparc_address_cost (X)
796 rtx X;
797 {
798 #if 0
799 /* Handled before calling here. */
800 if (GET_CODE (X) == REG)
801 { return 1; }
802 #endif
803 if (GET_CODE (X) == PLUS)
804 {
805 if (GET_CODE (XEXP (X, 0)) == REG
806 && GET_CODE (XEXP (X, 1)) == REG)
807 return 2;
808 return 1;
809 }
810 else if (GET_CODE (X) == LO_SUM)
811 return 1;
812 else if (GET_CODE (X) == HIGH)
813 return 2;
814 return 4;
815 }
816 \f
817 /* Emit insns to move operands[1] into operands[0].
818
819 Return 1 if we have written out everything that needs to be done to
820 do the move. Otherwise, return 0 and the caller will emit the move
821 normally.
822
823 SCRATCH_REG if non zero can be used as a scratch register for the move
824 operation. It is provided by a SECONDARY_RELOAD_* macro if needed. */
825
826 int
827 emit_move_sequence (operands, mode, scratch_reg)
828 rtx *operands;
829 enum machine_mode mode;
830 rtx scratch_reg;
831 {
832 register rtx operand0 = operands[0];
833 register rtx operand1 = operands[1];
834
835 /* Handle most common case first: storing into a register. */
836 if (register_operand (operand0, mode))
837 {
838 if (register_operand (operand1, mode)
839 || (GET_CODE (operand1) == CONST_INT && SMALL_INT (operand1))
840 || (GET_CODE (operand1) == CONST_DOUBLE
841 && arith_double_operand (operand1, DImode))
842 || (GET_CODE (operand1) == HIGH && GET_MODE (operand1) != DImode)
843 /* Only `general_operands' can come here, so MEM is ok. */
844 || GET_CODE (operand1) == MEM)
845 {
846 /* Run this case quickly. */
847 emit_insn (gen_rtx (SET, VOIDmode, operand0, operand1));
848 return 1;
849 }
850 }
851 else if (GET_CODE (operand0) == MEM)
852 {
853 if (register_operand (operand1, mode) || operand1 == const0_rtx)
854 {
855 /* Run this case quickly. */
856 emit_insn (gen_rtx (SET, VOIDmode, operand0, operand1));
857 return 1;
858 }
859 if (! reload_in_progress)
860 {
861 operands[0] = validize_mem (operand0);
862 operands[1] = operand1 = force_reg (mode, operand1);
863 }
864 }
865
866 /* Simplify the source if we need to. Must handle DImode HIGH operators
867 here because such a move needs a clobber added. */
868 if ((GET_CODE (operand1) != HIGH && immediate_operand (operand1, mode))
869 || (GET_CODE (operand1) == HIGH && GET_MODE (operand1) == DImode))
870 {
871 if (flag_pic && symbolic_operand (operand1, mode))
872 {
873 rtx temp_reg = reload_in_progress ? operand0 : 0;
874
875 operands[1] = legitimize_pic_address (operand1, mode, temp_reg,
876 scratch_reg);
877 }
878 else if (GET_CODE (operand1) == CONST_INT
879 ? (! SMALL_INT (operand1)
880 && (INTVAL (operand1) & 0x3ff) != 0)
881 : (GET_CODE (operand1) == CONST_DOUBLE
882 ? ! arith_double_operand (operand1, DImode)
883 : 1))
884 {
885 /* For DImode values, temp must be operand0 because of the way
886 HI and LO_SUM work. The LO_SUM operator only copies half of
887 the LSW from the dest of the HI operator. If the LO_SUM dest is
888 not the same as the HI dest, then the MSW of the LO_SUM dest will
889 never be set.
890
891 ??? The real problem here is that the ...(HI:DImode pattern emits
892 multiple instructions, and the ...(LO_SUM:DImode pattern emits
893 one instruction. This fails, because the compiler assumes that
894 LO_SUM copies all bits of the first operand to its dest. Better
895 would be to have the HI pattern emit one instruction and the
896 LO_SUM pattern multiple instructions. Even better would be
897 to use four rtl insns. */
898 rtx temp = ((reload_in_progress || mode == DImode)
899 ? operand0 : gen_reg_rtx (mode));
900
901 emit_insn (gen_rtx (SET, VOIDmode, temp,
902 gen_rtx (HIGH, mode, operand1)));
903 operands[1] = gen_rtx (LO_SUM, mode, temp, operand1);
904 }
905 }
906
907 if (GET_CODE (operand1) == LABEL_REF && flag_pic)
908 {
909 /* The procedure for doing this involves using a call instruction to
910 get the pc into o7. We need to indicate this explicitly because
911 the tablejump pattern assumes that it can use this value also. */
912 emit_insn (gen_rtx (PARALLEL, VOIDmode,
913 gen_rtvec (2,
914 gen_rtx (SET, VOIDmode, operand0,
915 operand1),
916 gen_rtx (SET, VOIDmode,
917 gen_rtx (REG, mode, 15),
918 pc_rtx))));
919 return 1;
920 }
921
922 /* Now have insn-emit do whatever it normally does. */
923 return 0;
924 }
925 \f
926 /* Return the best assembler insn template
927 for moving operands[1] into operands[0] as a fullword. */
928
929 char *
930 singlemove_string (operands)
931 rtx *operands;
932 {
933 if (GET_CODE (operands[0]) == MEM)
934 {
935 if (GET_CODE (operands[1]) != MEM)
936 return "st %r1,%0";
937 else
938 abort ();
939 }
940 if (GET_CODE (operands[1]) == MEM)
941 return "ld %1,%0";
942 if (GET_CODE (operands[1]) == CONST_INT
943 && ! CONST_OK_FOR_LETTER_P (INTVAL (operands[1]), 'I'))
944 {
945 int i = INTVAL (operands[1]);
946
947 /* If all low order 10 bits are clear, then we only need a single
948 sethi insn to load the constant. */
949 if ((i & 0x000003FF) != 0)
950 return "sethi %%hi(%a1),%0\n\tor %0,%%lo(%a1),%0";
951 else
952 return "sethi %%hi(%a1),%0";
953 }
954 /* ??? Wrong if target is DImode? */
955 return "mov %1,%0";
956 }
957 \f
958 /* Output assembler code to perform a doubleword move insn
959 with operands OPERANDS. */
960
961 char *
962 output_move_double (operands)
963 rtx *operands;
964 {
965 enum { REGOP, OFFSOP, MEMOP, PUSHOP, POPOP, CNSTOP, RNDOP } optype0, optype1;
966 rtx latehalf[2];
967 rtx addreg0 = 0, addreg1 = 0;
968
969 /* First classify both operands. */
970
971 if (REG_P (operands[0]))
972 optype0 = REGOP;
973 else if (offsettable_memref_p (operands[0]))
974 optype0 = OFFSOP;
975 else if (GET_CODE (operands[0]) == MEM)
976 optype0 = MEMOP;
977 else
978 optype0 = RNDOP;
979
980 if (REG_P (operands[1]))
981 optype1 = REGOP;
982 else if (CONSTANT_P (operands[1]))
983 optype1 = CNSTOP;
984 else if (offsettable_memref_p (operands[1]))
985 optype1 = OFFSOP;
986 else if (GET_CODE (operands[1]) == MEM)
987 optype1 = MEMOP;
988 else
989 optype1 = RNDOP;
990
991 /* Check for the cases that the operand constraints are not
992 supposed to allow to happen. Abort if we get one,
993 because generating code for these cases is painful. */
994
995 if (optype0 == RNDOP || optype1 == RNDOP)
996 abort ();
997
998 /* If an operand is an unoffsettable memory ref, find a register
999 we can increment temporarily to make it refer to the second word. */
1000
1001 if (optype0 == MEMOP)
1002 addreg0 = find_addr_reg (XEXP (operands[0], 0));
1003
1004 if (optype1 == MEMOP)
1005 addreg1 = find_addr_reg (XEXP (operands[1], 0));
1006
1007 /* Ok, we can do one word at a time.
1008 Normally we do the low-numbered word first,
1009 but if either operand is autodecrementing then we
1010 do the high-numbered word first.
1011
1012 In either case, set up in LATEHALF the operands to use for the
1013 high-numbered (least significant) word and in some cases alter the
1014 operands in OPERANDS to be suitable for the low-numbered word. */
1015
1016 if (optype0 == REGOP)
1017 latehalf[0] = gen_rtx (REG, SImode, REGNO (operands[0]) + 1);
1018 else if (optype0 == OFFSOP)
1019 latehalf[0] = adj_offsettable_operand (operands[0], 4);
1020 else
1021 latehalf[0] = operands[0];
1022
1023 if (optype1 == REGOP)
1024 latehalf[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
1025 else if (optype1 == OFFSOP)
1026 latehalf[1] = adj_offsettable_operand (operands[1], 4);
1027 else if (optype1 == CNSTOP)
1028 split_double (operands[1], &operands[1], &latehalf[1]);
1029 else
1030 latehalf[1] = operands[1];
1031
1032 /* If the first move would clobber the source of the second one,
1033 do them in the other order.
1034
1035 RMS says "This happens only for registers;
1036 such overlap can't happen in memory unless the user explicitly
1037 sets it up, and that is an undefined circumstance."
1038
1039 but it happens on the sparc when loading parameter registers,
1040 so I am going to define that circumstance, and make it work
1041 as expected. */
1042
1043 /* Easy case: try moving both words at once. */
1044 /* First check for moving between an even/odd register pair
1045 and a memory location. */
1046 if ((optype0 == REGOP && optype1 != REGOP && optype1 != CNSTOP
1047 && (REGNO (operands[0]) & 1) == 0)
1048 || (optype0 != REGOP && optype0 != CNSTOP && optype1 == REGOP
1049 && (REGNO (operands[1]) & 1) == 0))
1050 {
1051 rtx op1, op2;
1052 rtx base = 0, offset = const0_rtx;
1053
1054 /* OP1 gets the register pair, and OP2 gets the memory address. */
1055 if (optype0 == REGOP)
1056 op1 = operands[0], op2 = operands[1];
1057 else
1058 op1 = operands[1], op2 = operands[0];
1059
1060 /* Now see if we can trust the address to be 8-byte aligned. */
1061 /* Trust double-precision floats in global variables. */
1062
1063 if (GET_CODE (XEXP (op2, 0)) == LO_SUM && GET_MODE (op2) == DFmode)
1064 {
1065 if (final_sequence)
1066 abort ();
1067 return (op1 == operands[0] ? "ldd %1,%0" : "std %1,%0");
1068 }
1069
1070 if (GET_CODE (XEXP (op2, 0)) == PLUS)
1071 {
1072 rtx temp = XEXP (op2, 0);
1073 if (GET_CODE (XEXP (temp, 0)) == REG)
1074 base = XEXP (temp, 0), offset = XEXP (temp, 1);
1075 else if (GET_CODE (XEXP (temp, 1)) == REG)
1076 base = XEXP (temp, 1), offset = XEXP (temp, 0);
1077 }
1078
1079 /* Trust round enough offsets from the stack or frame pointer. */
1080 if (base
1081 && (REGNO (base) == FRAME_POINTER_REGNUM
1082 || REGNO (base) == STACK_POINTER_REGNUM))
1083 {
1084 if (GET_CODE (offset) == CONST_INT
1085 && (INTVAL (offset) & 0x7) == 0)
1086 {
1087 if (op1 == operands[0])
1088 return "ldd %1,%0";
1089 else
1090 return "std %1,%0";
1091 }
1092 }
1093 /* We know structs not on the stack are properly aligned. Since a
1094 double asks for 8-byte alignment, we know it must have got that
1095 if it is in a struct. But a DImode need not be 8-byte aligned,
1096 because it could be a struct containing two ints or pointers. */
1097 else if (GET_CODE (operands[1]) == MEM
1098 && GET_MODE (operands[1]) == DFmode
1099 && (CONSTANT_P (XEXP (operands[1], 0))
1100 /* Let user ask for it anyway. */
1101 || TARGET_HOPE_ALIGN))
1102 return "ldd %1,%0";
1103 else if (GET_CODE (operands[0]) == MEM
1104 && GET_MODE (operands[0]) == DFmode
1105 && (CONSTANT_P (XEXP (operands[0], 0))
1106 || TARGET_HOPE_ALIGN))
1107 return "std %1,%0";
1108 }
1109
1110 if (optype0 == REGOP && optype1 == REGOP
1111 && REGNO (operands[0]) == REGNO (latehalf[1]))
1112 {
1113 /* Make any unoffsettable addresses point at high-numbered word. */
1114 if (addreg0)
1115 output_asm_insn ("add %0,0x4,%0", &addreg0);
1116 if (addreg1)
1117 output_asm_insn ("add %0,0x4,%0", &addreg1);
1118
1119 /* Do that word. */
1120 output_asm_insn (singlemove_string (latehalf), latehalf);
1121
1122 /* Undo the adds we just did. */
1123 if (addreg0)
1124 output_asm_insn ("add %0,-0x4,%0", &addreg0);
1125 if (addreg1)
1126 output_asm_insn ("add %0,-0x4,%0", &addreg1);
1127
1128 /* Do low-numbered word. */
1129 return singlemove_string (operands);
1130 }
1131 else if (optype0 == REGOP && optype1 != REGOP
1132 && reg_overlap_mentioned_p (operands[0], operands[1]))
1133 {
1134 /* Do the late half first. */
1135 output_asm_insn (singlemove_string (latehalf), latehalf);
1136 /* Then clobber. */
1137 return singlemove_string (operands);
1138 }
1139
1140 /* Normal case: do the two words, low-numbered first. */
1141
1142 output_asm_insn (singlemove_string (operands), operands);
1143
1144 /* Make any unoffsettable addresses point at high-numbered word. */
1145 if (addreg0)
1146 output_asm_insn ("add %0,0x4,%0", &addreg0);
1147 if (addreg1)
1148 output_asm_insn ("add %0,0x4,%0", &addreg1);
1149
1150 /* Do that word. */
1151 output_asm_insn (singlemove_string (latehalf), latehalf);
1152
1153 /* Undo the adds we just did. */
1154 if (addreg0)
1155 output_asm_insn ("add %0,-0x4,%0", &addreg0);
1156 if (addreg1)
1157 output_asm_insn ("add %0,-0x4,%0", &addreg1);
1158
1159 return "";
1160 }
1161 \f
1162 char *
1163 output_fp_move_double (operands)
1164 rtx *operands;
1165 {
1166 rtx addr;
1167
1168 if (FP_REG_P (operands[0]))
1169 {
1170 if (FP_REG_P (operands[1]))
1171 return "fmovs %1,%0\n\tfmovs %R1,%R0";
1172 if (GET_CODE (operands[1]) == REG)
1173 {
1174 if ((REGNO (operands[1]) & 1) == 0)
1175 return "std %1,[%@-8]\n\tldd [%@-8],%0";
1176 else
1177 return "st %R1,[%@-4]\n\tst %1,[%@-8]\n\tldd [%@-8],%0";
1178 }
1179 addr = XEXP (operands[1], 0);
1180
1181 /* Use ldd if known to be aligned. */
1182 if (TARGET_HOPE_ALIGN
1183 || (GET_CODE (addr) == PLUS
1184 && (((XEXP (addr, 0) == frame_pointer_rtx
1185 || XEXP (addr, 0) == stack_pointer_rtx)
1186 && GET_CODE (XEXP (addr, 1)) == CONST_INT
1187 && (INTVAL (XEXP (addr, 1)) & 0x7) == 0)
1188 /* Arrays are known to be aligned,
1189 and reg+reg addresses are used (on this machine)
1190 only for array accesses. */
1191 || (REG_P (XEXP (addr, 0)) && REG_P (XEXP (addr, 1)))))
1192 || (GET_MODE (operands[0]) == DFmode
1193 && (GET_CODE (addr) == LO_SUM || CONSTANT_P (addr))))
1194 return "ldd %1,%0";
1195
1196 /* Otherwise use two ld insns. */
1197 operands[2]
1198 = gen_rtx (MEM, GET_MODE (operands[1]),
1199 plus_constant_for_output (addr, 4));
1200 return "ld %1,%0\n\tld %2,%R0";
1201 }
1202 else if (FP_REG_P (operands[1]))
1203 {
1204 if (GET_CODE (operands[0]) == REG)
1205 {
1206 if ((REGNO (operands[0]) & 1) == 0)
1207 return "std %1,[%@-8]\n\tldd [%@-8],%0";
1208 else
1209 return "std %1,[%@-8]\n\tld [%@-4],%R0\n\tld [%@-8],%0";
1210 }
1211 addr = XEXP (operands[0], 0);
1212
1213 /* Use std if we can be sure it is well-aligned. */
1214 if (TARGET_HOPE_ALIGN
1215 || (GET_CODE (addr) == PLUS
1216 && (((XEXP (addr, 0) == frame_pointer_rtx
1217 || XEXP (addr, 0) == stack_pointer_rtx)
1218 && GET_CODE (XEXP (addr, 1)) == CONST_INT
1219 && (INTVAL (XEXP (addr, 1)) & 0x7) == 0)
1220 /* Arrays are known to be aligned,
1221 and reg+reg addresses are used (on this machine)
1222 only for array accesses. */
1223 || (REG_P (XEXP (addr, 0)) && REG_P (XEXP (addr, 1)))))
1224 || (GET_MODE (operands[1]) == DFmode
1225 && (GET_CODE (addr) == LO_SUM || CONSTANT_P (addr))))
1226 return "std %1,%0";
1227
1228 /* Otherwise use two st insns. */
1229 operands[2]
1230 = gen_rtx (MEM, GET_MODE (operands[0]),
1231 plus_constant_for_output (addr, 4));
1232 return "st %r1,%0\n\tst %R1,%2";
1233 }
1234 else abort ();
1235 }
1236 \f
1237 /* Return a REG that occurs in ADDR with coefficient 1.
1238 ADDR can be effectively incremented by incrementing REG. */
1239
1240 static rtx
1241 find_addr_reg (addr)
1242 rtx addr;
1243 {
1244 while (GET_CODE (addr) == PLUS)
1245 {
1246 /* We absolutely can not fudge the frame pointer here, because the
1247 frame pointer must always be 8 byte aligned. It also confuses
1248 debuggers. */
1249 if (GET_CODE (XEXP (addr, 0)) == REG
1250 && REGNO (XEXP (addr, 0)) != FRAME_POINTER_REGNUM)
1251 addr = XEXP (addr, 0);
1252 else if (GET_CODE (XEXP (addr, 1)) == REG
1253 && REGNO (XEXP (addr, 1)) != FRAME_POINTER_REGNUM)
1254 addr = XEXP (addr, 1);
1255 else if (CONSTANT_P (XEXP (addr, 0)))
1256 addr = XEXP (addr, 1);
1257 else if (CONSTANT_P (XEXP (addr, 1)))
1258 addr = XEXP (addr, 0);
1259 else
1260 abort ();
1261 }
1262 if (GET_CODE (addr) == REG)
1263 return addr;
1264 abort ();
1265 }
1266
1267 void
1268 output_sized_memop (opname, mode, signedp)
1269 char *opname;
1270 enum machine_mode mode;
1271 int signedp;
1272 {
1273 static char *ld_size_suffix_u[] = { "ub", "uh", "", "?", "d" };
1274 static char *ld_size_suffix_s[] = { "sb", "sh", "", "?", "d" };
1275 static char *st_size_suffix[] = { "b", "h", "", "?", "d" };
1276 char **opnametab, *modename;
1277
1278 if (opname[0] == 'l')
1279 if (signedp)
1280 opnametab = ld_size_suffix_s;
1281 else
1282 opnametab = ld_size_suffix_u;
1283 else
1284 opnametab = st_size_suffix;
1285 modename = opnametab[GET_MODE_SIZE (mode) >> 1];
1286
1287 fprintf (asm_out_file, "\t%s%s", opname, modename);
1288 }
1289 \f
1290 void
1291 output_move_with_extension (operands)
1292 rtx *operands;
1293 {
1294 if (GET_MODE (operands[2]) == HImode)
1295 output_asm_insn ("sll %2,0x10,%0", operands);
1296 else if (GET_MODE (operands[2]) == QImode)
1297 output_asm_insn ("sll %2,0x18,%0", operands);
1298 else
1299 abort ();
1300 }
1301 \f
1302 /* Load the address specified by OPERANDS[3] into the register
1303 specified by OPERANDS[0].
1304
1305 OPERANDS[3] may be the result of a sum, hence it could either be:
1306
1307 (1) CONST
1308 (2) REG
1309 (2) REG + CONST_INT
1310 (3) REG + REG + CONST_INT
1311 (4) REG + REG (special case of 3).
1312
1313 Note that (3) is not a legitimate address.
1314 All cases are handled here. */
1315
1316 void
1317 output_load_address (operands)
1318 rtx *operands;
1319 {
1320 rtx base, offset;
1321
1322 if (CONSTANT_P (operands[3]))
1323 {
1324 output_asm_insn ("set %3,%0", operands);
1325 return;
1326 }
1327
1328 if (REG_P (operands[3]))
1329 {
1330 if (REGNO (operands[0]) != REGNO (operands[3]))
1331 output_asm_insn ("mov %3,%0", operands);
1332 return;
1333 }
1334
1335 if (GET_CODE (operands[3]) != PLUS)
1336 abort ();
1337
1338 base = XEXP (operands[3], 0);
1339 offset = XEXP (operands[3], 1);
1340
1341 if (GET_CODE (base) == CONST_INT)
1342 {
1343 rtx tmp = base;
1344 base = offset;
1345 offset = tmp;
1346 }
1347
1348 if (GET_CODE (offset) != CONST_INT)
1349 {
1350 /* Operand is (PLUS (REG) (REG)). */
1351 base = operands[3];
1352 offset = const0_rtx;
1353 }
1354
1355 if (REG_P (base))
1356 {
1357 operands[6] = base;
1358 operands[7] = offset;
1359 if (SMALL_INT (offset))
1360 output_asm_insn ("add %6,%7,%0", operands);
1361 else
1362 output_asm_insn ("set %7,%0\n\tadd %0,%6,%0", operands);
1363 }
1364 else if (GET_CODE (base) == PLUS)
1365 {
1366 operands[6] = XEXP (base, 0);
1367 operands[7] = XEXP (base, 1);
1368 operands[8] = offset;
1369
1370 if (SMALL_INT (offset))
1371 output_asm_insn ("add %6,%7,%0\n\tadd %0,%8,%0", operands);
1372 else
1373 output_asm_insn ("set %8,%0\n\tadd %0,%6,%0\n\tadd %0,%7,%0", operands);
1374 }
1375 else
1376 abort ();
1377 }
1378
1379 /* Output code to place a size count SIZE in register REG.
1380 ALIGN is the size of the unit of transfer.
1381
1382 Because block moves are pipelined, we don't include the
1383 first element in the transfer of SIZE to REG. */
1384
1385 static void
1386 output_size_for_block_move (size, reg, align)
1387 rtx size, reg;
1388 rtx align;
1389 {
1390 rtx xoperands[3];
1391
1392 xoperands[0] = reg;
1393 xoperands[1] = size;
1394 xoperands[2] = align;
1395 if (GET_CODE (size) == REG)
1396 output_asm_insn ("sub %1,%2,%0", xoperands);
1397 else
1398 {
1399 xoperands[1]
1400 = gen_rtx (CONST_INT, VOIDmode, INTVAL (size) - INTVAL (align));
1401 output_asm_insn ("set %1,%0", xoperands);
1402 }
1403 }
1404
1405 /* Emit code to perform a block move.
1406
1407 OPERANDS[0] is the destination.
1408 OPERANDS[1] is the source.
1409 OPERANDS[2] is the size.
1410 OPERANDS[3] is the alignment safe to use.
1411 OPERANDS[4] is a register we can safely clobber as a temp. */
1412
1413 char *
1414 output_block_move (operands)
1415 rtx *operands;
1416 {
1417 /* A vector for our computed operands. Note that load_output_address
1418 makes use of (and can clobber) up to the 8th element of this vector. */
1419 rtx xoperands[10];
1420 rtx zoperands[10];
1421 static int movstrsi_label = 0;
1422 int i;
1423 rtx temp1 = operands[4];
1424 rtx sizertx = operands[2];
1425 rtx alignrtx = operands[3];
1426 int align = INTVAL (alignrtx);
1427 char label3[30], label5[30];
1428
1429 xoperands[0] = operands[0];
1430 xoperands[1] = operands[1];
1431 xoperands[2] = temp1;
1432
1433 /* We can't move more than this many bytes at a time because we have only
1434 one register, %g1, to move them through. */
1435 if (align > UNITS_PER_WORD)
1436 {
1437 align = UNITS_PER_WORD;
1438 alignrtx = gen_rtx (CONST_INT, VOIDmode, UNITS_PER_WORD);
1439 }
1440
1441 /* We consider 8 ld/st pairs, for a total of 16 inline insns to be
1442 reasonable here. (Actually will emit a maximum of 18 inline insns for
1443 the case of size == 31 and align == 4). */
1444
1445 if (GET_CODE (sizertx) == CONST_INT && (INTVAL (sizertx) / align) <= 8
1446 && memory_address_p (QImode, plus_constant_for_output (xoperands[0],
1447 INTVAL (sizertx)))
1448 && memory_address_p (QImode, plus_constant_for_output (xoperands[1],
1449 INTVAL (sizertx))))
1450 {
1451 int size = INTVAL (sizertx);
1452 int offset = 0;
1453
1454 /* We will store different integers into this particular RTX. */
1455 xoperands[2] = rtx_alloc (CONST_INT);
1456 PUT_MODE (xoperands[2], VOIDmode);
1457
1458 /* This case is currently not handled. Abort instead of generating
1459 bad code. */
1460 if (align > 4)
1461 abort ();
1462
1463 if (align >= 4)
1464 {
1465 for (i = (size >> 2) - 1; i >= 0; i--)
1466 {
1467 INTVAL (xoperands[2]) = (i << 2) + offset;
1468 output_asm_insn ("ld [%a1+%2],%%g1\n\tst %%g1,[%a0+%2]",
1469 xoperands);
1470 }
1471 offset += (size & ~0x3);
1472 size = size & 0x3;
1473 if (size == 0)
1474 return "";
1475 }
1476
1477 if (align >= 2)
1478 {
1479 for (i = (size >> 1) - 1; i >= 0; i--)
1480 {
1481 INTVAL (xoperands[2]) = (i << 1) + offset;
1482 output_asm_insn ("lduh [%a1+%2],%%g1\n\tsth %%g1,[%a0+%2]",
1483 xoperands);
1484 }
1485 offset += (size & ~0x1);
1486 size = size & 0x1;
1487 if (size == 0)
1488 return "";
1489 }
1490
1491 if (align >= 1)
1492 {
1493 for (i = size - 1; i >= 0; i--)
1494 {
1495 INTVAL (xoperands[2]) = i + offset;
1496 output_asm_insn ("ldub [%a1+%2],%%g1\n\tstb %%g1,[%a0+%2]",
1497 xoperands);
1498 }
1499 return "";
1500 }
1501
1502 /* We should never reach here. */
1503 abort ();
1504 }
1505
1506 /* If the size isn't known to be a multiple of the alignment,
1507 we have to do it in smaller pieces. If we could determine that
1508 the size was a multiple of 2 (or whatever), we could be smarter
1509 about this. */
1510 if (GET_CODE (sizertx) != CONST_INT)
1511 align = 1;
1512 else
1513 {
1514 int size = INTVAL (sizertx);
1515 while (size % align)
1516 align >>= 1;
1517 }
1518
1519 if (align != INTVAL (alignrtx))
1520 alignrtx = gen_rtx (CONST_INT, VOIDmode, align);
1521
1522 xoperands[3] = gen_rtx (CONST_INT, VOIDmode, movstrsi_label++);
1523 xoperands[4] = gen_rtx (CONST_INT, VOIDmode, align);
1524 xoperands[5] = gen_rtx (CONST_INT, VOIDmode, movstrsi_label++);
1525
1526 ASM_GENERATE_INTERNAL_LABEL (label3, "Lm", INTVAL (xoperands[3]));
1527 ASM_GENERATE_INTERNAL_LABEL (label5, "Lm", INTVAL (xoperands[5]));
1528
1529 /* This is the size of the transfer. Emit code to decrement the size
1530 value by ALIGN, and store the result in the temp1 register. */
1531 output_size_for_block_move (sizertx, temp1, alignrtx);
1532
1533 /* Must handle the case when the size is zero or negative, so the first thing
1534 we do is compare the size against zero, and only copy bytes if it is
1535 zero or greater. Note that we have already subtracted off the alignment
1536 once, so we must copy 1 alignment worth of bytes if the size is zero
1537 here.
1538
1539 The SUN assembler complains about labels in branch delay slots, so we
1540 do this before outputting the load address, so that there will always
1541 be a harmless insn between the branch here and the next label emitted
1542 below. */
1543
1544 {
1545 char pattern[100];
1546
1547 sprintf (pattern, "cmp %%2,0\n\tbl %s", &label5[1]);
1548 output_asm_insn (pattern, xoperands);
1549 }
1550
1551 zoperands[0] = operands[0];
1552 zoperands[3] = plus_constant_for_output (operands[0], align);
1553 output_load_address (zoperands);
1554
1555 /* ??? This might be much faster if the loops below were preconditioned
1556 and unrolled.
1557
1558 That is, at run time, copy enough bytes one at a time to ensure that the
1559 target and source addresses are aligned to the the largest possible
1560 alignment. Then use a preconditioned unrolled loop to copy say 16
1561 bytes at a time. Then copy bytes one at a time until finish the rest. */
1562
1563 /* Output the first label separately, so that it is spaced properly. */
1564
1565 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, "Lm", INTVAL (xoperands[3]));
1566
1567 {
1568 char pattern[200];
1569 register char *ld_suffix = (align == 1) ? "ub" : (align == 2) ? "uh" : "";
1570 register char *st_suffix = (align == 1) ? "b" : (align == 2) ? "h" : "";
1571
1572 sprintf (pattern, "ld%s [%%1+%%2],%%%%g1\n\tsubcc %%2,%%4,%%2\n\tbge %s\n\tst%s %%%%g1,[%%0+%%2]\n%s:", ld_suffix, &label3[1], st_suffix, &label5[1]);
1573 output_asm_insn (pattern, xoperands);
1574 }
1575
1576 return "";
1577 }
1578 \f
1579 /* Output reasonable peephole for set-on-condition-code insns.
1580 Note that these insns assume a particular way of defining
1581 labels. Therefore, *both* sparc.h and this function must
1582 be changed if a new syntax is needed. */
1583
1584 char *
1585 output_scc_insn (operands, insn)
1586 rtx operands[];
1587 rtx insn;
1588 {
1589 static char string[100];
1590 rtx label = 0, next = insn;
1591 int need_label = 0;
1592
1593 /* Try doing a jump optimization which jump.c can't do for us
1594 because we did not expose that setcc works by using branches.
1595
1596 If this scc insn is followed by an unconditional branch, then have
1597 the jump insn emitted here jump to that location, instead of to
1598 the end of the scc sequence as usual. */
1599
1600 do
1601 {
1602 if (GET_CODE (next) == CODE_LABEL)
1603 label = next;
1604 next = NEXT_INSN (next);
1605 if (next == 0)
1606 break;
1607 }
1608 while (GET_CODE (next) == NOTE || GET_CODE (next) == CODE_LABEL);
1609
1610 /* If we are in a sequence, and the following insn is a sequence also,
1611 then just following the current insn's next field will take us to the
1612 first insn of the next sequence, which is the wrong place. We don't
1613 want to optimize with a branch that has had its delay slot filled.
1614 Avoid this by verifying that NEXT_INSN (PREV_INSN (next)) == next
1615 which fails only if NEXT is such a branch. */
1616
1617 if (next && GET_CODE (next) == JUMP_INSN && simplejump_p (next)
1618 && (! final_sequence || NEXT_INSN (PREV_INSN (next)) == next))
1619 label = JUMP_LABEL (next);
1620 /* If not optimizing, jump label fields are not set. To be safe, always
1621 check here to whether label is still zero. */
1622 if (label == 0)
1623 {
1624 label = gen_label_rtx ();
1625 need_label = 1;
1626 }
1627
1628 LABEL_NUSES (label) += 1;
1629
1630 operands[2] = label;
1631
1632 /* If we are in a delay slot, assume it is the delay slot of an fpcc
1633 insn since our type isn't allowed anywhere else. */
1634
1635 /* ??? Fpcc instructions no longer have delay slots, so this code is
1636 probably obsolete. */
1637
1638 /* The fastest way to emit code for this is an annulled branch followed
1639 by two move insns. This will take two cycles if the branch is taken,
1640 and three cycles if the branch is not taken.
1641
1642 However, if we are in the delay slot of another branch, this won't work,
1643 because we can't put a branch in the delay slot of another branch.
1644 The above sequence would effectively take 3 or 4 cycles respectively
1645 since a no op would have be inserted between the two branches.
1646 In this case, we want to emit a move, annulled branch, and then the
1647 second move. This sequence always takes 3 cycles, and hence is faster
1648 when we are in a branch delay slot. */
1649
1650 if (final_sequence)
1651 {
1652 strcpy (string, "mov 0,%0\n\t");
1653 strcat (string, output_cbranch (operands[1], 2, 0, 1, 0));
1654 strcat (string, "\n\tmov 1,%0");
1655 }
1656 else
1657 {
1658 strcpy (string, output_cbranch (operands[1], 2, 0, 1, 0));
1659 strcat (string, "\n\tmov 1,%0\n\tmov 0,%0");
1660 }
1661
1662 if (need_label)
1663 strcat (string, "\n%l2:");
1664
1665 return string;
1666 }
1667 \f
1668 /* Vectors to keep interesting information about registers where
1669 it can easily be got. */
1670
1671 /* Modes for condition codes. */
1672 #define C_MODES \
1673 ((1 << (int) CCmode) | (1 << (int) CC_NOOVmode) | (1 << (int) CCFPmode))
1674
1675 /* Modes for single-word (and smaller) quantities. */
1676 #define S_MODES \
1677 (~C_MODES \
1678 & ~ ((1 << (int) DImode) | (1 << (int) TImode) \
1679 | (1 << (int) DFmode) | (1 << (int) TFmode)))
1680
1681 /* Modes for double-word (and smaller) quantities. */
1682 #define D_MODES \
1683 (~C_MODES \
1684 & ~ ((1 << (int) TImode) | (1 << (int) TFmode)))
1685
1686 /* Modes for quad-word quantities. */
1687 #define T_MODES (~C_MODES)
1688
1689 /* Modes for single-float quantities. */
1690 #define SF_MODES ((1 << (int) SFmode))
1691
1692 /* Modes for double-float quantities. */
1693 #define DF_MODES (SF_MODES | (1 << (int) DFmode) | (1 << (int) SCmode))
1694
1695 /* Modes for quad-float quantities. */
1696 #define TF_MODES (DF_MODES | (1 << (int) TFmode) | (1 << (int) DCmode))
1697
1698 /* Value is 1 if register/mode pair is acceptable on sparc.
1699 The funny mixture of D and T modes is because integer operations
1700 do not specially operate on tetra quantities, so non-quad-aligned
1701 registers can hold quadword quantities (except %o4 and %i4 because
1702 they cross fixed registers. */
1703
1704 int hard_regno_mode_ok[] = {
1705 C_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
1706 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
1707 T_MODES, S_MODES, T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES,
1708 T_MODES, S_MODES, T_MODES, S_MODES, D_MODES, S_MODES, D_MODES, S_MODES,
1709
1710 TF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
1711 TF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
1712 TF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES,
1713 TF_MODES, SF_MODES, DF_MODES, SF_MODES, TF_MODES, SF_MODES, DF_MODES, SF_MODES};
1714 \f
1715 #ifdef __GNUC__
1716 inline
1717 #endif
1718 static int
1719 save_regs (file, low, high, base, offset, n_fregs)
1720 FILE *file;
1721 int low, high;
1722 char *base;
1723 int offset;
1724 int n_fregs;
1725 {
1726 int i;
1727
1728 for (i = low; i < high; i += 2)
1729 {
1730 if (regs_ever_live[i] && ! call_used_regs[i])
1731 if (regs_ever_live[i+1] && ! call_used_regs[i+1])
1732 fprintf (file, "\tstd %s,[%s+%d]\n",
1733 reg_names[i], base, offset + 4 * n_fregs),
1734 n_fregs += 2;
1735 else
1736 fprintf (file, "\tst %s,[%s+%d]\n",
1737 reg_names[i], base, offset + 4 * n_fregs),
1738 n_fregs += 2;
1739 else if (regs_ever_live[i+1] && ! call_used_regs[i+1])
1740 fprintf (file, "\tst %s,[%s+%d]\n",
1741 reg_names[i+1], base, offset + 4 * n_fregs),
1742 n_fregs += 2;
1743 }
1744 return n_fregs;
1745 }
1746
1747 #ifdef __GNUC__
1748 inline
1749 #endif
1750 static int
1751 restore_regs (file, low, high, base, offset, n_fregs)
1752 FILE *file;
1753 int low, high;
1754 char *base;
1755 int offset;
1756 {
1757 int i;
1758
1759 for (i = low; i < high; i += 2)
1760 {
1761 if (regs_ever_live[i] && ! call_used_regs[i])
1762 if (regs_ever_live[i+1] && ! call_used_regs[i+1])
1763 fprintf (file, "\tldd [%s+%d], %s\n",
1764 base, offset + 4 * n_fregs, reg_names[i]),
1765 n_fregs += 2;
1766 else
1767 fprintf (file, "\tld [%s+%d],%s\n",
1768 base, offset + 4 * n_fregs, reg_names[i]),
1769 n_fregs += 2;
1770 else if (regs_ever_live[i+1] && ! call_used_regs[i+1])
1771 fprintf (file, "\tld [%s+%d],%s\n",
1772 base, offset + 4 * n_fregs, reg_names[i+1]),
1773 n_fregs += 2;
1774 }
1775 return n_fregs;
1776 }
1777
1778 /* Static variables we want to share between prologue and epilogue. */
1779
1780 /* Number of live floating point registers needed to be saved. */
1781 static int num_fregs;
1782
1783 /* Nonzero if any floating point register was ever used. */
1784 static int fregs_ever_live;
1785
1786 int
1787 compute_frame_size (size, leaf_function)
1788 int size;
1789 int leaf_function;
1790 {
1791 int fregs_ever_live = 0;
1792 int n_fregs = 0, i;
1793 int outgoing_args_size = (current_function_outgoing_args_size
1794 + REG_PARM_STACK_SPACE (current_function_decl));
1795
1796 apparent_fsize = ((size) + 7 - STARTING_FRAME_OFFSET) & -8;
1797 for (i = 32; i < FIRST_PSEUDO_REGISTER; i += 2)
1798 fregs_ever_live |= regs_ever_live[i]|regs_ever_live[i+1];
1799
1800 if (TARGET_EPILOGUE && fregs_ever_live)
1801 {
1802 for (i = 32; i < FIRST_PSEUDO_REGISTER; i += 2)
1803 if ((regs_ever_live[i] && ! call_used_regs[i])
1804 || (regs_ever_live[i+1] && ! call_used_regs[i+1]))
1805 n_fregs += 2;
1806 }
1807
1808 /* Set up values for use in `function_epilogue'. */
1809 num_fregs = n_fregs;
1810
1811 apparent_fsize += (outgoing_args_size+7) & -8;
1812 if (leaf_function && n_fregs == 0
1813 && apparent_fsize == (REG_PARM_STACK_SPACE (current_function_decl)
1814 - STARTING_FRAME_OFFSET))
1815 apparent_fsize = 0;
1816
1817 actual_fsize = apparent_fsize + n_fregs*4;
1818
1819 /* Make sure nothing can clobber our register windows.
1820 If a SAVE must be done, or there is a stack-local variable,
1821 the register window area must be allocated. */
1822 if (leaf_function == 0 || size > 0)
1823 actual_fsize += (16 * UNITS_PER_WORD)+8;
1824
1825 return actual_fsize;
1826 }
1827
1828 /* Output code for the function prologue. */
1829
1830 void
1831 output_function_prologue (file, size, leaf_function)
1832 FILE *file;
1833 int size;
1834 int leaf_function;
1835 {
1836 if (leaf_function)
1837 frame_base_name = "%sp+80";
1838 else
1839 frame_base_name = "%fp";
1840
1841 /* Need to use actual_fsize, since we are also allocating
1842 space for our callee (and our own register save area). */
1843 actual_fsize = compute_frame_size (size, leaf_function);
1844
1845 fprintf (file, "\t!#PROLOGUE# 0\n");
1846 if (actual_fsize == 0)
1847 /* do nothing. */ ;
1848 else if (actual_fsize <= 4096)
1849 {
1850 if (! leaf_function)
1851 fprintf (file, "\tsave %%sp,-%d,%%sp\n", actual_fsize);
1852 else
1853 fprintf (file, "\tadd %%sp,-%d,%%sp\n", actual_fsize);
1854 }
1855 else if (actual_fsize <= 8192)
1856 {
1857 /* For frames in the range 4097..8192, we can use just two insns. */
1858 if (! leaf_function)
1859 {
1860 fprintf (file, "\tsave %%sp,-4096,%%sp\n");
1861 fprintf (file, "\tadd %%sp,-%d,%%sp\n", actual_fsize - 4096);
1862 }
1863 else
1864 {
1865 fprintf (file, "\tadd %%sp,-4096,%%sp\n");
1866 fprintf (file, "\tadd %%sp,-%d,%%sp\n", actual_fsize - 4096);
1867 }
1868 }
1869 else
1870 {
1871 if (! leaf_function)
1872 {
1873 fprintf (file, "\tsethi %%hi(-%d),%%g1\n", actual_fsize);
1874 if ((actual_fsize & 0x3ff) != 0)
1875 fprintf (file, "\tor %%g1,%%lo(-%d),%%g1\n", actual_fsize);
1876 fprintf (file, "\tsave %%sp,%%g1,%%sp\n");
1877 }
1878 else
1879 {
1880 fprintf (file, "\tsethi %%hi(-%d),%%g1\n", actual_fsize);
1881 if ((actual_fsize & 0x3ff) != 0)
1882 fprintf (file, "\tor %%g1,%%lo(-%d),%%g1\n", actual_fsize);
1883 fprintf (file, "\tadd %%sp,%%g1,%%sp\n");
1884 }
1885 }
1886
1887 /* If doing anything with PIC, do it now. */
1888 if (! flag_pic)
1889 fprintf (file, "\t!#PROLOGUE# 1\n");
1890
1891 /* Figure out where to save any special registers. */
1892 if (num_fregs)
1893 {
1894 int offset, n_fregs = num_fregs;
1895
1896 if (! leaf_function)
1897 offset = -apparent_fsize;
1898 else
1899 offset = 0;
1900
1901 if (TARGET_EPILOGUE && ! leaf_function)
1902 n_fregs = save_regs (file, 0, 16, frame_base_name, offset, 0);
1903 else if (leaf_function)
1904 n_fregs = save_regs (file, 0, 32, frame_base_name, offset, 0);
1905 if (TARGET_EPILOGUE)
1906 save_regs (file, 32, FIRST_PSEUDO_REGISTER,
1907 frame_base_name, offset, n_fregs);
1908 }
1909
1910 if (regs_ever_live[62])
1911 fprintf (file, "\tst %s,[%s-16]\n\tst %s,[%s-12]\n",
1912 reg_names[0], frame_base_name,
1913 reg_names[0], frame_base_name);
1914
1915 leaf_label = 0;
1916 if (leaf_function && actual_fsize != 0)
1917 {
1918 /* warning ("leaf procedure with frame size %d", actual_fsize); */
1919 if (! TARGET_EPILOGUE)
1920 leaf_label = gen_label_rtx ();
1921 }
1922 }
1923
1924 /* Output code for the function epilogue. */
1925
1926 void
1927 output_function_epilogue (file, size, leaf_function)
1928 FILE *file;
1929 int size;
1930 int leaf_function;
1931 {
1932 int n_fregs, i;
1933 char *ret;
1934
1935 if (leaf_label)
1936 {
1937 emit_label_after (leaf_label, get_last_insn ());
1938 final_scan_insn (get_last_insn (), file, 0, 0, 1);
1939 }
1940
1941 if (num_fregs)
1942 {
1943 int offset, n_fregs = num_fregs;
1944
1945 if (! leaf_function)
1946 offset = -apparent_fsize;
1947 else
1948 offset = 0;
1949
1950 if (TARGET_EPILOGUE && ! leaf_function)
1951 n_fregs = restore_regs (file, 0, 16, frame_base_name, offset, 0);
1952 else if (leaf_function)
1953 n_fregs = restore_regs (file, 0, 32, frame_base_name, offset, 0);
1954 if (TARGET_EPILOGUE)
1955 restore_regs (file, 32, FIRST_PSEUDO_REGISTER,
1956 frame_base_name, offset, n_fregs);
1957 }
1958
1959 /* Work out how to skip the caller's unimp instruction if required. */
1960 if (leaf_function)
1961 ret = (current_function_returns_struct ? "jmp %o7+12" : "retl");
1962 else
1963 ret = (current_function_returns_struct ? "jmp %i7+12" : "ret");
1964
1965 if (TARGET_EPILOGUE || leaf_label)
1966 {
1967 int old_target_epilogue = TARGET_EPILOGUE;
1968 target_flags &= ~old_target_epilogue;
1969
1970 if (! leaf_function)
1971 {
1972 /* If we wound up with things in our delay slot, flush them here. */
1973 if (current_function_epilogue_delay_list)
1974 {
1975 rtx insn = emit_jump_insn_after (gen_rtx (RETURN, VOIDmode),
1976 get_last_insn ());
1977 PATTERN (insn) = gen_rtx (PARALLEL, VOIDmode,
1978 gen_rtvec (2,
1979 PATTERN (XEXP (current_function_epilogue_delay_list, 0)),
1980 PATTERN (insn)));
1981 final_scan_insn (insn, file, 1, 0, 1);
1982 }
1983 else
1984 fprintf (file, "\t%s\n\trestore\n", ret);
1985 }
1986 /* All of the following cases are for leaf functions. */
1987 else if (current_function_epilogue_delay_list)
1988 {
1989 /* eligible_for_epilogue_delay_slot ensures that if this is a
1990 leaf function, then we will only have insn in the delay slot
1991 if the frame size is zero, thus no adjust for the stack is
1992 needed here. */
1993 if (actual_fsize != 0)
1994 abort ();
1995 fprintf (file, "\t%s\n", ret);
1996 final_scan_insn (XEXP (current_function_epilogue_delay_list, 0),
1997 file, 1, 0, 1);
1998 }
1999 else if (actual_fsize <= 4096)
2000 fprintf (file, "\t%s\n\tsub %%sp,-%d,%%sp\n", ret, actual_fsize);
2001 else if (actual_fsize <= 8192)
2002 fprintf (file, "\tsub %%sp,-4096,%%sp\n\t%s\n\tsub %%sp,-%d,%%sp\n",
2003 ret, actual_fsize - 4096);
2004 else if ((actual_fsize & 0x3ff) == 0)
2005 fprintf (file, "\tsethi %%hi(%d),%%g1\n\t%s\n\tadd %%sp,%%g1,%%sp\n",
2006 actual_fsize, ret);
2007 else
2008 fprintf (file, "\tsethi %%hi(%d),%%g1\n\tor %%g1,%%lo(%d),%%g1\n\t%s\n\tadd %%sp,%%g1,%%sp\n",
2009 actual_fsize, actual_fsize, ret);
2010 target_flags |= old_target_epilogue;
2011 }
2012 }
2013 \f
2014 /* Return the string to output a conditional branch to LABEL, which is
2015 the operand number of the label. OP is the conditional expression. The
2016 mode of register 0 says what kind of comparison we made.
2017
2018 REVERSED is non-zero if we should reverse the sense of the comparison.
2019
2020 ANNUL is non-zero if we should generate an annulling branch.
2021
2022 NOOP is non-zero if we have to follow this branch by a noop. */
2023
2024 char *
2025 output_cbranch (op, label, reversed, annul, noop)
2026 rtx op;
2027 int label;
2028 int reversed, annul, noop;
2029 {
2030 static char string[20];
2031 enum rtx_code code = GET_CODE (op);
2032 enum machine_mode mode = GET_MODE (XEXP (op, 0));
2033 static char labelno[] = " %lX";
2034
2035 /* ??? FP branches can not be preceded by another floating point insn.
2036 Because there is currently no concept of pre-delay slots, we can fix
2037 this only by always emitting a nop before a floating point branch. */
2038
2039 if (mode == CCFPmode)
2040 strcpy (string, "nop\n\t");
2041
2042 /* If not floating-point or if EQ or NE, we can just reverse the code. */
2043 if (reversed && (mode != CCFPmode || code == EQ || code == NE))
2044 code = reverse_condition (code), reversed = 0;
2045
2046 /* Start by writing the branch condition. */
2047 switch (code)
2048 {
2049 case NE:
2050 if (mode == CCFPmode)
2051 strcat (string, "fbne");
2052 else
2053 strcpy (string, "bne");
2054 break;
2055
2056 case EQ:
2057 if (mode == CCFPmode)
2058 strcat (string, "fbe");
2059 else
2060 strcpy (string, "be");
2061 break;
2062
2063 case GE:
2064 if (mode == CCFPmode)
2065 {
2066 if (reversed)
2067 strcat (string, "fbul");
2068 else
2069 strcat (string, "fbge");
2070 }
2071 else if (mode == CC_NOOVmode)
2072 strcpy (string, "bpos");
2073 else
2074 strcpy (string, "bge");
2075 break;
2076
2077 case GT:
2078 if (mode == CCFPmode)
2079 {
2080 if (reversed)
2081 strcat (string, "fbule");
2082 else
2083 strcat (string, "fbg");
2084 }
2085 else
2086 strcpy (string, "bg");
2087 break;
2088
2089 case LE:
2090 if (mode == CCFPmode)
2091 {
2092 if (reversed)
2093 strcat (string, "fbug");
2094 else
2095 strcat (string, "fble");
2096 }
2097 else
2098 strcpy (string, "ble");
2099 break;
2100
2101 case LT:
2102 if (mode == CCFPmode)
2103 {
2104 if (reversed)
2105 strcat (string, "fbuge");
2106 else
2107 strcat (string, "fbl");
2108 }
2109 else if (mode == CC_NOOVmode)
2110 strcpy (string, "bneg");
2111 else
2112 strcpy (string, "bl");
2113 break;
2114
2115 case GEU:
2116 strcpy (string, "bgeu");
2117 break;
2118
2119 case GTU:
2120 strcpy (string, "bgu");
2121 break;
2122
2123 case LEU:
2124 strcpy (string, "bleu");
2125 break;
2126
2127 case LTU:
2128 strcpy (string, "blu");
2129 break;
2130 }
2131
2132 /* Now add the annulling, the label, and a possible noop. */
2133 if (annul)
2134 strcat (string, ",a");
2135
2136 labelno[3] = label + '0';
2137 strcat (string, labelno);
2138
2139 if (noop)
2140 strcat (string, "\n\tnop");
2141
2142 return string;
2143 }
2144
2145 char *
2146 output_return (operands)
2147 rtx *operands;
2148 {
2149 if (leaf_label)
2150 {
2151 operands[0] = leaf_label;
2152 return "b,a %l0";
2153 }
2154 else if (leaf_function)
2155 {
2156 /* If we didn't allocate a frame pointer for the current function,
2157 the stack pointer might have been adjusted. Output code to
2158 restore it now. */
2159
2160 operands[0] = gen_rtx (CONST_INT, VOIDmode, actual_fsize);
2161
2162 /* Use sub of negated value in first two cases instead of add to
2163 allow actual_fsize == 4096. */
2164
2165 if (actual_fsize <= 4096)
2166 {
2167 if (current_function_returns_struct)
2168 return "jmp %%o7+12\n\tsub %%sp,-%0,%%sp";
2169 else
2170 return "retl\n\tsub %%sp,-%0,%%sp";
2171 }
2172 else if (actual_fsize <= 8192)
2173 {
2174 operands[0] = gen_rtx (CONST_INT, VOIDmode, actual_fsize - 4096);
2175 if (current_function_returns_struct)
2176 return "sub %%sp,-4096,%%sp\n\tjmp %%o7+12\n\tsub %%sp,-%0,%%sp";
2177 else
2178 return "sub %%sp,-4096,%%sp\n\tretl\n\tsub %%sp,-%0,%%sp";
2179 }
2180 else if (current_function_returns_struct)
2181 {
2182 if ((actual_fsize & 0x3ff) != 0)
2183 return "sethi %%hi(%a0),%%g1\n\tor %%g1,%%lo(%a0),%%g1\n\tjmp %%o7+12\n\tadd %%sp,%%g1,%%sp";
2184 else
2185 return "sethi %%hi(%a0),%%g1\n\tjmp %%o7+12\n\tadd %%sp,%%g1,%%sp";
2186 }
2187 else
2188 {
2189 if ((actual_fsize & 0x3ff) != 0)
2190 return "sethi %%hi(%a0),%%g1\n\tor %%g1,%%lo(%a0),%%g1\n\tretl\n\tadd %%sp,%%g1,%%sp";
2191 else
2192 return "sethi %%hi(%a0),%%g1\n\tretl\n\tadd %%sp,%%g1,%%sp";
2193 }
2194 }
2195 else
2196 {
2197 if (current_function_returns_struct)
2198 return "jmp %%i7+12\n\trestore";
2199 else
2200 return "ret\n\trestore";
2201 }
2202 }
2203
2204 char *
2205 output_floatsisf2 (operands)
2206 rtx *operands;
2207 {
2208 if (GET_CODE (operands[1]) == MEM)
2209 return "ld %1,%0\n\tfitos %0,%0";
2210 else if (FP_REG_P (operands[1]))
2211 return "fitos %1,%0";
2212 return "st %r1,[%%fp-4]\n\tld [%%fp-4],%0\n\tfitos %0,%0";
2213 }
2214
2215 char *
2216 output_floatsidf2 (operands)
2217 rtx *operands;
2218 {
2219 if (GET_CODE (operands[1]) == MEM)
2220 return "ld %1,%0\n\tfitod %0,%0";
2221 else if (FP_REG_P (operands[1]))
2222 return "fitod %1,%0";
2223 return "st %r1,[%%fp-4]\n\tld [%%fp-4],%0\n\tfitod %0,%0";
2224 }
2225 \f
2226 /* Leaf functions and non-leaf functions have different needs. */
2227
2228 static int
2229 reg_leaf_alloc_order[] = REG_LEAF_ALLOC_ORDER;
2230
2231 static int
2232 reg_nonleaf_alloc_order[] = REG_ALLOC_ORDER;
2233
2234 static int *reg_alloc_orders[] = {
2235 reg_leaf_alloc_order,
2236 reg_nonleaf_alloc_order};
2237
2238 void
2239 order_regs_for_local_alloc ()
2240 {
2241 static int last_order_nonleaf = 1;
2242
2243 if (regs_ever_live[15] != last_order_nonleaf)
2244 {
2245 last_order_nonleaf = !last_order_nonleaf;
2246 bcopy (reg_alloc_orders[last_order_nonleaf], reg_alloc_order,
2247 FIRST_PSEUDO_REGISTER * sizeof (int));
2248 }
2249 }
2250 \f
2251 /* Machine dependent routines for the branch probability, arc profiling
2252 code. */
2253
2254 /* The label used by the arc profiling code. */
2255
2256 static rtx profiler_label;
2257
2258 void
2259 init_arc_profiler ()
2260 {
2261 /* Generate and save a copy of this so it can be shared. */
2262 profiler_label = gen_rtx (SYMBOL_REF, Pmode, "*LPBX2");
2263 }
2264
2265 void
2266 output_arc_profiler (arcno, insert_after)
2267 int arcno;
2268 rtx insert_after;
2269 {
2270 rtx profiler_target_addr
2271 = gen_rtx (CONST, Pmode,
2272 gen_rtx (PLUS, Pmode, profiler_label,
2273 gen_rtx (CONST_INT, VOIDmode, 4 * arcno)));
2274 register rtx profiler_reg = gen_reg_rtx (SImode);
2275 register rtx address_reg = gen_reg_rtx (Pmode);
2276 rtx mem_ref;
2277
2278 insert_after = emit_insn_after (gen_rtx (SET, VOIDmode, address_reg,
2279 gen_rtx (HIGH, Pmode,
2280 profiler_target_addr)),
2281 insert_after);
2282
2283 mem_ref = gen_rtx (MEM, SImode, gen_rtx (LO_SUM, Pmode, address_reg,
2284 profiler_target_addr));
2285 insert_after = emit_insn_after (gen_rtx (SET, VOIDmode, profiler_reg,
2286 mem_ref),
2287 insert_after);
2288
2289 insert_after = emit_insn_after (gen_rtx (SET, VOIDmode, profiler_reg,
2290 gen_rtx (PLUS, SImode, profiler_reg,
2291 const1_rtx)),
2292 insert_after);
2293
2294 /* This is the same rtx as above, but it is not legal to share this rtx. */
2295 mem_ref = gen_rtx (MEM, SImode, gen_rtx (LO_SUM, Pmode, address_reg,
2296 profiler_target_addr));
2297 emit_insn_after (gen_rtx (SET, VOIDmode, mem_ref, profiler_reg),
2298 insert_after);
2299 }
2300 \f
2301 /* Print operand X (an rtx) in assembler syntax to file FILE.
2302 CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
2303 For `%' followed by punctuation, CODE is the punctuation and X is null. */
2304
2305 void
2306 print_operand (file, x, code)
2307 FILE *file;
2308 rtx x;
2309 int code;
2310 {
2311 switch (code)
2312 {
2313 case '#':
2314 /* Output a 'nop' if there's nothing for the delay slot. */
2315 if (dbr_sequence_length () == 0)
2316 fputs ("\n\tnop", file);
2317 return;
2318 case '*':
2319 /* Output an annul flag if there's nothing for the delay slot. */
2320 if (dbr_sequence_length () == 0)
2321 fputs (",a", file);
2322 return;
2323 case 'Y':
2324 /* Adjust the operand to take into account a RESTORE operation. */
2325 if (GET_CODE (x) != REG)
2326 abort ();
2327 if (REGNO (x) < 8)
2328 fputs (reg_names[REGNO (x)], file);
2329 else if (REGNO (x) >= 24 && REGNO (x) < 32)
2330 fputs (reg_names[REGNO (x)-16], file);
2331 else
2332 abort ();
2333 return;
2334 case '@':
2335 /* Print out what we are using as the frame pointer. This might
2336 be %fp, or might be %sp+offset. */
2337 fputs (frame_base_name, file);
2338 return;
2339 case 'R':
2340 /* Print out the second register name of a register pair.
2341 I.e., R (%o0) => %o1. */
2342 fputs (reg_names[REGNO (x)+1], file);
2343 return;
2344 case 'm':
2345 /* Print the operand's address only. */
2346 output_address (XEXP (x, 0));
2347 return;
2348 case 'r':
2349 /* In this case we need a register. Use %g0 if the
2350 operand in const0_rtx. */
2351 if (x == const0_rtx)
2352 {
2353 fputs ("%g0", file);
2354 return;
2355 }
2356 else
2357 break;
2358
2359 case 'A':
2360 switch (GET_CODE (x))
2361 {
2362 case IOR: fputs ("or", file); break;
2363 case AND: fputs ("and", file); break;
2364 case XOR: fputs ("xor", file); break;
2365 default: abort ();
2366 }
2367 return;
2368
2369 case 'B':
2370 switch (GET_CODE (x))
2371 {
2372 case IOR: fputs ("orn", file); break;
2373 case AND: fputs ("andn", file); break;
2374 case XOR: fputs ("xnor", file); break;
2375 default: abort ();
2376 }
2377 return;
2378
2379 case 'b':
2380 {
2381 /* Print a sign-extended character. */
2382 int i = INTVAL (x) & 0xff;
2383 if (i & 0x80)
2384 i |= 0xffffff00;
2385 fprintf (file, "%d", i);
2386 return;
2387 }
2388
2389 case 0:
2390 /* Do nothing special. */
2391 break;
2392
2393 default:
2394 /* Undocumented flag. */
2395 abort ();
2396 }
2397
2398 if (GET_CODE (x) == REG)
2399 fputs (reg_names[REGNO (x)], file);
2400 else if (GET_CODE (x) == MEM)
2401 {
2402 fputc ('[', file);
2403 if (CONSTANT_P (XEXP (x, 0)))
2404 /* Poor Sun assembler doesn't understand absolute addressing. */
2405 fputs ("%g0+", file);
2406 output_address (XEXP (x, 0));
2407 fputc (']', file);
2408 }
2409 else if (GET_CODE (x) == HIGH)
2410 {
2411 fputs ("%hi(", file);
2412 output_addr_const (file, XEXP (x, 0));
2413 fputc (')', file);
2414 }
2415 else if (GET_CODE (x) == LO_SUM)
2416 {
2417 print_operand (file, XEXP (x, 0), 0);
2418 fputs ("+%lo(", file);
2419 output_addr_const (file, XEXP (x, 1));
2420 fputc (')', file);
2421 }
2422 else if (GET_CODE (x) == CONST_DOUBLE)
2423 {
2424 if (CONST_DOUBLE_HIGH (x) == 0)
2425 fprintf (file, "%u", CONST_DOUBLE_LOW (x));
2426 else if (CONST_DOUBLE_HIGH (x) == -1
2427 && CONST_DOUBLE_LOW (x) < 0)
2428 fprintf (file, "%d", CONST_DOUBLE_LOW (x));
2429 else
2430 abort ();
2431 }
2432 else { output_addr_const (file, x); }
2433 }
2434 \f
2435 /* This function outputs assembler code for VALUE to FILE, where VALUE is
2436 a 64 bit (DImode) value. */
2437
2438 /* ??? If there is a 64 bit counterpart to .word that the assembler
2439 understands, then using that would simply this code greatly. */
2440
2441 void
2442 output_double_int (file, value)
2443 FILE *file;
2444 rtx value;
2445 {
2446 if (GET_CODE (value) == CONST_INT)
2447 {
2448 if (INTVAL (value) < 0)
2449 ASM_OUTPUT_INT (file, constm1_rtx);
2450 else
2451 ASM_OUTPUT_INT (file, const0_rtx);
2452 ASM_OUTPUT_INT (file, value);
2453 }
2454 else if (GET_CODE (value) == CONST_DOUBLE)
2455 {
2456 ASM_OUTPUT_INT (file, gen_rtx (CONST_INT, VOIDmode,
2457 CONST_DOUBLE_HIGH (value)));
2458 ASM_OUTPUT_INT (file, gen_rtx (CONST_INT, VOIDmode,
2459 CONST_DOUBLE_LOW (value)));
2460 }
2461 else if (GET_CODE (value) == SYMBOL_REF
2462 || GET_CODE (value) == CONST
2463 || GET_CODE (value) == PLUS)
2464 {
2465 /* Addresses are only 32 bits. */
2466 ASM_OUTPUT_INT (file, const0_rtx);
2467 ASM_OUTPUT_INT (file, value);
2468 }
2469 else
2470 abort ();
2471 }
2472 \f
2473 /* Compute the code to put in the .proc statement
2474 for a function that returns type TYPE. */
2475
2476 unsigned long
2477 sparc_type_code (type)
2478 register tree type;
2479 {
2480 register unsigned long qualifiers = 0;
2481 register unsigned shift = 6;
2482
2483 for (;;)
2484 {
2485 switch (TREE_CODE (type))
2486 {
2487 case ERROR_MARK:
2488 return qualifiers;
2489
2490 case ARRAY_TYPE:
2491 qualifiers |= (3 << shift);
2492 shift += 2;
2493 type = TREE_TYPE (type);
2494 break;
2495
2496 case FUNCTION_TYPE:
2497 case METHOD_TYPE:
2498 qualifiers |= (2 << shift);
2499 shift += 2;
2500 type = TREE_TYPE (type);
2501 break;
2502
2503 case POINTER_TYPE:
2504 case REFERENCE_TYPE:
2505 case OFFSET_TYPE:
2506 qualifiers |= (1 << shift);
2507 shift += 2;
2508 type = TREE_TYPE (type);
2509 break;
2510
2511 case RECORD_TYPE:
2512 return (qualifiers | 8);
2513
2514 case UNION_TYPE:
2515 return (qualifiers | 9);
2516
2517 case ENUMERAL_TYPE:
2518 return (qualifiers | 10);
2519
2520 case VOID_TYPE:
2521 return (qualifiers | 16);
2522
2523 case INTEGER_TYPE:
2524 /* This return value is not always completely the same as Sun's
2525 but the Sun assembler's peephole optimizer probably doesn't
2526 care. */
2527 return (qualifiers | 4);
2528
2529 case REAL_TYPE:
2530 if (TYPE_PRECISION (type) == 32)
2531 return (qualifiers | 6);
2532 else
2533 return (qualifiers | 7); /* Who knows? */
2534
2535 case COMPLEX_TYPE: /* GNU Fortran COMPLEX type. */
2536 case CHAR_TYPE: /* GNU Pascal CHAR type. Not used in C. */
2537 case BOOLEAN_TYPE: /* GNU Fortran BOOLEAN type. */
2538 case FILE_TYPE: /* GNU Pascal FILE type. */
2539 case STRING_TYPE: /* GNU Fortran STRING type. */
2540 case LANG_TYPE: /* ? */
2541 abort ();
2542
2543 default:
2544 abort (); /* Not a type! */
2545 }
2546 }
2547 }
This page took 0.184931 seconds and 6 git commands to generate.