Thanks.

And for
>>But I can't see any reason to allocate a fixed scratch register.

The ACC register here I use is not a fixed register for GCC. I make
ACC register to be suitable for QImode operands only.




2010/4/27 Ian Lance Taylor <i...@google.com>:
> redriver jiang <jiang.redri...@gmail.com> writes:
>
>>  test3.c:27: error: insn does not satisfy its constraints:
>> (insn 52 51 32 0 (parallel [
>>             (set (reg:HI 16 BASE0)
>>                 (plus:HI (reg:HI 16 BASE0)
>>                     (const_int -2 [0xfffffffe])))
>>             (clobber (scratch:QI))
>>         ]) 9 {*addhi3} (nil)
>>     (expr_list:REG_EQUIV (plus:HI (reg/f:HI 20 BASE2)
>>             (const_int -2 [0xfffffffe]))
>>         (nil)))
>> test3.c:27: internal compiler error: in reload_cse_simplify_operands,
>> at postreload.c:391
>
> Looks like this insn didn't get a register at all.  Reload can
> sometimes generate add insns directly, which could perhaps cause this
> to happen.
>
>
>> I think I may not understand the usage of "match_scratch" properly,
>> and I  make the ACC hard register to be clobbered in rtl generation
>> pass:
>>
>> (define_expand "addhi3"
>>   [(parallel [(set (match_operand:HI 0 "nonimmediate_operand" "")
>>                       (plus:HI (match_operand:HI 1 "nonimmediate_operand" "")
>>                                     (match_operand:HI 2 "general_operand" 
>> "")))
>>                  (clobber (reg: QI REG_ACC))])]
>>   ""
>>   "")
>>
>> the former problem disappeared.
>
> I would do it that way.  There isn't too much point to forcing the
> register allocator to allocate a scratch register when you already
> know what the register has to be.  It can make sense to allocate a
> normal register even if the register is fixed, because that will let
> reload move the value onto the stack if necessary.  But I can't see
> any reason to allocate a fixed scratch register.
>
> Ian
>

Reply via email to