Functions |
static bool | small_register_class_p () |
static int | push_secondary_reload (int, rtx, int, int, enum reg_class, enum machine_mode, enum reload_type, enum insn_code *, secondary_reload_info *) |
static enum reg_class | find_valid_class (enum machine_mode, enum machine_mode, int, unsigned int) |
static void | push_replacement (rtx *, int, enum machine_mode) |
static void | dup_replacements (rtx *, rtx *) |
static void | combine_reloads (void) |
static int | find_reusable_reload (rtx *, rtx, enum reg_class, enum reload_type, int, int) |
static rtx | find_dummy_reload (rtx, rtx, rtx *, rtx *, enum machine_mode, enum machine_mode, reg_class_t, int, int) |
static int | hard_reg_set_here_p (unsigned int, unsigned int, rtx) |
static struct decomposition | decompose (rtx) |
static int | immune_p (rtx, rtx, struct decomposition) |
static bool | alternative_allows_const_pool_ref (rtx, const char *, int) |
static rtx | find_reloads_toplev (rtx, int, enum reload_type, int, int, rtx, int *) |
static rtx | make_memloc (rtx, int) |
static int | maybe_memory_address_addr_space_p (enum machine_mode, rtx, addr_space_t, rtx *) |
static int | find_reloads_address (enum machine_mode, rtx *, rtx, rtx *, int, enum reload_type, int, rtx) |
static rtx | subst_reg_equivs (rtx, rtx) |
static rtx | subst_indexed_address (rtx) |
static void | update_auto_inc_notes (rtx, int, int) |
static int | find_reloads_address_1 (enum machine_mode, addr_space_t, rtx, int, enum rtx_code, enum rtx_code, rtx *, int, enum reload_type, int, rtx) |
static void | find_reloads_address_part (rtx, rtx *, enum reg_class, enum machine_mode, int, enum reload_type, int) |
static rtx | find_reloads_subreg_address (rtx, int, enum reload_type, int, rtx, int *) |
static void | copy_replacements_1 (rtx *, rtx *, int) |
static int | find_inc_amount (rtx, rtx) |
static int | refers_to_mem_for_reload_p (rtx) |
static int | refers_to_regno_for_reload_p (unsigned int, unsigned int, rtx, rtx *) |
static void | push_reg_equiv_alt_mem () |
reg_class_t | secondary_reload_class (bool in_p, reg_class_t rclass, enum machine_mode mode, rtx x) |
enum reg_class | scratch_reload_class () |
rtx | get_secondary_mem (rtx x, enum machine_mode mode, int opnum, enum reload_type type) |
void | clear_secondary_mem () |
static enum reg_class | find_valid_class_1 (enum machine_mode outer, enum machine_mode mode, enum reg_class dest_class) |
static bool | reload_inner_reg_of_subreg () |
static int | can_reload_into () |
int | push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc, enum reg_class rclass, enum machine_mode inmode, enum machine_mode outmode, int strict_low, int optional, int opnum, enum reload_type type) |
static void | push_replacement () |
static void | dup_replacements () |
void | transfer_replacements () |
int | remove_address_replacements () |
int | earlyclobber_operand_p () |
static int | hard_reg_set_here_p () |
int | strict_memory_address_addr_space_p (enum machine_mode mode, rtx addr, addr_space_t as) |
int | operands_match_p () |
static struct decomposition | decompose () |
static int | immune_p () |
int | safe_from_earlyclobber () |
int | find_reloads (rtx insn, int replace, int ind_levels, int live_known, short *reload_reg_p) |
static rtx | make_memloc () |
static rtx | subst_reg_equivs () |
rtx | form_sum () |
static rtx | subst_indexed_address () |
void | subst_reloads () |
void | copy_replacements () |
static void | copy_replacements_1 () |
void | move_replacements () |
rtx | find_replacement () |
int | reg_overlap_mentioned_for_reload_p () |
static int | refers_to_mem_for_reload_p () |
rtx | find_equiv_reg (rtx goal, rtx insn, enum reg_class rclass, int other, short *reload_reg_p, int goalreg, enum machine_mode mode) |
static int | find_inc_amount () |
static int | reg_inc_found_and_valid_p (unsigned int regno, unsigned int endregno, rtx insn) |
int | regno_clobbered_p (unsigned int regno, rtx insn, enum machine_mode mode, int sets) |
rtx | reload_adjust_reg_for_mode () |
DEBUG_FUNCTION void | debug_reload_to_stream () |
DEBUG_FUNCTION void | debug_reload () |
static int can_reload_into |
( |
| ) |
|
|
static |
Return nonzero if IN can be reloaded into REGNO with mode MODE without
requiring an extra reload register. The caller has already found that
IN contains some reference to REGNO, so check that we can produce the
new value in a single step. E.g. if we have
(set (reg r13) (plus (reg r13) (const int 1))), and there is an
instruction that adds one to a register, this should succeed.
However, if we have something like
(set (reg r13) (plus (reg r13) (const int 999))), and the constant 999
needs to be loaded into a register first, we need a separate reload
register.
Such PLUS reloads are generated by find_reload_address_part.
The out-of-range PLUS expressions are usually introduced in the instruction
patterns by register elimination and substituting pseudos without a home
by their function-invariant equivalences.
References constrain_operands(), extract_insn(), gen_rtx_REG(), make_insn_raw(), recog_data, recog_memoized(), and test_insn.
Referenced by push_reload().
static void combine_reloads |
( |
| ) |
|
|
static |
If there is only one output reload, and it is not for an earlyclobber
operand, try to combine it with a (logically unrelated) input reload
to reduce the number of reload registers needed.
This is safe if the input reload does not appear in
the value being output-reloaded, because this implies
it is not needed any more once the original insn completes.
If that doesn't work, see we can use any of the registers that
die in this insn as a reload register. We can if it is of the right
class and does not appear in the value being output-reloaded.
References bitmap_bit_p(), insn_operand_data::constraint, earlyclobber_operand_p(), gen_rtx_REG(), insn_data, insn_data_d::n_operands, n_reloads, n_replacements, insn_data_d::operand, reload::opnum, reload::out, reload::out_reg, reload::outmode, reload::rclass, reg_class_subset_p(), reg_overlap_mentioned_for_reload_p(), RELOAD_FOR_INPUT, RELOAD_FOR_OUTADDR_ADDRESS, RELOAD_FOR_OUTPUT, RELOAD_FOR_OUTPUT_ADDRESS, reload_inner_reg_of_subreg(), RELOAD_OTHER, replacements, rld, rtx_equal_p(), secondary_memlocs_elim, reload::secondary_out_icode, reload::secondary_out_reload, targetm, this_insn, replacement::what, and reload::when_needed.
Referenced by find_reloads().
static rtx find_dummy_reload |
( |
rtx |
real_in, |
|
|
rtx |
real_out, |
|
|
rtx * |
inloc, |
|
|
rtx * |
outloc, |
|
|
enum machine_mode |
inmode, |
|
|
enum machine_mode |
outmode, |
|
|
reg_class_t |
rclass, |
|
|
int |
for_real, |
|
|
int |
earlyclobber |
|
) |
| |
|
static |
Try to find a reload register for an in-out reload (expressions IN and OUT).
See if one of IN and OUT is a register that may be used;
this is desirable since a spill-register won't be needed.
If so, return the register rtx that proves acceptable.
INLOC and OUTLOC are locations where IN and OUT appear in the insn.
RCLASS is the register class required for the reload.
If FOR_REAL is >= 0, it is the number of the reload,
and in some cases when it can be discovered that OUT doesn't need
to be computed, clear out rld[FOR_REAL].out.
If FOR_REAL is -1, this should not be done, because this call
is just to see if a register can be found, not to find and install it.
EARLYCLOBBER is nonzero if OUT is an earlyclobber operand. This
puts an additional constraint on being able to use IN for OUT since
IN must not appear elsewhere in the insn (it is assumed that IN itself
is safe from the earlyclobber).
References bitmap_bit_p(), find_reg_note(), gen_rtx_REG(), hard_reg_set_here_p(), hard_regs_live_known, reload::out, refers_to_regno_for_reload_p(), rld, subreg_regno_offset(), targetm, and this_insn.
Referenced by find_reloads(), and push_reload().
rtx find_equiv_reg |
( |
rtx |
goal, |
|
|
rtx |
insn, |
|
|
enum reg_class |
rclass, |
|
|
int |
other, |
|
|
short * |
reload_reg_p, |
|
|
int |
goalreg, |
|
|
enum machine_mode |
mode |
|
) |
| |
Check the insns before INSN to see if there is a suitable register
containing the same value as GOAL.
If OTHER is -1, look for a register in class RCLASS.
Otherwise, just see if register number OTHER shares GOAL's value.
Return an rtx for the register found, or zero if none is found.
If RELOAD_REG_P is (short *)1,
we reject any hard reg that appears in reload_reg_rtx
because such a hard reg is also needed coming into this insn.
If RELOAD_REG_P is any other nonzero value,
it is a vector indexed by hard reg number
and we reject any hard reg whose element in the vector is nonnegative
as well as any that appears in reload_reg_rtx.
If GOAL is zero, then GOALREG is a register number; we look
for an equivalent for that register.
MODE is the machine mode of the value we want an equivalence for.
If GOAL is nonzero and not VOIDmode, then it must have mode MODE.
This function is used by jump.c as well as in the reload pass.
If GOAL is the sum of the stack pointer and a constant, we treat it
as if it were a constant except that sp is required to be unchanging.
References end_hard_regno(), find_reg_note(), HOST_WIDE_INT, in_hard_reg_set_p(), replacement::mode, n_reloads, operand_subword(), push_operand(), refers_to_regno_for_reload_p(), reg_overlap_mentioned_for_reload_p(), reload_first_uid, rld, rtx_equal_p(), rtx_renumbered_equal_p(), SET, true_regnum(), volatile_insn_p(), and replacement::where.
Referenced by choose_reload_regs(), find_reloads(), and push_reload().
int find_reloads |
( |
rtx |
insn, |
|
|
int |
replace, |
|
|
int |
ind_levels, |
|
|
int |
live_known, |
|
|
short * |
reload_reg_p |
|
) |
| |
Main entry point of this file: search the body of INSN
for values that need reloading and record them with push_reload.
REPLACE nonzero means record also where the values occur
so that subst_reloads can be used.
IND_LEVELS says how many levels of indirection are supported by this
machine; a value of zero means that a memory reference is not a valid
memory address.
LIVE_KNOWN says we have valid information about which hard
regs are live at each point in the program; this is true when
we are called from global_alloc but false when stupid register
allocation has been done.
RELOAD_REG_P if nonzero is a vector indexed by hard reg number
which is nonnegative if the reg has been commandeered for reloading into.
It is copied into STATIC_RELOAD_REG_P and referenced from there
by various subroutines.
Return TRUE if some operands need to be changed, because of swapping
commutative operands, reg_equiv_address substitution, or whatever.
References add_reg_note(), alternative_allows_const_pool_ref(), recog_data_d::alternative_enabled_p, base_reg_class(), cc0_rtx, combine_reloads(), recog_data_d::constraints, constraints, decompose(), recog_data_d::dup_loc, recog_data_d::dup_num, dup_replacements(), elimination_target_reg_p(), emit_insn_after(), emit_insn_before(), decomposition::end, error_for_asm(), extract_insn(), find_dummy_reload(), find_equiv_reg(), find_reg_note(), find_reloads(), find_reloads_address(), find_reloads_toplev(), force_const_mem(), gen_clobber(), gen_rtx_SUBREG(), get_address_mode(), hard_regs_live_known, immune_p(), reload::in, reload::in_reg, reload::inc, reload::inmode, insn_code_number, insn_data, recog_data_d::is_operator, label_is_jump_target_p(), len, memcpy(), memset(), reload::mode, n_alternatives(), recog_data_d::n_alternatives, recog_data_d::n_dups, n_earlyclobbers, recog_data_d::n_operands, n_reloads, n_replacements, nr, reload::nregs, num_not_at_initial_offset, offset, offsettable_memref_p(), offsettable_nonstrict_memref_p(), recog_data_d::operand, insn_data_d::operand, recog_data_d::operand_loc, recog_data_d::operand_mode, operands_match_p(), reload::opnum, reload::outmode, output_reloadnum, push_reload(), reload::rclass, recog_data, reg_alternate_class(), reg_class_subset_p(), reg_fits_class_p(), reg_mentioned_p(), reg_preferred_class(), reg_referenced_p(), reg_renumber, reload::reg_rtx, reg_set_p(), register_move_cost(), reject(), reload_earlyclobbers, RELOAD_FOR_INPADDR_ADDRESS, RELOAD_FOR_INPUT, RELOAD_FOR_INPUT_ADDRESS, RELOAD_FOR_INSN, RELOAD_FOR_OPADDR_ADDR, RELOAD_FOR_OPERAND_ADDRESS, RELOAD_FOR_OTHER_ADDRESS, RELOAD_FOR_OUTADDR_ADDRESS, RELOAD_FOR_OUTPUT, RELOAD_FOR_OUTPUT_ADDRESS, reload_n_operands, RELOAD_OTHER, replace_reloads, replacements, rld, rtx_equal_p(), RTX_UNARY, secondary_memlocs_elim, secondary_memlocs_elim_used, SET, set_unique_reg_note(), simplify_subreg_regno(), skip_alternative(), small_register_class_p(), static_reload_reg_p, insn_operand_data::strict_low, subreg_regno_offset(), targetm, this_insn, this_insn_is_asm, transfer_replacements(), type(), replacement::what, and reload::when_needed.
Referenced by calculate_needs_all_insns(), find_reloads(), and reload_as_needed().
static int find_reloads_address |
( |
enum machine_mode |
mode, |
|
|
rtx * |
memrefloc, |
|
|
rtx |
ad, |
|
|
rtx * |
loc, |
|
|
int |
opnum, |
|
|
enum reload_type |
type, |
|
|
int |
ind_levels, |
|
|
rtx |
insn |
|
) |
| |
|
static |
Record all reloads needed for handling memory address AD
which appears in *LOC in a memory reference to mode MODE
which itself is found in location *MEMREFLOC.
Note that we take shortcuts assuming that no multi-reg machine mode
occurs as part of an address.
OPNUM and TYPE specify the purpose of this reload.
IND_LEVELS says how many levels of indirect addressing this machine
supports.
INSN, if nonzero, is the insn in which we do the reload. It is used
to determine if we may generate output reloads, and where to put USEs
for pseudos that we have to replace with stack slots.
Value is one if this address is reloaded or replaced as a whole; it is
zero if the top level of this address was not reloaded or replaced, and
it is -1 if it may or may not have been reloaded or replaced.
Note that there is no verification that the address will be valid after
this routine does its work. Instead, we rely on the fact that the address
was valid when reload started. So we need only undo things that reload
could have broken. These are wrong register types, pseudos not allocated
to a hard register, and frame pointer elimination.
References base_reg_class(), copy_replacements(), copy_rtx(), emit_insn_before(), find_reloads_address_1(), find_reloads_address_part(), make_memloc(), maybe_memory_address_addr_space_p(), move_replacements(), num_not_at_initial_offset, plus_constant(), push_reg_equiv_alt_mem(), push_reload(), regno_clobbered_p(), regno_ok_for_base_p(), replace_reloads, rtx_equal_p(), strict_memory_address_addr_space_p(), subst_indexed_address(), subst_reg_equivs(), subst_reg_equivs_changed, targetm, and this_insn.
Referenced by find_reloads(), find_reloads_address_1(), find_reloads_address_part(), find_reloads_subreg_address(), find_reloads_toplev(), and get_secondary_mem().
static int find_reloads_address_1 |
( |
enum machine_mode |
mode, |
|
|
addr_space_t |
as, |
|
|
rtx |
x, |
|
|
int |
context, |
|
|
enum rtx_code |
outer_code, |
|
|
enum rtx_code |
index_code, |
|
|
rtx * |
loc, |
|
|
int |
opnum, |
|
|
enum reload_type |
type, |
|
|
int |
ind_levels, |
|
|
rtx |
insn |
|
) |
| |
|
static |
Record the pseudo registers we must reload into hard registers in a
subexpression of a would-be memory address, X referring to a value
in mode MODE. (This function is not called if the address we find
is strictly valid.)
CONTEXT = 1 means we are considering regs as index regs,
= 0 means we are considering them as base regs.
OUTER_CODE is the code of the enclosing RTX, typically a MEM, a PLUS,
or an autoinc code.
If CONTEXT == 0 and OUTER_CODE is a PLUS or LO_SUM, then INDEX_CODE
is the code of the index part of the address. Otherwise, pass SCRATCH
for this argument.
OPNUM and TYPE specify the purpose of any reloads made.
IND_LEVELS says how many levels of indirect addressing are
supported at this point in the address.
INSN, if nonzero, is the insn in which we do the reload. It is used
to determine if we may generate output reloads.
We return nonzero if X, as a whole, is reloaded or replaced.
Note that we take shortcuts assuming that no multi-reg machine mode
occurs as part of an address.
Also, this is not fully machine-customizable; it works for machines
such as VAXen and 68000's and 32000's, but other possible machines
could have addressing modes that this does not handle right.
If you add push_reload calls here, you need to make sure gen_reload
handles those cases gracefully.
References base_reg_class(), find_inc_amount(), find_reloads_address(), find_reloads_address_part(), find_reloads_subreg_address(), gen_rtx_REG(), reload::inc, insn_operand_matches(), make_memloc(), memory_operand(), num_not_at_initial_offset, optab_handler(), push_reg_equiv_alt_mem(), push_reload(), reg_renumber, regno_clobbered_p(), regno_ok_for_base_p(), RELOAD_OTHER, rld, rtx_equal_p(), sets_cc0_p(), subreg_regno(), subreg_regno_offset(), this_insn, update_auto_inc_notes(), and word_mode.
Referenced by find_reloads_address().
static void find_reloads_address_part |
( |
rtx |
x, |
|
|
rtx * |
loc, |
|
|
enum reg_class |
rclass, |
|
|
enum machine_mode |
mode, |
|
|
int |
opnum, |
|
|
enum reload_type |
type, |
|
|
int |
ind_levels |
|
) |
| |
|
static |
X, which is found at *LOC, is a part of an address that needs to be
reloaded into a register of class RCLASS. If X is a constant, or if
X is a PLUS that contains a constant, check that the constant is a
legitimate operand and that we are supposed to be able to load
it into the register.
If not, force the constant into memory and reload the MEM instead.
MODE is the mode to use, in case X is an integer constant.
OPNUM and TYPE describe the purpose of any reloads made.
IND_LEVELS says how many levels of indirect addressing this machine
supports.
References find_reloads_address(), force_const_mem(), push_reload(), and targetm.
Referenced by find_reloads_address(), and find_reloads_address_1().
static rtx find_reloads_subreg_address |
( |
rtx |
x, |
|
|
int |
opnum, |
|
|
enum reload_type |
type, |
|
|
int |
ind_levels, |
|
|
rtx |
insn, |
|
|
int * |
address_reloaded |
|
) |
| |
|
static |
X, a subreg of a pseudo, is a part of an address that needs to be
reloaded, and the pseusdo is equivalent to a memory location.
Attempt to replace the whole subreg by a (possibly narrower or wider)
memory reference. If this is possible, return this new memory
reference, and push all required address reloads. Otherwise,
return NULL.
OPNUM and TYPE identify the purpose of the reload.
IND_LEVELS says how many levels of indirect addressing are
supported at this point in the address.
INSN, if nonzero, is the insn in which we do the reload. It is used
to determine where to put USEs for pseudos that we have to replace with
stack slots.
References base_reg_class(), emit_insn_before(), find_reloads_address(), make_memloc(), offset, recog_data_d::operand, paradoxical_subreg_p(), push_reg_equiv_alt_mem(), push_reload(), recog_data, replace_reloads, rtx_equal_p(), simplify_subreg(), and strict_memory_address_addr_space_p().
Referenced by find_reloads_address_1(), and find_reloads_toplev().
static rtx find_reloads_toplev |
( |
rtx |
x, |
|
|
int |
opnum, |
|
|
enum reload_type |
type, |
|
|
int |
ind_levels, |
|
|
int |
is_set_dest, |
|
|
rtx |
insn, |
|
|
int * |
address_reloaded |
|
) |
| |
|
static |
Scan X for memory references and scan the addresses for reloading.
Also checks for references to "constant" regs that we want to eliminate
and replaces them with the values they stand for.
We may alter X destructively if it contains a reference to such.
If X is just a constant reg, we return the equivalent value
instead of X.
IND_LEVELS says how many levels of indirect addressing this machine
supports.
OPNUM and TYPE identify the purpose of the reload.
IS_SET_DEST is true if X is the destination of a SET, which is not
appropriate to be replaced by a constant.
INSN, if nonzero, is the insn in which we do the reload. It is used
to determine if we may generate output reloads, and where to put USEs
for pseudos that we have to replace with stack slots.
ADDRESS_RELOADED. If nonzero, is a pointer to where we put the
result of find_reloads_address.
References emit_insn_before(), find_reloads_address(), find_reloads_subreg_address(), force_const_mem(), make_memloc(), num_not_at_initial_offset, recog_data_d::operand, push_reg_equiv_alt_mem(), recog_data, reg_renumber, replace_reloads, rtx_equal_p(), simplify_gen_subreg(), and targetm.
Referenced by find_reloads().
static int find_reusable_reload |
( |
rtx * |
p_in, |
|
|
rtx |
out, |
|
|
enum reg_class |
rclass, |
|
|
enum reload_type |
type, |
|
|
int |
opnum, |
|
|
int |
dont_share |
|
) |
| |
|
static |
Return the number of a previously made reload that can be combined with
a new one, or n_reloads if none of the existing reloads can be used.
OUT, RCLASS, TYPE and OPNUM are the same arguments as passed to
push_reload, they determine the kind of the new reload that we try to
combine. P_IN points to the corresponding value of IN, which can be
modified by this function.
DONT_SHARE is nonzero if we can't share any input-only reload for IN.
References earlyclobber_operand_p(), n_reloads, reload::out, reg_class_subset_p(), rld, RTX_AUTOINC, small_register_class_p(), targetm, and true_regnum().
Referenced by push_reload().
int push_reload |
( |
rtx |
in, |
|
|
rtx |
out, |
|
|
rtx * |
inloc, |
|
|
rtx * |
outloc, |
|
|
enum reg_class |
rclass, |
|
|
enum machine_mode |
inmode, |
|
|
enum machine_mode |
outmode, |
|
|
int |
strict_low, |
|
|
int |
optional, |
|
|
int |
opnum, |
|
|
enum reload_type |
type |
|
) |
| |
Record one reload that needs to be performed.
IN is an rtx saying where the data are to be found before this instruction.
OUT says where they must be stored after the instruction.
(IN is zero for data not read, and OUT is zero for data not written.)
INLOC and OUTLOC point to the places in the instructions where
IN and OUT were found.
If IN and OUT are both nonzero, it means the same register must be used
to reload both IN and OUT.
RCLASS is a register class required for the reloaded data.
INMODE is the machine mode that the instruction requires
for the reg that replaces IN and OUTMODE is likewise for OUT.
If IN is zero, then OUT's location and mode should be passed as
INLOC and INMODE.
STRICT_LOW is the 1 if there is a containing STRICT_LOW_PART rtx.
OPTIONAL nonzero means this reload does not need to be performed:
it can be discarded if that is more convenient.
OPNUM and TYPE say what the purpose of this reload is.
The return value is the reload-number for this reload.
If both IN and OUT are nonzero, in some rare cases we might
want to make two separate reloads. (Actually we never do this now.)
Therefore, the reload-number for OUT is stored in
output_reloadnum when we return; the return value applies to IN.
Usually (presently always), when IN and OUT are nonzero,
the two reload-numbers are equal, but the caller should be careful to
distinguish them.
References bitmap_bit_p(), can_reload_into(), earlyclobber_operand_p(), end_hard_regno(), error_for_asm(), find_dummy_reload(), find_equiv_reg(), find_inc_amount(), find_reusable_reload(), find_valid_class(), find_valid_class_1(), gen_rtx_REG(), get_secondary_mem(), hard_reg_set_here_p(), hard_regs_live_known, reload::in, in_hard_reg_set_p(), reload::in_reg, reload::inc, reload::inmode, replacement::mode, n_reloads, n_replacements, reload::nocombine, reload::opnum, reload::optional, reload::out, reload::out_reg, reload::outmode, output_reloadnum, push_reload(), push_secondary_reload(), reload::rclass, refers_to_regno_for_reload_p(), reg_class_subset_p(), reg_mentioned_p(), reg_or_subregno(), reg_overlap_mentioned_for_reload_p(), reg_renumber, reload::reg_rtx, RELOAD_FOR_OUTPUT, reload_inner_reg_of_subreg(), RELOAD_OTHER, remove_address_replacements(), replace_equiv_address_nv(), replace_reloads, replacements, rld, rtx_equal_p(), reload::secondary_in_icode, reload::secondary_in_reload, reload::secondary_out_icode, reload::secondary_out_reload, reload::secondary_p, secondary_reload_class(), sets_cc0_p(), static_reload_reg_p, subreg_lowpart_p(), subreg_regno(), subreg_regno_offset(), targetm, this_insn, this_insn_is_asm, type(), replacement::what, reload::when_needed, replacement::where, and word_mode.
Referenced by find_reloads(), find_reloads_address(), find_reloads_address_1(), find_reloads_address_part(), find_reloads_subreg_address(), and push_reload().
static int push_secondary_reload |
( |
int |
in_p, |
|
|
rtx |
x, |
|
|
int |
opnum, |
|
|
int |
optional, |
|
|
enum reg_class |
reload_class, |
|
|
enum machine_mode |
reload_mode, |
|
|
enum reload_type |
type, |
|
|
enum insn_code * |
picode, |
|
|
secondary_reload_info * |
prev_sri |
|
) |
| |
|
static |
Determine if any secondary reloads are needed for loading (if IN_P is
nonzero) or storing (if IN_P is zero) X to or from a reload register of
register class RELOAD_CLASS in mode RELOAD_MODE. If secondary reloads
are needed, push them.
Return the reload number of the secondary reload we made, or -1 if
we didn't need one. *PICODE is set to the insn_code to use if we do
need a secondary reload.
References get_secondary_mem(), secondary_reload_info::icode, reload::in, reload::in_reg, reload::inc, reload::inmode, insn_data, n_operands, n_reloads, reload::nocombine, reload::opnum, reload::optional, reload::out, reload::out_reg, reload::outmode, paradoxical_subreg_p(), secondary_reload_info::prev_sri, reload::rclass, reg_class_subset_p(), reload::reg_rtx, RELOAD_FOR_INPADDR_ADDRESS, RELOAD_FOR_INPUT_ADDRESS, RELOAD_FOR_OUTADDR_ADDRESS, RELOAD_FOR_OUTPUT_ADDRESS, RELOAD_OTHER, rld, reload::secondary_in_icode, reload::secondary_in_reload, reload::secondary_out_icode, reload::secondary_out_reload, reload::secondary_p, small_register_class_p(), targetm, type(), and reload::when_needed.
Referenced by push_reload().