2009/2/27 Dave Korn <dave.korn.cyg...@googlemail.com>:
> daniel tian wrote:
>
>> That seems to solving a address mode problem. My problem is that while
>> loading a large immediate data or SYMBOL_REF,  the destination is a
>> specified general register (register 0:R0). So I don't how to let the
>> define_expand "movsi" pattern to generate destination register in R0.
>
>  Well, the RTL that you emit in your define_expand has to match an insn
> pattern in the end, so you could make an insn for it that uses a predicate and
> matching constraint to enforce only accepting r0.  If you use a predicate that
> only accepts r0 you'll get better codegen than if you use a predicate that
> accepts general regs and use an r0-only constraint to instruct reload to place
> the operand in r0.

Well, I have already done this. There is insn pattern that the
predicate limits the operand in R0. But if in define_expand "movsi" do
not put the register in R0, the compiler will  crashed because of the
unrecognized RTL(load big immediate or Symbol). Like the below:
(define_insn "load_imm_big"
        [(set (match_operand:SI 0 "zero_register_operand" "=r")
              (match_operand:SI 1 "rice_imm32_operand" "i"))
              (clobber (reg:SI 0))]
        "TARGET_RICE"
        {
                return rice_output_move (operands, SImode);
        }
)

PS:rice_output_move  is function to output assemble code.

Thanks.

Reply via email to