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

Revision 8834, 9.0 KB checked in by ghudson, 28 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r8833, which included commits to RCS files with non-trunk default branches.
Line 
1/* Communication between reload.c and reload1.c.
2   Copyright (C) 1987, 1991, 1992, 1993, 1994 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 rtx reload_in[MAX_RELOADS];
43extern rtx reload_out[MAX_RELOADS];
44extern rtx reload_in_reg[MAX_RELOADS];
45extern enum reg_class reload_reg_class[MAX_RELOADS];
46extern enum machine_mode reload_inmode[MAX_RELOADS];
47extern enum machine_mode reload_outmode[MAX_RELOADS];
48extern char reload_optional[MAX_RELOADS];
49extern int reload_inc[MAX_RELOADS];
50extern int reload_opnum[MAX_RELOADS];
51extern int reload_secondary_p[MAX_RELOADS];
52extern int reload_secondary_in_reload[MAX_RELOADS];
53extern int reload_secondary_out_reload[MAX_RELOADS];
54#ifdef MAX_INSN_CODE
55extern enum insn_code reload_secondary_in_icode[MAX_RELOADS];
56extern enum insn_code reload_secondary_out_icode[MAX_RELOADS];
57#endif
58extern int n_reloads;
59
60extern rtx reload_reg_rtx[MAX_RELOADS];
61
62/* Encode the usage of a reload.  The following codes are supported:
63
64   RELOAD_FOR_INPUT             reload of an input operand
65   RELOAD_FOR_OUTPUT            likewise, for output
66   RELOAD_FOR_INSN              a reload that must not conflict with anything
67                                used in the insn, but may conflict with
68                                something used before or after the insn
69   RELOAD_FOR_INPUT_ADDRESS     reload for parts of the address of an object
70                                that is an input reload
71   RELOAD_FOR_OUTPUT_ADDRESS    likewise, for output reload
72   RELOAD_FOR_OPERAND_ADDRESS   reload for the address of a non-reloaded
73                                operand; these don't conflict with
74                                any other addresses.
75   RELOAD_FOR_OPADDR_ADDR       reload needed for RELOAD_FOR_OPERAND_ADDRESS
76                                reloads; usually secondary reloads
77   RELOAD_OTHER                 none of the above, usually multiple uses
78   RELOAD_FOR_OTHER_ADDRESS     reload for part of the address of an input
79                                that is marked RELOAD_OTHER.
80
81   This used to be "enum reload_when_needed" but some debuggers have trouble
82   with an enum tag and variable of the same name.  */
83
84enum reload_type
85{
86  RELOAD_FOR_INPUT, RELOAD_FOR_OUTPUT, RELOAD_FOR_INSN,
87  RELOAD_FOR_INPUT_ADDRESS, RELOAD_FOR_OUTPUT_ADDRESS,
88  RELOAD_FOR_OPERAND_ADDRESS, RELOAD_FOR_OPADDR_ADDR,
89  RELOAD_OTHER, RELOAD_FOR_OTHER_ADDRESS
90};
91
92extern enum reload_type reload_when_needed[MAX_RELOADS];
93
94extern rtx *reg_equiv_constant;
95extern rtx *reg_equiv_memory_loc;
96extern rtx *reg_equiv_address;
97extern rtx *reg_equiv_mem;
98
99/* All the "earlyclobber" operands of the current insn
100   are recorded here.  */
101extern int n_earlyclobbers;
102extern rtx reload_earlyclobbers[MAX_RECOG_OPERANDS];
103
104/* Save the number of operands.  */
105extern int reload_n_operands;
106
107/* First uid used by insns created by reload in this function.
108   Used in find_equiv_reg.  */
109extern int reload_first_uid;
110
111/* Nonzero if indirect addressing is supported when the innermost MEM is
112   of the form (MEM (SYMBOL_REF sym)).  It is assumed that the level to
113   which these are valid is the same as spill_indirect_levels, above.   */
114
115extern char indirect_symref_ok;
116
117/* Nonzero if an address (plus (reg frame_pointer) (reg ...)) is valid.  */
118extern char double_reg_address_ok;
119
120#ifdef MAX_INSN_CODE
121/* These arrays record the insn_code of insns that may be needed to
122   perform input and output reloads of special objects.  They provide a
123   place to pass a scratch register.  */
124extern enum insn_code reload_in_optab[];
125extern enum insn_code reload_out_optab[];
126#endif
127
128/* Functions from reload.c:  */
129
130/* Return a memory location that will be used to copy X in mode MODE. 
131   If we haven't already made a location for this mode in this insn,
132   call find_reloads_address on the location being returned.  */
133extern rtx get_secondary_mem PROTO((rtx, enum machine_mode,
134                                    int, enum reload_type));
135
136/* Clear any secondary memory locations we've made.  */
137extern void clear_secondary_mem PROTO((void));
138
139/* Transfer all replacements that used to be in reload FROM to be in
140   reload TO.  */
141extern void transfer_replacements PROTO((int, int));
142
143/* Return 1 if ADDR is a valid memory address for mode MODE,
144   and check that each pseudo reg has the proper kind of
145   hard reg.  */
146extern int strict_memory_address_p PROTO((enum machine_mode, rtx));
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 STDIO_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));
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.