static void ia32_perform_memory_operand(ir_node *irn, ir_node *spill,
unsigned int i)
{
+ ir_mode *load_mode;
+ ir_mode *dest_op_mode;
+
ia32_code_gen_t *cg = ia32_current_cg;
assert(ia32_possible_memory_operand(irn, i) && "Cannot perform memory operand change");
}
set_ia32_op_type(irn, ia32_AddrModeS);
- set_ia32_ls_mode(irn, get_irn_mode(get_irn_n(irn, i)));
+
+ load_mode = get_irn_mode(get_irn_n(irn, i));
+ dest_op_mode = get_ia32_ls_mode(irn);
+ if (get_mode_size_bits(load_mode) <= get_mode_size_bits(dest_op_mode)) {
+ set_ia32_ls_mode(irn, load_mode);
+ }
set_ia32_use_frame(irn);
set_ia32_need_stackent(irn);
set_irn_n(irn, n_ia32_base, get_irg_frame(get_irn_irg(irn)));
set_irn_n(irn, n_ia32_binary_right, ia32_get_admissible_noreg(cg, irn, n_ia32_binary_right));
set_irn_n(irn, n_ia32_mem, spill);
+ set_ia32_is_reload(irn);
/* immediates are only allowed on the right side */
if (i == n_ia32_binary_left && is_ia32_Immediate(get_irn_n(irn, n_ia32_binary_left))) {
if (is_ia32_need_stackent(node) || is_ia32_Load(node)) {
const ir_mode *mode = get_ia32_ls_mode(node);
const ia32_attr_t *attr = get_ia32_attr_const(node);
- int align = get_mode_size_bytes(mode);
+ int align;
+
+ if (is_ia32_is_reload(node)) {
+ mode = get_spill_mode_mode(mode);
+ }
if(attr->data.need_64bit_stackent) {
mode = mode_Ls;
if(attr->data.need_32bit_stackent) {
mode = mode_Is;
}
+ align = get_mode_size_bytes(mode);
be_node_needs_frame_entity(env, node, mode, align);
} else if (is_ia32_vfild(node) || is_ia32_xLoad(node)
|| is_ia32_vfld(node)) {
/* need stackent */
fprintf(F, "need stackent = %d\n", is_ia32_need_stackent(n));
+ /* need stackent */
+ fprintf(F, "is reload = %d\n", is_ia32_is_reload(n));
+
/* dump latency */
fprintf(F, "latency = %d\n", get_ia32_latency(n));
return attr->data.need_stackent;
}
+void set_ia32_is_reload(ir_node *node) {
+ ia32_attr_t *attr = get_ia32_attr(node);
+ attr->data.is_reload = 1;
+}
+
+int is_ia32_is_reload(const ir_node *node) {
+ const ia32_attr_t *attr = get_ia32_attr_const(node);
+ return attr->data.is_reload;
+}
+
/**
* Gets the mode of the stored/loaded value (only set for Store/Load)
*/