[llvm-commits] CVS: llvm/docs/TableGenFundamentals.html

Chris Lattner lattner at cs.uiuc.edu
Fri Feb 6 00:38:05 PST 2004


Changes in directory llvm/docs:

TableGenFundamentals.html updated: 1.2 -> 1.3

---
Log message:

Add information about the piece I forgot to write: parameterized tablegen classes


---
Diffs of the changes:  (+87 -3)

Index: llvm/docs/TableGenFundamentals.html
diff -u llvm/docs/TableGenFundamentals.html:1.2 llvm/docs/TableGenFundamentals.html:1.3
--- llvm/docs/TableGenFundamentals.html:1.2	Fri Feb  6 00:04:25 2004
+++ llvm/docs/TableGenFundamentals.html	Fri Feb  6 00:37:00 2004
@@ -406,6 +406,13 @@
 bit value.  The <tt>Y</tt> definition also gets the Greeting member as well.
 </p>
 
+<p>
+In general, classes are useful for collecting together the commonality between a
+group of records, and isolating it in a single places.  Also, classes permit the
+specification of default values for their subclasses, allowing the subclasses to
+override them as they wish.
+</p>
+
 </div>
 
 <!----------------------------------------------------------------------------->
@@ -456,7 +463,84 @@
 </div>
 
 <div class="doc_text">
-and default values...
+<p>
+TableGen permits the definition of parameterized classes as well as normal
+concrete classes.  Parameterized TableGen classes specify a list of variable
+bindings (which may optionally have defaults) that are bound when used.  Here is
+a simple example:</p>
+
+<p><pre>
+<b>class</b> FPFormat<<b>bits</b><3> val> {
+  <b>bits</b><3> Value = val;
+}
+<b>def</b> NotFP      : FPFormat<0>;
+<b>def</b> ZeroArgFP  : FPFormat<1>;
+<b>def</b> OneArgFP   : FPFormat<2>;
+<b>def</b> OneArgFPRW : FPFormat<3>;
+<b>def</b> TwoArgFP   : FPFormat<4>;
+<b>def</b> SpecialFP  : FPFormat<5>;
+</pre></p>
+
+<p>
+In this case, template arguments are used as a space efficient way to specify a
+list of "enumeration values", each with a "Value" field set to the specified
+integer.</p>
+
+<p>The more esoteric forms of <a href="#values">TableGen expressions</a> are
+useful in conjunction with template arguments.  As an example:</p>
+
+<p><pre>
+<b>class</b> ModRefVal<<b>bits</b><2> val> {
+  <b>bits</b><2> Value = val;
+}
+
+<b>def</b> None   : ModRefVal<0>;
+<b>def</b> Mod    : ModRefVal<1>;
+<b>def</b> Ref    : ModRefVal<2>;
+<b>def</b> ModRef : ModRefVal<3>;
+
+<b>class</b> Value<ModRefVal MR> {
+  <i>// decode some information into a more convenient format, while providing
+  // a nice interface to the user of the "Value" class.</i>
+  <b>bit</b> isMod = MR.Value{0};
+  <b>bit</b> isRef = MR.Value{1};
+
+  <i>// other stuff...</i>
+}
+
+<i>// Example uses</i>
+<b>def</b> bork : Value<Mod>;
+<b>def</b> zork : Value<Ref>;
+<b>def</b> hork : Value<ModRef>;
+</pre></p>
+
+<p>
+This is obviously a contrived example, but it shows how template arguments can
+be used to decouple the interface provided to the user of the class from the
+actual internal data representation expected by the class.  In this case,
+running <tt>tblgen</tt> on the example prints the following definitions:</p>
+
+<p><pre>
+<b>def</b> bork {      <i>// Value</i>
+  bit isMod = 1;
+  bit isRef = 0;
+}
+<b>def</b> hork {      <i>// Value</i>
+  bit isMod = 1;
+  bit isRef = 1;
+}
+<b>def</b> zork {      <i>// Value</i>
+  bit isMod = 0;
+  bit isRef = 1;
+}
+</pre></p>
+
+<p>
+This shows that TableGen was able to dig into the argument and extract a piece
+of information that was requested by the designer of the "Value" class.  For
+more realistic examples, please see existing users of TableGen, such as the X86
+backend.</p>
+
 </div>
 
 
@@ -479,7 +563,7 @@
 keyword.  Example:
 
 <p><pre>
-  <b>include</b> "foo.td"
+<b>include</b> "foo.td"
 </pre></p>
 
 </div>
@@ -562,7 +646,7 @@
   <address><a href="mailto:sabre at nondot.org">Chris Lattner</a></address>
   <a href="http://llvm.cs.uiuc.edu">The LLVM Compiler Infrastructure</a>
   <br>
-  Last modified: $Date: 2004/02/06 06:04:25 $
+  Last modified: $Date: 2004/02/06 06:37:00 $
 </div>
 
 </body>





More information about the llvm-commits mailing list