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