xref: /freebsd/contrib/llvm-project/llvm/utils/TableGen/X86RecognizableInstr.cpp (revision 770cf0a5f02dc8983a89c6568d741fbc25baa999)
1 //===- X86RecognizableInstr.cpp - Disassembler instruction spec -*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file is part of the X86 Disassembler Emitter.
10 // It contains the implementation of a single recognizable instruction.
11 // Documentation for the disassembler emitter in general can be found in
12 //  X86DisassemblerEmitter.h.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #include "X86RecognizableInstr.h"
17 #include "X86DisassemblerShared.h"
18 #include "X86DisassemblerTables.h"
19 #include "X86ModRMFilters.h"
20 #include "llvm/ADT/StringSwitch.h"
21 #include "llvm/Support/ErrorHandling.h"
22 #include "llvm/TableGen/Record.h"
23 #include <string>
24 
25 using namespace llvm;
26 using namespace X86Disassembler;
27 
28 std::string X86Disassembler::getMnemonic(const CodeGenInstruction *I,
29                                          unsigned Variant) {
30   // Extract a mnemonic assuming it's separated by \t
31   std::string Mnemonic =
32       StringRef(I->FlattenAsmStringVariants(I->AsmString, Variant))
33           .take_until([](char C) { return C == '\t'; })
34           .str();
35 
36   // Special case: CMOVCC, JCC, SETCC, CMPCCXADD have "${cond}" in mnemonic.
37   // Replace it with "CC" in-place.
38   auto CondPos = Mnemonic.find("${cond}");
39   if (CondPos != std::string::npos)
40     Mnemonic = Mnemonic.replace(CondPos, 7, "CC");
41   return StringRef(Mnemonic).upper();
42 }
43 
44 bool X86Disassembler::isRegisterOperand(const Record *Rec) {
45   return Rec->isSubClassOf("RegisterClass") ||
46          Rec->isSubClassOf("RegisterOperand");
47 }
48 
49 bool X86Disassembler::isMemoryOperand(const Record *Rec) {
50   return Rec->isSubClassOf("Operand") &&
51          Rec->getValueAsString("OperandType") == "OPERAND_MEMORY";
52 }
53 
54 bool X86Disassembler::isImmediateOperand(const Record *Rec) {
55   return Rec->isSubClassOf("Operand") &&
56          Rec->getValueAsString("OperandType") == "OPERAND_IMMEDIATE";
57 }
58 
59 unsigned X86Disassembler::getRegOperandSize(const Record *RegRec) {
60   if (RegRec->isSubClassOf("RegisterClass"))
61     return RegRec->getValueAsInt("Alignment");
62   if (RegRec->isSubClassOf("RegisterOperand"))
63     return RegRec->getValueAsDef("RegClass")->getValueAsInt("Alignment");
64 
65   llvm_unreachable("Register operand's size not known!");
66 }
67 
68 unsigned X86Disassembler::getMemOperandSize(const Record *MemRec) {
69   if (MemRec->isSubClassOf("X86MemOperand"))
70     return MemRec->getValueAsInt("Size");
71 
72   llvm_unreachable("Memory operand's size not known!");
73 }
74 
75 /// byteFromBitsInit - Extracts a value at most 8 bits in width from a BitsInit.
76 ///   Useful for switch statements and the like.
77 ///
78 /// @param init - A reference to the BitsInit to be decoded.
79 /// @return     - The field, with the first bit in the BitsInit as the lowest
80 ///               order bit.
81 static uint8_t byteFromBitsInit(const BitsInit &init) {
82   int width = init.getNumBits();
83 
84   assert(width <= 8 && "Field is too large for uint8_t!");
85 
86   uint8_t mask = 0x01;
87   uint8_t ret = 0;
88 
89   for (int index = 0; index < width; index++) {
90     if (cast<BitInit>(init.getBit(index))->getValue())
91       ret |= mask;
92 
93     mask <<= 1;
94   }
95 
96   return ret;
97 }
98 
99 /// byteFromRec - Extract a value at most 8 bits in with from a Record given the
100 ///   name of the field.
101 ///
102 /// @param rec  - The record from which to extract the value.
103 /// @param name - The name of the field in the record.
104 /// @return     - The field, as translated by byteFromBitsInit().
105 static uint8_t byteFromRec(const Record *rec, StringRef name) {
106   const BitsInit *bits = rec->getValueAsBitsInit(name);
107   return byteFromBitsInit(*bits);
108 }
109 
110 RecognizableInstrBase::RecognizableInstrBase(const CodeGenInstruction &insn) {
111   const Record *Rec = insn.TheDef;
112   assert(Rec->isSubClassOf("X86Inst") && "Not a X86 Instruction");
113   OpPrefix = byteFromRec(Rec, "OpPrefixBits");
114   OpMap = byteFromRec(Rec, "OpMapBits");
115   Opcode = byteFromRec(Rec, "Opcode");
116   Form = byteFromRec(Rec, "FormBits");
117   Encoding = byteFromRec(Rec, "OpEncBits");
118   OpSize = byteFromRec(Rec, "OpSizeBits");
119   AdSize = byteFromRec(Rec, "AdSizeBits");
120   HasREX_W = Rec->getValueAsBit("hasREX_W");
121   HasVEX_4V = Rec->getValueAsBit("hasVEX_4V");
122   IgnoresW = Rec->getValueAsBit("IgnoresW");
123   IgnoresVEX_L = Rec->getValueAsBit("ignoresVEX_L");
124   HasEVEX_L2 = Rec->getValueAsBit("hasEVEX_L2");
125   HasEVEX_K = Rec->getValueAsBit("hasEVEX_K");
126   HasEVEX_KZ = Rec->getValueAsBit("hasEVEX_Z");
127   HasEVEX_B = Rec->getValueAsBit("hasEVEX_B");
128   HasEVEX_U = Rec->getValueAsBit("hasEVEX_U");
129   HasEVEX_NF = Rec->getValueAsBit("hasEVEX_NF");
130   HasTwoConditionalOps = Rec->getValueAsBit("hasTwoConditionalOps");
131   IsCodeGenOnly = Rec->getValueAsBit("isCodeGenOnly");
132   IsAsmParserOnly = Rec->getValueAsBit("isAsmParserOnly");
133   ForceDisassemble = Rec->getValueAsBit("ForceDisassemble");
134   CD8_Scale = byteFromRec(Rec, "CD8_Scale");
135   HasVEX_L = Rec->getValueAsBit("hasVEX_L");
136   ExplicitREX2Prefix =
137       byteFromRec(Rec, "explicitOpPrefixBits") == X86Local::ExplicitREX2;
138 
139   EncodeRC = HasEVEX_B &&
140              (Form == X86Local::MRMDestReg || Form == X86Local::MRMSrcReg);
141 }
142 
143 bool RecognizableInstrBase::shouldBeEmitted() const {
144   return Form != X86Local::Pseudo && (!IsCodeGenOnly || ForceDisassemble) &&
145          !IsAsmParserOnly;
146 }
147 
148 RecognizableInstr::RecognizableInstr(DisassemblerTables &tables,
149                                      const CodeGenInstruction &insn,
150                                      InstrUID uid)
151     : RecognizableInstrBase(insn), Rec(insn.TheDef), Name(Rec->getName().str()),
152       Is32Bit(false), Is64Bit(false), Operands(&insn.Operands.OperandList),
153       UID(uid), Spec(&tables.specForUID(uid)) {
154   // Check for 64-bit inst which does not require REX
155   // FIXME: Is there some better way to check for In64BitMode?
156   for (const Record *Predicate : Rec->getValueAsListOfDefs("Predicates")) {
157     if (Predicate->getName().contains("Not64Bit") ||
158         Predicate->getName().contains("In32Bit")) {
159       Is32Bit = true;
160       break;
161     }
162     if (Predicate->getName().contains("In64Bit")) {
163       Is64Bit = true;
164       break;
165     }
166   }
167 }
168 
169 void RecognizableInstr::processInstr(DisassemblerTables &tables,
170                                      const CodeGenInstruction &insn,
171                                      InstrUID uid) {
172   if (!insn.TheDef->isSubClassOf("X86Inst"))
173     return;
174   RecognizableInstr recogInstr(tables, insn, uid);
175 
176   if (!recogInstr.shouldBeEmitted())
177     return;
178   recogInstr.emitInstructionSpecifier();
179   recogInstr.emitDecodePath(tables);
180 }
181 
182 #define EVEX_KB(n)                                                             \
183   (HasEVEX_KZ && HasEVEX_B                                                     \
184        ? n##_KZ_B                                                              \
185        : (HasEVEX_K && HasEVEX_B                                               \
186               ? n##_K_B                                                        \
187               : (HasEVEX_KZ ? n##_KZ                                           \
188                             : (HasEVEX_K ? n##_K : (HasEVEX_B ? n##_B : n)))))
189 
190 #define EVEX_NF(n) (HasEVEX_NF ? n##_NF : n)
191 #define EVEX_B_NF(n) (HasEVEX_B ? EVEX_NF(n##_B) : EVEX_NF(n))
192 #define EVEX_KB_ADSIZE(n) AdSize == X86Local::AdSize32 ? n##_ADSIZE : EVEX_KB(n)
193 #define EVEX_KB_U(n)                                                           \
194   (HasEVEX_KZ ? n##_KZ_B_U : (HasEVEX_K ? n##_K_B_U : n##_B_U))
195 
196 InstructionContext RecognizableInstr::insnContext() const {
197   InstructionContext insnContext;
198 
199   if (Encoding == X86Local::EVEX) {
200     if (HasVEX_L && HasEVEX_L2) {
201       errs() << "Don't support VEX.L if EVEX_L2 is enabled: " << Name << "\n";
202       llvm_unreachable("Don't support VEX.L if EVEX_L2 is enabled");
203     }
204     if (EncodeRC && HasEVEX_U) {
205       // EVEX_U
206       if (HasREX_W) {
207         if (OpPrefix == X86Local::PD)
208           insnContext = EVEX_KB_U(IC_EVEX_W_OPSIZE);
209         else if (OpPrefix == X86Local::XS)
210           insnContext = EVEX_KB_U(IC_EVEX_W_XS);
211         else if (OpPrefix == X86Local::XD)
212           insnContext = EVEX_KB_U(IC_EVEX_W_XD);
213         else if (OpPrefix == X86Local::PS)
214           insnContext = EVEX_KB_U(IC_EVEX_W);
215         else {
216           errs() << "Instruction does not use a prefix: " << Name << "\n";
217           llvm_unreachable("Invalid prefix");
218         }
219       } else {
220         if (OpPrefix == X86Local::PD)
221           insnContext = EVEX_KB_U(IC_EVEX_OPSIZE);
222         else if (OpPrefix == X86Local::XS)
223           insnContext = EVEX_KB_U(IC_EVEX_XS);
224         else if (OpPrefix == X86Local::XD)
225           insnContext = EVEX_KB_U(IC_EVEX_XD);
226         else if (OpPrefix == X86Local::PS)
227           insnContext = EVEX_KB_U(IC_EVEX);
228         else {
229           errs() << "Instruction does not use a prefix: " << Name << "\n";
230           llvm_unreachable("Invalid prefix");
231         }
232       }
233     } else if (HasEVEX_NF) {
234       if (OpPrefix == X86Local::PD)
235         insnContext = EVEX_B_NF(IC_EVEX_OPSIZE);
236       else if (HasREX_W)
237         insnContext = EVEX_B_NF(IC_EVEX_W);
238       else
239         insnContext = EVEX_B_NF(IC_EVEX);
240     } else if (!EncodeRC && HasVEX_L && HasREX_W) {
241       // VEX_L & VEX_W
242       if (OpPrefix == X86Local::PD)
243         insnContext = EVEX_KB(IC_EVEX_L_W_OPSIZE);
244       else if (OpPrefix == X86Local::XS)
245         insnContext = EVEX_KB(IC_EVEX_L_W_XS);
246       else if (OpPrefix == X86Local::XD)
247         insnContext = EVEX_KB(IC_EVEX_L_W_XD);
248       else if (OpPrefix == X86Local::PS)
249         insnContext = EVEX_KB(IC_EVEX_L_W);
250       else {
251         errs() << "Instruction does not use a prefix: " << Name << "\n";
252         llvm_unreachable("Invalid prefix");
253       }
254     } else if (!EncodeRC && HasVEX_L) {
255       // VEX_L
256       if (OpPrefix == X86Local::PD)
257         insnContext = EVEX_KB(IC_EVEX_L_OPSIZE);
258       else if (OpPrefix == X86Local::XS)
259         insnContext = EVEX_KB(IC_EVEX_L_XS);
260       else if (OpPrefix == X86Local::XD)
261         insnContext = EVEX_KB(IC_EVEX_L_XD);
262       else if (OpPrefix == X86Local::PS)
263         insnContext = EVEX_KB(IC_EVEX_L);
264       else {
265         errs() << "Instruction does not use a prefix: " << Name << "\n";
266         llvm_unreachable("Invalid prefix");
267       }
268     } else if (!EncodeRC && HasEVEX_L2 && HasREX_W) {
269       // EVEX_L2 & VEX_W
270       if (OpPrefix == X86Local::PD)
271         insnContext = EVEX_KB(IC_EVEX_L2_W_OPSIZE);
272       else if (OpPrefix == X86Local::XS)
273         insnContext = EVEX_KB(IC_EVEX_L2_W_XS);
274       else if (OpPrefix == X86Local::XD)
275         insnContext = EVEX_KB(IC_EVEX_L2_W_XD);
276       else if (OpPrefix == X86Local::PS)
277         insnContext = EVEX_KB(IC_EVEX_L2_W);
278       else {
279         errs() << "Instruction does not use a prefix: " << Name << "\n";
280         llvm_unreachable("Invalid prefix");
281       }
282     } else if (!EncodeRC && HasEVEX_L2) {
283       // EVEX_L2
284       if (OpPrefix == X86Local::PD)
285         insnContext = EVEX_KB(IC_EVEX_L2_OPSIZE);
286       else if (OpPrefix == X86Local::XD)
287         insnContext = EVEX_KB(IC_EVEX_L2_XD);
288       else if (OpPrefix == X86Local::XS)
289         insnContext = EVEX_KB(IC_EVEX_L2_XS);
290       else if (OpPrefix == X86Local::PS)
291         insnContext = EVEX_KB(IC_EVEX_L2);
292       else {
293         errs() << "Instruction does not use a prefix: " << Name << "\n";
294         llvm_unreachable("Invalid prefix");
295       }
296     } else if (HasREX_W) {
297       // VEX_W
298       if (OpPrefix == X86Local::PD)
299         insnContext = EVEX_KB(IC_EVEX_W_OPSIZE);
300       else if (OpPrefix == X86Local::XS)
301         insnContext = EVEX_KB(IC_EVEX_W_XS);
302       else if (OpPrefix == X86Local::XD)
303         insnContext = EVEX_KB(IC_EVEX_W_XD);
304       else if (OpPrefix == X86Local::PS)
305         insnContext = EVEX_KB(IC_EVEX_W);
306       else {
307         errs() << "Instruction does not use a prefix: " << Name << "\n";
308         llvm_unreachable("Invalid prefix");
309       }
310     }
311     // No L, no W
312     else if (OpPrefix == X86Local::PD) {
313       insnContext = EVEX_KB_ADSIZE(IC_EVEX_OPSIZE);
314     } else if (OpPrefix == X86Local::XD)
315       insnContext = EVEX_KB_ADSIZE(IC_EVEX_XD);
316     else if (OpPrefix == X86Local::XS)
317       insnContext = EVEX_KB_ADSIZE(IC_EVEX_XS);
318     else if (OpPrefix == X86Local::PS)
319       insnContext = EVEX_KB(IC_EVEX);
320     else {
321       errs() << "Instruction does not use a prefix: " << Name << "\n";
322       llvm_unreachable("Invalid prefix");
323     }
324     /// eof EVEX
325   } else if (Encoding == X86Local::VEX || Encoding == X86Local::XOP) {
326     if (HasVEX_L && HasREX_W) {
327       if (OpPrefix == X86Local::PD)
328         insnContext = IC_VEX_L_W_OPSIZE;
329       else if (OpPrefix == X86Local::XS)
330         insnContext = IC_VEX_L_W_XS;
331       else if (OpPrefix == X86Local::XD)
332         insnContext = IC_VEX_L_W_XD;
333       else if (OpPrefix == X86Local::PS)
334         insnContext = IC_VEX_L_W;
335       else {
336         errs() << "Instruction does not use a prefix: " << Name << "\n";
337         llvm_unreachable("Invalid prefix");
338       }
339     } else if (OpPrefix == X86Local::PD && HasVEX_L)
340       insnContext = IC_VEX_L_OPSIZE;
341     else if (OpPrefix == X86Local::PD && HasREX_W)
342       insnContext = IC_VEX_W_OPSIZE;
343     else if (OpPrefix == X86Local::PD)
344       insnContext = IC_VEX_OPSIZE;
345     else if (HasVEX_L && OpPrefix == X86Local::XS)
346       insnContext = IC_VEX_L_XS;
347     else if (HasVEX_L && OpPrefix == X86Local::XD)
348       insnContext = IC_VEX_L_XD;
349     else if (HasREX_W && OpPrefix == X86Local::XS)
350       insnContext = IC_VEX_W_XS;
351     else if (HasREX_W && OpPrefix == X86Local::XD)
352       insnContext = IC_VEX_W_XD;
353     else if (HasREX_W && OpPrefix == X86Local::PS)
354       insnContext = IC_VEX_W;
355     else if (HasVEX_L && OpPrefix == X86Local::PS)
356       insnContext = IC_VEX_L;
357     else if (OpPrefix == X86Local::XD)
358       insnContext = IC_VEX_XD;
359     else if (OpPrefix == X86Local::XS)
360       insnContext = IC_VEX_XS;
361     else if (OpPrefix == X86Local::PS)
362       insnContext = IC_VEX;
363     else {
364       errs() << "Instruction does not use a prefix: " << Name << "\n";
365       llvm_unreachable("Invalid prefix");
366     }
367   } else if (Is64Bit || HasREX_W || AdSize == X86Local::AdSize64) {
368     if (HasREX_W && (OpSize == X86Local::OpSize16 || OpPrefix == X86Local::PD))
369       insnContext = IC_64BIT_REXW_OPSIZE;
370     else if (HasREX_W && AdSize == X86Local::AdSize32)
371       insnContext = IC_64BIT_REXW_ADSIZE;
372     else if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XD)
373       insnContext = IC_64BIT_XD_OPSIZE;
374     else if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XS)
375       insnContext = IC_64BIT_XS_OPSIZE;
376     else if (AdSize == X86Local::AdSize32 && OpPrefix == X86Local::PD)
377       insnContext = IC_64BIT_OPSIZE_ADSIZE;
378     else if (OpSize == X86Local::OpSize16 && AdSize == X86Local::AdSize32)
379       insnContext = IC_64BIT_OPSIZE_ADSIZE;
380     else if (OpSize == X86Local::OpSize16 || OpPrefix == X86Local::PD)
381       insnContext = IC_64BIT_OPSIZE;
382     else if (AdSize == X86Local::AdSize32)
383       insnContext = IC_64BIT_ADSIZE;
384     else if (HasREX_W && OpPrefix == X86Local::XS)
385       insnContext = IC_64BIT_REXW_XS;
386     else if (HasREX_W && OpPrefix == X86Local::XD)
387       insnContext = IC_64BIT_REXW_XD;
388     else if (OpPrefix == X86Local::XD)
389       insnContext = IC_64BIT_XD;
390     else if (OpPrefix == X86Local::XS)
391       insnContext = IC_64BIT_XS;
392     else if (ExplicitREX2Prefix)
393       insnContext = IC_64BIT_REX2;
394     else if (HasREX_W)
395       insnContext = IC_64BIT_REXW;
396     else
397       insnContext = IC_64BIT;
398   } else {
399     if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XD)
400       insnContext = IC_XD_OPSIZE;
401     else if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XS)
402       insnContext = IC_XS_OPSIZE;
403     else if (AdSize == X86Local::AdSize16 && OpPrefix == X86Local::XD)
404       insnContext = IC_XD_ADSIZE;
405     else if (AdSize == X86Local::AdSize16 && OpPrefix == X86Local::XS)
406       insnContext = IC_XS_ADSIZE;
407     else if (AdSize == X86Local::AdSize16 && OpPrefix == X86Local::PD)
408       insnContext = IC_OPSIZE_ADSIZE;
409     else if (OpSize == X86Local::OpSize16 && AdSize == X86Local::AdSize16)
410       insnContext = IC_OPSIZE_ADSIZE;
411     else if (OpSize == X86Local::OpSize16 || OpPrefix == X86Local::PD)
412       insnContext = IC_OPSIZE;
413     else if (AdSize == X86Local::AdSize16)
414       insnContext = IC_ADSIZE;
415     else if (OpPrefix == X86Local::XD)
416       insnContext = IC_XD;
417     else if (OpPrefix == X86Local::XS)
418       insnContext = IC_XS;
419     else
420       insnContext = IC;
421   }
422 
423   return insnContext;
424 }
425 
426 void RecognizableInstr::adjustOperandEncoding(OperandEncoding &encoding) {
427   // The scaling factor for AVX512 compressed displacement encoding is an
428   // instruction attribute.  Adjust the ModRM encoding type to include the
429   // scale for compressed displacement.
430   if ((encoding != ENCODING_RM && encoding != ENCODING_VSIB &&
431        encoding != ENCODING_SIB) ||
432       CD8_Scale == 0)
433     return;
434   encoding = (OperandEncoding)(encoding + Log2_32(CD8_Scale));
435   assert(((encoding >= ENCODING_RM && encoding <= ENCODING_RM_CD64) ||
436           (encoding == ENCODING_SIB) ||
437           (encoding >= ENCODING_VSIB && encoding <= ENCODING_VSIB_CD64)) &&
438          "Invalid CDisp scaling");
439 }
440 
441 void RecognizableInstr::handleOperand(bool optional, unsigned &operandIndex,
442                                       unsigned &physicalOperandIndex,
443                                       unsigned numPhysicalOperands,
444                                       const unsigned *operandMapping,
445                                       EncodingFn encodingFromString) {
446   if (optional) {
447     if (physicalOperandIndex >= numPhysicalOperands)
448       return;
449   } else {
450     assert(physicalOperandIndex < numPhysicalOperands);
451   }
452 
453   while (operandMapping[operandIndex] != operandIndex) {
454     Spec->operands[operandIndex].encoding = ENCODING_DUP;
455     Spec->operands[operandIndex].type =
456         (OperandType)(TYPE_DUP0 + operandMapping[operandIndex]);
457     ++operandIndex;
458   }
459 
460   StringRef typeName = (*Operands)[operandIndex].Rec->getName();
461 
462   OperandEncoding encoding = encodingFromString(typeName, OpSize);
463   // Adjust the encoding type for an operand based on the instruction.
464   adjustOperandEncoding(encoding);
465   Spec->operands[operandIndex].encoding = encoding;
466   Spec->operands[operandIndex].type =
467       typeFromString(typeName, HasREX_W, OpSize);
468 
469   ++operandIndex;
470   ++physicalOperandIndex;
471 }
472 
473 void RecognizableInstr::emitInstructionSpecifier() {
474   Spec->name = Name;
475 
476   Spec->insnContext = insnContext();
477 
478   const std::vector<CGIOperandList::OperandInfo> &OperandList = *Operands;
479 
480   unsigned numOperands = OperandList.size();
481   unsigned numPhysicalOperands = 0;
482 
483   // operandMapping maps from operands in OperandList to their originals.
484   // If operandMapping[i] != i, then the entry is a duplicate.
485   unsigned operandMapping[X86_MAX_OPERANDS];
486   assert(numOperands <= X86_MAX_OPERANDS &&
487          "X86_MAX_OPERANDS is not large enough");
488 
489   for (unsigned operandIndex = 0; operandIndex < numOperands; ++operandIndex) {
490     if (!OperandList[operandIndex].Constraints.empty()) {
491       const CGIOperandList::ConstraintInfo &Constraint =
492           OperandList[operandIndex].Constraints[0];
493       if (Constraint.isTied()) {
494         operandMapping[operandIndex] = operandIndex;
495         operandMapping[Constraint.getTiedOperand()] = operandIndex;
496       } else {
497         ++numPhysicalOperands;
498         operandMapping[operandIndex] = operandIndex;
499       }
500     } else {
501       ++numPhysicalOperands;
502       operandMapping[operandIndex] = operandIndex;
503     }
504   }
505 
506 #define HANDLE_OPERAND(class)                                                  \
507   handleOperand(false, operandIndex, physicalOperandIndex,                     \
508                 numPhysicalOperands, operandMapping,                           \
509                 class##EncodingFromString);
510 
511 #define HANDLE_OPTIONAL(class)                                                 \
512   handleOperand(true, operandIndex, physicalOperandIndex, numPhysicalOperands, \
513                 operandMapping, class##EncodingFromString);
514 
515   // operandIndex should always be < numOperands
516   unsigned operandIndex = 0;
517   // physicalOperandIndex should always be < numPhysicalOperands
518   unsigned physicalOperandIndex = 0;
519 
520 #ifndef NDEBUG
521   // Given the set of prefix bits, how many additional operands does the
522   // instruction have?
523   unsigned additionalOperands = 0;
524   if (HasVEX_4V)
525     ++additionalOperands;
526   if (HasEVEX_K)
527     ++additionalOperands;
528   if (HasTwoConditionalOps)
529     additionalOperands += 2;
530 #endif
531 
532   bool IsND = OpMap == X86Local::T_MAP4 && HasEVEX_B && HasVEX_4V;
533   switch (Form) {
534   default:
535     llvm_unreachable("Unhandled form");
536   case X86Local::PrefixByte:
537     return;
538   case X86Local::RawFrmSrc:
539     HANDLE_OPERAND(relocation);
540     return;
541   case X86Local::RawFrmDst:
542     HANDLE_OPERAND(relocation);
543     return;
544   case X86Local::RawFrmDstSrc:
545     HANDLE_OPERAND(relocation);
546     HANDLE_OPERAND(relocation);
547     return;
548   case X86Local::RawFrm:
549     // Operand 1 (optional) is an address or immediate.
550     assert(numPhysicalOperands <= 1 &&
551            "Unexpected number of operands for RawFrm");
552     HANDLE_OPTIONAL(relocation)
553     break;
554   case X86Local::RawFrmMemOffs:
555     // Operand 1 is an address.
556     HANDLE_OPERAND(relocation);
557     break;
558   case X86Local::AddRegFrm:
559     // Operand 1 is added to the opcode.
560     // Operand 2 (optional) is an address.
561     assert(numPhysicalOperands >= 1 && numPhysicalOperands <= 2 &&
562            "Unexpected number of operands for AddRegFrm");
563     HANDLE_OPERAND(opcodeModifier)
564     HANDLE_OPTIONAL(relocation)
565     break;
566   case X86Local::AddCCFrm:
567     // Operand 1 (optional) is an address or immediate.
568     assert(numPhysicalOperands == 2 &&
569            "Unexpected number of operands for AddCCFrm");
570     HANDLE_OPERAND(relocation)
571     HANDLE_OPERAND(opcodeModifier)
572     break;
573   case X86Local::MRMDestRegCC:
574     assert(numPhysicalOperands == 3 &&
575            "Unexpected number of operands for MRMDestRegCC");
576     HANDLE_OPERAND(rmRegister)
577     HANDLE_OPERAND(roRegister)
578     HANDLE_OPERAND(opcodeModifier)
579     break;
580   case X86Local::MRMDestReg:
581     // Operand 1 is a register operand in the R/M field.
582     // - In AVX512 there may be a mask operand here -
583     // Operand 2 is a register operand in the Reg/Opcode field.
584     // - In AVX, there is a register operand in the VEX.vvvv field here -
585     // Operand 3 (optional) is an immediate.
586     assert(numPhysicalOperands >= 2 + additionalOperands &&
587            numPhysicalOperands <= 3 + additionalOperands &&
588            "Unexpected number of operands for MRMDestReg");
589 
590     if (IsND)
591       HANDLE_OPERAND(vvvvRegister)
592 
593     HANDLE_OPERAND(rmRegister)
594     if (HasEVEX_K)
595       HANDLE_OPERAND(writemaskRegister)
596 
597     if (!IsND && HasVEX_4V)
598       // FIXME: In AVX, the register below becomes the one encoded
599       // in ModRMVEX and the one above the one in the VEX.VVVV field
600       HANDLE_OPERAND(vvvvRegister)
601 
602     HANDLE_OPERAND(roRegister)
603     HANDLE_OPTIONAL(immediate)
604     HANDLE_OPTIONAL(immediate)
605     break;
606   case X86Local::MRMDestMemCC:
607     assert(numPhysicalOperands == 3 &&
608            "Unexpected number of operands for MRMDestMemCC");
609     HANDLE_OPERAND(memory)
610     HANDLE_OPERAND(roRegister)
611     HANDLE_OPERAND(opcodeModifier)
612     break;
613   case X86Local::MRMDestMem4VOp3CC:
614     // Operand 1 is a register operand in the Reg/Opcode field.
615     // Operand 2 is a register operand in the R/M field.
616     // Operand 3 is VEX.vvvv
617     // Operand 4 is condition code.
618     assert(numPhysicalOperands == 4 &&
619            "Unexpected number of operands for MRMDestMem4VOp3CC");
620     HANDLE_OPERAND(roRegister)
621     HANDLE_OPERAND(memory)
622     HANDLE_OPERAND(vvvvRegister)
623     HANDLE_OPERAND(opcodeModifier)
624     break;
625   case X86Local::MRMDestMem:
626   case X86Local::MRMDestMemFSIB:
627     // Operand 1 is a memory operand (possibly SIB-extended)
628     // Operand 2 is a register operand in the Reg/Opcode field.
629     // - In AVX, there is a register operand in the VEX.vvvv field here -
630     // Operand 3 (optional) is an immediate.
631     assert(numPhysicalOperands >= 2 + additionalOperands &&
632            numPhysicalOperands <= 3 + additionalOperands &&
633            "Unexpected number of operands for MRMDestMemFrm with VEX_4V");
634 
635     if (IsND)
636       HANDLE_OPERAND(vvvvRegister)
637 
638     HANDLE_OPERAND(memory)
639 
640     if (HasEVEX_K)
641       HANDLE_OPERAND(writemaskRegister)
642 
643     if (!IsND && HasVEX_4V)
644       // FIXME: In AVX, the register below becomes the one encoded
645       // in ModRMVEX and the one above the one in the VEX.VVVV field
646       HANDLE_OPERAND(vvvvRegister)
647 
648     HANDLE_OPERAND(roRegister)
649     HANDLE_OPTIONAL(immediate)
650     HANDLE_OPTIONAL(immediate)
651     break;
652   case X86Local::MRMSrcReg:
653     // Operand 1 is a register operand in the Reg/Opcode field.
654     // Operand 2 is a register operand in the R/M field.
655     // - In AVX, there is a register operand in the VEX.vvvv field here -
656     // Operand 3 (optional) is an immediate.
657     // Operand 4 (optional) is an immediate.
658 
659     assert(numPhysicalOperands >= 2 + additionalOperands &&
660            numPhysicalOperands <= 4 + additionalOperands &&
661            "Unexpected number of operands for MRMSrcRegFrm");
662 
663     if (IsND)
664       HANDLE_OPERAND(vvvvRegister)
665 
666     HANDLE_OPERAND(roRegister)
667 
668     if (HasEVEX_K)
669       HANDLE_OPERAND(writemaskRegister)
670 
671     if (!IsND && HasVEX_4V)
672       // FIXME: In AVX, the register below becomes the one encoded
673       // in ModRMVEX and the one above the one in the VEX.VVVV field
674       HANDLE_OPERAND(vvvvRegister)
675 
676     HANDLE_OPERAND(rmRegister)
677     HANDLE_OPTIONAL(immediate)
678     HANDLE_OPTIONAL(immediate) // above might be a register in 7:4
679     break;
680   case X86Local::MRMSrcReg4VOp3:
681     assert(numPhysicalOperands == 3 &&
682            "Unexpected number of operands for MRMSrcReg4VOp3Frm");
683     HANDLE_OPERAND(roRegister)
684     HANDLE_OPERAND(rmRegister)
685     HANDLE_OPERAND(vvvvRegister)
686     break;
687   case X86Local::MRMSrcRegOp4:
688     assert(numPhysicalOperands >= 4 && numPhysicalOperands <= 5 &&
689            "Unexpected number of operands for MRMSrcRegOp4Frm");
690     HANDLE_OPERAND(roRegister)
691     HANDLE_OPERAND(vvvvRegister)
692     HANDLE_OPERAND(immediate) // Register in imm[7:4]
693     HANDLE_OPERAND(rmRegister)
694     HANDLE_OPTIONAL(immediate)
695     break;
696   case X86Local::MRMSrcRegCC:
697     assert(numPhysicalOperands >= 3 && numPhysicalOperands <= 4 &&
698            "Unexpected number of operands for MRMSrcRegCC");
699     if (IsND)
700       HANDLE_OPERAND(vvvvRegister)
701     HANDLE_OPERAND(roRegister)
702     HANDLE_OPERAND(rmRegister)
703     HANDLE_OPERAND(opcodeModifier)
704     break;
705   case X86Local::MRMSrcMem:
706   case X86Local::MRMSrcMemFSIB:
707     // Operand 1 is a register operand in the Reg/Opcode field.
708     // Operand 2 is a memory operand (possibly SIB-extended)
709     // - In AVX, there is a register operand in the VEX.vvvv field here -
710     // Operand 3 (optional) is an immediate.
711 
712     assert(numPhysicalOperands >= 2 + additionalOperands &&
713            numPhysicalOperands <= 4 + additionalOperands &&
714            "Unexpected number of operands for MRMSrcMemFrm");
715     if (IsND)
716       HANDLE_OPERAND(vvvvRegister)
717 
718     HANDLE_OPERAND(roRegister)
719 
720     if (HasEVEX_K)
721       HANDLE_OPERAND(writemaskRegister)
722 
723     if (!IsND && HasVEX_4V)
724       // FIXME: In AVX, the register below becomes the one encoded
725       // in ModRMVEX and the one above the one in the VEX.VVVV field
726       HANDLE_OPERAND(vvvvRegister)
727 
728     HANDLE_OPERAND(memory)
729     HANDLE_OPTIONAL(immediate)
730     HANDLE_OPTIONAL(immediate) // above might be a register in 7:4
731     break;
732   case X86Local::MRMSrcMem4VOp3:
733     assert(numPhysicalOperands == 3 &&
734            "Unexpected number of operands for MRMSrcMem4VOp3Frm");
735     HANDLE_OPERAND(roRegister)
736     HANDLE_OPERAND(memory)
737     HANDLE_OPERAND(vvvvRegister)
738     break;
739   case X86Local::MRMSrcMemOp4:
740     assert(numPhysicalOperands >= 4 && numPhysicalOperands <= 5 &&
741            "Unexpected number of operands for MRMSrcMemOp4Frm");
742     HANDLE_OPERAND(roRegister)
743     HANDLE_OPERAND(vvvvRegister)
744     HANDLE_OPERAND(immediate) // Register in imm[7:4]
745     HANDLE_OPERAND(memory)
746     HANDLE_OPTIONAL(immediate)
747     break;
748   case X86Local::MRMSrcMemCC:
749     assert(numPhysicalOperands >= 3 && numPhysicalOperands <= 4 &&
750            "Unexpected number of operands for MRMSrcMemCC");
751     if (IsND)
752       HANDLE_OPERAND(vvvvRegister)
753     HANDLE_OPERAND(roRegister)
754     HANDLE_OPERAND(memory)
755     HANDLE_OPERAND(opcodeModifier)
756     break;
757   case X86Local::MRMXrCC:
758     assert(numPhysicalOperands == 2 &&
759            "Unexpected number of operands for MRMXrCC");
760     HANDLE_OPERAND(rmRegister)
761     HANDLE_OPERAND(opcodeModifier)
762     break;
763   case X86Local::MRMr0:
764     // Operand 1 is a register operand in the R/M field.
765     HANDLE_OPERAND(roRegister)
766     break;
767   case X86Local::MRMXr:
768   case X86Local::MRM0r:
769   case X86Local::MRM1r:
770   case X86Local::MRM2r:
771   case X86Local::MRM3r:
772   case X86Local::MRM4r:
773   case X86Local::MRM5r:
774   case X86Local::MRM6r:
775   case X86Local::MRM7r:
776     // Operand 1 is a register operand in the R/M field.
777     // Operand 2 (optional) is an immediate or relocation.
778     // Operand 3 (optional) is an immediate.
779     assert(numPhysicalOperands >= 0 + additionalOperands &&
780            numPhysicalOperands <= 3 + additionalOperands &&
781            "Unexpected number of operands for MRMnr");
782 
783     if (HasVEX_4V)
784       HANDLE_OPERAND(vvvvRegister)
785 
786     if (HasEVEX_K)
787       HANDLE_OPERAND(writemaskRegister)
788     HANDLE_OPTIONAL(rmRegister)
789     HANDLE_OPTIONAL(relocation)
790     HANDLE_OPTIONAL(immediate)
791     HANDLE_OPTIONAL(immediate)
792     break;
793   case X86Local::MRMXmCC:
794     assert(numPhysicalOperands == 2 &&
795            "Unexpected number of operands for MRMXm");
796     HANDLE_OPERAND(memory)
797     HANDLE_OPERAND(opcodeModifier)
798     break;
799   case X86Local::MRMXm:
800   case X86Local::MRM0m:
801   case X86Local::MRM1m:
802   case X86Local::MRM2m:
803   case X86Local::MRM3m:
804   case X86Local::MRM4m:
805   case X86Local::MRM5m:
806   case X86Local::MRM6m:
807   case X86Local::MRM7m:
808     // Operand 1 is a memory operand (possibly SIB-extended)
809     // Operand 2 (optional) is an immediate or relocation.
810     assert(numPhysicalOperands >= 1 + additionalOperands &&
811            numPhysicalOperands <= 2 + additionalOperands &&
812            "Unexpected number of operands for MRMnm");
813 
814     if (HasVEX_4V)
815       HANDLE_OPERAND(vvvvRegister)
816     if (HasEVEX_K)
817       HANDLE_OPERAND(writemaskRegister)
818     HANDLE_OPERAND(memory)
819     HANDLE_OPTIONAL(relocation)
820     HANDLE_OPTIONAL(immediate)
821     HANDLE_OPTIONAL(immediate)
822     break;
823   case X86Local::RawFrmImm8:
824     // operand 1 is a 16-bit immediate
825     // operand 2 is an 8-bit immediate
826     assert(numPhysicalOperands == 2 &&
827            "Unexpected number of operands for X86Local::RawFrmImm8");
828     HANDLE_OPERAND(immediate)
829     HANDLE_OPERAND(immediate)
830     break;
831   case X86Local::RawFrmImm16:
832     // operand 1 is a 16-bit immediate
833     // operand 2 is a 16-bit immediate
834     HANDLE_OPERAND(immediate)
835     HANDLE_OPERAND(immediate)
836     break;
837   case X86Local::MRM0X:
838   case X86Local::MRM1X:
839   case X86Local::MRM2X:
840   case X86Local::MRM3X:
841   case X86Local::MRM4X:
842   case X86Local::MRM5X:
843   case X86Local::MRM6X:
844   case X86Local::MRM7X:
845 #define MAP(from, to) case X86Local::MRM_##from:
846     X86_INSTR_MRM_MAPPING
847 #undef MAP
848     HANDLE_OPTIONAL(relocation)
849     break;
850   }
851 
852 #undef HANDLE_OPERAND
853 #undef HANDLE_OPTIONAL
854 }
855 
856 void RecognizableInstr::emitDecodePath(DisassemblerTables &tables) const {
857   // Special cases where the LLVM tables are not complete
858 
859 #define MAP(from, to) case X86Local::MRM_##from:
860 
861   std::optional<OpcodeType> opcodeType;
862   switch (OpMap) {
863   default:
864     llvm_unreachable("Invalid map!");
865   case X86Local::OB:
866     opcodeType = ONEBYTE;
867     break;
868   case X86Local::TB:
869     opcodeType = TWOBYTE;
870     break;
871   case X86Local::T8:
872     opcodeType = THREEBYTE_38;
873     break;
874   case X86Local::TA:
875     opcodeType = THREEBYTE_3A;
876     break;
877   case X86Local::XOP8:
878     opcodeType = XOP8_MAP;
879     break;
880   case X86Local::XOP9:
881     opcodeType = XOP9_MAP;
882     break;
883   case X86Local::XOPA:
884     opcodeType = XOPA_MAP;
885     break;
886   case X86Local::ThreeDNow:
887     opcodeType = THREEDNOW_MAP;
888     break;
889   case X86Local::T_MAP4:
890     opcodeType = MAP4;
891     break;
892   case X86Local::T_MAP5:
893     opcodeType = MAP5;
894     break;
895   case X86Local::T_MAP6:
896     opcodeType = MAP6;
897     break;
898   case X86Local::T_MAP7:
899     opcodeType = MAP7;
900     break;
901   }
902 
903   std::unique_ptr<ModRMFilter> filter;
904   switch (Form) {
905   default:
906     llvm_unreachable("Invalid form!");
907   case X86Local::Pseudo:
908     llvm_unreachable("Pseudo should not be emitted!");
909   case X86Local::RawFrm:
910   case X86Local::AddRegFrm:
911   case X86Local::RawFrmMemOffs:
912   case X86Local::RawFrmSrc:
913   case X86Local::RawFrmDst:
914   case X86Local::RawFrmDstSrc:
915   case X86Local::RawFrmImm8:
916   case X86Local::RawFrmImm16:
917   case X86Local::AddCCFrm:
918   case X86Local::PrefixByte:
919     filter = std::make_unique<DumbFilter>();
920     break;
921   case X86Local::MRMDestReg:
922   case X86Local::MRMDestRegCC:
923   case X86Local::MRMSrcReg:
924   case X86Local::MRMSrcReg4VOp3:
925   case X86Local::MRMSrcRegOp4:
926   case X86Local::MRMSrcRegCC:
927   case X86Local::MRMXrCC:
928   case X86Local::MRMXr:
929     filter = std::make_unique<ModFilter>(true);
930     break;
931   case X86Local::MRMDestMem:
932   case X86Local::MRMDestMemCC:
933   case X86Local::MRMDestMem4VOp3CC:
934   case X86Local::MRMDestMemFSIB:
935   case X86Local::MRMSrcMem:
936   case X86Local::MRMSrcMemFSIB:
937   case X86Local::MRMSrcMem4VOp3:
938   case X86Local::MRMSrcMemOp4:
939   case X86Local::MRMSrcMemCC:
940   case X86Local::MRMXmCC:
941   case X86Local::MRMXm:
942     filter = std::make_unique<ModFilter>(false);
943     break;
944   case X86Local::MRM0r:
945   case X86Local::MRM1r:
946   case X86Local::MRM2r:
947   case X86Local::MRM3r:
948   case X86Local::MRM4r:
949   case X86Local::MRM5r:
950   case X86Local::MRM6r:
951   case X86Local::MRM7r:
952     filter = std::make_unique<ExtendedFilter>(true, Form - X86Local::MRM0r);
953     break;
954   case X86Local::MRM0X:
955   case X86Local::MRM1X:
956   case X86Local::MRM2X:
957   case X86Local::MRM3X:
958   case X86Local::MRM4X:
959   case X86Local::MRM5X:
960   case X86Local::MRM6X:
961   case X86Local::MRM7X:
962     filter = std::make_unique<ExtendedFilter>(true, Form - X86Local::MRM0X);
963     break;
964   case X86Local::MRMr0:
965     filter = std::make_unique<ExtendedRMFilter>(true, Form - X86Local::MRMr0);
966     break;
967   case X86Local::MRM0m:
968   case X86Local::MRM1m:
969   case X86Local::MRM2m:
970   case X86Local::MRM3m:
971   case X86Local::MRM4m:
972   case X86Local::MRM5m:
973   case X86Local::MRM6m:
974   case X86Local::MRM7m:
975     filter = std::make_unique<ExtendedFilter>(false, Form - X86Local::MRM0m);
976     break;
977     X86_INSTR_MRM_MAPPING
978     filter = std::make_unique<ExactFilter>(0xC0 + Form - X86Local::MRM_C0);
979     break;
980   } // switch (Form)
981 
982   uint8_t opcodeToSet = Opcode;
983 
984   unsigned AddressSize = 0;
985   switch (AdSize) {
986   case X86Local::AdSize16:
987     AddressSize = 16;
988     break;
989   case X86Local::AdSize32:
990     AddressSize = 32;
991     break;
992   case X86Local::AdSize64:
993     AddressSize = 64;
994     break;
995   }
996 
997   assert(opcodeType && "Opcode type not set");
998   assert(filter && "Filter not set");
999 
1000   if (Form == X86Local::AddRegFrm || Form == X86Local::MRMSrcRegCC ||
1001       Form == X86Local::MRMSrcMemCC || Form == X86Local::MRMXrCC ||
1002       Form == X86Local::MRMXmCC || Form == X86Local::AddCCFrm ||
1003       Form == X86Local::MRMDestRegCC || Form == X86Local::MRMDestMemCC ||
1004       Form == X86Local::MRMDestMem4VOp3CC) {
1005     uint8_t Count = Form == X86Local::AddRegFrm ? 8 : 16;
1006     assert(((opcodeToSet % Count) == 0) && "ADDREG_FRM opcode not aligned");
1007 
1008     uint8_t currentOpcode;
1009 
1010     for (currentOpcode = opcodeToSet;
1011          currentOpcode < (uint8_t)(opcodeToSet + Count); ++currentOpcode)
1012       tables.setTableFields(*opcodeType, insnContext(), currentOpcode, *filter,
1013                             UID, Is32Bit, OpPrefix == 0,
1014                             IgnoresVEX_L || EncodeRC, IgnoresW, AddressSize);
1015   } else {
1016     tables.setTableFields(*opcodeType, insnContext(), opcodeToSet, *filter, UID,
1017                           Is32Bit, OpPrefix == 0, IgnoresVEX_L || EncodeRC,
1018                           IgnoresW, AddressSize);
1019   }
1020 
1021 #undef MAP
1022 }
1023 
1024 OperandType RecognizableInstr::typeFromString(StringRef Str, bool hasREX_W,
1025                                               uint8_t OpSize) {
1026   StringSwitch<OperandType> Switch(Str);
1027   if (hasREX_W) {
1028     // For instructions with a REX_W prefix, a declared 32-bit register encoding
1029     // is special.
1030     Switch.Case("GR32", TYPE_R32);
1031   }
1032   if (OpSize == X86Local::OpSize16) {
1033     // For OpSize16 instructions, a declared 16-bit register or
1034     // immediate encoding is special.
1035     Switch.Case("GR16", TYPE_Rv);
1036   } else if (OpSize == X86Local::OpSize32) {
1037     // For OpSize32 instructions, a declared 32-bit register or
1038     // immediate encoding is special.
1039     Switch.Case("GR32", TYPE_Rv);
1040   }
1041   // clang-format off
1042   OperandType Type =
1043       Switch.Case("i16mem", TYPE_M)
1044           .Case("i16imm", TYPE_IMM)
1045           .Case("i16i8imm", TYPE_IMM)
1046           .Case("GR16", TYPE_R16)
1047           .Case("GR16orGR32orGR64", TYPE_R16)
1048           .Case("i32mem", TYPE_M)
1049           .Case("i32imm", TYPE_IMM)
1050           .Case("i32i8imm", TYPE_IMM)
1051           .Case("GR32", TYPE_R32)
1052           .Case("GR32orGR64", TYPE_R32)
1053           .Case("i64mem", TYPE_M)
1054           .Case("i64i32imm", TYPE_IMM)
1055           .Case("i64i8imm", TYPE_IMM)
1056           .Case("GR64", TYPE_R64)
1057           .Case("i8mem", TYPE_M)
1058           .Case("i8imm", TYPE_IMM)
1059           .Case("u4imm", TYPE_UIMM8)
1060           .Case("u8imm", TYPE_UIMM8)
1061           .Case("i16u8imm", TYPE_UIMM8)
1062           .Case("i32u8imm", TYPE_UIMM8)
1063           .Case("i64u8imm", TYPE_UIMM8)
1064           .Case("GR8", TYPE_R8)
1065           .Case("VR128", TYPE_XMM)
1066           .Case("VR128X", TYPE_XMM)
1067           .Case("f128mem", TYPE_M)
1068           .Case("f256mem", TYPE_M)
1069           .Case("f512mem", TYPE_M)
1070           .Case("FR128", TYPE_XMM)
1071           .Case("FR64", TYPE_XMM)
1072           .Case("FR64X", TYPE_XMM)
1073           .Case("f64mem", TYPE_M)
1074           .Case("sdmem", TYPE_M)
1075           .Case("FR16X", TYPE_XMM)
1076           .Case("FR32", TYPE_XMM)
1077           .Case("FR32X", TYPE_XMM)
1078           .Case("f32mem", TYPE_M)
1079           .Case("f16mem", TYPE_M)
1080           .Case("ssmem", TYPE_M)
1081           .Case("shmem", TYPE_M)
1082           .Case("RST", TYPE_ST)
1083           .Case("RSTi", TYPE_ST)
1084           .Case("i128mem", TYPE_M)
1085           .Case("i256mem", TYPE_M)
1086           .Case("i512mem", TYPE_M)
1087           .Case("i512mem_GR16", TYPE_M)
1088           .Case("i512mem_GR32", TYPE_M)
1089           .Case("i512mem_GR64", TYPE_M)
1090           .Case("i64i32imm_brtarget", TYPE_REL)
1091           .Case("i8imm_brtarget", TYPE_REL)
1092           .Case("i16imm_brtarget", TYPE_REL)
1093           .Case("i32imm_brtarget", TYPE_REL)
1094           .Case("ccode", TYPE_IMM)
1095           .Case("cflags", TYPE_IMM)
1096           .Case("AVX512RC", TYPE_IMM)
1097           .Case("brtarget32", TYPE_REL)
1098           .Case("brtarget16", TYPE_REL)
1099           .Case("brtarget8", TYPE_REL)
1100           .Case("f80mem", TYPE_M)
1101           .Case("lea64_8mem", TYPE_M)
1102           .Case("lea64_16mem", TYPE_M)
1103           .Case("lea64_32mem", TYPE_M)
1104           .Case("lea64mem", TYPE_M)
1105           .Case("VR64", TYPE_MM64)
1106           .Case("i64imm", TYPE_IMM)
1107           .Case("anymem", TYPE_M)
1108           .Case("opaquemem", TYPE_M)
1109           .Case("sibmem", TYPE_MSIB)
1110           .Case("SEGMENT_REG", TYPE_SEGMENTREG)
1111           .Case("DEBUG_REG", TYPE_DEBUGREG)
1112           .Case("CONTROL_REG", TYPE_CONTROLREG)
1113           .Case("srcidx8", TYPE_SRCIDX)
1114           .Case("srcidx16", TYPE_SRCIDX)
1115           .Case("srcidx32", TYPE_SRCIDX)
1116           .Case("srcidx64", TYPE_SRCIDX)
1117           .Case("dstidx8", TYPE_DSTIDX)
1118           .Case("dstidx16", TYPE_DSTIDX)
1119           .Case("dstidx32", TYPE_DSTIDX)
1120           .Case("dstidx64", TYPE_DSTIDX)
1121           .Case("offset16_8", TYPE_MOFFS)
1122           .Case("offset16_16", TYPE_MOFFS)
1123           .Case("offset16_32", TYPE_MOFFS)
1124           .Case("offset32_8", TYPE_MOFFS)
1125           .Case("offset32_16", TYPE_MOFFS)
1126           .Case("offset32_32", TYPE_MOFFS)
1127           .Case("offset32_64", TYPE_MOFFS)
1128           .Case("offset64_8", TYPE_MOFFS)
1129           .Case("offset64_16", TYPE_MOFFS)
1130           .Case("offset64_32", TYPE_MOFFS)
1131           .Case("offset64_64", TYPE_MOFFS)
1132           .Case("VR256", TYPE_YMM)
1133           .Case("VR256X", TYPE_YMM)
1134           .Case("VR512", TYPE_ZMM)
1135           .Case("VK1", TYPE_VK)
1136           .Case("VK1WM", TYPE_VK)
1137           .Case("VK2", TYPE_VK)
1138           .Case("VK2WM", TYPE_VK)
1139           .Case("VK4", TYPE_VK)
1140           .Case("VK4WM", TYPE_VK)
1141           .Case("VK8", TYPE_VK)
1142           .Case("VK8WM", TYPE_VK)
1143           .Case("VK16", TYPE_VK)
1144           .Case("VK16WM", TYPE_VK)
1145           .Case("VK32", TYPE_VK)
1146           .Case("VK32WM", TYPE_VK)
1147           .Case("VK64", TYPE_VK)
1148           .Case("VK64WM", TYPE_VK)
1149           .Case("VK1Pair", TYPE_VK_PAIR)
1150           .Case("VK2Pair", TYPE_VK_PAIR)
1151           .Case("VK4Pair", TYPE_VK_PAIR)
1152           .Case("VK8Pair", TYPE_VK_PAIR)
1153           .Case("VK16Pair", TYPE_VK_PAIR)
1154           .Case("vx32mem", TYPE_MVSIBX)
1155           .Case("vx64mem", TYPE_MVSIBX)
1156           .Case("vy32mem", TYPE_MVSIBY)
1157           .Case("vy64mem", TYPE_MVSIBY)
1158           .Case("vx32xmem", TYPE_MVSIBX)
1159           .Case("vx64xmem", TYPE_MVSIBX)
1160           .Case("vy32xmem", TYPE_MVSIBY)
1161           .Case("vy64xmem", TYPE_MVSIBY)
1162           .Case("vz32mem", TYPE_MVSIBZ)
1163           .Case("vz64mem", TYPE_MVSIBZ)
1164           .Case("BNDR", TYPE_BNDR)
1165           .Case("TILE", TYPE_TMM)
1166           .Case("TILEPair", TYPE_TMM_PAIR)
1167           .Default(TYPE_NONE);
1168   // clang-format on
1169 
1170   if (Type != TYPE_NONE)
1171     return Type;
1172   errs() << "Unhandled type string " << Str << "\n";
1173   llvm_unreachable("Unhandled type string");
1174 }
1175 
1176 OperandEncoding RecognizableInstr::immediateEncodingFromString(StringRef Str,
1177                                                                uint8_t OpSize) {
1178   StringSwitch<OperandEncoding> Switch(Str);
1179   if (OpSize != X86Local::OpSize16) {
1180     // For instructions without an OpSize prefix, a declared 16-bit register or
1181     // immediate encoding is special.
1182     Switch.Case("i16imm", ENCODING_IW);
1183   }
1184 
1185   // clang-format off
1186   OperandEncoding Encoding =
1187       Switch.Case("i32i8imm", ENCODING_IB)
1188           .Case("AVX512RC", ENCODING_IRC)
1189           .Case("i16imm", ENCODING_Iv)
1190           .Case("i16i8imm", ENCODING_IB)
1191           .Case("i32imm", ENCODING_Iv)
1192           .Case("i64i32imm", ENCODING_ID)
1193           .Case("i64i8imm", ENCODING_IB)
1194           .Case("i8imm", ENCODING_IB)
1195           .Case("ccode", ENCODING_CC)
1196           .Case("cflags", ENCODING_CF)
1197           .Case("u4imm", ENCODING_IB)
1198           .Case("u8imm", ENCODING_IB)
1199           .Case("i16u8imm", ENCODING_IB)
1200           .Case("i32u8imm", ENCODING_IB)
1201           .Case("i64u8imm", ENCODING_IB)
1202           // This is not a typo.  Instructions like BLENDVPD put
1203           // register IDs in 8-bit immediates nowadays.
1204           .Case("FR32", ENCODING_IB)
1205           .Case("FR64", ENCODING_IB)
1206           .Case("FR128", ENCODING_IB)
1207           .Case("VR128", ENCODING_IB)
1208           .Case("VR256", ENCODING_IB)
1209           .Case("FR16X", ENCODING_IB)
1210           .Case("FR32X", ENCODING_IB)
1211           .Case("FR64X", ENCODING_IB)
1212           .Case("VR128X", ENCODING_IB)
1213           .Case("VR256X", ENCODING_IB)
1214           .Case("VR512", ENCODING_IB)
1215           .Case("TILE", ENCODING_IB)
1216           .Default(ENCODING_NONE);
1217   // clang-format on
1218 
1219   if (Encoding != ENCODING_NONE)
1220     return Encoding;
1221   errs() << "Unhandled immediate encoding " << Str << "\n";
1222   llvm_unreachable("Unhandled immediate encoding");
1223 }
1224 
1225 OperandEncoding
1226 RecognizableInstr::rmRegisterEncodingFromString(StringRef Str, uint8_t OpSize) {
1227   // clang-format off
1228   auto Encoding =
1229       StringSwitch<OperandEncoding>(Str)
1230           .Case("RST", ENCODING_FP)
1231           .Case("RSTi", ENCODING_FP)
1232           .Case("GR16", ENCODING_RM)
1233           .Case("GR16orGR32orGR64", ENCODING_RM)
1234           .Case("GR32", ENCODING_RM)
1235           .Case("GR32orGR64", ENCODING_RM)
1236           .Case("GR64", ENCODING_RM)
1237           .Case("GR8", ENCODING_RM)
1238           .Case("VR128", ENCODING_RM)
1239           .Case("VR128X", ENCODING_RM)
1240           .Case("FR128", ENCODING_RM)
1241           .Case("FR64", ENCODING_RM)
1242           .Case("FR32", ENCODING_RM)
1243           .Case("FR64X", ENCODING_RM)
1244           .Case("FR32X", ENCODING_RM)
1245           .Case("FR16X", ENCODING_RM)
1246           .Case("VR64", ENCODING_RM)
1247           .Case("VR256", ENCODING_RM)
1248           .Case("VR256X", ENCODING_RM)
1249           .Case("VR512", ENCODING_RM)
1250           .Case("VK1", ENCODING_RM)
1251           .Case("VK2", ENCODING_RM)
1252           .Case("VK4", ENCODING_RM)
1253           .Case("VK8", ENCODING_RM)
1254           .Case("VK16", ENCODING_RM)
1255           .Case("VK32", ENCODING_RM)
1256           .Case("VK64", ENCODING_RM)
1257           .Case("BNDR", ENCODING_RM)
1258           .Case("TILE", ENCODING_RM)
1259           .Case("TILEPair", ENCODING_RM)
1260           .Default(ENCODING_NONE);
1261   // clang-format on
1262   if (Encoding != ENCODING_NONE)
1263     return Encoding;
1264   errs() << "Unhandled R/M register encoding " << Str << "\n";
1265   llvm_unreachable("Unhandled R/M register encoding");
1266 }
1267 
1268 OperandEncoding
1269 RecognizableInstr::roRegisterEncodingFromString(StringRef Str, uint8_t OpSize) {
1270   // clang-format off
1271   auto Encoding =
1272       StringSwitch<OperandEncoding>(Str)
1273           .Case("GR16", ENCODING_REG)
1274           .Case("GR16orGR32orGR64", ENCODING_REG)
1275           .Case("GR32", ENCODING_REG)
1276           .Case("GR32orGR64", ENCODING_REG)
1277           .Case("GR64", ENCODING_REG)
1278           .Case("GR8", ENCODING_REG)
1279           .Case("VR128", ENCODING_REG)
1280           .Case("FR128", ENCODING_REG)
1281           .Case("FR64", ENCODING_REG)
1282           .Case("FR32", ENCODING_REG)
1283           .Case("VR64", ENCODING_REG)
1284           .Case("SEGMENT_REG", ENCODING_REG)
1285           .Case("DEBUG_REG", ENCODING_REG)
1286           .Case("CONTROL_REG", ENCODING_REG)
1287           .Case("VR256", ENCODING_REG)
1288           .Case("VR256X", ENCODING_REG)
1289           .Case("VR128X", ENCODING_REG)
1290           .Case("FR64X", ENCODING_REG)
1291           .Case("FR32X", ENCODING_REG)
1292           .Case("FR16X", ENCODING_REG)
1293           .Case("VR512", ENCODING_REG)
1294           .Case("VK1", ENCODING_REG)
1295           .Case("VK2", ENCODING_REG)
1296           .Case("VK4", ENCODING_REG)
1297           .Case("VK8", ENCODING_REG)
1298           .Case("VK16", ENCODING_REG)
1299           .Case("VK32", ENCODING_REG)
1300           .Case("VK64", ENCODING_REG)
1301           .Case("VK1Pair", ENCODING_REG)
1302           .Case("VK2Pair", ENCODING_REG)
1303           .Case("VK4Pair", ENCODING_REG)
1304           .Case("VK8Pair", ENCODING_REG)
1305           .Case("VK16Pair", ENCODING_REG)
1306           .Case("VK1WM", ENCODING_REG)
1307           .Case("VK2WM", ENCODING_REG)
1308           .Case("VK4WM", ENCODING_REG)
1309           .Case("VK8WM", ENCODING_REG)
1310           .Case("VK16WM", ENCODING_REG)
1311           .Case("VK32WM", ENCODING_REG)
1312           .Case("VK64WM", ENCODING_REG)
1313           .Case("BNDR", ENCODING_REG)
1314           .Case("TILE", ENCODING_REG)
1315           .Case("TILEPair", ENCODING_REG)
1316           .Default(ENCODING_NONE);
1317   // clang-format on
1318 
1319   if (Encoding != ENCODING_NONE)
1320     return Encoding;
1321 
1322   errs() << "Unhandled reg/opcode register encoding " << Str << "\n";
1323   llvm_unreachable("Unhandled reg/opcode register encoding");
1324 }
1325 
1326 OperandEncoding
1327 RecognizableInstr::vvvvRegisterEncodingFromString(StringRef Str,
1328                                                   uint8_t OpSize) {
1329   // clang-format off
1330   auto Encoding =
1331       StringSwitch<OperandEncoding>(Str)
1332           .Case("GR8", ENCODING_VVVV)
1333           .Case("GR16", ENCODING_VVVV)
1334           .Case("GR32", ENCODING_VVVV)
1335           .Case("GR64", ENCODING_VVVV)
1336           .Case("FR32", ENCODING_VVVV)
1337           .Case("FR128", ENCODING_VVVV)
1338           .Case("FR64", ENCODING_VVVV)
1339           .Case("VR128", ENCODING_VVVV)
1340           .Case("VR256", ENCODING_VVVV)
1341           .Case("FR16X", ENCODING_VVVV)
1342           .Case("FR32X", ENCODING_VVVV)
1343           .Case("FR64X", ENCODING_VVVV)
1344           .Case("VR128X", ENCODING_VVVV)
1345           .Case("VR256X", ENCODING_VVVV)
1346           .Case("VR512", ENCODING_VVVV)
1347           .Case("VK1", ENCODING_VVVV)
1348           .Case("VK2", ENCODING_VVVV)
1349           .Case("VK4", ENCODING_VVVV)
1350           .Case("VK8", ENCODING_VVVV)
1351           .Case("VK16", ENCODING_VVVV)
1352           .Case("VK32", ENCODING_VVVV)
1353           .Case("VK64", ENCODING_VVVV)
1354           .Case("TILE", ENCODING_VVVV)
1355           .Case("TILEPair", ENCODING_VVVV)
1356           .Default(ENCODING_NONE);
1357   // clang-format on
1358   if (Encoding != ENCODING_NONE)
1359     return Encoding;
1360 
1361   errs() << "Unhandled VEX.vvvv register encoding " << Str << "\n";
1362   llvm_unreachable("Unhandled VEX.vvvv register encoding");
1363 }
1364 
1365 OperandEncoding
1366 RecognizableInstr::writemaskRegisterEncodingFromString(StringRef Str,
1367                                                        uint8_t OpSize) {
1368   // clang-format off
1369   auto Encoding =
1370       StringSwitch<OperandEncoding>(Str)
1371           .Case("VK1WM", ENCODING_WRITEMASK)
1372           .Case("VK2WM", ENCODING_WRITEMASK)
1373           .Case("VK4WM", ENCODING_WRITEMASK)
1374           .Case("VK8WM", ENCODING_WRITEMASK)
1375           .Case("VK16WM", ENCODING_WRITEMASK)
1376           .Case("VK32WM", ENCODING_WRITEMASK)
1377           .Case("VK64WM", ENCODING_WRITEMASK)
1378           .Default(ENCODING_NONE);
1379   // clang-format on
1380 
1381   if (Encoding != ENCODING_NONE)
1382     return Encoding;
1383 
1384   errs() << "Unhandled mask register encoding " << Str << "\n";
1385   llvm_unreachable("Unhandled mask register encoding");
1386 }
1387 
1388 OperandEncoding RecognizableInstr::memoryEncodingFromString(StringRef Str,
1389                                                             uint8_t OpSize) {
1390   // clang-format off
1391   auto Encoding =
1392       StringSwitch<OperandEncoding>(Str)
1393           .Case("i16mem", ENCODING_RM)
1394           .Case("i32mem", ENCODING_RM)
1395           .Case("i64mem", ENCODING_RM)
1396           .Case("i8mem", ENCODING_RM)
1397           .Case("shmem", ENCODING_RM)
1398           .Case("ssmem", ENCODING_RM)
1399           .Case("sdmem", ENCODING_RM)
1400           .Case("f128mem", ENCODING_RM)
1401           .Case("f256mem", ENCODING_RM)
1402           .Case("f512mem", ENCODING_RM)
1403           .Case("f64mem", ENCODING_RM)
1404           .Case("f32mem", ENCODING_RM)
1405           .Case("f16mem", ENCODING_RM)
1406           .Case("i128mem", ENCODING_RM)
1407           .Case("i256mem", ENCODING_RM)
1408           .Case("i512mem", ENCODING_RM)
1409           .Case("i512mem_GR16", ENCODING_RM)
1410           .Case("i512mem_GR32", ENCODING_RM)
1411           .Case("i512mem_GR64", ENCODING_RM)
1412           .Case("f80mem", ENCODING_RM)
1413           .Case("lea64_8mem", ENCODING_RM)
1414           .Case("lea64_16mem", ENCODING_RM)
1415           .Case("lea64_32mem", ENCODING_RM)
1416           .Case("lea64mem", ENCODING_RM)
1417           .Case("anymem", ENCODING_RM)
1418           .Case("opaquemem", ENCODING_RM)
1419           .Case("sibmem", ENCODING_SIB)
1420           .Case("vx32mem", ENCODING_VSIB)
1421           .Case("vx64mem", ENCODING_VSIB)
1422           .Case("vy32mem", ENCODING_VSIB)
1423           .Case("vy64mem", ENCODING_VSIB)
1424           .Case("vx32xmem", ENCODING_VSIB)
1425           .Case("vx64xmem", ENCODING_VSIB)
1426           .Case("vy32xmem", ENCODING_VSIB)
1427           .Case("vy64xmem", ENCODING_VSIB)
1428           .Case("vz32mem", ENCODING_VSIB)
1429           .Case("vz64mem", ENCODING_VSIB)
1430           .Default(ENCODING_NONE);
1431   // clang-format on
1432 
1433   if (Encoding != ENCODING_NONE)
1434     return Encoding;
1435 
1436   errs() << "Unhandled memory encoding " << Str << "\n";
1437   llvm_unreachable("Unhandled memory encoding");
1438 }
1439 
1440 OperandEncoding
1441 RecognizableInstr::relocationEncodingFromString(StringRef Str, uint8_t OpSize) {
1442   StringSwitch<OperandEncoding> Switch(Str);
1443 
1444   if (OpSize != X86Local::OpSize16) {
1445     // For instructions without an OpSize prefix, a declared 16-bit register or
1446     // immediate encoding is special.
1447     Switch.Case("i16imm", ENCODING_IW);
1448   }
1449 
1450   // clang-format off
1451   OperandEncoding Encoding =
1452       Switch.Case("i16imm", ENCODING_Iv)
1453           .Case("i16i8imm", ENCODING_IB)
1454           .Case("i32imm", ENCODING_Iv)
1455           .Case("i32i8imm", ENCODING_IB)
1456           .Case("i64i32imm", ENCODING_ID)
1457           .Case("i64i8imm", ENCODING_IB)
1458           .Case("i8imm", ENCODING_IB)
1459           .Case("u8imm", ENCODING_IB)
1460           .Case("i16u8imm", ENCODING_IB)
1461           .Case("i32u8imm", ENCODING_IB)
1462           .Case("i64u8imm", ENCODING_IB)
1463           .Case("i64i32imm_brtarget", ENCODING_ID)
1464           .Case("i16imm_brtarget", ENCODING_IW)
1465           .Case("i32imm_brtarget", ENCODING_ID)
1466           .Case("i8imm_brtarget", ENCODING_IB)
1467           .Case("brtarget32", ENCODING_ID)
1468           .Case("brtarget16", ENCODING_IW)
1469           .Case("brtarget8", ENCODING_IB)
1470           .Case("i64imm", ENCODING_IO)
1471           .Case("offset16_8", ENCODING_Ia)
1472           .Case("offset16_16", ENCODING_Ia)
1473           .Case("offset16_32", ENCODING_Ia)
1474           .Case("offset32_8", ENCODING_Ia)
1475           .Case("offset32_16", ENCODING_Ia)
1476           .Case("offset32_32", ENCODING_Ia)
1477           .Case("offset32_64", ENCODING_Ia)
1478           .Case("offset64_8", ENCODING_Ia)
1479           .Case("offset64_16", ENCODING_Ia)
1480           .Case("offset64_32", ENCODING_Ia)
1481           .Case("offset64_64", ENCODING_Ia)
1482           .Case("srcidx8", ENCODING_SI)
1483           .Case("srcidx16", ENCODING_SI)
1484           .Case("srcidx32", ENCODING_SI)
1485           .Case("srcidx64", ENCODING_SI)
1486           .Case("dstidx8", ENCODING_DI)
1487           .Case("dstidx16", ENCODING_DI)
1488           .Case("dstidx32", ENCODING_DI)
1489           .Case("dstidx64", ENCODING_DI)
1490           .Default(ENCODING_NONE);
1491   // clang-format on
1492 
1493   if (Encoding != ENCODING_NONE)
1494     return Encoding;
1495 
1496   errs() << "Unhandled relocation encoding " << Str << "\n";
1497   llvm_unreachable("Unhandled relocation encoding");
1498 }
1499 
1500 OperandEncoding
1501 RecognizableInstr::opcodeModifierEncodingFromString(StringRef Str,
1502                                                     uint8_t OpSize) {
1503   // clang-format off
1504   auto Encoding =
1505       StringSwitch<OperandEncoding>(Str)
1506           .Case("GR32", ENCODING_Rv)
1507           .Case("GR64", ENCODING_RO)
1508           .Case("GR16", ENCODING_Rv)
1509           .Case("GR8", ENCODING_RB)
1510           .Case("ccode", ENCODING_CC)
1511           .Default(ENCODING_NONE);
1512   // clang-format on
1513   if (Encoding != ENCODING_NONE)
1514     return Encoding;
1515 
1516   errs() << "Unhandled opcode modifier encoding " << Str << "\n";
1517   llvm_unreachable("Unhandled opcode modifier encoding");
1518 }
1519