- new_op = new_rd_ia32_xCmp(dbg, irg, block, noreg_fp, noreg_fp, cmp_a, cmp_b, nomem);
- set_ia32_pncode(new_op, get_Proj_proj(cmp_proj));
+ /* in case the compare operands are int, we move them into xmm register */
+ if (! mode_is_float(get_irn_mode(cmp_a))) {
+ c1 = new_rd_ia32_Conv_I2FP(dbg, irg, block, noreg, noreg, cmp_a, nomem);
+ set_ia32_src_mode(c1, get_irn_mode(cmp_a));
+ set_ia32_tgt_mode(c1, mode_D);
+ set_ia32_am_support(c1, ia32_am_Source);
+ SET_IA32_ORIG_NODE(c1, ia32_get_old_node_name(cg, node));
+ c2 = new_rd_ia32_Conv_I2FP(dbg, irg, block, noreg, noreg, cmp_b, nomem);
+ set_ia32_src_mode(c2, get_irn_mode(cmp_b));
+ set_ia32_tgt_mode(c2, mode_D);
+ set_ia32_am_support(c2, ia32_am_Source);
+ SET_IA32_ORIG_NODE(c2, ia32_get_old_node_name(cg, node));
+
+ cmp_a = new_rd_Proj(dbg, irg, block, c1, mode_D, 0);
+ cmp_b = new_rd_Proj(dbg, irg, block, c2, mode_D, 0);
+
+ pnc += pn_Cmp_Uo; /* transform integer compare to fp compare */
+ }
+
+ new_op = new_rd_ia32_xCmp(dbg, irg, block, noreg, noreg, cmp_a, cmp_b, nomem);
+ set_ia32_pncode(new_op, pnc);