source: trunk/third/gcc/reload.h @ 11288

Revision 11288, 9.1 KB checked in by ghudson, 26 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r11287, which included commits to RCS files with non-trunk default branches.
Line 
1/* Communication between reload.c and reload1.c.
2   Copyright (C) 1987, 91, 92, 93, 94, 95, 1997 Free Software Foundation, Inc.
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING.  If not, write to
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA.  */
20
21
22/* If secondary reloads are the same for inputs and outputs, define those
23   macros here.  */
24
25#ifdef SECONDARY_RELOAD_CLASS
26#define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) \
27  SECONDARY_RELOAD_CLASS (CLASS, MODE, X)
28#define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X) \
29  SECONDARY_RELOAD_CLASS (CLASS, MODE, X)
30#endif
31
32/* If either macro is defined, show that we need secondary reloads.  */
33#if defined(SECONDARY_INPUT_RELOAD_CLASS) || defined(SECONDARY_OUTPUT_RELOAD_CLASS)
34#define HAVE_SECONDARY_RELOADS
35#endif
36
37/* See reload.c and reload1.c for comments on these variables.  */
38
39/* Maximum number of reloads we can need.  */
40#define MAX_RELOADS (2 * MAX_RECOG_OPERANDS * (MAX_REGS_PER_ADDRESS + 1))
41
42extern enum reg_class reload_address_base_reg_class;
43extern enum reg_class reload_address_index_reg_class;
44extern rtx reload_in[MAX_RELOADS];
45extern rtx reload_out[MAX_RELOADS];
46extern rtx reload_in_reg[MAX_RELOADS];
47extern enum reg_class reload_reg_class[MAX_RELOADS];
48extern enum machine_mode reload_inmode[MAX_RELOADS];
49extern enum machine_mode reload_outmode[MAX_RELOADS];
50extern char reload_optional[MAX_RELOADS];
51extern int reload_inc[MAX_RELOADS];
52extern int reload_opnum[MAX_RELOADS];
53extern int reload_secondary_p[MAX_RELOADS];
54extern int reload_secondary_in_reload[MAX_RELOADS];
55extern int reload_secondary_out_reload[MAX_RELOADS];
56#ifdef MAX_INSN_CODE
57extern enum insn_code reload_secondary_in_icode[MAX_RELOADS];
58extern enum insn_code reload_secondary_out_icode[MAX_RELOADS];
59#endif
60extern int n_reloads;
61
62extern rtx reload_reg_rtx[MAX_RELOADS];
63
64/* Encode the usage of a reload.  The following codes are supported:
65
66   RELOAD_FOR_INPUT             reload of an input operand
67   RELOAD_FOR_OUTPUT            likewise, for output
68   RELOAD_FOR_INSN              a reload that must not conflict with anything
69                                used in the insn, but may conflict with
70                                something used before or after the insn
71   RELOAD_FOR_INPUT_ADDRESS     reload for parts of the address of an object
72                                that is an input reload
73   RELOAD_FOR_INPADDR_ADDRESS   reload needed for RELOAD_FOR_INPUT_ADDRESS
74   RELOAD_FOR_OUTPUT_ADDRESS    like RELOAD_FOR INPUT_ADDRESS, for output
75   RELOAD_FOR_OUTADDR_ADDRESS   reload needed for RELOAD_FOR_OUTPUT_ADDRESS
76   RELOAD_FOR_OPERAND_ADDRESS   reload for the address of a non-reloaded
77                                operand; these don't conflict with
78                                any other addresses.
79   RELOAD_FOR_OPADDR_ADDR       reload needed for RELOAD_FOR_OPERAND_ADDRESS
80                                reloads; usually secondary reloads
81   RELOAD_OTHER                 none of the above, usually multiple uses
82   RELOAD_FOR_OTHER_ADDRESS     reload for part of the address of an input
83                                that is marked RELOAD_OTHER.
84
85   This used to be "enum reload_when_needed" but some debuggers have trouble
86   with an enum tag and variable of the same name.  */
87
88enum reload_type
89{
90  RELOAD_FOR_INPUT, RELOAD_FOR_OUTPUT, RELOAD_FOR_INSN,
91  RELOAD_FOR_INPUT_ADDRESS, RELOAD_FOR_INPADDR_ADDRESS,
92  RELOAD_FOR_OUTPUT_ADDRESS, RELOAD_FOR_OUTADDR_ADDRESS,
93  RELOAD_FOR_OPERAND_ADDRESS, RELOAD_FOR_OPADDR_ADDR,
94  RELOAD_OTHER, RELOAD_FOR_OTHER_ADDRESS
95};
96
97extern enum reload_type reload_when_needed[MAX_RELOADS];
98
99extern rtx *reg_equiv_constant;
100extern rtx *reg_equiv_memory_loc;
101extern rtx *reg_equiv_address;
102extern rtx *reg_equiv_mem;
103
104/* All the "earlyclobber" operands of the current insn
105   are recorded here.  */
106extern int n_earlyclobbers;
107extern rtx reload_earlyclobbers[MAX_RECOG_OPERANDS];
108
109/* Save the number of operands.  */
110extern int reload_n_operands;
111
112/* First uid used by insns created by reload in this function.
113   Used in find_equiv_reg.  */
114extern int reload_first_uid;
115
116/* Nonzero if indirect addressing is supported when the innermost MEM is
117   of the form (MEM (SYMBOL_REF sym)).  It is assumed that the level to
118   which these are valid is the same as spill_indirect_levels, above.   */
119
120extern char indirect_symref_ok;
121
122/* Nonzero if an address (plus (reg frame_pointer) (reg ...)) is valid.  */
123extern char double_reg_address_ok;
124
125#ifdef MAX_INSN_CODE
126/* These arrays record the insn_code of insns that may be needed to
127   perform input and output reloads of special objects.  They provide a
128   place to pass a scratch register.  */
129extern enum insn_code reload_in_optab[];
130extern enum insn_code reload_out_optab[];
131#endif
132
133/* Functions from reload.c:  */
134
135/* Return a memory location that will be used to copy X in mode MODE. 
136   If we haven't already made a location for this mode in this insn,
137   call find_reloads_address on the location being returned.  */
138extern rtx get_secondary_mem PROTO((rtx, enum machine_mode,
139                                    int, enum reload_type));
140
141/* Clear any secondary memory locations we've made.  */
142extern void clear_secondary_mem PROTO((void));
143
144/* Transfer all replacements that used to be in reload FROM to be in
145   reload TO.  */
146extern void transfer_replacements PROTO((int, int));
147
148/* Like rtx_equal_p except that it allows a REG and a SUBREG to match
149   if they are the same hard reg, and has special hacks for
150   autoincrement and autodecrement.  */
151extern int operands_match_p PROTO((rtx, rtx));
152
153/* Return the number of times character C occurs in string S.  */
154extern int n_occurrences PROTO((int, char *));
155
156/* Return 1 if altering OP will not modify the value of CLOBBER. */
157extern int safe_from_earlyclobber PROTO((rtx, rtx));
158
159/* Search the body of INSN for values that need reloading and record them
160   with push_reload.  REPLACE nonzero means record also where the values occur
161   so that subst_reloads can be used.  */
162extern void find_reloads PROTO((rtx, int, int, int, short *));
163
164/* Compute the sum of X and Y, making canonicalizations assumed in an
165   address, namely: sum constant integers, surround the sum of two
166   constants with a CONST, put the constant as the second operand, and
167   group the constant on the outermost sum.  */
168extern rtx form_sum PROTO((rtx, rtx));
169
170/* Substitute into the current INSN the registers into which we have reloaded
171   the things that need reloading.  */
172extern void subst_reloads PROTO((void));
173
174/* Make a copy of any replacements being done into X and move those copies
175   to locations in Y, a copy of X.  We only look at the highest level of
176   the RTL.  */
177extern void copy_replacements PROTO((rtx, rtx));
178
179/* If LOC was scheduled to be replaced by something, return the replacement.
180   Otherwise, return *LOC.  */
181extern rtx find_replacement PROTO((rtx *));
182
183/* Return nonzero if register in range [REGNO, ENDREGNO)
184   appears either explicitly or implicitly in X
185   other than being stored into.  */
186extern int refers_to_regno_for_reload_p PROTO((int, int, rtx, rtx *));
187
188/* Nonzero if modifying X will affect IN.  */
189extern int reg_overlap_mentioned_for_reload_p PROTO((rtx, rtx));
190
191/* Return nonzero if anything in X contains a MEM.  Look also for pseudo
192   registers.  */
193extern int refers_to_mem_for_reload_p PROTO((rtx));
194
195/* Check the insns before INSN to see if there is a suitable register
196   containing the same value as GOAL.  */
197extern rtx find_equiv_reg PROTO((rtx, rtx, enum reg_class, int, short *,
198                                 int, enum machine_mode));
199
200/* Return 1 if register REGNO is the subject of a clobber in insn INSN.  */
201extern int regno_clobbered_p PROTO((int, rtx));
202
203
204/* Functions in reload1.c:  */
205
206/* Initialize the reload pass once per compilation.  */
207extern void init_reload PROTO((void));
208
209/* The reload pass itself.  */
210extern int reload PROTO((rtx, int, FILE *));
211
212/* Mark the slots in regs_ever_live for the hard regs
213   used by pseudo-reg number REGNO.  */
214extern void mark_home_live PROTO((int));
215
216/* Scan X and replace any eliminable registers (such as fp) with a
217   replacement (such as sp), plus an offset.  */
218extern rtx eliminate_regs PROTO((rtx, enum machine_mode, rtx, int));
219
220/* Emit code to perform a reload from IN (which may be a reload register) to
221   OUT (which may also be a reload register).  IN or OUT is from operand
222   OPNUM with reload type TYPE.  */
223extern rtx gen_reload PROTO((rtx, rtx, int, enum reload_type));
224
225/* Functions in caller-save.c:  */
226
227/* Initialize for caller-save.  */
228extern void init_caller_save PROTO((void));
229
230/* Initialize save areas by showing that we haven't allocated any yet.  */
231extern void init_save_areas PROTO((void));
232
233/* Allocate save areas for any hard registers that might need saving.  */
234extern int setup_save_areas PROTO((int *));
235
236/* Find the places where hard regs are live across calls and save them.  */
237extern void save_call_clobbered_regs PROTO((enum machine_mode));
Note: See TracBrowser for help on using the repository browser.