FoxAMD64InstructionSet.Mod 143 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231
  1. MODULE FoxAMD64InstructionSet; (** AUTHOR "fof & fn"; PURPOSE "Oberon Compiler:AMD 64 Instruction Set"; **)
  2. (* (c) fof ETH Zürich, 2008 *)
  3. (** This module has been written with inspiration from
  4. -module CCIx86A.Mod : Component Compiler, Intel x86 Backend Assembler, 2005-2007, by Luc Bläser and
  5. -module AsmAMD64.Mod: AMD64 instruction set repository, 2006, by Florian Negele
  6. The instruction set reference generator is built by parsing the file InstructionSetAMD64.txt also written by Florian Negele
  7. Parser for parsing the file is contained in FoxProgTools.Mod
  8. **)
  9. (** referenced literature
  10. [AMD:3] AMD64 Architecture Programmer's Manual Volume 3:General-Purpose and System Instructions
  11. Revision 3.14 September 2007
  12. [AMD:4] AMD64 Architecture Programmer's Manual Volume 4: 128-Bit Media Instructions
  13. Revision 3.14 September 2007
  14. [AMD:5] AMD64 Architecture Programmer's Manual Volume 5: 64-Bit Media and x87 Floating-Point Instructions
  15. Revision 3.14 September 2007
  16. [AMD:SSE5] AMD64 Technology 128-Bit SSE5 Instruction Set
  17. Revision 3.01 August 2007
  18. [INTEL:2A] Intel 64 and IA-32 Architectures Software Developer's Manual Volume 2A: Instruction Set Reference, A-M
  19. September 2008
  20. [INTEL:2B] Intel 64 and IA-32 Architectures Software Developer's Manual Volume 2B: Instruction Set Reference, N-Z
  21. September 2008
  22. **)
  23. IMPORT KernelLog (* debugging *);
  24. CONST
  25. maxCPUs* = 30;
  26. maxNumberOperands*=3; (* maximal two source and one destination operand *)
  27. (* numbers generated by the instruction set parser *)
  28. maxNumberMnemonics = 586;
  29. maxNumberInstructions = 1380;
  30. maxMnemonicNameLength =12;
  31. maxCodeLength* =10;
  32. none* = -1;
  33. bitsDefault*=0;
  34. bits8*=1;
  35. bits16*=2;
  36. bits32*=4;
  37. bits64*=8;
  38. bits128*=16;
  39. (** cpu options **)
  40. cpu8086* = 0;
  41. cpu186* = 1;
  42. cpu286* = 2;
  43. cpu386* = 3;
  44. cpu486* = 4;
  45. cpuPentium* = 5;
  46. cpuP6* = 6;
  47. cpuKatmai* = 7;
  48. cpuWillamette* = 8;
  49. cpuPrescott* = 9;
  50. cpuAMD64* = 10;
  51. (** options selectable with CODE {SYSTEM.....} **)
  52. cpuPrivileged* = 20;
  53. cpuProtected* = 21;
  54. cpuSSE* = 22;
  55. cpuSSE2* = 23;
  56. cpuSSE3* = 24;
  57. cpu3DNow* = 25;
  58. cpuMMX* = 26;
  59. cpuFPU* = 27;
  60. cpuOptions* = {cpuPrivileged .. cpuFPU};
  61. (** instruction options **)
  62. optO16* = 0; (* default 16bit operand size *)
  63. optO32* = 1; (* default 32bit operand size *)
  64. optO64* = 2; (* default 64bit operand size *)
  65. optD64* = 3; (* default 64bit operand size in 64bit mode *)
  66. optNot64* = 4; (* instruction invalid in 64bit mode *)
  67. optA16* = 5; (* default 16bit address size *)
  68. optA32* = 6; (* default 32bit address size *)
  69. optPOP* = 7; (* an operand size override prefix must preceed the instruction *)
  70. optPLOCK* = 8; (* a lock prefix must preceed the instruction *)
  71. optPREP* = 9; (* a repeat prefix must preceed the instruction *)
  72. optPREPN* = 10; (* a repeat prefix must preceed the instruction *)
  73. (*
  74. OCProgTools.Enum -l=1 -e
  75. (** operand types, numbers assigned to the types do not have a special meaning **)
  76. (* register classes first *)
  77. reg8 reg16 reg32 reg64 CRn DRn segReg mmx xmm sti
  78. (* other classes *)
  79. mem imm ioffset pntr1616 pntr1632
  80. (* special registers *)
  81. AL AX CL CR8 CS DS DX EAX ECX ES FS GS RAX SS rAX st0
  82. (* immediates and memory locations *)
  83. imm16 imm32 imm64 imm8
  84. uimm16 uimm32 uimm8
  85. simm16 simm32 simm8
  86. mem128 mem16 mem32 mem64 mem8
  87. moffset16 moffset32 moffset64 moffset8
  88. rel16off rel32off rel8off
  89. (* ambivalent operand types *)
  90. regmem16 regmem32 regmem64 regmem8
  91. mmxmem32 mmxmem64
  92. xmmmem128 xmmmem32 xmmmem64
  93. (* miscellaneous *)
  94. one three
  95. ~
  96. *)
  97. (** operand types, numbers assigned to the types do not have a special meaning **)
  98. (* register classes first *)
  99. reg8*= 0; (* GPR 8 *)
  100. reg16*= 1; (* GPR 16 *)
  101. reg32*= 2; (* GPR 32 *)
  102. reg64*= 3; (* GPR 64 *)
  103. CRn*= 4; (* counter registers *)
  104. DRn*= 5; (* debug registers *)
  105. segReg*= 6; (* segment registers *)
  106. mmx*= 7; (* 64bit mmx registers *)
  107. xmm*= 8; (* 128bit sse registers *)
  108. sti*= 9; (* floating point registers *)
  109. (* other classes *)
  110. mem*= 10; (* memory operands *)
  111. imm*= 11; (* immediate operands *)
  112. ioffset*= 12; (* used for MOV AL/AX/EAX/RAX *)
  113. pntr1616*= 13; (* used for far jumps and calls*)
  114. pntr1632*= 14; (* used for far jumps and calls *)
  115. (* special registers *)
  116. AL*= 15;
  117. AX*= 16;
  118. CL*= 17;
  119. CR8*= 18;
  120. CS*= 19;
  121. DS*= 20;
  122. DX*= 21;
  123. EAX*= 22;
  124. ECX*= 23;
  125. ES*= 24;
  126. FS*= 25;
  127. GS*= 26;
  128. RAX*= 27;
  129. SS*= 28;
  130. rAX*= 29;
  131. st0*= 30;
  132. (* immediates and memory locations *)
  133. imm16*= 31;
  134. imm32*= 32;
  135. imm64*= 33;
  136. imm8*= 34;
  137. uimm16*= 35;
  138. uimm32*= 36;
  139. uimm8*= 37;
  140. simm16*= 38;
  141. simm32*= 39;
  142. simm8*= 40;
  143. mem128*= 41;
  144. mem16*= 42;
  145. mem32*= 43;
  146. mem64*= 44;
  147. mem8*= 45;
  148. moffset16*= 46;
  149. moffset32*= 47;
  150. moffset64*= 48;
  151. moffset8*= 49;
  152. rel16off*= 50;
  153. rel32off*= 51;
  154. rel8off*= 52;
  155. (* ambivalent operand types *)
  156. regmem16*= 53;
  157. regmem32*= 54;
  158. regmem64*= 55;
  159. regmem8*= 56;
  160. mmxmem32*= 57;
  161. mmxmem64*= 58;
  162. xmmmem128*= 59;
  163. xmmmem32*= 60;
  164. xmmmem64*= 61;
  165. (* miscellaneous *)
  166. one*= 62;
  167. three*= 63;
  168. (** prefixes **)
  169. prfOP* = 066H;
  170. prfADR* = 067H;
  171. prfCS* = 02EH; (* ignored in 64bit mode *)
  172. prfDS* = 03EH; (* ignored in 64bit mode *)
  173. prfES* = 026H; (* ignored in 64bit mode *)
  174. prfFS* = 064H;
  175. prfGS* = 065H;
  176. prfSS* = 036H; (* ignored in 64bit mode *)
  177. prfLOCK* = 0F0H;
  178. prfREP* = 0F3H;
  179. prfREPE* = 0F3H;
  180. prfREPZ* = 0F3H;
  181. prfREPNE* = 0F2H;
  182. prfREPNZ* = 0F2H;
  183. (* registers
  184. FoxProgTools.Enum -e -l=8 -s=0
  185. (** 8 bit general purpose registers **)
  186. regAL regCL regDL regBL regAH regCH regDH regBH
  187. regSPL regBPL regSIL regDIL
  188. ~
  189. FoxProgTools.Enum -e -l=16 -s=16
  190. regR8B regR9B regR10B regR11B regR12B regR13B regR14B regR15B
  191. ~
  192. FoxProgTools.Enum -l=8 -e -s=32
  193. (** 16 bit general purpose registers **)
  194. regAX regCX regDX regBX regSP regBP regSI regDI
  195. regR8W regR9W regR10W regR11W regR12W regR13W regR14W regR15W
  196. ~
  197. FoxProgTools.Enum -l=8 -e -s=64
  198. (** 32 bit general purpose registers **)
  199. regEAX regECX regEDX regEBX regESP regEBP regESI regEDI
  200. regR8D regR9D regR10D regR11D regR12D regR13D regR14D regR15D
  201. ~
  202. FoxProgTools.Enum -l=8 -e -s=96
  203. (** 64 bit general purpose registers **)
  204. regRAX regRCX regRDX regRBX regRSP regRBP regRSI regRDI
  205. regR8 regR9 regR10 regR11 regR12 regR13 regR14 regR15 regRIP
  206. ~
  207. FoxProgTools.Enum -l=8 -e -s=128
  208. regES regCS regSS regDS regFS regGS
  209. regCR0 regCR1 regCR2 regCR3 regCR4 regCR5 regCR6 regCR7
  210. regCR8 regCR9 regCR10 regCR11 regCR12 regCR13 regCR14 regCR15
  211. regDR0 regDR1 regDR2 regDR3 regDR4 regDR5 regDR6 regDR7
  212. regDR8 regDR9 regDR10 regDR11 regDR12 regDR13 regDR14 regDR15
  213. regST0 regST1 regST2 regST3 regST4 regST5 regST6 regST7
  214. regXMM0 regXMM1 regXMM2 regXMM3 regXMM4 regXMM5 regXMM6 regXMM7
  215. regXMM8 regXMM9 regXMM10 regXMM11 regXMM12 regXMM13 regXMM14 regXMM15
  216. regMMX0 regMMX1 regMMX2 regMMX3 regMMX4 regMMX5 regMMX6 regMMX7
  217. regYMM0 regYMM1 regYMM2 regYMM3 regYMM4 regYMM5 regYMM6 regYMM7
  218. regYMM8 regYMM9 regYMM10 regYMM11 regYMM12 regYMM13 regYMM14 regYMM15
  219. numberRegisters
  220. ~
  221. *)
  222. (*
  223. regNumber = S*32 + N
  224. N\S 0 1 2 3
  225. 0 AL AX EAX RAX
  226. 1 CL CX ECX RCX
  227. 2 DL DX EDX RDX
  228. 3 BL BX EBX RBX
  229. 4 SPL SP ESP RSP
  230. 5 BPL BP EBP RBP
  231. 6 SIL SI ESI RSI
  232. 7 DIL DI EDI RDI
  233. 8 R8B R8W R8D R8
  234. 9 R9B R9W R9D R9
  235. 10 R10B R10W R10D R10
  236. 11 R11B R11W R11D R11
  237. 12 R12B R12W R12D R12
  238. 13 R13B R13W R13D R13
  239. 14 R14B R14W R14D R14
  240. 15 R15B R15W R15D R15
  241. 16 AH
  242. 17 CH
  243. 18 BH
  244. 19 DH
  245. *)
  246. (** register indices, the order is arbitrary and has no meaning for instruction encoding,
  247. it nevertheless should not be changed as the numbers are important on in the code generator ! **)
  248. (** 8 bit general purpose registers : index DIV 32 = 0**)
  249. regAL*= 0; regCL*= 1; regDL*= 2; regBL*= 3; regSPL*= 4; regBPL*= 5; regSIL*= 6; regDIL*= 7;
  250. regAH*= 16; regCH*= 17; regDH*= 18; regBH*= 19;
  251. regR8B*= 8; regR9B*= 9; regR10B*= 10; regR11B*= 11; regR12B*= 12; regR13B*= 13; regR14B*= 14; regR15B*= 15;
  252. (** 16 bit general purpose registers : index DIV 32 = 1**)
  253. regAX*= 32; regCX*= 33; regDX*= 34; regBX*= 35; regSP*= 36; regBP*= 37; regSI*= 38; regDI*= 39;
  254. regR8W*= 40; regR9W*= 41; regR10W*= 42; regR11W*= 43; regR12W*= 44; regR13W*= 45; regR14W*= 46; regR15W*= 47;
  255. (** 32 bit general purpose registers: index DIV 32 = 2 **)
  256. regEAX*= 64; regECX*= 65; regEDX*= 66; regEBX*= 67; regESP*= 68; regEBP*= 69; regESI*= 70; regEDI*= 71;
  257. regR8D*= 72; regR9D*= 73; regR10D*= 74; regR11D*= 75; regR12D*= 76; regR13D*= 77; regR14D*= 78; regR15D*= 79;
  258. (** 64 bit general purpose registers : index DIV 32 = 3 (except for regRIP) **)
  259. regRAX*= 96; regRCX*= 97; regRDX*= 98; regRBX*= 99; regRSP*= 100; regRBP*= 101; regRSI*= 102; regRDI*= 103;
  260. regR8*= 104; regR9*= 105; regR10*= 106; regR11*= 107; regR12*= 108; regR13*= 109; regR14*= 110; regR15*= 111;
  261. regRIP*= 112;
  262. (** other registers **)
  263. regES*= 128; regCS*= 129; regSS*= 130; regDS*= 131; regFS*= 132; regGS*= 133; regCR0*= 134; regCR1*= 135;
  264. regCR2*= 136; regCR3*= 137; regCR4*= 138; regCR5*= 139; regCR6*= 140; regCR7*= 141; regCR8*= 142; regCR9*= 143;
  265. regCR10*= 144; regCR11*= 145; regCR12*= 146; regCR13*= 147; regCR14*= 148; regCR15*= 149; regDR0*= 150; regDR1*= 151;
  266. regDR2*= 152; regDR3*= 153; regDR4*= 154; regDR5*= 155; regDR6*= 156; regDR7*= 157; regDR8*= 158; regDR9*= 159;
  267. regDR10*= 160; regDR11*= 161; regDR12*= 162; regDR13*= 163; regDR14*= 164; regDR15*= 165; regST0*= 166; regST1*= 167;
  268. regST2*= 168; regST3*= 169; regST4*= 170; regST5*= 171; regST6*= 172; regST7*= 173; regXMM0*= 174; regXMM1*= 175;
  269. regXMM2*= 176; regXMM3*= 177; regXMM4*= 178; regXMM5*= 179; regXMM6*= 180; regXMM7*= 181; regXMM8*= 182; regXMM9*= 183;
  270. regXMM10*= 184; regXMM11*= 185; regXMM12*= 186; regXMM13*= 187; regXMM14*= 188; regXMM15*= 189; regMMX0*= 190; regMMX1*= 191;
  271. regMMX2*= 192; regMMX3*= 193; regMMX4*= 194; regMMX5*= 195; regMMX6*= 196; regMMX7*= 197; numberRegisters*= 198;
  272. VAR
  273. opAAA*,
  274. opAAD*,
  275. opAAM*,
  276. opAAS*,
  277. opADC*,
  278. opADD*,
  279. opADDPD*,
  280. opADDPS*,
  281. opADDSD*,
  282. opADDSS*,
  283. opADDSUBPD*,
  284. opADDSUBPS*,
  285. opAND*,
  286. opANDNPD*,
  287. opANDNPS*,
  288. opANDPD*,
  289. opANDPS*,
  290. opARPL*,
  291. opBOUND*,
  292. opBSF*,
  293. opBSR*,
  294. opBSWAP*,
  295. opBT*,
  296. opBTC*,
  297. opBTR*,
  298. opBTS*,
  299. opCALL*,
  300. opCALLFAR*,
  301. opCBW*,
  302. opCDQ*,
  303. opCDQE*,
  304. opCLC*,
  305. opCLD*,
  306. opCLFLUSH*,
  307. opCLGI*,
  308. opCLI*,
  309. opCLTS*,
  310. opCMC*,
  311. opCMOVA*,
  312. opCMOVAE*,
  313. opCMOVB*,
  314. opCMOVBE*,
  315. opCMOVC*,
  316. opCMOVE*,
  317. opCMOVG*,
  318. opCMOVGE*,
  319. opCMOVL*,
  320. opCMOVLE*,
  321. opCMOVNA*,
  322. opCMOVNAE*,
  323. opCMOVNB*,
  324. opCMOVNBE*,
  325. opCMOVNC*,
  326. opCMOVNE*,
  327. opCMOVNG*,
  328. opCMOVNGE*,
  329. opCMOVNL*,
  330. opCMOVNLE*,
  331. opCMOVNO*,
  332. opCMOVNP*,
  333. opCMOVNS*,
  334. opCMOVNZ*,
  335. opCMOVO*,
  336. opCMOVP*,
  337. opCMOVPE*,
  338. opCMOVPO*,
  339. opCMOVS*,
  340. opCMOVZ*,
  341. opCMP*,
  342. opCMPPD*,
  343. opCMPPS*,
  344. opCMPS*,
  345. opCMPSB*,
  346. opCMPSD*,
  347. opCMPSQ*,
  348. opCMPSS*,
  349. opCMPSW*,
  350. opCMPXCHG*,
  351. opCMPXCHG16B*,
  352. opCMPXCHG8B*,
  353. opCOMISD*,
  354. opCOMISS*,
  355. opCPUID*,
  356. opCQO*,
  357. opCVTDQ2PD*,
  358. opCVTDQ2PS*,
  359. opCVTPD2DQ*,
  360. opCVTPD2PI*,
  361. opCVTPD2PS*,
  362. opCVTPI2PD*,
  363. opCVTPI2PS*,
  364. opCVTPS2DQ*,
  365. opCVTPS2PD*,
  366. opCVTPS2PI*,
  367. opCVTSD2SI*,
  368. opCVTSD2SS*,
  369. opCVTSI2SD*,
  370. opCVTSI2SS*,
  371. opCVTSS2SD*,
  372. opCVTSS2SI*,
  373. opCVTTPD2DQ*,
  374. opCVTTPD2PI*,
  375. opCVTTPS2DQ*,
  376. opCVTTPS2PI*,
  377. opCVTTSD2SI*,
  378. opCVTTSS2SI*,
  379. opCWD*,
  380. opCWDE*,
  381. opDAA*,
  382. opDAS*,
  383. opDEC*,
  384. opDIV*,
  385. opDIVPD*,
  386. opDIVPS*,
  387. opDIVSD*,
  388. opDIVSS*,
  389. opEMMS*,
  390. opENTER*,
  391. opF2XM1*,
  392. opFABS*,
  393. opFADD*,
  394. opFADDP*,
  395. opFBLD*,
  396. opFBSTP*,
  397. opFCHS*,
  398. opFCLEX*,
  399. opFCMOVB*,
  400. opFCMOVBE*,
  401. opFCMOVE*,
  402. opFCMOVNB*,
  403. opFCMOVNBE*,
  404. opFCMOVNE*,
  405. opFCMOVNU*,
  406. opFCMOVU*,
  407. opFCOM*,
  408. opFCOMI*,
  409. opFCOMIP*,
  410. opFCOMP*,
  411. opFCOMPP*,
  412. opFCOS*,
  413. opFDECSTP*,
  414. opFDIV*,
  415. opFDIVP*,
  416. opFDIVR*,
  417. opFDIVRP*,
  418. opFEMMS*,
  419. opFFREE*,
  420. opFIADD*,
  421. opFICOM*,
  422. opFICOMP*,
  423. opFIDIV*,
  424. opFIDIVR*,
  425. opFILD*,
  426. opFIMUL*,
  427. opFINCSTP*,
  428. opFINIT*,
  429. opFIST*,
  430. opFISTP*,
  431. opFISTTP*,
  432. opFISUB*,
  433. opFISUBR*,
  434. opFLD*,
  435. opFLD1*,
  436. opFLDCW*,
  437. opFLDENV*,
  438. opFLDL2E*,
  439. opFLDL2T*,
  440. opFLDLG2*,
  441. opFLDLN2*,
  442. opFLDPI*,
  443. opFLDZ*,
  444. opFMUL*,
  445. opFMULP*,
  446. opFNCLEX*,
  447. opFNINIT*,
  448. opFNOP*,
  449. opFNSAVE*,
  450. opFNSTCW*,
  451. opFNSTENV*,
  452. opFNSTSW*,
  453. opFPATAN*,
  454. opFPREM*,
  455. opFPREM1*,
  456. opFPTAN*,
  457. opFRNDINT*,
  458. opFRSTOR*,
  459. opFSAVE*,
  460. opFSCALE*,
  461. opFSIN*,
  462. opFSINCOS*,
  463. opFSQRT*,
  464. opFST*,
  465. opFSTCW*,
  466. opFSTENV*,
  467. opFSTP*,
  468. opFSTSW*,
  469. opFSUB*,
  470. opFSUBP*,
  471. opFSUBR*,
  472. opFSUBRP*,
  473. opFTST*,
  474. opFUCOM*,
  475. opFUCOMI*,
  476. opFUCOMIP*,
  477. opFUCOMP*,
  478. opFUCOMPP*,
  479. opFWAIT*,
  480. opFXAM*,
  481. opFXCH*,
  482. opFXRSTOR*,
  483. opFXSAVE*,
  484. opFXTRACT*,
  485. opFYL2X*,
  486. opFYL2XP1*,
  487. opHADDPD*,
  488. opHADDPS*,
  489. opHLT*,
  490. opHSUBPD*,
  491. opHSUBPS*,
  492. opIDIV*,
  493. opIMUL*,
  494. opIN*,
  495. opINC*,
  496. opINS*,
  497. opINSB*,
  498. opINSD*,
  499. opINSW*,
  500. opINT*,
  501. opINT3*,
  502. opINTO*,
  503. opINVD*,
  504. opINVLPG*,
  505. opINVLPGA*,
  506. opIRET*,
  507. opIRETD*,
  508. opIRETQ*,
  509. opJA*,
  510. opJAE*,
  511. opJB*,
  512. opJBE*,
  513. opJC*,
  514. opJCXZ*,
  515. opJE*,
  516. opJECXZ*,
  517. opJG*,
  518. opJGE*,
  519. opJL*,
  520. opJLE*,
  521. opJMP*,
  522. opJMPFAR*,
  523. opJNA*,
  524. opJNAE*,
  525. opJNB*,
  526. opJNBE*,
  527. opJNC*,
  528. opJNE*,
  529. opJNG*,
  530. opJNGE*,
  531. opJNL*,
  532. opJNLE*,
  533. opJNO*,
  534. opJNP*,
  535. opJNS*,
  536. opJNZ*,
  537. opJO*,
  538. opJP*,
  539. opJPE*,
  540. opJPO*,
  541. opJRCXZ*,
  542. opJS*,
  543. opJZ*,
  544. opLAHF*,
  545. opLAR*,
  546. opLDDQU*,
  547. opLDMXCSR*,
  548. opLDS*,
  549. opLEA*,
  550. opLEAVE*,
  551. opLES*,
  552. opLFENCE*,
  553. opLFS*,
  554. opLGDT*,
  555. opLGS*,
  556. opLIDT*,
  557. opLLDT*,
  558. opLMSW*,
  559. opLODS*,
  560. opLODSB*,
  561. opLODSD*,
  562. opLODSQ*,
  563. opLODSW*,
  564. opLOOP*,
  565. opLOOPE*,
  566. opLOOPNE*,
  567. opLOOPNZ*,
  568. opLOOPZ*,
  569. opLSL*,
  570. opLSS*,
  571. opLTR*,
  572. opMASKMOVDQU*,
  573. opMASKMOVQ*,
  574. opMAXPD*,
  575. opMAXPS*,
  576. opMAXSD*,
  577. opMAXSS*,
  578. opMFENCE*,
  579. opMINPD*,
  580. opMINPS*,
  581. opMINSD*,
  582. opMINSS*,
  583. opMOV*,
  584. opMOVAPD*,
  585. opMOVAPS*,
  586. opMOVD*,
  587. opMOVDDUP*,
  588. opMOVDQ2Q*,
  589. opMOVDQA*,
  590. opMOVDQU*,
  591. opMOVHLPS*,
  592. opMOVHPD*,
  593. opMOVHPS*,
  594. opMOVLHPS*,
  595. opMOVLPD*,
  596. opMOVLPS*,
  597. opMOVMSKPD*,
  598. opMOVMSKPS*,
  599. opMOVNTDQ*,
  600. opMOVNTI*,
  601. opMOVNTPD*,
  602. opMOVNTPS*,
  603. opMOVNTQ*,
  604. opMOVQ*,
  605. opMOVQ2DQ*,
  606. opMOVS*,
  607. opMOVSB*,
  608. opMOVSD*,
  609. opMOVSHDUP*,
  610. opMOVSLDUP*,
  611. opMOVSQ*,
  612. opMOVSS*,
  613. opMOVSW*,
  614. opMOVSX*,
  615. opMOVSXD*,
  616. opMOVUPD*,
  617. opMOVUPS*,
  618. opMOVZX*,
  619. opMUL*,
  620. opMULPD*,
  621. opMULPS*,
  622. opMULSD*,
  623. opMULSS*,
  624. opNEG*,
  625. opNOP*,
  626. opNOT*,
  627. opOR*,
  628. opORPD*,
  629. opORPS*,
  630. opOUT*,
  631. opOUTS*,
  632. opOUTSB*,
  633. opOUTSD*,
  634. opOUTSW*,
  635. opPACKSSDW*,
  636. opPACKSSWB*,
  637. opPACKUSWB*,
  638. opPADDB*,
  639. opPADDD*,
  640. opPADDQ*,
  641. opPADDSB*,
  642. opPADDSW*,
  643. opPADDUSB*,
  644. opPADDUSW*,
  645. opPADDW*,
  646. opPAND*,
  647. opPANDN*,
  648. opPAUSE*,
  649. opPAVGB*,
  650. opPAVGUSB*,
  651. opPAVGW*,
  652. opPCMPEQB*,
  653. opPCMPEQD*,
  654. opPCMPEQW*,
  655. opPCMPGTB*,
  656. opPCMPGTD*,
  657. opPCMPGTW*,
  658. opPEXTRW*,
  659. opPF2ID*,
  660. opPF2IW*,
  661. opPFACC*,
  662. opPFADD*,
  663. opPFCMPEQ*,
  664. opPFCMPGE*,
  665. opPFCMPGT*,
  666. opPFMAX*,
  667. opPFMIN*,
  668. opPFMUL*,
  669. opPFNACC*,
  670. opPFPNACC*,
  671. opPFRCP*,
  672. opPFRCPIT1*,
  673. opPFRCPIT2*,
  674. opPFRSQIT1*,
  675. opPFRSQRT*,
  676. opPFSUB*,
  677. opPFSUBR*,
  678. opPI2FD*,
  679. opPI2FW*,
  680. opPINSRW*,
  681. opPMADDWD*,
  682. opPMAXSW*,
  683. opPMAXUB*,
  684. opPMINSW*,
  685. opPMINUB*,
  686. opPMOVMSKB*,
  687. opPMULHRW*,
  688. opPMULHUW*,
  689. opPMULHW*,
  690. opPMULLW*,
  691. opPMULUDQ*,
  692. opPOP*,
  693. opPOPA*,
  694. opPOPAD*,
  695. opPOPAW*,
  696. opPOPF*,
  697. opPOPFD*,
  698. opPOPFQ*,
  699. opPOR*,
  700. opPREFETCH*,
  701. opPREFETCHNTA*,
  702. opPREFETCHT0*,
  703. opPREFETCHT1*,
  704. opPREFETCHT2*,
  705. opPREFETCHW*,
  706. opPSADBW*,
  707. opPSHUFD*,
  708. opPSHUFHW*,
  709. opPSHUFLW*,
  710. opPSHUFW*,
  711. opPSLLD*,
  712. opPSLLDQ*,
  713. opPSLLQ*,
  714. opPSLLW*,
  715. opPSRAD*,
  716. opPSRAW*,
  717. opPSRLD*,
  718. opPSRLDQ*,
  719. opPSRLQ*,
  720. opPSRLW*,
  721. opPSUBB*,
  722. opPSUBD*,
  723. opPSUBQ*,
  724. opPSUBSB*,
  725. opPSUBSW*,
  726. opPSUBUSB*,
  727. opPSUBUSW*,
  728. opPSUBW*,
  729. opPSWAPD*,
  730. opPUNPCKHBW*,
  731. opPUNPCKHDQ*,
  732. opPUNPCKHQDQ*,
  733. opPUNPCKHWD*,
  734. opPUNPCKLBW*,
  735. opPUNPCKLDQ*,
  736. opPUNPCKLQDQ*,
  737. opPUNPCKLWD*,
  738. opPUSH*,
  739. opPUSHA*,
  740. opPUSHAD*,
  741. opPUSHF*,
  742. opPUSHFD*,
  743. opPUSHFQ*,
  744. opPXOR*,
  745. opRCL*,
  746. opRCPPS*,
  747. opRCPSS*,
  748. opRCR*,
  749. opRDMSR*,
  750. opRDPMC*,
  751. opRDTSC*,
  752. opRDTSCP*,
  753. opRET*,
  754. opRETF*,
  755. opROL*,
  756. opROR*,
  757. opRSM*,
  758. opRSQRTPS*,
  759. opRSQRTSS*,
  760. opSAHF*,
  761. opSAL*,
  762. opSAR*,
  763. opSBB*,
  764. opSCAS*,
  765. opSCASB*,
  766. opSCASD*,
  767. opSCASQ*,
  768. opSCASW*,
  769. opSETA*,
  770. opSETAE*,
  771. opSETB*,
  772. opSETBE*,
  773. opSETC*,
  774. opSETE*,
  775. opSETG*,
  776. opSETGE*,
  777. opSETL*,
  778. opSETLE*,
  779. opSETNA*,
  780. opSETNAE*,
  781. opSETNB*,
  782. opSETNBE*,
  783. opSETNC*,
  784. opSETNE*,
  785. opSETNG*,
  786. opSETNGE*,
  787. opSETNL*,
  788. opSETNLE*,
  789. opSETNO*,
  790. opSETNP*,
  791. opSETNS*,
  792. opSETNZ*,
  793. opSETO*,
  794. opSETP*,
  795. opSETPE*,
  796. opSETPO*,
  797. opSETS*,
  798. opSETZ*,
  799. opSFENCE*,
  800. opSGDT*,
  801. opSHL*,
  802. opSHLD*,
  803. opSHR*,
  804. opSHRD*,
  805. opSHUFPD*,
  806. opSHUFPS*,
  807. opSIDT*,
  808. opSKINIT*,
  809. opSLDT*,
  810. opSMSW*,
  811. opSQRTPD*,
  812. opSQRTPS*,
  813. opSQRTSD*,
  814. opSQRTSS*,
  815. opSTC*,
  816. opSTD*,
  817. opSTGI*,
  818. opSTI*,
  819. opSTMXCSR*,
  820. opSTOS*,
  821. opSTOSB*,
  822. opSTOSD*,
  823. opSTOSQ*,
  824. opSTOSW*,
  825. opSTR*,
  826. opSUB*,
  827. opSUBPD*,
  828. opSUBPS*,
  829. opSUBSD*,
  830. opSUBSS*,
  831. opSWAPGS*,
  832. opSYSCALL*,
  833. opSYSENTER*,
  834. opSYSEXIT*,
  835. opSYSRET*,
  836. opTEST*,
  837. opUCOMISD*,
  838. opUCOMISS*,
  839. opUD2*,
  840. opUNPCKHPD*,
  841. opUNPCKHPS*,
  842. opUNPCKLPD*,
  843. opUNPCKLPS*,
  844. opVERR*,
  845. opVERW*,
  846. opVMLOAD*,
  847. opVMMCALL*,
  848. opVMRUN*,
  849. opVMSAVE*,
  850. opWBINVD*,
  851. opWRMSR*,
  852. opXADD*,
  853. opXCHG*,
  854. opXLAT*,
  855. opXLATB*,
  856. opXOR*,
  857. opXORPD*,
  858. opXORPS*: LONGINT
  859. (*
  860. FoxProgTools.Enum -l=8 -e
  861. opCode
  862. modRMExtension
  863. modRMBoth
  864. cb cw cd cp
  865. ib iw id iq
  866. rb rw rd rq
  867. mem64Operand mem128Operand
  868. fpStackOperand
  869. directMemoryOffset
  870. ~
  871. *)
  872. CONST
  873. (* opcode flags, cf [AMD:3], pp. 39-40 *)
  874. opCode*= 0; modRMExtension*= 1; modRMBoth*= 2; cb*= 3; cw*= 4; cd*= 5; cp*= 6; ib*= 7;
  875. iw*= 8; id*= 9; iq*= 10; rb*= 11; rw*= 12; rd*= 13; rq*= 14; mem64Operand*= 15;
  876. mem128Operand*= 16; fpStackOperand*= 17; directMemoryOffset*= 18;
  877. TYPE
  878. Name = ARRAY 20 OF CHAR;
  879. OperandType* = SHORTINT;
  880. CPUOptions*= SET;
  881. Code*=CHAR; (* should be unsigned -- for emitter *)
  882. Instruction* = RECORD
  883. code-: ARRAY maxCodeLength OF Code; (* for the encoding cd. InitInstructions.Encode *)
  884. operands-: ARRAY maxNumberOperands OF OperandType;
  885. bitwidthOptions-: SET;
  886. cpuOptions-: SET;
  887. END;
  888. Mnemonic* = RECORD
  889. name-: ARRAY maxMnemonicNameLength OF CHAR;
  890. firstInstruction-, lastInstruction-: LONGINT;
  891. END;
  892. CPUType* = RECORD
  893. name-: Name;
  894. cpuOptions-: SET;
  895. END;
  896. Register* = RECORD
  897. name-: Name; (* name for debug output and for an assembler *)
  898. type-: OperandType; (* can be one of reg8, reg16, reg32, reg64, CRn, DRn, segReg, mmx, xmm, sti
  899. the particular value of reg8 ... sti does not have a meaning *)
  900. index-: SHORTINT; (* this index has a meaning for instruction encoding, it is the register index used in the instruction *)
  901. sizeInBytes-: SHORTINT; (* size in bytes *)
  902. END;
  903. VAR
  904. (* repository *)
  905. mnemonics-: ARRAY maxNumberMnemonics OF Mnemonic;
  906. numberMnemonics: LONGINT;
  907. instructions-: ARRAY maxNumberInstructions OF Instruction;
  908. numberInstructions: LONGINT;
  909. registers-: ARRAY numberRegisters OF Register;
  910. registersByClass-: ARRAY sti+1 OF ARRAY 17 OF LONGINT;
  911. cpus-: ARRAY maxCPUs OF CPUType;
  912. cpuCount: LONGINT;
  913. (* perform a binary search for the index of the specified mnemonic *)
  914. PROCEDURE FindMnemonic* (CONST mnem: ARRAY OF CHAR): LONGINT;
  915. VAR l, r, m: LONGINT;
  916. BEGIN
  917. l := 0;
  918. r := numberMnemonics;
  919. WHILE l # r DO
  920. m := (l + r) DIV 2;
  921. IF mnem < mnemonics[m].name THEN r := m;
  922. ELSIF mnem > mnemonics[m].name THEN l := m + 1;
  923. ELSE RETURN m;
  924. END
  925. END;
  926. RETURN none;
  927. END FindMnemonic;
  928. (* search for the register name and return it's index *)
  929. PROCEDURE FindRegister* (CONST reg: ARRAY OF CHAR): LONGINT;
  930. VAR i: LONGINT;
  931. BEGIN
  932. FOR i := 0 TO numberRegisters - 1 DO
  933. IF registers[i].name = reg THEN RETURN i END;
  934. END;
  935. RETURN none;
  936. END FindRegister;
  937. PROCEDURE RegisterType*(regNumber: LONGINT): OperandType;
  938. BEGIN IF regNumber = none THEN RETURN none ELSE RETURN registers[regNumber].type END
  939. END RegisterType;
  940. PROCEDURE RegisterIndex*(regNumber: LONGINT): SHORTINT;
  941. BEGIN IF regNumber = none THEN RETURN none ELSE RETURN registers[regNumber].index END
  942. END RegisterIndex;
  943. (* search for the CPU name and return it's index *)
  944. PROCEDURE FindCPU* (CONST cpu: ARRAY OF CHAR): LONGINT;
  945. VAR i: LONGINT;
  946. BEGIN
  947. FOR i := 0 TO cpuCount - 1 DO
  948. IF cpus[i].name = cpu THEN RETURN i END;
  949. END;
  950. RETURN none;
  951. END FindCPU;
  952. (** setup instruction and mnemonic tables **)
  953. PROCEDURE InitInstructions;
  954. VAR
  955. PROCEDURE StartMnemonic(VAR op: LONGINT; CONST name: ARRAY OF CHAR);
  956. BEGIN
  957. op := numberMnemonics;
  958. INC(numberMnemonics);
  959. COPY (name, mnemonics[op].name);
  960. mnemonics[op].firstInstruction := numberInstructions;
  961. END StartMnemonic;
  962. PROCEDURE HexOrd (ch: CHAR): INTEGER;
  963. BEGIN
  964. IF ch <= "9" THEN RETURN ORD (ch) - ORD ("0")
  965. ELSE RETURN ORD (CAP (ch)) - ORD ("A") + 10
  966. END
  967. END HexOrd;
  968. PROCEDURE Encode(CONST charcode: ARRAY OF CHAR; VAR code: ARRAY OF Code);
  969. (* simple encoding:
  970. code =
  971. {
  972. opCode number
  973. |modRMBoth
  974. |modRMExtension number
  975. |cb|cw|cd|cp
  976. |ib|iw|id|iq
  977. |m6|m1
  978. |+i|+o
  979. |rb|rw|rd|rq
  980. }
  981. none
  982. {
  983. none
  984. }
  985. all symbols 8 bit wide, numbers also 8 bits wide
  986. *)
  987. VAR i,k,length: SHORTINT; ch1,ch2: CHAR;
  988. BEGIN
  989. i := 0; k := 0;
  990. WHILE(charcode[2*i] # 0X) DO
  991. ch1 := charcode[2*i];
  992. ch2 := charcode[2*i+1];
  993. CASE ch1 OF
  994. '0'..'9','A'..'F':
  995. CASE ch2 OF '0'..'9','A'..'F':
  996. code[k] := CHR(opCode);INC(k);
  997. code[k] := CHR(HexOrd(ch1)*10H+HexOrd(ch2)); INC(k);
  998. ELSE HALT(100)
  999. END;
  1000. |'/':
  1001. CASE ch2 OF
  1002. 'r': code[k] := CHR(modRMBoth); INC(k);
  1003. |'0'..'7': code[k] := CHR(modRMExtension); INC(k); code[k] := CHR(HexOrd(ch2)); INC(k);
  1004. ELSE HALT(100)
  1005. END;
  1006. |'c':
  1007. CASE ch2 OF
  1008. 'b': code[k] := CHR(cb); INC(k);
  1009. |'w': code[k] := CHR(cw); INC(k);
  1010. |'d': code[k] := CHR(cd); INC(k);
  1011. |'p': code[k] := CHR(cp); INC(k);
  1012. ELSE HALT(100)
  1013. END;
  1014. |'i':
  1015. CASE ch2 OF
  1016. 'b': code[k] := CHR(ib); INC(k);
  1017. |'w': code[k] := CHR(iw); INC(k);
  1018. |'d': code[k] := CHR(id); INC(k);
  1019. |'q': code[k] := CHR(iq); INC(k);
  1020. ELSE HALT(100)
  1021. END;
  1022. |'m':
  1023. CASE ch2 OF
  1024. '6': code[k] := CHR(mem64Operand); INC(k);
  1025. |'1': code[k] := CHR(mem128Operand); INC(k);
  1026. ELSE HALT(100)
  1027. END;
  1028. |'+':
  1029. CASE ch2 OF
  1030. 'i': code[k] := CHR(fpStackOperand); INC(k);
  1031. |'o': code[k] := CHR(directMemoryOffset); INC(k);
  1032. ELSE HALT(100)
  1033. END;
  1034. |'r':
  1035. CASE ch2 OF
  1036. 'b': code[k] := CHR(rb); INC(k);
  1037. |'w': code[k] := CHR(rw); INC(k);
  1038. |'d': code[k] := CHR(rd); INC(k);
  1039. |'q': code[k] := CHR(rq); INC(k);
  1040. ELSE HALT(100)
  1041. END;
  1042. ELSE HALT(100)
  1043. END;
  1044. INC(i);
  1045. END;
  1046. length := k;
  1047. WHILE(k < LEN(code)) DO
  1048. code[k] := CHR(none);
  1049. INC(k);
  1050. END;
  1051. END Encode;
  1052. PROCEDURE AddInstruction(CONST op,code: ARRAY OF CHAR; bitwidthOptions, cpuOptions: SET);
  1053. VAR i: SHORTINT; at: LONGINT;
  1054. PROCEDURE StringToOperand(CONST name: ARRAY OF CHAR): SHORTINT;
  1055. BEGIN
  1056. IF name = "" THEN RETURN none
  1057. ELSIF name = "1" THEN RETURN one;
  1058. ELSIF name = "3" THEN RETURN three;
  1059. ELSIF name = "reg8" THEN RETURN reg8;
  1060. ELSIF name = "reg16" THEN RETURN reg16;
  1061. ELSIF name = "reg32" THEN RETURN reg32;
  1062. ELSIF name = "reg64" THEN RETURN reg64;
  1063. ELSIF name = "CRn" THEN RETURN CRn
  1064. ELSIF name = "DRn" THEN RETURN DRn
  1065. ELSIF name = "segReg" THEN RETURN segReg
  1066. ELSIF name = "mmx" THEN RETURN mmx
  1067. ELSIF name = "xmm" THEN RETURN xmm
  1068. ELSIF name = "mem" THEN RETURN mem
  1069. ELSIF name = "imm" THEN RETURN imm
  1070. ELSIF name = "ioffset" THEN RETURN ioffset
  1071. ELSIF name = "pntr1616" THEN RETURN pntr1616
  1072. ELSIF name = "pntr1632" THEN RETURN pntr1632
  1073. ELSIF name = "AL" THEN RETURN AL;
  1074. ELSIF name = "AX" THEN RETURN AX;
  1075. ELSIF name = "CL" THEN RETURN CL;
  1076. ELSIF name = "CR8" THEN RETURN CR8;
  1077. ELSIF name = "CS" THEN RETURN CS;
  1078. ELSIF name = "DS" THEN RETURN DS;
  1079. ELSIF name = "DX" THEN RETURN DX;
  1080. ELSIF name = "EAX" THEN RETURN EAX;
  1081. ELSIF name = "ECX" THEN RETURN ECX;
  1082. ELSIF name = "ES" THEN RETURN ES;
  1083. ELSIF name = "FS" THEN RETURN FS;
  1084. ELSIF name = "GS" THEN RETURN GS;
  1085. ELSIF name = "RAX" THEN RETURN RAX;
  1086. ELSIF name = "SS" THEN RETURN SS;
  1087. ELSIF name = "rAX" THEN RETURN rAX;
  1088. ELSIF name = "ST(0)" THEN RETURN st0;
  1089. ELSIF name = "ST(i)" THEN RETURN sti;
  1090. ELSIF name = "imm16" THEN RETURN imm16
  1091. ELSIF name = "imm32" THEN RETURN imm32;
  1092. ELSIF name = "imm64" THEN RETURN imm64
  1093. ELSIF name = "imm8" THEN RETURN imm8
  1094. ELSIF name = "uimm16" THEN RETURN uimm16
  1095. ELSIF name = "uimm32" THEN RETURN uimm32
  1096. ELSIF name = "uimm8" THEN RETURN uimm8
  1097. ELSIF name = "simm16" THEN RETURN simm16
  1098. ELSIF name = "simm32" THEN RETURN simm32
  1099. ELSIF name = "simm8" THEN RETURN simm8
  1100. ELSIF name = "mem128" THEN RETURN mem128
  1101. ELSIF name = "mem16" THEN RETURN mem16
  1102. ELSIF name = "mem32" THEN RETURN mem32
  1103. ELSIF name = "mem64" THEN RETURN mem64
  1104. ELSIF name = "mem8" THEN RETURN mem8
  1105. ELSIF name = "moffset16" THEN RETURN moffset16
  1106. ELSIF name = "moffset32" THEN RETURN moffset32
  1107. ELSIF name = "moffset64" THEN RETURN moffset64
  1108. ELSIF name = "moffset8" THEN RETURN moffset8
  1109. ELSIF name = "rel16off" THEN RETURN rel16off
  1110. ELSIF name = "rel32off" THEN RETURN rel32off
  1111. ELSIF name = "rel8off" THEN RETURN rel8off
  1112. ELSIF name = "reg/mem8" THEN RETURN regmem8;
  1113. ELSIF name = "reg/mem16" THEN RETURN regmem16;
  1114. ELSIF name = "reg/mem32" THEN RETURN regmem32;
  1115. ELSIF name = "reg/mem64" THEN RETURN regmem64;
  1116. ELSIF name = "mem14/28env" THEN RETURN mem;
  1117. ELSIF name = "mem16&mem16" THEN RETURN mem;
  1118. ELSIF name = "mem32&mem32" THEN RETURN mem;
  1119. ELSIF name = "mem16:16" THEN RETURN mem;
  1120. ELSIF name = "mem16:32" THEN RETURN mem;
  1121. ELSIF name = "mem16:64" THEN RETURN mem;
  1122. ELSIF name = "mem512env" THEN RETURN mem;
  1123. ELSIF name = "mem80dec" THEN RETURN mem;
  1124. ELSIF name = "mem80real" THEN RETURN mem;
  1125. ELSIF name = "mem94/108env" THEN RETURN mem;
  1126. ELSIF name = "mem2env" THEN RETURN mem16;
  1127. ELSIF name = "xmm1" THEN RETURN xmm;
  1128. ELSIF name = "xmm2" THEN RETURN xmm;
  1129. ELSIF name = "xmm/mem32" THEN RETURN xmmmem32;
  1130. ELSIF name = "xmm/mem64" THEN RETURN xmmmem64;
  1131. ELSIF name = "xmm/mem128" THEN RETURN xmmmem128;
  1132. ELSIF name = "xmm1/mem32" THEN RETURN xmmmem32;
  1133. ELSIF name = "xmm1/mem64" THEN RETURN xmmmem64;
  1134. ELSIF name = "xmm1/mem128" THEN RETURN xmmmem128;
  1135. ELSIF name = "xmm2/mem32" THEN RETURN xmmmem32;
  1136. ELSIF name = "xmm2/mem64" THEN RETURN xmmmem64;
  1137. ELSIF name = "xmm2/mem128" THEN RETURN xmmmem128;
  1138. ELSIF name = "mmx/mem64" THEN RETURN mmxmem64;
  1139. ELSIF name = "mmx1" THEN RETURN mmx;
  1140. ELSIF name = "mmx2" THEN RETURN mmx;
  1141. ELSIF name = "mmx1/mem64" THEN RETURN mmxmem64;
  1142. ELSIF name = "mmx2/mem32" THEN RETURN mmxmem32;
  1143. ELSIF name = "mmx2/mem64" THEN RETURN mmxmem64;
  1144. ELSIF name = "pntr16:16" THEN RETURN pntr1616;
  1145. ELSIF name = "pntr16:32" THEN RETURN pntr1632;
  1146. ELSIF name = "mem16int" THEN RETURN mem16;
  1147. ELSIF name = "mem32int" THEN RETURN mem32;
  1148. ELSIF name = "mem32real" THEN RETURN mem32;
  1149. ELSIF name = "mem64int" THEN RETURN mem64;
  1150. ELSIF name = "mem64real" THEN RETURN mem64;
  1151. ELSE HALT(200)
  1152. END;
  1153. END StringToOperand;
  1154. PROCEDURE ParseOperand(CONST op: ARRAY OF CHAR; VAR at: LONGINT): SHORTINT;
  1155. VAR name: ARRAY 32 OF CHAR; i: LONGINT;
  1156. BEGIN
  1157. i := 0;
  1158. WHILE(op[at] # 0X) & (op[at] # ",") DO
  1159. name[i] := op[at];
  1160. INC(i); INC(at);
  1161. END;
  1162. name[i] := 0X;
  1163. IF op[at] = "," THEN INC(at) END;
  1164. RETURN StringToOperand(name);
  1165. END ParseOperand;
  1166. BEGIN
  1167. i := 0; at := 0;
  1168. WHILE (i<maxNumberOperands) DO
  1169. instructions[numberInstructions].operands[i] := ParseOperand(op,at);
  1170. INC(i);
  1171. END;
  1172. Encode(code,instructions[numberInstructions].code);
  1173. instructions[numberInstructions].bitwidthOptions := bitwidthOptions;
  1174. instructions[numberInstructions].cpuOptions := cpuOptions;
  1175. mnemonics[numberMnemonics-1].lastInstruction := numberInstructions;
  1176. INC(numberInstructions);
  1177. END AddInstruction;
  1178. (* the following has been generated with
  1179. FoxProgTools.ParseAMDInstructionSet FoxInstructionSetAMD64TabSeperated.txt ~
  1180. Do not change or re-order. The alphabetical order is of importance
  1181. *)
  1182. BEGIN
  1183. numberMnemonics := 0;
  1184. numberInstructions := 0;
  1185. StartMnemonic(opAAA, "AAA");
  1186. AddInstruction("", "37", {optNot64}, {cpu8086});
  1187. StartMnemonic(opAAD, "AAD");
  1188. AddInstruction("", "D50A", {optNot64}, {cpu8086});
  1189. AddInstruction("", "D5ib", {optNot64}, {cpu8086});
  1190. StartMnemonic(opAAM, "AAM");
  1191. AddInstruction("", "D40A", {optNot64}, {cpu8086});
  1192. AddInstruction("", "D4ib", {optNot64}, {cpu8086});
  1193. StartMnemonic(opAAS, "AAS");
  1194. AddInstruction("", "3F", {optNot64}, {cpu8086});
  1195. StartMnemonic(opADC, "ADC");
  1196. AddInstruction("reg/mem8,reg8", "10/r", {}, {cpu8086});
  1197. AddInstruction("reg/mem16,reg16", "11/r", {optO16}, {cpu8086});
  1198. AddInstruction("reg/mem32,reg32", "11/r", {optO32}, {cpu386});
  1199. AddInstruction("reg/mem64,reg64", "11/r", {}, {cpuAMD64});
  1200. AddInstruction("reg8,reg/mem8", "12/r", {}, {cpu8086});
  1201. AddInstruction("reg16,reg/mem16", "13/r", {optO16}, {cpu8086});
  1202. AddInstruction("reg32,reg/mem32", "13/r", {optO32}, {cpu386});
  1203. AddInstruction("reg64,reg/mem64", "13/r", {}, {cpuAMD64});
  1204. AddInstruction("AL,imm8", "14ib", {}, {cpu8086});
  1205. AddInstruction("AX,imm16", "15iw", {optO16}, {cpu8086});
  1206. AddInstruction("EAX,imm32", "15id", {optO32}, {cpu386});
  1207. AddInstruction("RAX,simm32", "15id", {}, {cpuAMD64});
  1208. AddInstruction("reg/mem8,imm8", "80/2ib", {}, {cpu8086});
  1209. AddInstruction("reg/mem16,imm16", "81/2iw", {optO16}, {cpu8086});
  1210. AddInstruction("reg/mem32,imm32", "81/2id", {optO32}, {cpu386});
  1211. AddInstruction("reg/mem64,simm32", "81/2id", {}, {cpuAMD64});
  1212. AddInstruction("reg/mem16,simm8", "83/2ib", {optO16}, {cpu8086});
  1213. AddInstruction("reg/mem32,simm8", "83/2ib", {optO32}, {cpu386});
  1214. AddInstruction("reg/mem64,simm8", "83/2ib", {}, {cpuAMD64});
  1215. StartMnemonic(opADD, "ADD");
  1216. AddInstruction("reg/mem8,reg8", "00/r", {}, {cpu8086});
  1217. AddInstruction("reg/mem16,reg16", "01/r", {optO16}, {cpu8086});
  1218. AddInstruction("reg/mem32,reg32", "01/r", {optO32}, {cpu386});
  1219. AddInstruction("reg/mem64,reg64", "01/r", {}, {cpuAMD64});
  1220. AddInstruction("reg8,reg/mem8", "02/r", {}, {cpu8086});
  1221. AddInstruction("reg16,reg/mem16", "03/r", {optO16}, {cpu8086});
  1222. AddInstruction("reg32,reg/mem32", "03/r", {optO32}, {cpu386});
  1223. AddInstruction("reg64,reg/mem64", "03/r", {}, {cpuAMD64});
  1224. AddInstruction("AL,imm8", "04ib", {}, {cpu8086});
  1225. AddInstruction("AX,imm16", "05iw", {optO16}, {cpu8086});
  1226. AddInstruction("EAX,imm32", "05id", {optO32}, {cpu386});
  1227. AddInstruction("RAX,simm32", "05id", {}, {cpuAMD64});
  1228. AddInstruction("reg/mem8,imm8", "80/0ib", {}, {cpu8086});
  1229. AddInstruction("reg/mem16,imm16", "81/0iw", {optO16}, {cpu8086});
  1230. AddInstruction("reg/mem32,imm32", "81/0id", {optO32}, {cpu386});
  1231. AddInstruction("reg/mem64,simm32", "81/0id", {}, {cpuAMD64});
  1232. AddInstruction("reg/mem16,simm8", "83/0ib", {optO16}, {cpu8086});
  1233. AddInstruction("reg/mem32,simm8", "83/0ib", {optO32}, {cpu386});
  1234. AddInstruction("reg/mem64,simm8", "83/0ib", {}, {cpuAMD64});
  1235. StartMnemonic(opADDPD, "ADDPD");
  1236. AddInstruction("xmm1,xmm2/mem128", "660F58/r", {}, {cpuSSE2});
  1237. StartMnemonic(opADDPS, "ADDPS");
  1238. AddInstruction("xmm1,xmm2/mem128", "0F58/r", {}, {cpuSSE});
  1239. StartMnemonic(opADDSD, "ADDSD");
  1240. AddInstruction("xmm1,xmm2/mem64", "F20F58/r", {}, {cpuSSE2});
  1241. StartMnemonic(opADDSS, "ADDSS");
  1242. AddInstruction("xmm1,xmm2/mem32", "F30F58/r", {}, {cpuSSE});
  1243. StartMnemonic(opADDSUBPD, "ADDSUBPD");
  1244. AddInstruction("xmm1,xmm2/mem128", "660FD0/r", {}, {cpuSSE3});
  1245. StartMnemonic(opADDSUBPS, "ADDSUBPS");
  1246. AddInstruction("xmm1,xmm2/mem128", "F20FD0/r", {}, {cpuSSE3});
  1247. StartMnemonic(opAND, "AND");
  1248. AddInstruction("reg/mem8,reg8", "20/r", {}, {cpu8086});
  1249. AddInstruction("reg/mem16,reg16", "21/r", {optO16}, {cpu8086});
  1250. AddInstruction("reg/mem32,reg32", "21/r", {optO32}, {cpu386});
  1251. AddInstruction("reg/mem64,reg64", "21/r", {}, {cpuAMD64});
  1252. AddInstruction("reg8,reg/mem8", "22/r", {}, {cpu8086});
  1253. AddInstruction("reg16,reg/mem16", "23/r", {optO16}, {cpu8086});
  1254. AddInstruction("reg32,reg/mem32", "23/r", {optO32}, {cpu386});
  1255. AddInstruction("reg64,reg/mem64", "23/r", {}, {cpuAMD64});
  1256. AddInstruction("AL,imm8", "24ib", {}, {cpu8086});
  1257. AddInstruction("AX,imm16", "25iw", {optO16}, {cpu8086});
  1258. AddInstruction("EAX,imm32", "25id", {optO32}, {cpu386});
  1259. AddInstruction("RAX,simm32", "25id", {}, {cpuAMD64});
  1260. AddInstruction("reg/mem8,imm8", "80/4ib", {}, {cpu8086});
  1261. AddInstruction("reg/mem16,imm16", "81/4iw", {optO16}, {cpu8086});
  1262. AddInstruction("reg/mem32,imm32", "81/4id", {optO32}, {cpu386});
  1263. AddInstruction("reg/mem64,simm32", "81/4id", {}, {cpuAMD64});
  1264. AddInstruction("reg/mem16,simm8", "83/4ib", {optO16}, {cpu8086});
  1265. AddInstruction("reg/mem32,simm8", "83/4ib", {optO32}, {cpu386});
  1266. AddInstruction("reg/mem64,simm8", "83/4ib", {}, {cpuAMD64});
  1267. StartMnemonic(opANDNPD, "ANDNPD");
  1268. AddInstruction("xmm1,xmm2/mem128", "660F55/r", {}, {cpuSSE2});
  1269. StartMnemonic(opANDNPS, "ANDNPS");
  1270. AddInstruction("xmm1,xmm2/mem128", "0F55/r", {}, {cpuSSE});
  1271. StartMnemonic(opANDPD, "ANDPD");
  1272. AddInstruction("xmm1,xmm2/mem128", "660F54/r", {}, {cpuSSE2});
  1273. StartMnemonic(opANDPS, "ANDPS");
  1274. AddInstruction("xmm1,xmm2/mem128", "0F54/r", {}, {cpuSSE});
  1275. StartMnemonic(opARPL, "ARPL");
  1276. AddInstruction("reg/mem16,reg16", "63/r", {}, {cpu286,cpuPrivileged});
  1277. StartMnemonic(opBOUND, "BOUND");
  1278. AddInstruction("reg16,mem16&mem16", "62/r", {optO16,optNot64}, {cpu186});
  1279. AddInstruction("reg32,mem32&mem32", "62/r", {optO32,optNot64}, {cpu386});
  1280. StartMnemonic(opBSF, "BSF");
  1281. AddInstruction("reg16,reg/mem16", "0FBC/r", {optO16}, {cpu386});
  1282. AddInstruction("reg32,reg/mem32", "0FBC/r", {optO32}, {cpu386});
  1283. AddInstruction("reg64,reg/mem64", "0FBC/r", {}, {cpuAMD64});
  1284. StartMnemonic(opBSR, "BSR");
  1285. AddInstruction("reg16,reg/mem16", "0FBD/r", {optO16}, {cpu386});
  1286. AddInstruction("reg32,reg/mem32", "0FBD/r", {optO32}, {cpu386});
  1287. AddInstruction("reg64,reg/mem64", "0FBD/r", {}, {cpuAMD64});
  1288. StartMnemonic(opBSWAP, "BSWAP");
  1289. AddInstruction("reg32", "0FC8rd", {optO32}, {cpu486});
  1290. AddInstruction("reg64", "0FC8rq", {}, {cpuAMD64});
  1291. StartMnemonic(opBT, "BT");
  1292. AddInstruction("reg/mem16,reg16", "0FA3/r", {optO16}, {cpu386});
  1293. AddInstruction("reg/mem32,reg32", "0FA3/r", {optO32}, {cpu386});
  1294. AddInstruction("reg/mem64,reg64", "0FA3/r", {}, {cpuAMD64});
  1295. AddInstruction("reg/mem16,uimm8", "0FBA/4ib", {optO16}, {cpu386});
  1296. AddInstruction("reg/mem32,uimm8", "0FBA/4ib", {optO32}, {cpu386});
  1297. AddInstruction("reg/mem64,uimm8", "0FBA/4ib", {}, {cpuAMD64});
  1298. StartMnemonic(opBTC, "BTC");
  1299. AddInstruction("reg/mem16,reg16", "0FBB/r", {optO16}, {cpu386});
  1300. AddInstruction("reg/mem32,reg32", "0FBB/r", {optO32}, {cpu386});
  1301. AddInstruction("reg/mem64,reg64", "0FBB/r", {}, {cpuAMD64});
  1302. AddInstruction("reg/mem16,uimm8", "0FBA/7ib", {optO16}, {cpu386});
  1303. AddInstruction("reg/mem32,uimm8", "0FBA/7ib", {optO32}, {cpu386});
  1304. AddInstruction("reg/mem64,uimm8", "0FBA/7ib", {}, {cpuAMD64});
  1305. StartMnemonic(opBTR, "BTR");
  1306. AddInstruction("reg/mem16,reg16", "0FB3/r", {optO16}, {cpu386});
  1307. AddInstruction("reg/mem32,reg32", "0FB3/r", {optO32}, {cpu386});
  1308. AddInstruction("reg/mem64,reg64", "0FB3/r", {}, {cpuAMD64});
  1309. AddInstruction("reg/mem16,uimm8", "0FBA/6ib", {optO16}, {cpu386});
  1310. AddInstruction("reg/mem32,uimm8", "0FBA/6ib", {optO32}, {cpu386});
  1311. AddInstruction("reg/mem64,uimm8", "0FBA/6ib", {}, {cpuAMD64});
  1312. StartMnemonic(opBTS, "BTS");
  1313. AddInstruction("reg/mem16,reg16", "0FAB/r", {optO16}, {cpu386});
  1314. AddInstruction("reg/mem32,reg32", "0FAB/r", {optO32}, {cpu386});
  1315. AddInstruction("reg/mem64,reg64", "0FAB/r", {}, {cpuAMD64});
  1316. AddInstruction("reg/mem16,uimm8", "0FBA/5ib", {optO16}, {cpu386});
  1317. AddInstruction("reg/mem32,uimm8", "0FBA/5ib", {optO32}, {cpu386});
  1318. AddInstruction("reg/mem64,uimm8", "0FBA/5ib", {}, {cpuAMD64});
  1319. StartMnemonic(opCALL, "CALL");
  1320. AddInstruction("rel16off", "E8iw", {optO16}, {cpu8086});
  1321. AddInstruction("rel32off", "E8id", {optO32}, {cpu8086});
  1322. AddInstruction("reg/mem16", "FF/2", {optO16}, {cpu8086});
  1323. AddInstruction("reg/mem32", "FF/2", {optO32}, {cpu386});
  1324. AddInstruction("reg/mem64", "FF/2", {optO64}, {cpuAMD64});
  1325. StartMnemonic(opCALLFAR, "CALLFAR");
  1326. AddInstruction("pntr16:16", "9Acd", {optNot64}, {cpu8086});
  1327. AddInstruction("pntr16:32", "9Acp", {optNot64}, {cpu386});
  1328. AddInstruction("mem16:16", "FF/3", {optO16,optNot64}, {cpu8086});
  1329. AddInstruction("mem16:32", "FF/3", {optO32,optNot64}, {cpu386});
  1330. StartMnemonic(opCBW, "CBW");
  1331. AddInstruction("", "98", {optO16}, {cpu8086});
  1332. StartMnemonic(opCDQ, "CDQ");
  1333. AddInstruction("", "99", {optO32}, {cpu386});
  1334. StartMnemonic(opCDQE, "CDQE");
  1335. AddInstruction("", "98", {}, {cpuAMD64});
  1336. StartMnemonic(opCLC, "CLC");
  1337. AddInstruction("", "F8", {}, {cpu8086});
  1338. StartMnemonic(opCLD, "CLD");
  1339. AddInstruction("", "FC", {}, {cpu8086});
  1340. StartMnemonic(opCLFLUSH, "CLFLUSH");
  1341. AddInstruction("mem8", "0FAE/7", {}, {cpuSSE2});
  1342. StartMnemonic(opCLGI, "CLGI");
  1343. AddInstruction("", "0F01DD", {}, {cpuAMD64});
  1344. StartMnemonic(opCLI, "CLI");
  1345. AddInstruction("", "FA", {}, {cpu8086});
  1346. StartMnemonic(opCLTS, "CLTS");
  1347. AddInstruction("", "0F06", {}, {cpu286,cpuPrivileged});
  1348. StartMnemonic(opCMC, "CMC");
  1349. AddInstruction("", "F5", {}, {cpu8086});
  1350. StartMnemonic(opCMOVA, "CMOVA");
  1351. AddInstruction("reg16,reg/mem16", "0F47/r", {optO16}, {cpuP6});
  1352. AddInstruction("reg32,reg/mem32", "0F47/r", {optO32}, {cpuP6});
  1353. AddInstruction("reg64,reg/mem64", "0F47/r", {}, {cpuAMD64});
  1354. StartMnemonic(opCMOVAE, "CMOVAE");
  1355. AddInstruction("reg16,reg/mem16", "0F43/r", {optO16}, {cpuP6});
  1356. AddInstruction("reg32,reg/mem32", "0F43/r", {optO32}, {cpuP6});
  1357. AddInstruction("reg64,reg/mem64", "0F43/r", {}, {cpuAMD64});
  1358. StartMnemonic(opCMOVB, "CMOVB");
  1359. AddInstruction("reg16,reg/mem16", "0F42/r", {optO16}, {cpuP6});
  1360. AddInstruction("reg32,reg/mem32", "0F42/r", {optO32}, {cpuP6});
  1361. AddInstruction("reg64,reg/mem64", "0F42/r", {}, {cpuAMD64});
  1362. StartMnemonic(opCMOVBE, "CMOVBE");
  1363. AddInstruction("reg16,reg/mem16", "0F46/r", {optO16}, {cpuP6});
  1364. AddInstruction("reg32,reg/mem32", "0F46/r", {optO32}, {cpuP6});
  1365. AddInstruction("reg64,reg/mem64", "0F46/r", {}, {cpuAMD64});
  1366. StartMnemonic(opCMOVC, "CMOVC");
  1367. AddInstruction("reg16,reg/mem16", "0F42/r", {optO16}, {cpuP6});
  1368. AddInstruction("reg32,reg/mem32", "0F42/r", {optO32}, {cpuP6});
  1369. AddInstruction("reg64,reg/mem64", "0F42/r", {}, {cpuAMD64});
  1370. StartMnemonic(opCMOVE, "CMOVE");
  1371. AddInstruction("reg16,reg/mem16", "0F44/r", {optO16}, {cpuP6});
  1372. AddInstruction("reg32,reg/mem32", "0F44/r", {optO32}, {cpuP6});
  1373. AddInstruction("reg64,reg/mem64", "0F44/r", {}, {cpuAMD64});
  1374. StartMnemonic(opCMOVG, "CMOVG");
  1375. AddInstruction("reg16,reg/mem16", "0F4F/r", {optO16}, {cpuP6});
  1376. AddInstruction("reg32,reg/mem32", "0F4F/r", {optO32}, {cpuP6});
  1377. AddInstruction("reg64,reg/mem64", "0F4F/r", {}, {cpuAMD64});
  1378. StartMnemonic(opCMOVGE, "CMOVGE");
  1379. AddInstruction("reg16,reg/mem16", "0F4D/r", {optO16}, {cpuP6});
  1380. AddInstruction("reg32,reg/mem32", "0F4D/r", {optO32}, {cpuP6});
  1381. AddInstruction("reg64,reg/mem64", "0F4D/r", {}, {cpuAMD64});
  1382. StartMnemonic(opCMOVL, "CMOVL");
  1383. AddInstruction("reg16,reg/mem16", "0F4C/r", {optO16}, {cpuP6});
  1384. AddInstruction("reg32,reg/mem32", "0F4C/r", {optO32}, {cpuP6});
  1385. AddInstruction("reg64,reg/mem64", "0F4C/r", {}, {cpuAMD64});
  1386. StartMnemonic(opCMOVLE, "CMOVLE");
  1387. AddInstruction("reg16,reg/mem16", "0F4E/r", {optO16}, {cpuP6});
  1388. AddInstruction("reg32,reg/mem32", "0F4E/r", {optO32}, {cpuP6});
  1389. AddInstruction("reg64,reg/mem64", "0F4E/r", {}, {cpuAMD64});
  1390. StartMnemonic(opCMOVNA, "CMOVNA");
  1391. AddInstruction("reg16,reg/mem16", "0F46/r", {optO16}, {cpuP6});
  1392. AddInstruction("reg32,reg/mem32", "0F46/r", {optO32}, {cpuP6});
  1393. AddInstruction("reg64,reg/mem64", "0F46/r", {}, {cpuAMD64});
  1394. StartMnemonic(opCMOVNAE, "CMOVNAE");
  1395. AddInstruction("reg16,reg/mem16", "0F42/r", {optO16}, {cpuP6});
  1396. AddInstruction("reg32,reg/mem32", "0F42/r", {optO32}, {cpuP6});
  1397. AddInstruction("reg64,reg/mem64", "0F42/r", {}, {cpuAMD64});
  1398. StartMnemonic(opCMOVNB, "CMOVNB");
  1399. AddInstruction("reg16,reg/mem16", "0F43/r", {optO16}, {cpuP6});
  1400. AddInstruction("reg32,reg/mem32", "0F43/r", {optO32}, {cpuP6});
  1401. AddInstruction("reg64,reg/mem64", "0F43/r", {}, {cpuAMD64});
  1402. StartMnemonic(opCMOVNBE, "CMOVNBE");
  1403. AddInstruction("reg16,reg/mem16", "0F47/r", {optO16}, {cpuP6});
  1404. AddInstruction("reg32,reg/mem32", "0F47/r", {optO32}, {cpuP6});
  1405. AddInstruction("reg64,reg/mem64", "0F47/r", {}, {cpuAMD64});
  1406. StartMnemonic(opCMOVNC, "CMOVNC");
  1407. AddInstruction("reg16,reg/mem16", "0F43/r", {optO16}, {cpuP6});
  1408. AddInstruction("reg32,reg/mem32", "0F43/r", {optO32}, {cpuP6});
  1409. AddInstruction("reg64,reg/mem64", "0F43/r", {}, {cpuAMD64});
  1410. StartMnemonic(opCMOVNE, "CMOVNE");
  1411. AddInstruction("reg16,reg/mem16", "0F45/r", {optO16}, {cpuP6});
  1412. AddInstruction("reg32,reg/mem32", "0F45/r", {optO32}, {cpuP6});
  1413. AddInstruction("reg64,reg/mem64", "0F45/r", {}, {cpuAMD64});
  1414. StartMnemonic(opCMOVNG, "CMOVNG");
  1415. AddInstruction("reg16,reg/mem16", "0F4E/r", {optO16}, {cpuP6});
  1416. AddInstruction("reg32,reg/mem32", "0F4E/r", {optO32}, {cpuP6});
  1417. AddInstruction("reg64,reg/mem64", "0F4E/r", {}, {cpuAMD64});
  1418. StartMnemonic(opCMOVNGE, "CMOVNGE");
  1419. AddInstruction("reg16,reg/mem16", "0F4C/r", {optO16}, {cpuP6});
  1420. AddInstruction("reg32,reg/mem32", "0F4C/r", {optO32}, {cpuP6});
  1421. AddInstruction("reg64,reg/mem64", "0F4C/r", {}, {cpuAMD64});
  1422. StartMnemonic(opCMOVNL, "CMOVNL");
  1423. AddInstruction("reg16,reg/mem16", "0F4D/r", {optO16}, {cpuP6});
  1424. AddInstruction("reg32,reg/mem32", "0F4D/r", {optO32}, {cpuP6});
  1425. AddInstruction("reg64,reg/mem64", "0F4D/r", {}, {cpuAMD64});
  1426. StartMnemonic(opCMOVNLE, "CMOVNLE");
  1427. AddInstruction("reg16,reg/mem16", "0F4F/r", {optO16}, {cpuP6});
  1428. AddInstruction("reg32,reg/mem32", "0F4F/r", {optO32}, {cpuP6});
  1429. AddInstruction("reg64,reg/mem64", "0F4F/r", {}, {cpuAMD64});
  1430. StartMnemonic(opCMOVNO, "CMOVNO");
  1431. AddInstruction("reg16,reg/mem16", "0F41/r", {optO16}, {cpuP6});
  1432. AddInstruction("reg32,reg/mem32", "0F41/r", {optO32}, {cpuP6});
  1433. AddInstruction("reg64,reg/mem64", "0F41/r", {}, {cpuAMD64});
  1434. StartMnemonic(opCMOVNP, "CMOVNP");
  1435. AddInstruction("reg16,reg/mem16", "0F4B/r", {optO16}, {cpuP6});
  1436. AddInstruction("reg32,reg/mem32", "0F4B/r", {optO32}, {cpuP6});
  1437. AddInstruction("reg64,reg/mem64", "0F4B/r", {}, {cpuAMD64});
  1438. StartMnemonic(opCMOVNS, "CMOVNS");
  1439. AddInstruction("reg16,reg/mem16", "0F49/r", {optO16}, {cpuP6});
  1440. AddInstruction("reg32,reg/mem32", "0F49/r", {optO32}, {cpuP6});
  1441. AddInstruction("reg64,reg/mem64", "0F49/r", {}, {cpuAMD64});
  1442. StartMnemonic(opCMOVNZ, "CMOVNZ");
  1443. AddInstruction("reg16,reg/mem16", "0F45/r", {optO16}, {cpuP6});
  1444. AddInstruction("reg32,reg/mem32", "0F45/r", {optO32}, {cpuP6});
  1445. AddInstruction("reg64,reg/mem64", "0F45/r", {}, {cpuAMD64});
  1446. StartMnemonic(opCMOVO, "CMOVO");
  1447. AddInstruction("reg16,reg/mem16", "0F40/r", {optO16}, {cpuP6});
  1448. AddInstruction("reg32,reg/mem32", "0F40/r", {optO32}, {cpuP6});
  1449. AddInstruction("reg64,reg/mem64", "0F40/r", {}, {cpuAMD64});
  1450. StartMnemonic(opCMOVP, "CMOVP");
  1451. AddInstruction("reg16,reg/mem16", "0F4A/r", {optO16}, {cpuP6});
  1452. AddInstruction("reg32,reg/mem32", "0F4A/r", {optO32}, {cpuP6});
  1453. AddInstruction("reg64,reg/mem64", "0F4A/r", {}, {cpuAMD64});
  1454. StartMnemonic(opCMOVPE, "CMOVPE");
  1455. AddInstruction("reg16,reg/mem16", "0F4A/r", {optO16}, {cpuP6});
  1456. AddInstruction("reg32,reg/mem32", "0F4A/r", {optO32}, {cpuP6});
  1457. AddInstruction("reg64,reg/mem64", "0F4A/r", {}, {cpuAMD64});
  1458. StartMnemonic(opCMOVPO, "CMOVPO");
  1459. AddInstruction("reg16,reg/mem16", "0F4B/r", {optO16}, {cpuP6});
  1460. AddInstruction("reg32,reg/mem32", "0F4B/r", {optO32}, {cpuP6});
  1461. AddInstruction("reg64,reg/mem64", "0F4B/r", {}, {cpuAMD64});
  1462. StartMnemonic(opCMOVS, "CMOVS");
  1463. AddInstruction("reg16,reg/mem16", "0F48/r", {optO16}, {cpuP6});
  1464. AddInstruction("reg32,reg/mem32", "0F48/r", {optO32}, {cpuP6});
  1465. AddInstruction("reg64,reg/mem64", "0F48/r", {}, {cpuAMD64});
  1466. StartMnemonic(opCMOVZ, "CMOVZ");
  1467. AddInstruction("reg16,reg/mem16", "0F44/r", {optO16}, {cpuP6});
  1468. AddInstruction("reg32,reg/mem32", "0F44/r", {optO32}, {cpuP6});
  1469. AddInstruction("reg64,reg/mem64", "0F44/r", {}, {cpuAMD64});
  1470. StartMnemonic(opCMP, "CMP");
  1471. AddInstruction("reg/mem8,reg8", "38/r", {}, {cpu8086});
  1472. AddInstruction("reg/mem16,reg16", "39/r", {optO16}, {cpu8086});
  1473. AddInstruction("reg/mem32,reg32", "39/r", {optO32}, {cpu386});
  1474. AddInstruction("reg/mem64,reg64", "39/r", {}, {cpuAMD64});
  1475. AddInstruction("reg8,reg/mem8", "3A/r", {}, {cpu8086});
  1476. AddInstruction("reg16,reg/mem16", "3B/r", {optO16}, {cpu8086});
  1477. AddInstruction("reg32,reg/mem32", "3B/r", {optO32}, {cpu386});
  1478. AddInstruction("reg64,reg/mem64", "3B/r", {}, {cpuAMD64});
  1479. AddInstruction("AL,imm8", "3Cib", {}, {cpu8086});
  1480. AddInstruction("AX,imm16", "3Diw", {optO16}, {cpu8086});
  1481. AddInstruction("EAX,imm32", "3Did", {optO32}, {cpu386});
  1482. AddInstruction("RAX,simm32", "3Did", {}, {cpuAMD64});
  1483. AddInstruction("reg/mem8,imm8", "80/7ib", {}, {cpu8086});
  1484. AddInstruction("reg/mem16,imm16", "81/7iw", {optO16}, {cpu8086});
  1485. AddInstruction("reg/mem32,imm32", "81/7id", {optO32}, {cpu386});
  1486. AddInstruction("reg/mem64,simm32", "81/7id", {}, {cpuAMD64});
  1487. AddInstruction("reg/mem16,simm8", "83/7ib", {optO16}, {cpu8086});
  1488. AddInstruction("reg/mem32,simm8", "83/7ib", {optO32}, {cpu386});
  1489. AddInstruction("reg/mem64,simm8", "83/7ib", {}, {cpuAMD64});
  1490. StartMnemonic(opCMPPD, "CMPPD");
  1491. AddInstruction("xmm1,xmm2/mem128,uimm8", "660FC2/rib", {}, {cpuSSE2});
  1492. StartMnemonic(opCMPPS, "CMPPS");
  1493. AddInstruction("xmm1,xmm2/mem128,uimm8", "0FC2/rib", {}, {cpuSSE});
  1494. StartMnemonic(opCMPS, "CMPS");
  1495. AddInstruction("mem8,mem8", "A6", {}, {cpu8086});
  1496. AddInstruction("mem16,mem16", "A7", {optO16}, {cpu8086});
  1497. AddInstruction("mem32,mem32", "A7", {optO32}, {cpu386});
  1498. AddInstruction("mem64,mem64", "A7", {}, {cpuAMD64});
  1499. StartMnemonic(opCMPSB, "CMPSB");
  1500. AddInstruction("", "A6", {}, {cpu8086});
  1501. StartMnemonic(opCMPSD, "CMPSD");
  1502. AddInstruction("", "A7", {optO32}, {cpu386});
  1503. AddInstruction("xmm1,xmm2/mem64,uimm8", "F20FC2/rib", {}, {cpuSSE2});
  1504. StartMnemonic(opCMPSQ, "CMPSQ");
  1505. AddInstruction("", "A7", {}, {cpuAMD64});
  1506. StartMnemonic(opCMPSS, "CMPSS");
  1507. AddInstruction("xmm1,xmm2/mem32,uimm8", "F30FC2/rib", {}, {cpuSSE});
  1508. StartMnemonic(opCMPSW, "CMPSW");
  1509. AddInstruction("", "A7", {optO16}, {cpu8086});
  1510. StartMnemonic(opCMPXCHG, "CMPXCHG");
  1511. AddInstruction("reg/mem8,reg8", "0FB0/r", {}, {cpuPentium});
  1512. AddInstruction("reg/mem16,reg16", "0FB1/r", {optO16}, {cpuPentium});
  1513. AddInstruction("reg/mem32,reg32", "0FB1/r", {optO32}, {cpuPentium});
  1514. AddInstruction("reg/mem64,reg64", "0FB1/r", {}, {cpuAMD64});
  1515. StartMnemonic(opCMPXCHG16B, "CMPXCHG16B");
  1516. AddInstruction("mem128", "0FC7/1m1", {}, {cpuSSE2});
  1517. StartMnemonic(opCMPXCHG8B, "CMPXCHG8B");
  1518. AddInstruction("mem64", "0FC7/1m6", {}, {cpuPentium});
  1519. StartMnemonic(opCOMISD, "COMISD");
  1520. AddInstruction("xmm1,xmm2/mem64", "660F2F/r", {}, {cpuSSE2});
  1521. StartMnemonic(opCOMISS, "COMISS");
  1522. AddInstruction("xmm1,xmm2/mem32", "0F2F/r", {}, {cpuSSE});
  1523. StartMnemonic(opCPUID, "CPUID");
  1524. AddInstruction("", "0FA2", {}, {cpuPentium});
  1525. StartMnemonic(opCQO, "CQO");
  1526. AddInstruction("", "99", {optO64}, {cpuAMD64});
  1527. StartMnemonic(opCVTDQ2PD, "CVTDQ2PD");
  1528. AddInstruction("xmm1,xmm2/mem64", "F30FE6/r", {}, {cpuSSE2});
  1529. StartMnemonic(opCVTDQ2PS, "CVTDQ2PS");
  1530. AddInstruction("xmm1,xmm2/mem128", "0F5B/r", {}, {cpuSSE2});
  1531. StartMnemonic(opCVTPD2DQ, "CVTPD2DQ");
  1532. AddInstruction("xmm1,xmm2/mem128", "F20FE6/r", {}, {cpuSSE2});
  1533. StartMnemonic(opCVTPD2PI, "CVTPD2PI");
  1534. AddInstruction("mmx,xmm2/mem128", "660F2D/r", {}, {cpuSSE2});
  1535. AddInstruction("mmx,xmm2/mem128", "660F2D/r", {}, {cpuSSE2});
  1536. AddInstruction("mmx,xmm/mem128", "660F2C/r", {}, {cpuSSE2});
  1537. StartMnemonic(opCVTPD2PS, "CVTPD2PS");
  1538. AddInstruction("xmm1,xmm2/mem128", "660F5A/r", {}, {cpuSSE2});
  1539. StartMnemonic(opCVTPI2PD, "CVTPI2PD");
  1540. AddInstruction("xmm,mmx/mem64", "660F2A/r", {}, {cpuSSE2});
  1541. AddInstruction("xmm,mmx/mem64", "660F2A/r", {}, {cpuSSE2});
  1542. StartMnemonic(opCVTPI2PS, "CVTPI2PS");
  1543. AddInstruction("xmm,mmx/mem64", "0F2A/r", {}, {cpuSSE});
  1544. AddInstruction("xmm,mmx/mem64", "0F2A/r", {}, {cpuSSE});
  1545. StartMnemonic(opCVTPS2DQ, "CVTPS2DQ");
  1546. AddInstruction("xmm1,xmm2/mem128", "660F5B/r", {}, {cpuSSE2});
  1547. StartMnemonic(opCVTPS2PD, "CVTPS2PD");
  1548. AddInstruction("xmm1,xmm2/mem64", "0F5A/r", {}, {cpuSSE2});
  1549. StartMnemonic(opCVTPS2PI, "CVTPS2PI");
  1550. AddInstruction("mmx,xmm/mem64", "0F2D/r", {}, {cpuSSE});
  1551. AddInstruction("mmx,xmm/mem64", "0F2D/r", {}, {cpuSSE});
  1552. StartMnemonic(opCVTSD2SI, "CVTSD2SI");
  1553. AddInstruction("reg32,xmm/mem64", "F20F2D/r", {}, {cpuSSE2});
  1554. AddInstruction("reg64,xmm/mem64", "F20F2D/r", {}, {cpuAMD64,cpuSSE2});
  1555. StartMnemonic(opCVTSD2SS, "CVTSD2SS");
  1556. AddInstruction("xmm1,xmm2/mem64", "F20F5A/r", {}, {cpuSSE2});
  1557. StartMnemonic(opCVTSI2SD, "CVTSI2SD");
  1558. AddInstruction("xmm,reg/mem32", "F20F2A/r", {}, {cpuSSE2});
  1559. AddInstruction("xmm,reg/mem64", "F20F2A/r", {}, {cpuAMD64,cpuSSE2});
  1560. StartMnemonic(opCVTSI2SS, "CVTSI2SS");
  1561. AddInstruction("xmm,reg/mem32", "F30F2A/r", {}, {cpuSSE});
  1562. AddInstruction("xmm,reg/mem64", "F30F2A/r", {}, {cpuAMD64,cpuSSE});
  1563. StartMnemonic(opCVTSS2SD, "CVTSS2SD");
  1564. AddInstruction("xmm1,xmm2/mem32", "F30F5A/r", {}, {cpuSSE2});
  1565. StartMnemonic(opCVTSS2SI, "CVTSS2SI");
  1566. AddInstruction("reg32,xmm2/mem32", "F30F2D/r", {}, {cpuSSE});
  1567. AddInstruction("reg64,xmm2/mem32", "F30F2D/r", {}, {cpuAMD64,cpuSSE});
  1568. StartMnemonic(opCVTTPD2DQ, "CVTTPD2DQ");
  1569. AddInstruction("xmm1,xmm2/mem128", "660FE6/r", {}, {cpuSSE2});
  1570. StartMnemonic(opCVTTPD2PI, "CVTTPD2PI");
  1571. AddInstruction("mmx,xmm/mem128", "660F2C/r", {}, {cpuSSE2});
  1572. StartMnemonic(opCVTTPS2DQ, "CVTTPS2DQ");
  1573. AddInstruction("xmm1,xmm2/mem128", "F30F5B/r", {}, {cpuSSE2});
  1574. StartMnemonic(opCVTTPS2PI, "CVTTPS2PI");
  1575. AddInstruction("mmx,xmm/mem64", "0F2C/r", {}, {cpuSSE});
  1576. AddInstruction("mmx,xmm/mem64", "0F2C/r", {}, {cpuSSE});
  1577. StartMnemonic(opCVTTSD2SI, "CVTTSD2SI");
  1578. AddInstruction("reg32,xmm/mem64", "F20F2C/r", {}, {cpuSSE2});
  1579. AddInstruction("reg64,xmm/mem64", "F20F2C/r", {}, {cpuAMD64,cpuSSE2});
  1580. StartMnemonic(opCVTTSS2SI, "CVTTSS2SI");
  1581. AddInstruction("reg32,xmm/mem32", "F30F2C/r", {}, {cpuSSE});
  1582. AddInstruction("reg64,xmm/mem32", "F30F2C/r", {}, {cpuAMD64,cpuSSE});
  1583. StartMnemonic(opCWD, "CWD");
  1584. AddInstruction("", "99", {optO16}, {cpu8086});
  1585. StartMnemonic(opCWDE, "CWDE");
  1586. AddInstruction("", "98", {optO32}, {cpu386});
  1587. StartMnemonic(opDAA, "DAA");
  1588. AddInstruction("", "27", {optNot64}, {cpu8086});
  1589. StartMnemonic(opDAS, "DAS");
  1590. AddInstruction("", "2F", {optNot64}, {cpu8086});
  1591. StartMnemonic(opDEC, "DEC");
  1592. AddInstruction("reg16", "48rw", {optO16}, {cpu8086});
  1593. AddInstruction("reg32", "48rd", {optO32}, {cpu386});
  1594. AddInstruction("reg/mem8", "FE/1", {}, {cpu8086});
  1595. AddInstruction("reg/mem16", "FF/1", {optO16}, {cpu8086});
  1596. AddInstruction("reg/mem32", "FF/1", {optO32}, {cpu386});
  1597. AddInstruction("reg/mem64", "FF/1", {}, {cpuAMD64});
  1598. StartMnemonic(opDIV, "DIV");
  1599. AddInstruction("reg/mem8", "F6/6", {}, {cpu8086});
  1600. AddInstruction("reg/mem16", "F7/6", {optO16}, {cpu8086});
  1601. AddInstruction("reg/mem32", "F7/6", {optO32}, {cpu386});
  1602. AddInstruction("reg/mem64", "F7/6", {}, {cpuAMD64});
  1603. StartMnemonic(opDIVPD, "DIVPD");
  1604. AddInstruction("xmm1,xmm2/mem128", "660F5E/r", {}, {cpuSSE2});
  1605. StartMnemonic(opDIVPS, "DIVPS");
  1606. AddInstruction("xmm1,xmm2/mem128", "0F5E/r", {}, {cpuSSE});
  1607. StartMnemonic(opDIVSD, "DIVSD");
  1608. AddInstruction("xmm1,xmm2/mem64", "F20F5E/r", {}, {cpuSSE2});
  1609. StartMnemonic(opDIVSS, "DIVSS");
  1610. AddInstruction("xmm1,xmm2/mem32", "F30F5E/r", {}, {cpuSSE});
  1611. StartMnemonic(opEMMS, "EMMS");
  1612. AddInstruction("", "0F77", {}, {cpuMMX});
  1613. StartMnemonic(opENTER, "ENTER");
  1614. AddInstruction("uimm16,uimm8", "C8iwib", {}, {cpu186});
  1615. StartMnemonic(opF2XM1, "F2XM1");
  1616. AddInstruction("", "D9F0", {}, {cpu8086,cpuFPU});
  1617. StartMnemonic(opFABS, "FABS");
  1618. AddInstruction("", "D9E1", {}, {cpu8086,cpuFPU});
  1619. StartMnemonic(opFADD, "FADD");
  1620. AddInstruction("mem32real", "D8/0", {}, {cpu8086,cpuFPU});
  1621. AddInstruction("mem64real", "DC/0", {}, {cpu8086,cpuFPU});
  1622. AddInstruction("ST(0),ST(i)", "D8C0+i", {}, {cpu8086,cpuFPU});
  1623. AddInstruction("ST(i),ST(0)", "DCC0+i", {}, {cpu8086,cpuFPU});
  1624. StartMnemonic(opFADDP, "FADDP");
  1625. AddInstruction("", "DEC1", {}, {cpu8086,cpuFPU});
  1626. AddInstruction("ST(i),ST(0)", "DEC0+i", {}, {cpu8086,cpuFPU});
  1627. StartMnemonic(opFBLD, "FBLD");
  1628. AddInstruction("mem80dec", "DF/4", {}, {cpu8086,cpuFPU});
  1629. StartMnemonic(opFBSTP, "FBSTP");
  1630. AddInstruction("mem80dec", "DF/6", {}, {cpu8086,cpuFPU});
  1631. StartMnemonic(opFCHS, "FCHS");
  1632. AddInstruction("", "D9E0", {}, {cpu8086,cpuFPU});
  1633. StartMnemonic(opFCLEX, "FCLEX");
  1634. AddInstruction("", "9BDBE2", {}, {cpu8086,cpuFPU});
  1635. StartMnemonic(opFCMOVB, "FCMOVB");
  1636. AddInstruction("ST(0),ST(i)", "DAC0+i", {}, {cpuP6,cpuFPU});
  1637. StartMnemonic(opFCMOVBE, "FCMOVBE");
  1638. AddInstruction("ST(0),ST(i)", "DAD0+i", {}, {cpuP6,cpuFPU});
  1639. StartMnemonic(opFCMOVE, "FCMOVE");
  1640. AddInstruction("ST(0),ST(i)", "DAC8+i", {}, {cpuP6,cpuFPU});
  1641. StartMnemonic(opFCMOVNB, "FCMOVNB");
  1642. AddInstruction("ST(0),ST(i)", "DBC0+i", {}, {cpuP6,cpuFPU});
  1643. StartMnemonic(opFCMOVNBE, "FCMOVNBE");
  1644. AddInstruction("ST(0),ST(i)", "DBD0+i", {}, {cpuP6,cpuFPU});
  1645. StartMnemonic(opFCMOVNE, "FCMOVNE");
  1646. AddInstruction("ST(0),ST(i)", "DBC8+i", {}, {cpuP6,cpuFPU});
  1647. StartMnemonic(opFCMOVNU, "FCMOVNU");
  1648. AddInstruction("ST(0),ST(i)", "DBD8+i", {}, {cpuP6,cpuFPU});
  1649. StartMnemonic(opFCMOVU, "FCMOVU");
  1650. AddInstruction("ST(0),ST(i)", "DAD8+i", {}, {cpuP6,cpuFPU});
  1651. StartMnemonic(opFCOM, "FCOM");
  1652. AddInstruction("", "D8D1", {}, {cpu8086,cpuFPU});
  1653. AddInstruction("ST(i)", "D8D0+i", {}, {cpu8086,cpuFPU});
  1654. AddInstruction("mem32real", "D8/2", {}, {cpu8086,cpuFPU});
  1655. AddInstruction("mem64real", "DC/2", {}, {cpu8086,cpuFPU});
  1656. StartMnemonic(opFCOMI, "FCOMI");
  1657. AddInstruction("ST(0),ST(i)", "DBF0+i", {}, {cpuP6,cpuFPU});
  1658. StartMnemonic(opFCOMIP, "FCOMIP");
  1659. AddInstruction("ST(0),ST(i)", "DFF0+i", {}, {cpuP6,cpuFPU});
  1660. StartMnemonic(opFCOMP, "FCOMP");
  1661. AddInstruction("", "D8D9", {}, {cpu8086,cpuFPU});
  1662. AddInstruction("ST(i)", "D8D8+i", {}, {cpu8086,cpuFPU});
  1663. AddInstruction("mem32real", "D8/3", {}, {cpu8086,cpuFPU});
  1664. AddInstruction("mem64real", "DC/3", {}, {cpu8086,cpuFPU});
  1665. StartMnemonic(opFCOMPP, "FCOMPP");
  1666. AddInstruction("", "DED9", {}, {cpu8086,cpuFPU});
  1667. StartMnemonic(opFCOS, "FCOS");
  1668. AddInstruction("", "D9FF", {}, {cpu386,cpuFPU});
  1669. StartMnemonic(opFDECSTP, "FDECSTP");
  1670. AddInstruction("", "D9F6", {}, {cpu8086,cpuFPU});
  1671. StartMnemonic(opFDIV, "FDIV");
  1672. AddInstruction("mem32real", "D8/6", {}, {cpu8086,cpuFPU});
  1673. AddInstruction("mem64real", "DC/6", {}, {cpu8086,cpuFPU});
  1674. AddInstruction("ST(0),ST(i)", "D8F0+i", {}, {cpu8086,cpuFPU});
  1675. AddInstruction("ST(i),ST(0)", "DCF8+i", {}, {cpu8086,cpuFPU});
  1676. StartMnemonic(opFDIVP, "FDIVP");
  1677. AddInstruction("", "DEF9", {}, {cpu8086,cpuFPU});
  1678. AddInstruction("ST(i),ST(0)", "DEF8+i", {}, {cpu8086,cpuFPU});
  1679. StartMnemonic(opFDIVR, "FDIVR");
  1680. AddInstruction("mem32real", "D8/7", {}, {cpu8086,cpuFPU});
  1681. AddInstruction("mem64real", "DC/7", {}, {cpu8086,cpuFPU});
  1682. AddInstruction("ST(0),ST(i)", "D8F8+i", {}, {cpu8086,cpuFPU});
  1683. AddInstruction("ST(i),ST(0)", "DCF0+i", {}, {cpu8086,cpuFPU});
  1684. StartMnemonic(opFDIVRP, "FDIVRP");
  1685. AddInstruction("", "DEF1", {}, {cpu8086,cpuFPU});
  1686. AddInstruction("ST(i),ST(0)", "DEF0+i", {}, {cpu8086,cpuFPU});
  1687. StartMnemonic(opFEMMS, "FEMMS");
  1688. AddInstruction("", "0F0E", {}, {cpu3DNow});
  1689. StartMnemonic(opFFREE, "FFREE");
  1690. AddInstruction("ST(i)", "DDC0+i", {}, {cpu8086,cpuFPU});
  1691. StartMnemonic(opFIADD, "FIADD");
  1692. AddInstruction("mem16int", "DE/0", {}, {cpu8086,cpuFPU});
  1693. AddInstruction("mem32int", "DA/0", {}, {cpu8086,cpuFPU});
  1694. StartMnemonic(opFICOM, "FICOM");
  1695. AddInstruction("mem16int", "DE/2", {}, {cpu8086,cpuFPU});
  1696. AddInstruction("mem32int", "DA/2", {}, {cpu8086,cpuFPU});
  1697. StartMnemonic(opFICOMP, "FICOMP");
  1698. AddInstruction("mem16int", "DE/3", {}, {cpu8086,cpuFPU});
  1699. AddInstruction("mem32int", "DA/3", {}, {cpu8086,cpuFPU});
  1700. StartMnemonic(opFIDIV, "FIDIV");
  1701. AddInstruction("mem16int", "DE/6", {}, {cpu8086,cpuFPU});
  1702. AddInstruction("mem32int", "DA/6", {}, {cpu8086,cpuFPU});
  1703. StartMnemonic(opFIDIVR, "FIDIVR");
  1704. AddInstruction("mem16int", "DE/7", {}, {cpu8086,cpuFPU});
  1705. AddInstruction("mem32int", "DA/7", {}, {cpu8086,cpuFPU});
  1706. StartMnemonic(opFILD, "FILD");
  1707. AddInstruction("mem16int", "DF/0", {}, {cpu8086,cpuFPU});
  1708. AddInstruction("mem32int", "DB/0", {}, {cpu8086,cpuFPU});
  1709. AddInstruction("mem64int", "DF/5", {}, {cpu8086,cpuFPU});
  1710. StartMnemonic(opFIMUL, "FIMUL");
  1711. AddInstruction("mem16int", "DE/1", {}, {cpu8086,cpuFPU});
  1712. AddInstruction("mem32int", "DA/1", {}, {cpu8086,cpuFPU});
  1713. StartMnemonic(opFINCSTP, "FINCSTP");
  1714. AddInstruction("", "D9F7", {}, {cpu8086,cpuFPU});
  1715. StartMnemonic(opFINIT, "FINIT");
  1716. AddInstruction("", "9BDBE3", {}, {cpu8086,cpuFPU});
  1717. StartMnemonic(opFIST, "FIST");
  1718. AddInstruction("mem16int", "DF/2", {}, {cpu8086,cpuFPU});
  1719. AddInstruction("mem32int", "DB/2", {}, {cpu8086,cpuFPU});
  1720. StartMnemonic(opFISTP, "FISTP");
  1721. AddInstruction("mem16int", "DF/3", {}, {cpu8086,cpuFPU});
  1722. AddInstruction("mem32int", "DB/3", {}, {cpu8086,cpuFPU});
  1723. AddInstruction("mem64int", "DF/7", {}, {cpu8086,cpuFPU});
  1724. StartMnemonic(opFISTTP, "FISTTP");
  1725. AddInstruction("mem16int", "DF/1", {}, {cpuFPU});
  1726. AddInstruction("mem32int", "DB/1", {}, {cpuFPU});
  1727. AddInstruction("mem64int", "DD/1", {}, {cpuFPU});
  1728. StartMnemonic(opFISUB, "FISUB");
  1729. AddInstruction("mem16int", "DE/4", {}, {cpu8086,cpuFPU});
  1730. AddInstruction("mem32int", "DA/4", {}, {cpu8086,cpuFPU});
  1731. StartMnemonic(opFISUBR, "FISUBR");
  1732. AddInstruction("mem16int", "DE/5", {}, {cpu8086,cpuFPU});
  1733. AddInstruction("mem32int", "DA/5", {}, {cpu8086,cpuFPU});
  1734. StartMnemonic(opFLD, "FLD");
  1735. AddInstruction("ST(i)", "D9C0+i", {}, {cpu8086,cpuFPU});
  1736. AddInstruction("mem32real", "D9/0", {}, {cpu8086,cpuFPU});
  1737. AddInstruction("mem64real", "DD/0", {}, {cpu8086,cpuFPU});
  1738. AddInstruction("mem80real", "DB/5", {}, {cpu8086,cpuFPU});
  1739. StartMnemonic(opFLD1, "FLD1");
  1740. AddInstruction("", "D9E8", {}, {cpu8086,cpuFPU});
  1741. StartMnemonic(opFLDCW, "FLDCW");
  1742. AddInstruction("mem2env", "D9/5", {}, {cpu8086,cpuFPU});
  1743. StartMnemonic(opFLDENV, "FLDENV");
  1744. AddInstruction("mem14/28env", "D9/4", {}, {cpu8086,cpuFPU});
  1745. StartMnemonic(opFLDL2E, "FLDL2E");
  1746. AddInstruction("", "D9EA", {}, {cpu8086,cpuFPU});
  1747. StartMnemonic(opFLDL2T, "FLDL2T");
  1748. AddInstruction("", "D9E9", {}, {cpu8086,cpuFPU});
  1749. StartMnemonic(opFLDLG2, "FLDLG2");
  1750. AddInstruction("", "D9EC", {}, {cpu8086,cpuFPU});
  1751. StartMnemonic(opFLDLN2, "FLDLN2");
  1752. AddInstruction("", "D9ED", {}, {cpu8086,cpuFPU});
  1753. StartMnemonic(opFLDPI, "FLDPI");
  1754. AddInstruction("", "D9EB", {}, {cpu8086,cpuFPU});
  1755. StartMnemonic(opFLDZ, "FLDZ");
  1756. AddInstruction("", "D9EE", {}, {cpu8086,cpuFPU});
  1757. StartMnemonic(opFMUL, "FMUL");
  1758. AddInstruction("mem32real", "D8/1", {}, {cpu8086,cpuFPU});
  1759. AddInstruction("mem64real", "DC/1", {}, {cpu8086,cpuFPU});
  1760. AddInstruction("ST(0),ST(i)", "D8C8+i", {}, {cpu8086,cpuFPU});
  1761. AddInstruction("ST(i),ST(0)", "DCC8+i", {}, {cpu8086,cpuFPU});
  1762. StartMnemonic(opFMULP, "FMULP");
  1763. AddInstruction("", "DEC9", {}, {cpu8086,cpuFPU});
  1764. AddInstruction("ST(i),ST(0)", "DEC8+i", {}, {cpu8086,cpuFPU});
  1765. StartMnemonic(opFNCLEX, "FNCLEX");
  1766. AddInstruction("", "DBE2", {}, {cpu8086,cpuFPU});
  1767. StartMnemonic(opFNINIT, "FNINIT");
  1768. AddInstruction("", "DBE3", {}, {cpu8086,cpuFPU});
  1769. StartMnemonic(opFNOP, "FNOP");
  1770. AddInstruction("", "D9D0", {}, {cpu8086,cpuFPU});
  1771. StartMnemonic(opFNSAVE, "FNSAVE");
  1772. AddInstruction("mem94/108env", "DD/6", {}, {cpu8086,cpuFPU});
  1773. AddInstruction("mem94/108env", "DD/6", {}, {cpu8086,cpuFPU});
  1774. StartMnemonic(opFNSTCW, "FNSTCW");
  1775. AddInstruction("mem2env", "D9/7", {}, {cpu8086,cpuFPU});
  1776. StartMnemonic(opFNSTENV, "FNSTENV");
  1777. AddInstruction("mem14/28env", "D9/6", {}, {cpu8086,cpuFPU});
  1778. StartMnemonic(opFNSTSW, "FNSTSW");
  1779. AddInstruction("AX", "DFE0", {}, {cpu286,cpuFPU});
  1780. AddInstruction("mem2env", "DD/7", {}, {cpu8086,cpuFPU});
  1781. StartMnemonic(opFPATAN, "FPATAN");
  1782. AddInstruction("", "D9F3", {}, {cpu8086,cpuFPU});
  1783. StartMnemonic(opFPREM, "FPREM");
  1784. AddInstruction("", "D9F8", {}, {cpu8086,cpuFPU});
  1785. StartMnemonic(opFPREM1, "FPREM1");
  1786. AddInstruction("", "D9F5", {}, {cpu386,cpuFPU});
  1787. StartMnemonic(opFPTAN, "FPTAN");
  1788. AddInstruction("", "D9F2", {}, {cpu8086,cpuFPU});
  1789. StartMnemonic(opFRNDINT, "FRNDINT");
  1790. AddInstruction("", "D9FC", {}, {cpu8086,cpuFPU});
  1791. StartMnemonic(opFRSTOR, "FRSTOR");
  1792. AddInstruction("mem94/108env", "DD/4", {}, {cpu8086,cpuFPU});
  1793. AddInstruction("mem94/108env", "DD/4", {}, {cpu8086,cpuFPU});
  1794. StartMnemonic(opFSAVE, "FSAVE");
  1795. AddInstruction("mem94/108env", "9BDD/6", {}, {cpu8086,cpuFPU});
  1796. AddInstruction("mem94/108env", "9BDD/6", {}, {cpu8086,cpuFPU});
  1797. StartMnemonic(opFSCALE, "FSCALE");
  1798. AddInstruction("", "D9FD", {}, {cpu8086,cpuFPU});
  1799. StartMnemonic(opFSIN, "FSIN");
  1800. AddInstruction("", "D9FE", {}, {cpu386,cpuFPU});
  1801. StartMnemonic(opFSINCOS, "FSINCOS");
  1802. AddInstruction("", "D9FB", {}, {cpu386,cpuFPU});
  1803. StartMnemonic(opFSQRT, "FSQRT");
  1804. AddInstruction("", "D9FA", {}, {cpu8086,cpuFPU});
  1805. StartMnemonic(opFST, "FST");
  1806. AddInstruction("ST(i)", "DDD0+i", {}, {cpu8086,cpuFPU});
  1807. AddInstruction("mem32real", "D9/2", {}, {cpu8086,cpuFPU});
  1808. AddInstruction("mem64real", "DD/2", {}, {cpu8086,cpuFPU});
  1809. StartMnemonic(opFSTCW, "FSTCW");
  1810. AddInstruction("mem2env", "9BD9/7", {}, {cpu8086,cpuFPU});
  1811. StartMnemonic(opFSTENV, "FSTENV");
  1812. AddInstruction("mem14/28env", "9BD9/6", {}, {cpu8086,cpuFPU});
  1813. StartMnemonic(opFSTP, "FSTP");
  1814. AddInstruction("ST(i)", "DDD8+i", {}, {cpu8086,cpuFPU});
  1815. AddInstruction("mem32real", "D9/3", {}, {cpu8086,cpuFPU});
  1816. AddInstruction("mem64real", "DD/3", {}, {cpu8086,cpuFPU});
  1817. AddInstruction("mem80real", "DB/7", {}, {cpu8086,cpuFPU});
  1818. StartMnemonic(opFSTSW, "FSTSW");
  1819. AddInstruction("AX", "9BDFE0", {}, {cpu286,cpuFPU});
  1820. AddInstruction("mem2env", "9BDD/7", {}, {cpu8086,cpuFPU});
  1821. StartMnemonic(opFSUB, "FSUB");
  1822. AddInstruction("mem32real", "D8/4", {}, {cpu8086,cpuFPU});
  1823. AddInstruction("mem64real", "DC/4", {}, {cpu8086,cpuFPU});
  1824. AddInstruction("ST(0),ST(i)", "D8E0+i", {}, {cpu8086,cpuFPU});
  1825. AddInstruction("ST(i),ST(0)", "DCE8+i", {}, {cpu8086,cpuFPU});
  1826. StartMnemonic(opFSUBP, "FSUBP");
  1827. AddInstruction("", "DEE9", {}, {cpu8086,cpuFPU});
  1828. AddInstruction("ST(i),ST(0)", "DEE8+i", {}, {cpu8086,cpuFPU});
  1829. StartMnemonic(opFSUBR, "FSUBR");
  1830. AddInstruction("mem32real", "D8/5", {}, {cpu8086,cpuFPU});
  1831. AddInstruction("mem64real", "DC/5", {}, {cpu8086,cpuFPU});
  1832. AddInstruction("ST(0),ST(i)", "D8E8+i", {}, {cpu8086,cpuFPU});
  1833. AddInstruction("ST(i),ST(0)", "DCE0+i", {}, {cpu8086,cpuFPU});
  1834. StartMnemonic(opFSUBRP, "FSUBRP");
  1835. AddInstruction("", "DEE1", {}, {cpu8086,cpuFPU});
  1836. AddInstruction("ST(i),ST(0)", "DEE0+i", {}, {cpu8086,cpuFPU});
  1837. StartMnemonic(opFTST, "FTST");
  1838. AddInstruction("", "D9E4", {}, {cpu8086,cpuFPU});
  1839. StartMnemonic(opFUCOM, "FUCOM");
  1840. AddInstruction("", "DDE1", {}, {cpu386,cpuFPU});
  1841. AddInstruction("ST(i)", "DDE0+i", {}, {cpu386,cpuFPU});
  1842. StartMnemonic(opFUCOMI, "FUCOMI");
  1843. AddInstruction("ST(0),ST(i)", "DBE8+i", {}, {cpuP6,cpuFPU});
  1844. StartMnemonic(opFUCOMIP, "FUCOMIP");
  1845. AddInstruction("ST(0),ST(i)", "DFE8+i", {}, {cpuP6,cpuFPU});
  1846. StartMnemonic(opFUCOMP, "FUCOMP");
  1847. AddInstruction("", "DDE9", {}, {cpu386,cpuFPU});
  1848. AddInstruction("ST(i)", "DDE8+i", {}, {cpu386,cpuFPU});
  1849. StartMnemonic(opFUCOMPP, "FUCOMPP");
  1850. AddInstruction("", "DAE9", {}, {cpu386,cpuFPU});
  1851. StartMnemonic(opFWAIT, "FWAIT");
  1852. AddInstruction("", "9B", {}, {cpu8086});
  1853. StartMnemonic(opFXAM, "FXAM");
  1854. AddInstruction("", "D9E5", {}, {cpu8086,cpuFPU});
  1855. StartMnemonic(opFXCH, "FXCH");
  1856. AddInstruction("", "D9C9", {}, {cpu8086,cpuFPU});
  1857. AddInstruction("ST(i)", "D9C8+i", {}, {cpu8086,cpuFPU});
  1858. StartMnemonic(opFXRSTOR, "FXRSTOR");
  1859. AddInstruction("mem512env", "0FAE/1", {}, {cpuP6,cpuSSE,cpuFPU});
  1860. AddInstruction("mem512env", "0FAE/1", {}, {cpuP6,cpuSSE,cpuFPU});
  1861. AddInstruction("mem512env", "0FAE/1", {}, {cpuP6,cpuSSE,cpuFPU});
  1862. StartMnemonic(opFXSAVE, "FXSAVE");
  1863. AddInstruction("mem512env", "0FAE/0", {}, {cpuP6,cpuSSE,cpuFPU});
  1864. AddInstruction("mem512env", "0FAE/0", {}, {cpuP6,cpuSSE,cpuFPU});
  1865. AddInstruction("mem512env", "0FAE/0", {}, {cpuP6,cpuSSE,cpuFPU});
  1866. StartMnemonic(opFXTRACT, "FXTRACT");
  1867. AddInstruction("", "D9F4", {}, {cpu8086,cpuFPU});
  1868. StartMnemonic(opFYL2X, "FYL2X");
  1869. AddInstruction("", "D9F1", {}, {cpu8086,cpuFPU});
  1870. StartMnemonic(opFYL2XP1, "FYL2XP1");
  1871. AddInstruction("", "D9F9", {}, {cpu8086,cpuFPU});
  1872. StartMnemonic(opHADDPD, "HADDPD");
  1873. AddInstruction("xmm1,xmm2/mem128", "660F7C/r", {}, {cpuSSE3});
  1874. StartMnemonic(opHADDPS, "HADDPS");
  1875. AddInstruction("xmm1,xmm2/mem128", "F20F7C/r", {}, {cpuSSE3});
  1876. StartMnemonic(opHLT, "HLT");
  1877. AddInstruction("", "F4", {}, {cpu8086,cpuPrivileged});
  1878. StartMnemonic(opHSUBPD, "HSUBPD");
  1879. AddInstruction("xmm1,xmm2/mem128", "660F7D/r", {}, {cpuSSE3});
  1880. StartMnemonic(opHSUBPS, "HSUBPS");
  1881. AddInstruction("xmm1,xmm2/mem128", "F20F7D/r", {}, {cpuSSE3});
  1882. StartMnemonic(opIDIV, "IDIV");
  1883. AddInstruction("reg/mem8", "F6/7", {}, {cpu8086});
  1884. AddInstruction("reg/mem16", "F7/7", {optO16}, {cpu8086});
  1885. AddInstruction("reg/mem32", "F7/7", {optO32}, {cpu386});
  1886. AddInstruction("reg/mem64", "F7/7", {}, {cpuAMD64});
  1887. StartMnemonic(opIMUL, "IMUL");
  1888. AddInstruction("reg/mem8", "F6/5", {}, {cpu8086});
  1889. AddInstruction("reg/mem16", "F7/5", {optO16}, {cpu8086});
  1890. AddInstruction("reg/mem32", "F7/5", {optO32}, {cpu386});
  1891. AddInstruction("reg/mem64", "F7/5", {}, {cpuAMD64});
  1892. AddInstruction("reg16,reg/mem16", "0FAF/r", {optO16}, {cpu386});
  1893. AddInstruction("reg32,reg/mem32", "0FAF/r", {optO32}, {cpu386});
  1894. AddInstruction("reg64,reg/mem64", "0FAF/r", {}, {cpuAMD64});
  1895. AddInstruction("reg16,reg/mem16,simm8", "6B/rib", {optO16}, {cpu186});
  1896. AddInstruction("reg32,reg/mem32,simm8", "6B/rib", {optO32}, {cpu386});
  1897. AddInstruction("reg64,reg/mem64,simm8", "6B/rib", {}, {cpuAMD64});
  1898. AddInstruction("reg16,reg/mem16,simm16", "69/riw", {optO16}, {cpu186});
  1899. AddInstruction("reg32,reg/mem32,simm32", "69/rid", {optO32}, {cpu386});
  1900. AddInstruction("reg64,reg/mem64,simm32", "69/rid", {}, {cpuAMD64});
  1901. StartMnemonic(opIN, "IN");
  1902. AddInstruction("AL,uimm8", "E4ib", {}, {cpu8086});
  1903. AddInstruction("AX,uimm8", "E5ib", {optO16}, {cpu8086});
  1904. AddInstruction("EAX,uimm8", "E5ib", {optO32}, {cpu386});
  1905. AddInstruction("AL,DX", "EC", {}, {cpu8086});
  1906. AddInstruction("AX,DX", "ED", {optO16}, {cpu8086});
  1907. AddInstruction("EAX,DX", "ED", {optO32}, {cpu386});
  1908. StartMnemonic(opINC, "INC");
  1909. AddInstruction("reg16", "40rw", {optO16}, {cpu8086});
  1910. AddInstruction("reg32", "40rd", {optO32}, {cpu386});
  1911. AddInstruction("reg/mem8", "FE/0", {}, {cpu8086});
  1912. AddInstruction("reg/mem16", "FF/0", {optO16}, {cpu8086});
  1913. AddInstruction("reg/mem32", "FF/0", {optO32}, {cpu386});
  1914. AddInstruction("reg/mem64", "FF/0", {}, {cpuAMD64});
  1915. StartMnemonic(opINS, "INS");
  1916. AddInstruction("mem8,DX", "6C", {}, {cpu186});
  1917. AddInstruction("mem16,DX", "6D", {optO16}, {cpu186});
  1918. AddInstruction("mem32,DX", "6D", {optO32}, {cpu386});
  1919. StartMnemonic(opINSB, "INSB");
  1920. AddInstruction("", "6C", {}, {cpu186});
  1921. StartMnemonic(opINSD, "INSD");
  1922. AddInstruction("", "6D", {optO32}, {cpu386});
  1923. StartMnemonic(opINSW, "INSW");
  1924. AddInstruction("", "6D", {optO16}, {cpu186});
  1925. StartMnemonic(opINT, "INT");
  1926. AddInstruction("uimm8", "CDib", {}, {cpu8086});
  1927. StartMnemonic(opINT3, "INT3");
  1928. AddInstruction("", "CC", {}, {cpu8086});
  1929. StartMnemonic(opINTO, "INTO");
  1930. AddInstruction("", "CE", {optNot64}, {cpu8086});
  1931. StartMnemonic(opINVD, "INVD");
  1932. AddInstruction("", "0F08", {}, {cpu486,cpuPrivileged});
  1933. StartMnemonic(opINVLPG, "INVLPG");
  1934. AddInstruction("mem8", "0F01/7", {}, {cpu486});
  1935. StartMnemonic(opINVLPGA, "INVLPGA");
  1936. AddInstruction("rAX,ECX", "0F01DF", {}, {cpu386});
  1937. StartMnemonic(opIRET, "IRET");
  1938. AddInstruction("", "CF", {optO16}, {cpu8086});
  1939. StartMnemonic(opIRETD, "IRETD");
  1940. AddInstruction("", "CF", {optO32}, {cpu386});
  1941. StartMnemonic(opIRETQ, "IRETQ");
  1942. AddInstruction("", "CF", {optO64}, {cpuAMD64});
  1943. StartMnemonic(opJA, "JA");
  1944. AddInstruction("rel8off", "77cb", {}, {cpu8086});
  1945. AddInstruction("rel16off", "0F87cw", {optO16}, {cpu386});
  1946. AddInstruction("rel32off", "0F87cd", {optO32}, {cpu386});
  1947. StartMnemonic(opJAE, "JAE");
  1948. AddInstruction("rel8off", "73cb", {}, {cpu8086});
  1949. AddInstruction("rel16off", "0F83cw", {optO16}, {cpu386});
  1950. AddInstruction("rel32off", "0F83cd", {optO32}, {cpu386});
  1951. StartMnemonic(opJB, "JB");
  1952. AddInstruction("rel8off", "72cb", {}, {cpu8086});
  1953. AddInstruction("rel16off", "0F82cw", {optO16}, {cpu386});
  1954. AddInstruction("rel32off", "0F82cd", {optO32}, {cpu386});
  1955. StartMnemonic(opJBE, "JBE");
  1956. AddInstruction("rel8off", "76cb", {}, {cpu8086});
  1957. AddInstruction("rel16off", "0F86cw", {optO16}, {cpu386});
  1958. AddInstruction("rel32off", "0F86cd", {optO32}, {cpu386});
  1959. StartMnemonic(opJC, "JC");
  1960. AddInstruction("rel8off", "72cb", {}, {cpu8086});
  1961. AddInstruction("rel16off", "0F82cw", {optO16}, {cpu386});
  1962. AddInstruction("rel32off", "0F82cd", {optO32}, {cpu386});
  1963. StartMnemonic(opJCXZ, "JCXZ");
  1964. AddInstruction("rel8off", "E3cb", {optA16}, {cpu8086});
  1965. StartMnemonic(opJE, "JE");
  1966. AddInstruction("rel8off", "74cb", {}, {cpu8086});
  1967. AddInstruction("rel16off", "0F84cw", {optO16}, {cpu386});
  1968. AddInstruction("rel32off", "0F84cd", {optO32}, {cpu386});
  1969. StartMnemonic(opJECXZ, "JECXZ");
  1970. AddInstruction("rel8off", "E3cb", {optA32}, {cpu386});
  1971. StartMnemonic(opJG, "JG");
  1972. AddInstruction("rel8off", "7Fcb", {}, {cpu8086});
  1973. AddInstruction("rel16off", "0F8Fcw", {optO16}, {cpu386});
  1974. AddInstruction("rel32off", "0F8Fcd", {optO32}, {cpu386});
  1975. StartMnemonic(opJGE, "JGE");
  1976. AddInstruction("rel8off", "7Dcb", {}, {cpu8086});
  1977. AddInstruction("rel16off", "0F8Dcw", {optO16}, {cpu386});
  1978. AddInstruction("rel32off", "0F8Dcd", {optO32}, {cpu386});
  1979. StartMnemonic(opJL, "JL");
  1980. AddInstruction("rel8off", "7Ccb", {}, {cpu8086});
  1981. AddInstruction("rel16off", "0F8Ccw", {optO16}, {cpu386});
  1982. AddInstruction("rel32off", "0F8Ccd", {optO32}, {cpu386});
  1983. StartMnemonic(opJLE, "JLE");
  1984. AddInstruction("rel8off", "7Ecb", {}, {cpu8086});
  1985. AddInstruction("rel16off", "0F8Ecw", {optO16}, {cpu386});
  1986. AddInstruction("rel32off", "0F8Ecd", {optO32}, {cpu386});
  1987. StartMnemonic(opJMP, "JMP");
  1988. AddInstruction("rel8off", "EBcb", {}, {cpu8086});
  1989. AddInstruction("rel16off", "E9cw", {optO16}, {cpu8086});
  1990. AddInstruction("rel32off", "E9cd", {optO32}, {cpu8086});
  1991. AddInstruction("reg/mem16", "FF/4", {optO16}, {cpu8086});
  1992. AddInstruction("reg/mem32", "FF/4", {optO32}, {cpu386});
  1993. AddInstruction("reg/mem64", "FF/4", {}, {cpuAMD64});
  1994. StartMnemonic(opJMPFAR, "JMPFAR");
  1995. AddInstruction("pntr16:16", "EAcd", {optO16,optNot64}, {cpu8086});
  1996. AddInstruction("pntr16:32", "EAcp", {optO32,optNot64}, {cpu386});
  1997. AddInstruction("mem16:16", "FF/5", {optO16}, {cpu8086});
  1998. AddInstruction("mem16:32", "FF/5", {optO32}, {cpu386});
  1999. StartMnemonic(opJNA, "JNA");
  2000. AddInstruction("rel8off", "76cb", {}, {cpu8086});
  2001. AddInstruction("rel16off", "0F86cw", {optO16}, {cpu386});
  2002. AddInstruction("rel32off", "0F86cd", {optO32}, {cpu386});
  2003. StartMnemonic(opJNAE, "JNAE");
  2004. AddInstruction("rel8off", "72cb", {}, {cpu8086});
  2005. AddInstruction("rel16off", "0F82cw", {optO16}, {cpu386});
  2006. AddInstruction("rel32off", "0F82cd", {optO32}, {cpu386});
  2007. StartMnemonic(opJNB, "JNB");
  2008. AddInstruction("rel8off", "73cb", {}, {cpu8086});
  2009. AddInstruction("rel16off", "0F83cw", {optO16}, {cpu386});
  2010. AddInstruction("rel32off", "0F83cd", {optO32}, {cpu386});
  2011. StartMnemonic(opJNBE, "JNBE");
  2012. AddInstruction("rel8off", "77cb", {}, {cpu8086});
  2013. AddInstruction("rel16off", "0F87cw", {optO16}, {cpu386});
  2014. AddInstruction("rel32off", "0F87cd", {optO32}, {cpu386});
  2015. StartMnemonic(opJNC, "JNC");
  2016. AddInstruction("rel8off", "73cb", {}, {cpu8086});
  2017. AddInstruction("rel16off", "0F83cw", {optO16}, {cpu386});
  2018. AddInstruction("rel32off", "0F83cd", {optO32}, {cpu386});
  2019. StartMnemonic(opJNE, "JNE");
  2020. AddInstruction("rel8off", "75cb", {}, {cpu8086});
  2021. AddInstruction("rel16off", "0F85cw", {optO16}, {cpu386});
  2022. AddInstruction("rel32off", "0F85cd", {optO32}, {cpu386});
  2023. StartMnemonic(opJNG, "JNG");
  2024. AddInstruction("rel8off", "7Ecb", {}, {cpu8086});
  2025. AddInstruction("rel16off", "0F8Ecw", {optO16}, {cpu386});
  2026. AddInstruction("rel32off", "0F8Ecd", {optO32}, {cpu386});
  2027. StartMnemonic(opJNGE, "JNGE");
  2028. AddInstruction("rel8off", "7Ccb", {}, {cpu8086});
  2029. AddInstruction("rel16off", "0F8Ccw", {optO16}, {cpu386});
  2030. AddInstruction("rel32off", "0F8Ccd", {optO32}, {cpu386});
  2031. StartMnemonic(opJNL, "JNL");
  2032. AddInstruction("rel8off", "7Dcb", {}, {cpu8086});
  2033. AddInstruction("rel16off", "0F8Dcw", {optO16}, {cpu386});
  2034. AddInstruction("rel32off", "0F8Dcd", {optO32}, {cpu386});
  2035. StartMnemonic(opJNLE, "JNLE");
  2036. AddInstruction("rel8off", "7Fcb", {}, {cpu8086});
  2037. AddInstruction("rel16off", "0F8Fcw", {optO16}, {cpu386});
  2038. AddInstruction("rel32off", "0F8Fcd", {optO32}, {cpu386});
  2039. StartMnemonic(opJNO, "JNO");
  2040. AddInstruction("rel8off", "71cb", {}, {cpu8086});
  2041. AddInstruction("rel16off", "0F81cw", {optO16}, {cpu386});
  2042. AddInstruction("rel32off", "0F81cd", {optO32}, {cpu386});
  2043. StartMnemonic(opJNP, "JNP");
  2044. AddInstruction("rel8off", "7Bcb", {}, {cpu8086});
  2045. AddInstruction("rel16off", "0F8Bcw", {optO16}, {cpu386});
  2046. AddInstruction("rel32off", "0F8Bcd", {optO32}, {cpu386});
  2047. StartMnemonic(opJNS, "JNS");
  2048. AddInstruction("rel8off", "79cb", {}, {cpu8086});
  2049. AddInstruction("rel16off", "0F89cw", {optO16}, {cpu386});
  2050. AddInstruction("rel32off", "0F89cd", {optO32}, {cpu386});
  2051. StartMnemonic(opJNZ, "JNZ");
  2052. AddInstruction("rel8off", "75cb", {}, {cpu8086});
  2053. AddInstruction("rel16off", "0F85cw", {optO16}, {cpu386});
  2054. AddInstruction("rel32off", "0F85cd", {optO32}, {cpu386});
  2055. StartMnemonic(opJO, "JO");
  2056. AddInstruction("rel8off", "70cb", {}, {cpu8086});
  2057. AddInstruction("rel16off", "0F80cw", {optO16}, {cpu386});
  2058. AddInstruction("rel32off", "0F80cd", {optO32}, {cpu386});
  2059. StartMnemonic(opJP, "JP");
  2060. AddInstruction("rel8off", "7Acb", {}, {cpu8086});
  2061. AddInstruction("rel16off", "0F8Acw", {optO16}, {cpu386});
  2062. AddInstruction("rel32off", "0F8Acd", {optO32}, {cpu386});
  2063. StartMnemonic(opJPE, "JPE");
  2064. AddInstruction("rel8off", "7Acb", {}, {cpu8086});
  2065. AddInstruction("rel16off", "0F8Acw", {optO16}, {cpu386});
  2066. AddInstruction("rel32off", "0F8Acd", {optO32}, {cpu386});
  2067. StartMnemonic(opJPO, "JPO");
  2068. AddInstruction("rel8off", "7Bcb", {}, {cpu8086});
  2069. AddInstruction("rel16off", "0F8Bcw", {optO16}, {cpu386});
  2070. AddInstruction("rel32off", "0F8Bcd", {optO32}, {cpu386});
  2071. StartMnemonic(opJRCXZ, "JRCXZ");
  2072. AddInstruction("rel8off", "E3cb", {}, {cpuAMD64});
  2073. StartMnemonic(opJS, "JS");
  2074. AddInstruction("rel8off", "78cb", {}, {cpu8086});
  2075. AddInstruction("rel16off", "0F88cw", {optO16}, {cpu386});
  2076. AddInstruction("rel32off", "0F88cd", {optO32}, {cpu386});
  2077. StartMnemonic(opJZ, "JZ");
  2078. AddInstruction("rel8off", "74cb", {}, {cpu8086});
  2079. AddInstruction("rel16off", "0F84cw", {optO16}, {cpu386});
  2080. AddInstruction("rel32off", "0F84cd", {optO32}, {cpu386});
  2081. StartMnemonic(opLAHF, "LAHF");
  2082. AddInstruction("", "9F", {}, {cpu8086});
  2083. StartMnemonic(opLAR, "LAR");
  2084. AddInstruction("reg16,reg/mem16", "0F02/r", {optO16}, {cpu286,cpuPrivileged});
  2085. AddInstruction("reg32,reg/mem16", "0F02/r", {optO32}, {cpu286,cpuPrivileged});
  2086. AddInstruction("reg64,reg/mem16", "0F02/r", {}, {cpuAMD64,cpuPrivileged});
  2087. StartMnemonic(opLDDQU, "LDDQU");
  2088. AddInstruction("xmm1,mem128", "F20FF0/r", {}, {cpuSSE3});
  2089. StartMnemonic(opLDMXCSR, "LDMXCSR");
  2090. AddInstruction("mem32", "0FAE/2", {}, {cpuSSE});
  2091. StartMnemonic(opLDS, "LDS");
  2092. AddInstruction("reg16,mem16:16", "C5/r", {optO16,optNot64}, {cpu8086});
  2093. AddInstruction("reg32,mem16:32", "C5/r", {optO32,optNot64}, {cpu386});
  2094. StartMnemonic(opLEA, "LEA");
  2095. AddInstruction("reg16,mem", "8D/r", {optO16}, {cpu8086});
  2096. AddInstruction("reg32,mem", "8D/r", {optO32}, {cpu386});
  2097. AddInstruction("reg64,mem", "8D/r", {}, {cpuAMD64});
  2098. StartMnemonic(opLEAVE, "LEAVE");
  2099. AddInstruction("", "C9", {}, {cpu186});
  2100. StartMnemonic(opLES, "LES");
  2101. AddInstruction("reg16,mem16:16", "C4/r", {optO16,optNot64}, {cpu8086});
  2102. AddInstruction("reg32,mem16:32", "C4/r", {optO32,optNot64}, {cpu386});
  2103. StartMnemonic(opLFENCE, "LFENCE");
  2104. AddInstruction("", "0FAEE8", {}, {cpuSSE2});
  2105. StartMnemonic(opLFS, "LFS");
  2106. AddInstruction("reg16,mem16:16", "0FB4/r", {optO16}, {cpu386});
  2107. AddInstruction("reg32,mem16:32", "0FB4/r", {optO32}, {cpu386});
  2108. StartMnemonic(opLGDT, "LGDT");
  2109. AddInstruction("mem16:32", "0F01/2", {}, {cpu286,cpuPrivileged});
  2110. AddInstruction("mem16:64", "0F01/2", {}, {cpuAMD64,cpuPrivileged});
  2111. StartMnemonic(opLGS, "LGS");
  2112. AddInstruction("reg16,mem16:16", "0FB5/r", {optO16}, {cpu386});
  2113. AddInstruction("reg32,mem16:32", "0FB5/r", {optO32}, {cpu386});
  2114. StartMnemonic(opLIDT, "LIDT");
  2115. AddInstruction("mem16:32", "0F01/3", {}, {cpu286,cpuPrivileged});
  2116. AddInstruction("mem16:64", "0F01/3", {}, {cpuAMD64,cpuPrivileged});
  2117. StartMnemonic(opLLDT, "LLDT");
  2118. AddInstruction("reg/mem16", "0F00/2", {}, {cpu286,cpuPrivileged});
  2119. StartMnemonic(opLMSW, "LMSW");
  2120. AddInstruction("reg/mem16", "0F01/6", {}, {cpu286,cpuPrivileged});
  2121. StartMnemonic(opLODS, "LODS");
  2122. AddInstruction("mem8", "AC", {}, {cpu8086});
  2123. AddInstruction("mem16", "AD", {optO16}, {cpu8086});
  2124. AddInstruction("mem32", "AD", {optO32}, {cpu386});
  2125. AddInstruction("mem64", "AD", {}, {cpuAMD64});
  2126. StartMnemonic(opLODSB, "LODSB");
  2127. AddInstruction("", "AC", {}, {cpu8086});
  2128. StartMnemonic(opLODSD, "LODSD");
  2129. AddInstruction("", "AD", {optO32}, {cpu386});
  2130. StartMnemonic(opLODSQ, "LODSQ");
  2131. AddInstruction("", "AD", {}, {cpuAMD64});
  2132. StartMnemonic(opLODSW, "LODSW");
  2133. AddInstruction("", "AD", {optO16}, {cpu8086});
  2134. StartMnemonic(opLOOP, "LOOP");
  2135. AddInstruction("rel8off", "E2cb", {}, {cpu8086});
  2136. StartMnemonic(opLOOPE, "LOOPE");
  2137. AddInstruction("rel8off", "E1cb", {}, {cpu8086});
  2138. StartMnemonic(opLOOPNE, "LOOPNE");
  2139. AddInstruction("rel8off", "E0cb", {}, {cpu8086});
  2140. StartMnemonic(opLOOPNZ, "LOOPNZ");
  2141. AddInstruction("rel8off", "E0cb", {}, {cpu8086});
  2142. StartMnemonic(opLOOPZ, "LOOPZ");
  2143. AddInstruction("rel8off", "E1cb", {}, {cpu8086});
  2144. StartMnemonic(opLSL, "LSL");
  2145. AddInstruction("reg16,reg/mem16", "0F03/r", {}, {cpu286,cpuPrivileged});
  2146. AddInstruction("reg32,reg/mem16", "0F03/r", {}, {cpu286,cpuPrivileged});
  2147. AddInstruction("reg64,reg/mem16", "0F03/r", {}, {cpuAMD64,cpuPrivileged});
  2148. StartMnemonic(opLSS, "LSS");
  2149. AddInstruction("reg16,mem16:16", "0FB2/r", {optO16}, {cpu386});
  2150. AddInstruction("reg32,mem16:32", "0FB2/r", {optO32}, {cpu386});
  2151. StartMnemonic(opLTR, "LTR");
  2152. AddInstruction("reg/mem16", "0F00/3", {}, {cpu286,cpuPrivileged});
  2153. StartMnemonic(opMASKMOVDQU, "MASKMOVDQU");
  2154. AddInstruction("xmm1,xmm2", "660FF7/r", {}, {cpuSSE2});
  2155. StartMnemonic(opMASKMOVQ, "MASKMOVQ");
  2156. AddInstruction("mmx1,mmx2", "0FF7/r", {}, {cpuMMX});
  2157. StartMnemonic(opMAXPD, "MAXPD");
  2158. AddInstruction("xmm1,xmm2/mem128", "660F5F/r", {}, {cpuSSE2});
  2159. StartMnemonic(opMAXPS, "MAXPS");
  2160. AddInstruction("xmm1,xmm2/mem128", "0F5F/r", {}, {cpuSSE});
  2161. StartMnemonic(opMAXSD, "MAXSD");
  2162. AddInstruction("xmm1,xmm2/mem64", "F20F5F/r", {}, {cpuSSE2});
  2163. StartMnemonic(opMAXSS, "MAXSS");
  2164. AddInstruction("xmm1,xmm2/mem32", "F30F5F/r", {}, {cpuSSE});
  2165. StartMnemonic(opMFENCE, "MFENCE");
  2166. AddInstruction("", "0FAEF0", {}, {cpuSSE2});
  2167. StartMnemonic(opMINPD, "MINPD");
  2168. AddInstruction("xmm1,xmm2/mem128", "660F5D/r", {}, {cpuSSE2});
  2169. StartMnemonic(opMINPS, "MINPS");
  2170. AddInstruction("xmm1,xmm2/mem128", "0F5D/r", {}, {cpuSSE});
  2171. StartMnemonic(opMINSD, "MINSD");
  2172. AddInstruction("xmm1,xmm2/mem64", "F20F5D/r", {}, {cpuSSE2});
  2173. StartMnemonic(opMINSS, "MINSS");
  2174. AddInstruction("xmm1,xmm2/mem32", "F30F5D/r", {}, {cpuSSE});
  2175. StartMnemonic(opMOV, "MOV");
  2176. AddInstruction("reg/mem8,reg8", "88/r", {}, {cpu8086});
  2177. AddInstruction("reg/mem16,reg16", "89/r", {optO16}, {cpu8086});
  2178. AddInstruction("reg/mem32,reg32", "89/r", {optO32}, {cpu386});
  2179. AddInstruction("reg/mem64,reg64", "89/r", {}, {cpuAMD64});
  2180. AddInstruction("reg8,reg/mem8", "8A/r", {}, {cpu8086});
  2181. AddInstruction("reg16,reg/mem16", "8B/r", {optO16}, {cpu8086});
  2182. AddInstruction("reg32,reg/mem32", "8B/r", {optO32}, {cpu386});
  2183. AddInstruction("reg64,reg/mem64", "8B/r", {}, {cpuAMD64});
  2184. AddInstruction("reg8,imm8", "B0rbib", {}, {cpu8086});
  2185. AddInstruction("reg16,imm16", "B8rwiw", {optO16}, {cpu8086});
  2186. AddInstruction("reg32,imm32", "B8rdid", {optO32}, {cpu386});
  2187. AddInstruction("reg64,imm64", "B8rqiq", {}, {cpuAMD64});
  2188. AddInstruction("CRn,reg32", "0F22/r", {}, {cpu386});
  2189. AddInstruction("CRn,reg64", "0F22/r", {}, {cpuAMD64});
  2190. AddInstruction("reg32,CRn", "0F20/r", {}, {cpu386});
  2191. AddInstruction("reg64,CRn", "0F20/r", {}, {cpuAMD64});
  2192. AddInstruction("CR8,reg32", "F00F22/r", {}, {cpu386});
  2193. AddInstruction("CR8,reg64", "F00F22/r", {}, {cpuAMD64});
  2194. AddInstruction("reg32,CR8", "F00F20/r", {}, {cpu386});
  2195. AddInstruction("reg64,CR8", "F00F20/r", {}, {cpuAMD64});
  2196. AddInstruction("reg32,DRn", "0F21/r", {}, {cpu386});
  2197. AddInstruction("reg64,DRn", "0F21/r", {}, {cpuAMD64});
  2198. AddInstruction("DRn,reg32", "0F23/r", {}, {cpu386});
  2199. AddInstruction("DRn,reg64", "0F23/r", {}, {cpuAMD64});
  2200. AddInstruction("reg/mem16,segReg", "8C/r", {optO16}, {cpu8086});
  2201. AddInstruction("reg/mem32,segReg", "8C/r", {optO32}, {cpu386});
  2202. AddInstruction("reg/mem64,segReg", "8C/r", {}, {cpuAMD64});
  2203. AddInstruction("segReg,reg/mem16", "8E/r", {optO16}, {cpu8086});
  2204. AddInstruction("segReg,reg/mem32", "8E/r", {optO32}, {cpu386});
  2205. AddInstruction("segReg,reg/mem64", "8E/r", {}, {cpuAMD64});
  2206. AddInstruction("AL,moffset8", "A0+o", {}, {cpu8086});
  2207. AddInstruction("AX,moffset16", "A1+o", {optO16}, {cpu8086});
  2208. AddInstruction("EAX,moffset32", "A1+o", {optO32}, {cpu386});
  2209. AddInstruction("RAX,moffset64", "A1+o", {}, {cpuAMD64});
  2210. AddInstruction("moffset8,AL", "A2+o", {}, {cpu8086});
  2211. AddInstruction("moffset16,AX", "A3+o", {optO16}, {cpu8086});
  2212. AddInstruction("moffset32,EAX", "A3+o", {optO32}, {cpu386});
  2213. AddInstruction("moffset64,RAX", "A3+o", {}, {cpuAMD64});
  2214. AddInstruction("reg/mem8,imm8", "C6/0ib", {}, {cpu8086});
  2215. AddInstruction("reg/mem16,imm16", "C7/0iw", {optO16}, {cpu8086});
  2216. AddInstruction("reg/mem32,imm32", "C7/0id", {optO32}, {cpu386});
  2217. AddInstruction("reg/mem64,simm32", "C7/0id", {}, {cpuAMD64});
  2218. StartMnemonic(opMOVAPD, "MOVAPD");
  2219. AddInstruction("xmm1,xmm2/mem128", "660F28/r", {}, {cpuSSE2});
  2220. AddInstruction("xmm1/mem128,xmm2", "660F29/r", {}, {cpuSSE2});
  2221. StartMnemonic(opMOVAPS, "MOVAPS");
  2222. AddInstruction("xmm1,xmm2/mem128", "0F28/r", {}, {cpuSSE});
  2223. AddInstruction("xmm1/mem128,xmm2", "0F29/r", {}, {cpuSSE});
  2224. StartMnemonic(opMOVD, "MOVD");
  2225. AddInstruction("xmm,reg/mem32", "660F6E/r", {}, {cpuSSE2});
  2226. AddInstruction("xmm,reg/mem64", "660F6E/r", {}, {cpuAMD64,cpuSSE2});
  2227. AddInstruction("reg/mem32,xmm", "660F7E/r", {}, {cpuSSE2});
  2228. AddInstruction("reg/mem64,xmm", "660F7E/r", {}, {cpuAMD64,cpuSSE2});
  2229. AddInstruction("mmx,reg/mem32", "0F6E/r", {}, {cpuMMX});
  2230. AddInstruction("mmx,reg/mem64", "0F6E/r", {}, {cpuAMD64,cpuMMX});
  2231. AddInstruction("reg/mem32,mmx", "0F7E/r", {}, {cpuMMX});
  2232. AddInstruction("reg/mem64,mmx", "0F7E/r", {}, {cpuAMD64,cpuMMX});
  2233. AddInstruction("xmm,reg/mem32", "660F6E/r", {}, {cpuSSE2});
  2234. AddInstruction("xmm,reg/mem64", "660F6E/r", {}, {cpuAMD64,cpuSSE2});
  2235. AddInstruction("reg/mem32,xmm", "660F7E/r", {}, {cpuSSE2});
  2236. AddInstruction("reg/mem64,xmm", "660F7E/r", {}, {cpuAMD64,cpuSSE2});
  2237. AddInstruction("mmx,reg/mem32", "0F6E/r", {}, {cpuMMX});
  2238. AddInstruction("mmx,reg/mem64", "0F6E/r", {}, {cpuAMD64,cpuMMX});
  2239. AddInstruction("reg/mem32,mmx", "0F7E/r", {}, {cpuMMX});
  2240. AddInstruction("reg/mem64,mmx", "0F7E/r", {}, {cpuAMD64,cpuMMX});
  2241. StartMnemonic(opMOVDDUP, "MOVDDUP");
  2242. AddInstruction("xmm1,xmm2/mem64", "F20F12/r", {}, {cpuSSE3});
  2243. StartMnemonic(opMOVDQ2Q, "MOVDQ2Q");
  2244. AddInstruction("mmx,xmm", "F20FD6/r", {}, {cpuSSE2});
  2245. AddInstruction("mmx,xmm", "F20FD6/r", {}, {cpuSSE2});
  2246. StartMnemonic(opMOVDQA, "MOVDQA");
  2247. AddInstruction("xmm1,xmm2/mem128", "660F6F/r", {}, {cpuSSE2});
  2248. AddInstruction("xmm1/mem128,xmm2", "660F7F/r", {}, {cpuSSE2});
  2249. StartMnemonic(opMOVDQU, "MOVDQU");
  2250. AddInstruction("xmm1,xmm2/mem128", "F30F6F/r", {}, {cpuSSE2});
  2251. AddInstruction("xmm1/mem128,xmm2", "F30F7F/r", {}, {cpuSSE2});
  2252. StartMnemonic(opMOVHLPS, "MOVHLPS");
  2253. AddInstruction("xmm1,xmm2", "0F12/r", {}, {cpuSSE});
  2254. StartMnemonic(opMOVHPD, "MOVHPD");
  2255. AddInstruction("xmm,mem64", "660F16/r", {}, {cpuSSE2});
  2256. AddInstruction("mem64,xmm", "660F17/r", {}, {cpuSSE2});
  2257. StartMnemonic(opMOVHPS, "MOVHPS");
  2258. AddInstruction("xmm,mem64", "0F16/r", {}, {cpuSSE});
  2259. AddInstruction("mem64,xmm", "0F17/r", {}, {cpuSSE});
  2260. StartMnemonic(opMOVLHPS, "MOVLHPS");
  2261. AddInstruction("xmm1,xmm2", "0F16/r", {}, {cpuSSE});
  2262. StartMnemonic(opMOVLPD, "MOVLPD");
  2263. AddInstruction("xmm,mem64", "660F12/r", {}, {cpuSSE2});
  2264. AddInstruction("mem64,xmm", "660F13/r", {}, {cpuSSE2});
  2265. StartMnemonic(opMOVLPS, "MOVLPS");
  2266. AddInstruction("xmm,mem64", "0F12/r", {}, {cpuSSE});
  2267. AddInstruction("mem64,xmm", "0F13/r", {}, {cpuSSE});
  2268. StartMnemonic(opMOVMSKPD, "MOVMSKPD");
  2269. AddInstruction("reg32,xmm", "660F50/r", {}, {cpuSSE2});
  2270. StartMnemonic(opMOVMSKPS, "MOVMSKPS");
  2271. AddInstruction("reg32,xmm", "0F50/r", {}, {cpuSSE});
  2272. AddInstruction("reg32,xmm", "0F50/r", {}, {cpuSSE});
  2273. StartMnemonic(opMOVNTDQ, "MOVNTDQ");
  2274. AddInstruction("mem128,xmm", "660FE7/r", {}, {cpuSSE2});
  2275. StartMnemonic(opMOVNTI, "MOVNTI");
  2276. AddInstruction("mem32,reg32", "0FC3/r", {}, {cpuSSE2});
  2277. AddInstruction("mem64,reg64", "0FC3/r", {}, {cpuAMD64,cpuSSE2});
  2278. StartMnemonic(opMOVNTPD, "MOVNTPD");
  2279. AddInstruction("mem128,xmm", "660F2B/r", {}, {cpuSSE2});
  2280. StartMnemonic(opMOVNTPS, "MOVNTPS");
  2281. AddInstruction("mem128,xmm", "0F2B/r", {}, {cpuSSE});
  2282. StartMnemonic(opMOVNTQ, "MOVNTQ");
  2283. AddInstruction("mem64,mmx", "0FE7/r", {}, {cpuMMX});
  2284. StartMnemonic(opMOVQ, "MOVQ");
  2285. AddInstruction("xmm1,xmm2/mem64", "F30F7E/r", {}, {cpuSSE2});
  2286. AddInstruction("xmm1/mem64,xmm2", "660FD6/r", {}, {cpuSSE2});
  2287. AddInstruction("mmx1,mmx2/mem64", "0F6F/r", {}, {cpuMMX});
  2288. AddInstruction("mmx1/mem64,mmx2", "0F7F/r", {}, {cpuMMX});
  2289. StartMnemonic(opMOVQ2DQ, "MOVQ2DQ");
  2290. AddInstruction("xmm,mmx", "F30FD6/r", {}, {cpuSSE2});
  2291. AddInstruction("xmm,mmx", "F30FD6/r", {}, {cpuSSE2});
  2292. StartMnemonic(opMOVS, "MOVS");
  2293. AddInstruction("mem8,mem8", "A4", {}, {cpu8086});
  2294. AddInstruction("mem16,mem16", "A5", {optO16}, {cpu8086});
  2295. AddInstruction("mem32,mem32", "A5", {optO32}, {cpu386});
  2296. AddInstruction("mem64,mem64", "A5", {}, {cpuAMD64});
  2297. StartMnemonic(opMOVSB, "MOVSB");
  2298. AddInstruction("", "A4", {}, {cpu8086});
  2299. StartMnemonic(opMOVSD, "MOVSD");
  2300. AddInstruction("", "A5", {optO32}, {cpu386});
  2301. AddInstruction("xmm1,xmm2/mem64", "F20F10/r", {}, {cpuSSE2});
  2302. AddInstruction("xmm1/mem64,xmm2", "F20F11/r", {}, {cpuSSE2});
  2303. StartMnemonic(opMOVSHDUP, "MOVSHDUP");
  2304. AddInstruction("xmm1,xmm2/mem128", "F30F16/r", {}, {cpuSSE3});
  2305. StartMnemonic(opMOVSLDUP, "MOVSLDUP");
  2306. AddInstruction("xmm1,xmm2/mem128", "F30F12/r", {}, {cpuSSE3});
  2307. StartMnemonic(opMOVSQ, "MOVSQ");
  2308. AddInstruction("", "A5", {}, {cpuAMD64});
  2309. StartMnemonic(opMOVSS, "MOVSS");
  2310. AddInstruction("xmm1,xmm2/mem32", "F30F10/r", {}, {cpuSSE});
  2311. AddInstruction("xmm1/mem32,xmm2", "F30F11/r", {}, {cpuSSE});
  2312. StartMnemonic(opMOVSW, "MOVSW");
  2313. AddInstruction("", "A5", {optO16}, {cpu8086});
  2314. StartMnemonic(opMOVSX, "MOVSX");
  2315. AddInstruction("reg16,reg/mem8", "0FBE/r", {optO16}, {cpu386});
  2316. AddInstruction("reg32,reg/mem8", "0FBE/r", {optO32}, {cpu386});
  2317. AddInstruction("reg64,reg/mem8", "0FBE/r", {}, {cpuAMD64});
  2318. AddInstruction("reg32,reg/mem16", "0FBF/r", {optO32}, {cpu386});
  2319. AddInstruction("reg64,reg/mem16", "0FBF/r", {}, {cpuAMD64});
  2320. StartMnemonic(opMOVSXD, "MOVSXD");
  2321. AddInstruction("reg64,reg/mem32", "63/r", {}, {cpuAMD64});
  2322. StartMnemonic(opMOVUPD, "MOVUPD");
  2323. AddInstruction("xmm1,xmm2/mem128", "660F10/r", {}, {cpuSSE2});
  2324. AddInstruction("xmm1/mem128,xmm2", "660F11/r", {}, {cpuSSE2});
  2325. StartMnemonic(opMOVUPS, "MOVUPS");
  2326. AddInstruction("xmm1,xmm2/mem128", "0F10/r", {}, {cpuSSE});
  2327. AddInstruction("xmm1/mem128,xmm2", "0F11/r", {}, {cpuSSE});
  2328. StartMnemonic(opMOVZX, "MOVZX");
  2329. AddInstruction("reg16,reg/mem8", "0FB6/r", {optO16}, {cpu386});
  2330. AddInstruction("reg32,reg/mem8", "0FB6/r", {optO32}, {cpu386});
  2331. AddInstruction("reg64,reg/mem8", "0FB6/r", {}, {cpuAMD64});
  2332. AddInstruction("reg32,reg/mem16", "0FB7/r", {optO32}, {cpu386});
  2333. AddInstruction("reg64,reg/mem16", "0FB7/r", {}, {cpuAMD64});
  2334. StartMnemonic(opMUL, "MUL");
  2335. AddInstruction("reg/mem8", "F6/4", {}, {cpu8086});
  2336. AddInstruction("reg/mem16", "F7/4", {optO16}, {cpu8086});
  2337. AddInstruction("reg/mem32", "F7/4", {optO32}, {cpu386});
  2338. AddInstruction("reg/mem64", "F7/4", {}, {cpuAMD64});
  2339. AddInstruction("AL,reg/mem8", "F6/4", {}, {cpu8086});
  2340. AddInstruction("AX,reg/mem16", "F7/4", {optO16}, {cpu8086});
  2341. AddInstruction("EAX,reg/mem32", "F7/4", {optO32}, {cpu386});
  2342. AddInstruction("RAX,reg/mem64", "F7/4", {}, {cpuAMD64});
  2343. StartMnemonic(opMULPD, "MULPD");
  2344. AddInstruction("xmm1,xmm2/mem128", "660F59/r", {}, {cpuSSE2});
  2345. StartMnemonic(opMULPS, "MULPS");
  2346. AddInstruction("xmm1,xmm2/mem128", "0F59/r", {}, {cpuSSE});
  2347. StartMnemonic(opMULSD, "MULSD");
  2348. AddInstruction("xmm1,xmm2/mem64", "F20F59/r", {}, {cpuSSE2});
  2349. StartMnemonic(opMULSS, "MULSS");
  2350. AddInstruction("xmm1,xmm2/mem32", "F30F59/r", {}, {cpuSSE});
  2351. StartMnemonic(opNEG, "NEG");
  2352. AddInstruction("reg/mem8", "F6/3", {}, {cpu8086});
  2353. AddInstruction("reg/mem16", "F7/3", {optO16}, {cpu8086});
  2354. AddInstruction("reg/mem32", "F7/3", {optO32}, {cpu386});
  2355. AddInstruction("reg/mem64", "F7/3", {}, {cpuAMD64});
  2356. StartMnemonic(opNOP, "NOP");
  2357. AddInstruction("", "90", {}, {cpu8086});
  2358. StartMnemonic(opNOT, "NOT");
  2359. AddInstruction("reg/mem8", "F6/2", {}, {cpu8086});
  2360. AddInstruction("reg/mem16", "F7/2", {optO16}, {cpu8086});
  2361. AddInstruction("reg/mem32", "F7/2", {optO32}, {cpu386});
  2362. AddInstruction("reg/mem64", "F7/2", {}, {cpuAMD64});
  2363. StartMnemonic(opOR, "OR");
  2364. AddInstruction("reg/mem8,reg8", "08/r", {}, {cpu8086});
  2365. AddInstruction("reg/mem16,reg16", "09/r", {optO16}, {cpu8086});
  2366. AddInstruction("reg/mem32,reg32", "09/r", {optO32}, {cpu386});
  2367. AddInstruction("reg/mem64,reg64", "09/r", {}, {cpuAMD64});
  2368. AddInstruction("reg8,reg/mem8", "0A/r", {}, {cpu8086});
  2369. AddInstruction("reg16,reg/mem16", "0B/r", {optO16}, {cpu8086});
  2370. AddInstruction("reg32,reg/mem32", "0B/r", {optO32}, {cpu386});
  2371. AddInstruction("reg64,reg/mem64", "0B/r", {}, {cpuAMD64});
  2372. AddInstruction("AL,imm8", "0Cib", {}, {cpu8086});
  2373. AddInstruction("AX,imm16", "0Diw", {optO16}, {cpu8086});
  2374. AddInstruction("EAX,imm32", "0Did", {optO32}, {cpu386});
  2375. AddInstruction("RAX,simm32", "0Did", {}, {cpuAMD64});
  2376. AddInstruction("reg/mem8,imm8", "80/1ib", {}, {cpu8086});
  2377. AddInstruction("reg/mem16,imm16", "81/1iw", {optO16}, {cpu8086});
  2378. AddInstruction("reg/mem32,imm32", "81/1id", {optO32}, {cpu386});
  2379. AddInstruction("reg/mem64,simm32", "81/1id", {}, {cpuAMD64});
  2380. AddInstruction("reg/mem16,simm8", "83/1ib", {optO16}, {cpu8086});
  2381. AddInstruction("reg/mem32,simm8", "83/1ib", {optO32}, {cpu386});
  2382. AddInstruction("reg/mem64,simm8", "83/1ib", {}, {cpuAMD64});
  2383. StartMnemonic(opORPD, "ORPD");
  2384. AddInstruction("xmm1,xmm2/mem128", "660F56/r", {}, {cpuSSE2});
  2385. StartMnemonic(opORPS, "ORPS");
  2386. AddInstruction("xmm1,xmm2/mem128", "0F56/r", {}, {cpuSSE});
  2387. StartMnemonic(opOUT, "OUT");
  2388. AddInstruction("uimm8,AL", "E6ib", {}, {cpu8086});
  2389. AddInstruction("uimm8,AX", "E7ib", {optO16}, {cpu8086});
  2390. AddInstruction("uimm8,EAX", "E7ib", {optO32}, {cpu386});
  2391. AddInstruction("DX,AL", "EE", {}, {cpu8086});
  2392. AddInstruction("DX,AX", "EF", {optO16}, {cpu8086});
  2393. AddInstruction("DX,EAX", "EF", {optO32}, {cpu386});
  2394. StartMnemonic(opOUTS, "OUTS");
  2395. AddInstruction("DX,mem8", "6E", {}, {cpu186});
  2396. AddInstruction("DX,mem16", "6F", {optO16}, {cpu186});
  2397. AddInstruction("DX,mem32", "6F", {optO32}, {cpu386});
  2398. StartMnemonic(opOUTSB, "OUTSB");
  2399. AddInstruction("", "6E", {}, {cpu186});
  2400. StartMnemonic(opOUTSD, "OUTSD");
  2401. AddInstruction("", "6F", {optO32}, {cpu386});
  2402. StartMnemonic(opOUTSW, "OUTSW");
  2403. AddInstruction("", "6F", {optO16}, {cpu186});
  2404. StartMnemonic(opPACKSSDW, "PACKSSDW");
  2405. AddInstruction("xmm1,xmm2/mem128", "660F6B/r", {}, {cpuSSE2});
  2406. AddInstruction("mmx1,mmx2/mem64", "0F6B/r", {}, {cpuMMX});
  2407. StartMnemonic(opPACKSSWB, "PACKSSWB");
  2408. AddInstruction("xmm1,xmm2/mem128", "660F63/r", {}, {cpuSSE2});
  2409. AddInstruction("mmx1,mmx2/mem64", "0F63/r", {}, {cpuMMX});
  2410. StartMnemonic(opPACKUSWB, "PACKUSWB");
  2411. AddInstruction("xmm1,xmm2/mem128", "660F67/r", {}, {cpuSSE2});
  2412. AddInstruction("mmx1,mmx2/mem64", "0F67/r", {}, {cpuMMX});
  2413. StartMnemonic(opPADDB, "PADDB");
  2414. AddInstruction("xmm1,xmm2/mem128", "660FFC/r", {}, {cpuSSE2});
  2415. AddInstruction("mmx1,mmx2/mem64", "0FFC/r", {}, {cpuMMX});
  2416. StartMnemonic(opPADDD, "PADDD");
  2417. AddInstruction("xmm1,xmm2/mem128", "660FFE/r", {}, {cpuSSE2});
  2418. AddInstruction("mmx1,mmx2/mem64", "0FFE/r", {}, {cpuMMX});
  2419. StartMnemonic(opPADDQ, "PADDQ");
  2420. AddInstruction("xmm1,xmm2/mem128", "660FD4/r", {}, {cpuSSE2});
  2421. AddInstruction("mmx1,mmx2/mem64", "0FD4/r", {}, {cpuMMX});
  2422. StartMnemonic(opPADDSB, "PADDSB");
  2423. AddInstruction("xmm1,xmm2/mem128", "660FEC/r", {}, {cpuSSE2});
  2424. AddInstruction("mmx1,mmx2/mem64", "0FEC/r", {}, {cpuMMX});
  2425. StartMnemonic(opPADDSW, "PADDSW");
  2426. AddInstruction("xmm1,xmm2/mem128", "660FED/r", {}, {cpuSSE2});
  2427. AddInstruction("mmx1,mmx2/mem64", "0FED/r", {}, {cpuMMX});
  2428. StartMnemonic(opPADDUSB, "PADDUSB");
  2429. AddInstruction("xmm1,xmm2/mem128", "660FDC/r", {}, {cpuSSE2});
  2430. AddInstruction("mmx1,mmx2/mem64", "0FDC/r", {}, {cpuMMX});
  2431. StartMnemonic(opPADDUSW, "PADDUSW");
  2432. AddInstruction("xmm1,xmm2/mem128", "660FDD/r", {}, {cpuSSE2});
  2433. AddInstruction("mmx1,mmx2/mem64", "0FDD/r", {}, {cpuMMX});
  2434. StartMnemonic(opPADDW, "PADDW");
  2435. AddInstruction("xmm1,xmm2/mem128", "660FFD/r", {}, {cpuSSE2});
  2436. AddInstruction("mmx1,mmx2/mem64", "0FFD/r", {}, {cpuMMX});
  2437. StartMnemonic(opPAND, "PAND");
  2438. AddInstruction("xmm1,xmm2/mem128", "660FDB/r", {}, {cpuSSE2});
  2439. AddInstruction("mmx1,mmx2/mem64", "0FDB/r", {}, {cpuMMX});
  2440. StartMnemonic(opPANDN, "PANDN");
  2441. AddInstruction("xmm1,xmm2/mem128", "660FDF/r", {}, {cpuSSE2});
  2442. AddInstruction("mmx1,mmx2/mem64", "0FDF/r", {}, {cpuMMX});
  2443. StartMnemonic(opPAUSE, "PAUSE");
  2444. AddInstruction("", "F390", {}, {cpuSSE2});
  2445. StartMnemonic(opPAVGB, "PAVGB");
  2446. AddInstruction("xmm1,xmm2/mem128", "660FE0/r", {}, {cpuSSE2});
  2447. AddInstruction("mmx1,mmx2/mem64", "0FE0/r", {}, {cpuMMX});
  2448. StartMnemonic(opPAVGUSB, "PAVGUSB");
  2449. AddInstruction("mmx1,mmx2/mem64", "0F0F/rBF", {}, {cpu3DNow});
  2450. StartMnemonic(opPAVGW, "PAVGW");
  2451. AddInstruction("xmm1,xmm2/mem128", "660FE3/r", {}, {cpuSSE2});
  2452. AddInstruction("mmx1,mmx2/mem64", "0FE3/r", {}, {cpuMMX});
  2453. StartMnemonic(opPCMPEQB, "PCMPEQB");
  2454. AddInstruction("xmm1,xmm2/mem128", "660F74/r", {}, {cpuSSE2});
  2455. AddInstruction("mmx1,mmx2/mem64", "0F74/r", {}, {cpuMMX});
  2456. StartMnemonic(opPCMPEQD, "PCMPEQD");
  2457. AddInstruction("xmm1,xmm2/mem128", "660F76/r", {}, {cpuSSE2});
  2458. AddInstruction("mmx1,mmx2/mem64", "0F76/r", {}, {cpuMMX});
  2459. StartMnemonic(opPCMPEQW, "PCMPEQW");
  2460. AddInstruction("xmm1,xmm2/mem128", "660F75/r", {}, {cpuSSE2});
  2461. AddInstruction("mmx1,mmx2/mem64", "0F75/r", {}, {cpuMMX});
  2462. StartMnemonic(opPCMPGTB, "PCMPGTB");
  2463. AddInstruction("xmm1,xmm2/mem128", "660F64/r", {}, {cpuSSE2});
  2464. AddInstruction("mmx1,mmx2/mem64", "0F64/r", {}, {cpuMMX});
  2465. StartMnemonic(opPCMPGTD, "PCMPGTD");
  2466. AddInstruction("xmm1,xmm2/mem128", "660F66/r", {}, {cpuSSE2});
  2467. AddInstruction("mmx1,mmx2/mem64", "0F66/r", {}, {cpuMMX});
  2468. StartMnemonic(opPCMPGTW, "PCMPGTW");
  2469. AddInstruction("xmm1,xmm2/mem128", "660F65/r", {}, {cpuSSE2});
  2470. AddInstruction("mmx1,mmx2/mem64", "0F65/r", {}, {cpuMMX});
  2471. StartMnemonic(opPEXTRW, "PEXTRW");
  2472. AddInstruction("reg32,xmm,uimm8", "660FC5/rib", {}, {cpuSSE2});
  2473. AddInstruction("reg32,mmx,uimm8", "0FC5/rib", {}, {cpuMMX});
  2474. StartMnemonic(opPF2ID, "PF2ID");
  2475. AddInstruction("mmx1,mmx2/mem64", "0F0F/r1D", {}, {cpu3DNow});
  2476. StartMnemonic(opPF2IW, "PF2IW");
  2477. AddInstruction("mmx1,mmx2/mem64", "0F0F/r1C", {}, {cpu3DNow});
  2478. StartMnemonic(opPFACC, "PFACC");
  2479. AddInstruction("mmx1,mmx2/mem64", "0F0F/rAE", {}, {cpu3DNow});
  2480. StartMnemonic(opPFADD, "PFADD");
  2481. AddInstruction("mmx1,mmx2/mem64", "0F0F/r9E", {}, {cpu3DNow});
  2482. StartMnemonic(opPFCMPEQ, "PFCMPEQ");
  2483. AddInstruction("mmx1,mmx2/mem64", "0F0F/rB0", {}, {cpu3DNow});
  2484. StartMnemonic(opPFCMPGE, "PFCMPGE");
  2485. AddInstruction("mmx1,mmx2/mem64", "0F0F/r90", {}, {cpu3DNow});
  2486. StartMnemonic(opPFCMPGT, "PFCMPGT");
  2487. AddInstruction("mmx1,mmx2/mem64", "0F0F/rA0", {}, {cpu3DNow});
  2488. StartMnemonic(opPFMAX, "PFMAX");
  2489. AddInstruction("mmx1,mmx2/mem64", "0F0F/rA4", {}, {cpu3DNow});
  2490. StartMnemonic(opPFMIN, "PFMIN");
  2491. AddInstruction("mmx1,mmx2/mem64", "0F0F/r94", {}, {cpu3DNow});
  2492. StartMnemonic(opPFMUL, "PFMUL");
  2493. AddInstruction("mmx1,mmx2/mem64", "0F0F/rB4", {}, {cpu3DNow});
  2494. StartMnemonic(opPFNACC, "PFNACC");
  2495. AddInstruction("mmx1,mmx2/mem64", "0F0F/r8A", {}, {cpu3DNow});
  2496. StartMnemonic(opPFPNACC, "PFPNACC");
  2497. AddInstruction("mmx1,mmx2/mem64", "0F0F/r8E", {}, {cpu3DNow});
  2498. StartMnemonic(opPFRCP, "PFRCP");
  2499. AddInstruction("mmx1,mmx2/mem64", "0F0F/r96", {}, {cpu3DNow});
  2500. StartMnemonic(opPFRCPIT1, "PFRCPIT1");
  2501. AddInstruction("mmx1,mmx2/mem64", "0F0F/rA6", {}, {cpu3DNow});
  2502. StartMnemonic(opPFRCPIT2, "PFRCPIT2");
  2503. AddInstruction("mmx1,mmx2/mem64", "0F0F/rB6", {}, {cpu3DNow});
  2504. StartMnemonic(opPFRSQIT1, "PFRSQIT1");
  2505. AddInstruction("mmx1,mmx2/mem64", "0F0F/rA7", {}, {cpu3DNow});
  2506. StartMnemonic(opPFRSQRT, "PFRSQRT");
  2507. AddInstruction("mmx1,mmx2/mem64", "0F0F/r97", {}, {cpu3DNow});
  2508. StartMnemonic(opPFSUB, "PFSUB");
  2509. AddInstruction("mmx1,mmx2/mem64", "0F0F/r9A", {}, {cpu3DNow});
  2510. StartMnemonic(opPFSUBR, "PFSUBR");
  2511. AddInstruction("mmx1,mmx2/mem64", "0F0F/rAA", {}, {cpu3DNow});
  2512. StartMnemonic(opPI2FD, "PI2FD");
  2513. AddInstruction("mmx1,mmx2/mem64", "0F0F/r0D", {}, {cpu3DNow});
  2514. StartMnemonic(opPI2FW, "PI2FW");
  2515. AddInstruction("mmx1,mmx2/mem64", "0F0F/r0C", {}, {cpu3DNow});
  2516. StartMnemonic(opPINSRW, "PINSRW");
  2517. AddInstruction("xmm,reg/mem16,uimm8", "660FC4/rib", {}, {cpuSSE2});
  2518. AddInstruction("xmm,reg/mem32,uimm8", "660FC4/rib", {}, {cpuSSE2});
  2519. AddInstruction("mmx,reg/mem16,uimm8", "0FC4/rib", {}, {cpuMMX});
  2520. AddInstruction("mmx,reg/mem32,uimm8", "0FC4/rib", {}, {cpuMMX});
  2521. StartMnemonic(opPMADDWD, "PMADDWD");
  2522. AddInstruction("xmm1,xmm2/mem128", "660FF5/r", {}, {cpuSSE2});
  2523. AddInstruction("mmx1,mmx2/mem64", "0FF5/r", {}, {cpuMMX});
  2524. StartMnemonic(opPMAXSW, "PMAXSW");
  2525. AddInstruction("xmm1,xmm2/mem128", "660FEE/r", {}, {cpuSSE2});
  2526. AddInstruction("mmx1,mmx2/mem64", "0FEE/r", {}, {cpuMMX});
  2527. StartMnemonic(opPMAXUB, "PMAXUB");
  2528. AddInstruction("xmm1,xmm2/mem128", "660FDE/r", {}, {cpuSSE2});
  2529. AddInstruction("mmx1,mmx2/mem64", "0FDE/r", {}, {cpuMMX});
  2530. StartMnemonic(opPMINSW, "PMINSW");
  2531. AddInstruction("xmm1,xmm2/mem128", "660FEA/r", {}, {cpuSSE2});
  2532. AddInstruction("mmx1,mmx2/mem64", "0FEA/r", {}, {cpuMMX});
  2533. StartMnemonic(opPMINUB, "PMINUB");
  2534. AddInstruction("xmm1,xmm2/mem128", "660FDA/r", {}, {cpuSSE2});
  2535. AddInstruction("mmx1,mmx2/mem64", "0FDA/r", {}, {cpuMMX});
  2536. StartMnemonic(opPMOVMSKB, "PMOVMSKB");
  2537. AddInstruction("reg32,xmm", "660FD7/r", {}, {cpuSSE2});
  2538. AddInstruction("reg32,mmx", "0FD7/r", {}, {cpuMMX});
  2539. StartMnemonic(opPMULHRW, "PMULHRW");
  2540. AddInstruction("mmx1,mmx2/mem64", "0F0F/rB7", {}, {cpu3DNow});
  2541. StartMnemonic(opPMULHUW, "PMULHUW");
  2542. AddInstruction("xmm1,xmm2/mem128", "660FE4/r", {}, {cpuSSE2});
  2543. AddInstruction("mmx1,mmx2/mem64", "0FE4/r", {}, {cpuMMX});
  2544. StartMnemonic(opPMULHW, "PMULHW");
  2545. AddInstruction("xmm1,xmm2/mem128", "660FE5/r", {}, {cpuSSE2});
  2546. AddInstruction("mmx1,mmx2/mem64", "0FE5/r", {}, {cpuMMX});
  2547. StartMnemonic(opPMULLW, "PMULLW");
  2548. AddInstruction("xmm1,xmm2/mem128", "660FD5/r", {}, {cpuSSE2});
  2549. AddInstruction("mmx1,mmx2/mem64", "0FD5/r", {}, {cpuMMX});
  2550. StartMnemonic(opPMULUDQ, "PMULUDQ");
  2551. AddInstruction("xmm1,xmm2/mem128", "660FF4/r", {}, {cpuSSE2});
  2552. AddInstruction("mmx1,mmx2/mem64", "0FF4/r", {}, {cpuSSE2});
  2553. StartMnemonic(opPOP, "POP");
  2554. AddInstruction("reg16", "58rw", {optO16}, {cpu8086});
  2555. AddInstruction("reg32", "58rd", {optO32}, {cpu386});
  2556. AddInstruction("reg64", "58rq", {}, {cpuAMD64});
  2557. AddInstruction("reg/mem16", "8F/0", {optO16}, {cpu8086});
  2558. AddInstruction("reg/mem32", "8F/0", {optO32}, {cpu386});
  2559. AddInstruction("reg/mem64", "8F/0", {}, {cpuAMD64});
  2560. AddInstruction("DS", "1F", {optNot64}, {cpu8086});
  2561. AddInstruction("ES", "07", {optNot64}, {cpu8086});
  2562. AddInstruction("SS", "17", {optNot64}, {cpu8086});
  2563. AddInstruction("FS", "0FA1", {}, {cpu386});
  2564. AddInstruction("GS", "0FA9", {}, {cpu386});
  2565. StartMnemonic(opPOPA, "POPA");
  2566. AddInstruction("", "61", {optNot64}, {cpu186});
  2567. StartMnemonic(opPOPAD, "POPAD");
  2568. AddInstruction("", "61", {optO32,optNot64}, {cpu386});
  2569. StartMnemonic(opPOPAW, "POPAW");
  2570. AddInstruction("", "61", {optO16,optNot64}, {cpu186});
  2571. StartMnemonic(opPOPF, "POPF");
  2572. AddInstruction("", "9D", {}, {cpu8086});
  2573. StartMnemonic(opPOPFD, "POPFD");
  2574. AddInstruction("", "9D", {optO32}, {cpu386});
  2575. StartMnemonic(opPOPFQ, "POPFQ");
  2576. AddInstruction("", "9D", {}, {cpuAMD64});
  2577. StartMnemonic(opPOR, "POR");
  2578. AddInstruction("xmm1,xmm2/mem128", "660FEB/r", {}, {cpuSSE2});
  2579. AddInstruction("mmx1,mmx2/mem64", "0FEB/r", {}, {cpuMMX});
  2580. StartMnemonic(opPREFETCH, "PREFETCH");
  2581. AddInstruction("mem8", "0F0D/0", {}, {cpu3DNow});
  2582. StartMnemonic(opPREFETCHNTA, "PREFETCHNTA");
  2583. AddInstruction("mem8", "0F18/0", {}, {cpuSSE,cpuMMX});
  2584. StartMnemonic(opPREFETCHT0, "PREFETCHT0");
  2585. AddInstruction("mem8", "0F18/1", {}, {cpuSSE,cpuMMX});
  2586. StartMnemonic(opPREFETCHT1, "PREFETCHT1");
  2587. AddInstruction("mem8", "0F18/2", {}, {cpuSSE,cpuMMX});
  2588. StartMnemonic(opPREFETCHT2, "PREFETCHT2");
  2589. AddInstruction("mem8", "0F18/3", {}, {cpuSSE,cpuMMX});
  2590. StartMnemonic(opPREFETCHW, "PREFETCHW");
  2591. AddInstruction("mem8", "0F0D/1", {}, {cpu3DNow});
  2592. StartMnemonic(opPSADBW, "PSADBW");
  2593. AddInstruction("xmm1,xmm2/mem128", "660FF6/r", {}, {cpuSSE2});
  2594. AddInstruction("mmx1,mmx2/mem64", "0FF6/r", {}, {cpuMMX});
  2595. StartMnemonic(opPSHUFD, "PSHUFD");
  2596. AddInstruction("xmm1,xmm2/mem128,uimm8", "660F70/rib", {}, {cpuSSE2});
  2597. StartMnemonic(opPSHUFHW, "PSHUFHW");
  2598. AddInstruction("xmm1,xmm2/mem128,uimm8", "F30F70/rib", {}, {cpuSSE2});
  2599. StartMnemonic(opPSHUFLW, "PSHUFLW");
  2600. AddInstruction("xmm1,xmm2/mem128,uimm8", "F20F70/rib", {}, {cpuSSE2});
  2601. StartMnemonic(opPSHUFW, "PSHUFW");
  2602. AddInstruction("mmx1,mmx2/mem64,imm8", "0F70/rib", {}, {cpuSSE2});
  2603. StartMnemonic(opPSLLD, "PSLLD");
  2604. AddInstruction("xmm1,xmm2/mem128", "660FF2/r", {}, {cpuSSE2});
  2605. AddInstruction("xmm,uimm8", "660F72/6ib", {}, {cpuSSE2});
  2606. AddInstruction("mmx1,mmx2/mem64", "0FF2/r", {}, {cpuMMX});
  2607. AddInstruction("mmx,imm8", "0F72/6ib", {}, {cpuMMX});
  2608. StartMnemonic(opPSLLDQ, "PSLLDQ");
  2609. AddInstruction("xmm,uimm8", "660F73/7ib", {}, {cpuSSE2});
  2610. StartMnemonic(opPSLLQ, "PSLLQ");
  2611. AddInstruction("xmm1,xmm2/mem128", "660FF3/r", {}, {cpuSSE2});
  2612. AddInstruction("xmm,uimm8", "660F73/6ib", {}, {cpuSSE2});
  2613. AddInstruction("mmx1,mmx2/mem64", "0FF3/r", {}, {cpuMMX});
  2614. AddInstruction("mmx,imm8", "0F73/6ib", {}, {cpuMMX});
  2615. StartMnemonic(opPSLLW, "PSLLW");
  2616. AddInstruction("xmm1,xmm2/mem128", "660FF1/r", {}, {cpuSSE2});
  2617. AddInstruction("xmm,uimm8", "660F71/6ib", {}, {cpuSSE2});
  2618. AddInstruction("mmx1,mmx2/mem64", "0FF1/r", {}, {cpuMMX});
  2619. AddInstruction("mmx,imm8", "0F71/6ib", {}, {cpuMMX});
  2620. StartMnemonic(opPSRAD, "PSRAD");
  2621. AddInstruction("xmm1,xmm2/mem128", "660FE2/r", {}, {cpuSSE2});
  2622. AddInstruction("xmm,uimm8", "660F72/4ib", {}, {cpuSSE2});
  2623. AddInstruction("mmx1,mmx2/mem64", "0FE2/r", {}, {cpuMMX});
  2624. AddInstruction("mmx,imm8", "0F72/4ib", {}, {cpuMMX});
  2625. StartMnemonic(opPSRAW, "PSRAW");
  2626. AddInstruction("xmm1,xmm2/mem128", "660FE1/r", {}, {cpuSSE2});
  2627. AddInstruction("xmm,uimm8", "660F71/4ib", {}, {cpuSSE2});
  2628. AddInstruction("mmx1,mmx2/mem64", "0FE1/r", {}, {cpuMMX});
  2629. AddInstruction("mmx,imm8", "0F71/4ib", {}, {cpuMMX});
  2630. StartMnemonic(opPSRLD, "PSRLD");
  2631. AddInstruction("xmm1,xmm2/mem128", "660FD2/r", {}, {cpuSSE2});
  2632. AddInstruction("xmm,uimm8", "660F72/2ib", {}, {cpuSSE2});
  2633. AddInstruction("mmx1,mmx2/mem64", "0FD2/r", {}, {cpuMMX});
  2634. AddInstruction("mmx,imm8", "0F72/2ib", {}, {cpuMMX});
  2635. StartMnemonic(opPSRLDQ, "PSRLDQ");
  2636. AddInstruction("xmm,uimm8", "660F73/3ib", {}, {cpuSSE2});
  2637. StartMnemonic(opPSRLQ, "PSRLQ");
  2638. AddInstruction("xmm1,xmm2/mem128", "660FD3/r", {}, {cpuSSE2});
  2639. AddInstruction("xmm,uimm8", "660F73/2ib", {}, {cpuSSE2});
  2640. AddInstruction("mmx1,mmx2/mem64", "0FD3/r", {}, {cpuMMX});
  2641. AddInstruction("mmx,imm8", "0F73/2ib", {}, {cpuMMX});
  2642. StartMnemonic(opPSRLW, "PSRLW");
  2643. AddInstruction("xmm1,xmm2/mem128", "660FD1/r", {}, {cpuSSE2});
  2644. AddInstruction("xmm,uimm8", "660F71/2ib", {}, {cpuSSE2});
  2645. AddInstruction("mmx1,mmx2/mem64", "0FD1/r", {}, {cpuMMX});
  2646. AddInstruction("mmx,imm8", "0F71/2ib", {}, {cpuMMX});
  2647. StartMnemonic(opPSUBB, "PSUBB");
  2648. AddInstruction("xmm1,xmm2/mem128", "660FF8/r", {}, {cpuSSE2});
  2649. AddInstruction("mmx1,mmx2/mem64", "0FF8/r", {}, {cpuMMX});
  2650. StartMnemonic(opPSUBD, "PSUBD");
  2651. AddInstruction("xmm1,xmm2/mem128", "660FFA/r", {}, {cpuSSE2});
  2652. AddInstruction("mmx1,mmx2/mem64", "0FFA/r", {}, {cpuMMX});
  2653. StartMnemonic(opPSUBQ, "PSUBQ");
  2654. AddInstruction("xmm1,xmm2/mem128", "660FFB/r", {}, {cpuSSE2});
  2655. AddInstruction("mmx1,mmx2/mem64", "0FFB/r", {}, {cpuMMX});
  2656. StartMnemonic(opPSUBSB, "PSUBSB");
  2657. AddInstruction("xmm1,xmm2/mem128", "660FE8/r", {}, {cpuSSE2});
  2658. AddInstruction("mmx1,mmx2/mem64", "0FE8/r", {}, {cpuMMX});
  2659. StartMnemonic(opPSUBSW, "PSUBSW");
  2660. AddInstruction("xmm1,xmm2/mem128", "660FE9/r", {}, {cpuSSE2});
  2661. AddInstruction("mmx1,mmx2/mem64", "0FE9/r", {}, {cpuMMX});
  2662. StartMnemonic(opPSUBUSB, "PSUBUSB");
  2663. AddInstruction("xmm1,xmm2/mem128", "660FD8/r", {}, {cpuSSE2});
  2664. AddInstruction("mmx1,mmx2/mem64", "0FD8/r", {}, {cpuMMX});
  2665. StartMnemonic(opPSUBUSW, "PSUBUSW");
  2666. AddInstruction("xmm1,xmm2/mem128", "660FD9/r", {}, {cpuSSE2});
  2667. AddInstruction("mmx1,mmx2/mem64", "0FD9/r", {}, {cpuMMX});
  2668. StartMnemonic(opPSUBW, "PSUBW");
  2669. AddInstruction("xmm1,xmm2/mem128", "660FF9/r", {}, {cpuSSE2});
  2670. AddInstruction("mmx1,mmx2/mem64", "0FF9/r", {}, {cpuMMX});
  2671. StartMnemonic(opPSWAPD, "PSWAPD");
  2672. AddInstruction("mmx1,mmx2/mem64", "0F0F/rBB", {}, {cpu3DNow});
  2673. StartMnemonic(opPUNPCKHBW, "PUNPCKHBW");
  2674. AddInstruction("xmm1,xmm2/mem128", "660F68/r", {}, {cpuSSE2});
  2675. AddInstruction("mmx1,mmx2/mem64", "0F68/r", {}, {cpuMMX});
  2676. StartMnemonic(opPUNPCKHDQ, "PUNPCKHDQ");
  2677. AddInstruction("xmm1,xmm2/mem128", "660F6A/r", {}, {cpuSSE2});
  2678. AddInstruction("mmx1,mmx2/mem64", "0F6A/r", {}, {cpuMMX});
  2679. StartMnemonic(opPUNPCKHQDQ, "PUNPCKHQDQ");
  2680. AddInstruction("xmm1,xmm2/mem128", "660F6D/r", {}, {cpuSSE2});
  2681. StartMnemonic(opPUNPCKHWD, "PUNPCKHWD");
  2682. AddInstruction("xmm1,xmm2/mem128", "660F69/r", {}, {cpuSSE2});
  2683. AddInstruction("mmx1,mmx2/mem64", "0F69/r", {}, {cpuMMX});
  2684. StartMnemonic(opPUNPCKLBW, "PUNPCKLBW");
  2685. AddInstruction("xmm1,xmm2/mem128", "660F60/r", {}, {cpuSSE2});
  2686. AddInstruction("mmx1,mmx2/mem32", "0F60/r", {}, {cpuMMX});
  2687. StartMnemonic(opPUNPCKLDQ, "PUNPCKLDQ");
  2688. AddInstruction("xmm1,xmm2/mem128", "660F62/r", {}, {cpuSSE2});
  2689. AddInstruction("mmx1,mmx2/mem32", "0F62/r", {}, {cpuMMX});
  2690. StartMnemonic(opPUNPCKLQDQ, "PUNPCKLQDQ");
  2691. AddInstruction("xmm1,xmm2/mem128", "660F6C/r", {}, {cpuSSE2});
  2692. StartMnemonic(opPUNPCKLWD, "PUNPCKLWD");
  2693. AddInstruction("xmm1,xmm2/mem128", "660F61/r", {}, {cpuSSE2});
  2694. AddInstruction("mmx1,mmx2/mem32", "0F61/r", {}, {cpuMMX});
  2695. StartMnemonic(opPUSH, "PUSH");
  2696. AddInstruction("reg16", "50rw", {optO16}, {cpu8086});
  2697. AddInstruction("reg32", "50rd", {optO32}, {cpu386});
  2698. AddInstruction("reg64", "50rq", {}, {cpuAMD64});
  2699. AddInstruction("reg/mem16", "FF/6", {optO16}, {cpu8086});
  2700. AddInstruction("reg/mem32", "FF/6", {optO32}, {cpu386});
  2701. AddInstruction("reg/mem64", "FF/6", {}, {cpuAMD64});
  2702. AddInstruction("imm8", "6Aib", {}, {cpu186});
  2703. AddInstruction("imm16", "68iw", {}, {cpu186});
  2704. AddInstruction("imm32", "68id", {optNot64}, {cpu186});
  2705. AddInstruction("simm32", "68id", {}, {cpuAMD64});
  2706. AddInstruction("CS", "0E", {optNot64}, {cpu8086});
  2707. AddInstruction("SS", "16", {optNot64}, {cpu8086});
  2708. AddInstruction("DS", "1E", {optNot64}, {cpu8086});
  2709. AddInstruction("ES", "06", {optNot64}, {cpu8086});
  2710. AddInstruction("FS", "0FA0", {}, {cpu386});
  2711. AddInstruction("GS", "0FA8", {}, {cpu386});
  2712. StartMnemonic(opPUSHA, "PUSHA");
  2713. AddInstruction("", "60", {optNot64}, {cpu186});
  2714. StartMnemonic(opPUSHAD, "PUSHAD");
  2715. AddInstruction("", "60", {optO32,optNot64}, {cpu386});
  2716. StartMnemonic(opPUSHF, "PUSHF");
  2717. AddInstruction("", "9C", {}, {cpu8086});
  2718. StartMnemonic(opPUSHFD, "PUSHFD");
  2719. AddInstruction("", "9C", {optO32}, {cpu386});
  2720. StartMnemonic(opPUSHFQ, "PUSHFQ");
  2721. AddInstruction("", "9C", {}, {cpuAMD64});
  2722. StartMnemonic(opPXOR, "PXOR");
  2723. AddInstruction("xmm1,xmm2/mem128", "660FEF/r", {}, {cpuSSE2});
  2724. AddInstruction("mmx1,mmx2/mem64", "0FEF/r", {}, {cpuMMX});
  2725. StartMnemonic(opRCL, "RCL");
  2726. AddInstruction("reg/mem8,1", "D0/2", {}, {cpu8086});
  2727. AddInstruction("reg/mem8,CL", "D2/2", {}, {cpu8086});
  2728. AddInstruction("reg/mem8,uimm8", "C0/2ib", {}, {cpu186});
  2729. AddInstruction("reg/mem16,1", "D1/2", {optO16}, {cpu8086});
  2730. AddInstruction("reg/mem16,CL", "D3/2", {optO16}, {cpu8086});
  2731. AddInstruction("reg/mem16,uimm8", "C1/2ib", {optO16}, {cpu186});
  2732. AddInstruction("reg/mem32,1", "D1/2", {optO32}, {cpu386});
  2733. AddInstruction("reg/mem32,CL", "D3/2", {optO32}, {cpu386});
  2734. AddInstruction("reg/mem32,uimm8", "C1/2ib", {optO32}, {cpu386});
  2735. AddInstruction("reg/mem64,1", "D1/2", {}, {cpuAMD64});
  2736. AddInstruction("reg/mem64,CL", "D3/2", {}, {cpuAMD64});
  2737. AddInstruction("reg/mem64,uimm8", "C1/2ib", {}, {cpuAMD64});
  2738. StartMnemonic(opRCPPS, "RCPPS");
  2739. AddInstruction("xmm1,xmm2/mem128", "0F53/r", {}, {cpuSSE});
  2740. StartMnemonic(opRCPSS, "RCPSS");
  2741. AddInstruction("xmm1,xmm2/mem32", "F30F53/r", {}, {cpuSSE});
  2742. StartMnemonic(opRCR, "RCR");
  2743. AddInstruction("reg/mem8,1", "D0/3", {}, {cpu8086});
  2744. AddInstruction("reg/mem8,CL", "D2/3", {}, {cpu8086});
  2745. AddInstruction("reg/mem8,uimm8", "C0/3ib", {}, {cpu186});
  2746. AddInstruction("reg/mem16,1", "D1/3", {optO16}, {cpu8086});
  2747. AddInstruction("reg/mem16,CL", "D3/3", {optO16}, {cpu8086});
  2748. AddInstruction("reg/mem16,uimm8", "C1/3ib", {optO16}, {cpu186});
  2749. AddInstruction("reg/mem32,1", "D1/3", {optO32}, {cpu386});
  2750. AddInstruction("reg/mem32,CL", "D3/3", {optO32}, {cpu386});
  2751. AddInstruction("reg/mem32,uimm8", "C1/3ib", {optO32}, {cpu386});
  2752. AddInstruction("reg/mem64,1", "D1/3", {}, {cpuAMD64});
  2753. AddInstruction("reg/mem64,CL", "D3/3", {}, {cpuAMD64});
  2754. AddInstruction("reg/mem64,uimm8", "C1/3ib", {}, {cpuAMD64});
  2755. StartMnemonic(opRDMSR, "RDMSR");
  2756. AddInstruction("", "0F32", {}, {cpuPentium,cpuPrivileged});
  2757. StartMnemonic(opRDPMC, "RDPMC");
  2758. AddInstruction("", "0F33", {}, {cpuP6});
  2759. StartMnemonic(opRDTSC, "RDTSC");
  2760. AddInstruction("", "0F31", {}, {cpuPentium});
  2761. StartMnemonic(opRDTSCP, "RDTSCP");
  2762. AddInstruction("", "0F01F9", {}, {cpuPentium});
  2763. StartMnemonic(opRET, "RET");
  2764. AddInstruction("", "C3", {}, {cpu8086});
  2765. AddInstruction("uimm16", "C2iw", {}, {cpu8086});
  2766. StartMnemonic(opRETF, "RETF");
  2767. AddInstruction("", "CB", {}, {cpu8086});
  2768. AddInstruction("uimm16", "CAiw", {}, {cpu8086});
  2769. StartMnemonic(opROL, "ROL");
  2770. AddInstruction("reg/mem8,1", "D0/0", {}, {cpu8086});
  2771. AddInstruction("reg/mem8,CL", "D2/0", {}, {cpu8086});
  2772. AddInstruction("reg/mem8,uimm8", "C0/0ib", {}, {cpu186});
  2773. AddInstruction("reg/mem16,1", "D1/0", {optO16}, {cpu8086});
  2774. AddInstruction("reg/mem16,CL", "D3/0", {optO16}, {cpu8086});
  2775. AddInstruction("reg/mem16,uimm8", "C1/0ib", {optO16}, {cpu186});
  2776. AddInstruction("reg/mem32,1", "D1/0", {optO32}, {cpu386});
  2777. AddInstruction("reg/mem32,CL", "D3/0", {optO32}, {cpu386});
  2778. AddInstruction("reg/mem32,uimm8", "C1/0ib", {optO32}, {cpu386});
  2779. AddInstruction("reg/mem64,1", "D1/0", {}, {cpuAMD64});
  2780. AddInstruction("reg/mem64,CL", "D3/0", {}, {cpuAMD64});
  2781. AddInstruction("reg/mem64,uimm8", "C1/0ib", {}, {cpuAMD64});
  2782. StartMnemonic(opROR, "ROR");
  2783. AddInstruction("reg/mem8,1", "D0/1", {}, {cpu8086});
  2784. AddInstruction("reg/mem8,CL", "D2/1", {}, {cpu8086});
  2785. AddInstruction("reg/mem8,uimm8", "C0/1ib", {}, {cpu186});
  2786. AddInstruction("reg/mem16,1", "D1/1", {optO16}, {cpu8086});
  2787. AddInstruction("reg/mem16,CL", "D3/1", {optO16}, {cpu8086});
  2788. AddInstruction("reg/mem16,uimm8", "C1/1ib", {optO16}, {cpu186});
  2789. AddInstruction("reg/mem32,1", "D1/1", {optO32}, {cpu386});
  2790. AddInstruction("reg/mem32,CL", "D3/1", {optO32}, {cpu386});
  2791. AddInstruction("reg/mem32,uimm8", "C1/1ib", {optO32}, {cpu386});
  2792. AddInstruction("reg/mem64,1", "D1/1", {}, {cpuAMD64});
  2793. AddInstruction("reg/mem64,CL", "D3/1", {}, {cpuAMD64});
  2794. AddInstruction("reg/mem64,uimm8", "C1/1ib", {}, {cpuAMD64});
  2795. StartMnemonic(opRSM, "RSM");
  2796. AddInstruction("", "0FAA", {}, {});
  2797. StartMnemonic(opRSQRTPS, "RSQRTPS");
  2798. AddInstruction("xmm1,xmm2/mem128", "0F52/r", {}, {cpuSSE});
  2799. StartMnemonic(opRSQRTSS, "RSQRTSS");
  2800. AddInstruction("xmm1,xmm2/mem32", "F30F52/r", {}, {cpuSSE});
  2801. StartMnemonic(opSAHF, "SAHF");
  2802. AddInstruction("", "9E", {}, {cpu8086});
  2803. StartMnemonic(opSAL, "SAL");
  2804. AddInstruction("reg/mem8,1", "D0/4", {}, {cpu8086});
  2805. AddInstruction("reg/mem8,CL", "D2/4", {}, {cpu8086});
  2806. AddInstruction("reg/mem8,uimm8", "C0/4ib", {}, {cpu186});
  2807. AddInstruction("reg/mem16,1", "D1/4", {optO16}, {cpu8086});
  2808. AddInstruction("reg/mem16,CL", "D3/4", {optO16}, {cpu8086});
  2809. AddInstruction("reg/mem16,uimm8", "C1/4ib", {optO16}, {cpu186});
  2810. AddInstruction("reg/mem32,1", "D1/4", {optO32}, {cpu386});
  2811. AddInstruction("reg/mem32,CL", "D3/4", {optO32}, {cpu386});
  2812. AddInstruction("reg/mem32,uimm8", "C1/4ib", {optO32}, {cpu386});
  2813. AddInstruction("reg/mem64,1", "D1/4", {}, {cpuAMD64});
  2814. AddInstruction("reg/mem64,CL", "D3/4", {}, {cpuAMD64});
  2815. AddInstruction("reg/mem64,uimm8", "C1/4ib", {}, {cpuAMD64});
  2816. StartMnemonic(opSAR, "SAR");
  2817. AddInstruction("reg/mem8,1", "D0/7", {}, {cpu8086});
  2818. AddInstruction("reg/mem8,CL", "D2/7", {}, {cpu8086});
  2819. AddInstruction("reg/mem8,uimm8", "C0/7ib", {}, {cpu186});
  2820. AddInstruction("reg/mem16,1", "D1/7", {optO16}, {cpu8086});
  2821. AddInstruction("reg/mem16,CL", "D3/7", {optO16}, {cpu8086});
  2822. AddInstruction("reg/mem16,uimm8", "C1/7ib", {optO16}, {cpu186});
  2823. AddInstruction("reg/mem32,1", "D1/7", {optO32}, {cpu386});
  2824. AddInstruction("reg/mem32,CL", "D3/7", {optO32}, {cpu386});
  2825. AddInstruction("reg/mem32,uimm8", "C1/7ib", {optO32}, {cpu386});
  2826. AddInstruction("reg/mem64,1", "D1/7", {}, {cpuAMD64});
  2827. AddInstruction("reg/mem64,CL", "D3/7", {}, {cpuAMD64});
  2828. AddInstruction("reg/mem64,uimm8", "C1/7ib", {}, {cpuAMD64});
  2829. StartMnemonic(opSBB, "SBB");
  2830. AddInstruction("reg/mem8,reg8", "18/r", {}, {cpu8086});
  2831. AddInstruction("reg/mem16,reg16", "19/r", {optO16}, {cpu8086});
  2832. AddInstruction("reg/mem32,reg32", "19/r", {optO32}, {cpu386});
  2833. AddInstruction("reg/mem64,reg64", "19/r", {}, {cpuAMD64});
  2834. AddInstruction("reg8,reg/mem8", "1A/r", {}, {cpu8086});
  2835. AddInstruction("reg16,reg/mem16", "1B/r", {optO16}, {cpu8086});
  2836. AddInstruction("reg32,reg/mem32", "1B/r", {optO32}, {cpu386});
  2837. AddInstruction("reg64,reg/mem64", "1B/r", {}, {cpuAMD64});
  2838. AddInstruction("AL,imm8", "1Cib", {}, {cpu8086});
  2839. AddInstruction("AX,imm16", "1Diw", {optO16}, {cpu8086});
  2840. AddInstruction("EAX,imm32", "1Did", {optO32}, {cpu386});
  2841. AddInstruction("RAX,simm32", "1Did", {}, {cpuAMD64});
  2842. AddInstruction("reg/mem8,imm8", "80/3ib", {}, {cpu8086});
  2843. AddInstruction("reg/mem16,imm16", "81/3iw", {optO16}, {cpu8086});
  2844. AddInstruction("reg/mem32,imm32", "81/3id", {optO32}, {cpu386});
  2845. AddInstruction("reg/mem64,simm32", "81/3id", {}, {cpuAMD64});
  2846. AddInstruction("reg/mem16,simm8", "83/3ib", {optO16}, {cpu8086});
  2847. AddInstruction("reg/mem32,simm8", "83/3ib", {optO32}, {cpu386});
  2848. AddInstruction("reg/mem64,simm8", "83/3ib", {}, {cpuAMD64});
  2849. StartMnemonic(opSCAS, "SCAS");
  2850. AddInstruction("mem8", "AE", {}, {cpu8086});
  2851. AddInstruction("mem16", "AF", {optO16}, {cpu8086});
  2852. AddInstruction("mem32", "AF", {optO32}, {cpu386});
  2853. AddInstruction("mem64", "AF", {}, {cpuAMD64});
  2854. StartMnemonic(opSCASB, "SCASB");
  2855. AddInstruction("", "AE", {}, {cpu8086});
  2856. StartMnemonic(opSCASD, "SCASD");
  2857. AddInstruction("", "AF", {optO32}, {cpu386});
  2858. StartMnemonic(opSCASQ, "SCASQ");
  2859. AddInstruction("", "AF", {}, {cpuAMD64});
  2860. StartMnemonic(opSCASW, "SCASW");
  2861. AddInstruction("", "AF", {optO16}, {cpu8086});
  2862. StartMnemonic(opSETA, "SETA");
  2863. AddInstruction("reg/mem8", "0F97/0", {}, {cpu386});
  2864. StartMnemonic(opSETAE, "SETAE");
  2865. AddInstruction("reg/mem8", "0F93/0", {}, {cpu386});
  2866. StartMnemonic(opSETB, "SETB");
  2867. AddInstruction("reg/mem8", "0F92/0", {}, {cpu386});
  2868. StartMnemonic(opSETBE, "SETBE");
  2869. AddInstruction("reg/mem8", "0F96/0", {}, {cpu386});
  2870. StartMnemonic(opSETC, "SETC");
  2871. AddInstruction("reg/mem8", "0F92/0", {}, {cpu386});
  2872. StartMnemonic(opSETE, "SETE");
  2873. AddInstruction("reg/mem8", "0F94/0", {}, {cpu386});
  2874. StartMnemonic(opSETG, "SETG");
  2875. AddInstruction("reg/mem8", "0F9F/0", {}, {cpu386});
  2876. StartMnemonic(opSETGE, "SETGE");
  2877. AddInstruction("reg/mem8", "0F9D/0", {}, {cpu386});
  2878. StartMnemonic(opSETL, "SETL");
  2879. AddInstruction("reg/mem8", "0F9C/0", {}, {cpu386});
  2880. StartMnemonic(opSETLE, "SETLE");
  2881. AddInstruction("reg/mem8", "0F9E/0", {}, {cpu386});
  2882. StartMnemonic(opSETNA, "SETNA");
  2883. AddInstruction("reg/mem8", "0F96/0", {}, {cpu386});
  2884. StartMnemonic(opSETNAE, "SETNAE");
  2885. AddInstruction("reg/mem8", "0F92/0", {}, {cpu386});
  2886. StartMnemonic(opSETNB, "SETNB");
  2887. AddInstruction("reg/mem8", "0F93/0", {}, {cpu386});
  2888. StartMnemonic(opSETNBE, "SETNBE");
  2889. AddInstruction("reg/mem8", "0F97/0", {}, {cpu386});
  2890. StartMnemonic(opSETNC, "SETNC");
  2891. AddInstruction("reg/mem8", "0F93/0", {}, {cpu386});
  2892. StartMnemonic(opSETNE, "SETNE");
  2893. AddInstruction("reg/mem8", "0F95/0", {}, {cpu386});
  2894. StartMnemonic(opSETNG, "SETNG");
  2895. AddInstruction("reg/mem8", "0F9E/0", {}, {cpu386});
  2896. StartMnemonic(opSETNGE, "SETNGE");
  2897. AddInstruction("reg/mem8", "0F9C/0", {}, {cpu386});
  2898. StartMnemonic(opSETNL, "SETNL");
  2899. AddInstruction("reg/mem8", "0F9D/0", {}, {cpu386});
  2900. StartMnemonic(opSETNLE, "SETNLE");
  2901. AddInstruction("reg/mem8", "0F9F/0", {}, {cpu386});
  2902. StartMnemonic(opSETNO, "SETNO");
  2903. AddInstruction("reg/mem8", "0F91/0", {}, {cpu386});
  2904. StartMnemonic(opSETNP, "SETNP");
  2905. AddInstruction("reg/mem8", "0F9B/0", {}, {cpu386});
  2906. StartMnemonic(opSETNS, "SETNS");
  2907. AddInstruction("reg/mem8", "0F99/0", {}, {cpu386});
  2908. StartMnemonic(opSETNZ, "SETNZ");
  2909. AddInstruction("reg/mem8", "0F95/0", {}, {cpu386});
  2910. StartMnemonic(opSETO, "SETO");
  2911. AddInstruction("reg/mem8", "0F90/0", {}, {cpu386});
  2912. StartMnemonic(opSETP, "SETP");
  2913. AddInstruction("reg/mem8", "0F9A/0", {}, {cpu386});
  2914. StartMnemonic(opSETPE, "SETPE");
  2915. AddInstruction("reg/mem8", "0F9A/0", {}, {cpu386});
  2916. StartMnemonic(opSETPO, "SETPO");
  2917. AddInstruction("reg/mem8", "0F9B/0", {}, {cpu386});
  2918. StartMnemonic(opSETS, "SETS");
  2919. AddInstruction("reg/mem8", "0F98/0", {}, {cpu386});
  2920. StartMnemonic(opSETZ, "SETZ");
  2921. AddInstruction("reg/mem8", "0F94/0", {}, {cpu386});
  2922. StartMnemonic(opSFENCE, "SFENCE");
  2923. AddInstruction("", "0FAEF8", {}, {cpuSSE,cpuMMX});
  2924. StartMnemonic(opSGDT, "SGDT");
  2925. AddInstruction("mem16:32", "0F01/0", {}, {cpu286,cpuPrivileged});
  2926. AddInstruction("mem16:64", "0F01/0", {}, {cpuAMD64,cpuPrivileged});
  2927. StartMnemonic(opSHL, "SHL");
  2928. AddInstruction("reg/mem8,1", "D0/4", {}, {cpu8086});
  2929. AddInstruction("reg/mem8,CL", "D2/4", {}, {cpu8086});
  2930. AddInstruction("reg/mem8,uimm8", "C0/4ib", {}, {cpu186});
  2931. AddInstruction("reg/mem16,1", "D1/4", {optO16}, {cpu8086});
  2932. AddInstruction("reg/mem16,CL", "D3/4", {optO16}, {cpu8086});
  2933. AddInstruction("reg/mem16,uimm8", "C1/4ib", {optO16}, {cpu186});
  2934. AddInstruction("reg/mem32,1", "D1/4", {optO32}, {cpu386});
  2935. AddInstruction("reg/mem32,CL", "D3/4", {optO32}, {cpu386});
  2936. AddInstruction("reg/mem32,uimm8", "C1/4ib", {optO32}, {cpu386});
  2937. AddInstruction("reg/mem64,1", "D1/4", {}, {cpuAMD64});
  2938. AddInstruction("reg/mem64,CL", "D3/4", {}, {cpuAMD64});
  2939. AddInstruction("reg/mem64,uimm8", "C1/4ib", {}, {cpuAMD64});
  2940. StartMnemonic(opSHLD, "SHLD");
  2941. AddInstruction("reg/mem16,reg16,uimm8", "0FA4/rib", {optO16}, {cpu386});
  2942. AddInstruction("reg/mem16,reg16,CL", "0FA5/r", {optO16}, {cpu386});
  2943. AddInstruction("reg/mem32,reg32,uimm8", "0FA4/rib", {optO32}, {cpu386});
  2944. AddInstruction("reg/mem32,reg32,CL", "0FA5/r", {optO32}, {cpu386});
  2945. AddInstruction("reg/mem64,reg64,uimm8", "0FA4/rib", {}, {cpuAMD64});
  2946. AddInstruction("reg/mem64,reg64,CL", "0FA5/r", {}, {cpuAMD64});
  2947. StartMnemonic(opSHR, "SHR");
  2948. AddInstruction("reg/mem8,1", "D0/5", {}, {cpu8086});
  2949. AddInstruction("reg/mem8,CL", "D2/5", {}, {cpu8086});
  2950. AddInstruction("reg/mem8,uimm8", "C0/5ib", {}, {cpu186});
  2951. AddInstruction("reg/mem16,1", "D1/5", {optO16}, {cpu8086});
  2952. AddInstruction("reg/mem16,CL", "D3/5", {optO16}, {cpu8086});
  2953. AddInstruction("reg/mem16,uimm8", "C1/5ib", {optO16}, {cpu186});
  2954. AddInstruction("reg/mem32,1", "D1/5", {optO32}, {cpu386});
  2955. AddInstruction("reg/mem32,CL", "D3/5", {optO32}, {cpu386});
  2956. AddInstruction("reg/mem32,uimm8", "C1/5ib", {optO32}, {cpu386});
  2957. AddInstruction("reg/mem64,1", "D1/5", {}, {cpuAMD64});
  2958. AddInstruction("reg/mem64,CL", "D3/5", {}, {cpuAMD64});
  2959. AddInstruction("reg/mem64,uimm8", "C1/5ib", {}, {cpuAMD64});
  2960. StartMnemonic(opSHRD, "SHRD");
  2961. AddInstruction("reg/mem16,reg16,uimm8", "0FAC/rib", {optO16}, {cpu386});
  2962. AddInstruction("reg/mem16,reg16,CL", "0FAD/r", {optO16}, {cpu386});
  2963. AddInstruction("reg/mem32,reg32,uimm8", "0FAC/rib", {optO32}, {cpu386});
  2964. AddInstruction("reg/mem32,reg32,CL", "0FAD/r", {optO32}, {cpu386});
  2965. AddInstruction("reg/mem64,reg64,uimm8", "0FAC/rib", {}, {cpuAMD64});
  2966. AddInstruction("reg/mem64,reg64,CL", "0FAD/r", {}, {cpuAMD64});
  2967. StartMnemonic(opSHUFPD, "SHUFPD");
  2968. AddInstruction("xmm1,xmm2/mem128,uimm8", "660FC6/rib", {}, {cpuSSE2});
  2969. StartMnemonic(opSHUFPS, "SHUFPS");
  2970. AddInstruction("xmm1,xmm2/mem128,uimm8", "0FC6/rib", {}, {cpuSSE});
  2971. StartMnemonic(opSIDT, "SIDT");
  2972. AddInstruction("mem16:32", "0F01/1", {}, {cpu286,cpuPrivileged});
  2973. AddInstruction("mem16:64", "0F01/1", {}, {cpuAMD64,cpuPrivileged});
  2974. StartMnemonic(opSKINIT, "SKINIT");
  2975. AddInstruction("EAX", "0F01DE", {}, {cpuAMD64});
  2976. StartMnemonic(opSLDT, "SLDT");
  2977. AddInstruction("reg16", "0F00/0", {optO16}, {cpu286});
  2978. AddInstruction("reg32", "0F00/0", {optO32}, {cpu386});
  2979. AddInstruction("reg64", "0F00/0", {}, {cpuAMD64});
  2980. AddInstruction("mem16", "0F00/0", {}, {cpu286});
  2981. StartMnemonic(opSMSW, "SMSW");
  2982. AddInstruction("reg16", "0F01/4", {optO16}, {cpu286});
  2983. AddInstruction("reg32", "0F01/4", {optO32}, {cpu386});
  2984. AddInstruction("reg64", "0F01/4", {}, {cpuAMD64});
  2985. AddInstruction("mem16", "0F01/4", {}, {cpu286});
  2986. StartMnemonic(opSQRTPD, "SQRTPD");
  2987. AddInstruction("xmm1,xmm2/mem128", "660F51/r", {}, {cpuSSE2});
  2988. StartMnemonic(opSQRTPS, "SQRTPS");
  2989. AddInstruction("xmm1,xmm2/mem128", "0F51/r", {}, {cpuSSE});
  2990. StartMnemonic(opSQRTSD, "SQRTSD");
  2991. AddInstruction("xmm1,xmm2/mem64", "F20F51/r", {}, {cpuSSE2});
  2992. StartMnemonic(opSQRTSS, "SQRTSS");
  2993. AddInstruction("xmm1,xmm2/mem32", "F30F51/r", {}, {cpuSSE});
  2994. StartMnemonic(opSTC, "STC");
  2995. AddInstruction("", "F9", {}, {cpu8086});
  2996. StartMnemonic(opSTD, "STD");
  2997. AddInstruction("", "FD", {}, {cpu8086});
  2998. StartMnemonic(opSTGI, "STGI");
  2999. AddInstruction("", "0F01DC", {}, {cpuPentium});
  3000. StartMnemonic(opSTI, "STI");
  3001. AddInstruction("", "FB", {}, {cpu8086});
  3002. StartMnemonic(opSTMXCSR, "STMXCSR");
  3003. AddInstruction("mem32", "0FAE/3", {}, {cpuSSE});
  3004. StartMnemonic(opSTOS, "STOS");
  3005. AddInstruction("mem8", "AA", {}, {cpu8086});
  3006. AddInstruction("mem16", "AB", {optO16}, {cpu8086});
  3007. AddInstruction("mem32", "AB", {optO32}, {cpu386});
  3008. AddInstruction("mem64", "AB", {}, {cpuAMD64});
  3009. StartMnemonic(opSTOSB, "STOSB");
  3010. AddInstruction("", "AA", {}, {cpu8086});
  3011. StartMnemonic(opSTOSD, "STOSD");
  3012. AddInstruction("", "AB", {optO32}, {cpu386});
  3013. StartMnemonic(opSTOSQ, "STOSQ");
  3014. AddInstruction("", "AB", {}, {cpuAMD64});
  3015. StartMnemonic(opSTOSW, "STOSW");
  3016. AddInstruction("", "AB", {optO16}, {cpu8086});
  3017. StartMnemonic(opSTR, "STR");
  3018. AddInstruction("reg16", "0F00/1", {optO16}, {cpu286,cpuProtected});
  3019. AddInstruction("reg32", "0F00/1", {optO32}, {cpu386,cpuProtected});
  3020. AddInstruction("reg64", "0F00/1", {}, {cpuAMD64});
  3021. AddInstruction("mem16", "0F00/1", {}, {cpu286,cpuProtected});
  3022. StartMnemonic(opSUB, "SUB");
  3023. AddInstruction("reg/mem8,reg8", "28/r", {}, {cpu8086});
  3024. AddInstruction("reg/mem16,reg16", "29/r", {optO16}, {cpu8086});
  3025. AddInstruction("reg/mem32,reg32", "29/r", {optO32}, {cpu386});
  3026. AddInstruction("reg/mem64,reg64", "29/r", {}, {cpuAMD64});
  3027. AddInstruction("reg8,reg/mem8", "2A/r", {}, {cpu8086});
  3028. AddInstruction("reg16,reg/mem16", "2B/r", {optO16}, {cpu8086});
  3029. AddInstruction("reg32,reg/mem32", "2B/r", {optO32}, {cpu386});
  3030. AddInstruction("reg64,reg/mem64", "2B/r", {}, {cpuAMD64});
  3031. AddInstruction("AL,imm8", "2Cib", {}, {cpu8086});
  3032. AddInstruction("AX,imm16", "2Diw", {optO16}, {cpu8086});
  3033. AddInstruction("EAX,imm32", "2Did", {optO32}, {cpu386});
  3034. AddInstruction("RAX,simm32", "2Did", {}, {cpuAMD64});
  3035. AddInstruction("reg/mem8,imm8", "80/5ib", {}, {cpu8086});
  3036. AddInstruction("reg/mem16,imm16", "81/5iw", {optO16}, {cpu8086});
  3037. AddInstruction("reg/mem32,imm32", "81/5id", {optO32}, {cpu386});
  3038. AddInstruction("reg/mem64,simm32", "81/5id", {}, {cpuAMD64});
  3039. AddInstruction("reg/mem16,simm8", "83/5ib", {optO16}, {cpu8086});
  3040. AddInstruction("reg/mem32,simm8", "83/5ib", {optO32}, {cpu386});
  3041. AddInstruction("reg/mem64,simm8", "83/5ib", {}, {cpuAMD64});
  3042. StartMnemonic(opSUBPD, "SUBPD");
  3043. AddInstruction("xmm1,xmm2/mem128", "660F5C/r", {}, {cpuSSE2});
  3044. StartMnemonic(opSUBPS, "SUBPS");
  3045. AddInstruction("xmm1,xmm2/mem128", "0F5C/r", {}, {cpuSSE});
  3046. StartMnemonic(opSUBSD, "SUBSD");
  3047. AddInstruction("xmm1,xmm2/mem64", "F20F5C/r", {}, {cpuSSE2});
  3048. StartMnemonic(opSUBSS, "SUBSS");
  3049. AddInstruction("xmm1,xmm2/mem32", "F30F5C/r", {}, {cpuSSE});
  3050. StartMnemonic(opSWAPGS, "SWAPGS");
  3051. AddInstruction("", "0F01F8", {}, {cpuAMD64});
  3052. StartMnemonic(opSYSCALL, "SYSCALL");
  3053. AddInstruction("", "0F05", {}, {cpuP6});
  3054. StartMnemonic(opSYSENTER, "SYSENTER");
  3055. AddInstruction("", "0F34", {optNot64}, {cpuP6});
  3056. StartMnemonic(opSYSEXIT, "SYSEXIT");
  3057. AddInstruction("", "0F35", {optNot64}, {cpuP6,cpuPrivileged});
  3058. StartMnemonic(opSYSRET, "SYSRET");
  3059. AddInstruction("", "0F07", {}, {cpuP6,cpuPrivileged});
  3060. StartMnemonic(opTEST, "TEST");
  3061. AddInstruction("reg/mem8,reg8", "84/r", {}, {cpu8086});
  3062. AddInstruction("reg/mem16,reg16", "85/r", {optO16}, {cpu8086});
  3063. AddInstruction("reg/mem32,reg32", "85/r", {optO32}, {cpu386});
  3064. AddInstruction("reg/mem64,reg64", "85/r", {}, {cpuAMD64});
  3065. AddInstruction("AL,imm8", "A8ib", {}, {cpu8086});
  3066. AddInstruction("AX,imm16", "A9iw", {optO16}, {cpu8086});
  3067. AddInstruction("EAX,imm32", "A9id", {optO32}, {cpu386});
  3068. AddInstruction("RAX,simm32", "A9id", {}, {cpuAMD64});
  3069. AddInstruction("reg/mem8,imm8", "F6/0ib", {}, {cpu8086});
  3070. AddInstruction("reg/mem16,imm16", "F7/0iw", {optO16}, {cpu8086});
  3071. AddInstruction("reg/mem32,imm32", "F7/0id", {optO32}, {cpu386});
  3072. AddInstruction("reg/mem64,simm32", "F7/0id", {}, {cpuAMD64});
  3073. StartMnemonic(opUCOMISD, "UCOMISD");
  3074. AddInstruction("xmm1,xmm2/mem64", "660F2E/r", {}, {cpuSSE2});
  3075. StartMnemonic(opUCOMISS, "UCOMISS");
  3076. AddInstruction("xmm1,xmm2/mem32", "0F2E/r", {}, {cpuSSE});
  3077. StartMnemonic(opUD2, "UD2");
  3078. AddInstruction("", "0F0B", {}, {cpu286});
  3079. StartMnemonic(opUNPCKHPD, "UNPCKHPD");
  3080. AddInstruction("xmm1,xmm2/mem128", "660F15/r", {}, {cpuSSE2});
  3081. StartMnemonic(opUNPCKHPS, "UNPCKHPS");
  3082. AddInstruction("xmm1,xmm2/mem128", "0F15/r", {}, {cpuSSE});
  3083. StartMnemonic(opUNPCKLPD, "UNPCKLPD");
  3084. AddInstruction("xmm1,xmm2/mem128", "660F14/r", {}, {cpuSSE2});
  3085. StartMnemonic(opUNPCKLPS, "UNPCKLPS");
  3086. AddInstruction("xmm1,xmm2/mem128", "0F14/r", {}, {cpuSSE});
  3087. StartMnemonic(opVERR, "VERR");
  3088. AddInstruction("reg/mem16", "0F00/4", {}, {cpu286,cpuPrivileged});
  3089. StartMnemonic(opVERW, "VERW");
  3090. AddInstruction("reg/mem16", "0F00/5", {}, {cpu286,cpuPrivileged});
  3091. StartMnemonic(opVMLOAD, "VMLOAD");
  3092. AddInstruction("rAX", "0F01DA", {}, {cpuAMD64});
  3093. StartMnemonic(opVMMCALL, "VMMCALL");
  3094. AddInstruction("", "0F01D9", {}, {cpuAMD64});
  3095. StartMnemonic(opVMRUN, "VMRUN");
  3096. AddInstruction("rAX", "0F01D8", {}, {cpuAMD64});
  3097. StartMnemonic(opVMSAVE, "VMSAVE");
  3098. AddInstruction("rAX", "0F01DB", {}, {cpuAMD64});
  3099. StartMnemonic(opWBINVD, "WBINVD");
  3100. AddInstruction("", "0F09", {}, {cpu486,cpuPrivileged});
  3101. StartMnemonic(opWRMSR, "WRMSR");
  3102. AddInstruction("", "0F30", {}, {cpuPentium,cpuPrivileged});
  3103. StartMnemonic(opXADD, "XADD");
  3104. AddInstruction("reg/mem8,reg8", "0FC0/r", {}, {cpu486});
  3105. AddInstruction("reg/mem16,reg16", "0FC1/r", {optO16}, {cpu486});
  3106. AddInstruction("reg/mem32,reg32", "0FC1/r", {optO32}, {cpu486});
  3107. AddInstruction("reg/mem64,reg64", "0FC1/r", {}, {cpuAMD64});
  3108. StartMnemonic(opXCHG, "XCHG");
  3109. AddInstruction("AX,reg16", "90rw", {optO16}, {cpu8086});
  3110. AddInstruction("reg16,AX", "90rw", {optO16}, {cpu8086});
  3111. AddInstruction("EAX,reg32", "90rd", {optO32}, {cpu386});
  3112. AddInstruction("reg32,EAX", "90rd", {optO32}, {cpu386});
  3113. AddInstruction("RAX,reg64", "90rq", {}, {cpuAMD64});
  3114. AddInstruction("reg64,RAX", "90rq", {}, {cpuAMD64});
  3115. AddInstruction("reg/mem8,reg8", "86/r", {}, {cpu8086});
  3116. AddInstruction("reg8,reg/mem8", "86/r", {}, {cpu8086});
  3117. AddInstruction("reg/mem16,reg16", "87/r", {optO16}, {cpu8086});
  3118. AddInstruction("reg16,reg/mem16", "87/r", {optO16}, {cpu8086});
  3119. AddInstruction("reg/mem32,reg32", "87/r", {optO32}, {cpu386});
  3120. AddInstruction("reg32,reg/mem32", "87/r", {optO32}, {cpu386});
  3121. AddInstruction("reg/mem64,reg64", "87/r", {}, {cpuAMD64});
  3122. AddInstruction("reg64,reg/mem64", "87/r", {}, {cpuAMD64});
  3123. StartMnemonic(opXLAT, "XLAT");
  3124. AddInstruction("mem8", "D7", {}, {cpu8086});
  3125. StartMnemonic(opXLATB, "XLATB");
  3126. AddInstruction("", "D7", {}, {cpu8086});
  3127. StartMnemonic(opXOR, "XOR");
  3128. AddInstruction("reg/mem8,reg8", "30/r", {}, {cpu8086});
  3129. AddInstruction("reg/mem16,reg16", "31/r", {optO16}, {cpu8086});
  3130. AddInstruction("reg/mem32,reg32", "31/r", {optO32}, {cpu386});
  3131. AddInstruction("reg/mem64,reg64", "31/r", {}, {cpuAMD64});
  3132. AddInstruction("reg8,reg/mem8", "32/r", {}, {cpu8086});
  3133. AddInstruction("reg16,reg/mem16", "33/r", {optO16}, {cpu8086});
  3134. AddInstruction("reg32,reg/mem32", "33/r", {optO32}, {cpu386});
  3135. AddInstruction("reg64,reg/mem64", "33/r", {}, {cpuAMD64});
  3136. AddInstruction("AL,imm8", "34ib", {}, {cpu8086});
  3137. AddInstruction("AX,imm16", "35iw", {optO16}, {cpu8086});
  3138. AddInstruction("EAX,imm32", "35id", {optO32}, {cpu386});
  3139. AddInstruction("RAX,simm32", "35id", {}, {cpuAMD64});
  3140. AddInstruction("reg/mem8,imm8", "80/6ib", {}, {cpu8086});
  3141. AddInstruction("reg/mem16,imm16", "81/6iw", {optO16}, {cpu8086});
  3142. AddInstruction("reg/mem32,imm32", "81/6id", {optO32}, {cpu386});
  3143. AddInstruction("reg/mem64,simm32", "81/6id", {}, {cpuAMD64});
  3144. AddInstruction("reg/mem16,simm8", "83/6ib", {optO16}, {cpu8086});
  3145. AddInstruction("reg/mem32,simm8", "83/6ib", {optO32}, {cpu386});
  3146. AddInstruction("reg/mem64,simm8", "83/6ib", {}, {cpuAMD64});
  3147. StartMnemonic(opXORPD, "XORPD");
  3148. AddInstruction("xmm1,xmm2/mem128", "660F57/r", {}, {cpuSSE2});
  3149. StartMnemonic(opXORPS, "XORPS");
  3150. AddInstruction("xmm1,xmm2/mem128", "0F57/r", {}, {cpuSSE});
  3151. END InitInstructions;
  3152. PROCEDURE IsImmediate8*(operandType: OperandType): BOOLEAN;
  3153. BEGIN RETURN (operandType = imm8) OR (operandType = simm8) OR (operandType = uimm8)
  3154. END IsImmediate8;
  3155. PROCEDURE IsImmediate16*(operandType: OperandType): BOOLEAN;
  3156. BEGIN RETURN (operandType = imm16) OR (operandType = simm16) OR (operandType = uimm16)
  3157. END IsImmediate16;
  3158. PROCEDURE IsImmediate32*(operandType: OperandType): BOOLEAN;
  3159. BEGIN RETURN (operandType = imm32) OR (operandType = simm32) OR (operandType = uimm32)
  3160. END IsImmediate32;
  3161. PROCEDURE IsImmediate64*(operandType: OperandType): BOOLEAN;
  3162. BEGIN RETURN (operandType = imm64)
  3163. END IsImmediate64;
  3164. PROCEDURE IsRegister8*(index: LONGINT): BOOLEAN;
  3165. BEGIN
  3166. RETURN registers[index].type = reg8;
  3167. END IsRegister8;
  3168. PROCEDURE Register8*(index: SHORTINT): LONGINT;
  3169. BEGIN
  3170. RETURN registersByClass[reg8,index]
  3171. END Register8;
  3172. PROCEDURE IsRegister8Low*(index: LONGINT): BOOLEAN;
  3173. BEGIN
  3174. CASE index OF
  3175. regAL, regBL, regCL,regDL,regR8B,regR9B,regR10B,regR11B,regR12B,regR13B,regR14B,regR15B: RETURN TRUE
  3176. ELSE
  3177. RETURN FALSE
  3178. END
  3179. END IsRegister8Low;
  3180. PROCEDURE IsRegister8High*(index: LONGINT): BOOLEAN;
  3181. BEGIN
  3182. CASE index OF
  3183. regAH, regBH, regCH,regDH: RETURN TRUE
  3184. ELSE
  3185. RETURN FALSE
  3186. END
  3187. END IsRegister8High;
  3188. PROCEDURE Register16*(index: SHORTINT): LONGINT;
  3189. BEGIN
  3190. RETURN registersByClass[reg16,index]
  3191. END Register16;
  3192. PROCEDURE IsRegister16*(index: LONGINT): BOOLEAN;
  3193. BEGIN
  3194. RETURN registers[index].type = reg16;
  3195. END IsRegister16;
  3196. PROCEDURE Register32*(index: SHORTINT): LONGINT;
  3197. BEGIN
  3198. RETURN registersByClass[reg32,index]
  3199. END Register32;
  3200. PROCEDURE IsRegister32*(index: LONGINT): BOOLEAN;
  3201. BEGIN
  3202. RETURN registers[index].type = reg32;
  3203. END IsRegister32;
  3204. PROCEDURE Register64*(index: SHORTINT): LONGINT;
  3205. BEGIN
  3206. RETURN registersByClass[reg64,index]
  3207. END Register64;
  3208. PROCEDURE IsRegister64*(index: LONGINT): BOOLEAN;
  3209. BEGIN
  3210. RETURN registers[index].type = reg64;
  3211. END IsRegister64;
  3212. PROCEDURE CounterRegister*(index: SHORTINT): LONGINT;
  3213. BEGIN
  3214. RETURN registersByClass[CRn,index]
  3215. END CounterRegister;
  3216. PROCEDURE IsCounterRegister*(index: LONGINT): BOOLEAN;
  3217. BEGIN
  3218. RETURN registers[index].type = CRn;
  3219. END IsCounterRegister;
  3220. PROCEDURE DebugRegister*(index: SHORTINT): LONGINT;
  3221. BEGIN
  3222. RETURN registersByClass[DRn,index]
  3223. END DebugRegister;
  3224. PROCEDURE IsDebugRegister*(index: LONGINT): BOOLEAN;
  3225. BEGIN
  3226. RETURN registers[index].type = DRn;
  3227. END IsDebugRegister;
  3228. PROCEDURE SegmentRegister*(index: SHORTINT): LONGINT;
  3229. BEGIN
  3230. RETURN registersByClass[segReg,index]
  3231. END SegmentRegister;
  3232. PROCEDURE IsSegmentRegister*(index: LONGINT): BOOLEAN;
  3233. BEGIN
  3234. RETURN registers[index].type = segReg;
  3235. END IsSegmentRegister;
  3236. PROCEDURE MMXRegister*(index: SHORTINT): LONGINT;
  3237. BEGIN
  3238. RETURN registersByClass[mmx,index]
  3239. END MMXRegister;
  3240. PROCEDURE IsMMXRegister*(index: LONGINT): BOOLEAN;
  3241. BEGIN
  3242. RETURN registers[index].type = mmx;
  3243. END IsMMXRegister;
  3244. PROCEDURE SSERegister*(index: SHORTINT): LONGINT;
  3245. BEGIN
  3246. RETURN registersByClass[xmm,index]
  3247. END SSERegister;
  3248. PROCEDURE IsSSERegister*(index: LONGINT): BOOLEAN;
  3249. BEGIN
  3250. RETURN registers[index].type = xmm;
  3251. END IsSSERegister;
  3252. PROCEDURE FPRegister*(index: SHORTINT): LONGINT;
  3253. BEGIN
  3254. RETURN registersByClass[sti,index]
  3255. END FPRegister;
  3256. PROCEDURE IsFPRegister*(index: LONGINT): BOOLEAN;
  3257. BEGIN
  3258. RETURN registers[index].type = sti;
  3259. END IsFPRegister;
  3260. (** setup register tables **)
  3261. PROCEDURE InitRegisters;
  3262. (* insert an new register *)
  3263. PROCEDURE AddRegister (number: LONGINT; CONST name: ARRAY OF CHAR; type: OperandType; sizeInBytes: SHORTINT; index: SHORTINT);
  3264. BEGIN
  3265. COPY (name, registers[number].name);
  3266. registers[number].type := type;
  3267. registers[number].index := index;
  3268. registers[number].sizeInBytes := sizeInBytes;
  3269. registersByClass[type,index] := number;
  3270. END AddRegister;
  3271. PROCEDURE InitRegisters;
  3272. VAR i,j: LONGINT;
  3273. BEGIN
  3274. FOR i := 0 TO LEN(registersByClass)-1 DO
  3275. FOR j := 0 TO LEN(registersByClass[i])-1 DO
  3276. registersByClass[i,j] := none;
  3277. END;
  3278. END;
  3279. END InitRegisters;
  3280. BEGIN
  3281. InitRegisters;
  3282. AddRegister (regAL,"AL", reg8, bits8, 0);
  3283. AddRegister (regCL,"CL", reg8, bits8,1);
  3284. AddRegister (regDL,"DL", reg8, bits8,2);
  3285. AddRegister (regBL,"BL", reg8, bits8,3);
  3286. AddRegister (regAH,"AH", reg8, bits8,4);
  3287. AddRegister (regCH,"CH", reg8, bits8,5);
  3288. AddRegister (regDH,"DH", reg8, bits8,6);
  3289. AddRegister (regBH,"BH", reg8, bits8,7);
  3290. AddRegister (regSPL,"SPL", reg8, bits8, 4);
  3291. AddRegister (regBPL,"BPL", reg8, bits8,5);
  3292. AddRegister (regSIL,"SIL", reg8, bits8,6);
  3293. AddRegister (regDIL,"DIL", reg8, bits8,7);
  3294. AddRegister (regR8B,"R8B", reg8, bits8,8);
  3295. AddRegister (regR9B,"R9B", reg8, bits8,9);
  3296. AddRegister (regR10B,"R10B", reg8, bits8,10);
  3297. AddRegister (regR11B,"R11B", reg8, bits8,11);
  3298. AddRegister (regR12B,"R12B", reg8, bits8,12);
  3299. AddRegister (regR13B,"R13B", reg8, bits8,13);
  3300. AddRegister (regR14B,"R14B", reg8, bits8,14);
  3301. AddRegister (regR15B,"R15B", reg8, bits8,15);
  3302. AddRegister (regAX,"AX", reg16, bits16, 0);
  3303. AddRegister (regCX,"CX", reg16, bits16, 1);
  3304. AddRegister (regDX,"DX", reg16, bits16, 2);
  3305. AddRegister (regBX,"BX", reg16, bits16, 3);
  3306. AddRegister (regSP,"SP", reg16, bits16, 4);
  3307. AddRegister (regBP,"BP", reg16, bits16, 5);
  3308. AddRegister (regSI,"SI", reg16, bits16, 6);
  3309. AddRegister (regDI,"DI", reg16, bits16, 7);
  3310. AddRegister (regR8W,"R8W", reg16, bits16, 8);
  3311. AddRegister (regR9W,"R9W", reg16, bits16, 9);
  3312. AddRegister (regR10W,"R10W", reg16, bits16, 10);
  3313. AddRegister (regR11W,"R11W", reg16, bits16, 11);
  3314. AddRegister (regR12W,"R12W", reg16, bits16, 12);
  3315. AddRegister (regR13W,"R13W", reg16, bits16, 13);
  3316. AddRegister (regR14W,"R14W", reg16, bits16, 14);
  3317. AddRegister (regR15W,"R15W", reg16, bits16, 15);
  3318. AddRegister (regEAX,"EAX", reg32, bits32, 0);
  3319. AddRegister (regECX,"ECX", reg32, bits32, 1);
  3320. AddRegister (regEDX,"EDX", reg32, bits32, 2);
  3321. AddRegister (regEBX,"EBX", reg32, bits32, 3);
  3322. AddRegister (regESP,"ESP", reg32, bits32, 4);
  3323. AddRegister (regEBP,"EBP", reg32, bits32, 5);
  3324. AddRegister (regESI,"ESI", reg32, bits32, 6);
  3325. AddRegister (regEDI,"EDI", reg32, bits32, 7);
  3326. AddRegister (regR8D,"R8D", reg32, bits32, 8);
  3327. AddRegister (regR9D,"R9D", reg32, bits32, 9);
  3328. AddRegister (regR10D,"R10D", reg32, bits32, 10);
  3329. AddRegister (regR11D,"R11D", reg32, bits32, 11);
  3330. AddRegister (regR12D,"R12D", reg32, bits32, 12);
  3331. AddRegister (regR13D,"R13D", reg32, bits32, 13);
  3332. AddRegister (regR14D,"R14D", reg32, bits32, 14);
  3333. AddRegister (regR15D,"R15D", reg32, bits32, 15);
  3334. AddRegister (regRAX,"RAX", reg64, bits64, 0);
  3335. AddRegister (regRCX,"RCX", reg64, bits64, 1);
  3336. AddRegister (regRDX,"RDX", reg64, bits64, 2);
  3337. AddRegister (regRBX,"RBX", reg64, bits64, 3);
  3338. AddRegister (regRSP,"RSP", reg64, bits64, 4);
  3339. AddRegister (regRBP,"RBP", reg64, bits64, 5);
  3340. AddRegister (regRSI, "RSI", reg64,bits64, 6);
  3341. AddRegister (regRDI,"RDI", reg64, bits64, 7);
  3342. AddRegister (regR8,"R8", reg64, bits64, 8);
  3343. AddRegister (regR9,"R9", reg64, bits64, 9);
  3344. AddRegister (regR10,"R10", reg64, bits64, 10);
  3345. AddRegister (regR11,"R11", reg64, bits64, 11);
  3346. AddRegister (regR12,"R12", reg64, bits64, 12);
  3347. AddRegister (regR13,"R13", reg64, bits64, 13);
  3348. AddRegister (regR14,"R14", reg64, bits64, 14);
  3349. AddRegister (regR15,"R15", reg64, bits64, 15);
  3350. AddRegister (regRIP,"RIP", reg64, bits64, 16);
  3351. AddRegister (regES,"ES", segReg, bitsDefault, 0);
  3352. AddRegister (regCS,"CS", segReg, bitsDefault, 1);
  3353. AddRegister (regSS,"SS", segReg, bitsDefault, 2);
  3354. AddRegister (regDS,"DS", segReg, bitsDefault, 3);
  3355. AddRegister (regFS,"FS", segReg, bitsDefault, 4);
  3356. AddRegister (regGS,"GS", segReg, bitsDefault, 5);
  3357. AddRegister (regCR0,"CR0", CRn, bitsDefault, 0);
  3358. AddRegister (regCR1,"CR1", CRn, bitsDefault, 1);
  3359. AddRegister (regCR2,"CR2", CRn, bitsDefault, 2);
  3360. AddRegister (regCR3,"CR3", CRn, bitsDefault, 3);
  3361. AddRegister (regCR4,"CR4", CRn, bitsDefault, 4);
  3362. AddRegister (regCR5,"CR5", CRn, bitsDefault, 5);
  3363. AddRegister (regCR6,"CR6", CRn, bitsDefault, 6);
  3364. AddRegister (regCR7,"CR7", CRn, bitsDefault, 7);
  3365. AddRegister (regCR8,"CR8", CRn, bitsDefault, 8);
  3366. AddRegister (regCR9,"CR9", CRn, bitsDefault, 9);
  3367. AddRegister (regCR10,"CR10", CRn, bitsDefault, 10);
  3368. AddRegister (regCR11,"CR11", CRn, bitsDefault, 11);
  3369. AddRegister (regCR12,"CR12", CRn, bitsDefault, 12);
  3370. AddRegister (regCR13,"CR13", CRn, bitsDefault, 13);
  3371. AddRegister (regCR14,"CR14", CRn, bitsDefault, 14);
  3372. AddRegister (regCR15,"CR15", CRn, bitsDefault, 15);
  3373. AddRegister (regDR0,"DR0", DRn, bitsDefault, 0);
  3374. AddRegister (regDR1,"DR1", DRn, bitsDefault, 1);
  3375. AddRegister (regDR2,"DR2", DRn, bitsDefault, 2);
  3376. AddRegister (regDR3,"DR3", DRn, bitsDefault, 3);
  3377. AddRegister (regDR4,"DR4", DRn, bitsDefault, 4);
  3378. AddRegister (regDR5,"DR5", DRn, bitsDefault, 5);
  3379. AddRegister (regDR6,"DR6", DRn, bitsDefault, 6);
  3380. AddRegister (regDR7,"DR7", DRn, bitsDefault, 7);
  3381. AddRegister (regDR8,"DR8", DRn, bitsDefault, 8);
  3382. AddRegister (regDR9,"DR9", DRn, bitsDefault, 9);
  3383. AddRegister (regDR10,"DR10", DRn, bitsDefault, 10);
  3384. AddRegister (regDR11,"DR11", DRn, bitsDefault, 11);
  3385. AddRegister (regDR12,"DR12", DRn, bitsDefault, 12);
  3386. AddRegister (regDR13,"DR13", DRn, bitsDefault, 13);
  3387. AddRegister (regDR14,"DR14", DRn, bitsDefault, 14);
  3388. AddRegister (regDR15,"DR15", DRn, bitsDefault, 15);
  3389. AddRegister (regST0,"ST0", sti, bitsDefault, 0);
  3390. AddRegister (regST1,"ST1", sti, bitsDefault, 1);
  3391. AddRegister (regST2,"ST2", sti, bitsDefault, 2);
  3392. AddRegister (regST3,"ST3", sti, bitsDefault, 3);
  3393. AddRegister (regST4,"ST4", sti, bitsDefault, 4);
  3394. AddRegister (regST5,"ST5", sti, bitsDefault, 5);
  3395. AddRegister (regST6,"ST6", sti, bitsDefault, 6);
  3396. AddRegister (regST7,"ST7", sti, bitsDefault, 7);
  3397. AddRegister (regXMM0,"XMM0", xmm, bits64, 0);
  3398. AddRegister (regXMM1,"XMM1", xmm, bits64, 1);
  3399. AddRegister (regXMM2,"XMM2", xmm, bits64, 2);
  3400. AddRegister (regXMM3,"XMM3", xmm, bits64, 3);
  3401. AddRegister (regXMM4,"XMM4", xmm, bits64, 4);
  3402. AddRegister (regXMM5,"XMM5", xmm, bits64, 5);
  3403. AddRegister (regXMM6,"XMM6", xmm, bits64, 6);
  3404. AddRegister (regXMM7,"XMM7", xmm, bits64, 7);
  3405. AddRegister (regXMM8,"XMM8", xmm, bits64, 8);
  3406. AddRegister (regXMM9,"XMM9", xmm, bits64, 9);
  3407. AddRegister (regXMM10,"XMM10", xmm, bits64, 10);
  3408. AddRegister (regXMM11,"XMM11", xmm, bits64, 11);
  3409. AddRegister (regXMM12,"XMM12", xmm, bits64, 12);
  3410. AddRegister (regXMM13,"XMM13", xmm, bits64, 13);
  3411. AddRegister (regXMM14,"XMM14", xmm, bits64, 14);
  3412. AddRegister (regXMM15,"XMM15", xmm, bits64, 15);
  3413. AddRegister (regMMX0,"MMX0", mmx, bits128, 0);
  3414. AddRegister (regMMX1,"MMX1", mmx, bits128, 1);
  3415. AddRegister (regMMX2,"MMX2", mmx, bits128, 2);
  3416. AddRegister (regMMX3,"MMX3", mmx, bits128, 3);
  3417. AddRegister (regMMX4,"MMX4", mmx, bits128, 4);
  3418. AddRegister (regMMX5,"MMX5", mmx, bits128, 5);
  3419. AddRegister (regMMX6,"MMX6", mmx, bits128, 6);
  3420. AddRegister (regMMX7,"MMX7", mmx, bits128, 7);
  3421. END InitRegisters;
  3422. (** setup CPU tables **)
  3423. PROCEDURE InitCPUs;
  3424. (* insert a new cpu type *)
  3425. PROCEDURE AddCpu (CONST name: ARRAY OF CHAR; cpuoptions: SET);
  3426. BEGIN
  3427. COPY (name, cpus[cpuCount].name);
  3428. cpus[cpuCount].cpuOptions := cpuoptions;
  3429. INC (cpuCount);
  3430. END AddCpu;
  3431. BEGIN
  3432. cpuCount := 0;
  3433. AddCpu ("8086", {cpu8086});
  3434. AddCpu ("186", {cpu8086, cpu186});
  3435. AddCpu ("286", {cpu8086 .. cpu286});
  3436. AddCpu ("386", {cpu8086 .. cpu386});
  3437. AddCpu ("I386", {cpu8086 .. cpu386});
  3438. AddCpu ("486", {cpu8086 .. cpu486});
  3439. AddCpu ("I486", {cpu8086 .. cpu486});
  3440. AddCpu ("586", {cpu8086 .. cpuPentium});
  3441. AddCpu ("PENTIUM", {cpu8086 .. cpuPentium});
  3442. AddCpu ("686", {cpu8086 .. cpuP6});
  3443. AddCpu ("PPRO", {cpu8086 .. cpuP6});
  3444. AddCpu ("PENTIUMPRO", {cpu8086 .. cpuP6});
  3445. AddCpu ("P2", {cpu8086 .. cpuP6});
  3446. AddCpu ("P3", {cpu8086 .. cpuKatmai});
  3447. AddCpu ("KATMAI", {cpu8086 .. cpuKatmai});
  3448. AddCpu ("P4", {cpu8086 .. cpuWillamette});
  3449. AddCpu ("WILLAMETTE", {cpu8086 .. cpuWillamette});
  3450. AddCpu ("PRESCOTT", {cpu8086 .. cpuPrescott});
  3451. AddCpu ("AMD64", {cpu8086 .. cpuAMD64, cpuSSE, cpuSSE2, cpuSSE3, cpu3DNow, cpuMMX});
  3452. AddCpu ("PRIVILEGED", {cpuPrivileged});
  3453. AddCpu ("PROTECTED", {cpuProtected});
  3454. AddCpu ("SSE", {cpuSSE});
  3455. AddCpu ("SSE2", {cpuSSE2,cpuSSE});
  3456. AddCpu ("SSE3", {cpuSSE3,cpuSSE2,cpuSSE});
  3457. AddCpu ("3DNOW", {cpu3DNow});
  3458. AddCpu ("MMX", {cpuMMX});
  3459. AddCpu ("FPU", {cpuFPU});
  3460. END InitCPUs;
  3461. PROCEDURE Trace*;
  3462. VAR instr: LONGINT; i: LONGINT;
  3463. BEGIN
  3464. instr := 0;
  3465. WHILE instr < numberInstructions DO
  3466. KernelLog.Int(instr,5);
  3467. KernelLog.String(" ");
  3468. FOR i := 0 TO maxCodeLength-1 DO
  3469. KernelLog.Hex(ORD(instructions[instr].code[i]),-2); KernelLog.String(" ");
  3470. END;
  3471. FOR i := 0 TO maxNumberOperands-1 DO
  3472. KernelLog.Int(instructions[instr].operands[i],1); KernelLog.String(" ");
  3473. END;
  3474. KernelLog.Ln;
  3475. INC(instr);
  3476. END;
  3477. END Trace;
  3478. BEGIN
  3479. InitInstructions;
  3480. InitRegisters;
  3481. InitCPUs;
  3482. END FoxAMD64InstructionSet.
  3483. FoxAMD6InstructionSet.Trace
  3484. SystemTools.Free FoxAMD64InstructionSet ~
  3485. 4
  3486. (** Instruction Format, cf. [AMD:3], chapter 1
  3487. [LegacyPrefix] ; Operand-Size Override / modify opcode of media instructions
  3488. [LegacyPrefix] ; Address-Size Override
  3489. [LegacyPrefix] ; Segment Override
  3490. [LegacyPrefix] ; LOCK Prefix
  3491. [LegacyPrefix] ; Repeat Prefixes
  3492. [REXPrefix]; 7-4: 0100 3:W 2:R 1:X 0:B register modification (W) and extension bits (R-register X-index B-base)
  3493. Opcode
  3494. [Opcode]
  3495. [Opcode]
  3496. [ModRM]; 7:6:mod 5:3:reg 2:0:r/m (op code modifier, register, memory)
  3497. [SIB]; 7:6 scale 5:3:index 2:0:base (scale, index, base)
  3498. [Displacement]
  3499. [Displacement]
  3500. [Displacement]
  3501. [Displacement]
  3502. is a 64bit displacement possible ?
  3503. [Immediate]
  3504. [Immediate]
  3505. [Immediate]
  3506. [Immediate]
  3507. [Immediate]; only for MOV instruction
  3508. [Immediate]; only for MOV instruction
  3509. [Immediate]; only for MOV instruction
  3510. [Immediate]; only for MOV instruction
  3511. Instruction = RECORD
  3512. cpuoptions-: CPUOptions; (* necessary CPU options for the instruction to be available *)
  3513. prefixFlags-: SET;
  3514. numerLegacyPrefixes-: SHORTINT;
  3515. legacyPrefixes-: ARRAY MaxLegacyPrefixes OF CHAR; (* legacy prefixes *)
  3516. usedREXPrefix-:BOOLEAN;
  3517. REXPrefix-:CHAR; (* REX prefix *)
  3518. opcodeFlags-: SET;
  3519. numberOpcodes-: SHORTINT; (* 1..MaxOpCodes *)
  3520. opcode-: ARRAY MaxOpCodes OF CHAR;
  3521. usedModRM-: BOOLEAN;
  3522. ModRM: CHAR; (* mode-register-memory *)
  3523. usedSIB_: BOOLEAN;
  3524. SIB-: CHAR; (* scale-index-base *)
  3525. numberOperands-: SHORTINT; (* 0.. MaxOperands *)
  3526. operand-: ARRAY MaxOperands OF Operand;
  3527. END;
  3528. **)