X86Disassembler.cpp 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994
  1. //===-- X86Disassembler.cpp - Disassembler for x86 and x86_64 -------------===//
  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.
  11. // It contains code to translate the data produced by the decoder into
  12. // MCInsts.
  13. // Documentation for the disassembler can be found in X86Disassembler.h.
  14. //
  15. //===----------------------------------------------------------------------===//
  16. #include "X86Disassembler.h"
  17. #include "X86DisassemblerDecoder.h"
  18. #include "llvm/MC/MCContext.h"
  19. #include "llvm/MC/MCDisassembler.h"
  20. #include "llvm/MC/MCExpr.h"
  21. #include "llvm/MC/MCInst.h"
  22. #include "llvm/MC/MCInstrInfo.h"
  23. #include "llvm/MC/MCSubtargetInfo.h"
  24. #include "llvm/Support/Debug.h"
  25. #include "llvm/Support/TargetRegistry.h"
  26. #include "llvm/Support/raw_ostream.h"
  27. using namespace llvm;
  28. using namespace llvm::X86Disassembler;
  29. #define DEBUG_TYPE "x86-disassembler"
  30. #define GET_REGINFO_ENUM
  31. #include "X86GenRegisterInfo.inc"
  32. #define GET_INSTRINFO_ENUM
  33. #include "X86GenInstrInfo.inc"
  34. #define GET_SUBTARGETINFO_ENUM
  35. #include "X86GenSubtargetInfo.inc"
  36. void llvm::X86Disassembler::Debug(const char *file, unsigned line,
  37. const char *s) {
  38. dbgs() << file << ":" << line << ": " << s;
  39. }
  40. const char *llvm::X86Disassembler::GetInstrName(unsigned Opcode,
  41. const void *mii) {
  42. const MCInstrInfo *MII = static_cast<const MCInstrInfo *>(mii);
  43. return MII->getName(Opcode);
  44. }
  45. #define debug(s) DEBUG(Debug(__FILE__, __LINE__, s));
  46. namespace llvm {
  47. // Fill-ins to make the compiler happy. These constants are never actually
  48. // assigned; they are just filler to make an automatically-generated switch
  49. // statement work.
  50. namespace X86 {
  51. enum {
  52. BX_SI = 500,
  53. BX_DI = 501,
  54. BP_SI = 502,
  55. BP_DI = 503,
  56. sib = 504,
  57. sib64 = 505
  58. };
  59. }
  60. extern Target TheX86_32Target, TheX86_64Target;
  61. }
  62. static bool translateInstruction(MCInst &target,
  63. InternalInstruction &source,
  64. const MCDisassembler *Dis);
  65. X86GenericDisassembler::X86GenericDisassembler(
  66. const MCSubtargetInfo &STI,
  67. MCContext &Ctx,
  68. std::unique_ptr<const MCInstrInfo> MII)
  69. : MCDisassembler(STI, Ctx), MII(std::move(MII)) {
  70. switch (STI.getFeatureBits() &
  71. (X86::Mode16Bit | X86::Mode32Bit | X86::Mode64Bit)) {
  72. case X86::Mode16Bit:
  73. fMode = MODE_16BIT;
  74. break;
  75. case X86::Mode32Bit:
  76. fMode = MODE_32BIT;
  77. break;
  78. case X86::Mode64Bit:
  79. fMode = MODE_64BIT;
  80. break;
  81. default:
  82. llvm_unreachable("Invalid CPU mode");
  83. }
  84. }
  85. struct Region {
  86. ArrayRef<uint8_t> Bytes;
  87. uint64_t Base;
  88. Region(ArrayRef<uint8_t> Bytes, uint64_t Base) : Bytes(Bytes), Base(Base) {}
  89. };
  90. /// A callback function that wraps the readByte method from Region.
  91. ///
  92. /// @param Arg - The generic callback parameter. In this case, this should
  93. /// be a pointer to a Region.
  94. /// @param Byte - A pointer to the byte to be read.
  95. /// @param Address - The address to be read.
  96. static int regionReader(const void *Arg, uint8_t *Byte, uint64_t Address) {
  97. auto *R = static_cast<const Region *>(Arg);
  98. ArrayRef<uint8_t> Bytes = R->Bytes;
  99. unsigned Index = Address - R->Base;
  100. if (Bytes.size() <= Index)
  101. return -1;
  102. *Byte = Bytes[Index];
  103. return 0;
  104. }
  105. /// logger - a callback function that wraps the operator<< method from
  106. /// raw_ostream.
  107. ///
  108. /// @param arg - The generic callback parameter. This should be a pointe
  109. /// to a raw_ostream.
  110. /// @param log - A string to be logged. logger() adds a newline.
  111. static void logger(void* arg, const char* log) {
  112. if (!arg)
  113. return;
  114. raw_ostream &vStream = *(static_cast<raw_ostream*>(arg));
  115. vStream << log << "\n";
  116. }
  117. //
  118. // Public interface for the disassembler
  119. //
  120. MCDisassembler::DecodeStatus X86GenericDisassembler::getInstruction(
  121. MCInst &Instr, uint64_t &Size, ArrayRef<uint8_t> Bytes, uint64_t Address,
  122. raw_ostream &VStream, raw_ostream &CStream) const {
  123. CommentStream = &CStream;
  124. InternalInstruction InternalInstr;
  125. dlog_t LoggerFn = logger;
  126. if (&VStream == &nulls())
  127. LoggerFn = nullptr; // Disable logging completely if it's going to nulls().
  128. Region R(Bytes, Address);
  129. int Ret = decodeInstruction(&InternalInstr, regionReader, (const void *)&R,
  130. LoggerFn, (void *)&VStream,
  131. (const void *)MII.get(), Address, fMode);
  132. if (Ret) {
  133. Size = InternalInstr.readerCursor - Address;
  134. return Fail;
  135. } else {
  136. Size = InternalInstr.length;
  137. return (!translateInstruction(Instr, InternalInstr, this)) ? Success : Fail;
  138. }
  139. }
  140. //
  141. // Private code that translates from struct InternalInstructions to MCInsts.
  142. //
  143. /// translateRegister - Translates an internal register to the appropriate LLVM
  144. /// register, and appends it as an operand to an MCInst.
  145. ///
  146. /// @param mcInst - The MCInst to append to.
  147. /// @param reg - The Reg to append.
  148. static void translateRegister(MCInst &mcInst, Reg reg) {
  149. #define ENTRY(x) X86::x,
  150. uint8_t llvmRegnums[] = {
  151. ALL_REGS
  152. 0
  153. };
  154. #undef ENTRY
  155. uint8_t llvmRegnum = llvmRegnums[reg];
  156. mcInst.addOperand(MCOperand::CreateReg(llvmRegnum));
  157. }
  158. /// tryAddingSymbolicOperand - trys to add a symbolic operand in place of the
  159. /// immediate Value in the MCInst.
  160. ///
  161. /// @param Value - The immediate Value, has had any PC adjustment made by
  162. /// the caller.
  163. /// @param isBranch - If the instruction is a branch instruction
  164. /// @param Address - The starting address of the instruction
  165. /// @param Offset - The byte offset to this immediate in the instruction
  166. /// @param Width - The byte width of this immediate in the instruction
  167. ///
  168. /// If the getOpInfo() function was set when setupForSymbolicDisassembly() was
  169. /// called then that function is called to get any symbolic information for the
  170. /// immediate in the instruction using the Address, Offset and Width. If that
  171. /// returns non-zero then the symbolic information it returns is used to create
  172. /// an MCExpr and that is added as an operand to the MCInst. If getOpInfo()
  173. /// returns zero and isBranch is true then a symbol look up for immediate Value
  174. /// is done and if a symbol is found an MCExpr is created with that, else
  175. /// an MCExpr with the immediate Value is created. This function returns true
  176. /// if it adds an operand to the MCInst and false otherwise.
  177. static bool tryAddingSymbolicOperand(int64_t Value, bool isBranch,
  178. uint64_t Address, uint64_t Offset,
  179. uint64_t Width, MCInst &MI,
  180. const MCDisassembler *Dis) {
  181. return Dis->tryAddingSymbolicOperand(MI, Value, Address, isBranch,
  182. Offset, Width);
  183. }
  184. /// tryAddingPcLoadReferenceComment - trys to add a comment as to what is being
  185. /// referenced by a load instruction with the base register that is the rip.
  186. /// These can often be addresses in a literal pool. The Address of the
  187. /// instruction and its immediate Value are used to determine the address
  188. /// being referenced in the literal pool entry. The SymbolLookUp call back will
  189. /// return a pointer to a literal 'C' string if the referenced address is an
  190. /// address into a section with 'C' string literals.
  191. static void tryAddingPcLoadReferenceComment(uint64_t Address, uint64_t Value,
  192. const void *Decoder) {
  193. const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder);
  194. Dis->tryAddingPcLoadReferenceComment(Value, Address);
  195. }
  196. static const uint8_t segmentRegnums[SEG_OVERRIDE_max] = {
  197. 0, // SEG_OVERRIDE_NONE
  198. X86::CS,
  199. X86::SS,
  200. X86::DS,
  201. X86::ES,
  202. X86::FS,
  203. X86::GS
  204. };
  205. /// translateSrcIndex - Appends a source index operand to an MCInst.
  206. ///
  207. /// @param mcInst - The MCInst to append to.
  208. /// @param insn - The internal instruction.
  209. static bool translateSrcIndex(MCInst &mcInst, InternalInstruction &insn) {
  210. unsigned baseRegNo;
  211. if (insn.mode == MODE_64BIT)
  212. baseRegNo = insn.prefixPresent[0x67] ? X86::ESI : X86::RSI;
  213. else if (insn.mode == MODE_32BIT)
  214. baseRegNo = insn.prefixPresent[0x67] ? X86::SI : X86::ESI;
  215. else {
  216. assert(insn.mode == MODE_16BIT);
  217. baseRegNo = insn.prefixPresent[0x67] ? X86::ESI : X86::SI;
  218. }
  219. MCOperand baseReg = MCOperand::CreateReg(baseRegNo);
  220. mcInst.addOperand(baseReg);
  221. MCOperand segmentReg;
  222. segmentReg = MCOperand::CreateReg(segmentRegnums[insn.segmentOverride]);
  223. mcInst.addOperand(segmentReg);
  224. return false;
  225. }
  226. /// translateDstIndex - Appends a destination index operand to an MCInst.
  227. ///
  228. /// @param mcInst - The MCInst to append to.
  229. /// @param insn - The internal instruction.
  230. static bool translateDstIndex(MCInst &mcInst, InternalInstruction &insn) {
  231. unsigned baseRegNo;
  232. if (insn.mode == MODE_64BIT)
  233. baseRegNo = insn.prefixPresent[0x67] ? X86::EDI : X86::RDI;
  234. else if (insn.mode == MODE_32BIT)
  235. baseRegNo = insn.prefixPresent[0x67] ? X86::DI : X86::EDI;
  236. else {
  237. assert(insn.mode == MODE_16BIT);
  238. baseRegNo = insn.prefixPresent[0x67] ? X86::EDI : X86::DI;
  239. }
  240. MCOperand baseReg = MCOperand::CreateReg(baseRegNo);
  241. mcInst.addOperand(baseReg);
  242. return false;
  243. }
  244. /// translateImmediate - Appends an immediate operand to an MCInst.
  245. ///
  246. /// @param mcInst - The MCInst to append to.
  247. /// @param immediate - The immediate value to append.
  248. /// @param operand - The operand, as stored in the descriptor table.
  249. /// @param insn - The internal instruction.
  250. static void translateImmediate(MCInst &mcInst, uint64_t immediate,
  251. const OperandSpecifier &operand,
  252. InternalInstruction &insn,
  253. const MCDisassembler *Dis) {
  254. // Sign-extend the immediate if necessary.
  255. OperandType type = (OperandType)operand.type;
  256. bool isBranch = false;
  257. uint64_t pcrel = 0;
  258. if (type == TYPE_RELv) {
  259. isBranch = true;
  260. pcrel = insn.startLocation +
  261. insn.immediateOffset + insn.immediateSize;
  262. switch (insn.displacementSize) {
  263. default:
  264. break;
  265. case 1:
  266. if(immediate & 0x80)
  267. immediate |= ~(0xffull);
  268. break;
  269. case 2:
  270. if(immediate & 0x8000)
  271. immediate |= ~(0xffffull);
  272. break;
  273. case 4:
  274. if(immediate & 0x80000000)
  275. immediate |= ~(0xffffffffull);
  276. break;
  277. case 8:
  278. break;
  279. }
  280. }
  281. // By default sign-extend all X86 immediates based on their encoding.
  282. else if (type == TYPE_IMM8 || type == TYPE_IMM16 || type == TYPE_IMM32 ||
  283. type == TYPE_IMM64 || type == TYPE_IMMv) {
  284. switch (operand.encoding) {
  285. default:
  286. break;
  287. case ENCODING_IB:
  288. if(immediate & 0x80)
  289. immediate |= ~(0xffull);
  290. break;
  291. case ENCODING_IW:
  292. if(immediate & 0x8000)
  293. immediate |= ~(0xffffull);
  294. break;
  295. case ENCODING_ID:
  296. if(immediate & 0x80000000)
  297. immediate |= ~(0xffffffffull);
  298. break;
  299. case ENCODING_IO:
  300. break;
  301. }
  302. } else if (type == TYPE_IMM3) {
  303. // Check for immediates that printSSECC can't handle.
  304. if (immediate >= 8) {
  305. unsigned NewOpc;
  306. switch (mcInst.getOpcode()) {
  307. default: llvm_unreachable("unexpected opcode");
  308. case X86::CMPPDrmi: NewOpc = X86::CMPPDrmi_alt; break;
  309. case X86::CMPPDrri: NewOpc = X86::CMPPDrri_alt; break;
  310. case X86::CMPPSrmi: NewOpc = X86::CMPPSrmi_alt; break;
  311. case X86::CMPPSrri: NewOpc = X86::CMPPSrri_alt; break;
  312. case X86::CMPSDrm: NewOpc = X86::CMPSDrm_alt; break;
  313. case X86::CMPSDrr: NewOpc = X86::CMPSDrr_alt; break;
  314. case X86::CMPSSrm: NewOpc = X86::CMPSSrm_alt; break;
  315. case X86::CMPSSrr: NewOpc = X86::CMPSSrr_alt; break;
  316. case X86::VPCOMBri: NewOpc = X86::VPCOMBri_alt; break;
  317. case X86::VPCOMBmi: NewOpc = X86::VPCOMBmi_alt; break;
  318. case X86::VPCOMWri: NewOpc = X86::VPCOMWri_alt; break;
  319. case X86::VPCOMWmi: NewOpc = X86::VPCOMWmi_alt; break;
  320. case X86::VPCOMDri: NewOpc = X86::VPCOMDri_alt; break;
  321. case X86::VPCOMDmi: NewOpc = X86::VPCOMDmi_alt; break;
  322. case X86::VPCOMQri: NewOpc = X86::VPCOMQri_alt; break;
  323. case X86::VPCOMQmi: NewOpc = X86::VPCOMQmi_alt; break;
  324. case X86::VPCOMUBri: NewOpc = X86::VPCOMUBri_alt; break;
  325. case X86::VPCOMUBmi: NewOpc = X86::VPCOMUBmi_alt; break;
  326. case X86::VPCOMUWri: NewOpc = X86::VPCOMUWri_alt; break;
  327. case X86::VPCOMUWmi: NewOpc = X86::VPCOMUWmi_alt; break;
  328. case X86::VPCOMUDri: NewOpc = X86::VPCOMUDri_alt; break;
  329. case X86::VPCOMUDmi: NewOpc = X86::VPCOMUDmi_alt; break;
  330. case X86::VPCOMUQri: NewOpc = X86::VPCOMUQri_alt; break;
  331. case X86::VPCOMUQmi: NewOpc = X86::VPCOMUQmi_alt; break;
  332. }
  333. // Switch opcode to the one that doesn't get special printing.
  334. mcInst.setOpcode(NewOpc);
  335. }
  336. } else if (type == TYPE_IMM5) {
  337. // Check for immediates that printAVXCC can't handle.
  338. if (immediate >= 32) {
  339. unsigned NewOpc;
  340. switch (mcInst.getOpcode()) {
  341. default: llvm_unreachable("unexpected opcode");
  342. case X86::VCMPPDrmi: NewOpc = X86::VCMPPDrmi_alt; break;
  343. case X86::VCMPPDrri: NewOpc = X86::VCMPPDrri_alt; break;
  344. case X86::VCMPPSrmi: NewOpc = X86::VCMPPSrmi_alt; break;
  345. case X86::VCMPPSrri: NewOpc = X86::VCMPPSrri_alt; break;
  346. case X86::VCMPSDrm: NewOpc = X86::VCMPSDrm_alt; break;
  347. case X86::VCMPSDrr: NewOpc = X86::VCMPSDrr_alt; break;
  348. case X86::VCMPSSrm: NewOpc = X86::VCMPSSrm_alt; break;
  349. case X86::VCMPSSrr: NewOpc = X86::VCMPSSrr_alt; break;
  350. case X86::VCMPPDYrmi: NewOpc = X86::VCMPPDYrmi_alt; break;
  351. case X86::VCMPPDYrri: NewOpc = X86::VCMPPDYrri_alt; break;
  352. case X86::VCMPPSYrmi: NewOpc = X86::VCMPPSYrmi_alt; break;
  353. case X86::VCMPPSYrri: NewOpc = X86::VCMPPSYrri_alt; break;
  354. case X86::VCMPPDZrmi: NewOpc = X86::VCMPPDZrmi_alt; break;
  355. case X86::VCMPPDZrri: NewOpc = X86::VCMPPDZrri_alt; break;
  356. case X86::VCMPPDZrrib: NewOpc = X86::VCMPPDZrrib_alt; break;
  357. case X86::VCMPPSZrmi: NewOpc = X86::VCMPPSZrmi_alt; break;
  358. case X86::VCMPPSZrri: NewOpc = X86::VCMPPSZrri_alt; break;
  359. case X86::VCMPPSZrrib: NewOpc = X86::VCMPPSZrrib_alt; break;
  360. case X86::VCMPSDZrm: NewOpc = X86::VCMPSDZrmi_alt; break;
  361. case X86::VCMPSDZrr: NewOpc = X86::VCMPSDZrri_alt; break;
  362. case X86::VCMPSSZrm: NewOpc = X86::VCMPSSZrmi_alt; break;
  363. case X86::VCMPSSZrr: NewOpc = X86::VCMPSSZrri_alt; break;
  364. }
  365. // Switch opcode to the one that doesn't get special printing.
  366. mcInst.setOpcode(NewOpc);
  367. }
  368. } else if (type == TYPE_AVX512ICC) {
  369. if (immediate >= 8 || ((immediate & 0x3) == 3)) {
  370. unsigned NewOpc;
  371. switch (mcInst.getOpcode()) {
  372. default: llvm_unreachable("unexpected opcode");
  373. case X86::VPCMPBZ128rmi: NewOpc = X86::VPCMPBZ128rmi_alt; break;
  374. case X86::VPCMPBZ128rmik: NewOpc = X86::VPCMPBZ128rmik_alt; break;
  375. case X86::VPCMPBZ128rri: NewOpc = X86::VPCMPBZ128rri_alt; break;
  376. case X86::VPCMPBZ128rrik: NewOpc = X86::VPCMPBZ128rrik_alt; break;
  377. case X86::VPCMPBZ256rmi: NewOpc = X86::VPCMPBZ256rmi_alt; break;
  378. case X86::VPCMPBZ256rmik: NewOpc = X86::VPCMPBZ256rmik_alt; break;
  379. case X86::VPCMPBZ256rri: NewOpc = X86::VPCMPBZ256rri_alt; break;
  380. case X86::VPCMPBZ256rrik: NewOpc = X86::VPCMPBZ256rrik_alt; break;
  381. case X86::VPCMPBZrmi: NewOpc = X86::VPCMPBZrmi_alt; break;
  382. case X86::VPCMPBZrmik: NewOpc = X86::VPCMPBZrmik_alt; break;
  383. case X86::VPCMPBZrri: NewOpc = X86::VPCMPBZrri_alt; break;
  384. case X86::VPCMPBZrrik: NewOpc = X86::VPCMPBZrrik_alt; break;
  385. case X86::VPCMPDZ128rmi: NewOpc = X86::VPCMPDZ128rmi_alt; break;
  386. case X86::VPCMPDZ128rmib: NewOpc = X86::VPCMPDZ128rmib_alt; break;
  387. case X86::VPCMPDZ128rmibk: NewOpc = X86::VPCMPDZ128rmibk_alt; break;
  388. case X86::VPCMPDZ128rmik: NewOpc = X86::VPCMPDZ128rmik_alt; break;
  389. case X86::VPCMPDZ128rri: NewOpc = X86::VPCMPDZ128rri_alt; break;
  390. case X86::VPCMPDZ128rrik: NewOpc = X86::VPCMPDZ128rrik_alt; break;
  391. case X86::VPCMPDZ256rmi: NewOpc = X86::VPCMPDZ256rmi_alt; break;
  392. case X86::VPCMPDZ256rmib: NewOpc = X86::VPCMPDZ256rmib_alt; break;
  393. case X86::VPCMPDZ256rmibk: NewOpc = X86::VPCMPDZ256rmibk_alt; break;
  394. case X86::VPCMPDZ256rmik: NewOpc = X86::VPCMPDZ256rmik_alt; break;
  395. case X86::VPCMPDZ256rri: NewOpc = X86::VPCMPDZ256rri_alt; break;
  396. case X86::VPCMPDZ256rrik: NewOpc = X86::VPCMPDZ256rrik_alt; break;
  397. case X86::VPCMPDZrmi: NewOpc = X86::VPCMPDZrmi_alt; break;
  398. case X86::VPCMPDZrmib: NewOpc = X86::VPCMPDZrmib_alt; break;
  399. case X86::VPCMPDZrmibk: NewOpc = X86::VPCMPDZrmibk_alt; break;
  400. case X86::VPCMPDZrmik: NewOpc = X86::VPCMPDZrmik_alt; break;
  401. case X86::VPCMPDZrri: NewOpc = X86::VPCMPDZrri_alt; break;
  402. case X86::VPCMPDZrrik: NewOpc = X86::VPCMPDZrrik_alt; break;
  403. case X86::VPCMPQZ128rmi: NewOpc = X86::VPCMPQZ128rmi_alt; break;
  404. case X86::VPCMPQZ128rmib: NewOpc = X86::VPCMPQZ128rmib_alt; break;
  405. case X86::VPCMPQZ128rmibk: NewOpc = X86::VPCMPQZ128rmibk_alt; break;
  406. case X86::VPCMPQZ128rmik: NewOpc = X86::VPCMPQZ128rmik_alt; break;
  407. case X86::VPCMPQZ128rri: NewOpc = X86::VPCMPQZ128rri_alt; break;
  408. case X86::VPCMPQZ128rrik: NewOpc = X86::VPCMPQZ128rrik_alt; break;
  409. case X86::VPCMPQZ256rmi: NewOpc = X86::VPCMPQZ256rmi_alt; break;
  410. case X86::VPCMPQZ256rmib: NewOpc = X86::VPCMPQZ256rmib_alt; break;
  411. case X86::VPCMPQZ256rmibk: NewOpc = X86::VPCMPQZ256rmibk_alt; break;
  412. case X86::VPCMPQZ256rmik: NewOpc = X86::VPCMPQZ256rmik_alt; break;
  413. case X86::VPCMPQZ256rri: NewOpc = X86::VPCMPQZ256rri_alt; break;
  414. case X86::VPCMPQZ256rrik: NewOpc = X86::VPCMPQZ256rrik_alt; break;
  415. case X86::VPCMPQZrmi: NewOpc = X86::VPCMPQZrmi_alt; break;
  416. case X86::VPCMPQZrmib: NewOpc = X86::VPCMPQZrmib_alt; break;
  417. case X86::VPCMPQZrmibk: NewOpc = X86::VPCMPQZrmibk_alt; break;
  418. case X86::VPCMPQZrmik: NewOpc = X86::VPCMPQZrmik_alt; break;
  419. case X86::VPCMPQZrri: NewOpc = X86::VPCMPQZrri_alt; break;
  420. case X86::VPCMPQZrrik: NewOpc = X86::VPCMPQZrrik_alt; break;
  421. case X86::VPCMPUBZ128rmi: NewOpc = X86::VPCMPUBZ128rmi_alt; break;
  422. case X86::VPCMPUBZ128rmik: NewOpc = X86::VPCMPUBZ128rmik_alt; break;
  423. case X86::VPCMPUBZ128rri: NewOpc = X86::VPCMPUBZ128rri_alt; break;
  424. case X86::VPCMPUBZ128rrik: NewOpc = X86::VPCMPUBZ128rrik_alt; break;
  425. case X86::VPCMPUBZ256rmi: NewOpc = X86::VPCMPUBZ256rmi_alt; break;
  426. case X86::VPCMPUBZ256rmik: NewOpc = X86::VPCMPUBZ256rmik_alt; break;
  427. case X86::VPCMPUBZ256rri: NewOpc = X86::VPCMPUBZ256rri_alt; break;
  428. case X86::VPCMPUBZ256rrik: NewOpc = X86::VPCMPUBZ256rrik_alt; break;
  429. case X86::VPCMPUBZrmi: NewOpc = X86::VPCMPUBZrmi_alt; break;
  430. case X86::VPCMPUBZrmik: NewOpc = X86::VPCMPUBZrmik_alt; break;
  431. case X86::VPCMPUBZrri: NewOpc = X86::VPCMPUBZrri_alt; break;
  432. case X86::VPCMPUBZrrik: NewOpc = X86::VPCMPUBZrrik_alt; break;
  433. case X86::VPCMPUDZ128rmi: NewOpc = X86::VPCMPUDZ128rmi_alt; break;
  434. case X86::VPCMPUDZ128rmib: NewOpc = X86::VPCMPUDZ128rmib_alt; break;
  435. case X86::VPCMPUDZ128rmibk: NewOpc = X86::VPCMPUDZ128rmibk_alt; break;
  436. case X86::VPCMPUDZ128rmik: NewOpc = X86::VPCMPUDZ128rmik_alt; break;
  437. case X86::VPCMPUDZ128rri: NewOpc = X86::VPCMPUDZ128rri_alt; break;
  438. case X86::VPCMPUDZ128rrik: NewOpc = X86::VPCMPUDZ128rrik_alt; break;
  439. case X86::VPCMPUDZ256rmi: NewOpc = X86::VPCMPUDZ256rmi_alt; break;
  440. case X86::VPCMPUDZ256rmib: NewOpc = X86::VPCMPUDZ256rmib_alt; break;
  441. case X86::VPCMPUDZ256rmibk: NewOpc = X86::VPCMPUDZ256rmibk_alt; break;
  442. case X86::VPCMPUDZ256rmik: NewOpc = X86::VPCMPUDZ256rmik_alt; break;
  443. case X86::VPCMPUDZ256rri: NewOpc = X86::VPCMPUDZ256rri_alt; break;
  444. case X86::VPCMPUDZ256rrik: NewOpc = X86::VPCMPUDZ256rrik_alt; break;
  445. case X86::VPCMPUDZrmi: NewOpc = X86::VPCMPUDZrmi_alt; break;
  446. case X86::VPCMPUDZrmib: NewOpc = X86::VPCMPUDZrmib_alt; break;
  447. case X86::VPCMPUDZrmibk: NewOpc = X86::VPCMPUDZrmibk_alt; break;
  448. case X86::VPCMPUDZrmik: NewOpc = X86::VPCMPUDZrmik_alt; break;
  449. case X86::VPCMPUDZrri: NewOpc = X86::VPCMPUDZrri_alt; break;
  450. case X86::VPCMPUDZrrik: NewOpc = X86::VPCMPUDZrrik_alt; break;
  451. case X86::VPCMPUQZ128rmi: NewOpc = X86::VPCMPUQZ128rmi_alt; break;
  452. case X86::VPCMPUQZ128rmib: NewOpc = X86::VPCMPUQZ128rmib_alt; break;
  453. case X86::VPCMPUQZ128rmibk: NewOpc = X86::VPCMPUQZ128rmibk_alt; break;
  454. case X86::VPCMPUQZ128rmik: NewOpc = X86::VPCMPUQZ128rmik_alt; break;
  455. case X86::VPCMPUQZ128rri: NewOpc = X86::VPCMPUQZ128rri_alt; break;
  456. case X86::VPCMPUQZ128rrik: NewOpc = X86::VPCMPUQZ128rrik_alt; break;
  457. case X86::VPCMPUQZ256rmi: NewOpc = X86::VPCMPUQZ256rmi_alt; break;
  458. case X86::VPCMPUQZ256rmib: NewOpc = X86::VPCMPUQZ256rmib_alt; break;
  459. case X86::VPCMPUQZ256rmibk: NewOpc = X86::VPCMPUQZ256rmibk_alt; break;
  460. case X86::VPCMPUQZ256rmik: NewOpc = X86::VPCMPUQZ256rmik_alt; break;
  461. case X86::VPCMPUQZ256rri: NewOpc = X86::VPCMPUQZ256rri_alt; break;
  462. case X86::VPCMPUQZ256rrik: NewOpc = X86::VPCMPUQZ256rrik_alt; break;
  463. case X86::VPCMPUQZrmi: NewOpc = X86::VPCMPUQZrmi_alt; break;
  464. case X86::VPCMPUQZrmib: NewOpc = X86::VPCMPUQZrmib_alt; break;
  465. case X86::VPCMPUQZrmibk: NewOpc = X86::VPCMPUQZrmibk_alt; break;
  466. case X86::VPCMPUQZrmik: NewOpc = X86::VPCMPUQZrmik_alt; break;
  467. case X86::VPCMPUQZrri: NewOpc = X86::VPCMPUQZrri_alt; break;
  468. case X86::VPCMPUQZrrik: NewOpc = X86::VPCMPUQZrrik_alt; break;
  469. case X86::VPCMPUWZ128rmi: NewOpc = X86::VPCMPUWZ128rmi_alt; break;
  470. case X86::VPCMPUWZ128rmik: NewOpc = X86::VPCMPUWZ128rmik_alt; break;
  471. case X86::VPCMPUWZ128rri: NewOpc = X86::VPCMPUWZ128rri_alt; break;
  472. case X86::VPCMPUWZ128rrik: NewOpc = X86::VPCMPUWZ128rrik_alt; break;
  473. case X86::VPCMPUWZ256rmi: NewOpc = X86::VPCMPUWZ256rmi_alt; break;
  474. case X86::VPCMPUWZ256rmik: NewOpc = X86::VPCMPUWZ256rmik_alt; break;
  475. case X86::VPCMPUWZ256rri: NewOpc = X86::VPCMPUWZ256rri_alt; break;
  476. case X86::VPCMPUWZ256rrik: NewOpc = X86::VPCMPUWZ256rrik_alt; break;
  477. case X86::VPCMPUWZrmi: NewOpc = X86::VPCMPUWZrmi_alt; break;
  478. case X86::VPCMPUWZrmik: NewOpc = X86::VPCMPUWZrmik_alt; break;
  479. case X86::VPCMPUWZrri: NewOpc = X86::VPCMPUWZrri_alt; break;
  480. case X86::VPCMPUWZrrik: NewOpc = X86::VPCMPUWZrrik_alt; break;
  481. case X86::VPCMPWZ128rmi: NewOpc = X86::VPCMPWZ128rmi_alt; break;
  482. case X86::VPCMPWZ128rmik: NewOpc = X86::VPCMPWZ128rmik_alt; break;
  483. case X86::VPCMPWZ128rri: NewOpc = X86::VPCMPWZ128rri_alt; break;
  484. case X86::VPCMPWZ128rrik: NewOpc = X86::VPCMPWZ128rrik_alt; break;
  485. case X86::VPCMPWZ256rmi: NewOpc = X86::VPCMPWZ256rmi_alt; break;
  486. case X86::VPCMPWZ256rmik: NewOpc = X86::VPCMPWZ256rmik_alt; break;
  487. case X86::VPCMPWZ256rri: NewOpc = X86::VPCMPWZ256rri_alt; break;
  488. case X86::VPCMPWZ256rrik: NewOpc = X86::VPCMPWZ256rrik_alt; break;
  489. case X86::VPCMPWZrmi: NewOpc = X86::VPCMPWZrmi_alt; break;
  490. case X86::VPCMPWZrmik: NewOpc = X86::VPCMPWZrmik_alt; break;
  491. case X86::VPCMPWZrri: NewOpc = X86::VPCMPWZrri_alt; break;
  492. case X86::VPCMPWZrrik: NewOpc = X86::VPCMPWZrrik_alt; break;
  493. }
  494. // Switch opcode to the one that doesn't get special printing.
  495. mcInst.setOpcode(NewOpc);
  496. }
  497. }
  498. switch (type) {
  499. case TYPE_XMM32:
  500. case TYPE_XMM64:
  501. case TYPE_XMM128:
  502. mcInst.addOperand(MCOperand::CreateReg(X86::XMM0 + (immediate >> 4)));
  503. return;
  504. case TYPE_XMM256:
  505. mcInst.addOperand(MCOperand::CreateReg(X86::YMM0 + (immediate >> 4)));
  506. return;
  507. case TYPE_XMM512:
  508. mcInst.addOperand(MCOperand::CreateReg(X86::ZMM0 + (immediate >> 4)));
  509. return;
  510. case TYPE_REL8:
  511. isBranch = true;
  512. pcrel = insn.startLocation + insn.immediateOffset + insn.immediateSize;
  513. if(immediate & 0x80)
  514. immediate |= ~(0xffull);
  515. break;
  516. case TYPE_REL32:
  517. case TYPE_REL64:
  518. isBranch = true;
  519. pcrel = insn.startLocation + insn.immediateOffset + insn.immediateSize;
  520. if(immediate & 0x80000000)
  521. immediate |= ~(0xffffffffull);
  522. break;
  523. default:
  524. // operand is 64 bits wide. Do nothing.
  525. break;
  526. }
  527. if(!tryAddingSymbolicOperand(immediate + pcrel, isBranch, insn.startLocation,
  528. insn.immediateOffset, insn.immediateSize,
  529. mcInst, Dis))
  530. mcInst.addOperand(MCOperand::CreateImm(immediate));
  531. if (type == TYPE_MOFFS8 || type == TYPE_MOFFS16 ||
  532. type == TYPE_MOFFS32 || type == TYPE_MOFFS64) {
  533. MCOperand segmentReg;
  534. segmentReg = MCOperand::CreateReg(segmentRegnums[insn.segmentOverride]);
  535. mcInst.addOperand(segmentReg);
  536. }
  537. }
  538. /// translateRMRegister - Translates a register stored in the R/M field of the
  539. /// ModR/M byte to its LLVM equivalent and appends it to an MCInst.
  540. /// @param mcInst - The MCInst to append to.
  541. /// @param insn - The internal instruction to extract the R/M field
  542. /// from.
  543. /// @return - 0 on success; -1 otherwise
  544. static bool translateRMRegister(MCInst &mcInst,
  545. InternalInstruction &insn) {
  546. if (insn.eaBase == EA_BASE_sib || insn.eaBase == EA_BASE_sib64) {
  547. debug("A R/M register operand may not have a SIB byte");
  548. return true;
  549. }
  550. switch (insn.eaBase) {
  551. default:
  552. debug("Unexpected EA base register");
  553. return true;
  554. case EA_BASE_NONE:
  555. debug("EA_BASE_NONE for ModR/M base");
  556. return true;
  557. #define ENTRY(x) case EA_BASE_##x:
  558. ALL_EA_BASES
  559. #undef ENTRY
  560. debug("A R/M register operand may not have a base; "
  561. "the operand must be a register.");
  562. return true;
  563. #define ENTRY(x) \
  564. case EA_REG_##x: \
  565. mcInst.addOperand(MCOperand::CreateReg(X86::x)); break;
  566. ALL_REGS
  567. #undef ENTRY
  568. }
  569. return false;
  570. }
  571. /// translateRMMemory - Translates a memory operand stored in the Mod and R/M
  572. /// fields of an internal instruction (and possibly its SIB byte) to a memory
  573. /// operand in LLVM's format, and appends it to an MCInst.
  574. ///
  575. /// @param mcInst - The MCInst to append to.
  576. /// @param insn - The instruction to extract Mod, R/M, and SIB fields
  577. /// from.
  578. /// @return - 0 on success; nonzero otherwise
  579. static bool translateRMMemory(MCInst &mcInst, InternalInstruction &insn,
  580. const MCDisassembler *Dis) {
  581. // Addresses in an MCInst are represented as five operands:
  582. // 1. basereg (register) The R/M base, or (if there is a SIB) the
  583. // SIB base
  584. // 2. scaleamount (immediate) 1, or (if there is a SIB) the specified
  585. // scale amount
  586. // 3. indexreg (register) x86_registerNONE, or (if there is a SIB)
  587. // the index (which is multiplied by the
  588. // scale amount)
  589. // 4. displacement (immediate) 0, or the displacement if there is one
  590. // 5. segmentreg (register) x86_registerNONE for now, but could be set
  591. // if we have segment overrides
  592. MCOperand baseReg;
  593. MCOperand scaleAmount;
  594. MCOperand indexReg;
  595. MCOperand displacement;
  596. MCOperand segmentReg;
  597. uint64_t pcrel = 0;
  598. if (insn.eaBase == EA_BASE_sib || insn.eaBase == EA_BASE_sib64) {
  599. if (insn.sibBase != SIB_BASE_NONE) {
  600. switch (insn.sibBase) {
  601. default:
  602. debug("Unexpected sibBase");
  603. return true;
  604. #define ENTRY(x) \
  605. case SIB_BASE_##x: \
  606. baseReg = MCOperand::CreateReg(X86::x); break;
  607. ALL_SIB_BASES
  608. #undef ENTRY
  609. }
  610. } else {
  611. baseReg = MCOperand::CreateReg(0);
  612. }
  613. // Check whether we are handling VSIB addressing mode for GATHER.
  614. // If sibIndex was set to SIB_INDEX_NONE, index offset is 4 and
  615. // we should use SIB_INDEX_XMM4|YMM4 for VSIB.
  616. // I don't see a way to get the correct IndexReg in readSIB:
  617. // We can tell whether it is VSIB or SIB after instruction ID is decoded,
  618. // but instruction ID may not be decoded yet when calling readSIB.
  619. uint32_t Opcode = mcInst.getOpcode();
  620. bool IndexIs128 = (Opcode == X86::VGATHERDPDrm ||
  621. Opcode == X86::VGATHERDPDYrm ||
  622. Opcode == X86::VGATHERQPDrm ||
  623. Opcode == X86::VGATHERDPSrm ||
  624. Opcode == X86::VGATHERQPSrm ||
  625. Opcode == X86::VPGATHERDQrm ||
  626. Opcode == X86::VPGATHERDQYrm ||
  627. Opcode == X86::VPGATHERQQrm ||
  628. Opcode == X86::VPGATHERDDrm ||
  629. Opcode == X86::VPGATHERQDrm);
  630. bool IndexIs256 = (Opcode == X86::VGATHERQPDYrm ||
  631. Opcode == X86::VGATHERDPSYrm ||
  632. Opcode == X86::VGATHERQPSYrm ||
  633. Opcode == X86::VGATHERDPDZrm ||
  634. Opcode == X86::VPGATHERDQZrm ||
  635. Opcode == X86::VPGATHERQQYrm ||
  636. Opcode == X86::VPGATHERDDYrm ||
  637. Opcode == X86::VPGATHERQDYrm);
  638. bool IndexIs512 = (Opcode == X86::VGATHERQPDZrm ||
  639. Opcode == X86::VGATHERDPSZrm ||
  640. Opcode == X86::VGATHERQPSZrm ||
  641. Opcode == X86::VPGATHERQQZrm ||
  642. Opcode == X86::VPGATHERDDZrm ||
  643. Opcode == X86::VPGATHERQDZrm);
  644. if (IndexIs128 || IndexIs256 || IndexIs512) {
  645. unsigned IndexOffset = insn.sibIndex -
  646. (insn.addressSize == 8 ? SIB_INDEX_RAX:SIB_INDEX_EAX);
  647. SIBIndex IndexBase = IndexIs512 ? SIB_INDEX_ZMM0 :
  648. IndexIs256 ? SIB_INDEX_YMM0 : SIB_INDEX_XMM0;
  649. insn.sibIndex = (SIBIndex)(IndexBase +
  650. (insn.sibIndex == SIB_INDEX_NONE ? 4 : IndexOffset));
  651. }
  652. if (insn.sibIndex != SIB_INDEX_NONE) {
  653. switch (insn.sibIndex) {
  654. default:
  655. debug("Unexpected sibIndex");
  656. return true;
  657. #define ENTRY(x) \
  658. case SIB_INDEX_##x: \
  659. indexReg = MCOperand::CreateReg(X86::x); break;
  660. EA_BASES_32BIT
  661. EA_BASES_64BIT
  662. REGS_XMM
  663. REGS_YMM
  664. REGS_ZMM
  665. #undef ENTRY
  666. }
  667. } else {
  668. indexReg = MCOperand::CreateReg(0);
  669. }
  670. scaleAmount = MCOperand::CreateImm(insn.sibScale);
  671. } else {
  672. switch (insn.eaBase) {
  673. case EA_BASE_NONE:
  674. if (insn.eaDisplacement == EA_DISP_NONE) {
  675. debug("EA_BASE_NONE and EA_DISP_NONE for ModR/M base");
  676. return true;
  677. }
  678. if (insn.mode == MODE_64BIT){
  679. pcrel = insn.startLocation +
  680. insn.displacementOffset + insn.displacementSize;
  681. tryAddingPcLoadReferenceComment(insn.startLocation +
  682. insn.displacementOffset,
  683. insn.displacement + pcrel, Dis);
  684. baseReg = MCOperand::CreateReg(X86::RIP); // Section 2.2.1.6
  685. }
  686. else
  687. baseReg = MCOperand::CreateReg(0);
  688. indexReg = MCOperand::CreateReg(0);
  689. break;
  690. case EA_BASE_BX_SI:
  691. baseReg = MCOperand::CreateReg(X86::BX);
  692. indexReg = MCOperand::CreateReg(X86::SI);
  693. break;
  694. case EA_BASE_BX_DI:
  695. baseReg = MCOperand::CreateReg(X86::BX);
  696. indexReg = MCOperand::CreateReg(X86::DI);
  697. break;
  698. case EA_BASE_BP_SI:
  699. baseReg = MCOperand::CreateReg(X86::BP);
  700. indexReg = MCOperand::CreateReg(X86::SI);
  701. break;
  702. case EA_BASE_BP_DI:
  703. baseReg = MCOperand::CreateReg(X86::BP);
  704. indexReg = MCOperand::CreateReg(X86::DI);
  705. break;
  706. default:
  707. indexReg = MCOperand::CreateReg(0);
  708. switch (insn.eaBase) {
  709. default:
  710. debug("Unexpected eaBase");
  711. return true;
  712. // Here, we will use the fill-ins defined above. However,
  713. // BX_SI, BX_DI, BP_SI, and BP_DI are all handled above and
  714. // sib and sib64 were handled in the top-level if, so they're only
  715. // placeholders to keep the compiler happy.
  716. #define ENTRY(x) \
  717. case EA_BASE_##x: \
  718. baseReg = MCOperand::CreateReg(X86::x); break;
  719. ALL_EA_BASES
  720. #undef ENTRY
  721. #define ENTRY(x) case EA_REG_##x:
  722. ALL_REGS
  723. #undef ENTRY
  724. debug("A R/M memory operand may not be a register; "
  725. "the base field must be a base.");
  726. return true;
  727. }
  728. }
  729. scaleAmount = MCOperand::CreateImm(1);
  730. }
  731. displacement = MCOperand::CreateImm(insn.displacement);
  732. segmentReg = MCOperand::CreateReg(segmentRegnums[insn.segmentOverride]);
  733. mcInst.addOperand(baseReg);
  734. mcInst.addOperand(scaleAmount);
  735. mcInst.addOperand(indexReg);
  736. if(!tryAddingSymbolicOperand(insn.displacement + pcrel, false,
  737. insn.startLocation, insn.displacementOffset,
  738. insn.displacementSize, mcInst, Dis))
  739. mcInst.addOperand(displacement);
  740. mcInst.addOperand(segmentReg);
  741. return false;
  742. }
  743. /// translateRM - Translates an operand stored in the R/M (and possibly SIB)
  744. /// byte of an instruction to LLVM form, and appends it to an MCInst.
  745. ///
  746. /// @param mcInst - The MCInst to append to.
  747. /// @param operand - The operand, as stored in the descriptor table.
  748. /// @param insn - The instruction to extract Mod, R/M, and SIB fields
  749. /// from.
  750. /// @return - 0 on success; nonzero otherwise
  751. static bool translateRM(MCInst &mcInst, const OperandSpecifier &operand,
  752. InternalInstruction &insn, const MCDisassembler *Dis) {
  753. switch (operand.type) {
  754. default:
  755. debug("Unexpected type for a R/M operand");
  756. return true;
  757. case TYPE_R8:
  758. case TYPE_R16:
  759. case TYPE_R32:
  760. case TYPE_R64:
  761. case TYPE_Rv:
  762. case TYPE_MM64:
  763. case TYPE_XMM:
  764. case TYPE_XMM32:
  765. case TYPE_XMM64:
  766. case TYPE_XMM128:
  767. case TYPE_XMM256:
  768. case TYPE_XMM512:
  769. case TYPE_VK1:
  770. case TYPE_VK8:
  771. case TYPE_VK16:
  772. case TYPE_DEBUGREG:
  773. case TYPE_CONTROLREG:
  774. return translateRMRegister(mcInst, insn);
  775. case TYPE_M:
  776. case TYPE_M8:
  777. case TYPE_M16:
  778. case TYPE_M32:
  779. case TYPE_M64:
  780. case TYPE_M128:
  781. case TYPE_M256:
  782. case TYPE_M512:
  783. case TYPE_Mv:
  784. case TYPE_M32FP:
  785. case TYPE_M64FP:
  786. case TYPE_M80FP:
  787. case TYPE_M1616:
  788. case TYPE_M1632:
  789. case TYPE_M1664:
  790. case TYPE_LEA:
  791. return translateRMMemory(mcInst, insn, Dis);
  792. }
  793. }
  794. /// translateFPRegister - Translates a stack position on the FPU stack to its
  795. /// LLVM form, and appends it to an MCInst.
  796. ///
  797. /// @param mcInst - The MCInst to append to.
  798. /// @param stackPos - The stack position to translate.
  799. static void translateFPRegister(MCInst &mcInst,
  800. uint8_t stackPos) {
  801. mcInst.addOperand(MCOperand::CreateReg(X86::ST0 + stackPos));
  802. }
  803. /// translateMaskRegister - Translates a 3-bit mask register number to
  804. /// LLVM form, and appends it to an MCInst.
  805. ///
  806. /// @param mcInst - The MCInst to append to.
  807. /// @param maskRegNum - Number of mask register from 0 to 7.
  808. /// @return - false on success; true otherwise.
  809. static bool translateMaskRegister(MCInst &mcInst,
  810. uint8_t maskRegNum) {
  811. if (maskRegNum >= 8) {
  812. debug("Invalid mask register number");
  813. return true;
  814. }
  815. mcInst.addOperand(MCOperand::CreateReg(X86::K0 + maskRegNum));
  816. return false;
  817. }
  818. /// translateOperand - Translates an operand stored in an internal instruction
  819. /// to LLVM's format and appends it to an MCInst.
  820. ///
  821. /// @param mcInst - The MCInst to append to.
  822. /// @param operand - The operand, as stored in the descriptor table.
  823. /// @param insn - The internal instruction.
  824. /// @return - false on success; true otherwise.
  825. static bool translateOperand(MCInst &mcInst, const OperandSpecifier &operand,
  826. InternalInstruction &insn,
  827. const MCDisassembler *Dis) {
  828. switch (operand.encoding) {
  829. default:
  830. debug("Unhandled operand encoding during translation");
  831. return true;
  832. case ENCODING_REG:
  833. translateRegister(mcInst, insn.reg);
  834. return false;
  835. case ENCODING_WRITEMASK:
  836. return translateMaskRegister(mcInst, insn.writemask);
  837. CASE_ENCODING_RM:
  838. return translateRM(mcInst, operand, insn, Dis);
  839. case ENCODING_CB:
  840. case ENCODING_CW:
  841. case ENCODING_CD:
  842. case ENCODING_CP:
  843. case ENCODING_CO:
  844. case ENCODING_CT:
  845. debug("Translation of code offsets isn't supported.");
  846. return true;
  847. case ENCODING_IB:
  848. case ENCODING_IW:
  849. case ENCODING_ID:
  850. case ENCODING_IO:
  851. case ENCODING_Iv:
  852. case ENCODING_Ia:
  853. translateImmediate(mcInst,
  854. insn.immediates[insn.numImmediatesTranslated++],
  855. operand,
  856. insn,
  857. Dis);
  858. return false;
  859. case ENCODING_SI:
  860. return translateSrcIndex(mcInst, insn);
  861. case ENCODING_DI:
  862. return translateDstIndex(mcInst, insn);
  863. case ENCODING_RB:
  864. case ENCODING_RW:
  865. case ENCODING_RD:
  866. case ENCODING_RO:
  867. case ENCODING_Rv:
  868. translateRegister(mcInst, insn.opcodeRegister);
  869. return false;
  870. case ENCODING_FP:
  871. translateFPRegister(mcInst, insn.modRM & 7);
  872. return false;
  873. case ENCODING_VVVV:
  874. translateRegister(mcInst, insn.vvvv);
  875. return false;
  876. case ENCODING_DUP:
  877. return translateOperand(mcInst, insn.operands[operand.type - TYPE_DUP0],
  878. insn, Dis);
  879. }
  880. }
  881. /// translateInstruction - Translates an internal instruction and all its
  882. /// operands to an MCInst.
  883. ///
  884. /// @param mcInst - The MCInst to populate with the instruction's data.
  885. /// @param insn - The internal instruction.
  886. /// @return - false on success; true otherwise.
  887. static bool translateInstruction(MCInst &mcInst,
  888. InternalInstruction &insn,
  889. const MCDisassembler *Dis) {
  890. if (!insn.spec) {
  891. debug("Instruction has no specification");
  892. return true;
  893. }
  894. mcInst.setOpcode(insn.instructionID);
  895. // If when reading the prefix bytes we determined the overlapping 0xf2 or 0xf3
  896. // prefix bytes should be disassembled as xrelease and xacquire then set the
  897. // opcode to those instead of the rep and repne opcodes.
  898. if (insn.xAcquireRelease) {
  899. if(mcInst.getOpcode() == X86::REP_PREFIX)
  900. mcInst.setOpcode(X86::XRELEASE_PREFIX);
  901. else if(mcInst.getOpcode() == X86::REPNE_PREFIX)
  902. mcInst.setOpcode(X86::XACQUIRE_PREFIX);
  903. }
  904. insn.numImmediatesTranslated = 0;
  905. for (const auto &Op : insn.operands) {
  906. if (Op.encoding != ENCODING_NONE) {
  907. if (translateOperand(mcInst, Op, insn, Dis)) {
  908. return true;
  909. }
  910. }
  911. }
  912. return false;
  913. }
  914. static MCDisassembler *createX86Disassembler(const Target &T,
  915. const MCSubtargetInfo &STI,
  916. MCContext &Ctx) {
  917. std::unique_ptr<const MCInstrInfo> MII(T.createMCInstrInfo());
  918. return new X86Disassembler::X86GenericDisassembler(STI, Ctx, std::move(MII));
  919. }
  920. extern "C" void LLVMInitializeX86Disassembler() {
  921. // Register the disassembler.
  922. TargetRegistry::RegisterMCDisassembler(TheX86_32Target,
  923. createX86Disassembler);
  924. TargetRegistry::RegisterMCDisassembler(TheX86_64Target,
  925. createX86Disassembler);
  926. }