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)
5 This file is part of GNU CC.
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)
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.
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. */
26 #include "hard-reg-set.h"
28 #include "insn-config.h"
29 #include "conditions.h"
30 #include "insn-flags.h"
32 #include "insn-attr.h"
37 /* Global variables for machine-dependent things. */
39 /* Save the operands last given to a compare for use when we
40 generate a scc or bcc insn. */
42 rtx sparc_compare_op0
, sparc_compare_op1
;
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
;
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
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,
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};
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,
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};
77 /* Global variables set by FUNCTION_PROLOGUE. */
78 /* Size of frame. Need to know this to emit return insns from
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
;
88 static rtx
find_addr_reg ();
90 /* Return non-zero only if OP is a register of mode MODE,
93 reg_or_0_operand (op
, mode
)
95 enum machine_mode mode
;
97 if (op
== const0_rtx
|| register_operand (op
, mode
))
99 if (GET_CODE (op
) == CONST_DOUBLE
100 && CONST_DOUBLE_HIGH (op
) == 0
101 && CONST_DOUBLE_LOW (op
) == 0)
106 /* Nonzero if OP can appear as the dest of a RESTORE insn. */
108 restore_operand (op
, mode
)
110 enum machine_mode mode
;
112 return (GET_CODE (op
) == REG
&& GET_MODE (op
) == mode
113 && (REGNO (op
) < 8 || (REGNO (op
) >= 24 && REGNO (op
) < 32)));
116 /* Call insn on SPARC can take a PC-relative constant address, or any regular
120 call_operand (op
, mode
)
122 enum machine_mode mode
;
124 if (GET_CODE (op
) != MEM
)
127 return (CONSTANT_P (op
) || memory_address_p (Pmode
, op
));
131 call_operand_address (op
, mode
)
133 enum machine_mode mode
;
135 return (CONSTANT_P (op
) || memory_address_p (Pmode
, op
));
138 /* Returns 1 if OP is either a symbol reference or a sum of a symbol
139 reference and a constant. */
142 symbolic_operand (op
, mode
)
144 enum machine_mode mode
;
146 switch (GET_CODE (op
))
154 return ((GET_CODE (XEXP (op
, 0)) == SYMBOL_REF
155 || GET_CODE (XEXP (op
, 0)) == LABEL_REF
)
156 && GET_CODE (XEXP (op
, 1)) == CONST_INT
);
158 /* ??? This clause seems to be irrelevant. */
160 return GET_MODE (op
) == mode
;
167 /* Return truth value of statement that OP is a symbolic memory
168 operand of mode MODE. */
171 symbolic_memory_operand (op
, mode
)
173 enum machine_mode mode
;
175 if (GET_CODE (op
) == SUBREG
)
176 op
= SUBREG_REG (op
);
177 if (GET_CODE (op
) != MEM
)
180 return (GET_CODE (op
) == SYMBOL_REF
|| GET_CODE (op
) == CONST
181 || GET_CODE (op
) == HIGH
|| GET_CODE (op
) == LABEL_REF
);
184 /* Return 1 if the operand is either a register or a memory operand that is
188 reg_or_nonsymb_mem_operand (op
, mode
)
190 enum machine_mode mode
;
192 if (register_operand (op
, mode
))
195 if (memory_operand (op
, mode
) && ! symbolic_memory_operand (op
, mode
))
202 sparc_operand (op
, mode
)
204 enum machine_mode mode
;
206 if (register_operand (op
, mode
))
208 if (GET_CODE (op
) == CONST_INT
)
209 return SMALL_INT (op
);
210 if (GET_MODE (op
) != mode
)
212 if (GET_CODE (op
) == SUBREG
)
213 op
= SUBREG_REG (op
);
214 if (GET_CODE (op
) != MEM
)
218 if (GET_CODE (op
) == LO_SUM
)
219 return (GET_CODE (XEXP (op
, 0)) == REG
220 && symbolic_operand (XEXP (op
, 1), Pmode
));
221 return memory_address_p (mode
, op
);
225 move_operand (op
, mode
)
227 enum machine_mode mode
;
229 if (mode
== DImode
&& arith_double_operand (op
, mode
))
231 if (register_operand (op
, mode
))
233 if (GET_CODE (op
) == CONST_INT
)
234 return (SMALL_INT (op
) || (INTVAL (op
) & 0x3ff) == 0);
236 if (GET_MODE (op
) != mode
)
238 if (GET_CODE (op
) == SUBREG
)
239 op
= SUBREG_REG (op
);
240 if (GET_CODE (op
) != MEM
)
243 if (GET_CODE (op
) == LO_SUM
)
244 return (register_operand (XEXP (op
, 0), Pmode
)
245 && CONSTANT_P (XEXP (op
, 1)));
246 return memory_address_p (mode
, op
);
250 move_pic_label (op
, mode
)
252 enum machine_mode mode
;
254 /* Special case for PIC. */
255 if (flag_pic
&& GET_CODE (op
) == LABEL_REF
)
260 /* The rtx for the global offset table which is a special form
261 that *is* a position independent symbolic constant. */
264 /* Ensure that we are not using patterns that are not OK with PIC. */
273 if (GET_CODE (recog_operand
[i
]) == SYMBOL_REF
274 || (GET_CODE (recog_operand
[i
]) == CONST
275 && ! rtx_equal_p (pic_pc_rtx
, recog_operand
[i
])))
283 /* Return true if X is an address which needs a temporary register when
284 reloaded while generating PIC code. */
287 pic_address_needs_scratch (x
)
290 /* An address which is a symbolic plus a non SMALL_INT needs a temp reg. */
291 if (GET_CODE (x
) == CONST
&& GET_CODE (XEXP (x
, 0)) == PLUS
292 && GET_CODE (XEXP (XEXP (x
, 0), 0)) == SYMBOL_REF
293 && GET_CODE (XEXP (XEXP (x
, 0), 1)) == CONST_INT
294 && ! SMALL_INT (XEXP (XEXP (x
, 0), 1)))
303 enum machine_mode mode
;
305 if (GET_CODE (op
) == MEM
)
306 return (mode
== VOIDmode
|| mode
== GET_MODE (op
));
310 /* Return truth value of whether OP is EQ or NE. */
315 enum machine_mode mode
;
317 return (GET_CODE (op
) == EQ
|| GET_CODE (op
) == NE
);
320 /* Return 1 if this is a comparison operator, but not an EQ, NE, GEU,
321 or LTU for non-floating-point. We handle those specially. */
324 normal_comp_operator (op
, mode
)
326 enum machine_mode mode
;
328 enum rtx_code code
= GET_CODE (op
);
330 if (GET_RTX_CLASS (code
) != '<')
333 if (GET_MODE (XEXP (op
, 0)) == CCFPmode
334 || GET_MODE (XEXP (op
, 0)) == CCFPEmode
)
337 return (code
!= NE
&& code
!= EQ
&& code
!= GEU
&& code
!= LTU
);
340 /* Return 1 if this is a comparison operator. This allows the use of
341 MATCH_OPERATOR to recognize all the branch insns. */
344 noov_compare_op (op
, mode
)
346 enum machine_mode mode
;
348 enum rtx_code code
= GET_CODE (op
);
350 if (GET_RTX_CLASS (code
) != '<')
353 if (GET_MODE (XEXP (op
, 0)) == CC_NOOVmode
)
354 /* These are the only branches which work with CC_NOOVmode. */
355 return (code
== EQ
|| code
== NE
|| code
== GE
|| code
== LT
);
359 /* Return 1 if this is a SIGN_EXTEND or ZERO_EXTEND operation. */
364 enum machine_mode mode
;
366 return GET_CODE (op
) == SIGN_EXTEND
|| GET_CODE (op
) == ZERO_EXTEND
;
369 /* Return nonzero if OP is an operator of mode MODE which can set
370 the condition codes explicitly. We do not include PLUS and MINUS
371 because these require CC_NOOVmode, which we handle explicitly. */
374 cc_arithop (op
, mode
)
376 enum machine_mode mode
;
378 if (GET_CODE (op
) == AND
379 || GET_CODE (op
) == IOR
380 || GET_CODE (op
) == XOR
)
386 /* Return nonzero if OP is an operator of mode MODE which can bitwise
387 complement its second operand and set the condition codes explicitly. */
390 cc_arithopn (op
, mode
)
392 enum machine_mode mode
;
394 /* XOR is not here because combine canonicalizes (xor (not ...) ...)
395 and (xor ... (not ...)) to (not (xor ...)). */
396 return (GET_CODE (op
) == AND
397 || GET_CODE (op
) == IOR
);
400 /* Return true if OP is a register, or is a CONST_INT that can fit in a 13
401 bit immediate field. This is an acceptable SImode operand for most 3
402 address instructions. */
405 arith_operand (op
, mode
)
407 enum machine_mode mode
;
409 return (register_operand (op
, mode
)
410 || (GET_CODE (op
) == CONST_INT
&& SMALL_INT (op
)));
413 /* Return true if OP is a register, or is a CONST_INT or CONST_DOUBLE that
414 can fit in a 13 bit immediate field. This is an acceptable DImode operand
415 for most 3 address instructions. */
418 arith_double_operand (op
, mode
)
420 enum machine_mode mode
;
422 return (register_operand (op
, mode
)
423 || (GET_CODE (op
) == CONST_DOUBLE
424 && (GET_MODE (op
) == mode
|| GET_MODE (op
) == VOIDmode
)
425 && (unsigned) (CONST_DOUBLE_LOW (op
) + 0x1000) < 0x2000
426 && ((CONST_DOUBLE_HIGH (op
) == -1
427 && (CONST_DOUBLE_LOW (op
) & 0x1000) == 0x1000)
428 || (CONST_DOUBLE_HIGH (op
) == 0
429 && (CONST_DOUBLE_LOW (op
) & 0x1000) == 0)))
430 || (GET_CODE (op
) == CONST_INT
431 && (GET_MODE (op
) == mode
|| GET_MODE (op
) == VOIDmode
)
432 && (unsigned) (INTVAL (op
) + 0x1000) < 0x2000));
435 /* Return truth value of whether OP is a integer which fits the
436 range constraining immediate operands in most three-address insns,
437 which have a 13 bit immediate field. */
442 enum machine_mode mode
;
444 return (GET_CODE (op
) == CONST_INT
&& SMALL_INT (op
));
447 /* Return truth value of statement that OP is a call-clobbered register. */
449 clobbered_register (op
, mode
)
451 enum machine_mode mode
;
453 return (GET_CODE (op
) == REG
&& call_used_regs
[REGNO (op
)]);
456 /* X and Y are two things to compare using CODE. Emit the compare insn and
457 return the rtx for register 0 in the proper mode. */
460 gen_compare_reg (code
, x
, y
)
464 enum machine_mode mode
= SELECT_CC_MODE (code
, x
, y
);
465 rtx cc_reg
= gen_rtx (REG
, mode
, 0);
467 emit_insn (gen_rtx (SET
, VOIDmode
, cc_reg
,
468 gen_rtx (COMPARE
, mode
, x
, y
)));
473 /* Return nonzero if a return peephole merging return with
474 setting of output register is ok. */
476 leaf_return_peephole_ok ()
478 return (actual_fsize
== 0);
481 /* Return nonzero if TRIAL can go into the function epilogue's
482 delay slot. SLOT is the slot we are trying to fill. */
485 eligible_for_epilogue_delay (trial
, slot
)
493 if (GET_CODE (trial
) != INSN
494 || GET_CODE (PATTERN (trial
)) != SET
)
496 if (get_attr_length (trial
) != 1)
499 /* In the case of a true leaf function, anything can go into the delay slot.
500 A delay slot only exists however if the frame size is zero, otherwise
501 we will put an insn to adjust the stack after the return. */
504 if (leaf_return_peephole_ok ())
505 return (get_attr_in_uncond_branch_delay (trial
) == IN_BRANCH_DELAY_TRUE
);
509 /* Otherwise, only operations which can be done in tandem with
510 a `restore' insn can go into the delay slot. */
511 pat
= PATTERN (trial
);
512 if (GET_CODE (SET_DEST (pat
)) != REG
513 || REGNO (SET_DEST (pat
)) == 0
514 || REGNO (SET_DEST (pat
)) >= 32
515 || REGNO (SET_DEST (pat
)) < 24)
519 if (arith_operand (src
, GET_MODE (src
)))
520 return GET_MODE_SIZE (GET_MODE (src
)) <= GET_MODE_SIZE (SImode
);
521 if (arith_double_operand (src
, GET_MODE (src
)))
522 return GET_MODE_SIZE (GET_MODE (src
)) <= GET_MODE_SIZE (DImode
);
523 if (GET_CODE (src
) == PLUS
)
525 if (register_operand (XEXP (src
, 0), SImode
)
526 && arith_operand (XEXP (src
, 1), SImode
))
528 if (register_operand (XEXP (src
, 1), SImode
)
529 && arith_operand (XEXP (src
, 0), SImode
))
531 if (register_operand (XEXP (src
, 0), DImode
)
532 && arith_double_operand (XEXP (src
, 1), DImode
))
534 if (register_operand (XEXP (src
, 1), DImode
)
535 && arith_double_operand (XEXP (src
, 0), DImode
))
538 if (GET_CODE (src
) == MINUS
539 && register_operand (XEXP (src
, 0), SImode
)
540 && small_int (XEXP (src
, 1), VOIDmode
))
542 if (GET_CODE (src
) == MINUS
543 && register_operand (XEXP (src
, 0), DImode
)
544 && !register_operand (XEXP (src
, 1), DImode
)
545 && arith_double_operand (XEXP (src
, 1), DImode
))
551 short_branch (uid1
, uid2
)
554 unsigned int delta
= insn_addresses
[uid1
] - insn_addresses
[uid2
];
555 if (delta
+ 1024 < 2048)
557 /* warning ("long branch, distance %d", delta); */
561 /* Return non-zero if REG is not used after INSN.
562 We assume REG is a reload reg, and therefore does
563 not live past labels or calls or jumps. */
565 reg_unused_after (reg
, insn
)
569 enum rtx_code code
, prev_code
= UNKNOWN
;
571 while (insn
= NEXT_INSN (insn
))
573 if (prev_code
== CALL_INSN
&& call_used_regs
[REGNO (reg
)])
576 code
= GET_CODE (insn
);
577 if (GET_CODE (insn
) == CODE_LABEL
)
580 if (GET_RTX_CLASS (code
) == 'i')
582 rtx set
= single_set (insn
);
583 int in_src
= set
&& reg_overlap_mentioned_p (reg
, SET_SRC (set
));
586 if (set
&& reg_overlap_mentioned_p (reg
, SET_DEST (set
)))
588 if (set
== 0 && reg_overlap_mentioned_p (reg
, PATTERN (insn
)))
596 /* Legitimize PIC addresses. If the address is already position-independent,
597 we return ORIG. Newly generated position-independent addresses go into a
598 reg. This is REG if non zero, otherwise we allocate register(s) as
599 necessary. If this is called during reload, and we need a second temp
600 register, then we use SCRATCH, which is provided via the
601 SECONDARY_INPUT_RELOAD_CLASS mechanism. */
604 legitimize_pic_address (orig
, mode
, reg
, scratch
)
606 enum machine_mode mode
;
609 if (GET_CODE (orig
) == SYMBOL_REF
)
611 rtx pic_ref
, address
;
616 if (reload_in_progress
|| reload_completed
)
619 reg
= gen_reg_rtx (Pmode
);
624 /* If not during reload, allocate another temp reg here for loading
625 in the address, so that these instructions can be optimized
627 rtx temp_reg
= ((reload_in_progress
|| reload_completed
)
628 ? reg
: gen_reg_rtx (Pmode
));
630 /* Must put the SYMBOL_REF inside an UNSPEC here so that cse
631 won't get confused into thinking that these two instructions
632 are loading in the true address of the symbol. If in the
633 future a PIC rtx exists, that should be used instead. */
634 emit_insn (gen_rtx (SET
, VOIDmode
, temp_reg
,
635 gen_rtx (HIGH
, Pmode
,
636 gen_rtx (UNSPEC
, Pmode
,
639 emit_insn (gen_rtx (SET
, VOIDmode
, temp_reg
,
640 gen_rtx (LO_SUM
, Pmode
, temp_reg
,
641 gen_rtx (UNSPEC
, Pmode
,
649 pic_ref
= gen_rtx (MEM
, Pmode
,
650 gen_rtx (PLUS
, Pmode
,
651 pic_offset_table_rtx
, address
));
652 current_function_uses_pic_offset_table
= 1;
653 RTX_UNCHANGING_P (pic_ref
) = 1;
654 insn
= emit_move_insn (reg
, pic_ref
);
655 /* Put a REG_EQUAL note on this insn, so that it can be optimized
657 REG_NOTES (insn
) = gen_rtx (EXPR_LIST
, REG_EQUAL
, orig
,
661 else if (GET_CODE (orig
) == CONST
)
665 if (GET_CODE (XEXP (orig
, 0)) == PLUS
666 && XEXP (XEXP (orig
, 0), 0) == pic_offset_table_rtx
)
671 if (reload_in_progress
|| reload_completed
)
674 reg
= gen_reg_rtx (Pmode
);
677 if (GET_CODE (XEXP (orig
, 0)) == PLUS
)
679 base
= legitimize_pic_address (XEXP (XEXP (orig
, 0), 0), Pmode
,
681 offset
= legitimize_pic_address (XEXP (XEXP (orig
, 0), 1), Pmode
,
682 base
== reg
? 0 : reg
, 0);
687 if (GET_CODE (offset
) == CONST_INT
)
689 if (SMALL_INT (offset
))
690 return plus_constant_for_output (base
, INTVAL (offset
));
691 else if (! reload_in_progress
&& ! reload_completed
)
692 offset
= force_reg (Pmode
, offset
);
693 /* We can't create any new registers during reload, so use the
694 SCRATCH reg provided by the reload_insi pattern. */
697 emit_move_insn (scratch
, offset
);
701 /* If we reach here, then the SECONDARY_INPUT_RELOAD_CLASS
702 macro needs to be adjusted so that a scratch reg is provided
706 return gen_rtx (PLUS
, Pmode
, base
, offset
);
708 else if (GET_CODE (orig
) == LABEL_REF
)
709 current_function_uses_pic_offset_table
= 1;
714 /* Set up PIC-specific rtl. This should not cause any insns
722 /* Emit special PIC prologues and epilogues. */
727 /* The table we use to reference PIC data. */
728 rtx global_offset_table
;
729 /* Labels to get the PC in the prologue of this function. */
732 int orig_flag_pic
= flag_pic
;
734 if (current_function_uses_pic_offset_table
== 0)
741 l1
= gen_label_rtx ();
742 l2
= gen_label_rtx ();
747 /* Note that we pun calls and jumps here! */
748 emit_jump_insn (gen_rtx (PARALLEL
, VOIDmode
,
750 gen_rtx (SET
, VOIDmode
, pc_rtx
, gen_rtx (LABEL_REF
, VOIDmode
, l2
)),
751 gen_rtx (SET
, VOIDmode
, gen_rtx (REG
, SImode
, 15), gen_rtx (LABEL_REF
, VOIDmode
, l2
)))));
754 /* Initialize every time through, since we can't easily
755 know this to be permanent. */
756 global_offset_table
= gen_rtx (SYMBOL_REF
, Pmode
, "_GLOBAL_OFFSET_TABLE_");
757 pic_pc_rtx
= gen_rtx (CONST
, Pmode
,
758 gen_rtx (MINUS
, Pmode
,
760 gen_rtx (CONST
, Pmode
,
761 gen_rtx (MINUS
, Pmode
,
762 gen_rtx (LABEL_REF
, VOIDmode
, l1
),
765 emit_insn (gen_rtx (SET
, VOIDmode
, pic_offset_table_rtx
,
766 gen_rtx (HIGH
, Pmode
, pic_pc_rtx
)));
767 emit_insn (gen_rtx (SET
, VOIDmode
,
768 pic_offset_table_rtx
,
769 gen_rtx (LO_SUM
, Pmode
,
770 pic_offset_table_rtx
, pic_pc_rtx
)));
771 emit_insn (gen_rtx (SET
, VOIDmode
,
772 pic_offset_table_rtx
,
773 gen_rtx (PLUS
, Pmode
,
774 pic_offset_table_rtx
, gen_rtx (REG
, Pmode
, 15))));
775 /* emit_insn (gen_rtx (ASM_INPUT, VOIDmode, "!#PROLOGUE# 1")); */
776 LABEL_PRESERVE_P (l1
) = 1;
777 LABEL_PRESERVE_P (l2
) = 1;
778 flag_pic
= orig_flag_pic
;
780 seq
= gen_sequence ();
782 emit_insn_after (seq
, get_insns ());
784 /* Need to emit this whether or not we obey regdecls,
785 since setjmp/longjmp can cause life info to screw up. */
786 emit_insn (gen_rtx (USE
, VOIDmode
, pic_offset_table_rtx
));
789 /* For the SPARC, REG and REG+CONST is cost 0, REG+REG is cost 1,
790 and addresses involving symbolic constants are cost 2.
792 We make REG+REG slightly more expensive because it might keep
793 a register live for longer than we might like.
795 PIC addresses are very expensive.
797 It is no coincidence that this has the same structure
798 as GO_IF_LEGITIMATE_ADDRESS. */
800 sparc_address_cost (X
)
804 /* Handled before calling here. */
805 if (GET_CODE (X
) == REG
)
808 if (GET_CODE (X
) == PLUS
)
810 if (GET_CODE (XEXP (X
, 0)) == REG
811 && GET_CODE (XEXP (X
, 1)) == REG
)
815 else if (GET_CODE (X
) == LO_SUM
)
817 else if (GET_CODE (X
) == HIGH
)
822 /* Emit insns to move operands[1] into operands[0].
824 Return 1 if we have written out everything that needs to be done to
825 do the move. Otherwise, return 0 and the caller will emit the move
828 SCRATCH_REG if non zero can be used as a scratch register for the move
829 operation. It is provided by a SECONDARY_RELOAD_* macro if needed. */
832 emit_move_sequence (operands
, mode
, scratch_reg
)
834 enum machine_mode mode
;
837 register rtx operand0
= operands
[0];
838 register rtx operand1
= operands
[1];
840 /* Handle most common case first: storing into a register. */
841 if (register_operand (operand0
, mode
))
843 if (register_operand (operand1
, mode
)
844 || (GET_CODE (operand1
) == CONST_INT
&& SMALL_INT (operand1
))
845 || (GET_CODE (operand1
) == CONST_DOUBLE
846 && arith_double_operand (operand1
, DImode
))
847 || (GET_CODE (operand1
) == HIGH
&& GET_MODE (operand1
) != DImode
)
848 /* Only `general_operands' can come here, so MEM is ok. */
849 || GET_CODE (operand1
) == MEM
)
851 /* Run this case quickly. */
852 emit_insn (gen_rtx (SET
, VOIDmode
, operand0
, operand1
));
856 else if (GET_CODE (operand0
) == MEM
)
858 if (register_operand (operand1
, mode
) || operand1
== const0_rtx
)
860 /* Run this case quickly. */
861 emit_insn (gen_rtx (SET
, VOIDmode
, operand0
, operand1
));
864 if (! reload_in_progress
)
866 operands
[0] = validize_mem (operand0
);
867 operands
[1] = operand1
= force_reg (mode
, operand1
);
871 /* Simplify the source if we need to. Must handle DImode HIGH operators
872 here because such a move needs a clobber added. */
873 if ((GET_CODE (operand1
) != HIGH
&& immediate_operand (operand1
, mode
))
874 || (GET_CODE (operand1
) == HIGH
&& GET_MODE (operand1
) == DImode
))
876 if (flag_pic
&& symbolic_operand (operand1
, mode
))
878 rtx temp_reg
= reload_in_progress
? operand0
: 0;
880 operands
[1] = legitimize_pic_address (operand1
, mode
, temp_reg
,
883 else if (GET_CODE (operand1
) == CONST_INT
884 ? (! SMALL_INT (operand1
)
885 && (INTVAL (operand1
) & 0x3ff) != 0)
886 : (GET_CODE (operand1
) == CONST_DOUBLE
887 ? ! arith_double_operand (operand1
, DImode
)
890 /* For DImode values, temp must be operand0 because of the way
891 HI and LO_SUM work. The LO_SUM operator only copies half of
892 the LSW from the dest of the HI operator. If the LO_SUM dest is
893 not the same as the HI dest, then the MSW of the LO_SUM dest will
896 ??? The real problem here is that the ...(HI:DImode pattern emits
897 multiple instructions, and the ...(LO_SUM:DImode pattern emits
898 one instruction. This fails, because the compiler assumes that
899 LO_SUM copies all bits of the first operand to its dest. Better
900 would be to have the HI pattern emit one instruction and the
901 LO_SUM pattern multiple instructions. Even better would be
902 to use four rtl insns. */
903 rtx temp
= ((reload_in_progress
|| mode
== DImode
)
904 ? operand0
: gen_reg_rtx (mode
));
906 emit_insn (gen_rtx (SET
, VOIDmode
, temp
,
907 gen_rtx (HIGH
, mode
, operand1
)));
908 operands
[1] = gen_rtx (LO_SUM
, mode
, temp
, operand1
);
912 if (GET_CODE (operand1
) == LABEL_REF
&& flag_pic
)
914 /* The procedure for doing this involves using a call instruction to
915 get the pc into o7. We need to indicate this explicitly because
916 the tablejump pattern assumes that it can use this value also. */
917 emit_insn (gen_rtx (PARALLEL
, VOIDmode
,
919 gen_rtx (SET
, VOIDmode
, operand0
,
921 gen_rtx (SET
, VOIDmode
,
922 gen_rtx (REG
, mode
, 15),
927 /* Now have insn-emit do whatever it normally does. */
931 /* Return the best assembler insn template
932 for moving operands[1] into operands[0] as a fullword. */
935 singlemove_string (operands
)
938 if (GET_CODE (operands
[0]) == MEM
)
940 if (GET_CODE (operands
[1]) != MEM
)
945 else if (GET_CODE (operands
[1]) == MEM
)
947 else if (GET_CODE (operands
[1]) == CONST_DOUBLE
)
952 /* Must be SFmode, otherwise this doesn't make sense. */
953 if (GET_MODE (operands
[1]) != SFmode
)
956 REAL_VALUE_FROM_CONST_DOUBLE (r
, operands
[1]);
957 REAL_VALUE_TO_TARGET_SINGLE (r
, i
);
958 operands
[1] = gen_rtx (CONST_INT
, VOIDmode
, i
);
960 if (CONST_OK_FOR_LETTER_P (i
, 'I'))
962 else if ((i
& 0x000003FF) != 0)
963 return "sethi %%hi(%a1),%0\n\tor %0,%%lo(%a1),%0";
965 return "sethi %%hi(%a1),%0";
967 else if (GET_CODE (operands
[1]) == CONST_INT
968 && ! CONST_OK_FOR_LETTER_P (INTVAL (operands
[1]), 'I'))
970 int i
= INTVAL (operands
[1]);
972 /* If all low order 10 bits are clear, then we only need a single
973 sethi insn to load the constant. */
974 if ((i
& 0x000003FF) != 0)
975 return "sethi %%hi(%a1),%0\n\tor %0,%%lo(%a1),%0";
977 return "sethi %%hi(%a1),%0";
979 /* Operand 1 must be a register, or a 'I' type CONST_INT. */
983 /* Return non-zero if it is OK to assume that the given memory operand is
984 aligned at least to a 8-byte boundary. This should only be called
985 for memory accesses whose size is 8 bytes or larger. */
995 if (GET_CODE (mem
) != MEM
)
996 return 0; /* It's gotta be a MEM! */
998 addr
= XEXP (mem
, 0);
1000 /* Now that all misaligned double parms are copied on function entry,
1001 we can assume any 64-bit object is 64-bit aligned except those which
1002 are at unaligned offsets from the stack or frame pointer. If the
1003 TARGET_UNALIGNED_DOUBLES switch is given, we do not make this
1006 /* See what register we use in the address. */
1008 if (GET_CODE (addr
) == PLUS
)
1010 if (GET_CODE (XEXP (addr
, 0)) == REG
1011 && GET_CODE (XEXP (addr
, 1)) == CONST_INT
)
1013 base
= XEXP (addr
, 0);
1014 offset
= XEXP (addr
, 1);
1017 else if (GET_CODE (addr
) == REG
)
1020 offset
= const0_rtx
;
1023 /* If it's the stack or frame pointer, check offset alignment.
1024 We can have improper alignment in the function entry code. */
1026 && (REGNO (base
) == FRAME_POINTER_REGNUM
1027 || REGNO (base
) == STACK_POINTER_REGNUM
))
1029 if ((INTVAL (offset
) & 0x7) == 0)
1032 /* Anything else we know is properly aligned unless TARGET_UNALIGNED_DOUBLES
1033 is true, in which case we can only assume that an access is aligned if
1034 it is to an aggregate, it is to a constant address, or the address
1035 involves a LO_SUM. */
1036 else if (! TARGET_UNALIGNED_DOUBLES
|| MEM_IN_STRUCT_P (mem
)
1037 || CONSTANT_P (addr
) || GET_CODE (addr
) == LO_SUM
)
1040 /* An obviously unaligned address. */
1044 enum optype
{ REGOP
, OFFSOP
, MEMOP
, PUSHOP
, POPOP
, CNSTOP
, RNDOP
};
1046 /* Output assembler code to perform a doubleword move insn
1047 with operands OPERANDS. This is very similar to the following
1048 output_move_quad function. */
1051 output_move_double (operands
)
1054 register rtx op0
= operands
[0];
1055 register rtx op1
= operands
[1];
1056 register enum optype optype0
;
1057 register enum optype optype1
;
1061 int highest_first
= 0;
1062 int no_addreg1_decrement
= 0;
1064 /* First classify both operands. */
1068 else if (offsettable_memref_p (op0
))
1070 else if (GET_CODE (op0
) == MEM
)
1077 else if (CONSTANT_P (op1
))
1079 else if (offsettable_memref_p (op1
))
1081 else if (GET_CODE (op1
) == MEM
)
1086 /* Check for the cases that the operand constraints are not
1087 supposed to allow to happen. Abort if we get one,
1088 because generating code for these cases is painful. */
1090 if (optype0
== RNDOP
|| optype1
== RNDOP
1091 || (optype0
== MEM
&& optype1
== MEM
))
1094 /* If an operand is an unoffsettable memory ref, find a register
1095 we can increment temporarily to make it refer to the second word. */
1097 if (optype0
== MEMOP
)
1098 addreg0
= find_addr_reg (XEXP (op0
, 0));
1100 if (optype1
== MEMOP
)
1101 addreg1
= find_addr_reg (XEXP (op1
, 0));
1103 /* Ok, we can do one word at a time.
1104 Set up in LATEHALF the operands to use for the
1105 high-numbered (least significant) word and in some cases alter the
1106 operands in OPERANDS to be suitable for the low-numbered word. */
1108 if (optype0
== REGOP
)
1109 latehalf
[0] = gen_rtx (REG
, SImode
, REGNO (op0
) + 1);
1110 else if (optype0
== OFFSOP
)
1111 latehalf
[0] = adj_offsettable_operand (op0
, 4);
1115 if (optype1
== REGOP
)
1116 latehalf
[1] = gen_rtx (REG
, SImode
, REGNO (op1
) + 1);
1117 else if (optype1
== OFFSOP
)
1118 latehalf
[1] = adj_offsettable_operand (op1
, 4);
1119 else if (optype1
== CNSTOP
)
1120 split_double (op1
, &operands
[1], &latehalf
[1]);
1124 /* Easy case: try moving both words at once. Check for moving between
1125 an even/odd register pair and a memory location. */
1126 if ((optype0
== REGOP
&& optype1
!= REGOP
&& optype1
!= CNSTOP
1127 && (REGNO (op0
) & 1) == 0)
1128 || (optype0
!= REGOP
&& optype0
!= CNSTOP
&& optype1
== REGOP
1129 && (REGNO (op1
) & 1) == 0))
1133 if (optype0
== REGOP
)
1138 if (mem_aligned_8 (mem
))
1139 return (mem
== op1
? "ldd %1,%0" : "std %1,%0");
1142 /* If the first move would clobber the source of the second one,
1143 do them in the other order. */
1145 /* Overlapping registers. */
1146 if (optype0
== REGOP
&& optype1
== REGOP
1147 && REGNO (op0
) == REGNO (latehalf
[1]))
1150 output_asm_insn (singlemove_string (latehalf
), latehalf
);
1151 /* Do low-numbered word. */
1152 return singlemove_string (operands
);
1154 /* Loading into a register which overlaps a register used in the address. */
1155 else if (optype0
== REGOP
&& optype1
!= REGOP
1156 && reg_overlap_mentioned_p (op0
, op1
))
1158 /* If both halves of dest are used in the src memory address,
1159 add the two regs and put them in the low reg (op0).
1160 Then it works to load latehalf first. */
1161 if (reg_mentioned_p (op0
, XEXP (op1
, 0))
1162 && reg_mentioned_p (latehalf
[0], XEXP (op1
, 0)))
1165 xops
[0] = latehalf
[0];
1167 output_asm_insn ("add %1,%0,%1", xops
);
1168 operands
[1] = gen_rtx (MEM
, DImode
, op0
);
1169 latehalf
[1] = adj_offsettable_operand (operands
[1], 4);
1173 /* Only one register in the dest is used in the src memory address,
1174 and this is the first register of the dest, so we want to do
1175 the late half first here also. */
1176 else if (! reg_mentioned_p (latehalf
[0], XEXP (op1
, 0)))
1178 /* Only one register in the dest is used in the src memory address,
1179 and this is the second register of the dest, so we want to do
1180 the late half last. If addreg1 is set, and addreg1 is the same
1181 register as latehalf, then we must suppress the trailing decrement,
1182 because it would clobber the value just loaded. */
1183 else if (addreg1
&& reg_mentioned_p (addreg1
, latehalf
[0]))
1184 no_addreg1_decrement
= 1;
1187 /* Normal case: do the two words, low-numbered first.
1188 Overlap case (highest_first set): do high-numbered word first. */
1190 if (! highest_first
)
1191 output_asm_insn (singlemove_string (operands
), operands
);
1193 /* Make any unoffsettable addresses point at high-numbered word. */
1195 output_asm_insn ("add %0,0x4,%0", &addreg0
);
1197 output_asm_insn ("add %0,0x4,%0", &addreg1
);
1200 output_asm_insn (singlemove_string (latehalf
), latehalf
);
1202 /* Undo the adds we just did. */
1204 output_asm_insn ("add %0,-0x4,%0", &addreg0
);
1205 if (addreg1
&& ! no_addreg1_decrement
)
1206 output_asm_insn ("add %0,-0x4,%0", &addreg1
);
1209 output_asm_insn (singlemove_string (operands
), operands
);
1214 /* Output assembler code to perform a quadword move insn
1215 with operands OPERANDS. This is very similar to the preceding
1216 output_move_double function. */
1219 output_move_quad (operands
)
1222 register rtx op0
= operands
[0];
1223 register rtx op1
= operands
[1];
1224 register enum optype optype0
;
1225 register enum optype optype1
;
1230 /* First classify both operands. */
1234 else if (offsettable_memref_p (op0
))
1236 else if (GET_CODE (op0
) == MEM
)
1243 else if (CONSTANT_P (op1
))
1245 else if (offsettable_memref_p (op1
))
1247 else if (GET_CODE (op1
) == MEM
)
1252 /* Check for the cases that the operand constraints are not
1253 supposed to allow to happen. Abort if we get one,
1254 because generating code for these cases is painful. */
1256 if (optype0
== RNDOP
|| optype1
== RNDOP
1257 || (optype0
== MEM
&& optype1
== MEM
))
1260 /* If an operand is an unoffsettable memory ref, find a register
1261 we can increment temporarily to make it refer to the later words. */
1263 if (optype0
== MEMOP
)
1264 addreg0
= find_addr_reg (XEXP (op0
, 0));
1266 if (optype1
== MEMOP
)
1267 addreg1
= find_addr_reg (XEXP (op1
, 0));
1269 /* Ok, we can do one word at a time.
1270 Set up in wordpart the operands to use for each word of the arguments. */
1272 if (optype0
== REGOP
)
1274 wordpart
[0][0] = gen_rtx (REG
, SImode
, REGNO (op0
) + 0);
1275 wordpart
[1][0] = gen_rtx (REG
, SImode
, REGNO (op0
) + 1);
1276 wordpart
[2][0] = gen_rtx (REG
, SImode
, REGNO (op0
) + 2);
1277 wordpart
[3][0] = gen_rtx (REG
, SImode
, REGNO (op0
) + 3);
1279 else if (optype0
== OFFSOP
)
1281 wordpart
[0][0] = adj_offsettable_operand (op0
, 0);
1282 wordpart
[1][0] = adj_offsettable_operand (op0
, 4);
1283 wordpart
[2][0] = adj_offsettable_operand (op0
, 8);
1284 wordpart
[3][0] = adj_offsettable_operand (op0
, 12);
1288 wordpart
[0][0] = op0
;
1289 wordpart
[1][0] = op0
;
1290 wordpart
[2][0] = op0
;
1291 wordpart
[3][0] = op0
;
1294 if (optype1
== REGOP
)
1296 wordpart
[0][1] = gen_rtx (REG
, SImode
, REGNO (op1
) + 0);
1297 wordpart
[1][1] = gen_rtx (REG
, SImode
, REGNO (op1
) + 1);
1298 wordpart
[2][1] = gen_rtx (REG
, SImode
, REGNO (op1
) + 2);
1299 wordpart
[3][1] = gen_rtx (REG
, SImode
, REGNO (op1
) + 3);
1301 else if (optype1
== OFFSOP
)
1303 wordpart
[0][1] = adj_offsettable_operand (op1
, 0);
1304 wordpart
[1][1] = adj_offsettable_operand (op1
, 4);
1305 wordpart
[2][1] = adj_offsettable_operand (op1
, 8);
1306 wordpart
[3][1] = adj_offsettable_operand (op1
, 12);
1308 else if (optype1
== CNSTOP
)
1313 /* This only works for TFmode floating point constants. */
1314 if (GET_CODE (op1
) != CONST_DOUBLE
|| GET_MODE (op1
) != TFmode
)
1317 REAL_VALUE_FROM_CONST_DOUBLE (r
, op1
);
1318 REAL_VALUE_TO_TARGET_LONG_DOUBLE (r
, l
);
1320 wordpart
[0][1] = GEN_INT (l
[0]);
1321 wordpart
[1][1] = GEN_INT (l
[1]);
1322 wordpart
[2][1] = GEN_INT (l
[2]);
1323 wordpart
[3][1] = GEN_INT (l
[3]);
1327 wordpart
[0][1] = op1
;
1328 wordpart
[1][1] = op1
;
1329 wordpart
[2][1] = op1
;
1330 wordpart
[3][1] = op1
;
1333 /* Easy case: try moving the quad as two pairs. Check for moving between
1334 an even/odd register pair and a memory location. */
1335 /* ??? Should also handle the case of non-offsettable addresses here.
1336 We can at least do the first pair as a ldd/std, and then do the third
1337 and fourth words individually. */
1338 if ((optype0
== REGOP
&& optype1
== OFFSOP
&& (REGNO (op0
) & 1) == 0)
1339 || (optype0
== OFFSOP
&& optype1
== REGOP
&& (REGNO (op1
) & 1) == 0))
1343 if (optype0
== REGOP
)
1348 if (mem_aligned_8 (mem
))
1350 operands
[2] = adj_offsettable_operand (mem
, 8);
1352 return "ldd %1,%0;ldd %2,%S0";
1354 return "std %1,%0;std %S1,%2";
1358 /* If the first move would clobber the source of the second one,
1359 do them in the other order. */
1361 /* Overlapping registers. */
1362 if (optype0
== REGOP
&& optype1
== REGOP
1363 && (REGNO (op0
) == REGNO (wordpart
[1][3])
1364 || REGNO (op0
) == REGNO (wordpart
[1][2])
1365 || REGNO (op0
) == REGNO (wordpart
[1][1])))
1367 /* Do fourth word. */
1368 output_asm_insn (singlemove_string (wordpart
[3]), wordpart
[3]);
1369 /* Do the third word. */
1370 output_asm_insn (singlemove_string (wordpart
[2]), wordpart
[2]);
1371 /* Do the second word. */
1372 output_asm_insn (singlemove_string (wordpart
[1]), wordpart
[1]);
1373 /* Do lowest-numbered word. */
1374 return singlemove_string (wordpart
[0]);
1376 /* Loading into a register which overlaps a register used in the address. */
1377 if (optype0
== REGOP
&& optype1
!= REGOP
1378 && reg_overlap_mentioned_p (op0
, op1
))
1380 /* ??? Not implemented yet. This is a bit complicated, because we
1381 must load which ever part overlaps the address last. If the address
1382 is a double-reg address, then there are two parts which need to
1383 be done last, which is impossible. We would need a scratch register
1388 /* Normal case: move the four words in lowest to higest address order. */
1390 output_asm_insn (singlemove_string (wordpart
[0]), wordpart
[0]);
1392 /* Make any unoffsettable addresses point at the second word. */
1394 output_asm_insn ("add %0,0x4,%0", &addreg0
);
1396 output_asm_insn ("add %0,0x4,%0", &addreg1
);
1398 /* Do the second word. */
1399 output_asm_insn (singlemove_string (wordpart
[1]), wordpart
[1]);
1401 /* Make any unoffsettable addresses point at the third word. */
1403 output_asm_insn ("add %0,0x4,%0", &addreg0
);
1405 output_asm_insn ("add %0,0x4,%0", &addreg1
);
1407 /* Do the third word. */
1408 output_asm_insn (singlemove_string (wordpart
[2]), wordpart
[2]);
1410 /* Make any unoffsettable addresses point at the fourth word. */
1412 output_asm_insn ("add %0,0x4,%0", &addreg0
);
1414 output_asm_insn ("add %0,0x4,%0", &addreg1
);
1416 /* Do the fourth word. */
1417 output_asm_insn (singlemove_string (wordpart
[3]), wordpart
[3]);
1419 /* Undo the adds we just did. */
1421 output_asm_insn ("add %0,-0xc,%0", &addreg0
);
1423 output_asm_insn ("add %0,-0xc,%0", &addreg1
);
1428 /* Output assembler code to perform a doubleword move insn with operands
1429 OPERANDS, one of which must be a floating point register. */
1432 output_fp_move_double (operands
)
1435 if (FP_REG_P (operands
[0]))
1437 if (FP_REG_P (operands
[1]))
1438 return "fmovs %1,%0\n\tfmovs %R1,%R0";
1439 else if (GET_CODE (operands
[1]) == REG
)
1442 return output_move_double (operands
);
1444 else if (FP_REG_P (operands
[1]))
1446 if (GET_CODE (operands
[0]) == REG
)
1449 return output_move_double (operands
);
1454 /* Output assembler code to perform a quadword move insn with operands
1455 OPERANDS, one of which must be a floating point register. */
1458 output_fp_move_quad (operands
)
1461 register rtx op0
= operands
[0];
1462 register rtx op1
= operands
[1];
1467 return "fmovs %1,%0\n\tfmovs %R1,%R0\n\tfmovs %S1,%S0\n\tfmovs %T1,%T0";
1468 else if (GET_CODE (op1
) == REG
)
1471 return output_move_quad (operands
);
1473 else if (FP_REG_P (op1
))
1475 if (GET_CODE (op0
) == REG
)
1478 return output_move_quad (operands
);
1484 /* Return a REG that occurs in ADDR with coefficient 1.
1485 ADDR can be effectively incremented by incrementing REG. */
1488 find_addr_reg (addr
)
1491 while (GET_CODE (addr
) == PLUS
)
1493 /* We absolutely can not fudge the frame pointer here, because the
1494 frame pointer must always be 8 byte aligned. It also confuses
1496 if (GET_CODE (XEXP (addr
, 0)) == REG
1497 && REGNO (XEXP (addr
, 0)) != FRAME_POINTER_REGNUM
)
1498 addr
= XEXP (addr
, 0);
1499 else if (GET_CODE (XEXP (addr
, 1)) == REG
1500 && REGNO (XEXP (addr
, 1)) != FRAME_POINTER_REGNUM
)
1501 addr
= XEXP (addr
, 1);
1502 else if (CONSTANT_P (XEXP (addr
, 0)))
1503 addr
= XEXP (addr
, 1);
1504 else if (CONSTANT_P (XEXP (addr
, 1)))
1505 addr
= XEXP (addr
, 0);
1509 if (GET_CODE (addr
) == REG
)
1515 output_sized_memop (opname
, mode
, signedp
)
1517 enum machine_mode mode
;
1520 static char *ld_size_suffix_u
[] = { "ub", "uh", "", "?", "d" };
1521 static char *ld_size_suffix_s
[] = { "sb", "sh", "", "?", "d" };
1522 static char *st_size_suffix
[] = { "b", "h", "", "?", "d" };
1523 char **opnametab
, *modename
;
1525 if (opname
[0] == 'l')
1527 opnametab
= ld_size_suffix_s
;
1529 opnametab
= ld_size_suffix_u
;
1531 opnametab
= st_size_suffix
;
1532 modename
= opnametab
[GET_MODE_SIZE (mode
) >> 1];
1534 fprintf (asm_out_file
, "\t%s%s", opname
, modename
);
1538 output_move_with_extension (operands
)
1541 if (GET_MODE (operands
[2]) == HImode
)
1542 output_asm_insn ("sll %2,0x10,%0", operands
);
1543 else if (GET_MODE (operands
[2]) == QImode
)
1544 output_asm_insn ("sll %2,0x18,%0", operands
);
1550 /* ??? These are only used by the movstrsi pattern, but we get better code
1551 in general without that, because emit_block_move can do just as good a
1552 job as this function does when alignment and size are known. When they
1553 aren't known, a call to strcpy may be faster anyways, because it is
1554 likely to be carefully crafted assembly language code, and below we just
1555 do a byte-wise copy.
1557 Also, emit_block_move expands into multiple read/write RTL insns, which
1558 can then be optimized, whereas our movstrsi pattern can not be optimized
1561 /* Load the address specified by OPERANDS[3] into the register
1562 specified by OPERANDS[0].
1564 OPERANDS[3] may be the result of a sum, hence it could either be:
1569 (3) REG + REG + CONST_INT
1570 (4) REG + REG (special case of 3).
1572 Note that (3) is not a legitimate address.
1573 All cases are handled here. */
1576 output_load_address (operands
)
1581 if (CONSTANT_P (operands
[3]))
1583 output_asm_insn ("set %3,%0", operands
);
1587 if (REG_P (operands
[3]))
1589 if (REGNO (operands
[0]) != REGNO (operands
[3]))
1590 output_asm_insn ("mov %3,%0", operands
);
1594 if (GET_CODE (operands
[3]) != PLUS
)
1597 base
= XEXP (operands
[3], 0);
1598 offset
= XEXP (operands
[3], 1);
1600 if (GET_CODE (base
) == CONST_INT
)
1607 if (GET_CODE (offset
) != CONST_INT
)
1609 /* Operand is (PLUS (REG) (REG)). */
1611 offset
= const0_rtx
;
1617 operands
[7] = offset
;
1618 if (SMALL_INT (offset
))
1619 output_asm_insn ("add %6,%7,%0", operands
);
1621 output_asm_insn ("set %7,%0\n\tadd %0,%6,%0", operands
);
1623 else if (GET_CODE (base
) == PLUS
)
1625 operands
[6] = XEXP (base
, 0);
1626 operands
[7] = XEXP (base
, 1);
1627 operands
[8] = offset
;
1629 if (SMALL_INT (offset
))
1630 output_asm_insn ("add %6,%7,%0\n\tadd %0,%8,%0", operands
);
1632 output_asm_insn ("set %8,%0\n\tadd %0,%6,%0\n\tadd %0,%7,%0", operands
);
1638 /* Output code to place a size count SIZE in register REG.
1639 ALIGN is the size of the unit of transfer.
1641 Because block moves are pipelined, we don't include the
1642 first element in the transfer of SIZE to REG. */
1645 output_size_for_block_move (size
, reg
, align
)
1652 xoperands
[1] = size
;
1653 xoperands
[2] = align
;
1654 if (GET_CODE (size
) == REG
)
1655 output_asm_insn ("sub %1,%2,%0", xoperands
);
1659 = gen_rtx (CONST_INT
, VOIDmode
, INTVAL (size
) - INTVAL (align
));
1660 output_asm_insn ("set %1,%0", xoperands
);
1664 /* Emit code to perform a block move.
1666 OPERANDS[0] is the destination.
1667 OPERANDS[1] is the source.
1668 OPERANDS[2] is the size.
1669 OPERANDS[3] is the alignment safe to use.
1670 OPERANDS[4] is a register we can safely clobber as a temp. */
1673 output_block_move (operands
)
1676 /* A vector for our computed operands. Note that load_output_address
1677 makes use of (and can clobber) up to the 8th element of this vector. */
1680 static int movstrsi_label
= 0;
1682 rtx temp1
= operands
[4];
1683 rtx sizertx
= operands
[2];
1684 rtx alignrtx
= operands
[3];
1685 int align
= INTVAL (alignrtx
);
1686 char label3
[30], label5
[30];
1688 xoperands
[0] = operands
[0];
1689 xoperands
[1] = operands
[1];
1690 xoperands
[2] = temp1
;
1692 /* We can't move more than this many bytes at a time because we have only
1693 one register, %g1, to move them through. */
1694 if (align
> UNITS_PER_WORD
)
1696 align
= UNITS_PER_WORD
;
1697 alignrtx
= gen_rtx (CONST_INT
, VOIDmode
, UNITS_PER_WORD
);
1700 /* We consider 8 ld/st pairs, for a total of 16 inline insns to be
1701 reasonable here. (Actually will emit a maximum of 18 inline insns for
1702 the case of size == 31 and align == 4). */
1704 if (GET_CODE (sizertx
) == CONST_INT
&& (INTVAL (sizertx
) / align
) <= 8
1705 && memory_address_p (QImode
, plus_constant_for_output (xoperands
[0],
1707 && memory_address_p (QImode
, plus_constant_for_output (xoperands
[1],
1710 int size
= INTVAL (sizertx
);
1713 /* We will store different integers into this particular RTX. */
1714 xoperands
[2] = rtx_alloc (CONST_INT
);
1715 PUT_MODE (xoperands
[2], VOIDmode
);
1717 /* This case is currently not handled. Abort instead of generating
1724 for (i
= (size
>> 2) - 1; i
>= 0; i
--)
1726 INTVAL (xoperands
[2]) = (i
<< 2) + offset
;
1727 output_asm_insn ("ld [%a1+%2],%%g1\n\tst %%g1,[%a0+%2]",
1730 offset
+= (size
& ~0x3);
1738 for (i
= (size
>> 1) - 1; i
>= 0; i
--)
1740 INTVAL (xoperands
[2]) = (i
<< 1) + offset
;
1741 output_asm_insn ("lduh [%a1+%2],%%g1\n\tsth %%g1,[%a0+%2]",
1744 offset
+= (size
& ~0x1);
1752 for (i
= size
- 1; i
>= 0; i
--)
1754 INTVAL (xoperands
[2]) = i
+ offset
;
1755 output_asm_insn ("ldub [%a1+%2],%%g1\n\tstb %%g1,[%a0+%2]",
1761 /* We should never reach here. */
1765 /* If the size isn't known to be a multiple of the alignment,
1766 we have to do it in smaller pieces. If we could determine that
1767 the size was a multiple of 2 (or whatever), we could be smarter
1769 if (GET_CODE (sizertx
) != CONST_INT
)
1773 int size
= INTVAL (sizertx
);
1774 while (size
% align
)
1778 if (align
!= INTVAL (alignrtx
))
1779 alignrtx
= gen_rtx (CONST_INT
, VOIDmode
, align
);
1781 xoperands
[3] = gen_rtx (CONST_INT
, VOIDmode
, movstrsi_label
++);
1782 xoperands
[4] = gen_rtx (CONST_INT
, VOIDmode
, align
);
1783 xoperands
[5] = gen_rtx (CONST_INT
, VOIDmode
, movstrsi_label
++);
1785 ASM_GENERATE_INTERNAL_LABEL (label3
, "Lm", INTVAL (xoperands
[3]));
1786 ASM_GENERATE_INTERNAL_LABEL (label5
, "Lm", INTVAL (xoperands
[5]));
1788 /* This is the size of the transfer. Emit code to decrement the size
1789 value by ALIGN, and store the result in the temp1 register. */
1790 output_size_for_block_move (sizertx
, temp1
, alignrtx
);
1792 /* Must handle the case when the size is zero or negative, so the first thing
1793 we do is compare the size against zero, and only copy bytes if it is
1794 zero or greater. Note that we have already subtracted off the alignment
1795 once, so we must copy 1 alignment worth of bytes if the size is zero
1798 The SUN assembler complains about labels in branch delay slots, so we
1799 do this before outputting the load address, so that there will always
1800 be a harmless insn between the branch here and the next label emitted
1806 sprintf (pattern
, "cmp %%2,0\n\tbl %s", &label5
[1]);
1807 output_asm_insn (pattern
, xoperands
);
1810 zoperands
[0] = operands
[0];
1811 zoperands
[3] = plus_constant_for_output (operands
[0], align
);
1812 output_load_address (zoperands
);
1814 /* ??? This might be much faster if the loops below were preconditioned
1817 That is, at run time, copy enough bytes one at a time to ensure that the
1818 target and source addresses are aligned to the the largest possible
1819 alignment. Then use a preconditioned unrolled loop to copy say 16
1820 bytes at a time. Then copy bytes one at a time until finish the rest. */
1822 /* Output the first label separately, so that it is spaced properly. */
1824 ASM_OUTPUT_INTERNAL_LABEL (asm_out_file
, "Lm", INTVAL (xoperands
[3]));
1828 register char *ld_suffix
= (align
== 1) ? "ub" : (align
== 2) ? "uh" : "";
1829 register char *st_suffix
= (align
== 1) ? "b" : (align
== 2) ? "h" : "";
1831 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]);
1832 output_asm_insn (pattern
, xoperands
);
1839 /* Output reasonable peephole for set-on-condition-code insns.
1840 Note that these insns assume a particular way of defining
1841 labels. Therefore, *both* sparc.h and this function must
1842 be changed if a new syntax is needed. */
1845 output_scc_insn (operands
, insn
)
1849 static char string
[100];
1850 rtx label
= 0, next
= insn
;
1853 /* Try doing a jump optimization which jump.c can't do for us
1854 because we did not expose that setcc works by using branches.
1856 If this scc insn is followed by an unconditional branch, then have
1857 the jump insn emitted here jump to that location, instead of to
1858 the end of the scc sequence as usual. */
1862 if (GET_CODE (next
) == CODE_LABEL
)
1864 next
= NEXT_INSN (next
);
1868 while (GET_CODE (next
) == NOTE
|| GET_CODE (next
) == CODE_LABEL
);
1870 /* If we are in a sequence, and the following insn is a sequence also,
1871 then just following the current insn's next field will take us to the
1872 first insn of the next sequence, which is the wrong place. We don't
1873 want to optimize with a branch that has had its delay slot filled.
1874 Avoid this by verifying that NEXT_INSN (PREV_INSN (next)) == next
1875 which fails only if NEXT is such a branch. */
1877 if (next
&& GET_CODE (next
) == JUMP_INSN
&& simplejump_p (next
)
1878 && (! final_sequence
|| NEXT_INSN (PREV_INSN (next
)) == next
))
1879 label
= JUMP_LABEL (next
);
1880 /* If not optimizing, jump label fields are not set. To be safe, always
1881 check here to whether label is still zero. */
1884 label
= gen_label_rtx ();
1888 LABEL_NUSES (label
) += 1;
1890 operands
[2] = label
;
1892 /* If we are in a delay slot, assume it is the delay slot of an fpcc
1893 insn since our type isn't allowed anywhere else. */
1895 /* ??? Fpcc instructions no longer have delay slots, so this code is
1896 probably obsolete. */
1898 /* The fastest way to emit code for this is an annulled branch followed
1899 by two move insns. This will take two cycles if the branch is taken,
1900 and three cycles if the branch is not taken.
1902 However, if we are in the delay slot of another branch, this won't work,
1903 because we can't put a branch in the delay slot of another branch.
1904 The above sequence would effectively take 3 or 4 cycles respectively
1905 since a no op would have be inserted between the two branches.
1906 In this case, we want to emit a move, annulled branch, and then the
1907 second move. This sequence always takes 3 cycles, and hence is faster
1908 when we are in a branch delay slot. */
1912 strcpy (string
, "mov 0,%0\n\t");
1913 strcat (string
, output_cbranch (operands
[1], 2, 0, 1, 0));
1914 strcat (string
, "\n\tmov 1,%0");
1918 strcpy (string
, output_cbranch (operands
[1], 2, 0, 1, 0));
1919 strcat (string
, "\n\tmov 1,%0\n\tmov 0,%0");
1923 strcat (string
, "\n%l2:");
1928 /* Vectors to keep interesting information about registers where
1929 it can easily be got. */
1931 /* Modes for condition codes. */
1933 ((1 << (int) CCmode) | (1 << (int) CC_NOOVmode) \
1934 | (1 << (int) CCFPmode) | (1 << (int) CCFPEmode))
1936 /* Modes for single-word (and smaller) quantities. */
1938 ((1 << (int) QImode) | (1 << (int) HImode) | (1 << (int) SImode) \
1939 | (1 << (int) QFmode) | (1 << (int) HFmode) | (1 << (int) SFmode) \
1940 | (1 << (int) CQImode) | (1 << (int) CHImode))
1942 /* Modes for double-word (and smaller) quantities. */
1944 (S_MODES | (1 << (int) DImode) | (1 << (int) DFmode) \
1945 | (1 << (int) CSImode) | (1 << (int) SCmode))
1947 /* Modes for quad-word quantities. */
1949 (D_MODES | (1 << (int) TImode) | (1 << (int) TFmode) \
1950 | (1 << (int) DCmode) | (1 << (int) CDImode))
1952 /* Modes for single-float quantities. We must allow any single word or
1953 smaller quantity. This is because the fix/float conversion instructions
1954 take integer inputs/outputs from the float registers. */
1955 #define SF_MODES (S_MODES)
1957 /* Modes for double-float quantities. */
1958 #define DF_MODES (SF_MODES | (1 << (int) DFmode) | (1 << (int) SCmode))
1960 /* Modes for quad-float quantities. */
1961 #define TF_MODES (DF_MODES | (1 << (int) TFmode) | (1 << (int) DCmode))
1963 /* Value is 1 if register/mode pair is acceptable on sparc.
1964 The funny mixture of D and T modes is because integer operations
1965 do not specially operate on tetra quantities, so non-quad-aligned
1966 registers can hold quadword quantities (except %o4 and %i4 because
1967 they cross fixed registers. */
1969 int hard_regno_mode_ok
[] = {
1970 C_MODES
, S_MODES
, T_MODES
, S_MODES
, T_MODES
, S_MODES
, D_MODES
, S_MODES
,
1971 T_MODES
, S_MODES
, T_MODES
, S_MODES
, D_MODES
, S_MODES
, D_MODES
, S_MODES
,
1972 T_MODES
, S_MODES
, T_MODES
, S_MODES
, T_MODES
, S_MODES
, D_MODES
, S_MODES
,
1973 T_MODES
, S_MODES
, T_MODES
, S_MODES
, D_MODES
, S_MODES
, D_MODES
, S_MODES
,
1975 TF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
, TF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
,
1976 TF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
, TF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
,
1977 TF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
, TF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
,
1978 TF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
, TF_MODES
, SF_MODES
, DF_MODES
, SF_MODES
};
1984 save_regs (file
, low
, high
, base
, offset
, n_fregs
)
1993 for (i
= low
; i
< high
; i
+= 2)
1995 if (regs_ever_live
[i
] && ! call_used_regs
[i
])
1996 if (regs_ever_live
[i
+1] && ! call_used_regs
[i
+1])
1997 fprintf (file
, "\tstd %s,[%s+%d]\n",
1998 reg_names
[i
], base
, offset
+ 4 * n_fregs
),
2001 fprintf (file
, "\tst %s,[%s+%d]\n",
2002 reg_names
[i
], base
, offset
+ 4 * n_fregs
),
2004 else if (regs_ever_live
[i
+1] && ! call_used_regs
[i
+1])
2005 fprintf (file
, "\tst %s,[%s+%d]\n",
2006 reg_names
[i
+1], base
, offset
+ 4 * n_fregs
),
2016 restore_regs (file
, low
, high
, base
, offset
, n_fregs
)
2024 for (i
= low
; i
< high
; i
+= 2)
2026 if (regs_ever_live
[i
] && ! call_used_regs
[i
])
2027 if (regs_ever_live
[i
+1] && ! call_used_regs
[i
+1])
2028 fprintf (file
, "\tldd [%s+%d], %s\n",
2029 base
, offset
+ 4 * n_fregs
, reg_names
[i
]),
2032 fprintf (file
, "\tld [%s+%d],%s\n",
2033 base
, offset
+ 4 * n_fregs
, reg_names
[i
]),
2035 else if (regs_ever_live
[i
+1] && ! call_used_regs
[i
+1])
2036 fprintf (file
, "\tld [%s+%d],%s\n",
2037 base
, offset
+ 4 * n_fregs
, reg_names
[i
+1]),
2043 /* Static variables we want to share between prologue and epilogue. */
2045 /* Number of live floating point registers needed to be saved. */
2046 static int num_fregs
;
2049 compute_frame_size (size
, leaf_function
)
2053 int fregs_ever_live
= 0;
2055 int outgoing_args_size
= (current_function_outgoing_args_size
2056 + REG_PARM_STACK_SPACE (current_function_decl
));
2058 apparent_fsize
= ((size
) + 7 - STARTING_FRAME_OFFSET
) & -8;
2059 for (i
= 32; i
< FIRST_PSEUDO_REGISTER
; i
+= 2)
2060 fregs_ever_live
|= regs_ever_live
[i
]|regs_ever_live
[i
+1];
2062 if (TARGET_EPILOGUE
&& fregs_ever_live
)
2064 for (i
= 32; i
< FIRST_PSEUDO_REGISTER
; i
+= 2)
2065 if ((regs_ever_live
[i
] && ! call_used_regs
[i
])
2066 || (regs_ever_live
[i
+1] && ! call_used_regs
[i
+1]))
2070 /* Set up values for use in `function_epilogue'. */
2071 num_fregs
= n_fregs
;
2073 apparent_fsize
+= (outgoing_args_size
+7) & -8;
2074 if (leaf_function
&& n_fregs
== 0
2075 && apparent_fsize
== (REG_PARM_STACK_SPACE (current_function_decl
)
2076 - STARTING_FRAME_OFFSET
))
2079 actual_fsize
= apparent_fsize
+ n_fregs
*4;
2081 /* Make sure nothing can clobber our register windows.
2082 If a SAVE must be done, or there is a stack-local variable,
2083 the register window area must be allocated. */
2084 if (leaf_function
== 0 || size
> 0)
2085 actual_fsize
+= (16 * UNITS_PER_WORD
)+8;
2087 return actual_fsize
;
2090 /* Output code for the function prologue. */
2093 output_function_prologue (file
, size
, leaf_function
)
2098 /* ??? This should be %sp+actual_fsize for a leaf function. I think it
2099 works only because it is never used. */
2101 frame_base_name
= "%sp+80";
2103 frame_base_name
= "%fp";
2105 /* Need to use actual_fsize, since we are also allocating
2106 space for our callee (and our own register save area). */
2107 actual_fsize
= compute_frame_size (size
, leaf_function
);
2109 fprintf (file
, "\t!#PROLOGUE# 0\n");
2110 if (actual_fsize
== 0)
2112 else if (actual_fsize
<= 4096)
2114 if (! leaf_function
)
2115 fprintf (file
, "\tsave %%sp,-%d,%%sp\n", actual_fsize
);
2117 fprintf (file
, "\tadd %%sp,-%d,%%sp\n", actual_fsize
);
2119 else if (actual_fsize
<= 8192)
2121 /* For frames in the range 4097..8192, we can use just two insns. */
2122 if (! leaf_function
)
2124 fprintf (file
, "\tsave %%sp,-4096,%%sp\n");
2125 fprintf (file
, "\tadd %%sp,-%d,%%sp\n", actual_fsize
- 4096);
2129 fprintf (file
, "\tadd %%sp,-4096,%%sp\n");
2130 fprintf (file
, "\tadd %%sp,-%d,%%sp\n", actual_fsize
- 4096);
2135 if (! leaf_function
)
2137 fprintf (file
, "\tsethi %%hi(-%d),%%g1\n", actual_fsize
);
2138 if ((actual_fsize
& 0x3ff) != 0)
2139 fprintf (file
, "\tor %%g1,%%lo(-%d),%%g1\n", actual_fsize
);
2140 fprintf (file
, "\tsave %%sp,%%g1,%%sp\n");
2144 fprintf (file
, "\tsethi %%hi(-%d),%%g1\n", actual_fsize
);
2145 if ((actual_fsize
& 0x3ff) != 0)
2146 fprintf (file
, "\tor %%g1,%%lo(-%d),%%g1\n", actual_fsize
);
2147 fprintf (file
, "\tadd %%sp,%%g1,%%sp\n");
2151 /* If doing anything with PIC, do it now. */
2153 fprintf (file
, "\t!#PROLOGUE# 1\n");
2155 /* Figure out where to save any special registers. */
2158 int offset
, n_fregs
= num_fregs
;
2160 /* ??? This should always be -apparent_fsize. */
2161 if (! leaf_function
)
2162 offset
= -apparent_fsize
;
2166 if (TARGET_EPILOGUE
&& ! leaf_function
)
2167 n_fregs
= save_regs (file
, 0, 16, frame_base_name
, offset
, 0);
2168 else if (leaf_function
)
2169 n_fregs
= save_regs (file
, 0, 32, frame_base_name
, offset
, 0);
2170 if (TARGET_EPILOGUE
)
2171 save_regs (file
, 32, FIRST_PSEUDO_REGISTER
,
2172 frame_base_name
, offset
, n_fregs
);
2176 if (leaf_function
&& actual_fsize
!= 0)
2178 /* warning ("leaf procedure with frame size %d", actual_fsize); */
2179 if (! TARGET_EPILOGUE
)
2180 leaf_label
= gen_label_rtx ();
2184 /* Output code for the function epilogue. */
2187 output_function_epilogue (file
, size
, leaf_function
)
2196 emit_label_after (leaf_label
, get_last_insn ());
2197 final_scan_insn (get_last_insn (), file
, 0, 0, 1);
2202 int offset
, n_fregs
= num_fregs
;
2204 /* ??? This should always be -apparent_fsize. */
2205 if (! leaf_function
)
2206 offset
= -apparent_fsize
;
2210 if (TARGET_EPILOGUE
&& ! leaf_function
)
2211 n_fregs
= restore_regs (file
, 0, 16, frame_base_name
, offset
, 0);
2212 else if (leaf_function
)
2213 n_fregs
= restore_regs (file
, 0, 32, frame_base_name
, offset
, 0);
2214 if (TARGET_EPILOGUE
)
2215 restore_regs (file
, 32, FIRST_PSEUDO_REGISTER
,
2216 frame_base_name
, offset
, n_fregs
);
2219 /* Work out how to skip the caller's unimp instruction if required. */
2221 ret
= (current_function_returns_struct
? "jmp %o7+12" : "retl");
2223 ret
= (current_function_returns_struct
? "jmp %i7+12" : "ret");
2225 if (TARGET_EPILOGUE
|| leaf_label
)
2227 int old_target_epilogue
= TARGET_EPILOGUE
;
2228 target_flags
&= ~old_target_epilogue
;
2230 if (! leaf_function
)
2232 /* If we wound up with things in our delay slot, flush them here. */
2233 if (current_function_epilogue_delay_list
)
2235 rtx insn
= emit_jump_insn_after (gen_rtx (RETURN
, VOIDmode
),
2237 PATTERN (insn
) = gen_rtx (PARALLEL
, VOIDmode
,
2239 PATTERN (XEXP (current_function_epilogue_delay_list
, 0)),
2241 final_scan_insn (insn
, file
, 1, 0, 1);
2244 fprintf (file
, "\t%s\n\trestore\n", ret
);
2246 /* All of the following cases are for leaf functions. */
2247 else if (current_function_epilogue_delay_list
)
2249 /* eligible_for_epilogue_delay_slot ensures that if this is a
2250 leaf function, then we will only have insn in the delay slot
2251 if the frame size is zero, thus no adjust for the stack is
2253 if (actual_fsize
!= 0)
2255 fprintf (file
, "\t%s\n", ret
);
2256 final_scan_insn (XEXP (current_function_epilogue_delay_list
, 0),
2259 /* Output 'nop' instead of 'sub %sp,-0,%sp' when no frame, so as to
2260 avoid generating confusing assembly language output. */
2261 else if (actual_fsize
== 0)
2262 fprintf (file
, "\t%s\n\tnop\n", ret
);
2263 else if (actual_fsize
<= 4096)
2264 fprintf (file
, "\t%s\n\tsub %%sp,-%d,%%sp\n", ret
, actual_fsize
);
2265 else if (actual_fsize
<= 8192)
2266 fprintf (file
, "\tsub %%sp,-4096,%%sp\n\t%s\n\tsub %%sp,-%d,%%sp\n",
2267 ret
, actual_fsize
- 4096);
2268 else if ((actual_fsize
& 0x3ff) == 0)
2269 fprintf (file
, "\tsethi %%hi(%d),%%g1\n\t%s\n\tadd %%sp,%%g1,%%sp\n",
2272 fprintf (file
, "\tsethi %%hi(%d),%%g1\n\tor %%g1,%%lo(%d),%%g1\n\t%s\n\tadd %%sp,%%g1,%%sp\n",
2273 actual_fsize
, actual_fsize
, ret
);
2274 target_flags
|= old_target_epilogue
;
2278 /* Do what is necessary for `va_start'. The argument is ignored;
2279 We look at the current function to determine if stdarg or varargs
2280 is used and return the address of the first unnamed parameter. */
2283 sparc_builtin_saveregs (arglist
)
2286 tree fntype
= TREE_TYPE (current_function_decl
);
2287 int stdarg
= (TYPE_ARG_TYPES (fntype
) != 0
2288 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype
)))
2289 != void_type_node
));
2290 int first_reg
= current_function_args_info
;
2294 #if 0 /* This code seemed to have no effect except to make
2295 varargs not work right when va_list wasn't the first arg. */
2300 for (regno
= first_reg
; regno
< NPARM_REGS
; regno
++)
2301 emit_move_insn (gen_rtx (MEM
, word_mode
,
2302 gen_rtx (PLUS
, Pmode
,
2304 GEN_INT (STACK_POINTER_OFFSET
2305 + UNITS_PER_WORD
* regno
))),
2306 gen_rtx (REG
, word_mode
, BASE_INCOMING_ARG_REG (word_mode
)
2309 address
= gen_rtx (PLUS
, Pmode
,
2311 GEN_INT (STACK_POINTER_OFFSET
2312 + UNITS_PER_WORD
* first_reg
));
2317 /* Return the string to output a conditional branch to LABEL, which is
2318 the operand number of the label. OP is the conditional expression. The
2319 mode of register 0 says what kind of comparison we made.
2321 REVERSED is non-zero if we should reverse the sense of the comparison.
2323 ANNUL is non-zero if we should generate an annulling branch.
2325 NOOP is non-zero if we have to follow this branch by a noop. */
2328 output_cbranch (op
, label
, reversed
, annul
, noop
)
2331 int reversed
, annul
, noop
;
2333 static char string
[20];
2334 enum rtx_code code
= GET_CODE (op
);
2335 enum machine_mode mode
= GET_MODE (XEXP (op
, 0));
2336 static char labelno
[] = " %lX";
2338 /* ??? FP branches can not be preceded by another floating point insn.
2339 Because there is currently no concept of pre-delay slots, we can fix
2340 this only by always emitting a nop before a floating point branch. */
2342 if (mode
== CCFPmode
|| mode
== CCFPEmode
)
2343 strcpy (string
, "nop\n\t");
2345 /* If not floating-point or if EQ or NE, we can just reverse the code. */
2347 && ((mode
!= CCFPmode
&& mode
!= CCFPEmode
) || code
== EQ
|| code
== NE
))
2348 code
= reverse_condition (code
), reversed
= 0;
2350 /* Start by writing the branch condition. */
2354 if (mode
== CCFPmode
|| mode
== CCFPEmode
)
2355 strcat (string
, "fbne");
2357 strcpy (string
, "bne");
2361 if (mode
== CCFPmode
|| mode
== CCFPEmode
)
2362 strcat (string
, "fbe");
2364 strcpy (string
, "be");
2368 if (mode
== CCFPmode
|| mode
== CCFPEmode
)
2371 strcat (string
, "fbul");
2373 strcat (string
, "fbge");
2375 else if (mode
== CC_NOOVmode
)
2376 strcpy (string
, "bpos");
2378 strcpy (string
, "bge");
2382 if (mode
== CCFPmode
|| mode
== CCFPEmode
)
2385 strcat (string
, "fbule");
2387 strcat (string
, "fbg");
2390 strcpy (string
, "bg");
2394 if (mode
== CCFPmode
|| mode
== CCFPEmode
)
2397 strcat (string
, "fbug");
2399 strcat (string
, "fble");
2402 strcpy (string
, "ble");
2406 if (mode
== CCFPmode
|| mode
== CCFPEmode
)
2409 strcat (string
, "fbuge");
2411 strcat (string
, "fbl");
2413 else if (mode
== CC_NOOVmode
)
2414 strcpy (string
, "bneg");
2416 strcpy (string
, "bl");
2420 strcpy (string
, "bgeu");
2424 strcpy (string
, "bgu");
2428 strcpy (string
, "bleu");
2432 strcpy (string
, "blu");
2436 /* Now add the annulling, the label, and a possible noop. */
2438 strcat (string
, ",a");
2440 labelno
[3] = label
+ '0';
2441 strcat (string
, labelno
);
2444 strcat (string
, "\n\tnop");
2449 /* Output assembler code to return from a function. */
2452 output_return (operands
)
2457 operands
[0] = leaf_label
;
2460 else if (leaf_function
)
2462 /* If we didn't allocate a frame pointer for the current function,
2463 the stack pointer might have been adjusted. Output code to
2466 operands
[0] = gen_rtx (CONST_INT
, VOIDmode
, actual_fsize
);
2468 /* Use sub of negated value in first two cases instead of add to
2469 allow actual_fsize == 4096. */
2471 if (actual_fsize
<= 4096)
2473 if (current_function_returns_struct
)
2474 return "jmp %%o7+12\n\tsub %%sp,-%0,%%sp";
2476 return "retl\n\tsub %%sp,-%0,%%sp";
2478 else if (actual_fsize
<= 8192)
2480 operands
[0] = gen_rtx (CONST_INT
, VOIDmode
, actual_fsize
- 4096);
2481 if (current_function_returns_struct
)
2482 return "sub %%sp,-4096,%%sp\n\tjmp %%o7+12\n\tsub %%sp,-%0,%%sp";
2484 return "sub %%sp,-4096,%%sp\n\tretl\n\tsub %%sp,-%0,%%sp";
2486 else if (current_function_returns_struct
)
2488 if ((actual_fsize
& 0x3ff) != 0)
2489 return "sethi %%hi(%a0),%%g1\n\tor %%g1,%%lo(%a0),%%g1\n\tjmp %%o7+12\n\tadd %%sp,%%g1,%%sp";
2491 return "sethi %%hi(%a0),%%g1\n\tjmp %%o7+12\n\tadd %%sp,%%g1,%%sp";
2495 if ((actual_fsize
& 0x3ff) != 0)
2496 return "sethi %%hi(%a0),%%g1\n\tor %%g1,%%lo(%a0),%%g1\n\tretl\n\tadd %%sp,%%g1,%%sp";
2498 return "sethi %%hi(%a0),%%g1\n\tretl\n\tadd %%sp,%%g1,%%sp";
2503 if (current_function_returns_struct
)
2504 return "jmp %%i7+12\n\trestore";
2506 return "ret\n\trestore";
2510 /* Leaf functions and non-leaf functions have different needs. */
2513 reg_leaf_alloc_order
[] = REG_LEAF_ALLOC_ORDER
;
2516 reg_nonleaf_alloc_order
[] = REG_ALLOC_ORDER
;
2518 static int *reg_alloc_orders
[] = {
2519 reg_leaf_alloc_order
,
2520 reg_nonleaf_alloc_order
};
2523 order_regs_for_local_alloc ()
2525 static int last_order_nonleaf
= 1;
2527 if (regs_ever_live
[15] != last_order_nonleaf
)
2529 last_order_nonleaf
= !last_order_nonleaf
;
2530 bcopy (reg_alloc_orders
[last_order_nonleaf
], reg_alloc_order
,
2531 FIRST_PSEUDO_REGISTER
* sizeof (int));
2535 /* Return 1 if REGNO (reg1) is even and REGNO (reg1) == REGNO (reg2) - 1.
2536 This makes them candidates for using ldd and std insns.
2538 Note reg1 and reg2 *must* be hard registers. To be sure we will
2539 abort if we are passed pseudo registers. */
2542 registers_ok_for_ldd_peep (reg1
, reg2
)
2546 /* We might have been passed a SUBREG. */
2547 if (GET_CODE (reg1
) != REG
|| GET_CODE (reg2
) != REG
)
2550 if (REGNO (reg1
) % 2 != 0)
2553 return (REGNO (reg1
) == REGNO (reg2
) - 1);
2557 /* Return 1 if addr1 and addr2 are suitable for use in an ldd or
2560 This can only happen when addr1 and addr2 are consecutive memory
2561 locations (addr1 + 4 == addr2). addr1 must also be aligned on a
2562 64 bit boundary (addr1 % 8 == 0).
2564 We know %sp and %fp are kept aligned on a 64 bit boundary. Other
2565 registers are assumed to *never* be properly aligned and are
2568 Knowing %sp and %fp are kept aligned on a 64 bit boundary, we
2569 need only check that the offset for addr1 % 8 == 0. */
2572 addrs_ok_for_ldd_peep (addr1
, addr2
)
2577 /* Extract a register number and offset (if used) from the first addr. */
2578 if (GET_CODE (addr1
) == PLUS
)
2580 /* If not a REG, return zero. */
2581 if (GET_CODE (XEXP (addr1
, 0)) != REG
)
2585 reg1
= REGNO (XEXP (addr1
, 0));
2586 /* The offset must be constant! */
2587 if (GET_CODE (XEXP (addr1
, 1)) != CONST_INT
)
2589 offset1
= INTVAL (XEXP (addr1
, 1));
2592 else if (GET_CODE (addr1
) != REG
)
2596 reg1
= REGNO (addr1
);
2597 /* This was a simple (mem (reg)) expression. Offset is 0. */
2601 /* Make sure the second address is a (mem (plus (reg) (const_int). */
2602 if (GET_CODE (addr2
) != PLUS
)
2605 if (GET_CODE (XEXP (addr2
, 0)) != REG
2606 || GET_CODE (XEXP (addr2
, 1)) != CONST_INT
)
2609 /* Only %fp and %sp are allowed. Additionally both addresses must
2610 use the same register. */
2611 if (reg1
!= FRAME_POINTER_REGNUM
&& reg1
!= STACK_POINTER_REGNUM
)
2614 if (reg1
!= REGNO (XEXP (addr2
, 0)))
2617 /* The first offset must be evenly divisible by 8 to ensure the
2618 address is 64 bit aligned. */
2619 if (offset1
% 8 != 0)
2622 /* The offset for the second addr must be 4 more than the first addr. */
2623 if (INTVAL (XEXP (addr2
, 1)) != offset1
+ 4)
2626 /* All the tests passed. addr1 and addr2 are valid for ldd and std
2631 /* Return 1 if reg is a pseudo, or is the first register in
2632 a hard register pair. This makes it a candidate for use in
2633 ldd and std insns. */
2636 register_ok_for_ldd (reg
)
2640 /* We might have been passed a SUBREG. */
2641 if (GET_CODE (reg
) != REG
)
2644 if (REGNO (reg
) < FIRST_PSEUDO_REGISTER
)
2645 return (REGNO (reg
) % 2 == 0);
2651 /* Print operand X (an rtx) in assembler syntax to file FILE.
2652 CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
2653 For `%' followed by punctuation, CODE is the punctuation and X is null. */
2656 print_operand (file
, x
, code
)
2664 /* Output a 'nop' if there's nothing for the delay slot. */
2665 if (dbr_sequence_length () == 0)
2666 fputs ("\n\tnop", file
);
2669 /* Output an annul flag if there's nothing for the delay slot and we
2670 are optimizing. This is always used with '(' below. */
2671 /* Sun OS 4.1.1 dbx can't handle an annulled unconditional branch;
2672 this is a dbx bug. So, we only do this when optimizing. */
2673 if (dbr_sequence_length () == 0 && optimize
)
2677 /* Output a 'nop' if there's nothing for the delay slot and we are
2678 not optimizing. This is always used with '*' above. */
2679 if (dbr_sequence_length () == 0 && ! optimize
)
2680 fputs ("\n\tnop", file
);
2683 /* Adjust the operand to take into account a RESTORE operation. */
2684 if (GET_CODE (x
) != REG
)
2685 output_operand_lossage ("Invalid %%Y operand");
2686 else if (REGNO (x
) < 8)
2687 fputs (reg_names
[REGNO (x
)], file
);
2688 else if (REGNO (x
) >= 24 && REGNO (x
) < 32)
2689 fputs (reg_names
[REGNO (x
)-16], file
);
2691 output_operand_lossage ("Invalid %%Y operand");
2694 /* Print out the second register name of a register pair or quad.
2695 I.e., R (%o0) => %o1. */
2696 fputs (reg_names
[REGNO (x
)+1], file
);
2699 /* Print out the third register name of a register quad.
2700 I.e., S (%o0) => %o2. */
2701 fputs (reg_names
[REGNO (x
)+2], file
);
2704 /* Print out the fourth register name of a register quad.
2705 I.e., T (%o0) => %o3. */
2706 fputs (reg_names
[REGNO (x
)+3], file
);
2709 /* Print the operand's address only. */
2710 output_address (XEXP (x
, 0));
2713 /* In this case we need a register. Use %g0 if the
2714 operand is const0_rtx. */
2716 || (GET_MODE (x
) != VOIDmode
&& x
== CONST0_RTX (GET_MODE (x
))))
2718 fputs ("%g0", file
);
2725 switch (GET_CODE (x
))
2727 case IOR
: fputs ("or", file
); break;
2728 case AND
: fputs ("and", file
); break;
2729 case XOR
: fputs ("xor", file
); break;
2730 default: output_operand_lossage ("Invalid %%A operand");
2735 switch (GET_CODE (x
))
2737 case IOR
: fputs ("orn", file
); break;
2738 case AND
: fputs ("andn", file
); break;
2739 case XOR
: fputs ("xnor", file
); break;
2740 default: output_operand_lossage ("Invalid %%B operand");
2746 /* Print a sign-extended character. */
2747 int i
= INTVAL (x
) & 0xff;
2750 fprintf (file
, "%d", i
);
2755 /* Do nothing special. */
2759 /* Undocumented flag. */
2760 output_operand_lossage ("invalid operand output code");
2763 if (GET_CODE (x
) == REG
)
2764 fputs (reg_names
[REGNO (x
)], file
);
2765 else if (GET_CODE (x
) == MEM
)
2768 if (CONSTANT_P (XEXP (x
, 0)))
2769 /* Poor Sun assembler doesn't understand absolute addressing. */
2770 fputs ("%g0+", file
);
2771 output_address (XEXP (x
, 0));
2774 else if (GET_CODE (x
) == HIGH
)
2776 fputs ("%hi(", file
);
2777 output_addr_const (file
, XEXP (x
, 0));
2780 else if (GET_CODE (x
) == LO_SUM
)
2782 print_operand (file
, XEXP (x
, 0), 0);
2783 fputs ("+%lo(", file
);
2784 output_addr_const (file
, XEXP (x
, 1));
2787 else if (GET_CODE (x
) == CONST_DOUBLE
2788 && (GET_MODE (x
) == VOIDmode
2789 || GET_MODE_CLASS (GET_MODE (x
)) == MODE_INT
))
2791 if (CONST_DOUBLE_HIGH (x
) == 0)
2792 fprintf (file
, "%u", CONST_DOUBLE_LOW (x
));
2793 else if (CONST_DOUBLE_HIGH (x
) == -1
2794 && CONST_DOUBLE_LOW (x
) < 0)
2795 fprintf (file
, "%d", CONST_DOUBLE_LOW (x
));
2797 output_operand_lossage ("long long constant not a valid immediate operand");
2799 else if (GET_CODE (x
) == CONST_DOUBLE
)
2800 output_operand_lossage ("floating point constant not a valid immediate operand");
2801 else { output_addr_const (file
, x
); }
2804 /* This function outputs assembler code for VALUE to FILE, where VALUE is
2805 a 64 bit (DImode) value. */
2807 /* ??? If there is a 64 bit counterpart to .word that the assembler
2808 understands, then using that would simply this code greatly. */
2811 output_double_int (file
, value
)
2815 if (GET_CODE (value
) == CONST_INT
)
2817 if (INTVAL (value
) < 0)
2818 ASM_OUTPUT_INT (file
, constm1_rtx
);
2820 ASM_OUTPUT_INT (file
, const0_rtx
);
2821 ASM_OUTPUT_INT (file
, value
);
2823 else if (GET_CODE (value
) == CONST_DOUBLE
)
2825 ASM_OUTPUT_INT (file
, gen_rtx (CONST_INT
, VOIDmode
,
2826 CONST_DOUBLE_HIGH (value
)));
2827 ASM_OUTPUT_INT (file
, gen_rtx (CONST_INT
, VOIDmode
,
2828 CONST_DOUBLE_LOW (value
)));
2830 else if (GET_CODE (value
) == SYMBOL_REF
2831 || GET_CODE (value
) == CONST
2832 || GET_CODE (value
) == PLUS
)
2834 /* Addresses are only 32 bits. */
2835 ASM_OUTPUT_INT (file
, const0_rtx
);
2836 ASM_OUTPUT_INT (file
, value
);
2842 #ifndef CHAR_TYPE_SIZE
2843 #define CHAR_TYPE_SIZE BITS_PER_UNIT
2846 #ifndef SHORT_TYPE_SIZE
2847 #define SHORT_TYPE_SIZE (BITS_PER_UNIT * 2)
2850 #ifndef INT_TYPE_SIZE
2851 #define INT_TYPE_SIZE BITS_PER_WORD
2854 #ifndef LONG_TYPE_SIZE
2855 #define LONG_TYPE_SIZE BITS_PER_WORD
2858 #ifndef LONG_LONG_TYPE_SIZE
2859 #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
2862 #ifndef FLOAT_TYPE_SIZE
2863 #define FLOAT_TYPE_SIZE BITS_PER_WORD
2866 #ifndef DOUBLE_TYPE_SIZE
2867 #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
2870 #ifndef LONG_DOUBLE_TYPE_SIZE
2871 #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
2875 sparc_type_code (type
)
2878 register unsigned long qualifiers
= 0;
2879 register unsigned shift
= 6;
2883 switch (TREE_CODE (type
))
2889 qualifiers
|= (3 << shift
);
2891 type
= TREE_TYPE (type
);
2896 qualifiers
|= (2 << shift
);
2898 type
= TREE_TYPE (type
);
2902 case REFERENCE_TYPE
:
2904 qualifiers
|= (1 << shift
);
2906 type
= TREE_TYPE (type
);
2910 return (qualifiers
| 8);
2913 return (qualifiers
| 9);
2916 return (qualifiers
| 10);
2919 return (qualifiers
| 16);
2922 /* Carefully distinguish all the standard types of C,
2923 without messing up if the language is not C.
2924 Note that we check only for the names that contain spaces;
2925 other names might occur by coincidence in other languages. */
2926 if (TYPE_NAME (type
) != 0
2927 && TREE_CODE (TYPE_NAME (type
)) == TYPE_DECL
2928 && DECL_NAME (TYPE_NAME (type
)) != 0
2929 && TREE_CODE (DECL_NAME (TYPE_NAME (type
))) == IDENTIFIER_NODE
)
2931 char *name
= IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type
)));
2933 if (!strcmp (name
, "unsigned char"))
2934 return (qualifiers
| 12);
2935 if (!strcmp (name
, "signed char"))
2936 return (qualifiers
| 2);
2937 if (!strcmp (name
, "unsigned int"))
2938 return (qualifiers
| 14);
2939 if (!strcmp (name
, "short int"))
2940 return (qualifiers
| 3);
2941 if (!strcmp (name
, "short unsigned int"))
2942 return (qualifiers
| 13);
2943 if (!strcmp (name
, "long int"))
2944 return (qualifiers
| 5);
2945 if (!strcmp (name
, "long unsigned int"))
2946 return (qualifiers
| 15);
2947 if (!strcmp (name
, "long long int"))
2948 return (qualifiers
| 5); /* Who knows? */
2949 if (!strcmp (name
, "long long unsigned int"))
2950 return (qualifiers
| 15); /* Who knows? */
2953 /* Most integer types will be sorted out above, however, for the
2954 sake of special `array index' integer types, the following code
2955 is also provided. */
2957 if (TYPE_PRECISION (type
) == INT_TYPE_SIZE
)
2958 return (qualifiers
| (TREE_UNSIGNED (type
) ? 14 : 4));
2960 if (TYPE_PRECISION (type
) == LONG_TYPE_SIZE
)
2961 return (qualifiers
| (TREE_UNSIGNED (type
) ? 15 : 5));
2963 if (TYPE_PRECISION (type
) == LONG_LONG_TYPE_SIZE
)
2964 return (qualifiers
| (TREE_UNSIGNED (type
) ? 15 : 5));
2966 if (TYPE_PRECISION (type
) == SHORT_TYPE_SIZE
)
2967 return (qualifiers
| (TREE_UNSIGNED (type
) ? 13 : 3));
2969 if (TYPE_PRECISION (type
) == CHAR_TYPE_SIZE
)
2970 return (qualifiers
| (TREE_UNSIGNED (type
) ? 12 : 2));
2975 /* Carefully distinguish all the standard types of C,
2976 without messing up if the language is not C. */
2977 if (TYPE_NAME (type
) != 0
2978 && TREE_CODE (TYPE_NAME (type
)) == TYPE_DECL
2979 && DECL_NAME (TYPE_NAME (type
)) != 0
2980 && TREE_CODE (DECL_NAME (TYPE_NAME (type
))) == IDENTIFIER_NODE
)
2982 char *name
= IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type
)));
2984 if (!strcmp (name
, "long double"))
2985 return (qualifiers
| 7); /* Who knows? */
2988 if (TYPE_PRECISION (type
) == DOUBLE_TYPE_SIZE
)
2989 return (qualifiers
| 7);
2990 if (TYPE_PRECISION (type
) == FLOAT_TYPE_SIZE
)
2991 return (qualifiers
| 6);
2992 if (TYPE_PRECISION (type
) == LONG_DOUBLE_TYPE_SIZE
)
2993 return (qualifiers
| 7); /* Who knows? */
2996 case COMPLEX_TYPE
: /* GNU Fortran COMPLEX type. */
2997 /* ??? We need to distinguish between double and float complex types,
2998 but I don't know how yet because I can't reach this code from
2999 existing front-ends. */
3000 return (qualifiers
| 7); /* Who knows? */
3002 case CHAR_TYPE
: /* GNU Pascal CHAR type. Not used in C. */
3003 case BOOLEAN_TYPE
: /* GNU Fortran BOOLEAN type. */
3004 case FILE_TYPE
: /* GNU Pascal FILE type. */
3005 case STRING_TYPE
: /* GNU Fortran STRING type. */
3006 case SET_TYPE
: /* GNU Pascal SET type. */
3007 case LANG_TYPE
: /* ? */
3011 abort (); /* Not a type! */
3016 /* Subroutines to support a flat (single) register window calling
3019 /* Single-register window sparc stack frames look like:
3021 Before call After call
3022 +-----------------------+ +-----------------------+
3025 | caller's temps. | | caller's temps. |
3027 +-----------------------+ +-----------------------+
3029 | arguments on stack. | | arguments on stack. |
3031 +-----------------------+ +-----------------------+
3032 | 6 words to save | | 6 words to save |
3033 | arguments passed | | arguments passed |
3034 | in registers, even | | in registers, even |
3035 SP+68->| if not passed. |FP+68->| if not passed. |
3036 +-----------------------+ +-----------------------+
3037 | 1 word struct addr |FP+64->| 1 word struct addr |
3038 +-----------------------+ +-----------------------+
3040 | 16 word reg save area | | 16 word reg save area |
3042 +-----------------------+ +-----------------------+
3044 FP-16->| fp/alu reg moves |
3045 +-----------------------+
3049 +-----------------------+
3051 | fp register save |
3053 +-----------------------+
3055 | gp register save |
3057 +-----------------------+
3059 | alloca allocations |
3061 +-----------------------+
3063 | arguments on stack |
3065 +-----------------------+
3067 | arguments passed |
3068 | in registers, even |
3069 low SP+68->| if not passed. |
3070 memory +-----------------------+
3071 SP+64->| 1 word struct addr |
3072 +-----------------------+
3074 I 16 word reg save area |
3076 +-----------------------+ */
3078 /* Structure to be filled in by sparc_frw_compute_frame_size with register
3079 save masks, and offsets for the current function. */
3081 struct sparc_frame_info
3083 unsigned long total_size
; /* # bytes that the entire frame takes up. */
3084 unsigned long var_size
; /* # bytes that variables take up. */
3085 unsigned long args_size
; /* # bytes that outgoing arguments take up. */
3086 unsigned long extra_size
; /* # bytes of extra gunk. */
3087 unsigned int gp_reg_size
; /* # bytes needed to store gp regs. */
3088 unsigned int fp_reg_size
; /* # bytes needed to store fp regs. */
3089 unsigned long mask
; /* Mask of saved gp registers. */
3090 unsigned long fmask
; /* Mask of saved fp registers. */
3091 unsigned long gp_sp_offset
; /* Offset from new sp to store gp regs. */
3092 unsigned long fp_sp_offset
; /* Offset from new sp to store fp regs. */
3093 int initialized
; /* Nonzero if frame size already calculated. */
3096 /* Current frame information calculated by sparc_frw_compute_frame_size. */
3097 struct sparc_frame_info current_frame_info
;
3099 /* Zero structure to initialize current_frame_info. */
3100 struct sparc_frame_info zero_frame_info
;
3102 /* Tell prologue and epilogue if register REGNO should be saved / restored. */
3104 #define MUST_SAVE_REGISTER(regno) \
3105 ((regs_ever_live[regno] && !call_used_regs[regno]) \
3106 || (regno == FRAME_POINTER_REGNUM && frame_pointer_needed) \
3107 || (regno == 15 && regs_ever_live[15]))
3109 /* Return the bytes needed to compute the frame pointer from the current
3113 sparc_frw_compute_frame_size (size
)
3114 int size
; /* # of var. bytes allocated. */
3117 unsigned long total_size
; /* # bytes that the entire frame takes up. */
3118 unsigned long var_size
; /* # bytes that variables take up. */
3119 unsigned long args_size
; /* # bytes that outgoing arguments take up. */
3120 unsigned long extra_size
; /* # extra bytes. */
3121 unsigned int gp_reg_size
; /* # bytes needed to store gp regs. */
3122 unsigned int fp_reg_size
; /* # bytes needed to store fp regs. */
3123 unsigned long mask
; /* Mask of saved gp registers. */
3124 unsigned long fmask
; /* Mask of saved fp registers. */
3126 /* This is the size of the 16 word reg save area, 1 word struct addr
3127 area, and 4 word fp/alu register copy area. */
3128 extra_size
= -STARTING_FRAME_OFFSET
+ FIRST_PARM_OFFSET(0);
3130 /* Also include the size needed for the 6 parameter registers. */
3131 args_size
= current_function_outgoing_args_size
+ 24;
3132 total_size
= var_size
+ args_size
+ extra_size
;
3138 /* Calculate space needed for gp registers. */
3139 for (regno
= 1; regno
<= 31; regno
++)
3141 if (MUST_SAVE_REGISTER (regno
))
3143 if ((regno
& 0x1) == 0 && MUST_SAVE_REGISTER (regno
+1))
3145 if (gp_reg_size
% 8 != 0)
3146 gp_reg_size
+= UNITS_PER_WORD
;
3147 gp_reg_size
+= 2 * UNITS_PER_WORD
;
3153 gp_reg_size
+= UNITS_PER_WORD
;
3158 /* Add extra word in case we have to align the space to a double word
3160 if (gp_reg_size
!= 0)
3161 gp_reg_size
+= UNITS_PER_WORD
;
3163 /* Calculate space needed for fp registers. */
3164 for (regno
= 32; regno
<= 63; regno
++)
3166 if (regs_ever_live
[regno
] && !call_used_regs
[regno
])
3168 fp_reg_size
+= UNITS_PER_WORD
;
3169 fmask
|= 1 << (regno
- 32);
3173 total_size
+= gp_reg_size
+ fp_reg_size
;
3175 if (total_size
== extra_size
)
3176 total_size
= extra_size
= 0;
3178 total_size
= SPARC_STACK_ALIGN (total_size
);
3180 /* Save other computed information. */
3181 current_frame_info
.total_size
= total_size
;
3182 current_frame_info
.var_size
= var_size
;
3183 current_frame_info
.args_size
= args_size
;
3184 current_frame_info
.extra_size
= extra_size
;
3185 current_frame_info
.gp_reg_size
= gp_reg_size
;
3186 current_frame_info
.fp_reg_size
= fp_reg_size
;
3187 current_frame_info
.mask
= mask
;
3188 current_frame_info
.fmask
= fmask
;
3189 current_frame_info
.initialized
= reload_completed
;
3193 unsigned long offset
= args_size
;
3195 offset
+= FIRST_PARM_OFFSET(0);
3196 current_frame_info
.gp_sp_offset
= offset
;
3201 unsigned long offset
= args_size
+ gp_reg_size
;
3203 offset
+= FIRST_PARM_OFFSET(0);
3204 current_frame_info
.fp_sp_offset
= offset
;
3207 /* Ok, we're done. */
3211 /* Common code to save/restore registers. */
3214 sparc_frw_save_restore (file
, word_op
, doubleword_op
)
3215 FILE *file
; /* Stream to write to. */
3216 char *word_op
; /* Operation to do for one word. */
3217 char *doubleword_op
; /* Operation to do for doubleword. */
3220 unsigned long mask
= current_frame_info
.mask
;
3221 unsigned long fmask
= current_frame_info
.fmask
;
3222 unsigned long gp_offset
;
3223 unsigned long fp_offset
;
3224 unsigned long max_offset
;
3227 if (mask
== 0 && fmask
== 0)
3230 base_reg
= reg_names
[STACK_POINTER_REGNUM
];
3231 gp_offset
= current_frame_info
.gp_sp_offset
;
3232 fp_offset
= current_frame_info
.fp_sp_offset
;
3233 max_offset
= (gp_offset
> fp_offset
) ? gp_offset
: fp_offset
;
3235 /* Deal with calling functions with a large structure. */
3236 if (max_offset
>= 4096)
3239 fprintf (file
, "\tset %ld,%s\n", max_offset
, temp
);
3240 fprintf (file
, "\tadd %s,%s,%s\n", temp
, base_reg
, temp
);
3242 gp_offset
= max_offset
- gp_offset
;
3243 fp_offset
= max_offset
- fp_offset
;
3246 /* Save registers starting from high to low. The debuggers prefer
3247 at least the return register be stored at func+4, and also it
3248 allows us not to need a nop in the epilog if at least one
3249 register is reloaded in addition to return address. */
3251 if (mask
|| frame_pointer_needed
)
3253 for (regno
= 1; regno
<= 31; regno
++)
3255 if ((mask
& (1L << regno
)) != 0
3256 || (regno
== FRAME_POINTER_REGNUM
&& frame_pointer_needed
))
3258 if ((regno
& 0x1) == 0 && ((mask
& (1L << (regno
+1))) != 0))
3260 if (gp_offset
% 8 != 0)
3261 gp_offset
+= UNITS_PER_WORD
;
3263 if (word_op
[0] == 's')
3264 fprintf (file
, "\t%s %s,[%s+%d]\n",
3265 doubleword_op
, reg_names
[regno
],
3266 base_reg
, gp_offset
);
3268 fprintf (file
, "\t%s [%s+%d],%s\n",
3269 doubleword_op
, base_reg
, gp_offset
,
3272 gp_offset
+= 2 * UNITS_PER_WORD
;
3277 if (word_op
[0] == 's')
3278 fprintf (file
, "\t%s %s,[%s+%d]\n",
3279 word_op
, reg_names
[regno
],
3280 base_reg
, gp_offset
);
3282 fprintf (file
, "\t%s [%s+%d],%s\n",
3283 word_op
, base_reg
, gp_offset
, reg_names
[regno
]);
3285 gp_offset
+= UNITS_PER_WORD
;
3293 for (regno
= 32; regno
<= 63; regno
++)
3295 if ((fmask
& (1L << (regno
- 32))) != 0)
3297 if (word_op
[0] == 's')
3298 fprintf (file
, "\t%s %s,[%s+%d]\n",
3299 word_op
, reg_names
[regno
],
3300 base_reg
, gp_offset
);
3302 fprintf (file
, "\t%s [%s+%d],%s\n",
3303 word_op
, base_reg
, gp_offset
, reg_names
[regno
]);
3305 fp_offset
+= UNITS_PER_WORD
;
3311 /* Set up the stack and frame (if desired) for the function. */
3314 sparc_frw_output_function_prologue (file
, size
, ignored
)
3318 extern char call_used_regs
[];
3320 char *sp_str
= reg_names
[STACK_POINTER_REGNUM
];
3322 /* ??? This should be %sp+actual_fsize for a leaf function. I think it
3323 works only because it is never used. */
3325 = (!frame_pointer_needed
) ? "%sp+80" : reg_names
[FRAME_POINTER_REGNUM
];
3327 fprintf (file
, "\t!#PROLOGUE# 0\n");
3329 size
= SPARC_STACK_ALIGN (size
);
3330 tsize
= (! current_frame_info
.initialized
3331 ? sparc_frw_compute_frame_size (size
)
3332 : current_frame_info
.total_size
);
3338 "\tsub %s,%d,%s\t\t!# vars= %d, regs= %d/%d, args = %d, extra= %d\n",
3339 sp_str
, tsize
, sp_str
, current_frame_info
.var_size
,
3340 current_frame_info
.gp_reg_size
/ 4,
3341 current_frame_info
.fp_reg_size
/ 8,
3342 current_function_outgoing_args_size
,
3343 current_frame_info
.extra_size
);
3346 "\tset %d,%s\n\tsub\t%s,%s,%s\t\t!# vars= %d, regs= %d/%d, args = %d, sfo= %d\n",
3347 tsize
, "%g1", sp_str
, "%g1",
3348 sp_str
, current_frame_info
.var_size
,
3349 current_frame_info
.gp_reg_size
/ 4,
3350 current_frame_info
.fp_reg_size
/ 8,
3351 current_function_outgoing_args_size
,
3352 current_frame_info
.extra_size
);
3355 sparc_frw_save_restore (file
, "st", "std");
3357 if (frame_pointer_needed
)
3360 fprintf (file
, "\tadd %s,%d,%s\t!# set up frame pointer\n", sp_str
,
3361 tsize
, frame_base_name
);
3363 fprintf (file
, "\tadd %s,%s,%s\t!# set up frame pointer\n", sp_str
,
3364 "%g1", frame_base_name
);
3368 /* Do any necessary cleanup after a function to restore stack, frame,
3372 sparc_frw_output_function_epilogue (file
, size
, ignored1
, ignored2
)
3376 extern FILE *asm_out_data_file
, *asm_out_file
;
3377 extern char call_used_regs
[];
3378 extern int frame_pointer_needed
;
3380 char *sp_str
= reg_names
[STACK_POINTER_REGNUM
];
3381 char *t1_str
= "%g1";
3382 rtx epilogue_delay
= current_function_epilogue_delay_list
;
3383 int noepilogue
= FALSE
;
3385 /* The epilogue does not depend on any registers, but the stack
3386 registers, so we assume that if we have 1 pending nop, it can be
3387 ignored, and 2 it must be filled (2 nops occur for integer
3388 multiply and divide). */
3390 size
= SPARC_STACK_ALIGN (size
);
3391 tsize
= (!current_frame_info
.initialized
3392 ? sparc_frw_compute_frame_size (size
)
3393 : current_frame_info
.total_size
);
3395 if (tsize
== 0 && epilogue_delay
== 0)
3397 rtx insn
= get_last_insn ();
3399 /* If the last insn was a BARRIER, we don't have to write any code
3400 because a jump (aka return) was put there. */
3401 if (GET_CODE (insn
) == NOTE
)
3402 insn
= prev_nonnote_insn (insn
);
3403 if (insn
&& GET_CODE (insn
) == BARRIER
)
3409 /* In the reload sequence, we don't need to fill the load delay
3410 slots for most of the loads, also see if we can fill the final
3411 delay slot if not otherwise filled by the reload sequence. */
3414 fprintf (file
, "\tset %d,%s\n", tsize
, t1_str
);
3416 if (frame_pointer_needed
)
3418 char *fp_str
= reg_names
[FRAME_POINTER_REGNUM
];
3420 fprintf (file
,"\tsub %s,%s,%s\t\t!# sp not trusted here\n",
3421 fp_str
, t1_str
, sp_str
);
3423 fprintf (file
,"\tsub %s,%d,%s\t\t!# sp not trusted here\n",
3424 fp_str
, tsize
, sp_str
);
3427 sparc_frw_save_restore (file
, "ld", "ldd");
3429 if (current_function_returns_struct
)
3430 fprintf (file
, "\tjmp %%o7+12\n");
3432 fprintf (file
, "\tretl\n");
3434 /* If the only register saved is the return address, we need a
3435 nop, unless we have an instruction to put into it. Otherwise
3436 we don't since reloading multiple registers doesn't reference
3437 the register being loaded. */
3443 final_scan_insn (XEXP (epilogue_delay
, 0), file
, 1, -2, 1);
3446 else if (tsize
> 4095)
3447 fprintf (file
, "\tadd %s,%s,%s\n", sp_str
, t1_str
, sp_str
);
3450 fprintf (file
, "\tadd %s,%d,%s\n", sp_str
, tsize
, sp_str
);
3453 fprintf (file
, "\tnop\n");
3456 /* Reset state info for each function. */
3457 current_frame_info
= zero_frame_info
;
3460 /* Define the number of delay slots needed for the function epilogue.
3462 On the sparc, we need a slot if either no stack has been allocated,
3463 or the only register saved is the return register. */
3466 sparc_frw_epilogue_delay_slots ()
3468 if (!current_frame_info
.initialized
)
3469 (void) sparc_frw_compute_frame_size (get_frame_size ());
3471 if (current_frame_info
.total_size
== 0)
3477 /* Return true is TRIAL is a valid insn for the epilogue delay slot.
3478 Any single length instruction which doesn't reference the stack or frame
3482 sparc_frw_eligible_for_epilogue_delay (trial
, slot
)
3486 if (get_attr_length (trial
) == 1
3487 && ! reg_mentioned_p (stack_pointer_rtx
, PATTERN (trial
))
3488 && ! reg_mentioned_p (frame_pointer_rtx
, PATTERN (trial
)))