fixed fpu problems, several x87 fixes
authorMatthias Braun <matze@braunis.de>
Mon, 18 Jun 2007 20:47:25 +0000 (20:47 +0000)
committerMatthias Braun <matze@braunis.de>
Mon, 18 Jun 2007 20:47:25 +0000 (20:47 +0000)
[r14635]

ir/be/arm/bearch_arm.c
ir/be/belive.h
ir/be/bemain.c
ir/be/besched.c
ir/be/besched.h
ir/be/bespill.c
ir/be/bestate.c
ir/be/ia32/ia32_emitter.c
ir/be/ia32/ia32_fpu.c
ir/be/ia32/ia32_transform.c

index 0503bcc..d9999aa 100644 (file)
@@ -222,7 +222,11 @@ static ir_entity *arm_get_frame_entity(const void *self, const ir_node *irn)
        return NULL;
 }
 
-static void arm_set_frame_entity(const void *self, ir_node *irn, ir_entity *ent) {
+static void arm_set_frame_entity(const void *self, ir_node *irn, ir_entity *ent)
+{
+       (void) self;
+       (void) irn;
+       (void) ent;
        /* TODO: set the entity assigned to the frame */
 }
 
@@ -230,7 +234,11 @@ static void arm_set_frame_entity(const void *self, ir_node *irn, ir_entity *ent)
  * This function is called by the generic backend to correct offsets for
  * nodes accessing the stack.
  */
-static void arm_set_stack_bias(const void *self, ir_node *irn, int bias) {
+static void arm_set_stack_bias(const void *self, ir_node *irn, int bias)
+{
+       (void) self;
+       (void) irn;
+       (void) bias;
        /* TODO: correct offset if irn accesses the stack */
 }
 
@@ -749,7 +757,7 @@ static arm_isa_t arm_isa_template = {
        0,                     /* use generic register names instead of SP, LR, PC */
        ARM_FPU_ARCH_FPE,      /* FPU architecture */
        NULL,                  /* current code generator */
-       { NULL, },             /* emitter environment */
+       NULL_EMITTER,          /* emitter environment */
 };
 
 /**
@@ -817,6 +825,7 @@ static int arm_get_n_reg_class(const void *self) {
  * Return the register class with requested index.
  */
 static const arch_register_class_t *arm_get_reg_class(const void *self, int i) {
+       (void) self;
        return i == 0 ? &arm_reg_classes[CLASS_arm_gp] : &arm_reg_classes[CLASS_arm_fpa];
 }
 
index 1021f3c..4234d1a 100644 (file)
@@ -194,7 +194,7 @@ pset *be_liveness_nodes_live_at_input(const be_lv_t *lv, const arch_env_t *arch_
 
 /**
  * Make sure the live sets are computed.
- * @param lv The liveness infirmation.
+ * @param lv The liveness information.
  */
 void be_liveness_assure_sets(be_lv_t *lv);
 
index d27cd2f..0842d59 100644 (file)
@@ -640,7 +640,7 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
                /* fix stack offsets */
                BE_TIMER_PUSH(t_abi);
                be_abi_fix_stack_nodes(birg->abi);
-               be_remove_dead_nodes_from_schedule(irg);
+               be_remove_dead_nodes_from_schedule(birg);
                be_abi_fix_stack_bias(birg->abi);
                BE_TIMER_POP(t_abi);
 
index b602716..a2d1234 100644 (file)
@@ -137,8 +137,9 @@ ir_node *sched_skip(ir_node *from, int forward, sched_predicator_t *predicator,
 //---------------------------------------------------------------------------
 
 typedef struct remove_dead_nodes_env_t_ {
-       ir_graph *irg;
        bitset_t *reachable;
+       ir_graph *irg;
+       be_lv_t  *lv;
 } remove_dead_nodes_env_t;
 
 /**
@@ -166,16 +167,21 @@ static void remove_dead_nodes_walker(ir_node *block, void *data)
                if (bitset_is_set(env->reachable, get_irn_idx(node)))
                        continue;
 
+               if(env->lv)
+                       be_liveness_remove(env->lv, node);
                sched_remove(node);
                be_kill_node(node);
        }
 }
 
-void be_remove_dead_nodes_from_schedule(ir_graph *irg)
+void be_remove_dead_nodes_from_schedule(be_irg_t *birg)
 {
+       ir_graph *irg = be_get_birg_irg(birg);
+
        remove_dead_nodes_env_t env;
-       env.irg = irg;
        env.reachable = bitset_alloca(get_irg_last_idx(irg));
+       env.lv  = be_get_birg_liveness(birg);
+       env.irg = irg;
 
        // mark all reachable nodes
        irg_walk_graph(irg, mark_dead_nodes_walker, NULL, &env);
index cade289..29d4b38 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "irgraph.h"
 #include "irnode.h"
+#include "beirg.h"
 
 void be_sched_dump(FILE *f, ir_graph *irg);
 
@@ -76,6 +77,6 @@ void    sched_remove(ir_node *irn);
  * Removes dead nodes from schedule
  * @param irg  the graph
  */
-void be_remove_dead_nodes_from_schedule(ir_graph *irg);
+void be_remove_dead_nodes_from_schedule(be_irg_t *birg);
 
 #endif /* FIRM_BE_BESCHED_H */
index 93cfb2f..26cff16 100644 (file)
@@ -892,10 +892,11 @@ void be_insert_spills_reloads(spill_env_t *env)
        }
 #endif
 
-       be_remove_dead_nodes_from_schedule(env->irg);
        /* Matze: In theory be_ssa_construction should take care of the liveness...
         * try to disable this again in the future */
        be_liveness_invalidate(env->birg->lv);
+
+       be_remove_dead_nodes_from_schedule(env->birg);
 }
 
 void be_init_spill(void)
index 37c5cbe..52fcb23 100644 (file)
@@ -521,6 +521,7 @@ void be_assure_state(be_irg_t *birg, const arch_register_t *reg, void *func_env,
        env.uses          = be_begin_uses(irg, env.lv);
        env.spills        = NULL;
 
+       assure_doms(irg);
        set_using_visited(irg);
        set_using_irn_link(irg);
        inc_irg_visited(irg);
@@ -574,7 +575,7 @@ void be_assure_state(be_irg_t *birg, const arch_register_t *reg, void *func_env,
        }
 
        /* some nodes might be dead now. */
-       be_remove_dead_nodes_from_schedule(irg);
+       be_remove_dead_nodes_from_schedule(birg);
 
        be_end_uses(env.uses);
        obstack_free(&env.obst, NULL);
index a45e9ff..b5c3ec4 100644 (file)
@@ -155,6 +155,7 @@ char get_mode_suffix(const ir_mode *mode) {
                case 64:
                        return 'l';
                case 80:
+               case 96:
                        return 't';
                }
        } else {
index faf9f57..6a56b6e 100644 (file)
@@ -210,6 +210,8 @@ void rewire_fpu_mode_nodes(be_irg_t *birg)
                for(i = 0; i < len; ++i) {
                        be_liveness_update(lv, env.state_nodes[i]);
                }
+       } else {
+               be_liveness_invalidate(birg->lv);
        }
 
        /* set registers for the phis */
@@ -222,6 +224,8 @@ void rewire_fpu_mode_nodes(be_irg_t *birg)
        }
        be_ssa_construction_destroy(&senv);
        DEL_ARR_F(env.state_nodes);
+
+       be_liveness_invalidate(be_get_birg_liveness(birg));
 }
 
 void ia32_setup_fpu_mode(ia32_code_gen_t *cg)
index b23d2b9..75d7af4 100644 (file)
@@ -194,6 +194,7 @@ static ir_type *get_prim_type(pmap *types, ir_mode *mode)
                char buf[64];
                snprintf(buf, sizeof(buf), "prim_type_%s", get_mode_name(mode));
                res = new_type_primitive(new_id_from_str(buf), mode);
+               set_type_alignment_bytes(res, 16);
                pmap_insert(types, mode, res);
        }
        else
@@ -349,7 +350,8 @@ static ir_node *gen_SymConst(ir_node *node) {
                        cnst = new_rd_ia32_xConst(dbgi, irg, block);
                else
                        cnst = new_rd_ia32_vfConst(dbgi, irg, block);
-               set_ia32_ls_mode(cnst, mode);
+               //set_ia32_ls_mode(cnst, mode);
+               set_ia32_ls_mode(cnst, mode_E);
        } else {
                cnst = new_rd_ia32_Const(dbgi, irg, block);
        }
@@ -2381,7 +2383,9 @@ static ir_node *gen_Conv(ir_node *node) {
                                set_ia32_ls_mode(res, tgt_mode);
                        } else {
                                // Matze: TODO what about strict convs?
-                               DEBUG_ONLY(ir_fprintf(stderr, "Debug warning: strict conv %+F ignored yet\n", node));
+                               if(get_Conv_strict(node)) {
+                                       DEBUG_ONLY(ir_fprintf(stderr, "Debug warning: strict conv %+F ignored yet\n", node));
+                               }
                                DB((dbg, LEVEL_1, "killed Conv(float, float) ..."));
                                return new_op;
                        }
@@ -3310,7 +3314,6 @@ static ir_node *gen_Phi(ir_node *node) {
                /* all integer operations are on 32bit registers now */
                mode = mode_Iu;
        } else if(mode_is_float(mode)) {
-               assert(mode == mode_D || mode == mode_F);
                if (USE_SSE2(env_cg)) {
                        mode = mode_xmm;
                } else {
@@ -4225,7 +4228,6 @@ static ir_node *gen_Proj(ir_node *node) {
                        /* we exchange the ProjX with a jump */
                        block = be_transform_node(block);
                        jump  = new_rd_Jmp(dbgi, irg, block);
-                       ir_fprintf(stderr, "created jump: %+F\n", jump);
                        return jump;
                }
                if (node == be_get_old_anchor(anchor_tls)) {