[LLVMdev] help: about how to use tblgen to constraint operand.

Evan Cheng evan.cheng at apple.com
Fri Feb 20 10:51:47 PST 2009


On Feb 19, 2009, at 8:26 PM, 任坤 wrote:

> hi, Dear Evan Cheng:
>
> My cpu is i32 embeded CPU. I define pseudo register pair registers.
>
> In mytargetRegisterInfo.td:
> def T0: RegisterWithSubRegs<"t0",[R0,R1]>;
> ...
> def GPR64 : RegisterClass<"mytarget", [i64], 64, [T0, T1.....]
>
> In mytargetISelLowering.cpp:
> I define i1, i8 , i16 and i32 are legal.
>
> 1. I still have problem. I save my function return double  value in  
> R0 and R1.
> It is expanded into two i32. But my GPR64 is defined to save i64.  
> llvm finds
> I have i64 GPR register. It will automatically decide not to expand  
> i64 to two i32.
>
> 2. I guess I need a special pseudo instruction to move between GPR32  
> and GPR64.
> How to move R0, R1 to T1( R2, R3 pair). and don't convert two i32 to  
> i64?
> Could I use MyTargetInstrInfo::copyRegToReg() to handle this logic  
> issue?

No. copyRegToReg only supports copying registers of the same (or  
compatible register classes).

>
>
> 3. Maybe I can study INSERT_SUBREG/EXTRACT_SUBREG at X86 porting file.

Yes.

>
>
> I will do some research more deeply. I think the best way is that  
> TableGen has register pair TypeProfile feature. :(

It's not a tablegen issue. It's easy to add the constraint to tablegen  
but the register allocator has to be able to allocate register pairs.  
That is definitely not a trivial task.

Evan

>
>
>
>
>
> But I find i64 data will not be ex
> --- 09年2月20日,周五, Evan Cheng <echeng at apple.com> 写道:
> 发件人: Evan Cheng <echeng at apple.com>
> 主题: Re: [LLVMdev] help: about how to use tblgen to constraint  
> operand.
> 收件人: hbrenkun at yahoo.cn, "LLVM Developers Mailing List" <llvmdev at cs.ui 
> uc.edu>
> 日期: 2009,220,周五,1:11上午
>
> Currently there is no constraint that tells the register allocator  
> to allocate a consecutive register pair. What I would suggest you do  
> is to declare pseudo register pair registers (and corresponding  
> register class, say PAIR_GPR). In this case, your myFMDRR would take  
> one input of PAIR_GPR class. The asm printer should be taught to  
> print a PAIR_GPR register as two GPR registers (you should also  
> teach the JIT of the same thing).
>
> A PAIR_GPR register should be a super register of two GPR registers.  
> e.g. r0r1_pair is a super register of r0 and r1. In order to  
> *construct* a PAIR_GPR register, you have to use two INSERT_SUBREG.  
> To extract out a GPR from a PAIR_GPR, you need to issue  
> EXTRACT_SUBREG. In most cases, these will be nop's. In other cases,  
> they are copies.
>
> Evan
>
> On Feb 19, 2009, at 2:00 AM, 任坤 wrote:
>
>> I define a pattern to move two 32bits gpr to 64bits fpr. like arm  
>> instructure fmdrr.
>> But I need to use an even/odd register pair to save its 2 operands.
>> I define in mytarget.td:
>>
>> myfmdrr:
>> SDTypeProfile<1, 2, [SDTCisVT<0, f64>, SDTCisVT<1, i32>,
>>     SDTCisSameAs<1, 2>]>;
>> def my_fmdrr : ...........
>> def myFMDRR : ....
>>                       (outs FPR: $result), ins(GPR: $op1, GPR:$op2 )
>>                        [(setFPR: $result, (my_fmdrr GPR: $op1, GPR: 
>> $op2) )]
>>
>> I create myfmdrr instructure in mytargetISelLowering.cpp. and its  
>> operands are in R0 and R1.
>> But after optimization, the operands are save R2 and R1. I know  
>> optimization pass does not
>> know myfmdrr operands constraint. But How I tell optimzition pass  
>> by tblgen??
>>
>> Could I can control operand constraint in mytargetiSelLowering.cpp?  
>> How do I control??
>>
>>
>> 好玩贺卡等你发,邮箱贺卡全新上线! 
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
> 好玩贺卡等你发,邮箱贺卡全新上线! 
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090220/0be84356/attachment.html>


More information about the llvm-dev mailing list