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