[LLVMdev] Instruction Encodings in TableGen

Justin Holewinski justin.holewinski at gmail.com
Fri Jul 27 08:56:03 PDT 2012


On Jul 27, 2012, at 5:02 AM, Hal Finkel <hfinkel at anl.gov> wrote:

> On Wed, 25 Jul 2012 07:51:28 -0400
> Justin Holewinski <justin.holewinski at gmail.com> wrote:
> 
>> On Tue, Jul 24, 2012 at 8:46 PM, Jim Grosbach <grosbach at apple.com>
>> wrote:
>> 
>>> 
>>> On Jul 24, 2012, at 3:52 PM, Justin Holewinski <
>>> justin.holewinski at gmail.com> wrote:
>>> 
>>> On Tue, Jul 24, 2012 at 3:59 PM, Tom Stellard
>>> <thomas.stellard at amd.com>wrote:
>>> 
>>>> On Tue, Jul 24, 2012 at 03:25:14PM -0400, Justin Holewinski wrote:
>>>>> I'm starting to look into binary instruction encodings in
>>>>> TableGen, and
>>>> I'm
>>>>> a bit confused on how the instruction fields are populated.
>>>>> Perhaps I'm just being dense, but I cannot see how SDAG operands
>>>>> are translated into the encoding fields.  Can someone please
>>>>> explain the following snippet
>>>> from
>>>>> the PPC back-end.
>>>>> 
>>>>> The AND instruction in PPC is defined as:
>>>>> 
>>>>> 1011 def AND  : XForm_6<31,  28, (outs GPRC:$rA), (ins GPRC:$rS,
>>>> GPRC:$rB),
>>>>> 1012                    "and $rA, $rS, $rB", IntSimple,
>>>>> 1013                    [(set GPRC:$rA, (and GPRC:$rS,
>>>>> GPRC:$rB))]>;
>>>>> 
>>>>> Okay, so rA, rS, and rB are register operands.
>>>>> 
>>>>> The TableGen classes are defined as:
>>>>> 
>>>>> 315 class XForm_base_r3xo_swapped
>>>>> 316         <bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
>>>>> string
>>>> asmstr,
>>>>> 317         InstrItinClass itin>
>>>>> 318   : I<opcode, OOL, IOL, asmstr, itin> {
>>>>> 319   bits<5> A;
>>>>> 320   bits<5> RST;
>>>>> 321   bits<5> B;
>>>>> 322
>>>>> 323   bit RC = 0;    // set by isDOT
>>>>> 
>>>>> 324
>>>>> 325   let Inst{6-10}  = RST;
>>>>> 326   let Inst{11-15} = A;
>>>>> 327   let Inst{16-20} = B;
>>>>> 328   let Inst{21-30} = xo;
>>>>> 329   let Inst{31}    = RC;
>>>>> 330 }
>>>>> 
>>>>> 337 class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
>>>>> string asmstr,
>>>>> 338               InstrItinClass itin, list<dag> pattern>
>>>>> 339   : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr,
>>>>> itin> { 340   let Pattern = pattern;
>>>>> 341 }
>>>>> 
>>>>> Okay, so A, RST, and B are the operand fields in the instruction
>>>> encoding
>>>>> (I assume).  But where are A, RST, and B given values?  When the
>>>>> instruction is encoded (and the physical registers are known),
>>>>> where do these values come from?  A grep for RST doesn't come up
>>>>> with anything useful.  Is there C++ code somewhere that scans
>>>>> the operands of all instructions and performs the actual
>>>>> encoding?
>>>>> 
>>>> 
>>>> The getMachineOpValue() function does the encoding for the non-MC
>>>> code emitter.  The MC code emitter might be different though.
>>>> 
>>> 
>>> Yeah, I see the calls to getMachineOpValue() in the generated code,
>>> but it seems like it just processes the fields of the TableGen
>>> class in the order that they appear, e.g. A, RST, B in the PPC
>>> example, which seems very fragile.  This makes me believe I'm
>>> missing something here.
>>> 
>>> 
>>> 
>>> If the bitfields are named the same as the operands in the (ins) and
>>> (outs) lists, TableGen will match them that way rather than
>>> positionally. ARM makes extensive use of that, for example.
>>> 
>> 
>> Awesome!  I was hoping for something like that.  Thanks!
> 
> FYI: Using the built-in assembler for PPC is buggy; and so it is
> possible that this is because some of the TableGen patterns are wrong.
> If you happen to spot a mistake, please send a patch :)
> 
> Once we have a PPC assembly parser, then we should be able to really
> test the patterns.

If I find anything I'll let the list know, but I was really just using PPC as a (somewhat) simple example of what I was talking about. :)

> 
> -Hal
> 
>> 
>> 
>>> 
>>> -Jim
>>> 
>>> 
>>> 
>>>> -Tom
>>>> 
>>>>> --
>>>>> 
>>>>> Thanks,
>>>>> 
>>>>> Justin Holewinski
>>>> 
>>>>> _______________________________________________
>>>>> LLVM Developers mailing list
>>>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> --
>>> 
>>> Thanks,
>>> 
>>> Justin Holewinski
>>> 
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>> 
>>> 
>>> 
>> 
>> 
> 
> 
> 
> -- 
> Hal Finkel
> Postdoctoral Appointee
> Leadership Computing Facility
> Argonne National Laboratory





More information about the llvm-dev mailing list