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