On Jul 18, 2011, at 12:53 PM, Richard Henderson wrote: > On 07/18/2011 08:01 AM, Paulo J. Matos wrote: >> The problem is, if addhi3 expands into two insn: >> (define_insn "addqi3" >> [(set (match_operand:HI 0 "nonimmediate_operand" "=c") >> (plus:HI (match_operand:HI 1 "general_operand" "%0") >> (match_operand:HI 2 "general_operand" "cwmi")))] >> "get_attr_CARRY(insn) == 0" >> "add %b0,%b2") >> >> (define_insn "addqi3_carry" >> [(set (match_operand:HI 0 "nonimmediate_operand" "=c") >> (plus:HI (match_operand:HI 1 "general_operand" "%0") >> (match_operand:HI 2 "general_operand" "cwmi")))] >> "get_attr_CARRY(insn) == 1" >> "addc %t0,%t2") >> >> _One_ of the problems with this is that if GCC sees that op2 is 0, it will >> remove the insn because it will see: R0 = R0 + 0. However, it can't do this >> in this specific case because the plus is actually also adding the carry >> flag. >> >> Any suggestions on how to deal with this situation? > > You need to specifically represent the other output, i.e. the carry flag. > > Depending on the constraints of your processor, you may or may not be able > to expose this before reload. Reload requires the ability to issue move > instructions (all of loads, stores, reg-reg) and addition instructions. > It must be able to do this between any pair of instructions in order to > handle register spilling. Therefore in order to expose the carry flag > before reload, you must have an add instruction that does not modify the > carry. Some processors have this in the form of a "load-effective-address" > instruction.
Why an add instruction? Is that in the case where address arithmetic requires separate adds? If the machine is CISC, then I would think that reload just needs to be able to generate loads and stores that don't modify the carry, which would be a different requirement. For example, on a pdp11 load/store (move) has that property, while add doesn't (it always touches carry). "Specifically represent... the carry flag" means using the CCmode style of condition code handling, right? paul