On Fri, 28 Jan 2011, Jean-Marc Saffroy wrote: > (define_constraint "I" > "Signed 6-bit integer constant for binops." > (and (match_code "const_int") > (match_test "IN_RANGE (ival, -24, 32)"))) > > (define_register_constraint "A" "ADDR_REGS" > "The address registers.") > > (define_register_constraint "D" "DATA_REGS" > "The general (data) registers.") > > (define_predicate "reg_or_18bit_signed_operand" > (if_then_else (match_code "const_int") > (match_test "IN_RANGE (INTVAL (op), -(1 << 17), (1 << 17) - 1)") > (match_operand 0 "register_operand"))) > > (define_insn "adddi3" > [(set (match_operand:DI 0 "register_operand" "=D,D,A") > (plus:DI > (match_operand:DI 1 "register_operand" "%0,0,0") > (match_operand:DI 2 "reg_or_18bit_signed_operand" "I,D,n")))] > "" > "@ > addi %0, %2 > add %0, %2 > adda %0, %2")
> It seems I was expecting too much intelligence from reload, or I didn't > give enough hints. JFTR (after reading subsequent messages and good pragmatic advice), I think you're working around a bug in gcc; your adddi3 should work as-is above. Reload may create suboptimal sequences, but it should always create working code. Not that we can do much about it, the port not in the tree and all, but perhaps later. There are recent-ish changes in this area (i.e. fp-sp elimination), fixing bugs exposed by other ports, so try updating your tree too. brgds, H-P