Home | History | Annotate | Download | only in docs
      1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
      2                       "http://www.w3.org/TR/html4/strict.dtd">
      3 <html>
      4 <head>
      5   <title>TableGen Fundamentals</title>
      6   <link rel="stylesheet" href="llvm.css" type="text/css">
      7 </head>
      8 <body>
      9 
     10 <h1>TableGen Fundamentals</h1>
     11 
     12 <div>
     13 <ul>
     14   <li><a href="#introduction">Introduction</a>
     15   <ol>
     16     <li><a href="#concepts">Basic concepts</a></li>
     17     <li><a href="#example">An example record</a></li>
     18     <li><a href="#running">Running TableGen</a></li>
     19   </ol></li>
     20   <li><a href="#syntax">TableGen syntax</a>
     21   <ol>
     22     <li><a href="#primitives">TableGen primitives</a>
     23     <ol>
     24       <li><a href="#comments">TableGen comments</a></li>
     25       <li><a href="#types">The TableGen type system</a></li>
     26       <li><a href="#values">TableGen values and expressions</a></li>
     27     </ol></li>
     28     <li><a href="#classesdefs">Classes and definitions</a>
     29     <ol>
     30       <li><a href="#valuedef">Value definitions</a></li>
     31       <li><a href="#recordlet">'let' expressions</a></li>
     32       <li><a href="#templateargs">Class template arguments</a></li>
     33       <li><a href="#multiclass">Multiclass definitions and instances</a></li>
     34     </ol></li>
     35     <li><a href="#filescope">File scope entities</a>
     36     <ol>
     37       <li><a href="#include">File inclusion</a></li>
     38       <li><a href="#globallet">'let' expressions</a></li>
     39     </ol></li>
     40   </ol></li>
     41   <li><a href="#backends">TableGen backends</a>
     42   <ol>
     43     <li><a href="#">todo</a></li>
     44   </ol></li>
     45 </ul>
     46 </div>
     47 
     48 <div class="doc_author">
     49   <p>Written by <a href="mailto:sabre (a] nondot.org">Chris Lattner</a></p>
     50 </div>
     51 
     52 <!-- *********************************************************************** -->
     53 <h2><a name="introduction">Introduction</a></h2>
     54 <!-- *********************************************************************** -->
     55 
     56 <div>
     57 
     58 <p>TableGen's purpose is to help a human develop and maintain records of
     59 domain-specific information.  Because there may be a large number of these
     60 records, it is specifically designed to allow writing flexible descriptions and
     61 for common features of these records to be factored out.  This reduces the
     62 amount of duplication in the description, reduces the chance of error, and
     63 makes it easier to structure domain specific information.</p>
     64 
     65 <p>The core part of TableGen <a href="#syntax">parses a file</a>, instantiates
     66 the declarations, and hands the result off to a domain-specific "<a
     67 href="#backends">TableGen backend</a>" for processing.  The current major user
     68 of TableGen is the <a href="CodeGenerator.html">LLVM code generator</a>.</p>
     69 
     70 <p>Note that if you work on TableGen much, and use emacs or vim, that you can
     71 find an emacs "TableGen mode" and a vim language file in the
     72 <tt>llvm/utils/emacs</tt> and <tt>llvm/utils/vim</tt> directories of your LLVM
     73 distribution, respectively.</p>
     74 
     75 <!-- ======================================================================= -->
     76 <h3><a name="concepts">Basic concepts</a></h3>
     77 
     78 <div>
     79 
     80 <p>TableGen files consist of two key parts: 'classes' and 'definitions', both
     81 of which are considered 'records'.</p>
     82 
     83 <p><b>TableGen records</b> have a unique name, a list of values, and a list of
     84 superclasses.  The list of values is the main data that TableGen builds for each
     85 record; it is this that holds the domain specific information for the
     86 application.  The interpretation of this data is left to a specific <a
     87 href="#backends">TableGen backend</a>, but the structure and format rules are
     88 taken care of and are fixed by TableGen.</p>
     89 
     90 <p><b>TableGen definitions</b> are the concrete form of 'records'.  These
     91 generally do not have any undefined values, and are marked with the
     92 '<tt>def</tt>' keyword.</p>
     93 
     94 <p><b>TableGen classes</b> are abstract records that are used to build and
     95 describe other records.  These 'classes' allow the end-user to build
     96 abstractions for either the domain they are targeting (such as "Register",
     97 "RegisterClass", and "Instruction" in the LLVM code generator) or for the
     98 implementor to help factor out common properties of records (such as "FPInst",
     99 which is used to represent floating point instructions in the X86 backend).
    100 TableGen keeps track of all of the classes that are used to build up a
    101 definition, so the backend can find all definitions of a particular class, such
    102 as "Instruction".</p>
    103 
    104 <p><b>TableGen multiclasses</b> are groups of abstract records that are
    105 instantiated all at once.  Each instantiation can result in multiple
    106 TableGen definitions.  If a multiclass inherits from another multiclass,
    107 the definitions in the sub-multiclass become part of the current
    108 multiclass, as if they were declared in the current multiclass.</p>
    109 
    110 </div>
    111 
    112 <!-- ======================================================================= -->
    113 <h3><a name="example">An example record</a></h3>
    114 
    115 <div>
    116 
    117 <p>With no other arguments, TableGen parses the specified file and prints out
    118 all of the classes, then all of the definitions.  This is a good way to see what
    119 the various definitions expand to fully.  Running this on the <tt>X86.td</tt>
    120 file prints this (at the time of this writing):</p>
    121 
    122 <div class="doc_code">
    123 <pre>
    124 ...
    125 <b>def</b> ADD32rr {   <i>// Instruction X86Inst I</i>
    126   <b>string</b> Namespace = "X86";
    127   <b>dag</b> OutOperandList = (outs GR32:$dst);
    128   <b>dag</b> InOperandList = (ins GR32:$src1, GR32:$src2);
    129   <b>string</b> AsmString = "add{l}\t{$src2, $dst|$dst, $src2}";
    130   <b>list</b>&lt;dag&gt; Pattern = [(set GR32:$dst, (add GR32:$src1, GR32:$src2))];
    131   <b>list</b>&lt;Register&gt; Uses = [];
    132   <b>list</b>&lt;Register&gt; Defs = [EFLAGS];
    133   <b>list</b>&lt;Predicate&gt; Predicates = [];
    134   <b>int</b> CodeSize = 3;
    135   <b>int</b> AddedComplexity = 0;
    136   <b>bit</b> isReturn = 0;
    137   <b>bit</b> isBranch = 0;
    138   <b>bit</b> isIndirectBranch = 0;
    139   <b>bit</b> isBarrier = 0;
    140   <b>bit</b> isCall = 0;
    141   <b>bit</b> canFoldAsLoad = 0;
    142   <b>bit</b> mayLoad = 0;
    143   <b>bit</b> mayStore = 0;
    144   <b>bit</b> isImplicitDef = 0;
    145   <b>bit</b> isConvertibleToThreeAddress = 1;
    146   <b>bit</b> isCommutable = 1;
    147   <b>bit</b> isTerminator = 0;
    148   <b>bit</b> isReMaterializable = 0;
    149   <b>bit</b> isPredicable = 0;
    150   <b>bit</b> hasDelaySlot = 0;
    151   <b>bit</b> usesCustomInserter = 0;
    152   <b>bit</b> hasCtrlDep = 0;
    153   <b>bit</b> isNotDuplicable = 0;
    154   <b>bit</b> hasSideEffects = 0;
    155   <b>bit</b> neverHasSideEffects = 0;
    156   InstrItinClass Itinerary = NoItinerary;
    157   <b>string</b> Constraints = "";
    158   <b>string</b> DisableEncoding = "";
    159   <b>bits</b>&lt;8&gt; Opcode = { 0, 0, 0, 0, 0, 0, 0, 1 };
    160   Format Form = MRMDestReg;
    161   <b>bits</b>&lt;6&gt; FormBits = { 0, 0, 0, 0, 1, 1 };
    162   ImmType ImmT = NoImm;
    163   <b>bits</b>&lt;3&gt; ImmTypeBits = { 0, 0, 0 };
    164   <b>bit</b> hasOpSizePrefix = 0;
    165   <b>bit</b> hasAdSizePrefix = 0;
    166   <b>bits</b>&lt;4&gt; Prefix = { 0, 0, 0, 0 };
    167   <b>bit</b> hasREX_WPrefix = 0;
    168   FPFormat FPForm = ?;
    169   <b>bits</b>&lt;3&gt; FPFormBits = { 0, 0, 0 };
    170 }
    171 ...
    172 </pre>
    173 </div>
    174 
    175 <p>This definition corresponds to a 32-bit register-register add instruction in
    176 the X86.  The string after the '<tt>def</tt>' string indicates the name of the
    177 record&mdash;"<tt>ADD32rr</tt>" in this case&mdash;and the comment at the end of
    178 the line indicates the superclasses of the definition.  The body of the record
    179 contains all of the data that TableGen assembled for the record, indicating that
    180 the instruction is part of the "X86" namespace, the pattern indicating how the
    181 the instruction should be emitted into the assembly file, that it is a
    182 two-address instruction, has a particular encoding, etc.  The contents and
    183 semantics of the information in the record is specific to the needs of the X86
    184 backend, and is only shown as an example.</p>
    185 
    186 <p>As you can see, a lot of information is needed for every instruction
    187 supported by the code generator, and specifying it all manually would be
    188 unmaintainable, prone to bugs, and tiring to do in the first place.  Because we
    189 are using TableGen, all of the information was derived from the following
    190 definition:</p>
    191 
    192 <div class="doc_code">
    193 <pre>
    194 let Defs = [EFLAGS],
    195     isCommutable = 1,                  <i>// X = ADD Y,Z --&gt; X = ADD Z,Y</i>
    196     isConvertibleToThreeAddress = 1 <b>in</b> <i>// Can transform into LEA.</i>
    197 def ADD32rr  : I&lt;0x01, MRMDestReg, (outs GR32:$dst),
    198                                    (ins GR32:$src1, GR32:$src2),
    199                  "add{l}\t{$src2, $dst|$dst, $src2}",
    200                  [(set GR32:$dst, (add GR32:$src1, GR32:$src2))]&gt;;
    201 </pre>
    202 </div>
    203 
    204 <p>This definition makes use of the custom class <tt>I</tt> (extended from the
    205 custom class <tt>X86Inst</tt>), which is defined in the X86-specific TableGen
    206 file, to factor out the common features that instructions of its class share.  A
    207 key feature of TableGen is that it allows the end-user to define the
    208 abstractions they prefer to use when describing their information.</p>
    209 
    210 </div>
    211 
    212 <!-- ======================================================================= -->
    213 <h3><a name="running">Running TableGen</a></h3>
    214 
    215 <div>
    216 
    217 <p>TableGen runs just like any other LLVM tool.  The first (optional) argument
    218 specifies the file to read.  If a filename is not specified, <tt>tblgen</tt>
    219 reads from standard input.</p>
    220 
    221 <p>To be useful, one of the <a href="#backends">TableGen backends</a> must be
    222 used.  These backends are selectable on the command line (type '<tt>tblgen
    223 -help</tt>' for a list).  For example, to get a list of all of the definitions
    224 that subclass a particular type (which can be useful for building up an enum
    225 list of these records), use the <tt>-print-enums</tt> option:</p>
    226 
    227 <div class="doc_code">
    228 <pre>
    229 $ tblgen X86.td -print-enums -class=Register
    230 AH, AL, AX, BH, BL, BP, BPL, BX, CH, CL, CX, DH, DI, DIL, DL, DX, EAX, EBP, EBX,
    231 ECX, EDI, EDX, EFLAGS, EIP, ESI, ESP, FP0, FP1, FP2, FP3, FP4, FP5, FP6, IP,
    232 MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7, R10, R10B, R10D, R10W, R11, R11B, R11D,
    233 R11W, R12, R12B, R12D, R12W, R13, R13B, R13D, R13W, R14, R14B, R14D, R14W, R15,
    234 R15B, R15D, R15W, R8, R8B, R8D, R8W, R9, R9B, R9D, R9W, RAX, RBP, RBX, RCX, RDI,
    235 RDX, RIP, RSI, RSP, SI, SIL, SP, SPL, ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7,
    236 XMM0, XMM1, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, XMM2, XMM3, XMM4, XMM5,
    237 XMM6, XMM7, XMM8, XMM9,
    238 
    239 $ tblgen X86.td -print-enums -class=Instruction 
    240 ABS_F, ABS_Fp32, ABS_Fp64, ABS_Fp80, ADC32mi, ADC32mi8, ADC32mr, ADC32ri,
    241 ADC32ri8, ADC32rm, ADC32rr, ADC64mi32, ADC64mi8, ADC64mr, ADC64ri32, ADC64ri8,
    242 ADC64rm, ADC64rr, ADD16mi, ADD16mi8, ADD16mr, ADD16ri, ADD16ri8, ADD16rm,
    243 ADD16rr, ADD32mi, ADD32mi8, ADD32mr, ADD32ri, ADD32ri8, ADD32rm, ADD32rr,
    244 ADD64mi32, ADD64mi8, ADD64mr, ADD64ri32, ...
    245 </pre>
    246 </div>
    247 
    248 <p>The default backend prints out all of the records, as described <a
    249 href="#example">above</a>.</p>
    250 
    251 <p>If you plan to use TableGen, you will most likely have to <a
    252 href="#backends">write a backend</a> that extracts the information specific to
    253 what you need and formats it in the appropriate way.</p>
    254 
    255 </div>
    256 
    257 </div>
    258 
    259 <!-- *********************************************************************** -->
    260 <h2><a name="syntax">TableGen syntax</a></h2>
    261 <!-- *********************************************************************** -->
    262 
    263 <div>
    264 
    265 <p>TableGen doesn't care about the meaning of data (that is up to the backend to
    266 define), but it does care about syntax, and it enforces a simple type system.
    267 This section describes the syntax and the constructs allowed in a TableGen file.
    268 </p>
    269 
    270 <!-- ======================================================================= -->
    271 <h3><a name="primitives">TableGen primitives</a></h3>
    272 
    273 <div>
    274 
    275 <!-- -------------------------------------------------------------------------->
    276 <h4><a name="comments">TableGen comments</a></h4>
    277 
    278 <div>
    279 
    280 <p>TableGen supports BCPL style "<tt>//</tt>" comments, which run to the end of
    281 the line, and it also supports <b>nestable</b> "<tt>/* */</tt>" comments.</p>
    282 
    283 </div>
    284 
    285 <!-- -------------------------------------------------------------------------->
    286 <h4>
    287   <a name="types">The TableGen type system</a>
    288 </h4>
    289 
    290 <div>
    291 
    292 <p>TableGen files are strongly typed, in a simple (but complete) type-system.
    293 These types are used to perform automatic conversions, check for errors, and to
    294 help interface designers constrain the input that they allow.  Every <a
    295 href="#valuedef">value definition</a> is required to have an associated type.
    296 </p>
    297 
    298 <p>TableGen supports a mixture of very low-level types (such as <tt>bit</tt>)
    299 and very high-level types (such as <tt>dag</tt>).  This flexibility is what
    300 allows it to describe a wide range of information conveniently and compactly.
    301 The TableGen types are:</p>
    302 
    303 <dl>
    304 <dt><tt><b>bit</b></tt></dt>
    305   <dd>A 'bit' is a boolean value that can hold either 0 or 1.</dd>
    306 
    307 <dt><tt><b>int</b></tt></dt>
    308   <dd>The 'int' type represents a simple 32-bit integer value, such as 5.</dd>
    309 
    310 <dt><tt><b>string</b></tt></dt>
    311   <dd>The 'string' type represents an ordered sequence of characters of
    312   arbitrary length.</dd>
    313 
    314 <dt><tt><b>bits</b>&lt;n&gt;</tt></dt>
    315   <dd>A 'bits' type is an arbitrary, but fixed, size integer that is broken up
    316   into individual bits.  This type is useful because it can handle some bits
    317   being defined while others are undefined.</dd>
    318 
    319 <dt><tt><b>list</b>&lt;ty&gt;</tt></dt>
    320   <dd>This type represents a list whose elements are some other type.  The
    321   contained type is arbitrary: it can even be another list type.</dd>
    322 
    323 <dt>Class type</dt>
    324   <dd>Specifying a class name in a type context means that the defined value
    325   must be a subclass of the specified class.  This is useful in conjunction with
    326   the <b><tt>list</tt></b> type, for example, to constrain the elements of the
    327   list to a common base class (e.g., a <tt><b>list</b>&lt;Register&gt;</tt> can
    328   only contain definitions derived from the "<tt>Register</tt>" class).</dd>
    329 
    330 <dt><tt><b>dag</b></tt></dt>
    331   <dd>This type represents a nestable directed graph of elements.</dd>
    332 
    333 <dt><tt><b>code</b></tt></dt>
    334   <dd>This represents a big hunk of text.  This is lexically distinct from 
    335   string values because it doesn't require escapeing double quotes and other
    336   common characters that occur in code.</dd>
    337 </dl>
    338 
    339 <p>To date, these types have been sufficient for describing things that
    340 TableGen has been used for, but it is straight-forward to extend this list if
    341 needed.</p>
    342 
    343 </div>
    344 
    345 <!-- -------------------------------------------------------------------------->
    346 <h4>
    347   <a name="values">TableGen values and expressions</a>
    348 </h4>
    349 
    350 <div>
    351 
    352 <p>TableGen allows for a pretty reasonable number of different expression forms
    353 when building up values.  These forms allow the TableGen file to be written in a
    354 natural syntax and flavor for the application.  The current expression forms
    355 supported include:</p>
    356 
    357 <dl>
    358 <dt><tt>?</tt></dt>
    359   <dd>uninitialized field</dd>
    360 <dt><tt>0b1001011</tt></dt>
    361   <dd>binary integer value</dd>
    362 <dt><tt>07654321</tt></dt>
    363   <dd>octal integer value (indicated by a leading 0)</dd>
    364 <dt><tt>7</tt></dt>
    365   <dd>decimal integer value</dd>
    366 <dt><tt>0x7F</tt></dt>
    367   <dd>hexadecimal integer value</dd>
    368 <dt><tt>"foo"</tt></dt>
    369   <dd>string value</dd>
    370 <dt><tt>[{ ... }]</tt></dt>
    371   <dd>code fragment</dd>
    372 <dt><tt>[ X, Y, Z ]&lt;type&gt;</tt></dt>
    373   <dd>list value.  &lt;type&gt; is the type of the list 
    374 element and is usually optional.  In rare cases,
    375 TableGen is unable to deduce the element type in
    376 which case the user must specify it explicitly.</dd>
    377 <dt><tt>{ a, b, c }</tt></dt>
    378   <dd>initializer for a "bits&lt;3&gt;" value</dd>
    379 <dt><tt>value</tt></dt>
    380   <dd>value reference</dd>
    381 <dt><tt>value{17}</tt></dt>
    382   <dd>access to one bit of a value</dd>
    383 <dt><tt>value{15-17}</tt></dt>
    384   <dd>access to multiple bits of a value</dd>
    385 <dt><tt>DEF</tt></dt>
    386   <dd>reference to a record definition</dd>
    387 <dt><tt>CLASS&lt;val list&gt;</tt></dt>
    388   <dd>reference to a new anonymous definition of CLASS with the specified
    389       template arguments.</dd>
    390 <dt><tt>X.Y</tt></dt>
    391   <dd>reference to the subfield of a value</dd>
    392 <dt><tt>list[4-7,17,2-3]</tt></dt>
    393   <dd>A slice of the 'list' list, including elements 4,5,6,7,17,2, and 3 from
    394   it.  Elements may be included multiple times.</dd>
    395 <dt><tt>(DEF a, b)</tt></dt>
    396   <dd>a dag value.  The first element is required to be a record definition, the
    397   remaining elements in the list may be arbitrary other values, including nested
    398   `<tt>dag</tt>' values.</dd>
    399 <dt><tt>!strconcat(a, b)</tt></dt>
    400   <dd>A string value that is the result of concatenating the 'a' and 'b'
    401   strings.</dd>
    402 <dt><tt>!cast&lt;type&gt;(a)</tt></dt>
    403   <dd>A symbol of type <em>type</em> obtained by looking up the string 'a' in
    404 the symbol table.  If the type of 'a' does not match <em>type</em>, TableGen
    405 aborts with an error. !cast&lt;string&gt; is a special case in that the argument must
    406 be an object defined by a 'def' construct.</dd>
    407 <dt><tt>!subst(a, b, c)</tt></dt>
    408   <dd>If 'a' and 'b' are of string type or are symbol references, substitute 
    409 'b' for 'a' in 'c.'  This operation is analogous to $(subst) in GNU make.</dd>
    410 <dt><tt>!foreach(a, b, c)</tt></dt>
    411   <dd>For each member 'b' of dag or list 'a' apply operator 'c.'  'b' is a 
    412 dummy variable that should be declared as a member variable of an instantiated 
    413 class.  This operation is analogous to $(foreach) in GNU make.</dd>
    414 <dt><tt>!head(a)</tt></dt>
    415   <dd>The first element of list 'a.'</dd>
    416 <dt><tt>!tail(a)</tt></dt>
    417   <dd>The 2nd-N elements of list 'a.'</dd>
    418 <dt><tt>!empty(a)</tt></dt>
    419   <dd>An integer {0,1} indicating whether list 'a' is empty.</dd>
    420 <dt><tt>!if(a,b,c)</tt></dt>
    421   <dd>'b' if the result of 'int' or 'bit' operator 'a' is nonzero,
    422       'c' otherwise.</dd>
    423 <dt><tt>!eq(a,b)</tt></dt>
    424   <dd>'bit 1' if string a is equal to string b, 0 otherwise.  This
    425       only operates on string, int and bit objects.  Use !cast&lt;string&gt; to
    426       compare other types of objects.</dd>
    427 </dl>
    428 
    429 <p>Note that all of the values have rules specifying how they convert to values
    430 for different types.  These rules allow you to assign a value like "<tt>7</tt>"
    431 to a "<tt>bits&lt;4&gt;</tt>" value, for example.</p>
    432 
    433 </div>
    434 
    435 </div>
    436 
    437 <!-- ======================================================================= -->
    438 <h3>
    439   <a name="classesdefs">Classes and definitions</a>
    440 </h3>
    441 
    442 <div>
    443 
    444 <p>As mentioned in the <a href="#concepts">intro</a>, classes and definitions
    445 (collectively known as 'records') in TableGen are the main high-level unit of
    446 information that TableGen collects.  Records are defined with a <tt>def</tt> or
    447 <tt>class</tt> keyword, the record name, and an optional list of "<a
    448 href="#templateargs">template arguments</a>".  If the record has superclasses,
    449 they are specified as a comma separated list that starts with a colon character
    450 ("<tt>:</tt>").  If <a href="#valuedef">value definitions</a> or <a
    451 href="#recordlet">let expressions</a> are needed for the class, they are
    452 enclosed in curly braces ("<tt>{}</tt>"); otherwise, the record ends with a
    453 semicolon.</p>
    454 
    455 <p>Here is a simple TableGen file:</p>
    456 
    457 <div class="doc_code">
    458 <pre>
    459 <b>class</b> C { <b>bit</b> V = 1; }
    460 <b>def</b> X : C;
    461 <b>def</b> Y : C {
    462   <b>string</b> Greeting = "hello";
    463 }
    464 </pre>
    465 </div>
    466 
    467 <p>This example defines two definitions, <tt>X</tt> and <tt>Y</tt>, both of
    468 which derive from the <tt>C</tt> class.  Because of this, they both get the
    469 <tt>V</tt> bit value.  The <tt>Y</tt> definition also gets the Greeting member
    470 as well.</p>
    471 
    472 <p>In general, classes are useful for collecting together the commonality
    473 between a group of records and isolating it in a single place.  Also, classes
    474 permit the specification of default values for their subclasses, allowing the
    475 subclasses to override them as they wish.</p>
    476 
    477 <!---------------------------------------------------------------------------->
    478 <h4>
    479   <a name="valuedef">Value definitions</a>
    480 </h4>
    481 
    482 <div>
    483 
    484 <p>Value definitions define named entries in records.  A value must be defined
    485 before it can be referred to as the operand for another value definition or
    486 before the value is reset with a <a href="#recordlet">let expression</a>.  A
    487 value is defined by specifying a <a href="#types">TableGen type</a> and a name.
    488 If an initial value is available, it may be specified after the type with an
    489 equal sign.  Value definitions require terminating semicolons.</p>
    490 
    491 </div>
    492 
    493 <!-- -------------------------------------------------------------------------->
    494 <h4>
    495   <a name="recordlet">'let' expressions</a>
    496 </h4>
    497 
    498 <div>
    499 
    500 <p>A record-level let expression is used to change the value of a value
    501 definition in a record.  This is primarily useful when a superclass defines a
    502 value that a derived class or definition wants to override.  Let expressions
    503 consist of the '<tt>let</tt>' keyword followed by a value name, an equal sign
    504 ("<tt>=</tt>"), and a new value.  For example, a new class could be added to the
    505 example above, redefining the <tt>V</tt> field for all of its subclasses:</p>
    506 
    507 <div class="doc_code">
    508 <pre>
    509 <b>class</b> D : C { let V = 0; }
    510 <b>def</b> Z : D;
    511 </pre>
    512 </div>
    513 
    514 <p>In this case, the <tt>Z</tt> definition will have a zero value for its "V"
    515 value, despite the fact that it derives (indirectly) from the <tt>C</tt> class,
    516 because the <tt>D</tt> class overrode its value.</p>
    517 
    518 </div>
    519 
    520 <!-- -------------------------------------------------------------------------->
    521 <h4>
    522   <a name="templateargs">Class template arguments</a>
    523 </h4>
    524 
    525 <div>
    526 
    527 <p>TableGen permits the definition of parameterized classes as well as normal
    528 concrete classes.  Parameterized TableGen classes specify a list of variable
    529 bindings (which may optionally have defaults) that are bound when used.  Here is
    530 a simple example:</p>
    531 
    532 <div class="doc_code">
    533 <pre>
    534 <b>class</b> FPFormat&lt;<b>bits</b>&lt;3&gt; val&gt; {
    535   <b>bits</b>&lt;3&gt; Value = val;
    536 }
    537 <b>def</b> NotFP      : FPFormat&lt;0&gt;;
    538 <b>def</b> ZeroArgFP  : FPFormat&lt;1&gt;;
    539 <b>def</b> OneArgFP   : FPFormat&lt;2&gt;;
    540 <b>def</b> OneArgFPRW : FPFormat&lt;3&gt;;
    541 <b>def</b> TwoArgFP   : FPFormat&lt;4&gt;;
    542 <b>def</b> CompareFP  : FPFormat&lt;5&gt;;
    543 <b>def</b> CondMovFP  : FPFormat&lt;6&gt;;
    544 <b>def</b> SpecialFP  : FPFormat&lt;7&gt;;
    545 </pre>
    546 </div>
    547 
    548 <p>In this case, template arguments are used as a space efficient way to specify
    549 a list of "enumeration values", each with a "<tt>Value</tt>" field set to the
    550 specified integer.</p>
    551 
    552 <p>The more esoteric forms of <a href="#values">TableGen expressions</a> are
    553 useful in conjunction with template arguments.  As an example:</p>
    554 
    555 <div class="doc_code">
    556 <pre>
    557 <b>class</b> ModRefVal&lt;<b>bits</b>&lt;2&gt; val&gt; {
    558   <b>bits</b>&lt;2&gt; Value = val;
    559 }
    560 
    561 <b>def</b> None   : ModRefVal&lt;0&gt;;
    562 <b>def</b> Mod    : ModRefVal&lt;1&gt;;
    563 <b>def</b> Ref    : ModRefVal&lt;2&gt;;
    564 <b>def</b> ModRef : ModRefVal&lt;3&gt;;
    565 
    566 <b>class</b> Value&lt;ModRefVal MR&gt; {
    567   <i>// Decode some information into a more convenient format, while providing
    568   // a nice interface to the user of the "Value" class.</i>
    569   <b>bit</b> isMod = MR.Value{0};
    570   <b>bit</b> isRef = MR.Value{1};
    571 
    572   <i>// other stuff...</i>
    573 }
    574 
    575 <i>// Example uses</i>
    576 <b>def</b> bork : Value&lt;Mod&gt;;
    577 <b>def</b> zork : Value&lt;Ref&gt;;
    578 <b>def</b> hork : Value&lt;ModRef&gt;;
    579 </pre>
    580 </div>
    581 
    582 <p>This is obviously a contrived example, but it shows how template arguments
    583 can be used to decouple the interface provided to the user of the class from the
    584 actual internal data representation expected by the class.  In this case,
    585 running <tt>tblgen</tt> on the example prints the following definitions:</p>
    586 
    587 <div class="doc_code">
    588 <pre>
    589 <b>def</b> bork {      <i>// Value</i>
    590   <b>bit</b> isMod = 1;
    591   <b>bit</b> isRef = 0;
    592 }
    593 <b>def</b> hork {      <i>// Value</i>
    594   <b>bit</b> isMod = 1;
    595   <b>bit</b> isRef = 1;
    596 }
    597 <b>def</b> zork {      <i>// Value</i>
    598   <b>bit</b> isMod = 0;
    599   <b>bit</b> isRef = 1;
    600 }
    601 </pre>
    602 </div>
    603 
    604 <p> This shows that TableGen was able to dig into the argument and extract a
    605 piece of information that was requested by the designer of the "Value" class.
    606 For more realistic examples, please see existing users of TableGen, such as the
    607 X86 backend.</p>
    608 
    609 </div>
    610 
    611 <!-- -------------------------------------------------------------------------->
    612 <h4>
    613   <a name="multiclass">Multiclass definitions and instances</a>
    614 </h4>
    615 
    616 <div>
    617 
    618 <p>
    619 While classes with template arguments are a good way to factor commonality
    620 between two instances of a definition, multiclasses allow a convenient notation
    621 for defining multiple definitions at once (instances of implicitly constructed
    622 classes).  For example, consider an 3-address instruction set whose instructions
    623 come in two forms: "<tt>reg = reg op reg</tt>" and "<tt>reg = reg op imm</tt>"
    624 (e.g. SPARC). In this case, you'd like to specify in one place that this
    625 commonality exists, then in a separate place indicate what all the ops are.
    626 </p>
    627 
    628 <p>
    629 Here is an example TableGen fragment that shows this idea:
    630 </p>
    631 
    632 <div class="doc_code">
    633 <pre>
    634 <b>def</b> ops;
    635 <b>def</b> GPR;
    636 <b>def</b> Imm;
    637 <b>class</b> inst&lt;<b>int</b> opc, <b>string</b> asmstr, <b>dag</b> operandlist&gt;;
    638 
    639 <b>multiclass</b> ri_inst&lt;<b>int</b> opc, <b>string</b> asmstr&gt; {
    640   def _rr : inst&lt;opc, !strconcat(asmstr, " $dst, $src1, $src2"),
    641                  (ops GPR:$dst, GPR:$src1, GPR:$src2)&gt;;
    642   def _ri : inst&lt;opc, !strconcat(asmstr, " $dst, $src1, $src2"),
    643                  (ops GPR:$dst, GPR:$src1, Imm:$src2)&gt;;
    644 }
    645 
    646 <i>// Instantiations of the ri_inst multiclass.</i>
    647 <b>defm</b> ADD : ri_inst&lt;0b111, "add"&gt;;
    648 <b>defm</b> SUB : ri_inst&lt;0b101, "sub"&gt;;
    649 <b>defm</b> MUL : ri_inst&lt;0b100, "mul"&gt;;
    650 ...
    651 </pre>
    652 </div>
    653 
    654 <p>The name of the resultant definitions has the multidef fragment names
    655    appended to them, so this defines <tt>ADD_rr</tt>, <tt>ADD_ri</tt>,
    656    <tt>SUB_rr</tt>, etc.  A defm may inherit from multiple multiclasses,
    657    instantiating definitions from each multiclass.  Using a multiclass
    658    this way is exactly equivalent to instantiating the classes multiple
    659    times yourself, e.g. by writing:</p>
    660 
    661 <div class="doc_code">
    662 <pre>
    663 <b>def</b> ops;
    664 <b>def</b> GPR;
    665 <b>def</b> Imm;
    666 <b>class</b> inst&lt;<b>int</b> opc, <b>string</b> asmstr, <b>dag</b> operandlist&gt;;
    667 
    668 <b>class</b> rrinst&lt;<b>int</b> opc, <b>string</b> asmstr&gt;
    669   : inst&lt;opc, !strconcat(asmstr, " $dst, $src1, $src2"),
    670          (ops GPR:$dst, GPR:$src1, GPR:$src2)&gt;;
    671 
    672 <b>class</b> riinst&lt;<b>int</b> opc, <b>string</b> asmstr&gt;
    673   : inst&lt;opc, !strconcat(asmstr, " $dst, $src1, $src2"),
    674          (ops GPR:$dst, GPR:$src1, Imm:$src2)&gt;;
    675 
    676 <i>// Instantiations of the ri_inst multiclass.</i>
    677 <b>def</b> ADD_rr : rrinst&lt;0b111, "add"&gt;;
    678 <b>def</b> ADD_ri : riinst&lt;0b111, "add"&gt;;
    679 <b>def</b> SUB_rr : rrinst&lt;0b101, "sub"&gt;;
    680 <b>def</b> SUB_ri : riinst&lt;0b101, "sub"&gt;;
    681 <b>def</b> MUL_rr : rrinst&lt;0b100, "mul"&gt;;
    682 <b>def</b> MUL_ri : riinst&lt;0b100, "mul"&gt;;
    683 ...
    684 </pre>
    685 </div>
    686 
    687 <p>
    688 A defm can also be used inside a multiclass providing several levels of
    689 multiclass instanciations.
    690 </p>
    691 
    692 <div class="doc_code">
    693 <pre>
    694 <b>class</b> Instruction&lt;bits&lt;4&gt; opc, string Name&gt; {
    695   bits&lt;4&gt; opcode = opc;
    696   string name = Name;
    697 }
    698 
    699 <b>multiclass</b> basic_r&lt;bits&lt;4&gt; opc&gt; {
    700   <b>def</b> rr : Instruction&lt;opc, "rr"&gt;;
    701   <b>def</b> rm : Instruction&lt;opc, "rm"&gt;;
    702 }
    703 
    704 <b>multiclass</b> basic_s&lt;bits&lt;4&gt; opc&gt; {
    705   <b>defm</b> SS : basic_r&lt;opc&gt;;
    706   <b>defm</b> SD : basic_r&lt;opc&gt;;
    707   <b>def</b> X : Instruction&lt;opc, "x"&gt;;
    708 }
    709 
    710 <b>multiclass</b> basic_p&lt;bits&lt;4&gt; opc&gt; {
    711   <b>defm</b> PS : basic_r&lt;opc&gt;;
    712   <b>defm</b> PD : basic_r&lt;opc&gt;;
    713   <b>def</b> Y : Instruction&lt;opc, "y"&gt;;
    714 }
    715 
    716 <b>defm</b> ADD : basic_s&lt;0xf&gt;, basic_p&lt;0xf&gt;;
    717 ...
    718 
    719 <i>// Results</i>
    720 <b>def</b> ADDPDrm { ...
    721 <b>def</b> ADDPDrr { ...
    722 <b>def</b> ADDPSrm { ...
    723 <b>def</b> ADDPSrr { ...
    724 <b>def</b> ADDSDrm { ...
    725 <b>def</b> ADDSDrr { ...
    726 <b>def</b> ADDY { ...
    727 <b>def</b> ADDX { ...
    728 </pre>
    729 </div>
    730 
    731 <p>
    732 defm declarations can inherit from classes too, the
    733 rule to follow is that the class list must start after the
    734 last multiclass, and there must be at least one multiclass
    735 before them.
    736 </p>
    737 
    738 <div class="doc_code">
    739 <pre>
    740 <b>class</b> XD { bits&lt;4&gt; Prefix = 11; }
    741 <b>class</b> XS { bits&lt;4&gt; Prefix = 12; }
    742 
    743 <b>class</b> I&lt;bits<4&gt; op> {
    744   bits&lt;4&gt; opcode = op;
    745 }
    746 
    747 <b>multiclass</b> R {
    748   <b>def</b> rr : I&lt;4&gt;;
    749   <b>def</b> rm : I&lt;2&gt;;
    750 }
    751 
    752 <b>multiclass</b> Y {
    753   <b>defm</b> SS : R, XD;
    754   <b>defm</b> SD : R, XS;
    755 }
    756 
    757 <b>defm</b> Instr : Y;
    758 
    759 <i>// Results</i>
    760 <b>def</b> InstrSDrm {
    761   bits&lt;4&gt; opcode = { 0, 0, 1, 0 };
    762   bits&lt;4&gt; Prefix = { 1, 1, 0, 0 };
    763 }
    764 ...
    765 <b>def</b> InstrSSrr {
    766   bits&lt;4&gt; opcode = { 0, 1, 0, 0 };
    767   bits&lt;4&gt; Prefix = { 1, 0, 1, 1 };
    768 }
    769 </pre>
    770 </div>
    771 
    772 </div>
    773 
    774 </div>
    775 
    776 <!-- ======================================================================= -->
    777 <h3>
    778   <a name="filescope">File scope entities</a>
    779 </h3>
    780 
    781 <div>
    782 
    783 <!-- -------------------------------------------------------------------------->
    784 <h4>
    785   <a name="include">File inclusion</a>
    786 </h4>
    787 
    788 <div>
    789 <p>TableGen supports the '<tt>include</tt>' token, which textually substitutes
    790 the specified file in place of the include directive.  The filename should be
    791 specified as a double quoted string immediately after the '<tt>include</tt>'
    792 keyword.  Example:</p>
    793 
    794 <div class="doc_code">
    795 <pre>
    796 <b>include</b> "foo.td"
    797 </pre>
    798 </div>
    799 
    800 </div>
    801 
    802 <!-- -------------------------------------------------------------------------->
    803 <h4>
    804   <a name="globallet">'let' expressions</a>
    805 </h4>
    806 
    807 <div>
    808 
    809 <p>"Let" expressions at file scope are similar to <a href="#recordlet">"let"
    810 expressions within a record</a>, except they can specify a value binding for
    811 multiple records at a time, and may be useful in certain other cases.
    812 File-scope let expressions are really just another way that TableGen allows the
    813 end-user to factor out commonality from the records.</p>
    814 
    815 <p>File-scope "let" expressions take a comma-separated list of bindings to
    816 apply, and one or more records to bind the values in.  Here are some
    817 examples:</p>
    818 
    819 <div class="doc_code">
    820 <pre>
    821 <b>let</b> isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1 <b>in</b>
    822   <b>def</b> RET : I&lt;0xC3, RawFrm, (outs), (ins), "ret", [(X86retflag 0)]&gt;;
    823 
    824 <b>let</b> isCall = 1 <b>in</b>
    825   <i>// All calls clobber the non-callee saved registers...</i>
    826   <b>let</b> Defs = [EAX, ECX, EDX, FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0,
    827               MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
    828               XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, EFLAGS] <b>in</b> {
    829     <b>def</b> CALLpcrel32 : Ii32&lt;0xE8, RawFrm, (outs), (ins i32imm:$dst,variable_ops),
    830                            "call\t${dst:call}", []&gt;;
    831     <b>def</b> CALL32r     : I&lt;0xFF, MRM2r, (outs), (ins GR32:$dst, variable_ops),
    832                         "call\t{*}$dst", [(X86call GR32:$dst)]&gt;;
    833     <b>def</b> CALL32m     : I&lt;0xFF, MRM2m, (outs), (ins i32mem:$dst, variable_ops),
    834                         "call\t{*}$dst", []&gt;;
    835   }
    836 </pre>
    837 </div>
    838 
    839 <p>File-scope "let" expressions are often useful when a couple of definitions
    840 need to be added to several records, and the records do not otherwise need to be
    841 opened, as in the case with the <tt>CALL*</tt> instructions above.</p>
    842 
    843 <p>It's also possible to use "let" expressions inside multiclasses, providing
    844 more ways to factor out commonality from the records, specially if using
    845 several levels of multiclass instanciations. This also avoids the need of using
    846 "let" expressions within subsequent records inside a multiclass.</p> 
    847 
    848 <pre class="doc_code">
    849 <b>multiclass </b>basic_r&lt;bits&lt;4&gt; opc&gt; {
    850   <b>let </b>Predicates = [HasSSE2] in {
    851     <b>def </b>rr : Instruction&lt;opc, "rr"&gt;;
    852     <b>def </b>rm : Instruction&lt;opc, "rm"&gt;;
    853   }
    854   <b>let </b>Predicates = [HasSSE3] in
    855     <b>def </b>rx : Instruction&lt;opc, "rx"&gt;;
    856 }
    857 
    858 <b>multiclass </b>basic_ss&lt;bits&lt;4&gt; opc&gt; {
    859   <b>let </b>IsDouble = 0 in
    860     <b>defm </b>SS : basic_r&lt;opc&gt;;
    861 
    862   <b>let </b>IsDouble = 1 in
    863     <b>defm </b>SD : basic_r&lt;opc&gt;;
    864 }
    865 
    866 <b>defm </b>ADD : basic_ss&lt;0xf&gt;;
    867 </pre>
    868 </div>
    869 
    870 </div>
    871 
    872 </div>
    873 
    874 <!-- *********************************************************************** -->
    875 <h2><a name="codegen">Code Generator backend info</a></h2>
    876 <!-- *********************************************************************** -->
    877 
    878 <div>
    879 
    880 <p>Expressions used by code generator to describe instructions and isel
    881 patterns:</p>
    882 
    883 <dl>
    884 <dt><tt>(implicit a)</tt></dt>
    885   <dd>an implicitly defined physical register.  This tells the dag instruction
    886   selection emitter the input pattern's extra definitions matches implicit
    887   physical register definitions.</dd>
    888 </dl>
    889 </div>
    890 
    891 <!-- *********************************************************************** -->
    892 <h2><a name="backends">TableGen backends</a></h2>
    893 <!-- *********************************************************************** -->
    894 
    895 <div>
    896 
    897 <p>TODO: How they work, how to write one.  This section should not contain
    898 details about any particular backend, except maybe -print-enums as an example.
    899 This should highlight the APIs in <tt>TableGen/Record.h</tt>.</p>
    900 
    901 </div>
    902 
    903 <!-- *********************************************************************** -->
    904 
    905 <hr>
    906 <address>
    907   <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
    908   src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
    909   <a href="http://validator.w3.org/check/referer"><img
    910   src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>
    911 
    912   <a href="mailto:sabre (a] nondot.org">Chris Lattner</a><br>
    913   <a href="http://llvm.org/">LLVM Compiler Infrastructure</a><br>
    914   Last modified: $Date: 2011-10-07 14:25:05 -0400 (Fri, 07 Oct 2011) $
    915 </address>
    916 
    917 </body>
    918 </html>
    919