| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400 |
- #include "Assembly.h"
- #include "InMemoryBuffer.h"
- enum OperandSizeOverwrite
- {
- NO_PREFIX = 0,
- X66 = 0x66,
- XF2 = 0xF2,
- XF3 = 0xF3
- };
- bool isVolatile(Framework::Assembly::GPRegister reg)
- {
- return reg == Framework::Assembly::RAX || reg == Framework::Assembly::RCX
- || reg == Framework::Assembly::RDX || reg == Framework::Assembly::R8
- || reg == Framework::Assembly::R9 || reg == Framework::Assembly::R10
- || reg == Framework::Assembly::R11;
- }
- bool isVolatile(Framework::Assembly::FPRegister reg)
- {
- return reg == Framework::Assembly::MM0 || reg == Framework::Assembly::MM1
- || reg == Framework::Assembly::MM2 || reg == Framework::Assembly::MM3
- || reg == Framework::Assembly::MM4 || reg == Framework::Assembly::MM5;
- }
- struct MachineCodeInstruction
- {
- bool needsRex;
- char opcode[3];
- char opcodeLength;
- bool needsModRM;
- char modRM;
- bool sibNeeded;
- char sib;
- char disp[4];
- char dispLength;
- char imm[8];
- char immLength;
- OperandSizeOverwrite operandSizeOverride;
- bool errIfRex;
- bool errIfNoRex;
- bool exR;
- bool exX;
- bool exB;
- bool vexL;
- bool exWE;
- int vexVVVV;
- char vexPP;
- bool needsVex;
- void write(Framework::StreamWriter& writer) const
- {
- if (operandSizeOverride)
- {
- char prefix = *(char*)&operandSizeOverride;
- writer.schreibe(&prefix, 1);
- }
- if (needsRex && !needsVex)
- {
- char rex = 0b01000000 | ((exWE & 0b1) << 3) | ((exR & 0b1) << 2)
- | ((exX & 0b1) << 1) | (exB & 0b1);
- writer.schreibe(&rex, 1);
- }
- int opCodeOffset = 0;
- if (needsVex)
- {
- char vexMapSelect = 0;
- if (opcode[0] == 0x0F)
- {
- opCodeOffset = 1;
- vexMapSelect = 1;
- if (opcode[1] == 0x38)
- {
- vexMapSelect = 2;
- opCodeOffset = 2;
- }
- else if (opcode[1] == 0x3A)
- {
- vexMapSelect = 3;
- opCodeOffset = 2;
- }
- }
- if (exX || exB || exWE || vexMapSelect != 1)
- {
- // 3-byte VEX
- char vex2[3];
- vex2[0] = (char)0xC4;
- vex2[1]
- = (((~(char)exR) & 0b1) << 7) | (((~(char)exX) & 0b1) << 6)
- | (((~(char)exB) & 0b1) << 5) | (vexMapSelect & 0b11111);
- vex2[2] = ((exWE & 0b1) << 7)
- | (((~(char)vexVVVV) & 0b1111) << 3)
- | ((vexL & 0b1) << 2) | (vexPP & 0b11);
- writer.schreibe(vex2, 3);
- }
- else
- {
- // 2-byte VEX
- char vex2[2];
- vex2[0] = (char)0xC5;
- vex2[1] = (((~(char)exR) & 0b1) << 7)
- | (((~(char)vexVVVV) & 0b1111) << 3)
- | ((vexL & 0b1) << 2) | (vexPP & 0b11);
- writer.schreibe(vex2, 2);
- }
- }
- writer.schreibe(opcode + opCodeOffset, opcodeLength - opCodeOffset);
- if (needsModRM)
- {
- writer.schreibe(&modRM, 1);
- }
- if (sibNeeded)
- {
- writer.schreibe(&sib, 1);
- }
- if (dispLength > 0)
- {
- writer.schreibe(disp, dispLength);
- }
- if (immLength > 0)
- {
- writer.schreibe(imm, immLength);
- }
- }
- int calculateSize() const
- {
- int size = 0;
- if (operandSizeOverride)
- {
- size += 1;
- }
- if (needsRex && !needsVex)
- {
- size += 1;
- }
- int opCodeOffset = 0;
- if (needsVex)
- {
- char vexMapSelect = 0;
- if (opcode[0] == 0x0F)
- {
- opCodeOffset = 1;
- vexMapSelect = 1;
- if (opcode[1] == 0x38)
- {
- vexMapSelect = 2;
- opCodeOffset = 2;
- }
- else if (opcode[1] == 0x3A)
- {
- vexMapSelect = 3;
- opCodeOffset = 2;
- }
- }
- if (exX || exB || exWE || vexMapSelect != 1)
- {
- size += 3;
- }
- else
- {
- size += 2;
- }
- }
- size += opcodeLength - opCodeOffset;
- if (needsModRM)
- {
- size += 1;
- }
- if (sibNeeded)
- {
- size += 1;
- }
- size += dispLength;
- size += immLength;
- return size;
- }
- };
- enum OperandEncoding
- {
- UNDEFINED,
- MODRM_REG,
- MODRM_RM,
- VEX_VVVV,
- OPCODE_RD,
- // EVEX_VVVV,
- IMM8,
- IMM16,
- IMM32,
- IMM64,
- };
- enum OperandRW
- {
- NONE = 0,
- READ = 1,
- WRITE = 2,
- READWRITE = 3,
- };
- class MachineCodeTableEntry
- {
- private:
- int numArgs;
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op1Validator;
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op2Validator;
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op3Validator;
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op4Validator;
- bool vex;
- bool vexL;
- char vexPP;
- bool rexW;
- char rmReg;
- char opcode[3];
- char opcodeLength;
- OperandEncoding op1Encoding;
- OperandEncoding op2Encoding;
- OperandEncoding op3Encoding;
- OperandEncoding op4Encoding;
- OperandRW op1RW;
- OperandRW op2RW;
- OperandRW op3RW;
- OperandRW op4RW;
- std::vector<Framework::Assembly::GPRegister> impliedReadGPRegs;
- std::vector<Framework::Assembly::GPRegister> impliedWriteGPRegs;
- std::vector<Framework::Assembly::FPRegister> impliedReadFPRegs;
- std::vector<Framework::Assembly::FPRegister> impliedWriteFPRegs;
- OperandSizeOverwrite operandSizeOverride;
- public:
- MachineCodeTableEntry(bool rexW,
- int opcode,
- char opcodeLength,
- OperandSizeOverwrite operandSizeOverride,
- bool vex,
- bool vexL,
- char vexPP,
- char rmReg)
- : numArgs(0),
- rexW(rexW),
- rmReg(rmReg),
- opcodeLength(opcodeLength),
- operandSizeOverride(operandSizeOverride),
- vex(vex),
- vexL(vexL),
- vexPP(vexPP),
- op1Encoding(UNDEFINED),
- op2Encoding(UNDEFINED),
- op3Encoding(UNDEFINED),
- op4Encoding(UNDEFINED),
- op1RW(NONE),
- op2RW(NONE),
- op3RW(NONE),
- op4RW(NONE)
- {
- this->opcode[0] = (char)(opcode & 0xFF);
- this->opcode[1] = (char)((opcode >> 8) & 0xFF);
- this->opcode[2] = (char)((opcode >> 16) & 0xFF);
- }
- MachineCodeTableEntry(bool rexW,
- int opcode,
- char opcodeLength,
- OperandSizeOverwrite operandSizeOverride,
- bool vex,
- bool vexL,
- char vexPP,
- char rmReg,
- std::initializer_list<Framework::Assembly::GPRegister>
- impliedReadGPRegs,
- std::initializer_list<Framework::Assembly::GPRegister>
- impliedWriteGPRegs,
- std::initializer_list<Framework::Assembly::FPRegister>
- impliedReadFPRegs,
- std::initializer_list<Framework::Assembly::FPRegister>
- impliedWriteFPRegs)
- : MachineCodeTableEntry(rexW,
- opcode,
- opcodeLength,
- operandSizeOverride,
- vex,
- vexL,
- vexPP,
- rmReg)
- {
- this->opcode[0] = (char)(opcode & 0xFF);
- this->opcode[1] = (char)((opcode >> 8) & 0xFF);
- this->opcode[2] = (char)((opcode >> 16) & 0xFF);
- this->impliedReadGPRegs = impliedReadGPRegs;
- this->impliedWriteGPRegs = impliedWriteGPRegs;
- this->impliedReadFPRegs = impliedReadFPRegs;
- this->impliedWriteFPRegs = impliedWriteFPRegs;
- }
- MachineCodeTableEntry(bool rexW,
- int opcode,
- char opcodeLength,
- OperandSizeOverwrite operandSizeOverride,
- bool vex,
- bool vexL,
- char vexPP,
- char rmReg,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op1Validator,
- OperandEncoding op1Encoding,
- OperandRW op1RW)
- : MachineCodeTableEntry(rexW,
- opcode,
- opcodeLength,
- operandSizeOverride,
- vex,
- vexL,
- vexPP,
- rmReg)
- {
- numArgs = 1;
- this->op1Validator = op1Validator;
- this->op1Encoding = op1Encoding;
- this->op1RW = op1RW;
- }
- MachineCodeTableEntry(bool rexW,
- int opcode,
- char opcodeLength,
- OperandSizeOverwrite operandSizeOverride,
- bool vex,
- bool vexL,
- char vexPP,
- char rmReg,
- std::initializer_list<Framework::Assembly::GPRegister>
- impliedReadGPRegs,
- std::initializer_list<Framework::Assembly::GPRegister>
- impliedWriteGPRegs,
- std::initializer_list<Framework::Assembly::FPRegister>
- impliedReadFPRegs,
- std::initializer_list<Framework::Assembly::FPRegister>
- impliedWriteFPRegs,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op1Validator,
- OperandEncoding op1Encoding,
- OperandRW op1RW)
- : MachineCodeTableEntry(rexW,
- opcode,
- opcodeLength,
- operandSizeOverride,
- vex,
- vexL,
- vexPP,
- rmReg,
- impliedReadGPRegs,
- impliedWriteGPRegs,
- impliedReadFPRegs,
- impliedWriteFPRegs)
- {
- numArgs = 1;
- this->op1Validator = op1Validator;
- this->op1Encoding = op1Encoding;
- this->op1RW = op1RW;
- }
- MachineCodeTableEntry(bool rexW,
- int opcode,
- char opcodeLength,
- OperandSizeOverwrite operandSizeOverride,
- bool vex,
- bool vexL,
- char vexPP,
- char rmReg,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op1Validator,
- OperandEncoding op1Encoding,
- OperandRW op1RW,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op2Validator,
- OperandEncoding op2Encoding,
- OperandRW op2RW)
- : MachineCodeTableEntry(rexW,
- opcode,
- opcodeLength,
- operandSizeOverride,
- vex,
- vexL,
- vexPP,
- rmReg,
- op1Validator,
- op1Encoding,
- op1RW)
- {
- numArgs = 2;
- this->op2Validator = op2Validator;
- this->op2Encoding = op2Encoding;
- this->op2RW = op2RW;
- }
- MachineCodeTableEntry(bool rexW,
- int opcode,
- char opcodeLength,
- OperandSizeOverwrite operandSizeOverride,
- bool vex,
- bool vexL,
- char vexPP,
- char rmReg,
- std::initializer_list<Framework::Assembly::GPRegister>
- impliedReadGPRegs,
- std::initializer_list<Framework::Assembly::GPRegister>
- impliedWriteGPRegs,
- std::initializer_list<Framework::Assembly::FPRegister>
- impliedReadFPRegs,
- std::initializer_list<Framework::Assembly::FPRegister>
- impliedWriteFPRegs,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op1Validator,
- OperandEncoding op1Encoding,
- OperandRW op1RW,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op2Validator,
- OperandEncoding op2Encoding,
- OperandRW op2RW)
- : MachineCodeTableEntry(rexW,
- opcode,
- opcodeLength,
- operandSizeOverride,
- vex,
- vexL,
- vexPP,
- rmReg,
- impliedReadGPRegs,
- impliedWriteGPRegs,
- impliedReadFPRegs,
- impliedWriteFPRegs,
- op1Validator,
- op1Encoding,
- op1RW)
- {
- numArgs = 2;
- this->op2Validator = op2Validator;
- this->op2Encoding = op2Encoding;
- this->op2RW = op2RW;
- }
- MachineCodeTableEntry(bool rexW,
- int opcode,
- char opcodeLength,
- OperandSizeOverwrite operandSizeOverride,
- bool vex,
- bool vexL,
- char vexPP,
- char rmReg,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op1Validator,
- OperandEncoding op1Encoding,
- OperandRW op1RW,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op2Validator,
- OperandEncoding op2Encoding,
- OperandRW op2RW,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op3Validator,
- OperandEncoding op3Encoding,
- OperandRW op3RW)
- : MachineCodeTableEntry(rexW,
- opcode,
- opcodeLength,
- operandSizeOverride,
- vex,
- vexL,
- vexPP,
- rmReg,
- op1Validator,
- op1Encoding,
- op1RW,
- op2Validator,
- op2Encoding,
- op2RW)
- {
- numArgs = 3;
- this->op3Validator = op3Validator;
- this->op3Encoding = op3Encoding;
- this->op3RW = op3RW;
- }
- MachineCodeTableEntry(bool rexW,
- int opcode,
- char opcodeLength,
- OperandSizeOverwrite operandSizeOverride,
- bool vex,
- bool vexL,
- char vexPP,
- char rmReg,
- std::initializer_list<Framework::Assembly::GPRegister>
- impliedReadGPRegs,
- std::initializer_list<Framework::Assembly::GPRegister>
- impliedWriteGPRegs,
- std::initializer_list<Framework::Assembly::FPRegister>
- impliedReadFPRegs,
- std::initializer_list<Framework::Assembly::FPRegister>
- impliedWriteFPRegs,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op1Validator,
- OperandEncoding op1Encoding,
- OperandRW op1RW,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op2Validator,
- OperandEncoding op2Encoding,
- OperandRW op2RW,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op3Validator,
- OperandEncoding op3Encoding,
- OperandRW op3RW)
- : MachineCodeTableEntry(rexW,
- opcode,
- opcodeLength,
- operandSizeOverride,
- vex,
- vexL,
- vexPP,
- rmReg,
- impliedReadGPRegs,
- impliedWriteGPRegs,
- impliedReadFPRegs,
- impliedWriteFPRegs,
- op1Validator,
- op1Encoding,
- op1RW,
- op2Validator,
- op2Encoding,
- op2RW)
- {
- numArgs = 3;
- this->op3Validator = op3Validator;
- this->op3Encoding = op3Encoding;
- this->op3RW = op3RW;
- }
- MachineCodeTableEntry(bool rexW,
- int opcode,
- char opcodeLength,
- OperandSizeOverwrite operandSizeOverride,
- bool vex,
- bool vexL,
- char vexPP,
- char rmReg,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op1Validator,
- OperandEncoding op1Encoding,
- OperandRW op1RW,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op2Validator,
- OperandEncoding op2Encoding,
- OperandRW op2RW,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op3Validator,
- OperandEncoding op3Encoding,
- OperandRW op3RW,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op4Validator,
- OperandEncoding op4Encoding,
- OperandRW op4RW)
- : MachineCodeTableEntry(rexW,
- opcode,
- opcodeLength,
- operandSizeOverride,
- vex,
- vexL,
- vexPP,
- rmReg,
- op1Validator,
- op1Encoding,
- op1RW,
- op2Validator,
- op2Encoding,
- op2RW,
- op3Validator,
- op3Encoding,
- op3RW)
- {
- numArgs = 4;
- this->op4Validator = op4Validator;
- this->op4Encoding = op4Encoding;
- this->op4RW = op4RW;
- }
- MachineCodeTableEntry(bool rexW,
- int opcode,
- char opcodeLength,
- OperandSizeOverwrite operandSizeOverride,
- bool vex,
- bool vexL,
- char vexPP,
- char rmReg,
- std::initializer_list<Framework::Assembly::GPRegister>
- impliedReadGPRegs,
- std::initializer_list<Framework::Assembly::GPRegister>
- impliedWriteGPRegs,
- std::initializer_list<Framework::Assembly::FPRegister>
- impliedReadFPRegs,
- std::initializer_list<Framework::Assembly::FPRegister>
- impliedWriteFPRegs,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op1Validator,
- OperandEncoding op1Encoding,
- OperandRW op1RW,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op2Validator,
- OperandEncoding op2Encoding,
- OperandRW op2RW,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op3Validator,
- OperandEncoding op3Encoding,
- OperandRW op3RW,
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- op4Validator,
- OperandEncoding op4Encoding,
- OperandRW op4RW)
- : MachineCodeTableEntry(rexW,
- opcode,
- opcodeLength,
- operandSizeOverride,
- vex,
- vexL,
- vexPP,
- rmReg,
- impliedReadGPRegs,
- impliedWriteGPRegs,
- impliedReadFPRegs,
- impliedWriteFPRegs,
- op1Validator,
- op1Encoding,
- op1RW,
- op2Validator,
- op2Encoding,
- op2RW,
- op3Validator,
- op3Encoding,
- op3RW)
- {
- numArgs = 4;
- this->op4Validator = op4Validator;
- this->op4Encoding = op4Encoding;
- this->op4RW = op4RW;
- }
- MachineCodeTableEntry(const MachineCodeTableEntry& other) = default;
- bool matches(int numArgs,
- const std::vector<Framework::Assembly::OperationArgument*>& args) const
- {
- if (numArgs != this->numArgs)
- {
- return false;
- }
- if (numArgs >= 1 && !op1Validator(*args[0]))
- {
- return false;
- }
- if (numArgs >= 2 && !op2Validator(*args[1]))
- {
- return false;
- }
- if (numArgs >= 3 && !op3Validator(*args[2]))
- {
- return false;
- }
- if (numArgs >= 4 && !op4Validator(*args[3]))
- {
- return false;
- }
- return true;
- }
- OperandRW getOperandRW(int index) const
- {
- switch (index)
- {
- case 0:
- return op1RW;
- case 1:
- return op2RW;
- case 2:
- return op3RW;
- case 3:
- return op4RW;
- default:
- return NONE;
- }
- }
- const std::vector<Framework::Assembly::GPRegister>&
- getImpliedReadGPRegs() const
- {
- return impliedReadGPRegs;
- }
- const std::vector<Framework::Assembly::GPRegister>&
- getImpliedWriteGPRegs() const
- {
- return impliedWriteGPRegs;
- }
- const std::vector<Framework::Assembly::FPRegister>&
- getImpliedReadFPRegs() const
- {
- return impliedReadFPRegs;
- }
- const std::vector<Framework::Assembly::FPRegister>&
- getImpliedWriteFPRegs() const
- {
- return impliedWriteFPRegs;
- }
- friend class OperationCodeTable;
- };
- class OperationCodeTable : public Framework::ReferenceCounter
- {
- public:
- thread_local static Framework::RCArray<OperationCodeTable>
- machineCodeTranslationTable;
- private:
- Framework::Assembly::Operation op;
- std::vector<MachineCodeTableEntry> entries;
- public:
- OperationCodeTable(Framework::Assembly::Operation op,
- std::initializer_list<MachineCodeTableEntry> entries)
- : ReferenceCounter(),
- op(op),
- entries(entries)
- {}
- virtual MachineCodeInstruction getInstruction(
- const std::vector<Framework::Assembly::OperationArgument*>& args,
- const Framework::Assembly::AssemblyBlock* codeBlock,
- const Framework::Assembly::Instruction* current,
- Framework::Text& err)
- {
- MachineCodeInstruction result;
- memset(&result, 0, sizeof(MachineCodeInstruction));
- const MachineCodeTableEntry* entry
- = getEntry(args, codeBlock, current, err);
- if (!entry)
- {
- return result;
- }
- result.needsVex = entry->vex;
- result.vexL = entry->vexL;
- result.vexPP = entry->vexPP;
- result.needsRex = entry->rexW;
- result.exWE = entry->rexW;
- result.modRM = entry->rmReg << 3;
- if (entry->rmReg)
- {
- result.needsModRM = true;
- }
- memcpy(result.opcode, entry->opcode, 3);
- result.opcodeLength = entry->opcodeLength;
- result.operandSizeOverride = entry->operandSizeOverride;
- for (int i = 0; i < args.size(); i++)
- {
- OperandEncoding encoding = UNDEFINED;
- switch (i)
- {
- case 0:
- encoding = entry->op1Encoding;
- break;
- case 1:
- encoding = entry->op2Encoding;
- break;
- case 2:
- encoding = entry->op3Encoding;
- break;
- case 3:
- encoding = entry->op4Encoding;
- break;
- }
- switch (encoding)
- {
- case MODRM_REG:
- encodeModRM_REG(result, args[i], i + 1, err);
- break;
- case MODRM_RM:
- encodeModRM_RM(result, args[i], i + 1, err);
- break;
- case VEX_VVVV:
- encodeVex_VVVV(result, args[i], i + 1, err);
- break;
- case OPCODE_RD:
- encodeOpcode_RD(result, args[i], i + 1, err);
- break;
- case IMM8:
- encodeIMM8(result, args[i], i + 1, err);
- break;
- case IMM16:
- encodeIMM16(result, args[i], i + 1, err);
- break;
- case IMM32:
- encodeIMM32(result, args[i], i + 1, err);
- break;
- case IMM64:
- encodeIMM64(result, args[i], i + 1, err);
- break;
- }
- }
- if (result.errIfNoRex && !result.needsRex)
- {
- err.append() << "Instruction " << op
- << " has no REX prefix and can not address "
- "LOWER8 of registers RSP, RBP, RSI or RDI\n";
- }
- if (result.errIfRex && result.needsRex)
- {
- err.append() << "Instruction " << op
- << " has a REX prefix and can not address "
- "HIGHER8 of registers RAX, RBX, RCX or RDX\n";
- }
- return result;
- }
- MachineCodeTableEntry* getEntry(
- const std::vector<Framework::Assembly::OperationArgument*>& args,
- const Framework::Assembly::AssemblyBlock* codeBlock,
- const Framework::Assembly::Instruction* current,
- Framework::Text& err)
- {
- MachineCodeInstruction result;
- memset(&result, 0, sizeof(MachineCodeInstruction));
- for (MachineCodeTableEntry& entry : entries)
- {
- if (entry.matches((int)args.size(), args))
- {
- return &entry;
- }
- }
- err.append() << "operation " << (int)op
- << " not found in translation table. args: \n";
- for (auto arg : args)
- {
- err.append() << " " << typeid(*arg).name() << "\n";
- }
- return 0;
- }
- Framework::Assembly::Operation getOperation() const
- {
- return op;
- }
- void encodeModRM_REG(MachineCodeInstruction& result,
- const Framework::Assembly::OperationArgument* arg,
- int index,
- Framework::Text& err) const
- {
- result.needsModRM = true;
- const Framework::Assembly::GPRegisterArgument* gpRegArg
- = arg->asGPRegisterArgument();
- const Framework::Assembly::FPRegisterArgument* fpRegArg
- = arg->asFPRegisterArgument();
- if (gpRegArg)
- {
- encodeModRM_REG_GP(result, gpRegArg, index, err);
- }
- else if (fpRegArg)
- {
- encodeModRM_REG_FP(result, fpRegArg, index, err);
- }
- else
- {
- err.append()
- << "Invalid argument type for operand " << index
- << " for operation " << op << " encoded as MODRM_REG: found "
- << typeid(*arg).name()
- << " but expected GPRegisterArgument or FPRegisterArgument\n";
- }
- }
- void encodeModRM_REG_GP(MachineCodeInstruction& result,
- const Framework::Assembly::GPRegisterArgument* arg,
- int index,
- Framework::Text& err) const
- {
- Framework::Assembly::GPRegister reg = arg->getRegister();
- if (reg >= Framework::Assembly::R8)
- {
- result.needsRex = true;
- result.exR = 1;
- }
- if (arg->getPart() == Framework::Assembly::GPRegisterPart::HIGHER8)
- {
- if (reg == Framework::Assembly::RAX)
- {
- result.modRM |= 0b100000;
- result.errIfRex = true;
- }
- else if (reg == Framework::Assembly::RBX)
- {
- result.modRM |= 0b111000;
- result.errIfRex = true;
- }
- else if (reg == Framework::Assembly::RCX)
- {
- result.modRM |= 0b101000;
- result.errIfRex = true;
- }
- else if (reg == Framework::Assembly::RDX)
- {
- result.modRM |= 0b110000;
- result.errIfRex = true;
- }
- else
- {
- err.append() << "Invalid argument for operand " << index
- << " for operation " << op
- << " HIGHER8 can only be used for registers RAX, "
- "RBX, RCX or RDX\n";
- }
- }
- else
- {
- result.modRM |= (reg & 0b111) << 3;
- }
- if (arg->getPart() == Framework::Assembly::GPRegisterPart::LOWER8
- && (reg == Framework::Assembly::RSP
- || reg == Framework::Assembly::RBP
- || reg == Framework::Assembly::RSI
- || reg == Framework::Assembly::RDI))
- {
- result.errIfNoRex = true;
- }
- }
- void encodeModRM_REG_FP(MachineCodeInstruction& result,
- const Framework::Assembly::FPRegisterArgument* arg,
- int index,
- Framework::Text& err) const
- {
- Framework::Assembly::FPRegister reg = arg->getRegister();
- if (reg >= Framework::Assembly::MM8)
- {
- result.needsRex = true;
- result.exR = 1;
- }
- result.modRM |= (reg & 0b111) << 3;
- }
- void encodeModRM_RM(MachineCodeInstruction& result,
- const Framework::Assembly::OperationArgument* arg,
- int index,
- Framework::Text& err) const
- {
- result.needsModRM = true;
- const Framework::Assembly::GPRegisterArgument* gpRegArg
- = arg->asGPRegisterArgument();
- const Framework::Assembly::FPRegisterArgument* fpRegArg
- = arg->asFPRegisterArgument();
- const Framework::Assembly::MemoryAccessArgument* memArg
- = arg->asMemoryAccessArgument();
- if (gpRegArg)
- {
- encodeModRM_RM_GP(result, gpRegArg, index, err);
- }
- else if (fpRegArg)
- {
- encodeModRM_RM_FP(result, fpRegArg, index, err);
- }
- else if (memArg)
- {
- encodeModRM_RM_Mem(result, memArg, index, err);
- }
- else
- {
- err.append()
- << "Invalid argument type for operand " << index
- << " for operation " << op << " encoded as MODRM_RM: found "
- << typeid(*arg).name()
- << " but expected GPRegisterArgument, FPRegisterArgument "
- "or MemoryAccessArgument\n";
- }
- }
- void encodeModRM_RM_GP(MachineCodeInstruction& result,
- const Framework::Assembly::GPRegisterArgument* arg,
- int index,
- Framework::Text& err) const
- {
- Framework::Assembly::GPRegister reg = arg->getRegister();
- if (reg >= Framework::Assembly::R8)
- {
- result.needsRex = true;
- result.exB = 1;
- }
- result.modRM |= 0b11 << 6; // direct register access
- if (arg->getPart() == Framework::Assembly::GPRegisterPart::HIGHER8)
- {
- if (reg == Framework::Assembly::RAX)
- {
- result.modRM |= 0b100;
- result.errIfRex = true;
- }
- else if (reg == Framework::Assembly::RBX)
- {
- result.modRM |= 0b111;
- result.errIfRex = true;
- }
- else if (reg == Framework::Assembly::RCX)
- {
- result.modRM |= 0b101;
- result.errIfRex = true;
- }
- else if (reg == Framework::Assembly::RDX)
- {
- result.modRM |= 0b110;
- result.errIfRex = true;
- }
- else
- {
- err.append() << "Invalid argument for operand " << index
- << " for operation " << op
- << " HIGHER8 can only be used for registers RAX, "
- "RBX, RCX or RDX\n";
- }
- }
- else
- {
- result.modRM |= reg & 0b111;
- }
- if (arg->getPart() == Framework::Assembly::GPRegisterPart::LOWER8
- && (reg == Framework::Assembly::RSP
- || reg == Framework::Assembly::RBP
- || reg == Framework::Assembly::RSI
- || reg == Framework::Assembly::RDI))
- {
- result.errIfNoRex = true;
- }
- }
- void encodeModRM_RM_FP(MachineCodeInstruction& result,
- const Framework::Assembly::FPRegisterArgument* arg,
- int index,
- Framework::Text& err) const
- {
- Framework::Assembly::FPRegister reg = arg->getRegister();
- if (reg >= Framework::Assembly::MM8)
- {
- result.needsRex = true;
- result.exB = 1;
- }
- result.modRM |= 0b11 << 6; // direct register access
- result.modRM |= reg & 0b111;
- }
- void encodeModRM_RM_Mem(MachineCodeInstruction& result,
- const Framework::Assembly::MemoryAccessArgument* arg,
- int index,
- Framework::Text& err) const
- {
- if (arg->isUsingAddressRegister() || arg->isUsingOffsetRegister())
- {
- Framework::Assembly::GPRegister reg = arg->isUsingAddressRegister()
- ? arg->getAddressRegister()
- : arg->getOffsetRegister();
- if (arg->isUsingAddressRegister() && arg->isUsingOffsetRegister())
- {
- // SIB needed
- result.sibNeeded = true;
- result.modRM |= 0b100; // indicate SIB
- if (reg >= Framework::Assembly::R8)
- {
- result.needsRex = true;
- result.exB = 1;
- }
- result.sib |= reg & 0b111;
- Framework::Assembly::GPRegister offsetReg
- = arg->getOffsetRegister();
- if (offsetReg == Framework::Assembly::RSP)
- {
- err.append() << "Invalid argument for operand " << index
- << " for operation " << op
- << " RSP can not be used as index register\n";
- }
- if (offsetReg >= Framework::Assembly::R8)
- {
- result.needsRex = true;
- result.exX = 1;
- }
- result.sib |= (offsetReg & 0b111) << 3; // index register
- }
- else if (reg == 0b100)
- {
- // SIB needed
- result.sibNeeded = true;
- result.modRM |= 0b100; // indicate SIB
- result.sib |= reg & 0b111;
- result.sib |= 0b100 << 3; // no index register
- }
- else
- {
- if (reg >= Framework::Assembly::R8)
- {
- result.needsRex = true;
- result.exB = 1;
- }
- result.modRM |= reg & 0b111;
- }
- int offset = arg->getOffset();
- if (offset)
- {
- if (offset <= 127 && offset >= -128)
- {
- result.modRM |= 0b01 << 6; // 8 bit displacement
- result.disp[0] = (char)offset;
- result.dispLength = 1;
- }
- else
- {
- result.modRM |= 0b10 << 6; // 32 bit displacement
- memcpy(result.disp, &offset, 4);
- }
- }
- else
- {
- if ((result.modRM & 0b111) == 0b101)
- {
- // special case: EBP or R13 as
- // address register needs disp8=0
- result.modRM |= 0b01 << 6; // 8 bit displacement
- result.disp[0] = 0;
- result.dispLength = 1;
- }
- }
- }
- else
- {
- result.modRM |= 0b100;
- result.sibNeeded = true;
- result.sib = 0b00100101; // no base, no index only
- // disp32
- int offset = arg->getOffset();
- memcpy(result.disp, &offset, 4);
- result.dispLength = 4;
- }
- }
- void encodeVex_VVVV(MachineCodeInstruction& result,
- const Framework::Assembly::OperationArgument* arg,
- int index,
- Framework::Text& err) const
- {
- const Framework::Assembly::FPRegisterArgument* fpRegArg
- = arg->asFPRegisterArgument();
- if (fpRegArg)
- {
- encodeVex_VVVV_FP(result, fpRegArg, index, err);
- }
- else
- {
- err.append() << "Invalid argument type for operand " << index
- << " for operation " << op
- << " encoded as VEX_VVVV: found "
- << typeid(*arg).name()
- << " but expected FPRegisterArgument\n";
- }
- }
- void encodeVex_VVVV_FP(MachineCodeInstruction& result,
- const Framework::Assembly::FPRegisterArgument* arg,
- int index,
- Framework::Text& err) const
- {
- Framework::Assembly::FPRegister reg = arg->getRegister();
- result.vexVVVV = reg & 0b1111;
- result.needsVex = true;
- }
- void encodeOpcode_RD(MachineCodeInstruction& result,
- const Framework::Assembly::OperationArgument* arg,
- int index,
- Framework::Text& err) const
- {
- const Framework::Assembly::GPRegisterArgument* gpRegArg
- = arg->asGPRegisterArgument();
- if (gpRegArg)
- {
- encodeOpcode_RD_GP(result, gpRegArg, index, err);
- }
- else
- {
- err.append() << "Invalid argument type for operand " << index
- << " for operation " << op
- << " encoded as OPCODE_RD: found "
- << typeid(*arg).name()
- << " but expected GPRegisterArgument\n";
- }
- }
- void encodeOpcode_RD_GP(MachineCodeInstruction& result,
- const Framework::Assembly::GPRegisterArgument* arg,
- int index,
- Framework::Text& err) const
- {
- Framework::Assembly::GPRegister reg = arg->getRegister();
- if (reg >= Framework::Assembly::R8)
- {
- result.needsRex = true;
- result.exB = 1;
- }
- result.opcode[result.opcodeLength - 1] |= reg & 0b111;
- }
- void encodeIMM8(MachineCodeInstruction& result,
- Framework::Assembly::OperationArgument* arg,
- int index,
- Framework::Text& err) const
- {
- if (result.immLength >= 8)
- {
- err.append() << "Invalid argument type for operand " << index
- << " for operation " << op
- << " encoded as IMM8: imm bytes are already in use\n";
- return;
- }
- const Framework::Assembly::ConstantArgument* constArg
- = arg->asConstantArgument();
- if (constArg == 0)
- {
- err.append() << "Invalid argument type for operand " << index
- << " for operation " << op
- << " encoded as IMM8: found " << typeid(*arg).name()
- << " but expected ConstantArgument\n";
- return;
- }
- int value = (int)constArg->getValue();
- int len = (int)constArg->getSize();
- if (len > 1)
- {
- err.append() << "Constant size too large for operand " << index
- << " for operation " << op
- << " encoded as IMM8: found size " << len
- << " but expected size BYTE\n";
- return;
- }
- result.imm[(int)result.immLength] = (char)(value);
- result.immLength += 1;
- }
- void encodeIMM16(MachineCodeInstruction& result,
- Framework::Assembly::OperationArgument* arg,
- int index,
- Framework::Text& err) const
- {
- if (result.immLength >= 7)
- {
- err.append() << "Invalid argument type for operand " << index
- << " for operation " << op
- << " encoded as IMM16: imm bytes are already in use\n";
- return;
- }
- const Framework::Assembly::ConstantArgument* constArg
- = arg->asConstantArgument();
- if (constArg == 0)
- {
- err.append() << "Invalid argument type for operand " << index
- << " for operation " << op
- << " encoded as IMM16: found " << typeid(*arg).name()
- << " but expected ConstantArgument\n";
- return;
- }
- int value = (int)constArg->getValue();
- int len = (int)constArg->getSize();
- if (len > 2)
- {
- err.append() << "Constant size too large for operand " << index
- << " for operation " << op
- << " encoded as IMM16: found size " << len
- << " but expected size range [BYTE, WORD]\n";
- return;
- }
- short val = (short)(value);
- memcpy(result.imm + result.immLength, &val, 2);
- result.immLength += 2;
- }
- void encodeIMM32(MachineCodeInstruction& result,
- Framework::Assembly::OperationArgument* arg,
- int index,
- Framework::Text& err) const
- {
- if (result.immLength >= 5)
- {
- err.append() << "Invalid argument type for operand " << index
- << " for operation " << op
- << " encoded as IMM32: imm bytes are already in use\n";
- return;
- }
- const Framework::Assembly::ConstantArgument* constArg
- = arg->asConstantArgument();
- if (constArg == 0)
- {
- err.append() << "Invalid argument type for operand " << index
- << " for operation " << op
- << " encoded as IMM32: found " << typeid(*arg).name()
- << " but expected ConstantArgument\n";
- return;
- }
- int value = (int)constArg->getValue();
- int len = (int)constArg->getSize();
- if (len > 4)
- {
- err.append() << "Constant size too large for operand " << index
- << " for operation " << op
- << " encoded as IMM32: found size " << len
- << " but expected size range [BYTE, DWORD]\n";
- return;
- }
- memcpy(result.imm + result.immLength, &value, 4);
- result.immLength += 4;
- }
- void encodeIMM64(MachineCodeInstruction& result,
- Framework::Assembly::OperationArgument* arg,
- int index,
- Framework::Text& err) const
- {
- if (result.immLength >= 1)
- {
- err.append() << "Invalid argument type for operand " << index
- << " for operation " << op
- << " encoded as IMM64: imm bytes are already in use\n";
- return;
- }
- const Framework::Assembly::ConstantArgument* constArg
- = arg->asConstantArgument();
- if (constArg == 0)
- {
- err.append() << "Invalid argument type for operand " << index
- << " for operation " << op
- << " encoded as IMM64: found " << typeid(*arg).name()
- << " but expected ConstantArgument\n";
- return;
- }
- __int64 value = constArg->getValue();
- int len = (int)constArg->getSize();
- if (len > 8)
- {
- err.append() << "Constant size too large for operand " << index
- << " for operation " << op
- << " encoded as IMM64: found size " << len
- << " but expected size range [BYTE, QWORD]\n";
- return;
- }
- memcpy(result.imm + result.immLength, &value, 8);
- result.immLength += 8;
- }
- };
- class JumpOperationCodeTable : public OperationCodeTable
- {
- private:
- char opCodeLength;
- bool inGetEntry;
- public:
- JumpOperationCodeTable(Framework::Assembly::Operation op,
- char opCodeLength,
- std::initializer_list<MachineCodeTableEntry> entries)
- : OperationCodeTable(op, entries),
- opCodeLength(opCodeLength),
- inGetEntry(0)
- {}
- virtual MachineCodeInstruction getInstruction(
- const std::vector<Framework::Assembly::OperationArgument*>& args,
- const Framework::Assembly::AssemblyBlock* codeBlock,
- const Framework::Assembly::Instruction* current,
- Framework::Text& err) override
- {
- if (inGetEntry)
- {
- // recursion can only happen during size calculation so we just
- // create a dummy const argument for each jump target
- std::vector<Framework::Assembly::OperationArgument*> newArgs;
- std::vector<Framework::Assembly::OperationArgument*>
- transformedArgs;
- for (Framework::Assembly::OperationArgument* arg : args)
- {
- if (arg->asJumpTargetArgument())
- {
- Framework::Assembly::ConstantArgument* constArg
- = new Framework::Assembly::ConstantArgument(0);
- transformedArgs.push_back(constArg);
- newArgs.push_back(constArg);
- }
- else
- {
- transformedArgs.push_back(arg);
- }
- }
- MachineCodeInstruction result = OperationCodeTable::getInstruction(
- transformedArgs, codeBlock, current, err);
- for (Framework::Assembly::OperationArgument* arg : newArgs)
- {
- delete arg;
- }
- return result;
- }
- inGetEntry = 1;
- std::vector<Framework::Assembly::OperationArgument*> newArgs;
- std::vector<Framework::Assembly::OperationArgument*> transformedArgs;
- for (Framework::Assembly::OperationArgument* arg : args)
- {
- if (arg->asJumpTargetArgument())
- {
- Framework::Text label = arg->asJumpTargetArgument()->getLabel();
- bool currentFound = false;
- bool labelFound = false;
- bool backwords = false;
- int jumpLength = 0;
- // search for the label
- for (const Framework::Assembly::Instruction* instr :
- codeBlock->getInstructions())
- {
- if (instr == current)
- {
- currentFound = true;
- if (labelFound)
- {
- break;
- }
- continue;
- }
- if (instr->definesLabel(label))
- {
- labelFound = true;
- if (currentFound)
- {
- break;
- }
- else
- {
- backwords = true;
- }
- continue;
- }
- if (labelFound || currentFound)
- {
- jumpLength += instr->compiledSize(codeBlock);
- }
- }
- if (backwords)
- {
- jumpLength = -jumpLength - 4 - opCodeLength;
- }
- Framework::Assembly::ConstantArgument* constArg
- = new Framework::Assembly::ConstantArgument(jumpLength);
- transformedArgs.push_back(constArg);
- newArgs.push_back(constArg);
- }
- else
- {
- transformedArgs.push_back(arg);
- }
- }
- MachineCodeInstruction result = OperationCodeTable::getInstruction(
- transformedArgs, codeBlock, current, err);
- for (Framework::Assembly::OperationArgument* arg : newArgs)
- {
- delete arg;
- }
- inGetEntry = 0;
- return result;
- }
- };
- thread_local Framework::RCArray<OperationCodeTable>
- OperationCodeTable::machineCodeTranslationTable;
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- isGPRegister(Framework::Assembly::MemoryBlockSize size)
- {
- return [size](const Framework::Assembly::OperationArgument& arg) {
- return arg.asGPRegisterArgument() != 0
- && ((size == Framework::Assembly::MemoryBlockSize::BYTE
- && (arg.asGPRegisterArgument()->getPart()
- == Framework::Assembly::LOWER8
- || arg.asGPRegisterArgument()->getPart()
- == Framework::Assembly::HIGHER8))
- || (size == Framework::Assembly::MemoryBlockSize::WORD
- && arg.asGPRegisterArgument()->getPart()
- == Framework::Assembly::LOWER16)
- || (size == Framework::Assembly::MemoryBlockSize::DWORD
- && arg.asGPRegisterArgument()->getPart()
- == Framework::Assembly::LOWER32)
- || (size == Framework::Assembly::MemoryBlockSize::QWORD
- && arg.asGPRegisterArgument()->getPart()
- == Framework::Assembly::FULL64));
- };
- }
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- isSpecificGPRegister(Framework::Assembly::GPRegister reg,
- Framework::Assembly::GPRegisterPart part)
- {
- return [reg, part](const Framework::Assembly::OperationArgument& arg) {
- return arg.asGPRegisterArgument() != 0
- && arg.asGPRegisterArgument()->getRegister() == reg
- && arg.asGPRegisterArgument()->getPart() == part;
- };
- }
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- isGPRegisterOrMemoryAccess(Framework::Assembly::MemoryBlockSize size)
- {
- return [size](const Framework::Assembly::OperationArgument& arg) {
- return isGPRegister(size)(arg)
- || arg.asMemoryAccessArgument()
- && arg.asMemoryAccessArgument()->getBlockSize() == size;
- };
- }
- std::function<bool(const Framework::Assembly::OperationArgument& arg)> isIMM()
- {
- return [](const Framework::Assembly::OperationArgument& arg) {
- return arg.asConstantArgument();
- };
- }
- std::function<bool(const Framework::Assembly::OperationArgument& arg)> isIMM(
- Framework::Assembly::MemoryBlockSize maxSize)
- {
- return [maxSize](const Framework::Assembly::OperationArgument& arg) {
- return arg.asConstantArgument()
- && arg.asConstantArgument()->getSize() <= maxSize;
- };
- }
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- isFPRegister(Framework::Assembly::MemoryBlockSize size)
- {
- return [size](const Framework::Assembly::OperationArgument& arg) {
- return arg.asFPRegisterArgument() != 0
- && ((size == Framework::Assembly::MemoryBlockSize::M128
- && arg.asFPRegisterArgument()->getPart()
- == Framework::Assembly::X)
- || (size == Framework::Assembly::MemoryBlockSize::M256
- && arg.asFPRegisterArgument()->getPart()
- == Framework::Assembly::Y)
- /*
- || (size == Framework::Assembly::MemoryBlockSize::M512
- && arg.asFPRegisterArgument()->getPart()
- == Framework::Assembly::Z)*/);
- };
- }
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- isFPRegisterOrMEmoryAccess(Framework::Assembly::MemoryBlockSize size)
- {
- return [size](const Framework::Assembly::OperationArgument& arg) {
- return isFPRegister(size)
- || (arg.asMemoryAccessArgument()
- && arg.asMemoryAccessArgument()->getBlockSize() == size);
- };
- }
- std::function<bool(const Framework::Assembly::OperationArgument& arg)>
- isFPRegisterOrMEmoryAccess(Framework::Assembly::MemoryBlockSize regSize,
- Framework::Assembly::MemoryBlockSize memSize)
- {
- return
- [regSize, memSize](const Framework::Assembly::OperationArgument& arg) {
- return isFPRegister(regSize)
- || (arg.asMemoryAccessArgument()
- && arg.asMemoryAccessArgument()->getBlockSize() == memSize);
- };
- }
- void __intializeMachineCodeTranslationTable()
- {
- if (!OperationCodeTable::machineCodeTranslationTable.getEntryCount())
- {
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::ADD,
- {// ADD AL, IMM8
- MachineCodeTableEntry(false,
- 0x04,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER8),
- UNDEFINED,
- READWRITE,
- isIMM(),
- IMM8,
- READ),
- // ADD AX, IMM16
- MachineCodeTableEntry(false,
- 0x05,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER16),
- UNDEFINED,
- READWRITE,
- isIMM(),
- IMM16,
- READ),
- // ADD EAX, IMM32
- MachineCodeTableEntry(
- false,
- 0x05,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER32),
- UNDEFINED,
- READWRITE,
- [](const Framework::Assembly::OperationArgument& arg) {
- return arg.asConstantArgument() != 0;
- },
- IMM32,
- READ),
- // ADD RAX, IMM32
- MachineCodeTableEntry(true,
- 0x05,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::FULL64),
- UNDEFINED,
- READWRITE,
- isIMM(),
- IMM32,
- READ),
- // ADD r/m8, IMM8
- MachineCodeTableEntry(false,
- 0x80,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE,
- isIMM(),
- IMM8,
- READ),
- // ADD r/m16, IMM8
- MachineCodeTableEntry(false,
- 0x83,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // ADD r/m32, IMM8
- MachineCodeTableEntry(false,
- 0x83,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // ADD r/m64, IMM8
- MachineCodeTableEntry(true,
- 0x83,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // ADD r/m16, IMM16
- MachineCodeTableEntry(
- false,
- 0x81,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- [](const Framework::Assembly::OperationArgument& arg) {
- return arg.asConstantArgument()
- && arg.asConstantArgument()->getSize()
- != Framework::Assembly::MemoryBlockSize::
- BYTE;
- },
- IMM16,
- READ),
- // ADD r/m32, IMM32
- MachineCodeTableEntry(
- false,
- 0x81,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- [](const Framework::Assembly::OperationArgument& arg) {
- return arg.asConstantArgument() != 0
- && arg.asConstantArgument()->getSize()
- != Framework::Assembly::MemoryBlockSize::
- BYTE;
- },
- IMM32,
- READ),
- // ADD r/m64, IMM32
- MachineCodeTableEntry(
- true,
- 0x81,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- [](const Framework::Assembly::OperationArgument& arg) {
- return arg.asConstantArgument() != 0
- && arg.asConstantArgument()->getSize()
- != Framework::Assembly::MemoryBlockSize::
- BYTE;
- },
- IMM32,
- READ),
- // ADD r/m8, r8
- MachineCodeTableEntry(false,
- 0x00,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READ),
- // ADD r/m16, r16
- MachineCodeTableEntry(false,
- 0x01,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READ),
- // ADD r/m32, r32
- MachineCodeTableEntry(false,
- 0x01,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READ),
- // ADD r/m64, r64
- MachineCodeTableEntry(true,
- 0x01,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READ),
- // ADD r8, r/m8
- MachineCodeTableEntry(false,
- 0x02,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ),
- // ADD r16, r/m16
- MachineCodeTableEntry(false,
- 0x03,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // ADD r32, r/m32
- MachineCodeTableEntry(false,
- 0x03,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // ADD r64, r/m64
- MachineCodeTableEntry(true,
- 0x03,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::ADDPD,
- {// ADDPD xmm1, xmm2/m128
- MachineCodeTableEntry(false,
- 0x580F,
- (char)2,
- X66,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VADDPD xmm1,xmm2, xmm3/m128
- MachineCodeTableEntry(false,
- 0x580F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b01,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VADDPD ymm1,ymm2, ymm3/m256
- MachineCodeTableEntry(false,
- 0x580F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0b01,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::ADDPS,
- {// ADDPS xmm1, xmm2/m128
- MachineCodeTableEntry(false,
- 0x580F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VADDPS xmm1,xmm2, xmm3/m128
- MachineCodeTableEntry(false,
- 0x580F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VADDPS ymm1, ymm2, ymm3/m256
- MachineCodeTableEntry(false,
- 0x580F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::ADDSD,
- {// ADDSD xmm1, xmm2/m64
- MachineCodeTableEntry(false,
- 0x580F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- // VADDPS VADDSD xmm1, xmm2, xmm3/m64
- MachineCodeTableEntry(false,
- 0x580F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b11,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::ADDSS,
- {// ADDPS xmm1, xmm2/m32
- MachineCodeTableEntry(false,
- 0x580F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // VADDPS VADDSD xmm1, xmm2, xmm3/m64
- MachineCodeTableEntry(false,
- 0x580F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b10,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::SUB,
- {
- // SUB AL, imm8
- MachineCodeTableEntry(false,
- 0x2C,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER8),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // SUB AX, imm16
- MachineCodeTableEntry(false,
- 0x2D,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER16),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // SUB EAX, imm32
- MachineCodeTableEntry(false,
- 0x2D,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER32),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // SUB RAX, imm32
- MachineCodeTableEntry(true,
- 0x2D,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::FULL64),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // SUB r/m8, imm8
- MachineCodeTableEntry(false,
- 0x80,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b101,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // SUB r/m16, imm8
- MachineCodeTableEntry(false,
- 0x83,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b101,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // SUB r/m32, imm8
- MachineCodeTableEntry(false,
- 0x83,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b101,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // SUB r/m64, imm8
- MachineCodeTableEntry(true,
- 0x83,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b101,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // SUB r/m16, imm16
- MachineCodeTableEntry(false,
- 0x81,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b101,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // SUB r/m32, imm32
- MachineCodeTableEntry(false,
- 0x81,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b101,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // SUB r/m64, imm32
- MachineCodeTableEntry(true,
- 0x81,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b101,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // SUB r/m8, r8
- MachineCodeTableEntry(false,
- 0x28,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READ),
- // SUB r/m16, r16
- MachineCodeTableEntry(false,
- 0x29,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READ),
- // SUB r/m32, r32
- MachineCodeTableEntry(false,
- 0x29,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READ),
- // SUB r/m64, r64
- MachineCodeTableEntry(true,
- 0x29,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READ),
- // SUB r8, r/m8
- MachineCodeTableEntry(false,
- 0x2A,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ),
- // SUB r16, r/m16
- MachineCodeTableEntry(false,
- 0x2B,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // SUB r32, r/m32
- MachineCodeTableEntry(false,
- 0x2B,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // SUB SUB r64, r/m64
- MachineCodeTableEntry(true,
- 0x2B,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::SUBPD,
- {
- // SUBPD xmm1, xmm2/m128
- MachineCodeTableEntry(false,
- 0x5D0F,
- (char)2,
- X66,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VSUBPD xmm1,xmm2, xmm3/m128
- MachineCodeTableEntry(false,
- 0x5C0F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b01,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VSUBPD ymm1, ymm2, ymm3/m256
- MachineCodeTableEntry(false,
- 0x5C0F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0b01,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::SUBPS,
- {
- // SUBPS xmm1, xmm2/m128
- MachineCodeTableEntry(false,
- 0x5D0F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VSUBPS xmm1,xmm2, xmm3/m128
- MachineCodeTableEntry(false,
- 0x5C0F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b00,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VSUBPS ymm1, ymm2, ymm3/m256
- MachineCodeTableEntry(false,
- 0x5C0F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0b00,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::SUBSD,
- {
- // SUBSD xmm1, xmm2/m64
- MachineCodeTableEntry(false,
- 0x5C0F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- // VSUBSD xmm1,xmm2, xmm3/m64
- MachineCodeTableEntry(false,
- 0x5C0F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b11,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::SUBSS,
- {
- // SUBSS xmm1, xmm2/m32
- MachineCodeTableEntry(false,
- 0x5C0F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // VSUBSD xmm1,xmm2, xmm3/m32
- MachineCodeTableEntry(false,
- 0x5C0F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b10,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::MUL,
- {
- // MUL r/m8
- MachineCodeTableEntry(false,
- 0xF6,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b100,
- {Framework::Assembly::RAX},
- {Framework::Assembly::RAX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ),
- // MUL r/m16
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b100,
- {Framework::Assembly::RAX},
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // MUL r/m32
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b100,
- {Framework::Assembly::RAX},
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // MUL r/m64
- MachineCodeTableEntry(true,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b100,
- {Framework::Assembly::RAX},
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::IMUL,
- {
- // IMUL r/m8
- MachineCodeTableEntry(false,
- 0xF6,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b101,
- {Framework::Assembly::RAX},
- {Framework::Assembly::RAX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ),
- // IMUL r/m16
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b101,
- {Framework::Assembly::RAX},
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // IMUL r/m32
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b101,
- {Framework::Assembly::RAX},
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // IMUL r/m64
- MachineCodeTableEntry(true,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b101,
- {Framework::Assembly::RAX},
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- // IMUL r16, r/m16
- MachineCodeTableEntry(false,
- 0xAF0F,
- (char)2,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // IMUL r32, r/m32
- MachineCodeTableEntry(false,
- 0xAF0F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // IMUL r64, r/m64
- MachineCodeTableEntry(true,
- 0xAF0F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- // IMUL r16, r/m16, imm8
- MachineCodeTableEntry(false,
- 0x6B,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- WRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // IMUL r32, r/m32, imm8
- MachineCodeTableEntry(false,
- 0x6B,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // IMUL r64, r/m64, imm8
- MachineCodeTableEntry(true,
- 0x6B,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // IMUL r16, r/m16, imm16
- MachineCodeTableEntry(false,
- 0x69,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- WRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // IMUL r32, r/m32, imm32
- MachineCodeTableEntry(false,
- 0x69,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // IMUL r64, r/m64
- MachineCodeTableEntry(true,
- 0x69,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::MULPD,
- {
- // MULPD xmm1, xmm2/m128
- MachineCodeTableEntry(false,
- 0x590F,
- (char)2,
- X66,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VMULPD xmm1,xmm2, xmm3/m128
- MachineCodeTableEntry(false,
- 0x590F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b01,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VMULPD ymm1, ymm2, ymm3/m256
- MachineCodeTableEntry(false,
- 0x590F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0b01,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::MULPS,
- {
- // MULPS xmm1, xmm2/m128
- MachineCodeTableEntry(false,
- 0x590F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VMULPS xmm1,xmm2, xmm3/m128
- MachineCodeTableEntry(false,
- 0x590F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VMULPS ymm1, ymm2, ymm3/m256
- MachineCodeTableEntry(false,
- 0x590F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::MULSD,
- {
- // MULSD xmm1,xmm2/m64
- MachineCodeTableEntry(false,
- 0x590F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VMULSD xmm1,xmm2, xmm3/m128
- MachineCodeTableEntry(false,
- 0x590F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b11,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::MULSS,
- {
- // MULSS xmm1,xmm2/m64
- MachineCodeTableEntry(false,
- 0x590F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VMULSS xmm1,xmm2, xmm3/m128
- MachineCodeTableEntry(false,
- 0x590F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b10,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::DIV,
- {
- // DIV r/m8
- MachineCodeTableEntry(false,
- 0xF6,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b110,
- {Framework::Assembly::RAX},
- {Framework::Assembly::RAX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ),
- // DIV r/m16
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b110,
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // DIV r/m32
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b110,
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // DIV r/m64
- MachineCodeTableEntry(true,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b110,
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::IDIV,
- {
- // IDIV r/m8
- MachineCodeTableEntry(false,
- 0xF6,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b111,
- {Framework::Assembly::RAX},
- {Framework::Assembly::RAX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ),
- // IDIV r/m16
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b111,
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // IDIV r/m32
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b111,
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // IDIV r/m64
- MachineCodeTableEntry(true,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b111,
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {Framework::Assembly::RAX, Framework::Assembly::RDX},
- {},
- {},
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::DIVPD,
- {
- // DIVPD xmm1, xmm2/m128
- MachineCodeTableEntry(false,
- 0x5E0F,
- (char)2,
- X66,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VDIVPD xmm1,xmm2, xmm3/m128
- MachineCodeTableEntry(false,
- 0x5E0F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b01,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VDIVPD ymm1, ymm2, ymm3/m256
- MachineCodeTableEntry(false,
- 0x5E0F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0b01,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::DIVPS,
- {
- // DIVPS xmm1, xmm2/m128
- MachineCodeTableEntry(false,
- 0x5E0F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VDIVPS xmm1,xmm2, xmm3/m128
- MachineCodeTableEntry(false,
- 0x5E0F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VDIVPS ymm1, ymm2, ymm3/m256
- MachineCodeTableEntry(false,
- 0x5E0F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::DIVSD,
- {
- // DIVSD xmm1, xmm2/m128
- MachineCodeTableEntry(false,
- 0x5E0F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VDIVSD xmm1,xmm2, xmm3/m128
- MachineCodeTableEntry(false,
- 0x5E0F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b11,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::DIVSS,
- {
- // DIVSS xmm1, xmm2/m128
- MachineCodeTableEntry(false,
- 0x5E0F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // VDIVSS xmm1,xmm2, xmm3/m128
- MachineCodeTableEntry(false,
- 0x5E0F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b10,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::NEG,
- {
- // NEG r/m8
- MachineCodeTableEntry(false,
- 0xF6,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b011,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE),
- // NEG r/m16
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b011,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE),
- // NEG r/m32
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b011,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE),
- // NEG r/m64
- MachineCodeTableEntry(true,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b011,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::INC,
- {
- // INC r/m8
- MachineCodeTableEntry(false,
- 0xFE,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE),
- // INC r/m16
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE),
- // INC r/m32
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE),
- // INC r/m64
- MachineCodeTableEntry(true,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::AND,
- {
- // AND AL, imm8
- MachineCodeTableEntry(false,
- 0x24,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER8),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // AND AX, imm16
- MachineCodeTableEntry(false,
- 0x25,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER16),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // AND EAX, imm32
- MachineCodeTableEntry(false,
- 0x25,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER32),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // AND RAX, imm32
- MachineCodeTableEntry(true,
- 0x25,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::FULL64),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // AND r/m8, imm8
- MachineCodeTableEntry(false,
- 0x80,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b100,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // AND r/m16, imm8
- MachineCodeTableEntry(false,
- 0x83,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b100,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // AND r/m32, imm8
- MachineCodeTableEntry(false,
- 0x83,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b100,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // AND r/m64, imm8
- MachineCodeTableEntry(true,
- 0x83,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b100,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // AND r/m16, imm16
- MachineCodeTableEntry(false,
- 0x81,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b100,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // AND r/m32, imm32
- MachineCodeTableEntry(false,
- 0x81,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b100,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // AND r/m64, imm32
- MachineCodeTableEntry(true,
- 0x81,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b100,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // AND r/m8, r8
- MachineCodeTableEntry(false,
- 0x20,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READ),
- // AND r/m16, r16
- MachineCodeTableEntry(false,
- 0x21,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READ),
- // AND r/m32, r32
- MachineCodeTableEntry(false,
- 0x21,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READ),
- // AND r/m64, r64
- MachineCodeTableEntry(true,
- 0x21,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READ),
- // AND r8, r/m8
- MachineCodeTableEntry(false,
- 0x22,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ),
- // AND r16, r/m16
- MachineCodeTableEntry(false,
- 0x23,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // AND r32, r/m32
- MachineCodeTableEntry(false,
- 0x23,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // AND r64, r/m64
- MachineCodeTableEntry(true,
- 0x23,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::OR,
- {
- // OR AL, imm8
- MachineCodeTableEntry(false,
- 0x0C,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER8),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // OR AX, imm16
- MachineCodeTableEntry(false,
- 0x0D,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER16),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // OR EAX, imm32
- MachineCodeTableEntry(false,
- 0x0D,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER32),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // OR RAX, imm32
- MachineCodeTableEntry(true,
- 0x0D,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::FULL64),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // OR r/m8, imm8
- MachineCodeTableEntry(false,
- 0x80,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b001,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // OR r/m16, imm8
- MachineCodeTableEntry(false,
- 0x83,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b001,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // OR r/m32, imm8
- MachineCodeTableEntry(false,
- 0x83,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b001,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // OR r/m64, imm8
- MachineCodeTableEntry(true,
- 0x83,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b001,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // OR r/m16, imm16
- MachineCodeTableEntry(false,
- 0x81,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b001,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // OR r/m32, imm32
- MachineCodeTableEntry(false,
- 0x81,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b001,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // OR r/m64, imm32
- MachineCodeTableEntry(true,
- 0x81,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b001,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // OR r/m8, r8
- MachineCodeTableEntry(false,
- 0x08,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READ),
- // OR r/m16, r16
- MachineCodeTableEntry(false,
- 0x09,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READ),
- // OR r/m32, r32
- MachineCodeTableEntry(false,
- 0x09,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READ),
- // OR r/m64, r64
- MachineCodeTableEntry(true,
- 0x09,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READ),
- // OR r8, r/m8
- MachineCodeTableEntry(false,
- 0x0A,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ),
- // OR r16, r/m16
- MachineCodeTableEntry(false,
- 0x0B,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // OR r32, r/m32
- MachineCodeTableEntry(false,
- 0x0B,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // OR r64, r/m64
- MachineCodeTableEntry(true,
- 0x0B,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::XOR,
- {
- // XOR AL, imm8
- MachineCodeTableEntry(false,
- 0x34,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER8),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // XOR AX, imm16
- MachineCodeTableEntry(false,
- 0x35,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER16),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // XOR EAX, imm32
- MachineCodeTableEntry(false,
- 0x35,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER32),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // XOR RAX, imm32
- MachineCodeTableEntry(true,
- 0x35,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::FULL64),
- UNDEFINED,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // XOR r/m8, imm8
- MachineCodeTableEntry(false,
- 0x80,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b110,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // XOR r/m16, imm8
- MachineCodeTableEntry(false,
- 0x83,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b110,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // XOR r/m32, imm8
- MachineCodeTableEntry(false,
- 0x83,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b110,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // XOR r/m64, imm8
- MachineCodeTableEntry(true,
- 0x83,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b110,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // XOR r/m16, imm16
- MachineCodeTableEntry(false,
- 0x81,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b110,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // XOR r/m32, imm32
- MachineCodeTableEntry(false,
- 0x81,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b110,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // XOR r/m64, imm32
- MachineCodeTableEntry(true,
- 0x81,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b110,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // XOR r/m8, r8
- MachineCodeTableEntry(false,
- 0x30,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READ),
- // XOR r/m16, r16
- MachineCodeTableEntry(false,
- 0x31,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READ),
- // XOR r/m32, r32
- MachineCodeTableEntry(false,
- 0x31,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READ),
- // XOR r/m64, r64
- MachineCodeTableEntry(true,
- 0x31,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READWRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READ),
- // XOR r8, r/m8
- MachineCodeTableEntry(false,
- 0x32,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ),
- // XOR r16, r/m16
- MachineCodeTableEntry(false,
- 0x33,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // XOR r32, r/m32
- MachineCodeTableEntry(false,
- 0x33,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // XOR r64, r/m64
- MachineCodeTableEntry(true,
- 0x33,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READWRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::NOT,
- {
- // NOT r/m8
- MachineCodeTableEntry(false,
- 0xF6,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b010,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READWRITE),
- // NOT r/m16
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b010,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READWRITE),
- // NOT r/m32
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b010,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE),
- // NOT r/m64
- MachineCodeTableEntry(true,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b010,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READWRITE),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::TEST,
- {
- // TEST AL, imm8
- MachineCodeTableEntry(false,
- 0xA8,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER8),
- UNDEFINED,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // TEST AX, imm16
- MachineCodeTableEntry(false,
- 0xA9,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER16),
- UNDEFINED,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // TEST EAX, imm32
- MachineCodeTableEntry(false,
- 0xA9,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER32),
- UNDEFINED,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // TEST RAX, imm32
- MachineCodeTableEntry(true,
- 0xA9,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::FULL64),
- UNDEFINED,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // TEST r/m8, imm8
- MachineCodeTableEntry(false,
- 0xF6,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // TEST r/m16, imm16
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // TEST r/m32, imm32
- MachineCodeTableEntry(false,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // TEST r/m64, imm32
- MachineCodeTableEntry(true,
- 0xF7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // TEST r/m8, r8
- MachineCodeTableEntry(false,
- 0x84,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READ),
- // TEST r/m16, r16
- MachineCodeTableEntry(false,
- 0x85,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READ),
- // TEST r/m32, r32
- MachineCodeTableEntry(false,
- 0x85,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READ),
- // TEST r/m64, r64
- MachineCodeTableEntry(true,
- 0x85,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::CMP,
- {
- // CMP AL, imm8
- MachineCodeTableEntry(false,
- 0x3C,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER8),
- UNDEFINED,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // CMP AX, imm16
- MachineCodeTableEntry(false,
- 0x3D,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER16),
- UNDEFINED,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // CMP EAX, imm32
- MachineCodeTableEntry(false,
- 0x3D,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::LOWER32),
- UNDEFINED,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // CMP RAX, imm32
- MachineCodeTableEntry(true,
- 0x3D,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isSpecificGPRegister(Framework::Assembly::RAX,
- Framework::Assembly::FULL64),
- UNDEFINED,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // CMP r/m8, imm8
- MachineCodeTableEntry(false,
- 0x80,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b111,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // CMP r/m16, imm8
- MachineCodeTableEntry(false,
- 0x83,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b111,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // CMP r/m32, imm8
- MachineCodeTableEntry(false,
- 0x83,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b111,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // CMP r/m64, imm8
- MachineCodeTableEntry(true,
- 0x83,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b111,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // CMP r/m16, imm16
- MachineCodeTableEntry(false,
- 0x81,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b111,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // CMP r/m32, imm32
- MachineCodeTableEntry(false,
- 0x81,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b111,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // TEST r/m64, imm32
- MachineCodeTableEntry(true,
- 0x81,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b111,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // CMP r/m8, r8
- MachineCodeTableEntry(false,
- 0x38,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b111,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READ),
- // CMP r/m16, r16
- MachineCodeTableEntry(false,
- 0x39,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READ),
- // CMP r/m32, r32
- MachineCodeTableEntry(false,
- 0x39,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READ),
- // CMP r/m64, r64
- MachineCodeTableEntry(true,
- 0x39,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READ),
- // CMP r8, r/m8
- MachineCodeTableEntry(false,
- 0x3A,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READ,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ),
- // CMP r16, r/m16
- MachineCodeTableEntry(false,
- 0x3B,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READ,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // CMP r32, r/m32
- MachineCodeTableEntry(false,
- 0x3B,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READ,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // CMP r64, r/m64
- MachineCodeTableEntry(true,
- 0x3B,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READ,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::CMPPD,
- {
- // CMPPD xmm1, xmm2/m128, imm8
- MachineCodeTableEntry(false,
- 0xC20F,
- (char)2,
- X66,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // VCMPPD xmm1, xmm2, xmm3/m128, imm8
- MachineCodeTableEntry(false,
- 0xC20F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b01,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // VCMPPD ymm1, ymm2, ymm3/m256, imm8
- MachineCodeTableEntry(false,
- 0xC20F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0b01,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::CMPPS,
- {
- // CMPPS xmm1, xmm2/m128, imm8
- MachineCodeTableEntry(false,
- 0xC20F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // VCMPPS xmm1, xmm2, xmm3/m128, imm8
- MachineCodeTableEntry(false,
- 0xC20F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b00,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // VCMPPS ymm1, ymm2, ymm3/m256, imm8
- MachineCodeTableEntry(false,
- 0xC20F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0b00,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::CMPSD,
- {
- // CMPSD xmm1, xmm2/m128, imm8
- MachineCodeTableEntry(false,
- 0xC20F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // VCMPSD xmm1, xmm2, xmm3/m128, imm8
- MachineCodeTableEntry(false,
- 0xC20F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b11,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::CMPSS,
- {
- // CMPSS xmm1, xmm2/m128, imm8
- MachineCodeTableEntry(false,
- 0xC20F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READWRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // VCMPSS xmm1, xmm2, xmm3/m128, imm8
- MachineCodeTableEntry(false,
- 0xC20F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b10,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::COMISD,
- {// COMISD xmm1, xmm2/m64
- MachineCodeTableEntry(false,
- 0x2F0F,
- (char)2,
- X66,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::COMISS,
- {// COMISS xmm1, xmm2/m32
- MachineCodeTableEntry(false,
- 0x2F0F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READ,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::MOV,
- {// MOV r/m8, r8
- MachineCodeTableEntry(false,
- 0x88,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- WRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- READ),
- // MOV r/m16, r16
- MachineCodeTableEntry(false,
- 0x89,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- WRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- READ),
- // MOV r/m32, r32
- MachineCodeTableEntry(false,
- 0x89,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- WRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- READ),
- // MOV r/m64, r64
- MachineCodeTableEntry(true,
- 0x89,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- WRITE,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- READ),
- // MOV r8, r/m8
- MachineCodeTableEntry(false,
- 0x8A,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_REG,
- WRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- READ),
- // MOV r/m16, r16
- MachineCodeTableEntry(false,
- 0x8B,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- WRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // MOV r/m32, r32
- MachineCodeTableEntry(false,
- 0x8B,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- WRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // MOV r/m64, r64
- MachineCodeTableEntry(true,
- 0x8B,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- WRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- // Move imm8 to r8
- MachineCodeTableEntry(false,
- 0xB0,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::BYTE),
- OPCODE_RD,
- WRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // MOV r16, imm16
- MachineCodeTableEntry(false,
- 0xB8,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- OPCODE_RD,
- WRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // MOV r32, imm32
- MachineCodeTableEntry(false,
- 0xB8,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- OPCODE_RD,
- WRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // MOV r64, imm64
- MachineCodeTableEntry(true,
- 0xB8,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- OPCODE_RD,
- WRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::QWORD),
- IMM64,
- READ),
- // MOV r/m8, imm8
- MachineCodeTableEntry(false,
- 0xC6,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::BYTE),
- MODRM_RM,
- WRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // MOV r/m16, imm16
- MachineCodeTableEntry(false,
- 0xC7,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- WRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // MOV r/m32, imm32
- MachineCodeTableEntry(false,
- 0xC7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- WRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // MOV r/m64, imm64
- MachineCodeTableEntry(true,
- 0xC7,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- WRITE,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::MOVUPD,
- {
- // MOVUPD xmm1, xmm2/m128
- MachineCodeTableEntry(false,
- 0x100F,
- (char)2,
- X66,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // MOVUPD xmm2/m128, xmm1
- MachineCodeTableEntry(false,
- 0x110F,
- (char)2,
- X66,
- false,
- false,
- 0,
- 0,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READ),
- // VMOVUPD ymm1, ymm2/m256
- MachineCodeTableEntry(false,
- 0x100F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0b01,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- READ),
- // VMOVUPD ymm2/m256, ymm1
- MachineCodeTableEntry(false,
- 0x110F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0b01,
- 0,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::MOVUPS,
- {
- // MOVUPS xmm1, xmm2/m128
- MachineCodeTableEntry(false,
- 0x100F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- // MOVUPS xmm2/m128, xmm1
- MachineCodeTableEntry(false,
- 0x110F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READ),
- // VMOVUPS ymm1, ymm2/m256
- MachineCodeTableEntry(false,
- 0x100F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0b00,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- READ),
- // VMOVUPS ymm2/m256, ymm1
- MachineCodeTableEntry(false,
- 0x110F,
- (char)2,
- NO_PREFIX,
- true,
- true,
- 0b00,
- 0,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_RM,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M256),
- MODRM_REG,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::MOVSD,
- {
- // MOVSD xmm1, xmm2/m64
- MachineCodeTableEntry(false,
- 0x100F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- // MOVSD xmm2/m128, xmm1
- MachineCodeTableEntry(false,
- 0x110F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READ),
- // VMOVSD VMOVSD xmm1, xmm2, xmm3
- MachineCodeTableEntry(false,
- 0x100F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b11,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::MOVSS,
- {
- // MOVSS xmm1, xmm2/m32
- MachineCodeTableEntry(false,
- 0x100F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // MOVSS xmm2/m128, xmm1
- MachineCodeTableEntry(false,
- 0x110F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- READ),
- // VMOVSS VMOVSD xmm1, xmm2, xmm3
- MachineCodeTableEntry(false,
- 0x100F,
- (char)2,
- NO_PREFIX,
- true,
- false,
- 0b10,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- VEX_VVVV,
- READ,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::LEA,
- {
- // LEA r16,m
- MachineCodeTableEntry(
- false,
- 0x8D,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_REG,
- WRITE,
- [](const Framework::Assembly::OperationArgument& p) {
- return p.asMemoryAccessArgument();
- },
- MODRM_RM,
- READ),
- // LEA r32,m
- MachineCodeTableEntry(
- false,
- 0x8D,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- WRITE,
- [](const Framework::Assembly::OperationArgument& p) {
- return p.asMemoryAccessArgument();
- },
- MODRM_RM,
- READ),
- // LEA r64,m
- MachineCodeTableEntry(
- true,
- 0x8D,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- WRITE,
- [](const Framework::Assembly::OperationArgument& p) {
- return p.asMemoryAccessArgument();
- },
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::CVTSI2SD,
- {
- // CVTSI2SD xmm1, r32/m32
- MachineCodeTableEntry(false,
- 0x2A0F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // CVTSI2SD xmm1, r64/m64
- MachineCodeTableEntry(true,
- 0x2A0F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::CVTTSD2SI,
- {
- // CVTTSD2SI r32, xmm1/m64
- MachineCodeTableEntry(false,
- 0x2C0F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- // CVTTSD2SI r64, xmm1/m64
- MachineCodeTableEntry(true,
- 0x2C0F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::CVTTSS2SI,
- {
- // CVTTSS2SI r32, xmm1/m32
- MachineCodeTableEntry(false,
- 0x2C0F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // CVTTSS2SI r64, xmm1/m32
- MachineCodeTableEntry(true,
- 0x2C0F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::CVTSD2SI,
- {
- // CVTSD2SI r32, xmm1/m64
- MachineCodeTableEntry(false,
- 0x2D0F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- // CVTSD2SI r64, xmm1/m64
- MachineCodeTableEntry(true,
- 0x2D0F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::CVTSS2SI,
- {
- // CVTSS2SI r32, xmm1/m32
- MachineCodeTableEntry(false,
- 0x2D0F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // CVTSS2SI r64, xmm1/m32
- MachineCodeTableEntry(true,
- 0x2D0F,
- (char)2,
- XF3,
- false,
- false,
- 0,
- 0,
- isGPRegister(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_REG,
- WRITE,
- isFPRegisterOrMEmoryAccess(
- Framework::Assembly::MemoryBlockSize::M128,
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::CVTSI2SS,
- {
- // CVTSI2SS xmm1, r32/m32
- MachineCodeTableEntry(false,
- 0x2A0F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::DWORD),
- MODRM_RM,
- READ),
- // CVTSI2SS xmm1, r64/m64
- MachineCodeTableEntry(true,
- 0x2A0F,
- (char)2,
- XF2,
- false,
- false,
- 0,
- 0,
- isFPRegister(
- Framework::Assembly::MemoryBlockSize::M128),
- MODRM_REG,
- WRITE,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JMP,
- 1,
- {// JMP rel32
- MachineCodeTableEntry(false,
- 0xE9,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JZ,
- 2,
- {// JZ rel32
- MachineCodeTableEntry(false,
- 0x840F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JNZ,
- 2,
- {// JNZ rel32
- MachineCodeTableEntry(false,
- 0x850F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JG,
- 2,
- {// JG rel32
- MachineCodeTableEntry(false,
- 0x8F0F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JGE,
- 2,
- {// JGE rel32
- MachineCodeTableEntry(false,
- 0x8D0F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JL,
- 2,
- {// JL rel32
- MachineCodeTableEntry(false,
- 0x8C0F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JLE,
- 2,
- {// JLE rel32
- MachineCodeTableEntry(false,
- 0x8E0F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JA,
- 2,
- {// JA rel32
- MachineCodeTableEntry(false,
- 0x870F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JC,
- 2,
- {// JC rel32
- MachineCodeTableEntry(false,
- 0x820F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JNC,
- 2,
- {// JNC rel32
- MachineCodeTableEntry(false,
- 0x830F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JBE,
- 2,
- {// JBE rel32
- MachineCodeTableEntry(false,
- 0x860F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JO,
- 2,
- {// JO rel32
- MachineCodeTableEntry(false,
- 0x800F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JNO,
- 2,
- {// JNO rel32
- MachineCodeTableEntry(false,
- 0x810F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JP,
- 2,
- {// JP rel32
- MachineCodeTableEntry(false,
- 0x8A0F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JNP,
- 2,
- {// JNP rel32
- MachineCodeTableEntry(false,
- 0x8B0F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JS,
- 2,
- {// JS rel32
- MachineCodeTableEntry(false,
- 0x880F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new JumpOperationCodeTable(Framework::Assembly::JNS,
- 2,
- {// JNS rel32
- MachineCodeTableEntry(false,
- 0x890F,
- (char)2,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::CALL,
- {// CALL rel32
- MachineCodeTableEntry(false,
- 0xE8,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- // CALL r/m64
- MachineCodeTableEntry(false,
- 0xFF,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b010,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::RET,
- {// RET
- MachineCodeTableEntry(
- false, 0xC3, (char)1, NO_PREFIX, false, false, 0, 0)}));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::PUSH,
- {
- // PUSH r/m16
- MachineCodeTableEntry(false,
- 0xFF,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0b110,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // PUSH r/m64
- MachineCodeTableEntry(false,
- 0xFF,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0b110,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- // PUSH imm8
- MachineCodeTableEntry(false,
- 0x6A,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
- IMM8,
- READ),
- // PUSH imm16
- MachineCodeTableEntry(false,
- 0x68,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::WORD),
- IMM16,
- READ),
- // PUSH imm32
- MachineCodeTableEntry(false,
- 0x68,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
- IMM32,
- READ),
- }));
- OperationCodeTable::machineCodeTranslationTable.add(
- new OperationCodeTable(Framework::Assembly::POP,
- {
- // POP r/m16
- MachineCodeTableEntry(false,
- 0x8F,
- (char)1,
- X66,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::WORD),
- MODRM_RM,
- READ),
- // POP r/m64
- MachineCodeTableEntry(false,
- 0x8F,
- (char)1,
- NO_PREFIX,
- false,
- false,
- 0,
- 0,
- isGPRegisterOrMemoryAccess(
- Framework::Assembly::MemoryBlockSize::QWORD),
- MODRM_RM,
- READ),
- }));
- }
- }
- bool Framework::Assembly::OperationArgument::usesRegister(GPRegister reg) const
- {
- return false;
- }
- bool Framework::Assembly::OperationArgument::usesRegister(FPRegister reg) const
- {
- return false;
- }
- void Framework::Assembly::OperationArgument::replaceRegister(
- GPRegister oldReg, GPRegister newReg)
- {}
- void Framework::Assembly::OperationArgument::replaceRegister(
- FPRegister oldReg, FPRegister newReg)
- {}
- void Framework::Assembly::OperationArgument::addJumpLabelPrefix(
- Text labelPrefix)
- {}
- const Framework::Assembly::GPRegisterArgument*
- Framework::Assembly::OperationArgument::asGPRegisterArgument() const
- {
- return dynamic_cast<const GPRegisterArgument*>(this);
- }
- const Framework::Assembly::MemoryAccessArgument*
- Framework::Assembly::OperationArgument::asMemoryAccessArgument() const
- {
- return dynamic_cast<const MemoryAccessArgument*>(this);
- }
- const Framework::Assembly::ConstantArgument*
- Framework::Assembly::OperationArgument::asConstantArgument() const
- {
- return dynamic_cast<const ConstantArgument*>(this);
- }
- const Framework::Assembly::FPRegisterArgument*
- Framework::Assembly::OperationArgument::asFPRegisterArgument() const
- {
- return dynamic_cast<const FPRegisterArgument*>(this);
- }
- const Framework::Assembly::JumpTargetArgument*
- Framework::Assembly::OperationArgument::asJumpTargetArgument() const
- {
- return dynamic_cast<const JumpTargetArgument*>(this);
- }
- Framework::Assembly::GPRegisterArgument::GPRegisterArgument(
- GPRegister reg, GPRegisterPart part)
- : reg(reg),
- part(part)
- {}
- bool Framework::Assembly::GPRegisterArgument::usesRegister(GPRegister reg) const
- {
- return this->reg == reg;
- }
- void Framework::Assembly::GPRegisterArgument::replaceRegister(
- GPRegister oldReg, GPRegister newReg)
- {
- if (reg == oldReg)
- {
- reg = newReg;
- }
- }
- Framework::Assembly::GPRegister
- Framework::Assembly::GPRegisterArgument::getRegister() const
- {
- return reg;
- }
- Framework::Assembly::GPRegisterPart
- Framework::Assembly::GPRegisterArgument::getPart() const
- {
- return part;
- }
- Framework::Assembly::FPRegisterArgument::FPRegisterArgument(
- FPRegister reg, FPRegisterPart part)
- : reg(reg),
- part(part)
- {}
- bool Framework::Assembly::FPRegisterArgument::usesRegister(FPRegister reg) const
- {
- return this->reg == reg;
- }
- void Framework::Assembly::FPRegisterArgument::replaceRegister(
- FPRegister oldReg, FPRegister newReg)
- {
- if (reg == oldReg)
- {
- reg = newReg;
- }
- }
- Framework::Assembly::FPRegister
- Framework::Assembly::FPRegisterArgument::getRegister() const
- {
- return reg;
- }
- Framework::Assembly::FPRegisterPart
- Framework::Assembly::FPRegisterArgument::getPart() const
- {
- return part;
- }
- Framework::Assembly::MemoryAccessArgument::MemoryAccessArgument(
- MemoryBlockSize blockSize,
- GPRegister address,
- bool useAddressReg,
- int offset,
- bool useOffsetReg,
- GPRegister offsetReg)
- : blockSize(blockSize),
- useAddressReg(useAddressReg),
- address(address),
- offset(offset),
- offsetReg(offsetReg),
- useOffsetReg(useOffsetReg)
- {}
- bool Framework::Assembly::MemoryAccessArgument::usesRegister(
- GPRegister reg) const
- {
- return (useAddressReg && this->address == reg)
- || (useOffsetReg && offsetReg == reg);
- }
- void Framework::Assembly::MemoryAccessArgument::replaceRegister(
- GPRegister oldReg, GPRegister newReg)
- {
- if (useAddressReg && address == oldReg)
- {
- address = newReg;
- }
- if (useOffsetReg && offsetReg == oldReg)
- {
- offsetReg = newReg;
- }
- }
- bool Framework::Assembly::MemoryAccessArgument::isUsingAddressRegister() const
- {
- return useAddressReg;
- }
- Framework::Assembly::GPRegister
- Framework::Assembly::MemoryAccessArgument::getAddressRegister() const
- {
- return address;
- }
- int Framework::Assembly::MemoryAccessArgument::getOffset() const
- {
- return offset;
- }
- bool Framework::Assembly::MemoryAccessArgument::isUsingOffsetRegister() const
- {
- return useOffsetReg;
- }
- Framework::Assembly::GPRegister
- Framework::Assembly::MemoryAccessArgument::getOffsetRegister() const
- {
- return offsetReg;
- }
- Framework::Assembly::MemoryBlockSize
- Framework::Assembly::MemoryAccessArgument::getBlockSize() const
- {
- return blockSize;
- }
- Framework::Assembly::ConstantArgument::ConstantArgument(
- __int64 value, MemoryBlockSize size)
- : value(value),
- size(size)
- {}
- Framework::Assembly::ConstantArgument::ConstantArgument(
- int value, MemoryBlockSize size)
- : value((__int64)value),
- size(size)
- {}
- Framework::Assembly::ConstantArgument::ConstantArgument(
- short value, MemoryBlockSize size)
- : value((__int64)value),
- size(size)
- {}
- Framework::Assembly::ConstantArgument::ConstantArgument(
- char value, MemoryBlockSize size)
- : value((__int64)value),
- size(size)
- {}
- __int64 Framework::Assembly::ConstantArgument::getValue() const
- {
- return value;
- }
- Framework::Assembly::MemoryBlockSize
- Framework::Assembly::ConstantArgument::getSize() const
- {
- return size;
- }
- Framework::Assembly::JumpTargetArgument::JumpTargetArgument(Text name)
- : name(name)
- {}
- void Framework::Assembly::JumpTargetArgument::addJumpLabelPrefix(
- Text labelPrefix)
- {
- name = labelPrefix + name;
- }
- const Framework::Text& Framework::Assembly::JumpTargetArgument::getLabel() const
- {
- return name;
- }
- Framework::Assembly::Instruction::Instruction(
- Operation op, std::initializer_list<OperationArgument*> args)
- : Instruction(op, args, {}, {}, {}, {})
- {}
- Framework::Assembly::Instruction::Instruction(Operation op,
- std::initializer_list<OperationArgument*> params,
- std::initializer_list<GPRegister> implicitReadGPs,
- std::initializer_list<FPRegister> implicitReadFPs,
- std::initializer_list<GPRegister> implicitWriteGPs,
- std::initializer_list<FPRegister> implicitWriteFPs)
- : ReferenceCounter(),
- op(op),
- args(params),
- implicitReadGPs(implicitReadGPs),
- implicitReadFPs(implicitReadFPs),
- implicitWriteGPs(implicitWriteGPs),
- implicitWriteFPs(implicitWriteFPs)
- {}
- Framework::Assembly::Instruction::~Instruction()
- {
- for (auto arg : args)
- {
- delete arg;
- }
- }
- bool Framework::Assembly::Instruction::writesToRegister(
- GPRegister reg, const AssemblyBlock* block) const
- {
- for (GPRegister r : implicitWriteGPs)
- {
- if (r == reg)
- {
- return 0;
- }
- }
- __intializeMachineCodeTranslationTable();
- for (OperationCodeTable* tableEntry :
- OperationCodeTable::machineCodeTranslationTable)
- {
- if (tableEntry->getOperation() == op)
- {
- Framework::Text err;
- MachineCodeTableEntry* entry
- = tableEntry->getEntry(args, block, this, err);
- if (entry)
- {
- for (GPRegister r : entry->getImpliedWriteGPRegs())
- {
- if (r == reg)
- {
- return 1;
- }
- }
- int index = 0;
- for (const OperationArgument* arg : args)
- {
- OperandRW rw = entry->getOperandRW(index);
- if (rw == WRITE || rw == READWRITE)
- {
- if (arg->asGPRegisterArgument()
- && arg->asGPRegisterArgument()->getRegister()
- == reg)
- {
- return 1;
- }
- }
- index++;
- }
- }
- }
- }
- return 0;
- }
- bool Framework::Assembly::Instruction::writesToRegister(
- FPRegister reg, const AssemblyBlock* block) const
- {
- for (FPRegister r : implicitWriteFPs)
- {
- if (r == reg)
- {
- return 0;
- }
- }
- __intializeMachineCodeTranslationTable();
- for (OperationCodeTable* tableEntry :
- OperationCodeTable::machineCodeTranslationTable)
- {
- if (tableEntry->getOperation() == op)
- {
- Framework::Text err;
- MachineCodeTableEntry* entry
- = tableEntry->getEntry(args, block, this, err);
- if (entry)
- {
- for (FPRegister r : entry->getImpliedWriteFPRegs())
- {
- if (r == reg)
- {
- return 1;
- }
- }
- int index = 0;
- for (const OperationArgument* arg : args)
- {
- OperandRW rw = entry->getOperandRW(index);
- if (rw == WRITE || rw == READWRITE)
- {
- if (arg->asFPRegisterArgument()
- && arg->asFPRegisterArgument()->getRegister()
- == reg)
- {
- return 1;
- }
- }
- index++;
- }
- }
- }
- }
- return 0;
- }
- bool Framework::Assembly::Instruction::readsFromRegister(
- GPRegister reg, const AssemblyBlock* block) const
- {
- for (GPRegister r : implicitReadGPs)
- {
- if (r == reg)
- {
- return 0;
- }
- }
- __intializeMachineCodeTranslationTable();
- for (OperationCodeTable* tableEntry :
- OperationCodeTable::machineCodeTranslationTable)
- {
- if (tableEntry->getOperation() == op)
- {
- Framework::Text err;
- MachineCodeTableEntry* entry
- = tableEntry->getEntry(args, block, this, err);
- if (entry)
- {
- for (GPRegister r : entry->getImpliedReadGPRegs())
- {
- if (r == reg)
- {
- return 1;
- }
- }
- int index = 0;
- for (const OperationArgument* arg : args)
- {
- OperandRW rw = entry->getOperandRW(index);
- if (rw == READ || rw == READWRITE)
- {
- if (arg->asGPRegisterArgument()
- && arg->asGPRegisterArgument()->getRegister()
- == reg)
- {
- return 1;
- }
- }
- if (arg->asMemoryAccessArgument()
- && arg->asMemoryAccessArgument()->usesRegister(reg))
- {
- return 1;
- }
- index++;
- }
- }
- }
- }
- return 0;
- }
- bool Framework::Assembly::Instruction::readsFromRegister(
- FPRegister reg, const AssemblyBlock* block) const
- {
- for (FPRegister r : implicitReadFPs)
- {
- if (r == reg)
- {
- return 0;
- }
- }
- __intializeMachineCodeTranslationTable();
- for (OperationCodeTable* tableEntry :
- OperationCodeTable::machineCodeTranslationTable)
- {
- if (tableEntry->getOperation() == op)
- {
- Framework::Text err;
- MachineCodeTableEntry* entry
- = tableEntry->getEntry(args, block, this, err);
- if (entry)
- {
- for (FPRegister r : entry->getImpliedReadFPRegs())
- {
- if (r == reg)
- {
- return 1;
- }
- }
- int index = 0;
- for (const OperationArgument* arg : args)
- {
- OperandRW rw = entry->getOperandRW(index);
- if (rw == READ || rw == READWRITE)
- {
- if (arg->asFPRegisterArgument()
- && arg->asFPRegisterArgument()->getRegister()
- == reg)
- {
- return 1;
- }
- }
- index++;
- }
- }
- }
- }
- return 0;
- }
- bool Framework::Assembly::Instruction::isReplacementPossible(
- GPRegister oldReg, GPRegister newReg, const AssemblyBlock* block) const
- {
- for (GPRegister r : implicitReadGPs)
- {
- if (r == oldReg)
- {
- return 0;
- }
- }
- for (GPRegister r : implicitWriteGPs)
- {
- if (r == oldReg)
- {
- return 0;
- }
- }
- __intializeMachineCodeTranslationTable();
- for (OperationCodeTable* tableEntry :
- OperationCodeTable::machineCodeTranslationTable)
- {
- if (tableEntry->getOperation() == op)
- {
- Framework::Text err;
- MachineCodeTableEntry* entry
- = tableEntry->getEntry(args, block, this, err);
- if (entry)
- {
- for (GPRegister r : entry->getImpliedReadGPRegs())
- {
- if (r == oldReg)
- {
- return 0;
- }
- }
- for (GPRegister r : entry->getImpliedWriteGPRegs())
- {
- if (r == oldReg)
- {
- return 0;
- }
- }
- }
- }
- }
- if (this->readsFromRegister(newReg, block)
- || this->writesToRegister(newReg, block))
- {
- return 0;
- }
- if (newReg == RBP || newReg == RSI || newReg == RDI)
- {
- if (oldReg == RBP || oldReg == RSI || oldReg == RDI)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- if (newReg >= R8)
- {
- return oldReg >= R8;
- }
- return oldReg < R8;
- }
- bool Framework::Assembly::Instruction::isReplacementPossible(
- FPRegister oldReg, FPRegister newReg, const AssemblyBlock* block) const
- {
- for (FPRegister r : implicitReadFPs)
- {
- if (r == oldReg)
- {
- return 0;
- }
- }
- for (FPRegister r : implicitWriteFPs)
- {
- if (r == oldReg)
- {
- return 0;
- }
- }
- __intializeMachineCodeTranslationTable();
- for (OperationCodeTable* tableEntry :
- OperationCodeTable::machineCodeTranslationTable)
- {
- if (tableEntry->getOperation() == op)
- {
- Framework::Text err;
- MachineCodeTableEntry* entry
- = tableEntry->getEntry(args, block, this, err);
- if (entry)
- {
- for (FPRegister r : entry->getImpliedReadFPRegs())
- {
- if (r == oldReg)
- {
- return 0;
- }
- }
- for (FPRegister r : entry->getImpliedWriteFPRegs())
- {
- if (r == oldReg)
- {
- return 0;
- }
- }
- }
- }
- }
- if (this->readsFromRegister(newReg, block)
- || this->writesToRegister(newReg, block))
- {
- return 0;
- }
- return 1;
- }
- void Framework::Assembly::Instruction::replaceRegister(
- GPRegister oldReg, GPRegister newReg)
- {
- for (auto arg : args)
- {
- arg->replaceRegister(oldReg, newReg);
- }
- }
- void Framework::Assembly::Instruction::replaceRegister(
- FPRegister oldReg, FPRegister newReg)
- {
- for (auto arg : args)
- {
- arg->replaceRegister(oldReg, newReg);
- }
- }
- void Framework::Assembly::Instruction::addJumpLabelPrefix(Text labelPrefix)
- {
- for (auto arg : args)
- {
- arg->addJumpLabelPrefix(labelPrefix);
- }
- }
- void Framework::Assembly::Instruction::compile(
- StreamWriter* byteCodeWriter, const AssemblyBlock* block) const
- {
- if (op == NOP)
- {
- return;
- }
- Framework::Text err;
- __intializeMachineCodeTranslationTable();
- for (OperationCodeTable* tableEntry :
- OperationCodeTable::machineCodeTranslationTable)
- {
- if (tableEntry->getOperation() == op)
- {
- MachineCodeInstruction instr
- = tableEntry->getInstruction(args, block, this, err);
- if (err.getLength())
- {
- throw err;
- }
- instr.write(*byteCodeWriter);
- return;
- }
- }
- err.append() << "Failed to compile instruction: operation code " << (int)op
- << " not found in translation table. args: \n";
- for (auto arg : args)
- {
- err.append() << " " << typeid(*arg).name() << "\n";
- }
- throw err;
- }
- bool Framework::Assembly::Instruction::isValid(const AssemblyBlock* block) const
- {
- __intializeMachineCodeTranslationTable();
- for (OperationCodeTable* tableEntry :
- OperationCodeTable::machineCodeTranslationTable)
- {
- if (tableEntry->getOperation() == op)
- {
- Framework::Text err;
- tableEntry->getInstruction(args, block, this, err);
- return err.getLength() == 0;
- }
- }
- return false;
- }
- int Framework::Assembly::Instruction::compiledSize(
- const AssemblyBlock* block) const
- {
- __intializeMachineCodeTranslationTable();
- for (OperationCodeTable* tableEntry :
- OperationCodeTable::machineCodeTranslationTable)
- {
- if (tableEntry->getOperation() == op)
- {
- Framework::Text err;
- MachineCodeInstruction instr
- = tableEntry->getInstruction(args, block, this, err);
- if (err.getLength())
- {
- throw err;
- }
- return instr.calculateSize();
- }
- }
- return 0;
- }
- Framework::Assembly::Operation
- Framework::Assembly::Instruction::getOperation() const
- {
- return op;
- }
- bool Framework::Assembly::Instruction::definesLabel(Text label) const
- {
- return op == NOP && args.size() == 1 && args.at(0)->asJumpTargetArgument()
- && args.at(0)->asJumpTargetArgument()->getLabel().istGleich(label);
- }
- const std::vector<Framework::Assembly::OperationArgument*>&
- Framework::Assembly::Instruction::getArguments() const
- {
- return args;
- }
- Framework::Assembly::AssemblyBlock::AssemblyBlock()
- : inlineIndex(0),
- compiledCode(0)
- {}
- Framework::Assembly::AssemblyBlock::~AssemblyBlock()
- {
- if (compiledCode != 0)
- {
- // Free the compiled code memory
- VirtualFree(compiledCode, 0, MEM_RELEASE);
- }
- }
- void Framework::Assembly::AssemblyBlock::addInstruction(Instruction* instr)
- {
- instructions.add(instr);
- }
- void Framework::Assembly::AssemblyBlock::defineJumpTarget(Text name)
- {
- instructions.add(new Instruction(NOP, {new JumpTargetArgument(name)}));
- }
- void Framework::Assembly::AssemblyBlock::addJump(
- Operation jumpOp, Text targetName)
- {
- instructions.add(
- new Instruction(jumpOp, {new JumpTargetArgument(targetName)}));
- }
- void Framework::Assembly::AssemblyBlock::addAddition(
- GPRegister target, GPRegister source, GPRegisterPart part)
- {
- instructions.add(new Instruction(ADD,
- {new GPRegisterArgument(target, part),
- new GPRegisterArgument(source, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addAddition(
- GPRegister target, char value, GPRegisterPart part)
- {
- instructions.add(new Instruction(ADD,
- {new GPRegisterArgument(target, part), new ConstantArgument(value)}));
- }
- void Framework::Assembly::AssemblyBlock::addAddition(
- GPRegister target, int value, GPRegisterPart part)
- {
- instructions.add(new Instruction(ADD,
- {new GPRegisterArgument(target, part), new ConstantArgument(value)}));
- }
- void Framework::Assembly::AssemblyBlock::addAddition(
- FPRegister target, FPRegister source, FPDataType type, FPRegisterPart part)
- {
- Operation op = NOP;
- switch (type)
- {
- case SINGLE_FLOAT:
- op = ADDSS;
- break;
- case SINGLE_DOUBLE:
- op = ADDSD;
- break;
- case PACKED_FLOAT:
- op = ADDPS;
- break;
- case PACKED_DOUBLE:
- op = ADDPD;
- break;
- }
- instructions.add(new Instruction(op,
- {new FPRegisterArgument(target, part),
- new FPRegisterArgument(source, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addSubtraction(
- GPRegister target, GPRegister source, GPRegisterPart part)
- {
- instructions.add(new Instruction(SUB,
- {new GPRegisterArgument(target, part),
- new GPRegisterArgument(source, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addSubtraction(
- FPRegister target, FPRegister source, FPDataType type, FPRegisterPart part)
- {
- Operation op = NOP;
- switch (type)
- {
- case SINGLE_FLOAT:
- op = SUBSS;
- break;
- case SINGLE_DOUBLE:
- op = SUBSD;
- break;
- case PACKED_FLOAT:
- op = SUBPS;
- break;
- case PACKED_DOUBLE:
- op = SUBPD;
- break;
- }
- instructions.add(new Instruction(op,
- {new FPRegisterArgument(target, part),
- new FPRegisterArgument(source, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addMultiplication(
- GPRegister target, GPRegister source, GPRegisterPart part)
- {
- instructions.add(new Instruction(IMUL,
- {new GPRegisterArgument(target, part),
- new GPRegisterArgument(source, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addMultiplication(
- FPRegister target, FPRegister source, FPDataType type, FPRegisterPart part)
- {
- Operation op = NOP;
- switch (type)
- {
- case SINGLE_FLOAT:
- op = MULSS;
- break;
- case SINGLE_DOUBLE:
- op = MULSD;
- break;
- case PACKED_FLOAT:
- op = MULPS;
- break;
- case PACKED_DOUBLE:
- op = MULPD;
- break;
- }
- instructions.add(new Instruction(op,
- {new FPRegisterArgument(target, part),
- new FPRegisterArgument(source, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addDivision(
- GPRegister target, GPRegister source, GPRegisterPart part)
- {
- instructions.add(new Instruction(DIV,
- {new GPRegisterArgument(target, part),
- new GPRegisterArgument(source, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addDivision(
- FPRegister target, FPRegister source, FPDataType type, FPRegisterPart part)
- {
- Operation op = NOP;
- switch (type)
- {
- case SINGLE_FLOAT:
- op = DIVSS;
- break;
- case SINGLE_DOUBLE:
- op = DIVSD;
- break;
- case PACKED_FLOAT:
- op = DIVPS;
- break;
- case PACKED_DOUBLE:
- op = DIVPD;
- break;
- }
- instructions.add(new Instruction(op,
- {new FPRegisterArgument(target, part),
- new FPRegisterArgument(source, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addTest(
- GPRegister r1, GPRegister r2, GPRegisterPart part)
- {
- instructions.add(new Instruction(TEST,
- {new GPRegisterArgument(r1, part), new GPRegisterArgument(r2, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addCompare(
- GPRegister r1, GPRegister r2, GPRegisterPart part)
- {
- instructions.add(new Instruction(CMP,
- {new GPRegisterArgument(r1, part), new GPRegisterArgument(r2, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addCompare(GPRegister r1, char value)
- {
- instructions.add(new Instruction(CMP,
- {new GPRegisterArgument(r1, LOWER8), new ConstantArgument(value)}));
- }
- void Framework::Assembly::AssemblyBlock::addCompare(GPRegister r1, short value)
- {
- instructions.add(new Instruction(CMP,
- {new GPRegisterArgument(r1, LOWER16), new ConstantArgument(value)}));
- }
- void Framework::Assembly::AssemblyBlock::addCompare(GPRegister r1, int value)
- {
- instructions.add(new Instruction(CMP,
- {new GPRegisterArgument(r1, LOWER32), new ConstantArgument(value)}));
- }
- void Framework::Assembly::AssemblyBlock::addCompare(
- FPRegister r1, FPRegister r2, FPDataType type)
- {
- Operation op = NOP;
- switch (type)
- {
- case SINGLE_FLOAT:
- op = COMISS;
- break;
- case SINGLE_DOUBLE:
- op = COMISD;
- break;
- }
- if (op != NOP)
- {
- instructions.add(new Instruction(op,
- {new FPRegisterArgument(r1, FPRegisterPart::X),
- new FPRegisterArgument(r2, FPRegisterPart::X)}));
- }
- }
- void Framework::Assembly::AssemblyBlock::addAnd(
- GPRegister target, GPRegister source, GPRegisterPart part)
- {
- instructions.add(new Instruction(AND,
- {new GPRegisterArgument(target, part),
- new GPRegisterArgument(source, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addOr(
- GPRegister target, GPRegister source, GPRegisterPart part)
- {
- instructions.add(new Instruction(OR,
- {new GPRegisterArgument(target, part),
- new GPRegisterArgument(source, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addLoadValue(
- char* valueAddress, GPRegister target)
- {
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target),
- new ConstantArgument(reinterpret_cast<__int64>(valueAddress))}));
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target, LOWER8),
- new MemoryAccessArgument(MemoryBlockSize::BYTE, target)}));
- }
- void Framework::Assembly::AssemblyBlock::addLoadValue(
- short* valueAddress, GPRegister target)
- {
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target),
- new ConstantArgument(reinterpret_cast<__int64>(valueAddress))}));
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target, LOWER16),
- new MemoryAccessArgument(MemoryBlockSize::WORD, target)}));
- }
- void Framework::Assembly::AssemblyBlock::addLoadValue(
- int* valueAddress, GPRegister target)
- {
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target),
- new ConstantArgument(reinterpret_cast<__int64>(valueAddress))}));
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target, LOWER32),
- new MemoryAccessArgument(MemoryBlockSize::DWORD, target)}));
- }
- void Framework::Assembly::AssemblyBlock::addLoadValue(
- __int64* valueAddress, GPRegister target)
- {
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target),
- new ConstantArgument(reinterpret_cast<__int64>(valueAddress))}));
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target),
- new MemoryAccessArgument(MemoryBlockSize::QWORD, target)}));
- }
- void Framework::Assembly::AssemblyBlock::addLoadValue(
- GPRegister addressRegister,
- GPRegister target,
- GPRegisterPart targetPart,
- int offset)
- {
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target, targetPart),
- new MemoryAccessArgument(
- (targetPart == LOWER8 || targetPart == HIGHER8)
- ? MemoryBlockSize::BYTE
- : (targetPart == LOWER16
- ? MemoryBlockSize::WORD
- : (targetPart == LOWER32
- ? MemoryBlockSize::DWORD
- : MemoryBlockSize::QWORD)),
- addressRegister,
- true,
- offset)}));
- }
- void Framework::Assembly::AssemblyBlock::addLoadValue(
- float* valueAddress, FPRegister target, GPRegister temp)
- {
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(temp),
- new ConstantArgument(reinterpret_cast<__int64>(valueAddress))}));
- instructions.add(new Instruction(MOVSS,
- {new FPRegisterArgument(target),
- new MemoryAccessArgument(MemoryBlockSize::DWORD, temp)}));
- }
- void Framework::Assembly::AssemblyBlock::addLoadValue(
- double* valueAddress, FPRegister target, GPRegister temp)
- {
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(temp),
- new ConstantArgument(reinterpret_cast<__int64>(valueAddress))}));
- instructions.add(new Instruction(MOVSD,
- {new FPRegisterArgument(target),
- new MemoryAccessArgument(MemoryBlockSize::QWORD, temp)}));
- }
- void Framework::Assembly::AssemblyBlock::addMoveValue(
- GPRegister target, char value)
- {
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target, LOWER8), new ConstantArgument(value)}));
- }
- void Framework::Assembly::AssemblyBlock::addMoveValue(
- GPRegister target, short value)
- {
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target, LOWER16),
- new ConstantArgument(value)}));
- }
- void Framework::Assembly::AssemblyBlock::addMoveValue(
- GPRegister target, int value)
- {
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target, LOWER32),
- new ConstantArgument(value)}));
- }
- void Framework::Assembly::AssemblyBlock::addMoveValue(
- GPRegister target, __int64 value)
- {
- instructions.add(new Instruction(
- MOV, {new GPRegisterArgument(target), new ConstantArgument(value)}));
- }
- void Framework::Assembly::AssemblyBlock::addMoveValue(
- FPRegister target, float value, GPRegister temp)
- {
- int data = *reinterpret_cast<int*>(&value);
- addMoveValue(temp, data);
- addPush(temp);
- instructions.add(new Instruction(MOVSS,
- {new FPRegisterArgument(target, X),
- new MemoryAccessArgument(MemoryBlockSize::DWORD, RSP)}));
- addPop(temp);
- }
- void Framework::Assembly::AssemblyBlock::addMoveValue(
- FPRegister target, double value, GPRegister temp)
- {
- __int64 data = *reinterpret_cast<__int64*>(&value);
- addMoveValue(temp, data);
- addPush(temp);
- instructions.add(new Instruction(MOVSD,
- {new FPRegisterArgument(target, X),
- new MemoryAccessArgument(MemoryBlockSize::QWORD, RSP)}));
- addPop(temp);
- }
- void Framework::Assembly::AssemblyBlock::addMoveValue(
- GPRegister target, GPRegister source, GPRegisterPart part)
- {
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(target, part),
- new GPRegisterArgument(source, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addMoveValue(
- FPRegister target, FPRegister source, FPDataType type, FPRegisterPart part)
- {
- Operation op = NOP;
- switch (type)
- {
- case SINGLE_FLOAT:
- op = MOVSS;
- break;
- case SINGLE_DOUBLE:
- op = MOVSD;
- break;
- case PACKED_FLOAT:
- op = MOVUPS;
- break;
- case PACKED_DOUBLE:
- op = MOVUPD;
- break;
- }
- instructions.add(new Instruction(op,
- {new FPRegisterArgument(target, part),
- new FPRegisterArgument(source, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addConversion(GPRegister target,
- FPRegister source,
- FPDataType type,
- GPRegisterPart targetPart,
- bool round)
- {
- Operation op = NOP;
- if (type == SINGLE_DOUBLE)
- {
- op = round ? CVTSD2SI : CVTTSD2SI;
- }
- else if (type == SINGLE_FLOAT)
- {
- op = round ? CVTSS2SI : CVTTSS2SI;
- }
- instructions.add(new Instruction(op,
- {new GPRegisterArgument(target, targetPart),
- new FPRegisterArgument(source, X)}));
- }
- void Framework::Assembly::AssemblyBlock::addConversion(FPRegister target,
- GPRegister source,
- FPDataType targetType,
- GPRegisterPart sourcePart)
- {
- Operation op = NOP;
- if (targetType == SINGLE_DOUBLE)
- {
- op = CVTSI2SD;
- }
- else if (targetType == SINGLE_FLOAT)
- {
- op = CVTSI2SS;
- }
- instructions.add(new Instruction(op,
- {new FPRegisterArgument(target, X),
- new GPRegisterArgument(source, sourcePart)}));
- }
- void Framework::Assembly::AssemblyBlock::addCall(void* functionAddress,
- FuncReturnType returnType,
- std::initializer_list<GPRegister> gpParams,
- std::initializer_list<FPRegister> fpParams,
- GPRegister temp,
- GPRegister bpTemp)
- {
- if (isVolatile(bpTemp) || bpTemp == RSP)
- {
- throw "Temporary register for base pointer must be a non-volatile "
- "register (not RAX, RCX, RDX, R8, R9, R10, R11) and not RSP";
- }
- // enshure calling conventions
- // save stack pointer value to bpTemp
- addMoveValue(bpTemp, RSP);
- // align stack pointer to 16 bytes
- instructions.add(new Instruction(
- AND, {new GPRegisterArgument(RSP), new ConstantArgument(-16)}));
- // allocate shadow space
- instructions.add(new Instruction(
- SUB, {new GPRegisterArgument(RSP), new ConstantArgument(32)}));
- // load function address into temp register
- instructions.add(new Instruction(MOV,
- {new GPRegisterArgument(temp),
- new ConstantArgument(reinterpret_cast<__int64>(functionAddress))}));
- // call the function
- if (returnType == INT_VALUE)
- {
- instructions.add(new Instruction(CALL,
- {new GPRegisterArgument(temp)},
- gpParams,
- fpParams,
- {RAX},
- {}));
- }
- else if (returnType == FLOAT_VALUE)
- {
- instructions.add(new Instruction(CALL,
- {new GPRegisterArgument(temp)},
- gpParams,
- fpParams,
- {},
- {MM0}));
- }
- else
- {
- instructions.add(new Instruction(
- CALL, {new GPRegisterArgument(temp)}, gpParams, fpParams, {}, {}));
- }
- // restore stack pointer
- addMoveValue(RSP, bpTemp);
- }
- void Framework::Assembly::AssemblyBlock::addReturn()
- {
- instructions.add(new Instruction(RET, {}));
- }
- void Framework::Assembly::AssemblyBlock::addPush(
- GPRegister reg, GPRegisterPart part)
- {
- GPRegisterPart pushPart = part;
- if (part == LOWER8 || part == HIGHER8)
- {
- pushPart = LOWER16;
- }
- if (part == LOWER32)
- {
- pushPart = FULL64;
- }
- instructions.add(
- new Instruction(PUSH, {new GPRegisterArgument(reg, pushPart)}));
- }
- void Framework::Assembly::AssemblyBlock::addPop(
- GPRegister reg, GPRegisterPart part)
- {
- GPRegisterPart popPart = part;
- if (part == LOWER8 || part == HIGHER8)
- {
- popPart = LOWER16;
- }
- if (part == LOWER32)
- {
- popPart = FULL64;
- }
- instructions.add(
- new Instruction(POP, {new GPRegisterArgument(reg, popPart)}));
- }
- void Framework::Assembly::AssemblyBlock::addPush(
- FPRegister reg, FPDataType type, FPRegisterPart part)
- {
- MemoryBlockSize size;
- int bytes;
- Operation moveOp;
- switch (type)
- {
- case SINGLE_DOUBLE:
- moveOp = MOVSD;
- bytes = 8;
- size = MemoryBlockSize::QWORD;
- part = X;
- break;
- case SINGLE_FLOAT:
- moveOp = MOVSS;
- bytes = 4;
- size = MemoryBlockSize::DWORD;
- part = X;
- break;
- case PACKED_DOUBLE:
- moveOp = MOVUPD;
- bytes = part == X ? 16 : 32;
- size = part == X ? MemoryBlockSize::M128 : MemoryBlockSize::M256;
- case PACKED_FLOAT:
- moveOp = MOVUPS;
- bytes = part == X ? 16 : 32;
- size = part == X ? MemoryBlockSize::M128 : MemoryBlockSize::M256;
- }
- instructions.add(new Instruction(
- SUB, {new GPRegisterArgument(RSP), new ConstantArgument(bytes)}));
- instructions.add(new Instruction(moveOp,
- {new MemoryAccessArgument(size, RSP),
- new FPRegisterArgument(reg, part)}));
- }
- void Framework::Assembly::AssemblyBlock::addPop(
- FPRegister reg, FPDataType type, FPRegisterPart part)
- {
- addPop(instructions, reg, type, part);
- }
- void Framework::Assembly::AssemblyBlock::addPop(
- RCArray<Instruction>& instructionList,
- FPRegister reg,
- FPDataType type,
- FPRegisterPart part)
- {
- MemoryBlockSize size;
- int bytes;
- Operation moveOp;
- switch (type)
- {
- case SINGLE_DOUBLE:
- moveOp = MOVSD;
- bytes = 8;
- size = MemoryBlockSize::QWORD;
- part = X;
- break;
- case SINGLE_FLOAT:
- moveOp = MOVSS;
- bytes = 4;
- size = MemoryBlockSize::DWORD;
- part = X;
- break;
- case PACKED_DOUBLE:
- moveOp = MOVUPD;
- bytes = part == X ? 16 : 32;
- size = part == X ? MemoryBlockSize::M128 : MemoryBlockSize::M256;
- case PACKED_FLOAT:
- moveOp = MOVUPS;
- bytes = part == X ? 16 : 32;
- size = part == X ? MemoryBlockSize::M128 : MemoryBlockSize::M256;
- }
- instructionList.add(new Instruction(moveOp,
- {new FPRegisterArgument(reg, part),
- new MemoryAccessArgument(size, RSP)}));
- instructionList.add(new Instruction(
- ADD, {new GPRegisterArgument(RSP), new ConstantArgument(bytes)}));
- }
- void Framework::Assembly::AssemblyBlock::addBlock(AssemblyBlock* block,
- std::initializer_list<GPRegister> preservedGPRegisters,
- std::initializer_list<FPRegister> preservedFPRegisters,
- std::initializer_list<FPDataType> preservedFPDataTypes,
- GPRegister* blockResultGpReg,
- FPRegister* blockResultFpReg)
- {
- std::vector<FPDataType> fpTypes(preservedFPDataTypes);
- bool containsCall = false;
- for (const auto& instr : block->instructions)
- {
- if (instr->getOperation() == CALL)
- {
- containsCall = true; // volatile registers that should be preserved
- // needs to be pushed to the stack
- break;
- }
- }
- RCArray<Instruction> tempInstructions;
- for (GPRegister preservedReg : preservedGPRegisters)
- {
- if (block->writesToRegister(preservedReg))
- {
- bool replaced = false;
- for (int i = 0; i < 16; i++)
- {
- if (i == 4 || i == 5 || preservedReg == RSP
- || preservedReg == RBP)
- {
- continue; // Skip RSP and RBP (stack counter register)
- }
- if (!containsCall
- || (isVolatile(preservedReg)
- == isVolatile((Framework::Assembly::GPRegister)i)))
- { // call inside the block -> only replace volatile with
- // volatile and non volatile with non volatile registers
- bool found = false;
- for (GPRegister r : preservedGPRegisters)
- {
- if (r == (GPRegister)i)
- {
- found = true;
- break;
- }
- }
- if (found)
- {
- continue;
- }
- GPRegister newReg = (GPRegister)i;
- if (block->isReplacementPossible(preservedReg, newReg))
- {
- if (blockResultGpReg)
- {
- if (preservedReg == *blockResultGpReg)
- {
- *blockResultGpReg = newReg;
- }
- }
- replaced = true;
- block->replaceRegister(preservedReg, newReg);
- break;
- }
- }
- }
- if (!replaced)
- {
- addPush(preservedReg);
- tempInstructions.add(
- new Instruction(
- POP, {new GPRegisterArgument(preservedReg)}),
- 0);
- }
- }
- }
- int index = 0;
- for (FPRegister preservedReg : preservedFPRegisters)
- {
- if (block->writesToRegister(preservedReg))
- {
- bool replaced = false;
- for (int i = 0; i < __FP_REGISTER_COUNT; i++)
- {
- if (!containsCall
- || (isVolatile(preservedReg) == isVolatile((FPRegister)i)))
- { // call inside the block -> only replace volatile with
- // volatile and non volatile with non volatile registers
- bool found = false;
- for (FPRegister r : preservedFPRegisters)
- {
- if (r == (FPRegister)i)
- {
- found = true;
- break;
- }
- }
- if (found)
- {
- continue;
- }
- FPRegister newReg = (FPRegister)i;
- if (block->isReplacementPossible(preservedReg, newReg))
- {
- if (blockResultFpReg)
- {
- if (preservedReg == *blockResultFpReg)
- {
- *blockResultFpReg = newReg;
- }
- }
- replaced = true;
- block->replaceRegister(preservedReg, newReg);
- break;
- }
- }
- }
- if (!replaced)
- {
- // TODO: search for last instruction that wrote to preservedReg
- // to find its data type
- addPush(preservedReg, fpTypes[index], Y);
- addPop(tempInstructions, preservedReg, fpTypes[index], Y);
- }
- }
- index++;
- }
- index = 0;
- Text prefix = "inlined_";
- prefix.append() << inlineIndex++ << "_";
- block->addJumpLabelPrefix(prefix);
- bool returnFound = false;
- for (const auto& instr : block->instructions)
- {
- if (instr->getOperation() == RET)
- {
- if (index != block->instructions.getEntryCount() - 1)
- {
- returnFound = true;
- instructions.add(new Instruction(
- JMP, {new JumpTargetArgument(Text("after_") + prefix)}));
- }
- }
- else
- {
- instructions.add(dynamic_cast<Instruction*>(instr->getThis()));
- }
- index++;
- }
- if (returnFound)
- {
- defineJumpTarget(Text("after_") + prefix);
- }
- for (const auto& instr : tempInstructions)
- {
- instructions.add(dynamic_cast<Instruction*>(instr->getThis()));
- }
- }
- bool Framework::Assembly::AssemblyBlock::writesToRegister(GPRegister reg) const
- {
- for (const auto& instr : instructions)
- {
- if (instr->writesToRegister(reg, this))
- {
- return true;
- }
- }
- return false;
- }
- bool Framework::Assembly::AssemblyBlock::writesToRegister(FPRegister reg) const
- {
- for (const auto& instr : instructions)
- {
- if (instr->writesToRegister(reg, this))
- {
- return true;
- }
- }
- return false;
- }
- bool Framework::Assembly::AssemblyBlock::readsFromRegister(GPRegister reg) const
- {
- for (const auto& instr : instructions)
- {
- if (instr->readsFromRegister(reg, this))
- {
- return true;
- }
- }
- return false;
- }
- bool Framework::Assembly::AssemblyBlock::readsFromRegister(FPRegister reg) const
- {
- for (const auto& instr : instructions)
- {
- if (instr->readsFromRegister(reg, this))
- {
- return true;
- }
- }
- return false;
- }
- bool Framework::Assembly::AssemblyBlock::isReplacementPossible(
- GPRegister oldReg, GPRegister newReg) const
- {
- for (const auto& instr : instructions)
- {
- if (!instr->isReplacementPossible(oldReg, newReg, this))
- {
- return false;
- }
- }
- return true;
- }
- bool Framework::Assembly::AssemblyBlock::isReplacementPossible(
- FPRegister oldReg, FPRegister newReg) const
- {
- for (const auto& instr : instructions)
- {
- if (!instr->isReplacementPossible(oldReg, newReg, this))
- {
- return false;
- }
- }
- return true;
- }
- void Framework::Assembly::AssemblyBlock::replaceRegister(
- GPRegister oldReg, GPRegister newReg)
- {
- for (const auto& instr : instructions)
- {
- instr->replaceRegister(oldReg, newReg);
- }
- }
- void Framework::Assembly::AssemblyBlock::replaceRegister(
- FPRegister oldReg, FPRegister newReg)
- {
- for (const auto& instr : instructions)
- {
- instr->replaceRegister(oldReg, newReg);
- }
- }
- void Framework::Assembly::AssemblyBlock::addJumpLabelPrefix(Text labelPrefix)
- {
- for (const auto& instr : instructions)
- {
- instr->addJumpLabelPrefix(labelPrefix);
- }
- }
- const Framework::RCArray<Framework::Assembly::Instruction>&
- Framework::Assembly::AssemblyBlock::getInstructions() const
- {
- return instructions;
- }
- void Framework::Assembly::AssemblyBlock::optimize()
- {
- RCArray<Instruction> optimizedInstructions;
- for (int index = 0; index < instructions.getEntryCount(); index++)
- {
- Instruction* curr = instructions.z(index);
- if (index < instructions.getEntryCount() - 1
- && curr->getOperation() == MOV && curr->getArguments().size() == 2
- && curr->getArguments().at(0)->asGPRegisterArgument()
- && curr->getArguments().at(1)->asMemoryAccessArgument())
- {
- GPRegister target = curr->getArguments()
- .at(0)
- ->asGPRegisterArgument()
- ->getRegister();
- GPRegisterPart part
- = curr->getArguments().at(0)->asGPRegisterArgument()->getPart();
- Instruction* next = instructions.z(index + 1);
- if (!next->writesToRegister(target, this)
- && next->getArguments().size() == 2
- && next->getArguments().at(1)->asGPRegisterArgument()
- && next->getArguments()
- .at(1)
- ->asGPRegisterArgument()
- ->getRegister()
- == target
- && next->getArguments().at(1)->asGPRegisterArgument()->getPart()
- == part)
- {
- Instruction* replacement = new Instruction(next->getOperation(),
- {next->getArguments().at(0), curr->getArguments().at(1)});
- if (replacement->isValid(this))
- {
- optimizedInstructions.add(replacement);
- index++;
- continue;
- }
- replacement->release();
- }
- }
- optimizedInstructions.add(dynamic_cast<Instruction*>(curr->getThis()));
- }
- instructions.leeren();
- for (Instruction* instr : optimizedInstructions)
- {
- instructions.add(dynamic_cast<Instruction*>(instr->getThis()));
- }
- }
- void* Framework::Assembly::AssemblyBlock::compile()
- {
- if (compiledCode != 0)
- {
- return compiledCode;
- }
- InMemoryBuffer buffer;
- int index = 0;
- // check non-volatile registers
- RCArray<Instruction> restoreInstructions;
- for (GPRegister nvReg : {RBX, RBP, RSI, RDI, R12, R13, R14, R15})
- {
- if (writesToRegister(nvReg))
- {
- Instruction pushInstr(
- PUSH, {new GPRegisterArgument(nvReg, FULL64)});
- pushInstr.compile(&buffer, this);
- restoreInstructions.add(
- new Instruction(POP, {new GPRegisterArgument(nvReg, FULL64)}),
- 0);
- }
- }
- for (FPRegister nvReg :
- {MM6, MM7, MM8, MM9, MM10, MM11, MM12, MM13, MM14, MM15})
- {
- if (writesToRegister(nvReg))
- {
- Instruction subInst(
- SUB, {new GPRegisterArgument(RSP), new ConstantArgument(32)});
- subInst.compile(&buffer, this);
- Instruction pushInstr(MOVUPD,
- {new MemoryAccessArgument(MemoryBlockSize::M256, RSP),
- new FPRegisterArgument(nvReg, Y)});
- pushInstr.compile(&buffer, this);
- restoreInstructions.add(new Instruction(MOVUPD,
- {new FPRegisterArgument(nvReg, Y),
- new MemoryAccessArgument(MemoryBlockSize::M256, RSP)}));
- restoreInstructions.add(new Instruction(
- ADD, {new GPRegisterArgument(RSP), new ConstantArgument(32)}));
- }
- }
- // replace return instructions with jumps to the end
- if (restoreInstructions.getEntryCount() > 0)
- {
- bool needed = false;
- for (int index = 0; index < instructions.getEntryCount(); index++)
- {
- if (instructions.z(index)->getOperation() == RET)
- {
- if (index < instructions.getEntryCount() - 1)
- {
- needed = true;
- instructions.set(
- new Instruction(JMP,
- {new JumpTargetArgument(
- Text("_restore_non_volatile_registers"))}),
- index);
- }
- else
- {
- // remove last RET instruction, will be added after non
- // volatile registers were restored from the stack
- instructions.remove(index);
- }
- }
- }
- if (needed)
- {
- defineJumpTarget(Text("_restore_non_volatile_registers"));
- }
- }
- // compile instructions
- for (const auto& instr : instructions)
- {
- instr->compile(&buffer, this);
- }
- // restore non-volatile registers
- for (const auto& instr : restoreInstructions)
- {
- instr->compile(&buffer, this);
- }
- // add final RET instruction
- Instruction retInstr(RET, {});
- retInstr.compile(&buffer, this);
- int totalSize = (int)buffer.getSize();
- // Allocate executable memory
- compiledCode = VirtualAlloc(nullptr, totalSize, MEM_COMMIT, PAGE_READWRITE);
- if (compiledCode == nullptr)
- {
- throw std::runtime_error("Failed to allocate executable memory.");
- }
- // Write the compiled code into the allocated memory
- buffer.lese((char*)compiledCode, totalSize);
- DWORD dummy;
- VirtualProtect(compiledCode, totalSize, PAGE_EXECUTE_READ, &dummy);
- return compiledCode;
- }
|