1 /* This was cut down from reload1.c in May 2001, was observed to cause
2 a bootstrap failure for powerpc-apple-darwin1.3.
4 Copyright (C) 2001 Free Software Foundation. */
8 CODE_FOR_extendqidi2 = 3,
20 typedef unsigned long long HARD_REG_ELT_TYPE;
21 typedef HARD_REG_ELT_TYPE HARD_REG_SET[((77 + (8 * 8) - 1) / (8 * 8))];
28 LAST_AND_UNUSED_RTX_CODE = 256
34 unsigned base_after_vec:1;
35 unsigned min_after_vec:1;
36 unsigned max_after_vec:1;
37 unsigned min_after_base:1;
38 unsigned max_after_base:1;
39 unsigned offset_unsigned:1;
44 typedef union rtunion_def
51 struct rtvec_def *rtvec;
52 enum machine_mode rttype;
53 addr_diff_vec_flags rt_addr_diff_vec_flags;
54 struct cselib_val_struct *rt_cselib;
55 struct bitmap_head_def *rtbit;
56 union tree_node *rttree;
57 struct basic_block_def *bb;
60 typedef struct rtx_def
62 enum rtx_code code:16;
63 enum machine_mode mode:8;
66 unsigned int unchanging:1;
67 unsigned int volatil:1;
68 unsigned int in_struct:1;
70 unsigned integrated:1;
71 unsigned frame_related:1;
78 RELOAD_FOR_INPUT, RELOAD_FOR_OUTPUT, RELOAD_FOR_INSN,
79 RELOAD_FOR_INPUT_ADDRESS, RELOAD_FOR_INPADDR_ADDRESS,
80 RELOAD_FOR_OUTPUT_ADDRESS, RELOAD_FOR_OUTADDR_ADDRESS,
81 RELOAD_FOR_OPERAND_ADDRESS, RELOAD_FOR_OPADDR_ADDR,
82 RELOAD_OTHER, RELOAD_FOR_OTHER_ADDRESS
89 // enum reg_class class;
90 enum machine_mode inmode;
91 enum machine_mode outmode;
92 enum machine_mode mode;
100 int secondary_in_reload;
101 int secondary_out_reload;
102 enum insn_code secondary_in_icode;
103 enum insn_code secondary_out_icode;
104 enum reload_type when_needed;
105 unsigned int optional:1;
106 unsigned int nocombine:1;
107 unsigned int secondary_p:1;
108 unsigned int nongroup:1;
116 extern int n_reloads;
117 static short reload_order[(2 * 10 * (2 + 1))];
118 int reload_spill_index[(2 * 10 * (2 + 1))];
119 extern struct reload rld[(2 * 10 * (2 + 1))];
120 static rtx *reg_last_reload_reg;
121 static HARD_REG_SET reg_reloaded_valid;
122 static HARD_REG_SET reg_reloaded_dead;
123 static HARD_REG_SET reg_reloaded_died;
124 static HARD_REG_SET reg_is_output_reload;
125 extern const unsigned int mode_size[];
126 extern int target_flags;
129 emit_reload_insns (chain)
130 struct insn_chain *chain;
132 rtx insn = chain->insn;
134 rtx following_insn = (((insn)->fld[2]).rtx);
135 rtx before_insn = (((insn)->fld[1]).rtx);
137 for (j = 0; j < n_reloads; j++)
139 register int r = reload_order[j];
140 register int i = reload_spill_index[r];
143 rtx out = (((enum rtx_code) (rld[r].out)->code) == REG ? rld[r].out : rld[r].out_reg);
144 register int nregno = (((out)->fld[0]).rtuint);
148 rtx src_reg, store_insn = (rtx) 0;
150 reg_last_reload_reg[nregno] = 0;
151 if (src_reg && ((enum rtx_code) (src_reg)->code) == REG && (((src_reg)->fld[0]).rtuint) < 77)
153 int src_regno = (((src_reg)->fld[0]).rtuint);
157 63) ? (((mode_size[(int) (rld[r].mode)]) + 8 -
158 1) / 8) : (((mode_size[(int) (rld[r].mode)]) +
159 (!(target_flags & 0x00000020) ? 4 :
160 8) - 1) / (!(target_flags & 0x00000020) ? 4 : 8)));
166 [(src_regno + nr) / ((unsigned) (8 * 8))] &=
167 ~(((HARD_REG_ELT_TYPE) (1)) << ((src_regno + nr) % ((unsigned) (8 * 8)))));
168 ((reg_reloaded_valid)
169 [(src_regno + nr) / ((unsigned) (8 * 8))] |=
170 ((HARD_REG_ELT_TYPE) (1)) << ((src_regno + nr) % ((unsigned) (8 * 8))));
171 ((reg_is_output_reload)
172 [(src_regno + nr) / ((unsigned) (8 * 8))] |=
173 ((HARD_REG_ELT_TYPE) (1)) << ((src_regno + nr) % ((unsigned) (8 * 8))));
176 [(src_regno) / ((unsigned) (8 * 8))] |=
177 ((HARD_REG_ELT_TYPE) (1)) << ((src_regno) % ((unsigned) (8 * 8))));
180 [(src_regno) / ((unsigned) (8 * 8))] &=
181 ~(((HARD_REG_ELT_TYPE) (1)) << ((src_regno) % ((unsigned) (8 * 8)))));
183 reg_last_reload_reg[nregno] = src_reg;
193 [(int) (((enum machine_mode) (rld[r].out)->mode))]) +
198 [(int) (((enum machine_mode) (rld[r].out)->mode))]) +
199 (!(target_flags & 0x00000020) ? 4 : 8) - 1) / (!(target_flags & 0x00000020) ? 4 : 8)));
200 while (num_regs-- > 0)
201 reg_last_reload_reg[nregno + num_regs] = 0;