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_14270'
447 NumMatchClassKinds
448};
449
450} // end anonymous namespace
451
452static unsigned getDiagKindFromRegisterClass(MatchClassKind RegisterClass) {
453 return MCTargetAsmParser::Match_InvalidOperand;
454}
455
456[[maybe_unused]] static const MCRegisterClass *getRegClassFromMatchKind(MatchClassKind Kind) {
457 switch (Kind) {
458 case MCK_GPR:
459 return &getBPFMCRegisterClass(BPF::GPRRegClassID);
460 case MCK_GPR32:
461 return &getBPFMCRegisterClass(BPF::GPR32RegClassID);
462 default:
463 return nullptr;
464 }
465}
466
467static MatchClassKind matchTokenString(StringRef Name) {
468 switch (Name.size()) {
469 default: break;
470 case 1: // 17 strings to match.
471 switch (Name[0]) {
472 default: break;
473 case '!': // 1 string to match.
474 return MCK__EXCLAIM_; // "!"
475 case '%': // 1 string to match.
476 return MCK__PCT_; // "%"
477 case '&': // 1 string to match.
478 return MCK__38_; // "&"
479 case '(': // 1 string to match.
480 return MCK__40_; // "("
481 case ')': // 1 string to match.
482 return MCK__41_; // ")"
483 case '*': // 1 string to match.
484 return MCK__STAR_; // "*"
485 case '+': // 1 string to match.
486 return MCK__43_; // "+"
487 case '-': // 1 string to match.
488 return MCK__MINUS_; // "-"
489 case '/': // 1 string to match.
490 return MCK__47_; // "/"
491 case '<': // 1 string to match.
492 return MCK__LT_; // "<"
493 case '=': // 1 string to match.
494 return MCK__61_; // "="
495 case '>': // 1 string to match.
496 return MCK__GT_; // ">"
497 case '[': // 1 string to match.
498 return MCK__91_; // "["
499 case ']': // 1 string to match.
500 return MCK__93_; // "]"
501 case '^': // 1 string to match.
502 return MCK__94_; // "^"
503 case 's': // 1 string to match.
504 return MCK_s; // "s"
505 case '|': // 1 string to match.
506 return MCK__124_; // "|"
507 }
508 break;
509 case 2: // 4 strings to match.
510 switch (Name[0]) {
511 default: break;
512 case 'i': // 1 string to match.
513 if (Name[1] != 'f')
514 break;
515 return MCK_if; // "if"
516 case 'l': // 1 string to match.
517 if (Name[1] != 'l')
518 break;
519 return MCK_ll; // "ll"
520 case 's': // 1 string to match.
521 if (Name[1] != '8')
522 break;
523 return MCK_s8; // "s8"
524 case 'u': // 1 string to match.
525 if (Name[1] != '8')
526 break;
527 return MCK_u8; // "u8"
528 }
529 break;
530 case 3: // 7 strings to match.
531 switch (Name[0]) {
532 default: break;
533 case 'l': // 1 string to match.
534 if (memcmp(Name.data()+1, "ea", 2) != 0)
535 break;
536 return MCK_lea; // "lea"
537 case 's': // 3 strings to match.
538 switch (Name[1]) {
539 default: break;
540 case '1': // 1 string to match.
541 if (Name[2] != '6')
542 break;
543 return MCK_s16; // "s16"
544 case '3': // 1 string to match.
545 if (Name[2] != '2')
546 break;
547 return MCK_s32; // "s32"
548 case 'k': // 1 string to match.
549 if (Name[2] != 'b')
550 break;
551 return MCK_skb; // "skb"
552 }
553 break;
554 case 'u': // 3 strings to match.
555 switch (Name[1]) {
556 default: break;
557 case '1': // 1 string to match.
558 if (Name[2] != '6')
559 break;
560 return MCK_u16; // "u16"
561 case '3': // 1 string to match.
562 if (Name[2] != '2')
563 break;
564 return MCK_u32; // "u32"
565 case '6': // 1 string to match.
566 if (Name[2] != '4')
567 break;
568 return MCK_u64; // "u64"
569 }
570 break;
571 }
572 break;
573 case 4: // 10 strings to match.
574 switch (Name[0]) {
575 default: break;
576 case 'b': // 3 strings to match.
577 if (Name[1] != 'e')
578 break;
579 switch (Name[2]) {
580 default: break;
581 case '1': // 1 string to match.
582 if (Name[3] != '6')
583 break;
584 return MCK_be16; // "be16"
585 case '3': // 1 string to match.
586 if (Name[3] != '2')
587 break;
588 return MCK_be32; // "be32"
589 case '6': // 1 string to match.
590 if (Name[3] != '4')
591 break;
592 return MCK_be64; // "be64"
593 }
594 break;
595 case 'c': // 1 string to match.
596 if (memcmp(Name.data()+1, "all", 3) != 0)
597 break;
598 return MCK_call; // "call"
599 case 'e': // 1 string to match.
600 if (memcmp(Name.data()+1, "xit", 3) != 0)
601 break;
602 return MCK_exit; // "exit"
603 case 'g': // 1 string to match.
604 if (memcmp(Name.data()+1, "oto", 3) != 0)
605 break;
606 return MCK_goto; // "goto"
607 case 'l': // 4 strings to match.
608 switch (Name[1]) {
609 default: break;
610 case 'e': // 3 strings to match.
611 switch (Name[2]) {
612 default: break;
613 case '1': // 1 string to match.
614 if (Name[3] != '6')
615 break;
616 return MCK_le16; // "le16"
617 case '3': // 1 string to match.
618 if (Name[3] != '2')
619 break;
620 return MCK_le32; // "le32"
621 case '6': // 1 string to match.
622 if (Name[3] != '4')
623 break;
624 return MCK_le64; // "le64"
625 }
626 break;
627 case 'o': // 1 string to match.
628 if (memcmp(Name.data()+2, "ck", 2) != 0)
629 break;
630 return MCK_lock; // "lock"
631 }
632 break;
633 }
634 break;
635 case 5: // 3 strings to match.
636 switch (Name[0]) {
637 default: break;
638 case 'c': // 1 string to match.
639 if (memcmp(Name.data()+1, "allx", 4) != 0)
640 break;
641 return MCK_callx; // "callx"
642 case 'g': // 2 strings to match.
643 if (memcmp(Name.data()+1, "oto", 3) != 0)
644 break;
645 switch (Name[4]) {
646 default: break;
647 case 'l': // 1 string to match.
648 return MCK_gotol; // "gotol"
649 case 'x': // 1 string to match.
650 return MCK_gotox; // "gotox"
651 }
652 break;
653 }
654 break;
655 case 7: // 4 strings to match.
656 switch (Name[0]) {
657 default: break;
658 case 'b': // 3 strings to match.
659 if (memcmp(Name.data()+1, "swap", 4) != 0)
660 break;
661 switch (Name[5]) {
662 default: break;
663 case '1': // 1 string to match.
664 if (Name[6] != '6')
665 break;
666 return MCK_bswap16; // "bswap16"
667 case '3': // 1 string to match.
668 if (Name[6] != '2')
669 break;
670 return MCK_bswap32; // "bswap32"
671 case '6': // 1 string to match.
672 if (Name[6] != '4')
673 break;
674 return MCK_bswap64; // "bswap64"
675 }
676 break;
677 case 'x': // 1 string to match.
678 if (memcmp(Name.data()+1, "chg_64", 6) != 0)
679 break;
680 return MCK_xchg_95_64; // "xchg_64"
681 }
682 break;
683 case 8: // 1 string to match.
684 if (memcmp(Name.data()+0, "may_goto", 8) != 0)
685 break;
686 return MCK_may_95_goto; // "may_goto"
687 case 9: // 2 strings to match.
688 switch (Name[0]) {
689 default: break;
690 case 'l': // 1 string to match.
691 if (memcmp(Name.data()+1, "d_pseudo", 8) != 0)
692 break;
693 return MCK_ld_95_pseudo; // "ld_pseudo"
694 case 'x': // 1 string to match.
695 if (memcmp(Name.data()+1, "chg32_32", 8) != 0)
696 break;
697 return MCK_xchg32_95_32; // "xchg32_32"
698 }
699 break;
700 case 10: // 1 string to match.
701 if (memcmp(Name.data()+0, "cmpxchg_64", 10) != 0)
702 break;
703 return MCK_cmpxchg_95_64; // "cmpxchg_64"
704 case 12: // 2 strings to match.
705 switch (Name[0]) {
706 default: break;
707 case 'c': // 1 string to match.
708 if (memcmp(Name.data()+1, "mpxchg32_32", 11) != 0)
709 break;
710 return MCK_cmpxchg32_95_32; // "cmpxchg32_32"
711 case 'l': // 1 string to match.
712 if (memcmp(Name.data()+1, "oad_acquire", 11) != 0)
713 break;
714 return MCK_load_95_acquire; // "load_acquire"
715 }
716 break;
717 case 13: // 1 string to match.
718 if (memcmp(Name.data()+0, "store_release", 13) != 0)
719 break;
720 return MCK_store_95_release; // "store_release"
721 case 14: // 1 string to match.
722 if (memcmp(Name.data()+0, "load_stack_arg", 14) != 0)
723 break;
724 return MCK_load_95_stack_95_arg; // "load_stack_arg"
725 case 15: // 3 strings to match.
726 switch (Name[0]) {
727 default: break;
728 case 'a': // 2 strings to match.
729 switch (Name[1]) {
730 default: break;
731 case 'd': // 1 string to match.
732 if (memcmp(Name.data()+2, "dr_space_cast", 13) != 0)
733 break;
734 return MCK_addr_95_space_95_cast; // "addr_space_cast"
735 case 't': // 1 string to match.
736 if (memcmp(Name.data()+2, "omic_fetch_or", 13) != 0)
737 break;
738 return MCK_atomic_95_fetch_95_or; // "atomic_fetch_or"
739 }
740 break;
741 case 's': // 1 string to match.
742 if (memcmp(Name.data()+1, "tore_stack_arg", 14) != 0)
743 break;
744 return MCK_store_95_stack_95_arg; // "store_stack_arg"
745 }
746 break;
747 case 16: // 3 strings to match.
748 if (memcmp(Name.data()+0, "atomic_fetch_", 13) != 0)
749 break;
750 switch (Name[13]) {
751 default: break;
752 case 'a': // 2 strings to match.
753 switch (Name[14]) {
754 default: break;
755 case 'd': // 1 string to match.
756 if (Name[15] != 'd')
757 break;
758 return MCK_atomic_95_fetch_95_add; // "atomic_fetch_add"
759 case 'n': // 1 string to match.
760 if (Name[15] != 'd')
761 break;
762 return MCK_atomic_95_fetch_95_and; // "atomic_fetch_and"
763 }
764 break;
765 case 'x': // 1 string to match.
766 if (memcmp(Name.data()+14, "or", 2) != 0)
767 break;
768 return MCK_atomic_95_fetch_95_xor; // "atomic_fetch_xor"
769 }
770 break;
771 case 19: // 1 string to match.
772 if (memcmp(Name.data()+0, "store_stack_arg_imm", 19) != 0)
773 break;
774 return MCK_store_95_stack_95_arg_95_imm; // "store_stack_arg_imm"
775 }
776 return InvalidMatchClass;
777}
778
779/// isSubclass - Compute whether \p A is a subclass of \p B.
780static bool isSubclass(MatchClassKind A, MatchClassKind B) {
781 if (A == B)
782 return true;
783
784 [[maybe_unused]] static constexpr struct {
785 uint32_t Offset;
786 uint16_t Start;
787 uint16_t Length;
788 } Table[] = {
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, 0, 0},
841 {0, 0, 0},
842 {0, 0, 0},
843 {0, 0, 0},
844 {0, 0, 0},
845 {0, 0, 0},
846 {0, 0, 0},
847 {0, 0, 0},
848 {0, 0, 0},
849 {0, 0, 0},
850 {0, 0, 0},
851 {0, 64, 1},
852 {1, 65, 1},
853 {2, 0, 0},
854 {2, 0, 0},
855 {2, 0, 0},
856 {2, 0, 0},
857 {2, 0, 0},
858 };
859
860 static constexpr uint8_t Data[] = {
861 0x03,
862 };
863
864 auto &Entry = Table[A];
865 unsigned Idx = B - Entry.Start;
866 if (Idx >= Entry.Length)
867 return false;
868 Idx += Entry.Offset;
869 return (Data[Idx / 8] >> (Idx % 8)) & 1;
870}
871
872static unsigned validateOperandClass(MCParsedAsmOperand &GOp, MatchClassKind Kind, const MCSubtargetInfo &STI) {
873 BPFOperand &Operand = (BPFOperand &)GOp;
874 if (Kind == InvalidMatchClass)
875 return MCTargetAsmParser::Match_InvalidOperand;
876
877 if (Kind <= MCK_LAST_TOKEN) {
878 if (Operand.isToken() &&
879 isSubclass(matchTokenString(Operand.getToken()), Kind))
880 return MCTargetAsmParser::Match_Success;
881 return MCTargetAsmParser::Match_InvalidOperand;
882 }
883
884 switch (Kind) {
885 default: break;
886 case MCK_Imm: {
887 DiagnosticPredicate DP(Operand.isImm());
888 if (DP.isMatch())
889 return MCTargetAsmParser::Match_Success;
890 break;
891 }
892 case MCK_SImm16: {
893 DiagnosticPredicate DP(Operand.isSImm16());
894 if (DP.isMatch())
895 return MCTargetAsmParser::Match_Success;
896 if (DP.isNearMatch())
897 return BPFAsmParser::Match_InvalidSImm16;
898 break;
899 }
900 case MCK_BrTarget: {
901 DiagnosticPredicate DP(Operand.isBrTarget());
902 if (DP.isMatch())
903 return MCTargetAsmParser::Match_Success;
904 if (DP.isNearMatch())
905 return BPFAsmParser::Match_InvalidBrTarget;
906 break;
907 }
908 } // end switch (Kind)
909
910 if (Operand.isReg()) {
911 static constexpr uint16_t Table[BPF::NUM_TARGET_REGS] = {
912 InvalidMatchClass,
913 MCK_R0,
914 MCK_GPR,
915 MCK_GPR,
916 MCK_GPR,
917 MCK_GPR,
918 MCK_GPR,
919 MCK_GPR,
920 MCK_GPR,
921 MCK_GPR,
922 MCK_GPR,
923 MCK_GPR,
924 MCK_GPR,
925 MCK_W0,
926 MCK_GPR32,
927 MCK_GPR32,
928 MCK_GPR32,
929 MCK_GPR32,
930 MCK_GPR32,
931 MCK_GPR32,
932 MCK_GPR32,
933 MCK_GPR32,
934 MCK_GPR32,
935 MCK_GPR32,
936 MCK_GPR32,
937 };
938
939 MCRegister Reg = Operand.getReg();
940 MatchClassKind OpKind = Reg.isPhysical() ? (MatchClassKind)Table[Reg.id()] : InvalidMatchClass;
941 return isSubclass(OpKind, Kind) ? (unsigned)MCTargetAsmParser::Match_Success :
942 getDiagKindFromRegisterClass(Kind);
943 }
944
945 if (Kind > MCK_LAST_TOKEN && Kind <= MCK_LAST_REGISTER)
946 return getDiagKindFromRegisterClass(Kind);
947
948 return MCTargetAsmParser::Match_InvalidOperand;
949}
950
951#ifndef NDEBUG
952const char *getMatchClassName(MatchClassKind Kind) {
953 switch (Kind) {
954 case InvalidMatchClass: return "InvalidMatchClass";
955 case OptionalMatchClass: return "OptionalMatchClass";
956 case MCK__EXCLAIM_: return "MCK__EXCLAIM_";
957 case MCK__PCT_: return "MCK__PCT_";
958 case MCK__38_: return "MCK__38_";
959 case MCK__40_: return "MCK__40_";
960 case MCK__41_: return "MCK__41_";
961 case MCK__STAR_: return "MCK__STAR_";
962 case MCK__43_: return "MCK__43_";
963 case MCK__MINUS_: return "MCK__MINUS_";
964 case MCK__47_: return "MCK__47_";
965 case MCK__LT_: return "MCK__LT_";
966 case MCK__61_: return "MCK__61_";
967 case MCK__GT_: return "MCK__GT_";
968 case MCK__91_: return "MCK__91_";
969 case MCK__93_: return "MCK__93_";
970 case MCK__94_: return "MCK__94_";
971 case MCK_addr_95_space_95_cast: return "MCK_addr_95_space_95_cast";
972 case MCK_atomic_95_fetch_95_add: return "MCK_atomic_95_fetch_95_add";
973 case MCK_atomic_95_fetch_95_and: return "MCK_atomic_95_fetch_95_and";
974 case MCK_atomic_95_fetch_95_or: return "MCK_atomic_95_fetch_95_or";
975 case MCK_atomic_95_fetch_95_xor: return "MCK_atomic_95_fetch_95_xor";
976 case MCK_be16: return "MCK_be16";
977 case MCK_be32: return "MCK_be32";
978 case MCK_be64: return "MCK_be64";
979 case MCK_bswap16: return "MCK_bswap16";
980 case MCK_bswap32: return "MCK_bswap32";
981 case MCK_bswap64: return "MCK_bswap64";
982 case MCK_call: return "MCK_call";
983 case MCK_callx: return "MCK_callx";
984 case MCK_cmpxchg32_95_32: return "MCK_cmpxchg32_95_32";
985 case MCK_cmpxchg_95_64: return "MCK_cmpxchg_95_64";
986 case MCK_exit: return "MCK_exit";
987 case MCK_goto: return "MCK_goto";
988 case MCK_gotol: return "MCK_gotol";
989 case MCK_gotox: return "MCK_gotox";
990 case MCK_if: return "MCK_if";
991 case MCK_ld_95_pseudo: return "MCK_ld_95_pseudo";
992 case MCK_le16: return "MCK_le16";
993 case MCK_le32: return "MCK_le32";
994 case MCK_le64: return "MCK_le64";
995 case MCK_lea: return "MCK_lea";
996 case MCK_ll: return "MCK_ll";
997 case MCK_load_95_acquire: return "MCK_load_95_acquire";
998 case MCK_load_95_stack_95_arg: return "MCK_load_95_stack_95_arg";
999 case MCK_lock: return "MCK_lock";
1000 case MCK_may_95_goto: return "MCK_may_95_goto";
1001 case MCK_s: return "MCK_s";
1002 case MCK_s16: return "MCK_s16";
1003 case MCK_s32: return "MCK_s32";
1004 case MCK_s8: return "MCK_s8";
1005 case MCK_skb: return "MCK_skb";
1006 case MCK_store_95_release: return "MCK_store_95_release";
1007 case MCK_store_95_stack_95_arg: return "MCK_store_95_stack_95_arg";
1008 case MCK_store_95_stack_95_arg_95_imm: return "MCK_store_95_stack_95_arg_95_imm";
1009 case MCK_u16: return "MCK_u16";
1010 case MCK_u32: return "MCK_u32";
1011 case MCK_u64: return "MCK_u64";
1012 case MCK_u8: return "MCK_u8";
1013 case MCK_xchg32_95_32: return "MCK_xchg32_95_32";
1014 case MCK_xchg_95_64: return "MCK_xchg_95_64";
1015 case MCK__124_: return "MCK__124_";
1016 case MCK_R0: return "MCK_R0";
1017 case MCK_W0: return "MCK_W0";
1018 case MCK_GPR: return "MCK_GPR";
1019 case MCK_GPR32: return "MCK_GPR32";
1020 case MCK_Imm: return "MCK_Imm";
1021 case MCK_SImm16: return "MCK_SImm16";
1022 case MCK_BrTarget: return "MCK_BrTarget";
1023 case NumMatchClassKinds: return "NumMatchClassKinds";
1024 }
1025 llvm_unreachable("unhandled MatchClassKind!");
1026}
1027
1028#endif // NDEBUG
1029FeatureBitset BPFAsmParser::
1030ComputeAvailableFeatures(const FeatureBitset &FB) const {
1031 FeatureBitset Features;
1032 return Features;
1033}
1034
1035static bool checkAsmTiedOperandConstraints(const BPFAsmParser&AsmParser,
1036 unsigned Kind, const OperandVector &Operands,
1037 uint64_t &ErrorInfo) {
1038 assert(Kind < CVT_NUM_SIGNATURES && "Invalid signature!");
1039 const uint8_t *Converter = ConversionTable[Kind];
1040 for (const uint8_t *p = Converter; *p; p += 2) {
1041 switch (*p) {
1042 case CVT_Tied: {
1043 unsigned OpIdx = *(p + 1);
1044 assert(OpIdx < (size_t)(std::end(TiedAsmOperandTable) -
1045 std::begin(TiedAsmOperandTable)) &&
1046 "Tied operand not found");
1047 unsigned OpndNum1 = TiedAsmOperandTable[OpIdx][1];
1048 unsigned OpndNum2 = TiedAsmOperandTable[OpIdx][2];
1049 if (OpndNum1 != OpndNum2) {
1050 auto &SrcOp1 = Operands[OpndNum1];
1051 auto &SrcOp2 = Operands[OpndNum2];
1052 if (!AsmParser.areEqualRegs(*SrcOp1, *SrcOp2)) {
1053 ErrorInfo = OpndNum2;
1054 return false;
1055 }
1056 }
1057 break;
1058 }
1059 default:
1060 break;
1061 }
1062 }
1063 return true;
1064}
1065
1066static const char MnemonicTable[] =
1067 "\000\001*\004call\005callx\004exit\004goto\005gotol\005gotox\002if\tld_"
1068 "pseudo\003lea\016load_stack_arg\004lock\010may_goto\002r0\015store_rele"
1069 "ase\017store_stack_arg\023store_stack_arg_imm\002w0";
1070
1071// Feature bitsets.
1072enum : uint8_t {
1073 AMFBS_None,
1074};
1075
1076static constexpr FeatureBitset FeatureBitsets[] = {
1077 {}, // AMFBS_None
1078};
1079
1080namespace {
1081 struct MatchEntry {
1082 uint8_t Mnemonic;
1083 uint32_t Opcode;
1084 uint8_t ConvertFn;
1085 uint8_t RequiredFeaturesIdx;
1086 uint8_t Classes[14];
1087 StringRef getMnemonic() const {
1088 return StringRef(MnemonicTable + Mnemonic + 1,
1089 MnemonicTable[Mnemonic]);
1090 }
1091 };
1092
1093 // Predicate for searching for an opcode.
1094 struct LessOpcode {
1095 bool operator()(const MatchEntry &LHS, StringRef RHS) {
1096 return LHS.getMnemonic() < RHS;
1097 }
1098 bool operator()(StringRef LHS, const MatchEntry &RHS) {
1099 return LHS < RHS.getMnemonic();
1100 }
1101 bool operator()(const MatchEntry &LHS, const MatchEntry &RHS) {
1102 return LHS.getMnemonic() < RHS.getMnemonic();
1103 }
1104 };
1105} // end anonymous namespace
1106
1107static const MatchEntry MatchTable0[] = {
1108 { 0 /* */, BPF::MOV_rr, Convert__Reg1_0__Reg1_2, AMFBS_None, { MCK_GPR, MCK__61_, MCK_GPR }, },
1109 { 0 /* */, BPF::MOV_ri, Convert__Reg1_0__Imm1_2, AMFBS_None, { MCK_GPR, MCK__61_, MCK_Imm }, },
1110 { 0 /* */, BPF::MOV_rr_32, Convert__Reg1_0__Reg1_2, AMFBS_None, { MCK_GPR32, MCK__61_, MCK_GPR32 }, },
1111 { 0 /* */, BPF::MOV_ri_32, Convert__Reg1_0__Imm1_2, AMFBS_None, { MCK_GPR32, MCK__61_, MCK_Imm }, },
1112 { 0 /* */, BPF::MOD_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__PCT_, MCK__61_, MCK_GPR }, },
1113 { 0 /* */, BPF::MOD_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__PCT_, MCK__61_, MCK_Imm }, },
1114 { 0 /* */, BPF::AND_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__38_, MCK__61_, MCK_GPR }, },
1115 { 0 /* */, BPF::AND_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__38_, MCK__61_, MCK_Imm }, },
1116 { 0 /* */, BPF::MUL_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__STAR_, MCK__61_, MCK_GPR }, },
1117 { 0 /* */, BPF::MUL_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__STAR_, MCK__61_, MCK_Imm }, },
1118 { 0 /* */, BPF::ADD_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__43_, MCK__61_, MCK_GPR }, },
1119 { 0 /* */, BPF::ADD_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__43_, MCK__61_, MCK_Imm }, },
1120 { 0 /* */, BPF::SUB_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__MINUS_, MCK__61_, MCK_GPR }, },
1121 { 0 /* */, BPF::SUB_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__MINUS_, MCK__61_, MCK_Imm }, },
1122 { 0 /* */, BPF::DIV_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__47_, MCK__61_, MCK_GPR }, },
1123 { 0 /* */, BPF::DIV_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__47_, MCK__61_, MCK_Imm }, },
1124 { 0 /* */, BPF::NEG_64, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK__MINUS_, MCK_GPR }, },
1125 { 0 /* */, BPF::BE16, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_be16, MCK_GPR }, },
1126 { 0 /* */, BPF::BE32, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_be32, MCK_GPR }, },
1127 { 0 /* */, BPF::BE64, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_be64, MCK_GPR }, },
1128 { 0 /* */, BPF::BSWAP16, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_bswap16, MCK_GPR }, },
1129 { 0 /* */, BPF::BSWAP32, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_bswap32, MCK_GPR }, },
1130 { 0 /* */, BPF::BSWAP64, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_bswap64, MCK_GPR }, },
1131 { 0 /* */, BPF::LE16, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_le16, MCK_GPR }, },
1132 { 0 /* */, BPF::LE32, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_le32, MCK_GPR }, },
1133 { 0 /* */, BPF::LE64, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR, MCK__61_, MCK_le64, MCK_GPR }, },
1134 { 0 /* */, BPF::LD_imm64, Convert__Reg1_0__Imm1_2, AMFBS_None, { MCK_GPR, MCK__61_, MCK_Imm, MCK_ll }, },
1135 { 0 /* */, BPF::XOR_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__94_, MCK__61_, MCK_GPR }, },
1136 { 0 /* */, BPF::XOR_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__94_, MCK__61_, MCK_Imm }, },
1137 { 0 /* */, BPF::OR_rr, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR, MCK__124_, MCK__61_, MCK_GPR }, },
1138 { 0 /* */, BPF::OR_ri, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR, MCK__124_, MCK__61_, MCK_Imm }, },
1139 { 0 /* */, BPF::MOD_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__PCT_, MCK__61_, MCK_GPR32 }, },
1140 { 0 /* */, BPF::MOD_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__PCT_, MCK__61_, MCK_Imm }, },
1141 { 0 /* */, BPF::AND_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__38_, MCK__61_, MCK_GPR32 }, },
1142 { 0 /* */, BPF::AND_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__38_, MCK__61_, MCK_Imm }, },
1143 { 0 /* */, BPF::MUL_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__STAR_, MCK__61_, MCK_GPR32 }, },
1144 { 0 /* */, BPF::MUL_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__STAR_, MCK__61_, MCK_Imm }, },
1145 { 0 /* */, BPF::ADD_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__43_, MCK__61_, MCK_GPR32 }, },
1146 { 0 /* */, BPF::ADD_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__43_, MCK__61_, MCK_Imm }, },
1147 { 0 /* */, BPF::SUB_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__MINUS_, MCK__61_, MCK_GPR32 }, },
1148 { 0 /* */, BPF::SUB_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__MINUS_, MCK__61_, MCK_Imm }, },
1149 { 0 /* */, BPF::DIV_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__47_, MCK__61_, MCK_GPR32 }, },
1150 { 0 /* */, BPF::DIV_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__47_, MCK__61_, MCK_Imm }, },
1151 { 0 /* */, BPF::NEG_32, Convert__Reg1_0__Tie0_0_3, AMFBS_None, { MCK_GPR32, MCK__61_, MCK__MINUS_, MCK_GPR32 }, },
1152 { 0 /* */, BPF::XOR_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__94_, MCK__61_, MCK_GPR32 }, },
1153 { 0 /* */, BPF::XOR_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__94_, MCK__61_, MCK_Imm }, },
1154 { 0 /* */, BPF::OR_rr_32, Convert__Reg1_0__Tie0_0_0__Reg1_3, AMFBS_None, { MCK_GPR32, MCK__124_, MCK__61_, MCK_GPR32 }, },
1155 { 0 /* */, BPF::OR_ri_32, Convert__Reg1_0__Tie0_0_0__Imm1_3, AMFBS_None, { MCK_GPR32, MCK__124_, MCK__61_, MCK_Imm }, },
1156 { 0 /* */, BPF::SLL_rr, Convert__Reg1_0__Tie0_0_0__Reg1_4, AMFBS_None, { MCK_GPR, MCK__LT_, MCK__LT_, MCK__61_, MCK_GPR }, },
1157 { 0 /* */, BPF::SLL_ri, Convert__Reg1_0__Tie0_0_0__Imm1_4, AMFBS_None, { MCK_GPR, MCK__LT_, MCK__LT_, MCK__61_, MCK_Imm }, },
1158 { 0 /* */, BPF::SRL_rr, Convert__Reg1_0__Tie0_0_0__Reg1_4, AMFBS_None, { MCK_GPR, MCK__GT_, MCK__GT_, MCK__61_, MCK_GPR }, },
1159 { 0 /* */, BPF::SRL_ri, Convert__Reg1_0__Tie0_0_0__Imm1_4, AMFBS_None, { MCK_GPR, MCK__GT_, MCK__GT_, MCK__61_, MCK_Imm }, },
1160 { 0 /* */, BPF::SMOD_rr, Convert__Reg1_0__Tie0_0_0__Reg1_4, AMFBS_None, { MCK_GPR, MCK_s, MCK__PCT_, MCK__61_, MCK_GPR }, },
1161 { 0 /* */, BPF::SMOD_ri, Convert__Reg1_0__Tie0_0_0__Imm1_4, AMFBS_None, { MCK_GPR, MCK_s, MCK__PCT_, MCK__61_, MCK_Imm }, },
1162 { 0 /* */, BPF::SDIV_rr, Convert__Reg1_0__Tie0_0_0__Reg1_4, AMFBS_None, { MCK_GPR, MCK_s, MCK__47_, MCK__61_, MCK_GPR }, },
1163 { 0 /* */, BPF::SDIV_ri, Convert__Reg1_0__Tie0_0_0__Imm1_4, AMFBS_None, { MCK_GPR, MCK_s, MCK__47_, MCK__61_, MCK_Imm }, },
1164 { 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 }, },
1165 { 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 }, },
1166 { 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 }, },
1167 { 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 }, },
1168 { 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 }, },
1169 { 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 }, },
1170 { 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 }, },
1171 { 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 }, },
1172 { 0 /* */, BPF::MOVSX_rr_16, Convert__Reg1_0__Reg1_5, AMFBS_None, { MCK_GPR, MCK__61_, MCK__40_, MCK_s16, MCK__41_, MCK_GPR }, },
1173 { 0 /* */, BPF::MOVSX_rr_32, Convert__Reg1_0__Reg1_5, AMFBS_None, { MCK_GPR, MCK__61_, MCK__40_, MCK_s32, MCK__41_, MCK_GPR }, },
1174 { 0 /* */, BPF::MOVSX_rr_8, Convert__Reg1_0__Reg1_5, AMFBS_None, { MCK_GPR, MCK__61_, MCK__40_, MCK_s8, MCK__41_, MCK_GPR }, },
1175 { 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 }, },
1176 { 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 }, },
1177 { 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 }, },
1178 { 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 }, },
1179 { 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 }, },
1180 { 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 }, },
1181 { 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_ }, },
1182 { 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_ }, },
1183 { 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_ }, },
1184 { 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_ }, },
1185 { 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_ }, },
1186 { 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_ }, },
1187 { 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_ }, },
1188 { 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_ }, },
1189 { 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_ }, },
1190 { 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_ }, },
1191 { 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_ }, },
1192 { 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_ }, },
1193 { 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_ }, },
1194 { 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_ }, },
1195 { 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_ }, },
1196 { 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_ }, },
1197 { 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_ }, },
1198 { 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_ }, },
1199 { 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_ }, },
1200 { 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_ }, },
1201 { 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_ }, },
1202 { 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_ }, },
1203 { 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_ }, },
1204 { 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_ }, },
1205 { 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_ }, },
1206 { 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 }, },
1207 { 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 }, },
1208 { 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 }, },
1209 { 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 }, },
1210 { 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 }, },
1211 { 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 }, },
1212 { 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 }, },
1213 { 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 }, },
1214 { 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 }, },
1215 { 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 }, },
1216 { 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 }, },
1217 { 3 /* call */, BPF::JAL, Convert__Imm1_1, AMFBS_None, { MCK_call, MCK_Imm }, },
1218 { 8 /* callx */, BPF::JALX, Convert__Reg1_1, AMFBS_None, { MCK_callx, MCK_GPR }, },
1219 { 14 /* exit */, BPF::RET, Convert_NoOperands, AMFBS_None, { MCK_exit }, },
1220 { 19 /* goto */, BPF::JMP, Convert__BrTarget1_1, AMFBS_None, { MCK_goto, MCK_BrTarget }, },
1221 { 24 /* gotol */, BPF::JMPL, Convert__BrTarget1_1, AMFBS_None, { MCK_gotol, MCK_BrTarget }, },
1222 { 30 /* gotox */, BPF::JX, Convert__Reg1_1, AMFBS_None, { MCK_gotox, MCK_GPR }, },
1223 { 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 }, },
1224 { 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 }, },
1225 { 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 }, },
1226 { 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 }, },
1227 { 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 }, },
1228 { 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 }, },
1229 { 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 }, },
1230 { 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 }, },
1231 { 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 }, },
1232 { 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 }, },
1233 { 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 }, },
1234 { 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 }, },
1235 { 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 }, },
1236 { 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 }, },
1237 { 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 }, },
1238 { 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 }, },
1239 { 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 }, },
1240 { 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 }, },
1241 { 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 }, },
1242 { 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 }, },
1243 { 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 }, },
1244 { 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 }, },
1245 { 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 }, },
1246 { 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 }, },
1247 { 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 }, },
1248 { 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 }, },
1249 { 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 }, },
1250 { 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 }, },
1251 { 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 }, },
1252 { 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 }, },
1253 { 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 }, },
1254 { 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 }, },
1255 { 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 }, },
1256 { 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 }, },
1257 { 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 }, },
1258 { 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 }, },
1259 { 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 }, },
1260 { 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 }, },
1261 { 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 }, },
1262 { 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 }, },
1263 { 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 }, },
1264 { 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 }, },
1265 { 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 }, },
1266 { 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 }, },
1267 { 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 }, },
1268 { 49 /* lea */, BPF::FI_ri, Convert__Reg1_1__Reg1_2__SImm161_3, AMFBS_None, { MCK_lea, MCK_GPR, MCK_GPR, MCK_SImm16 }, },
1269 { 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 }, },
1270 { 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 }, },
1271 { 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 }, },
1272 { 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 }, },
1273 { 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 }, },
1274 { 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 }, },
1275 { 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 }, },
1276 { 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 }, },
1277 { 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 }, },
1278 { 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 }, },
1279 { 73 /* may_goto */, BPF::JCOND, Convert__BrTarget1_1, AMFBS_None, { MCK_may_95_goto, MCK_BrTarget }, },
1280 { 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_ }, },
1281 { 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_ }, },
1282 { 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_ }, },
1283 { 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_ }, },
1284 { 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_ }, },
1285 { 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_ }, },
1286 { 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_ }, },
1287 { 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_ }, },
1288 { 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_ }, },
1289 { 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_ }, },
1290 { 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_ }, },
1291 { 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 }, },
1292 { 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 }, },
1293 { 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_ }, },
1294};
1295
1296#include "llvm/Support/Debug.h"
1297#include "llvm/Support/Format.h"
1298
1299unsigned BPFAsmParser::
1300MatchInstructionImpl(const OperandVector &Operands,
1301 MCInst &Inst,
1302 uint64_t &ErrorInfo,
1303 FeatureBitset &MissingFeatures,
1304 bool matchingInlineAsm, unsigned VariantID) {
1305 // Eliminate obvious mismatches.
1306 if (Operands.size() > 14) {
1307 ErrorInfo = 14;
1308 return Match_InvalidOperand;
1309 }
1310
1311 // Get the current feature set.
1312 const FeatureBitset &AvailableFeatures = getAvailableFeatures();
1313
1314 // Get the instruction mnemonic, which is the first token.
1315 StringRef Mnemonic;
1316 if (Operands[0]->isToken())
1317 Mnemonic = ((BPFOperand &)*Operands[0]).getToken();
1318
1319 // Some state to try to produce better error messages.
1320 bool HadMatchOtherThanFeatures = false;
1321 bool HadMatchOtherThanPredicate = false;
1322 unsigned RetCode = Match_InvalidOperand;
1323 MissingFeatures.set();
1324 // Set ErrorInfo to the operand that mismatches if it is
1325 // wrong for all instances of the instruction.
1326 ErrorInfo = ~0ULL;
1327 // Find the appropriate table for this asm variant.
1328 const MatchEntry *Start, *End;
1329 switch (VariantID) {
1330 default: llvm_unreachable("invalid variant!");
1331 case 0: Start = std::begin(MatchTable0); End = std::end(MatchTable0); break;
1332 }
1333 // Search the table.
1334 auto MnemonicRange = std::pair(Start, End);
1335 unsigned SIndex = Mnemonic.empty() ? 0 : 1;
1336 if (!Mnemonic.empty())
1337 MnemonicRange = std::equal_range(Start, End, Mnemonic.lower(), LessOpcode());
1338
1339 DEBUG_WITH_TYPE("asm-matcher", dbgs() << "AsmMatcher: found " <<
1340 std::distance(MnemonicRange.first, MnemonicRange.second) <<
1341 " encodings with mnemonic '" << Mnemonic << "'\n");
1342
1343 // Return a more specific error code if no mnemonics match.
1344 if (MnemonicRange.first == MnemonicRange.second)
1345 return Match_MnemonicFail;
1346
1347 for (const MatchEntry *it = MnemonicRange.first, *ie = MnemonicRange.second;
1348 it != ie; ++it) {
1349 const FeatureBitset &RequiredFeatures = FeatureBitsets[it->RequiredFeaturesIdx];
1350 bool HasRequiredFeatures =
1351 (AvailableFeatures & RequiredFeatures) == RequiredFeatures;
1352 DEBUG_WITH_TYPE("asm-matcher", dbgs() << "Trying to match opcode "
1353 << MII.getName(it->Opcode) << "\n");
1354 bool OperandsValid = true;
1355 unsigned ActualIdx = SIndex;
1356 for (unsigned FormalIdx = SIndex; FormalIdx != 14; ++FormalIdx) {
1357 auto Formal = static_cast<MatchClassKind>(it->Classes[FormalIdx]);
1358 DEBUG_WITH_TYPE("asm-matcher",
1359 dbgs() << " Matching formal operand class " << getMatchClassName(Formal)
1360 << " against actual operand at index " << ActualIdx);
1361 if (ActualIdx < Operands.size())
1362 DEBUG_WITH_TYPE("asm-matcher", dbgs() << " (";
1363 Operands[ActualIdx]->print(dbgs(), getContext().getAsmInfo()); dbgs() << "): ");
1364 else
1365 DEBUG_WITH_TYPE("asm-matcher", dbgs() << ": ");
1366 if (ActualIdx >= Operands.size()) {
1367 DEBUG_WITH_TYPE("asm-matcher", dbgs() << "actual operand index out of range\n");
1368 if (Formal == InvalidMatchClass) {
1369 break;
1370 }
1371 if (isSubclass(Formal, OptionalMatchClass)) {
1372 continue;
1373 }
1374 OperandsValid = false;
1375 ErrorInfo = ActualIdx;
1376 break;
1377 }
1378 MCParsedAsmOperand &Actual = *Operands[ActualIdx];
1379 unsigned Diag = validateOperandClass(Actual, Formal, *STI);
1380 if (Diag == Match_Success) {
1381 DEBUG_WITH_TYPE("asm-matcher",
1382 dbgs() << "match success using generic matcher\n");
1383 ++ActualIdx;
1384 continue;
1385 }
1386 // If the generic handler indicates an invalid operand
1387 // failure, check for a special case.
1388 if (Diag != Match_Success) {
1389 unsigned TargetDiag = validateTargetOperandClass(Actual, Formal);
1390 if (TargetDiag == Match_Success) {
1391 DEBUG_WITH_TYPE("asm-matcher",
1392 dbgs() << "match success using target matcher\n");
1393 ++ActualIdx;
1394 continue;
1395 }
1396 // If the target matcher returned a specific error code use
1397 // that, else use the one from the generic matcher.
1398 if (TargetDiag != Match_InvalidOperand && HasRequiredFeatures)
1399 Diag = TargetDiag;
1400 }
1401 // If current formal operand wasn't matched and it is optional
1402 // then try to match next formal operand
1403 if (Diag == Match_InvalidOperand && isSubclass(Formal, OptionalMatchClass)) {
1404 DEBUG_WITH_TYPE("asm-matcher", dbgs() << "ignoring optional operand\n");
1405 continue;
1406 }
1407 // If this operand is broken for all of the instances of this
1408 // mnemonic, keep track of it so we can report loc info.
1409 // If we already had a match that only failed due to a
1410 // target predicate, that diagnostic is preferred.
1411 if (!HadMatchOtherThanPredicate &&
1412 (it == MnemonicRange.first || ErrorInfo <= ActualIdx)) {
1413 if (HasRequiredFeatures && (ErrorInfo != ActualIdx || Diag != Match_InvalidOperand))
1414 RetCode = Diag;
1415 ErrorInfo = ActualIdx;
1416 }
1417 // Otherwise, just reject this instance of the mnemonic.
1418 OperandsValid = false;
1419 break;
1420 }
1421
1422 if (!OperandsValid) {
1423 DEBUG_WITH_TYPE("asm-matcher", dbgs() << "Opcode result: multiple "
1424 "operand mismatches, ignoring "
1425 "this opcode\n");
1426 continue;
1427 }
1428 if (!HasRequiredFeatures) {
1429 HadMatchOtherThanFeatures = true;
1430 FeatureBitset NewMissingFeatures = RequiredFeatures & ~AvailableFeatures;
1431 DEBUG_WITH_TYPE("asm-matcher", dbgs() << "Missing target features:";
1432 for (unsigned I = 0, E = NewMissingFeatures.size(); I != E; ++I)
1433 if (NewMissingFeatures[I])
1434 dbgs() << ' ' << I;
1435 dbgs() << "\n");
1436 if (NewMissingFeatures.count() <=
1437 MissingFeatures.count())
1438 MissingFeatures = NewMissingFeatures;
1439 continue;
1440 }
1441
1442 Inst.clear();
1443
1444 Inst.setOpcode(it->Opcode);
1445 // We have a potential match but have not rendered the operands.
1446 // Check the target predicate to handle any context sensitive
1447 // constraints.
1448 // For example, Ties that are referenced multiple times must be
1449 // checked here to ensure the input is the same for each match
1450 // constraints. If we leave it any later the ties will have been
1451 // canonicalized
1452 unsigned MatchResult;
1453 if ((MatchResult = checkEarlyTargetMatchPredicate(Inst, Operands)) != Match_Success) {
1454 Inst.clear();
1455 DEBUG_WITH_TYPE(
1456 "asm-matcher",
1457 dbgs() << "Early target match predicate failed with diag code "
1458 << MatchResult << "\n");
1459 RetCode = MatchResult;
1460 HadMatchOtherThanPredicate = true;
1461 continue;
1462 }
1463
1464 if (matchingInlineAsm) {
1465 convertToMapAndConstraints(it->ConvertFn, Operands);
1466 if (!checkAsmTiedOperandConstraints(*this, it->ConvertFn, Operands,
1467 ErrorInfo))
1468 return Match_InvalidTiedOperand;
1469
1470 return Match_Success;
1471 }
1472
1473 // We have selected a definite instruction, convert the parsed
1474 // operands into the appropriate MCInst.
1475 convertToMCInst(it->ConvertFn, Inst, it->Opcode, Operands);
1476
1477 // We have a potential match. Check the target predicate to
1478 // handle any context sensitive constraints.
1479 if ((MatchResult = checkTargetMatchPredicate(Inst)) != Match_Success) {
1480 DEBUG_WITH_TYPE("asm-matcher",
1481 dbgs() << "Target match predicate failed with diag code "
1482 << MatchResult << "\n");
1483 Inst.clear();
1484 RetCode = MatchResult;
1485 HadMatchOtherThanPredicate = true;
1486 continue;
1487 }
1488
1489 if (!checkAsmTiedOperandConstraints(*this, it->ConvertFn, Operands,
1490 ErrorInfo))
1491 return Match_InvalidTiedOperand;
1492
1493 DEBUG_WITH_TYPE(
1494 "asm-matcher",
1495 dbgs() << "Opcode result: complete match, selecting this opcode\n");
1496 return Match_Success;
1497 }
1498
1499 // Okay, we had no match. Try to return a useful error code.
1500 if (HadMatchOtherThanPredicate || !HadMatchOtherThanFeatures)
1501 return RetCode;
1502
1503 ErrorInfo = 0;
1504 return Match_MissingFeature;
1505}
1506
1507#endif // GET_MATCHER_IMPLEMENTATION
1508
1509
1510#ifdef GET_MNEMONIC_SPELL_CHECKER
1511#undef GET_MNEMONIC_SPELL_CHECKER
1512
1513static std::string BPFMnemonicSpellCheck(StringRef S, const FeatureBitset &FBS, unsigned VariantID) {
1514 const unsigned MaxEditDist = 2;
1515 std::vector<StringRef> Candidates;
1516 StringRef Prev = "";
1517
1518 // Find the appropriate table for this asm variant.
1519 const MatchEntry *Start, *End;
1520 switch (VariantID) {
1521 default: llvm_unreachable("invalid variant!");
1522 case 0: Start = std::begin(MatchTable0); End = std::end(MatchTable0); break;
1523 }
1524
1525 for (auto I = Start; I < End; I++) {
1526 // Ignore unsupported instructions.
1527 const FeatureBitset &RequiredFeatures = FeatureBitsets[I->RequiredFeaturesIdx];
1528 if ((FBS & RequiredFeatures) != RequiredFeatures)
1529 continue;
1530
1531 StringRef T = I->getMnemonic();
1532 // Avoid recomputing the edit distance for the same string.
1533 if (T == Prev)
1534 continue;
1535
1536 Prev = T;
1537 unsigned Dist = S.edit_distance(T, false, MaxEditDist);
1538 if (Dist <= MaxEditDist)
1539 Candidates.push_back(T);
1540 }
1541
1542 if (Candidates.empty())
1543 return "";
1544
1545 std::string Res = ", did you mean: ";
1546 unsigned i = 0;
1547 for (; i < Candidates.size() - 1; i++)
1548 Res += Candidates[i].str() + ", ";
1549 return Res + Candidates[i].str() + "?";
1550}
1551
1552#endif // GET_MNEMONIC_SPELL_CHECKER
1553
1554
1555#ifdef GET_MNEMONIC_CHECKER
1556#undef GET_MNEMONIC_CHECKER
1557
1558static bool BPFCheckMnemonic(StringRef Mnemonic,
1559 const FeatureBitset &AvailableFeatures,
1560 unsigned VariantID) {
1561 // Find the appropriate table for this asm variant.
1562 const MatchEntry *Start, *End;
1563 switch (VariantID) {
1564 default: llvm_unreachable("invalid variant!");
1565 case 0: Start = std::begin(MatchTable0); End = std::end(MatchTable0); break;
1566 }
1567
1568 // Search the table.
1569 auto MnemonicRange = std::pair(Start, End);
1570 unsigned SIndex = Mnemonic.empty() ? 0 : 1;
1571 if (!Mnemonic.empty())
1572 MnemonicRange = std::equal_range(Start, End, Mnemonic.lower(), LessOpcode());
1573
1574 if (MnemonicRange.first == MnemonicRange.second)
1575 return false;
1576
1577 for (const MatchEntry *it = MnemonicRange.first, *ie = MnemonicRange.second;
1578 it != ie; ++it) {
1579 const FeatureBitset &RequiredFeatures =
1580 FeatureBitsets[it->RequiredFeaturesIdx];
1581 if ((AvailableFeatures & RequiredFeatures) == RequiredFeatures)
1582 return true;
1583 }
1584 return false;
1585}
1586
1587#endif // GET_MNEMONIC_CHECKER
1588
1589