x87_simulator *sim = state->sim;
ir_node *val = get_irn_n(n, n_ia32_vfst_val);
const arch_register_t *op2 = x87_get_irn_register(sim, val);
- unsigned live = vfp_live_args_after(sim, n, 0);
int insn = NO_NODE_ADDED;
ia32_x87_attr_t *attr;
int op2_reg_idx, op2_idx, depth;
- int live_after_node;
- ir_mode *mode;
op2_reg_idx = arch_register_get_index(op2);
if (op2_reg_idx == REG_VFP_UKNWN) {
if (state->depth > 0) {
op2_idx = 0;
DEBUG_ONLY(op2 = NULL);
- live_after_node = 1;
} else {
/* produce a new value which we will consume immediately */
x87_create_fldz(state, n, op2_reg_idx);
- live_after_node = 0;
op2_idx = x87_on_stack(state, op2_reg_idx);
assert(op2_idx >= 0);
}
} else {
op2_idx = x87_on_stack(state, op2_reg_idx);
- live_after_node = is_vfp_live(arch_register_get_index(op2), live);
DB((dbg, LEVEL_1, ">>> %+F %s ->\n", n, arch_register_get_name(op2)));
assert(op2_idx >= 0);
}
- mode = get_ia32_ls_mode(n);
depth = x87_get_depth(state);
- if (live_after_node) {
- /* ffistp always pop the stack */
- panic("vfisttp with live input detected, RA failed");
- } else {
- /* we can only store the tos to memory */
- if (op2_idx != 0)
- x87_create_fxch(state, n, op2_idx);
+ /* Note: although the value is still live here, it is destroyed because
+ of the pop. The register allocator is aware of that and introduced a copy
+ if the value must be alive. */
- x87_pop(state);
- x87_patch_insn(n, op_ia32_fisttp);
- }
+ /* we can only store the tos to memory */
+ if (op2_idx != 0)
+ x87_create_fxch(state, n, op2_idx);
+
+ x87_pop(state);
+ x87_patch_insn(n, op_ia32_fisttp);
attr = get_ia32_x87_attr(n);
attr->x87[1] = op2 = &ia32_st_regs[0];
ir_node *pred;
const arch_register_t *out;
const arch_register_t *op1;
- const arch_register_class_t *class;
+ const arch_register_class_t *cls;
ir_node *node, *next;
ia32_x87_attr_t *attr;
int op1_idx, out_idx;
unsigned live;
- class = arch_get_irn_reg_class(sim->arch_env, n, -1);
- if (class->regs != ia32_vfp_regs)
+ cls = arch_get_irn_reg_class(sim->arch_env, n, -1);
+ if (cls->regs != ia32_vfp_regs)
return 0;
pred = get_irn_n(n, 0);
sim->arch_env = arch_env;
sim->n_idx = get_irg_last_idx(irg);
sim->live = obstack_alloc(&sim->obst, sizeof(*sim->live) * sim->n_idx);
- sim->isa = (ia32_isa_t *)arch_env->isa;
DB((dbg, LEVEL_1, "--------------------------------\n"
"x87 Simulator started for %+F\n", irg));