<div class="gmail_quote">On Thu, Nov 3, 2011 at 2:40 PM, Villmow, Micah <span dir="ltr"><<a href="mailto:Micah.Villmow@amd.com">Micah.Villmow@amd.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Tom,<br>
There is no way to do this that I know of. Maybe David Greene or someone who hacks on Tablegen a lot would know.<br></blockquote><div><br></div><div>This particular problem is not so bad with the use of multiclass and mdef.  It at least lets you factor out the redundancy across different instructions.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
Micah<br>
<br>
> -----Original Message-----<br>
> From: <a href="mailto:llvmdev-bounces@cs.uiuc.edu">llvmdev-bounces@cs.uiuc.edu</a> [mailto:<a href="mailto:llvmdev-bounces@cs.uiuc.edu">llvmdev-bounces@cs.uiuc.edu</a>]<br>
> On Behalf Of Tom Stellard<br>
> Sent: Thursday, November 03, 2011 10:23 AM<br>
> To: LLVM Developers Mailing List<br>
> Subject: [LLVMdev] Tablegen: Instructions that take immediates or<br>
> registers as operands<br>
<div><div></div><div class="h5">><br>
> Hi,<br>
><br>
> I'm working on an LLVM backend for GPUs.  One thing that is a little<br>
> different about some GPUs is that instructions can take registers or<br>
> 32-bit floating point immediates as arguments.  I was wondering if<br>
> there<br>
> is a way to model this using tablegen, without having to define an<br>
> instruction for each possible combination of registers and immediates<br>
> (e.g. For ADD it would require four definitions: ADD_imm_imm,<br>
> ADD_reg_reg, ADD_imm_reg, ADD_reg_imm).<br>
><br>
> I have tried a few different ways to make this work in tablegen, but I<br>
> have been unsuccessful so far.  Here is an example of something I have<br>
> tried.  It fails to compile with tablegen, but I hope it can help<br>
> demonstrate what I am trying to do:<br>
><br>
><br>
> def F32Node : PatLeaf<(vt), [{return N->getVT() == MVT::f32;}]>;<br>
><br>
> def F32Op : Operand <f32> {<br>
>   let MIOperandInfo = (ops GPR, f32imm);<br>
> }<br>
><br>
>  def ADD : InstAMD <<br>
>           (outs GPR:$dst),<br>
>           (ins F32Op:$src0, F32Op:$src1),<br>
>           "ADD $dst, $src0, $src1"),<br>
>           [(set GPR:$dst, (fadd F32Node:$src0, F32Node:$src1))]<br>
>   >;<br>
><br>
> Is what I am trying to do possible with tablegen, and if so what is the<br>
> best way for me to do it?<br>
><br>
> Thanks,<br>
> Tom Stellard<br>
><br>
><br>
><br>
> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
<br>
<br>
<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><br><div>Thanks,</div><div><br></div><div>Justin Holewinski</div><br>