IS_P6_ARCH(opt_arch) || IS_NETBURST_ARCH(opt_arch) ||
(opt_arch == arch_core2) || (opt_arch == arch_generic) ||
(opt_arch == arch_i386) || (opt_arch == arch_i486);
+ ia32_cg_config.use_imul_mem_imm32 = !(opt_arch == arch_opteron || opt_arch == arch_k10);
ia32_cg_config.optimize_cc = opt_cc;
ia32_cg_config.use_unsafe_floatconv = opt_unsafe_floatconv;
unsigned use_sub_esp_4:1;
/** use sub esp, 8 instead of 2 push's */
unsigned use_sub_esp_8:1;
+ /** use imul mem, imm32 instruction (slow on some cpu's */
+ unsigned use_imul_mem_imm32:1;
/** optimize calling convention where possible */
unsigned optimize_cc:1;
/**
ir_node *op1 = get_Mul_left(node);
ir_node *op2 = get_Mul_right(node);
ir_mode *mode = get_irn_mode(node);
+ unsigned flags;
if (mode_is_float(mode)) {
if (ia32_cg_config.use_sse2)
/* for the lower 32bit of the result it doesn't matter whether we use
* signed or unsigned multiplication so we use IMul as it has fewer
* constraints */
- return gen_binop(node, op1, op2, new_rd_ia32_IMul,
- match_commutative | match_am | match_mode_neutral |
- match_immediate | match_am_and_immediates);
+ flags = match_commutative | match_am | match_mode_neutral | match_immediate;
+ if (ia32_cg_config.use_imul_mem_imm32)
+ flags |= match_am_and_immediates;
+ return gen_binop(node, op1, op2, new_rd_ia32_IMul, flags);
}
/**