[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