Coverage Report

Created: 2024-01-17 10:31

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