Good day and welcome to the FIRM XMALLOC*() macros. These macros are provided for...
[libfirm] / ir / be / ia32 / ia32_x87.c
index 67d72ea..080d331 100644 (file)
@@ -39,6 +39,7 @@
 #include "irgwalk.h"
 #include "obst.h"
 #include "pmap.h"
+#include "array_t.h"
 #include "pdeq.h"
 #include "irprintf.h"
 #include "debug.h"
@@ -1237,7 +1238,7 @@ static int sim_store(x87_state *state, ir_node *n, ir_op *op, ir_op *op_p) {
                                set_ia32_frame_ent(vfld, get_ia32_frame_ent(n));
                                if (is_ia32_use_frame(n))
                                        set_ia32_use_frame(vfld);
-                               set_ia32_op_type(vfld, ia32_am_Source);
+                               set_ia32_op_type(vfld, ia32_AddrModeS);
                                add_ia32_am_offs_int(vfld, get_ia32_am_offs_int(n));
                                set_ia32_am_sc(vfld, get_ia32_am_sc(n));
                                set_ia32_ls_mode(vfld, get_ia32_ls_mode(n));
@@ -1341,12 +1342,9 @@ static int sim_fisttp(x87_state *state, ir_node *n) {
        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) {
@@ -1354,35 +1352,30 @@ static int sim_fisttp(x87_state *state, ir_node *n) {
                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];
@@ -1803,14 +1796,14 @@ static int sim_Copy(x87_state *state, ir_node *n) {
        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);
@@ -2354,7 +2347,6 @@ static void x87_init_simulator(x87_simulator *sim, ir_graph *irg,
        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));