2
0

AMD64Decoder.Mod 84 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253
  1. MODULE AMD64Decoder; (** AUTHOR "negelef"; PURPOSE "AMD64 disassembler"; *)
  2. IMPORT SYSTEM, Decoder, Streams;
  3. CONST
  4. objFileSuffix = "Abx";
  5. (* max argument count *)
  6. maxArgs = 3;
  7. (* Legacy prefixes *)
  8. prOperand = 0;
  9. prAddress = 1;
  10. prCS = 2;
  11. prDS = 3;
  12. prES = 4;
  13. prFS = 5;
  14. prGS = 6;
  15. prSS = 7;
  16. prLOCK = 8;
  17. prREP = 9;
  18. prREPN = 10;
  19. prF3 = prREP;
  20. pr66 = prOperand;
  21. prF2 = prREPN;
  22. (* REX prefixes *)
  23. prREX = 11;
  24. prREXW = 12;
  25. prREXR = 13;
  26. prREXX = 14;
  27. prREXB = 15;
  28. (* AMD64 instruction set *)
  29. opInvalid = 0;
  30. opReserved = 1;
  31. opADC = 2;
  32. opADD = 3;
  33. opADDPD = 4;
  34. opADDPS = 5;
  35. opADDSD = 6;
  36. opADDSS = 7;
  37. opADDSUBPD = 8;
  38. opADDSUBPS = 9;
  39. opAND = 10;
  40. opANDNPD = 11;
  41. opANDNPS = 12;
  42. opANDPD = 13;
  43. opANDPS = 14;
  44. opBSF = 15;
  45. opBSR = 16;
  46. opBSWAP = 17;
  47. opBT = 18;
  48. opBTC = 19;
  49. opBTR = 20;
  50. opBTS = 21;
  51. opCALL = 22;
  52. opCBW = 23;
  53. opCDQ = 24;
  54. opCDQE = 25;
  55. opCLC = 26;
  56. opCLD = 27;
  57. opCLGI = 28;
  58. opCLI = 29;
  59. opCLTS = 30;
  60. opCMC = 31;
  61. opCMP = 32;
  62. opCMPPD = 33;
  63. opCMPPS = 34;
  64. opCMPSB = 35;
  65. opCMPSD = 36;
  66. opCMPSQ = 37;
  67. opCMPSS = 38;
  68. opCMPSW = 39;
  69. opCMPXCHG = 40;
  70. opCMPXCHG16B = 41;
  71. opCMPXCHG8B = 42;
  72. opCOMISD = 43;
  73. opCOMISS = 44;
  74. opCPUID = 45;
  75. opCQO = 46;
  76. opCVTDQ2PD = 47;
  77. opCVTDQ2PS = 48;
  78. opCVTPD2PI = 49;
  79. opCVTPD2PS = 50;
  80. opCVTPI2PD = 51;
  81. opCVTPI2PS = 52;
  82. opCVTPS2DQ = 53;
  83. opCVTPS2PD = 54;
  84. opCVTPS2PI = 55;
  85. opCVTSD2SI = 56;
  86. opCVTSD2SS = 57;
  87. opCVTSI2SD = 58;
  88. opCVTSI2SS = 59;
  89. opCVTSS2SD = 60;
  90. opCVTSS2SI = 61;
  91. opCVTTPD2DQ = 62;
  92. opCVTTPD2PI = 63;
  93. opCVTTPS2DQ = 64;
  94. opCVTTPS2PI = 65;
  95. opCVTTSD2SI = 66;
  96. opCVTTSS2SI = 67;
  97. opCWD = 68;
  98. opCWDE = 69;
  99. opDEC = 70;
  100. opDIV = 71;
  101. opDIVPD = 72;
  102. opDIVPS = 73;
  103. opDIVSD = 74;
  104. opDIVSS = 75;
  105. opEMMS = 76;
  106. opENTER = 77;
  107. opF2XM1 = 78;
  108. opFABS = 79;
  109. opFADD = 80;
  110. opFADDP = 81;
  111. opFBLD = 82;
  112. opFBSTP = 83;
  113. opFCHS = 84;
  114. opFCMOVB = 85;
  115. opFCMOVBE = 86;
  116. opFCMOVE = 87;
  117. opFCMOVNB = 88;
  118. opFCMOVNBE = 89;
  119. opFCMOVNE = 90;
  120. opFCMOVNU = 91;
  121. opFCMOVU = 92;
  122. opFCOM = 93;
  123. opFCOMI = 94;
  124. opFCOMIP = 95;
  125. opFCOMP = 96;
  126. opFCOMPP = 97;
  127. opFCOS = 98;
  128. opFDECSTP = 99;
  129. opFDIV = 100;
  130. opFDIVP = 101;
  131. opFDIVR = 102;
  132. opFDIVRP = 103;
  133. opFEMMS = 104;
  134. opFFREE = 105;
  135. opFIADD = 106;
  136. opFICOM = 107;
  137. opFICOMP = 108;
  138. opFIDIV = 109;
  139. opFIDIVR = 110;
  140. opFILD = 111;
  141. opFIMUL = 112;
  142. opFINCSTP = 113;
  143. opFIST = 114;
  144. opFISTP = 115;
  145. opFISTTP = 116;
  146. opFISUB = 117;
  147. opFISUBR = 118;
  148. opFLD = 119;
  149. opFLD1 = 120;
  150. opFLDCW = 121;
  151. opFLDENV = 122;
  152. opFLDL2E = 123;
  153. opFLDL2T = 124;
  154. opFLDLG2 = 125;
  155. opFLDLN2 = 126;
  156. opFLDPI = 127;
  157. opFLDZ = 128;
  158. opFMUL = 129;
  159. opFMULP = 130;
  160. opFNCLEX = 131;
  161. opFNINIT = 132;
  162. opFNOP = 133;
  163. opFNSAVE = 134;
  164. opFNSTCW = 135;
  165. opFNSTENV = 136;
  166. opFNSTSW = 137;
  167. opFPATAN = 138;
  168. opFPREM = 139;
  169. opFPREM1 = 140;
  170. opFPTAN = 141;
  171. opFRNDINT = 142;
  172. opFRSTOR = 143;
  173. opFSCALE = 144;
  174. opFSIN = 145;
  175. opFSINCOS = 146;
  176. opFSQRT = 147;
  177. opFST = 148;
  178. opFSTP = 149;
  179. opFSUB = 150;
  180. opFSUBP = 151;
  181. opFSUBR = 152;
  182. opFSUBRP = 153;
  183. opFTST = 154;
  184. opFUCOM = 155;
  185. opFUCOMI = 156;
  186. opFUCOMIP = 157;
  187. opFUCOMP = 158;
  188. opFUCOMPP = 159;
  189. opFWAIT = 160;
  190. opFXAM = 161;
  191. opFXCH = 162;
  192. opFXRSTOR = 163;
  193. opFXSAVE = 164;
  194. opFXTRACT = 165;
  195. opFYL2X = 166;
  196. opFYL2XP1 = 167;
  197. opHADDPD = 168;
  198. opHADDPS = 169;
  199. opHLT = 170;
  200. opHSUBPD = 171;
  201. opHSUBPS = 172;
  202. opIDIV = 173;
  203. opIMUL = 174;
  204. opIN = 175;
  205. opINC = 176;
  206. opINSB = 177;
  207. opINSD = 178;
  208. opINSW = 179;
  209. opINT = 180;
  210. opINVD = 181;
  211. opINVLPG = 182;
  212. opINVLPGA = 183;
  213. opIRET = 184;
  214. opIRETD = 185;
  215. opIRETQ = 186;
  216. opJA = 187;
  217. opJB = 188;
  218. opJBE = 189;
  219. opJCXZ = 190;
  220. opJE = 191;
  221. opJECXZ = 192;
  222. opJG = 193;
  223. opJGE = 194;
  224. opJL = 195;
  225. opJLE = 196;
  226. opJMP = 197;
  227. opJNB = 198;
  228. opJNBE = 199;
  229. opJNE = 200;
  230. opJNO = 201;
  231. opJNP = 202;
  232. opJO = 203;
  233. opJP = 204;
  234. opJRCXZ = 205;
  235. opJS = 206;
  236. opLAHF = 207;
  237. opLAR = 208;
  238. opLDDQU = 209;
  239. opLDMXCSR = 210;
  240. opLEA = 211;
  241. opLEAVE = 212;
  242. opLFENCE = 213;
  243. opLFS = 214;
  244. opLGDT = 215;
  245. opLGS = 216;
  246. opLIDT = 217;
  247. opLLDT = 218;
  248. opLMSW = 219;
  249. opLODSB = 220;
  250. opLODSD = 221;
  251. opLODSQ = 222;
  252. opLODSW = 223;
  253. opLOOP = 224;
  254. opLOOPE = 225;
  255. opLOOPNE = 226;
  256. opLSL = 227;
  257. opLSS = 228;
  258. opLTR = 229;
  259. opMASKMOVDQU = 230;
  260. opMASKMOVQ = 231;
  261. opMAXPD = 232;
  262. opMAXPS = 233;
  263. opMAXSD = 234;
  264. opMAXSS = 235;
  265. opMFENCE = 236;
  266. opMINPD = 237;
  267. opMINPS = 238;
  268. opMINSD = 239;
  269. opMINSS = 240;
  270. opMOV = 241;
  271. opMOVA = 242;
  272. opMOVAPD = 243;
  273. opMOVAPS = 244;
  274. opMOVB = 245;
  275. opMOVBE = 246;
  276. opMOVD = 247;
  277. opMOVDDUP = 248;
  278. opMOVDQ2Q = 249;
  279. opMOVDQA = 250;
  280. opMOVDQU = 251;
  281. opMOVE = 252;
  282. opMOVG = 253;
  283. opMOVGE = 254;
  284. opMOVHLPS = 255;
  285. opMOVHPD = 256;
  286. opMOVHPS = 257;
  287. opMOVL = 258;
  288. opMOVLE = 259;
  289. opMOVLHPS = 260;
  290. opMOVLPD = 261;
  291. opMOVLPS = 262;
  292. opMOVMSKPD = 263;
  293. opMOVMSKPS = 264;
  294. opMOVNB = 265;
  295. opMOVNBE = 266;
  296. opMOVNE = 267;
  297. opMOVNO = 268;
  298. opMOVNP = 269;
  299. opMOVNTDQ = 270;
  300. opMOVNTI = 271;
  301. opMOVNTPD = 272;
  302. opMOVNTPS = 273;
  303. opMOVNTQ = 274;
  304. opMOVO = 275;
  305. opMOVP = 276;
  306. opMOVQ = 277;
  307. opMOVQ2DQ = 278;
  308. opMOVS = 279;
  309. opMOVSB = 280;
  310. opMOVSD = 281;
  311. opMOVSHDUP = 282;
  312. opMOVSLDUP = 283;
  313. opMOVSQ = 284;
  314. opMOVSS = 285;
  315. opMOVSW = 286;
  316. opMOVSX = 287;
  317. opMOVSXD = 288;
  318. opMOVUPD = 289;
  319. opMOVUPS = 290;
  320. opMOVZX = 291;
  321. opMUL = 292;
  322. opMULPD = 293;
  323. opMULPS = 294;
  324. opMULSD = 295;
  325. opMULSS = 296;
  326. opNEG = 297;
  327. opNOP = 298;
  328. opNOT = 299;
  329. opOR = 300;
  330. opORPD = 301;
  331. opORPS = 302;
  332. opOUT = 303;
  333. opOUTSB = 304;
  334. opOUTSD = 305;
  335. opOUTSW = 306;
  336. opPACKSSDW = 307;
  337. opPACKSSWB = 308;
  338. opPACKUSWB = 309;
  339. opPADDB = 310;
  340. opPADDD = 311;
  341. opPADDQ = 312;
  342. opPADDSB = 313;
  343. opPADDSW = 314;
  344. opPADDUSB = 315;
  345. opPADDUSW = 316;
  346. opPADDW = 317;
  347. opPAND = 318;
  348. opPANDN = 319;
  349. opPAUSE = 320;
  350. opPAVGB = 321;
  351. opPAVGUSB = 322;
  352. opPAVGW = 323;
  353. opPCMPEQB = 324;
  354. opPCMPEQD = 325;
  355. opPCMPEQW = 326;
  356. opPCMPGTB = 327;
  357. opPCMPGTD = 328;
  358. opPCMPGTW = 329;
  359. opPEXTRW = 330;
  360. opPF2ID = 331;
  361. opPF2IW = 332;
  362. opPFACC = 333;
  363. opPFADD = 334;
  364. opPFCMPEQ = 335;
  365. opPFCMPGE = 336;
  366. opPFCMPGT = 337;
  367. opPFMAX = 338;
  368. opPFMIN = 339;
  369. opPFMUL = 340;
  370. opPFNACC = 341;
  371. opPFPNACC = 342;
  372. opPFRCP = 343;
  373. opPFRCPIT1 = 344;
  374. opPFRSQIT1 = 345;
  375. opPFRSQRT = 346;
  376. opPFSUB = 347;
  377. opPFSUBR = 348;
  378. opPI2FD = 349;
  379. opPI2FW = 350;
  380. opPINSRW = 351;
  381. opPMADDWD = 352;
  382. opPMAXSW = 353;
  383. opPMAXUB = 354;
  384. opPMINSW = 355;
  385. opPMINUB = 356;
  386. opPMOVMSKB = 357;
  387. opPMULHRW = 358;
  388. opPMULHUW = 359;
  389. opPMULHW = 360;
  390. opPMULLW = 361;
  391. opPMULUDQ = 362;
  392. opPOP = 363;
  393. opPOPF = 364;
  394. opPOPFD = 365;
  395. opPOPFQ = 366;
  396. opPOR = 367;
  397. opPREFETCH = 368;
  398. opPREFETCHNTA = 369;
  399. opPREFETCHT0 = 370;
  400. opPREFETCHT1 = 371;
  401. opPREFETCHT2 = 372;
  402. opPREFETCHW = 373;
  403. opPSADBW = 374;
  404. opPSHUFD = 375;
  405. opPSHUFHW = 376;
  406. opPSHUFLW = 377;
  407. opPSHUFW = 378;
  408. opPSLLD = 379;
  409. opPSLLDQ = 380;
  410. opPSLLQ = 381;
  411. opPSLLW = 382;
  412. opPSRAD = 383;
  413. opPSRAW = 384;
  414. opPSRLD = 385;
  415. opPSRLDQ = 386;
  416. opPSRLQ = 387;
  417. opPSRLW = 388;
  418. opPSUBB = 389;
  419. opPSUBD = 390;
  420. opPSUBQ = 391;
  421. opPSUBSB = 392;
  422. opPSUBSW = 393;
  423. opPSUBUSB = 394;
  424. opPSUBUSW = 395;
  425. opPSUBW = 396;
  426. opPSWAPD = 397;
  427. opPUNPCKHBW = 398;
  428. opPUNPCKHDQ = 399;
  429. opPUNPCKHQDQ = 400;
  430. opPUNPCKHWD = 401;
  431. opPUNPCKLBW = 402;
  432. opPUNPCKLDQ = 403;
  433. opPUNPCKLQDQ = 404;
  434. opPUNPCKLWD = 405;
  435. opPUSH = 406;
  436. opPUSHF = 407;
  437. opPUSHFD = 408;
  438. opPUSHFQ = 409;
  439. opPXOR = 410;
  440. opRCL = 411;
  441. opRCPPS = 412;
  442. opRCPSS = 413;
  443. opRCR = 414;
  444. opRDMSR = 415;
  445. opRDPMC = 416;
  446. opRDTSC = 417;
  447. opRDTSCP = 418;
  448. opRET = 419;
  449. opROL = 420;
  450. opROR = 421;
  451. opRSM = 422;
  452. opRSQRTPS = 423;
  453. opRSQRTSS = 424;
  454. opSAHF = 425;
  455. opSAR = 426;
  456. opSBB = 427;
  457. opSCASB = 428;
  458. opSCASD = 429;
  459. opSCASQ = 430;
  460. opSCASW = 431;
  461. opSETA = 432;
  462. opSETB = 433;
  463. opSETBE = 434;
  464. opSETE = 435;
  465. opSETG = 436;
  466. opSETGE = 437;
  467. opSETL = 438;
  468. opSETLE = 439;
  469. opSETNB = 440;
  470. opSETNBE = 441;
  471. opSETNE = 442;
  472. opSETNO = 443;
  473. opSETNP = 444;
  474. opSETO = 445;
  475. opSETP = 446;
  476. opSETS = 447;
  477. opSFENCE = 448;
  478. opSGDT = 449;
  479. opSHL = 450;
  480. opSHLD = 451;
  481. opSHR = 452;
  482. opSHRD = 453;
  483. opSHUFPD = 454;
  484. opSHUFPS = 455;
  485. opSIDT = 456;
  486. opSKINIT = 457;
  487. opSLDT = 458;
  488. opSMSW = 459;
  489. opSQRTPD = 460;
  490. opSQRTPS = 461;
  491. opSQRTSD = 462;
  492. opSQRTSS = 463;
  493. opSTC = 464;
  494. opSTD = 465;
  495. opSTGI = 466;
  496. opSTI = 467;
  497. opSTMXCSR = 468;
  498. opSTOSB = 469;
  499. opSTOSD = 470;
  500. opSTOSQ = 471;
  501. opSTOSW = 472;
  502. opSTR = 473;
  503. opSUB = 474;
  504. opSUBPD = 475;
  505. opSUBPS = 476;
  506. opSUBSD = 477;
  507. opSUBSS = 478;
  508. opSWAPGS = 479;
  509. opSYSCALL = 480;
  510. opSYSRET = 481;
  511. opTEST = 482;
  512. opUCOMISD = 483;
  513. opUCOMISS = 484;
  514. opUD2 = 485;
  515. opUNPCKHPD = 486;
  516. opUNPCKHPS = 487;
  517. opUNPCKLPD = 488;
  518. opUNPCKLPS = 489;
  519. opVERR = 490;
  520. opVERW = 491;
  521. opVMLOAD = 492;
  522. opVMMCALL = 493;
  523. opVMRUN = 494;
  524. opVMSAVE = 495;
  525. opWBINVD = 496;
  526. opWRMSR = 497;
  527. opXADD = 498;
  528. opXCHG = 499;
  529. opXLAT = 500;
  530. opXOR = 501;
  531. opXORPD = 502;
  532. opXORPS = 503;
  533. (* GP registers offsets *)
  534. regNONE = 0;
  535. regrAX = 0;
  536. regrCX = 1;
  537. regrDX = 2;
  538. regrBX = 3;
  539. regrSP = 4;
  540. regrBP = 5;
  541. regrSI = 6;
  542. regrDI = 7;
  543. regr8 = 8;
  544. regr9 = 9;
  545. regr10 = 10;
  546. regr11 = 11;
  547. regr12 = 12;
  548. regr13 = 13;
  549. regr14 = 14;
  550. regr15 = 15;
  551. (* 8bit GP registers *)
  552. regAL = 1;
  553. regCL = 2;
  554. regDL = 3;
  555. regBL = 4;
  556. regAH = 5; (* addressable only without REX prefix *)
  557. regCH = 6; (* addressable only without REX prefix *)
  558. regDH = 7; (* addressable only without REX prefix *)
  559. regBH = 8; (* addressable only without REX prefix *)
  560. regR8B = 9;
  561. regR9B = 10;
  562. regR10B = 11;
  563. regR11B = 12;
  564. regR12B = 13;
  565. regR13B = 14;
  566. regR14B = 15;
  567. regR15B = 16;
  568. regSPL = 17; (* addressable only with REX prefix *)
  569. regBPL = 18; (* addressable only with REX prefix *)
  570. regSIL = 19; (* addressable only with REX prefix *)
  571. regDIL = 20; (* addressable only with REX prefix *)
  572. (* 16bit GP registers *)
  573. regAX = 21;
  574. regCX = 22;
  575. regDX = 23;
  576. regBX = 24;
  577. regSP = 25;
  578. regBP = 26;
  579. regSI = 27;
  580. regDI = 28;
  581. regR8W = 29;
  582. regR9W = 30;
  583. regR10W = 31;
  584. regR11W = 32;
  585. regR12W = 33;
  586. regR13W = 34;
  587. regR14W = 35;
  588. regR15W = 36;
  589. (* 32bit GP registers *)
  590. regEAX = 37;
  591. regECX = 38;
  592. regEDX = 39;
  593. regEBX = 40;
  594. regESP = 41;
  595. regEBP = 42;
  596. regESI = 43;
  597. regEDI = 44;
  598. regR8D = 45;
  599. regR9D = 46;
  600. regR10D = 47;
  601. regR11D = 48;
  602. regR12D = 49;
  603. regR13D = 50;
  604. regR14D = 51;
  605. regR15D = 52;
  606. (* 64bit GP registers *)
  607. regRAX = 53;
  608. regRCX = 54;
  609. regRDX = 55;
  610. regRBX = 56;
  611. regRSP = 57;
  612. regRBP = 58;
  613. regRSI = 59;
  614. regRDI = 60;
  615. regR8 = 61;
  616. regR9 = 62;
  617. regR10 = 63;
  618. regR11 = 64;
  619. regR12 = 65;
  620. regR13 = 66;
  621. regR14 = 67;
  622. regR15 = 68;
  623. (* segment registers *)
  624. regES = 69;
  625. regCS = 70;
  626. regSS = 71;
  627. regDS = 72;
  628. regFS = 73;
  629. regGS = 74;
  630. (* floating point stack registers *)
  631. regST0 = 75;
  632. regST1 = 76;
  633. regST2 = 77;
  634. regST3 = 78;
  635. regST4 = 79;
  636. regST5 = 80;
  637. regST6 = 81;
  638. regST7 = 82;
  639. (* control registers *)
  640. regCR0 = 83;
  641. regCR1 = 84;
  642. regCR2 = 85;
  643. regCR3 = 86;
  644. regCR4 = 87;
  645. regCR5 = 88;
  646. regCR6 = 89;
  647. regCR7 = 90;
  648. regCR8 = 91;
  649. regCR9 = 92;
  650. regCR10 = 93;
  651. regCR11 = 94;
  652. regCR12 = 95;
  653. regCR13 = 96;
  654. regCR14 = 97;
  655. regCR15 = 98;
  656. (* debug registers *)
  657. regDR0 = 99;
  658. regDR1 = 100;
  659. regDR2 = 101;
  660. regDR3 = 102;
  661. regDR4 = 103;
  662. regDR5 = 104;
  663. regDR6 = 105;
  664. regDR7 = 106;
  665. regDR8 = 107;
  666. regDR9 = 108;
  667. regDR10 = 109;
  668. regDR11 = 110;
  669. regDR12 = 111;
  670. regDR13 = 112;
  671. regDR14 = 113;
  672. regDR15 = 114;
  673. (* xmm registers *)
  674. regXMM0 = 115;
  675. regXMM1 = 116;
  676. regXMM2 = 117;
  677. regXMM3 = 118;
  678. regXMM4 = 119;
  679. regXMM5 = 120;
  680. regXMM6 = 121;
  681. regXMM7 = 122;
  682. regXMM8 = 123;
  683. regXMM9 = 124;
  684. regXMM10 = 125;
  685. regXMM11 = 126;
  686. regXMM12 = 127;
  687. regXMM13 = 128;
  688. regXMM14 = 129;
  689. regXMM15 = 130;
  690. (* mmx registers *)
  691. regMMX0 = 131;
  692. regMMX1 = 132;
  693. regMMX2 = 133;
  694. regMMX3 = 134;
  695. regMMX4 = 135;
  696. regMMX5 = 136;
  697. regMMX6 = 137;
  698. regMMX7 = 138;
  699. regIP = 139;
  700. regRIP = 140;
  701. TYPE
  702. (* generic argument *)
  703. Arg = OBJECT
  704. PROCEDURE Print (w : Streams.Writer);
  705. END Print;
  706. END Arg;
  707. (* Immediate argument *)
  708. ArgImm = OBJECT (Arg)
  709. VAR
  710. imm : HUGEINT;
  711. PROCEDURE &New *(imm : HUGEINT);
  712. BEGIN SELF.imm := imm;
  713. END New;
  714. PROCEDURE Print (w : Streams.Writer);
  715. BEGIN PrintImm (imm, w);
  716. END Print;
  717. END ArgImm;
  718. (* register argument *)
  719. ArgReg = OBJECT (Arg)
  720. VAR
  721. reg : LONGINT;
  722. PROCEDURE &New *(reg : LONGINT);
  723. BEGIN SELF.reg := reg;
  724. END New;
  725. PROCEDURE Print (w : Streams.Writer);
  726. BEGIN PrintReg (w, reg);
  727. END Print;
  728. END ArgReg;
  729. (* memory reference argument *)
  730. ArgMem = OBJECT (Arg)
  731. VAR
  732. segment, reg, scale, base: LONGINT; disp : HUGEINT;
  733. PROCEDURE &New *(segment, reg, scale , base: LONGINT; disp : HUGEINT);
  734. BEGIN
  735. SELF.segment := segment;
  736. SELF.reg := reg;
  737. SELF.scale := scale;
  738. SELF.base := base;
  739. SELF.disp := disp;
  740. END New;
  741. PROCEDURE Print (w : Streams.Writer);
  742. BEGIN
  743. IF segment # regNONE THEN
  744. PrintReg (w, segment); w.String (":")
  745. END;
  746. w.String ("[");
  747. IF reg # regNONE THEN
  748. PrintReg (w, reg);
  749. IF scale > 1 THEN w.String ("*"); w.Int (scale, 0) END;
  750. END;
  751. IF base = regNONE THEN
  752. IF (reg = regNONE) THEN
  753. PrintImm (disp, w);
  754. ELSIF disp > 0 THEN
  755. w.String (" + ");
  756. PrintImm (disp, w);
  757. ELSIF disp < 0 THEN
  758. w.String (" - ");
  759. PrintImm (-disp, w);
  760. END
  761. ELSE
  762. IF (reg # regNONE) THEN
  763. w.String (" + ");
  764. END;
  765. PrintReg (w, base);
  766. IF disp > 0 THEN
  767. w.String (" + ");
  768. PrintImm (disp, w);
  769. ELSIF disp < 0 THEN
  770. w.String (" - ");
  771. PrintImm (-disp, w);
  772. END
  773. END;
  774. w.String ("]");
  775. END Print;
  776. END ArgMem;
  777. (* AMD64 instruction *)
  778. AMD64Opcode = OBJECT (Decoder.Opcode)
  779. VAR
  780. prefixCount : LONGINT;
  781. prefixes : SET;
  782. instr: LONGINT;
  783. arg : ARRAY maxArgs OF Arg;
  784. hidePrefixes: BOOLEAN;
  785. PROCEDURE &New*(proc : Decoder.ProcedureInfo; stream : Streams.Writer);
  786. BEGIN
  787. New^(proc, stream);
  788. prefixCount := 0;
  789. prefixes := {};
  790. hidePrefixes := FALSE;
  791. END New;
  792. PROCEDURE PrintOpcodeBytes*(w : Streams.Writer);
  793. VAR
  794. i : LONGINT;
  795. BEGIN
  796. FOR i := 0 TO LEN (code) - 1 DO
  797. WriteHex8 (ORD (code[i]), w);
  798. IF i < prefixCount THEN
  799. w.String (" | ");
  800. ELSE
  801. w.String (" ");
  802. END
  803. END
  804. END PrintOpcodeBytes;
  805. PROCEDURE PrintInstruction*(w : Streams.Writer);
  806. BEGIN
  807. IF ~hidePrefixes THEN
  808. IF prREP IN prefixes THEN w.String ("REP ") END;
  809. IF prREPN IN prefixes THEN w.String ("REPN ") END;
  810. END;
  811. IF prLOCK IN prefixes THEN w.String ("LOCK ") END;
  812. CASE instr OF
  813. | opInvalid: w.String ("Invalid");
  814. | opReserved: w.String ("Reserved");
  815. | opADC: w.String ("ADC");
  816. | opADD: w.String ("ADD");
  817. | opADDPD: w.String ("ADDPD");
  818. | opADDPS: w.String ("ADDPS");
  819. | opADDSD: w.String ("ADDSD");
  820. | opADDSS: w.String ("ADDSS");
  821. | opADDSUBPD: w.String ("ADDSUBPD");
  822. | opADDSUBPS: w.String ("ADDSUBPS");
  823. | opAND: w.String ("AND");
  824. | opANDNPD: w.String ("ANDNPD");
  825. | opANDNPS: w.String ("ANDNPS");
  826. | opANDPD: w.String ("ANDPD");
  827. | opANDPS: w.String ("ANDPS");
  828. | opBSF: w.String ("BSF");
  829. | opBSR: w.String ("BSR");
  830. | opBSWAP: w.String ("BSWAP");
  831. | opBT: w.String ("BT");
  832. | opBTC: w.String ("BTC");
  833. | opBTR: w.String ("BTR");
  834. | opBTS: w.String ("BTS");
  835. | opCALL: w.String ("CALL");
  836. | opCBW: w.String ("CBW");
  837. | opCDQ: w.String ("CDQ");
  838. | opCDQE: w.String ("CDQE");
  839. | opCLC: w.String ("CLC");
  840. | opCLD: w.String ("CLD");
  841. | opCLGI: w.String ("CLGI");
  842. | opCLI: w.String ("CLI");
  843. | opCLTS: w.String ("CLTS");
  844. | opCMC: w.String ("CMC");
  845. | opCMP: w.String ("CMP");
  846. | opCMPPD: w.String ("CMPPD");
  847. | opCMPPS: w.String ("CMPPS");
  848. | opCMPSB: w.String ("CMPSB");
  849. | opCMPSD: w.String ("CMPSD");
  850. | opCMPSQ: w.String ("CMPSQ");
  851. | opCMPSS: w.String ("CMPSS");
  852. | opCMPSW: w.String ("CMPSW");
  853. | opCMPXCHG: w.String ("CMPXCHG");
  854. | opCMPXCHG16B: w.String ("CMPXCHG16B");
  855. | opCMPXCHG8B: w.String ("CMPXCHG8B");
  856. | opCOMISD: w.String ("COMISD");
  857. | opCOMISS: w.String ("COMISS");
  858. | opCPUID: w.String ("CPUID");
  859. | opCQO: w.String ("CQO");
  860. | opCVTDQ2PD: w.String ("CVTDQ2PD");
  861. | opCVTDQ2PS: w.String ("CVTDQ2PS");
  862. | opCVTPD2PI: w.String ("CVTPD2PI");
  863. | opCVTPD2PS: w.String ("CVTPD2PS");
  864. | opCVTPI2PD: w.String ("CVTPI2PD");
  865. | opCVTPI2PS: w.String ("CVTPI2PS");
  866. | opCVTPS2DQ: w.String ("CVTPS2DQ");
  867. | opCVTPS2PD: w.String ("CVTPS2PD");
  868. | opCVTPS2PI: w.String ("CVTPS2PI");
  869. | opCVTSD2SI: w.String ("CVTSD2SI");
  870. | opCVTSD2SS: w.String ("CVTSD2SS");
  871. | opCVTSI2SD: w.String ("CVTSI2SD");
  872. | opCVTSI2SS: w.String ("CVTSI2SS");
  873. | opCVTSS2SD: w.String ("CVTSS2SD");
  874. | opCVTSS2SI: w.String ("CVTSS2SI");
  875. | opCVTTPD2DQ: w.String ("CVTTPD2DQ");
  876. | opCVTTPD2PI: w.String ("CVTTPD2PI");
  877. | opCVTTPS2DQ: w.String ("CVTTPS2DQ");
  878. | opCVTTPS2PI: w.String ("CVTTPS2PI");
  879. | opCVTTSD2SI: w.String ("CVTTSD2SI");
  880. | opCVTTSS2SI: w.String ("CVTTSS2SI");
  881. | opCWD: w.String ("CWD");
  882. | opCWDE: w.String ("CWDE");
  883. | opDEC: w.String ("DEC");
  884. | opDIV: w.String ("DIV");
  885. | opDIVPD: w.String ("DIVPD");
  886. | opDIVPS: w.String ("DIVPS");
  887. | opDIVSD: w.String ("DIVSD");
  888. | opDIVSS: w.String ("DIVSS");
  889. | opEMMS: w.String ("EMMS");
  890. | opENTER: w.String ("ENTER");
  891. | opF2XM1: w.String ("F2XM1");
  892. | opFABS: w.String ("FABS");
  893. | opFADD: w.String ("FADD");
  894. | opFADDP: w.String ("FADDP");
  895. | opFBLD: w.String ("FBLD");
  896. | opFBSTP: w.String ("FBSTP");
  897. | opFCHS: w.String ("FCHS");
  898. | opFCMOVB: w.String ("FCMOVB");
  899. | opFCMOVBE: w.String ("FCMOVBE");
  900. | opFCMOVE: w.String ("FCMOVE");
  901. | opFCMOVNB: w.String ("FCMOVNB");
  902. | opFCMOVNBE: w.String ("FCMOVNBE");
  903. | opFCMOVNE: w.String ("FCMOVNE");
  904. | opFCMOVNU: w.String ("FCMOVNU");
  905. | opFCMOVU: w.String ("FCMOVU");
  906. | opFCOM: w.String ("FCOM");
  907. | opFCOMI: w.String ("FCOMI");
  908. | opFCOMIP: w.String ("FCOMIP");
  909. | opFCOMP: w.String ("FCOMP");
  910. | opFCOMPP: w.String ("FCOMPP");
  911. | opFCOS: w.String ("FCOS");
  912. | opFDECSTP: w.String ("FDECSTP");
  913. | opFDIV: w.String ("FDIV");
  914. | opFDIVP: w.String ("FDIVP");
  915. | opFDIVR: w.String ("FDIVR");
  916. | opFDIVRP: w.String ("FDIVRP");
  917. | opFEMMS: w.String ("FEMMS");
  918. | opFFREE: w.String ("FFREE");
  919. | opFIADD: w.String ("FIADD");
  920. | opFICOM: w.String ("FICOM");
  921. | opFICOMP: w.String ("FICOMP");
  922. | opFIDIV: w.String ("FIDIV");
  923. | opFIDIVR: w.String ("FIDIVR");
  924. | opFILD: w.String ("FILD");
  925. | opFIMUL: w.String ("FIMUL");
  926. | opFINCSTP: w.String ("FINCSTP");
  927. | opFIST: w.String ("FIST");
  928. | opFISTP: w.String ("FISTP");
  929. | opFISTTP: w.String ("FISTTP");
  930. | opFISUB: w.String ("FISUB");
  931. | opFISUBR: w.String ("FISUBR");
  932. | opFLD: w.String ("FLD");
  933. | opFLD1: w.String ("FLD1");
  934. | opFLDCW: w.String ("FLDCW");
  935. | opFLDENV: w.String ("FLDENV");
  936. | opFLDL2E: w.String ("FLDL2E");
  937. | opFLDL2T: w.String ("FLDL2T");
  938. | opFLDLG2: w.String ("FLDLG2");
  939. | opFLDLN2: w.String ("FLDLN2");
  940. | opFLDPI: w.String ("FLDPI");
  941. | opFLDZ: w.String ("FLDZ");
  942. | opFMUL: w.String ("FMUL");
  943. | opFMULP: w.String ("FMULP");
  944. | opFNCLEX: w.String ("FNCLEX");
  945. | opFNINIT: w.String ("FNINIT");
  946. | opFNOP: w.String ("FNOP");
  947. | opFNSAVE: w.String ("FNSAVE");
  948. | opFNSTCW: w.String ("FNSTCW");
  949. | opFNSTENV: w.String ("FNSTENV");
  950. | opFNSTSW: w.String ("FNSTSW");
  951. | opFPATAN: w.String ("FPATAN");
  952. | opFPREM: w.String ("FPREM");
  953. | opFPREM1: w.String ("FPREM1");
  954. | opFPTAN: w.String ("FPTAN");
  955. | opFRNDINT: w.String ("FRNDINT");
  956. | opFRSTOR: w.String ("FRSTOR");
  957. | opFSCALE: w.String ("FSCALE");
  958. | opFSIN: w.String ("FSIN");
  959. | opFSINCOS: w.String ("FSINCOS");
  960. | opFSQRT: w.String ("FSQRT");
  961. | opFST: w.String ("FST");
  962. | opFSTP: w.String ("FSTP");
  963. | opFSUB: w.String ("FSUB");
  964. | opFSUBP: w.String ("FSUBP");
  965. | opFSUBR: w.String ("FSUBR");
  966. | opFSUBRP: w.String ("FSUBRP");
  967. | opFTST: w.String ("FTST");
  968. | opFUCOM: w.String ("FUCOM");
  969. | opFUCOMI: w.String ("FUCOMI");
  970. | opFUCOMIP: w.String ("FUCOMIP");
  971. | opFUCOMP: w.String ("FUCOMP");
  972. | opFUCOMPP: w.String ("FUCOMPP");
  973. | opFWAIT: w.String ("FWAIT");
  974. | opFXAM: w.String ("FXAM");
  975. | opFXCH: w.String ("FXCH");
  976. | opFXRSTOR: w.String ("FXRSTOR");
  977. | opFXSAVE: w.String ("FXSAVE");
  978. | opFXTRACT: w.String ("FXTRACT");
  979. | opFYL2X: w.String ("FYL2X");
  980. | opFYL2XP1: w.String ("FYL2XP1");
  981. | opHADDPD: w.String ("HADDPD");
  982. | opHADDPS: w.String ("HADDPS");
  983. | opHLT: w.String ("HLT");
  984. | opHSUBPD: w.String ("HSUBPD");
  985. | opHSUBPS: w.String ("HSUBPS");
  986. | opIDIV: w.String ("IDIV");
  987. | opIMUL: w.String ("IMUL");
  988. | opIN: w.String ("IN");
  989. | opINC: w.String ("INC");
  990. | opINSB: w.String ("INSB");
  991. | opINSD: w.String ("INSD");
  992. | opINSW: w.String ("INSW");
  993. | opINT: w.String ("INT");
  994. | opINVD: w.String ("INVD");
  995. | opINVLPG: w.String ("INVLPG");
  996. | opINVLPGA: w.String ("INVLPGA");
  997. | opIRET: w.String ("IRET");
  998. | opIRETD: w.String ("IRETD");
  999. | opIRETQ: w.String ("IRETQ");
  1000. | opJA: w.String ("JA");
  1001. | opJB: w.String ("JB");
  1002. | opJBE: w.String ("JBE");
  1003. | opJCXZ: w.String ("JCXZ");
  1004. | opJE: w.String ("JE");
  1005. | opJECXZ: w.String ("JECXZ");
  1006. | opJG: w.String ("JG");
  1007. | opJGE: w.String ("JGE");
  1008. | opJL: w.String ("JL");
  1009. | opJLE: w.String ("JLE");
  1010. | opJMP: w.String ("JMP");
  1011. | opJNB: w.String ("JNB");
  1012. | opJNBE: w.String ("JNBE");
  1013. | opJNE: w.String ("JNE");
  1014. | opJNO: w.String ("JNO");
  1015. | opJNP: w.String ("JNP");
  1016. | opJO: w.String ("JO");
  1017. | opJP: w.String ("JP");
  1018. | opJRCXZ: w.String ("JRCXZ");
  1019. | opJS: w.String ("JS");
  1020. | opLAHF: w.String ("LAHF");
  1021. | opLAR: w.String ("LAR");
  1022. | opLDDQU: w.String ("LDDQU");
  1023. | opLDMXCSR: w.String ("LDMXCSR");
  1024. | opLEA: w.String ("LEA");
  1025. | opLEAVE: w.String ("LEAVE");
  1026. | opLFENCE: w.String ("LFENCE");
  1027. | opLFS: w.String ("LFS");
  1028. | opLGDT: w.String ("LGDT");
  1029. | opLGS: w.String ("LGS");
  1030. | opLIDT: w.String ("LIDT");
  1031. | opLLDT: w.String ("LLDT");
  1032. | opLMSW: w.String ("LMSW");
  1033. | opLODSB: w.String ("LODSB");
  1034. | opLODSD: w.String ("LODSD");
  1035. | opLODSQ: w.String ("LODSQ");
  1036. | opLODSW: w.String ("LODSW");
  1037. | opLOOP: w.String ("LOOP");
  1038. | opLOOPE: w.String ("LOOPE");
  1039. | opLOOPNE: w.String ("LOOPNE");
  1040. | opLSL: w.String ("LSL");
  1041. | opLSS: w.String ("LSS");
  1042. | opLTR: w.String ("LTR");
  1043. | opMASKMOVDQU: w.String ("MASKMOVDQU");
  1044. | opMASKMOVQ: w.String ("MASKMOVQ");
  1045. | opMAXPD: w.String ("MAXPD");
  1046. | opMAXPS: w.String ("MAXPS");
  1047. | opMAXSD: w.String ("MAXSD");
  1048. | opMAXSS: w.String ("MAXSS");
  1049. | opMFENCE: w.String ("MFENCE");
  1050. | opMINPD: w.String ("MINPD");
  1051. | opMINPS: w.String ("MINPS");
  1052. | opMINSD: w.String ("MINSD");
  1053. | opMINSS: w.String ("MINSS");
  1054. | opMOV: w.String ("MOV");
  1055. | opMOVA: w.String ("MOVA");
  1056. | opMOVAPD: w.String ("MOVAPD");
  1057. | opMOVAPS: w.String ("MOVAPS");
  1058. | opMOVB: w.String ("MOVB");
  1059. | opMOVBE: w.String ("MOVBE");
  1060. | opMOVD: w.String ("MOVD");
  1061. | opMOVDDUP: w.String ("MOVDDUP");
  1062. | opMOVDQ2Q: w.String ("MOVDQ2Q");
  1063. | opMOVDQA: w.String ("MOVDQA");
  1064. | opMOVDQU: w.String ("MOVDQU");
  1065. | opMOVE: w.String ("MOVE");
  1066. | opMOVG: w.String ("MOVG");
  1067. | opMOVGE: w.String ("MOVGE");
  1068. | opMOVHLPS: w.String ("MOVHLPS");
  1069. | opMOVHPD: w.String ("MOVHPD");
  1070. | opMOVHPS: w.String ("MOVHPS");
  1071. | opMOVL: w.String ("MOVL");
  1072. | opMOVLE: w.String ("MOVLE");
  1073. | opMOVLHPS: w.String ("MOVLHPS");
  1074. | opMOVLPD: w.String ("MOVLPD");
  1075. | opMOVLPS: w.String ("MOVLPS");
  1076. | opMOVMSKPD: w.String ("MOVMSKPD");
  1077. | opMOVMSKPS: w.String ("MOVMSKPS");
  1078. | opMOVNB: w.String ("MOVNB");
  1079. | opMOVNBE: w.String ("MOVNBE");
  1080. | opMOVNE: w.String ("MOVNE");
  1081. | opMOVNO: w.String ("MOVNO");
  1082. | opMOVNP: w.String ("MOVNP");
  1083. | opMOVNTDQ: w.String ("MOVNTDQ");
  1084. | opMOVNTI: w.String ("MOVNTI");
  1085. | opMOVNTPD: w.String ("MOVNTPD");
  1086. | opMOVNTPS: w.String ("MOVNTPS");
  1087. | opMOVNTQ: w.String ("MOVNTQ");
  1088. | opMOVO: w.String ("MOVO");
  1089. | opMOVP: w.String ("MOVP");
  1090. | opMOVQ: w.String ("MOVQ");
  1091. | opMOVQ2DQ: w.String ("MOVQ2DQ");
  1092. | opMOVS: w.String ("MOVS");
  1093. | opMOVSB: w.String ("MOVSB");
  1094. | opMOVSD: w.String ("MOVSD");
  1095. | opMOVSHDUP: w.String ("MOVSHDUP");
  1096. | opMOVSLDUP: w.String ("MOVSLDUP");
  1097. | opMOVSQ: w.String ("MOVSQ");
  1098. | opMOVSS: w.String ("MOVSS");
  1099. | opMOVSW: w.String ("MOVSW");
  1100. | opMOVSX: w.String ("MOVSX");
  1101. | opMOVSXD: w.String ("MOVSXD");
  1102. | opMOVUPD: w.String ("MOVUPD");
  1103. | opMOVUPS: w.String ("MOVUPS");
  1104. | opMOVZX: w.String ("MOVZX");
  1105. | opMUL: w.String ("MUL");
  1106. | opMULPD: w.String ("MULPD");
  1107. | opMULPS: w.String ("MULPS");
  1108. | opMULSD: w.String ("MULSD");
  1109. | opMULSS: w.String ("MULSS");
  1110. | opNEG: w.String ("NEG");
  1111. | opNOP: w.String ("NOP");
  1112. | opNOT: w.String ("NOT");
  1113. | opOR: w.String ("OR");
  1114. | opORPD: w.String ("ORPD");
  1115. | opORPS: w.String ("ORPS");
  1116. | opOUT: w.String ("OUT");
  1117. | opOUTSB: w.String ("OUTSB");
  1118. | opOUTSD: w.String ("OUTSD");
  1119. | opOUTSW: w.String ("OUTSW");
  1120. | opPACKSSDW: w.String ("PACKSSDW");
  1121. | opPACKSSWB: w.String ("PACKSSWB");
  1122. | opPACKUSWB: w.String ("PACKUSWB");
  1123. | opPADDB: w.String ("PADDB");
  1124. | opPADDD: w.String ("PADDD");
  1125. | opPADDQ: w.String ("PADDQ");
  1126. | opPADDSB: w.String ("PADDSB");
  1127. | opPADDSW: w.String ("PADDSW");
  1128. | opPADDUSB: w.String ("PADDUSB");
  1129. | opPADDUSW: w.String ("PADDUSW");
  1130. | opPADDW: w.String ("PADDW");
  1131. | opPAND: w.String ("PAND");
  1132. | opPANDN: w.String ("PANDN");
  1133. | opPAUSE: w.String ("PAUSE");
  1134. | opPAVGB: w.String ("PAVGB");
  1135. | opPAVGUSB: w.String ("PAVGUSB");
  1136. | opPAVGW: w.String ("PAVGW");
  1137. | opPCMPEQB: w.String ("PCMPEQB");
  1138. | opPCMPEQD: w.String ("PCMPEQD");
  1139. | opPCMPEQW: w.String ("PCMPEQW");
  1140. | opPCMPGTB: w.String ("PCMPGTB");
  1141. | opPCMPGTD: w.String ("PCMPGTD");
  1142. | opPCMPGTW: w.String ("PCMPGTW");
  1143. | opPEXTRW: w.String ("PEXTRW");
  1144. | opPF2ID: w.String ("PF2ID");
  1145. | opPF2IW: w.String ("PF2IW");
  1146. | opPFACC: w.String ("PFACC");
  1147. | opPFADD: w.String ("PFADD");
  1148. | opPFCMPEQ: w.String ("PFCMPEQ");
  1149. | opPFCMPGE: w.String ("PFCMPGE");
  1150. | opPFCMPGT: w.String ("PFCMPGT");
  1151. | opPFMAX: w.String ("PFMAX");
  1152. | opPFMIN: w.String ("PFMIN");
  1153. | opPFMUL: w.String ("PFMUL");
  1154. | opPFNACC: w.String ("PFNACC");
  1155. | opPFPNACC: w.String ("PFPNACC");
  1156. | opPFRCP: w.String ("PFRCP");
  1157. | opPFRCPIT1: w.String ("PFRCPIT1");
  1158. | opPFRSQIT1: w.String ("PFRSQIT1");
  1159. | opPFRSQRT: w.String ("PFRSQRT");
  1160. | opPFSUB: w.String ("PFSUB");
  1161. | opPFSUBR: w.String ("PFSUBR");
  1162. | opPI2FD: w.String ("PI2FD");
  1163. | opPI2FW: w.String ("PI2FW");
  1164. | opPINSRW: w.String ("PINSRW");
  1165. | opPMADDWD: w.String ("PMADDWD");
  1166. | opPMAXSW: w.String ("PMAXSW");
  1167. | opPMAXUB: w.String ("PMAXUB");
  1168. | opPMINSW: w.String ("PMINSW");
  1169. | opPMINUB: w.String ("PMINUB");
  1170. | opPMOVMSKB: w.String ("PMOVMSKB");
  1171. | opPMULHRW: w.String ("PMULHRW");
  1172. | opPMULHUW: w.String ("PMULHUW");
  1173. | opPMULHW: w.String ("PMULHW");
  1174. | opPMULLW: w.String ("PMULLW");
  1175. | opPMULUDQ: w.String ("PMULUDQ");
  1176. | opPOP: w.String ("POP");
  1177. | opPOPF: w.String ("POPF");
  1178. | opPOPFD: w.String ("POPFD");
  1179. | opPOPFQ: w.String ("POPFQ");
  1180. | opPOR: w.String ("POR");
  1181. | opPREFETCH: w.String ("PREFETCH");
  1182. | opPREFETCHNTA: w.String ("PREFETCHNTA");
  1183. | opPREFETCHT0: w.String ("PREFETCHT0");
  1184. | opPREFETCHT1: w.String ("PREFETCHT1");
  1185. | opPREFETCHT2: w.String ("PREFETCHT2");
  1186. | opPREFETCHW: w.String ("PREFETCHW");
  1187. | opPSADBW: w.String ("PSADBW");
  1188. | opPSHUFD: w.String ("PSHUFD");
  1189. | opPSHUFHW: w.String ("PSHUFHW");
  1190. | opPSHUFLW: w.String ("PSHUFLW");
  1191. | opPSHUFW: w.String ("PSHUFW");
  1192. | opPSLLD: w.String ("PSLLD");
  1193. | opPSLLDQ: w.String ("PSLLDQ");
  1194. | opPSLLQ: w.String ("PSLLQ");
  1195. | opPSLLW: w.String ("PSLLW");
  1196. | opPSRAD: w.String ("PSRAD");
  1197. | opPSRAW: w.String ("PSRAW");
  1198. | opPSRLD: w.String ("PSRLD");
  1199. | opPSRLDQ: w.String ("PSRLDQ");
  1200. | opPSRLQ: w.String ("PSRLQ");
  1201. | opPSRLW: w.String ("PSRLW");
  1202. | opPSUBB: w.String ("PSUBB");
  1203. | opPSUBD: w.String ("PSUBD");
  1204. | opPSUBQ: w.String ("PSUBQ");
  1205. | opPSUBSB: w.String ("PSUBSB");
  1206. | opPSUBSW: w.String ("PSUBSW");
  1207. | opPSUBUSB: w.String ("PSUBUSB");
  1208. | opPSUBUSW: w.String ("PSUBUSW");
  1209. | opPSUBW: w.String ("PSUBW");
  1210. | opPSWAPD: w.String ("PSWAPD");
  1211. | opPUNPCKHBW: w.String ("PUNPCKHBW");
  1212. | opPUNPCKHDQ: w.String ("PUNPCKHDQ");
  1213. | opPUNPCKHQDQ: w.String ("PUNPCKHQDQ");
  1214. | opPUNPCKHWD: w.String ("PUNPCKHWD");
  1215. | opPUNPCKLBW: w.String ("PUNPCKLBW");
  1216. | opPUNPCKLDQ: w.String ("PUNPCKLDQ");
  1217. | opPUNPCKLQDQ: w.String ("PUNPCKLQDQ");
  1218. | opPUNPCKLWD: w.String ("PUNPCKLWD");
  1219. | opPUSH: w.String ("PUSH");
  1220. | opPUSHF: w.String ("PUSHF");
  1221. | opPUSHFD: w.String ("PUSHFD");
  1222. | opPUSHFQ: w.String ("PUSHFQ");
  1223. | opPXOR: w.String ("PXOR");
  1224. | opRCL: w.String ("RCL");
  1225. | opRCPPS: w.String ("RCPPS");
  1226. | opRCPSS: w.String ("RCPSS");
  1227. | opRCR: w.String ("RCR");
  1228. | opRDMSR: w.String ("RDMSR");
  1229. | opRDPMC: w.String ("RDPMC");
  1230. | opRDTSC: w.String ("RDTSC");
  1231. | opRDTSCP: w.String ("RDTSCP");
  1232. | opRET: w.String ("RET");
  1233. | opROL: w.String ("ROL");
  1234. | opROR: w.String ("ROR");
  1235. | opRSM: w.String ("RSM");
  1236. | opRSQRTPS: w.String ("RSQRTPS");
  1237. | opRSQRTSS: w.String ("RSQRTSS");
  1238. | opSAHF: w.String ("SAHF");
  1239. | opSAR: w.String ("SAR");
  1240. | opSBB: w.String ("SBB");
  1241. | opSCASB: w.String ("SCASB");
  1242. | opSCASD: w.String ("SCASD");
  1243. | opSCASQ: w.String ("SCASQ");
  1244. | opSCASW: w.String ("SCASW");
  1245. | opSETA: w.String ("SETA");
  1246. | opSETB: w.String ("SETB");
  1247. | opSETBE: w.String ("SETBE");
  1248. | opSETE: w.String ("SETE");
  1249. | opSETG: w.String ("SETG");
  1250. | opSETGE: w.String ("SETGE");
  1251. | opSETL: w.String ("SETL");
  1252. | opSETLE: w.String ("SETLE");
  1253. | opSETNB: w.String ("SETNB");
  1254. | opSETNBE: w.String ("SETNBE");
  1255. | opSETNE: w.String ("SETNE");
  1256. | opSETNO: w.String ("SETNO");
  1257. | opSETNP: w.String ("SETNP");
  1258. | opSETO: w.String ("SETO");
  1259. | opSETP: w.String ("SETP");
  1260. | opSETS: w.String ("SETS");
  1261. | opSFENCE: w.String ("SFENCE");
  1262. | opSGDT: w.String ("SGDT");
  1263. | opSHL: w.String ("SHL");
  1264. | opSHLD: w.String ("SHLD");
  1265. | opSHR: w.String ("SHR");
  1266. | opSHRD: w.String ("SHRD");
  1267. | opSHUFPD: w.String ("SHUFPD");
  1268. | opSHUFPS: w.String ("SHUFPS");
  1269. | opSIDT: w.String ("SIDT");
  1270. | opSKINIT: w.String ("SKINIT");
  1271. | opSLDT: w.String ("SLDT");
  1272. | opSMSW: w.String ("SMSW");
  1273. | opSQRTPD: w.String ("SQRTPD");
  1274. | opSQRTPS: w.String ("SQRTPS");
  1275. | opSQRTSD: w.String ("SQRTSD");
  1276. | opSQRTSS: w.String ("SQRTSS");
  1277. | opSTC: w.String ("STC");
  1278. | opSTD: w.String ("STD");
  1279. | opSTGI: w.String ("STGI");
  1280. | opSTI: w.String ("STI");
  1281. | opSTMXCSR: w.String ("STMXCSR");
  1282. | opSTOSB: w.String ("STOSB");
  1283. | opSTOSD: w.String ("STOSD");
  1284. | opSTOSQ: w.String ("STOSQ");
  1285. | opSTOSW: w.String ("STOSW");
  1286. | opSTR: w.String ("STR");
  1287. | opSUB: w.String ("SUB");
  1288. | opSUBPD: w.String ("SUBPD");
  1289. | opSUBPS: w.String ("SUBPS");
  1290. | opSUBSD: w.String ("SUBSD");
  1291. | opSUBSS: w.String ("SUBSS");
  1292. | opSWAPGS: w.String ("SWAPGS");
  1293. | opSYSCALL: w.String ("SYSCALL");
  1294. | opSYSRET: w.String ("SYSRET");
  1295. | opTEST: w.String ("TEST");
  1296. | opUCOMISD: w.String ("UCOMISD");
  1297. | opUCOMISS: w.String ("UCOMISS");
  1298. | opUD2: w.String ("UD2");
  1299. | opUNPCKHPD: w.String ("UNPCKHPD");
  1300. | opUNPCKHPS: w.String ("UNPCKHPS");
  1301. | opUNPCKLPD: w.String ("UNPCKLPD");
  1302. | opUNPCKLPS: w.String ("UNPCKLPS");
  1303. | opVERR: w.String ("VERR");
  1304. | opVERW: w.String ("VERW");
  1305. | opVMLOAD: w.String ("VMLOAD");
  1306. | opVMMCALL: w.String ("VMMCALL");
  1307. | opVMRUN: w.String ("VMRUN");
  1308. | opVMSAVE: w.String ("VMSAVE");
  1309. | opWBINVD: w.String ("WBINVD");
  1310. | opWRMSR: w.String ("WRMSR");
  1311. | opXADD: w.String ("XADD");
  1312. | opXCHG: w.String ("XCHG");
  1313. | opXLAT: w.String ("XLAT");
  1314. | opXOR: w.String ("XOR");
  1315. | opXORPD: w.String ("XORPD");
  1316. | opXORPS: w.String ("XORPS");
  1317. END;
  1318. END PrintInstruction;
  1319. PROCEDURE PrintArguments*(w : Streams.Writer);
  1320. VAR
  1321. i: LONGINT;
  1322. BEGIN
  1323. FOR i := 0 TO maxArgs - 1 DO
  1324. IF arg[i] # NIL THEN
  1325. IF i > 0 THEN w.String (", ") END;
  1326. arg[i].Print (w);
  1327. END
  1328. END
  1329. END PrintArguments;
  1330. PROCEDURE PrintVariables*(w : Streams.Writer);
  1331. VAR
  1332. i, count: LONGINT;
  1333. argMem: ArgMem;
  1334. field : Decoder.FieldInfo;
  1335. BEGIN
  1336. (* actually copied from Decoder.... *)
  1337. count := 0;
  1338. FOR i := 0 TO maxArgs - 1 DO
  1339. IF (arg[i] # NIL) & (arg[i] IS ArgMem) THEN
  1340. argMem := arg[i](ArgMem);
  1341. IF (argMem.reg = regRBP) OR (argMem.reg = regEBP) THEN
  1342. field := proc.GetFieldAtOffset(SHORT (argMem.disp));
  1343. IF field # NIL THEN
  1344. field.AddMarkerPosition(w.Pos());
  1345. IF count > 0 THEN
  1346. w.String(", ")
  1347. END;
  1348. w.String(field.name);
  1349. w.String(": ");
  1350. argMem.Print (w);
  1351. INC (count);
  1352. END
  1353. END
  1354. END
  1355. END
  1356. END PrintVariables;
  1357. END AMD64Opcode;
  1358. (* AMD dissassembler*)
  1359. AMD64Decoder = OBJECT (Decoder.Decoder)
  1360. PROCEDURE NewOpcode*() : Decoder.Opcode;
  1361. VAR
  1362. opcode : AMD64Opcode;
  1363. BEGIN
  1364. NEW(opcode, currentProc, outputStreamWriter);
  1365. RETURN opcode
  1366. END NewOpcode;
  1367. PROCEDURE DecodeThis*(opcode : Decoder.Opcode);
  1368. VAR
  1369. opc : AMD64Opcode;
  1370. byte, code, arg, mod, segment, reg, rm, scale, index, base, disp: LONGINT;
  1371. modRM : BOOLEAN;
  1372. PROCEDURE ReadImm8 (): LONGINT;
  1373. BEGIN
  1374. RETURN ORD (ReadChar ());
  1375. END ReadImm8;
  1376. PROCEDURE ReadImm16 (): LONGINT;
  1377. BEGIN
  1378. RETURN ReadInt ();
  1379. END ReadImm16;
  1380. PROCEDURE ReadImm32 (): LONGINT;
  1381. BEGIN
  1382. RETURN ReadLInt ();
  1383. END ReadImm32;
  1384. PROCEDURE ReadImm64 (): HUGEINT;
  1385. BEGIN
  1386. RETURN ReadHInt ();
  1387. END ReadImm64;
  1388. PROCEDURE ReadOffset8 (): LONGINT;
  1389. VAR
  1390. offset: LONGINT;
  1391. BEGIN
  1392. offset := ORD (ReadChar ());
  1393. IF offset >= 080H THEN DEC (offset, 100H) END;
  1394. RETURN offset;
  1395. END ReadOffset8;
  1396. PROCEDURE ReadOffset16 (): LONGINT;
  1397. VAR
  1398. offset: LONGINT;
  1399. BEGIN
  1400. offset := ReadInt ();
  1401. IF offset >= 08000H THEN DEC (offset, 10000H) END;
  1402. RETURN offset;
  1403. END ReadOffset16;
  1404. PROCEDURE ReadOffset32 (): LONGINT;
  1405. BEGIN
  1406. RETURN ReadLInt ();
  1407. END ReadOffset32;
  1408. PROCEDURE ReadOffset64 (): HUGEINT;
  1409. BEGIN
  1410. RETURN ReadHInt ();
  1411. END ReadOffset64;
  1412. PROCEDURE ReadHInt (): HUGEINT;
  1413. VAR
  1414. value: HUGEINT;
  1415. BEGIN
  1416. SYSTEM.PUT (ADDRESSOF (value), ReadLInt ());
  1417. SYSTEM.PUT (ADDRESSOF (value) + 4, ReadLInt ());
  1418. RETURN value;
  1419. END ReadHInt;
  1420. PROCEDURE Invalid;
  1421. BEGIN
  1422. Instr (opInvalid);
  1423. Bug (code, 0);
  1424. END Invalid;
  1425. PROCEDURE Reserved;
  1426. BEGIN
  1427. Instr (opReserved);
  1428. END Reserved;
  1429. PROCEDURE DecodePrefixes;
  1430. BEGIN
  1431. LOOP
  1432. byte := ORD (ReadChar ());
  1433. CASE byte OF
  1434. | 066H: INCL (opc.prefixes, prOperand);
  1435. | 067H: INCL (opc.prefixes, prAddress);
  1436. | 02EH: INCL (opc.prefixes, prCS);
  1437. | 03EH: INCL (opc.prefixes, prDS);
  1438. | 026H: INCL (opc.prefixes, prES);
  1439. | 064H: INCL (opc.prefixes, prFS);
  1440. | 065H: INCL (opc.prefixes, prGS);
  1441. | 036H: INCL (opc.prefixes, prSS);
  1442. | 0F0H: INCL (opc.prefixes, prLOCK);
  1443. | 0F3H: INCL (opc.prefixes, prREP);
  1444. | 0F2H: INCL (opc.prefixes, prREPN);
  1445. ELSE
  1446. IF byte DIV 10H = 4H THEN (* REX prefixes start with 4H *)
  1447. INCL (opc.prefixes, prREX);
  1448. IF byte DIV 8H MOD 2H # 0 THEN INCL (opc.prefixes, prREXW) END;
  1449. IF byte DIV 4H MOD 2H # 0 THEN INCL (opc.prefixes, prREXR) END;
  1450. IF byte DIV 2H MOD 2H # 0 THEN INCL (opc.prefixes, prREXX) END;
  1451. IF byte MOD 2H # 0 THEN INCL (opc.prefixes, prREXB) END;
  1452. byte := ORD (ReadChar ());
  1453. INC (opc.prefixCount);
  1454. END;
  1455. RETURN;
  1456. END;
  1457. INC (opc.prefixCount);
  1458. END;
  1459. END DecodePrefixes;
  1460. PROCEDURE Prefix (prefix: LONGINT): BOOLEAN;
  1461. BEGIN
  1462. RETURN prefix IN opc.prefixes;
  1463. END Prefix;
  1464. (* set the current opcode instruction *)
  1465. PROCEDURE Instr (instr : LONGINT);
  1466. BEGIN
  1467. opc.instr := instr;
  1468. END Instr;
  1469. (* set opcode instruction based on current operand size override *)
  1470. PROCEDURE InstrOp (instr16, instr32, instr64 : LONGINT);
  1471. BEGIN
  1472. IF Prefix (prREXW) THEN
  1473. Instr (instr64);
  1474. ELSIF Prefix (prOperand) THEN
  1475. Instr (instr16);
  1476. ELSE
  1477. Instr (instr32);
  1478. END
  1479. END InstrOp;
  1480. (* parse ModRM byte *)
  1481. PROCEDURE ModRM;
  1482. BEGIN
  1483. IF modRM THEN RETURN ELSE modRM := TRUE END;
  1484. byte := ORD (ReadChar ());
  1485. mod := byte DIV 40H MOD 4H;
  1486. reg := byte DIV 8H MOD 8H;
  1487. rm := byte MOD 8H;
  1488. IF (mod # 3) & (rm = 4) THEN
  1489. byte := ORD (ReadChar ());
  1490. scale := byte DIV 40H MOD 4H;
  1491. index := byte DIV 8H MOD 8H;
  1492. base := byte MOD 8H;
  1493. ELSE
  1494. base := 0;
  1495. END;
  1496. IF mod = 1 THEN
  1497. disp := ORD (ReadChar ());
  1498. IF disp > 07FH THEN DEC (disp, 0100H) END;
  1499. ELSIF (mod = 2) OR ((mod = 0) & (rm = 5)) OR (base = 5) THEN
  1500. disp := ReadLInt ();
  1501. ELSE
  1502. disp := 0;
  1503. END
  1504. END ModRM;
  1505. PROCEDURE GetOperandSize () : LONGINT;
  1506. BEGIN
  1507. IF Prefix (prREXW) THEN
  1508. RETURN 64;
  1509. ELSIF Prefix (prOperand) THEN
  1510. RETURN 16;
  1511. ELSE
  1512. RETURN 32;
  1513. END
  1514. END GetOperandSize;
  1515. PROCEDURE GetOperandReg (offset: LONGINT): LONGINT;
  1516. BEGIN
  1517. IF Prefix (prREXW) THEN
  1518. RETURN regRAX + offset;
  1519. ELSIF Prefix (prOperand) THEN
  1520. RETURN regAX + offset;
  1521. ELSE
  1522. RETURN regEAX + offset;
  1523. END
  1524. END GetOperandReg;
  1525. PROCEDURE GetReg (base, offset : LONGINT; extension : BOOLEAN) : LONGINT;
  1526. BEGIN
  1527. IF base = regES THEN
  1528. IF offset >= 6 THEN Invalid; END;
  1529. RETURN base + offset;
  1530. ELSIF extension THEN
  1531. IF base = regrAX THEN
  1532. RETURN GetOperandReg (offset + 8)
  1533. ELSE
  1534. RETURN base + offset + 8
  1535. END
  1536. ELSIF (base = regAL) & (offset >= 4) & (prREX IN opc.prefixes) THEN
  1537. RETURN regSPL - 4 + offset;
  1538. ELSIF base = regrAX THEN
  1539. RETURN GetOperandReg (offset)
  1540. ELSE
  1541. RETURN base + offset;
  1542. END
  1543. END GetReg;
  1544. PROCEDURE GetAddressReg (offset: LONGINT; extension: BOOLEAN): LONGINT;
  1545. BEGIN
  1546. IF extension THEN
  1547. IF prAddress IN opc.prefixes THEN RETURN regR8D + offset ELSE RETURN regR8 + offset END;
  1548. ELSE
  1549. IF prAddress IN opc.prefixes THEN RETURN regEAX + offset ELSE RETURN regRAX + offset END;
  1550. END
  1551. END GetAddressReg;
  1552. PROCEDURE AddImm (imm: HUGEINT);
  1553. VAR
  1554. argImm: ArgImm;
  1555. BEGIN
  1556. NEW (argImm, imm); opc.arg[arg] := argImm; INC (arg);
  1557. END AddImm;
  1558. PROCEDURE AddReg (reg: LONGINT);
  1559. VAR
  1560. argReg: ArgReg;
  1561. BEGIN
  1562. NEW (argReg, reg); opc.arg[arg] := argReg; INC (arg);
  1563. END AddReg;
  1564. PROCEDURE AddRMReg (base: LONGINT);
  1565. BEGIN
  1566. ModRM; AddReg (GetReg (base, reg, prREXR IN opc.prefixes));
  1567. END AddRMReg;
  1568. PROCEDURE AddMem (segment, reg, scale , base: LONGINT; disp: HUGEINT);
  1569. VAR
  1570. argMem: ArgMem;
  1571. BEGIN
  1572. NEW (argMem, segment, reg, scale, base, disp); opc.arg[arg] := argMem; INC (arg);
  1573. END AddMem;
  1574. PROCEDURE AddModMem;
  1575. VAR
  1576. reg, baseReg, scaling : LONGINT;
  1577. BEGIN
  1578. ModRM;
  1579. IF mod = 3 THEN
  1580. Invalid; RETURN;
  1581. ELSIF (mod = 0) & (rm = 5) THEN
  1582. IF Prefix (prREXB) & Prefix (prAddress) THEN reg := regIP ELSE reg := regRIP END;
  1583. scaling := 1;
  1584. baseReg := regNONE;
  1585. ELSIF rm = 4 THEN
  1586. IF (index = 4) & ~Prefix (prREXX) THEN
  1587. reg := regNONE
  1588. ELSE
  1589. reg := GetAddressReg (index, Prefix (prREXX));
  1590. END;
  1591. IF (base = 5) & (mod = 0) THEN
  1592. baseReg := regNONE
  1593. ELSE
  1594. baseReg := GetAddressReg (base, Prefix (prREXB));
  1595. END;
  1596. CASE scale OF
  1597. | 0: scaling := 1;
  1598. | 1: scaling := 2;
  1599. | 2: scaling := 4;
  1600. | 3: scaling := 8;
  1601. END
  1602. ELSE
  1603. reg := GetAddressReg (rm, Prefix (prREXB));
  1604. scaling := 1;
  1605. baseReg := regNONE;
  1606. END;
  1607. AddMem (segment, reg, scaling, baseReg, disp);
  1608. END AddModMem;
  1609. PROCEDURE AddModRM (base: LONGINT);
  1610. BEGIN
  1611. ModRM;
  1612. IF mod = 3 THEN
  1613. AddReg (GetReg (base, rm, Prefix (prREXB)));
  1614. ELSE
  1615. AddModMem;
  1616. END
  1617. END AddModRM;
  1618. PROCEDURE AddFPReg (offset: LONGINT);
  1619. BEGIN
  1620. AddReg (regST0 + offset);
  1621. END AddFPReg;
  1622. (* helper functions, see AMD64 programmers manual vol 3, instruction encoding *)
  1623. PROCEDURE AL; BEGIN AddReg (regAL) END AL;
  1624. PROCEDURE CL; BEGIN AddReg (regCL) END CL;
  1625. PROCEDURE Cdq; BEGIN AddRMReg (regCR0) END Cdq;
  1626. PROCEDURE Ddq; BEGIN AddRMReg (regDR0) END Ddq;
  1627. PROCEDURE DX; BEGIN AddReg (regDX) END DX;
  1628. PROCEDURE eAX; BEGIN IF GetOperandSize () = 16 THEN AddReg (regAX) ELSE AddReg (regEAX) END; END eAX;
  1629. PROCEDURE Eb; BEGIN AddModRM (regAL) END Eb;
  1630. PROCEDURE Ed; BEGIN AddModRM (regEAX) END Ed;
  1631. PROCEDURE Edq; BEGIN IF GetOperandSize () = 64 THEN AddModRM (regRAX) ELSE AddModRM (regEAX) END END Edq;
  1632. PROCEDURE Ev; BEGIN AddModRM (regrAX) END Ev;
  1633. PROCEDURE Ew; BEGIN AddModRM (regAX) END Ew;
  1634. PROCEDURE FS; BEGIN AddReg (regFS) END FS;
  1635. PROCEDURE Fv; END Fv;
  1636. PROCEDURE Gb; BEGIN AddRMReg (regAL) END Gb;
  1637. PROCEDURE Gd; BEGIN AddRMReg (regEAX) END Gd;
  1638. PROCEDURE Gdq; BEGIN IF GetOperandSize () = 64 THEN AddRMReg (regRAX) ELSE AddRMReg (regEAX) END END Gdq;
  1639. PROCEDURE Gv; BEGIN AddRMReg (regrAX) END Gv;
  1640. PROCEDURE Gz; BEGIN IF GetOperandSize () = 16 THEN AddRMReg (regAX) ELSE AddRMReg (regEAX) END END Gz;
  1641. PROCEDURE Ib; BEGIN AddImm (ReadImm8 ()) END Ib;
  1642. PROCEDURE Iv;
  1643. BEGIN
  1644. CASE GetOperandSize () OF
  1645. | 16: AddImm (ReadImm16 ());
  1646. | 32: AddImm (ReadImm32 ());
  1647. | 64: AddImm (ReadImm64 ());
  1648. END;
  1649. END Iv;
  1650. PROCEDURE Iw; BEGIN AddImm (ReadInt ()) END Iw;
  1651. PROCEDURE Iz; BEGIN IF GetOperandSize () = 16 THEN AddImm (ReadImm16 ()) ELSE AddImm (ReadImm32 ()) END END Iz;
  1652. PROCEDURE Jb; BEGIN AddImm (ReadOffset8 ()) END Jb;
  1653. PROCEDURE Jz; BEGIN IF GetOperandSize () = 16 THEN AddImm (ReadOffset16 ()) ELSE AddImm (ReadOffset32 ()) END END Jz;
  1654. PROCEDURE M; BEGIN AddModMem () END M;
  1655. PROCEDURE Mb; BEGIN AddModMem () END Mb;
  1656. PROCEDURE Md; BEGIN AddModMem () END Md;
  1657. PROCEDURE Mdq; BEGIN AddModMem () END Mdq;
  1658. PROCEDURE Mp; BEGIN AddModMem () END Mp;
  1659. PROCEDURE Mq; BEGIN AddModMem () END Mq;
  1660. PROCEDURE Ms; BEGIN AddModMem () END Ms;
  1661. PROCEDURE MwRv; BEGIN AddModRM (regrAX) END MwRv;
  1662. PROCEDURE Ob; BEGIN AddMem (regNONE, regNONE, 1, regNONE, ReadOffset8 ()) END Ob;
  1663. PROCEDURE Ov;
  1664. BEGIN
  1665. CASE GetOperandSize () OF
  1666. | 16: AddMem (regNONE, regNONE, 1, regNONE, ReadOffset16 ());
  1667. | 32: AddMem (regNONE, regNONE, 1, regNONE, ReadOffset32 ());
  1668. | 64: AddMem (regNONE, regNONE, 1, regNONE, ReadOffset64 ());
  1669. END;
  1670. END Ov;
  1671. PROCEDURE Pq; BEGIN AddRMReg (regMMX0) END Pq;
  1672. PROCEDURE Pdq; BEGIN AddRMReg (regMMX0) END Pdq;
  1673. PROCEDURE PRq; BEGIN ModRM; IF mod = 3 THEN AddModRM (regMMX0) ELSE Invalid END END PRq;
  1674. PROCEDURE Qd; BEGIN AddModRM (regMMX0) END Qd;
  1675. PROCEDURE Qq; BEGIN AddModRM (regMMX0) END Qq;
  1676. PROCEDURE rAX; BEGIN AddReg (GetOperandReg (regrAX)) END rAX;
  1677. PROCEDURE Rdq; BEGIN AddModRM (regRAX) END Rdq;
  1678. PROCEDURE Sw; BEGIN AddRMReg (regES) END Sw;
  1679. PROCEDURE Xb; BEGIN AddMem (regNONE, GetAddressReg (regrSI, FALSE), 1, regNONE, 0) END Xb;
  1680. PROCEDURE Xv; BEGIN AddMem (regNONE, GetAddressReg (regrSI, FALSE), 1, regNONE, 0) END Xv;
  1681. PROCEDURE Xz; BEGIN AddMem (regNONE, GetAddressReg (regrSI, FALSE), 1, regNONE, 0) END Xz;
  1682. PROCEDURE Yb; BEGIN AddMem (regNONE, GetAddressReg (regrDI, FALSE), 1, regNONE, 0) END Yb;
  1683. PROCEDURE Yv; BEGIN AddMem (regNONE, GetAddressReg (regrDI, FALSE), 1, regNONE, 0) END Yv;
  1684. PROCEDURE Yz; BEGIN AddMem (regNONE, GetAddressReg (regrDI, FALSE), 1, regNONE, 0) END Yz;
  1685. PROCEDURE Vdq; BEGIN AddRMReg (regXMM0) END Vdq;
  1686. PROCEDURE Vdqsd; BEGIN AddRMReg (regXMM0) END Vdqsd;
  1687. PROCEDURE Vdqss; BEGIN AddRMReg (regXMM0) END Vdqss;
  1688. PROCEDURE Vps; BEGIN AddRMReg (regXMM0) END Vps;
  1689. PROCEDURE Vpd; BEGIN AddRMReg (regXMM0) END Vpd;
  1690. PROCEDURE Vq; BEGIN AddRMReg (regXMM0) END Vq;
  1691. PROCEDURE VRdq; BEGIN ModRM; IF mod = 3 THEN AddModRM (regXMM0) ELSE Invalid END END VRdq;
  1692. PROCEDURE VRpd; BEGIN ModRM; IF mod = 3 THEN AddModRM (regXMM0) ELSE Invalid END END VRpd;
  1693. PROCEDURE VRps; BEGIN ModRM; IF mod = 3 THEN AddModRM (regXMM0) ELSE Invalid END END VRps;
  1694. PROCEDURE VRq; BEGIN ModRM; IF mod = 3 THEN AddModRM (regXMM0) ELSE Invalid END END VRq;
  1695. PROCEDURE Vsd; BEGIN AddRMReg (regXMM0) END Vsd;
  1696. PROCEDURE Vss; BEGIN AddRMReg (regXMM0) END Vss;
  1697. PROCEDURE Wdq; BEGIN AddModRM (regXMM0) END Wdq;
  1698. PROCEDURE Wpd; BEGIN AddModRM (regXMM0) END Wpd;
  1699. PROCEDURE Wq; BEGIN AddModRM (regXMM0) END Wq;
  1700. PROCEDURE Wps; BEGIN AddModRM (regXMM0) END Wps;
  1701. PROCEDURE Wsd; BEGIN AddModRM (regXMM0) END Wsd;
  1702. PROCEDURE Wss; BEGIN AddModRM (regXMM0) END Wss;
  1703. PROCEDURE Type1 (instr, offset : LONGINT);
  1704. BEGIN
  1705. Instr (instr);
  1706. CASE offset OF
  1707. | 0: Eb; Gb;
  1708. | 1: Ev; Gv;
  1709. | 2: Gb; Eb;
  1710. | 3: Gv; Ev;
  1711. | 4: AL; Ib;
  1712. | 5: rAX; Iz;
  1713. END
  1714. END Type1;
  1715. PROCEDURE Type2 (instr, offset : LONGINT);
  1716. BEGIN
  1717. Instr (instr);
  1718. IF prREXB IN opc.prefixes THEN INC (offset, 8) END;
  1719. IF GetOperandSize () = 16 THEN
  1720. AddReg (regAX + offset);
  1721. ELSE
  1722. AddReg (regRAX + offset);
  1723. END
  1724. END Type2;
  1725. PROCEDURE Type3 (instr : LONGINT);
  1726. BEGIN
  1727. IF Prefix (prF3) THEN Invalid;
  1728. ELSIF Prefix (pr66) THEN Instr (instr); Vdq; Wdq;
  1729. ELSIF Prefix (prF2) THEN Invalid;
  1730. ELSE Instr (instr); Pq; Qq; END;
  1731. END Type3;
  1732. PROCEDURE Group1;
  1733. BEGIN
  1734. ModRM;
  1735. CASE reg OF
  1736. | 0: Instr (opADD);
  1737. | 1: Instr (opOR);
  1738. | 2: Instr (opADC);
  1739. | 3: Instr (opSBB);
  1740. | 4: Instr (opAND);
  1741. | 5: Instr (opSUB);
  1742. | 6: Instr (opXOR);
  1743. | 7: Instr (opCMP);
  1744. END;
  1745. CASE code OF
  1746. | 080H: Eb; Ib;
  1747. | 081H: Ev; Iz;
  1748. | 082H: Invalid;
  1749. | 083H: Ev; Ib;
  1750. END
  1751. END Group1;
  1752. PROCEDURE Group1a;
  1753. BEGIN
  1754. ModRM;
  1755. IF reg = 0 THEN
  1756. Instr (opPOP); Ev;
  1757. ELSE
  1758. Invalid;
  1759. END
  1760. END Group1a;
  1761. PROCEDURE Group2;
  1762. BEGIN
  1763. ModRM;
  1764. CASE reg OF
  1765. | 0: Instr (opROL);
  1766. | 1: Instr (opROR);
  1767. | 2: Instr (opRCL);
  1768. | 3: Instr (opRCR);
  1769. | 4: Instr (opSHL);
  1770. | 5: Instr (opSHR);
  1771. | 6: Instr (opSHL);
  1772. | 7: Instr (opSHR);
  1773. END;
  1774. CASE code OF
  1775. | 0C0H: Eb; Ib;
  1776. | 0C1H: Ev; Ib;
  1777. | 0D0H: Eb; AddImm (1);
  1778. | 0D1H: Ev; AddImm (1);
  1779. | 0D2H: Eb; AddReg (regCL);
  1780. | 0D3H: Ev; AddReg (regCL);
  1781. END
  1782. END Group2;
  1783. PROCEDURE Group3;
  1784. BEGIN
  1785. ModRM;
  1786. CASE reg OF
  1787. | 0..1: Instr (opTEST);
  1788. | 2: Instr (opNOT);
  1789. | 3: Instr (opNEG);
  1790. | 4: Instr (opMUL);
  1791. | 5: Instr (opIMUL);
  1792. | 6: Instr (opDIV);
  1793. | 7: Instr (opIDIV);
  1794. END;
  1795. CASE code OF
  1796. | 0F6H: Eb; IF reg <= 1 THEN Ib END;
  1797. | 0F7H: Ev; IF reg <= 1 THEN Iz END;
  1798. END
  1799. END Group3;
  1800. PROCEDURE Group4;
  1801. BEGIN
  1802. ModRM;
  1803. CASE reg OF
  1804. | 0: Instr (opINC);
  1805. | 1: Instr (opDEC);
  1806. ELSE
  1807. Invalid; RETURN;
  1808. END;
  1809. Eb;
  1810. END Group4;
  1811. PROCEDURE Group5;
  1812. BEGIN
  1813. ModRM;
  1814. CASE reg OF
  1815. | 0: Instr (opINC); Ev;
  1816. | 1: Instr (opDEC); Ev;
  1817. | 2: Instr (opCALL); Ev;
  1818. | 3: Instr (opCALL); Mp;
  1819. | 4: Instr (opJMP); Ev;
  1820. | 5: Instr (opJMP); Mp;
  1821. | 6: Instr (opPUSH); Ev;
  1822. ELSE
  1823. Invalid;
  1824. END;
  1825. END Group5;
  1826. PROCEDURE Group6;
  1827. BEGIN
  1828. ModRM;
  1829. CASE reg OF
  1830. | 0: Instr (opSLDT); MwRv;
  1831. | 1: Instr (opSTR); MwRv;
  1832. | 2: Instr (opLLDT); Ew;
  1833. | 3: Instr (opLTR); Ew;
  1834. | 4: Instr (opVERR); Ew;
  1835. | 5: Instr (opVERW); Ew;
  1836. ELSE
  1837. Invalid;
  1838. END;
  1839. END Group6;
  1840. PROCEDURE Group7;
  1841. BEGIN
  1842. ModRM;
  1843. CASE reg OF
  1844. | 0: Instr (opSGDT); Ms;
  1845. | 1: Instr (opSIDT); Ms;
  1846. | 2: Instr (opLGDT); Ms;
  1847. | 3: IF mod = 3 THEN GroupModRM ELSE Instr (opLIDT); Ms END;
  1848. | 4: Instr (opSMSW); MwRv;
  1849. | 6: Instr (opLMSW); Ew;
  1850. | 7: IF mod = 3 THEN GroupModRM ELSE Instr (opINVLPG); Mb END;
  1851. ELSE
  1852. Invalid;
  1853. END;
  1854. END Group7;
  1855. PROCEDURE Group8;
  1856. BEGIN
  1857. ModRM;
  1858. CASE reg OF
  1859. | 4: Instr (opBT);
  1860. | 5: Instr (opBTS);
  1861. | 6: Instr (opBTR);
  1862. | 7: Instr (opBTC);
  1863. ELSE
  1864. Invalid; RETURN;
  1865. END;
  1866. Ev; Ib;
  1867. END Group8;
  1868. PROCEDURE Group9;
  1869. BEGIN
  1870. ModRM;
  1871. IF reg = 1 THEN
  1872. IF Prefix (prREXW) THEN
  1873. Instr (opCMPXCHG16B); Mdq;
  1874. ELSE
  1875. Instr (opCMPXCHG8B); Mq;
  1876. END;
  1877. ELSE
  1878. Invalid;
  1879. END;
  1880. END Group9;
  1881. PROCEDURE Group10;
  1882. BEGIN
  1883. Invalid;
  1884. END Group10;
  1885. PROCEDURE Group11;
  1886. BEGIN
  1887. ModRM;
  1888. IF reg = 0 THEN
  1889. Instr (opMOV);
  1890. ELSE
  1891. Invalid; RETURN;
  1892. END;
  1893. CASE code OF
  1894. | 0C6H: Eb; Ib;
  1895. | 0C7H: Ev; Iz;
  1896. END
  1897. END Group11;
  1898. PROCEDURE Group12;
  1899. BEGIN
  1900. ModRM;
  1901. IF Prefix (prF2) OR Prefix (prF3) THEN
  1902. Invalid; RETURN;
  1903. END;
  1904. CASE reg OF
  1905. | 2: Instr (opPSRLW);
  1906. | 4: Instr (opPSRAW);
  1907. | 6: Instr (opPSLLW);
  1908. ELSE
  1909. Invalid; RETURN;
  1910. END;
  1911. IF Prefix (pr66) THEN
  1912. VRdq; Ib;
  1913. ELSE
  1914. PRq; Ib;
  1915. END;
  1916. END Group12;
  1917. PROCEDURE Group13;
  1918. BEGIN
  1919. ModRM;
  1920. IF Prefix (prF2) OR Prefix (prF3) THEN
  1921. Invalid; RETURN;
  1922. END;
  1923. CASE reg OF
  1924. | 2: Instr (opPSRLD);
  1925. | 4: Instr (opPSRAD);
  1926. | 6: Instr (opPSLLD);
  1927. ELSE
  1928. Invalid; RETURN;
  1929. END;
  1930. IF Prefix (pr66) THEN
  1931. VRdq; Ib;
  1932. ELSE
  1933. PRq; Ib;
  1934. END;
  1935. END Group13;
  1936. PROCEDURE Group14;
  1937. BEGIN
  1938. ModRM;
  1939. IF Prefix (prF2) OR Prefix (prF3) THEN
  1940. Invalid; RETURN;
  1941. END;
  1942. CASE reg OF
  1943. | 2: Instr (opPSRLQ);
  1944. | 3: IF Prefix (pr66) THEN Instr (opPSRLDQ) ELSE Invalid; RETURN; END;
  1945. | 6: Instr (opPSLLQ);
  1946. | 7: IF Prefix (pr66) THEN Instr (opPSLLDQ) ELSE Invalid; RETURN; END;
  1947. ELSE
  1948. Invalid; RETURN;
  1949. END;
  1950. IF Prefix (pr66) THEN
  1951. VRdq; Ib;
  1952. ELSE
  1953. PRq; Ib;
  1954. END;
  1955. END Group14;
  1956. PROCEDURE Group15;
  1957. BEGIN
  1958. ModRM;
  1959. IF Prefix (pr66) OR Prefix (prF2) OR Prefix (prF3) THEN
  1960. Invalid; RETURN;
  1961. END;
  1962. CASE reg OF
  1963. | 0: Instr (opFXSAVE); M;
  1964. | 1: Instr (opFXRSTOR); M;
  1965. | 2: Instr (opLDMXCSR); Md;
  1966. | 3: Instr (opSTMXCSR); Md;
  1967. | 5..7: GroupModRM;
  1968. ELSE
  1969. Invalid;
  1970. END;
  1971. END Group15;
  1972. PROCEDURE Group16;
  1973. BEGIN
  1974. ModRM;
  1975. CASE reg OF
  1976. | 0: Instr (opPREFETCHNTA);
  1977. | 1: Instr (opPREFETCHT0);
  1978. | 2: Instr (opPREFETCHT1);
  1979. | 3: Instr (opPREFETCHT2);
  1980. | 4..7: Instr (opNOP);
  1981. END;
  1982. END Group16;
  1983. PROCEDURE GroupP;
  1984. BEGIN
  1985. ModRM;
  1986. CASE reg OF
  1987. | 0: Instr (opPREFETCH);
  1988. | 1, 3: Instr (opPREFETCHW);
  1989. ELSE
  1990. Instr (opPREFETCH);
  1991. END;
  1992. END GroupP;
  1993. PROCEDURE GroupModRM;
  1994. BEGIN
  1995. ModRM;
  1996. IF code = 0F01H THEN
  1997. CASE reg OF
  1998. 3:
  1999. CASE rm OF
  2000. | 0: Instr (opVMRUN);
  2001. | 1: Instr (opVMMCALL);
  2002. | 2: Instr (opVMLOAD);
  2003. | 3: Instr (opVMSAVE);
  2004. | 4: Instr (opSTGI);
  2005. | 5: Instr (opCLGI);
  2006. | 6: Instr (opSKINIT);
  2007. | 7: Instr (opINVLPGA);
  2008. END;
  2009. | 7:
  2010. CASE rm OF
  2011. | 0: Instr (opSWAPGS);
  2012. | 1: Instr (opRDTSCP);
  2013. ELSE
  2014. Invalid;
  2015. END;
  2016. END;
  2017. ELSIF code = 0FAEH THEN
  2018. CASE reg OF
  2019. | 5: Instr (opLFENCE);
  2020. | 6: Instr (opMFENCE);
  2021. | 7: Instr (opSFENCE);
  2022. END;
  2023. END;
  2024. END GroupModRM;
  2025. PROCEDURE Group3DNow;
  2026. BEGIN
  2027. ModRM;
  2028. CASE ORD (ReadChar ()) OF
  2029. | 00CH: Instr (opPI2FW);
  2030. | 00DH: Instr (opPI2FD);
  2031. | 01CH: Instr (opPF2IW);
  2032. | 01DH: Instr (opPF2ID);
  2033. | 08AH: Instr (opPFNACC);
  2034. | 08EH: Instr (opPFPNACC);
  2035. | 090H: Instr (opPFCMPGE);
  2036. | 094H: Instr (opPFMIN);
  2037. | 096H: Instr (opPFRCP);
  2038. | 097H: Instr (opPFRSQRT);
  2039. | 09AH: Instr (opPFSUB);
  2040. | 09EH: Instr (opPFADD);
  2041. | 0A0H: Instr (opPFCMPGT);
  2042. | 0A4H: Instr (opPFMAX);
  2043. | 0A6H: Instr (opPFRCPIT1);
  2044. | 0A7H: Instr (opPFRSQIT1);
  2045. | 0AAH: Instr (opPFSUBR);
  2046. | 0AEH: Instr (opPFACC);
  2047. | 0B0H: Instr (opPFCMPEQ);
  2048. | 0B4H: Instr (opPFMUL);
  2049. | 0B6H: Instr (opPFRCPIT1);
  2050. | 0B7H: Instr (opPMULHRW);
  2051. | 0BBH: Instr (opPSWAPD);
  2052. | 0BFH: Instr (opPAVGUSB);
  2053. ELSE
  2054. Reserved; RETURN;
  2055. END;
  2056. Pq; Qq;
  2057. END Group3DNow;
  2058. PROCEDURE Groupx87;
  2059. PROCEDURE MemInstr (instr : LONGINT);
  2060. BEGIN
  2061. Instr (instr);
  2062. AddModMem;
  2063. END MemInstr;
  2064. PROCEDURE StackInstr0i (instr : LONGINT);
  2065. BEGIN
  2066. Instr (instr);
  2067. AddFPReg (0);
  2068. AddFPReg (rm);
  2069. END StackInstr0i;
  2070. PROCEDURE StackInstri0 (instr : LONGINT);
  2071. BEGIN
  2072. Instr (instr);
  2073. AddFPReg (rm);
  2074. AddFPReg (0);
  2075. END StackInstri0;
  2076. PROCEDURE FPInstr0i (meminstr, stackinstr: LONGINT);
  2077. BEGIN
  2078. IF mod # 3 THEN
  2079. MemInstr (meminstr);
  2080. ELSE
  2081. StackInstr0i (stackinstr);
  2082. END;
  2083. END FPInstr0i;
  2084. PROCEDURE FPInstri0 (meminstr, stackinstr: LONGINT);
  2085. BEGIN
  2086. IF mod # 3 THEN
  2087. MemInstr (meminstr);
  2088. ELSE
  2089. StackInstri0 (stackinstr);
  2090. END;
  2091. END FPInstri0;
  2092. BEGIN
  2093. ModRM;
  2094. CASE code OF
  2095. 0D8H:
  2096. CASE reg OF
  2097. | 0: FPInstr0i (opFADD, opFADD);
  2098. | 1: FPInstr0i (opFMUL, opFMUL);
  2099. | 2: FPInstr0i (opFCOM, opFCOM);
  2100. | 3: FPInstr0i (opFCOMP, opFCOMP);
  2101. | 4: FPInstr0i (opFSUB, opFSUB);
  2102. | 5: FPInstr0i (opFSUBR, opFSUBR);
  2103. | 6: FPInstr0i (opFDIV, opFDIV);
  2104. | 7: FPInstr0i (opFDIVR, opFDIVR);
  2105. END;
  2106. | 0D9H:
  2107. CASE reg OF
  2108. | 0: FPInstr0i (opFLD, opFLD);
  2109. | 1: IF mod # 3 THEN Invalid ELSE StackInstr0i (opFXCH) END;
  2110. | 2: IF mod # 3 THEN MemInstr (opFST) ELSIF rm = 0 THEN Instr (opFNOP) ELSE Invalid END;
  2111. | 3: IF mod # 3 THEN MemInstr (opFSTP) ELSE Reserved END;
  2112. | 4: IF mod # 3 THEN MemInstr (opFLDENV) ELSE
  2113. CASE rm OF
  2114. | 0: Instr (opFCHS);
  2115. | 1: Instr (opFABS);
  2116. | 4: Instr (opFTST);
  2117. | 5: Instr (opFXAM);
  2118. ELSE
  2119. Invalid;
  2120. END; END;
  2121. | 5: IF mod # 3 THEN MemInstr (opFLDCW) ELSE
  2122. CASE rm OF
  2123. | 0: Instr (opFLD1);
  2124. | 1: Instr (opFLDL2T);
  2125. | 2: Instr (opFLDL2E);
  2126. | 3: Instr (opFLDPI);
  2127. | 4: Instr (opFLDLG2);
  2128. | 5: Instr (opFLDLN2);
  2129. | 6: Instr (opFLDZ);
  2130. | 7: Invalid;
  2131. END; END;
  2132. | 6: IF mod # 3 THEN MemInstr (opFNSTENV) ELSE
  2133. CASE rm OF
  2134. | 0: Instr (opF2XM1);
  2135. | 1: Instr (opFYL2X);
  2136. | 2: Instr (opFPTAN);
  2137. | 3: Instr (opFPATAN);
  2138. | 4: Instr (opFXTRACT);
  2139. | 5: Instr (opFPREM1);
  2140. | 6: Instr (opFDECSTP);
  2141. | 7: Instr (opFINCSTP);
  2142. END; END;
  2143. | 7: IF mod # 3 THEN MemInstr (opFNSTCW) ELSE
  2144. CASE rm OF
  2145. | 0: Instr (opFPREM);
  2146. | 1: Instr (opFYL2XP1);
  2147. | 2: Instr (opFSQRT);
  2148. | 3: Instr (opFSINCOS);
  2149. | 4: Instr (opFRNDINT);
  2150. | 5: Instr (opFSCALE);
  2151. | 6: Instr (opFSIN);
  2152. | 7: Instr (opFCOS);
  2153. END; END;
  2154. END;
  2155. | 0DAH:
  2156. CASE reg OF
  2157. | 0: FPInstr0i (opFIADD, opFCMOVB);
  2158. | 1: FPInstr0i (opFIMUL, opFCMOVE);
  2159. | 2: FPInstr0i (opFICOM, opFCMOVBE);
  2160. | 3: FPInstr0i (opFICOMP, opFCMOVU);
  2161. | 4: IF mod # 3 THEN MemInstr (opFISUB) ELSE Invalid END;
  2162. | 5: IF mod # 3 THEN MemInstr (opFISUBR) ELSIF rm = 1 THEN Instr (opFUCOMPP) ELSE Invalid END;
  2163. | 6: IF mod # 3 THEN MemInstr (opFIDIV) ELSE Invalid END;
  2164. | 7: IF mod # 3 THEN MemInstr (opFIDIVR) ELSE Invalid END;
  2165. END;
  2166. | 0DBH:
  2167. CASE reg OF
  2168. | 0: FPInstr0i (opFILD, opFCMOVNB);
  2169. | 1: FPInstr0i (opFISTTP, opFCMOVNE);
  2170. | 2: FPInstr0i (opFIST, opFCMOVNBE);
  2171. | 3: FPInstr0i (opFISTP, opFCMOVNU);
  2172. | 4: IF mod # 3 THEN Invalid ELSE
  2173. CASE rm OF
  2174. | 2: Instr (opFNCLEX);
  2175. | 3: Instr (opFNINIT);
  2176. ELSE
  2177. Reserved;
  2178. END; END;
  2179. | 5: FPInstr0i (opFLD, opFUCOMI);
  2180. | 6: IF mod # 3 THEN Invalid ELSE StackInstr0i (opFCOMI) END;
  2181. | 7: IF mod # 3 THEN MemInstr (opFSTP) ELSE Invalid END;
  2182. END;
  2183. | 0DCH:
  2184. CASE reg OF
  2185. | 0: FPInstri0 (opFADD, opFADD);
  2186. | 1: FPInstri0 (opFMUL, opFMUL);
  2187. | 2: IF mod # 3 THEN MemInstr (opFCOM) ELSE Reserved END;
  2188. | 3: IF mod # 3 THEN MemInstr (opFCOMP) ELSE Reserved END;
  2189. | 4: FPInstri0 (opFSUB, opFSUBR);
  2190. | 5: FPInstri0 (opFSUBR, opFSUB);
  2191. | 6: FPInstri0 (opFDIV, opFDIVR);
  2192. | 7: FPInstri0 (opFDIVR, opFDIV);
  2193. END;
  2194. | 0DDH:
  2195. CASE reg OF
  2196. | 0: IF mod # 3 THEN MemInstr (opFLD) ELSE Instr (opFFREE); AddFPReg (rm) END
  2197. | 1: IF mod # 3 THEN MemInstr (opFISTTP) ELSE Reserved END;
  2198. | 2: IF mod # 3 THEN MemInstr (opFST) ELSE Instr (opFST); AddFPReg (rm) END
  2199. | 3: IF mod # 3 THEN MemInstr (opFSTP) ELSE Instr (opFSTP); AddFPReg (rm) END
  2200. | 4: FPInstri0 (opFRSTOR, opFUCOM);
  2201. | 5: IF mod # 3 THEN Invalid ELSE Instr (opFUCOMP); AddFPReg (rm) END;
  2202. | 6: IF mod # 3 THEN MemInstr (opFNSAVE) ELSE Invalid END;
  2203. | 7: IF mod # 3 THEN MemInstr (opFNSTSW) ELSE Invalid END;
  2204. END;
  2205. | 0DEH:
  2206. CASE reg OF
  2207. | 0: FPInstri0 (opFIADD, opFADDP);
  2208. | 1: FPInstri0 (opFIMUL, opFMULP);
  2209. | 2: IF mod # 3 THEN MemInstr (opFICOM) ELSE Reserved END;
  2210. | 3: IF mod # 3 THEN MemInstr (opFICOMP) ELSIF rm = 1 THEN Instr (opFCOMPP) ELSE Invalid END;
  2211. | 4: FPInstri0 (opFISUB, opFSUBRP);
  2212. | 5: FPInstri0 (opFISUBR, opFSUBP);
  2213. | 6: FPInstri0 (opFIDIV, opFDIVRP);
  2214. | 7: FPInstri0 (opFIDIVR, opFDIVP);
  2215. END;
  2216. | 0DFH:
  2217. CASE reg OF
  2218. | 0: IF mod # 3 THEN MemInstr (opFILD) ELSE Reserved END;
  2219. | 1: IF mod # 3 THEN MemInstr (opFISTTP) ELSE Reserved END;
  2220. | 2: IF mod # 3 THEN MemInstr (opFIST) ELSE Reserved END;
  2221. | 3: IF mod # 3 THEN MemInstr (opFISTP) ELSE Reserved END;
  2222. | 4: IF mod # 3 THEN MemInstr (opFBLD) ELSIF rm = 0 THEN Instr (opFNSTSW) ELSE Invalid END;
  2223. | 5: FPInstr0i (opFILD, opFUCOMIP);
  2224. | 6: FPInstr0i (opFBSTP, opFCOMIP);
  2225. | 7: IF mod # 3 THEN MemInstr (opFISTP) ELSE Invalid END;
  2226. END;
  2227. END;
  2228. END Groupx87;
  2229. BEGIN
  2230. opc := opcode(AMD64Opcode);
  2231. DecodePrefixes;
  2232. IF prFS IN opc.prefixes THEN segment := regFS
  2233. ELSIF prGS IN opc.prefixes THEN segment := regGS
  2234. ELSE segment := regNONE END;
  2235. IF byte = 00FH THEN
  2236. code := byte * 0100H + ORD (ReadChar ());
  2237. opc.hidePrefixes := TRUE;
  2238. ELSE
  2239. code := byte
  2240. END;
  2241. arg := 0;
  2242. CASE code OF
  2243. | 000H..005H: Type1 (opADD, code - 000H);
  2244. | 008H..00DH: Type1 (opOR, code - 008H);
  2245. | 010H..015H: Type1 (opADC, code - 010H);
  2246. | 018H..01DH: Type1 (opSBB, code - 018H);
  2247. | 020H..025H: Type1 (opAND, code - 020H);
  2248. | 028H..02DH: Type1 (opSUB, code - 028H);
  2249. | 030H..035H: Type1 (opXOR, code - 030H);
  2250. | 038H..03DH: Type1 (opCMP, code - 038H);
  2251. | 050H..057H: Type2 (opPUSH, (code - 050H) MOD 08H);
  2252. | 058H..05FH: Type2 (opPOP, (code - 058H) MOD 08H);
  2253. | 063H: Instr (opMOVSXD); Gv; Ed;
  2254. | 068H: Instr (opPUSH); Iz;
  2255. | 069H: Instr (opIMUL); Gv; Ev; Iz;
  2256. | 06AH: Instr (opPUSH); Ib;
  2257. | 06BH: Instr (opIMUL); Gv; Ev; Ib;
  2258. | 06CH: Instr (opINSB); Yb; DX;
  2259. | 06DH: InstrOp (opINSW, opINSD, opINSD); Yz; DX;
  2260. | 06EH: Instr (opOUTSB); DX; Xb;
  2261. | 06FH: InstrOp (opOUTSW, opOUTSD, opOUTSD); DX; Xz;
  2262. | 070H: Instr (opJO); Jb;
  2263. | 071H: Instr (opJNO); Jb;
  2264. | 072H: Instr (opJB); Jb;
  2265. | 073H: Instr (opJNB); Jb;
  2266. | 074H: Instr (opJE); Jb;
  2267. | 075H: Instr (opJNE); Jb;
  2268. | 076H: Instr (opJBE); Jb;
  2269. | 077H: Instr (opJNBE); Jb;
  2270. | 078H: Instr (opJA); Jb;
  2271. | 079H: Instr (opJS); Jb;
  2272. | 07AH: Instr (opJP); Jb;
  2273. | 07BH: Instr (opJNP); Jb;
  2274. | 07CH: Instr (opJL); Jb;
  2275. | 07DH: Instr (opJGE); Jb;
  2276. | 07EH: Instr (opJLE); Jb;
  2277. | 07FH: Instr (opJG); Jb;
  2278. | 080H..083H: Group1;
  2279. | 084H: Instr (opTEST); Eb; Gb;
  2280. | 085H: Instr (opTEST); Ev; Gv;
  2281. | 086H: Instr (opXCHG); Eb; Gb;
  2282. | 087H: Instr (opXCHG); Ev; Gv;
  2283. | 088H: Instr (opMOV); Eb; Gb;
  2284. | 089H: Instr (opMOV); Ev; Gv;
  2285. | 08AH: Instr (opMOV); Gb; Eb;
  2286. | 08BH: Instr (opMOV); Gv; Ev;
  2287. | 08CH: Instr (opMOV); Ev; Sw;
  2288. | 08DH: Instr (opLEA); Gv; M;
  2289. | 08EH: Instr (opMOV); Sw; Ev;
  2290. | 08FH: Group1a;
  2291. | 090H: IF Prefix (prF3) THEN Instr (opPAUSE) ELSE Instr (opNOP) END;
  2292. | 091H..097H: Instr (opXCHG); AddReg (GetReg (regrAX, (code - 090H) MOD 8, Prefix (prREXB))); rAX;
  2293. | 098H: InstrOp (opCBW, opCWDE, opCDQE);
  2294. | 099H: InstrOp (opCWD, opCDQ, opCQO);
  2295. | 09BH: Instr (opFWAIT);
  2296. | 09CH: InstrOp (opPUSHF, opPUSHFD, opPUSHFQ); Fv;
  2297. | 09DH: InstrOp (opPOPF, opPOPFD, opPOPFQ); Fv;
  2298. | 09EH: Instr (opSAHF);
  2299. | 09FH: Instr (opLAHF);
  2300. | 0A0H: Instr (opMOV); AL; Ob;
  2301. | 0A1H: Instr (opMOV); rAX; Ov;
  2302. | 0A2H: Instr (opMOV); Ob; AL;
  2303. | 0A3H: Instr (opMOV); Ov; rAX;
  2304. | 0A4H: Instr (opMOVSB); Yb; Xb;
  2305. | 0A5H: InstrOp (opMOVSW, opMOVSD, opMOVSQ); Yv; Xv;
  2306. | 0A6H: Instr (opCMPSB); Xb; Yb;
  2307. | 0A7H: InstrOp (opCMPSW, opCMPSD, opCMPSQ); Xv; Yv;
  2308. | 0A8H: Instr (opTEST); AL; Ib;
  2309. | 0A9H: Instr (opTEST); rAX; Iz;
  2310. | 0AAH: Instr (opSTOSB); Yb; AL;
  2311. | 0ABH: InstrOp (opSTOSW, opSTOSD, opSTOSQ); Yv; rAX;
  2312. | 0ACH: Instr (opLODSB); AL; Xb;
  2313. | 0ADH: InstrOp (opLODSW, opLODSD, opLODSQ); rAX; Xv;
  2314. | 0AEH: Instr (opSCASB); AL; Yb;
  2315. | 0AFH: InstrOp (opSCASW, opSCASD, opSCASQ); rAX; Yv;
  2316. | 0B0H..0B7H: Instr (opMOV); AddReg (GetReg (regAL, (code - 0B0H) MOD 8, Prefix (prREXB))); Ib;
  2317. | 0B8H..0BFH: Instr (opMOV); AddReg (GetReg (regrAX, (code - 0B8H) MOD 8, Prefix (prREXB))); Iv;
  2318. | 0C0H..0C1H: Group2;
  2319. | 0C2H: Instr (opRET); Iw;
  2320. | 0C3H: Instr (opRET);
  2321. | 0C6H..0C7H: Group11;
  2322. | 0C8H: Instr (opENTER); Iw; Ib;
  2323. | 0C9H: Instr (opLEAVE);
  2324. | 0CAH: Instr (opRET); Iw;
  2325. | 0CBH: Instr (opRET);
  2326. | 0CCH: Instr (opINT); AddImm (3);
  2327. | 0CDH: Instr (opINT); Ib;
  2328. | 0CFH: InstrOp (opIRET, opIRETD, opIRETQ);
  2329. | 0D0H..0D3H: Group2;
  2330. | 0D7H: Instr (opXLAT);
  2331. | 0D8H..0DFH: Groupx87;
  2332. | 0E0H: Instr (opLOOPNE); Jb;
  2333. | 0E1H: Instr (opLOOPE); Jb;
  2334. | 0E2H: Instr (opLOOP); Jb;
  2335. | 0E3H: InstrOp (opJCXZ, opJECXZ, opJRCXZ); Jb;
  2336. | 0E4H: Instr (opIN); AL; Ib;
  2337. | 0E5H: Instr (opIN); eAX; Ib;
  2338. | 0E6H: Instr (opOUT); Ib; AL;
  2339. | 0E7H: Instr (opOUT); Ib; eAX;
  2340. | 0E8H: Instr (opCALL); Jz;
  2341. | 0E9H: Instr (opJMP); Jz;
  2342. | 0EBH: Instr (opJMP); Jb;
  2343. | 0ECH: Instr (opIN); AL; DX;
  2344. | 0EDH: Instr (opIN); eAX; DX;
  2345. | 0EEH: Instr (opOUT); DX; AL;
  2346. | 0EFH: Instr (opOUT); DX; eAX;
  2347. | 0F0H: Instr (opINT); AddImm (1);
  2348. | 0F4H: Instr (opHLT);
  2349. | 0F5H: Instr (opCMC);
  2350. | 0F6H..0F7H: Group3;
  2351. | 0F8H: Instr (opCLC);
  2352. | 0F9H: Instr (opSTC);
  2353. | 0FAH: Instr (opCLI);
  2354. | 0FBH: Instr (opSTI);
  2355. | 0FCH: Instr (opCLD);
  2356. | 0FDH: Instr (opSTD);
  2357. | 0FEH: Group4;
  2358. | 0FFH: Group5;
  2359. ELSE
  2360. CASE code OF
  2361. | 00F00H: Group6;
  2362. | 00F01H: Group7;
  2363. | 00F02H: Instr (opLAR); Gv; Ew;
  2364. | 00F03H: Instr (opLSL); Gv; Ew;
  2365. | 00F05H: Instr (opSYSCALL);
  2366. | 00F06H: Instr (opCLTS);
  2367. | 00F07H: Instr (opSYSRET);
  2368. | 00F08H: Instr (opINVD);
  2369. | 00F09H: Instr (opWBINVD);
  2370. | 00F0BH: Instr (opUD2);
  2371. | 00F0DH: GroupP;
  2372. | 00F0EH: Instr (opFEMMS);
  2373. | 00F0FH: Group3DNow;
  2374. | 00F10H:
  2375. IF Prefix (prF3) THEN Instr (opMOVSS); Vdqss; Wss;
  2376. ELSIF Prefix (pr66) THEN Instr (opMOVUPD); Vpd; Wpd;
  2377. ELSIF Prefix (prF2) THEN Instr (opMOVSD); Vdqsd; Wsd;
  2378. ELSE Instr (opMOVUPS); Vps; Wps; END;
  2379. | 00F11H:
  2380. IF Prefix (prF3) THEN Instr (opMOVSS); Wss; Vss;
  2381. ELSIF Prefix (pr66) THEN Instr (opMOVUPD); Wpd; Vpd;
  2382. ELSIF Prefix (prF2) THEN Instr (opMOVSD); Wsd; Vsd;
  2383. ELSE Instr (opMOVUPS); Wsd; Vsd; END;
  2384. | 00F12H:
  2385. IF Prefix (prF3) THEN Instr (opMOVSLDUP); Vps; Wps;
  2386. ELSIF Prefix (pr66) THEN Instr (opMOVLPD); Vsd; Mq;
  2387. ELSIF Prefix (prF2) THEN Instr (opMOVDDUP); Vpd; Wsd;
  2388. ELSE ModRM;
  2389. IF mod = 3 THEN Instr (opMOVHLPS); Vps; VRq;
  2390. ELSE Instr (opMOVLPS); Vps; Mq; END;
  2391. END;
  2392. | 00F13H:
  2393. IF Prefix (prF3) THEN Invalid;
  2394. ELSIF Prefix (pr66) THEN Instr (opMOVLPD); Mq; Vsd;
  2395. ELSIF Prefix (prF2) THEN Invalid;
  2396. ELSE Instr (opMOVLPS); Mq; Vps; END;
  2397. | 00F14H:
  2398. IF Prefix (prF3) THEN Invalid;
  2399. ELSIF Prefix (pr66) THEN Instr (opUNPCKLPD); Vpd; Wq;
  2400. ELSIF Prefix (prF2) THEN Invalid;
  2401. ELSE Instr (opUNPCKLPS); Vps; Wq; END;
  2402. | 00F15H:
  2403. IF Prefix (prF3) THEN Invalid;
  2404. ELSIF Prefix (pr66) THEN Instr (opUNPCKHPD); Vpd; Wq;
  2405. ELSIF Prefix (prF2) THEN Invalid;
  2406. ELSE Instr (opUNPCKHPS); Vps; Wq; END;
  2407. | 00F16H:
  2408. IF Prefix (prF3) THEN Instr (opMOVSHDUP); Vps; Wps;
  2409. ELSIF Prefix (pr66) THEN Instr (opMOVHPD); Vsd; Mq;
  2410. ELSIF Prefix (prF2) THEN Invalid;
  2411. ELSE ModRM;
  2412. IF mod = 3 THEN Instr (opMOVLHPS); Vps; VRq;
  2413. ELSE Instr (opMOVHPS); Vps; Mq; END;
  2414. END;
  2415. | 00F17H:
  2416. IF Prefix (prF3) THEN Invalid;
  2417. ELSIF Prefix (pr66) THEN Instr (opMOVHPD); Mq; Vsd;
  2418. ELSIF Prefix (prF2) THEN Invalid;
  2419. ELSE Instr (opMOVHPS); Mq; Vps; END;
  2420. | 00F18H: Group16;
  2421. | 00F19H..00F1FH: Instr (opNOP); ModRM;
  2422. | 00F20H: Instr (opMOV); Rdq; Cdq;
  2423. | 00F21H: Instr (opMOV); Rdq; Ddq;
  2424. | 00F22H: Instr (opMOV); Cdq; Rdq;
  2425. | 00F23H: Instr (opMOV); Ddq; Rdq;
  2426. | 00F28H:
  2427. IF Prefix (prF3) THEN Invalid;
  2428. ELSIF Prefix (pr66) THEN Instr (opMOVAPD); Vpd; Wpd;
  2429. ELSIF Prefix (prF2) THEN Invalid;
  2430. ELSE Instr (opMOVAPS); Vps; Wps; END;
  2431. | 00F29H:
  2432. IF Prefix (prF3) THEN Invalid;
  2433. ELSIF Prefix (pr66) THEN Instr (opMOVAPD); Wpd; Vpd;
  2434. ELSIF Prefix (prF2) THEN Invalid;
  2435. ELSE Instr (opMOVAPS); Wps; Vps; END;
  2436. | 00F2AH:
  2437. IF Prefix (prF3) THEN Instr (opCVTSI2SS); Vss; Edq;
  2438. ELSIF Prefix (pr66) THEN Instr (opCVTPI2PD); Vpd; Qq;
  2439. ELSIF Prefix (prF2) THEN Instr (opCVTSI2SD); Vsd; Edq;
  2440. ELSE Instr (opCVTPI2PS); Vps; Qq; END;
  2441. | 00F2BH:
  2442. IF Prefix (prF3) THEN Invalid;
  2443. ELSIF Prefix (pr66) THEN Instr (opMOVNTPD); Mdq; Vpd;
  2444. ELSIF Prefix (prF2) THEN Invalid;
  2445. ELSE Instr (opMOVNTPS); Mdq; Vps; END;
  2446. | 00F2CH:
  2447. IF Prefix (prF3) THEN Instr (opCVTTSS2SI); Gdq; Wss;
  2448. ELSIF Prefix (pr66) THEN Instr (opCVTTPD2PI); Pq; Wpd;
  2449. ELSIF Prefix (prF2) THEN Instr (opCVTTSD2SI); Gdq; Wsd;
  2450. ELSE Instr (opCVTTPS2PI); Pq; Wps; END;
  2451. | 00F2DH:
  2452. IF Prefix (prF3) THEN Instr (opCVTSS2SI); Gdq; Wss;
  2453. ELSIF Prefix (pr66) THEN Instr (opCVTPD2PI); Pq; Wpd;
  2454. ELSIF Prefix (prF2) THEN Instr (opCVTSD2SI); Gdq; Wsd;
  2455. ELSE Instr (opCVTPS2PI); Pq; Wps; END;
  2456. | 00F2EH:
  2457. IF Prefix (prF3) THEN Invalid;
  2458. ELSIF Prefix (pr66) THEN Instr (opUCOMISD); Vsd; Wsd;
  2459. ELSIF Prefix (prF2) THEN Invalid;
  2460. ELSE Instr (opUCOMISS); Vss; Wss; END;
  2461. | 00F2FH:
  2462. IF Prefix (prF3) THEN Invalid;
  2463. ELSIF Prefix (pr66) THEN Instr (opCOMISD); Vpd; Wsd;
  2464. ELSIF Prefix (prF2) THEN Invalid;
  2465. ELSE Instr (opCOMISS); Vps; Wps; END;
  2466. | 00F30H: Instr (opWRMSR);
  2467. | 00F31H: Instr (opRDTSC);
  2468. | 00F32H: Instr (opRDMSR);
  2469. | 00F33H: Instr (opRDPMC);
  2470. | 00F40H: Instr (opMOVO); Gv; Ev;
  2471. | 00F41H: Instr (opMOVNO); Gv; Ev;
  2472. | 00F42H: Instr (opMOVB); Gv; Ev;
  2473. | 00F43H: Instr (opMOVNB); Gv; Ev;
  2474. | 00F44H: Instr (opMOVE); Gv; Ev;
  2475. | 00F45H: Instr (opMOVNE); Gv; Ev;
  2476. | 00F46H: Instr (opMOVBE); Gv; Ev;
  2477. | 00F47H: Instr (opMOVNBE); Gv; Ev;
  2478. | 00F48H: Instr (opMOVA); Gv; Ev;
  2479. | 00F49H: Instr (opMOVS); Gv; Ev;
  2480. | 00F4AH: Instr (opMOVP); Gv; Ev;
  2481. | 00F4BH: Instr (opMOVNP); Gv; Ev;
  2482. | 00F4CH: Instr (opMOVL); Gv; Ev;
  2483. | 00F4DH: Instr (opMOVGE); Gv; Ev;
  2484. | 00F4EH: Instr (opMOVLE); Gv; Ev;
  2485. | 00F4FH: Instr (opMOVG); Gv; Ev;
  2486. | 00F50H:
  2487. IF Prefix (prF3) THEN Invalid;
  2488. ELSIF Prefix (pr66) THEN Instr (opMOVMSKPD); Gd; VRpd;
  2489. ELSIF Prefix (prF2) THEN Invalid;
  2490. ELSE Instr (opMOVMSKPS); Gd; VRps; END;
  2491. | 00F51H:
  2492. IF Prefix (prF3) THEN Instr (opSQRTSS); Vss; Wss;
  2493. ELSIF Prefix (pr66) THEN Instr (opSQRTPD); Vpd; Wpd;
  2494. ELSIF Prefix (prF2) THEN Instr (opSQRTSD); Vsd; Wsd;
  2495. ELSE Instr (opSQRTPS); Vps; Wps; END;
  2496. | 00F52H:
  2497. IF Prefix (prF3) THEN Instr (opRSQRTSS); Vss; Wss;
  2498. ELSIF Prefix (pr66) THEN Invalid;
  2499. ELSIF Prefix (prF2) THEN Invalid;
  2500. ELSE Instr (opRSQRTPS); Vps; Wps; END;
  2501. | 00F53H:
  2502. IF Prefix (prF3) THEN Instr (opRCPSS); Vss; Wss;
  2503. ELSIF Prefix (pr66) THEN Invalid;
  2504. ELSIF Prefix (prF2) THEN Invalid;
  2505. ELSE Instr (opRCPPS); Vps; Wps; END;
  2506. | 00F54H:
  2507. IF Prefix (prF3) THEN Invalid;
  2508. ELSIF Prefix (pr66) THEN Instr (opANDPS); Vps; Wps;
  2509. ELSIF Prefix (prF2) THEN Invalid;
  2510. ELSE Instr (opANDPD); Vpd; Wpd; END;
  2511. | 00F55H:
  2512. IF Prefix (prF3) THEN Invalid;
  2513. ELSIF Prefix (pr66) THEN Instr (opANDNPS); Vps; Wps;
  2514. ELSIF Prefix (prF2) THEN Invalid;
  2515. ELSE Instr (opANDNPD); Vpd; Wpd; END;
  2516. | 00F56H:
  2517. IF Prefix (prF3) THEN Invalid;
  2518. ELSIF Prefix (pr66) THEN Instr (opORPS); Vps; Wps;
  2519. ELSIF Prefix (prF2) THEN Invalid;
  2520. ELSE Instr (opORPD); Vpd; Wpd; END;
  2521. | 00F57H:
  2522. IF Prefix (prF3) THEN Invalid;
  2523. ELSIF Prefix (pr66) THEN Instr (opXORPS); Vps; Wps;
  2524. ELSIF Prefix (prF2) THEN Invalid;
  2525. ELSE Instr (opXORPD); Vpd; Wpd; END;
  2526. | 00F58H:
  2527. IF Prefix (prF3) THEN Instr (opADDSS); Vss; Wss;
  2528. ELSIF Prefix (pr66) THEN Instr (opADDPD); Vpd; Wpd;
  2529. ELSIF Prefix (prF2) THEN Instr (opADDSD); Vsd; Wsd;
  2530. ELSE Instr (opADDPS); Vps; Wps; END;
  2531. | 00F59H:
  2532. IF Prefix (prF3) THEN Instr (opMULSS); Vss; Wss;
  2533. ELSIF Prefix (pr66) THEN Instr (opMULPD); Vpd; Wpd;
  2534. ELSIF Prefix (prF2) THEN Instr (opMULSD); Vsd; Wsd;
  2535. ELSE Instr (opMULPS); Vps; Wps; END;
  2536. | 00F5AH:
  2537. IF Prefix (prF3) THEN Instr (opCVTSS2SD); Vsd; Wss;
  2538. ELSIF Prefix (pr66) THEN Instr (opCVTPD2PS); Vps; Wpd;
  2539. ELSIF Prefix (prF2) THEN Instr (opCVTSD2SS); Vss; Wsd;
  2540. ELSE Instr (opCVTPS2PD); Vpd; Wps; END;
  2541. | 00F5BH:
  2542. IF Prefix (prF3) THEN Instr (opCVTTPS2DQ); Vdq; Wps;
  2543. ELSIF Prefix (pr66) THEN Instr (opCVTPS2DQ); Vdq; Wps;
  2544. ELSIF Prefix (prF2) THEN Invalid;
  2545. ELSE Instr (opCVTDQ2PS); Vpd; Wdq; END;
  2546. | 00F5CH:
  2547. IF Prefix (prF3) THEN Instr (opSUBSS); Vss; Wss;
  2548. ELSIF Prefix (pr66) THEN Instr (opSUBPD); Vpd; Wpd;
  2549. ELSIF Prefix (prF2) THEN Instr (opSUBSD); Vsd; Wsd;
  2550. ELSE Instr (opSUBPS); Vps; Wps; END;
  2551. | 00F5DH:
  2552. IF Prefix (prF3) THEN Instr (opMINSS); Vss; Wss;
  2553. ELSIF Prefix (pr66) THEN Instr (opMINPD); Vpd; Wpd;
  2554. ELSIF Prefix (prF2) THEN Instr (opMINSD); Vsd; Wsd;
  2555. ELSE Instr (opMINPS); Vps; Wps; END;
  2556. | 00F5EH:
  2557. IF Prefix (prF3) THEN Instr (opDIVSS); Vss; Wss;
  2558. ELSIF Prefix (pr66) THEN Instr (opDIVPD); Vpd; Wpd;
  2559. ELSIF Prefix (prF2) THEN Instr (opDIVSD); Vsd; Wsd;
  2560. ELSE Instr (opDIVPS); Vps; Wps; END;
  2561. | 00F5FH:
  2562. IF Prefix (prF3) THEN Instr (opMAXSS); Vss; Wss;
  2563. ELSIF Prefix (pr66) THEN Instr (opMAXPD); Vpd; Wpd;
  2564. ELSIF Prefix (prF2) THEN Instr (opMAXSD); Vsd; Wsd;
  2565. ELSE Instr (opMAXPS); Vps; Wps; END;
  2566. | 00F60H:
  2567. IF Prefix (prF3) THEN Invalid;
  2568. ELSIF Prefix (pr66) THEN Instr (opPUNPCKLBW); Vdq; Wq;
  2569. ELSIF Prefix (prF2) THEN Invalid;
  2570. ELSE Instr (opPUNPCKLBW); Pq; Qd; END;
  2571. | 00F61H:
  2572. IF Prefix (prF3) THEN Invalid;
  2573. ELSIF Prefix (pr66) THEN Instr (opPUNPCKLWD); Vdq; Wq;
  2574. ELSIF Prefix (prF2) THEN Invalid;
  2575. ELSE Instr (opPUNPCKLWD); Pq; Qd; END;
  2576. | 00F62H:
  2577. IF Prefix (prF3) THEN Invalid;
  2578. ELSIF Prefix (pr66) THEN Instr (opPUNPCKLDQ); Vdq; Wq;
  2579. ELSIF Prefix (prF2) THEN Invalid;
  2580. ELSE Instr (opPUNPCKLDQ); Pq; Qd; END;
  2581. | 00F63H:
  2582. IF Prefix (prF3) THEN Invalid;
  2583. ELSIF Prefix (pr66) THEN Instr (opPACKSSWB); Vdq; Wdq;
  2584. ELSIF Prefix (prF2) THEN Invalid;
  2585. ELSE Instr (opPACKSSWB); Pq; Qq; END;
  2586. | 00F64H:
  2587. IF Prefix (prF3) THEN Invalid;
  2588. ELSIF Prefix (pr66) THEN Instr (opPCMPGTB); Vdq; Wdq;
  2589. ELSIF Prefix (prF2) THEN Invalid;
  2590. ELSE Instr (opPCMPGTB); Pq; Qq; END;
  2591. | 00F65H:
  2592. IF Prefix (prF3) THEN Invalid;
  2593. ELSIF Prefix (pr66) THEN Instr (opPCMPGTW); Vdq; Wdq;
  2594. ELSIF Prefix (prF2) THEN Invalid;
  2595. ELSE Instr (opPCMPGTW); Pq; Qq; END;
  2596. | 00F66H:
  2597. IF Prefix (prF3) THEN Invalid;
  2598. ELSIF Prefix (pr66) THEN Instr (opPCMPGTD); Vdq; Wdq;
  2599. ELSIF Prefix (prF2) THEN Invalid;
  2600. ELSE Instr (opPCMPGTD); Pq; Qq; END;
  2601. | 00F67H:
  2602. IF Prefix (prF3) THEN Invalid;
  2603. ELSIF Prefix (pr66) THEN Instr (opPACKUSWB); Vdq; Wdq;
  2604. ELSIF Prefix (prF2) THEN Invalid;
  2605. ELSE Instr (opPACKUSWB); Pq; Qq; END;
  2606. | 00F68H:
  2607. IF Prefix (prF3) THEN Invalid;
  2608. ELSIF Prefix (pr66) THEN Instr (opPUNPCKHBW); Vdq; Wq;
  2609. ELSIF Prefix (prF2) THEN Invalid;
  2610. ELSE Instr (opPUNPCKHBW); Pq; Qd; END;
  2611. | 00F69H:
  2612. IF Prefix (prF3) THEN Invalid;
  2613. ELSIF Prefix (pr66) THEN Instr (opPUNPCKHWD); Vdq; Wq;
  2614. ELSIF Prefix (prF2) THEN Invalid;
  2615. ELSE Instr (opPUNPCKHWD); Pq; Qd; END;
  2616. | 00F6AH:
  2617. IF Prefix (prF3) THEN Invalid;
  2618. ELSIF Prefix (pr66) THEN Instr (opPUNPCKHDQ); Vdq; Wq;
  2619. ELSIF Prefix (prF2) THEN Invalid;
  2620. ELSE Instr (opPUNPCKHDQ); Pq; Qd; END;
  2621. | 00F6BH:
  2622. IF Prefix (prF3) THEN Invalid;
  2623. ELSIF Prefix (pr66) THEN Instr (opPACKSSDW); Vdq; Wdq;
  2624. ELSIF Prefix (prF2) THEN Invalid;
  2625. ELSE Instr (opPACKSSDW); Pq; Qq; END;
  2626. | 00F6CH:
  2627. IF Prefix (pr66) THEN Instr (opPUNPCKLQDQ); Vdq; Wq;
  2628. ELSE Invalid; END;
  2629. | 00F6DH:
  2630. IF Prefix (pr66) THEN Instr (opPUNPCKHQDQ); Vdq; Wq;
  2631. ELSE Invalid; END;
  2632. | 00F6EH:
  2633. IF Prefix (prF3) THEN Invalid;
  2634. ELSIF Prefix (pr66) THEN Instr (opMOVD); Vdq; Edq;
  2635. ELSIF Prefix (prF2) THEN Invalid;
  2636. ELSE Instr (opMOVD); Pq; Edq; END;
  2637. | 00F6FH:
  2638. IF Prefix (prF3) THEN Instr (opMOVDQU); Vdq; Wdq;
  2639. ELSIF Prefix (pr66) THEN Instr (opMOVDQA); Vdq; Edq;
  2640. ELSIF Prefix (prF2) THEN Invalid;
  2641. ELSE Instr (opMOVQ); Pq; Qq; END;
  2642. | 00F70H:
  2643. IF Prefix (prF3) THEN Instr (opPSHUFHW); Vq; Wq; Ib;
  2644. ELSIF Prefix (pr66) THEN Instr (opPSHUFD); Vdq; Wdq; Ib;
  2645. ELSIF Prefix (prF2) THEN Instr (opPSHUFLW); Vq; Wq; Ib;
  2646. ELSE Instr (opPSHUFW); Pq; Qq; Ib; END;
  2647. | 00F71H:
  2648. IF Prefix (prF3) THEN Invalid;
  2649. ELSIF Prefix (pr66) THEN Group12;
  2650. ELSIF Prefix (prF2) THEN Invalid;
  2651. ELSE Group12; END;
  2652. | 00F72H:
  2653. IF Prefix (prF3) THEN Invalid;
  2654. ELSIF Prefix (pr66) THEN Group13;
  2655. ELSIF Prefix (prF2) THEN Invalid;
  2656. ELSE Group13; END;
  2657. | 00F73H:
  2658. IF Prefix (prF3) THEN Invalid;
  2659. ELSIF Prefix (pr66) THEN Group14;
  2660. ELSIF Prefix (prF2) THEN Invalid;
  2661. ELSE Group14; END;
  2662. | 00F74H:
  2663. IF Prefix (prF3) THEN Invalid;
  2664. ELSIF Prefix (pr66) THEN Instr (opPCMPEQB); Vdq; Wdq;
  2665. ELSIF Prefix (prF2) THEN Invalid;
  2666. ELSE Instr (opPCMPEQB); Pq; Qq; END;
  2667. | 00F75H:
  2668. IF Prefix (prF3) THEN Invalid;
  2669. ELSIF Prefix (pr66) THEN Instr (opPCMPEQW); Vdq; Wdq;
  2670. ELSIF Prefix (prF2) THEN Invalid;
  2671. ELSE Instr (opPCMPEQW); Pq; Qq; END;
  2672. | 00F76H:
  2673. IF Prefix (prF3) THEN Invalid;
  2674. ELSIF Prefix (pr66) THEN Instr (opPCMPEQD); Vdq; Wdq;
  2675. ELSIF Prefix (prF2) THEN Invalid;
  2676. ELSE Instr (opPCMPEQD); Pq; Qq; END;
  2677. | 00F77H:
  2678. IF Prefix (prF3) THEN Invalid;
  2679. ELSIF Prefix (pr66) THEN Invalid;
  2680. ELSIF Prefix (prF2) THEN Invalid;
  2681. ELSE Instr (opEMMS); END;
  2682. | 00F7CH:
  2683. IF Prefix (prF3) THEN Invalid;
  2684. ELSIF Prefix (pr66) THEN Instr (opHADDPD); Vpd; Wpd;
  2685. ELSIF Prefix (prF2) THEN Instr (opHADDPS); Vps; Wps;
  2686. ELSE Invalid; END;
  2687. | 00F7DH:
  2688. IF Prefix (prF3) THEN Invalid;
  2689. ELSIF Prefix (pr66) THEN Instr (opHSUBPD); Vpd; Wpd;
  2690. ELSIF Prefix (prF2) THEN Instr (opHSUBPS); Vps; Wps;
  2691. ELSE Invalid; END;
  2692. | 00F7EH:
  2693. IF Prefix (prF3) THEN Instr (opMOVQ); Vq; Wq;
  2694. ELSIF Prefix (pr66) THEN Instr (opMOVD); Edq; Vdq;
  2695. ELSIF Prefix (prF2) THEN Invalid;
  2696. ELSE Instr (opMOVD); Edq; Pdq; END;
  2697. | 00F7FH:
  2698. IF Prefix (prF3) THEN Instr (opMOVDQU); Wdq; Vdq;
  2699. ELSIF Prefix (pr66) THEN Instr (opMOVDQA); Wdq; Vdq;
  2700. ELSIF Prefix (prF2) THEN Invalid;
  2701. ELSE Instr (opMOVQ); Qq; Pq; END;
  2702. | 00F80H: Instr (opJO); Jz;
  2703. | 00F81H: Instr (opJNO); Jz;
  2704. | 00F82H: Instr (opJB); Jz;
  2705. | 00F83H: Instr (opJNB); Jz;
  2706. | 00F84H: Instr (opJE); Jz;
  2707. | 00F85H: Instr (opJNE); Jz;
  2708. | 00F86H: Instr (opJBE); Jz;
  2709. | 00F87H: Instr (opJNBE); Jz;
  2710. | 00F88H: Instr (opJA); Jz;
  2711. | 00F89H: Instr (opJS); Jz;
  2712. | 00F8AH: Instr (opJP); Jz;
  2713. | 00F8BH: Instr (opJNP); Jz;
  2714. | 00F8CH: Instr (opJL); Jz;
  2715. | 00F8DH: Instr (opJGE); Jz;
  2716. | 00F8EH: Instr (opJLE); Jz;
  2717. | 00F8FH: Instr (opJG); Jz;
  2718. | 00F90H: Instr (opSETO); Eb;
  2719. | 00F91H: Instr (opSETNO); Eb;
  2720. | 00F92H: Instr (opSETB); Eb;
  2721. | 00F93H: Instr (opSETNB); Eb;
  2722. | 00F94H: Instr (opSETE); Eb;
  2723. | 00F95H: Instr (opSETNE); Eb;
  2724. | 00F96H: Instr (opSETBE); Eb;
  2725. | 00F97H: Instr (opSETNBE); Eb;
  2726. | 00F98H: Instr (opSETA); Eb;
  2727. | 00F99H: Instr (opSETS); Eb;
  2728. | 00F9AH: Instr (opSETP); Eb;
  2729. | 00F9BH: Instr (opSETNP); Eb;
  2730. | 00F9CH: Instr (opSETL); Eb;
  2731. | 00F9DH: Instr (opSETGE); Eb;
  2732. | 00F9EH: Instr (opSETLE); Eb;
  2733. | 00F9FH: Instr (opSETG); Eb;
  2734. | 00FA0H: Instr (opPUSH); FS;
  2735. | 00FA1H: Instr (opPOP); FS;
  2736. | 00FA2H: Instr (opCPUID);
  2737. | 00FA3H: Instr (opBT); Ev; Gv;
  2738. | 00FA4H: Instr (opSHLD); Ev; Gv; Ib;
  2739. | 00FA5H: Instr (opSHLD); Ev; Gv; CL;
  2740. | 00FA8H: Instr (opPUSH); FS;
  2741. | 00FA9H: Instr (opPOP); FS;
  2742. | 00FAAH: Instr (opRSM);
  2743. | 00FABH: Instr (opBTS); Ev; Gv;
  2744. | 00FACH: Instr (opSHRD); Ev; Gv; Ib;
  2745. | 00FADH: Instr (opSHRD); Ev; Gv; CL;
  2746. | 00FAEH: Group15;
  2747. | 00FAFH: Instr (opIMUL); Gv; Ev;
  2748. | 00FB0H: Instr (opCMPXCHG); Eb; Gb;
  2749. | 00FB1H: Instr (opCMPXCHG); Ev; Gv;
  2750. | 00FB2H: Instr (opLSS); Gz; Mp;
  2751. | 00FB3H: Instr (opBTR); Ev; Gv;
  2752. | 00FB4H: Instr (opLFS); Gz; Mp;
  2753. | 00FB5H: Instr (opLGS); Gz; Mp;
  2754. | 00FB6H: Instr (opMOVZX); Gv; Eb;
  2755. | 00FB7H: Instr (opMOVZX); Gv; Ew;
  2756. | 00FB9H: Group10;
  2757. | 00FBAH: Group8;
  2758. | 00FBBH: Instr (opBTC); Ev; Gv;
  2759. | 00FBCH: Instr (opBSF); Gv; Ev;
  2760. | 00FBDH: Instr (opBSR); Gv; Ev;
  2761. | 00FBEH: Instr (opMOVSX); Gv; Eb;
  2762. | 00FBFH: Instr (opMOVSX); Gv; Ew;
  2763. | 00FC0H: Instr (opXADD); Eb; Gb;
  2764. | 00FC1H: Instr (opXADD); Ev; Gv;
  2765. | 00FC2H:
  2766. IF Prefix (prF3) THEN Instr (opCMPSS); Vss; Wss; Ib;
  2767. ELSIF Prefix (pr66) THEN Instr (opCMPPD); Vpd; Wpd; Ib;
  2768. ELSIF Prefix (prF2) THEN Instr (opCMPSD); Vsd; Wsd; Ib;
  2769. ELSE Instr (opCMPPS); Vps; Wps; Ib; END;
  2770. | 00FC3H:
  2771. IF Prefix (prF3) THEN Invalid;
  2772. ELSIF Prefix (pr66) THEN Invalid;
  2773. ELSIF Prefix (prF2) THEN Invalid;
  2774. ELSE Instr (opMOVNTI); Mdq; Gdq; END;
  2775. | 00FC4H:
  2776. IF Prefix (prF3) THEN Invalid;
  2777. ELSIF Prefix (pr66) THEN Instr (opPINSRW); Vdq; Ew; Ib;
  2778. ELSIF Prefix (prF2) THEN Invalid;
  2779. ELSE Instr (opPINSRW); Pq; Ew; Ib; END;
  2780. | 00FC5H:
  2781. IF Prefix (prF3) THEN Invalid;
  2782. ELSIF Prefix (pr66) THEN Instr (opPEXTRW); Gd; VRdq; Ib;
  2783. ELSIF Prefix (prF2) THEN Invalid;
  2784. ELSE Instr (opPEXTRW); Gd; PRq; Ib; END;
  2785. | 00FC6H:
  2786. IF Prefix (prF3) THEN Invalid;
  2787. ELSIF Prefix (pr66) THEN Instr (opSHUFPD); Vpd; Wpd; Ib;
  2788. ELSIF Prefix (prF2) THEN Invalid;
  2789. ELSE Instr (opSHUFPS); Vps; Wps; Ib; END;
  2790. | 00FC7H: Group9;
  2791. | 00FC8H..00FCFH: Instr (opBSWAP); AddReg (GetReg (regEAX, (code - 00FC8H) MOD 8, prREXB IN opc.prefixes)); Iv;
  2792. | 00FD0H:
  2793. IF Prefix (prF3) THEN Invalid;
  2794. ELSIF Prefix (pr66) THEN Instr (opADDSUBPD); Vpd; Wpd;
  2795. ELSIF Prefix (prF2) THEN Instr (opADDSUBPS); Vps; Wps;
  2796. ELSE Invalid; END;
  2797. | 00FD1H: Type3 (opPSRLW);
  2798. | 00FD2H: Type3 (opPSRLD);
  2799. | 00FD3H: Type3 (opPSRLQ);
  2800. | 00FD4H: Type3 (opPADDQ);
  2801. | 00FD5H: Type3 (opPMULLW);
  2802. | 00FD6H:
  2803. IF Prefix (prF3) THEN Instr (opMOVQ2DQ); Vdq; PRq;
  2804. ELSIF Prefix (pr66) THEN Instr (opMOVQ); Wq; Vq;
  2805. ELSIF Prefix (prF2) THEN Instr (opMOVDQ2Q); Pq; VRq;
  2806. ELSE Invalid; END;
  2807. | 00FD7H:
  2808. IF Prefix (prF3) THEN Invalid;
  2809. ELSIF Prefix (pr66) THEN Instr (opPMOVMSKB); Gd; VRdq;
  2810. ELSIF Prefix (prF2) THEN Invalid;
  2811. ELSE Instr (opPMOVMSKB); Gd; PRq; END;
  2812. | 00FD8H: Type3 (opPSUBUSB);
  2813. | 00FD9H: Type3 (opPSUBUSW);
  2814. | 00FDAH: Type3 (opPMINUB);
  2815. | 00FDBH: Type3 (opPAND);
  2816. | 00FDCH: Type3 (opPADDUSB);
  2817. | 00FDDH: Type3 (opPADDUSW);
  2818. | 00FDEH: Type3 (opPMAXUB);
  2819. | 00FDFH: Type3 (opPANDN);
  2820. | 00FE0H: Type3 (opPAVGB);
  2821. | 00FE1H: Type3 (opPSRAW);
  2822. | 00FE2H: Type3 (opPSRAD);
  2823. | 00FE3H: Type3 (opPAVGW);
  2824. | 00FE4H: Type3 (opPMULHUW);
  2825. | 00FE5H: Type3 (opPMULHW);
  2826. | 00FE6H:
  2827. IF Prefix (prF3) THEN Instr (opCVTDQ2PD); Vpd; Wq;
  2828. ELSIF Prefix (pr66) THEN Instr (opCVTTPD2DQ); Vq; Wpd;
  2829. ELSIF Prefix (prF2) THEN Instr (opPSADBW); Pq; Qq;
  2830. ELSE Invalid; END;
  2831. | 00FE7H:
  2832. IF Prefix (prF3) THEN Invalid;
  2833. ELSIF Prefix (pr66) THEN Instr (opMOVNTDQ); Mdq; Vdq;
  2834. ELSIF Prefix (prF2) THEN Invalid;
  2835. ELSE Instr (opMOVNTQ); Mq; Pq; END;
  2836. | 00FE8H: Type3 (opPSUBSB);
  2837. | 00FE9H: Type3 (opPSUBSW);
  2838. | 00FEAH: Type3 (opPMINSW);
  2839. | 00FEBH: Type3 (opPOR);
  2840. | 00FECH: Type3 (opPADDSB);
  2841. | 00FEDH: Type3 (opPADDSW);
  2842. | 00FEEH: Type3 (opPMAXSW);
  2843. | 00FEFH: Type3 (opPXOR);
  2844. | 00FF0H:
  2845. IF Prefix (prF3) THEN Invalid;
  2846. ELSIF Prefix (pr66) THEN Invalid;
  2847. ELSIF Prefix (prF2) THEN Instr (opLDDQU); Vpd; Mdq;
  2848. ELSE Invalid; END;
  2849. | 00FF1H: Type3 (opPSLLW);
  2850. | 00FF2H: Type3 (opPSLLD);
  2851. | 00FF3H: Type3 (opPSLLQ);
  2852. | 00FF4H: Type3 (opPMULUDQ);
  2853. | 00FF5H: Type3 (opPMADDWD);
  2854. | 00FF6H: Type3 (opPSADBW);
  2855. | 00FF7H:
  2856. IF Prefix (prF3) THEN Invalid;
  2857. ELSIF Prefix (pr66) THEN Instr (opMASKMOVDQU); Vdq; VRdq;
  2858. ELSIF Prefix (prF2) THEN Invalid;
  2859. ELSE Instr (opMASKMOVQ); Pq; PRq; END;
  2860. | 00FF8H: Type3 (opPSUBB);
  2861. | 00FF9H: Type3 (opPSUBW);
  2862. | 00FFAH: Type3 (opPSUBD);
  2863. | 00FFBH: Type3 (opPSUBQ);
  2864. | 00FFCH: Type3 (opPADDB);
  2865. | 00FFDH: Type3 (opPADDW);
  2866. | 00FFEH: Type3 (opPADDD);
  2867. ELSE
  2868. Invalid;
  2869. END;
  2870. END;
  2871. WHILE arg < maxArgs DO
  2872. opc.arg[arg] := NIL; INC (arg);
  2873. END
  2874. END DecodeThis;
  2875. END AMD64Decoder;
  2876. PROCEDURE PrintReg (w : Streams.Writer; reg : LONGINT);
  2877. BEGIN
  2878. CASE reg OF
  2879. | regAL: w.String ("AL");
  2880. | regCL: w.String ("CL");
  2881. | regDL: w.String ("DL");
  2882. | regBL: w.String ("BL");
  2883. | regAH: w.String ("AH");
  2884. | regCH: w.String ("CH");
  2885. | regDH: w.String ("DH");
  2886. | regBH: w.String ("BH");
  2887. | regSPL: w.String ("SPL");
  2888. | regBPL: w.String ("BPL");
  2889. | regSIL: w.String ("SIL");
  2890. | regDIL: w.String ("DIL");
  2891. | regR8B: w.String ("R8B");
  2892. | regR9B: w.String ("R9B");
  2893. | regR10B: w.String ("R10B");
  2894. | regR11B: w.String ("R11B");
  2895. | regR12B: w.String ("R12B");
  2896. | regR13B: w.String ("R13B");
  2897. | regR14B: w.String ("R14B");
  2898. | regR15B: w.String ("R15B");
  2899. | regAX: w.String ("AX");
  2900. | regCX: w.String ("CX");
  2901. | regDX: w.String ("DX");
  2902. | regBX: w.String ("BX");
  2903. | regSP: w.String ("SP");
  2904. | regBP: w.String ("BP");
  2905. | regSI: w.String ("SI");
  2906. | regDI: w.String ("DI");
  2907. | regR8W: w.String ("R8W");
  2908. | regR9W: w.String ("R9W");
  2909. | regR10W: w.String ("R10W");
  2910. | regR11W: w.String ("R11W");
  2911. | regR12W: w.String ("R12W");
  2912. | regR13W: w.String ("R13W");
  2913. | regR14W: w.String ("R14W");
  2914. | regR15W: w.String ("R15W");
  2915. | regEAX: w.String ("EAX");
  2916. | regECX: w.String ("ECX");
  2917. | regEDX: w.String ("EDX");
  2918. | regEBX: w.String ("EBX");
  2919. | regESP: w.String ("ESP");
  2920. | regEBP: w.String ("EBP");
  2921. | regESI: w.String ("ESI");
  2922. | regEDI: w.String ("EDI");
  2923. | regR8D: w.String ("R8D");
  2924. | regR9D: w.String ("R9D");
  2925. | regR10D: w.String ("R10D");
  2926. | regR11D: w.String ("R11D");
  2927. | regR12D: w.String ("R12D");
  2928. | regR13D: w.String ("R13D");
  2929. | regR14D: w.String ("R14D");
  2930. | regR15D: w.String ("R15D");
  2931. | regRAX: w.String ("RAX");
  2932. | regRCX: w.String ("RCX");
  2933. | regRDX: w.String ("RDX");
  2934. | regRBX: w.String ("RBX");
  2935. | regRSP: w.String ("RSP");
  2936. | regRBP: w.String ("RBP");
  2937. | regRSI: w.String ("RSI");
  2938. | regRDI: w.String ("RDI");
  2939. | regR8: w.String ("R8");
  2940. | regR9: w.String ("R9");
  2941. | regR10: w.String ("R10");
  2942. | regR11: w.String ("R11");
  2943. | regR12: w.String ("R12");
  2944. | regR13: w.String ("R13");
  2945. | regR14: w.String ("R14");
  2946. | regR15: w.String ("R15");
  2947. | regES: w.String ("ES");
  2948. | regCS: w.String ("CS");
  2949. | regSS: w.String ("SS");
  2950. | regDS: w.String ("DS");
  2951. | regFS: w.String ("FS");
  2952. | regGS: w.String ("GS");
  2953. | regST0: w.String ("ST0");
  2954. | regST1: w.String ("ST1");
  2955. | regST2: w.String ("ST2");
  2956. | regST3: w.String ("ST3");
  2957. | regST4: w.String ("ST4");
  2958. | regST5: w.String ("ST5");
  2959. | regST6: w.String ("ST6");
  2960. | regST7: w.String ("ST7");
  2961. | regCR0: w.String ("CR0");
  2962. | regCR1: w.String ("CR1");
  2963. | regCR2: w.String ("CR2");
  2964. | regCR3: w.String ("CR3");
  2965. | regCR4: w.String ("CR4");
  2966. | regCR5: w.String ("CR5");
  2967. | regCR6: w.String ("CR6");
  2968. | regCR7: w.String ("CR7");
  2969. | regCR8: w.String ("CR8");
  2970. | regCR9: w.String ("CR9");
  2971. | regCR10: w.String ("CR10");
  2972. | regCR11: w.String ("CR11");
  2973. | regCR12: w.String ("CR12");
  2974. | regCR13: w.String ("CR13");
  2975. | regCR14: w.String ("CR14");
  2976. | regDR0: w.String ("DR0");
  2977. | regDR1: w.String ("DR1");
  2978. | regDR2: w.String ("DR2");
  2979. | regDR3: w.String ("DR3");
  2980. | regDR4: w.String ("DR4");
  2981. | regDR5: w.String ("DR5");
  2982. | regDR6: w.String ("DR6");
  2983. | regDR7: w.String ("DR7");
  2984. | regDR8: w.String ("DR8");
  2985. | regDR9: w.String ("DR9");
  2986. | regDR10: w.String ("DR10");
  2987. | regDR11: w.String ("DR11");
  2988. | regDR12: w.String ("DR12");
  2989. | regDR13: w.String ("DR13");
  2990. | regDR14: w.String ("DR14");
  2991. | regXMM0: w.String ("XMM0");
  2992. | regXMM1: w.String ("XMM1");
  2993. | regXMM2: w.String ("XMM2");
  2994. | regXMM3: w.String ("XMM3");
  2995. | regXMM4: w.String ("XMM4");
  2996. | regXMM5: w.String ("XMM5");
  2997. | regXMM6: w.String ("XMM6");
  2998. | regXMM7: w.String ("XMM7");
  2999. | regXMM8: w.String ("XMM8");
  3000. | regXMM9: w.String ("XMM9");
  3001. | regXMM10: w.String ("XMM10");
  3002. | regXMM11: w.String ("XMM11");
  3003. | regXMM12: w.String ("XMM12");
  3004. | regXMM13: w.String ("XMM13");
  3005. | regXMM14: w.String ("XMM14");
  3006. | regMMX0: w.String ("MMX0");
  3007. | regMMX1: w.String ("MMX1");
  3008. | regMMX2: w.String ("MMX2");
  3009. | regMMX3: w.String ("MMX3");
  3010. | regMMX4: w.String ("MMX4");
  3011. | regMMX5: w.String ("MMX5");
  3012. | regMMX6: w.String ("MMX6");
  3013. | regMMX7: w.String ("MMX7");
  3014. | regIP: w.String ("IP");
  3015. | regRIP: w.String ("RIP");
  3016. END
  3017. END PrintReg;
  3018. PROCEDURE PrintImm (n: HUGEINT; w : Streams.Writer);
  3019. VAR high, low: LONGINT;
  3020. BEGIN
  3021. IF (n >= -80H) & (n < 100H) THEN
  3022. w.Int (SYSTEM.VAL (SHORTINT, n), 0);
  3023. ELSE
  3024. SYSTEM.GET (ADDRESSOF (n), low);
  3025. SYSTEM.GET (ADDRESSOF (n) + 4, high);
  3026. IF high # 0 THEN w.Hex (high, 0) END;
  3027. w.Hex (low, 0); w.Char ('H');
  3028. END;
  3029. END PrintImm;
  3030. PROCEDURE AMD64DecoderFactory (reader : Streams.Reader) : Decoder.Decoder;
  3031. VAR
  3032. amd64Decoder : AMD64Decoder;
  3033. BEGIN
  3034. NEW(amd64Decoder, reader);
  3035. RETURN amd64Decoder
  3036. END AMD64DecoderFactory;
  3037. PROCEDURE Init*;
  3038. BEGIN
  3039. Decoder.RegisterDecoder(objFileSuffix, AMD64DecoderFactory, NIL);
  3040. END Init;
  3041. END AMD64Decoder.
  3042. SystemTools.Free AMD64Decoder~
  3043. AMD64Decoder.Init~
  3044. Decoder.Open Test.Abx~
  3045. SystemTools.Free Decoder~
  3046. Decoder.Open Test.Bbx~