On 01/18/2017 12:31 PM, Steve Silva wrote:
Hi All,I just wanted to thank you for your help; I was able to fix the problem with the following RTL (define_expand "addhi3" [(set (match_operand:HI 0 "nonimmediate_operand") (plus:HI (match_operand:HI 1 "nonimmediate_operand") (match_operand:HI 2 "general_operand")))] "" { if((GET_CODE(operands[2]) == CONST_INT) && ((INTVAL(operands[2]) > 4095) || (INTVAL(operands[2]) < -2048))) { emit_insn(gen_addhi3_mem_or_reg(operands[0], operands[1], force_reg(HImode, operands[2]))); DONE; } }) ;;***************************************************************************** ;;** This pattern is for any register or memory target. This pattern cannot** ;;** accept immediate values over 12 bits hence the expand above. ** ;;***************************************************************************** (define_insn "addhi3_mem_or_reg" [(set (match_operand:HI 0 "nonimmediate_operand" "=a,m") (plus:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0") (match_operand:HI 2 "general_operand" "aim,aim")))]
Given the way your expander's working, I think you'll come to grief with this insn, once you turn the optimizer on.
That insn will allow any immediate for op-2, and that;s what the optimizer will pay attention to. You probably want your own predicates to exactly match what things an instruction can take.
nathan -- Nathan Sidwell
