fixed warning on VC build
[libfirm] / ir / be / ia32 / ia32_x87.c
index c291176..ca09d3b 100644 (file)
@@ -1226,7 +1226,6 @@ 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_am_flavour(vfld, get_ia32_am_flavour(n));
                                set_ia32_op_type(vfld, ia32_am_Source);
                                add_ia32_am_offs_int(vfld, get_ia32_am_offs_int(n));
                                set_ia32_am_sc(vfld, get_ia32_am_sc(n));
@@ -1329,15 +1328,15 @@ GEN_STORE(fist)
  *
  * @return NO_NODE_ADDED
  */
-static int sim_fCondJmp(x87_state *state, ir_node *n) {
+static int sim_fCmpJmp(x87_state *state, ir_node *n) {
        int op1_idx;
        int op2_idx = -1;
        int pop_cnt = 0;
        ia32_x87_attr_t *attr;
        ir_op *dst;
        x87_simulator         *sim = state->sim;
-       ir_node               *op1_node = get_irn_n(n, n_ia32_vfCondJmp_left);
-       ir_node               *op2_node = get_irn_n(n, n_ia32_vfCondJmp_right);
+       ir_node               *op1_node = get_irn_n(n, n_ia32_vfCmpJmp_left);
+       ir_node               *op2_node = get_irn_n(n, n_ia32_vfCmpJmp_right);
        const arch_register_t *op1      = x87_get_irn_register(sim, op1_node);
        const arch_register_t *op2      = x87_get_irn_register(sim, op2_node);
        int reg_index_1 = arch_register_get_index(op1);
@@ -1537,22 +1536,32 @@ int sim_Keep(x87_state *state, ir_node *node)
        int                    reg_id;
        int                    op_stack_idx;
        unsigned               live;
+       int                    i, arity;
+       int                    node_added = NO_NODE_ADDED;
 
-       op      = get_irn_n(node, 0);
-       op_reg  = arch_get_irn_register(state->sim->arch_env, op);
-       if(arch_register_get_class(op_reg) != &ia32_reg_classes[CLASS_ia32_vfp])
-               return NO_NODE_ADDED;
+       DB((dbg, LEVEL_1, ">>> %+F\n", node));
+
+       arity = get_irn_arity(node);
+       for(i = 0; i < arity; ++i) {
+               op      = get_irn_n(node, i);
+               op_reg  = arch_get_irn_register(state->sim->arch_env, op);
+               if(arch_register_get_class(op_reg) != &ia32_reg_classes[CLASS_ia32_vfp])
+                       continue;
 
-       reg_id = arch_register_get_index(op_reg);
-       live   = vfp_live_args_after(state->sim, node, 0);
+               reg_id = arch_register_get_index(op_reg);
+               live   = vfp_live_args_after(state->sim, node, 0);
 
-       op_stack_idx = x87_on_stack(state, reg_id);
-       if(op_stack_idx >= 0 && !is_vfp_live(reg_id, live)) {
-               x87_create_fpop(state, sched_next(node), 1);
-               return NODE_ADDED;
+               op_stack_idx = x87_on_stack(state, reg_id);
+               if(op_stack_idx >= 0 && !is_vfp_live(reg_id, live)) {
+                       x87_create_fpop(state, sched_next(node), 1);
+                       node_added = NODE_ADDED;
+               }
        }
 
-       return NO_NODE_ADDED;
+       DB((dbg, LEVEL_1, "Stack after: "));
+       DEBUG_ONLY(x87_dump_stack(state));
+
+       return node_added;
 }
 
 static
@@ -1659,24 +1668,23 @@ static ir_node *create_Copy(x87_state *state, ir_node *n) {
  * @return NO_NODE_ADDED
  */
 static int sim_Copy(x87_state *state, ir_node *n) {
-       x87_simulator         *sim;
-       ir_node               *pred;
-       const arch_register_t *out;
-       const arch_register_t *op1;
-       ir_node               *node, *next;
-       ia32_x87_attr_t       *attr;
-       int                   op1_idx, out_idx;
-       unsigned              live;
-
-       ir_mode *mode = get_irn_mode(n);
-
-       if (!mode_is_float(mode))
+       x87_simulator               *sim = state->sim;
+       ir_node                     *pred;
+       const arch_register_t       *out;
+       const arch_register_t       *op1;
+       const arch_register_class_t *class;
+       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)
                return 0;
 
-       sim = state->sim;
        pred = get_irn_n(n, 0);
-       out = x87_get_irn_register(sim, n);
-       op1 = x87_get_irn_register(sim, pred);
+       out  = x87_get_irn_register(sim, n);
+       op1  = x87_get_irn_register(sim, pred);
        live = vfp_live_args_after(sim, n, REGMASK(out));
 
        DB((dbg, LEVEL_1, ">>> %+F %s -> %s\n", n,
@@ -1772,11 +1780,10 @@ static int sim_Copy(x87_state *state, ir_node *n) {
 }  /* sim_Copy */
 
 /**
- * Returns the result proj of the call, or NULL if the result is not used
+ * Returns the result proj of the call
  */
 static ir_node *get_call_result_proj(ir_node *call) {
        const ir_edge_t *edge;
-       ir_node *resproj = NULL;
 
        /* search the result proj */
        foreach_out_edge(call, edge) {
@@ -1784,23 +1791,10 @@ static ir_node *get_call_result_proj(ir_node *call) {
                long pn = get_Proj_proj(proj);
 
                if (pn == pn_be_Call_first_res) {
-                       resproj = proj;
-                       break;
-               }
-       }
-       if (resproj == NULL) {
-               return NULL;
-       }
-
-       /* the result proj is connected to a Keep and maybe other nodes */
-       foreach_out_edge(resproj, edge) {
-               ir_node *pred = get_edge_src_irn(edge);
-               if (!be_is_Keep(pred)) {
-                       return resproj;
+                       return proj;
                }
        }
 
-       /* only be_Keep found, so result is not used */
        return NULL;
 }  /* get_call_result_proj */
 
@@ -1822,11 +1816,13 @@ static int sim_Call(x87_state *state, ir_node *n, const arch_env_t *arch_env)
        const arch_register_t *reg;
        (void) arch_env;
 
+       DB((dbg, LEVEL_1, ">>> %+F\n", n));
+
        /* at the begin of a call the x87 state should be empty */
        assert(state->depth == 0 && "stack not empty before call");
 
        if (get_method_n_ress(call_tp) <= 0)
-               return NO_NODE_ADDED;
+               goto end_call;
 
        /*
         * If the called function returns a float, it is returned in st(0).
@@ -1837,15 +1833,18 @@ static int sim_Call(x87_state *state, ir_node *n, const arch_env_t *arch_env)
        mode     = get_type_mode(res_type);
 
        if (mode == NULL || !mode_is_float(mode))
-               return NO_NODE_ADDED;
+               goto end_call;
 
        resproj = get_call_result_proj(n);
-       if (resproj == NULL)
-               return NO_NODE_ADDED;
+       assert(resproj != NULL);
 
        reg = x87_get_irn_register(state->sim, resproj);
        x87_push(state, arch_register_get_index(reg), resproj);
 
+end_call:
+       DB((dbg, LEVEL_1, "Stack after: "));
+       DEBUG_ONLY(x87_dump_stack(state));
+
        return NO_NODE_ADDED;
 }  /* sim_Call */
 
@@ -2228,7 +2227,7 @@ static void x87_init_simulator(x87_simulator *sim, ir_graph *irg,
        ASSOC_IA32(fchs);
        ASSOC_IA32(fist);
        ASSOC_IA32(fst);
-       ASSOC_IA32(fCondJmp);
+       ASSOC_IA32(fCmpJmp);
        ASSOC_BE(Copy);
        ASSOC_BE(Call);
        ASSOC_BE(Spill);