blob: 7437723bf3bf8e62afe1ddb0db8b1a2cb7f08669 [file] [log] [blame]
Renato Golin33f973a2014-04-01 09:51:49 +00001==============================
2TableGen Language Introduction
3==============================
4
5.. contents::
6 :local:
7
8.. warning::
9 This document is extremely rough. If you find something lacking, please
Tanya Lattner0d28f802015-08-05 03:51:17 +000010 fix it, file a documentation bug, or ask about it on llvm-dev.
Renato Golin33f973a2014-04-01 09:51:49 +000011
12Introduction
13============
14
15This document is not meant to be a normative spec about the TableGen language
16in and of itself (i.e. how to understand a given construct in terms of how
17it affects the final set of records represented by the TableGen file). For
18the formal language specification, see :doc:`LangRef`.
19
20TableGen syntax
21===============
22
23TableGen doesn't care about the meaning of data (that is up to the backend to
24define), but it does care about syntax, and it enforces a simple type system.
25This section describes the syntax and the constructs allowed in a TableGen file.
26
27TableGen primitives
28-------------------
29
30TableGen comments
31^^^^^^^^^^^^^^^^^
32
33TableGen supports C++ style "``//``" comments, which run to the end of the
34line, and it also supports **nestable** "``/* */``" comments.
35
36.. _TableGen type:
37
38The TableGen type system
39^^^^^^^^^^^^^^^^^^^^^^^^
40
41TableGen files are strongly typed, in a simple (but complete) type-system.
42These types are used to perform automatic conversions, check for errors, and to
43help interface designers constrain the input that they allow. Every `value
44definition`_ is required to have an associated type.
45
46TableGen supports a mixture of very low-level types (such as ``bit``) and very
47high-level types (such as ``dag``). This flexibility is what allows it to
48describe a wide range of information conveniently and compactly. The TableGen
49types are:
50
51``bit``
52 A 'bit' is a boolean value that can hold either 0 or 1.
53
54``int``
55 The 'int' type represents a simple 32-bit integer value, such as 5.
56
57``string``
58 The 'string' type represents an ordered sequence of characters of arbitrary
59 length.
60
Alex Bradbury5b359bd2017-05-02 13:47:10 +000061``code``
62 The `code` type represents a code fragment, which can be single/multi-line
63 string literal.
64
Renato Golin33f973a2014-04-01 09:51:49 +000065``bits<n>``
66 A 'bits' type is an arbitrary, but fixed, size integer that is broken up
67 into individual bits. This type is useful because it can handle some bits
68 being defined while others are undefined.
69
70``list<ty>``
71 This type represents a list whose elements are some other type. The
72 contained type is arbitrary: it can even be another list type.
73
74Class type
75 Specifying a class name in a type context means that the defined value must
76 be a subclass of the specified class. This is useful in conjunction with
77 the ``list`` type, for example, to constrain the elements of the list to a
78 common base class (e.g., a ``list<Register>`` can only contain definitions
79 derived from the "``Register``" class).
80
81``dag``
82 This type represents a nestable directed graph of elements.
83
84To date, these types have been sufficient for describing things that TableGen
85has been used for, but it is straight-forward to extend this list if needed.
86
87.. _TableGen expressions:
88
89TableGen values and expressions
90^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
91
92TableGen allows for a pretty reasonable number of different expression forms
93when building up values. These forms allow the TableGen file to be written in a
94natural syntax and flavor for the application. The current expression forms
95supported include:
96
97``?``
98 uninitialized field
99
100``0b1001011``
Pete Cooper9b90dc72014-08-07 05:47:13 +0000101 binary integer value.
102 Note that this is sized by the number of bits given and will not be
103 silently extended/truncated.
Renato Golin33f973a2014-04-01 09:51:49 +0000104
Renato Golin33f973a2014-04-01 09:51:49 +0000105``7``
106 decimal integer value
107
108``0x7F``
109 hexadecimal integer value
110
111``"foo"``
Alex Bradbury5b359bd2017-05-02 13:47:10 +0000112 a single-line string value, can be assigned to ``string`` or ``code`` variable.
Renato Golin33f973a2014-04-01 09:51:49 +0000113
114``[{ ... }]``
115 usually called a "code fragment", but is just a multiline string literal
116
117``[ X, Y, Z ]<type>``
118 list value. <type> is the type of the list element and is usually optional.
119 In rare cases, TableGen is unable to deduce the element type in which case
120 the user must specify it explicitly.
121
Pete Cooper9b90dc72014-08-07 05:47:13 +0000122``{ a, b, 0b10 }``
123 initializer for a "bits<4>" value.
124 1-bit from "a", 1-bit from "b", 2-bits from 0b10.
Renato Golin33f973a2014-04-01 09:51:49 +0000125
126``value``
127 value reference
128
129``value{17}``
130 access to one bit of a value
131
132``value{15-17}``
Alex Bradbury5b359bd2017-05-02 13:47:10 +0000133 access to an ordered sequence of bits of a value, in particular ``value{15-17}``
134 produces an order that is the reverse of ``value{17-15}``.
Renato Golin33f973a2014-04-01 09:51:49 +0000135
136``DEF``
137 reference to a record definition
138
139``CLASS<val list>``
140 reference to a new anonymous definition of CLASS with the specified template
141 arguments.
142
143``X.Y``
144 reference to the subfield of a value
145
146``list[4-7,17,2-3]``
147 A slice of the 'list' list, including elements 4,5,6,7,17,2, and 3 from it.
148 Elements may be included multiple times.
149
150``foreach <var> = [ <list> ] in { <body> }``
151
152``foreach <var> = [ <list> ] in <def>``
153 Replicate <body> or <def>, replacing instances of <var> with each value
154 in <list>. <var> is scoped at the level of the ``foreach`` loop and must
155 not conflict with any other object introduced in <body> or <def>. Currently
156 only ``def``\s are expanded within <body>.
157
158``foreach <var> = 0-15 in ...``
159
160``foreach <var> = {0-15,32-47} in ...``
161 Loop over ranges of integers. The braces are required for multiple ranges.
162
163``(DEF a, b)``
164 a dag value. The first element is required to be a record definition, the
165 remaining elements in the list may be arbitrary other values, including
166 nested ```dag``' values.
167
Daniel Sanders314e80e2014-05-07 10:13:19 +0000168``!listconcat(a, b, ...)``
169 A list value that is the result of concatenating the 'a' and 'b' lists.
170 The lists must have the same element type.
171 More than two arguments are accepted with the result being the concatenation
172 of all the lists given.
173
Daniel Sanders6ef0a2f2014-05-02 19:25:52 +0000174``!strconcat(a, b, ...)``
Renato Golin33f973a2014-04-01 09:51:49 +0000175 A string value that is the result of concatenating the 'a' and 'b' strings.
Daniel Sanders6ef0a2f2014-05-02 19:25:52 +0000176 More than two arguments are accepted with the result being the concatenation
177 of all the strings given.
Renato Golin33f973a2014-04-01 09:51:49 +0000178
179``str1#str2``
180 "#" (paste) is a shorthand for !strconcat. It may concatenate things that
181 are not quoted strings, in which case an implicit !cast<string> is done on
182 the operand of the paste.
183
184``!cast<type>(a)``
Nicolai Haehnledfda9dc2018-03-06 13:48:39 +0000185 If 'a' is a string, a record of type *type* obtained by looking up the
186 string 'a' in the list of all records defined by the time that all template
187 arguments in 'a' are fully resolved.
188
189 For example, if !cast<type>(a) appears in a multiclass definition, or in a
190 class instantiated inside of a multiclass definition, and 'a' does not
191 reference any template arguments of the multiclass, then a record of name
192 'a' must be instantiated earlier in the source file. If 'a' does reference
193 a template argument, then the lookup is delayed until defm statements
194 instantiating the multiclass (or later, if the defm occurs in another
195 multiclass and template arguments of the inner multiclass that are
196 referenced by 'a' are substituted by values that themselves contain
197 references to template arguments of the outer multiclass).
198
199 If the type of 'a' does not match *type*, TableGen aborts with an error.
200
201 For historical reasons, 'a' can also be the name of a variable or a
202 template argument in some cases, but this use is unreliable and is
203 discouraged.
204
205 Otherwise, perform a normal type cast e.g. between an int and a bit, or
206 between record types. This allows casting a record to a subclass, though if
207 the types do not match, constant folding will be inhibited. !cast<string>
208 is a special case in that the argument can be an int or a record. In the
209 latter case, the record's name is returned.
Renato Golin33f973a2014-04-01 09:51:49 +0000210
211``!subst(a, b, c)``
212 If 'a' and 'b' are of string type or are symbol references, substitute 'b'
213 for 'a' in 'c.' This operation is analogous to $(subst) in GNU make.
214
215``!foreach(a, b, c)``
Nicolai Haehnle8ebf7e42018-03-05 15:21:04 +0000216 For each member of dag or list 'b' apply operator 'c'. 'a' is the name
217 of a variable that will be substituted by members of 'b' in 'c'.
218 This operation is analogous to $(foreach) in GNU make.
Renato Golin33f973a2014-04-01 09:51:49 +0000219
220``!head(a)``
221 The first element of list 'a.'
222
223``!tail(a)``
224 The 2nd-N elements of list 'a.'
225
226``!empty(a)``
227 An integer {0,1} indicating whether list 'a' is empty.
228
Nicolai Haehnle0243aaf2018-02-23 10:46:07 +0000229``!size(a)``
230 An integer indicating the number of elements in list 'a'.
231
Renato Golin33f973a2014-04-01 09:51:49 +0000232``!if(a,b,c)``
233 'b' if the result of 'int' or 'bit' operator 'a' is nonzero, 'c' otherwise.
234
235``!eq(a,b)``
236 'bit 1' if string a is equal to string b, 0 otherwise. This only operates
237 on string, int and bit objects. Use !cast<string> to compare other types of
238 objects.
239
Joerg Sonnenberger0a537272014-09-03 13:17:03 +0000240``!shl(a,b)`` ``!srl(a,b)`` ``!sra(a,b)`` ``!add(a,b)`` ``!and(a,b)``
241 The usual binary and arithmetic operators.
Adam Nemet017fca02014-07-17 17:04:27 +0000242
Renato Golin33f973a2014-04-01 09:51:49 +0000243Note that all of the values have rules specifying how they convert to values
244for different types. These rules allow you to assign a value like "``7``"
245to a "``bits<4>``" value, for example.
246
247Classes and definitions
248-----------------------
249
250As mentioned in the :doc:`introduction <index>`, classes and definitions (collectively known as
251'records') in TableGen are the main high-level unit of information that TableGen
252collects. Records are defined with a ``def`` or ``class`` keyword, the record
253name, and an optional list of "`template arguments`_". If the record has
254superclasses, they are specified as a comma separated list that starts with a
255colon character ("``:``"). If `value definitions`_ or `let expressions`_ are
256needed for the class, they are enclosed in curly braces ("``{}``"); otherwise,
257the record ends with a semicolon.
258
259Here is a simple TableGen file:
260
Renato Golin124f2592016-07-20 12:16:38 +0000261.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000262
263 class C { bit V = 1; }
264 def X : C;
265 def Y : C {
266 string Greeting = "hello";
267 }
268
269This example defines two definitions, ``X`` and ``Y``, both of which derive from
270the ``C`` class. Because of this, they both get the ``V`` bit value. The ``Y``
271definition also gets the Greeting member as well.
272
273In general, classes are useful for collecting together the commonality between a
274group of records and isolating it in a single place. Also, classes permit the
275specification of default values for their subclasses, allowing the subclasses to
276override them as they wish.
277
278.. _value definition:
279.. _value definitions:
280
281Value definitions
282^^^^^^^^^^^^^^^^^
283
284Value definitions define named entries in records. A value must be defined
285before it can be referred to as the operand for another value definition or
286before the value is reset with a `let expression`_. A value is defined by
287specifying a `TableGen type`_ and a name. If an initial value is available, it
288may be specified after the type with an equal sign. Value definitions require
289terminating semicolons.
290
291.. _let expression:
292.. _let expressions:
293.. _"let" expressions within a record:
294
295'let' expressions
296^^^^^^^^^^^^^^^^^
297
298A record-level let expression is used to change the value of a value definition
299in a record. This is primarily useful when a superclass defines a value that a
300derived class or definition wants to override. Let expressions consist of the
301'``let``' keyword followed by a value name, an equal sign ("``=``"), and a new
302value. For example, a new class could be added to the example above, redefining
303the ``V`` field for all of its subclasses:
304
Renato Golin124f2592016-07-20 12:16:38 +0000305.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000306
307 class D : C { let V = 0; }
308 def Z : D;
309
310In this case, the ``Z`` definition will have a zero value for its ``V`` value,
311despite the fact that it derives (indirectly) from the ``C`` class, because the
312``D`` class overrode its value.
313
314.. _template arguments:
315
316Class template arguments
317^^^^^^^^^^^^^^^^^^^^^^^^
318
319TableGen permits the definition of parameterized classes as well as normal
320concrete classes. Parameterized TableGen classes specify a list of variable
321bindings (which may optionally have defaults) that are bound when used. Here is
322a simple example:
323
Renato Golin124f2592016-07-20 12:16:38 +0000324.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000325
326 class FPFormat<bits<3> val> {
327 bits<3> Value = val;
328 }
329 def NotFP : FPFormat<0>;
330 def ZeroArgFP : FPFormat<1>;
331 def OneArgFP : FPFormat<2>;
332 def OneArgFPRW : FPFormat<3>;
333 def TwoArgFP : FPFormat<4>;
334 def CompareFP : FPFormat<5>;
335 def CondMovFP : FPFormat<6>;
336 def SpecialFP : FPFormat<7>;
337
338In this case, template arguments are used as a space efficient way to specify a
339list of "enumeration values", each with a "``Value``" field set to the specified
340integer.
341
342The more esoteric forms of `TableGen expressions`_ are useful in conjunction
343with template arguments. As an example:
344
Renato Golin124f2592016-07-20 12:16:38 +0000345.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000346
347 class ModRefVal<bits<2> val> {
348 bits<2> Value = val;
349 }
350
351 def None : ModRefVal<0>;
352 def Mod : ModRefVal<1>;
353 def Ref : ModRefVal<2>;
354 def ModRef : ModRefVal<3>;
355
356 class Value<ModRefVal MR> {
357 // Decode some information into a more convenient format, while providing
358 // a nice interface to the user of the "Value" class.
359 bit isMod = MR.Value{0};
360 bit isRef = MR.Value{1};
361
362 // other stuff...
363 }
364
365 // Example uses
366 def bork : Value<Mod>;
367 def zork : Value<Ref>;
368 def hork : Value<ModRef>;
369
370This is obviously a contrived example, but it shows how template arguments can
371be used to decouple the interface provided to the user of the class from the
372actual internal data representation expected by the class. In this case,
373running ``llvm-tblgen`` on the example prints the following definitions:
374
Renato Golin124f2592016-07-20 12:16:38 +0000375.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000376
377 def bork { // Value
378 bit isMod = 1;
379 bit isRef = 0;
380 }
381 def hork { // Value
382 bit isMod = 1;
383 bit isRef = 1;
384 }
385 def zork { // Value
386 bit isMod = 0;
387 bit isRef = 1;
388 }
389
390This shows that TableGen was able to dig into the argument and extract a piece
391of information that was requested by the designer of the "Value" class. For
392more realistic examples, please see existing users of TableGen, such as the X86
393backend.
394
395Multiclass definitions and instances
396^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
397
398While classes with template arguments are a good way to factor commonality
399between two instances of a definition, multiclasses allow a convenient notation
400for defining multiple definitions at once (instances of implicitly constructed
401classes). For example, consider an 3-address instruction set whose instructions
402come in two forms: "``reg = reg op reg``" and "``reg = reg op imm``"
403(e.g. SPARC). In this case, you'd like to specify in one place that this
404commonality exists, then in a separate place indicate what all the ops are.
405
406Here is an example TableGen fragment that shows this idea:
407
Renato Golin124f2592016-07-20 12:16:38 +0000408.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000409
410 def ops;
411 def GPR;
412 def Imm;
413 class inst<int opc, string asmstr, dag operandlist>;
414
415 multiclass ri_inst<int opc, string asmstr> {
416 def _rr : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"),
417 (ops GPR:$dst, GPR:$src1, GPR:$src2)>;
418 def _ri : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"),
419 (ops GPR:$dst, GPR:$src1, Imm:$src2)>;
420 }
421
422 // Instantiations of the ri_inst multiclass.
423 defm ADD : ri_inst<0b111, "add">;
424 defm SUB : ri_inst<0b101, "sub">;
425 defm MUL : ri_inst<0b100, "mul">;
426 ...
427
428The name of the resultant definitions has the multidef fragment names appended
429to them, so this defines ``ADD_rr``, ``ADD_ri``, ``SUB_rr``, etc. A defm may
430inherit from multiple multiclasses, instantiating definitions from each
431multiclass. Using a multiclass this way is exactly equivalent to instantiating
432the classes multiple times yourself, e.g. by writing:
433
Renato Golin124f2592016-07-20 12:16:38 +0000434.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000435
436 def ops;
437 def GPR;
438 def Imm;
439 class inst<int opc, string asmstr, dag operandlist>;
440
441 class rrinst<int opc, string asmstr>
442 : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"),
443 (ops GPR:$dst, GPR:$src1, GPR:$src2)>;
444
445 class riinst<int opc, string asmstr>
446 : inst<opc, !strconcat(asmstr, " $dst, $src1, $src2"),
447 (ops GPR:$dst, GPR:$src1, Imm:$src2)>;
448
449 // Instantiations of the ri_inst multiclass.
450 def ADD_rr : rrinst<0b111, "add">;
451 def ADD_ri : riinst<0b111, "add">;
452 def SUB_rr : rrinst<0b101, "sub">;
453 def SUB_ri : riinst<0b101, "sub">;
454 def MUL_rr : rrinst<0b100, "mul">;
455 def MUL_ri : riinst<0b100, "mul">;
456 ...
457
458A ``defm`` can also be used inside a multiclass providing several levels of
459multiclass instantiations.
460
Renato Golin124f2592016-07-20 12:16:38 +0000461.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000462
463 class Instruction<bits<4> opc, string Name> {
464 bits<4> opcode = opc;
465 string name = Name;
466 }
467
468 multiclass basic_r<bits<4> opc> {
469 def rr : Instruction<opc, "rr">;
470 def rm : Instruction<opc, "rm">;
471 }
472
473 multiclass basic_s<bits<4> opc> {
474 defm SS : basic_r<opc>;
475 defm SD : basic_r<opc>;
476 def X : Instruction<opc, "x">;
477 }
478
479 multiclass basic_p<bits<4> opc> {
480 defm PS : basic_r<opc>;
481 defm PD : basic_r<opc>;
482 def Y : Instruction<opc, "y">;
483 }
484
485 defm ADD : basic_s<0xf>, basic_p<0xf>;
486 ...
487
488 // Results
489 def ADDPDrm { ...
490 def ADDPDrr { ...
491 def ADDPSrm { ...
492 def ADDPSrr { ...
493 def ADDSDrm { ...
494 def ADDSDrr { ...
495 def ADDY { ...
496 def ADDX { ...
497
498``defm`` declarations can inherit from classes too, the rule to follow is that
499the class list must start after the last multiclass, and there must be at least
500one multiclass before them.
501
Renato Golin124f2592016-07-20 12:16:38 +0000502.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000503
504 class XD { bits<4> Prefix = 11; }
505 class XS { bits<4> Prefix = 12; }
506
507 class I<bits<4> op> {
508 bits<4> opcode = op;
509 }
510
511 multiclass R {
512 def rr : I<4>;
513 def rm : I<2>;
514 }
515
516 multiclass Y {
517 defm SS : R, XD;
518 defm SD : R, XS;
519 }
520
521 defm Instr : Y;
522
523 // Results
524 def InstrSDrm {
525 bits<4> opcode = { 0, 0, 1, 0 };
526 bits<4> Prefix = { 1, 1, 0, 0 };
527 }
528 ...
529 def InstrSSrr {
530 bits<4> opcode = { 0, 1, 0, 0 };
531 bits<4> Prefix = { 1, 0, 1, 1 };
532 }
533
534File scope entities
535-------------------
536
537File inclusion
538^^^^^^^^^^^^^^
539
540TableGen supports the '``include``' token, which textually substitutes the
541specified file in place of the include directive. The filename should be
542specified as a double quoted string immediately after the '``include``' keyword.
543Example:
544
Renato Golin124f2592016-07-20 12:16:38 +0000545.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000546
547 include "foo.td"
548
549'let' expressions
550^^^^^^^^^^^^^^^^^
551
552"Let" expressions at file scope are similar to `"let" expressions within a
553record`_, except they can specify a value binding for multiple records at a
554time, and may be useful in certain other cases. File-scope let expressions are
555really just another way that TableGen allows the end-user to factor out
556commonality from the records.
557
558File-scope "let" expressions take a comma-separated list of bindings to apply,
559and one or more records to bind the values in. Here are some examples:
560
Renato Golin124f2592016-07-20 12:16:38 +0000561.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000562
563 let isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1 in
564 def RET : I<0xC3, RawFrm, (outs), (ins), "ret", [(X86retflag 0)]>;
565
566 let isCall = 1 in
567 // All calls clobber the non-callee saved registers...
568 let Defs = [EAX, ECX, EDX, FP0, FP1, FP2, FP3, FP4, FP5, FP6, ST0,
569 MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
570 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, EFLAGS] in {
571 def CALLpcrel32 : Ii32<0xE8, RawFrm, (outs), (ins i32imm:$dst,variable_ops),
572 "call\t${dst:call}", []>;
573 def CALL32r : I<0xFF, MRM2r, (outs), (ins GR32:$dst, variable_ops),
574 "call\t{*}$dst", [(X86call GR32:$dst)]>;
575 def CALL32m : I<0xFF, MRM2m, (outs), (ins i32mem:$dst, variable_ops),
576 "call\t{*}$dst", []>;
577 }
578
579File-scope "let" expressions are often useful when a couple of definitions need
580to be added to several records, and the records do not otherwise need to be
581opened, as in the case with the ``CALL*`` instructions above.
582
583It's also possible to use "let" expressions inside multiclasses, providing more
584ways to factor out commonality from the records, specially if using several
585levels of multiclass instantiations. This also avoids the need of using "let"
586expressions within subsequent records inside a multiclass.
587
Renato Golin124f2592016-07-20 12:16:38 +0000588.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000589
590 multiclass basic_r<bits<4> opc> {
591 let Predicates = [HasSSE2] in {
592 def rr : Instruction<opc, "rr">;
593 def rm : Instruction<opc, "rm">;
594 }
595 let Predicates = [HasSSE3] in
596 def rx : Instruction<opc, "rx">;
597 }
598
599 multiclass basic_ss<bits<4> opc> {
600 let IsDouble = 0 in
601 defm SS : basic_r<opc>;
602
603 let IsDouble = 1 in
604 defm SD : basic_r<opc>;
605 }
606
607 defm ADD : basic_ss<0xf>;
608
609Looping
610^^^^^^^
611
612TableGen supports the '``foreach``' block, which textually replicates the loop
613body, substituting iterator values for iterator references in the body.
614Example:
615
Renato Golin124f2592016-07-20 12:16:38 +0000616.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000617
618 foreach i = [0, 1, 2, 3] in {
619 def R#i : Register<...>;
620 def F#i : Register<...>;
621 }
622
623This will create objects ``R0``, ``R1``, ``R2`` and ``R3``. ``foreach`` blocks
624may be nested. If there is only one item in the body the braces may be
625elided:
626
Renato Golin124f2592016-07-20 12:16:38 +0000627.. code-block:: text
Renato Golin33f973a2014-04-01 09:51:49 +0000628
629 foreach i = [0, 1, 2, 3] in
630 def R#i : Register<...>;
631
632Code Generator backend info
633===========================
634
635Expressions used by code generator to describe instructions and isel patterns:
636
637``(implicit a)``
638 an implicitly defined physical register. This tells the dag instruction
639 selection emitter the input pattern's extra definitions matches implicit
640 physical register definitions.
641