target/arm: Convert integer-to-float insns to decodetree
[qemu/ar7.git] / docs / devel / decodetree.rst
blob44ac621ea87ca2b227fbf7a359516521f01f62af
1 ========================
2 Decodetree Specification
3 ========================
5 A *decodetree* is built from instruction *patterns*.  A pattern may
6 represent a single architectural instruction or a group of same, depending
7 on what is convenient for further processing.
9 Each pattern has both *fixedbits* and *fixedmask*, the combination of which
10 describes the condition under which the pattern is matched::
12   (insn & fixedmask) == fixedbits
14 Each pattern may have *fields*, which are extracted from the insn and
15 passed along to the translator.  Examples of such are registers,
16 immediates, and sub-opcodes.
18 In support of patterns, one may declare *fields*, *argument sets*, and
19 *formats*, each of which may be re-used to simplify further definitions.
21 Fields
22 ======
24 Syntax::
26   field_def     := '%' identifier ( unnamed_field )+ ( !function=identifier )?
27   unnamed_field := number ':' ( 's' ) number
29 For *unnamed_field*, the first number is the least-significant bit position
30 of the field and the second number is the length of the field.  If the 's' is
31 present, the field is considered signed.  If multiple ``unnamed_fields`` are
32 present, they are concatenated.  In this way one can define disjoint fields.
34 If ``!function`` is specified, the concatenated result is passed through the
35 named function, taking and returning an integral value.
37 FIXME: the fields of the structure into which this result will be stored
38 is restricted to ``int``.  Which means that we cannot expand 64-bit items.
40 Field examples:
42 +---------------------------+---------------------------------------------+
43 | Input                     | Generated code                              |
44 +===========================+=============================================+
45 | %disp   0:s16             | sextract(i, 0, 16)                          |
46 +---------------------------+---------------------------------------------+
47 | %imm9   16:6 10:3         | extract(i, 16, 6) << 3 | extract(i, 10, 3)  |
48 +---------------------------+---------------------------------------------+
49 | %disp12 0:s1 1:1 2:10     | sextract(i, 0, 1) << 11 |                   |
50 |                           |    extract(i, 1, 1) << 10 |                 |
51 |                           |    extract(i, 2, 10)                        |
52 +---------------------------+---------------------------------------------+
53 | %shimm8 5:s8 13:1         | expand_shimm8(sextract(i, 5, 8) << 1 |      |
54 |   !function=expand_shimm8 |               extract(i, 13, 1))            |
55 +---------------------------+---------------------------------------------+
57 Argument Sets
58 =============
60 Syntax::
62   args_def    := '&' identifier ( args_elt )+ ( !extern )?
63   args_elt    := identifier
65 Each *args_elt* defines an argument within the argument set.
66 Each argument set will be rendered as a C structure "arg_$name"
67 with each of the fields being one of the member arguments.
69 If ``!extern`` is specified, the backing structure is assumed
70 to have been already declared, typically via a second decoder.
72 Argument sets are useful when one wants to define helper functions
73 for the translator functions that can perform operations on a common
74 set of arguments.  This can ensure, for instance, that the ``AND``
75 pattern and the ``OR`` pattern put their operands into the same named
76 structure, so that a common ``gen_logic_insn`` may be able to handle
77 the operations common between the two.
79 Argument set examples::
81   &reg3       ra rb rc
82   &loadstore  reg base offset
85 Formats
86 =======
88 Syntax::
90   fmt_def      := '@' identifier ( fmt_elt )+
91   fmt_elt      := fixedbit_elt | field_elt | field_ref | args_ref
92   fixedbit_elt := [01.-]+
93   field_elt    := identifier ':' 's'? number
94   field_ref    := '%' identifier | identifier '=' '%' identifier
95   args_ref     := '&' identifier
97 Defining a format is a handy way to avoid replicating groups of fields
98 across many instruction patterns.
100 A *fixedbit_elt* describes a contiguous sequence of bits that must
101 be 1, 0, or don't care.  The difference between '.' and '-'
102 is that '.' means that the bit will be covered with a field or a
103 final 0 or 1 from the pattern, and '-' means that the bit is really
104 ignored by the cpu and will not be specified.
106 A *field_elt* describes a simple field only given a width; the position of
107 the field is implied by its position with respect to other *fixedbit_elt*
108 and *field_elt*.
110 If any *fixedbit_elt* or *field_elt* appear, then all bits must be defined.
111 Padding with a *fixedbit_elt* of all '.' is an easy way to accomplish that.
113 A *field_ref* incorporates a field by reference.  This is the only way to
114 add a complex field to a format.  A field may be renamed in the process
115 via assignment to another identifier.  This is intended to allow the
116 same argument set be used with disjoint named fields.
118 A single *args_ref* may specify an argument set to use for the format.
119 The set of fields in the format must be a subset of the arguments in
120 the argument set.  If an argument set is not specified, one will be
121 inferred from the set of fields.
123 It is recommended, but not required, that all *field_ref* and *args_ref*
124 appear at the end of the line, not interleaving with *fixedbit_elf* or
125 *field_elt*.
127 Format examples::
129   @opr    ...... ra:5 rb:5 ... 0 ....... rc:5
130   @opi    ...... ra:5 lit:8    1 ....... rc:5
132 Patterns
133 ========
135 Syntax::
137   pat_def      := identifier ( pat_elt )+
138   pat_elt      := fixedbit_elt | field_elt | field_ref | args_ref | fmt_ref | const_elt
139   fmt_ref      := '@' identifier
140   const_elt    := identifier '=' number
142 The *fixedbit_elt* and *field_elt* specifiers are unchanged from formats.
143 A pattern that does not specify a named format will have one inferred
144 from a referenced argument set (if present) and the set of fields.
146 A *const_elt* allows a argument to be set to a constant value.  This may
147 come in handy when fields overlap between patterns and one has to
148 include the values in the *fixedbit_elt* instead.
150 The decoder will call a translator function for each pattern matched.
152 Pattern examples::
154   addl_r   010000 ..... ..... .... 0000000 ..... @opr
155   addl_i   010000 ..... ..... .... 0000000 ..... @opi
157 which will, in part, invoke::
159   trans_addl_r(ctx, &arg_opr, insn)
161 and::
163   trans_addl_i(ctx, &arg_opi, insn)
165 Pattern Groups
166 ==============
168 Syntax::
170   group    := '{' ( pat_def | group )+ '}'
172 A *group* begins with a lone open-brace, with all subsequent lines
173 indented two spaces, and ending with a lone close-brace.  Groups
174 may be nested, increasing the required indentation of the lines
175 within the nested group to two spaces per nesting level.
177 Unlike ungrouped patterns, grouped patterns are allowed to overlap.
178 Conflicts are resolved by selecting the patterns in order.  If all
179 of the fixedbits for a pattern match, its translate function will
180 be called.  If the translate function returns false, then subsequent
181 patterns within the group will be matched.
183 The following example from PA-RISC shows specialization of the *or*
184 instruction::
186   {
187     {
188       nop   000010 ----- ----- 0000 001001 0 00000
189       copy  000010 00000 r1:5  0000 001001 0 rt:5
190     }
191     or      000010 rt2:5 r1:5  cf:4 001001 0 rt:5
192   }
194 When the *cf* field is zero, the instruction has no side effects,
195 and may be specialized.  When the *rt* field is zero, the output
196 is discarded and so the instruction has no effect.  When the *rt2*
197 field is zero, the operation is ``reg[rt] | 0`` and so encodes
198 the canonical register copy operation.
200 The output from the generator might look like::
202   switch (insn & 0xfc000fe0) {
203   case 0x08000240:
204     /* 000010.. ........ ....0010 010..... */
205     if ((insn & 0x0000f000) == 0x00000000) {
206         /* 000010.. ........ 00000010 010..... */
207         if ((insn & 0x0000001f) == 0x00000000) {
208             /* 000010.. ........ 00000010 01000000 */
209             extract_decode_Fmt_0(&u.f_decode0, insn);
210             if (trans_nop(ctx, &u.f_decode0)) return true;
211         }
212         if ((insn & 0x03e00000) == 0x00000000) {
213             /* 00001000 000..... 00000010 010..... */
214             extract_decode_Fmt_1(&u.f_decode1, insn);
215             if (trans_copy(ctx, &u.f_decode1)) return true;
216         }
217     }
218     extract_decode_Fmt_2(&u.f_decode2, insn);
219     if (trans_or(ctx, &u.f_decode2)) return true;
220     return false;
221   }