1 | /*===- TableGen'erated file -------------------------------------*- C++ -*-===*\ |
2 | |* *| |
3 | |* * Lanai Disassembler *| |
4 | |* *| |
5 | |* Automatically generated file, do not edit! *| |
6 | |* *| |
7 | \*===----------------------------------------------------------------------===*/ |
8 | |
9 | |
10 | #include "llvm/MC/MCInst.h" |
11 | #include "llvm/MC/MCSubtargetInfo.h" |
12 | #include "llvm/Support/DataTypes.h" |
13 | #include "llvm/Support/Debug.h" |
14 | #include "llvm/Support/LEB128.h" |
15 | #include "llvm/Support/raw_ostream.h" |
16 | #include "llvm/TargetParser/SubtargetFeature.h" |
17 | #include <assert.h> |
18 | |
19 | namespace { |
20 | |
21 | // Helper functions for extracting fields from encoded instructions. |
22 | // InsnType must either be integral or an APInt-like object that must: |
23 | // * be default-constructible and copy-constructible |
24 | // * be constructible from an APInt (this can be private) |
25 | // * Support insertBits(bits, startBit, numBits) |
26 | // * Support extractBitsAsZExtValue(numBits, startBit) |
27 | // * Support the ~, &, ==, and != operators with other objects of the same type |
28 | // * Support the != and bitwise & with uint64_t |
29 | // * Support put (<<) to raw_ostream& |
30 | template <typename InsnType> |
31 | #if defined(_MSC_VER) && !defined(__clang__) |
32 | __declspec(noinline) |
33 | #endif |
34 | static std::enable_if_t<std::is_integral<InsnType>::value, InsnType> |
35 | fieldFromInstruction(const InsnType &insn, unsigned startBit, |
36 | unsigned numBits) { |
37 | assert(startBit + numBits <= 64 && "Cannot support >64-bit extractions!" ); |
38 | assert(startBit + numBits <= (sizeof(InsnType) * 8) && |
39 | "Instruction field out of bounds!" ); |
40 | InsnType fieldMask; |
41 | if (numBits == sizeof(InsnType) * 8) |
42 | fieldMask = (InsnType)(-1LL); |
43 | else |
44 | fieldMask = (((InsnType)1 << numBits) - 1) << startBit; |
45 | return (insn & fieldMask) >> startBit; |
46 | } |
47 | |
48 | template <typename InsnType> |
49 | static std::enable_if_t<!std::is_integral<InsnType>::value, uint64_t> |
50 | fieldFromInstruction(const InsnType &insn, unsigned startBit, |
51 | unsigned numBits) { |
52 | return insn.extractBitsAsZExtValue(numBits, startBit); |
53 | } |
54 | |
55 | // Helper function for inserting bits extracted from an encoded instruction into |
56 | // a field. |
57 | template <typename InsnType> |
58 | static void insertBits(InsnType &field, InsnType bits, unsigned startBit, |
59 | unsigned numBits) { |
60 | if constexpr (std::is_integral<InsnType>::value) { |
61 | assert(startBit + numBits <= sizeof field * 8); |
62 | (void)numBits; |
63 | field |= (InsnType)bits << startBit; |
64 | } else { |
65 | field.insertBits(bits, startBit, numBits); |
66 | } |
67 | } |
68 | |
69 | static bool Check(DecodeStatus &Out, DecodeStatus In) { |
70 | Out = static_cast<DecodeStatus>(Out & In); |
71 | return Out != MCDisassembler::Fail; |
72 | } |
73 | |
74 | static const uint8_t DecoderTableLanai32[] = { |
75 | /* 0 */ MCD::OPC_ExtractField, 28, 4, // Inst{31-28} ... |
76 | /* 3 */ MCD::OPC_FilterValue, 0, 120, 0, // Skip to: 127 |
77 | /* 7 */ MCD::OPC_ExtractField, 16, 2, // Inst{17-16} ... |
78 | /* 10 */ MCD::OPC_FilterValue, 0, 91, 0, // Skip to: 105 |
79 | /* 14 */ MCD::OPC_ExtractField, 0, 16, // Inst{15-0} ... |
80 | /* 17 */ MCD::OPC_FilterValue, 1, 10, 0, // Skip to: 31 |
81 | /* 21 */ MCD::OPC_CheckField, 18, 10, 0, 74, 0, // Skip to: 101 |
82 | /* 27 */ MCD::OPC_Decode, 230, 2, 0, // Opcode: NOP, DecodeIdx: 0 |
83 | /* 31 */ MCD::OPC_FilterValue, 2, 10, 0, // Skip to: 45 |
84 | /* 35 */ MCD::OPC_CheckField, 18, 10, 0, 60, 0, // Skip to: 101 |
85 | /* 41 */ MCD::OPC_Decode, 224, 2, 0, // Opcode: LOG0, DecodeIdx: 0 |
86 | /* 45 */ MCD::OPC_FilterValue, 3, 10, 0, // Skip to: 59 |
87 | /* 49 */ MCD::OPC_CheckField, 18, 10, 0, 46, 0, // Skip to: 101 |
88 | /* 55 */ MCD::OPC_Decode, 225, 2, 0, // Opcode: LOG1, DecodeIdx: 0 |
89 | /* 59 */ MCD::OPC_FilterValue, 4, 10, 0, // Skip to: 73 |
90 | /* 63 */ MCD::OPC_CheckField, 18, 10, 0, 32, 0, // Skip to: 101 |
91 | /* 69 */ MCD::OPC_Decode, 226, 2, 0, // Opcode: LOG2, DecodeIdx: 0 |
92 | /* 73 */ MCD::OPC_FilterValue, 5, 10, 0, // Skip to: 87 |
93 | /* 77 */ MCD::OPC_CheckField, 18, 10, 0, 18, 0, // Skip to: 101 |
94 | /* 83 */ MCD::OPC_Decode, 227, 2, 0, // Opcode: LOG3, DecodeIdx: 0 |
95 | /* 87 */ MCD::OPC_FilterValue, 6, 10, 0, // Skip to: 101 |
96 | /* 91 */ MCD::OPC_CheckField, 18, 10, 0, 4, 0, // Skip to: 101 |
97 | /* 97 */ MCD::OPC_Decode, 228, 2, 0, // Opcode: LOG4, DecodeIdx: 0 |
98 | /* 101 */ MCD::OPC_Decode, 197, 2, 1, // Opcode: ADD_I_LO, DecodeIdx: 1 |
99 | /* 105 */ MCD::OPC_FilterValue, 1, 4, 0, // Skip to: 113 |
100 | /* 109 */ MCD::OPC_Decode, 196, 2, 1, // Opcode: ADD_I_HI, DecodeIdx: 1 |
101 | /* 113 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 121 |
102 | /* 117 */ MCD::OPC_Decode, 194, 2, 1, // Opcode: ADD_F_I_LO, DecodeIdx: 1 |
103 | /* 121 */ MCD::OPC_FilterValueOrFail, 3, |
104 | /* 123 */ MCD::OPC_Decode, 193, 2, 1, // Opcode: ADD_F_I_HI, DecodeIdx: 1 |
105 | /* 127 */ MCD::OPC_FilterValue, 1, 33, 0, // Skip to: 164 |
106 | /* 131 */ MCD::OPC_ExtractField, 16, 2, // Inst{17-16} ... |
107 | /* 134 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 142 |
108 | /* 138 */ MCD::OPC_Decode, 191, 2, 1, // Opcode: ADDC_I_LO, DecodeIdx: 1 |
109 | /* 142 */ MCD::OPC_FilterValue, 1, 4, 0, // Skip to: 150 |
110 | /* 146 */ MCD::OPC_Decode, 190, 2, 1, // Opcode: ADDC_I_HI, DecodeIdx: 1 |
111 | /* 150 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 158 |
112 | /* 154 */ MCD::OPC_Decode, 188, 2, 1, // Opcode: ADDC_F_I_LO, DecodeIdx: 1 |
113 | /* 158 */ MCD::OPC_FilterValueOrFail, 3, |
114 | /* 160 */ MCD::OPC_Decode, 187, 2, 1, // Opcode: ADDC_F_I_HI, DecodeIdx: 1 |
115 | /* 164 */ MCD::OPC_FilterValue, 2, 33, 0, // Skip to: 201 |
116 | /* 168 */ MCD::OPC_ExtractField, 16, 2, // Inst{17-16} ... |
117 | /* 171 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 179 |
118 | /* 175 */ MCD::OPC_Decode, 142, 3, 1, // Opcode: SUB_I_LO, DecodeIdx: 1 |
119 | /* 179 */ MCD::OPC_FilterValue, 1, 4, 0, // Skip to: 187 |
120 | /* 183 */ MCD::OPC_Decode, 141, 3, 1, // Opcode: SUB_I_HI, DecodeIdx: 1 |
121 | /* 187 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 195 |
122 | /* 191 */ MCD::OPC_Decode, 139, 3, 1, // Opcode: SUB_F_I_LO, DecodeIdx: 1 |
123 | /* 195 */ MCD::OPC_FilterValueOrFail, 3, |
124 | /* 197 */ MCD::OPC_Decode, 138, 3, 1, // Opcode: SUB_F_I_HI, DecodeIdx: 1 |
125 | /* 201 */ MCD::OPC_FilterValue, 3, 33, 0, // Skip to: 238 |
126 | /* 205 */ MCD::OPC_ExtractField, 16, 2, // Inst{17-16} ... |
127 | /* 208 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 216 |
128 | /* 212 */ MCD::OPC_Decode, 136, 3, 1, // Opcode: SUBB_I_LO, DecodeIdx: 1 |
129 | /* 216 */ MCD::OPC_FilterValue, 1, 4, 0, // Skip to: 224 |
130 | /* 220 */ MCD::OPC_Decode, 135, 3, 1, // Opcode: SUBB_I_HI, DecodeIdx: 1 |
131 | /* 224 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 232 |
132 | /* 228 */ MCD::OPC_Decode, 133, 3, 1, // Opcode: SUBB_F_I_LO, DecodeIdx: 1 |
133 | /* 232 */ MCD::OPC_FilterValueOrFail, 3, |
134 | /* 234 */ MCD::OPC_Decode, 132, 3, 1, // Opcode: SUBB_F_I_HI, DecodeIdx: 1 |
135 | /* 238 */ MCD::OPC_FilterValue, 4, 33, 0, // Skip to: 275 |
136 | /* 242 */ MCD::OPC_ExtractField, 16, 2, // Inst{17-16} ... |
137 | /* 245 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 253 |
138 | /* 249 */ MCD::OPC_Decode, 203, 2, 1, // Opcode: AND_I_LO, DecodeIdx: 1 |
139 | /* 253 */ MCD::OPC_FilterValue, 1, 4, 0, // Skip to: 261 |
140 | /* 257 */ MCD::OPC_Decode, 202, 2, 1, // Opcode: AND_I_HI, DecodeIdx: 1 |
141 | /* 261 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 269 |
142 | /* 265 */ MCD::OPC_Decode, 200, 2, 1, // Opcode: AND_F_I_LO, DecodeIdx: 1 |
143 | /* 269 */ MCD::OPC_FilterValueOrFail, 3, |
144 | /* 271 */ MCD::OPC_Decode, 199, 2, 1, // Opcode: AND_F_I_HI, DecodeIdx: 1 |
145 | /* 275 */ MCD::OPC_FilterValue, 5, 33, 0, // Skip to: 312 |
146 | /* 279 */ MCD::OPC_ExtractField, 16, 2, // Inst{17-16} ... |
147 | /* 282 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 290 |
148 | /* 286 */ MCD::OPC_Decode, 235, 2, 1, // Opcode: OR_I_LO, DecodeIdx: 1 |
149 | /* 290 */ MCD::OPC_FilterValue, 1, 4, 0, // Skip to: 298 |
150 | /* 294 */ MCD::OPC_Decode, 234, 2, 1, // Opcode: OR_I_HI, DecodeIdx: 1 |
151 | /* 298 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 306 |
152 | /* 302 */ MCD::OPC_Decode, 232, 2, 1, // Opcode: OR_F_I_LO, DecodeIdx: 1 |
153 | /* 306 */ MCD::OPC_FilterValueOrFail, 3, |
154 | /* 308 */ MCD::OPC_Decode, 231, 2, 1, // Opcode: OR_F_I_HI, DecodeIdx: 1 |
155 | /* 312 */ MCD::OPC_FilterValue, 6, 33, 0, // Skip to: 349 |
156 | /* 316 */ MCD::OPC_ExtractField, 16, 2, // Inst{17-16} ... |
157 | /* 319 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 327 |
158 | /* 323 */ MCD::OPC_Decode, 151, 3, 1, // Opcode: XOR_I_LO, DecodeIdx: 1 |
159 | /* 327 */ MCD::OPC_FilterValue, 1, 4, 0, // Skip to: 335 |
160 | /* 331 */ MCD::OPC_Decode, 150, 3, 1, // Opcode: XOR_I_HI, DecodeIdx: 1 |
161 | /* 335 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 343 |
162 | /* 339 */ MCD::OPC_Decode, 148, 3, 1, // Opcode: XOR_F_I_LO, DecodeIdx: 1 |
163 | /* 343 */ MCD::OPC_FilterValueOrFail, 3, |
164 | /* 345 */ MCD::OPC_Decode, 147, 3, 1, // Opcode: XOR_F_I_HI, DecodeIdx: 1 |
165 | /* 349 */ MCD::OPC_FilterValue, 7, 33, 0, // Skip to: 386 |
166 | /* 353 */ MCD::OPC_ExtractField, 16, 2, // Inst{17-16} ... |
167 | /* 356 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 364 |
168 | /* 360 */ MCD::OPC_Decode, 250, 2, 2, // Opcode: SL_I, DecodeIdx: 2 |
169 | /* 364 */ MCD::OPC_FilterValue, 1, 4, 0, // Skip to: 372 |
170 | /* 368 */ MCD::OPC_Decode, 240, 2, 2, // Opcode: SA_I, DecodeIdx: 2 |
171 | /* 372 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 380 |
172 | /* 376 */ MCD::OPC_Decode, 249, 2, 2, // Opcode: SL_F_I, DecodeIdx: 2 |
173 | /* 380 */ MCD::OPC_FilterValueOrFail, 3, |
174 | /* 382 */ MCD::OPC_Decode, 239, 2, 2, // Opcode: SA_F_I, DecodeIdx: 2 |
175 | /* 386 */ MCD::OPC_FilterValue, 8, 17, 0, // Skip to: 407 |
176 | /* 390 */ MCD::OPC_CheckField, 0, 28, 252, 255, 219, 8, 4, 0, // Skip to: 403 |
177 | /* 399 */ MCD::OPC_Decode, 238, 2, 0, // Opcode: RET, DecodeIdx: 0 |
178 | /* 403 */ MCD::OPC_Decode, 220, 2, 3, // Opcode: LDW_RI, DecodeIdx: 3 |
179 | /* 407 */ MCD::OPC_FilterValue, 9, 4, 0, // Skip to: 415 |
180 | /* 411 */ MCD::OPC_Decode, 144, 3, 3, // Opcode: SW_RI, DecodeIdx: 3 |
181 | /* 415 */ MCD::OPC_FilterValue, 10, 49, 0, // Skip to: 468 |
182 | /* 419 */ MCD::OPC_ExtractField, 0, 3, // Inst{2-0} ... |
183 | /* 422 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 430 |
184 | /* 426 */ MCD::OPC_Decode, 217, 2, 4, // Opcode: LDHs_RR, DecodeIdx: 4 |
185 | /* 430 */ MCD::OPC_FilterValue, 1, 4, 0, // Skip to: 438 |
186 | /* 434 */ MCD::OPC_Decode, 219, 2, 4, // Opcode: LDHz_RR, DecodeIdx: 4 |
187 | /* 438 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 446 |
188 | /* 442 */ MCD::OPC_Decode, 221, 2, 4, // Opcode: LDW_RR, DecodeIdx: 4 |
189 | /* 446 */ MCD::OPC_FilterValue, 3, 4, 0, // Skip to: 454 |
190 | /* 450 */ MCD::OPC_Decode, 222, 2, 4, // Opcode: LDWz_RR, DecodeIdx: 4 |
191 | /* 454 */ MCD::OPC_FilterValue, 4, 4, 0, // Skip to: 462 |
192 | /* 458 */ MCD::OPC_Decode, 213, 2, 4, // Opcode: LDBs_RR, DecodeIdx: 4 |
193 | /* 462 */ MCD::OPC_FilterValueOrFail, 5, |
194 | /* 464 */ MCD::OPC_Decode, 215, 2, 4, // Opcode: LDBz_RR, DecodeIdx: 4 |
195 | /* 468 */ MCD::OPC_FilterValue, 11, 25, 0, // Skip to: 497 |
196 | /* 472 */ MCD::OPC_ExtractField, 0, 3, // Inst{2-0} ... |
197 | /* 475 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 483 |
198 | /* 479 */ MCD::OPC_Decode, 131, 3, 4, // Opcode: STH_RR, DecodeIdx: 4 |
199 | /* 483 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 491 |
200 | /* 487 */ MCD::OPC_Decode, 145, 3, 4, // Opcode: SW_RR, DecodeIdx: 4 |
201 | /* 491 */ MCD::OPC_FilterValueOrFail, 4, |
202 | /* 493 */ MCD::OPC_Decode, 129, 3, 4, // Opcode: STB_RR, DecodeIdx: 4 |
203 | /* 497 */ MCD::OPC_FilterValue, 12, 0, 1, // Skip to: 757 |
204 | /* 501 */ MCD::OPC_ExtractField, 3, 8, // Inst{10-3} ... |
205 | /* 504 */ MCD::OPC_FilterValue, 0, 17, 0, // Skip to: 525 |
206 | /* 508 */ MCD::OPC_ExtractField, 17, 1, // Inst{17} ... |
207 | /* 511 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 519 |
208 | /* 515 */ MCD::OPC_Decode, 198, 2, 5, // Opcode: ADD_R, DecodeIdx: 5 |
209 | /* 519 */ MCD::OPC_FilterValueOrFail, 1, |
210 | /* 521 */ MCD::OPC_Decode, 195, 2, 5, // Opcode: ADD_F_R, DecodeIdx: 5 |
211 | /* 525 */ MCD::OPC_FilterValue, 32, 17, 0, // Skip to: 546 |
212 | /* 529 */ MCD::OPC_ExtractField, 17, 1, // Inst{17} ... |
213 | /* 532 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 540 |
214 | /* 536 */ MCD::OPC_Decode, 192, 2, 5, // Opcode: ADDC_R, DecodeIdx: 5 |
215 | /* 540 */ MCD::OPC_FilterValueOrFail, 1, |
216 | /* 542 */ MCD::OPC_Decode, 189, 2, 5, // Opcode: ADDC_F_R, DecodeIdx: 5 |
217 | /* 546 */ MCD::OPC_FilterValue, 64, 17, 0, // Skip to: 567 |
218 | /* 550 */ MCD::OPC_ExtractField, 17, 1, // Inst{17} ... |
219 | /* 553 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 561 |
220 | /* 557 */ MCD::OPC_Decode, 143, 3, 5, // Opcode: SUB_R, DecodeIdx: 5 |
221 | /* 561 */ MCD::OPC_FilterValueOrFail, 1, |
222 | /* 563 */ MCD::OPC_Decode, 140, 3, 5, // Opcode: SUB_F_R, DecodeIdx: 5 |
223 | /* 567 */ MCD::OPC_FilterValue, 96, 17, 0, // Skip to: 588 |
224 | /* 571 */ MCD::OPC_ExtractField, 17, 1, // Inst{17} ... |
225 | /* 574 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 582 |
226 | /* 578 */ MCD::OPC_Decode, 137, 3, 5, // Opcode: SUBB_R, DecodeIdx: 5 |
227 | /* 582 */ MCD::OPC_FilterValueOrFail, 1, |
228 | /* 584 */ MCD::OPC_Decode, 134, 3, 5, // Opcode: SUBB_F_R, DecodeIdx: 5 |
229 | /* 588 */ MCD::OPC_FilterValue, 128, 1, 17, 0, // Skip to: 610 |
230 | /* 593 */ MCD::OPC_ExtractField, 17, 1, // Inst{17} ... |
231 | /* 596 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 604 |
232 | /* 600 */ MCD::OPC_Decode, 204, 2, 5, // Opcode: AND_R, DecodeIdx: 5 |
233 | /* 604 */ MCD::OPC_FilterValueOrFail, 1, |
234 | /* 606 */ MCD::OPC_Decode, 201, 2, 5, // Opcode: AND_F_R, DecodeIdx: 5 |
235 | /* 610 */ MCD::OPC_FilterValue, 160, 1, 65, 0, // Skip to: 680 |
236 | /* 615 */ MCD::OPC_ExtractField, 17, 1, // Inst{17} ... |
237 | /* 618 */ MCD::OPC_FilterValue, 0, 52, 0, // Skip to: 674 |
238 | /* 622 */ MCD::OPC_CheckField, 18, 10, 64, 16, 0, // Skip to: 644 |
239 | /* 628 */ MCD::OPC_CheckField, 16, 1, 0, 10, 0, // Skip to: 644 |
240 | /* 634 */ MCD::OPC_CheckField, 0, 3, 0, 4, 0, // Skip to: 644 |
241 | /* 640 */ MCD::OPC_Decode, 210, 2, 6, // Opcode: JR, DecodeIdx: 6 |
242 | /* 644 */ MCD::OPC_CheckField, 23, 5, 2, 10, 0, // Skip to: 660 |
243 | /* 650 */ MCD::OPC_CheckField, 11, 5, 0, 4, 0, // Skip to: 660 |
244 | /* 656 */ MCD::OPC_Decode, 206, 2, 7, // Opcode: BRIND_CC, DecodeIdx: 7 |
245 | /* 660 */ MCD::OPC_CheckField, 23, 5, 2, 4, 0, // Skip to: 670 |
246 | /* 666 */ MCD::OPC_Decode, 207, 2, 8, // Opcode: BRIND_CCA, DecodeIdx: 8 |
247 | /* 670 */ MCD::OPC_Decode, 236, 2, 5, // Opcode: OR_R, DecodeIdx: 5 |
248 | /* 674 */ MCD::OPC_FilterValueOrFail, 1, |
249 | /* 676 */ MCD::OPC_Decode, 233, 2, 5, // Opcode: OR_F_R, DecodeIdx: 5 |
250 | /* 680 */ MCD::OPC_FilterValue, 192, 1, 17, 0, // Skip to: 702 |
251 | /* 685 */ MCD::OPC_ExtractField, 17, 1, // Inst{17} ... |
252 | /* 688 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 696 |
253 | /* 692 */ MCD::OPC_Decode, 152, 3, 5, // Opcode: XOR_R, DecodeIdx: 5 |
254 | /* 696 */ MCD::OPC_FilterValueOrFail, 1, |
255 | /* 698 */ MCD::OPC_Decode, 149, 3, 5, // Opcode: XOR_F_R, DecodeIdx: 5 |
256 | /* 702 */ MCD::OPC_FilterValue, 224, 1, 8, 0, // Skip to: 715 |
257 | /* 707 */ MCD::OPC_CheckFieldOrFail, 17, 1, 0, |
258 | /* 711 */ MCD::OPC_Decode, 242, 2, 9, // Opcode: SELECT, DecodeIdx: 9 |
259 | /* 715 */ MCD::OPC_FilterValue, 240, 1, 17, 0, // Skip to: 737 |
260 | /* 720 */ MCD::OPC_ExtractField, 17, 1, // Inst{17} ... |
261 | /* 723 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 731 |
262 | /* 727 */ MCD::OPC_Decode, 247, 2, 5, // Opcode: SHL_R, DecodeIdx: 5 |
263 | /* 731 */ MCD::OPC_FilterValueOrFail, 1, |
264 | /* 733 */ MCD::OPC_Decode, 246, 2, 5, // Opcode: SHL_F_R, DecodeIdx: 5 |
265 | /* 737 */ MCD::OPC_FilterValueOrFail, 248, 1, |
266 | /* 740 */ MCD::OPC_ExtractField, 17, 1, // Inst{17} ... |
267 | /* 743 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 751 |
268 | /* 747 */ MCD::OPC_Decode, 252, 2, 5, // Opcode: SRA_R, DecodeIdx: 5 |
269 | /* 751 */ MCD::OPC_FilterValueOrFail, 1, |
270 | /* 753 */ MCD::OPC_Decode, 251, 2, 5, // Opcode: SRA_F_R, DecodeIdx: 5 |
271 | /* 757 */ MCD::OPC_FilterValue, 13, 25, 0, // Skip to: 786 |
272 | /* 761 */ MCD::OPC_ExtractField, 0, 18, // Inst{17-0} ... |
273 | /* 764 */ MCD::OPC_FilterValue, 1, 4, 0, // Skip to: 772 |
274 | /* 768 */ MCD::OPC_Decode, 237, 2, 10, // Opcode: POPC, DecodeIdx: 10 |
275 | /* 772 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 780 |
276 | /* 776 */ MCD::OPC_Decode, 223, 2, 10, // Opcode: LEADZ, DecodeIdx: 10 |
277 | /* 780 */ MCD::OPC_FilterValueOrFail, 3, |
278 | /* 782 */ MCD::OPC_Decode, 146, 3, 10, // Opcode: TRAILZ, DecodeIdx: 10 |
279 | /* 786 */ MCD::OPC_FilterValue, 14, 54, 0, // Skip to: 844 |
280 | /* 790 */ MCD::OPC_ExtractField, 1, 1, // Inst{1} ... |
281 | /* 793 */ MCD::OPC_FilterValue, 0, 20, 0, // Skip to: 817 |
282 | /* 797 */ MCD::OPC_CheckField, 25, 3, 0, 10, 0, // Skip to: 813 |
283 | /* 803 */ MCD::OPC_CheckField, 0, 1, 0, 4, 0, // Skip to: 813 |
284 | /* 809 */ MCD::OPC_Decode, 209, 2, 11, // Opcode: BT, DecodeIdx: 11 |
285 | /* 813 */ MCD::OPC_Decode, 205, 2, 12, // Opcode: BRCC, DecodeIdx: 12 |
286 | /* 817 */ MCD::OPC_FilterValueOrFail, 1, |
287 | /* 819 */ MCD::OPC_ExtractField, 23, 2, // Inst{24-23} ... |
288 | /* 822 */ MCD::OPC_FilterValue, 0, 8, 0, // Skip to: 834 |
289 | /* 826 */ MCD::OPC_CheckFieldOrFail, 2, 16, 0, |
290 | /* 830 */ MCD::OPC_Decode, 241, 2, 13, // Opcode: SCC, DecodeIdx: 13 |
291 | /* 834 */ MCD::OPC_FilterValueOrFail, 2, |
292 | /* 836 */ MCD::OPC_CheckFieldOrFail, 16, 7, 0, |
293 | /* 840 */ MCD::OPC_Decode, 208, 2, 14, // Opcode: BRR, DecodeIdx: 14 |
294 | /* 844 */ MCD::OPC_FilterValueOrFail, 15, |
295 | /* 846 */ MCD::OPC_ExtractField, 16, 2, // Inst{17-16} ... |
296 | /* 849 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 857 |
297 | /* 853 */ MCD::OPC_Decode, 211, 2, 15, // Opcode: LDADDR, DecodeIdx: 15 |
298 | /* 857 */ MCD::OPC_FilterValue, 1, 4, 0, // Skip to: 865 |
299 | /* 861 */ MCD::OPC_Decode, 255, 2, 15, // Opcode: STADDR, DecodeIdx: 15 |
300 | /* 865 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 873 |
301 | /* 869 */ MCD::OPC_Decode, 248, 2, 15, // Opcode: SLI, DecodeIdx: 15 |
302 | /* 873 */ MCD::OPC_FilterValueOrFail, 3, |
303 | /* 875 */ MCD::OPC_ExtractField, 12, 4, // Inst{15-12} ... |
304 | /* 878 */ MCD::OPC_FilterValue, 0, 4, 0, // Skip to: 886 |
305 | /* 882 */ MCD::OPC_Decode, 216, 2, 16, // Opcode: LDHs_RI, DecodeIdx: 16 |
306 | /* 886 */ MCD::OPC_FilterValue, 1, 4, 0, // Skip to: 894 |
307 | /* 890 */ MCD::OPC_Decode, 218, 2, 16, // Opcode: LDHz_RI, DecodeIdx: 16 |
308 | /* 894 */ MCD::OPC_FilterValue, 2, 4, 0, // Skip to: 902 |
309 | /* 898 */ MCD::OPC_Decode, 130, 3, 16, // Opcode: STH_RI, DecodeIdx: 16 |
310 | /* 902 */ MCD::OPC_FilterValue, 4, 4, 0, // Skip to: 910 |
311 | /* 906 */ MCD::OPC_Decode, 212, 2, 16, // Opcode: LDBs_RI, DecodeIdx: 16 |
312 | /* 910 */ MCD::OPC_FilterValue, 5, 4, 0, // Skip to: 918 |
313 | /* 914 */ MCD::OPC_Decode, 214, 2, 16, // Opcode: LDBz_RI, DecodeIdx: 16 |
314 | /* 918 */ MCD::OPC_FilterValueOrFail, 6, |
315 | /* 920 */ MCD::OPC_Decode, 128, 3, 16, // Opcode: STB_RI, DecodeIdx: 16 |
316 | /* 924 */ MCD::OPC_Fail, |
317 | 0 |
318 | }; |
319 | |
320 | // Handling 17 cases. |
321 | template <typename InsnType> |
322 | static DecodeStatus decodeToMCInst(unsigned Idx, DecodeStatus S, InsnType insn, MCInst &MI, uint64_t Address, const MCDisassembler *Decoder, bool &DecodeComplete) { |
323 | DecodeComplete = true; |
324 | using TmpType = std::conditional_t<std::is_integral<InsnType>::value, InsnType, uint64_t>; |
325 | TmpType tmp; |
326 | switch (Idx) { |
327 | default: llvm_unreachable("Invalid index!" ); |
328 | case 0: |
329 | return S; |
330 | case 1: |
331 | tmp = fieldFromInstruction(insn, 23, 5); |
332 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
333 | tmp = fieldFromInstruction(insn, 18, 5); |
334 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
335 | tmp = fieldFromInstruction(insn, 0, 16); |
336 | MI.addOperand(Op: MCOperand::createImm(Val: tmp)); |
337 | return S; |
338 | case 2: |
339 | tmp = fieldFromInstruction(insn, 23, 5); |
340 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
341 | tmp = fieldFromInstruction(insn, 18, 5); |
342 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
343 | tmp = fieldFromInstruction(insn, 0, 16); |
344 | if (!Check(S, decodeShiftImm(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
345 | return S; |
346 | case 3: |
347 | tmp = fieldFromInstruction(insn, 23, 5); |
348 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
349 | tmp = fieldFromInstruction(insn, 0, 23); |
350 | if (!Check(S, decodeRiMemoryValue(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
351 | return S; |
352 | case 4: |
353 | tmp = fieldFromInstruction(insn, 23, 5); |
354 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
355 | tmp = 0x0; |
356 | insertBits(tmp, fieldFromInstruction(insn, 3, 8), 0, 8); |
357 | insertBits(tmp, fieldFromInstruction(insn, 11, 5), 10, 5); |
358 | insertBits(tmp, fieldFromInstruction(insn, 16, 2), 8, 2); |
359 | insertBits(tmp, fieldFromInstruction(insn, 18, 5), 15, 5); |
360 | if (!Check(S, decodeRrMemoryValue(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
361 | return S; |
362 | case 5: |
363 | tmp = fieldFromInstruction(insn, 23, 5); |
364 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
365 | tmp = fieldFromInstruction(insn, 18, 5); |
366 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
367 | tmp = fieldFromInstruction(insn, 11, 5); |
368 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
369 | tmp = 0x0; |
370 | insertBits(tmp, fieldFromInstruction(insn, 0, 3), 1, 3); |
371 | insertBits(tmp, fieldFromInstruction(insn, 16, 1), 0, 1); |
372 | if (!Check(S, decodePredicateOperand(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
373 | return S; |
374 | case 6: |
375 | tmp = fieldFromInstruction(insn, 11, 5); |
376 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
377 | return S; |
378 | case 7: |
379 | tmp = fieldFromInstruction(insn, 18, 5); |
380 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
381 | tmp = 0x0; |
382 | insertBits(tmp, fieldFromInstruction(insn, 0, 3), 1, 3); |
383 | insertBits(tmp, fieldFromInstruction(insn, 16, 1), 0, 1); |
384 | MI.addOperand(Op: MCOperand::createImm(Val: tmp)); |
385 | return S; |
386 | case 8: |
387 | tmp = fieldFromInstruction(insn, 18, 5); |
388 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
389 | tmp = fieldFromInstruction(insn, 11, 5); |
390 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
391 | tmp = 0x0; |
392 | insertBits(tmp, fieldFromInstruction(insn, 0, 3), 1, 3); |
393 | insertBits(tmp, fieldFromInstruction(insn, 16, 1), 0, 1); |
394 | MI.addOperand(Op: MCOperand::createImm(Val: tmp)); |
395 | return S; |
396 | case 9: |
397 | tmp = fieldFromInstruction(insn, 23, 5); |
398 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
399 | tmp = fieldFromInstruction(insn, 18, 5); |
400 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
401 | tmp = fieldFromInstruction(insn, 11, 5); |
402 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
403 | tmp = 0x0; |
404 | insertBits(tmp, fieldFromInstruction(insn, 0, 3), 1, 3); |
405 | insertBits(tmp, fieldFromInstruction(insn, 16, 1), 0, 1); |
406 | MI.addOperand(Op: MCOperand::createImm(Val: tmp)); |
407 | return S; |
408 | case 10: |
409 | tmp = fieldFromInstruction(insn, 23, 5); |
410 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
411 | tmp = fieldFromInstruction(insn, 18, 5); |
412 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
413 | return S; |
414 | case 11: |
415 | tmp = fieldFromInstruction(insn, 2, 23) << 2; |
416 | if (!Check(S, decodeBranch(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
417 | return S; |
418 | case 12: |
419 | tmp = fieldFromInstruction(insn, 2, 23) << 2; |
420 | if (!Check(S, decodeBranch(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
421 | tmp = 0x0; |
422 | insertBits(tmp, fieldFromInstruction(insn, 0, 1), 0, 1); |
423 | insertBits(tmp, fieldFromInstruction(insn, 25, 3), 1, 3); |
424 | MI.addOperand(Op: MCOperand::createImm(Val: tmp)); |
425 | return S; |
426 | case 13: |
427 | tmp = fieldFromInstruction(insn, 18, 5); |
428 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
429 | tmp = 0x0; |
430 | insertBits(tmp, fieldFromInstruction(insn, 0, 1), 0, 1); |
431 | insertBits(tmp, fieldFromInstruction(insn, 25, 3), 1, 3); |
432 | MI.addOperand(Op: MCOperand::createImm(Val: tmp)); |
433 | return S; |
434 | case 14: |
435 | tmp = fieldFromInstruction(insn, 2, 14) << 2; |
436 | MI.addOperand(Op: MCOperand::createImm(Val: tmp)); |
437 | tmp = 0x0; |
438 | insertBits(tmp, fieldFromInstruction(insn, 0, 1), 0, 1); |
439 | insertBits(tmp, fieldFromInstruction(insn, 25, 3), 1, 3); |
440 | MI.addOperand(Op: MCOperand::createImm(Val: tmp)); |
441 | return S; |
442 | case 15: |
443 | tmp = fieldFromInstruction(insn, 23, 5); |
444 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
445 | tmp = 0x0; |
446 | insertBits(tmp, fieldFromInstruction(insn, 0, 16), 0, 16); |
447 | insertBits(tmp, fieldFromInstruction(insn, 18, 5), 16, 5); |
448 | MI.addOperand(Op: MCOperand::createImm(Val: tmp)); |
449 | return S; |
450 | case 16: |
451 | tmp = fieldFromInstruction(insn, 23, 5); |
452 | if (!Check(S, DecodeGPRRegisterClass(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
453 | tmp = 0x0; |
454 | insertBits(tmp, fieldFromInstruction(insn, 0, 12), 0, 12); |
455 | insertBits(tmp, fieldFromInstruction(insn, 18, 5), 12, 5); |
456 | if (!Check(S, decodeSplsValue(MI, tmp, Address, Decoder))) { return MCDisassembler::Fail; } |
457 | return S; |
458 | } |
459 | } |
460 | |
461 | static unsigned decodeNumToSkip(const uint8_t *&Ptr) { |
462 | unsigned NumToSkip = *Ptr++; |
463 | NumToSkip |= (*Ptr++) << 8; |
464 | return NumToSkip; |
465 | } |
466 | |
467 | template <typename InsnType> |
468 | static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], MCInst &MI, |
469 | InsnType insn, uint64_t Address, |
470 | const MCDisassembler *DisAsm, |
471 | const MCSubtargetInfo &STI) { |
472 | |
473 | const uint8_t *Ptr = DecodeTable; |
474 | uint64_t CurFieldValue = 0; |
475 | DecodeStatus S = MCDisassembler::Success; |
476 | while (true) { |
477 | ptrdiff_t Loc = Ptr - DecodeTable; |
478 | const uint8_t DecoderOp = *Ptr++; |
479 | switch (DecoderOp) { |
480 | default: |
481 | errs() << Loc << ": Unexpected decode table opcode: " |
482 | << (int)DecoderOp << '\n'; |
483 | return MCDisassembler::Fail; |
484 | case MCD::OPC_ExtractField: { |
485 | // Decode the start value. |
486 | unsigned Start = decodeULEB128AndIncUnsafe(p&: Ptr); |
487 | unsigned Len = *Ptr++; |
488 | CurFieldValue = fieldFromInstruction(insn, Start, Len); |
489 | LLVM_DEBUG(dbgs() << Loc << ": OPC_ExtractField(" << Start << ", " |
490 | << Len << "): " << CurFieldValue << "\n" ); |
491 | break; |
492 | } |
493 | case MCD::OPC_FilterValue: |
494 | case MCD::OPC_FilterValueOrFail: { |
495 | bool IsFail = DecoderOp == MCD::OPC_FilterValueOrFail; |
496 | // Decode the field value. |
497 | uint64_t Val = decodeULEB128AndIncUnsafe(p&: Ptr); |
498 | bool Failed = Val != CurFieldValue; |
499 | unsigned NumToSkip = IsFail ? 0 : decodeNumToSkip(Ptr); |
500 | |
501 | // Note: Print NumToSkip even for OPC_FilterValueOrFail to simplify debug |
502 | // prints. |
503 | LLVM_DEBUG({ |
504 | StringRef OpName = IsFail ? "OPC_FilterValueOrFail" : "OPC_FilterValue" ; |
505 | dbgs() << Loc << ": " << OpName << '(' << Val << ", " << NumToSkip |
506 | << ") " << (Failed ? "FAIL:" : "PASS:" ) |
507 | << " continuing at " << (Ptr - DecodeTable) << '\n'; |
508 | }); |
509 | |
510 | // Perform the filter operation. |
511 | if (Failed) { |
512 | if (IsFail) |
513 | return MCDisassembler::Fail; |
514 | Ptr += NumToSkip; |
515 | } |
516 | break; |
517 | } |
518 | case MCD::OPC_CheckField: |
519 | case MCD::OPC_CheckFieldOrFail: { |
520 | bool IsFail = DecoderOp == MCD::OPC_CheckFieldOrFail; |
521 | // Decode the start value. |
522 | unsigned Start = decodeULEB128AndIncUnsafe(p&: Ptr); |
523 | unsigned Len = *Ptr; |
524 | uint64_t FieldValue = fieldFromInstruction(insn, Start, Len); |
525 | // Decode the field value. |
526 | unsigned PtrLen = 0; |
527 | uint64_t ExpectedValue = decodeULEB128(p: ++Ptr, n: &PtrLen); |
528 | Ptr += PtrLen; |
529 | bool Failed = ExpectedValue != FieldValue; |
530 | unsigned NumToSkip = IsFail ? 0 : decodeNumToSkip(Ptr); |
531 | |
532 | LLVM_DEBUG({ |
533 | StringRef OpName = IsFail ? "OPC_CheckFieldOrFail" : "OPC_CheckField" ; |
534 | dbgs() << Loc << ": " << OpName << '(' << Start << ", " << Len << ", " |
535 | << ExpectedValue << ", " << NumToSkip << "): FieldValue = " |
536 | << FieldValue << ", ExpectedValue = " << ExpectedValue << ": " |
537 | << (Failed ? "FAIL\n" : "PASS\n" ); |
538 | }); |
539 | |
540 | // If the actual and expected values don't match, skip or fail. |
541 | if (Failed) { |
542 | if (IsFail) |
543 | return MCDisassembler::Fail; |
544 | Ptr += NumToSkip; |
545 | } |
546 | break; |
547 | } |
548 | case MCD::OPC_Decode: { |
549 | // Decode the Opcode value. |
550 | unsigned Opc = decodeULEB128AndIncUnsafe(p&: Ptr); |
551 | unsigned DecodeIdx = decodeULEB128AndIncUnsafe(p&: Ptr); |
552 | |
553 | MI.clear(); |
554 | MI.setOpcode(Opc); |
555 | bool DecodeComplete; |
556 | S = decodeToMCInst(DecodeIdx, S, insn, MI, Address, DisAsm, DecodeComplete); |
557 | assert(DecodeComplete); |
558 | |
559 | LLVM_DEBUG(dbgs() << Loc << ": OPC_Decode: opcode " << Opc |
560 | << ", using decoder " << DecodeIdx << ": " |
561 | << (S != MCDisassembler::Fail ? "PASS\n" : "FAIL\n" )); |
562 | return S; |
563 | } |
564 | case MCD::OPC_Fail: { |
565 | LLVM_DEBUG(dbgs() << Loc << ": OPC_Fail\n" ); |
566 | return MCDisassembler::Fail; |
567 | } |
568 | } |
569 | } |
570 | llvm_unreachable("bogosity detected in disassembler state machine!" ); |
571 | } |
572 | |
573 | |
574 | } // namespace |
575 | |