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;