|
|
1.1 root 1: /* Communication between reload.c and reload1.c.
2: Copyright (C) 1987, 1991 Free Software Foundation, Inc.
3:
4: This file is part of GNU CC.
5:
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)
9: any later version.
10:
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.
15:
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, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20:
21: /* If secondary reloads are the same for inputs and outputs, define those
22: macros here. */
23:
24: #ifdef SECONDARY_RELOAD_CLASS
25: #define SECONDARY_INPUT_RELOAD_CLASS(CLASS, MODE, X) \
26: SECONDARY_RELOAD_CLASS (CLASS, MODE, X)
27: #define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, X) \
28: SECONDARY_RELOAD_CLASS (CLASS, MODE, X)
29: #endif
30:
31: /* If either macro is defined, show that we need secondary reloads. */
32: #if defined(SECONDARY_INPUT_RELOAD_CLASS) || defined(SECONDARY_OUTPUT_RELOAD_CLASS)
33: #define HAVE_SECONDARY_RELOADS
34: #endif
35:
36: /* See reload.c and reload1.c for comments on these variables. */
37:
38: /* Maximum number of reloads we can need. */
39: #define MAX_RELOADS (2 * MAX_RECOG_OPERANDS * (MAX_REGS_PER_ADDRESS + 1))
40:
41: extern rtx reload_in[MAX_RELOADS];
42: extern rtx reload_out[MAX_RELOADS];
43: extern rtx reload_in_reg[MAX_RELOADS];
44: extern enum reg_class reload_reg_class[MAX_RELOADS];
45: extern enum machine_mode reload_inmode[MAX_RELOADS];
46: extern enum machine_mode reload_outmode[MAX_RELOADS];
47: extern char reload_strict_low[MAX_RELOADS];
48: extern char reload_optional[MAX_RELOADS];
49: extern int reload_inc[MAX_RELOADS];
50: extern int reload_needed_for_multiple[MAX_RELOADS];
51: extern rtx reload_needed_for[MAX_RELOADS];
52: extern int reload_secondary_reload[MAX_RELOADS];
53: extern int reload_secondary_p[MAX_RELOADS];
54: #ifdef MAX_INSN_CODE
55: extern enum insn_code reload_secondary_icode[MAX_RELOADS];
56: #endif
57: extern int n_reloads;
58:
59: extern rtx reload_reg_rtx[MAX_RELOADS];
60:
61: enum reload_when_needed
62: {
63: RELOAD_FOR_INPUT_RELOAD_ADDRESS,
64: RELOAD_FOR_OUTPUT_RELOAD_ADDRESS,
65: RELOAD_FOR_OPERAND_ADDRESS,
66: /* The following two are not fully implemented.
67: They are used in emitting insns, but they aren't distinguished from
68: RELOAD_OTHER when computing the number of spills. What they accomplish
69: is to avoid precluding inheritance of already loaded values
70: for input reloads when there are also output reloads. */
71: RELOAD_FOR_INPUT,
72: RELOAD_FOR_OUTPUT,
73: RELOAD_OTHER
74: };
75:
76: extern enum reload_when_needed reload_when_needed[MAX_RELOADS];
77:
78: extern rtx *reg_equiv_constant;
79: extern rtx *reg_equiv_address;
80: extern rtx *reg_equiv_mem;
81:
82: /* All the "earlyclobber" operands of the current insn
83: are recorded here. */
84: extern int n_earlyclobbers;
85: extern rtx reload_earlyclobbers[MAX_RECOG_OPERANDS];
86:
87: /* First uid used by insns created by reload in this function.
88: Used in find_equiv_reg. */
89: extern int reload_first_uid;
90:
91: /* Nonzero if indirect addressing is supported when the innermost MEM is
92: of the form (MEM (SYMBOL_REF sym)). It is assumed that the level to
93: which these are valid is the same as spill_indirect_levels, above. */
94:
95: extern char indirect_symref_ok;
96:
97: /* Nonzero if an address (plus (reg frame_pointer) (reg ...)) is valid. */
98: extern char double_reg_address_ok;
99:
100: #ifdef MAX_INSN_CODE
101: /* These arrays record the insn_code of insns that may be needed to
102: perform input and output reloads of special objects. They provide a
103: place to pass a scratch register. */
104: extern enum insn_code reload_in_optab[];
105: extern enum insn_code reload_out_optab[];
106: #endif
107:
108: extern void init_reload ();
109: extern void find_reloads ();
110: extern void subst_reloads ();
111: extern rtx eliminate_regs ();
112: extern rtx gen_input_reload ();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.