1 /* Subroutines for manipulating rtx's in semantically interesting ways.
2 Copyright (C) 1987, 91, 94-97, 1998 Free Software Foundation, Inc.
4 This file is part of GNU CC.
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
28 #include "hard-reg-set.h"
29 #include "insn-config.h"
31 #include "insn-flags.h"
32 #include "insn-codes.h"
34 #if !defined PREFERRED_STACK_BOUNDARY && defined STACK_BOUNDARY
35 #define PREFERRED_STACK_BOUNDARY STACK_BOUNDARY
38 static rtx break_out_memory_refs
PROTO((rtx
));
39 static void emit_stack_probe
PROTO((rtx
));
40 /* Return an rtx for the sum of X and the integer C.
42 This function should be used via the `plus_constant' macro. */
45 plus_constant_wide (x
, c
)
47 register HOST_WIDE_INT c
;
49 register RTX_CODE code
;
50 register enum machine_mode mode
;
64 return GEN_INT (INTVAL (x
) + c
);
68 HOST_WIDE_INT l1
= CONST_DOUBLE_LOW (x
);
69 HOST_WIDE_INT h1
= CONST_DOUBLE_HIGH (x
);
71 HOST_WIDE_INT h2
= c
< 0 ? ~0 : 0;
74 add_double (l1
, h1
, l2
, h2
, &lv
, &hv
);
76 return immed_double_const (lv
, hv
, VOIDmode
);
80 /* If this is a reference to the constant pool, try replacing it with
81 a reference to a new constant. If the resulting address isn't
82 valid, don't return it because we have no way to validize it. */
83 if (GET_CODE (XEXP (x
, 0)) == SYMBOL_REF
84 && CONSTANT_POOL_ADDRESS_P (XEXP (x
, 0)))
86 /* Any rtl we create here must go in a saveable obstack, since
87 we might have been called from within combine. */
88 push_obstacks_nochange ();
89 rtl_in_saveable_obstack ();
91 = force_const_mem (GET_MODE (x
),
92 plus_constant (get_pool_constant (XEXP (x
, 0)),
95 if (memory_address_p (GET_MODE (tem
), XEXP (tem
, 0)))
101 /* If adding to something entirely constant, set a flag
102 so that we can add a CONST around the result. */
113 /* The interesting case is adding the integer to a sum.
114 Look for constant term in the sum and combine
115 with C. For an integer constant term, we make a combined
116 integer. For a constant term that is not an explicit integer,
117 we cannot really combine, but group them together anyway.
119 Restart or use a recursive call in case the remaining operand is
120 something that we handle specially, such as a SYMBOL_REF.
122 We may not immediately return from the recursive call here, lest
123 all_constant gets lost. */
125 if (GET_CODE (XEXP (x
, 1)) == CONST_INT
)
127 c
+= INTVAL (XEXP (x
, 1));
131 else if (CONSTANT_P (XEXP (x
, 0)))
133 x
= gen_rtx_PLUS (mode
,
134 plus_constant (XEXP (x
, 0), c
),
138 else if (CONSTANT_P (XEXP (x
, 1)))
140 x
= gen_rtx_PLUS (mode
,
142 plus_constant (XEXP (x
, 1), c
));
152 x
= gen_rtx_PLUS (mode
, x
, GEN_INT (c
));
154 if (GET_CODE (x
) == SYMBOL_REF
|| GET_CODE (x
) == LABEL_REF
)
156 else if (all_constant
)
157 return gen_rtx_CONST (mode
, x
);
162 /* This is the same as `plus_constant', except that it handles LO_SUM.
164 This function should be used via the `plus_constant_for_output' macro. */
167 plus_constant_for_output_wide (x
, c
)
169 register HOST_WIDE_INT c
;
171 register enum machine_mode mode
= GET_MODE (x
);
173 if (GET_CODE (x
) == LO_SUM
)
174 return gen_rtx_LO_SUM (mode
, XEXP (x
, 0),
175 plus_constant_for_output (XEXP (x
, 1), c
));
178 return plus_constant (x
, c
);
181 /* If X is a sum, return a new sum like X but lacking any constant terms.
182 Add all the removed constant terms into *CONSTPTR.
183 X itself is not altered. The result != X if and only if
184 it is not isomorphic to X. */
187 eliminate_constant_term (x
, constptr
)
194 if (GET_CODE (x
) != PLUS
)
197 /* First handle constants appearing at this level explicitly. */
198 if (GET_CODE (XEXP (x
, 1)) == CONST_INT
199 && 0 != (tem
= simplify_binary_operation (PLUS
, GET_MODE (x
), *constptr
,
201 && GET_CODE (tem
) == CONST_INT
)
204 return eliminate_constant_term (XEXP (x
, 0), constptr
);
208 x0
= eliminate_constant_term (XEXP (x
, 0), &tem
);
209 x1
= eliminate_constant_term (XEXP (x
, 1), &tem
);
210 if ((x1
!= XEXP (x
, 1) || x0
!= XEXP (x
, 0))
211 && 0 != (tem
= simplify_binary_operation (PLUS
, GET_MODE (x
),
213 && GET_CODE (tem
) == CONST_INT
)
216 return gen_rtx_PLUS (GET_MODE (x
), x0
, x1
);
222 /* Returns the insn that next references REG after INSN, or 0
223 if REG is clobbered before next referenced or we cannot find
224 an insn that references REG in a straight-line piece of code. */
227 find_next_ref (reg
, insn
)
233 for (insn
= NEXT_INSN (insn
); insn
; insn
= next
)
235 next
= NEXT_INSN (insn
);
236 if (GET_CODE (insn
) == NOTE
)
238 if (GET_CODE (insn
) == CODE_LABEL
239 || GET_CODE (insn
) == BARRIER
)
241 if (GET_CODE (insn
) == INSN
242 || GET_CODE (insn
) == JUMP_INSN
243 || GET_CODE (insn
) == CALL_INSN
)
245 if (reg_set_p (reg
, insn
))
247 if (reg_mentioned_p (reg
, PATTERN (insn
)))
249 if (GET_CODE (insn
) == JUMP_INSN
)
251 if (simplejump_p (insn
))
252 next
= JUMP_LABEL (insn
);
256 if (GET_CODE (insn
) == CALL_INSN
257 && REGNO (reg
) < FIRST_PSEUDO_REGISTER
258 && call_used_regs
[REGNO (reg
)])
267 /* Return an rtx for the size in bytes of the value of EXP. */
273 tree size
= size_in_bytes (TREE_TYPE (exp
));
275 if (TREE_CODE (size
) != INTEGER_CST
276 && contains_placeholder_p (size
))
277 size
= build (WITH_RECORD_EXPR
, sizetype
, size
, exp
);
279 return expand_expr (size
, NULL_RTX
, TYPE_MODE (sizetype
),
280 EXPAND_MEMORY_USE_BAD
);
283 /* Return a copy of X in which all memory references
284 and all constants that involve symbol refs
285 have been replaced with new temporary registers.
286 Also emit code to load the memory locations and constants
287 into those registers.
289 If X contains no such constants or memory references,
290 X itself (not a copy) is returned.
292 If a constant is found in the address that is not a legitimate constant
293 in an insn, it is left alone in the hope that it might be valid in the
296 X may contain no arithmetic except addition, subtraction and multiplication.
297 Values returned by expand_expr with 1 for sum_ok fit this constraint. */
300 break_out_memory_refs (x
)
303 if (GET_CODE (x
) == MEM
304 || (CONSTANT_P (x
) && CONSTANT_ADDRESS_P (x
)
305 && GET_MODE (x
) != VOIDmode
))
306 x
= force_reg (GET_MODE (x
), x
);
307 else if (GET_CODE (x
) == PLUS
|| GET_CODE (x
) == MINUS
308 || GET_CODE (x
) == MULT
)
310 register rtx op0
= break_out_memory_refs (XEXP (x
, 0));
311 register rtx op1
= break_out_memory_refs (XEXP (x
, 1));
313 if (op0
!= XEXP (x
, 0) || op1
!= XEXP (x
, 1))
314 x
= gen_rtx_fmt_ee (GET_CODE (x
), Pmode
, op0
, op1
);
320 #ifdef POINTERS_EXTEND_UNSIGNED
322 /* Given X, a memory address in ptr_mode, convert it to an address
323 in Pmode, or vice versa (TO_MODE says which way). We take advantage of
324 the fact that pointers are not allowed to overflow by commuting arithmetic
325 operations over conversions so that address arithmetic insns can be
329 convert_memory_address (to_mode
, x
)
330 enum machine_mode to_mode
;
333 enum machine_mode from_mode
= to_mode
== ptr_mode
? Pmode
: ptr_mode
;
336 /* Here we handle some special cases. If none of them apply, fall through
337 to the default case. */
338 switch (GET_CODE (x
))
345 temp
= gen_rtx_LABEL_REF (to_mode
, XEXP (x
, 0));
346 LABEL_REF_NONLOCAL_P (temp
) = LABEL_REF_NONLOCAL_P (x
);
350 temp
= gen_rtx_SYMBOL_REF (to_mode
, XSTR (x
, 0));
351 SYMBOL_REF_FLAG (temp
) = SYMBOL_REF_FLAG (x
);
352 CONSTANT_POOL_ADDRESS_P (temp
) = CONSTANT_POOL_ADDRESS_P (x
);
356 return gen_rtx_CONST (to_mode
,
357 convert_memory_address (to_mode
, XEXP (x
, 0)));
361 /* For addition the second operand is a small constant, we can safely
362 permute the conversion and addition operation. We can always safely
363 permute them if we are making the address narrower. In addition,
364 always permute the operations if this is a constant. */
365 if (GET_MODE_SIZE (to_mode
) < GET_MODE_SIZE (from_mode
)
366 || (GET_CODE (x
) == PLUS
&& GET_CODE (XEXP (x
, 1)) == CONST_INT
367 && (INTVAL (XEXP (x
, 1)) + 20000 < 40000
368 || CONSTANT_P (XEXP (x
, 0)))))
369 return gen_rtx_fmt_ee (GET_CODE (x
), to_mode
,
370 convert_memory_address (to_mode
, XEXP (x
, 0)),
371 convert_memory_address (to_mode
, XEXP (x
, 1)));
378 return convert_modes (to_mode
, from_mode
,
379 x
, POINTERS_EXTEND_UNSIGNED
);
383 /* Given a memory address or facsimile X, construct a new address,
384 currently equivalent, that is stable: future stores won't change it.
386 X must be composed of constants, register and memory references
387 combined with addition, subtraction and multiplication:
388 in other words, just what you can get from expand_expr if sum_ok is 1.
390 Works by making copies of all regs and memory locations used
391 by X and combining them the same way X does.
392 You could also stabilize the reference to this address
393 by copying the address to a register with copy_to_reg;
394 but then you wouldn't get indexed addressing in the reference. */
400 if (GET_CODE (x
) == REG
)
402 if (REGNO (x
) != FRAME_POINTER_REGNUM
403 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
404 && REGNO (x
) != HARD_FRAME_POINTER_REGNUM
409 else if (GET_CODE (x
) == MEM
)
411 else if (GET_CODE (x
) == PLUS
|| GET_CODE (x
) == MINUS
412 || GET_CODE (x
) == MULT
)
414 register rtx op0
= copy_all_regs (XEXP (x
, 0));
415 register rtx op1
= copy_all_regs (XEXP (x
, 1));
416 if (op0
!= XEXP (x
, 0) || op1
!= XEXP (x
, 1))
417 x
= gen_rtx_fmt_ee (GET_CODE (x
), Pmode
, op0
, op1
);
422 /* Return something equivalent to X but valid as a memory address
423 for something of mode MODE. When X is not itself valid, this
424 works by copying X or subexpressions of it into registers. */
427 memory_address (mode
, x
)
428 enum machine_mode mode
;
431 register rtx oldx
= x
;
433 if (GET_CODE (x
) == ADDRESSOF
)
436 #ifdef POINTERS_EXTEND_UNSIGNED
437 if (GET_MODE (x
) == ptr_mode
)
438 x
= convert_memory_address (Pmode
, x
);
441 /* By passing constant addresses thru registers
442 we get a chance to cse them. */
443 if (! cse_not_expected
&& CONSTANT_P (x
) && CONSTANT_ADDRESS_P (x
))
444 x
= force_reg (Pmode
, x
);
446 /* Accept a QUEUED that refers to a REG
447 even though that isn't a valid address.
448 On attempting to put this in an insn we will call protect_from_queue
449 which will turn it into a REG, which is valid. */
450 else if (GET_CODE (x
) == QUEUED
451 && GET_CODE (QUEUED_VAR (x
)) == REG
)
454 /* We get better cse by rejecting indirect addressing at this stage.
455 Let the combiner create indirect addresses where appropriate.
456 For now, generate the code so that the subexpressions useful to share
457 are visible. But not if cse won't be done! */
460 if (! cse_not_expected
&& GET_CODE (x
) != REG
)
461 x
= break_out_memory_refs (x
);
463 /* At this point, any valid address is accepted. */
464 GO_IF_LEGITIMATE_ADDRESS (mode
, x
, win
);
466 /* If it was valid before but breaking out memory refs invalidated it,
467 use it the old way. */
468 if (memory_address_p (mode
, oldx
))
471 /* Perform machine-dependent transformations on X
472 in certain cases. This is not necessary since the code
473 below can handle all possible cases, but machine-dependent
474 transformations can make better code. */
475 LEGITIMIZE_ADDRESS (x
, oldx
, mode
, win
);
477 /* PLUS and MULT can appear in special ways
478 as the result of attempts to make an address usable for indexing.
479 Usually they are dealt with by calling force_operand, below.
480 But a sum containing constant terms is special
481 if removing them makes the sum a valid address:
482 then we generate that address in a register
483 and index off of it. We do this because it often makes
484 shorter code, and because the addresses thus generated
485 in registers often become common subexpressions. */
486 if (GET_CODE (x
) == PLUS
)
488 rtx constant_term
= const0_rtx
;
489 rtx y
= eliminate_constant_term (x
, &constant_term
);
490 if (constant_term
== const0_rtx
491 || ! memory_address_p (mode
, y
))
492 x
= force_operand (x
, NULL_RTX
);
495 y
= gen_rtx_PLUS (GET_MODE (x
), copy_to_reg (y
), constant_term
);
496 if (! memory_address_p (mode
, y
))
497 x
= force_operand (x
, NULL_RTX
);
503 else if (GET_CODE (x
) == MULT
|| GET_CODE (x
) == MINUS
)
504 x
= force_operand (x
, NULL_RTX
);
506 /* If we have a register that's an invalid address,
507 it must be a hard reg of the wrong class. Copy it to a pseudo. */
508 else if (GET_CODE (x
) == REG
)
511 /* Last resort: copy the value to a register, since
512 the register is a valid address. */
514 x
= force_reg (Pmode
, x
);
521 if (flag_force_addr
&& ! cse_not_expected
&& GET_CODE (x
) != REG
522 /* Don't copy an addr via a reg if it is one of our stack slots. */
523 && ! (GET_CODE (x
) == PLUS
524 && (XEXP (x
, 0) == virtual_stack_vars_rtx
525 || XEXP (x
, 0) == virtual_incoming_args_rtx
)))
527 if (general_operand (x
, Pmode
))
528 x
= force_reg (Pmode
, x
);
530 x
= force_operand (x
, NULL_RTX
);
536 /* If we didn't change the address, we are done. Otherwise, mark
537 a reg as a pointer if we have REG or REG + CONST_INT. */
540 else if (GET_CODE (x
) == REG
)
541 mark_reg_pointer (x
, 1);
542 else if (GET_CODE (x
) == PLUS
543 && GET_CODE (XEXP (x
, 0)) == REG
544 && GET_CODE (XEXP (x
, 1)) == CONST_INT
)
545 mark_reg_pointer (XEXP (x
, 0), 1);
547 /* OLDX may have been the address on a temporary. Update the address
548 to indicate that X is now used. */
549 update_temp_slot_address (oldx
, x
);
554 /* Like `memory_address' but pretend `flag_force_addr' is 0. */
557 memory_address_noforce (mode
, x
)
558 enum machine_mode mode
;
561 int ambient_force_addr
= flag_force_addr
;
565 val
= memory_address (mode
, x
);
566 flag_force_addr
= ambient_force_addr
;
570 /* Convert a mem ref into one with a valid memory address.
571 Pass through anything else unchanged. */
577 if (GET_CODE (ref
) != MEM
)
579 if (memory_address_p (GET_MODE (ref
), XEXP (ref
, 0)))
581 /* Don't alter REF itself, since that is probably a stack slot. */
582 return change_address (ref
, GET_MODE (ref
), XEXP (ref
, 0));
585 /* Return a modified copy of X with its memory address copied
586 into a temporary register to protect it from side effects.
587 If X is not a MEM, it is returned unchanged (and not copied).
588 Perhaps even if it is a MEM, if there is no need to change it. */
595 if (GET_CODE (x
) != MEM
)
598 if (rtx_unstable_p (addr
))
600 rtx temp
= copy_all_regs (addr
);
602 if (GET_CODE (temp
) != REG
)
603 temp
= copy_to_reg (temp
);
604 mem
= gen_rtx_MEM (GET_MODE (x
), temp
);
606 /* Mark returned memref with in_struct if it's in an array or
607 structure. Copy const and volatile from original memref. */
609 MEM_IN_STRUCT_P (mem
) = MEM_IN_STRUCT_P (x
) || GET_CODE (addr
) == PLUS
;
610 RTX_UNCHANGING_P (mem
) = RTX_UNCHANGING_P (x
);
611 MEM_VOLATILE_P (mem
) = MEM_VOLATILE_P (x
);
613 /* Since the new MEM is just like the old X, it can alias only
614 the things that X could. */
615 MEM_ALIAS_SET (mem
) = MEM_ALIAS_SET (x
);
622 /* Copy the value or contents of X to a new temp reg and return that reg. */
628 register rtx temp
= gen_reg_rtx (GET_MODE (x
));
630 /* If not an operand, must be an address with PLUS and MULT so
631 do the computation. */
632 if (! general_operand (x
, VOIDmode
))
633 x
= force_operand (x
, temp
);
636 emit_move_insn (temp
, x
);
641 /* Like copy_to_reg but always give the new register mode Pmode
642 in case X is a constant. */
648 return copy_to_mode_reg (Pmode
, x
);
651 /* Like copy_to_reg but always give the new register mode MODE
652 in case X is a constant. */
655 copy_to_mode_reg (mode
, x
)
656 enum machine_mode mode
;
659 register rtx temp
= gen_reg_rtx (mode
);
661 /* If not an operand, must be an address with PLUS and MULT so
662 do the computation. */
663 if (! general_operand (x
, VOIDmode
))
664 x
= force_operand (x
, temp
);
666 if (GET_MODE (x
) != mode
&& GET_MODE (x
) != VOIDmode
)
669 emit_move_insn (temp
, x
);
673 /* Load X into a register if it is not already one.
674 Use mode MODE for the register.
675 X should be valid for mode MODE, but it may be a constant which
676 is valid for all integer modes; that's why caller must specify MODE.
678 The caller must not alter the value in the register we return,
679 since we mark it as a "constant" register. */
683 enum machine_mode mode
;
686 register rtx temp
, insn
, set
;
688 if (GET_CODE (x
) == REG
)
690 temp
= gen_reg_rtx (mode
);
691 insn
= emit_move_insn (temp
, x
);
693 /* Let optimizers know that TEMP's value never changes
694 and that X can be substituted for it. Don't get confused
695 if INSN set something else (such as a SUBREG of TEMP). */
697 && (set
= single_set (insn
)) != 0
698 && SET_DEST (set
) == temp
)
700 rtx note
= find_reg_note (insn
, REG_EQUAL
, NULL_RTX
);
705 REG_NOTES (insn
) = gen_rtx_EXPR_LIST (REG_EQUAL
, x
, REG_NOTES (insn
));
710 /* If X is a memory ref, copy its contents to a new temp reg and return
711 that reg. Otherwise, return X. */
718 if (GET_CODE (x
) != MEM
|| GET_MODE (x
) == BLKmode
)
720 temp
= gen_reg_rtx (GET_MODE (x
));
721 emit_move_insn (temp
, x
);
725 /* Copy X to TARGET (if it's nonzero and a reg)
726 or to a new temp reg and return that reg.
727 MODE is the mode to use for X in case it is a constant. */
730 copy_to_suggested_reg (x
, target
, mode
)
732 enum machine_mode mode
;
736 if (target
&& GET_CODE (target
) == REG
)
739 temp
= gen_reg_rtx (mode
);
741 emit_move_insn (temp
, x
);
745 /* Return the mode to use to store a scalar of TYPE and MODE.
746 PUNSIGNEDP points to the signedness of the type and may be adjusted
747 to show what signedness to use on extension operations.
749 FOR_CALL is non-zero if this call is promoting args for a call. */
752 promote_mode (type
, mode
, punsignedp
, for_call
)
754 enum machine_mode mode
;
756 int for_call ATTRIBUTE_UNUSED
;
758 enum tree_code code
= TREE_CODE (type
);
759 int unsignedp
= *punsignedp
;
761 #ifdef PROMOTE_FOR_CALL_ONLY
769 case INTEGER_TYPE
: case ENUMERAL_TYPE
: case BOOLEAN_TYPE
:
770 case CHAR_TYPE
: case REAL_TYPE
: case OFFSET_TYPE
:
771 PROMOTE_MODE (mode
, unsignedp
, type
);
775 #ifdef POINTERS_EXTEND_UNSIGNED
779 unsignedp
= POINTERS_EXTEND_UNSIGNED
;
787 *punsignedp
= unsignedp
;
791 /* Adjust the stack pointer by ADJUST (an rtx for a number of bytes).
792 This pops when ADJUST is positive. ADJUST need not be constant. */
795 adjust_stack (adjust
)
799 adjust
= protect_from_queue (adjust
, 0);
801 if (adjust
== const0_rtx
)
804 temp
= expand_binop (Pmode
,
805 #ifdef STACK_GROWS_DOWNWARD
810 stack_pointer_rtx
, adjust
, stack_pointer_rtx
, 0,
813 if (temp
!= stack_pointer_rtx
)
814 emit_move_insn (stack_pointer_rtx
, temp
);
817 /* Adjust the stack pointer by minus ADJUST (an rtx for a number of bytes).
818 This pushes when ADJUST is positive. ADJUST need not be constant. */
821 anti_adjust_stack (adjust
)
825 adjust
= protect_from_queue (adjust
, 0);
827 if (adjust
== const0_rtx
)
830 temp
= expand_binop (Pmode
,
831 #ifdef STACK_GROWS_DOWNWARD
836 stack_pointer_rtx
, adjust
, stack_pointer_rtx
, 0,
839 if (temp
!= stack_pointer_rtx
)
840 emit_move_insn (stack_pointer_rtx
, temp
);
843 /* Round the size of a block to be pushed up to the boundary required
844 by this machine. SIZE is the desired size, which need not be constant. */
850 #ifdef PREFERRED_STACK_BOUNDARY
851 int align
= PREFERRED_STACK_BOUNDARY
/ BITS_PER_UNIT
;
854 if (GET_CODE (size
) == CONST_INT
)
856 int new = (INTVAL (size
) + align
- 1) / align
* align
;
857 if (INTVAL (size
) != new)
858 size
= GEN_INT (new);
862 /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
863 but we know it can't. So add ourselves and then do
865 size
= expand_binop (Pmode
, add_optab
, size
, GEN_INT (align
- 1),
866 NULL_RTX
, 1, OPTAB_LIB_WIDEN
);
867 size
= expand_divmod (0, TRUNC_DIV_EXPR
, Pmode
, size
, GEN_INT (align
),
869 size
= expand_mult (Pmode
, size
, GEN_INT (align
), NULL_RTX
, 1);
871 #endif /* PREFERRED_STACK_BOUNDARY */
875 /* Save the stack pointer for the purpose in SAVE_LEVEL. PSAVE is a pointer
876 to a previously-created save area. If no save area has been allocated,
877 this function will allocate one. If a save area is specified, it
878 must be of the proper mode.
880 The insns are emitted after insn AFTER, if nonzero, otherwise the insns
881 are emitted at the current position. */
884 emit_stack_save (save_level
, psave
, after
)
885 enum save_level save_level
;
890 /* The default is that we use a move insn and save in a Pmode object. */
891 rtx (*fcn
) PROTO ((rtx
, rtx
)) = gen_move_insn
;
892 enum machine_mode mode
= STACK_SAVEAREA_MODE (save_level
);
894 /* See if this machine has anything special to do for this kind of save. */
897 #ifdef HAVE_save_stack_block
899 if (HAVE_save_stack_block
)
900 fcn
= gen_save_stack_block
;
903 #ifdef HAVE_save_stack_function
905 if (HAVE_save_stack_function
)
906 fcn
= gen_save_stack_function
;
909 #ifdef HAVE_save_stack_nonlocal
911 if (HAVE_save_stack_nonlocal
)
912 fcn
= gen_save_stack_nonlocal
;
919 /* If there is no save area and we have to allocate one, do so. Otherwise
920 verify the save area is the proper mode. */
924 if (mode
!= VOIDmode
)
926 if (save_level
== SAVE_NONLOCAL
)
927 *psave
= sa
= assign_stack_local (mode
, GET_MODE_SIZE (mode
), 0);
929 *psave
= sa
= gen_reg_rtx (mode
);
934 if (mode
== VOIDmode
|| GET_MODE (sa
) != mode
)
943 /* We must validize inside the sequence, to ensure that any instructions
944 created by the validize call also get moved to the right place. */
946 sa
= validize_mem (sa
);
947 emit_insn (fcn (sa
, stack_pointer_rtx
));
948 seq
= gen_sequence ();
950 emit_insn_after (seq
, after
);
955 sa
= validize_mem (sa
);
956 emit_insn (fcn (sa
, stack_pointer_rtx
));
960 /* Restore the stack pointer for the purpose in SAVE_LEVEL. SA is the save
961 area made by emit_stack_save. If it is zero, we have nothing to do.
963 Put any emitted insns after insn AFTER, if nonzero, otherwise at
967 emit_stack_restore (save_level
, sa
, after
)
968 enum save_level save_level
;
972 /* The default is that we use a move insn. */
973 rtx (*fcn
) PROTO ((rtx
, rtx
)) = gen_move_insn
;
975 /* See if this machine has anything special to do for this kind of save. */
978 #ifdef HAVE_restore_stack_block
980 if (HAVE_restore_stack_block
)
981 fcn
= gen_restore_stack_block
;
984 #ifdef HAVE_restore_stack_function
986 if (HAVE_restore_stack_function
)
987 fcn
= gen_restore_stack_function
;
990 #ifdef HAVE_restore_stack_nonlocal
992 if (HAVE_restore_stack_nonlocal
)
993 fcn
= gen_restore_stack_nonlocal
;
1001 sa
= validize_mem (sa
);
1008 emit_insn (fcn (stack_pointer_rtx
, sa
));
1009 seq
= gen_sequence ();
1011 emit_insn_after (seq
, after
);
1014 emit_insn (fcn (stack_pointer_rtx
, sa
));
1017 #ifdef SETJMP_VIA_SAVE_AREA
1018 /* Optimize RTL generated by allocate_dynamic_stack_space for targets
1019 where SETJMP_VIA_SAVE_AREA is true. The problem is that on these
1020 platforms, the dynamic stack space used can corrupt the original
1021 frame, thus causing a crash if a longjmp unwinds to it. */
1024 optimize_save_area_alloca (insns
)
1029 for (insn
= insns
; insn
; insn
= NEXT_INSN(insn
))
1033 if (GET_CODE (insn
) != INSN
)
1036 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1038 if (REG_NOTE_KIND (note
) != REG_SAVE_AREA
)
1041 if (!current_function_calls_setjmp
)
1043 rtx pat
= PATTERN (insn
);
1045 /* If we do not see the note in a pattern matching
1046 these precise characteristics, we did something
1047 entirely wrong in allocate_dynamic_stack_space.
1049 Note, one way this could happen is if SETJMP_VIA_SAVE_AREA
1050 was defined on a machine where stacks grow towards higher
1053 Right now only supported port with stack that grow upward
1054 is the HPPA and it does not define SETJMP_VIA_SAVE_AREA. */
1055 if (GET_CODE (pat
) != SET
1056 || SET_DEST (pat
) != stack_pointer_rtx
1057 || GET_CODE (SET_SRC (pat
)) != MINUS
1058 || XEXP (SET_SRC (pat
), 0) != stack_pointer_rtx
)
1061 /* This will now be transformed into a (set REG REG)
1062 so we can just blow away all the other notes. */
1063 XEXP (SET_SRC (pat
), 1) = XEXP (note
, 0);
1064 REG_NOTES (insn
) = NULL_RTX
;
1068 /* setjmp was called, we must remove the REG_SAVE_AREA
1069 note so that later passes do not get confused by its
1071 if (note
== REG_NOTES (insn
))
1073 REG_NOTES (insn
) = XEXP (note
, 1);
1079 for (srch
= REG_NOTES (insn
); srch
; srch
= XEXP (srch
, 1))
1080 if (XEXP (srch
, 1) == note
)
1083 if (srch
== NULL_RTX
)
1086 XEXP (srch
, 1) = XEXP (note
, 1);
1089 /* Once we've seen the note of interest, we need not look at
1090 the rest of them. */
1095 #endif /* SETJMP_VIA_SAVE_AREA */
1097 /* Return an rtx representing the address of an area of memory dynamically
1098 pushed on the stack. This region of memory is always aligned to
1099 a multiple of BIGGEST_ALIGNMENT.
1101 Any required stack pointer alignment is preserved.
1103 SIZE is an rtx representing the size of the area.
1104 TARGET is a place in which the address can be placed.
1106 KNOWN_ALIGN is the alignment (in bits) that we know SIZE has. */
1109 allocate_dynamic_stack_space (size
, target
, known_align
)
1114 #ifdef SETJMP_VIA_SAVE_AREA
1115 rtx setjmpless_size
= NULL_RTX
;
1118 /* If we're asking for zero bytes, it doesn't matter what we point
1119 to since we can't dereference it. But return a reasonable
1121 if (size
== const0_rtx
)
1122 return virtual_stack_dynamic_rtx
;
1124 /* Otherwise, show we're calling alloca or equivalent. */
1125 current_function_calls_alloca
= 1;
1127 /* Ensure the size is in the proper mode. */
1128 if (GET_MODE (size
) != VOIDmode
&& GET_MODE (size
) != Pmode
)
1129 size
= convert_to_mode (Pmode
, size
, 1);
1131 /* We will need to ensure that the address we return is aligned to
1132 BIGGEST_ALIGNMENT. If STACK_DYNAMIC_OFFSET is defined, we don't
1133 always know its final value at this point in the compilation (it
1134 might depend on the size of the outgoing parameter lists, for
1135 example), so we must align the value to be returned in that case.
1136 (Note that STACK_DYNAMIC_OFFSET will have a default non-zero value if
1137 STACK_POINTER_OFFSET or ACCUMULATE_OUTGOING_ARGS are defined).
1138 We must also do an alignment operation on the returned value if
1139 the stack pointer alignment is less strict that BIGGEST_ALIGNMENT.
1141 If we have to align, we must leave space in SIZE for the hole
1142 that might result from the alignment operation. */
1144 #if defined (STACK_DYNAMIC_OFFSET) || defined (STACK_POINTER_OFFSET) || ! defined (PREFERRED_STACK_BOUNDARY)
1145 #define MUST_ALIGN 1
1147 #define MUST_ALIGN (PREFERRED_STACK_BOUNDARY < BIGGEST_ALIGNMENT)
1152 if (GET_CODE (size
) == CONST_INT
)
1153 size
= GEN_INT (INTVAL (size
)
1154 + (BIGGEST_ALIGNMENT
/ BITS_PER_UNIT
- 1));
1156 size
= expand_binop (Pmode
, add_optab
, size
,
1157 GEN_INT (BIGGEST_ALIGNMENT
/ BITS_PER_UNIT
- 1),
1158 NULL_RTX
, 1, OPTAB_LIB_WIDEN
);
1161 #ifdef SETJMP_VIA_SAVE_AREA
1162 /* If setjmp restores regs from a save area in the stack frame,
1163 avoid clobbering the reg save area. Note that the offset of
1164 virtual_incoming_args_rtx includes the preallocated stack args space.
1165 It would be no problem to clobber that, but it's on the wrong side
1166 of the old save area. */
1169 = expand_binop (Pmode
, sub_optab
, virtual_stack_dynamic_rtx
,
1170 stack_pointer_rtx
, NULL_RTX
, 1, OPTAB_LIB_WIDEN
);
1172 if (!current_function_calls_setjmp
)
1174 int align
= PREFERRED_STACK_BOUNDARY
/ BITS_PER_UNIT
;
1176 /* See optimize_save_area_alloca to understand what is being
1179 #if !defined(PREFERRED_STACK_BOUNDARY) || !defined(MUST_ALIGN) || (PREFERRED_STACK_BOUNDARY != BIGGEST_ALIGNMENT)
1180 /* If anyone creates a target with these characteristics, let them
1181 know that our optimization cannot work correctly in such a case. */
1185 if (GET_CODE (size
) == CONST_INT
)
1187 int new = INTVAL (size
) / align
* align
;
1189 if (INTVAL (size
) != new)
1190 setjmpless_size
= GEN_INT (new);
1192 setjmpless_size
= size
;
1196 /* Since we know overflow is not possible, we avoid using
1197 CEIL_DIV_EXPR and use TRUNC_DIV_EXPR instead. */
1198 setjmpless_size
= expand_divmod (0, TRUNC_DIV_EXPR
, Pmode
, size
,
1199 GEN_INT (align
), NULL_RTX
, 1);
1200 setjmpless_size
= expand_mult (Pmode
, setjmpless_size
,
1201 GEN_INT (align
), NULL_RTX
, 1);
1203 /* Our optimization works based upon being able to perform a simple
1204 transformation of this RTL into a (set REG REG) so make sure things
1205 did in fact end up in a REG. */
1206 if (!arith_operand (setjmpless_size
, Pmode
))
1207 setjmpless_size
= force_reg (Pmode
, setjmpless_size
);
1210 size
= expand_binop (Pmode
, add_optab
, size
, dynamic_offset
,
1211 NULL_RTX
, 1, OPTAB_LIB_WIDEN
);
1213 #endif /* SETJMP_VIA_SAVE_AREA */
1215 /* Round the size to a multiple of the required stack alignment.
1216 Since the stack if presumed to be rounded before this allocation,
1217 this will maintain the required alignment.
1219 If the stack grows downward, we could save an insn by subtracting
1220 SIZE from the stack pointer and then aligning the stack pointer.
1221 The problem with this is that the stack pointer may be unaligned
1222 between the execution of the subtraction and alignment insns and
1223 some machines do not allow this. Even on those that do, some
1224 signal handlers malfunction if a signal should occur between those
1225 insns. Since this is an extremely rare event, we have no reliable
1226 way of knowing which systems have this problem. So we avoid even
1227 momentarily mis-aligning the stack. */
1229 #ifdef PREFERRED_STACK_BOUNDARY
1230 /* If we added a variable amount to SIZE,
1231 we can no longer assume it is aligned. */
1232 #if !defined (SETJMP_VIA_SAVE_AREA)
1233 if (MUST_ALIGN
|| known_align
% PREFERRED_STACK_BOUNDARY
!= 0)
1235 size
= round_push (size
);
1238 do_pending_stack_adjust ();
1240 /* If needed, check that we have the required amount of stack. Take into
1241 account what has already been checked. */
1242 if (flag_stack_check
&& ! STACK_CHECK_BUILTIN
)
1243 probe_stack_range (STACK_CHECK_MAX_FRAME_SIZE
+ STACK_CHECK_PROTECT
, size
);
1245 /* Don't use a TARGET that isn't a pseudo. */
1246 if (target
== 0 || GET_CODE (target
) != REG
1247 || REGNO (target
) < FIRST_PSEUDO_REGISTER
)
1248 target
= gen_reg_rtx (Pmode
);
1250 mark_reg_pointer (target
, known_align
/ BITS_PER_UNIT
);
1252 /* Perform the required allocation from the stack. Some systems do
1253 this differently than simply incrementing/decrementing from the
1254 stack pointer, such as acquiring the space by calling malloc(). */
1255 #ifdef HAVE_allocate_stack
1256 if (HAVE_allocate_stack
)
1258 enum machine_mode mode
= STACK_SIZE_MODE
;
1260 if (insn_operand_predicate
[(int) CODE_FOR_allocate_stack
][0]
1261 && ! ((*insn_operand_predicate
[(int) CODE_FOR_allocate_stack
][0])
1263 target
= copy_to_mode_reg (Pmode
, target
);
1264 size
= convert_modes (mode
, ptr_mode
, size
, 1);
1265 if (insn_operand_predicate
[(int) CODE_FOR_allocate_stack
][1]
1266 && ! ((*insn_operand_predicate
[(int) CODE_FOR_allocate_stack
][1])
1268 size
= copy_to_mode_reg (mode
, size
);
1270 emit_insn (gen_allocate_stack (target
, size
));
1275 #ifndef STACK_GROWS_DOWNWARD
1276 emit_move_insn (target
, virtual_stack_dynamic_rtx
);
1278 size
= convert_modes (Pmode
, ptr_mode
, size
, 1);
1279 anti_adjust_stack (size
);
1280 #ifdef SETJMP_VIA_SAVE_AREA
1281 if (setjmpless_size
!= NULL_RTX
)
1283 rtx note_target
= get_last_insn ();
1285 REG_NOTES (note_target
)
1286 = gen_rtx_EXPR_LIST (REG_SAVE_AREA
, setjmpless_size
,
1287 REG_NOTES (note_target
));
1289 #endif /* SETJMP_VIA_SAVE_AREA */
1290 #ifdef STACK_GROWS_DOWNWARD
1291 emit_move_insn (target
, virtual_stack_dynamic_rtx
);
1297 /* CEIL_DIV_EXPR needs to worry about the addition overflowing,
1298 but we know it can't. So add ourselves and then do
1300 target
= expand_binop (Pmode
, add_optab
, target
,
1301 GEN_INT (BIGGEST_ALIGNMENT
/ BITS_PER_UNIT
- 1),
1302 NULL_RTX
, 1, OPTAB_LIB_WIDEN
);
1303 target
= expand_divmod (0, TRUNC_DIV_EXPR
, Pmode
, target
,
1304 GEN_INT (BIGGEST_ALIGNMENT
/ BITS_PER_UNIT
),
1306 target
= expand_mult (Pmode
, target
,
1307 GEN_INT (BIGGEST_ALIGNMENT
/ BITS_PER_UNIT
),
1311 /* Some systems require a particular insn to refer to the stack
1312 to make the pages exist. */
1315 emit_insn (gen_probe ());
1318 /* Record the new stack level for nonlocal gotos. */
1319 if (nonlocal_goto_handler_slots
!= 0)
1320 emit_stack_save (SAVE_NONLOCAL
, &nonlocal_goto_stack_level
, NULL_RTX
);
1325 /* Emit one stack probe at ADDRESS, an address within the stack. */
1328 emit_stack_probe (address
)
1331 rtx memref
= gen_rtx_MEM (word_mode
, address
);
1333 MEM_VOLATILE_P (memref
) = 1;
1335 if (STACK_CHECK_PROBE_LOAD
)
1336 emit_move_insn (gen_reg_rtx (word_mode
), memref
);
1338 emit_move_insn (memref
, const0_rtx
);
1341 /* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive.
1342 FIRST is a constant and size is a Pmode RTX. These are offsets from the
1343 current stack pointer. STACK_GROWS_DOWNWARD says whether to add or
1344 subtract from the stack. If SIZE is constant, this is done
1345 with a fixed number of probes. Otherwise, we must make a loop. */
1347 #ifdef STACK_GROWS_DOWNWARD
1348 #define STACK_GROW_OP MINUS
1350 #define STACK_GROW_OP PLUS
1354 probe_stack_range (first
, size
)
1355 HOST_WIDE_INT first
;
1358 /* First see if we have an insn to check the stack. Use it if so. */
1359 #ifdef HAVE_check_stack
1360 if (HAVE_check_stack
)
1363 = force_operand (gen_rtx_STACK_GROW_OP (Pmode
,
1365 plus_constant (size
, first
)),
1368 if (insn_operand_predicate
[(int) CODE_FOR_check_stack
][0]
1369 && ! ((*insn_operand_predicate
[(int) CODE_FOR_check_stack
][0])
1370 (last_address
, Pmode
)))
1371 last_address
= copy_to_mode_reg (Pmode
, last_address
);
1373 emit_insn (gen_check_stack (last_address
));
1378 /* If we have to generate explicit probes, see if we have a constant
1379 small number of them to generate. If so, that's the easy case. */
1380 if (GET_CODE (size
) == CONST_INT
1381 && INTVAL (size
) < 10 * STACK_CHECK_PROBE_INTERVAL
)
1383 HOST_WIDE_INT offset
;
1385 /* Start probing at FIRST + N * STACK_CHECK_PROBE_INTERVAL
1386 for values of N from 1 until it exceeds LAST. If only one
1387 probe is needed, this will not generate any code. Then probe
1389 for (offset
= first
+ STACK_CHECK_PROBE_INTERVAL
;
1390 offset
< INTVAL (size
);
1391 offset
= offset
+ STACK_CHECK_PROBE_INTERVAL
)
1392 emit_stack_probe (gen_rtx_fmt_ee (STACK_GROW_OP
, Pmode
,
1396 emit_stack_probe (gen_rtx_fmt_ee (STACK_GROW_OP
, Pmode
,
1398 plus_constant (size
, first
)));
1401 /* In the variable case, do the same as above, but in a loop. We emit loop
1402 notes so that loop optimization can be done. */
1406 = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP
, Pmode
,
1408 GEN_INT (first
+ STACK_CHECK_PROBE_INTERVAL
)),
1411 = force_operand (gen_rtx_fmt_ee (STACK_GROW_OP
, Pmode
,
1413 plus_constant (size
, first
)),
1415 rtx incr
= GEN_INT (STACK_CHECK_PROBE_INTERVAL
);
1416 rtx loop_lab
= gen_label_rtx ();
1417 rtx test_lab
= gen_label_rtx ();
1418 rtx end_lab
= gen_label_rtx ();
1421 if (GET_CODE (test_addr
) != REG
1422 || REGNO (test_addr
) < FIRST_PSEUDO_REGISTER
)
1423 test_addr
= force_reg (Pmode
, test_addr
);
1425 emit_note (NULL_PTR
, NOTE_INSN_LOOP_BEG
);
1426 emit_jump (test_lab
);
1428 emit_label (loop_lab
);
1429 emit_stack_probe (test_addr
);
1431 emit_note (NULL_PTR
, NOTE_INSN_LOOP_CONT
);
1433 #ifdef STACK_GROWS_DOWNWARD
1434 #define CMP_OPCODE GTU
1435 temp
= expand_binop (Pmode
, sub_optab
, test_addr
, incr
, test_addr
,
1438 #define CMP_OPCODE LTU
1439 temp
= expand_binop (Pmode
, add_optab
, test_addr
, incr
, test_addr
,
1443 if (temp
!= test_addr
)
1446 emit_label (test_lab
);
1447 emit_cmp_insn (test_addr
, last_addr
, CMP_OPCODE
, NULL_RTX
, Pmode
, 1, 0);
1448 emit_jump_insn ((*bcc_gen_fctn
[(int) CMP_OPCODE
]) (loop_lab
));
1449 emit_jump (end_lab
);
1450 emit_note (NULL_PTR
, NOTE_INSN_LOOP_END
);
1451 emit_label (end_lab
);
1453 /* If will be doing stupid optimization, show test_addr is still live. */
1455 emit_insn (gen_rtx_USE (VOIDmode
, test_addr
));
1457 emit_stack_probe (last_addr
);
1461 /* Return an rtx representing the register or memory location
1462 in which a scalar value of data type VALTYPE
1463 was returned by a function call to function FUNC.
1464 FUNC is a FUNCTION_DECL node if the precise function is known,
1468 hard_function_value (valtype
, func
)
1472 rtx val
= FUNCTION_VALUE (valtype
, func
);
1473 if (GET_CODE (val
) == REG
1474 && GET_MODE (val
) == BLKmode
)
1476 int bytes
= int_size_in_bytes (valtype
);
1477 enum machine_mode tmpmode
;
1478 for (tmpmode
= GET_CLASS_NARROWEST_MODE (MODE_INT
);
1479 tmpmode
!= MAX_MACHINE_MODE
;
1480 tmpmode
= GET_MODE_WIDER_MODE (tmpmode
))
1482 /* Have we found a large enough mode? */
1483 if (GET_MODE_SIZE (tmpmode
) >= bytes
)
1487 /* No suitable mode found. */
1488 if (tmpmode
== MAX_MACHINE_MODE
)
1491 PUT_MODE (val
, tmpmode
);
1496 /* Return an rtx representing the register or memory location
1497 in which a scalar value of mode MODE was returned by a library call. */
1500 hard_libcall_value (mode
)
1501 enum machine_mode mode
;
1503 return LIBCALL_VALUE (mode
);
1506 /* Look up the tree code for a given rtx code
1507 to provide the arithmetic operation for REAL_ARITHMETIC.
1508 The function returns an int because the caller may not know
1509 what `enum tree_code' means. */
1512 rtx_to_tree_code (code
)
1515 enum tree_code tcode
;
1538 tcode
= LAST_AND_UNUSED_TREE_CODE
;
1541 return ((int) tcode
);