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