==============================
TableGen Language Introduction
==============================

.. contents::
   :local:

.. warning::
   This document is extremely rough. If you find something lacking, please
   fix it, file a documentation bug, or ask about it on llvm-dev.

Introduction
============

This document is not meant to be a normative spec about the TableGen language
in and of itself (i.e. how to understand a given construct in terms of how
it affects the final set of records represented by the TableGen file). For
the formal language specification, see :doc:`LangRef`.

TableGen syntax
===============

TableGen doesn't care about the meaning of data (that is up to the backend to
define), but it does care about syntax, and it enforces a simple type system.
This section describes the syntax and the constructs allowed in a TableGen file.

TableGen primitives
-------------------

TableGen comments
^^^^^^^^^^^^^^^^^

TableGen supports C++ style "``//``" comments, which run to the end of the
line, and it also supports **nestable** "``/* */``" comments.

.. _TableGen type:

The TableGen type system
^^^^^^^^^^^^^^^^^^^^^^^^

TableGen files are strongly typed, in a simple (but complete) type-system.
These types are used to perform automatic conversions, check for errors, and to
help interface designers constrain the input that they allow.  Every `value
definition`_ is required to have an associated type.

TableGen supports a mixture of very low-level types (such as ``bit``) and very
high-level types (such as ``dag``).  This flexibility is what allows it to
describe a wide range of information conveniently and compactly.  The TableGen
types are:

``bit``
    A 'bit' is a boolean value that can hold either 0 or 1.

``int``
    The 'int' type represents a simple 32-bit integer value, such as 5.

``string``
    The 'string' type represents an ordered sequence of characters of arbitrary
    length.

``code``
    The `code` type represents a code fragment, which can be single/multi-line
    string literal.

``bits<n>``
    A 'bits' type is an arbitrary, but fixed, size integer that is broken up
    into individual bits.  This type is useful because it can handle some bits
    being defined while others are undefined.

``list<ty>``
    This type represents a list whose elements are some other type.  The
    contained type is arbitrary: it can even be another list type.

Class type
    Specifying a class name in a type context means that the defined value must
    be a subclass of the specified class.  This is useful in conjunction with
    the ``list`` type, for example, to constrain the elements of the list to a
    common base class (e.g., a ``list<Register>`` can only contain definitions
    derived from the "``Register``" class).

``dag``
    This type represents a nestable directed graph of elements.

To date, these types have been sufficient for describing things that TableGen
has been used for, but it is straight-forward to extend this list if needed.

.. _TableGen expressions:

TableGen values and expressions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

TableGen allows for a pretty reasonable number of different expression forms
when building up values.  These forms allow the TableGen file to be written in a
natural syntax and flavor for the application.  The current expression forms
supported include:

``?``
    uninitialized field

``0b1001011``
    binary integer value.
    Note that this is sized by the number of bits given and will not be
    silently extended/truncated.

``7``
    decimal integer value

``0x7F``
    hexadecimal integer value

``"foo"``
    a single-line string value, can be assigned to ``string`` or ``code`` variable.

``[{ ... }]``
    usually called a "code fragment", but is just a multiline string literal

``[ X, Y, Z ]<type>``
    list value.  <type> is the type of the list element and is usually optional.
    In rare cases, TableGen is unable to deduce the element type in which case
    the user must specify it explicitly.

``{ a, b, 0b10 }``
    initializer for a "bits<4>" value.
    1-bit from "a", 1-bit from "b", 2-bits from 0b10.

``value``
    value reference

``value{17}``
    access to one bit of a value

``value{15-17}``
    access to an ordered sequence of bits of a value, in particular ``value{15-17}``
    produces an order that is the reverse of ``value{17-15}``.

``DEF``
    reference to a record definition

``CLASS<val list>``
    reference to a new anonymous definition of CLASS with the specified template
    arguments.

``X.Y``
    reference to the subfield of a value

``list[4-7,17,2-3]``
    A slice of the 'list' list, including elements 4,5,6,7,17,2, and 3 from it.
    Elements may be included multiple times.

``foreach <var> = [ <list> ] in { <body> }``

``foreach <var> = [ <list> ] in <def>``
    Replicate <body> or <def>, replacing instances of <var> with each value
    in <list>.  <var> is scoped at the level of the ``foreach`` loop and must
    not conflict with any other object introduced in <body> or <def>.  Only
    ``def``\s and ``defm``\s are expanded within <body>.

``foreach <var> = 0-15 in ...``

``foreach <var> = {0-15,32-47} in ...``
    Loop over ranges of integers. The braces are required for multiple ranges.

``(DEF a, b)``
    a dag value.  The first element is required to be a record definition, the
    remaining elements in the list may be arbitrary other values, including
    nested ```dag``' values.

``!con(a, b, ...)``
    Concatenate two or more DAG nodes. Their operations must equal.

    Example: !con((op a1:$name1, a2:$name2), (op b1:$name3)) results in
    the DAG node (op a1:$name1, a2:$name2, b1:$name3).

``!dag(op, children, names)``
    Generate a DAG node programmatically. 'children' and 'names' must be lists
    of equal length or unset ('?'). 'names' must be a 'list<string>'.

    Due to limitations of the type system, 'children' must be a list of items
    of a common type. In practice, this means that they should either have the
    same type or be records with a common superclass. Mixing dag and non-dag
    items is not possible. However, '?' can be used.

    Example: !dag(op, [a1, a2, ?], ["name1", "name2", "name3"]) results in
    (op a1:$name1, a2:$name2, ?:$name3).

``!listconcat(a, b, ...)``
    A list value that is the result of concatenating the 'a' and 'b' lists.
    The lists must have the same element type.
    More than two arguments are accepted with the result being the concatenation
    of all the lists given.

``!listsplat(a, size)``
    A list value that contains the value ``a`` ``size`` times.
    Example: ``!listsplat(0, 2)`` results in ``[0, 0]``.

``!strconcat(a, b, ...)``
    A string value that is the result of concatenating the 'a' and 'b' strings.
    More than two arguments are accepted with the result being the concatenation
    of all the strings given.

``str1#str2``
    "#" (paste) is a shorthand for !strconcat.  It may concatenate things that
    are not quoted strings, in which case an implicit !cast<string> is done on
    the operand of the paste.

``!cast<type>(a)``
    If 'a' is a string, a record of type *type* obtained by looking up the
    string 'a' in the list of all records defined by the time that all template
    arguments in 'a' are fully resolved.

    For example, if !cast<type>(a) appears in a multiclass definition, or in a
    class instantiated inside of a multiclass definition, and 'a' does not
    reference any template arguments of the multiclass, then a record of name
    'a' must be instantiated earlier in the source file. If 'a' does reference
    a template argument, then the lookup is delayed until defm statements
    instantiating the multiclass (or later, if the defm occurs in another
    multiclass and template arguments of the inner multiclass that are
    referenced by 'a' are substituted by values that themselves contain
    references to template arguments of the outer multiclass).

    If the type of 'a' does not match *type*, TableGen aborts with an error.

    Otherwise, perform a normal type cast e.g. between an int and a bit, or
    between record types. This allows casting a record to a subclass, though if
    the types do not match, constant folding will be inhibited. !cast<string>
    is a special case in that the argument can be an int or a record. In the
    latter case, the record's name is returned.

``!isa<type>(a)``
    Returns an integer: 1 if 'a' is dynamically of the given type, 0 otherwise.

``!subst(a, b, c)``
    If 'a' and 'b' are of string type or are symbol references, substitute 'b'
    for 'a' in 'c.'  This operation is analogous to $(subst) in GNU make.

``!foreach(a, b, c)``
    For each member of dag or list 'b' apply operator 'c'. 'a' is the name
    of a variable that will be substituted by members of 'b' in 'c'.
    This operation is analogous to $(foreach) in GNU make.

``!foldl(start, lst, a, b, expr)``
    Perform a left-fold over 'lst' with the given starting value. 'a' and 'b'
    are variable names which will be substituted in 'expr'. If you think of
    expr as a function f(a,b), the fold will compute
    'f(...f(f(start, lst[0]), lst[1]), ...), lst[n-1])' for a list of length n.
    As usual, 'a' will be of the type of 'start', and 'b' will be of the type
    of elements of 'lst'. These types need not be the same, but 'expr' must be
    of the same type as 'start'.

``!head(a)``
    The first element of list 'a.'

``!tail(a)``
    The 2nd-N elements of list 'a.'

``!empty(a)``
    An integer {0,1} indicating whether list 'a' is empty.

``!size(a)``
    An integer indicating the number of elements in list 'a'.

``!if(a,b,c)``
  'b' if the result of 'int' or 'bit' operator 'a' is nonzero, 'c' otherwise.

``!cond(condition_1 : val1, condition_2 : val2, ..., condition_n : valn)``
    Instead of embedding !if inside !if which can get cumbersome,
    one can use !cond. !cond returns 'val1' if the result of 'int' or 'bit'
    operator 'condition1' is nonzero. Otherwise, it checks 'condition2'.
    If 'condition2' is nonzero, returns 'val2', and so on.
    If all conditions are zero, it reports an error.  

    For example, to convert an integer 'x' into a string:
      !cond(!lt(x,0) : "negative", !eq(x,0) : "zero", 1 : "positive")

``!eq(a,b)``
    'bit 1' if string a is equal to string b, 0 otherwise.  This only operates
    on string, int and bit objects.  Use !cast<string> to compare other types of
    objects.

``!ne(a,b)``
    The negation of ``!eq(a,b)``.

``!le(a,b), !lt(a,b), !ge(a,b), !gt(a,b)``
    (Signed) comparison of integer values that returns bit 1 or 0 depending on
    the result of the comparison.

``!shl(a,b)`` ``!srl(a,b)`` ``!sra(a,b)``
    The usual shift operators. Operations are on 64-bit integers, the result
    is undefined for shift counts outside [0, 63].

``!add(a,b,...)`` ``!mul(a,b,...)`` ``!and(a,b,...)`` ``!or(a,b,...)``
    The usual arithmetic and binary operators.

Note that all of the values have rules specifying how they convert to values
for different types.  These rules allow you to assign a value like "``7``"
to a "``bits<4>``" value, for example.

Classes and definitions
-----------------------

As mentioned in the :doc:`introduction <index>`, classes and definitions (collectively known as
'records') in TableGen are the main high-level unit of information that TableGen
collects.  Records are defined with a ``def`` or ``class`` keyword, the record
name, and an optional list of "`template arguments`_".  If the record has
superclasses, they are specified as a comma separated list that starts with a
colon character ("``:``").  If `value definitions`_ or `let expressions`_ are
needed for the class, they are enclosed in curly braces ("``{}``"); otherwise,
the record ends with a semicolon.

Here is a simple TableGen file:

.. code-block:: text

  class C { bit V = 1; }
  def X : C;
  def Y : C {
    string Greeting = "hello";
  }

This example defines two definitions, ``X`` and ``Y``, both of which derive from
the ``C`` class.  Because of this, they both get the ``V`` bit value.  The ``Y``
definition also gets the Greeting member as well.

In general, classes are useful for collecting together the commonality between a
group of records and isolating it in a single place.  Also, classes permit the
specification of default values for their subclasses, allowing the subclasses to
override them as they wish.

.. _value definition:
.. _value definitions:

Value definitions
^^^^^^^^^^^^^^^^^

Value definitions define named entries in records.  A value must be defined
before it can be referred to as the operand for another value definition or
before the value is reset with a `let expression`_.  A value is defined by
specifying a `TableGen type`_ and a name.  If an initial value is available, it
may be specified after the type with an equal sign.  Value definitions require
terminating semicolons.

.. _let expression:
.. _let expressions:
.. _"let" expressions within a record:

'let' expressions
^^^^^^^^^^^^^^^^^

A record-level let expression is used to change the value of a value definition
in a record.  This is primarily useful when a superclass defines a value that a
derived class or definition wants to override.  Let expressions consist of the
'``let``' keyword followed by a value name, an equal sign ("``=``"), and a new
value.  For example, a new class could be added to the example above, redefining
the ``V`` field for all of its subclasses:

.. code-block:: text

  class D : C { let V = 0; }
  def Z : D;

In this case, the ``Z`` definition will have a zero value for its ``V`` value,
despite the fact that it derives (indirectly) from the ``C`` class, because the
``D`` class overrode its value.

References between variables in a record are substituted late, which gives
``let`` expressions unusual power. Consider this admittedly silly example:

.. code-block:: text

  class A<int x> {
    int Y = x;
    int Yplus1 = !add(Y, 1);
    int xplus1 = !add(x, 1);
  }
  def Z : A<5> {
    let Y = 10;
  }

The value of ``Z.xplus1`` will be 6, but the value of ``Z.Yplus1`` is 11. Use
this power wisely.

.. _template arguments:

Class template arguments
^^^^^^^^^^^^^^^^^^^^^^^^

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:

.. code-block:: text

  class FPFormat<bits<3> val> {
    bits<3> Value = val;
  }
  def NotFP      : FPFormat<0>;
  def ZeroArgFP  : FPFormat<1>;
  def OneArgFP   : FPFormat<2>;
  def OneArgFPRW : FPFormat<3>;
  def TwoArgFP   : FPFormat<4>;
  def CompareFP  : FPFormat<5>;
  def CondMovFP  : FPFormat<6>;
  def SpecialFP  : FPFormat<7>;

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.

The more esoteric forms of `TableGen expressions`_ are useful in conjunction
with template arguments.  As an example:

.. code-block:: text

  class ModRefVal<bits<2> val> {
    bits<2> Value = val;
  }

  def None   : ModRefVal<0>;
  def Mod    : ModRefVal<1>;
  def Ref    : ModRefVal<2>;
  def ModRef : ModRefVal<3>;

  class Value<ModRefVal MR> {
    // Decode some information into a more convenient format, while providing
    // a nice interface to the user of the "Value" class.
    bit isMod = MR.Value{0};
    bit isRef = MR.Value{1};

    // other stuff...
  }

  // Example uses
  def bork : Value<Mod>;
  def zork : Value<Ref>;
  def hork : Value<ModRef>;

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 ``llvm-tblgen`` on the example prints the following definitions:

.. code-block:: text

  def bork {      // Value
    bit isMod = 1;
    bit isRef = 0;
  }
  def hork {      // Value
    bit isMod = 1;
    bit isRef = 1;
  }
  def zork {      // Value
    bit isMod = 0;
    bit isRef = 1;
  }

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.

Multiclass definitions and instances
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

While classes with template arguments are a good way to factor commonality
between two instances of a definition, multiclasses allow a convenient notation
for defining multiple definitions at once (instances of implicitly constructed
classes).  For example, consider an 3-address instruction set whose instructions
come in two forms: "``reg = reg op reg``" and "``reg = reg op imm``"
(e.g. SPARC). In this case, you'd like to specify in one place that this
commonality exists, then in a separate place indicate what all the ops are.

Here is an example TableGen fragment that shows this idea:

.. code-block:: text

  def ops;
  def GPR;
  def Imm;
  class inst<int opc, string asmstr, dag operandlist>;

  multiclass ri_inst<int opc, string asmstr> {
    def _rr : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"),
                   (ops GPR:$dst, GPR:$src1, GPR:$src2)>;
    def _ri : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"),
                   (ops GPR:$dst, GPR:$src1, Imm:$src2)>;
  }

  // Instantiations of the ri_inst multiclass.
  defm ADD : ri_inst<0b111, "add">;
  defm SUB : ri_inst<0b101, "sub">;
  defm MUL : ri_inst<0b100, "mul">;
  ...

The name of the resultant definitions has the multidef fragment names appended
to them, so this defines ``ADD_rr``, ``ADD_ri``, ``SUB_rr``, etc.  A defm may
inherit from multiple multiclasses, instantiating definitions from each
multiclass.  Using a multiclass this way is exactly equivalent to instantiating
the classes multiple times yourself, e.g. by writing:

.. code-block:: text

  def ops;
  def GPR;
  def Imm;
  class inst<int opc, string asmstr, dag operandlist>;

  class rrinst<int opc, string asmstr>
    : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"),
           (ops GPR:$dst, GPR:$src1, GPR:$src2)>;

  class riinst<int opc, string asmstr>
    : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"),
           (ops GPR:$dst, GPR:$src1, Imm:$src2)>;

  // Instantiations of the ri_inst multiclass.
  def ADD_rr : rrinst<0b111, "add">;
  def ADD_ri : riinst<0b111, "add">;
  def SUB_rr : rrinst<0b101, "sub">;
  def SUB_ri : riinst<0b101, "sub">;
  def MUL_rr : rrinst<0b100, "mul">;
  def MUL_ri : riinst<0b100, "mul">;
  ...

A ``defm`` can also be used inside a multiclass providing several levels of
multiclass instantiations.

.. code-block:: text

  class Instruction<bits<4> opc, string Name> {
    bits<4> opcode = opc;
    string name = Name;
  }

  multiclass basic_r<bits<4> opc> {
    def rr : Instruction<opc, "rr">;
    def rm : Instruction<opc, "rm">;
  }

  multiclass basic_s<bits<4> opc> {
    defm SS : basic_r<opc>;
    defm SD : basic_r<opc>;
    def X : Instruction<opc, "x">;
  }

  multiclass basic_p<bits<4> opc> {
    defm PS : basic_r<opc>;
    defm PD : basic_r<opc>;
    def Y : Instruction<opc, "y">;
  }

  defm ADD : basic_s<0xf>, basic_p<0xf>;
  ...

  // Results
  def ADDPDrm { ...
  def ADDPDrr { ...
  def ADDPSrm { ...
  def ADDPSrr { ...
  def ADDSDrm { ...
  def ADDSDrr { ...
  def ADDY { ...
  def ADDX { ...

``defm`` declarations can inherit from classes too, the rule to follow is that
the class list must start after the last multiclass, and there must be at least
one multiclass before them.

.. code-block:: text

  class XD { bits<4> Prefix = 11; }
  class XS { bits<4> Prefix = 12; }

  class I<bits<4> op> {
    bits<4> opcode = op;
  }

  multiclass R {
    def rr : I<4>;
    def rm : I<2>;
  }

  multiclass Y {
    defm SS : R, XD;
    defm SD : R, XS;
  }

  defm Instr : Y;

  // Results
  def InstrSDrm {
    bits<4> opcode = { 0, 0, 1, 0 };
    bits<4> Prefix = { 1, 1, 0, 0 };
  }
  ...
  def InstrSSrr {
    bits<4> opcode = { 0, 1, 0, 0 };
    bits<4> Prefix = { 1, 0, 1, 1 };
  }

File scope entities
-------------------

File inclusion
^^^^^^^^^^^^^^

TableGen supports the '``include``' token, which textually substitutes the
specified file in place of the include directive.  The filename should be
specified as a double quoted string immediately after the '``include``' keyword.
Example:

.. code-block:: text

  include "foo.td"

'let' expressions
^^^^^^^^^^^^^^^^^

"Let" expressions at file scope are similar to `"let" expressions within a
record`_, except they can specify a value binding for multiple records at a
time, and may be useful in certain other cases.  File-scope let expressions are
really just another way that TableGen allows the end-user to factor out
commonality from the records.

File-scope "let" expressions take a comma-separated list of bindings to apply,
and one or more records to bind the values in.  Here are some examples:

.. code-block:: text

  let isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1 in
    def RET : I<0xC3, RawFrm, (outs), (ins), "ret", [(X86retflag 0)]>;

  let isCall = 1 in
    // All calls clobber the non-callee saved registers...
    let Defs = [EAX, ECX, EDX, FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0,
                MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
                XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, EFLAGS] in {
      def CALLpcrel32 : Ii32<0xE8, RawFrm, (outs), (ins i32imm:$dst,variable_ops),
                             "call\t${dst:call}", []>;
      def CALL32r     : I<0xFF, MRM2r, (outs), (ins GR32:$dst, variable_ops),
                          "call\t{*}$dst", [(X86call GR32:$dst)]>;
      def CALL32m     : I<0xFF, MRM2m, (outs), (ins i32mem:$dst, variable_ops),
                          "call\t{*}$dst", []>;
    }

File-scope "let" expressions are often useful when a couple of definitions need
to be added to several records, and the records do not otherwise need to be
opened, as in the case with the ``CALL*`` instructions above.

It's also possible to use "let" expressions inside multiclasses, providing more
ways to factor out commonality from the records, specially if using several
levels of multiclass instantiations. This also avoids the need of using "let"
expressions within subsequent records inside a multiclass.

.. code-block:: text

  multiclass basic_r<bits<4> opc> {
    let Predicates = [HasSSE2] in {
      def rr : Instruction<opc, "rr">;
      def rm : Instruction<opc, "rm">;
    }
    let Predicates = [HasSSE3] in
      def rx : Instruction<opc, "rx">;
  }

  multiclass basic_ss<bits<4> opc> {
    let IsDouble = 0 in
      defm SS : basic_r<opc>;

    let IsDouble = 1 in
      defm SD : basic_r<opc>;
  }

  defm ADD : basic_ss<0xf>;

Looping
^^^^^^^

TableGen supports the '``foreach``' block, which textually replicates the loop
body, substituting iterator values for iterator references in the body.
Example:

.. code-block:: text

  foreach i = [0, 1, 2, 3] in {
    def R#i : Register<...>;
    def F#i : Register<...>;
  }

This will create objects ``R0``, ``R1``, ``R2`` and ``R3``.  ``foreach`` blocks
may be nested. If there is only one item in the body the braces may be
elided:

.. code-block:: text

  foreach i = [0, 1, 2, 3] in
    def R#i : Register<...>;

Code Generator backend info
===========================

Expressions used by code generator to describe instructions and isel patterns:

``(implicit a)``
    an implicitly defined physical register.  This tells the dag instruction
    selection emitter the input pattern's extra definitions matches implicit
    physical register definitions.

