1/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
2|* *|
3|* Assembly Matcher Source Fragment *|
4|* *|
5|* Automatically generated file, do not edit! *|
6|* From: BPF.td *|
7|* *|
8\*===----------------------------------------------------------------------===*/
9
10
11#ifdef GET_ASSEMBLER_HEADER
12#undef GET_ASSEMBLER_HEADER
13 // This should be included into the middle of the declaration of
14 // your subclasses implementation of MCTargetAsmParser.
15 FeatureBitset ComputeAvailableFeatures(const FeatureBitset &FB) const;
16 void convertToMCInst(unsigned Kind, MCInst &Inst, unsigned Opcode,
17 const OperandVector &Operands);
18 void convertToMapAndConstraints(unsigned Kind,
19 const OperandVector &Operands) override;
20 unsigned MatchInstructionImpl(const OperandVector &Operands,
21 MCInst &Inst,
22 uint64_t &ErrorInfo,
23 FeatureBitset &MissingFeatures,
24 bool matchingInlineAsm,
25 unsigned VariantID = 0);
26 unsigned MatchInstructionImpl(const OperandVector &Operands,
27 MCInst &Inst,
28 uint64_t &ErrorInfo,
29 bool matchingInlineAsm,
30 unsigned VariantID = 0) {
31 FeatureBitset MissingFeatures;
32 return MatchInstructionImpl(Operands, Inst, ErrorInfo, MissingFeatures,
33 matchingInlineAsm, VariantID);
34 }
35
36#endif // GET_ASSEMBLER_HEADER
37
38
39#ifdef GET_OPERAND_DIAGNOSTIC_TYPES
40#undef GET_OPERAND_DIAGNOSTIC_TYPES
41
42 Match_InvalidBrTarget,
43 Match_InvalidSImm16,
44 END_OPERAND_DIAGNOSTIC_TYPES
45#endif // GET_OPERAND_DIAGNOSTIC_TYPES
46
47
48#ifdef GET_REGISTER_MATCHER
49#undef GET_REGISTER_MATCHER
50
51// Bits for subtarget features that participate in instruction matching.
52enum SubtargetFeatureBits : uint8_t {
53};
54
55static MCRegister MatchRegisterName(StringRef Name) {
56 switch (Name.size()) {
57 default: break;
58 case 2: // 20 strings to match.
59 switch (Name[0]) {
60 default: break;
61 case 'r': // 10 strings to match.
62 switch (Name[1]) {
63 default: break;
64 case '0': // 1 string to match.
65 return BPF::R0; // "r0"
66 case '1': // 1 string to match.
67 return BPF::R1; // "r1"
68 case '2': // 1 string to match.
69 return BPF::R2; // "r2"
70 case '3': // 1 string to match.
71 return BPF::R3; // "r3"
72 case '4': // 1 string to match.
73 return BPF::R4; // "r4"
74 case '5': // 1 string to match.
75 return BPF::R5; // "r5"
76 case '6': // 1 string to match.
77 return BPF::R6; // "r6"
78 case '7': // 1 string to match.
79 return BPF::R7; // "r7"
80 case '8': // 1 string to match.
81 return BPF::R8; // "r8"
82 case '9': // 1 string to match.
83 return BPF::R9; // "r9"
84 }
85 break;
86 case 'w': // 10 strings to match.
87 switch (Name[1]) {
88 default: break;
89 case '0': // 1 string to match.
90 return BPF::W0; // "w0"
91 case '1': // 1 string to match.
92 return BPF::W1; // "w1"
93 case '2': // 1 string to match.
94 return BPF::W2; // "w2"
95 case '3': // 1 string to match.
96 return BPF::W3; // "w3"
97 case '4': // 1 string to match.
98 return BPF::W4; // "w4"
99 case '5': // 1 string to match.
100 return BPF::W5; // "w5"
101 case '6': // 1 string to match.
102 return BPF::W6; // "w6"
103 case '7': // 1 string to match.
104 return BPF::W7; // "w7"
105 case '8': // 1 string to match.
106 return BPF::W8; // "w8"
107 case '9': // 1 string to match.
108 return BPF::W9; // "w9"
109 }
110 break;
111 }
112 break;
113 case 3: // 4 strings to match.
114 switch (Name[0]) {
115 default: break;
116 case 'r': // 2 strings to match.
117 if (Name[1] != '1')
118 break;
119 switch (Name[2]) {
120 default: break;
121 case '0': // 1 string to match.
122 return BPF::R10; // "r10"
123 case '1': // 1 string to match.
124 return BPF::R11; // "r11"
125 }
126 break;
127 case 'w': // 2 strings to match.
128 if (Name[1] != '1')
129 break;
130 switch (Name[2]) {
131 default: break;
132 case '0': // 1 string to match.
133 return BPF::W10; // "w10"
134 case '1': // 1 string to match.
135 return BPF::W11; // "w11"
136 }
137 break;
138 }
139 break;
140 }
141 return BPF::NoRegister;
142}
143
144#endif // GET_REGISTER_MATCHER
145
146
147#ifdef GET_SUBTARGET_FEATURE_NAME
148#undef GET_SUBTARGET_FEATURE_NAME
149
150// User-level names for subtarget features that participate in
151// instruction matching.
152static const char *getSubtargetFeatureName(uint64_t Val) {
153 return "(unknown)";
154}
155
156#endif // GET_SUBTARGET_FEATURE_NAME
157
158
159#ifdef GET_MATCHER_IMPLEMENTATION
160#undef GET_MATCHER_IMPLEMENTATION
161
162enum {
163 Tie0_0_0,
164 Tie0_0_3,
165 Tie0_0_6,
166 Tie0_0_12,
167 Tie0_12_12,
168};
169
170static const uint8_t TiedAsmOperandTable[][3] = {
171 /* Tie0_0_0 */ { 0, 0, 0 },
172 /* Tie0_0_3 */ { 0, 0, 3 },
173 /* Tie0_0_6 */ { 0, 0, 6 },
174 /* Tie0_0_12 */ { 0, 0, 12 },
175 /* Tie0_12_12 */ { 0, 12, 12 },
176};
177
178namespace {
179enum OperatorConversionKind {
180 CVT_Done,
181 CVT_Reg,
182 CVT_Tied,
183 CVT_95_Reg,
184 CVT_95_addImmOperands,
185 CVT_NUM_CONVERTERS
186};
187
188enum InstructionConversionKind {
189 Convert__Reg1_0__Reg1_2,
190 Convert__Reg1_0__Imm1_2,
191 Convert__Reg1_0__Tie0_0_0__Reg1_3,
192 Convert__Reg1_0__Tie0_0_0__Imm1_3,
193 Convert__Reg1_0__Tie0_0_3,
194 Convert__Reg1_0__Tie0_0_0__Reg1_4,
195 Convert__Reg1_0__Tie0_0_0__Imm1_4,
196 Convert__Reg1_0__Reg1_5,
197 Convert__Reg1_0__Tie0_0_0__Reg1_5,
198 Convert__Reg1_0__Tie0_0_0__Imm1_5,
199 Convert__Reg1_0__Reg1_4__Imm1_5__Imm1_6,
200 Convert__Reg1_0__Reg1_4__SImm161_5__Tie0_0_6,
201 Convert__Reg1_0__Reg1_8__SImm161_9,
202 Convert__Reg1_0__Reg1_9__SImm161_10,
203 Convert__Reg1_0__Reg1_9__SImm161_10__Tie0_0_12,
204 Convert__Reg1_10__Reg1_6__SImm161_7,
205 Convert__Imm1_10__Reg1_6__SImm161_7,
206 Convert__Imm1_1,
207 Convert__Reg1_1,
208 Convert_NoOperands,
209 Convert__BrTarget1_1,
210 Convert__Reg1_1__Reg1_3__BrTarget1_5,
211 Convert__Reg1_1__Imm1_3__BrTarget1_5,
212 Convert__Reg1_1__Reg1_4__BrTarget1_6,
213 Convert__Reg1_1__Imm1_4__BrTarget1_6,
214 Convert__Reg1_1__Reg1_5__BrTarget1_7,
215 Convert__Reg1_1__Imm1_5__BrTarget1_7,
216 Convert__Reg1_1__Imm1_2__Imm1_3,
217 Convert__Reg1_1__Reg1_2__SImm161_3,
218 Convert__Reg1_1__SImm161_2,
219 Convert__Reg1_12__Reg1_7__SImm161_8__Tie0_12_12,
220 Convert__Reg1_4__SImm161_5__Reg1_7,
221 Convert__Reg1_9,
222 Convert__Imm1_9,
223 Convert__Reg1_10__Reg1_7__SImm161_8,
224 Convert__SImm161_1__Reg1_2,
225 Convert__SImm161_1__Imm1_2,
226 CVT_NUM_SIGNATURES
227};
228
229} // end anonymous namespace
230
231static const uint8_t ConversionTable[CVT_NUM_SIGNATURES][9] = {
232 // Convert__Reg1_0__Reg1_2
233 { CVT_95_Reg, 0, CVT_95_Reg, 2, CVT_Done },
234 // Convert__Reg1_0__Imm1_2
235 { CVT_95_Reg, 0, CVT_95_addImmOperands, 2, CVT_Done },
236 // Convert__Reg1_0__Tie0_0_0__Reg1_3
237 { CVT_95_Reg, 0, CVT_Tied, Tie0_0_0, CVT_95_Reg, 3, CVT_Done },
238 // Convert__Reg1_0__Tie0_0_0__Imm1_3
239 { CVT_95_Reg, 0, CVT_Tied, Tie0_0_0, CVT_95_addImmOperands, 3, CVT_Done },
240 // Convert__Reg1_0__Tie0_0_3
241 { CVT_95_Reg, 0, CVT_Tied, Tie0_0_3, CVT_Done },
242 // Convert__Reg1_0__Tie0_0_0__Reg1_4
243 { CVT_95_Reg, 0, CVT_Tied, Tie0_0_0, CVT_95_Reg, 4, CVT_Done },
244 // Convert__Reg1_0__Tie0_0_0__Imm1_4
245 { CVT_95_Reg, 0, CVT_Tied, Tie0_0_0, CVT_95_addImmOperands, 4, CVT_Done },
246 // Convert__Reg1_0__Reg1_5
247 { CVT_95_Reg, 0, CVT_95_Reg, 5, CVT_Done },
248 // Convert__Reg1_0__Tie0_0_0__Reg1_5
249 { CVT_95_Reg, 0, CVT_Tied, Tie0_0_0, CVT_95_Reg, 5, CVT_Done },
250 // Convert__Reg1_0__Tie0_0_0__Imm1_5
251 { CVT_95_Reg, 0, CVT_Tied, Tie0_0_0, CVT_95_addImmOperands, 5, CVT_Done },
252 // Convert__Reg1_0__Reg1_4__Imm1_5__Imm1_6
253 { CVT_95_Reg, 0, CVT_95_Reg, 4, CVT_95_addImmOperands, 5, CVT_95_addImmOperands, 6, CVT_Done },
254 // Convert__Reg1_0__Reg1_4__SImm161_5__Tie0_0_6
255 { CVT_95_Reg, 0, CVT_95_Reg, 4, CVT_95_addImmOperands, 5, CVT_Tied, Tie0_0_6, CVT_Done },
256 // Convert__Reg1_0__Reg1_8__SImm161_9
257 { CVT_95_Reg, 0, CVT_95_Reg, 8, CVT_95_addImmOperands, 9, CVT_Done },
258 // Convert__Reg1_0__Reg1_9__SImm161_10
259 { CVT_95_Reg, 0, CVT_95_Reg, 9, CVT_95_addImmOperands, 10, CVT_Done },
260 // Convert__Reg1_0__Reg1_9__SImm161_10__Tie0_0_12
261 { CVT_95_Reg, 0, CVT_95_Reg, 9, CVT_95_addImmOperands, 10, CVT_Tied, Tie0_0_12, CVT_Done },
262 // Convert__Reg1_10__Reg1_6__SImm161_7
263 { CVT_95_Reg, 10, CVT_95_Reg, 6, CVT_95_addImmOperands, 7, CVT_Done },
264 // Convert__Imm1_10__Reg1_6__SImm161_7
265 { CVT_95_addImmOperands, 10, CVT_95_Reg, 6, CVT_95_addImmOperands, 7, CVT_Done },
266 // Convert__Imm1_1
267 { CVT_95_addImmOperands, 1, CVT_Done },
268 // Convert__Reg1_1
269 { CVT_95_Reg, 1, CVT_Done },
270 // Convert_NoOperands
271 { CVT_Done },
272 // Convert__BrTarget1_1
273 { CVT_95_addImmOperands, 1, CVT_Done },
274 // Convert__Reg1_1__Reg1_3__BrTarget1_5
275 { CVT_95_Reg, 1, CVT_95_Reg, 3, CVT_95_addImmOperands, 5, CVT_Done },
276 // Convert__Reg1_1__Imm1_3__BrTarget1_5
277 { CVT_95_Reg, 1, CVT_95_addImmOperands, 3, CVT_95_addImmOperands, 5, CVT_Done },
278 // Convert__Reg1_1__Reg1_4__BrTarget1_6
279 { CVT_95_Reg, 1, CVT_95_Reg, 4, CVT_95_addImmOperands, 6, CVT_Done },
280 // Convert__Reg1_1__Imm1_4__BrTarget1_6
281 { CVT_95_Reg, 1, CVT_95_addImmOperands, 4, CVT_95_addImmOperands, 6, CVT_Done },
282 // Convert__Reg1_1__Reg1_5__BrTarget1_7
283 { CVT_95_Reg, 1, CVT_95_Reg, 5, CVT_95_addImmOperands, 7, CVT_Done },
284 // Convert__Reg1_1__Imm1_5__BrTarget1_7
285 { CVT_95_Reg, 1, CVT_95_addImmOperands, 5, CVT_95_addImmOperands, 7, CVT_Done },
286 // Convert__Reg1_1__Imm1_2__Imm1_3
287 { CVT_95_Reg, 1, CVT_95_addImmOperands, 2, CVT_95_addImmOperands, 3, CVT_Done },
288 // Convert__Reg1_1__Reg1_2__SImm161_3
289 { CVT_95_Reg, 1, CVT_95_Reg, 2, CVT_95_addImmOperands, 3, CVT_Done },
290 // Convert__Reg1_1__SImm161_2
291 { CVT_95_Reg, 1, CVT_95_addImmOperands, 2, CVT_Done },
292 // Convert__Reg1_12__Reg1_7__SImm161_8__Tie0_12_12
293 { CVT_95_Reg, 12, CVT_95_Reg, 7, CVT_95_addImmOperands, 8, CVT_Tied, Tie0_12_12, CVT_Done },
294 // Convert__Reg1_4__SImm161_5__Reg1_7
295 { CVT_95_Reg, 4, CVT_95_addImmOperands, 5, CVT_95_Reg, 7, CVT_Done },
296 // Convert__Reg1_9
297 { CVT_95_Reg, 9, CVT_Done },
298 // Convert__Imm1_9
299 { CVT_95_addImmOperands, 9, CVT_Done },
300 // Convert__Reg1_10__Reg1_7__SImm161_8
301 { CVT_95_Reg, 10, CVT_95_Reg, 7, CVT_95_addImmOperands, 8, CVT_Done },
302 // Convert__SImm161_1__Reg1_2
303 { CVT_95_addImmOperands, 1, CVT_95_Reg, 2, CVT_Done },
304 // Convert__SImm161_1__Imm1_2
305 { CVT_95_addImmOperands, 1, CVT_95_addImmOperands, 2, CVT_Done },
306};
307
308void BPFAsmParser::
309convertToMCInst(unsigned Kind, MCInst &Inst, unsigned Opcode,
310 const OperandVector &Operands) {
311 assert(Kind < CVT_NUM_SIGNATURES && "Invalid signature!");
312 const uint8_t *Converter = ConversionTable[Kind];
313 Inst.setOpcode(Opcode);
314 for (const uint8_t *p = Converter; *p; p += 2) {
315 unsigned OpIdx = *(p + 1);
316 switch (*p) {
317 default: llvm_unreachable("invalid conversion entry!");
318 case CVT_Reg:
319 static_cast<BPFOperand &>(*Operands[OpIdx]).addRegOperands(Inst, 1);
320 break;
321 case CVT_Tied: {
322 assert(*(p + 1) < (size_t)(std::end(TiedAsmOperandTable) -
323 std::begin(TiedAsmOperandTable)) &&
324 "Tied operand not found");
325 unsigned TiedResOpnd = TiedAsmOperandTable[*(p + 1)][0];
326 if (TiedResOpnd != (uint8_t)-1)
327 Inst.addOperand(Inst.getOperand(TiedResOpnd));
328 break;
329 }
330 case CVT_95_Reg:
331 static_cast<BPFOperand &>(*Operands[OpIdx]).addRegOperands(Inst, 1);
332 break;
333 case CVT_95_addImmOperands:
334 static_cast<BPFOperand &>(*Operands[OpIdx]).addImmOperands(Inst, 1);
335 break;
336 }
337 }
338}
339
340void BPFAsmParser::
341convertToMapAndConstraints(unsigned Kind,
342 const OperandVector &Operands) {
343 assert(Kind < CVT_NUM_SIGNATURES && "Invalid signature!");
344 unsigned NumMCOperands = 0;
345 const uint8_t *Converter = ConversionTable[Kind];
346 for (const uint8_t *p = Converter; *p; p += 2) {
347 switch (*p) {
348 default: llvm_unreachable("invalid conversion entry!");
349 case CVT_Reg:
350 Operands[*(p + 1)]->setMCOperandNum(NumMCOperands);
351 Operands[*(p + 1)]->setConstraint("r");
352 ++NumMCOperands;
353 break;
354 case CVT_Tied:
355 ++NumMCOperands;
356 break;
357 case CVT_95_Reg:
358 Operands[*(p + 1)]->setMCOperandNum(NumMCOperands);
359 Operands[*(p + 1)]->setConstraint("r");
360 NumMCOperands += 1;
361 break;
362 case CVT_95_addImmOperands:
363 Operands[*(p + 1)]->setMCOperandNum(NumMCOperands);
364 Operands[*(p + 1)]->setConstraint("m");
365 NumMCOperands += 1;
366 break;
367 }
368 }
369}
370
371namespace {
372
373/// MatchClassKind - The kinds of classes which participate in
374/// instruction matching.
375enum MatchClassKind {
376 InvalidMatchClass = 0,
377 OptionalMatchClass = 1,
378 MCK__EXCLAIM_, // '!'
379 MCK__PCT_, // '%'
380 MCK__38_, // '&'
381 MCK__40_, // '('
382 MCK__41_, // ')'
383 MCK__STAR_, // '*'
384 MCK__43_, // '+'
385 MCK__MINUS_, // '-'
386 MCK__47_, // '/'
387 MCK__LT_, // '<'
388 MCK__61_, // '='
389 MCK__GT_, // '>'
390 MCK__91_, // '['
391 MCK__93_, // ']'
392 MCK__94_, // '^'
393 MCK_addr_95_space_95_cast, // 'addr_space_cast'
394 MCK_atomic_95_fetch_95_add, // 'atomic_fetch_add'
395 MCK_atomic_95_fetch_95_and, // 'atomic_fetch_and'
396 MCK_atomic_95_fetch_95_or, // 'atomic_fetch_or'
397 MCK_atomic_95_fetch_95_xor, // 'atomic_fetch_xor'
398 MCK_be16, // 'be16'
399 MCK_be32, // 'be32'
400 MCK_be64, // 'be64'
401 MCK_bswap16, // 'bswap16'
402 MCK_bswap32, // 'bswap32'
403 MCK_bswap64, // 'bswap64'
404 MCK_call, // 'call'
405 MCK_callx, // 'callx'
406 MCK_cmpxchg32_95_32, // 'cmpxchg32_32'
407 MCK_cmpxchg_95_64, // 'cmpxchg_64'
408 MCK_exit, // 'exit'
409 MCK_goto, // 'goto'
410 MCK_gotol, // 'gotol'
411 MCK_gotox, // 'gotox'
412 MCK_if, // 'if'
413 MCK_ld_95_pseudo, // 'ld_pseudo'
414 MCK_le16, // 'le16'
415 MCK_le32, // 'le32'
416 MCK_le64, // 'le64'
417 MCK_lea, // 'lea'
418 MCK_ll, // 'll'
419 MCK_load_95_acquire, // 'load_acquire'
420 MCK_load_95_stack_95_arg, // 'load_stack_arg'
421 MCK_lock, // 'lock'
422 MCK_may_95_goto, // 'may_goto'
423 MCK_s, // 's'
424 MCK_s16, // 's16'
425 MCK_s32, // 's32'
426 MCK_s8, // 's8'
427 MCK_skb, // 'skb'
428 MCK_store_95_release, // 'store_release'
429 MCK_store_95_stack_95_arg, // 'store_stack_arg'
430 MCK_store_95_stack_95_arg_95_imm, // 'store_stack_arg_imm'
431 MCK_u16, // 'u16'
432 MCK_u32, // 'u32'
433 MCK_u64, // 'u64'
434 MCK_u8, // 'u8'
435 MCK_xchg32_95_32, // 'xchg32_32'
436 MCK_xchg_95_64, // 'xchg_64'
437 MCK__124_, // '|'
438 MCK_LAST_TOKEN = MCK__124_,
439 MCK_R0, // register class 'R0'
440 MCK_W0, // register class 'W0'
441 MCK_GPR, // register class 'GPR'
442 MCK_GPR32, // register class 'GPR32'
443 MCK_LAST_REGISTER = MCK_GPR32,
444 MCK_Imm, // user defined class 'ImmAsmOperand'
445 MCK_SImm16, // user defined class 'SImm16AsmOperand'
446 MCK_BrTarget, // user defined class 'anonymous_13843'
447 NumMatchClassKinds
448};
449
450} // end anonymous namespace
451
452static unsigned getDiagKindFromRegisterClass(MatchClassKind RegisterClass) {
453 return MCTargetAsmParser::Match_InvalidOperand;
454}
455
456static MatchClassKind matchTokenString(StringRef Name) {
457 switch (Name.size()) {
458 default: break;
459 case 1: // 17 strings to match.
460 switch (Name[0]) {
461 default: break;
462 case '!': // 1 string to match.
463 return MCK__EXCLAIM_; // "!"
464 case '%': // 1 string to match.
465 return MCK__PCT_; // "%"
466 case '&': // 1 string to match.
467 return MCK__38_; // "&"
468 case '(': // 1 string to match.
469 return MCK__40_; // "("
470 case ')': // 1 string to match.
471 return MCK__41_; // ")"
472 case '*': // 1 string to match.
473 return MCK__STAR_; // "*"
474 case '+': // 1 string to match.
475 return MCK__43_; // "+"
476 case '-': // 1 string to match.
477 return MCK__MINUS_; // "-"
478 case '/': // 1 string to match.
479 return MCK__47_; // "/"
480 case '<': // 1 string to match.
481 return MCK__LT_; // "<"
482 case '=': // 1 string to match.
483 return MCK__61_; // "="
484 case '>': // 1 string to match.
485 return MCK__GT_; // ">"
486 case '[': // 1 string to match.
487 return MCK__91_; // "["
488 case ']': // 1 string to match.
489 return MCK__93_; // "]"
490 case '^': // 1 string to match.
491 return MCK__94_; // "^"
492 case 's': // 1 string to match.
493 return MCK_s; // "s"
494 case '|': // 1 string to match.
495 return MCK__124_; // "|"
496 }
497 break;
498 case 2: // 4 strings to match.
499 switch (Name[0]) {
500 default: break;
501 case 'i': // 1 string to match.
502 if (Name[1] != 'f')
503 break;
504 return MCK_if; // "if"
505 case 'l': // 1 string to match.
506 if (Name[1] != 'l')
507 break;
508 return MCK_ll; // "ll"
509 case 's': // 1 string to match.
510 if (Name[1] != '8')
511 break;
512 return MCK_s8; // "s8"
513 case 'u': // 1 string to match.
514 if (Name[1] != '8')
515 break;
516 return MCK_u8; // "u8"
517 }
518 break;
519 case 3: // 7 strings to match.
520 switch (Name[0]) {
521 default: break;
522 case 'l': // 1 string to match.
523 if (memcmp(Name.data()+1, "ea", 2) != 0)
524 break;
525 return MCK_lea; // "lea"
526 case 's': // 3 strings to match.
527 switch (Name[1]) {
528 default: break;
529 case '1': // 1 string to match.
530 if (Name[2] != '6')
531 break;
532 return MCK_s16; // "s16"
533 case '3': // 1 string to match.
534 if (Name[2] != '2')
535 break;
536 return MCK_s32; // "s32"
537 case 'k': // 1 string to match.
538 if (Name[2] != 'b')
539 break;
540 return MCK_skb; // "skb"
541 }
542 break;
543 case 'u': // 3 strings to match.
544 switch (Name[1]) {
545 default: break;
546 case '1': // 1 string to match.
547 if (Name[2] != '6')
548 break;
549 return MCK_u16; // "u16"
550 case '3': // 1 string to match.
551 if (Name[2] != '2')
552 break;
553 return MCK_u32; // "u32"
554 case '6': // 1 string to match.
555 if (Name[2] != '4')
556 break;
557 return MCK_u64; // "u64"
558 }
559 break;
560 }
561 break;
562 case 4: // 10 strings to match.
563 switch (Name[0]) {
564 default: break;
565 case 'b': // 3 strings to match.
566 if (Name[1] != 'e')
567 break;
568 switch (Name[2]) {
569 default: break;
570 case '1': // 1 string to match.
571 if (Name[3] != '6')
572 break;
573 return MCK_be16; // "be16"
574 case '3': // 1 string to match.
575 if (Name[3] != '2')
576 break;
577 return MCK_be32; // "be32"
578 case '6': // 1 string to match.
579 if (Name[3] != '4')
580 break;
581 return MCK_be64; // "be64"
582 }
583 break;
584 case 'c': // 1 string to match.
585 if (memcmp(Name.data()+1, "all", 3) != 0)
586 break;
587 return MCK_call; // "call"
588 case 'e': // 1 string to match.
589 if (memcmp(Name.data()+1, "xit", 3) != 0)
590 break;
591 return MCK_exit; // "exit"
592 case 'g': // 1 string to match.
593 if (memcmp(Name.data()+1, "oto", 3) != 0)
594 break;
595 return MCK_goto; // "goto"
596 case 'l': // 4 strings to match.
597 switch (Name[1]) {
598 default: break;
599 case 'e': // 3 strings to match.
600 switch (Name[2]) {
601 default: break;
602 case '1': // 1 string to match.
603 if (Name[3] != '6')
604 break;
605 return MCK_le16; // "le16"
606 case '3': // 1 string to match.
607 if (Name[3] != '2')
608 break;
609 return MCK_le32; // "le32"
610 case '6': // 1 string to match.
611 if (Name[3] != '4')
612 break;
613 return MCK_le64; // "le64"
614 }
615 break;
616 case 'o': // 1 string to match.
617 if (memcmp(Name.data()+2, "ck", 2) != 0)
618 break;
619 return MCK_lock; // "lock"
620 }
621 break;
622 }
623 break;
624 case 5: // 3 strings to match.
625 switch (Name[0]) {
626 default: break;
627 case 'c': // 1 string to match.
628 if (memcmp(Name.data()+1, "allx", 4) != 0)
629 break;
630 return MCK_callx; // "callx"
631 case 'g': // 2 strings to match.
632 if (memcmp(Name.data()+1, "oto", 3) != 0)
633 break;
634 switch (Name[4]) {
635 default: break;
636 case 'l': // 1 string to match.
637 return MCK_gotol; // "gotol"
638 case 'x': // 1 string to match.
639 return MCK_gotox; // "gotox"
640 }
641 break;
642 }
643 break;
644 case 7: // 4 strings to match.
645 switch (Name[0]) {
646 default: break;
647 case 'b': // 3 strings to match.
648 if (memcmp(Name.data()+1, "swap", 4) != 0)
649 break;
650 switch (Name[5]) {
651 default: break;
652 case '1': // 1 string to match.
653 if (Name[6] != '6')
654 break;
655 return MCK_bswap16; // "bswap16"
656 case '3': // 1 string to match.
657 if (Name[6] != '2')
658 break;
659 return MCK_bswap32; // "bswap32"
660 case '6': // 1 string to match.
661 if (Name[6] != '4')
662 break;
663 return MCK_bswap64; // "bswap64"
664 }
665 break;
666 case 'x': // 1 string to match.
667 if (memcmp(Name.data()+1, "chg_64", 6) != 0)
668 break;
669 return MCK_xchg_95_64; // "xchg_64"
670 }
671 break;
672 case 8: // 1 string to match.
673 if (memcmp(Name.data()+0, "may_goto", 8) != 0)
674 break;
675 return MCK_may_95_goto; // "may_goto"
676 case 9: // 2 strings to match.
677 switch (Name[0]) {
678 default: break;
679 case 'l': // 1 string to match.
680 if (memcmp(Name.data()+1, "d_pseudo", 8) != 0)
681 break;
682 return MCK_ld_95_pseudo; // "ld_pseudo"
683 case 'x': // 1 string to match.
684 if (memcmp(Name.data()+1, "chg32_32", 8) != 0)
685 break;
686 return MCK_xchg32_95_32; // "xchg32_32"
687 }
688 break;
689 case 10: // 1 string to match.
690 if (memcmp(Name.data()+0, "cmpxchg_64", 10) != 0)
691 break;
692 return MCK_cmpxchg_95_64; // "cmpxchg_64"
693 case 12: // 2 strings to match.
694 switch (Name[0]) {
695 default: break;
696 case 'c': // 1 string to match.
697 if (memcmp(Name.data()+1, "mpxchg32_32", 11) != 0)
698 break;
699 return MCK_cmpxchg32_95_32; // "cmpxchg32_32"
700 case 'l': // 1 string to match.
701 if (memcmp(Name.data()+1, "oad_acquire", 11) != 0)
702 break;
703 return MCK_load_95_acquire; // "load_acquire"
704 }
705 break;
706 case 13: // 1 string to match.
707 if (memcmp(Name.data()+0, "store_release", 13) != 0)
708 break;
709 return MCK_store_95_release; // "store_release"
710 case 14: // 1 string to match.
711 if (memcmp(Name.data()+0, "load_stack_arg", 14) != 0)
712 break;
713 return MCK_load_95_stack_95_arg; // "load_stack_arg"
714 case 15: // 3 strings to match.
715 switch (Name[0]) {
716 default: break;
717 case 'a': // 2 strings to match.
718 switch (Name[1]) {
719 default: break;
720 case 'd': // 1 string to match.
721 if (memcmp(Name.data()+2, "dr_space_cast", 13) != 0)
722 break;
723 return MCK_addr_95_space_95_cast; // "addr_space_cast"
724 case 't': // 1 string to match.
725 if (memcmp(Name.data()+2, "omic_fetch_or", 13) != 0)
726 break;
727 return MCK_atomic_95_fetch_95_or; // "atomic_fetch_or"
728 }
729 break;
730 case 's': // 1 string to match.
731 if (memcmp(Name.data()+1, "tore_stack_arg", 14) != 0)
732 break;
733 return MCK_store_95_stack_95_arg; // "store_stack_arg"
734 }
735 break;
736 case 16: // 3 strings to match.
737 if (memcmp(Name.data()+0, "atomic_fetch_", 13) != 0)
738 break;
739 switch (Name[13]) {
740 default: break;
741 case 'a': // 2 strings to match.
742 switch (Name[14]) {
743 default: break;
744 case 'd': // 1 string to match.
745 if (Name[15] != 'd')
746 break;
747 return MCK_atomic_95_fetch_95_add; // "atomic_fetch_add"
748 case 'n': // 1 string to match.
749 if (Name[15] != 'd')
750 break;
751 return MCK_atomic_95_fetch_95_and; // "atomic_fetch_and"
752 }
753 break;
754 case 'x': // 1 string to match.
755 if (memcmp(Name.data()+14, "or", 2) != 0)
756 break;
757 return MCK_atomic_95_fetch_95_xor; // "atomic_fetch_xor"
758 }
759 break;
760 case 19: // 1 string to match.
761 if (memcmp(Name.data()+0, "store_stack_arg_imm", 19) != 0)
762 break;
763 return MCK_store_95_stack_95_arg_95_imm; // "store_stack_arg_imm"
764 }
765 return InvalidMatchClass;
766}
767
768/// isSubclass - Compute whether \p A is a subclass of \p B.
769static bool isSubclass(MatchClassKind A, MatchClassKind B) {
770 if (A == B)
771 return true;
772
773 [[maybe_unused]] static constexpr struct {
774 uint32_t Offset;
775 uint16_t Start;
776 uint16_t Length;
777 } Table[] = {
778 {0, 0, 0},
779 {0, 0, 0},
780 {0, 0, 0},
781 {0, 0, 0},
782 {0, 0, 0},
783 {0, 0, 0},
784 {0, 0, 0},
785 {0, 0, 0},
786 {0, 0, 0},
787 {0, 0, 0},
788 {0, 0, 0},
789 {0, 0, 0},
790 {0, 0, 0},
791 {0, 0, 0},
792 {0, 0, 0},
793 {0, 0, 0},
794 {0, 0, 0},
795 {0, 0, 0},
796 {0, 0, 0},
797 {0, 0, 0},
798 {0, 0, 0},
799 {0, 0, 0},
800 {0, 0, 0},
801 {0, 0, 0},
802 {0, 0, 0},
803 {0, 0, 0},
804 {0, 0, 0},
805 {0, 0, 0},
806 {0, 0, 0},
807 {0, 0, 0},
808 {0, 0, 0},
809 {0, 0, 0},
810 {0, 0, 0},
811 {0, 0, 0},
812 {0, 0, 0},
813 {0, 0, 0},
814 {0, 0, 0},
815 {0, 0, 0},
816 {0, 0, 0},
817 {0, 0, 0},
818 {0, 0, 0},
819 {0, 0, 0},
820 {0, 0, 0},
821 {0, 0, 0},
822 {0, 0, 0},
823 {0, 0, 0},
824 {0, 0, 0},
825 {0, 0, 0},
826 {0, 0, 0},
827 {0, 0, 0},
828 {0, 0, 0},
829 {0, 0, 0},
830 {0, 0, 0},
831 {0, 0, 0},
832 {0, 0, 0},
833 {0, 0, 0},
834 {0, 0, 0},
835 {0, 0, 0},
836 {0, 0, 0},
837 {0, 0, 0},
838 {0, 0, 0},
839 {0, 0, 0},
840 {0, 64, 1},
841 {1, 65, 1},
842 {2, 0, 0},
843 {2, 0, 0},
844 {2, 0, 0},
845 {2, 0, 0},
846 {2, 0, 0},
847 };
848
849 static constexpr uint8_t Data[] = {
850 0x03,
851 };
852
853 auto &Entry = Table[A];
854 unsigned Idx = B - Entry.Start;
855 if (Idx >= Entry.Length)
856 return false;
857 Idx += Entry.Offset;
858 return (Data[Idx / 8] >> (Idx % 8)) & 1;
859}
860
861static unsigned validateOperandClass(MCParsedAsmOperand &GOp, MatchClassKind Kind, const MCSubtargetInfo &STI) {
862 BPFOperand &Operand = (BPFOperand &)GOp;
863 if (Kind == InvalidMatchClass)
864 return MCTargetAsmParser::Match_InvalidOperand;
865
866 if (Operand.isToken() && Kind <= MCK_LAST_TOKEN)
867 return isSubclass(matchTokenString(Operand.getToken()), Kind) ?
868 MCTargetAsmParser::Match_Success :
869 MCTargetAsmParser::Match_InvalidOperand;
870
871 switch (Kind) {
872 default: break;
873 case MCK_Imm: {
874 DiagnosticPredicate DP(Operand.isImm());
875 if (DP.isMatch())
876 return MCTargetAsmParser::Match_Success;
877 break;
878 }
879 case MCK_SImm16: {
880 DiagnosticPredicate DP(Operand.isSImm16());
881 if (DP.isMatch())
882 return MCTargetAsmParser::Match_Success;
883 if (DP.isNearMatch())
884 return BPFAsmParser::Match_InvalidSImm16;
885 break;
886 }
887 case MCK_BrTarget: {
888 DiagnosticPredicate DP(Operand.isBrTarget());
889 if (DP.isMatch())
890 return MCTargetAsmParser::Match_Success;
891 if (DP.isNearMatch())
892 return BPFAsmParser::Match_InvalidBrTarget;
893 break;
894 }
895 } // end switch (Kind)
896
897 if (Operand.isReg()) {
898 static constexpr uint16_t Table[BPF::NUM_TARGET_REGS] = {
899 InvalidMatchClass,
900 MCK_R0,
901 MCK_GPR,
902 MCK_GPR,
903 MCK_GPR,
904 MCK_GPR,
905 MCK_GPR,
906 MCK_GPR,
907 MCK_GPR,
908 MCK_GPR,
909 MCK_GPR,
910 MCK_GPR,
911 MCK_GPR,
912 MCK_W0,
913 MCK_GPR32,
914 MCK_GPR32,
915 MCK_GPR32,
916 MCK_GPR32,
917 MCK_GPR32,
918 MCK_GPR32,
919 MCK_GPR32,
920 MCK_GPR32,
921 MCK_GPR32,
922 MCK_GPR32,
923 MCK_GPR32,
924 };
925
926 MCRegister Reg = Operand.getReg();
927 MatchClassKind OpKind = Reg.isPhysical() ? (MatchClassKind)Table[Reg.id()] : InvalidMatchClass;
928 return isSubclass(OpKind, Kind) ? (unsigned)MCTargetAsmParser::Match_Success :
929 getDiagKindFromRegisterClass(Kind);
930 }
931
932 if (Kind > MCK_LAST_TOKEN && Kind <= MCK_LAST_REGISTER)
933 return getDiagKindFromRegisterClass(Kind);
934
935 return MCTargetAsmParser::Match_InvalidOperand;
936}
937
938#ifndef NDEBUG
939const char *getMatchClassName(MatchClassKind Kind) {
940 switch (Kind) {
941 case InvalidMatchClass: return "InvalidMatchClass";
942 case OptionalMatchClass: return "OptionalMatchClass";
943 case MCK__EXCLAIM_: return "MCK__EXCLAIM_";
944 case MCK__PCT_: return "MCK__PCT_";
945 case MCK__38_: return "MCK__38_";
946 case MCK__40_: return "MCK__40_";
947 case MCK__41_: return "MCK__41_";
948 case MCK__STAR_: return "MCK__STAR_";
949 case MCK__43_: return "MCK__43_";
950 case MCK__MINUS_: return "MCK__MINUS_";
951 case MCK__47_: return "MCK__47_";
952 case MCK__LT_: return "MCK__LT_";
953 case MCK__61_: return "MCK__61_";
954 case MCK__GT_: return "MCK__GT_";
955 case MCK__91_: return "MCK__91_";
956 case MCK__93_: return "MCK__93_";
957 case MCK__94_: return "MCK__94_";
958 case MCK_addr_95_space_95_cast: return "MCK_addr_95_space_95_cast";
959 case MCK_atomic_95_fetch_95_add: return "MCK_atomic_95_fetch_95_add";
960 case MCK_atomic_95_fetch_95_and: return "MCK_atomic_95_fetch_95_and";
961 case MCK_atomic_95_fetch_95_or: return "MCK_atomic_95_fetch_95_or";
962 case MCK_atomic_95_fetch_95_xor: return "MCK_atomic_95_fetch_95_xor";
963 case MCK_be16: return "MCK_be16";
964 case MCK_be32: return "MCK_be32";
965 case MCK_be64: return "MCK_be64";
966 case MCK_bswap16: return "MCK_bswap16";
967 case MCK_bswap32: return "MCK_bswap32";
968 case MCK_bswap64: return "MCK_bswap64";
969 case MCK_call: return "MCK_call";
970 case MCK_callx: return "MCK_callx";
971 case MCK_cmpxchg32_95_32: return "MCK_cmpxchg32_95_32";
972 case MCK_cmpxchg_95_64: return "MCK_cmpxchg_95_64";
973 case MCK_exit: return "MCK_exit";
974 case MCK_goto: return "MCK_goto";
975 case MCK_gotol: return "MCK_gotol";
976 case MCK_gotox: return "MCK_gotox";
977 case MCK_if: return "MCK_if";
978 case MCK_ld_95_pseudo: return "MCK_ld_95_pseudo";
979 case MCK_le16: return "MCK_le16";
980 case MCK_le32: return "MCK_le32";
981 case MCK_le64: return "MCK_le64";
982 case MCK_lea: return "MCK_lea";
983 case MCK_ll: return "MCK_ll";
984 case MCK_load_95_acquire: return "MCK_load_95_acquire";
985 case MCK_load_95_stack_95_arg: return "MCK_load_95_stack_95_arg";
986 case MCK_lock: return "MCK_lock";
987 case MCK_may_95_goto: return "MCK_may_95_goto";
988 case MCK_s: return "MCK_s";
989 case MCK_s16: return "MCK_s16";
990 case MCK_s32: return "MCK_s32";
991 case MCK_s8: return "MCK_s8";
992 case MCK_skb: return "MCK_skb";
993 case MCK_store_95_release: return "MCK_store_95_release";
994 case MCK_store_95_stack_95_arg: return "MCK_store_95_stack_95_arg";
995 case MCK_store_95_stack_95_arg_95_imm: return "MCK_store_95_stack_95_arg_95_imm";
996 case MCK_u16: return "MCK_u16";
997 case MCK_u32: return "MCK_u32";
998 case MCK_u64: return "MCK_u64";
999 case MCK_u8: return "MCK_u8";
1000 case MCK_xchg32_95_32: return "MCK_xchg32_95_32";
1001 case MCK_xchg_95_64: return "MCK_xchg_95_64";
1002 case MCK__124_: return "MCK__124_";
1003 case MCK_R0: return "MCK_R0";
1004 case MCK_W0: return "MCK_W0";
1005 case MCK_GPR: return "MCK_GPR";
1006 case MCK_GPR32: return "MCK_GPR32";
1007 case MCK_Imm: return "MCK_Imm";
1008 case MCK_SImm16: return "MCK_SImm16";
1009 case MCK_BrTarget: return "MCK_BrTarget";
1010 case NumMatchClassKinds: return "NumMatchClassKinds";
1011 }
1012 llvm_unreachable("unhandled MatchClassKind!");
1013}
1014
1015#endif // NDEBUG
1016FeatureBitset BPFAsmParser::
1017ComputeAvailableFeatures(const FeatureBitset &FB) const {
1018 FeatureBitset Features;
1019 return Features;
1020}
1021
1022static bool checkAsmTiedOperandConstraints(const BPFAsmParser&AsmParser,
1023 unsigned Kind, const OperandVector &Operands,
1024 uint64_t &ErrorInfo) {
1025 assert(Kind < CVT_NUM_SIGNATURES && "Invalid signature!");
1026 const uint8_t *Converter = ConversionTable[Kind];
1027 for (const uint8_t *p = Converter; *p; p += 2) {
1028 switch (*p) {
1029 case CVT_Tied: {
1030 unsigned OpIdx = *(p + 1);
1031 assert(OpIdx < (size_t)(std::end(TiedAsmOperandTable) -
1032 std::begin(TiedAsmOperandTable)) &&
1033 "Tied operand not found");
1034 unsigned OpndNum1 = TiedAsmOperandTable[OpIdx][1];
1035 unsigned OpndNum2 = TiedAsmOperandTable[OpIdx][2];
1036 if (OpndNum1 != OpndNum2) {
1037 auto &SrcOp1 = Operands[OpndNum1];
1038 auto &SrcOp2 = Operands[OpndNum2];
1039 if (!AsmParser.areEqualRegs(*SrcOp1, *SrcOp2)) {
1040 ErrorInfo = OpndNum2;
1041 return false;
1042 }
1043 }
1044 break;
1045 }
1046 default:
1047 break;
1048 }
1049 }
1050 return true;
1051}
1052
1053static const char MnemonicTable[] =
1054 "\000\001*\004call\005callx\004exit\004goto\005gotol\005gotox\002if\tld_"
1055 "pseudo\003lea\016load_stack_arg\004lock\010may_goto\002r0\015store_rele"
1056 "ase\017store_stack_arg\023store_stack_arg_imm\002w0";
1057
1058// Feature bitsets.
1059enum : uint8_t {
1060 AMFBS_None,
1061};
1062
1063static constexpr FeatureBitset FeatureBitsets[] = {
1064 {}, // AMFBS_None
1065};
1066
1067namespace {
1068 struct MatchEntry {
1069 uint8_t Mnemonic;
1070 uint32_t Opcode;
1071 uint8_t ConvertFn;
1072 uint8_t RequiredFeaturesIdx;
1073 uint8_t Classes[14];
1074 StringRef getMnemonic() const {
1075 return StringRef(MnemonicTable + Mnemonic + 1,
1076 MnemonicTable[Mnemonic]);
1077 }
1078 };
1079
1080 // Predicate for searching for an opcode.
1081 struct LessOpcode {
1082 bool operator()(const MatchEntry &LHS, StringRef RHS) {
1083 return LHS.getMnemonic() < RHS;
1084 }
1085 bool operator()(StringRef LHS, const MatchEntry &RHS) {
1086 return LHS < RHS.getMnemonic();
1087 }
1088 bool operator()(const MatchEntry &LHS, const MatchEntry &RHS) {
1089 return LHS.getMnemonic() < RHS.getMnemonic();
1090 }
1091 };
1092} // end anonymous namespace
1093
1094static const MatchEntry MatchTable0[] = {
1095 { 0 /* */, BPF::MOV_rr, Convert__Reg1_0__Reg1_2, AMFBS_None, { MCK_GPR, MCK__61_, MCK_GPR }, },
1096 { 0 /* */, BPF::MOV_ri, Convert__Reg1_0__Imm1_2, AMFBS_None, { MCK_GPR, MCK__61_, MCK_Imm }, },
1097 { 0 /* */, BPF::MOV_rr_32, Convert__Reg1_0__Reg1_2, AMFBS_None, { MCK_GPR32, MCK__61_, MCK_GPR32 }, },
1098 { 0 /* */, BPF::MOV_ri_32, Convert__Reg1_0__Imm1_2, AMFBS_None, { MCK_GPR32, MCK__61_, MCK_Imm }, },
1099 { 0 /* */, BPF::MOD_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__PCT_, MCK__61_, MCK_GPR }, },
1100 { 0 /* */, BPF::MOD_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__PCT_, MCK__61_, MCK_Imm }, },
1101 { 0 /* */, BPF::AND_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__38_, MCK__61_, MCK_GPR }, },
1102 { 0 /* */, BPF::AND_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__38_, MCK__61_, MCK_Imm }, },
1103 { 0 /* */, BPF::MUL_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__STAR_, MCK__61_, MCK_GPR }, },
1104 { 0 /* */, BPF::MUL_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__STAR_, MCK__61_, MCK_Imm }, },
1105 { 0 /* */, BPF::ADD_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__43_, MCK__61_, MCK_GPR }, },
1106 { 0 /* */, BPF::ADD_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__43_, MCK__61_, MCK_Imm }, },
1107 { 0 /* */, BPF::SUB_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__MINUS_, MCK__61_, MCK_GPR }, },
1108 { 0 /* */, BPF::SUB_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__MINUS_, MCK__61_, MCK_Imm }, },
1109 { 0 /* */, BPF::DIV_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__47_, MCK__61_, MCK_GPR }, },
1110 { 0 /* */, BPF::DIV_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__47_, MCK__61_, MCK_Imm }, },
1111 { 0 /* */, BPF::NEG_64, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK__MINUS_, MCK_GPR }, },
1112 { 0 /* */, BPF::BE16, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_be16, MCK_GPR }, },
1113 { 0 /* */, BPF::BE32, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_be32, MCK_GPR }, },
1114 { 0 /* */, BPF::BE64, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_be64, MCK_GPR }, },
1115 { 0 /* */, BPF::BSWAP16, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_bswap16, MCK_GPR }, },
1116 { 0 /* */, BPF::BSWAP32, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_bswap32, MCK_GPR }, },
1117 { 0 /* */, BPF::BSWAP64, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_bswap64, MCK_GPR }, },
1118 { 0 /* */, BPF::LE16, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_le16, MCK_GPR }, },
1119 { 0 /* */, BPF::LE32, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_le32, MCK_GPR }, },
1120 { 0 /* */, BPF::LE64, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_le64, MCK_GPR }, },
1121 { 0 /* */, BPF::LD_imm64, Convert__Reg1_0__Imm1_2, AMFBS_None, { MCK_GPR, MCK__61_, MCK_Imm, MCK_ll }, },
1122 { 0 /* */, BPF::XOR_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__94_, MCK__61_, MCK_GPR }, },
1123 { 0 /* */, BPF::XOR_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__94_, MCK__61_, MCK_Imm }, },
1124 { 0 /* */, BPF::OR_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__124_, MCK__61_, MCK_GPR }, },
1125 { 0 /* */, BPF::OR_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__124_, MCK__61_, MCK_Imm }, },
1126 { 0 /* */, BPF::MOD_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__PCT_, MCK__61_, MCK_GPR32 }, },
1127 { 0 /* */, BPF::MOD_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__PCT_, MCK__61_, MCK_Imm }, },
1128 { 0 /* */, BPF::AND_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__38_, MCK__61_, MCK_GPR32 }, },
1129 { 0 /* */, BPF::AND_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__38_, MCK__61_, MCK_Imm }, },
1130 { 0 /* */, BPF::MUL_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__STAR_, MCK__61_, MCK_GPR32 }, },
1131 { 0 /* */, BPF::MUL_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__STAR_, MCK__61_, MCK_Imm }, },
1132 { 0 /* */, BPF::ADD_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__43_, MCK__61_, MCK_GPR32 }, },
1133 { 0 /* */, BPF::ADD_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__43_, MCK__61_, MCK_Imm }, },
1134 { 0 /* */, BPF::SUB_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__MINUS_, MCK__61_, MCK_GPR32 }, },
1135 { 0 /* */, BPF::SUB_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__MINUS_, MCK__61_, MCK_Imm }, },
1136 { 0 /* */, BPF::DIV_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__47_, MCK__61_, MCK_GPR32 }, },
1137 { 0 /* */, BPF::DIV_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__47_, MCK__61_, MCK_Imm }, },
1138 { 0 /* */, BPF::NEG_32, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR32, MCK__61_, MCK__MINUS_, MCK_GPR32 }, },
1139 { 0 /* */, BPF::XOR_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__94_, MCK__61_, MCK_GPR32 }, },
1140 { 0 /* */, BPF::XOR_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__94_, MCK__61_, MCK_Imm }, },
1141 { 0 /* */, BPF::OR_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__124_, MCK__61_, MCK_GPR32 }, },
1142 { 0 /* */, BPF::OR_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__124_, MCK__61_, MCK_Imm }, },
1143 { 0 /* */, BPF::SLL_rr, Convert__Reg1_0__Tie0_0_0__Reg1_4, AMFBS_None, { MCK_GPR, MCK__LT_, MCK__LT_, MCK__61_, MCK_GPR }, },
1144 { 0 /* */, BPF::SLL_ri, Convert__Reg1_0__Tie0_0_0__Imm1_4, AMFBS_None, { MCK_GPR, MCK__LT_, MCK__LT_, MCK__61_, MCK_Imm }, },
1145 { 0 /* */, BPF::SRL_rr, Convert__Reg1_0__Tie0_0_0__Reg1_4, AMFBS_None, { MCK_GPR, MCK__GT_, MCK__GT_, MCK__61_, MCK_GPR }, },
1146 { 0 /* */, BPF::SRL_ri, Convert__Reg1_0__Tie0_0_0__Imm1_4, AMFBS_None, { MCK_GPR, MCK__GT_, MCK__GT_, MCK__61_, MCK_Imm }, },
1147 { 0 /* */, BPF::SMOD_rr, Convert__Reg1_0__Tie0_0_0__Reg1_4, AMFBS_None, { MCK_GPR, MCK_s, MCK__PCT_, MCK__61_, MCK_GPR }, },
1148 { 0 /* */, BPF::SMOD_ri, Convert__Reg1_0__Tie0_0_0__Imm1_4, AMFBS_None, { MCK_GPR, MCK_s, MCK__PCT_, MCK__61_, MCK_Imm }, },
1149 { 0 /* */, BPF::SDIV_rr, Convert__Reg1_0__Tie0_0_0__Reg1_4, AMFBS_None, { MCK_GPR, MCK_s, MCK__47_, MCK__61_, MCK_GPR }, },
1150 { 0 /* */, BPF::SDIV_ri, Convert__Reg1_0__Tie0_0_0__Imm1_4, AMFBS_None, { MCK_GPR, MCK_s, MCK__47_, MCK__61_, MCK_Imm }, },
1151 { 0 /* */, BPF::SLL_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_4, AMFBS_None, { MCK_GPR32, MCK__LT_, MCK__LT_, MCK__61_, MCK_GPR32 }, },
1152 { 0 /* */, BPF::SLL_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_4, AMFBS_None, { MCK_GPR32, MCK__LT_, MCK__LT_, MCK__61_, MCK_Imm }, },
1153 { 0 /* */, BPF::SRL_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_4, AMFBS_None, { MCK_GPR32, MCK__GT_, MCK__GT_, MCK__61_, MCK_GPR32 }, },
1154 { 0 /* */, BPF::SRL_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_4, AMFBS_None, { MCK_GPR32, MCK__GT_, MCK__GT_, MCK__61_, MCK_Imm }, },
1155 { 0 /* */, BPF::SMOD_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_4, AMFBS_None, { MCK_GPR32, MCK_s, MCK__PCT_, MCK__61_, MCK_GPR32 }, },
1156 { 0 /* */, BPF::SMOD_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_4, AMFBS_None, { MCK_GPR32, MCK_s, MCK__PCT_, MCK__61_, MCK_Imm }, },
1157 { 0 /* */, BPF::SDIV_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_4, AMFBS_None, { MCK_GPR32, MCK_s, MCK__47_, MCK__61_, MCK_GPR32 }, },
1158 { 0 /* */, BPF::SDIV_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_4, AMFBS_None, { MCK_GPR32, MCK_s, MCK__47_, MCK__61_, MCK_Imm }, },
1159 { 0 /* */, BPF::MOVSX_rr_16, Convert__Reg1_0__Reg1_5, AMFBS_None, { MCK_GPR, MCK__61_, MCK__40_, MCK_s16, MCK__41_, MCK_GPR }, },
1160 { 0 /* */, BPF::MOVSX_rr_32, Convert__Reg1_0__Reg1_5, AMFBS_None, { MCK_GPR, MCK__61_, MCK__40_, MCK_s32, MCK__41_, MCK_GPR }, },
1161 { 0 /* */, BPF::MOVSX_rr_8, Convert__Reg1_0__Reg1_5, AMFBS_None, { MCK_GPR, MCK__61_, MCK__40_, MCK_s8, MCK__41_, MCK_GPR }, },
1162 { 0 /* */, BPF::SRA_rr, Convert__Reg1_0__Tie0_0_0__Reg1_5, AMFBS_None, { MCK_GPR, MCK_s, MCK__GT_, MCK__GT_, MCK__61_, MCK_GPR }, },
1163 { 0 /* */, BPF::SRA_ri, Convert__Reg1_0__Tie0_0_0__Imm1_5, AMFBS_None, { MCK_GPR, MCK_s, MCK__GT_, MCK__GT_, MCK__61_, MCK_Imm }, },
1164 { 0 /* */, BPF::MOVSX_rr_32_16, Convert__Reg1_0__Reg1_5, AMFBS_None, { MCK_GPR32, MCK__61_, MCK__40_, MCK_s16, MCK__41_, MCK_GPR32 }, },
1165 { 0 /* */, BPF::MOVSX_rr_32_8, Convert__Reg1_0__Reg1_5, AMFBS_None, { MCK_GPR32, MCK__61_, MCK__40_, MCK_s8, MCK__41_, MCK_GPR32 }, },
1166 { 0 /* */, BPF::SRA_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_5, AMFBS_None, { MCK_GPR32, MCK_s, MCK__GT_, MCK__GT_, MCK__61_, MCK_GPR32 }, },
1167 { 0 /* */, BPF::SRA_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_5, AMFBS_None, { MCK_GPR32, MCK_s, MCK__GT_, MCK__GT_, MCK__61_, MCK_Imm }, },
1168 { 0 /* */, BPF::ADDR_SPACE_CAST, Convert__Reg1_0__Reg1_4__Imm1_5__Imm1_6, AMFBS_None, { MCK_GPR, MCK__61_, MCK_addr_95_space_95_cast, MCK__40_, MCK_GPR, MCK_Imm, MCK_Imm, MCK__41_ }, },
1169 { 0 /* */, BPF::XCHGD, Convert__Reg1_0__Reg1_4__SImm161_5__Tie0_0_6, AMFBS_None, { MCK_GPR, MCK__61_, MCK_xchg_95_64, MCK__40_, MCK_GPR, MCK_SImm16, MCK_GPR, MCK__41_ }, },
1170 { 0 /* */, BPF::XCHGW32, Convert__Reg1_0__Reg1_4__SImm161_5__Tie0_0_6, AMFBS_None, { MCK_GPR32, MCK__61_, MCK_xchg32_95_32, MCK__40_, MCK_GPR, MCK_SImm16, MCK_GPR32, MCK__41_ }, },
1171 { 0 /* */, BPF::LDHSX, Convert__Reg1_0__Reg1_8__SImm161_9, AMFBS_None, { MCK_GPR, MCK__61_, MCK__STAR_, MCK__40_, MCK_s16, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_ }, },
1172 { 0 /* */, BPF::LDWSX, Convert__Reg1_0__Reg1_8__SImm161_9, AMFBS_None, { MCK_GPR, MCK__61_, MCK__STAR_, MCK__40_, MCK_s32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_ }, },
1173 { 0 /* */, BPF::LDBSX, Convert__Reg1_0__Reg1_8__SImm161_9, AMFBS_None, { MCK_GPR, MCK__61_, MCK__STAR_, MCK__40_, MCK_s8, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_ }, },
1174 { 0 /* */, BPF::LDH, Convert__Reg1_0__Reg1_8__SImm161_9, AMFBS_None, { MCK_GPR, MCK__61_, MCK__STAR_, MCK__40_, MCK_u16, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_ }, },
1175 { 0 /* */, BPF::LDW, Convert__Reg1_0__Reg1_8__SImm161_9, AMFBS_None, { MCK_GPR, MCK__61_, MCK__STAR_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_ }, },
1176 { 0 /* */, BPF::LDD, Convert__Reg1_0__Reg1_8__SImm161_9, AMFBS_None, { MCK_GPR, MCK__61_, MCK__STAR_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_ }, },
1177 { 0 /* */, BPF::LDB, Convert__Reg1_0__Reg1_8__SImm161_9, AMFBS_None, { MCK_GPR, MCK__61_, MCK__STAR_, MCK__40_, MCK_u8, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_ }, },
1178 { 0 /* */, BPF::LDH32, Convert__Reg1_0__Reg1_8__SImm161_9, AMFBS_None, { MCK_GPR32, MCK__61_, MCK__STAR_, MCK__40_, MCK_u16, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_ }, },
1179 { 0 /* */, BPF::LDW32, Convert__Reg1_0__Reg1_8__SImm161_9, AMFBS_None, { MCK_GPR32, MCK__61_, MCK__STAR_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_ }, },
1180 { 0 /* */, BPF::LDB32, Convert__Reg1_0__Reg1_8__SImm161_9, AMFBS_None, { MCK_GPR32, MCK__61_, MCK__STAR_, MCK__40_, MCK_u8, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_ }, },
1181 { 0 /* */, BPF::LDDACQ, Convert__Reg1_0__Reg1_9__SImm161_10, AMFBS_None, { MCK_GPR, MCK__61_, MCK_load_95_acquire, MCK__40_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__41_ }, },
1182 { 0 /* */, BPF::LDHACQ32, Convert__Reg1_0__Reg1_9__SImm161_10, AMFBS_None, { MCK_GPR32, MCK__61_, MCK_load_95_acquire, MCK__40_, MCK__40_, MCK_u16, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__41_ }, },
1183 { 0 /* */, BPF::LDWACQ32, Convert__Reg1_0__Reg1_9__SImm161_10, AMFBS_None, { MCK_GPR32, MCK__61_, MCK_load_95_acquire, MCK__40_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__41_ }, },
1184 { 0 /* */, BPF::LDBACQ32, Convert__Reg1_0__Reg1_9__SImm161_10, AMFBS_None, { MCK_GPR32, MCK__61_, MCK_load_95_acquire, MCK__40_, MCK__40_, MCK_u8, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__41_ }, },
1185 { 0 /* */, BPF::XFADDD, Convert__Reg1_0__Reg1_9__SImm161_10__Tie0_0_12, AMFBS_None, { MCK_GPR, MCK__61_, MCK_atomic_95_fetch_95_add, MCK__40_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK_GPR, MCK__41_ }, },
1186 { 0 /* */, BPF::XFANDD, Convert__Reg1_0__Reg1_9__SImm161_10__Tie0_0_12, AMFBS_None, { MCK_GPR, MCK__61_, MCK_atomic_95_fetch_95_and, MCK__40_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK_GPR, MCK__41_ }, },
1187 { 0 /* */, BPF::XFORD, Convert__Reg1_0__Reg1_9__SImm161_10__Tie0_0_12, AMFBS_None, { MCK_GPR, MCK__61_, MCK_atomic_95_fetch_95_or, MCK__40_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK_GPR, MCK__41_ }, },
1188 { 0 /* */, BPF::XFXORD, Convert__Reg1_0__Reg1_9__SImm161_10__Tie0_0_12, AMFBS_None, { MCK_GPR, MCK__61_, MCK_atomic_95_fetch_95_xor, MCK__40_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK_GPR, MCK__41_ }, },
1189 { 0 /* */, BPF::XFADDW32, Convert__Reg1_0__Reg1_9__SImm161_10__Tie0_0_12, AMFBS_None, { MCK_GPR32, MCK__61_, MCK_atomic_95_fetch_95_add, MCK__40_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK_GPR32, MCK__41_ }, },
1190 { 0 /* */, BPF::XFANDW32, Convert__Reg1_0__Reg1_9__SImm161_10__Tie0_0_12, AMFBS_None, { MCK_GPR32, MCK__61_, MCK_atomic_95_fetch_95_and, MCK__40_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK_GPR32, MCK__41_ }, },
1191 { 0 /* */, BPF::XFORW32, Convert__Reg1_0__Reg1_9__SImm161_10__Tie0_0_12, AMFBS_None, { MCK_GPR32, MCK__61_, MCK_atomic_95_fetch_95_or, MCK__40_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK_GPR32, MCK__41_ }, },
1192 { 0 /* */, BPF::XFXORW32, Convert__Reg1_0__Reg1_9__SImm161_10__Tie0_0_12, AMFBS_None, { MCK_GPR32, MCK__61_, MCK_atomic_95_fetch_95_xor, MCK__40_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK_GPR32, MCK__41_ }, },
1193 { 1 /* * */, BPF::STH, Convert__Reg1_10__Reg1_6__SImm161_7, AMFBS_None, { MCK__STAR_, MCK__40_, MCK_u16, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__61_, MCK_GPR }, },
1194 { 1 /* * */, BPF::STH32, Convert__Reg1_10__Reg1_6__SImm161_7, AMFBS_None, { MCK__STAR_, MCK__40_, MCK_u16, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__61_, MCK_GPR32 }, },
1195 { 1 /* * */, BPF::STH_imm, Convert__Imm1_10__Reg1_6__SImm161_7, AMFBS_None, { MCK__STAR_, MCK__40_, MCK_u16, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__61_, MCK_Imm }, },
1196 { 1 /* * */, BPF::STW, Convert__Reg1_10__Reg1_6__SImm161_7, AMFBS_None, { MCK__STAR_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__61_, MCK_GPR }, },
1197 { 1 /* * */, BPF::STW32, Convert__Reg1_10__Reg1_6__SImm161_7, AMFBS_None, { MCK__STAR_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__61_, MCK_GPR32 }, },
1198 { 1 /* * */, BPF::STW_imm, Convert__Imm1_10__Reg1_6__SImm161_7, AMFBS_None, { MCK__STAR_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__61_, MCK_Imm }, },
1199 { 1 /* * */, BPF::STD, Convert__Reg1_10__Reg1_6__SImm161_7, AMFBS_None, { MCK__STAR_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__61_, MCK_GPR }, },
1200 { 1 /* * */, BPF::STD_imm, Convert__Imm1_10__Reg1_6__SImm161_7, AMFBS_None, { MCK__STAR_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__61_, MCK_Imm }, },
1201 { 1 /* * */, BPF::STB, Convert__Reg1_10__Reg1_6__SImm161_7, AMFBS_None, { MCK__STAR_, MCK__40_, MCK_u8, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__61_, MCK_GPR }, },
1202 { 1 /* * */, BPF::STB32, Convert__Reg1_10__Reg1_6__SImm161_7, AMFBS_None, { MCK__STAR_, MCK__40_, MCK_u8, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__61_, MCK_GPR32 }, },
1203 { 1 /* * */, BPF::STB_imm, Convert__Imm1_10__Reg1_6__SImm161_7, AMFBS_None, { MCK__STAR_, MCK__40_, MCK_u8, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__61_, MCK_Imm }, },
1204 { 3 /* call */, BPF::JAL, Convert__Imm1_1, AMFBS_None, { MCK_call, MCK_Imm }, },
1205 { 8 /* callx */, BPF::JALX, Convert__Reg1_1, AMFBS_None, { MCK_callx, MCK_GPR }, },
1206 { 14 /* exit */, BPF::RET, Convert_NoOperands, AMFBS_None, { MCK_exit }, },
1207 { 19 /* goto */, BPF::JMP, Convert__BrTarget1_1, AMFBS_None, { MCK_goto, MCK_BrTarget }, },
1208 { 24 /* gotol */, BPF::JMPL, Convert__BrTarget1_1, AMFBS_None, { MCK_gotol, MCK_BrTarget }, },
1209 { 30 /* gotox */, BPF::JX, Convert__Reg1_1, AMFBS_None, { MCK_gotox, MCK_GPR }, },
1210 { 36 /* if */, BPF::JSET_rr, Convert__Reg1_1__Reg1_3__BrTarget1_5, AMFBS_None, { MCK_if, MCK_GPR, MCK__38_, MCK_GPR, MCK_goto, MCK_BrTarget }, },
1211 { 36 /* if */, BPF::JSET_ri, Convert__Reg1_1__Imm1_3__BrTarget1_5, AMFBS_None, { MCK_if, MCK_GPR, MCK__38_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1212 { 36 /* if */, BPF::JULT_rr, Convert__Reg1_1__Reg1_3__BrTarget1_5, AMFBS_None, { MCK_if, MCK_GPR, MCK__LT_, MCK_GPR, MCK_goto, MCK_BrTarget }, },
1213 { 36 /* if */, BPF::JULT_ri, Convert__Reg1_1__Imm1_3__BrTarget1_5, AMFBS_None, { MCK_if, MCK_GPR, MCK__LT_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1214 { 36 /* if */, BPF::JUGT_rr, Convert__Reg1_1__Reg1_3__BrTarget1_5, AMFBS_None, { MCK_if, MCK_GPR, MCK__GT_, MCK_GPR, MCK_goto, MCK_BrTarget }, },
1215 { 36 /* if */, BPF::JUGT_ri, Convert__Reg1_1__Imm1_3__BrTarget1_5, AMFBS_None, { MCK_if, MCK_GPR, MCK__GT_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1216 { 36 /* if */, BPF::JSET_rr_32, Convert__Reg1_1__Reg1_3__BrTarget1_5, AMFBS_None, { MCK_if, MCK_GPR32, MCK__38_, MCK_GPR32, MCK_goto, MCK_BrTarget }, },
1217 { 36 /* if */, BPF::JSET_ri_32, Convert__Reg1_1__Imm1_3__BrTarget1_5, AMFBS_None, { MCK_if, MCK_GPR32, MCK__38_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1218 { 36 /* if */, BPF::JULT_rr_32, Convert__Reg1_1__Reg1_3__BrTarget1_5, AMFBS_None, { MCK_if, MCK_GPR32, MCK__LT_, MCK_GPR32, MCK_goto, MCK_BrTarget }, },
1219 { 36 /* if */, BPF::JULT_ri_32, Convert__Reg1_1__Imm1_3__BrTarget1_5, AMFBS_None, { MCK_if, MCK_GPR32, MCK__LT_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1220 { 36 /* if */, BPF::JUGT_rr_32, Convert__Reg1_1__Reg1_3__BrTarget1_5, AMFBS_None, { MCK_if, MCK_GPR32, MCK__GT_, MCK_GPR32, MCK_goto, MCK_BrTarget }, },
1221 { 36 /* if */, BPF::JUGT_ri_32, Convert__Reg1_1__Imm1_3__BrTarget1_5, AMFBS_None, { MCK_if, MCK_GPR32, MCK__GT_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1222 { 36 /* if */, BPF::JNE_rr, Convert__Reg1_1__Reg1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR, MCK__EXCLAIM_, MCK__61_, MCK_GPR, MCK_goto, MCK_BrTarget }, },
1223 { 36 /* if */, BPF::JNE_ri, Convert__Reg1_1__Imm1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR, MCK__EXCLAIM_, MCK__61_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1224 { 36 /* if */, BPF::JULE_rr, Convert__Reg1_1__Reg1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR, MCK__LT_, MCK__61_, MCK_GPR, MCK_goto, MCK_BrTarget }, },
1225 { 36 /* if */, BPF::JULE_ri, Convert__Reg1_1__Imm1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR, MCK__LT_, MCK__61_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1226 { 36 /* if */, BPF::JEQ_rr, Convert__Reg1_1__Reg1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR, MCK__61_, MCK__61_, MCK_GPR, MCK_goto, MCK_BrTarget }, },
1227 { 36 /* if */, BPF::JEQ_ri, Convert__Reg1_1__Imm1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR, MCK__61_, MCK__61_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1228 { 36 /* if */, BPF::JUGE_rr, Convert__Reg1_1__Reg1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR, MCK__GT_, MCK__61_, MCK_GPR, MCK_goto, MCK_BrTarget }, },
1229 { 36 /* if */, BPF::JUGE_ri, Convert__Reg1_1__Imm1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR, MCK__GT_, MCK__61_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1230 { 36 /* if */, BPF::JSLT_rr, Convert__Reg1_1__Reg1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR, MCK_s, MCK__LT_, MCK_GPR, MCK_goto, MCK_BrTarget }, },
1231 { 36 /* if */, BPF::JSLT_ri, Convert__Reg1_1__Imm1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR, MCK_s, MCK__LT_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1232 { 36 /* if */, BPF::JSGT_rr, Convert__Reg1_1__Reg1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR, MCK_s, MCK__GT_, MCK_GPR, MCK_goto, MCK_BrTarget }, },
1233 { 36 /* if */, BPF::JSGT_ri, Convert__Reg1_1__Imm1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR, MCK_s, MCK__GT_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1234 { 36 /* if */, BPF::JNE_rr_32, Convert__Reg1_1__Reg1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR32, MCK__EXCLAIM_, MCK__61_, MCK_GPR32, MCK_goto, MCK_BrTarget }, },
1235 { 36 /* if */, BPF::JNE_ri_32, Convert__Reg1_1__Imm1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR32, MCK__EXCLAIM_, MCK__61_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1236 { 36 /* if */, BPF::JULE_rr_32, Convert__Reg1_1__Reg1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR32, MCK__LT_, MCK__61_, MCK_GPR32, MCK_goto, MCK_BrTarget }, },
1237 { 36 /* if */, BPF::JULE_ri_32, Convert__Reg1_1__Imm1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR32, MCK__LT_, MCK__61_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1238 { 36 /* if */, BPF::JEQ_rr_32, Convert__Reg1_1__Reg1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR32, MCK__61_, MCK__61_, MCK_GPR32, MCK_goto, MCK_BrTarget }, },
1239 { 36 /* if */, BPF::JEQ_ri_32, Convert__Reg1_1__Imm1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR32, MCK__61_, MCK__61_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1240 { 36 /* if */, BPF::JUGE_rr_32, Convert__Reg1_1__Reg1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR32, MCK__GT_, MCK__61_, MCK_GPR32, MCK_goto, MCK_BrTarget }, },
1241 { 36 /* if */, BPF::JUGE_ri_32, Convert__Reg1_1__Imm1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR32, MCK__GT_, MCK__61_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1242 { 36 /* if */, BPF::JSLT_rr_32, Convert__Reg1_1__Reg1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR32, MCK_s, MCK__LT_, MCK_GPR32, MCK_goto, MCK_BrTarget }, },
1243 { 36 /* if */, BPF::JSLT_ri_32, Convert__Reg1_1__Imm1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR32, MCK_s, MCK__LT_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1244 { 36 /* if */, BPF::JSGT_rr_32, Convert__Reg1_1__Reg1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR32, MCK_s, MCK__GT_, MCK_GPR32, MCK_goto, MCK_BrTarget }, },
1245 { 36 /* if */, BPF::JSGT_ri_32, Convert__Reg1_1__Imm1_4__BrTarget1_6, AMFBS_None, { MCK_if, MCK_GPR32, MCK_s, MCK__GT_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1246 { 36 /* if */, BPF::JSLE_rr, Convert__Reg1_1__Reg1_5__BrTarget1_7, AMFBS_None, { MCK_if, MCK_GPR, MCK_s, MCK__LT_, MCK__61_, MCK_GPR, MCK_goto, MCK_BrTarget }, },
1247 { 36 /* if */, BPF::JSLE_ri, Convert__Reg1_1__Imm1_5__BrTarget1_7, AMFBS_None, { MCK_if, MCK_GPR, MCK_s, MCK__LT_, MCK__61_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1248 { 36 /* if */, BPF::JSGE_rr, Convert__Reg1_1__Reg1_5__BrTarget1_7, AMFBS_None, { MCK_if, MCK_GPR, MCK_s, MCK__GT_, MCK__61_, MCK_GPR, MCK_goto, MCK_BrTarget }, },
1249 { 36 /* if */, BPF::JSGE_ri, Convert__Reg1_1__Imm1_5__BrTarget1_7, AMFBS_None, { MCK_if, MCK_GPR, MCK_s, MCK__GT_, MCK__61_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1250 { 36 /* if */, BPF::JSLE_rr_32, Convert__Reg1_1__Reg1_5__BrTarget1_7, AMFBS_None, { MCK_if, MCK_GPR32, MCK_s, MCK__LT_, MCK__61_, MCK_GPR32, MCK_goto, MCK_BrTarget }, },
1251 { 36 /* if */, BPF::JSLE_ri_32, Convert__Reg1_1__Imm1_5__BrTarget1_7, AMFBS_None, { MCK_if, MCK_GPR32, MCK_s, MCK__LT_, MCK__61_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1252 { 36 /* if */, BPF::JSGE_rr_32, Convert__Reg1_1__Reg1_5__BrTarget1_7, AMFBS_None, { MCK_if, MCK_GPR32, MCK_s, MCK__GT_, MCK__61_, MCK_GPR32, MCK_goto, MCK_BrTarget }, },
1253 { 36 /* if */, BPF::JSGE_ri_32, Convert__Reg1_1__Imm1_5__BrTarget1_7, AMFBS_None, { MCK_if, MCK_GPR32, MCK_s, MCK__GT_, MCK__61_, MCK_Imm, MCK_goto, MCK_BrTarget }, },
1254 { 39 /* ld_pseudo */, BPF::LD_pseudo, Convert__Reg1_1__Imm1_2__Imm1_3, AMFBS_None, { MCK_ld_95_pseudo, MCK_GPR, MCK_Imm, MCK_Imm }, },
1255 { 49 /* lea */, BPF::FI_ri, Convert__Reg1_1__Reg1_2__SImm161_3, AMFBS_None, { MCK_lea, MCK_GPR, MCK_GPR, MCK_SImm16 }, },
1256 { 53 /* load_stack_arg */, BPF::LOAD_STACK_ARG_PSEUDO, Convert__Reg1_1__SImm161_2, AMFBS_None, { MCK_load_95_stack_95_arg, MCK_GPR, MCK_SImm16 }, },
1257 { 68 /* lock */, BPF::XANDW32, Convert__Reg1_12__Reg1_7__SImm161_8__Tie0_12_12, AMFBS_None, { MCK_lock, MCK__STAR_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__38_, MCK__61_, MCK_GPR32 }, },
1258 { 68 /* lock */, BPF::XADDW, Convert__Reg1_12__Reg1_7__SImm161_8__Tie0_12_12, AMFBS_None, { MCK_lock, MCK__STAR_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__43_, MCK__61_, MCK_GPR }, },
1259 { 68 /* lock */, BPF::XADDW32, Convert__Reg1_12__Reg1_7__SImm161_8__Tie0_12_12, AMFBS_None, { MCK_lock, MCK__STAR_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__43_, MCK__61_, MCK_GPR32 }, },
1260 { 68 /* lock */, BPF::XXORW32, Convert__Reg1_12__Reg1_7__SImm161_8__Tie0_12_12, AMFBS_None, { MCK_lock, MCK__STAR_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__94_, MCK__61_, MCK_GPR32 }, },
1261 { 68 /* lock */, BPF::XORW32, Convert__Reg1_12__Reg1_7__SImm161_8__Tie0_12_12, AMFBS_None, { MCK_lock, MCK__STAR_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__124_, MCK__61_, MCK_GPR32 }, },
1262 { 68 /* lock */, BPF::XANDD, Convert__Reg1_12__Reg1_7__SImm161_8__Tie0_12_12, AMFBS_None, { MCK_lock, MCK__STAR_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__38_, MCK__61_, MCK_GPR }, },
1263 { 68 /* lock */, BPF::XADDD, Convert__Reg1_12__Reg1_7__SImm161_8__Tie0_12_12, AMFBS_None, { MCK_lock, MCK__STAR_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__43_, MCK__61_, MCK_GPR }, },
1264 { 68 /* lock */, BPF::XXORD, Convert__Reg1_12__Reg1_7__SImm161_8__Tie0_12_12, AMFBS_None, { MCK_lock, MCK__STAR_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__94_, MCK__61_, MCK_GPR }, },
1265 { 68 /* lock */, BPF::XORD, Convert__Reg1_12__Reg1_7__SImm161_8__Tie0_12_12, AMFBS_None, { MCK_lock, MCK__STAR_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK__124_, MCK__61_, MCK_GPR }, },
1266 { 73 /* may_goto */, BPF::JCOND, Convert__BrTarget1_1, AMFBS_None, { MCK_may_95_goto, MCK_BrTarget }, },
1267 { 82 /* r0 */, BPF::CMPXCHGD, Convert__Reg1_4__SImm161_5__Reg1_7, AMFBS_None, { MCK_R0, MCK__61_, MCK_cmpxchg_95_64, MCK__40_, MCK_GPR, MCK_SImm16, MCK_R0, MCK_GPR, MCK__41_ }, },
1268 { 82 /* r0 */, BPF::LD_IND_H, Convert__Reg1_9, AMFBS_None, { MCK_R0, MCK__61_, MCK__STAR_, MCK__40_, MCK_u16, MCK__STAR_, MCK__41_, MCK_skb, MCK__91_, MCK_GPR, MCK__93_ }, },
1269 { 82 /* r0 */, BPF::LD_ABS_H, Convert__Imm1_9, AMFBS_None, { MCK_R0, MCK__61_, MCK__STAR_, MCK__40_, MCK_u16, MCK__STAR_, MCK__41_, MCK_skb, MCK__91_, MCK_Imm, MCK__93_ }, },
1270 { 82 /* r0 */, BPF::LD_IND_W, Convert__Reg1_9, AMFBS_None, { MCK_R0, MCK__61_, MCK__STAR_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK_skb, MCK__91_, MCK_GPR, MCK__93_ }, },
1271 { 82 /* r0 */, BPF::LD_ABS_W, Convert__Imm1_9, AMFBS_None, { MCK_R0, MCK__61_, MCK__STAR_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK_skb, MCK__91_, MCK_Imm, MCK__93_ }, },
1272 { 82 /* r0 */, BPF::LD_IND_B, Convert__Reg1_9, AMFBS_None, { MCK_R0, MCK__61_, MCK__STAR_, MCK__40_, MCK_u8, MCK__STAR_, MCK__41_, MCK_skb, MCK__91_, MCK_GPR, MCK__93_ }, },
1273 { 82 /* r0 */, BPF::LD_ABS_B, Convert__Imm1_9, AMFBS_None, { MCK_R0, MCK__61_, MCK__STAR_, MCK__40_, MCK_u8, MCK__STAR_, MCK__41_, MCK_skb, MCK__91_, MCK_Imm, MCK__93_ }, },
1274 { 85 /* store_release */, BPF::STHREL32, Convert__Reg1_10__Reg1_7__SImm161_8, AMFBS_None, { MCK_store_95_release, MCK__40_, MCK__40_, MCK_u16, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK_GPR32, MCK__41_ }, },
1275 { 85 /* store_release */, BPF::STWREL32, Convert__Reg1_10__Reg1_7__SImm161_8, AMFBS_None, { MCK_store_95_release, MCK__40_, MCK__40_, MCK_u32, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK_GPR32, MCK__41_ }, },
1276 { 85 /* store_release */, BPF::STDREL, Convert__Reg1_10__Reg1_7__SImm161_8, AMFBS_None, { MCK_store_95_release, MCK__40_, MCK__40_, MCK_u64, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK_GPR, MCK__41_ }, },
1277 { 85 /* store_release */, BPF::STBREL32, Convert__Reg1_10__Reg1_7__SImm161_8, AMFBS_None, { MCK_store_95_release, MCK__40_, MCK__40_, MCK_u8, MCK__STAR_, MCK__41_, MCK__40_, MCK_GPR, MCK_SImm16, MCK__41_, MCK_GPR32, MCK__41_ }, },
1278 { 99 /* store_stack_arg */, BPF::STORE_STACK_ARG_PSEUDO, Convert__SImm161_1__Reg1_2, AMFBS_None, { MCK_store_95_stack_95_arg, MCK_SImm16, MCK_GPR }, },
1279 { 115 /* store_stack_arg_imm */, BPF::STORE_STACK_ARG_IMM_PSEUDO, Convert__SImm161_1__Imm1_2, AMFBS_None, { MCK_store_95_stack_95_arg_95_imm, MCK_SImm16, MCK_Imm }, },
1280 { 135 /* w0 */, BPF::CMPXCHGW32, Convert__Reg1_4__SImm161_5__Reg1_7, AMFBS_None, { MCK_W0, MCK__61_, MCK_cmpxchg32_95_32, MCK__40_, MCK_GPR, MCK_SImm16, MCK_W0, MCK_GPR32, MCK__41_ }, },
1281};
1282
1283#include "llvm/Support/Debug.h"
1284#include "llvm/Support/Format.h"
1285
1286unsigned BPFAsmParser::
1287MatchInstructionImpl(const OperandVector &Operands,
1288 MCInst &Inst,
1289 uint64_t &ErrorInfo,
1290 FeatureBitset &MissingFeatures,
1291 bool matchingInlineAsm, unsigned VariantID) {
1292 // Eliminate obvious mismatches.
1293 if (Operands.size() > 14) {
1294 ErrorInfo = 14;
1295 return Match_InvalidOperand;
1296 }
1297
1298 // Get the current feature set.
1299 const FeatureBitset &AvailableFeatures = getAvailableFeatures();
1300
1301 // Get the instruction mnemonic, which is the first token.
1302 StringRef Mnemonic;
1303 if (Operands[0]->isToken())
1304 Mnemonic = ((BPFOperand &)*Operands[0]).getToken();
1305
1306 // Some state to try to produce better error messages.
1307 bool HadMatchOtherThanFeatures = false;
1308 bool HadMatchOtherThanPredicate = false;
1309 unsigned RetCode = Match_InvalidOperand;
1310 MissingFeatures.set();
1311 // Set ErrorInfo to the operand that mismatches if it is
1312 // wrong for all instances of the instruction.
1313 ErrorInfo = ~0ULL;
1314 // Find the appropriate table for this asm variant.
1315 const MatchEntry *Start, *End;
1316 switch (VariantID) {
1317 default: llvm_unreachable("invalid variant!");
1318 case 0: Start = std::begin(MatchTable0); End = std::end(MatchTable0); break;
1319 }
1320 // Search the table.
1321 auto MnemonicRange = std::pair(Start, End);
1322 unsigned SIndex = Mnemonic.empty() ? 0 : 1;
1323 if (!Mnemonic.empty())
1324 MnemonicRange = std::equal_range(Start, End, Mnemonic.lower(), LessOpcode());
1325
1326 DEBUG_WITH_TYPE("asm-matcher", dbgs() << "AsmMatcher: found " <<
1327 std::distance(MnemonicRange.first, MnemonicRange.second) <<
1328 " encodings with mnemonic '" << Mnemonic << "'\n");
1329
1330 // Return a more specific error code if no mnemonics match.
1331 if (MnemonicRange.first == MnemonicRange.second)
1332 return Match_MnemonicFail;
1333
1334 for (const MatchEntry *it = MnemonicRange.first, *ie = MnemonicRange.second;
1335 it != ie; ++it) {
1336 const FeatureBitset &RequiredFeatures = FeatureBitsets[it->RequiredFeaturesIdx];
1337 bool HasRequiredFeatures =
1338 (AvailableFeatures & RequiredFeatures) == RequiredFeatures;
1339 DEBUG_WITH_TYPE("asm-matcher", dbgs() << "Trying to match opcode "
1340 << MII.getName(it->Opcode) << "\n");
1341 bool OperandsValid = true;
1342 for (unsigned FormalIdx = SIndex, ActualIdx = SIndex; FormalIdx != 14; ++FormalIdx) {
1343 auto Formal = static_cast<MatchClassKind>(it->Classes[FormalIdx]);
1344 DEBUG_WITH_TYPE("asm-matcher",
1345 dbgs() << " Matching formal operand class " << getMatchClassName(Formal)
1346 << " against actual operand at index " << ActualIdx);
1347 if (ActualIdx < Operands.size())
1348 DEBUG_WITH_TYPE("asm-matcher", dbgs() << " (";
1349 Operands[ActualIdx]->print(dbgs(), getContext().getAsmInfo()); dbgs() << "): ");
1350 else
1351 DEBUG_WITH_TYPE("asm-matcher", dbgs() << ": ");
1352 if (ActualIdx >= Operands.size()) {
1353 DEBUG_WITH_TYPE("asm-matcher", dbgs() << "actual operand index out of range\n");
1354 if (Formal == InvalidMatchClass) {
1355 break;
1356 }
1357 if (isSubclass(Formal, OptionalMatchClass)) {
1358 continue;
1359 }
1360 OperandsValid = false;
1361 ErrorInfo = ActualIdx;
1362 break;
1363 }
1364 MCParsedAsmOperand &Actual = *Operands[ActualIdx];
1365 unsigned Diag = validateOperandClass(Actual, Formal, *STI);
1366 if (Diag == Match_Success) {
1367 DEBUG_WITH_TYPE("asm-matcher",
1368 dbgs() << "match success using generic matcher\n");
1369 ++ActualIdx;
1370 continue;
1371 }
1372 // If the generic handler indicates an invalid operand
1373 // failure, check for a special case.
1374 if (Diag != Match_Success) {
1375 unsigned TargetDiag = validateTargetOperandClass(Actual, Formal);
1376 if (TargetDiag == Match_Success) {
1377 DEBUG_WITH_TYPE("asm-matcher",
1378 dbgs() << "match success using target matcher\n");
1379 ++ActualIdx;
1380 continue;
1381 }
1382 // If the target matcher returned a specific error code use
1383 // that, else use the one from the generic matcher.
1384 if (TargetDiag != Match_InvalidOperand && HasRequiredFeatures)
1385 Diag = TargetDiag;
1386 }
1387 // If current formal operand wasn't matched and it is optional
1388 // then try to match next formal operand
1389 if (Diag == Match_InvalidOperand && isSubclass(Formal, OptionalMatchClass)) {
1390 DEBUG_WITH_TYPE("asm-matcher", dbgs() << "ignoring optional operand\n");
1391 continue;
1392 }
1393 // If this operand is broken for all of the instances of this
1394 // mnemonic, keep track of it so we can report loc info.
1395 // If we already had a match that only failed due to a
1396 // target predicate, that diagnostic is preferred.
1397 if (!HadMatchOtherThanPredicate &&
1398 (it == MnemonicRange.first || ErrorInfo <= ActualIdx)) {
1399 if (HasRequiredFeatures && (ErrorInfo != ActualIdx || Diag != Match_InvalidOperand))
1400 RetCode = Diag;
1401 ErrorInfo = ActualIdx;
1402 }
1403 // Otherwise, just reject this instance of the mnemonic.
1404 OperandsValid = false;
1405 break;
1406 }
1407
1408 if (!OperandsValid) {
1409 DEBUG_WITH_TYPE("asm-matcher", dbgs() << "Opcode result: multiple "
1410 "operand mismatches, ignoring "
1411 "this opcode\n");
1412 continue;
1413 }
1414 if (!HasRequiredFeatures) {
1415 HadMatchOtherThanFeatures = true;
1416 FeatureBitset NewMissingFeatures = RequiredFeatures & ~AvailableFeatures;
1417 DEBUG_WITH_TYPE("asm-matcher", dbgs() << "Missing target features:";
1418 for (unsigned I = 0, E = NewMissingFeatures.size(); I != E; ++I)
1419 if (NewMissingFeatures[I])
1420 dbgs() << ' ' << I;
1421 dbgs() << "\n");
1422 if (NewMissingFeatures.count() <=
1423 MissingFeatures.count())
1424 MissingFeatures = NewMissingFeatures;
1425 continue;
1426 }
1427
1428 Inst.clear();
1429
1430 Inst.setOpcode(it->Opcode);
1431 // We have a potential match but have not rendered the operands.
1432 // Check the target predicate to handle any context sensitive
1433 // constraints.
1434 // For example, Ties that are referenced multiple times must be
1435 // checked here to ensure the input is the same for each match
1436 // constraints. If we leave it any later the ties will have been
1437 // canonicalized
1438 unsigned MatchResult;
1439 if ((MatchResult = checkEarlyTargetMatchPredicate(Inst, Operands)) != Match_Success) {
1440 Inst.clear();
1441 DEBUG_WITH_TYPE(
1442 "asm-matcher",
1443 dbgs() << "Early target match predicate failed with diag code "
1444 << MatchResult << "\n");
1445 RetCode = MatchResult;
1446 HadMatchOtherThanPredicate = true;
1447 continue;
1448 }
1449
1450 if (matchingInlineAsm) {
1451 convertToMapAndConstraints(it->ConvertFn, Operands);
1452 if (!checkAsmTiedOperandConstraints(*this, it->ConvertFn, Operands,
1453 ErrorInfo))
1454 return Match_InvalidTiedOperand;
1455
1456 return Match_Success;
1457 }
1458
1459 // We have selected a definite instruction, convert the parsed
1460 // operands into the appropriate MCInst.
1461 convertToMCInst(it->ConvertFn, Inst, it->Opcode, Operands);
1462
1463 // We have a potential match. Check the target predicate to
1464 // handle any context sensitive constraints.
1465 if ((MatchResult = checkTargetMatchPredicate(Inst)) != Match_Success) {
1466 DEBUG_WITH_TYPE("asm-matcher",
1467 dbgs() << "Target match predicate failed with diag code "
1468 << MatchResult << "\n");
1469 Inst.clear();
1470 RetCode = MatchResult;
1471 HadMatchOtherThanPredicate = true;
1472 continue;
1473 }
1474
1475 if (!checkAsmTiedOperandConstraints(*this, it->ConvertFn, Operands,
1476 ErrorInfo))
1477 return Match_InvalidTiedOperand;
1478
1479 DEBUG_WITH_TYPE(
1480 "asm-matcher",
1481 dbgs() << "Opcode result: complete match, selecting this opcode\n");
1482 return Match_Success;
1483 }
1484
1485 // Okay, we had no match. Try to return a useful error code.
1486 if (HadMatchOtherThanPredicate || !HadMatchOtherThanFeatures)
1487 return RetCode;
1488
1489 ErrorInfo = 0;
1490 return Match_MissingFeature;
1491}
1492
1493#endif // GET_MATCHER_IMPLEMENTATION
1494
1495
1496#ifdef GET_MNEMONIC_SPELL_CHECKER
1497#undef GET_MNEMONIC_SPELL_CHECKER
1498
1499static std::string BPFMnemonicSpellCheck(StringRef S, const FeatureBitset &FBS, unsigned VariantID) {
1500 const unsigned MaxEditDist = 2;
1501 std::vector<StringRef> Candidates;
1502 StringRef Prev = "";
1503
1504 // Find the appropriate table for this asm variant.
1505 const MatchEntry *Start, *End;
1506 switch (VariantID) {
1507 default: llvm_unreachable("invalid variant!");
1508 case 0: Start = std::begin(MatchTable0); End = std::end(MatchTable0); break;
1509 }
1510
1511 for (auto I = Start; I < End; I++) {
1512 // Ignore unsupported instructions.
1513 const FeatureBitset &RequiredFeatures = FeatureBitsets[I->RequiredFeaturesIdx];
1514 if ((FBS & RequiredFeatures) != RequiredFeatures)
1515 continue;
1516
1517 StringRef T = I->getMnemonic();
1518 // Avoid recomputing the edit distance for the same string.
1519 if (T == Prev)
1520 continue;
1521
1522 Prev = T;
1523 unsigned Dist = S.edit_distance(T, false, MaxEditDist);
1524 if (Dist <= MaxEditDist)
1525 Candidates.push_back(T);
1526 }
1527
1528 if (Candidates.empty())
1529 return "";
1530
1531 std::string Res = ", did you mean: ";
1532 unsigned i = 0;
1533 for (; i < Candidates.size() - 1; i++)
1534 Res += Candidates[i].str() + ", ";
1535 return Res + Candidates[i].str() + "?";
1536}
1537
1538#endif // GET_MNEMONIC_SPELL_CHECKER
1539
1540
1541#ifdef GET_MNEMONIC_CHECKER
1542#undef GET_MNEMONIC_CHECKER
1543
1544static bool BPFCheckMnemonic(StringRef Mnemonic,
1545 const FeatureBitset &AvailableFeatures,
1546 unsigned VariantID) {
1547 // Find the appropriate table for this asm variant.
1548 const MatchEntry *Start, *End;
1549 switch (VariantID) {
1550 default: llvm_unreachable("invalid variant!");
1551 case 0: Start = std::begin(MatchTable0); End = std::end(MatchTable0); break;
1552 }
1553
1554 // Search the table.
1555 auto MnemonicRange = std::pair(Start, End);
1556 unsigned SIndex = Mnemonic.empty() ? 0 : 1;
1557 if (!Mnemonic.empty())
1558 MnemonicRange = std::equal_range(Start, End, Mnemonic.lower(), LessOpcode());
1559
1560 if (MnemonicRange.first == MnemonicRange.second)
1561 return false;
1562
1563 for (const MatchEntry *it = MnemonicRange.first, *ie = MnemonicRange.second;
1564 it != ie; ++it) {
1565 const FeatureBitset &RequiredFeatures =
1566 FeatureBitsets[it->RequiredFeaturesIdx];
1567 if ((AvailableFeatures & RequiredFeatures) == RequiredFeatures)
1568 return true;
1569 }
1570 return false;
1571}
1572
1573#endif // GET_MNEMONIC_CHECKER
1574
1575