fixed DivMod stuff
authorChristian Würdig <chriswue@ipd.info.uni-karlsruhe.de>
Fri, 17 Mar 2006 16:44:31 +0000 (16:44 +0000)
committerChristian Würdig <chriswue@ipd.info.uni-karlsruhe.de>
Fri, 17 Mar 2006 16:44:31 +0000 (16:44 +0000)
ir/be/ia32/ia32_map_regs.c
ir/be/ia32/ia32_transform.c

index 98e7e0e..e57ab2c 100644 (file)
@@ -251,10 +251,18 @@ long ia32_translate_proj_pos(const ir_node *proj) {
                        return 1;
        }
        else if (is_ia32_DivMod(pred)) {
-               if (nr == pn_DivMod_res_div || nr == pn_Div_res)
+               if (nr == pn_DivMod_res_div)
                        return 0;
-               if (nr == pn_DivMod_res_mod || nr == pn_Mod_res)
+               if (nr == pn_DivMod_res_mod)
                        return 1;
+
+               switch(get_ia32_flavour(pred)) {
+                       if (nr == pn_DivMod_res_div)
+                               return 0;
+                       if (nr == pn_DivMod_res_mod)
+                               return 1;
+                       assert(0 && "unsupported DivMod");
+               }
        }
        else if (is_ia32_fDiv(pred)) {
                if (nr == pn_Quot_res)
index 702d9d9..f3fea44 100644 (file)
@@ -807,7 +807,20 @@ static ir_node *gen_Sub(ia32_transform_env_t *env, ir_node *op1, ir_node *op2) {
        return new_rd_Proj(dbg, irg, block, new_op, mode, 0);
 }
 
+static ir_node *get_proj_for_pn(const ir_node *irn, long pn) {
+       const ir_edge_t *edge;
+       ir_node   *proj;
+       assert(get_irn_mode(irn) == mode_T && "need mode_T");
 
+       foreach_out_edge(irn, edge) {
+               proj = get_edge_src_irn(edge);
+
+               if (get_Proj_proj(proj) == pn)
+                       return proj;
+       }
+
+       return NULL;
+}
 
 /**
  * Generates an ia32 DivMod with additional infrastructure for the
@@ -832,13 +845,16 @@ static ir_node *generate_DivMod(ia32_transform_env_t *env, ir_node *dividend, ir
 
        switch (dm_flav) {
                case flavour_Div:
-                       mem = get_Div_mem(irn);
+                       mem  = get_Div_mem(irn);
+                       mode = get_irn_mode(get_proj_for_pn(irn, pn_Div_res));
                        break;
                case flavour_Mod:
-                       mem = get_Mod_mem(irn);
+                       mem  = get_Mod_mem(irn);
+                       mode = get_irn_mode(get_proj_for_pn(irn, pn_Mod_res));
                        break;
                case flavour_DivMod:
-                       mem = get_DivMod_mem(irn);
+                       mem  = get_DivMod_mem(irn);
+                       mode = get_irn_mode(get_proj_for_pn(irn, pn_DivMod_res_div));
                        break;
                default:
                        assert(0);