- /* it's a 32 * 32 = 64 signed multiplication */
-
- mul = new_rd_ia32_l_IMul(dbg, irg, block, a_l, b_l);
- h_res = new_rd_Proj(dbg, irg, block, mul, l_mode, pn_ia32_l_Mul_EDX);
- l_res = new_rd_Proj(dbg, irg, block, mul, l_mode, pn_ia32_l_Mul_EAX);
-
- goto end;
+ /* a is a sign extend */
+
+ if (is_Shrs(b_h) && get_Shrs_left(b_h) == b_l && c1 == get_Shrs_right(b_h)) {
+ /* b is a sign extend: it's a 32 * 32 = 64 signed multiplication */
+ mul = new_rd_ia32_l_IMul(dbg, irg, block, a_l, b_l);
+ h_res = new_rd_Proj(dbg, irg, block, mul, l_mode, pn_ia32_l_Mul_EDX);
+ l_res = new_rd_Proj(dbg, irg, block, mul, l_mode, pn_ia32_l_Mul_EAX);
+
+ goto end;
+ }
+ /* we rely here on Consts being on the right site */
+ if (is_Const(b_h) && is_Const(b_l)) {
+ tarval *th = get_Const_tarval(b_h);
+ tarval *tl = get_Const_tarval(b_l);
+
+ if (tarval_is_long(th) && tarval_is_long(tl)) {
+ long h = get_tarval_long(th);
+ long l = get_tarval_long(tl);
+
+ if ((h == 0 && l >= 0) || (h == -1 && l < 0)) {
+ /* b is a sign extended const */
+ mul = new_rd_ia32_l_IMul(dbg, irg, block, a_l, b_l);
+ h_res = new_rd_Proj(dbg, irg, block, mul, l_mode, pn_ia32_l_Mul_EDX);
+ l_res = new_rd_Proj(dbg, irg, block, mul, l_mode, pn_ia32_l_Mul_EAX);
+
+ goto end;
+ }
+ }
+ }