- if (flags_proj == NULL) {
- res = new_bd_ia32_Neg(dbgi, block, in2);
- arch_set_irn_register(res, in2_reg);
-
- /* add to schedule */
- sched_add_before(irn, res);
-
- /* generate the add */
- res = new_bd_ia32_Add(dbgi, block, noreg, noreg, nomem, res, in1);
- arch_set_irn_register(res, out_reg);
- set_ia32_commutative(res);
-
- /* exchange the add and the sub */
- edges_reroute(irn, res);
-
- /* add to schedule */
- sched_add_before(irn, res);
- } else {
- ir_node *stc, *cmc, *nnot, *adc;
- ir_node *adc_flags;
-
+ if (is_ia32_Sbb(irn)) {
+ /* Feed borrow (in CF) as carry (via CMC) into NOT+ADC. */
+ carry = get_irn_n(irn, n_ia32_Sbb_eflags);
+ carry = new_bd_ia32_Cmc(dbgi, block, carry);
+ goto carry;
+ } else if (flags_proj != 0) {