- n = get_irn_n_edges(irn);
- proj = NULL;
- if (n == 2)
- proj = ia32_get_proj_for_mode(irn, mode_M);
-
- /* in case of two projs, one must be the memory proj */
- if (n == 1 || (n == 2 && proj)) {
- proj = ia32_get_res_proj(irn);
- assert(proj && "Result proj expected");
-
- if (get_irn_op(irn) == op_Div) {
- set_Proj_proj(proj, pn_DivMod_res_div);
- in_keep[0] = new_rd_Proj(dbg, irg, block, res, mode, pn_DivMod_res_mod);
- }
- else {
- set_Proj_proj(proj, pn_DivMod_res_mod);
- in_keep[0] = new_rd_Proj(dbg, irg, block, res, mode, pn_DivMod_res_div);
- }
-
- be_new_Keep(&ia32_reg_classes[CLASS_ia32_gp], irg, block, 1, in_keep);
+ /* We also renumber the Firm projs into ia32 projs. */
+
+ switch (get_irn_opcode(irn)) {
+ case iro_Div:
+ ia32_renumber_Proj(projs, pn_Div_M, pn_ia32_DivMod_M);
+ ia32_renumber_Proj(projs, pn_Div_res, pn_ia32_DivMod_div_res);
+ /* add Proj-Keep for mod res */
+ in_keep[0] = new_rd_Proj(dbg, irg, block, res, mode, pn_ia32_DivMod_mod_res);
+ be_new_Keep(&ia32_reg_classes[CLASS_ia32_gp], irg, block, 1, in_keep);
+ break;
+ case iro_Mod:
+ ia32_renumber_Proj(projs, pn_Mod_M, pn_ia32_DivMod_M);
+ ia32_renumber_Proj(projs, pn_Mod_res, pn_ia32_DivMod_mod_res);
+ /* add Proj-Keep for div res */
+ in_keep[0] = new_rd_Proj(dbg, irg, block, res, mode, pn_ia32_DivMod_div_res);
+ be_new_Keep(&ia32_reg_classes[CLASS_ia32_gp], irg, block, 1, in_keep);
+ break;
+ case iro_DivMod:
+ /* check, which Proj-Keep, we need to add */
+ proj_div = get_proj_for_pn(irn, pn_DivMod_res_div);
+ proj_mod = get_proj_for_pn(irn, pn_DivMod_res_mod);
+
+ /* BEWARE: renumber after getting original projs */
+ ia32_renumber_Proj(projs, pn_DivMod_M, pn_ia32_DivMod_M);
+
+ if (proj_div && proj_mod) {
+ /* we have both results used: simply renumber */
+ ia32_renumber_Proj(projs, pn_DivMod_res_div, pn_ia32_DivMod_div_res);
+ ia32_renumber_Proj(projs, pn_DivMod_res_mod, pn_ia32_DivMod_mod_res);
+ }
+ else if (! proj_div && ! proj_mod) {
+ assert(0 && "Missing DivMod result proj");
+ }
+ else if (! proj_div) {
+ /* We have only mod result: add div res Proj-Keep */
+ ia32_renumber_Proj(projs, pn_DivMod_res_mod, pn_ia32_DivMod_mod_res);
+ in_keep[0] = new_rd_Proj(dbg, irg, block, res, mode, pn_ia32_DivMod_div_res);
+ be_new_Keep(&ia32_reg_classes[CLASS_ia32_gp], irg, block, 1, in_keep);
+ }
+ else {
+ /* We have only div result: add mod res Proj-Keep */
+ ia32_renumber_Proj(projs, pn_DivMod_res_div, pn_ia32_DivMod_div_res);
+ in_keep[0] = new_rd_Proj(dbg, irg, block, res, mode, pn_ia32_DivMod_mod_res);
+ be_new_Keep(&ia32_reg_classes[CLASS_ia32_gp], irg, block, 1, in_keep);
+ }
+ break;
+ default:
+ assert(0 && "Div, Mod, or DivMod expected.");
+ break;