xref: /aosp_15_r20/external/llvm/utils/TableGen/X86RecognizableInstr.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- X86RecognizableInstr.cpp - Disassembler instruction spec --*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file is part of the X86 Disassembler Emitter.
11*9880d681SAndroid Build Coastguard Worker // It contains the implementation of a single recognizable instruction.
12*9880d681SAndroid Build Coastguard Worker // Documentation for the disassembler emitter in general can be found in
13*9880d681SAndroid Build Coastguard Worker //  X86DisasemblerEmitter.h.
14*9880d681SAndroid Build Coastguard Worker //
15*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
16*9880d681SAndroid Build Coastguard Worker 
17*9880d681SAndroid Build Coastguard Worker #include "X86RecognizableInstr.h"
18*9880d681SAndroid Build Coastguard Worker #include "X86DisassemblerShared.h"
19*9880d681SAndroid Build Coastguard Worker #include "X86ModRMFilters.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
21*9880d681SAndroid Build Coastguard Worker #include <string>
22*9880d681SAndroid Build Coastguard Worker 
23*9880d681SAndroid Build Coastguard Worker using namespace llvm;
24*9880d681SAndroid Build Coastguard Worker 
25*9880d681SAndroid Build Coastguard Worker #define MRM_MAPPING     \
26*9880d681SAndroid Build Coastguard Worker   MAP(C0, 32)           \
27*9880d681SAndroid Build Coastguard Worker   MAP(C1, 33)           \
28*9880d681SAndroid Build Coastguard Worker   MAP(C2, 34)           \
29*9880d681SAndroid Build Coastguard Worker   MAP(C3, 35)           \
30*9880d681SAndroid Build Coastguard Worker   MAP(C4, 36)           \
31*9880d681SAndroid Build Coastguard Worker   MAP(C5, 37)           \
32*9880d681SAndroid Build Coastguard Worker   MAP(C6, 38)           \
33*9880d681SAndroid Build Coastguard Worker   MAP(C7, 39)           \
34*9880d681SAndroid Build Coastguard Worker   MAP(C8, 40)           \
35*9880d681SAndroid Build Coastguard Worker   MAP(C9, 41)           \
36*9880d681SAndroid Build Coastguard Worker   MAP(CA, 42)           \
37*9880d681SAndroid Build Coastguard Worker   MAP(CB, 43)           \
38*9880d681SAndroid Build Coastguard Worker   MAP(CC, 44)           \
39*9880d681SAndroid Build Coastguard Worker   MAP(CD, 45)           \
40*9880d681SAndroid Build Coastguard Worker   MAP(CE, 46)           \
41*9880d681SAndroid Build Coastguard Worker   MAP(CF, 47)           \
42*9880d681SAndroid Build Coastguard Worker   MAP(D0, 48)           \
43*9880d681SAndroid Build Coastguard Worker   MAP(D1, 49)           \
44*9880d681SAndroid Build Coastguard Worker   MAP(D2, 50)           \
45*9880d681SAndroid Build Coastguard Worker   MAP(D3, 51)           \
46*9880d681SAndroid Build Coastguard Worker   MAP(D4, 52)           \
47*9880d681SAndroid Build Coastguard Worker   MAP(D5, 53)           \
48*9880d681SAndroid Build Coastguard Worker   MAP(D6, 54)           \
49*9880d681SAndroid Build Coastguard Worker   MAP(D7, 55)           \
50*9880d681SAndroid Build Coastguard Worker   MAP(D8, 56)           \
51*9880d681SAndroid Build Coastguard Worker   MAP(D9, 57)           \
52*9880d681SAndroid Build Coastguard Worker   MAP(DA, 58)           \
53*9880d681SAndroid Build Coastguard Worker   MAP(DB, 59)           \
54*9880d681SAndroid Build Coastguard Worker   MAP(DC, 60)           \
55*9880d681SAndroid Build Coastguard Worker   MAP(DD, 61)           \
56*9880d681SAndroid Build Coastguard Worker   MAP(DE, 62)           \
57*9880d681SAndroid Build Coastguard Worker   MAP(DF, 63)           \
58*9880d681SAndroid Build Coastguard Worker   MAP(E0, 64)           \
59*9880d681SAndroid Build Coastguard Worker   MAP(E1, 65)           \
60*9880d681SAndroid Build Coastguard Worker   MAP(E2, 66)           \
61*9880d681SAndroid Build Coastguard Worker   MAP(E3, 67)           \
62*9880d681SAndroid Build Coastguard Worker   MAP(E4, 68)           \
63*9880d681SAndroid Build Coastguard Worker   MAP(E5, 69)           \
64*9880d681SAndroid Build Coastguard Worker   MAP(E6, 70)           \
65*9880d681SAndroid Build Coastguard Worker   MAP(E7, 71)           \
66*9880d681SAndroid Build Coastguard Worker   MAP(E8, 72)           \
67*9880d681SAndroid Build Coastguard Worker   MAP(E9, 73)           \
68*9880d681SAndroid Build Coastguard Worker   MAP(EA, 74)           \
69*9880d681SAndroid Build Coastguard Worker   MAP(EB, 75)           \
70*9880d681SAndroid Build Coastguard Worker   MAP(EC, 76)           \
71*9880d681SAndroid Build Coastguard Worker   MAP(ED, 77)           \
72*9880d681SAndroid Build Coastguard Worker   MAP(EE, 78)           \
73*9880d681SAndroid Build Coastguard Worker   MAP(EF, 79)           \
74*9880d681SAndroid Build Coastguard Worker   MAP(F0, 80)           \
75*9880d681SAndroid Build Coastguard Worker   MAP(F1, 81)           \
76*9880d681SAndroid Build Coastguard Worker   MAP(F2, 82)           \
77*9880d681SAndroid Build Coastguard Worker   MAP(F3, 83)           \
78*9880d681SAndroid Build Coastguard Worker   MAP(F4, 84)           \
79*9880d681SAndroid Build Coastguard Worker   MAP(F5, 85)           \
80*9880d681SAndroid Build Coastguard Worker   MAP(F6, 86)           \
81*9880d681SAndroid Build Coastguard Worker   MAP(F7, 87)           \
82*9880d681SAndroid Build Coastguard Worker   MAP(F8, 88)           \
83*9880d681SAndroid Build Coastguard Worker   MAP(F9, 89)           \
84*9880d681SAndroid Build Coastguard Worker   MAP(FA, 90)           \
85*9880d681SAndroid Build Coastguard Worker   MAP(FB, 91)           \
86*9880d681SAndroid Build Coastguard Worker   MAP(FC, 92)           \
87*9880d681SAndroid Build Coastguard Worker   MAP(FD, 93)           \
88*9880d681SAndroid Build Coastguard Worker   MAP(FE, 94)           \
89*9880d681SAndroid Build Coastguard Worker   MAP(FF, 95)
90*9880d681SAndroid Build Coastguard Worker 
91*9880d681SAndroid Build Coastguard Worker // A clone of X86 since we can't depend on something that is generated.
92*9880d681SAndroid Build Coastguard Worker namespace X86Local {
93*9880d681SAndroid Build Coastguard Worker   enum {
94*9880d681SAndroid Build Coastguard Worker     Pseudo      = 0,
95*9880d681SAndroid Build Coastguard Worker     RawFrm      = 1,
96*9880d681SAndroid Build Coastguard Worker     AddRegFrm   = 2,
97*9880d681SAndroid Build Coastguard Worker     MRMDestReg  = 3,
98*9880d681SAndroid Build Coastguard Worker     MRMDestMem  = 4,
99*9880d681SAndroid Build Coastguard Worker     MRMSrcReg   = 5,
100*9880d681SAndroid Build Coastguard Worker     MRMSrcMem   = 6,
101*9880d681SAndroid Build Coastguard Worker     RawFrmMemOffs = 7,
102*9880d681SAndroid Build Coastguard Worker     RawFrmSrc   = 8,
103*9880d681SAndroid Build Coastguard Worker     RawFrmDst   = 9,
104*9880d681SAndroid Build Coastguard Worker     RawFrmDstSrc = 10,
105*9880d681SAndroid Build Coastguard Worker     RawFrmImm8  = 11,
106*9880d681SAndroid Build Coastguard Worker     RawFrmImm16 = 12,
107*9880d681SAndroid Build Coastguard Worker     MRMXr = 14, MRMXm = 15,
108*9880d681SAndroid Build Coastguard Worker     MRM0r = 16, MRM1r = 17, MRM2r = 18, MRM3r = 19,
109*9880d681SAndroid Build Coastguard Worker     MRM4r = 20, MRM5r = 21, MRM6r = 22, MRM7r = 23,
110*9880d681SAndroid Build Coastguard Worker     MRM0m = 24, MRM1m = 25, MRM2m = 26, MRM3m = 27,
111*9880d681SAndroid Build Coastguard Worker     MRM4m = 28, MRM5m = 29, MRM6m = 30, MRM7m = 31,
112*9880d681SAndroid Build Coastguard Worker #define MAP(from, to) MRM_##from = to,
113*9880d681SAndroid Build Coastguard Worker     MRM_MAPPING
114*9880d681SAndroid Build Coastguard Worker #undef MAP
115*9880d681SAndroid Build Coastguard Worker     lastMRM
116*9880d681SAndroid Build Coastguard Worker   };
117*9880d681SAndroid Build Coastguard Worker 
118*9880d681SAndroid Build Coastguard Worker   enum {
119*9880d681SAndroid Build Coastguard Worker     OB = 0, TB = 1, T8 = 2, TA = 3, XOP8 = 4, XOP9 = 5, XOPA = 6
120*9880d681SAndroid Build Coastguard Worker   };
121*9880d681SAndroid Build Coastguard Worker 
122*9880d681SAndroid Build Coastguard Worker   enum {
123*9880d681SAndroid Build Coastguard Worker     PS = 1, PD = 2, XS = 3, XD = 4
124*9880d681SAndroid Build Coastguard Worker   };
125*9880d681SAndroid Build Coastguard Worker 
126*9880d681SAndroid Build Coastguard Worker   enum {
127*9880d681SAndroid Build Coastguard Worker     VEX = 1, XOP = 2, EVEX = 3
128*9880d681SAndroid Build Coastguard Worker   };
129*9880d681SAndroid Build Coastguard Worker 
130*9880d681SAndroid Build Coastguard Worker   enum {
131*9880d681SAndroid Build Coastguard Worker     OpSize16 = 1, OpSize32 = 2
132*9880d681SAndroid Build Coastguard Worker   };
133*9880d681SAndroid Build Coastguard Worker 
134*9880d681SAndroid Build Coastguard Worker   enum {
135*9880d681SAndroid Build Coastguard Worker     AdSize16 = 1, AdSize32 = 2, AdSize64 = 3
136*9880d681SAndroid Build Coastguard Worker   };
137*9880d681SAndroid Build Coastguard Worker }
138*9880d681SAndroid Build Coastguard Worker 
139*9880d681SAndroid Build Coastguard Worker using namespace X86Disassembler;
140*9880d681SAndroid Build Coastguard Worker 
141*9880d681SAndroid Build Coastguard Worker /// isRegFormat - Indicates whether a particular form requires the Mod field of
142*9880d681SAndroid Build Coastguard Worker ///   the ModR/M byte to be 0b11.
143*9880d681SAndroid Build Coastguard Worker ///
144*9880d681SAndroid Build Coastguard Worker /// @param form - The form of the instruction.
145*9880d681SAndroid Build Coastguard Worker /// @return     - true if the form implies that Mod must be 0b11, false
146*9880d681SAndroid Build Coastguard Worker ///               otherwise.
isRegFormat(uint8_t form)147*9880d681SAndroid Build Coastguard Worker static bool isRegFormat(uint8_t form) {
148*9880d681SAndroid Build Coastguard Worker   return (form == X86Local::MRMDestReg ||
149*9880d681SAndroid Build Coastguard Worker           form == X86Local::MRMSrcReg  ||
150*9880d681SAndroid Build Coastguard Worker           form == X86Local::MRMXr ||
151*9880d681SAndroid Build Coastguard Worker           (form >= X86Local::MRM0r && form <= X86Local::MRM7r));
152*9880d681SAndroid Build Coastguard Worker }
153*9880d681SAndroid Build Coastguard Worker 
154*9880d681SAndroid Build Coastguard Worker /// byteFromBitsInit - Extracts a value at most 8 bits in width from a BitsInit.
155*9880d681SAndroid Build Coastguard Worker ///   Useful for switch statements and the like.
156*9880d681SAndroid Build Coastguard Worker ///
157*9880d681SAndroid Build Coastguard Worker /// @param init - A reference to the BitsInit to be decoded.
158*9880d681SAndroid Build Coastguard Worker /// @return     - The field, with the first bit in the BitsInit as the lowest
159*9880d681SAndroid Build Coastguard Worker ///               order bit.
byteFromBitsInit(BitsInit & init)160*9880d681SAndroid Build Coastguard Worker static uint8_t byteFromBitsInit(BitsInit &init) {
161*9880d681SAndroid Build Coastguard Worker   int width = init.getNumBits();
162*9880d681SAndroid Build Coastguard Worker 
163*9880d681SAndroid Build Coastguard Worker   assert(width <= 8 && "Field is too large for uint8_t!");
164*9880d681SAndroid Build Coastguard Worker 
165*9880d681SAndroid Build Coastguard Worker   int     index;
166*9880d681SAndroid Build Coastguard Worker   uint8_t mask = 0x01;
167*9880d681SAndroid Build Coastguard Worker 
168*9880d681SAndroid Build Coastguard Worker   uint8_t ret = 0;
169*9880d681SAndroid Build Coastguard Worker 
170*9880d681SAndroid Build Coastguard Worker   for (index = 0; index < width; index++) {
171*9880d681SAndroid Build Coastguard Worker     if (static_cast<BitInit*>(init.getBit(index))->getValue())
172*9880d681SAndroid Build Coastguard Worker       ret |= mask;
173*9880d681SAndroid Build Coastguard Worker 
174*9880d681SAndroid Build Coastguard Worker     mask <<= 1;
175*9880d681SAndroid Build Coastguard Worker   }
176*9880d681SAndroid Build Coastguard Worker 
177*9880d681SAndroid Build Coastguard Worker   return ret;
178*9880d681SAndroid Build Coastguard Worker }
179*9880d681SAndroid Build Coastguard Worker 
180*9880d681SAndroid Build Coastguard Worker /// byteFromRec - Extract a value at most 8 bits in with from a Record given the
181*9880d681SAndroid Build Coastguard Worker ///   name of the field.
182*9880d681SAndroid Build Coastguard Worker ///
183*9880d681SAndroid Build Coastguard Worker /// @param rec  - The record from which to extract the value.
184*9880d681SAndroid Build Coastguard Worker /// @param name - The name of the field in the record.
185*9880d681SAndroid Build Coastguard Worker /// @return     - The field, as translated by byteFromBitsInit().
byteFromRec(const Record * rec,const std::string & name)186*9880d681SAndroid Build Coastguard Worker static uint8_t byteFromRec(const Record* rec, const std::string &name) {
187*9880d681SAndroid Build Coastguard Worker   BitsInit* bits = rec->getValueAsBitsInit(name);
188*9880d681SAndroid Build Coastguard Worker   return byteFromBitsInit(*bits);
189*9880d681SAndroid Build Coastguard Worker }
190*9880d681SAndroid Build Coastguard Worker 
RecognizableInstr(DisassemblerTables & tables,const CodeGenInstruction & insn,InstrUID uid)191*9880d681SAndroid Build Coastguard Worker RecognizableInstr::RecognizableInstr(DisassemblerTables &tables,
192*9880d681SAndroid Build Coastguard Worker                                      const CodeGenInstruction &insn,
193*9880d681SAndroid Build Coastguard Worker                                      InstrUID uid) {
194*9880d681SAndroid Build Coastguard Worker   UID = uid;
195*9880d681SAndroid Build Coastguard Worker 
196*9880d681SAndroid Build Coastguard Worker   Rec = insn.TheDef;
197*9880d681SAndroid Build Coastguard Worker   Name = Rec->getName();
198*9880d681SAndroid Build Coastguard Worker   Spec = &tables.specForUID(UID);
199*9880d681SAndroid Build Coastguard Worker 
200*9880d681SAndroid Build Coastguard Worker   if (!Rec->isSubClassOf("X86Inst")) {
201*9880d681SAndroid Build Coastguard Worker     ShouldBeEmitted = false;
202*9880d681SAndroid Build Coastguard Worker     return;
203*9880d681SAndroid Build Coastguard Worker   }
204*9880d681SAndroid Build Coastguard Worker 
205*9880d681SAndroid Build Coastguard Worker   OpPrefix = byteFromRec(Rec, "OpPrefixBits");
206*9880d681SAndroid Build Coastguard Worker   OpMap    = byteFromRec(Rec, "OpMapBits");
207*9880d681SAndroid Build Coastguard Worker   Opcode   = byteFromRec(Rec, "Opcode");
208*9880d681SAndroid Build Coastguard Worker   Form     = byteFromRec(Rec, "FormBits");
209*9880d681SAndroid Build Coastguard Worker   Encoding = byteFromRec(Rec, "OpEncBits");
210*9880d681SAndroid Build Coastguard Worker 
211*9880d681SAndroid Build Coastguard Worker   OpSize           = byteFromRec(Rec, "OpSizeBits");
212*9880d681SAndroid Build Coastguard Worker   AdSize           = byteFromRec(Rec, "AdSizeBits");
213*9880d681SAndroid Build Coastguard Worker   HasREX_WPrefix   = Rec->getValueAsBit("hasREX_WPrefix");
214*9880d681SAndroid Build Coastguard Worker   HasVEX_4V        = Rec->getValueAsBit("hasVEX_4V");
215*9880d681SAndroid Build Coastguard Worker   HasVEX_4VOp3     = Rec->getValueAsBit("hasVEX_4VOp3");
216*9880d681SAndroid Build Coastguard Worker   HasVEX_WPrefix   = Rec->getValueAsBit("hasVEX_WPrefix");
217*9880d681SAndroid Build Coastguard Worker   HasMemOp4Prefix  = Rec->getValueAsBit("hasMemOp4Prefix");
218*9880d681SAndroid Build Coastguard Worker   IgnoresVEX_L     = Rec->getValueAsBit("ignoresVEX_L");
219*9880d681SAndroid Build Coastguard Worker   HasEVEX_L2Prefix = Rec->getValueAsBit("hasEVEX_L2");
220*9880d681SAndroid Build Coastguard Worker   HasEVEX_K        = Rec->getValueAsBit("hasEVEX_K");
221*9880d681SAndroid Build Coastguard Worker   HasEVEX_KZ       = Rec->getValueAsBit("hasEVEX_Z");
222*9880d681SAndroid Build Coastguard Worker   HasEVEX_B        = Rec->getValueAsBit("hasEVEX_B");
223*9880d681SAndroid Build Coastguard Worker   IsCodeGenOnly    = Rec->getValueAsBit("isCodeGenOnly");
224*9880d681SAndroid Build Coastguard Worker   ForceDisassemble = Rec->getValueAsBit("ForceDisassemble");
225*9880d681SAndroid Build Coastguard Worker   CD8_Scale        = byteFromRec(Rec, "CD8_Scale");
226*9880d681SAndroid Build Coastguard Worker 
227*9880d681SAndroid Build Coastguard Worker   Name      = Rec->getName();
228*9880d681SAndroid Build Coastguard Worker 
229*9880d681SAndroid Build Coastguard Worker   Operands = &insn.Operands.OperandList;
230*9880d681SAndroid Build Coastguard Worker 
231*9880d681SAndroid Build Coastguard Worker   HasVEX_LPrefix   = Rec->getValueAsBit("hasVEX_L");
232*9880d681SAndroid Build Coastguard Worker 
233*9880d681SAndroid Build Coastguard Worker   // Check for 64-bit inst which does not require REX
234*9880d681SAndroid Build Coastguard Worker   Is32Bit = false;
235*9880d681SAndroid Build Coastguard Worker   Is64Bit = false;
236*9880d681SAndroid Build Coastguard Worker   // FIXME: Is there some better way to check for In64BitMode?
237*9880d681SAndroid Build Coastguard Worker   std::vector<Record*> Predicates = Rec->getValueAsListOfDefs("Predicates");
238*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0, e = Predicates.size(); i != e; ++i) {
239*9880d681SAndroid Build Coastguard Worker     if (Predicates[i]->getName().find("Not64Bit") != Name.npos ||
240*9880d681SAndroid Build Coastguard Worker 	Predicates[i]->getName().find("In32Bit") != Name.npos) {
241*9880d681SAndroid Build Coastguard Worker       Is32Bit = true;
242*9880d681SAndroid Build Coastguard Worker       break;
243*9880d681SAndroid Build Coastguard Worker     }
244*9880d681SAndroid Build Coastguard Worker     if (Predicates[i]->getName().find("In64Bit") != Name.npos) {
245*9880d681SAndroid Build Coastguard Worker       Is64Bit = true;
246*9880d681SAndroid Build Coastguard Worker       break;
247*9880d681SAndroid Build Coastguard Worker     }
248*9880d681SAndroid Build Coastguard Worker   }
249*9880d681SAndroid Build Coastguard Worker 
250*9880d681SAndroid Build Coastguard Worker   if (Form == X86Local::Pseudo || (IsCodeGenOnly && !ForceDisassemble)) {
251*9880d681SAndroid Build Coastguard Worker     ShouldBeEmitted = false;
252*9880d681SAndroid Build Coastguard Worker     return;
253*9880d681SAndroid Build Coastguard Worker   }
254*9880d681SAndroid Build Coastguard Worker 
255*9880d681SAndroid Build Coastguard Worker   // Special case since there is no attribute class for 64-bit and VEX
256*9880d681SAndroid Build Coastguard Worker   if (Name == "VMASKMOVDQU64") {
257*9880d681SAndroid Build Coastguard Worker     ShouldBeEmitted = false;
258*9880d681SAndroid Build Coastguard Worker     return;
259*9880d681SAndroid Build Coastguard Worker   }
260*9880d681SAndroid Build Coastguard Worker 
261*9880d681SAndroid Build Coastguard Worker   ShouldBeEmitted  = true;
262*9880d681SAndroid Build Coastguard Worker }
263*9880d681SAndroid Build Coastguard Worker 
processInstr(DisassemblerTables & tables,const CodeGenInstruction & insn,InstrUID uid)264*9880d681SAndroid Build Coastguard Worker void RecognizableInstr::processInstr(DisassemblerTables &tables,
265*9880d681SAndroid Build Coastguard Worker                                      const CodeGenInstruction &insn,
266*9880d681SAndroid Build Coastguard Worker                                      InstrUID uid)
267*9880d681SAndroid Build Coastguard Worker {
268*9880d681SAndroid Build Coastguard Worker   // Ignore "asm parser only" instructions.
269*9880d681SAndroid Build Coastguard Worker   if (insn.TheDef->getValueAsBit("isAsmParserOnly"))
270*9880d681SAndroid Build Coastguard Worker     return;
271*9880d681SAndroid Build Coastguard Worker 
272*9880d681SAndroid Build Coastguard Worker   RecognizableInstr recogInstr(tables, insn, uid);
273*9880d681SAndroid Build Coastguard Worker 
274*9880d681SAndroid Build Coastguard Worker   if (recogInstr.shouldBeEmitted()) {
275*9880d681SAndroid Build Coastguard Worker     recogInstr.emitInstructionSpecifier();
276*9880d681SAndroid Build Coastguard Worker     recogInstr.emitDecodePath(tables);
277*9880d681SAndroid Build Coastguard Worker   }
278*9880d681SAndroid Build Coastguard Worker }
279*9880d681SAndroid Build Coastguard Worker 
280*9880d681SAndroid Build Coastguard Worker #define EVEX_KB(n) (HasEVEX_KZ && HasEVEX_B ? n##_KZ_B : \
281*9880d681SAndroid Build Coastguard Worker                     (HasEVEX_K && HasEVEX_B ? n##_K_B : \
282*9880d681SAndroid Build Coastguard Worker                     (HasEVEX_KZ ? n##_KZ : \
283*9880d681SAndroid Build Coastguard Worker                     (HasEVEX_K? n##_K : (HasEVEX_B ? n##_B : n)))))
284*9880d681SAndroid Build Coastguard Worker 
insnContext() const285*9880d681SAndroid Build Coastguard Worker InstructionContext RecognizableInstr::insnContext() const {
286*9880d681SAndroid Build Coastguard Worker   InstructionContext insnContext;
287*9880d681SAndroid Build Coastguard Worker 
288*9880d681SAndroid Build Coastguard Worker   if (Encoding == X86Local::EVEX) {
289*9880d681SAndroid Build Coastguard Worker     if (HasVEX_LPrefix && HasEVEX_L2Prefix) {
290*9880d681SAndroid Build Coastguard Worker       errs() << "Don't support VEX.L if EVEX_L2 is enabled: " << Name << "\n";
291*9880d681SAndroid Build Coastguard Worker       llvm_unreachable("Don't support VEX.L if EVEX_L2 is enabled");
292*9880d681SAndroid Build Coastguard Worker     }
293*9880d681SAndroid Build Coastguard Worker     // VEX_L & VEX_W
294*9880d681SAndroid Build Coastguard Worker     if (HasVEX_LPrefix && HasVEX_WPrefix) {
295*9880d681SAndroid Build Coastguard Worker       if (OpPrefix == X86Local::PD)
296*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L_W_OPSIZE);
297*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::XS)
298*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L_W_XS);
299*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::XD)
300*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L_W_XD);
301*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::PS)
302*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L_W);
303*9880d681SAndroid Build Coastguard Worker       else {
304*9880d681SAndroid Build Coastguard Worker         errs() << "Instruction does not use a prefix: " << Name << "\n";
305*9880d681SAndroid Build Coastguard Worker         llvm_unreachable("Invalid prefix");
306*9880d681SAndroid Build Coastguard Worker       }
307*9880d681SAndroid Build Coastguard Worker     } else if (HasVEX_LPrefix) {
308*9880d681SAndroid Build Coastguard Worker       // VEX_L
309*9880d681SAndroid Build Coastguard Worker       if (OpPrefix == X86Local::PD)
310*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L_OPSIZE);
311*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::XS)
312*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L_XS);
313*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::XD)
314*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L_XD);
315*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::PS)
316*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L);
317*9880d681SAndroid Build Coastguard Worker       else {
318*9880d681SAndroid Build Coastguard Worker         errs() << "Instruction does not use a prefix: " << Name << "\n";
319*9880d681SAndroid Build Coastguard Worker         llvm_unreachable("Invalid prefix");
320*9880d681SAndroid Build Coastguard Worker       }
321*9880d681SAndroid Build Coastguard Worker     }
322*9880d681SAndroid Build Coastguard Worker     else if (HasEVEX_L2Prefix && HasVEX_WPrefix) {
323*9880d681SAndroid Build Coastguard Worker       // EVEX_L2 & VEX_W
324*9880d681SAndroid Build Coastguard Worker       if (OpPrefix == X86Local::PD)
325*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L2_W_OPSIZE);
326*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::XS)
327*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L2_W_XS);
328*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::XD)
329*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L2_W_XD);
330*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::PS)
331*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L2_W);
332*9880d681SAndroid Build Coastguard Worker       else {
333*9880d681SAndroid Build Coastguard Worker         errs() << "Instruction does not use a prefix: " << Name << "\n";
334*9880d681SAndroid Build Coastguard Worker         llvm_unreachable("Invalid prefix");
335*9880d681SAndroid Build Coastguard Worker       }
336*9880d681SAndroid Build Coastguard Worker     } else if (HasEVEX_L2Prefix) {
337*9880d681SAndroid Build Coastguard Worker       // EVEX_L2
338*9880d681SAndroid Build Coastguard Worker       if (OpPrefix == X86Local::PD)
339*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L2_OPSIZE);
340*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::XD)
341*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L2_XD);
342*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::XS)
343*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L2_XS);
344*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::PS)
345*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_L2);
346*9880d681SAndroid Build Coastguard Worker       else {
347*9880d681SAndroid Build Coastguard Worker         errs() << "Instruction does not use a prefix: " << Name << "\n";
348*9880d681SAndroid Build Coastguard Worker         llvm_unreachable("Invalid prefix");
349*9880d681SAndroid Build Coastguard Worker       }
350*9880d681SAndroid Build Coastguard Worker     }
351*9880d681SAndroid Build Coastguard Worker     else if (HasVEX_WPrefix) {
352*9880d681SAndroid Build Coastguard Worker       // VEX_W
353*9880d681SAndroid Build Coastguard Worker       if (OpPrefix == X86Local::PD)
354*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_W_OPSIZE);
355*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::XS)
356*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_W_XS);
357*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::XD)
358*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_W_XD);
359*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::PS)
360*9880d681SAndroid Build Coastguard Worker         insnContext = EVEX_KB(IC_EVEX_W);
361*9880d681SAndroid Build Coastguard Worker       else {
362*9880d681SAndroid Build Coastguard Worker         errs() << "Instruction does not use a prefix: " << Name << "\n";
363*9880d681SAndroid Build Coastguard Worker         llvm_unreachable("Invalid prefix");
364*9880d681SAndroid Build Coastguard Worker       }
365*9880d681SAndroid Build Coastguard Worker     }
366*9880d681SAndroid Build Coastguard Worker     // No L, no W
367*9880d681SAndroid Build Coastguard Worker     else if (OpPrefix == X86Local::PD)
368*9880d681SAndroid Build Coastguard Worker       insnContext = EVEX_KB(IC_EVEX_OPSIZE);
369*9880d681SAndroid Build Coastguard Worker     else if (OpPrefix == X86Local::XD)
370*9880d681SAndroid Build Coastguard Worker       insnContext = EVEX_KB(IC_EVEX_XD);
371*9880d681SAndroid Build Coastguard Worker     else if (OpPrefix == X86Local::XS)
372*9880d681SAndroid Build Coastguard Worker       insnContext = EVEX_KB(IC_EVEX_XS);
373*9880d681SAndroid Build Coastguard Worker     else
374*9880d681SAndroid Build Coastguard Worker       insnContext = EVEX_KB(IC_EVEX);
375*9880d681SAndroid Build Coastguard Worker     /// eof EVEX
376*9880d681SAndroid Build Coastguard Worker   } else if (Encoding == X86Local::VEX || Encoding == X86Local::XOP) {
377*9880d681SAndroid Build Coastguard Worker     if (HasVEX_LPrefix && HasVEX_WPrefix) {
378*9880d681SAndroid Build Coastguard Worker       if (OpPrefix == X86Local::PD)
379*9880d681SAndroid Build Coastguard Worker         insnContext = IC_VEX_L_W_OPSIZE;
380*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::XS)
381*9880d681SAndroid Build Coastguard Worker         insnContext = IC_VEX_L_W_XS;
382*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::XD)
383*9880d681SAndroid Build Coastguard Worker         insnContext = IC_VEX_L_W_XD;
384*9880d681SAndroid Build Coastguard Worker       else if (OpPrefix == X86Local::PS)
385*9880d681SAndroid Build Coastguard Worker         insnContext = IC_VEX_L_W;
386*9880d681SAndroid Build Coastguard Worker       else {
387*9880d681SAndroid Build Coastguard Worker         errs() << "Instruction does not use a prefix: " << Name << "\n";
388*9880d681SAndroid Build Coastguard Worker         llvm_unreachable("Invalid prefix");
389*9880d681SAndroid Build Coastguard Worker       }
390*9880d681SAndroid Build Coastguard Worker     } else if (OpPrefix == X86Local::PD && HasVEX_LPrefix)
391*9880d681SAndroid Build Coastguard Worker       insnContext = IC_VEX_L_OPSIZE;
392*9880d681SAndroid Build Coastguard Worker     else if (OpPrefix == X86Local::PD && HasVEX_WPrefix)
393*9880d681SAndroid Build Coastguard Worker       insnContext = IC_VEX_W_OPSIZE;
394*9880d681SAndroid Build Coastguard Worker     else if (OpPrefix == X86Local::PD)
395*9880d681SAndroid Build Coastguard Worker       insnContext = IC_VEX_OPSIZE;
396*9880d681SAndroid Build Coastguard Worker     else if (HasVEX_LPrefix && OpPrefix == X86Local::XS)
397*9880d681SAndroid Build Coastguard Worker       insnContext = IC_VEX_L_XS;
398*9880d681SAndroid Build Coastguard Worker     else if (HasVEX_LPrefix && OpPrefix == X86Local::XD)
399*9880d681SAndroid Build Coastguard Worker       insnContext = IC_VEX_L_XD;
400*9880d681SAndroid Build Coastguard Worker     else if (HasVEX_WPrefix && OpPrefix == X86Local::XS)
401*9880d681SAndroid Build Coastguard Worker       insnContext = IC_VEX_W_XS;
402*9880d681SAndroid Build Coastguard Worker     else if (HasVEX_WPrefix && OpPrefix == X86Local::XD)
403*9880d681SAndroid Build Coastguard Worker       insnContext = IC_VEX_W_XD;
404*9880d681SAndroid Build Coastguard Worker     else if (HasVEX_WPrefix && OpPrefix == X86Local::PS)
405*9880d681SAndroid Build Coastguard Worker       insnContext = IC_VEX_W;
406*9880d681SAndroid Build Coastguard Worker     else if (HasVEX_LPrefix && OpPrefix == X86Local::PS)
407*9880d681SAndroid Build Coastguard Worker       insnContext = IC_VEX_L;
408*9880d681SAndroid Build Coastguard Worker     else if (OpPrefix == X86Local::XD)
409*9880d681SAndroid Build Coastguard Worker       insnContext = IC_VEX_XD;
410*9880d681SAndroid Build Coastguard Worker     else if (OpPrefix == X86Local::XS)
411*9880d681SAndroid Build Coastguard Worker       insnContext = IC_VEX_XS;
412*9880d681SAndroid Build Coastguard Worker     else if (OpPrefix == X86Local::PS)
413*9880d681SAndroid Build Coastguard Worker       insnContext = IC_VEX;
414*9880d681SAndroid Build Coastguard Worker     else {
415*9880d681SAndroid Build Coastguard Worker       errs() << "Instruction does not use a prefix: " << Name << "\n";
416*9880d681SAndroid Build Coastguard Worker       llvm_unreachable("Invalid prefix");
417*9880d681SAndroid Build Coastguard Worker     }
418*9880d681SAndroid Build Coastguard Worker   } else if (Is64Bit || HasREX_WPrefix || AdSize == X86Local::AdSize64) {
419*9880d681SAndroid Build Coastguard Worker     if (HasREX_WPrefix && (OpSize == X86Local::OpSize16 || OpPrefix == X86Local::PD))
420*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT_REXW_OPSIZE;
421*9880d681SAndroid Build Coastguard Worker     else if (HasREX_WPrefix && AdSize == X86Local::AdSize32)
422*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT_REXW_ADSIZE;
423*9880d681SAndroid Build Coastguard Worker     else if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XD)
424*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT_XD_OPSIZE;
425*9880d681SAndroid Build Coastguard Worker     else if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XS)
426*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT_XS_OPSIZE;
427*9880d681SAndroid Build Coastguard Worker     else if (OpSize == X86Local::OpSize16 && AdSize == X86Local::AdSize32)
428*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT_OPSIZE_ADSIZE;
429*9880d681SAndroid Build Coastguard Worker     else if (OpSize == X86Local::OpSize16 || OpPrefix == X86Local::PD)
430*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT_OPSIZE;
431*9880d681SAndroid Build Coastguard Worker     else if (AdSize == X86Local::AdSize32)
432*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT_ADSIZE;
433*9880d681SAndroid Build Coastguard Worker     else if (HasREX_WPrefix && OpPrefix == X86Local::XS)
434*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT_REXW_XS;
435*9880d681SAndroid Build Coastguard Worker     else if (HasREX_WPrefix && OpPrefix == X86Local::XD)
436*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT_REXW_XD;
437*9880d681SAndroid Build Coastguard Worker     else if (OpPrefix == X86Local::XD)
438*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT_XD;
439*9880d681SAndroid Build Coastguard Worker     else if (OpPrefix == X86Local::XS)
440*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT_XS;
441*9880d681SAndroid Build Coastguard Worker     else if (HasREX_WPrefix)
442*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT_REXW;
443*9880d681SAndroid Build Coastguard Worker     else
444*9880d681SAndroid Build Coastguard Worker       insnContext = IC_64BIT;
445*9880d681SAndroid Build Coastguard Worker   } else {
446*9880d681SAndroid Build Coastguard Worker     if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XD)
447*9880d681SAndroid Build Coastguard Worker       insnContext = IC_XD_OPSIZE;
448*9880d681SAndroid Build Coastguard Worker     else if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XS)
449*9880d681SAndroid Build Coastguard Worker       insnContext = IC_XS_OPSIZE;
450*9880d681SAndroid Build Coastguard Worker     else if (OpSize == X86Local::OpSize16 && AdSize == X86Local::AdSize16)
451*9880d681SAndroid Build Coastguard Worker       insnContext = IC_OPSIZE_ADSIZE;
452*9880d681SAndroid Build Coastguard Worker     else if (OpSize == X86Local::OpSize16 || OpPrefix == X86Local::PD)
453*9880d681SAndroid Build Coastguard Worker       insnContext = IC_OPSIZE;
454*9880d681SAndroid Build Coastguard Worker     else if (AdSize == X86Local::AdSize16)
455*9880d681SAndroid Build Coastguard Worker       insnContext = IC_ADSIZE;
456*9880d681SAndroid Build Coastguard Worker     else if (OpPrefix == X86Local::XD)
457*9880d681SAndroid Build Coastguard Worker       insnContext = IC_XD;
458*9880d681SAndroid Build Coastguard Worker     else if (OpPrefix == X86Local::XS)
459*9880d681SAndroid Build Coastguard Worker       insnContext = IC_XS;
460*9880d681SAndroid Build Coastguard Worker     else
461*9880d681SAndroid Build Coastguard Worker       insnContext = IC;
462*9880d681SAndroid Build Coastguard Worker   }
463*9880d681SAndroid Build Coastguard Worker 
464*9880d681SAndroid Build Coastguard Worker   return insnContext;
465*9880d681SAndroid Build Coastguard Worker }
466*9880d681SAndroid Build Coastguard Worker 
adjustOperandEncoding(OperandEncoding & encoding)467*9880d681SAndroid Build Coastguard Worker void RecognizableInstr::adjustOperandEncoding(OperandEncoding &encoding) {
468*9880d681SAndroid Build Coastguard Worker   // The scaling factor for AVX512 compressed displacement encoding is an
469*9880d681SAndroid Build Coastguard Worker   // instruction attribute.  Adjust the ModRM encoding type to include the
470*9880d681SAndroid Build Coastguard Worker   // scale for compressed displacement.
471*9880d681SAndroid Build Coastguard Worker   if (encoding != ENCODING_RM || CD8_Scale == 0)
472*9880d681SAndroid Build Coastguard Worker     return;
473*9880d681SAndroid Build Coastguard Worker   encoding = (OperandEncoding)(encoding + Log2_32(CD8_Scale));
474*9880d681SAndroid Build Coastguard Worker   assert(encoding <= ENCODING_RM_CD64 && "Invalid CDisp scaling");
475*9880d681SAndroid Build Coastguard Worker }
476*9880d681SAndroid Build Coastguard Worker 
handleOperand(bool optional,unsigned & operandIndex,unsigned & physicalOperandIndex,unsigned numPhysicalOperands,const unsigned * operandMapping,OperandEncoding (* encodingFromString)(const std::string &,uint8_t OpSize))477*9880d681SAndroid Build Coastguard Worker void RecognizableInstr::handleOperand(bool optional, unsigned &operandIndex,
478*9880d681SAndroid Build Coastguard Worker                                       unsigned &physicalOperandIndex,
479*9880d681SAndroid Build Coastguard Worker                                       unsigned numPhysicalOperands,
480*9880d681SAndroid Build Coastguard Worker                                       const unsigned *operandMapping,
481*9880d681SAndroid Build Coastguard Worker                                       OperandEncoding (*encodingFromString)
482*9880d681SAndroid Build Coastguard Worker                                         (const std::string&,
483*9880d681SAndroid Build Coastguard Worker                                          uint8_t OpSize)) {
484*9880d681SAndroid Build Coastguard Worker   if (optional) {
485*9880d681SAndroid Build Coastguard Worker     if (physicalOperandIndex >= numPhysicalOperands)
486*9880d681SAndroid Build Coastguard Worker       return;
487*9880d681SAndroid Build Coastguard Worker   } else {
488*9880d681SAndroid Build Coastguard Worker     assert(physicalOperandIndex < numPhysicalOperands);
489*9880d681SAndroid Build Coastguard Worker   }
490*9880d681SAndroid Build Coastguard Worker 
491*9880d681SAndroid Build Coastguard Worker   while (operandMapping[operandIndex] != operandIndex) {
492*9880d681SAndroid Build Coastguard Worker     Spec->operands[operandIndex].encoding = ENCODING_DUP;
493*9880d681SAndroid Build Coastguard Worker     Spec->operands[operandIndex].type =
494*9880d681SAndroid Build Coastguard Worker       (OperandType)(TYPE_DUP0 + operandMapping[operandIndex]);
495*9880d681SAndroid Build Coastguard Worker     ++operandIndex;
496*9880d681SAndroid Build Coastguard Worker   }
497*9880d681SAndroid Build Coastguard Worker 
498*9880d681SAndroid Build Coastguard Worker   const std::string &typeName = (*Operands)[operandIndex].Rec->getName();
499*9880d681SAndroid Build Coastguard Worker 
500*9880d681SAndroid Build Coastguard Worker   OperandEncoding encoding = encodingFromString(typeName, OpSize);
501*9880d681SAndroid Build Coastguard Worker   // Adjust the encoding type for an operand based on the instruction.
502*9880d681SAndroid Build Coastguard Worker   adjustOperandEncoding(encoding);
503*9880d681SAndroid Build Coastguard Worker   Spec->operands[operandIndex].encoding = encoding;
504*9880d681SAndroid Build Coastguard Worker   Spec->operands[operandIndex].type = typeFromString(typeName,
505*9880d681SAndroid Build Coastguard Worker                                                      HasREX_WPrefix, OpSize);
506*9880d681SAndroid Build Coastguard Worker 
507*9880d681SAndroid Build Coastguard Worker   ++operandIndex;
508*9880d681SAndroid Build Coastguard Worker   ++physicalOperandIndex;
509*9880d681SAndroid Build Coastguard Worker }
510*9880d681SAndroid Build Coastguard Worker 
emitInstructionSpecifier()511*9880d681SAndroid Build Coastguard Worker void RecognizableInstr::emitInstructionSpecifier() {
512*9880d681SAndroid Build Coastguard Worker   Spec->name       = Name;
513*9880d681SAndroid Build Coastguard Worker 
514*9880d681SAndroid Build Coastguard Worker   Spec->insnContext = insnContext();
515*9880d681SAndroid Build Coastguard Worker 
516*9880d681SAndroid Build Coastguard Worker   const std::vector<CGIOperandList::OperandInfo> &OperandList = *Operands;
517*9880d681SAndroid Build Coastguard Worker 
518*9880d681SAndroid Build Coastguard Worker   unsigned numOperands = OperandList.size();
519*9880d681SAndroid Build Coastguard Worker   unsigned numPhysicalOperands = 0;
520*9880d681SAndroid Build Coastguard Worker 
521*9880d681SAndroid Build Coastguard Worker   // operandMapping maps from operands in OperandList to their originals.
522*9880d681SAndroid Build Coastguard Worker   // If operandMapping[i] != i, then the entry is a duplicate.
523*9880d681SAndroid Build Coastguard Worker   unsigned operandMapping[X86_MAX_OPERANDS];
524*9880d681SAndroid Build Coastguard Worker   assert(numOperands <= X86_MAX_OPERANDS && "X86_MAX_OPERANDS is not large enough");
525*9880d681SAndroid Build Coastguard Worker 
526*9880d681SAndroid Build Coastguard Worker   for (unsigned operandIndex = 0; operandIndex < numOperands; ++operandIndex) {
527*9880d681SAndroid Build Coastguard Worker     if (!OperandList[operandIndex].Constraints.empty()) {
528*9880d681SAndroid Build Coastguard Worker       const CGIOperandList::ConstraintInfo &Constraint =
529*9880d681SAndroid Build Coastguard Worker         OperandList[operandIndex].Constraints[0];
530*9880d681SAndroid Build Coastguard Worker       if (Constraint.isTied()) {
531*9880d681SAndroid Build Coastguard Worker         operandMapping[operandIndex] = operandIndex;
532*9880d681SAndroid Build Coastguard Worker         operandMapping[Constraint.getTiedOperand()] = operandIndex;
533*9880d681SAndroid Build Coastguard Worker       } else {
534*9880d681SAndroid Build Coastguard Worker         ++numPhysicalOperands;
535*9880d681SAndroid Build Coastguard Worker         operandMapping[operandIndex] = operandIndex;
536*9880d681SAndroid Build Coastguard Worker       }
537*9880d681SAndroid Build Coastguard Worker     } else {
538*9880d681SAndroid Build Coastguard Worker       ++numPhysicalOperands;
539*9880d681SAndroid Build Coastguard Worker       operandMapping[operandIndex] = operandIndex;
540*9880d681SAndroid Build Coastguard Worker     }
541*9880d681SAndroid Build Coastguard Worker   }
542*9880d681SAndroid Build Coastguard Worker 
543*9880d681SAndroid Build Coastguard Worker #define HANDLE_OPERAND(class)               \
544*9880d681SAndroid Build Coastguard Worker   handleOperand(false,                      \
545*9880d681SAndroid Build Coastguard Worker                 operandIndex,               \
546*9880d681SAndroid Build Coastguard Worker                 physicalOperandIndex,       \
547*9880d681SAndroid Build Coastguard Worker                 numPhysicalOperands,        \
548*9880d681SAndroid Build Coastguard Worker                 operandMapping,             \
549*9880d681SAndroid Build Coastguard Worker                 class##EncodingFromString);
550*9880d681SAndroid Build Coastguard Worker 
551*9880d681SAndroid Build Coastguard Worker #define HANDLE_OPTIONAL(class)              \
552*9880d681SAndroid Build Coastguard Worker   handleOperand(true,                       \
553*9880d681SAndroid Build Coastguard Worker                 operandIndex,               \
554*9880d681SAndroid Build Coastguard Worker                 physicalOperandIndex,       \
555*9880d681SAndroid Build Coastguard Worker                 numPhysicalOperands,        \
556*9880d681SAndroid Build Coastguard Worker                 operandMapping,             \
557*9880d681SAndroid Build Coastguard Worker                 class##EncodingFromString);
558*9880d681SAndroid Build Coastguard Worker 
559*9880d681SAndroid Build Coastguard Worker   // operandIndex should always be < numOperands
560*9880d681SAndroid Build Coastguard Worker   unsigned operandIndex = 0;
561*9880d681SAndroid Build Coastguard Worker   // physicalOperandIndex should always be < numPhysicalOperands
562*9880d681SAndroid Build Coastguard Worker   unsigned physicalOperandIndex = 0;
563*9880d681SAndroid Build Coastguard Worker 
564*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
565*9880d681SAndroid Build Coastguard Worker   // Given the set of prefix bits, how many additional operands does the
566*9880d681SAndroid Build Coastguard Worker   // instruction have?
567*9880d681SAndroid Build Coastguard Worker   unsigned additionalOperands = 0;
568*9880d681SAndroid Build Coastguard Worker   if (HasVEX_4V || HasVEX_4VOp3)
569*9880d681SAndroid Build Coastguard Worker     ++additionalOperands;
570*9880d681SAndroid Build Coastguard Worker   if (HasEVEX_K)
571*9880d681SAndroid Build Coastguard Worker     ++additionalOperands;
572*9880d681SAndroid Build Coastguard Worker #endif
573*9880d681SAndroid Build Coastguard Worker 
574*9880d681SAndroid Build Coastguard Worker   switch (Form) {
575*9880d681SAndroid Build Coastguard Worker   default: llvm_unreachable("Unhandled form");
576*9880d681SAndroid Build Coastguard Worker   case X86Local::RawFrmSrc:
577*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(relocation);
578*9880d681SAndroid Build Coastguard Worker     return;
579*9880d681SAndroid Build Coastguard Worker   case X86Local::RawFrmDst:
580*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(relocation);
581*9880d681SAndroid Build Coastguard Worker     return;
582*9880d681SAndroid Build Coastguard Worker   case X86Local::RawFrmDstSrc:
583*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(relocation);
584*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(relocation);
585*9880d681SAndroid Build Coastguard Worker     return;
586*9880d681SAndroid Build Coastguard Worker   case X86Local::RawFrm:
587*9880d681SAndroid Build Coastguard Worker     // Operand 1 (optional) is an address or immediate.
588*9880d681SAndroid Build Coastguard Worker     assert(numPhysicalOperands <= 1 &&
589*9880d681SAndroid Build Coastguard Worker            "Unexpected number of operands for RawFrm");
590*9880d681SAndroid Build Coastguard Worker     HANDLE_OPTIONAL(relocation)
591*9880d681SAndroid Build Coastguard Worker     break;
592*9880d681SAndroid Build Coastguard Worker   case X86Local::RawFrmMemOffs:
593*9880d681SAndroid Build Coastguard Worker     // Operand 1 is an address.
594*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(relocation);
595*9880d681SAndroid Build Coastguard Worker     break;
596*9880d681SAndroid Build Coastguard Worker   case X86Local::AddRegFrm:
597*9880d681SAndroid Build Coastguard Worker     // Operand 1 is added to the opcode.
598*9880d681SAndroid Build Coastguard Worker     // Operand 2 (optional) is an address.
599*9880d681SAndroid Build Coastguard Worker     assert(numPhysicalOperands >= 1 && numPhysicalOperands <= 2 &&
600*9880d681SAndroid Build Coastguard Worker            "Unexpected number of operands for AddRegFrm");
601*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(opcodeModifier)
602*9880d681SAndroid Build Coastguard Worker     HANDLE_OPTIONAL(relocation)
603*9880d681SAndroid Build Coastguard Worker     break;
604*9880d681SAndroid Build Coastguard Worker   case X86Local::MRMDestReg:
605*9880d681SAndroid Build Coastguard Worker     // Operand 1 is a register operand in the R/M field.
606*9880d681SAndroid Build Coastguard Worker     // - In AVX512 there may be a mask operand here -
607*9880d681SAndroid Build Coastguard Worker     // Operand 2 is a register operand in the Reg/Opcode field.
608*9880d681SAndroid Build Coastguard Worker     // - In AVX, there is a register operand in the VEX.vvvv field here -
609*9880d681SAndroid Build Coastguard Worker     // Operand 3 (optional) is an immediate.
610*9880d681SAndroid Build Coastguard Worker     assert(numPhysicalOperands >= 2 + additionalOperands &&
611*9880d681SAndroid Build Coastguard Worker            numPhysicalOperands <= 3 + additionalOperands &&
612*9880d681SAndroid Build Coastguard Worker            "Unexpected number of operands for MRMDestRegFrm");
613*9880d681SAndroid Build Coastguard Worker 
614*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(rmRegister)
615*9880d681SAndroid Build Coastguard Worker     if (HasEVEX_K)
616*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(writemaskRegister)
617*9880d681SAndroid Build Coastguard Worker 
618*9880d681SAndroid Build Coastguard Worker     if (HasVEX_4V)
619*9880d681SAndroid Build Coastguard Worker       // FIXME: In AVX, the register below becomes the one encoded
620*9880d681SAndroid Build Coastguard Worker       // in ModRMVEX and the one above the one in the VEX.VVVV field
621*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(vvvvRegister)
622*9880d681SAndroid Build Coastguard Worker 
623*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(roRegister)
624*9880d681SAndroid Build Coastguard Worker     HANDLE_OPTIONAL(immediate)
625*9880d681SAndroid Build Coastguard Worker     break;
626*9880d681SAndroid Build Coastguard Worker   case X86Local::MRMDestMem:
627*9880d681SAndroid Build Coastguard Worker     // Operand 1 is a memory operand (possibly SIB-extended)
628*9880d681SAndroid Build Coastguard Worker     // Operand 2 is a register operand in the Reg/Opcode field.
629*9880d681SAndroid Build Coastguard Worker     // - In AVX, there is a register operand in the VEX.vvvv field here -
630*9880d681SAndroid Build Coastguard Worker     // Operand 3 (optional) is an immediate.
631*9880d681SAndroid Build Coastguard Worker     assert(numPhysicalOperands >= 2 + additionalOperands &&
632*9880d681SAndroid Build Coastguard Worker            numPhysicalOperands <= 3 + additionalOperands &&
633*9880d681SAndroid Build Coastguard Worker            "Unexpected number of operands for MRMDestMemFrm with VEX_4V");
634*9880d681SAndroid Build Coastguard Worker 
635*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(memory)
636*9880d681SAndroid Build Coastguard Worker 
637*9880d681SAndroid Build Coastguard Worker     if (HasEVEX_K)
638*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(writemaskRegister)
639*9880d681SAndroid Build Coastguard Worker 
640*9880d681SAndroid Build Coastguard Worker     if (HasVEX_4V)
641*9880d681SAndroid Build Coastguard Worker       // FIXME: In AVX, the register below becomes the one encoded
642*9880d681SAndroid Build Coastguard Worker       // in ModRMVEX and the one above the one in the VEX.VVVV field
643*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(vvvvRegister)
644*9880d681SAndroid Build Coastguard Worker 
645*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(roRegister)
646*9880d681SAndroid Build Coastguard Worker     HANDLE_OPTIONAL(immediate)
647*9880d681SAndroid Build Coastguard Worker     break;
648*9880d681SAndroid Build Coastguard Worker   case X86Local::MRMSrcReg:
649*9880d681SAndroid Build Coastguard Worker     // Operand 1 is a register operand in the Reg/Opcode field.
650*9880d681SAndroid Build Coastguard Worker     // Operand 2 is a register operand in the R/M field.
651*9880d681SAndroid Build Coastguard Worker     // - In AVX, there is a register operand in the VEX.vvvv field here -
652*9880d681SAndroid Build Coastguard Worker     // Operand 3 (optional) is an immediate.
653*9880d681SAndroid Build Coastguard Worker     // Operand 4 (optional) is an immediate.
654*9880d681SAndroid Build Coastguard Worker 
655*9880d681SAndroid Build Coastguard Worker     assert(numPhysicalOperands >= 2 + additionalOperands &&
656*9880d681SAndroid Build Coastguard Worker            numPhysicalOperands <= 4 + additionalOperands &&
657*9880d681SAndroid Build Coastguard Worker            "Unexpected number of operands for MRMSrcRegFrm");
658*9880d681SAndroid Build Coastguard Worker 
659*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(roRegister)
660*9880d681SAndroid Build Coastguard Worker 
661*9880d681SAndroid Build Coastguard Worker     if (HasEVEX_K)
662*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(writemaskRegister)
663*9880d681SAndroid Build Coastguard Worker 
664*9880d681SAndroid Build Coastguard Worker     if (HasVEX_4V)
665*9880d681SAndroid Build Coastguard Worker       // FIXME: In AVX, the register below becomes the one encoded
666*9880d681SAndroid Build Coastguard Worker       // in ModRMVEX and the one above the one in the VEX.VVVV field
667*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(vvvvRegister)
668*9880d681SAndroid Build Coastguard Worker 
669*9880d681SAndroid Build Coastguard Worker     if (HasMemOp4Prefix)
670*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(immediate)
671*9880d681SAndroid Build Coastguard Worker 
672*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(rmRegister)
673*9880d681SAndroid Build Coastguard Worker 
674*9880d681SAndroid Build Coastguard Worker     if (HasVEX_4VOp3)
675*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(vvvvRegister)
676*9880d681SAndroid Build Coastguard Worker 
677*9880d681SAndroid Build Coastguard Worker     if (!HasMemOp4Prefix)
678*9880d681SAndroid Build Coastguard Worker       HANDLE_OPTIONAL(immediate)
679*9880d681SAndroid Build Coastguard Worker     HANDLE_OPTIONAL(immediate) // above might be a register in 7:4
680*9880d681SAndroid Build Coastguard Worker     HANDLE_OPTIONAL(immediate)
681*9880d681SAndroid Build Coastguard Worker     break;
682*9880d681SAndroid Build Coastguard Worker   case X86Local::MRMSrcMem:
683*9880d681SAndroid Build Coastguard Worker     // Operand 1 is a register operand in the Reg/Opcode field.
684*9880d681SAndroid Build Coastguard Worker     // Operand 2 is a memory operand (possibly SIB-extended)
685*9880d681SAndroid Build Coastguard Worker     // - In AVX, there is a register operand in the VEX.vvvv field here -
686*9880d681SAndroid Build Coastguard Worker     // Operand 3 (optional) is an immediate.
687*9880d681SAndroid Build Coastguard Worker 
688*9880d681SAndroid Build Coastguard Worker     assert(numPhysicalOperands >= 2 + additionalOperands &&
689*9880d681SAndroid Build Coastguard Worker            numPhysicalOperands <= 4 + additionalOperands &&
690*9880d681SAndroid Build Coastguard Worker            "Unexpected number of operands for MRMSrcMemFrm");
691*9880d681SAndroid Build Coastguard Worker 
692*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(roRegister)
693*9880d681SAndroid Build Coastguard Worker 
694*9880d681SAndroid Build Coastguard Worker     if (HasEVEX_K)
695*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(writemaskRegister)
696*9880d681SAndroid Build Coastguard Worker 
697*9880d681SAndroid Build Coastguard Worker     if (HasVEX_4V)
698*9880d681SAndroid Build Coastguard Worker       // FIXME: In AVX, the register below becomes the one encoded
699*9880d681SAndroid Build Coastguard Worker       // in ModRMVEX and the one above the one in the VEX.VVVV field
700*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(vvvvRegister)
701*9880d681SAndroid Build Coastguard Worker 
702*9880d681SAndroid Build Coastguard Worker     if (HasMemOp4Prefix)
703*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(immediate)
704*9880d681SAndroid Build Coastguard Worker 
705*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(memory)
706*9880d681SAndroid Build Coastguard Worker 
707*9880d681SAndroid Build Coastguard Worker     if (HasVEX_4VOp3)
708*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(vvvvRegister)
709*9880d681SAndroid Build Coastguard Worker 
710*9880d681SAndroid Build Coastguard Worker     if (!HasMemOp4Prefix)
711*9880d681SAndroid Build Coastguard Worker       HANDLE_OPTIONAL(immediate)
712*9880d681SAndroid Build Coastguard Worker     HANDLE_OPTIONAL(immediate) // above might be a register in 7:4
713*9880d681SAndroid Build Coastguard Worker     break;
714*9880d681SAndroid Build Coastguard Worker   case X86Local::MRMXr:
715*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM0r:
716*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM1r:
717*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM2r:
718*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM3r:
719*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM4r:
720*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM5r:
721*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM6r:
722*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM7r:
723*9880d681SAndroid Build Coastguard Worker     // Operand 1 is a register operand in the R/M field.
724*9880d681SAndroid Build Coastguard Worker     // Operand 2 (optional) is an immediate or relocation.
725*9880d681SAndroid Build Coastguard Worker     // Operand 3 (optional) is an immediate.
726*9880d681SAndroid Build Coastguard Worker     assert(numPhysicalOperands >= 0 + additionalOperands &&
727*9880d681SAndroid Build Coastguard Worker            numPhysicalOperands <= 3 + additionalOperands &&
728*9880d681SAndroid Build Coastguard Worker            "Unexpected number of operands for MRMnr");
729*9880d681SAndroid Build Coastguard Worker 
730*9880d681SAndroid Build Coastguard Worker     if (HasVEX_4V)
731*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(vvvvRegister)
732*9880d681SAndroid Build Coastguard Worker 
733*9880d681SAndroid Build Coastguard Worker     if (HasEVEX_K)
734*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(writemaskRegister)
735*9880d681SAndroid Build Coastguard Worker     HANDLE_OPTIONAL(rmRegister)
736*9880d681SAndroid Build Coastguard Worker     HANDLE_OPTIONAL(relocation)
737*9880d681SAndroid Build Coastguard Worker     HANDLE_OPTIONAL(immediate)
738*9880d681SAndroid Build Coastguard Worker     break;
739*9880d681SAndroid Build Coastguard Worker   case X86Local::MRMXm:
740*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM0m:
741*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM1m:
742*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM2m:
743*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM3m:
744*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM4m:
745*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM5m:
746*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM6m:
747*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM7m:
748*9880d681SAndroid Build Coastguard Worker     // Operand 1 is a memory operand (possibly SIB-extended)
749*9880d681SAndroid Build Coastguard Worker     // Operand 2 (optional) is an immediate or relocation.
750*9880d681SAndroid Build Coastguard Worker     assert(numPhysicalOperands >= 1 + additionalOperands &&
751*9880d681SAndroid Build Coastguard Worker            numPhysicalOperands <= 2 + additionalOperands &&
752*9880d681SAndroid Build Coastguard Worker            "Unexpected number of operands for MRMnm");
753*9880d681SAndroid Build Coastguard Worker 
754*9880d681SAndroid Build Coastguard Worker     if (HasVEX_4V)
755*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(vvvvRegister)
756*9880d681SAndroid Build Coastguard Worker     if (HasEVEX_K)
757*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(writemaskRegister)
758*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(memory)
759*9880d681SAndroid Build Coastguard Worker     HANDLE_OPTIONAL(relocation)
760*9880d681SAndroid Build Coastguard Worker     break;
761*9880d681SAndroid Build Coastguard Worker   case X86Local::RawFrmImm8:
762*9880d681SAndroid Build Coastguard Worker     // operand 1 is a 16-bit immediate
763*9880d681SAndroid Build Coastguard Worker     // operand 2 is an 8-bit immediate
764*9880d681SAndroid Build Coastguard Worker     assert(numPhysicalOperands == 2 &&
765*9880d681SAndroid Build Coastguard Worker            "Unexpected number of operands for X86Local::RawFrmImm8");
766*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(immediate)
767*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(immediate)
768*9880d681SAndroid Build Coastguard Worker     break;
769*9880d681SAndroid Build Coastguard Worker   case X86Local::RawFrmImm16:
770*9880d681SAndroid Build Coastguard Worker     // operand 1 is a 16-bit immediate
771*9880d681SAndroid Build Coastguard Worker     // operand 2 is a 16-bit immediate
772*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(immediate)
773*9880d681SAndroid Build Coastguard Worker     HANDLE_OPERAND(immediate)
774*9880d681SAndroid Build Coastguard Worker     break;
775*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_F8:
776*9880d681SAndroid Build Coastguard Worker     if (Opcode == 0xc6) {
777*9880d681SAndroid Build Coastguard Worker       assert(numPhysicalOperands == 1 &&
778*9880d681SAndroid Build Coastguard Worker              "Unexpected number of operands for X86Local::MRM_F8");
779*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(immediate)
780*9880d681SAndroid Build Coastguard Worker     } else if (Opcode == 0xc7) {
781*9880d681SAndroid Build Coastguard Worker       assert(numPhysicalOperands == 1 &&
782*9880d681SAndroid Build Coastguard Worker              "Unexpected number of operands for X86Local::MRM_F8");
783*9880d681SAndroid Build Coastguard Worker       HANDLE_OPERAND(relocation)
784*9880d681SAndroid Build Coastguard Worker     }
785*9880d681SAndroid Build Coastguard Worker     break;
786*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_C0: case X86Local::MRM_C1: case X86Local::MRM_C2:
787*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_C3: case X86Local::MRM_C4: case X86Local::MRM_C8:
788*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_C9: case X86Local::MRM_CA: case X86Local::MRM_CB:
789*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_CF: case X86Local::MRM_D0: case X86Local::MRM_D1:
790*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_D4: case X86Local::MRM_D5: case X86Local::MRM_D6:
791*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_D7: case X86Local::MRM_D8: case X86Local::MRM_D9:
792*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_DA: case X86Local::MRM_DB: case X86Local::MRM_DC:
793*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_DD: case X86Local::MRM_DE: case X86Local::MRM_DF:
794*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_E0: case X86Local::MRM_E1: case X86Local::MRM_E2:
795*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_E3: case X86Local::MRM_E4: case X86Local::MRM_E5:
796*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_E8: case X86Local::MRM_E9: case X86Local::MRM_EA:
797*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_EB: case X86Local::MRM_EC: case X86Local::MRM_ED:
798*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_EE: case X86Local::MRM_EF: case X86Local::MRM_F0:
799*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_F1: case X86Local::MRM_F2: case X86Local::MRM_F3:
800*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_F4: case X86Local::MRM_F5: case X86Local::MRM_F6:
801*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_F7: case X86Local::MRM_F9: case X86Local::MRM_FA:
802*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_FB: case X86Local::MRM_FC: case X86Local::MRM_FD:
803*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_FE: case X86Local::MRM_FF:
804*9880d681SAndroid Build Coastguard Worker     // Ignored.
805*9880d681SAndroid Build Coastguard Worker     break;
806*9880d681SAndroid Build Coastguard Worker   }
807*9880d681SAndroid Build Coastguard Worker 
808*9880d681SAndroid Build Coastguard Worker   #undef HANDLE_OPERAND
809*9880d681SAndroid Build Coastguard Worker   #undef HANDLE_OPTIONAL
810*9880d681SAndroid Build Coastguard Worker }
811*9880d681SAndroid Build Coastguard Worker 
emitDecodePath(DisassemblerTables & tables) const812*9880d681SAndroid Build Coastguard Worker void RecognizableInstr::emitDecodePath(DisassemblerTables &tables) const {
813*9880d681SAndroid Build Coastguard Worker   // Special cases where the LLVM tables are not complete
814*9880d681SAndroid Build Coastguard Worker 
815*9880d681SAndroid Build Coastguard Worker #define MAP(from, to)                     \
816*9880d681SAndroid Build Coastguard Worker   case X86Local::MRM_##from:
817*9880d681SAndroid Build Coastguard Worker 
818*9880d681SAndroid Build Coastguard Worker   OpcodeType    opcodeType  = (OpcodeType)-1;
819*9880d681SAndroid Build Coastguard Worker 
820*9880d681SAndroid Build Coastguard Worker   ModRMFilter*  filter      = nullptr;
821*9880d681SAndroid Build Coastguard Worker   uint8_t       opcodeToSet = 0;
822*9880d681SAndroid Build Coastguard Worker 
823*9880d681SAndroid Build Coastguard Worker   switch (OpMap) {
824*9880d681SAndroid Build Coastguard Worker   default: llvm_unreachable("Invalid map!");
825*9880d681SAndroid Build Coastguard Worker   case X86Local::OB:
826*9880d681SAndroid Build Coastguard Worker   case X86Local::TB:
827*9880d681SAndroid Build Coastguard Worker   case X86Local::T8:
828*9880d681SAndroid Build Coastguard Worker   case X86Local::TA:
829*9880d681SAndroid Build Coastguard Worker   case X86Local::XOP8:
830*9880d681SAndroid Build Coastguard Worker   case X86Local::XOP9:
831*9880d681SAndroid Build Coastguard Worker   case X86Local::XOPA:
832*9880d681SAndroid Build Coastguard Worker     switch (OpMap) {
833*9880d681SAndroid Build Coastguard Worker     default: llvm_unreachable("Unexpected map!");
834*9880d681SAndroid Build Coastguard Worker     case X86Local::OB:   opcodeType = ONEBYTE;      break;
835*9880d681SAndroid Build Coastguard Worker     case X86Local::TB:   opcodeType = TWOBYTE;      break;
836*9880d681SAndroid Build Coastguard Worker     case X86Local::T8:   opcodeType = THREEBYTE_38; break;
837*9880d681SAndroid Build Coastguard Worker     case X86Local::TA:   opcodeType = THREEBYTE_3A; break;
838*9880d681SAndroid Build Coastguard Worker     case X86Local::XOP8: opcodeType = XOP8_MAP;     break;
839*9880d681SAndroid Build Coastguard Worker     case X86Local::XOP9: opcodeType = XOP9_MAP;     break;
840*9880d681SAndroid Build Coastguard Worker     case X86Local::XOPA: opcodeType = XOPA_MAP;     break;
841*9880d681SAndroid Build Coastguard Worker     }
842*9880d681SAndroid Build Coastguard Worker 
843*9880d681SAndroid Build Coastguard Worker     switch (Form) {
844*9880d681SAndroid Build Coastguard Worker     default:
845*9880d681SAndroid Build Coastguard Worker       filter = new DumbFilter();
846*9880d681SAndroid Build Coastguard Worker       break;
847*9880d681SAndroid Build Coastguard Worker     case X86Local::MRMDestReg: case X86Local::MRMDestMem:
848*9880d681SAndroid Build Coastguard Worker     case X86Local::MRMSrcReg:  case X86Local::MRMSrcMem:
849*9880d681SAndroid Build Coastguard Worker     case X86Local::MRMXr:      case X86Local::MRMXm:
850*9880d681SAndroid Build Coastguard Worker       filter = new ModFilter(isRegFormat(Form));
851*9880d681SAndroid Build Coastguard Worker       break;
852*9880d681SAndroid Build Coastguard Worker     case X86Local::MRM0r:      case X86Local::MRM1r:
853*9880d681SAndroid Build Coastguard Worker     case X86Local::MRM2r:      case X86Local::MRM3r:
854*9880d681SAndroid Build Coastguard Worker     case X86Local::MRM4r:      case X86Local::MRM5r:
855*9880d681SAndroid Build Coastguard Worker     case X86Local::MRM6r:      case X86Local::MRM7r:
856*9880d681SAndroid Build Coastguard Worker       filter = new ExtendedFilter(true, Form - X86Local::MRM0r);
857*9880d681SAndroid Build Coastguard Worker       break;
858*9880d681SAndroid Build Coastguard Worker     case X86Local::MRM0m:      case X86Local::MRM1m:
859*9880d681SAndroid Build Coastguard Worker     case X86Local::MRM2m:      case X86Local::MRM3m:
860*9880d681SAndroid Build Coastguard Worker     case X86Local::MRM4m:      case X86Local::MRM5m:
861*9880d681SAndroid Build Coastguard Worker     case X86Local::MRM6m:      case X86Local::MRM7m:
862*9880d681SAndroid Build Coastguard Worker       filter = new ExtendedFilter(false, Form - X86Local::MRM0m);
863*9880d681SAndroid Build Coastguard Worker       break;
864*9880d681SAndroid Build Coastguard Worker     MRM_MAPPING
865*9880d681SAndroid Build Coastguard Worker       filter = new ExactFilter(0xC0 + Form - X86Local::MRM_C0);   \
866*9880d681SAndroid Build Coastguard Worker       break;
867*9880d681SAndroid Build Coastguard Worker     } // switch (Form)
868*9880d681SAndroid Build Coastguard Worker 
869*9880d681SAndroid Build Coastguard Worker     opcodeToSet = Opcode;
870*9880d681SAndroid Build Coastguard Worker     break;
871*9880d681SAndroid Build Coastguard Worker   } // switch (OpMap)
872*9880d681SAndroid Build Coastguard Worker 
873*9880d681SAndroid Build Coastguard Worker   unsigned AddressSize = 0;
874*9880d681SAndroid Build Coastguard Worker   switch (AdSize) {
875*9880d681SAndroid Build Coastguard Worker   case X86Local::AdSize16: AddressSize = 16; break;
876*9880d681SAndroid Build Coastguard Worker   case X86Local::AdSize32: AddressSize = 32; break;
877*9880d681SAndroid Build Coastguard Worker   case X86Local::AdSize64: AddressSize = 64; break;
878*9880d681SAndroid Build Coastguard Worker   }
879*9880d681SAndroid Build Coastguard Worker 
880*9880d681SAndroid Build Coastguard Worker   assert(opcodeType != (OpcodeType)-1 &&
881*9880d681SAndroid Build Coastguard Worker          "Opcode type not set");
882*9880d681SAndroid Build Coastguard Worker   assert(filter && "Filter not set");
883*9880d681SAndroid Build Coastguard Worker 
884*9880d681SAndroid Build Coastguard Worker   if (Form == X86Local::AddRegFrm) {
885*9880d681SAndroid Build Coastguard Worker     assert(((opcodeToSet & 7) == 0) &&
886*9880d681SAndroid Build Coastguard Worker            "ADDREG_FRM opcode not aligned");
887*9880d681SAndroid Build Coastguard Worker 
888*9880d681SAndroid Build Coastguard Worker     uint8_t currentOpcode;
889*9880d681SAndroid Build Coastguard Worker 
890*9880d681SAndroid Build Coastguard Worker     for (currentOpcode = opcodeToSet;
891*9880d681SAndroid Build Coastguard Worker          currentOpcode < opcodeToSet + 8;
892*9880d681SAndroid Build Coastguard Worker          ++currentOpcode)
893*9880d681SAndroid Build Coastguard Worker       tables.setTableFields(opcodeType,
894*9880d681SAndroid Build Coastguard Worker                             insnContext(),
895*9880d681SAndroid Build Coastguard Worker                             currentOpcode,
896*9880d681SAndroid Build Coastguard Worker                             *filter,
897*9880d681SAndroid Build Coastguard Worker                             UID, Is32Bit, IgnoresVEX_L, AddressSize);
898*9880d681SAndroid Build Coastguard Worker   } else {
899*9880d681SAndroid Build Coastguard Worker     tables.setTableFields(opcodeType,
900*9880d681SAndroid Build Coastguard Worker                           insnContext(),
901*9880d681SAndroid Build Coastguard Worker                           opcodeToSet,
902*9880d681SAndroid Build Coastguard Worker                           *filter,
903*9880d681SAndroid Build Coastguard Worker                           UID, Is32Bit, IgnoresVEX_L, AddressSize);
904*9880d681SAndroid Build Coastguard Worker   }
905*9880d681SAndroid Build Coastguard Worker 
906*9880d681SAndroid Build Coastguard Worker   delete filter;
907*9880d681SAndroid Build Coastguard Worker 
908*9880d681SAndroid Build Coastguard Worker #undef MAP
909*9880d681SAndroid Build Coastguard Worker }
910*9880d681SAndroid Build Coastguard Worker 
911*9880d681SAndroid Build Coastguard Worker #define TYPE(str, type) if (s == str) return type;
typeFromString(const std::string & s,bool hasREX_WPrefix,uint8_t OpSize)912*9880d681SAndroid Build Coastguard Worker OperandType RecognizableInstr::typeFromString(const std::string &s,
913*9880d681SAndroid Build Coastguard Worker                                               bool hasREX_WPrefix,
914*9880d681SAndroid Build Coastguard Worker                                               uint8_t OpSize) {
915*9880d681SAndroid Build Coastguard Worker   if(hasREX_WPrefix) {
916*9880d681SAndroid Build Coastguard Worker     // For instructions with a REX_W prefix, a declared 32-bit register encoding
917*9880d681SAndroid Build Coastguard Worker     // is special.
918*9880d681SAndroid Build Coastguard Worker     TYPE("GR32",              TYPE_R32)
919*9880d681SAndroid Build Coastguard Worker   }
920*9880d681SAndroid Build Coastguard Worker   if(OpSize == X86Local::OpSize16) {
921*9880d681SAndroid Build Coastguard Worker     // For OpSize16 instructions, a declared 16-bit register or
922*9880d681SAndroid Build Coastguard Worker     // immediate encoding is special.
923*9880d681SAndroid Build Coastguard Worker     TYPE("GR16",              TYPE_Rv)
924*9880d681SAndroid Build Coastguard Worker     TYPE("i16imm",            TYPE_IMMv)
925*9880d681SAndroid Build Coastguard Worker   } else if(OpSize == X86Local::OpSize32) {
926*9880d681SAndroid Build Coastguard Worker     // For OpSize32 instructions, a declared 32-bit register or
927*9880d681SAndroid Build Coastguard Worker     // immediate encoding is special.
928*9880d681SAndroid Build Coastguard Worker     TYPE("GR32",              TYPE_Rv)
929*9880d681SAndroid Build Coastguard Worker   }
930*9880d681SAndroid Build Coastguard Worker   TYPE("i16mem",              TYPE_Mv)
931*9880d681SAndroid Build Coastguard Worker   TYPE("i16imm",              TYPE_IMM16)
932*9880d681SAndroid Build Coastguard Worker   TYPE("i16i8imm",            TYPE_IMMv)
933*9880d681SAndroid Build Coastguard Worker   TYPE("GR16",                TYPE_R16)
934*9880d681SAndroid Build Coastguard Worker   TYPE("i32mem",              TYPE_Mv)
935*9880d681SAndroid Build Coastguard Worker   TYPE("i32imm",              TYPE_IMMv)
936*9880d681SAndroid Build Coastguard Worker   TYPE("i32i8imm",            TYPE_IMM32)
937*9880d681SAndroid Build Coastguard Worker   TYPE("GR32",                TYPE_R32)
938*9880d681SAndroid Build Coastguard Worker   TYPE("GR32orGR64",          TYPE_R32)
939*9880d681SAndroid Build Coastguard Worker   TYPE("i64mem",              TYPE_Mv)
940*9880d681SAndroid Build Coastguard Worker   TYPE("i64i32imm",           TYPE_IMM64)
941*9880d681SAndroid Build Coastguard Worker   TYPE("i64i8imm",            TYPE_IMM64)
942*9880d681SAndroid Build Coastguard Worker   TYPE("GR64",                TYPE_R64)
943*9880d681SAndroid Build Coastguard Worker   TYPE("i8mem",               TYPE_M8)
944*9880d681SAndroid Build Coastguard Worker   TYPE("i8imm",               TYPE_IMM8)
945*9880d681SAndroid Build Coastguard Worker   TYPE("u8imm",               TYPE_UIMM8)
946*9880d681SAndroid Build Coastguard Worker   TYPE("i32u8imm",            TYPE_UIMM8)
947*9880d681SAndroid Build Coastguard Worker   TYPE("GR8",                 TYPE_R8)
948*9880d681SAndroid Build Coastguard Worker   TYPE("VR128",               TYPE_XMM128)
949*9880d681SAndroid Build Coastguard Worker   TYPE("VR128X",              TYPE_XMM128)
950*9880d681SAndroid Build Coastguard Worker   TYPE("f128mem",             TYPE_M128)
951*9880d681SAndroid Build Coastguard Worker   TYPE("f256mem",             TYPE_M256)
952*9880d681SAndroid Build Coastguard Worker   TYPE("f512mem",             TYPE_M512)
953*9880d681SAndroid Build Coastguard Worker   TYPE("FR128",               TYPE_XMM128)
954*9880d681SAndroid Build Coastguard Worker   TYPE("FR64",                TYPE_XMM64)
955*9880d681SAndroid Build Coastguard Worker   TYPE("FR64X",               TYPE_XMM64)
956*9880d681SAndroid Build Coastguard Worker   TYPE("f64mem",              TYPE_M64FP)
957*9880d681SAndroid Build Coastguard Worker   TYPE("sdmem",               TYPE_M64FP)
958*9880d681SAndroid Build Coastguard Worker   TYPE("FR32",                TYPE_XMM32)
959*9880d681SAndroid Build Coastguard Worker   TYPE("FR32X",               TYPE_XMM32)
960*9880d681SAndroid Build Coastguard Worker   TYPE("f32mem",              TYPE_M32FP)
961*9880d681SAndroid Build Coastguard Worker   TYPE("ssmem",               TYPE_M32FP)
962*9880d681SAndroid Build Coastguard Worker   TYPE("RST",                 TYPE_ST)
963*9880d681SAndroid Build Coastguard Worker   TYPE("i128mem",             TYPE_M128)
964*9880d681SAndroid Build Coastguard Worker   TYPE("i256mem",             TYPE_M256)
965*9880d681SAndroid Build Coastguard Worker   TYPE("i512mem",             TYPE_M512)
966*9880d681SAndroid Build Coastguard Worker   TYPE("i64i32imm_pcrel",     TYPE_REL64)
967*9880d681SAndroid Build Coastguard Worker   TYPE("i16imm_pcrel",        TYPE_REL16)
968*9880d681SAndroid Build Coastguard Worker   TYPE("i32imm_pcrel",        TYPE_REL32)
969*9880d681SAndroid Build Coastguard Worker   TYPE("SSECC",               TYPE_IMM3)
970*9880d681SAndroid Build Coastguard Worker   TYPE("XOPCC",               TYPE_IMM3)
971*9880d681SAndroid Build Coastguard Worker   TYPE("AVXCC",               TYPE_IMM5)
972*9880d681SAndroid Build Coastguard Worker   TYPE("AVX512ICC",           TYPE_AVX512ICC)
973*9880d681SAndroid Build Coastguard Worker   TYPE("AVX512RC",            TYPE_IMM32)
974*9880d681SAndroid Build Coastguard Worker   TYPE("brtarget32",          TYPE_RELv)
975*9880d681SAndroid Build Coastguard Worker   TYPE("brtarget16",          TYPE_RELv)
976*9880d681SAndroid Build Coastguard Worker   TYPE("brtarget8",           TYPE_REL8)
977*9880d681SAndroid Build Coastguard Worker   TYPE("f80mem",              TYPE_M80FP)
978*9880d681SAndroid Build Coastguard Worker   TYPE("lea64_32mem",         TYPE_LEA)
979*9880d681SAndroid Build Coastguard Worker   TYPE("lea64mem",            TYPE_LEA)
980*9880d681SAndroid Build Coastguard Worker   TYPE("VR64",                TYPE_MM64)
981*9880d681SAndroid Build Coastguard Worker   TYPE("i64imm",              TYPE_IMMv)
982*9880d681SAndroid Build Coastguard Worker   TYPE("anymem",              TYPE_M)
983*9880d681SAndroid Build Coastguard Worker   TYPE("opaque32mem",         TYPE_M1616)
984*9880d681SAndroid Build Coastguard Worker   TYPE("opaque48mem",         TYPE_M1632)
985*9880d681SAndroid Build Coastguard Worker   TYPE("opaque80mem",         TYPE_M1664)
986*9880d681SAndroid Build Coastguard Worker   TYPE("opaque512mem",        TYPE_M512)
987*9880d681SAndroid Build Coastguard Worker   TYPE("SEGMENT_REG",         TYPE_SEGMENTREG)
988*9880d681SAndroid Build Coastguard Worker   TYPE("DEBUG_REG",           TYPE_DEBUGREG)
989*9880d681SAndroid Build Coastguard Worker   TYPE("CONTROL_REG",         TYPE_CONTROLREG)
990*9880d681SAndroid Build Coastguard Worker   TYPE("srcidx8",             TYPE_SRCIDX8)
991*9880d681SAndroid Build Coastguard Worker   TYPE("srcidx16",            TYPE_SRCIDX16)
992*9880d681SAndroid Build Coastguard Worker   TYPE("srcidx32",            TYPE_SRCIDX32)
993*9880d681SAndroid Build Coastguard Worker   TYPE("srcidx64",            TYPE_SRCIDX64)
994*9880d681SAndroid Build Coastguard Worker   TYPE("dstidx8",             TYPE_DSTIDX8)
995*9880d681SAndroid Build Coastguard Worker   TYPE("dstidx16",            TYPE_DSTIDX16)
996*9880d681SAndroid Build Coastguard Worker   TYPE("dstidx32",            TYPE_DSTIDX32)
997*9880d681SAndroid Build Coastguard Worker   TYPE("dstidx64",            TYPE_DSTIDX64)
998*9880d681SAndroid Build Coastguard Worker   TYPE("offset16_8",          TYPE_MOFFS8)
999*9880d681SAndroid Build Coastguard Worker   TYPE("offset16_16",         TYPE_MOFFS16)
1000*9880d681SAndroid Build Coastguard Worker   TYPE("offset16_32",         TYPE_MOFFS32)
1001*9880d681SAndroid Build Coastguard Worker   TYPE("offset32_8",          TYPE_MOFFS8)
1002*9880d681SAndroid Build Coastguard Worker   TYPE("offset32_16",         TYPE_MOFFS16)
1003*9880d681SAndroid Build Coastguard Worker   TYPE("offset32_32",         TYPE_MOFFS32)
1004*9880d681SAndroid Build Coastguard Worker   TYPE("offset32_64",         TYPE_MOFFS64)
1005*9880d681SAndroid Build Coastguard Worker   TYPE("offset64_8",          TYPE_MOFFS8)
1006*9880d681SAndroid Build Coastguard Worker   TYPE("offset64_16",         TYPE_MOFFS16)
1007*9880d681SAndroid Build Coastguard Worker   TYPE("offset64_32",         TYPE_MOFFS32)
1008*9880d681SAndroid Build Coastguard Worker   TYPE("offset64_64",         TYPE_MOFFS64)
1009*9880d681SAndroid Build Coastguard Worker   TYPE("VR256",               TYPE_XMM256)
1010*9880d681SAndroid Build Coastguard Worker   TYPE("VR256X",              TYPE_XMM256)
1011*9880d681SAndroid Build Coastguard Worker   TYPE("VR512",               TYPE_XMM512)
1012*9880d681SAndroid Build Coastguard Worker   TYPE("VK1",                 TYPE_VK1)
1013*9880d681SAndroid Build Coastguard Worker   TYPE("VK1WM",               TYPE_VK1)
1014*9880d681SAndroid Build Coastguard Worker   TYPE("VK2",                 TYPE_VK2)
1015*9880d681SAndroid Build Coastguard Worker   TYPE("VK2WM",               TYPE_VK2)
1016*9880d681SAndroid Build Coastguard Worker   TYPE("VK4",                 TYPE_VK4)
1017*9880d681SAndroid Build Coastguard Worker   TYPE("VK4WM",               TYPE_VK4)
1018*9880d681SAndroid Build Coastguard Worker   TYPE("VK8",                 TYPE_VK8)
1019*9880d681SAndroid Build Coastguard Worker   TYPE("VK8WM",               TYPE_VK8)
1020*9880d681SAndroid Build Coastguard Worker   TYPE("VK16",                TYPE_VK16)
1021*9880d681SAndroid Build Coastguard Worker   TYPE("VK16WM",              TYPE_VK16)
1022*9880d681SAndroid Build Coastguard Worker   TYPE("VK32",                TYPE_VK32)
1023*9880d681SAndroid Build Coastguard Worker   TYPE("VK32WM",              TYPE_VK32)
1024*9880d681SAndroid Build Coastguard Worker   TYPE("VK64",                TYPE_VK64)
1025*9880d681SAndroid Build Coastguard Worker   TYPE("VK64WM",              TYPE_VK64)
1026*9880d681SAndroid Build Coastguard Worker   TYPE("GR32_NOAX",           TYPE_Rv)
1027*9880d681SAndroid Build Coastguard Worker   TYPE("vx64mem",             TYPE_M64)
1028*9880d681SAndroid Build Coastguard Worker   TYPE("vx128mem",            TYPE_M128)
1029*9880d681SAndroid Build Coastguard Worker   TYPE("vx256mem",            TYPE_M256)
1030*9880d681SAndroid Build Coastguard Worker   TYPE("vy128mem",            TYPE_M128)
1031*9880d681SAndroid Build Coastguard Worker   TYPE("vy256mem",            TYPE_M256)
1032*9880d681SAndroid Build Coastguard Worker   TYPE("vx64xmem",            TYPE_M64)
1033*9880d681SAndroid Build Coastguard Worker   TYPE("vx128xmem",           TYPE_M128)
1034*9880d681SAndroid Build Coastguard Worker   TYPE("vx256xmem",           TYPE_M256)
1035*9880d681SAndroid Build Coastguard Worker   TYPE("vy128xmem",           TYPE_M128)
1036*9880d681SAndroid Build Coastguard Worker   TYPE("vy256xmem",           TYPE_M256)
1037*9880d681SAndroid Build Coastguard Worker   TYPE("vy512mem",            TYPE_M512)
1038*9880d681SAndroid Build Coastguard Worker   TYPE("vz512mem",            TYPE_M512)
1039*9880d681SAndroid Build Coastguard Worker   TYPE("BNDR",                TYPE_BNDR)
1040*9880d681SAndroid Build Coastguard Worker   errs() << "Unhandled type string " << s << "\n";
1041*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unhandled type string");
1042*9880d681SAndroid Build Coastguard Worker }
1043*9880d681SAndroid Build Coastguard Worker #undef TYPE
1044*9880d681SAndroid Build Coastguard Worker 
1045*9880d681SAndroid Build Coastguard Worker #define ENCODING(str, encoding) if (s == str) return encoding;
1046*9880d681SAndroid Build Coastguard Worker OperandEncoding
immediateEncodingFromString(const std::string & s,uint8_t OpSize)1047*9880d681SAndroid Build Coastguard Worker RecognizableInstr::immediateEncodingFromString(const std::string &s,
1048*9880d681SAndroid Build Coastguard Worker                                                uint8_t OpSize) {
1049*9880d681SAndroid Build Coastguard Worker   if(OpSize != X86Local::OpSize16) {
1050*9880d681SAndroid Build Coastguard Worker     // For instructions without an OpSize prefix, a declared 16-bit register or
1051*9880d681SAndroid Build Coastguard Worker     // immediate encoding is special.
1052*9880d681SAndroid Build Coastguard Worker     ENCODING("i16imm",        ENCODING_IW)
1053*9880d681SAndroid Build Coastguard Worker   }
1054*9880d681SAndroid Build Coastguard Worker   ENCODING("i32i8imm",        ENCODING_IB)
1055*9880d681SAndroid Build Coastguard Worker   ENCODING("SSECC",           ENCODING_IB)
1056*9880d681SAndroid Build Coastguard Worker   ENCODING("XOPCC",           ENCODING_IB)
1057*9880d681SAndroid Build Coastguard Worker   ENCODING("AVXCC",           ENCODING_IB)
1058*9880d681SAndroid Build Coastguard Worker   ENCODING("AVX512ICC",       ENCODING_IB)
1059*9880d681SAndroid Build Coastguard Worker   ENCODING("AVX512RC",        ENCODING_IB)
1060*9880d681SAndroid Build Coastguard Worker   ENCODING("i16imm",          ENCODING_Iv)
1061*9880d681SAndroid Build Coastguard Worker   ENCODING("i16i8imm",        ENCODING_IB)
1062*9880d681SAndroid Build Coastguard Worker   ENCODING("i32imm",          ENCODING_Iv)
1063*9880d681SAndroid Build Coastguard Worker   ENCODING("i64i32imm",       ENCODING_ID)
1064*9880d681SAndroid Build Coastguard Worker   ENCODING("i64i8imm",        ENCODING_IB)
1065*9880d681SAndroid Build Coastguard Worker   ENCODING("i8imm",           ENCODING_IB)
1066*9880d681SAndroid Build Coastguard Worker   ENCODING("u8imm",           ENCODING_IB)
1067*9880d681SAndroid Build Coastguard Worker   ENCODING("i32u8imm",        ENCODING_IB)
1068*9880d681SAndroid Build Coastguard Worker   // This is not a typo.  Instructions like BLENDVPD put
1069*9880d681SAndroid Build Coastguard Worker   // register IDs in 8-bit immediates nowadays.
1070*9880d681SAndroid Build Coastguard Worker   ENCODING("FR32",            ENCODING_IB)
1071*9880d681SAndroid Build Coastguard Worker   ENCODING("FR64",            ENCODING_IB)
1072*9880d681SAndroid Build Coastguard Worker   ENCODING("FR128",           ENCODING_IB)
1073*9880d681SAndroid Build Coastguard Worker   ENCODING("VR128",           ENCODING_IB)
1074*9880d681SAndroid Build Coastguard Worker   ENCODING("VR256",           ENCODING_IB)
1075*9880d681SAndroid Build Coastguard Worker   ENCODING("FR32X",           ENCODING_IB)
1076*9880d681SAndroid Build Coastguard Worker   ENCODING("FR64X",           ENCODING_IB)
1077*9880d681SAndroid Build Coastguard Worker   ENCODING("VR128X",          ENCODING_IB)
1078*9880d681SAndroid Build Coastguard Worker   ENCODING("VR256X",          ENCODING_IB)
1079*9880d681SAndroid Build Coastguard Worker   ENCODING("VR512",           ENCODING_IB)
1080*9880d681SAndroid Build Coastguard Worker   errs() << "Unhandled immediate encoding " << s << "\n";
1081*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unhandled immediate encoding");
1082*9880d681SAndroid Build Coastguard Worker }
1083*9880d681SAndroid Build Coastguard Worker 
1084*9880d681SAndroid Build Coastguard Worker OperandEncoding
rmRegisterEncodingFromString(const std::string & s,uint8_t OpSize)1085*9880d681SAndroid Build Coastguard Worker RecognizableInstr::rmRegisterEncodingFromString(const std::string &s,
1086*9880d681SAndroid Build Coastguard Worker                                                 uint8_t OpSize) {
1087*9880d681SAndroid Build Coastguard Worker   ENCODING("RST",             ENCODING_FP)
1088*9880d681SAndroid Build Coastguard Worker   ENCODING("GR16",            ENCODING_RM)
1089*9880d681SAndroid Build Coastguard Worker   ENCODING("GR32",            ENCODING_RM)
1090*9880d681SAndroid Build Coastguard Worker   ENCODING("GR32orGR64",      ENCODING_RM)
1091*9880d681SAndroid Build Coastguard Worker   ENCODING("GR64",            ENCODING_RM)
1092*9880d681SAndroid Build Coastguard Worker   ENCODING("GR8",             ENCODING_RM)
1093*9880d681SAndroid Build Coastguard Worker   ENCODING("VR128",           ENCODING_RM)
1094*9880d681SAndroid Build Coastguard Worker   ENCODING("VR128X",          ENCODING_RM)
1095*9880d681SAndroid Build Coastguard Worker   ENCODING("FR128",           ENCODING_RM)
1096*9880d681SAndroid Build Coastguard Worker   ENCODING("FR64",            ENCODING_RM)
1097*9880d681SAndroid Build Coastguard Worker   ENCODING("FR32",            ENCODING_RM)
1098*9880d681SAndroid Build Coastguard Worker   ENCODING("FR64X",           ENCODING_RM)
1099*9880d681SAndroid Build Coastguard Worker   ENCODING("FR32X",           ENCODING_RM)
1100*9880d681SAndroid Build Coastguard Worker   ENCODING("VR64",            ENCODING_RM)
1101*9880d681SAndroid Build Coastguard Worker   ENCODING("VR256",           ENCODING_RM)
1102*9880d681SAndroid Build Coastguard Worker   ENCODING("VR256X",          ENCODING_RM)
1103*9880d681SAndroid Build Coastguard Worker   ENCODING("VR512",           ENCODING_RM)
1104*9880d681SAndroid Build Coastguard Worker   ENCODING("VK1",             ENCODING_RM)
1105*9880d681SAndroid Build Coastguard Worker   ENCODING("VK2",             ENCODING_RM)
1106*9880d681SAndroid Build Coastguard Worker   ENCODING("VK4",             ENCODING_RM)
1107*9880d681SAndroid Build Coastguard Worker   ENCODING("VK8",             ENCODING_RM)
1108*9880d681SAndroid Build Coastguard Worker   ENCODING("VK16",            ENCODING_RM)
1109*9880d681SAndroid Build Coastguard Worker   ENCODING("VK32",            ENCODING_RM)
1110*9880d681SAndroid Build Coastguard Worker   ENCODING("VK64",            ENCODING_RM)
1111*9880d681SAndroid Build Coastguard Worker   ENCODING("BNDR",            ENCODING_RM)
1112*9880d681SAndroid Build Coastguard Worker   errs() << "Unhandled R/M register encoding " << s << "\n";
1113*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unhandled R/M register encoding");
1114*9880d681SAndroid Build Coastguard Worker }
1115*9880d681SAndroid Build Coastguard Worker 
1116*9880d681SAndroid Build Coastguard Worker OperandEncoding
roRegisterEncodingFromString(const std::string & s,uint8_t OpSize)1117*9880d681SAndroid Build Coastguard Worker RecognizableInstr::roRegisterEncodingFromString(const std::string &s,
1118*9880d681SAndroid Build Coastguard Worker                                                 uint8_t OpSize) {
1119*9880d681SAndroid Build Coastguard Worker   ENCODING("GR16",            ENCODING_REG)
1120*9880d681SAndroid Build Coastguard Worker   ENCODING("GR32",            ENCODING_REG)
1121*9880d681SAndroid Build Coastguard Worker   ENCODING("GR32orGR64",      ENCODING_REG)
1122*9880d681SAndroid Build Coastguard Worker   ENCODING("GR64",            ENCODING_REG)
1123*9880d681SAndroid Build Coastguard Worker   ENCODING("GR8",             ENCODING_REG)
1124*9880d681SAndroid Build Coastguard Worker   ENCODING("VR128",           ENCODING_REG)
1125*9880d681SAndroid Build Coastguard Worker   ENCODING("FR128",           ENCODING_REG)
1126*9880d681SAndroid Build Coastguard Worker   ENCODING("FR64",            ENCODING_REG)
1127*9880d681SAndroid Build Coastguard Worker   ENCODING("FR32",            ENCODING_REG)
1128*9880d681SAndroid Build Coastguard Worker   ENCODING("VR64",            ENCODING_REG)
1129*9880d681SAndroid Build Coastguard Worker   ENCODING("SEGMENT_REG",     ENCODING_REG)
1130*9880d681SAndroid Build Coastguard Worker   ENCODING("DEBUG_REG",       ENCODING_REG)
1131*9880d681SAndroid Build Coastguard Worker   ENCODING("CONTROL_REG",     ENCODING_REG)
1132*9880d681SAndroid Build Coastguard Worker   ENCODING("VR256",           ENCODING_REG)
1133*9880d681SAndroid Build Coastguard Worker   ENCODING("VR256X",          ENCODING_REG)
1134*9880d681SAndroid Build Coastguard Worker   ENCODING("VR128X",          ENCODING_REG)
1135*9880d681SAndroid Build Coastguard Worker   ENCODING("FR64X",           ENCODING_REG)
1136*9880d681SAndroid Build Coastguard Worker   ENCODING("FR32X",           ENCODING_REG)
1137*9880d681SAndroid Build Coastguard Worker   ENCODING("VR512",           ENCODING_REG)
1138*9880d681SAndroid Build Coastguard Worker   ENCODING("VK1",             ENCODING_REG)
1139*9880d681SAndroid Build Coastguard Worker   ENCODING("VK2",             ENCODING_REG)
1140*9880d681SAndroid Build Coastguard Worker   ENCODING("VK4",             ENCODING_REG)
1141*9880d681SAndroid Build Coastguard Worker   ENCODING("VK8",             ENCODING_REG)
1142*9880d681SAndroid Build Coastguard Worker   ENCODING("VK16",            ENCODING_REG)
1143*9880d681SAndroid Build Coastguard Worker   ENCODING("VK32",            ENCODING_REG)
1144*9880d681SAndroid Build Coastguard Worker   ENCODING("VK64",            ENCODING_REG)
1145*9880d681SAndroid Build Coastguard Worker   ENCODING("VK1WM",           ENCODING_REG)
1146*9880d681SAndroid Build Coastguard Worker   ENCODING("VK2WM",           ENCODING_REG)
1147*9880d681SAndroid Build Coastguard Worker   ENCODING("VK4WM",           ENCODING_REG)
1148*9880d681SAndroid Build Coastguard Worker   ENCODING("VK8WM",           ENCODING_REG)
1149*9880d681SAndroid Build Coastguard Worker   ENCODING("VK16WM",          ENCODING_REG)
1150*9880d681SAndroid Build Coastguard Worker   ENCODING("VK32WM",          ENCODING_REG)
1151*9880d681SAndroid Build Coastguard Worker   ENCODING("VK64WM",          ENCODING_REG)
1152*9880d681SAndroid Build Coastguard Worker   ENCODING("BNDR",            ENCODING_REG)
1153*9880d681SAndroid Build Coastguard Worker   errs() << "Unhandled reg/opcode register encoding " << s << "\n";
1154*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unhandled reg/opcode register encoding");
1155*9880d681SAndroid Build Coastguard Worker }
1156*9880d681SAndroid Build Coastguard Worker 
1157*9880d681SAndroid Build Coastguard Worker OperandEncoding
vvvvRegisterEncodingFromString(const std::string & s,uint8_t OpSize)1158*9880d681SAndroid Build Coastguard Worker RecognizableInstr::vvvvRegisterEncodingFromString(const std::string &s,
1159*9880d681SAndroid Build Coastguard Worker                                                   uint8_t OpSize) {
1160*9880d681SAndroid Build Coastguard Worker   ENCODING("GR32",            ENCODING_VVVV)
1161*9880d681SAndroid Build Coastguard Worker   ENCODING("GR64",            ENCODING_VVVV)
1162*9880d681SAndroid Build Coastguard Worker   ENCODING("FR32",            ENCODING_VVVV)
1163*9880d681SAndroid Build Coastguard Worker   ENCODING("FR128",           ENCODING_VVVV)
1164*9880d681SAndroid Build Coastguard Worker   ENCODING("FR64",            ENCODING_VVVV)
1165*9880d681SAndroid Build Coastguard Worker   ENCODING("VR128",           ENCODING_VVVV)
1166*9880d681SAndroid Build Coastguard Worker   ENCODING("VR256",           ENCODING_VVVV)
1167*9880d681SAndroid Build Coastguard Worker   ENCODING("FR32X",           ENCODING_VVVV)
1168*9880d681SAndroid Build Coastguard Worker   ENCODING("FR64X",           ENCODING_VVVV)
1169*9880d681SAndroid Build Coastguard Worker   ENCODING("VR128X",          ENCODING_VVVV)
1170*9880d681SAndroid Build Coastguard Worker   ENCODING("VR256X",          ENCODING_VVVV)
1171*9880d681SAndroid Build Coastguard Worker   ENCODING("VR512",           ENCODING_VVVV)
1172*9880d681SAndroid Build Coastguard Worker   ENCODING("VK1",             ENCODING_VVVV)
1173*9880d681SAndroid Build Coastguard Worker   ENCODING("VK2",             ENCODING_VVVV)
1174*9880d681SAndroid Build Coastguard Worker   ENCODING("VK4",             ENCODING_VVVV)
1175*9880d681SAndroid Build Coastguard Worker   ENCODING("VK8",             ENCODING_VVVV)
1176*9880d681SAndroid Build Coastguard Worker   ENCODING("VK16",            ENCODING_VVVV)
1177*9880d681SAndroid Build Coastguard Worker   ENCODING("VK32",            ENCODING_VVVV)
1178*9880d681SAndroid Build Coastguard Worker   ENCODING("VK64",            ENCODING_VVVV)
1179*9880d681SAndroid Build Coastguard Worker   errs() << "Unhandled VEX.vvvv register encoding " << s << "\n";
1180*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unhandled VEX.vvvv register encoding");
1181*9880d681SAndroid Build Coastguard Worker }
1182*9880d681SAndroid Build Coastguard Worker 
1183*9880d681SAndroid Build Coastguard Worker OperandEncoding
writemaskRegisterEncodingFromString(const std::string & s,uint8_t OpSize)1184*9880d681SAndroid Build Coastguard Worker RecognizableInstr::writemaskRegisterEncodingFromString(const std::string &s,
1185*9880d681SAndroid Build Coastguard Worker                                                        uint8_t OpSize) {
1186*9880d681SAndroid Build Coastguard Worker   ENCODING("VK1WM",           ENCODING_WRITEMASK)
1187*9880d681SAndroid Build Coastguard Worker   ENCODING("VK2WM",           ENCODING_WRITEMASK)
1188*9880d681SAndroid Build Coastguard Worker   ENCODING("VK4WM",           ENCODING_WRITEMASK)
1189*9880d681SAndroid Build Coastguard Worker   ENCODING("VK8WM",           ENCODING_WRITEMASK)
1190*9880d681SAndroid Build Coastguard Worker   ENCODING("VK16WM",          ENCODING_WRITEMASK)
1191*9880d681SAndroid Build Coastguard Worker   ENCODING("VK32WM",          ENCODING_WRITEMASK)
1192*9880d681SAndroid Build Coastguard Worker   ENCODING("VK64WM",          ENCODING_WRITEMASK)
1193*9880d681SAndroid Build Coastguard Worker   errs() << "Unhandled mask register encoding " << s << "\n";
1194*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unhandled mask register encoding");
1195*9880d681SAndroid Build Coastguard Worker }
1196*9880d681SAndroid Build Coastguard Worker 
1197*9880d681SAndroid Build Coastguard Worker OperandEncoding
memoryEncodingFromString(const std::string & s,uint8_t OpSize)1198*9880d681SAndroid Build Coastguard Worker RecognizableInstr::memoryEncodingFromString(const std::string &s,
1199*9880d681SAndroid Build Coastguard Worker                                             uint8_t OpSize) {
1200*9880d681SAndroid Build Coastguard Worker   ENCODING("i16mem",          ENCODING_RM)
1201*9880d681SAndroid Build Coastguard Worker   ENCODING("i32mem",          ENCODING_RM)
1202*9880d681SAndroid Build Coastguard Worker   ENCODING("i64mem",          ENCODING_RM)
1203*9880d681SAndroid Build Coastguard Worker   ENCODING("i8mem",           ENCODING_RM)
1204*9880d681SAndroid Build Coastguard Worker   ENCODING("ssmem",           ENCODING_RM)
1205*9880d681SAndroid Build Coastguard Worker   ENCODING("sdmem",           ENCODING_RM)
1206*9880d681SAndroid Build Coastguard Worker   ENCODING("f128mem",         ENCODING_RM)
1207*9880d681SAndroid Build Coastguard Worker   ENCODING("f256mem",         ENCODING_RM)
1208*9880d681SAndroid Build Coastguard Worker   ENCODING("f512mem",         ENCODING_RM)
1209*9880d681SAndroid Build Coastguard Worker   ENCODING("f64mem",          ENCODING_RM)
1210*9880d681SAndroid Build Coastguard Worker   ENCODING("f32mem",          ENCODING_RM)
1211*9880d681SAndroid Build Coastguard Worker   ENCODING("i128mem",         ENCODING_RM)
1212*9880d681SAndroid Build Coastguard Worker   ENCODING("i256mem",         ENCODING_RM)
1213*9880d681SAndroid Build Coastguard Worker   ENCODING("i512mem",         ENCODING_RM)
1214*9880d681SAndroid Build Coastguard Worker   ENCODING("f80mem",          ENCODING_RM)
1215*9880d681SAndroid Build Coastguard Worker   ENCODING("lea64_32mem",     ENCODING_RM)
1216*9880d681SAndroid Build Coastguard Worker   ENCODING("lea64mem",        ENCODING_RM)
1217*9880d681SAndroid Build Coastguard Worker   ENCODING("anymem",          ENCODING_RM)
1218*9880d681SAndroid Build Coastguard Worker   ENCODING("opaque32mem",     ENCODING_RM)
1219*9880d681SAndroid Build Coastguard Worker   ENCODING("opaque48mem",     ENCODING_RM)
1220*9880d681SAndroid Build Coastguard Worker   ENCODING("opaque80mem",     ENCODING_RM)
1221*9880d681SAndroid Build Coastguard Worker   ENCODING("opaque512mem",    ENCODING_RM)
1222*9880d681SAndroid Build Coastguard Worker   ENCODING("vx64mem",         ENCODING_RM)
1223*9880d681SAndroid Build Coastguard Worker   ENCODING("vx128mem",        ENCODING_RM)
1224*9880d681SAndroid Build Coastguard Worker   ENCODING("vx256mem",        ENCODING_RM)
1225*9880d681SAndroid Build Coastguard Worker   ENCODING("vy128mem",        ENCODING_RM)
1226*9880d681SAndroid Build Coastguard Worker   ENCODING("vy256mem",        ENCODING_RM)
1227*9880d681SAndroid Build Coastguard Worker   ENCODING("vx64xmem",        ENCODING_RM)
1228*9880d681SAndroid Build Coastguard Worker   ENCODING("vx128xmem",       ENCODING_RM)
1229*9880d681SAndroid Build Coastguard Worker   ENCODING("vx256xmem",       ENCODING_RM)
1230*9880d681SAndroid Build Coastguard Worker   ENCODING("vy128xmem",       ENCODING_RM)
1231*9880d681SAndroid Build Coastguard Worker   ENCODING("vy256xmem",       ENCODING_RM)
1232*9880d681SAndroid Build Coastguard Worker   ENCODING("vy512mem",        ENCODING_RM)
1233*9880d681SAndroid Build Coastguard Worker   ENCODING("vz512mem",        ENCODING_RM)
1234*9880d681SAndroid Build Coastguard Worker   errs() << "Unhandled memory encoding " << s << "\n";
1235*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unhandled memory encoding");
1236*9880d681SAndroid Build Coastguard Worker }
1237*9880d681SAndroid Build Coastguard Worker 
1238*9880d681SAndroid Build Coastguard Worker OperandEncoding
relocationEncodingFromString(const std::string & s,uint8_t OpSize)1239*9880d681SAndroid Build Coastguard Worker RecognizableInstr::relocationEncodingFromString(const std::string &s,
1240*9880d681SAndroid Build Coastguard Worker                                                 uint8_t OpSize) {
1241*9880d681SAndroid Build Coastguard Worker   if(OpSize != X86Local::OpSize16) {
1242*9880d681SAndroid Build Coastguard Worker     // For instructions without an OpSize prefix, a declared 16-bit register or
1243*9880d681SAndroid Build Coastguard Worker     // immediate encoding is special.
1244*9880d681SAndroid Build Coastguard Worker     ENCODING("i16imm",        ENCODING_IW)
1245*9880d681SAndroid Build Coastguard Worker   }
1246*9880d681SAndroid Build Coastguard Worker   ENCODING("i16imm",          ENCODING_Iv)
1247*9880d681SAndroid Build Coastguard Worker   ENCODING("i16i8imm",        ENCODING_IB)
1248*9880d681SAndroid Build Coastguard Worker   ENCODING("i32imm",          ENCODING_Iv)
1249*9880d681SAndroid Build Coastguard Worker   ENCODING("i32i8imm",        ENCODING_IB)
1250*9880d681SAndroid Build Coastguard Worker   ENCODING("i64i32imm",       ENCODING_ID)
1251*9880d681SAndroid Build Coastguard Worker   ENCODING("i64i8imm",        ENCODING_IB)
1252*9880d681SAndroid Build Coastguard Worker   ENCODING("i8imm",           ENCODING_IB)
1253*9880d681SAndroid Build Coastguard Worker   ENCODING("u8imm",           ENCODING_IB)
1254*9880d681SAndroid Build Coastguard Worker   ENCODING("i32u8imm",        ENCODING_IB)
1255*9880d681SAndroid Build Coastguard Worker   ENCODING("i64i32imm_pcrel", ENCODING_ID)
1256*9880d681SAndroid Build Coastguard Worker   ENCODING("i16imm_pcrel",    ENCODING_IW)
1257*9880d681SAndroid Build Coastguard Worker   ENCODING("i32imm_pcrel",    ENCODING_ID)
1258*9880d681SAndroid Build Coastguard Worker   ENCODING("brtarget32",      ENCODING_Iv)
1259*9880d681SAndroid Build Coastguard Worker   ENCODING("brtarget16",      ENCODING_Iv)
1260*9880d681SAndroid Build Coastguard Worker   ENCODING("brtarget8",       ENCODING_IB)
1261*9880d681SAndroid Build Coastguard Worker   ENCODING("i64imm",          ENCODING_IO)
1262*9880d681SAndroid Build Coastguard Worker   ENCODING("offset16_8",      ENCODING_Ia)
1263*9880d681SAndroid Build Coastguard Worker   ENCODING("offset16_16",     ENCODING_Ia)
1264*9880d681SAndroid Build Coastguard Worker   ENCODING("offset16_32",     ENCODING_Ia)
1265*9880d681SAndroid Build Coastguard Worker   ENCODING("offset32_8",      ENCODING_Ia)
1266*9880d681SAndroid Build Coastguard Worker   ENCODING("offset32_16",     ENCODING_Ia)
1267*9880d681SAndroid Build Coastguard Worker   ENCODING("offset32_32",     ENCODING_Ia)
1268*9880d681SAndroid Build Coastguard Worker   ENCODING("offset32_64",     ENCODING_Ia)
1269*9880d681SAndroid Build Coastguard Worker   ENCODING("offset64_8",      ENCODING_Ia)
1270*9880d681SAndroid Build Coastguard Worker   ENCODING("offset64_16",     ENCODING_Ia)
1271*9880d681SAndroid Build Coastguard Worker   ENCODING("offset64_32",     ENCODING_Ia)
1272*9880d681SAndroid Build Coastguard Worker   ENCODING("offset64_64",     ENCODING_Ia)
1273*9880d681SAndroid Build Coastguard Worker   ENCODING("srcidx8",         ENCODING_SI)
1274*9880d681SAndroid Build Coastguard Worker   ENCODING("srcidx16",        ENCODING_SI)
1275*9880d681SAndroid Build Coastguard Worker   ENCODING("srcidx32",        ENCODING_SI)
1276*9880d681SAndroid Build Coastguard Worker   ENCODING("srcidx64",        ENCODING_SI)
1277*9880d681SAndroid Build Coastguard Worker   ENCODING("dstidx8",         ENCODING_DI)
1278*9880d681SAndroid Build Coastguard Worker   ENCODING("dstidx16",        ENCODING_DI)
1279*9880d681SAndroid Build Coastguard Worker   ENCODING("dstidx32",        ENCODING_DI)
1280*9880d681SAndroid Build Coastguard Worker   ENCODING("dstidx64",        ENCODING_DI)
1281*9880d681SAndroid Build Coastguard Worker   errs() << "Unhandled relocation encoding " << s << "\n";
1282*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unhandled relocation encoding");
1283*9880d681SAndroid Build Coastguard Worker }
1284*9880d681SAndroid Build Coastguard Worker 
1285*9880d681SAndroid Build Coastguard Worker OperandEncoding
opcodeModifierEncodingFromString(const std::string & s,uint8_t OpSize)1286*9880d681SAndroid Build Coastguard Worker RecognizableInstr::opcodeModifierEncodingFromString(const std::string &s,
1287*9880d681SAndroid Build Coastguard Worker                                                     uint8_t OpSize) {
1288*9880d681SAndroid Build Coastguard Worker   ENCODING("GR32",            ENCODING_Rv)
1289*9880d681SAndroid Build Coastguard Worker   ENCODING("GR64",            ENCODING_RO)
1290*9880d681SAndroid Build Coastguard Worker   ENCODING("GR16",            ENCODING_Rv)
1291*9880d681SAndroid Build Coastguard Worker   ENCODING("GR8",             ENCODING_RB)
1292*9880d681SAndroid Build Coastguard Worker   ENCODING("GR32_NOAX",       ENCODING_Rv)
1293*9880d681SAndroid Build Coastguard Worker   errs() << "Unhandled opcode modifier encoding " << s << "\n";
1294*9880d681SAndroid Build Coastguard Worker   llvm_unreachable("Unhandled opcode modifier encoding");
1295*9880d681SAndroid Build Coastguard Worker }
1296*9880d681SAndroid Build Coastguard Worker #undef ENCODING
1297