- h_res = new_rd_Proj(dbg, irg, block, mul, h_mode, pn_ia32_l_Mul_EDX);
- l_res = new_rd_Proj(dbg, irg, block, mul, l_mode, pn_ia32_l_Mul_EAX);
-
- goto end;
+ h_res = new_rd_Proj(dbg, block, mul, h_mode, pn_ia32_l_IMul_res_high);
+ l_res = new_rd_Proj(dbg, block, mul, l_mode, pn_ia32_l_IMul_res_low);
+ } else {
+ /* note that zero extension is handled hare efficiently */
+ mul = new_bd_ia32_l_Mul(dbg, block, a_l, b_l);
+ pEDX = new_rd_Proj(dbg, block, mul, h_mode, pn_ia32_l_Mul_res_high);
+ l_res = new_rd_Proj(dbg, block, mul, l_mode, pn_ia32_l_Mul_res_low);
+
+ b_l = new_rd_Conv(dbg, block, b_l, h_mode);
+ mul = new_rd_Mul( dbg, block, a_h, b_l, h_mode);
+ add = new_rd_Add( dbg, block, mul, pEDX, h_mode);
+ a_l = new_rd_Conv(dbg, block, a_l, h_mode);
+ mul = new_rd_Mul( dbg, block, a_l, b_h, h_mode);
+ h_res = new_rd_Add( dbg, block, add, mul, h_mode);