From 997ea4cfe4a63b43982fa81781e26b687e796d41 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Fri, 17 Mar 2006 16:44:31 +0000 Subject: [PATCH] fixed DivMod stuff --- ir/be/ia32/ia32_map_regs.c | 12 ++++++++++-- ir/be/ia32/ia32_transform.c | 22 +++++++++++++++++++--- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/ir/be/ia32/ia32_map_regs.c b/ir/be/ia32/ia32_map_regs.c index 98e7e0e16..e57ab2c86 100644 --- a/ir/be/ia32/ia32_map_regs.c +++ b/ir/be/ia32/ia32_map_regs.c @@ -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) diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index 702d9d95a..f3fea443a 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -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); -- 2.20.1