- ir_node *sub = new_rd_Sub(s_dbg, irg, s_block, s_left, s_right, s_mode);
- dbg_info *a_dbg = get_irn_dbg_info(n);
- ir_node *a_block = get_nodes_block(n);
+ if (s_mode == mode_P) {
+ ir_node *sub = new_rd_Sub(s_dbg, irg, s_block, a, s_left, mode);
+ dbg_info *a_dbg = get_irn_dbg_info(n);
+ ir_node *a_block = get_nodes_block(n);
+
+ if (s_mode != mode)
+ s_right = new_r_Conv(irg, a_block, s_right, mode);
+ n = new_rd_Add(a_dbg, irg, a_block, sub, s_right, mode);
+ } else {
+ ir_node *sub = new_rd_Sub(s_dbg, irg, s_block, s_right, s_left, s_mode);
+ dbg_info *a_dbg = get_irn_dbg_info(n);
+ ir_node *a_block = get_nodes_block(n);