OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gcc-4.5.1/] [gcc/] [reload.h] - Blame information for rev 847

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 280 jeremybenn
/* Communication between reload.c, reload1.c and the rest of compiler.
2
   Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1997, 1998, 1999,
3
   2000, 2001, 2003, 2004, 2007, 2008, 2010
4
   Free Software Foundation, Inc.
5
 
6
This file is part of GCC.
7
 
8
GCC is free software; you can redistribute it and/or modify it under
9
the terms of the GNU General Public License as published by the Free
10
Software Foundation; either version 3, or (at your option) any later
11
version.
12
 
13
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14
WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16
for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING3.  If not see
20
<http://www.gnu.org/licenses/>.  */
21
 
22
 
23
/* If secondary reloads are the same for inputs and outputs, define those
24
   macros here.  */
25
 
26
#ifdef SECONDARY_RELOAD_CLASS
27
#define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) \
28
  SECONDARY_RELOAD_CLASS (CLASS, MODE, X)
29
#define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X) \
30
  SECONDARY_RELOAD_CLASS (CLASS, MODE, X)
31
#endif
32
 
33
/* If MEMORY_MOVE_COST isn't defined, give it a default here.  */
34
#ifndef MEMORY_MOVE_COST
35
#define MEMORY_MOVE_COST(MODE,CLASS,IN) \
36
  (4 + memory_move_secondary_cost ((MODE), (CLASS), (IN)))
37
#endif
38
extern int memory_move_secondary_cost (enum machine_mode, enum reg_class, int);
39
 
40
/* Maximum number of reloads we can need.  */
41
#define MAX_RELOADS (2 * MAX_RECOG_OPERANDS * (MAX_REGS_PER_ADDRESS + 1))
42
 
43
/* Encode the usage of a reload.  The following codes are supported:
44
 
45
   RELOAD_FOR_INPUT             reload of an input operand
46
   RELOAD_FOR_OUTPUT            likewise, for output
47
   RELOAD_FOR_INSN              a reload that must not conflict with anything
48
                                used in the insn, but may conflict with
49
                                something used before or after the insn
50
   RELOAD_FOR_INPUT_ADDRESS     reload for parts of the address of an object
51
                                that is an input reload
52
   RELOAD_FOR_INPADDR_ADDRESS   reload needed for RELOAD_FOR_INPUT_ADDRESS
53
   RELOAD_FOR_OUTPUT_ADDRESS    like RELOAD_FOR INPUT_ADDRESS, for output
54
   RELOAD_FOR_OUTADDR_ADDRESS   reload needed for RELOAD_FOR_OUTPUT_ADDRESS
55
   RELOAD_FOR_OPERAND_ADDRESS   reload for the address of a non-reloaded
56
                                operand; these don't conflict with
57
                                any other addresses.
58
   RELOAD_FOR_OPADDR_ADDR       reload needed for RELOAD_FOR_OPERAND_ADDRESS
59
                                reloads; usually secondary reloads
60
   RELOAD_OTHER                 none of the above, usually multiple uses
61
   RELOAD_FOR_OTHER_ADDRESS     reload for part of the address of an input
62
                                that is marked RELOAD_OTHER.
63
 
64
   This used to be "enum reload_when_needed" but some debuggers have trouble
65
   with an enum tag and variable of the same name.  */
66
 
67
enum reload_type
68
{
69
  RELOAD_FOR_INPUT, RELOAD_FOR_OUTPUT, RELOAD_FOR_INSN,
70
  RELOAD_FOR_INPUT_ADDRESS, RELOAD_FOR_INPADDR_ADDRESS,
71
  RELOAD_FOR_OUTPUT_ADDRESS, RELOAD_FOR_OUTADDR_ADDRESS,
72
  RELOAD_FOR_OPERAND_ADDRESS, RELOAD_FOR_OPADDR_ADDR,
73
  RELOAD_OTHER, RELOAD_FOR_OTHER_ADDRESS
74
};
75
 
76
#ifdef GCC_INSN_CODES_H
77
/* Each reload is recorded with a structure like this.  */
78
struct reload
79
{
80
  /* The value to reload from */
81
  rtx in;
82
  /* Where to store reload-reg afterward if nec (often the same as
83
     reload_in)  */
84
  rtx out;
85
 
86
  /* The class of registers to reload into.  */
87
  enum reg_class rclass;
88
 
89
  /* The mode this operand should have when reloaded, on input.  */
90
  enum machine_mode inmode;
91
  /* The mode this operand should have when reloaded, on output.  */
92
  enum machine_mode outmode;
93
 
94
  /* The mode of the reload register.  */
95
  enum machine_mode mode;
96
 
97
  /* the largest number of registers this reload will require.  */
98
  unsigned int nregs;
99
 
100
  /* Positive amount to increment or decrement by if
101
     reload_in is a PRE_DEC, PRE_INC, POST_DEC, POST_INC.
102
     Ignored otherwise (don't assume it is zero).  */
103
  int inc;
104
  /* A reg for which reload_in is the equivalent.
105
     If reload_in is a symbol_ref which came from
106
     reg_equiv_constant, then this is the pseudo
107
     which has that symbol_ref as equivalent.  */
108
  rtx in_reg;
109
  rtx out_reg;
110
 
111
  /* Used in find_reload_regs to record the allocated register.  */
112
  int regno;
113
  /* This is the register to reload into.  If it is zero when `find_reloads'
114
     returns, you must find a suitable register in the class specified by
115
     reload_reg_class, and store here an rtx for that register with mode from
116
     reload_inmode or reload_outmode.  */
117
  rtx reg_rtx;
118
  /* The operand number being reloaded.  This is used to group related reloads
119
     and need not always be equal to the actual operand number in the insn,
120
     though it current will be; for in-out operands, it is one of the two
121
     operand numbers.  */
122
  int opnum;
123
 
124
  /* Gives the reload number of a secondary input reload, when needed;
125
     otherwise -1.  */
126
  int secondary_in_reload;
127
  /* Gives the reload number of a secondary output reload, when needed;
128
     otherwise -1.  */
129
  int secondary_out_reload;
130
  /* If a secondary input reload is required, gives the INSN_CODE that uses the
131
     secondary reload as a scratch register, or CODE_FOR_nothing if the
132
     secondary reload register is to be an intermediate register.  */
133
  enum insn_code secondary_in_icode;
134
  /* Likewise, for a secondary output reload.  */
135
  enum insn_code secondary_out_icode;
136
 
137
  /* Classifies reload as needed either for addressing an input reload,
138
     addressing an output, for addressing a non-reloaded mem ref, or for
139
     unspecified purposes (i.e., more than one of the above).  */
140
  enum reload_type when_needed;
141
 
142
  /* Nonzero for an optional reload.  Optional reloads are ignored unless the
143
     value is already sitting in a register.  */
144
  unsigned int optional:1;
145
  /* nonzero if this reload shouldn't be combined with another reload.  */
146
  unsigned int nocombine:1;
147
  /* Nonzero if this is a secondary register for one or more reloads.  */
148
  unsigned int secondary_p:1;
149
  /* Nonzero if this reload must use a register not already allocated to a
150
     group.  */
151
  unsigned int nongroup:1;
152
};
153
 
154
extern struct reload rld[MAX_RELOADS];
155
extern int n_reloads;
156
#endif
157
 
158
extern GTY (()) VEC(rtx,gc) *reg_equiv_memory_loc_vec;
159
extern rtx *reg_equiv_constant;
160
extern rtx *reg_equiv_invariant;
161
extern rtx *reg_equiv_memory_loc;
162
extern rtx *reg_equiv_address;
163
extern rtx *reg_equiv_mem;
164
extern rtx *reg_equiv_alt_mem_list;
165
 
166
/* Element N is the list of insns that initialized reg N from its equivalent
167
   constant or memory slot.  */
168
extern GTY((length("reg_equiv_init_size"))) rtx *reg_equiv_init;
169
 
170
/* The size of the previous array, for GC purposes.  */
171
extern GTY(()) int reg_equiv_init_size;
172
 
173
/* All the "earlyclobber" operands of the current insn
174
   are recorded here.  */
175
extern int n_earlyclobbers;
176
extern rtx reload_earlyclobbers[MAX_RECOG_OPERANDS];
177
 
178
/* Save the number of operands.  */
179
extern int reload_n_operands;
180
 
181
/* First uid used by insns created by reload in this function.
182
   Used in find_equiv_reg.  */
183
extern int reload_first_uid;
184
 
185
/* Nonzero if indirect addressing is supported when the innermost MEM is
186
   of the form (MEM (SYMBOL_REF sym)).  It is assumed that the level to
187
   which these are valid is the same as spill_indirect_levels, above.  */
188
 
189
extern char indirect_symref_ok;
190
 
191
/* Nonzero if an address (plus (reg frame_pointer) (reg ...)) is valid.  */
192
extern char double_reg_address_ok;
193
 
194
extern int num_not_at_initial_offset;
195
 
196
#if defined SET_HARD_REG_BIT && defined CLEAR_REG_SET
197
/* This structure describes instructions which are relevant for reload.
198
   Apart from all regular insns, this also includes CODE_LABELs, since they
199
   must be examined for register elimination.  */
200
struct insn_chain
201
{
202
  /* Links to the neighbor instructions.  */
203
  struct insn_chain *next, *prev;
204
 
205
  /* Link through a chains set up by calculate_needs_all_insns, containing
206
     all insns that need reloading.  */
207
  struct insn_chain *next_need_reload;
208
 
209
  /* The rtx of the insn.  */
210
  rtx insn;
211
 
212
  /* The basic block this insn is in.  */
213
  int block;
214
 
215
  /* Nonzero if find_reloads said the insn requires reloading.  */
216
  unsigned int need_reload:1;
217
  /* Nonzero if find_reloads needs to be run during reload_as_needed to
218
     perform modifications on any operands.  */
219
  unsigned int need_operand_change:1;
220
  /* Nonzero if eliminate_regs_in_insn said it requires eliminations.  */
221
  unsigned int need_elim:1;
222
  /* Nonzero if this insn was inserted by perform_caller_saves.  */
223
  unsigned int is_caller_save_insn:1;
224
 
225
  /* Register life information: record all live hard registers, and
226
     all live pseudos that have a hard register.  This set also
227
     contains pseudos spilled by IRA.  */
228
  regset_head live_throughout;
229
  regset_head dead_or_set;
230
 
231
  /* Copies of the global variables computed by find_reloads.  */
232
  struct reload *rld;
233
  int n_reloads;
234
 
235
  /* Indicates which registers have already been used for spills.  */
236
  HARD_REG_SET used_spill_regs;
237
};
238
 
239
/* A chain of insn_chain structures to describe all non-note insns in
240
   a function.  */
241
extern struct insn_chain *reload_insn_chain;
242
 
243
/* Allocate a new insn_chain structure.  */
244
extern struct insn_chain *new_insn_chain (void);
245
 
246
extern void compute_use_by_pseudos (HARD_REG_SET *, regset);
247
#endif
248
 
249
/* Functions from reload.c:  */
250
 
251
extern enum reg_class secondary_reload_class (bool, enum reg_class,
252
                                              enum machine_mode, rtx);
253
 
254
#ifdef GCC_INSN_CODES_H
255
extern enum reg_class scratch_reload_class (enum insn_code);
256
#endif
257
 
258
/* Return a memory location that will be used to copy X in mode MODE.
259
   If we haven't already made a location for this mode in this insn,
260
   call find_reloads_address on the location being returned.  */
261
extern rtx get_secondary_mem (rtx, enum machine_mode, int, enum reload_type);
262
 
263
/* Clear any secondary memory locations we've made.  */
264
extern void clear_secondary_mem (void);
265
 
266
/* Transfer all replacements that used to be in reload FROM to be in
267
   reload TO.  */
268
extern void transfer_replacements (int, int);
269
 
270
/* IN_RTX is the value loaded by a reload that we now decided to inherit,
271
   or a subpart of it.  If we have any replacements registered for IN_RTX,
272
   cancel the reloads that were supposed to load them.
273
   Return nonzero if we canceled any reloads.  */
274
extern int remove_address_replacements (rtx in_rtx);
275
 
276
/* Like rtx_equal_p except that it allows a REG and a SUBREG to match
277
   if they are the same hard reg, and has special hacks for
278
   autoincrement and autodecrement.  */
279
extern int operands_match_p (rtx, rtx);
280
 
281
/* Return 1 if altering OP will not modify the value of CLOBBER.  */
282
extern int safe_from_earlyclobber (rtx, rtx);
283
 
284
/* Search the body of INSN for values that need reloading and record them
285
   with push_reload.  REPLACE nonzero means record also where the values occur
286
   so that subst_reloads can be used.  */
287
extern int find_reloads (rtx, int, int, int, short *);
288
 
289
/* Compute the sum of X and Y, making canonicalizations assumed in an
290
   address, namely: sum constant integers, surround the sum of two
291
   constants with a CONST, put the constant as the second operand, and
292
   group the constant on the outermost sum.  */
293
extern rtx form_sum (enum machine_mode, rtx, rtx);
294
 
295
/* Substitute into the current INSN the registers into which we have reloaded
296
   the things that need reloading.  */
297
extern void subst_reloads (rtx);
298
 
299
/* Make a copy of any replacements being done into X and move those copies
300
   to locations in Y, a copy of X.  We only look at the highest level of
301
   the RTL.  */
302
extern void copy_replacements (rtx, rtx);
303
 
304
/* Change any replacements being done to *X to be done to *Y */
305
extern void move_replacements (rtx *x, rtx *y);
306
 
307
/* If LOC was scheduled to be replaced by something, return the replacement.
308
   Otherwise, return *LOC.  */
309
extern rtx find_replacement (rtx *);
310
 
311
/* Nonzero if modifying X will affect IN.  */
312
extern int reg_overlap_mentioned_for_reload_p (rtx, rtx);
313
 
314
/* Check the insns before INSN to see if there is a suitable register
315
   containing the same value as GOAL.  */
316
extern rtx find_equiv_reg (rtx, rtx, enum reg_class, int, short *,
317
                           int, enum machine_mode);
318
 
319
/* Return 1 if register REGNO is the subject of a clobber in insn INSN.  */
320
extern int regno_clobbered_p (unsigned int, rtx, enum machine_mode, int);
321
 
322
/* Return 1 if X is an operand of an insn that is being earlyclobbered.  */
323
extern int earlyclobber_operand_p (rtx);
324
 
325
/* Record one reload that needs to be performed.  */
326
extern int push_reload (rtx, rtx, rtx *, rtx *, enum reg_class,
327
                        enum machine_mode, enum machine_mode,
328
                        int, int, int, enum reload_type);
329
 
330
/* Functions in postreload.c:  */
331
extern void reload_cse_regs (rtx);
332
 
333
/* Functions in reload1.c:  */
334
 
335
/* Initialize the reload pass once per compilation.  */
336
extern void init_reload (void);
337
 
338
/* The reload pass itself.  */
339
extern int reload (rtx, int);
340
 
341
/* Mark the slots in regs_ever_live for the hard regs
342
   used by pseudo-reg number REGNO.  */
343
extern void mark_home_live (int);
344
 
345
/* Scan X and replace any eliminable registers (such as fp) with a
346
   replacement (such as sp), plus an offset.  */
347
extern rtx eliminate_regs (rtx, enum machine_mode, rtx);
348
extern bool elimination_target_reg_p (rtx);
349
 
350
/* Deallocate the reload register used by reload number R.  */
351
extern void deallocate_reload_reg (int r);
352
 
353
/* True if caller-save has been reinitialized.  */
354
extern bool caller_save_initialized_p;
355
 
356
/* Functions in caller-save.c:  */
357
 
358
/* Initialize for caller-save.  */
359
extern void init_caller_save (void);
360
 
361
/* Initialize save areas by showing that we haven't allocated any yet.  */
362
extern void init_save_areas (void);
363
 
364
/* Allocate save areas for any hard registers that might need saving.  */
365
extern void setup_save_areas (void);
366
 
367
/* Find the places where hard regs are live across calls and save them.  */
368
extern void save_call_clobbered_regs (void);
369
 
370
/* Replace (subreg (reg)) with the appropriate (reg) for any operands.  */
371
extern void cleanup_subreg_operands (rtx);
372
 
373
/* Debugging support.  */
374
extern void debug_reload_to_stream (FILE *);
375
extern void debug_reload (void);
376
 
377
/* Compute the actual register we should reload to, in case we're
378
   reloading to/from a register that is wider than a word.  */
379
extern rtx reload_adjust_reg_for_mode (rtx, enum machine_mode);

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.