X86RecognizableInstr.cpp 46 KB

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