Assembly.cpp 267 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447
  1. #include "Assembly.h"
  2. #include "InMemoryBuffer.h"
  3. struct MachineCodeInstruction
  4. {
  5. bool needsRex;
  6. char opcode[3];
  7. char opcodeLength;
  8. bool needsModRM;
  9. char modRM;
  10. bool sibNeeded;
  11. char sib;
  12. char disp[4];
  13. char dispLength;
  14. char imm[8];
  15. char immLength;
  16. bool operandSizeOverride;
  17. bool errIfRex;
  18. bool errIfNoRex;
  19. bool exR;
  20. bool exX;
  21. bool exB;
  22. bool vexL;
  23. bool exWE;
  24. int vexVVVV;
  25. char vexPP;
  26. bool needsVex;
  27. void write(Framework::StreamWriter& writer) const
  28. {
  29. if (operandSizeOverride)
  30. {
  31. char prefix = 0x66;
  32. writer.schreibe(&prefix, 1);
  33. }
  34. if (needsRex && !needsVex)
  35. {
  36. char rex = 0b01000000 | ((exWE & 0b1) << 3) | ((exR & 0b1) << 2)
  37. | ((exX & 0b1) << 1) | (exB & 0b1);
  38. writer.schreibe(&rex, 1);
  39. }
  40. int opCodeOffset = 0;
  41. if (needsVex)
  42. {
  43. char vexMapSelect = 0;
  44. if (opcode[0] == 0x0F)
  45. {
  46. opCodeOffset = 1;
  47. vexMapSelect = 1;
  48. if (opcode[1] == 0x38)
  49. {
  50. vexMapSelect = 2;
  51. opCodeOffset = 2;
  52. }
  53. else if (opcode[1] == 0x3A)
  54. {
  55. vexMapSelect = 3;
  56. opCodeOffset = 2;
  57. }
  58. }
  59. if (exX || exB || exWE || vexMapSelect != 1)
  60. {
  61. // 3-byte VEX
  62. char vex2[3];
  63. vex2[0] = (char)0xC4;
  64. vex2[1]
  65. = (((~(char)exR) & 0b1) << 7) | (((~(char)exX) & 0b1) << 6)
  66. | (((~(char)exB) & 0b1) << 5) | (vexMapSelect & 0b11111);
  67. vex2[2] = ((exWE & 0b1) << 7)
  68. | (((~(char)vexVVVV) & 0b1111) << 3)
  69. | ((vexL & 0b1) << 2) | (vexPP & 0b11);
  70. writer.schreibe(vex2, 3);
  71. }
  72. else
  73. {
  74. // 2-byte VEX
  75. char vex2[2];
  76. vex2[0] = (char)0xC5;
  77. vex2[1] = (((~(char)exR) & 0b1) << 7)
  78. | (((~(char)vexVVVV) & 0b1111) << 3)
  79. | ((vexL & 0b1) << 2) | (vexPP & 0b11);
  80. writer.schreibe(vex2, 2);
  81. }
  82. }
  83. writer.schreibe(opcode + opCodeOffset, opcodeLength - opCodeOffset);
  84. if (needsModRM)
  85. {
  86. writer.schreibe(&modRM, 1);
  87. }
  88. if (sibNeeded)
  89. {
  90. writer.schreibe(&sib, 1);
  91. }
  92. if (dispLength > 0)
  93. {
  94. writer.schreibe(disp, dispLength);
  95. }
  96. if (immLength > 0)
  97. {
  98. writer.schreibe(imm, immLength);
  99. }
  100. }
  101. int calculateSize() const
  102. {
  103. int size = 0;
  104. if (operandSizeOverride)
  105. {
  106. size += 1;
  107. }
  108. if (needsRex && !needsVex)
  109. {
  110. size += 1;
  111. }
  112. int opCodeOffset = 0;
  113. if (needsVex)
  114. {
  115. char vexMapSelect = 0;
  116. if (opcode[0] == 0x0F)
  117. {
  118. opCodeOffset = 1;
  119. vexMapSelect = 1;
  120. if (opcode[1] == 0x38)
  121. {
  122. vexMapSelect = 2;
  123. opCodeOffset = 2;
  124. }
  125. else if (opcode[1] == 0x3A)
  126. {
  127. vexMapSelect = 3;
  128. opCodeOffset = 2;
  129. }
  130. }
  131. if (exX || exB || exWE || vexMapSelect != 1)
  132. {
  133. size += 3;
  134. }
  135. else
  136. {
  137. size += 2;
  138. }
  139. }
  140. size += opcodeLength - opCodeOffset;
  141. if (needsModRM)
  142. {
  143. size += 1;
  144. }
  145. if (sibNeeded)
  146. {
  147. size += 1;
  148. }
  149. size += dispLength;
  150. size += immLength;
  151. return size;
  152. }
  153. };
  154. enum OperandEncoding
  155. {
  156. UNDEFINED,
  157. MODRM_REG,
  158. MODRM_RM,
  159. VEX_VVVV,
  160. OPCODE_RD,
  161. // EVEX_VVVV,
  162. IMM8,
  163. IMM16,
  164. IMM32,
  165. IMM64,
  166. };
  167. enum OperandRW
  168. {
  169. NONE = 0,
  170. READ = 1,
  171. WRITE = 2,
  172. READWRITE = 3,
  173. };
  174. class MachineCodeTableEntry
  175. {
  176. private:
  177. int numArgs;
  178. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  179. op1Validator;
  180. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  181. op2Validator;
  182. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  183. op3Validator;
  184. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  185. op4Validator;
  186. bool vex;
  187. bool vexL;
  188. char vexPP;
  189. bool rexW;
  190. char rmReg;
  191. char opcode[3];
  192. char opcodeLength;
  193. OperandEncoding op1Encoding;
  194. OperandEncoding op2Encoding;
  195. OperandEncoding op3Encoding;
  196. OperandEncoding op4Encoding;
  197. OperandRW op1RW;
  198. OperandRW op2RW;
  199. OperandRW op3RW;
  200. OperandRW op4RW;
  201. std::vector<Framework::Assembly::GPRegister> impliedReadGPRegs;
  202. std::vector<Framework::Assembly::GPRegister> impliedWriteGPRegs;
  203. std::vector<Framework::Assembly::FPRegister> impliedReadFPRegs;
  204. std::vector<Framework::Assembly::FPRegister> impliedWriteFPRegs;
  205. bool operandSizeOverride;
  206. public:
  207. MachineCodeTableEntry(bool rexW,
  208. int opcode,
  209. char opcodeLength,
  210. bool operandSizeOverride,
  211. bool vex,
  212. bool vexL,
  213. char vexPP,
  214. char rmReg)
  215. : numArgs(0),
  216. rexW(rexW),
  217. rmReg(rmReg),
  218. opcodeLength(opcodeLength),
  219. operandSizeOverride(operandSizeOverride),
  220. vex(vex),
  221. vexL(vexL),
  222. vexPP(vexPP),
  223. op1Encoding(UNDEFINED),
  224. op2Encoding(UNDEFINED),
  225. op3Encoding(UNDEFINED),
  226. op4Encoding(UNDEFINED),
  227. op1RW(NONE),
  228. op2RW(NONE),
  229. op3RW(NONE),
  230. op4RW(NONE)
  231. {
  232. this->opcode[0] = (char)(opcode & 0xFF);
  233. this->opcode[1] = (char)((opcode >> 8) & 0xFF);
  234. this->opcode[2] = (char)((opcode >> 16) & 0xFF);
  235. }
  236. MachineCodeTableEntry(bool rexW,
  237. int opcode,
  238. char opcodeLength,
  239. bool operandSizeOverride,
  240. bool vex,
  241. bool vexL,
  242. char vexPP,
  243. char rmReg,
  244. std::initializer_list<Framework::Assembly::GPRegister>
  245. impliedReadGPRegs,
  246. std::initializer_list<Framework::Assembly::GPRegister>
  247. impliedWriteGPRegs,
  248. std::initializer_list<Framework::Assembly::FPRegister>
  249. impliedReadFPRegs,
  250. std::initializer_list<Framework::Assembly::FPRegister>
  251. impliedWriteFPRegs)
  252. : MachineCodeTableEntry(rexW,
  253. opcode,
  254. opcodeLength,
  255. operandSizeOverride,
  256. vex,
  257. vexL,
  258. vexPP,
  259. rmReg)
  260. {
  261. this->opcode[0] = (char)(opcode & 0xFF);
  262. this->opcode[1] = (char)((opcode >> 8) & 0xFF);
  263. this->opcode[2] = (char)((opcode >> 16) & 0xFF);
  264. this->impliedReadGPRegs = impliedReadGPRegs;
  265. this->impliedWriteGPRegs = impliedWriteGPRegs;
  266. this->impliedReadFPRegs = impliedReadFPRegs;
  267. this->impliedWriteFPRegs = impliedWriteFPRegs;
  268. }
  269. MachineCodeTableEntry(bool rexW,
  270. int opcode,
  271. char opcodeLength,
  272. bool operandSizeOverride,
  273. bool vex,
  274. bool vexL,
  275. char vexPP,
  276. char rmReg,
  277. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  278. op1Validator,
  279. OperandEncoding op1Encoding,
  280. OperandRW op1RW)
  281. : MachineCodeTableEntry(rexW,
  282. opcode,
  283. opcodeLength,
  284. operandSizeOverride,
  285. vex,
  286. vexL,
  287. vexPP,
  288. rmReg)
  289. {
  290. numArgs = 1;
  291. this->op1Validator = op1Validator;
  292. this->op1Encoding = op1Encoding;
  293. this->op1RW = op1RW;
  294. }
  295. MachineCodeTableEntry(bool rexW,
  296. int opcode,
  297. char opcodeLength,
  298. bool operandSizeOverride,
  299. bool vex,
  300. bool vexL,
  301. char vexPP,
  302. char rmReg,
  303. std::initializer_list<Framework::Assembly::GPRegister>
  304. impliedReadGPRegs,
  305. std::initializer_list<Framework::Assembly::GPRegister>
  306. impliedWriteGPRegs,
  307. std::initializer_list<Framework::Assembly::FPRegister>
  308. impliedReadFPRegs,
  309. std::initializer_list<Framework::Assembly::FPRegister>
  310. impliedWriteFPRegs,
  311. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  312. op1Validator,
  313. OperandEncoding op1Encoding,
  314. OperandRW op1RW)
  315. : MachineCodeTableEntry(rexW,
  316. opcode,
  317. opcodeLength,
  318. operandSizeOverride,
  319. vex,
  320. vexL,
  321. vexPP,
  322. rmReg,
  323. impliedReadGPRegs,
  324. impliedWriteGPRegs,
  325. impliedReadFPRegs,
  326. impliedWriteFPRegs)
  327. {
  328. numArgs = 1;
  329. this->op1Validator = op1Validator;
  330. this->op1Encoding = op1Encoding;
  331. this->op1RW = op1RW;
  332. }
  333. MachineCodeTableEntry(bool rexW,
  334. int opcode,
  335. char opcodeLength,
  336. bool operandSizeOverride,
  337. bool vex,
  338. bool vexL,
  339. char vexPP,
  340. char rmReg,
  341. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  342. op1Validator,
  343. OperandEncoding op1Encoding,
  344. OperandRW op1RW,
  345. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  346. op2Validator,
  347. OperandEncoding op2Encoding,
  348. OperandRW op2RW)
  349. : MachineCodeTableEntry(rexW,
  350. opcode,
  351. opcodeLength,
  352. operandSizeOverride,
  353. vex,
  354. vexL,
  355. vexPP,
  356. rmReg,
  357. op1Validator,
  358. op1Encoding,
  359. op1RW)
  360. {
  361. numArgs = 2;
  362. this->op2Validator = op2Validator;
  363. this->op2Encoding = op2Encoding;
  364. this->op2RW = op2RW;
  365. }
  366. MachineCodeTableEntry(bool rexW,
  367. int opcode,
  368. char opcodeLength,
  369. bool operandSizeOverride,
  370. bool vex,
  371. bool vexL,
  372. char vexPP,
  373. char rmReg,
  374. std::initializer_list<Framework::Assembly::GPRegister>
  375. impliedReadGPRegs,
  376. std::initializer_list<Framework::Assembly::GPRegister>
  377. impliedWriteGPRegs,
  378. std::initializer_list<Framework::Assembly::FPRegister>
  379. impliedReadFPRegs,
  380. std::initializer_list<Framework::Assembly::FPRegister>
  381. impliedWriteFPRegs,
  382. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  383. op1Validator,
  384. OperandEncoding op1Encoding,
  385. OperandRW op1RW,
  386. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  387. op2Validator,
  388. OperandEncoding op2Encoding,
  389. OperandRW op2RW)
  390. : MachineCodeTableEntry(rexW,
  391. opcode,
  392. opcodeLength,
  393. operandSizeOverride,
  394. vex,
  395. vexL,
  396. vexPP,
  397. rmReg,
  398. impliedReadGPRegs,
  399. impliedWriteGPRegs,
  400. impliedReadFPRegs,
  401. impliedWriteFPRegs,
  402. op1Validator,
  403. op1Encoding,
  404. op1RW)
  405. {
  406. numArgs = 2;
  407. this->op2Validator = op2Validator;
  408. this->op2Encoding = op2Encoding;
  409. this->op2RW = op2RW;
  410. }
  411. MachineCodeTableEntry(bool rexW,
  412. int opcode,
  413. char opcodeLength,
  414. bool operandSizeOverride,
  415. bool vex,
  416. bool vexL,
  417. char vexPP,
  418. char rmReg,
  419. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  420. op1Validator,
  421. OperandEncoding op1Encoding,
  422. OperandRW op1RW,
  423. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  424. op2Validator,
  425. OperandEncoding op2Encoding,
  426. OperandRW op2RW,
  427. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  428. op3Validator,
  429. OperandEncoding op3Encoding,
  430. OperandRW op3RW)
  431. : MachineCodeTableEntry(rexW,
  432. opcode,
  433. opcodeLength,
  434. operandSizeOverride,
  435. vex,
  436. vexL,
  437. vexPP,
  438. rmReg,
  439. op1Validator,
  440. op1Encoding,
  441. op1RW,
  442. op2Validator,
  443. op2Encoding,
  444. op2RW)
  445. {
  446. numArgs = 3;
  447. this->op3Validator = op3Validator;
  448. this->op3Encoding = op3Encoding;
  449. this->op3RW = op3RW;
  450. }
  451. MachineCodeTableEntry(bool rexW,
  452. int opcode,
  453. char opcodeLength,
  454. bool operandSizeOverride,
  455. bool vex,
  456. bool vexL,
  457. char vexPP,
  458. char rmReg,
  459. std::initializer_list<Framework::Assembly::GPRegister>
  460. impliedReadGPRegs,
  461. std::initializer_list<Framework::Assembly::GPRegister>
  462. impliedWriteGPRegs,
  463. std::initializer_list<Framework::Assembly::FPRegister>
  464. impliedReadFPRegs,
  465. std::initializer_list<Framework::Assembly::FPRegister>
  466. impliedWriteFPRegs,
  467. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  468. op1Validator,
  469. OperandEncoding op1Encoding,
  470. OperandRW op1RW,
  471. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  472. op2Validator,
  473. OperandEncoding op2Encoding,
  474. OperandRW op2RW,
  475. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  476. op3Validator,
  477. OperandEncoding op3Encoding,
  478. OperandRW op3RW)
  479. : MachineCodeTableEntry(rexW,
  480. opcode,
  481. opcodeLength,
  482. operandSizeOverride,
  483. vex,
  484. vexL,
  485. vexPP,
  486. rmReg,
  487. impliedReadGPRegs,
  488. impliedWriteGPRegs,
  489. impliedReadFPRegs,
  490. impliedWriteFPRegs,
  491. op1Validator,
  492. op1Encoding,
  493. op1RW,
  494. op2Validator,
  495. op2Encoding,
  496. op2RW)
  497. {
  498. numArgs = 3;
  499. this->op3Validator = op3Validator;
  500. this->op3Encoding = op3Encoding;
  501. this->op3RW = op3RW;
  502. }
  503. MachineCodeTableEntry(bool rexW,
  504. int opcode,
  505. char opcodeLength,
  506. bool operandSizeOverride,
  507. bool vex,
  508. bool vexL,
  509. char vexPP,
  510. char rmReg,
  511. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  512. op1Validator,
  513. OperandEncoding op1Encoding,
  514. OperandRW op1RW,
  515. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  516. op2Validator,
  517. OperandEncoding op2Encoding,
  518. OperandRW op2RW,
  519. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  520. op3Validator,
  521. OperandEncoding op3Encoding,
  522. OperandRW op3RW,
  523. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  524. op4Validator,
  525. OperandEncoding op4Encoding,
  526. OperandRW op4RW)
  527. : MachineCodeTableEntry(rexW,
  528. opcode,
  529. opcodeLength,
  530. operandSizeOverride,
  531. vex,
  532. vexL,
  533. vexPP,
  534. rmReg,
  535. op1Validator,
  536. op1Encoding,
  537. op1RW,
  538. op2Validator,
  539. op2Encoding,
  540. op2RW,
  541. op3Validator,
  542. op3Encoding,
  543. op3RW)
  544. {
  545. numArgs = 4;
  546. this->op4Validator = op4Validator;
  547. this->op4Encoding = op4Encoding;
  548. this->op4RW = op4RW;
  549. }
  550. MachineCodeTableEntry(bool rexW,
  551. int opcode,
  552. char opcodeLength,
  553. bool operandSizeOverride,
  554. bool vex,
  555. bool vexL,
  556. char vexPP,
  557. char rmReg,
  558. std::initializer_list<Framework::Assembly::GPRegister>
  559. impliedReadGPRegs,
  560. std::initializer_list<Framework::Assembly::GPRegister>
  561. impliedWriteGPRegs,
  562. std::initializer_list<Framework::Assembly::FPRegister>
  563. impliedReadFPRegs,
  564. std::initializer_list<Framework::Assembly::FPRegister>
  565. impliedWriteFPRegs,
  566. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  567. op1Validator,
  568. OperandEncoding op1Encoding,
  569. OperandRW op1RW,
  570. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  571. op2Validator,
  572. OperandEncoding op2Encoding,
  573. OperandRW op2RW,
  574. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  575. op3Validator,
  576. OperandEncoding op3Encoding,
  577. OperandRW op3RW,
  578. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  579. op4Validator,
  580. OperandEncoding op4Encoding,
  581. OperandRW op4RW)
  582. : MachineCodeTableEntry(rexW,
  583. opcode,
  584. opcodeLength,
  585. operandSizeOverride,
  586. vex,
  587. vexL,
  588. vexPP,
  589. rmReg,
  590. impliedReadGPRegs,
  591. impliedWriteGPRegs,
  592. impliedReadFPRegs,
  593. impliedWriteFPRegs,
  594. op1Validator,
  595. op1Encoding,
  596. op1RW,
  597. op2Validator,
  598. op2Encoding,
  599. op2RW,
  600. op3Validator,
  601. op3Encoding,
  602. op3RW)
  603. {
  604. numArgs = 4;
  605. this->op4Validator = op4Validator;
  606. this->op4Encoding = op4Encoding;
  607. this->op4RW = op4RW;
  608. }
  609. MachineCodeTableEntry(const MachineCodeTableEntry& other) = default;
  610. bool matches(int numArgs,
  611. const std::vector<Framework::Assembly::OperationArgument*>& args) const
  612. {
  613. if (numArgs != this->numArgs)
  614. {
  615. return false;
  616. }
  617. if (numArgs >= 1 && !op1Validator(*args[0]))
  618. {
  619. return false;
  620. }
  621. if (numArgs >= 2 && !op2Validator(*args[1]))
  622. {
  623. return false;
  624. }
  625. if (numArgs >= 3 && !op3Validator(*args[2]))
  626. {
  627. return false;
  628. }
  629. if (numArgs >= 4 && !op4Validator(*args[3]))
  630. {
  631. return false;
  632. }
  633. return true;
  634. }
  635. OperandRW getOperandRW(int index) const
  636. {
  637. switch (index)
  638. {
  639. case 0:
  640. return op1RW;
  641. case 1:
  642. return op2RW;
  643. case 2:
  644. return op3RW;
  645. case 3:
  646. return op4RW;
  647. default:
  648. return NONE;
  649. }
  650. }
  651. const std::vector<Framework::Assembly::GPRegister>&
  652. getImpliedReadGPRegs() const
  653. {
  654. return impliedReadGPRegs;
  655. }
  656. const std::vector<Framework::Assembly::GPRegister>&
  657. getImpliedWriteGPRegs() const
  658. {
  659. return impliedWriteGPRegs;
  660. }
  661. const std::vector<Framework::Assembly::FPRegister>&
  662. getImpliedReadFPRegs() const
  663. {
  664. return impliedReadFPRegs;
  665. }
  666. const std::vector<Framework::Assembly::FPRegister>&
  667. getImpliedWriteFPRegs() const
  668. {
  669. return impliedWriteFPRegs;
  670. }
  671. friend class OperationCodeTable;
  672. };
  673. class OperationCodeTable : public Framework::ReferenceCounter
  674. {
  675. public:
  676. thread_local static Framework::RCArray<OperationCodeTable>
  677. machineCodeTranslationTable;
  678. private:
  679. Framework::Assembly::Operation op;
  680. std::vector<MachineCodeTableEntry> entries;
  681. public:
  682. OperationCodeTable(Framework::Assembly::Operation op,
  683. std::initializer_list<MachineCodeTableEntry> entries)
  684. : ReferenceCounter(),
  685. op(op),
  686. entries(entries)
  687. {}
  688. MachineCodeInstruction getInstruction(
  689. const std::vector<Framework::Assembly::OperationArgument*>& args,
  690. const Framework::Assembly::AssemblyBlock* codeBlock,
  691. const Framework::Assembly::Instruction* current)
  692. {
  693. MachineCodeInstruction result;
  694. memset(&result, 0, sizeof(MachineCodeInstruction));
  695. const MachineCodeTableEntry& entry = getEntry(args, codeBlock, current);
  696. result.needsVex = entry.vex;
  697. result.vexL = entry.vexL;
  698. result.vexPP = entry.vexPP;
  699. result.needsRex = entry.rexW;
  700. result.exWE = entry.rexW;
  701. result.modRM = entry.rmReg << 3;
  702. if (entry.rmReg)
  703. {
  704. result.needsModRM = true;
  705. }
  706. memcpy(result.opcode, entry.opcode, 3);
  707. result.opcodeLength = entry.opcodeLength;
  708. result.operandSizeOverride = entry.operandSizeOverride;
  709. for (int i = 0; i < args.size(); i++)
  710. {
  711. OperandEncoding encoding = UNDEFINED;
  712. switch (i)
  713. {
  714. case 0:
  715. encoding = entry.op1Encoding;
  716. break;
  717. case 1:
  718. encoding = entry.op2Encoding;
  719. break;
  720. case 2:
  721. encoding = entry.op3Encoding;
  722. break;
  723. case 3:
  724. encoding = entry.op4Encoding;
  725. break;
  726. }
  727. switch (encoding)
  728. {
  729. case MODRM_REG:
  730. encodeModRM_REG(result, args[i], i + 1);
  731. break;
  732. case MODRM_RM:
  733. encodeModRM_RM(result, args[i], i + 1);
  734. break;
  735. case VEX_VVVV:
  736. encodeVex_VVVV(result, args[i], i + 1);
  737. break;
  738. case OPCODE_RD:
  739. encodeOpcode_RD(result, args[i], i + 1);
  740. break;
  741. case IMM8:
  742. encodeIMM8(result, args[i], i + 1);
  743. break;
  744. case IMM16:
  745. encodeIMM16(result, args[i], i + 1);
  746. break;
  747. case IMM32:
  748. encodeIMM32(result, args[i], i + 1);
  749. break;
  750. case IMM64:
  751. encodeIMM64(result, args[i], i + 1);
  752. break;
  753. }
  754. }
  755. if (result.errIfNoRex && !result.needsRex)
  756. {
  757. Framework::Text* err = new Framework::Text();
  758. err->append() << "Instruction " << op
  759. << " has no REX prefix and can not address "
  760. "LOWER8 of registers RSP, RBP, RSI or RDI";
  761. throw err->getText();
  762. }
  763. if (result.errIfRex && result.needsRex)
  764. {
  765. Framework::Text* err = new Framework::Text();
  766. err->append() << "Instruction " << op
  767. << " has a REX prefix and can not address "
  768. "HIGHER8 of registers RAX, RBX, RCX or RDX";
  769. throw err->getText();
  770. }
  771. return result;
  772. }
  773. virtual MachineCodeTableEntry& getEntry(
  774. const std::vector<Framework::Assembly::OperationArgument*>& args,
  775. const Framework::Assembly::AssemblyBlock* codeBlock,
  776. const Framework::Assembly::Instruction* current)
  777. {
  778. MachineCodeInstruction result;
  779. memset(&result, 0, sizeof(MachineCodeInstruction));
  780. for (MachineCodeTableEntry& entry : entries)
  781. {
  782. if (entry.matches((int)args.size(), args))
  783. {
  784. return entry;
  785. }
  786. }
  787. Framework::Text err;
  788. err.append() << "operation " << (int)op
  789. << " not found in translation table. args: \n";
  790. for (auto arg : args)
  791. {
  792. err.append() << " " << typeid(*arg).name() << "\n";
  793. }
  794. throw err.getText();
  795. }
  796. Framework::Assembly::Operation getOperation() const
  797. {
  798. return op;
  799. }
  800. void encodeModRM_REG(MachineCodeInstruction& result,
  801. const Framework::Assembly::OperationArgument* arg,
  802. int index) const
  803. {
  804. result.needsModRM = true;
  805. const Framework::Assembly::GPRegisterArgument* gpRegArg
  806. = arg->asGPRegisterArgument();
  807. const Framework::Assembly::FPRegisterArgument* fpRegArg
  808. = arg->asFPRegisterArgument();
  809. if (gpRegArg)
  810. {
  811. encodeModRM_REG_GP(result, gpRegArg, index);
  812. }
  813. else if (fpRegArg)
  814. {
  815. encodeModRM_REG_FP(result, fpRegArg, index);
  816. }
  817. else
  818. {
  819. Framework::Text* err = new Framework::Text();
  820. err->append()
  821. << "Invalid argument type for operand " << index
  822. << " for operation " << op << " encoded as MODRM_REG: found "
  823. << typeid(*arg).name()
  824. << " but expected GPRegisterArgument or FPRegisterArgument";
  825. throw err->getText();
  826. }
  827. }
  828. void encodeModRM_REG_GP(MachineCodeInstruction& result,
  829. const Framework::Assembly::GPRegisterArgument* arg,
  830. int index) const
  831. {
  832. Framework::Assembly::GPRegister reg = arg->getRegister();
  833. if (reg >= Framework::Assembly::R8)
  834. {
  835. result.needsRex = true;
  836. result.exR = 1;
  837. }
  838. if (arg->getPart() == Framework::Assembly::GPRegisterPart::HIGHER8)
  839. {
  840. if (reg == Framework::Assembly::RAX)
  841. {
  842. result.modRM |= 0b100000;
  843. result.errIfRex = true;
  844. }
  845. else if (reg == Framework::Assembly::RBX)
  846. {
  847. result.modRM |= 0b111000;
  848. result.errIfRex = true;
  849. }
  850. else if (reg == Framework::Assembly::RCX)
  851. {
  852. result.modRM |= 0b101000;
  853. result.errIfRex = true;
  854. }
  855. else if (reg == Framework::Assembly::RDX)
  856. {
  857. result.modRM |= 0b110000;
  858. result.errIfRex = true;
  859. }
  860. else
  861. {
  862. Framework::Text* err = new Framework::Text();
  863. err->append() << "Invalid argument for operand " << index
  864. << " for operation " << op
  865. << " HIGHER8 can only be used for registers RAX, "
  866. "RBX, RCX or RDX";
  867. }
  868. }
  869. else
  870. {
  871. result.modRM |= (reg & 0b111) << 3;
  872. }
  873. if (arg->getPart() == Framework::Assembly::GPRegisterPart::LOWER8
  874. && (reg == Framework::Assembly::RSP
  875. || reg == Framework::Assembly::RBP
  876. || reg == Framework::Assembly::RSI
  877. || reg == Framework::Assembly::RDI))
  878. {
  879. result.errIfNoRex = true;
  880. }
  881. }
  882. void encodeModRM_REG_FP(MachineCodeInstruction& result,
  883. const Framework::Assembly::FPRegisterArgument* arg,
  884. int index) const
  885. {
  886. Framework::Assembly::FPRegister reg = arg->getRegister();
  887. if (reg >= Framework::Assembly::MM8)
  888. {
  889. result.needsRex = true;
  890. result.exR = 1;
  891. }
  892. result.modRM |= (reg & 0b111) << 3;
  893. }
  894. void encodeModRM_RM(MachineCodeInstruction& result,
  895. const Framework::Assembly::OperationArgument* arg,
  896. int index) const
  897. {
  898. result.needsModRM = true;
  899. const Framework::Assembly::GPRegisterArgument* gpRegArg
  900. = arg->asGPRegisterArgument();
  901. const Framework::Assembly::FPRegisterArgument* fpRegArg
  902. = arg->asFPRegisterArgument();
  903. const Framework::Assembly::MemoryAccessArgument* memArg
  904. = arg->asMemoryAccessArgument();
  905. if (gpRegArg)
  906. {
  907. encodeModRM_RM_GP(result, gpRegArg, index);
  908. }
  909. else if (fpRegArg)
  910. {
  911. encodeModRM_RM_FP(result, fpRegArg, index);
  912. }
  913. else if (memArg)
  914. {
  915. encodeModRM_RM_Mem(result, memArg, index);
  916. }
  917. else
  918. {
  919. Framework::Text* err = new Framework::Text();
  920. err->append()
  921. << "Invalid argument type for operand " << index
  922. << " for operation " << op << " encoded as MODRM_RM: found "
  923. << typeid(*arg).name()
  924. << " but expected GPRegisterArgument, FPRegisterArgument "
  925. "or MemoryAccessArgument";
  926. throw err->getText();
  927. }
  928. }
  929. void encodeModRM_RM_GP(MachineCodeInstruction& result,
  930. const Framework::Assembly::GPRegisterArgument* arg,
  931. int index) const
  932. {
  933. Framework::Assembly::GPRegister reg = arg->getRegister();
  934. if (reg >= Framework::Assembly::R8)
  935. {
  936. result.needsRex = true;
  937. result.exB = 1;
  938. }
  939. result.modRM |= 0b11 << 6; // direct register access
  940. if (arg->getPart() == Framework::Assembly::GPRegisterPart::HIGHER8)
  941. {
  942. if (reg == Framework::Assembly::RAX)
  943. {
  944. result.modRM |= 0b100;
  945. result.errIfRex = true;
  946. }
  947. else if (reg == Framework::Assembly::RBX)
  948. {
  949. result.modRM |= 0b111;
  950. result.errIfRex = true;
  951. }
  952. else if (reg == Framework::Assembly::RCX)
  953. {
  954. result.modRM |= 0b101;
  955. result.errIfRex = true;
  956. }
  957. else if (reg == Framework::Assembly::RDX)
  958. {
  959. result.modRM |= 0b110;
  960. result.errIfRex = true;
  961. }
  962. else
  963. {
  964. Framework::Text* err = new Framework::Text();
  965. err->append() << "Invalid argument for operand " << index
  966. << " for operation " << op
  967. << " HIGHER8 can only be used for registers RAX, "
  968. "RBX, RCX or RDX";
  969. }
  970. }
  971. else
  972. {
  973. result.modRM |= reg & 0b111;
  974. }
  975. if (arg->getPart() == Framework::Assembly::GPRegisterPart::LOWER8
  976. && (reg == Framework::Assembly::RSP
  977. || reg == Framework::Assembly::RBP
  978. || reg == Framework::Assembly::RSI
  979. || reg == Framework::Assembly::RDI))
  980. {
  981. result.errIfNoRex = true;
  982. }
  983. }
  984. void encodeModRM_RM_FP(MachineCodeInstruction& result,
  985. const Framework::Assembly::FPRegisterArgument* arg,
  986. int index) const
  987. {
  988. Framework::Assembly::FPRegister reg = arg->getRegister();
  989. if (reg >= Framework::Assembly::MM8)
  990. {
  991. result.needsRex = true;
  992. result.exB = 1;
  993. }
  994. result.modRM |= 0b11 << 6; // direct register access
  995. result.modRM |= reg & 0b111;
  996. }
  997. void encodeModRM_RM_Mem(MachineCodeInstruction& result,
  998. const Framework::Assembly::MemoryAccessArgument* arg,
  999. int index) const
  1000. {
  1001. if (arg->isUsingAddressRegister() || arg->isUsingOffsetRegister())
  1002. {
  1003. Framework::Assembly::GPRegister reg = arg->isUsingAddressRegister()
  1004. ? arg->getAddressRegister()
  1005. : arg->getOffsetRegister();
  1006. if (arg->isUsingAddressRegister() && arg->isUsingOffsetRegister())
  1007. {
  1008. // SIB needed
  1009. result.sibNeeded = true;
  1010. result.modRM |= 0b100 << 3; // indicate SIB
  1011. if (reg >= Framework::Assembly::R8)
  1012. {
  1013. result.needsRex = true;
  1014. result.exB = 1;
  1015. }
  1016. result.sib |= reg & 0b111;
  1017. Framework::Assembly::GPRegister offsetReg
  1018. = arg->getOffsetRegister();
  1019. if (offsetReg == Framework::Assembly::RSP)
  1020. {
  1021. Framework::Text* err = new Framework::Text();
  1022. err->append() << "Invalid argument for operand " << index
  1023. << " for operation " << op
  1024. << " RSP can not be used as index register";
  1025. throw err->getText();
  1026. }
  1027. if (offsetReg >= Framework::Assembly::R8)
  1028. {
  1029. result.needsRex = true;
  1030. result.exX = 1;
  1031. }
  1032. result.sib |= (offsetReg & 0b111) << 3; // index register
  1033. }
  1034. else
  1035. {
  1036. if (reg >= Framework::Assembly::R8)
  1037. {
  1038. result.needsRex = true;
  1039. result.exB = 1;
  1040. }
  1041. result.modRM |= reg & 0b111;
  1042. }
  1043. int offset = arg->getOffset();
  1044. if (offset > 0)
  1045. {
  1046. if (offset <= 127 && offset >= -128)
  1047. {
  1048. result.modRM |= 0b01 << 6; // 8 bit displacement
  1049. result.disp[0] = (char)offset;
  1050. result.dispLength = 1;
  1051. }
  1052. else
  1053. {
  1054. result.modRM |= 0b10 << 6; // 32 bit displacement
  1055. memcpy(result.disp, &offset, 4);
  1056. }
  1057. }
  1058. else
  1059. {
  1060. if ((result.modRM & 0b111) == 0b101)
  1061. {
  1062. // special case: EBP or R13 as
  1063. // address register needs disp8=0
  1064. result.modRM |= 0b01 << 6; // 8 bit displacement
  1065. result.disp[0] = 0;
  1066. result.dispLength = 1;
  1067. }
  1068. }
  1069. }
  1070. else
  1071. {
  1072. result.modRM |= 0b100;
  1073. result.sibNeeded = true;
  1074. result.sib = 0b00100101; // no base, no index only
  1075. // disp32
  1076. int offset = arg->getOffset();
  1077. memcpy(result.disp, &offset, 4);
  1078. result.dispLength = 4;
  1079. }
  1080. }
  1081. void encodeVex_VVVV(MachineCodeInstruction& result,
  1082. const Framework::Assembly::OperationArgument* arg,
  1083. int index) const
  1084. {
  1085. const Framework::Assembly::FPRegisterArgument* fpRegArg
  1086. = arg->asFPRegisterArgument();
  1087. if (fpRegArg)
  1088. {
  1089. encodeVex_VVVV_FP(result, fpRegArg, index);
  1090. }
  1091. else
  1092. {
  1093. Framework::Text* err = new Framework::Text();
  1094. err->append() << "Invalid argument type for operand " << index
  1095. << " for operation " << op
  1096. << " encoded as VEX_VVVV: found "
  1097. << typeid(*arg).name()
  1098. << " but expected FPRegisterArgument";
  1099. throw err->getText();
  1100. }
  1101. }
  1102. void encodeVex_VVVV_FP(MachineCodeInstruction& result,
  1103. const Framework::Assembly::FPRegisterArgument* arg,
  1104. int index) const
  1105. {
  1106. Framework::Assembly::FPRegister reg = arg->getRegister();
  1107. result.vexVVVV = reg & 0b1111;
  1108. result.needsVex = true;
  1109. }
  1110. void encodeOpcode_RD(MachineCodeInstruction& result,
  1111. const Framework::Assembly::OperationArgument* arg,
  1112. int index) const
  1113. {
  1114. const Framework::Assembly::GPRegisterArgument* gpRegArg
  1115. = arg->asGPRegisterArgument();
  1116. if (gpRegArg)
  1117. {
  1118. encodeOpcode_RD_GP(result, gpRegArg, index);
  1119. }
  1120. else
  1121. {
  1122. Framework::Text* err = new Framework::Text();
  1123. err->append() << "Invalid argument type for operand " << index
  1124. << " for operation " << op
  1125. << " encoded as OPCODE_RD: found "
  1126. << typeid(*arg).name()
  1127. << " but expected GPRegisterArgument";
  1128. throw err->getText();
  1129. }
  1130. }
  1131. void encodeOpcode_RD_GP(MachineCodeInstruction& result,
  1132. const Framework::Assembly::GPRegisterArgument* arg,
  1133. int index) const
  1134. {
  1135. Framework::Assembly::GPRegister reg = arg->getRegister();
  1136. if (reg >= Framework::Assembly::R8)
  1137. {
  1138. result.needsRex = true;
  1139. result.exB = 1;
  1140. }
  1141. result.opcode[result.opcodeLength - 1] |= reg & 0b111;
  1142. }
  1143. void encodeIMM8(MachineCodeInstruction& result,
  1144. Framework::Assembly::OperationArgument* arg,
  1145. int index) const
  1146. {
  1147. result.immLength = 1;
  1148. const Framework::Assembly::ConstantArgument* constArg
  1149. = arg->asConstantArgument();
  1150. if (constArg == 0)
  1151. {
  1152. Framework::Text* err = new Framework::Text();
  1153. err->append() << "Invalid argument type for operand " << index
  1154. << " for operation " << op
  1155. << " encoded as IMM8: found " << typeid(*arg).name()
  1156. << " but expected ConstantArgument";
  1157. throw err->getText();
  1158. }
  1159. int value = (int)constArg->getValue();
  1160. int len = (int)constArg->getSize();
  1161. if (len > 1)
  1162. {
  1163. Framework::Text* err = new Framework::Text();
  1164. err->append() << "Constant size too large for operand " << index
  1165. << " for operation " << op
  1166. << " encoded as IMM8: found size " << len
  1167. << " but expected size BYTE";
  1168. throw err->getText();
  1169. }
  1170. result.imm[0] = (char)(value);
  1171. result.immLength = 1;
  1172. }
  1173. void encodeIMM16(MachineCodeInstruction& result,
  1174. Framework::Assembly::OperationArgument* arg,
  1175. int index) const
  1176. {
  1177. result.immLength = 1;
  1178. const Framework::Assembly::ConstantArgument* constArg
  1179. = arg->asConstantArgument();
  1180. if (constArg == 0)
  1181. {
  1182. Framework::Text* err = new Framework::Text();
  1183. err->append() << "Invalid argument type for operand " << index
  1184. << " for operation " << op
  1185. << " encoded as IMM8: found " << typeid(*arg).name()
  1186. << " but expected ConstantArgument";
  1187. throw err->getText();
  1188. }
  1189. int value = (int)constArg->getValue();
  1190. int len = (int)constArg->getSize();
  1191. if (len > 2)
  1192. {
  1193. Framework::Text* err = new Framework::Text();
  1194. err->append() << "Constant size too large for operand " << index
  1195. << " for operation " << op
  1196. << " encoded as IMM8: found size " << len
  1197. << " but expected size range [BYTE, WORD]";
  1198. throw err->getText();
  1199. }
  1200. short val = (short)(value);
  1201. memcpy(result.imm, &val, 2);
  1202. result.immLength = 2;
  1203. }
  1204. void encodeIMM32(MachineCodeInstruction& result,
  1205. Framework::Assembly::OperationArgument* arg,
  1206. int index) const
  1207. {
  1208. result.immLength = 1;
  1209. const Framework::Assembly::ConstantArgument* constArg
  1210. = arg->asConstantArgument();
  1211. if (constArg == 0)
  1212. {
  1213. Framework::Text* err = new Framework::Text();
  1214. err->append() << "Invalid argument type for operand " << index
  1215. << " for operation " << op
  1216. << " encoded as IMM8: found " << typeid(*arg).name()
  1217. << " but expected ConstantArgument";
  1218. throw err->getText();
  1219. }
  1220. int value = (int)constArg->getValue();
  1221. int len = (int)constArg->getSize();
  1222. if (len > 4)
  1223. {
  1224. Framework::Text* err = new Framework::Text();
  1225. err->append() << "Constant size too large for operand " << index
  1226. << " for operation " << op
  1227. << " encoded as IMM8: found size " << len
  1228. << " but expected size range [BYTE, DWORD]";
  1229. throw err->getText();
  1230. }
  1231. memcpy(result.imm, &value, 4);
  1232. result.immLength = 4;
  1233. }
  1234. void encodeIMM64(MachineCodeInstruction& result,
  1235. Framework::Assembly::OperationArgument* arg,
  1236. int index) const
  1237. {
  1238. result.immLength = 1;
  1239. const Framework::Assembly::ConstantArgument* constArg
  1240. = arg->asConstantArgument();
  1241. if (constArg == 0)
  1242. {
  1243. Framework::Text* err = new Framework::Text();
  1244. err->append() << "Invalid argument type for operand " << index
  1245. << " for operation " << op
  1246. << " encoded as IMM8: found " << typeid(*arg).name()
  1247. << " but expected ConstantArgument";
  1248. throw err->getText();
  1249. }
  1250. __int64 value = constArg->getValue();
  1251. int len = (int)constArg->getSize();
  1252. if (len > 8)
  1253. {
  1254. Framework::Text* err = new Framework::Text();
  1255. err->append() << "Constant size too large for operand " << index
  1256. << " for operation " << op
  1257. << " encoded as IMM8: found size " << len
  1258. << " but expected size range [BYTE, QWORD]";
  1259. throw err->getText();
  1260. }
  1261. memcpy(result.imm, &value, 8);
  1262. result.immLength = 8;
  1263. }
  1264. };
  1265. class JumpOperationCodeTable : public OperationCodeTable
  1266. {
  1267. private:
  1268. char opCodeLength;
  1269. bool inGetEntry;
  1270. public:
  1271. JumpOperationCodeTable(Framework::Assembly::Operation op,
  1272. char opCodeLength,
  1273. std::initializer_list<MachineCodeTableEntry> entries)
  1274. : OperationCodeTable(op, entries),
  1275. opCodeLength(opCodeLength)
  1276. {}
  1277. virtual MachineCodeTableEntry& getEntry(
  1278. const std::vector<Framework::Assembly::OperationArgument*>& args,
  1279. const Framework::Assembly::AssemblyBlock* codeBlock,
  1280. const Framework::Assembly::Instruction* current) override
  1281. {
  1282. if (inGetEntry)
  1283. {
  1284. // recursion can only happen during size calculation so we just
  1285. // create a dummy const argument for each jump target
  1286. std::vector<Framework::Assembly::OperationArgument*> newArgs;
  1287. std::vector<Framework::Assembly::OperationArgument*>
  1288. transformedArgs;
  1289. for (Framework::Assembly::OperationArgument* arg : args)
  1290. {
  1291. if (arg->asJumpTargetArgument())
  1292. {
  1293. Framework::Assembly::ConstantArgument* constArg
  1294. = new Framework::Assembly::ConstantArgument(0);
  1295. transformedArgs.push_back(constArg);
  1296. newArgs.push_back(constArg);
  1297. }
  1298. else
  1299. {
  1300. transformedArgs.push_back(arg);
  1301. }
  1302. }
  1303. MachineCodeTableEntry& result = OperationCodeTable::getEntry(
  1304. transformedArgs, codeBlock, current);
  1305. for (Framework::Assembly::OperationArgument* arg : newArgs)
  1306. {
  1307. delete arg;
  1308. }
  1309. return result;
  1310. }
  1311. inGetEntry = 1;
  1312. std::vector<Framework::Assembly::OperationArgument*> newArgs;
  1313. std::vector<Framework::Assembly::OperationArgument*> transformedArgs;
  1314. for (Framework::Assembly::OperationArgument* arg : args)
  1315. {
  1316. if (arg->asJumpTargetArgument())
  1317. {
  1318. Framework::Text label = arg->asJumpTargetArgument()->getLabel();
  1319. bool currentFound = false;
  1320. bool labelFound = false;
  1321. bool backwords = false;
  1322. int jumpLength = 0;
  1323. // search for the label
  1324. for (const Framework::Assembly::Instruction* instr :
  1325. codeBlock->getInstructions())
  1326. {
  1327. if (instr == current)
  1328. {
  1329. currentFound = true;
  1330. if (labelFound)
  1331. {
  1332. break;
  1333. }
  1334. else
  1335. {
  1336. backwords = true;
  1337. }
  1338. continue;
  1339. }
  1340. if (instr->definesLabel(label))
  1341. {
  1342. labelFound = true;
  1343. if (currentFound)
  1344. {
  1345. break;
  1346. }
  1347. continue;
  1348. }
  1349. if (labelFound || currentFound)
  1350. {
  1351. jumpLength += instr->compiledSize(codeBlock);
  1352. }
  1353. }
  1354. if (backwords)
  1355. {
  1356. jumpLength = -jumpLength - 4 - opCodeLength;
  1357. }
  1358. Framework::Assembly::ConstantArgument* constArg
  1359. = new Framework::Assembly::ConstantArgument(jumpLength);
  1360. transformedArgs.push_back(constArg);
  1361. newArgs.push_back(constArg);
  1362. }
  1363. else
  1364. {
  1365. transformedArgs.push_back(arg);
  1366. }
  1367. }
  1368. MachineCodeTableEntry& result
  1369. = OperationCodeTable::getEntry(transformedArgs, codeBlock, current);
  1370. for (Framework::Assembly::OperationArgument* arg : newArgs)
  1371. {
  1372. delete arg;
  1373. }
  1374. return result;
  1375. }
  1376. };
  1377. thread_local Framework::RCArray<OperationCodeTable>
  1378. OperationCodeTable::machineCodeTranslationTable;
  1379. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  1380. isGPRegister(Framework::Assembly::MemoryBlockSize size)
  1381. {
  1382. return [size](const Framework::Assembly::OperationArgument& arg) {
  1383. return arg.asGPRegisterArgument() != 0
  1384. && ((size == Framework::Assembly::MemoryBlockSize::BYTE
  1385. && (arg.asGPRegisterArgument()->getPart()
  1386. == Framework::Assembly::LOWER8
  1387. || arg.asGPRegisterArgument()->getPart()
  1388. == Framework::Assembly::HIGHER8))
  1389. || (size == Framework::Assembly::MemoryBlockSize::WORD
  1390. && arg.asGPRegisterArgument()->getPart()
  1391. == Framework::Assembly::LOWER16)
  1392. || (size == Framework::Assembly::MemoryBlockSize::DWORD
  1393. && arg.asGPRegisterArgument()->getPart()
  1394. == Framework::Assembly::LOWER32)
  1395. || (size == Framework::Assembly::MemoryBlockSize::QWORD
  1396. && arg.asGPRegisterArgument()->getPart()
  1397. == Framework::Assembly::FULL64));
  1398. };
  1399. }
  1400. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  1401. isSpecificGPRegister(Framework::Assembly::GPRegister reg,
  1402. Framework::Assembly::GPRegisterPart part)
  1403. {
  1404. return [reg, part](const Framework::Assembly::OperationArgument& arg) {
  1405. return arg.asGPRegisterArgument() != 0
  1406. && arg.asGPRegisterArgument()->getRegister() == reg
  1407. && arg.asGPRegisterArgument()->getPart() == part;
  1408. };
  1409. }
  1410. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  1411. isGPRegisterOrMemoryAccess(Framework::Assembly::MemoryBlockSize size)
  1412. {
  1413. return [size](const Framework::Assembly::OperationArgument& arg) {
  1414. return isGPRegister(size)(arg)
  1415. || arg.asMemoryAccessArgument()
  1416. && arg.asMemoryAccessArgument()->getBlockSize() == size;
  1417. };
  1418. }
  1419. std::function<bool(const Framework::Assembly::OperationArgument& arg)> isIMM()
  1420. {
  1421. return [](const Framework::Assembly::OperationArgument& arg) {
  1422. return arg.asConstantArgument();
  1423. };
  1424. }
  1425. std::function<bool(const Framework::Assembly::OperationArgument& arg)> isIMM(
  1426. Framework::Assembly::MemoryBlockSize maxSize)
  1427. {
  1428. return [maxSize](const Framework::Assembly::OperationArgument& arg) {
  1429. return arg.asConstantArgument()
  1430. && arg.asConstantArgument()->getSize() <= maxSize;
  1431. };
  1432. }
  1433. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  1434. isFPRegister(Framework::Assembly::MemoryBlockSize size)
  1435. {
  1436. return [size](const Framework::Assembly::OperationArgument& arg) {
  1437. return arg.asFPRegisterArgument() != 0
  1438. && ((size == Framework::Assembly::MemoryBlockSize::M128
  1439. && arg.asFPRegisterArgument()->getPart()
  1440. == Framework::Assembly::X)
  1441. || (size == Framework::Assembly::MemoryBlockSize::M256
  1442. && arg.asFPRegisterArgument()->getPart()
  1443. == Framework::Assembly::Y)
  1444. /*
  1445. || (size == Framework::Assembly::MemoryBlockSize::M512
  1446. && arg.asFPRegisterArgument()->getPart()
  1447. == Framework::Assembly::Z)*/);
  1448. };
  1449. }
  1450. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  1451. isFPRegisterOrMEmoryAccess(Framework::Assembly::MemoryBlockSize size)
  1452. {
  1453. return [size](const Framework::Assembly::OperationArgument& arg) {
  1454. return isFPRegister(size)
  1455. || (arg.asMemoryAccessArgument()
  1456. && arg.asMemoryAccessArgument()->getBlockSize() == size);
  1457. };
  1458. }
  1459. std::function<bool(const Framework::Assembly::OperationArgument& arg)>
  1460. isFPRegisterOrMEmoryAccess(Framework::Assembly::MemoryBlockSize regSize,
  1461. Framework::Assembly::MemoryBlockSize memSize)
  1462. {
  1463. return
  1464. [regSize, memSize](const Framework::Assembly::OperationArgument& arg) {
  1465. return isFPRegister(regSize)
  1466. || (arg.asMemoryAccessArgument()
  1467. && arg.asMemoryAccessArgument()->getBlockSize() == memSize);
  1468. };
  1469. }
  1470. void __intializeMachineCodeTranslationTable()
  1471. {
  1472. if (!OperationCodeTable::machineCodeTranslationTable.getEintragAnzahl())
  1473. {
  1474. OperationCodeTable::machineCodeTranslationTable.add(
  1475. new OperationCodeTable(Framework::Assembly::ADD,
  1476. {// ADD AL, IMM8
  1477. MachineCodeTableEntry(false,
  1478. 0x04,
  1479. (char)1,
  1480. false,
  1481. false,
  1482. false,
  1483. 0,
  1484. 0,
  1485. isSpecificGPRegister(Framework::Assembly::RAX,
  1486. Framework::Assembly::LOWER8),
  1487. UNDEFINED,
  1488. READWRITE,
  1489. isIMM(),
  1490. IMM8,
  1491. READ),
  1492. // ADD AX, IMM16
  1493. MachineCodeTableEntry(false,
  1494. 0x05,
  1495. (char)1,
  1496. true,
  1497. false,
  1498. false,
  1499. 0,
  1500. 0,
  1501. isSpecificGPRegister(Framework::Assembly::RAX,
  1502. Framework::Assembly::LOWER16),
  1503. UNDEFINED,
  1504. READWRITE,
  1505. isIMM(),
  1506. IMM16,
  1507. READ),
  1508. // ADD EAX, IMM32
  1509. MachineCodeTableEntry(
  1510. false,
  1511. 0x05,
  1512. (char)1,
  1513. false,
  1514. false,
  1515. false,
  1516. 0,
  1517. 0,
  1518. isSpecificGPRegister(Framework::Assembly::RAX,
  1519. Framework::Assembly::LOWER32),
  1520. UNDEFINED,
  1521. READWRITE,
  1522. [](const Framework::Assembly::OperationArgument& arg) {
  1523. return arg.asConstantArgument() != 0;
  1524. },
  1525. IMM32,
  1526. READ),
  1527. // ADD RAX, IMM32
  1528. MachineCodeTableEntry(true,
  1529. 0x05,
  1530. (char)1,
  1531. false,
  1532. false,
  1533. false,
  1534. 0,
  1535. 0,
  1536. isSpecificGPRegister(Framework::Assembly::RAX,
  1537. Framework::Assembly::FULL64),
  1538. UNDEFINED,
  1539. READWRITE,
  1540. isIMM(),
  1541. IMM32,
  1542. READ),
  1543. // ADD r/m8, IMM8
  1544. MachineCodeTableEntry(false,
  1545. 0x80,
  1546. (char)1,
  1547. false,
  1548. false,
  1549. false,
  1550. 0,
  1551. 0,
  1552. isGPRegisterOrMemoryAccess(
  1553. Framework::Assembly::MemoryBlockSize::BYTE),
  1554. MODRM_RM,
  1555. READWRITE,
  1556. isIMM(),
  1557. IMM8,
  1558. READ),
  1559. // ADD r/m16, IMM8
  1560. MachineCodeTableEntry(false,
  1561. 0x83,
  1562. (char)1,
  1563. true,
  1564. false,
  1565. false,
  1566. 0,
  1567. 0,
  1568. isGPRegisterOrMemoryAccess(
  1569. Framework::Assembly::MemoryBlockSize::WORD),
  1570. MODRM_RM,
  1571. READWRITE,
  1572. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  1573. IMM8,
  1574. READ),
  1575. // ADD r/m32, IMM8
  1576. MachineCodeTableEntry(false,
  1577. 0x83,
  1578. (char)1,
  1579. false,
  1580. false,
  1581. false,
  1582. 0,
  1583. 0,
  1584. isGPRegisterOrMemoryAccess(
  1585. Framework::Assembly::MemoryBlockSize::DWORD),
  1586. MODRM_RM,
  1587. READWRITE,
  1588. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  1589. IMM8,
  1590. READ),
  1591. // ADD r/m64, IMM8
  1592. MachineCodeTableEntry(true,
  1593. 0x83,
  1594. (char)1,
  1595. false,
  1596. false,
  1597. false,
  1598. 0,
  1599. 0,
  1600. isGPRegisterOrMemoryAccess(
  1601. Framework::Assembly::MemoryBlockSize::QWORD),
  1602. MODRM_RM,
  1603. READWRITE,
  1604. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  1605. IMM8,
  1606. READ),
  1607. // ADD r/m16, IMM16
  1608. MachineCodeTableEntry(
  1609. false,
  1610. 0x81,
  1611. (char)1,
  1612. true,
  1613. false,
  1614. false,
  1615. 0,
  1616. 0,
  1617. isGPRegisterOrMemoryAccess(
  1618. Framework::Assembly::MemoryBlockSize::WORD),
  1619. MODRM_RM,
  1620. READWRITE,
  1621. [](const Framework::Assembly::OperationArgument& arg) {
  1622. return arg.asConstantArgument()
  1623. && arg.asConstantArgument()->getSize()
  1624. != Framework::Assembly::MemoryBlockSize::
  1625. BYTE;
  1626. },
  1627. IMM16,
  1628. READ),
  1629. // ADD r/m32, IMM32
  1630. MachineCodeTableEntry(
  1631. false,
  1632. 0x81,
  1633. (char)1,
  1634. false,
  1635. false,
  1636. false,
  1637. 0,
  1638. 0,
  1639. isGPRegisterOrMemoryAccess(
  1640. Framework::Assembly::MemoryBlockSize::DWORD),
  1641. MODRM_RM,
  1642. READWRITE,
  1643. [](const Framework::Assembly::OperationArgument& arg) {
  1644. return arg.asConstantArgument() != 0
  1645. && arg.asConstantArgument()->getSize()
  1646. != Framework::Assembly::MemoryBlockSize::
  1647. BYTE;
  1648. },
  1649. IMM32,
  1650. READ),
  1651. // ADD r/m64, IMM32
  1652. MachineCodeTableEntry(
  1653. true,
  1654. 0x81,
  1655. (char)1,
  1656. false,
  1657. false,
  1658. false,
  1659. 0,
  1660. 0,
  1661. isGPRegisterOrMemoryAccess(
  1662. Framework::Assembly::MemoryBlockSize::QWORD),
  1663. MODRM_RM,
  1664. READWRITE,
  1665. [](const Framework::Assembly::OperationArgument& arg) {
  1666. return arg.asConstantArgument() != 0
  1667. && arg.asConstantArgument()->getSize()
  1668. != Framework::Assembly::MemoryBlockSize::
  1669. BYTE;
  1670. },
  1671. IMM32,
  1672. READ),
  1673. // ADD r/m8, r8
  1674. MachineCodeTableEntry(false,
  1675. 0x00,
  1676. (char)1,
  1677. false,
  1678. false,
  1679. false,
  1680. 0,
  1681. 0,
  1682. isGPRegisterOrMemoryAccess(
  1683. Framework::Assembly::MemoryBlockSize::BYTE),
  1684. MODRM_RM,
  1685. READWRITE,
  1686. isGPRegister(
  1687. Framework::Assembly::MemoryBlockSize::BYTE),
  1688. MODRM_REG,
  1689. READ),
  1690. // ADD r/m16, r16
  1691. MachineCodeTableEntry(false,
  1692. 0x01,
  1693. (char)1,
  1694. true,
  1695. false,
  1696. false,
  1697. 0,
  1698. 0,
  1699. isGPRegisterOrMemoryAccess(
  1700. Framework::Assembly::MemoryBlockSize::WORD),
  1701. MODRM_RM,
  1702. READWRITE,
  1703. isGPRegister(
  1704. Framework::Assembly::MemoryBlockSize::WORD),
  1705. MODRM_REG,
  1706. READ),
  1707. // ADD r/m32, r32
  1708. MachineCodeTableEntry(false,
  1709. 0x01,
  1710. (char)1,
  1711. true,
  1712. false,
  1713. false,
  1714. 0,
  1715. 0,
  1716. isGPRegisterOrMemoryAccess(
  1717. Framework::Assembly::MemoryBlockSize::DWORD),
  1718. MODRM_RM,
  1719. READWRITE,
  1720. isGPRegister(
  1721. Framework::Assembly::MemoryBlockSize::DWORD),
  1722. MODRM_REG,
  1723. READ),
  1724. // ADD r/m64, r64
  1725. MachineCodeTableEntry(true,
  1726. 0x01,
  1727. (char)1,
  1728. false,
  1729. false,
  1730. false,
  1731. 0,
  1732. 0,
  1733. isGPRegisterOrMemoryAccess(
  1734. Framework::Assembly::MemoryBlockSize::QWORD),
  1735. MODRM_RM,
  1736. READWRITE,
  1737. isGPRegister(
  1738. Framework::Assembly::MemoryBlockSize::QWORD),
  1739. MODRM_REG,
  1740. READ),
  1741. // ADD r8, r/m8
  1742. MachineCodeTableEntry(false,
  1743. 0x02,
  1744. (char)1,
  1745. false,
  1746. false,
  1747. false,
  1748. 0,
  1749. 0,
  1750. isGPRegister(
  1751. Framework::Assembly::MemoryBlockSize::BYTE),
  1752. MODRM_REG,
  1753. READWRITE,
  1754. isGPRegisterOrMemoryAccess(
  1755. Framework::Assembly::MemoryBlockSize::BYTE),
  1756. MODRM_RM,
  1757. READ),
  1758. // ADD r16, r/m16
  1759. MachineCodeTableEntry(false,
  1760. 0x03,
  1761. (char)1,
  1762. true,
  1763. false,
  1764. false,
  1765. 0,
  1766. 0,
  1767. isGPRegister(
  1768. Framework::Assembly::MemoryBlockSize::WORD),
  1769. MODRM_REG,
  1770. READWRITE,
  1771. isGPRegisterOrMemoryAccess(
  1772. Framework::Assembly::MemoryBlockSize::WORD),
  1773. MODRM_RM,
  1774. READ),
  1775. // ADD r32, r/m32
  1776. MachineCodeTableEntry(false,
  1777. 0x03,
  1778. (char)1,
  1779. false,
  1780. false,
  1781. false,
  1782. 0,
  1783. 0,
  1784. isGPRegister(
  1785. Framework::Assembly::MemoryBlockSize::DWORD),
  1786. MODRM_REG,
  1787. READWRITE,
  1788. isGPRegisterOrMemoryAccess(
  1789. Framework::Assembly::MemoryBlockSize::DWORD),
  1790. MODRM_RM,
  1791. READ),
  1792. // ADD r64, r/m64
  1793. MachineCodeTableEntry(true,
  1794. 0x03,
  1795. (char)1,
  1796. false,
  1797. false,
  1798. false,
  1799. 0,
  1800. 0,
  1801. isGPRegister(
  1802. Framework::Assembly::MemoryBlockSize::QWORD),
  1803. MODRM_REG,
  1804. READWRITE,
  1805. isGPRegisterOrMemoryAccess(
  1806. Framework::Assembly::MemoryBlockSize::QWORD),
  1807. MODRM_RM,
  1808. READ)}));
  1809. OperationCodeTable::machineCodeTranslationTable.add(
  1810. new OperationCodeTable(Framework::Assembly::ADDPD,
  1811. {// ADDPD xmm1, xmm2/m128
  1812. MachineCodeTableEntry(false,
  1813. 0x580F,
  1814. (char)2,
  1815. true,
  1816. false,
  1817. false,
  1818. 0,
  1819. 0,
  1820. isFPRegister(
  1821. Framework::Assembly::MemoryBlockSize::M128),
  1822. MODRM_REG,
  1823. READWRITE,
  1824. isFPRegisterOrMEmoryAccess(
  1825. Framework::Assembly::MemoryBlockSize::M128),
  1826. MODRM_RM,
  1827. READ),
  1828. // VADDPD xmm1,xmm2, xmm3/m128
  1829. MachineCodeTableEntry(false,
  1830. 0x580F,
  1831. (char)2,
  1832. false,
  1833. true,
  1834. false,
  1835. 0b01,
  1836. 0,
  1837. isFPRegister(
  1838. Framework::Assembly::MemoryBlockSize::M128),
  1839. MODRM_REG,
  1840. WRITE,
  1841. isFPRegister(
  1842. Framework::Assembly::MemoryBlockSize::M128),
  1843. VEX_VVVV,
  1844. READ,
  1845. isFPRegisterOrMEmoryAccess(
  1846. Framework::Assembly::MemoryBlockSize::M128),
  1847. MODRM_RM,
  1848. READ),
  1849. // VADDPD ymm1,ymm2, ymm3/m256
  1850. MachineCodeTableEntry(false,
  1851. 0x580F,
  1852. (char)2,
  1853. false,
  1854. true,
  1855. true,
  1856. 0b01,
  1857. 0,
  1858. isFPRegister(
  1859. Framework::Assembly::MemoryBlockSize::M256),
  1860. MODRM_REG,
  1861. WRITE,
  1862. isFPRegister(
  1863. Framework::Assembly::MemoryBlockSize::M256),
  1864. VEX_VVVV,
  1865. READ,
  1866. isFPRegisterOrMEmoryAccess(
  1867. Framework::Assembly::MemoryBlockSize::M256),
  1868. MODRM_RM,
  1869. READ)}));
  1870. OperationCodeTable::machineCodeTranslationTable.add(
  1871. new OperationCodeTable(Framework::Assembly::ADDPS,
  1872. {// ADDPS xmm1, xmm2/m128
  1873. MachineCodeTableEntry(false,
  1874. 0x580F,
  1875. (char)2,
  1876. false,
  1877. false,
  1878. false,
  1879. 0,
  1880. 0,
  1881. isFPRegister(
  1882. Framework::Assembly::MemoryBlockSize::M128),
  1883. MODRM_REG,
  1884. READWRITE,
  1885. isFPRegisterOrMEmoryAccess(
  1886. Framework::Assembly::MemoryBlockSize::M128),
  1887. MODRM_RM,
  1888. READ),
  1889. // VADDPS xmm1,xmm2, xmm3/m128
  1890. MachineCodeTableEntry(false,
  1891. 0x580F,
  1892. (char)2,
  1893. false,
  1894. true,
  1895. false,
  1896. 0,
  1897. 0,
  1898. isFPRegister(
  1899. Framework::Assembly::MemoryBlockSize::M128),
  1900. MODRM_REG,
  1901. WRITE,
  1902. isFPRegister(
  1903. Framework::Assembly::MemoryBlockSize::M128),
  1904. VEX_VVVV,
  1905. READ,
  1906. isFPRegisterOrMEmoryAccess(
  1907. Framework::Assembly::MemoryBlockSize::M128),
  1908. MODRM_RM,
  1909. READ),
  1910. // VADDPS ymm1, ymm2, ymm3/m256
  1911. MachineCodeTableEntry(false,
  1912. 0x580F,
  1913. (char)2,
  1914. false,
  1915. true,
  1916. true,
  1917. 0,
  1918. 0,
  1919. isFPRegister(
  1920. Framework::Assembly::MemoryBlockSize::M256),
  1921. MODRM_REG,
  1922. WRITE,
  1923. isFPRegister(
  1924. Framework::Assembly::MemoryBlockSize::M256),
  1925. VEX_VVVV,
  1926. READ,
  1927. isFPRegisterOrMEmoryAccess(
  1928. Framework::Assembly::MemoryBlockSize::M256),
  1929. MODRM_RM,
  1930. READ)}));
  1931. OperationCodeTable::machineCodeTranslationTable.add(
  1932. new OperationCodeTable(Framework::Assembly::ADDSD,
  1933. {// ADDSD xmm1, xmm2/m64
  1934. MachineCodeTableEntry(false,
  1935. 0x580FF2,
  1936. (char)3,
  1937. false,
  1938. false,
  1939. false,
  1940. 0,
  1941. 0,
  1942. isFPRegister(
  1943. Framework::Assembly::MemoryBlockSize::M128),
  1944. MODRM_REG,
  1945. READWRITE,
  1946. isFPRegisterOrMEmoryAccess(
  1947. Framework::Assembly::MemoryBlockSize::M128,
  1948. Framework::Assembly::MemoryBlockSize::QWORD),
  1949. MODRM_RM,
  1950. READ),
  1951. // VADDPS VADDSD xmm1, xmm2, xmm3/m64
  1952. MachineCodeTableEntry(false,
  1953. 0x580F,
  1954. (char)2,
  1955. false,
  1956. true,
  1957. false,
  1958. 0b11,
  1959. 0,
  1960. isFPRegister(
  1961. Framework::Assembly::MemoryBlockSize::M128),
  1962. MODRM_REG,
  1963. WRITE,
  1964. isFPRegister(
  1965. Framework::Assembly::MemoryBlockSize::M128),
  1966. VEX_VVVV,
  1967. READ,
  1968. isFPRegisterOrMEmoryAccess(
  1969. Framework::Assembly::MemoryBlockSize::M128,
  1970. Framework::Assembly::MemoryBlockSize::QWORD),
  1971. MODRM_RM,
  1972. READ)}));
  1973. OperationCodeTable::machineCodeTranslationTable.add(
  1974. new OperationCodeTable(Framework::Assembly::ADDSS,
  1975. {// ADDPS xmm1, xmm2/m32
  1976. MachineCodeTableEntry(false,
  1977. 0x580FF3,
  1978. (char)3,
  1979. false,
  1980. false,
  1981. false,
  1982. 0,
  1983. 0,
  1984. isFPRegister(
  1985. Framework::Assembly::MemoryBlockSize::M128),
  1986. MODRM_REG,
  1987. READWRITE,
  1988. isFPRegisterOrMEmoryAccess(
  1989. Framework::Assembly::MemoryBlockSize::M128,
  1990. Framework::Assembly::MemoryBlockSize::WORD),
  1991. MODRM_RM,
  1992. READ),
  1993. // VADDPS VADDSD xmm1, xmm2, xmm3/m64
  1994. MachineCodeTableEntry(false,
  1995. 0x580F,
  1996. (char)2,
  1997. false,
  1998. true,
  1999. false,
  2000. 0b10,
  2001. 0,
  2002. isFPRegister(
  2003. Framework::Assembly::MemoryBlockSize::M128),
  2004. MODRM_REG,
  2005. WRITE,
  2006. isFPRegister(
  2007. Framework::Assembly::MemoryBlockSize::M128),
  2008. VEX_VVVV,
  2009. READ,
  2010. isFPRegisterOrMEmoryAccess(
  2011. Framework::Assembly::MemoryBlockSize::M128,
  2012. Framework::Assembly::MemoryBlockSize::WORD),
  2013. MODRM_RM,
  2014. READ)}));
  2015. OperationCodeTable::machineCodeTranslationTable.add(
  2016. new OperationCodeTable(Framework::Assembly::SUB,
  2017. {
  2018. // SUB AL, imm8
  2019. MachineCodeTableEntry(false,
  2020. 0x2C,
  2021. (char)1,
  2022. false,
  2023. false,
  2024. false,
  2025. 0,
  2026. 0,
  2027. isSpecificGPRegister(Framework::Assembly::RAX,
  2028. Framework::Assembly::LOWER8),
  2029. UNDEFINED,
  2030. READWRITE,
  2031. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  2032. IMM8,
  2033. READ),
  2034. // SUB AX, imm16
  2035. MachineCodeTableEntry(false,
  2036. 0x2D,
  2037. (char)1,
  2038. true,
  2039. false,
  2040. false,
  2041. 0,
  2042. 0,
  2043. isSpecificGPRegister(Framework::Assembly::RAX,
  2044. Framework::Assembly::LOWER16),
  2045. UNDEFINED,
  2046. READWRITE,
  2047. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  2048. IMM16,
  2049. READ),
  2050. // SUB EAX, imm32
  2051. MachineCodeTableEntry(false,
  2052. 0x2D,
  2053. (char)1,
  2054. false,
  2055. false,
  2056. false,
  2057. 0,
  2058. 0,
  2059. isSpecificGPRegister(Framework::Assembly::RAX,
  2060. Framework::Assembly::LOWER32),
  2061. UNDEFINED,
  2062. READWRITE,
  2063. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  2064. IMM32,
  2065. READ),
  2066. // SUB RAX, imm32
  2067. MachineCodeTableEntry(true,
  2068. 0x2D,
  2069. (char)1,
  2070. false,
  2071. false,
  2072. false,
  2073. 0,
  2074. 0,
  2075. isSpecificGPRegister(Framework::Assembly::RAX,
  2076. Framework::Assembly::FULL64),
  2077. UNDEFINED,
  2078. READWRITE,
  2079. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  2080. IMM32,
  2081. READ),
  2082. // SUB r/m8, imm8
  2083. MachineCodeTableEntry(false,
  2084. 0x80,
  2085. (char)1,
  2086. false,
  2087. false,
  2088. false,
  2089. 0,
  2090. 0b101,
  2091. isGPRegisterOrMemoryAccess(
  2092. Framework::Assembly::MemoryBlockSize::BYTE),
  2093. MODRM_RM,
  2094. READWRITE,
  2095. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  2096. IMM8,
  2097. READ),
  2098. // SUB r/m16, imm8
  2099. MachineCodeTableEntry(false,
  2100. 0x83,
  2101. (char)1,
  2102. true,
  2103. false,
  2104. false,
  2105. 0,
  2106. 0b101,
  2107. isGPRegisterOrMemoryAccess(
  2108. Framework::Assembly::MemoryBlockSize::WORD),
  2109. MODRM_RM,
  2110. READWRITE,
  2111. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  2112. IMM8,
  2113. READ),
  2114. // SUB r/m32, imm8
  2115. MachineCodeTableEntry(false,
  2116. 0x83,
  2117. (char)1,
  2118. false,
  2119. false,
  2120. false,
  2121. 0,
  2122. 0b101,
  2123. isGPRegisterOrMemoryAccess(
  2124. Framework::Assembly::MemoryBlockSize::DWORD),
  2125. MODRM_RM,
  2126. READWRITE,
  2127. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  2128. IMM8,
  2129. READ),
  2130. // SUB r/m64, imm8
  2131. MachineCodeTableEntry(true,
  2132. 0x83,
  2133. (char)1,
  2134. false,
  2135. false,
  2136. false,
  2137. 0,
  2138. 0b101,
  2139. isGPRegisterOrMemoryAccess(
  2140. Framework::Assembly::MemoryBlockSize::QWORD),
  2141. MODRM_RM,
  2142. READWRITE,
  2143. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  2144. IMM8,
  2145. READ),
  2146. // SUB r/m16, imm16
  2147. MachineCodeTableEntry(false,
  2148. 0x81,
  2149. (char)1,
  2150. true,
  2151. false,
  2152. false,
  2153. 0,
  2154. 0b101,
  2155. isGPRegisterOrMemoryAccess(
  2156. Framework::Assembly::MemoryBlockSize::WORD),
  2157. MODRM_RM,
  2158. READWRITE,
  2159. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  2160. IMM16,
  2161. READ),
  2162. // SUB r/m32, imm32
  2163. MachineCodeTableEntry(false,
  2164. 0x81,
  2165. (char)1,
  2166. false,
  2167. false,
  2168. false,
  2169. 0,
  2170. 0b101,
  2171. isGPRegisterOrMemoryAccess(
  2172. Framework::Assembly::MemoryBlockSize::DWORD),
  2173. MODRM_RM,
  2174. READWRITE,
  2175. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  2176. IMM32,
  2177. READ),
  2178. // SUB r/m64, imm32
  2179. MachineCodeTableEntry(true,
  2180. 0x81,
  2181. (char)1,
  2182. false,
  2183. false,
  2184. false,
  2185. 0,
  2186. 0b101,
  2187. isGPRegisterOrMemoryAccess(
  2188. Framework::Assembly::MemoryBlockSize::QWORD),
  2189. MODRM_RM,
  2190. READWRITE,
  2191. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  2192. IMM32,
  2193. READ),
  2194. // SUB r/m8, r8
  2195. MachineCodeTableEntry(false,
  2196. 0x28,
  2197. (char)1,
  2198. false,
  2199. false,
  2200. false,
  2201. 0,
  2202. 0,
  2203. isGPRegisterOrMemoryAccess(
  2204. Framework::Assembly::MemoryBlockSize::BYTE),
  2205. MODRM_RM,
  2206. READWRITE,
  2207. isGPRegister(
  2208. Framework::Assembly::MemoryBlockSize::BYTE),
  2209. MODRM_REG,
  2210. READ),
  2211. // SUB r/m16, r16
  2212. MachineCodeTableEntry(false,
  2213. 0x29,
  2214. (char)1,
  2215. true,
  2216. false,
  2217. false,
  2218. 0,
  2219. 0,
  2220. isGPRegisterOrMemoryAccess(
  2221. Framework::Assembly::MemoryBlockSize::WORD),
  2222. MODRM_RM,
  2223. READWRITE,
  2224. isGPRegister(
  2225. Framework::Assembly::MemoryBlockSize::WORD),
  2226. MODRM_REG,
  2227. READ),
  2228. // SUB r/m32, r32
  2229. MachineCodeTableEntry(false,
  2230. 0x29,
  2231. (char)1,
  2232. false,
  2233. false,
  2234. false,
  2235. 0,
  2236. 0,
  2237. isGPRegisterOrMemoryAccess(
  2238. Framework::Assembly::MemoryBlockSize::DWORD),
  2239. MODRM_RM,
  2240. READWRITE,
  2241. isGPRegister(
  2242. Framework::Assembly::MemoryBlockSize::DWORD),
  2243. MODRM_REG,
  2244. READ),
  2245. // SUB r/m64, r64
  2246. MachineCodeTableEntry(true,
  2247. 0x29,
  2248. (char)1,
  2249. false,
  2250. false,
  2251. false,
  2252. 0,
  2253. 0,
  2254. isGPRegisterOrMemoryAccess(
  2255. Framework::Assembly::MemoryBlockSize::QWORD),
  2256. MODRM_RM,
  2257. READWRITE,
  2258. isGPRegister(
  2259. Framework::Assembly::MemoryBlockSize::QWORD),
  2260. MODRM_REG,
  2261. READ),
  2262. // SUB r8, r/m8
  2263. MachineCodeTableEntry(false,
  2264. 0x2A,
  2265. (char)1,
  2266. false,
  2267. false,
  2268. false,
  2269. 0,
  2270. 0,
  2271. isGPRegister(
  2272. Framework::Assembly::MemoryBlockSize::BYTE),
  2273. MODRM_REG,
  2274. READWRITE,
  2275. isGPRegisterOrMemoryAccess(
  2276. Framework::Assembly::MemoryBlockSize::BYTE),
  2277. MODRM_RM,
  2278. READ),
  2279. // SUB r16, r/m16
  2280. MachineCodeTableEntry(false,
  2281. 0x2B,
  2282. (char)1,
  2283. true,
  2284. false,
  2285. false,
  2286. 0,
  2287. 0,
  2288. isGPRegister(
  2289. Framework::Assembly::MemoryBlockSize::WORD),
  2290. MODRM_REG,
  2291. READWRITE,
  2292. isGPRegisterOrMemoryAccess(
  2293. Framework::Assembly::MemoryBlockSize::WORD),
  2294. MODRM_RM,
  2295. READ),
  2296. // SUB r32, r/m32
  2297. MachineCodeTableEntry(false,
  2298. 0x2B,
  2299. (char)1,
  2300. false,
  2301. false,
  2302. false,
  2303. 0,
  2304. 0,
  2305. isGPRegister(
  2306. Framework::Assembly::MemoryBlockSize::DWORD),
  2307. MODRM_REG,
  2308. READWRITE,
  2309. isGPRegisterOrMemoryAccess(
  2310. Framework::Assembly::MemoryBlockSize::DWORD),
  2311. MODRM_RM,
  2312. READ),
  2313. // SUB SUB r64, r/m64
  2314. MachineCodeTableEntry(true,
  2315. 0x2B,
  2316. (char)1,
  2317. false,
  2318. false,
  2319. false,
  2320. 0,
  2321. 0,
  2322. isGPRegister(
  2323. Framework::Assembly::MemoryBlockSize::QWORD),
  2324. MODRM_REG,
  2325. READWRITE,
  2326. isGPRegisterOrMemoryAccess(
  2327. Framework::Assembly::MemoryBlockSize::QWORD),
  2328. MODRM_RM,
  2329. READ),
  2330. }));
  2331. OperationCodeTable::machineCodeTranslationTable.add(
  2332. new OperationCodeTable(Framework::Assembly::SUBPD,
  2333. {
  2334. // SUBPD xmm1, xmm2/m128
  2335. MachineCodeTableEntry(false,
  2336. 0x5D0F,
  2337. (char)2,
  2338. true,
  2339. false,
  2340. false,
  2341. 0,
  2342. 0,
  2343. isFPRegister(
  2344. Framework::Assembly::MemoryBlockSize::M128),
  2345. MODRM_REG,
  2346. READWRITE,
  2347. isFPRegisterOrMEmoryAccess(
  2348. Framework::Assembly::MemoryBlockSize::M128),
  2349. MODRM_RM,
  2350. READ),
  2351. // VSUBPD xmm1,xmm2, xmm3/m128
  2352. MachineCodeTableEntry(false,
  2353. 0x5C0F,
  2354. (char)2,
  2355. false,
  2356. true,
  2357. false,
  2358. 0b01,
  2359. 0,
  2360. isFPRegister(
  2361. Framework::Assembly::MemoryBlockSize::M128),
  2362. MODRM_REG,
  2363. WRITE,
  2364. isFPRegister(
  2365. Framework::Assembly::MemoryBlockSize::M128),
  2366. VEX_VVVV,
  2367. READ,
  2368. isFPRegisterOrMEmoryAccess(
  2369. Framework::Assembly::MemoryBlockSize::M128),
  2370. MODRM_RM,
  2371. READ),
  2372. // VSUBPD ymm1, ymm2, ymm3/m256
  2373. MachineCodeTableEntry(false,
  2374. 0x5C0F,
  2375. (char)2,
  2376. false,
  2377. true,
  2378. true,
  2379. 0b01,
  2380. 0,
  2381. isFPRegister(
  2382. Framework::Assembly::MemoryBlockSize::M256),
  2383. MODRM_REG,
  2384. WRITE,
  2385. isFPRegister(
  2386. Framework::Assembly::MemoryBlockSize::M256),
  2387. VEX_VVVV,
  2388. READ,
  2389. isFPRegisterOrMEmoryAccess(
  2390. Framework::Assembly::MemoryBlockSize::M256),
  2391. MODRM_RM,
  2392. READ),
  2393. }));
  2394. OperationCodeTable::machineCodeTranslationTable.add(
  2395. new OperationCodeTable(Framework::Assembly::SUBPS,
  2396. {
  2397. // SUBPS xmm1, xmm2/m128
  2398. MachineCodeTableEntry(false,
  2399. 0x5D0F,
  2400. (char)2,
  2401. false,
  2402. false,
  2403. false,
  2404. 0,
  2405. 0,
  2406. isFPRegister(
  2407. Framework::Assembly::MemoryBlockSize::M128),
  2408. MODRM_REG,
  2409. READWRITE,
  2410. isFPRegisterOrMEmoryAccess(
  2411. Framework::Assembly::MemoryBlockSize::M128),
  2412. MODRM_RM,
  2413. READ),
  2414. // VSUBPS xmm1,xmm2, xmm3/m128
  2415. MachineCodeTableEntry(false,
  2416. 0x5C0F,
  2417. (char)2,
  2418. false,
  2419. true,
  2420. false,
  2421. 0b00,
  2422. 0,
  2423. isFPRegister(
  2424. Framework::Assembly::MemoryBlockSize::M128),
  2425. MODRM_REG,
  2426. WRITE,
  2427. isFPRegister(
  2428. Framework::Assembly::MemoryBlockSize::M128),
  2429. VEX_VVVV,
  2430. READ,
  2431. isFPRegisterOrMEmoryAccess(
  2432. Framework::Assembly::MemoryBlockSize::M128),
  2433. MODRM_RM,
  2434. READ),
  2435. // VSUBPS ymm1, ymm2, ymm3/m256
  2436. MachineCodeTableEntry(false,
  2437. 0x5C0F,
  2438. (char)2,
  2439. false,
  2440. true,
  2441. true,
  2442. 0b00,
  2443. 0,
  2444. isFPRegister(
  2445. Framework::Assembly::MemoryBlockSize::M256),
  2446. MODRM_REG,
  2447. WRITE,
  2448. isFPRegister(
  2449. Framework::Assembly::MemoryBlockSize::M256),
  2450. VEX_VVVV,
  2451. READ,
  2452. isFPRegisterOrMEmoryAccess(
  2453. Framework::Assembly::MemoryBlockSize::M256),
  2454. MODRM_RM,
  2455. READ),
  2456. }));
  2457. OperationCodeTable::machineCodeTranslationTable.add(
  2458. new OperationCodeTable(Framework::Assembly::SUBSD,
  2459. {
  2460. // SUBSD xmm1, xmm2/m64
  2461. MachineCodeTableEntry(false,
  2462. 0x5C0FF2,
  2463. (char)3,
  2464. false,
  2465. false,
  2466. false,
  2467. 0,
  2468. 0,
  2469. isFPRegister(
  2470. Framework::Assembly::MemoryBlockSize::M128),
  2471. MODRM_REG,
  2472. READWRITE,
  2473. isFPRegisterOrMEmoryAccess(
  2474. Framework::Assembly::MemoryBlockSize::M128,
  2475. Framework::Assembly::MemoryBlockSize::QWORD),
  2476. MODRM_RM,
  2477. READ),
  2478. // VSUBSD xmm1,xmm2, xmm3/m64
  2479. MachineCodeTableEntry(false,
  2480. 0x5C0F,
  2481. (char)2,
  2482. false,
  2483. true,
  2484. false,
  2485. 0b11,
  2486. 0,
  2487. isFPRegister(
  2488. Framework::Assembly::MemoryBlockSize::M128),
  2489. MODRM_REG,
  2490. WRITE,
  2491. isFPRegister(
  2492. Framework::Assembly::MemoryBlockSize::M128),
  2493. VEX_VVVV,
  2494. READ,
  2495. isFPRegisterOrMEmoryAccess(
  2496. Framework::Assembly::MemoryBlockSize::M128,
  2497. Framework::Assembly::MemoryBlockSize::QWORD),
  2498. MODRM_RM,
  2499. READ),
  2500. }));
  2501. OperationCodeTable::machineCodeTranslationTable.add(
  2502. new OperationCodeTable(Framework::Assembly::SUBSS,
  2503. {
  2504. // SUBSS xmm1, xmm2/m32
  2505. MachineCodeTableEntry(false,
  2506. 0x5C0FF3,
  2507. (char)3,
  2508. false,
  2509. false,
  2510. false,
  2511. 0,
  2512. 0,
  2513. isFPRegister(
  2514. Framework::Assembly::MemoryBlockSize::M128),
  2515. MODRM_REG,
  2516. READWRITE,
  2517. isFPRegisterOrMEmoryAccess(
  2518. Framework::Assembly::MemoryBlockSize::M128,
  2519. Framework::Assembly::MemoryBlockSize::DWORD),
  2520. MODRM_RM,
  2521. READ),
  2522. // VSUBSD xmm1,xmm2, xmm3/m32
  2523. MachineCodeTableEntry(false,
  2524. 0x5C0F,
  2525. (char)2,
  2526. false,
  2527. true,
  2528. false,
  2529. 0b10,
  2530. 0,
  2531. isFPRegister(
  2532. Framework::Assembly::MemoryBlockSize::M128),
  2533. MODRM_REG,
  2534. WRITE,
  2535. isFPRegister(
  2536. Framework::Assembly::MemoryBlockSize::M128),
  2537. VEX_VVVV,
  2538. READ,
  2539. isFPRegisterOrMEmoryAccess(
  2540. Framework::Assembly::MemoryBlockSize::M128,
  2541. Framework::Assembly::MemoryBlockSize::DWORD),
  2542. MODRM_RM,
  2543. READ),
  2544. }));
  2545. OperationCodeTable::machineCodeTranslationTable.add(
  2546. new OperationCodeTable(Framework::Assembly::MUL,
  2547. {
  2548. // MUL r/m8
  2549. MachineCodeTableEntry(false,
  2550. 0xF6,
  2551. (char)1,
  2552. false,
  2553. false,
  2554. false,
  2555. 0,
  2556. 0b100,
  2557. {Framework::Assembly::RAX},
  2558. {Framework::Assembly::RAX},
  2559. {},
  2560. {},
  2561. isGPRegisterOrMemoryAccess(
  2562. Framework::Assembly::MemoryBlockSize::BYTE),
  2563. MODRM_RM,
  2564. READ),
  2565. // MUL r/m16
  2566. MachineCodeTableEntry(false,
  2567. 0xF7,
  2568. (char)1,
  2569. true,
  2570. false,
  2571. false,
  2572. 0,
  2573. 0b100,
  2574. {Framework::Assembly::RAX},
  2575. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  2576. {},
  2577. {},
  2578. isGPRegisterOrMemoryAccess(
  2579. Framework::Assembly::MemoryBlockSize::WORD),
  2580. MODRM_RM,
  2581. READ),
  2582. // MUL r/m32
  2583. MachineCodeTableEntry(false,
  2584. 0xF7,
  2585. (char)1,
  2586. false,
  2587. false,
  2588. false,
  2589. 0,
  2590. 0b100,
  2591. {Framework::Assembly::RAX},
  2592. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  2593. {},
  2594. {},
  2595. isGPRegisterOrMemoryAccess(
  2596. Framework::Assembly::MemoryBlockSize::DWORD),
  2597. MODRM_RM,
  2598. READ),
  2599. // MUL r/m64
  2600. MachineCodeTableEntry(true,
  2601. 0xF7,
  2602. (char)1,
  2603. false,
  2604. false,
  2605. false,
  2606. 0,
  2607. 0b100,
  2608. {Framework::Assembly::RAX},
  2609. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  2610. {},
  2611. {},
  2612. isGPRegisterOrMemoryAccess(
  2613. Framework::Assembly::MemoryBlockSize::QWORD),
  2614. MODRM_RM,
  2615. READ),
  2616. }));
  2617. OperationCodeTable::machineCodeTranslationTable.add(
  2618. new OperationCodeTable(Framework::Assembly::IMUL,
  2619. {
  2620. // IMUL r/m8
  2621. MachineCodeTableEntry(false,
  2622. 0xF6,
  2623. (char)1,
  2624. false,
  2625. false,
  2626. false,
  2627. 0,
  2628. 0b101,
  2629. {Framework::Assembly::RAX},
  2630. {Framework::Assembly::RAX},
  2631. {},
  2632. {},
  2633. isGPRegisterOrMemoryAccess(
  2634. Framework::Assembly::MemoryBlockSize::BYTE),
  2635. MODRM_RM,
  2636. READ),
  2637. // IMUL r/m16
  2638. MachineCodeTableEntry(false,
  2639. 0xF7,
  2640. (char)1,
  2641. true,
  2642. false,
  2643. false,
  2644. 0,
  2645. 0b101,
  2646. {Framework::Assembly::RAX},
  2647. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  2648. {},
  2649. {},
  2650. isGPRegisterOrMemoryAccess(
  2651. Framework::Assembly::MemoryBlockSize::WORD),
  2652. MODRM_RM,
  2653. READ),
  2654. // IMUL r/m32
  2655. MachineCodeTableEntry(false,
  2656. 0xF7,
  2657. (char)1,
  2658. false,
  2659. false,
  2660. false,
  2661. 0,
  2662. 0b101,
  2663. {Framework::Assembly::RAX},
  2664. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  2665. {},
  2666. {},
  2667. isGPRegisterOrMemoryAccess(
  2668. Framework::Assembly::MemoryBlockSize::DWORD),
  2669. MODRM_RM,
  2670. READ),
  2671. // IMUL r/m64
  2672. MachineCodeTableEntry(true,
  2673. 0xF7,
  2674. (char)1,
  2675. false,
  2676. false,
  2677. false,
  2678. 0,
  2679. 0b101,
  2680. {Framework::Assembly::RAX},
  2681. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  2682. {},
  2683. {},
  2684. isGPRegisterOrMemoryAccess(
  2685. Framework::Assembly::MemoryBlockSize::QWORD),
  2686. MODRM_RM,
  2687. READ),
  2688. // IMUL r16, r/m16
  2689. MachineCodeTableEntry(false,
  2690. 0xAF0F,
  2691. (char)2,
  2692. true,
  2693. false,
  2694. false,
  2695. 0,
  2696. 0,
  2697. isGPRegister(
  2698. Framework::Assembly::MemoryBlockSize::WORD),
  2699. MODRM_REG,
  2700. READWRITE,
  2701. isGPRegisterOrMemoryAccess(
  2702. Framework::Assembly::MemoryBlockSize::WORD),
  2703. MODRM_RM,
  2704. READ),
  2705. // IMUL r32, r/m32
  2706. MachineCodeTableEntry(false,
  2707. 0xAF0F,
  2708. (char)2,
  2709. false,
  2710. false,
  2711. false,
  2712. 0,
  2713. 0,
  2714. isGPRegister(
  2715. Framework::Assembly::MemoryBlockSize::DWORD),
  2716. MODRM_REG,
  2717. READWRITE,
  2718. isGPRegisterOrMemoryAccess(
  2719. Framework::Assembly::MemoryBlockSize::DWORD),
  2720. MODRM_RM,
  2721. READ),
  2722. // IMUL r64, r/m64
  2723. MachineCodeTableEntry(true,
  2724. 0xAF0F,
  2725. (char)2,
  2726. false,
  2727. false,
  2728. false,
  2729. 0,
  2730. 0,
  2731. isGPRegister(
  2732. Framework::Assembly::MemoryBlockSize::QWORD),
  2733. MODRM_REG,
  2734. READWRITE,
  2735. isGPRegisterOrMemoryAccess(
  2736. Framework::Assembly::MemoryBlockSize::QWORD),
  2737. MODRM_RM,
  2738. READ),
  2739. // IMUL r16, r/m16, imm8
  2740. MachineCodeTableEntry(false,
  2741. 0x6B,
  2742. (char)1,
  2743. true,
  2744. false,
  2745. false,
  2746. 0,
  2747. 0,
  2748. isGPRegister(
  2749. Framework::Assembly::MemoryBlockSize::WORD),
  2750. MODRM_REG,
  2751. WRITE,
  2752. isGPRegisterOrMemoryAccess(
  2753. Framework::Assembly::MemoryBlockSize::WORD),
  2754. MODRM_RM,
  2755. READ,
  2756. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  2757. IMM8,
  2758. READ),
  2759. // IMUL r32, r/m32, imm8
  2760. MachineCodeTableEntry(false,
  2761. 0x6B,
  2762. (char)1,
  2763. false,
  2764. false,
  2765. false,
  2766. 0,
  2767. 0,
  2768. isGPRegister(
  2769. Framework::Assembly::MemoryBlockSize::DWORD),
  2770. MODRM_REG,
  2771. READWRITE,
  2772. isGPRegisterOrMemoryAccess(
  2773. Framework::Assembly::MemoryBlockSize::DWORD),
  2774. MODRM_RM,
  2775. READ,
  2776. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  2777. IMM8,
  2778. READ),
  2779. // IMUL r64, r/m64, imm8
  2780. MachineCodeTableEntry(true,
  2781. 0x6B,
  2782. (char)1,
  2783. false,
  2784. false,
  2785. false,
  2786. 0,
  2787. 0,
  2788. isGPRegister(
  2789. Framework::Assembly::MemoryBlockSize::QWORD),
  2790. MODRM_REG,
  2791. READWRITE,
  2792. isGPRegisterOrMemoryAccess(
  2793. Framework::Assembly::MemoryBlockSize::QWORD),
  2794. MODRM_RM,
  2795. READ,
  2796. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  2797. IMM8,
  2798. READ),
  2799. // IMUL r16, r/m16, imm16
  2800. MachineCodeTableEntry(false,
  2801. 0x69,
  2802. (char)1,
  2803. true,
  2804. false,
  2805. false,
  2806. 0,
  2807. 0,
  2808. isGPRegister(
  2809. Framework::Assembly::MemoryBlockSize::WORD),
  2810. MODRM_REG,
  2811. WRITE,
  2812. isGPRegisterOrMemoryAccess(
  2813. Framework::Assembly::MemoryBlockSize::WORD),
  2814. MODRM_RM,
  2815. READ,
  2816. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  2817. IMM16,
  2818. READ),
  2819. // IMUL r32, r/m32, imm32
  2820. MachineCodeTableEntry(false,
  2821. 0x69,
  2822. (char)1,
  2823. false,
  2824. false,
  2825. false,
  2826. 0,
  2827. 0,
  2828. isGPRegister(
  2829. Framework::Assembly::MemoryBlockSize::DWORD),
  2830. MODRM_REG,
  2831. READWRITE,
  2832. isGPRegisterOrMemoryAccess(
  2833. Framework::Assembly::MemoryBlockSize::DWORD),
  2834. MODRM_RM,
  2835. READ,
  2836. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  2837. IMM32,
  2838. READ),
  2839. // IMUL r64, r/m64
  2840. MachineCodeTableEntry(true,
  2841. 0x69,
  2842. (char)1,
  2843. false,
  2844. false,
  2845. false,
  2846. 0,
  2847. 0,
  2848. isGPRegister(
  2849. Framework::Assembly::MemoryBlockSize::QWORD),
  2850. MODRM_REG,
  2851. READWRITE,
  2852. isGPRegisterOrMemoryAccess(
  2853. Framework::Assembly::MemoryBlockSize::QWORD),
  2854. MODRM_RM,
  2855. READ,
  2856. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  2857. IMM32,
  2858. READ),
  2859. }));
  2860. OperationCodeTable::machineCodeTranslationTable.add(
  2861. new OperationCodeTable(Framework::Assembly::MULPD,
  2862. {
  2863. // MULPD xmm1, xmm2/m128
  2864. MachineCodeTableEntry(false,
  2865. 0x590F,
  2866. (char)2,
  2867. true,
  2868. false,
  2869. false,
  2870. 0,
  2871. 0,
  2872. isFPRegister(
  2873. Framework::Assembly::MemoryBlockSize::M128),
  2874. MODRM_REG,
  2875. READWRITE,
  2876. isFPRegisterOrMEmoryAccess(
  2877. Framework::Assembly::MemoryBlockSize::M128),
  2878. MODRM_RM,
  2879. READ),
  2880. // VMULPD xmm1,xmm2, xmm3/m128
  2881. MachineCodeTableEntry(false,
  2882. 0x590F,
  2883. (char)2,
  2884. false,
  2885. true,
  2886. false,
  2887. 0b01,
  2888. 0,
  2889. isFPRegister(
  2890. Framework::Assembly::MemoryBlockSize::M128),
  2891. MODRM_REG,
  2892. WRITE,
  2893. isFPRegister(
  2894. Framework::Assembly::MemoryBlockSize::M128),
  2895. VEX_VVVV,
  2896. READ,
  2897. isFPRegisterOrMEmoryAccess(
  2898. Framework::Assembly::MemoryBlockSize::M128),
  2899. MODRM_RM,
  2900. READ),
  2901. // VMULPD ymm1, ymm2, ymm3/m256
  2902. MachineCodeTableEntry(false,
  2903. 0x590F,
  2904. (char)2,
  2905. false,
  2906. true,
  2907. true,
  2908. 0b01,
  2909. 0,
  2910. isFPRegister(
  2911. Framework::Assembly::MemoryBlockSize::M256),
  2912. MODRM_REG,
  2913. WRITE,
  2914. isFPRegister(
  2915. Framework::Assembly::MemoryBlockSize::M256),
  2916. VEX_VVVV,
  2917. READ,
  2918. isFPRegisterOrMEmoryAccess(
  2919. Framework::Assembly::MemoryBlockSize::M256),
  2920. MODRM_RM,
  2921. READ),
  2922. }));
  2923. OperationCodeTable::machineCodeTranslationTable.add(
  2924. new OperationCodeTable(Framework::Assembly::MULPS,
  2925. {
  2926. // MULPS xmm1, xmm2/m128
  2927. MachineCodeTableEntry(false,
  2928. 0x590F,
  2929. (char)2,
  2930. false,
  2931. false,
  2932. false,
  2933. 0,
  2934. 0,
  2935. isFPRegister(
  2936. Framework::Assembly::MemoryBlockSize::M128),
  2937. MODRM_REG,
  2938. READWRITE,
  2939. isFPRegisterOrMEmoryAccess(
  2940. Framework::Assembly::MemoryBlockSize::M128),
  2941. MODRM_RM,
  2942. READ),
  2943. // VMULPS xmm1,xmm2, xmm3/m128
  2944. MachineCodeTableEntry(false,
  2945. 0x590F,
  2946. (char)2,
  2947. false,
  2948. true,
  2949. false,
  2950. 0,
  2951. 0,
  2952. isFPRegister(
  2953. Framework::Assembly::MemoryBlockSize::M128),
  2954. MODRM_REG,
  2955. WRITE,
  2956. isFPRegister(
  2957. Framework::Assembly::MemoryBlockSize::M128),
  2958. VEX_VVVV,
  2959. READ,
  2960. isFPRegisterOrMEmoryAccess(
  2961. Framework::Assembly::MemoryBlockSize::M128),
  2962. MODRM_RM,
  2963. READ),
  2964. // VMULPS ymm1, ymm2, ymm3/m256
  2965. MachineCodeTableEntry(false,
  2966. 0x590F,
  2967. (char)2,
  2968. false,
  2969. true,
  2970. true,
  2971. 0,
  2972. 0,
  2973. isFPRegister(
  2974. Framework::Assembly::MemoryBlockSize::M256),
  2975. MODRM_REG,
  2976. WRITE,
  2977. isFPRegister(
  2978. Framework::Assembly::MemoryBlockSize::M256),
  2979. VEX_VVVV,
  2980. READ,
  2981. isFPRegisterOrMEmoryAccess(
  2982. Framework::Assembly::MemoryBlockSize::M256),
  2983. MODRM_RM,
  2984. READ),
  2985. }));
  2986. OperationCodeTable::machineCodeTranslationTable.add(
  2987. new OperationCodeTable(Framework::Assembly::MULSD,
  2988. {
  2989. // MULSD xmm1,xmm2/m64
  2990. MachineCodeTableEntry(false,
  2991. 0x590FF2,
  2992. (char)3,
  2993. false,
  2994. false,
  2995. false,
  2996. 0,
  2997. 0,
  2998. isFPRegister(
  2999. Framework::Assembly::MemoryBlockSize::M128),
  3000. MODRM_REG,
  3001. READWRITE,
  3002. isFPRegisterOrMEmoryAccess(
  3003. Framework::Assembly::MemoryBlockSize::M128),
  3004. MODRM_RM,
  3005. READ),
  3006. // VMULSD xmm1,xmm2, xmm3/m128
  3007. MachineCodeTableEntry(false,
  3008. 0x590F,
  3009. (char)2,
  3010. false,
  3011. true,
  3012. false,
  3013. 0b11,
  3014. 0,
  3015. isFPRegister(
  3016. Framework::Assembly::MemoryBlockSize::M128),
  3017. MODRM_REG,
  3018. WRITE,
  3019. isFPRegister(
  3020. Framework::Assembly::MemoryBlockSize::M128),
  3021. VEX_VVVV,
  3022. READ,
  3023. isFPRegisterOrMEmoryAccess(
  3024. Framework::Assembly::MemoryBlockSize::M128),
  3025. MODRM_RM,
  3026. READ),
  3027. }));
  3028. OperationCodeTable::machineCodeTranslationTable.add(
  3029. new OperationCodeTable(Framework::Assembly::MULSS,
  3030. {
  3031. // MULSS xmm1,xmm2/m64
  3032. MachineCodeTableEntry(false,
  3033. 0x590FF3,
  3034. (char)3,
  3035. false,
  3036. false,
  3037. false,
  3038. 0,
  3039. 0,
  3040. isFPRegister(
  3041. Framework::Assembly::MemoryBlockSize::M128),
  3042. MODRM_REG,
  3043. READWRITE,
  3044. isFPRegisterOrMEmoryAccess(
  3045. Framework::Assembly::MemoryBlockSize::M128),
  3046. MODRM_RM,
  3047. READ),
  3048. // VMULSS xmm1,xmm2, xmm3/m128
  3049. MachineCodeTableEntry(false,
  3050. 0x590F,
  3051. (char)2,
  3052. false,
  3053. true,
  3054. false,
  3055. 0b10,
  3056. 0,
  3057. isFPRegister(
  3058. Framework::Assembly::MemoryBlockSize::M128),
  3059. MODRM_REG,
  3060. WRITE,
  3061. isFPRegister(
  3062. Framework::Assembly::MemoryBlockSize::M128),
  3063. VEX_VVVV,
  3064. READ,
  3065. isFPRegisterOrMEmoryAccess(
  3066. Framework::Assembly::MemoryBlockSize::M128),
  3067. MODRM_RM,
  3068. READ),
  3069. }));
  3070. OperationCodeTable::machineCodeTranslationTable.add(
  3071. new OperationCodeTable(Framework::Assembly::DIV,
  3072. {
  3073. // DIV r/m8
  3074. MachineCodeTableEntry(false,
  3075. 0xF6,
  3076. (char)1,
  3077. false,
  3078. false,
  3079. false,
  3080. 0,
  3081. 0b110,
  3082. {Framework::Assembly::RAX},
  3083. {Framework::Assembly::RAX},
  3084. {},
  3085. {},
  3086. isGPRegisterOrMemoryAccess(
  3087. Framework::Assembly::MemoryBlockSize::BYTE),
  3088. MODRM_RM,
  3089. READ),
  3090. // DIV r/m16
  3091. MachineCodeTableEntry(false,
  3092. 0xF7,
  3093. (char)1,
  3094. true,
  3095. false,
  3096. false,
  3097. 0,
  3098. 0b110,
  3099. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  3100. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  3101. {},
  3102. {},
  3103. isGPRegisterOrMemoryAccess(
  3104. Framework::Assembly::MemoryBlockSize::WORD),
  3105. MODRM_RM,
  3106. READ),
  3107. // DIV r/m32
  3108. MachineCodeTableEntry(false,
  3109. 0xF7,
  3110. (char)1,
  3111. false,
  3112. false,
  3113. false,
  3114. 0,
  3115. 0b110,
  3116. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  3117. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  3118. {},
  3119. {},
  3120. isGPRegisterOrMemoryAccess(
  3121. Framework::Assembly::MemoryBlockSize::DWORD),
  3122. MODRM_RM,
  3123. READ),
  3124. // DIV r/m64
  3125. MachineCodeTableEntry(true,
  3126. 0xF7,
  3127. (char)1,
  3128. false,
  3129. false,
  3130. false,
  3131. 0,
  3132. 0b110,
  3133. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  3134. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  3135. {},
  3136. {},
  3137. isGPRegisterOrMemoryAccess(
  3138. Framework::Assembly::MemoryBlockSize::QWORD),
  3139. MODRM_RM,
  3140. READ),
  3141. }));
  3142. OperationCodeTable::machineCodeTranslationTable.add(
  3143. new OperationCodeTable(Framework::Assembly::IDIV,
  3144. {
  3145. // IDIV r/m8
  3146. MachineCodeTableEntry(false,
  3147. 0xF6,
  3148. (char)1,
  3149. false,
  3150. false,
  3151. false,
  3152. 0,
  3153. 0b111,
  3154. {Framework::Assembly::RAX},
  3155. {Framework::Assembly::RAX},
  3156. {},
  3157. {},
  3158. isGPRegisterOrMemoryAccess(
  3159. Framework::Assembly::MemoryBlockSize::BYTE),
  3160. MODRM_RM,
  3161. READ),
  3162. // IDIV r/m16
  3163. MachineCodeTableEntry(false,
  3164. 0xF7,
  3165. (char)1,
  3166. true,
  3167. false,
  3168. false,
  3169. 0,
  3170. 0b111,
  3171. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  3172. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  3173. {},
  3174. {},
  3175. isGPRegisterOrMemoryAccess(
  3176. Framework::Assembly::MemoryBlockSize::WORD),
  3177. MODRM_RM,
  3178. READ),
  3179. // IDIV r/m32
  3180. MachineCodeTableEntry(false,
  3181. 0xF7,
  3182. (char)1,
  3183. false,
  3184. false,
  3185. false,
  3186. 0,
  3187. 0b111,
  3188. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  3189. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  3190. {},
  3191. {},
  3192. isGPRegisterOrMemoryAccess(
  3193. Framework::Assembly::MemoryBlockSize::DWORD),
  3194. MODRM_RM,
  3195. READ),
  3196. // IDIV r/m64
  3197. MachineCodeTableEntry(true,
  3198. 0xF7,
  3199. (char)1,
  3200. false,
  3201. false,
  3202. false,
  3203. 0,
  3204. 0b111,
  3205. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  3206. {Framework::Assembly::RAX, Framework::Assembly::RDX},
  3207. {},
  3208. {},
  3209. isGPRegisterOrMemoryAccess(
  3210. Framework::Assembly::MemoryBlockSize::QWORD),
  3211. MODRM_RM,
  3212. READ),
  3213. }));
  3214. OperationCodeTable::machineCodeTranslationTable.add(
  3215. new OperationCodeTable(Framework::Assembly::DIVPD,
  3216. {
  3217. // DIVPD xmm1, xmm2/m128
  3218. MachineCodeTableEntry(false,
  3219. 0x5E0F,
  3220. (char)2,
  3221. true,
  3222. false,
  3223. false,
  3224. 0,
  3225. 0,
  3226. isFPRegister(
  3227. Framework::Assembly::MemoryBlockSize::M128),
  3228. MODRM_REG,
  3229. READWRITE,
  3230. isFPRegisterOrMEmoryAccess(
  3231. Framework::Assembly::MemoryBlockSize::M128),
  3232. MODRM_RM,
  3233. READ),
  3234. // VDIVPD xmm1,xmm2, xmm3/m128
  3235. MachineCodeTableEntry(false,
  3236. 0x5E0F,
  3237. (char)2,
  3238. false,
  3239. true,
  3240. false,
  3241. 0b01,
  3242. 0,
  3243. isFPRegister(
  3244. Framework::Assembly::MemoryBlockSize::M128),
  3245. MODRM_REG,
  3246. WRITE,
  3247. isFPRegister(
  3248. Framework::Assembly::MemoryBlockSize::M128),
  3249. VEX_VVVV,
  3250. READ,
  3251. isFPRegisterOrMEmoryAccess(
  3252. Framework::Assembly::MemoryBlockSize::M128),
  3253. MODRM_RM,
  3254. READ),
  3255. // VDIVPD ymm1, ymm2, ymm3/m256
  3256. MachineCodeTableEntry(false,
  3257. 0x5E0F,
  3258. (char)2,
  3259. false,
  3260. true,
  3261. true,
  3262. 0b01,
  3263. 0,
  3264. isFPRegister(
  3265. Framework::Assembly::MemoryBlockSize::M256),
  3266. MODRM_REG,
  3267. WRITE,
  3268. isFPRegister(
  3269. Framework::Assembly::MemoryBlockSize::M256),
  3270. VEX_VVVV,
  3271. READ,
  3272. isFPRegisterOrMEmoryAccess(
  3273. Framework::Assembly::MemoryBlockSize::M256),
  3274. MODRM_RM,
  3275. READ),
  3276. }));
  3277. OperationCodeTable::machineCodeTranslationTable.add(
  3278. new OperationCodeTable(Framework::Assembly::DIVPS,
  3279. {
  3280. // DIVPS xmm1, xmm2/m128
  3281. MachineCodeTableEntry(false,
  3282. 0x5E0F,
  3283. (char)2,
  3284. false,
  3285. false,
  3286. false,
  3287. 0,
  3288. 0,
  3289. isFPRegister(
  3290. Framework::Assembly::MemoryBlockSize::M128),
  3291. MODRM_REG,
  3292. READWRITE,
  3293. isFPRegisterOrMEmoryAccess(
  3294. Framework::Assembly::MemoryBlockSize::M128),
  3295. MODRM_RM,
  3296. READ),
  3297. // VDIVPS xmm1,xmm2, xmm3/m128
  3298. MachineCodeTableEntry(false,
  3299. 0x5E0F,
  3300. (char)2,
  3301. false,
  3302. true,
  3303. false,
  3304. 0,
  3305. 0,
  3306. isFPRegister(
  3307. Framework::Assembly::MemoryBlockSize::M128),
  3308. MODRM_REG,
  3309. WRITE,
  3310. isFPRegister(
  3311. Framework::Assembly::MemoryBlockSize::M128),
  3312. VEX_VVVV,
  3313. READ,
  3314. isFPRegisterOrMEmoryAccess(
  3315. Framework::Assembly::MemoryBlockSize::M128),
  3316. MODRM_RM,
  3317. READ),
  3318. // VDIVPS ymm1, ymm2, ymm3/m256
  3319. MachineCodeTableEntry(false,
  3320. 0x5E0F,
  3321. (char)2,
  3322. false,
  3323. true,
  3324. true,
  3325. 0,
  3326. 0,
  3327. isFPRegister(
  3328. Framework::Assembly::MemoryBlockSize::M256),
  3329. MODRM_REG,
  3330. WRITE,
  3331. isFPRegister(
  3332. Framework::Assembly::MemoryBlockSize::M256),
  3333. VEX_VVVV,
  3334. READ,
  3335. isFPRegisterOrMEmoryAccess(
  3336. Framework::Assembly::MemoryBlockSize::M256),
  3337. MODRM_RM,
  3338. READ),
  3339. }));
  3340. OperationCodeTable::machineCodeTranslationTable.add(
  3341. new OperationCodeTable(Framework::Assembly::DIVSD,
  3342. {
  3343. // DIVSD xmm1, xmm2/m128
  3344. MachineCodeTableEntry(false,
  3345. 0x5E0FF2,
  3346. (char)3,
  3347. false,
  3348. false,
  3349. false,
  3350. 0,
  3351. 0,
  3352. isFPRegister(
  3353. Framework::Assembly::MemoryBlockSize::M128),
  3354. MODRM_REG,
  3355. READWRITE,
  3356. isFPRegisterOrMEmoryAccess(
  3357. Framework::Assembly::MemoryBlockSize::M128),
  3358. MODRM_RM,
  3359. READ),
  3360. // VDIVSD xmm1,xmm2, xmm3/m128
  3361. MachineCodeTableEntry(false,
  3362. 0x5E0F,
  3363. (char)2,
  3364. false,
  3365. true,
  3366. false,
  3367. 0b11,
  3368. 0,
  3369. isFPRegister(
  3370. Framework::Assembly::MemoryBlockSize::M128),
  3371. MODRM_REG,
  3372. WRITE,
  3373. isFPRegister(
  3374. Framework::Assembly::MemoryBlockSize::M128),
  3375. VEX_VVVV,
  3376. READ,
  3377. isFPRegisterOrMEmoryAccess(
  3378. Framework::Assembly::MemoryBlockSize::M128),
  3379. MODRM_RM,
  3380. READ),
  3381. }));
  3382. OperationCodeTable::machineCodeTranslationTable.add(
  3383. new OperationCodeTable(Framework::Assembly::DIVSS,
  3384. {
  3385. // DIVSS xmm1, xmm2/m128
  3386. MachineCodeTableEntry(false,
  3387. 0x5E0FF3,
  3388. (char)3,
  3389. false,
  3390. false,
  3391. false,
  3392. 0,
  3393. 0,
  3394. isFPRegister(
  3395. Framework::Assembly::MemoryBlockSize::M128),
  3396. MODRM_REG,
  3397. READWRITE,
  3398. isFPRegisterOrMEmoryAccess(
  3399. Framework::Assembly::MemoryBlockSize::M128),
  3400. MODRM_RM,
  3401. READ),
  3402. // VDIVSS xmm1,xmm2, xmm3/m128
  3403. MachineCodeTableEntry(false,
  3404. 0x5E0F,
  3405. (char)2,
  3406. false,
  3407. true,
  3408. false,
  3409. 0b10,
  3410. 0,
  3411. isFPRegister(
  3412. Framework::Assembly::MemoryBlockSize::M128),
  3413. MODRM_REG,
  3414. WRITE,
  3415. isFPRegister(
  3416. Framework::Assembly::MemoryBlockSize::M128),
  3417. VEX_VVVV,
  3418. READ,
  3419. isFPRegisterOrMEmoryAccess(
  3420. Framework::Assembly::MemoryBlockSize::M128),
  3421. MODRM_RM,
  3422. READ),
  3423. }));
  3424. OperationCodeTable::machineCodeTranslationTable.add(
  3425. new OperationCodeTable(Framework::Assembly::NEG,
  3426. {
  3427. // NEG r/m8
  3428. MachineCodeTableEntry(false,
  3429. 0xF6,
  3430. (char)1,
  3431. false,
  3432. false,
  3433. false,
  3434. 0,
  3435. 0b011,
  3436. isGPRegisterOrMemoryAccess(
  3437. Framework::Assembly::MemoryBlockSize::BYTE),
  3438. MODRM_RM,
  3439. READWRITE),
  3440. // NEG r/m16
  3441. MachineCodeTableEntry(false,
  3442. 0xF7,
  3443. (char)1,
  3444. true,
  3445. false,
  3446. false,
  3447. 0,
  3448. 0b011,
  3449. isGPRegisterOrMemoryAccess(
  3450. Framework::Assembly::MemoryBlockSize::WORD),
  3451. MODRM_RM,
  3452. READWRITE),
  3453. // NEG r/m32
  3454. MachineCodeTableEntry(false,
  3455. 0xF7,
  3456. (char)1,
  3457. false,
  3458. false,
  3459. false,
  3460. 0,
  3461. 0b011,
  3462. isGPRegisterOrMemoryAccess(
  3463. Framework::Assembly::MemoryBlockSize::DWORD),
  3464. MODRM_RM,
  3465. READWRITE),
  3466. // NEG r/m64
  3467. MachineCodeTableEntry(true,
  3468. 0xF7,
  3469. (char)1,
  3470. false,
  3471. false,
  3472. false,
  3473. 0,
  3474. 0b011,
  3475. isGPRegisterOrMemoryAccess(
  3476. Framework::Assembly::MemoryBlockSize::QWORD),
  3477. MODRM_RM,
  3478. READWRITE),
  3479. }));
  3480. OperationCodeTable::machineCodeTranslationTable.add(
  3481. new OperationCodeTable(Framework::Assembly::INC,
  3482. {
  3483. // INC r/m8
  3484. MachineCodeTableEntry(false,
  3485. 0xFE,
  3486. (char)1,
  3487. false,
  3488. false,
  3489. false,
  3490. 0,
  3491. 0,
  3492. isGPRegisterOrMemoryAccess(
  3493. Framework::Assembly::MemoryBlockSize::BYTE),
  3494. MODRM_RM,
  3495. READWRITE),
  3496. // INC r/m16
  3497. MachineCodeTableEntry(false,
  3498. 0xF7,
  3499. (char)1,
  3500. true,
  3501. false,
  3502. false,
  3503. 0,
  3504. 0,
  3505. isGPRegisterOrMemoryAccess(
  3506. Framework::Assembly::MemoryBlockSize::WORD),
  3507. MODRM_RM,
  3508. READWRITE),
  3509. // INC r/m32
  3510. MachineCodeTableEntry(false,
  3511. 0xF7,
  3512. (char)1,
  3513. false,
  3514. false,
  3515. false,
  3516. 0,
  3517. 0,
  3518. isGPRegisterOrMemoryAccess(
  3519. Framework::Assembly::MemoryBlockSize::DWORD),
  3520. MODRM_RM,
  3521. READWRITE),
  3522. // INC r/m64
  3523. MachineCodeTableEntry(true,
  3524. 0xF7,
  3525. (char)1,
  3526. false,
  3527. false,
  3528. false,
  3529. 0,
  3530. 0,
  3531. isGPRegisterOrMemoryAccess(
  3532. Framework::Assembly::MemoryBlockSize::QWORD),
  3533. MODRM_RM,
  3534. READWRITE),
  3535. }));
  3536. OperationCodeTable::machineCodeTranslationTable.add(
  3537. new OperationCodeTable(Framework::Assembly::AND,
  3538. {
  3539. // AND AL, imm8
  3540. MachineCodeTableEntry(false,
  3541. 0x24,
  3542. (char)1,
  3543. false,
  3544. false,
  3545. false,
  3546. 0,
  3547. 0,
  3548. isSpecificGPRegister(Framework::Assembly::RAX,
  3549. Framework::Assembly::LOWER8),
  3550. UNDEFINED,
  3551. READWRITE,
  3552. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  3553. IMM8,
  3554. READ),
  3555. // AND AX, imm16
  3556. MachineCodeTableEntry(false,
  3557. 0x25,
  3558. (char)1,
  3559. true,
  3560. false,
  3561. false,
  3562. 0,
  3563. 0,
  3564. isSpecificGPRegister(Framework::Assembly::RAX,
  3565. Framework::Assembly::LOWER16),
  3566. UNDEFINED,
  3567. READWRITE,
  3568. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  3569. IMM16,
  3570. READ),
  3571. // AND EAX, imm32
  3572. MachineCodeTableEntry(false,
  3573. 0x25,
  3574. (char)1,
  3575. false,
  3576. false,
  3577. false,
  3578. 0,
  3579. 0,
  3580. isSpecificGPRegister(Framework::Assembly::RAX,
  3581. Framework::Assembly::LOWER32),
  3582. UNDEFINED,
  3583. READWRITE,
  3584. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  3585. IMM32,
  3586. READ),
  3587. // AND RAX, imm32
  3588. MachineCodeTableEntry(true,
  3589. 0x25,
  3590. (char)1,
  3591. false,
  3592. false,
  3593. false,
  3594. 0,
  3595. 0,
  3596. isSpecificGPRegister(Framework::Assembly::RAX,
  3597. Framework::Assembly::FULL64),
  3598. UNDEFINED,
  3599. READWRITE,
  3600. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  3601. IMM32,
  3602. READ),
  3603. // AND r/m8, imm8
  3604. MachineCodeTableEntry(false,
  3605. 0x80,
  3606. (char)1,
  3607. false,
  3608. false,
  3609. false,
  3610. 0,
  3611. 0b100,
  3612. isGPRegisterOrMemoryAccess(
  3613. Framework::Assembly::MemoryBlockSize::BYTE),
  3614. MODRM_RM,
  3615. READWRITE,
  3616. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  3617. IMM8,
  3618. READ),
  3619. // AND r/m16, imm8
  3620. MachineCodeTableEntry(false,
  3621. 0x83,
  3622. (char)1,
  3623. true,
  3624. false,
  3625. false,
  3626. 0,
  3627. 0b100,
  3628. isGPRegisterOrMemoryAccess(
  3629. Framework::Assembly::MemoryBlockSize::WORD),
  3630. MODRM_RM,
  3631. READWRITE,
  3632. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  3633. IMM8,
  3634. READ),
  3635. // AND r/m32, imm8
  3636. MachineCodeTableEntry(false,
  3637. 0x83,
  3638. (char)1,
  3639. false,
  3640. false,
  3641. false,
  3642. 0,
  3643. 0b100,
  3644. isGPRegisterOrMemoryAccess(
  3645. Framework::Assembly::MemoryBlockSize::DWORD),
  3646. MODRM_RM,
  3647. READWRITE,
  3648. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  3649. IMM8,
  3650. READ),
  3651. // AND r/m64, imm8
  3652. MachineCodeTableEntry(true,
  3653. 0x83,
  3654. (char)1,
  3655. false,
  3656. false,
  3657. false,
  3658. 0,
  3659. 0b100,
  3660. isGPRegisterOrMemoryAccess(
  3661. Framework::Assembly::MemoryBlockSize::QWORD),
  3662. MODRM_RM,
  3663. READWRITE,
  3664. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  3665. IMM8,
  3666. READ),
  3667. // AND r/m16, imm16
  3668. MachineCodeTableEntry(false,
  3669. 0x81,
  3670. (char)1,
  3671. true,
  3672. false,
  3673. false,
  3674. 0,
  3675. 0b100,
  3676. isGPRegisterOrMemoryAccess(
  3677. Framework::Assembly::MemoryBlockSize::WORD),
  3678. MODRM_RM,
  3679. READWRITE,
  3680. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  3681. IMM16,
  3682. READ),
  3683. // AND r/m32, imm32
  3684. MachineCodeTableEntry(false,
  3685. 0x81,
  3686. (char)1,
  3687. false,
  3688. false,
  3689. false,
  3690. 0,
  3691. 0b100,
  3692. isGPRegisterOrMemoryAccess(
  3693. Framework::Assembly::MemoryBlockSize::DWORD),
  3694. MODRM_RM,
  3695. READWRITE,
  3696. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  3697. IMM32,
  3698. READ),
  3699. // AND r/m64, imm32
  3700. MachineCodeTableEntry(true,
  3701. 0x81,
  3702. (char)1,
  3703. false,
  3704. false,
  3705. false,
  3706. 0,
  3707. 0b100,
  3708. isGPRegisterOrMemoryAccess(
  3709. Framework::Assembly::MemoryBlockSize::QWORD),
  3710. MODRM_RM,
  3711. READWRITE,
  3712. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  3713. IMM32,
  3714. READ),
  3715. // AND r/m8, r8
  3716. MachineCodeTableEntry(false,
  3717. 0x20,
  3718. (char)1,
  3719. false,
  3720. false,
  3721. false,
  3722. 0,
  3723. 0,
  3724. isGPRegisterOrMemoryAccess(
  3725. Framework::Assembly::MemoryBlockSize::BYTE),
  3726. MODRM_RM,
  3727. READWRITE,
  3728. isGPRegister(
  3729. Framework::Assembly::MemoryBlockSize::BYTE),
  3730. MODRM_REG,
  3731. READ),
  3732. // AND r/m16, r16
  3733. MachineCodeTableEntry(false,
  3734. 0x21,
  3735. (char)1,
  3736. true,
  3737. false,
  3738. false,
  3739. 0,
  3740. 0,
  3741. isGPRegisterOrMemoryAccess(
  3742. Framework::Assembly::MemoryBlockSize::WORD),
  3743. MODRM_RM,
  3744. READWRITE,
  3745. isGPRegister(
  3746. Framework::Assembly::MemoryBlockSize::WORD),
  3747. MODRM_REG,
  3748. READ),
  3749. // AND r/m32, r32
  3750. MachineCodeTableEntry(false,
  3751. 0x21,
  3752. (char)1,
  3753. false,
  3754. false,
  3755. false,
  3756. 0,
  3757. 0,
  3758. isGPRegisterOrMemoryAccess(
  3759. Framework::Assembly::MemoryBlockSize::DWORD),
  3760. MODRM_RM,
  3761. READWRITE,
  3762. isGPRegister(
  3763. Framework::Assembly::MemoryBlockSize::DWORD),
  3764. MODRM_REG,
  3765. READ),
  3766. // AND r/m64, r64
  3767. MachineCodeTableEntry(true,
  3768. 0x21,
  3769. (char)1,
  3770. false,
  3771. false,
  3772. false,
  3773. 0,
  3774. 0,
  3775. isGPRegisterOrMemoryAccess(
  3776. Framework::Assembly::MemoryBlockSize::QWORD),
  3777. MODRM_RM,
  3778. READWRITE,
  3779. isGPRegister(
  3780. Framework::Assembly::MemoryBlockSize::QWORD),
  3781. MODRM_REG,
  3782. READ),
  3783. // AND r8, r/m8
  3784. MachineCodeTableEntry(false,
  3785. 0x22,
  3786. (char)1,
  3787. false,
  3788. false,
  3789. false,
  3790. 0,
  3791. 0,
  3792. isGPRegister(
  3793. Framework::Assembly::MemoryBlockSize::BYTE),
  3794. MODRM_REG,
  3795. READWRITE,
  3796. isGPRegisterOrMemoryAccess(
  3797. Framework::Assembly::MemoryBlockSize::BYTE),
  3798. MODRM_RM,
  3799. READ),
  3800. // AND r16, r/m16
  3801. MachineCodeTableEntry(false,
  3802. 0x23,
  3803. (char)1,
  3804. true,
  3805. false,
  3806. false,
  3807. 0,
  3808. 0,
  3809. isGPRegister(
  3810. Framework::Assembly::MemoryBlockSize::WORD),
  3811. MODRM_REG,
  3812. READWRITE,
  3813. isGPRegisterOrMemoryAccess(
  3814. Framework::Assembly::MemoryBlockSize::WORD),
  3815. MODRM_RM,
  3816. READ),
  3817. // AND r32, r/m32
  3818. MachineCodeTableEntry(false,
  3819. 0x23,
  3820. (char)1,
  3821. false,
  3822. false,
  3823. false,
  3824. 0,
  3825. 0,
  3826. isGPRegister(
  3827. Framework::Assembly::MemoryBlockSize::DWORD),
  3828. MODRM_REG,
  3829. READWRITE,
  3830. isGPRegisterOrMemoryAccess(
  3831. Framework::Assembly::MemoryBlockSize::DWORD),
  3832. MODRM_RM,
  3833. READ),
  3834. // AND r64, r/m64
  3835. MachineCodeTableEntry(true,
  3836. 0x23,
  3837. (char)1,
  3838. false,
  3839. false,
  3840. false,
  3841. 0,
  3842. 0,
  3843. isGPRegister(
  3844. Framework::Assembly::MemoryBlockSize::QWORD),
  3845. MODRM_REG,
  3846. READWRITE,
  3847. isGPRegisterOrMemoryAccess(
  3848. Framework::Assembly::MemoryBlockSize::QWORD),
  3849. MODRM_RM,
  3850. READ),
  3851. }));
  3852. OperationCodeTable::machineCodeTranslationTable.add(
  3853. new OperationCodeTable(Framework::Assembly::OR,
  3854. {
  3855. // OR AL, imm8
  3856. MachineCodeTableEntry(false,
  3857. 0x0C,
  3858. (char)1,
  3859. false,
  3860. false,
  3861. false,
  3862. 0,
  3863. 0,
  3864. isSpecificGPRegister(Framework::Assembly::RAX,
  3865. Framework::Assembly::LOWER8),
  3866. UNDEFINED,
  3867. READWRITE,
  3868. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  3869. IMM8,
  3870. READ),
  3871. // OR AX, imm16
  3872. MachineCodeTableEntry(false,
  3873. 0x0D,
  3874. (char)1,
  3875. true,
  3876. false,
  3877. false,
  3878. 0,
  3879. 0,
  3880. isSpecificGPRegister(Framework::Assembly::RAX,
  3881. Framework::Assembly::LOWER16),
  3882. UNDEFINED,
  3883. READWRITE,
  3884. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  3885. IMM16,
  3886. READ),
  3887. // OR EAX, imm32
  3888. MachineCodeTableEntry(false,
  3889. 0x0D,
  3890. (char)1,
  3891. false,
  3892. false,
  3893. false,
  3894. 0,
  3895. 0,
  3896. isSpecificGPRegister(Framework::Assembly::RAX,
  3897. Framework::Assembly::LOWER32),
  3898. UNDEFINED,
  3899. READWRITE,
  3900. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  3901. IMM32,
  3902. READ),
  3903. // OR RAX, imm32
  3904. MachineCodeTableEntry(true,
  3905. 0x0D,
  3906. (char)1,
  3907. false,
  3908. false,
  3909. false,
  3910. 0,
  3911. 0,
  3912. isSpecificGPRegister(Framework::Assembly::RAX,
  3913. Framework::Assembly::FULL64),
  3914. UNDEFINED,
  3915. READWRITE,
  3916. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  3917. IMM32,
  3918. READ),
  3919. // OR r/m8, imm8
  3920. MachineCodeTableEntry(false,
  3921. 0x80,
  3922. (char)1,
  3923. false,
  3924. false,
  3925. false,
  3926. 0,
  3927. 0b001,
  3928. isGPRegisterOrMemoryAccess(
  3929. Framework::Assembly::MemoryBlockSize::BYTE),
  3930. MODRM_RM,
  3931. READWRITE,
  3932. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  3933. IMM8,
  3934. READ),
  3935. // OR r/m16, imm8
  3936. MachineCodeTableEntry(false,
  3937. 0x83,
  3938. (char)1,
  3939. true,
  3940. false,
  3941. false,
  3942. 0,
  3943. 0b001,
  3944. isGPRegisterOrMemoryAccess(
  3945. Framework::Assembly::MemoryBlockSize::WORD),
  3946. MODRM_RM,
  3947. READWRITE,
  3948. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  3949. IMM8,
  3950. READ),
  3951. // OR r/m32, imm8
  3952. MachineCodeTableEntry(false,
  3953. 0x83,
  3954. (char)1,
  3955. false,
  3956. false,
  3957. false,
  3958. 0,
  3959. 0b001,
  3960. isGPRegisterOrMemoryAccess(
  3961. Framework::Assembly::MemoryBlockSize::DWORD),
  3962. MODRM_RM,
  3963. READWRITE,
  3964. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  3965. IMM8,
  3966. READ),
  3967. // OR r/m64, imm8
  3968. MachineCodeTableEntry(true,
  3969. 0x83,
  3970. (char)1,
  3971. false,
  3972. false,
  3973. false,
  3974. 0,
  3975. 0b001,
  3976. isGPRegisterOrMemoryAccess(
  3977. Framework::Assembly::MemoryBlockSize::QWORD),
  3978. MODRM_RM,
  3979. READWRITE,
  3980. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  3981. IMM8,
  3982. READ),
  3983. // OR r/m16, imm16
  3984. MachineCodeTableEntry(false,
  3985. 0x81,
  3986. (char)1,
  3987. true,
  3988. false,
  3989. false,
  3990. 0,
  3991. 0b001,
  3992. isGPRegisterOrMemoryAccess(
  3993. Framework::Assembly::MemoryBlockSize::WORD),
  3994. MODRM_RM,
  3995. READWRITE,
  3996. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  3997. IMM16,
  3998. READ),
  3999. // OR r/m32, imm32
  4000. MachineCodeTableEntry(false,
  4001. 0x81,
  4002. (char)1,
  4003. false,
  4004. false,
  4005. false,
  4006. 0,
  4007. 0b001,
  4008. isGPRegisterOrMemoryAccess(
  4009. Framework::Assembly::MemoryBlockSize::DWORD),
  4010. MODRM_RM,
  4011. READWRITE,
  4012. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4013. IMM32,
  4014. READ),
  4015. // OR r/m64, imm32
  4016. MachineCodeTableEntry(true,
  4017. 0x81,
  4018. (char)1,
  4019. false,
  4020. false,
  4021. false,
  4022. 0,
  4023. 0b001,
  4024. isGPRegisterOrMemoryAccess(
  4025. Framework::Assembly::MemoryBlockSize::QWORD),
  4026. MODRM_RM,
  4027. READWRITE,
  4028. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4029. IMM32,
  4030. READ),
  4031. // OR r/m8, r8
  4032. MachineCodeTableEntry(false,
  4033. 0x08,
  4034. (char)1,
  4035. false,
  4036. false,
  4037. false,
  4038. 0,
  4039. 0,
  4040. isGPRegisterOrMemoryAccess(
  4041. Framework::Assembly::MemoryBlockSize::BYTE),
  4042. MODRM_RM,
  4043. READWRITE,
  4044. isGPRegister(
  4045. Framework::Assembly::MemoryBlockSize::BYTE),
  4046. MODRM_REG,
  4047. READ),
  4048. // OR r/m16, r16
  4049. MachineCodeTableEntry(false,
  4050. 0x09,
  4051. (char)1,
  4052. true,
  4053. false,
  4054. false,
  4055. 0,
  4056. 0,
  4057. isGPRegisterOrMemoryAccess(
  4058. Framework::Assembly::MemoryBlockSize::WORD),
  4059. MODRM_RM,
  4060. READWRITE,
  4061. isGPRegister(
  4062. Framework::Assembly::MemoryBlockSize::WORD),
  4063. MODRM_REG,
  4064. READ),
  4065. // OR r/m32, r32
  4066. MachineCodeTableEntry(false,
  4067. 0x09,
  4068. (char)1,
  4069. false,
  4070. false,
  4071. false,
  4072. 0,
  4073. 0,
  4074. isGPRegisterOrMemoryAccess(
  4075. Framework::Assembly::MemoryBlockSize::DWORD),
  4076. MODRM_RM,
  4077. READWRITE,
  4078. isGPRegister(
  4079. Framework::Assembly::MemoryBlockSize::DWORD),
  4080. MODRM_REG,
  4081. READ),
  4082. // OR r/m64, r64
  4083. MachineCodeTableEntry(true,
  4084. 0x09,
  4085. (char)1,
  4086. false,
  4087. false,
  4088. false,
  4089. 0,
  4090. 0,
  4091. isGPRegisterOrMemoryAccess(
  4092. Framework::Assembly::MemoryBlockSize::QWORD),
  4093. MODRM_RM,
  4094. READWRITE,
  4095. isGPRegister(
  4096. Framework::Assembly::MemoryBlockSize::QWORD),
  4097. MODRM_REG,
  4098. READ),
  4099. // OR r8, r/m8
  4100. MachineCodeTableEntry(false,
  4101. 0x0A,
  4102. (char)1,
  4103. false,
  4104. false,
  4105. false,
  4106. 0,
  4107. 0,
  4108. isGPRegister(
  4109. Framework::Assembly::MemoryBlockSize::BYTE),
  4110. MODRM_REG,
  4111. READWRITE,
  4112. isGPRegisterOrMemoryAccess(
  4113. Framework::Assembly::MemoryBlockSize::BYTE),
  4114. MODRM_RM,
  4115. READ),
  4116. // OR r16, r/m16
  4117. MachineCodeTableEntry(false,
  4118. 0x0B,
  4119. (char)1,
  4120. true,
  4121. false,
  4122. false,
  4123. 0,
  4124. 0,
  4125. isGPRegister(
  4126. Framework::Assembly::MemoryBlockSize::WORD),
  4127. MODRM_REG,
  4128. READWRITE,
  4129. isGPRegisterOrMemoryAccess(
  4130. Framework::Assembly::MemoryBlockSize::WORD),
  4131. MODRM_RM,
  4132. READ),
  4133. // OR r32, r/m32
  4134. MachineCodeTableEntry(false,
  4135. 0x0B,
  4136. (char)1,
  4137. false,
  4138. false,
  4139. false,
  4140. 0,
  4141. 0,
  4142. isGPRegister(
  4143. Framework::Assembly::MemoryBlockSize::DWORD),
  4144. MODRM_REG,
  4145. READWRITE,
  4146. isGPRegisterOrMemoryAccess(
  4147. Framework::Assembly::MemoryBlockSize::DWORD),
  4148. MODRM_RM,
  4149. READ),
  4150. // OR r64, r/m64
  4151. MachineCodeTableEntry(true,
  4152. 0x0B,
  4153. (char)1,
  4154. false,
  4155. false,
  4156. false,
  4157. 0,
  4158. 0,
  4159. isGPRegister(
  4160. Framework::Assembly::MemoryBlockSize::QWORD),
  4161. MODRM_REG,
  4162. READWRITE,
  4163. isGPRegisterOrMemoryAccess(
  4164. Framework::Assembly::MemoryBlockSize::QWORD),
  4165. MODRM_RM,
  4166. READ),
  4167. }));
  4168. OperationCodeTable::machineCodeTranslationTable.add(
  4169. new OperationCodeTable(Framework::Assembly::XOR,
  4170. {
  4171. // XOR AL, imm8
  4172. MachineCodeTableEntry(false,
  4173. 0x34,
  4174. (char)1,
  4175. false,
  4176. false,
  4177. false,
  4178. 0,
  4179. 0,
  4180. isSpecificGPRegister(Framework::Assembly::RAX,
  4181. Framework::Assembly::LOWER8),
  4182. UNDEFINED,
  4183. READWRITE,
  4184. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  4185. IMM8,
  4186. READ),
  4187. // XOR AX, imm16
  4188. MachineCodeTableEntry(false,
  4189. 0x35,
  4190. (char)1,
  4191. true,
  4192. false,
  4193. false,
  4194. 0,
  4195. 0,
  4196. isSpecificGPRegister(Framework::Assembly::RAX,
  4197. Framework::Assembly::LOWER16),
  4198. UNDEFINED,
  4199. READWRITE,
  4200. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  4201. IMM16,
  4202. READ),
  4203. // XOR EAX, imm32
  4204. MachineCodeTableEntry(false,
  4205. 0x35,
  4206. (char)1,
  4207. false,
  4208. false,
  4209. false,
  4210. 0,
  4211. 0,
  4212. isSpecificGPRegister(Framework::Assembly::RAX,
  4213. Framework::Assembly::LOWER32),
  4214. UNDEFINED,
  4215. READWRITE,
  4216. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4217. IMM32,
  4218. READ),
  4219. // XOR RAX, imm32
  4220. MachineCodeTableEntry(true,
  4221. 0x35,
  4222. (char)1,
  4223. false,
  4224. false,
  4225. false,
  4226. 0,
  4227. 0,
  4228. isSpecificGPRegister(Framework::Assembly::RAX,
  4229. Framework::Assembly::FULL64),
  4230. UNDEFINED,
  4231. READWRITE,
  4232. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4233. IMM32,
  4234. READ),
  4235. // XOR r/m8, imm8
  4236. MachineCodeTableEntry(false,
  4237. 0x80,
  4238. (char)1,
  4239. false,
  4240. false,
  4241. false,
  4242. 0,
  4243. 0b110,
  4244. isGPRegisterOrMemoryAccess(
  4245. Framework::Assembly::MemoryBlockSize::BYTE),
  4246. MODRM_RM,
  4247. READWRITE,
  4248. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  4249. IMM8,
  4250. READ),
  4251. // XOR r/m16, imm8
  4252. MachineCodeTableEntry(false,
  4253. 0x83,
  4254. (char)1,
  4255. true,
  4256. false,
  4257. false,
  4258. 0,
  4259. 0b110,
  4260. isGPRegisterOrMemoryAccess(
  4261. Framework::Assembly::MemoryBlockSize::WORD),
  4262. MODRM_RM,
  4263. READWRITE,
  4264. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  4265. IMM8,
  4266. READ),
  4267. // XOR r/m32, imm8
  4268. MachineCodeTableEntry(false,
  4269. 0x83,
  4270. (char)1,
  4271. false,
  4272. false,
  4273. false,
  4274. 0,
  4275. 0b110,
  4276. isGPRegisterOrMemoryAccess(
  4277. Framework::Assembly::MemoryBlockSize::DWORD),
  4278. MODRM_RM,
  4279. READWRITE,
  4280. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  4281. IMM8,
  4282. READ),
  4283. // XOR r/m64, imm8
  4284. MachineCodeTableEntry(true,
  4285. 0x83,
  4286. (char)1,
  4287. false,
  4288. false,
  4289. false,
  4290. 0,
  4291. 0b110,
  4292. isGPRegisterOrMemoryAccess(
  4293. Framework::Assembly::MemoryBlockSize::QWORD),
  4294. MODRM_RM,
  4295. READWRITE,
  4296. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  4297. IMM8,
  4298. READ),
  4299. // XOR r/m16, imm16
  4300. MachineCodeTableEntry(false,
  4301. 0x81,
  4302. (char)1,
  4303. true,
  4304. false,
  4305. false,
  4306. 0,
  4307. 0b110,
  4308. isGPRegisterOrMemoryAccess(
  4309. Framework::Assembly::MemoryBlockSize::WORD),
  4310. MODRM_RM,
  4311. READWRITE,
  4312. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  4313. IMM16,
  4314. READ),
  4315. // XOR r/m32, imm32
  4316. MachineCodeTableEntry(false,
  4317. 0x81,
  4318. (char)1,
  4319. false,
  4320. false,
  4321. false,
  4322. 0,
  4323. 0b110,
  4324. isGPRegisterOrMemoryAccess(
  4325. Framework::Assembly::MemoryBlockSize::DWORD),
  4326. MODRM_RM,
  4327. READWRITE,
  4328. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4329. IMM32,
  4330. READ),
  4331. // XOR r/m64, imm32
  4332. MachineCodeTableEntry(true,
  4333. 0x81,
  4334. (char)1,
  4335. false,
  4336. false,
  4337. false,
  4338. 0,
  4339. 0b110,
  4340. isGPRegisterOrMemoryAccess(
  4341. Framework::Assembly::MemoryBlockSize::QWORD),
  4342. MODRM_RM,
  4343. READWRITE,
  4344. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4345. IMM32,
  4346. READ),
  4347. // XOR r/m8, r8
  4348. MachineCodeTableEntry(false,
  4349. 0x30,
  4350. (char)1,
  4351. false,
  4352. false,
  4353. false,
  4354. 0,
  4355. 0,
  4356. isGPRegisterOrMemoryAccess(
  4357. Framework::Assembly::MemoryBlockSize::BYTE),
  4358. MODRM_RM,
  4359. READWRITE,
  4360. isGPRegister(
  4361. Framework::Assembly::MemoryBlockSize::BYTE),
  4362. MODRM_REG,
  4363. READ),
  4364. // XOR r/m16, r16
  4365. MachineCodeTableEntry(false,
  4366. 0x31,
  4367. (char)1,
  4368. true,
  4369. false,
  4370. false,
  4371. 0,
  4372. 0,
  4373. isGPRegisterOrMemoryAccess(
  4374. Framework::Assembly::MemoryBlockSize::WORD),
  4375. MODRM_RM,
  4376. READWRITE,
  4377. isGPRegister(
  4378. Framework::Assembly::MemoryBlockSize::WORD),
  4379. MODRM_REG,
  4380. READ),
  4381. // XOR r/m32, r32
  4382. MachineCodeTableEntry(false,
  4383. 0x31,
  4384. (char)1,
  4385. false,
  4386. false,
  4387. false,
  4388. 0,
  4389. 0,
  4390. isGPRegisterOrMemoryAccess(
  4391. Framework::Assembly::MemoryBlockSize::DWORD),
  4392. MODRM_RM,
  4393. READWRITE,
  4394. isGPRegister(
  4395. Framework::Assembly::MemoryBlockSize::DWORD),
  4396. MODRM_REG,
  4397. READ),
  4398. // XOR r/m64, r64
  4399. MachineCodeTableEntry(true,
  4400. 0x31,
  4401. (char)1,
  4402. false,
  4403. false,
  4404. false,
  4405. 0,
  4406. 0,
  4407. isGPRegisterOrMemoryAccess(
  4408. Framework::Assembly::MemoryBlockSize::QWORD),
  4409. MODRM_RM,
  4410. READWRITE,
  4411. isGPRegister(
  4412. Framework::Assembly::MemoryBlockSize::QWORD),
  4413. MODRM_REG,
  4414. READ),
  4415. // XOR r8, r/m8
  4416. MachineCodeTableEntry(false,
  4417. 0x32,
  4418. (char)1,
  4419. false,
  4420. false,
  4421. false,
  4422. 0,
  4423. 0,
  4424. isGPRegister(
  4425. Framework::Assembly::MemoryBlockSize::BYTE),
  4426. MODRM_REG,
  4427. READWRITE,
  4428. isGPRegisterOrMemoryAccess(
  4429. Framework::Assembly::MemoryBlockSize::BYTE),
  4430. MODRM_RM,
  4431. READ),
  4432. // XOR r16, r/m16
  4433. MachineCodeTableEntry(false,
  4434. 0x33,
  4435. (char)1,
  4436. true,
  4437. false,
  4438. false,
  4439. 0,
  4440. 0,
  4441. isGPRegister(
  4442. Framework::Assembly::MemoryBlockSize::WORD),
  4443. MODRM_REG,
  4444. READWRITE,
  4445. isGPRegisterOrMemoryAccess(
  4446. Framework::Assembly::MemoryBlockSize::WORD),
  4447. MODRM_RM,
  4448. READ),
  4449. // XOR r32, r/m32
  4450. MachineCodeTableEntry(false,
  4451. 0x33,
  4452. (char)1,
  4453. false,
  4454. false,
  4455. false,
  4456. 0,
  4457. 0,
  4458. isGPRegister(
  4459. Framework::Assembly::MemoryBlockSize::DWORD),
  4460. MODRM_REG,
  4461. READWRITE,
  4462. isGPRegisterOrMemoryAccess(
  4463. Framework::Assembly::MemoryBlockSize::DWORD),
  4464. MODRM_RM,
  4465. READ),
  4466. // XOR r64, r/m64
  4467. MachineCodeTableEntry(true,
  4468. 0x33,
  4469. (char)1,
  4470. false,
  4471. false,
  4472. false,
  4473. 0,
  4474. 0,
  4475. isGPRegister(
  4476. Framework::Assembly::MemoryBlockSize::QWORD),
  4477. MODRM_REG,
  4478. READWRITE,
  4479. isGPRegisterOrMemoryAccess(
  4480. Framework::Assembly::MemoryBlockSize::QWORD),
  4481. MODRM_RM,
  4482. READ),
  4483. }));
  4484. OperationCodeTable::machineCodeTranslationTable.add(
  4485. new OperationCodeTable(Framework::Assembly::NOT,
  4486. {
  4487. // NOT r/m8
  4488. MachineCodeTableEntry(false,
  4489. 0xF6,
  4490. (char)1,
  4491. false,
  4492. false,
  4493. false,
  4494. 0,
  4495. 0b010,
  4496. isGPRegisterOrMemoryAccess(
  4497. Framework::Assembly::MemoryBlockSize::BYTE),
  4498. MODRM_RM,
  4499. READWRITE),
  4500. // NOT r/m16
  4501. MachineCodeTableEntry(false,
  4502. 0xF7,
  4503. (char)1,
  4504. true,
  4505. false,
  4506. false,
  4507. 0,
  4508. 0b010,
  4509. isGPRegisterOrMemoryAccess(
  4510. Framework::Assembly::MemoryBlockSize::WORD),
  4511. MODRM_RM,
  4512. READWRITE),
  4513. // NOT r/m32
  4514. MachineCodeTableEntry(false,
  4515. 0xF7,
  4516. (char)1,
  4517. false,
  4518. false,
  4519. false,
  4520. 0,
  4521. 0b010,
  4522. isGPRegisterOrMemoryAccess(
  4523. Framework::Assembly::MemoryBlockSize::DWORD),
  4524. MODRM_RM,
  4525. READWRITE),
  4526. // NOT r/m64
  4527. MachineCodeTableEntry(true,
  4528. 0xF7,
  4529. (char)1,
  4530. false,
  4531. false,
  4532. false,
  4533. 0,
  4534. 0b010,
  4535. isGPRegisterOrMemoryAccess(
  4536. Framework::Assembly::MemoryBlockSize::DWORD),
  4537. MODRM_RM,
  4538. READWRITE),
  4539. }));
  4540. OperationCodeTable::machineCodeTranslationTable.add(
  4541. new OperationCodeTable(Framework::Assembly::TEST,
  4542. {
  4543. // TEST AL, imm8
  4544. MachineCodeTableEntry(false,
  4545. 0xA8,
  4546. (char)1,
  4547. false,
  4548. false,
  4549. false,
  4550. 0,
  4551. 0,
  4552. isSpecificGPRegister(Framework::Assembly::RAX,
  4553. Framework::Assembly::LOWER8),
  4554. UNDEFINED,
  4555. READ,
  4556. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  4557. IMM8,
  4558. READ),
  4559. // TEST AX, imm16
  4560. MachineCodeTableEntry(false,
  4561. 0xA9,
  4562. (char)1,
  4563. true,
  4564. false,
  4565. false,
  4566. 0,
  4567. 0,
  4568. isSpecificGPRegister(Framework::Assembly::RAX,
  4569. Framework::Assembly::LOWER16),
  4570. UNDEFINED,
  4571. READ,
  4572. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  4573. IMM16,
  4574. READ),
  4575. // TEST EAX, imm32
  4576. MachineCodeTableEntry(false,
  4577. 0xA9,
  4578. (char)1,
  4579. false,
  4580. false,
  4581. false,
  4582. 0,
  4583. 0,
  4584. isSpecificGPRegister(Framework::Assembly::RAX,
  4585. Framework::Assembly::LOWER32),
  4586. UNDEFINED,
  4587. READ,
  4588. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4589. IMM32,
  4590. READ),
  4591. // TEST RAX, imm32
  4592. MachineCodeTableEntry(true,
  4593. 0xA9,
  4594. (char)1,
  4595. false,
  4596. false,
  4597. false,
  4598. 0,
  4599. 0,
  4600. isSpecificGPRegister(Framework::Assembly::RAX,
  4601. Framework::Assembly::FULL64),
  4602. UNDEFINED,
  4603. READ,
  4604. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4605. IMM32,
  4606. READ),
  4607. // TEST r/m8, imm8
  4608. MachineCodeTableEntry(false,
  4609. 0xF6,
  4610. (char)1,
  4611. false,
  4612. false,
  4613. false,
  4614. 0,
  4615. 0,
  4616. isGPRegisterOrMemoryAccess(
  4617. Framework::Assembly::MemoryBlockSize::BYTE),
  4618. MODRM_RM,
  4619. READ,
  4620. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  4621. IMM8,
  4622. READ),
  4623. // TEST r/m16, imm16
  4624. MachineCodeTableEntry(false,
  4625. 0xF7,
  4626. (char)1,
  4627. true,
  4628. false,
  4629. false,
  4630. 0,
  4631. 0,
  4632. isGPRegisterOrMemoryAccess(
  4633. Framework::Assembly::MemoryBlockSize::WORD),
  4634. MODRM_RM,
  4635. READ,
  4636. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  4637. IMM16,
  4638. READ),
  4639. // TEST r/m32, imm32
  4640. MachineCodeTableEntry(false,
  4641. 0xF7,
  4642. (char)1,
  4643. false,
  4644. false,
  4645. false,
  4646. 0,
  4647. 0,
  4648. isGPRegisterOrMemoryAccess(
  4649. Framework::Assembly::MemoryBlockSize::DWORD),
  4650. MODRM_RM,
  4651. READ,
  4652. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4653. IMM32,
  4654. READ),
  4655. // TEST r/m64, imm32
  4656. MachineCodeTableEntry(true,
  4657. 0xF7,
  4658. (char)1,
  4659. false,
  4660. false,
  4661. false,
  4662. 0,
  4663. 0,
  4664. isGPRegisterOrMemoryAccess(
  4665. Framework::Assembly::MemoryBlockSize::QWORD),
  4666. MODRM_RM,
  4667. READ,
  4668. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4669. IMM32,
  4670. READ),
  4671. // TEST r/m8, r8
  4672. MachineCodeTableEntry(false,
  4673. 0x84,
  4674. (char)1,
  4675. false,
  4676. false,
  4677. false,
  4678. 0,
  4679. 0,
  4680. isGPRegisterOrMemoryAccess(
  4681. Framework::Assembly::MemoryBlockSize::BYTE),
  4682. MODRM_RM,
  4683. READ,
  4684. isGPRegister(
  4685. Framework::Assembly::MemoryBlockSize::BYTE),
  4686. MODRM_REG,
  4687. READ),
  4688. // TEST r/m16, r16
  4689. MachineCodeTableEntry(false,
  4690. 0x85,
  4691. (char)1,
  4692. true,
  4693. false,
  4694. false,
  4695. 0,
  4696. 0,
  4697. isGPRegisterOrMemoryAccess(
  4698. Framework::Assembly::MemoryBlockSize::WORD),
  4699. MODRM_RM,
  4700. READ,
  4701. isGPRegister(
  4702. Framework::Assembly::MemoryBlockSize::WORD),
  4703. MODRM_REG,
  4704. READ),
  4705. // TEST r/m32, r32
  4706. MachineCodeTableEntry(false,
  4707. 0x85,
  4708. (char)1,
  4709. false,
  4710. false,
  4711. false,
  4712. 0,
  4713. 0,
  4714. isGPRegisterOrMemoryAccess(
  4715. Framework::Assembly::MemoryBlockSize::DWORD),
  4716. MODRM_RM,
  4717. READ,
  4718. isGPRegister(
  4719. Framework::Assembly::MemoryBlockSize::DWORD),
  4720. MODRM_REG,
  4721. READ),
  4722. // TEST r/m64, r64
  4723. MachineCodeTableEntry(true,
  4724. 0x85,
  4725. (char)1,
  4726. false,
  4727. false,
  4728. false,
  4729. 0,
  4730. 0,
  4731. isGPRegisterOrMemoryAccess(
  4732. Framework::Assembly::MemoryBlockSize::QWORD),
  4733. MODRM_RM,
  4734. READ,
  4735. isGPRegister(
  4736. Framework::Assembly::MemoryBlockSize::QWORD),
  4737. MODRM_REG,
  4738. READ),
  4739. }));
  4740. OperationCodeTable::machineCodeTranslationTable.add(
  4741. new OperationCodeTable(Framework::Assembly::CMP,
  4742. {
  4743. // CMP AL, imm8
  4744. MachineCodeTableEntry(false,
  4745. 0x3C,
  4746. (char)1,
  4747. false,
  4748. false,
  4749. false,
  4750. 0,
  4751. 0,
  4752. isSpecificGPRegister(Framework::Assembly::RAX,
  4753. Framework::Assembly::LOWER8),
  4754. UNDEFINED,
  4755. READ,
  4756. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  4757. IMM8,
  4758. READ),
  4759. // CMP AX, imm16
  4760. MachineCodeTableEntry(false,
  4761. 0x3D,
  4762. (char)1,
  4763. true,
  4764. false,
  4765. false,
  4766. 0,
  4767. 0,
  4768. isSpecificGPRegister(Framework::Assembly::RAX,
  4769. Framework::Assembly::LOWER16),
  4770. UNDEFINED,
  4771. READ,
  4772. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  4773. IMM16,
  4774. READ),
  4775. // CMP EAX, imm32
  4776. MachineCodeTableEntry(false,
  4777. 0x3D,
  4778. (char)1,
  4779. false,
  4780. false,
  4781. false,
  4782. 0,
  4783. 0,
  4784. isSpecificGPRegister(Framework::Assembly::RAX,
  4785. Framework::Assembly::LOWER32),
  4786. UNDEFINED,
  4787. READ,
  4788. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4789. IMM32,
  4790. READ),
  4791. // CMP RAX, imm32
  4792. MachineCodeTableEntry(true,
  4793. 0x3D,
  4794. (char)1,
  4795. false,
  4796. false,
  4797. false,
  4798. 0,
  4799. 0,
  4800. isSpecificGPRegister(Framework::Assembly::RAX,
  4801. Framework::Assembly::FULL64),
  4802. UNDEFINED,
  4803. READ,
  4804. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4805. IMM32,
  4806. READ),
  4807. // CMP r/m8, imm8
  4808. MachineCodeTableEntry(false,
  4809. 0x80,
  4810. (char)1,
  4811. false,
  4812. false,
  4813. false,
  4814. 0,
  4815. 0b111,
  4816. isGPRegisterOrMemoryAccess(
  4817. Framework::Assembly::MemoryBlockSize::BYTE),
  4818. MODRM_RM,
  4819. READ,
  4820. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  4821. IMM8,
  4822. READ),
  4823. // CMP r/m16, imm8
  4824. MachineCodeTableEntry(false,
  4825. 0x83,
  4826. (char)1,
  4827. true,
  4828. false,
  4829. false,
  4830. 0,
  4831. 0b111,
  4832. isGPRegisterOrMemoryAccess(
  4833. Framework::Assembly::MemoryBlockSize::WORD),
  4834. MODRM_RM,
  4835. READ,
  4836. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  4837. IMM8,
  4838. READ),
  4839. // CMP r/m32, imm8
  4840. MachineCodeTableEntry(false,
  4841. 0x83,
  4842. (char)1,
  4843. false,
  4844. false,
  4845. false,
  4846. 0,
  4847. 0b111,
  4848. isGPRegisterOrMemoryAccess(
  4849. Framework::Assembly::MemoryBlockSize::DWORD),
  4850. MODRM_RM,
  4851. READ,
  4852. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  4853. IMM8,
  4854. READ),
  4855. // CMP r/m64, imm8
  4856. MachineCodeTableEntry(true,
  4857. 0x83,
  4858. (char)1,
  4859. false,
  4860. false,
  4861. false,
  4862. 0,
  4863. 0b111,
  4864. isGPRegisterOrMemoryAccess(
  4865. Framework::Assembly::MemoryBlockSize::QWORD),
  4866. MODRM_RM,
  4867. READ,
  4868. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  4869. IMM8,
  4870. READ),
  4871. // CMP r/m16, imm16
  4872. MachineCodeTableEntry(false,
  4873. 0x81,
  4874. (char)1,
  4875. true,
  4876. false,
  4877. false,
  4878. 0,
  4879. 0b111,
  4880. isGPRegisterOrMemoryAccess(
  4881. Framework::Assembly::MemoryBlockSize::WORD),
  4882. MODRM_RM,
  4883. READ,
  4884. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  4885. IMM16,
  4886. READ),
  4887. // CMP r/m32, imm32
  4888. MachineCodeTableEntry(false,
  4889. 0x81,
  4890. (char)1,
  4891. false,
  4892. false,
  4893. false,
  4894. 0,
  4895. 0b111,
  4896. isGPRegisterOrMemoryAccess(
  4897. Framework::Assembly::MemoryBlockSize::DWORD),
  4898. MODRM_RM,
  4899. READ,
  4900. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4901. IMM32,
  4902. READ),
  4903. // TEST r/m64, imm32
  4904. MachineCodeTableEntry(true,
  4905. 0x81,
  4906. (char)1,
  4907. false,
  4908. false,
  4909. false,
  4910. 0,
  4911. 0b111,
  4912. isGPRegisterOrMemoryAccess(
  4913. Framework::Assembly::MemoryBlockSize::QWORD),
  4914. MODRM_RM,
  4915. READ,
  4916. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  4917. IMM32,
  4918. READ),
  4919. // CMP r/m8, r8
  4920. MachineCodeTableEntry(false,
  4921. 0x38,
  4922. (char)1,
  4923. false,
  4924. false,
  4925. false,
  4926. 0,
  4927. 0b111,
  4928. isGPRegisterOrMemoryAccess(
  4929. Framework::Assembly::MemoryBlockSize::BYTE),
  4930. MODRM_RM,
  4931. READ,
  4932. isGPRegister(
  4933. Framework::Assembly::MemoryBlockSize::BYTE),
  4934. MODRM_REG,
  4935. READ),
  4936. // CMP r/m16, r16
  4937. MachineCodeTableEntry(false,
  4938. 0x39,
  4939. (char)1,
  4940. true,
  4941. false,
  4942. false,
  4943. 0,
  4944. 0,
  4945. isGPRegisterOrMemoryAccess(
  4946. Framework::Assembly::MemoryBlockSize::WORD),
  4947. MODRM_RM,
  4948. READ,
  4949. isGPRegister(
  4950. Framework::Assembly::MemoryBlockSize::WORD),
  4951. MODRM_REG,
  4952. READ),
  4953. // CMP r/m32, r32
  4954. MachineCodeTableEntry(false,
  4955. 0x39,
  4956. (char)1,
  4957. false,
  4958. false,
  4959. false,
  4960. 0,
  4961. 0,
  4962. isGPRegisterOrMemoryAccess(
  4963. Framework::Assembly::MemoryBlockSize::DWORD),
  4964. MODRM_RM,
  4965. READ,
  4966. isGPRegister(
  4967. Framework::Assembly::MemoryBlockSize::DWORD),
  4968. MODRM_REG,
  4969. READ),
  4970. // CMP r/m64, r64
  4971. MachineCodeTableEntry(true,
  4972. 0x39,
  4973. (char)1,
  4974. false,
  4975. false,
  4976. false,
  4977. 0,
  4978. 0,
  4979. isGPRegisterOrMemoryAccess(
  4980. Framework::Assembly::MemoryBlockSize::QWORD),
  4981. MODRM_RM,
  4982. READ,
  4983. isGPRegister(
  4984. Framework::Assembly::MemoryBlockSize::QWORD),
  4985. MODRM_REG,
  4986. READ),
  4987. // CMP r8, r/m8
  4988. MachineCodeTableEntry(false,
  4989. 0x3A,
  4990. (char)1,
  4991. false,
  4992. false,
  4993. false,
  4994. 0,
  4995. 0,
  4996. isGPRegister(
  4997. Framework::Assembly::MemoryBlockSize::BYTE),
  4998. MODRM_REG,
  4999. READ,
  5000. isGPRegisterOrMemoryAccess(
  5001. Framework::Assembly::MemoryBlockSize::BYTE),
  5002. MODRM_RM,
  5003. READ),
  5004. // CMP r16, r/m16
  5005. MachineCodeTableEntry(false,
  5006. 0x3B,
  5007. (char)1,
  5008. true,
  5009. false,
  5010. false,
  5011. 0,
  5012. 0,
  5013. isGPRegister(
  5014. Framework::Assembly::MemoryBlockSize::WORD),
  5015. MODRM_REG,
  5016. READ,
  5017. isGPRegisterOrMemoryAccess(
  5018. Framework::Assembly::MemoryBlockSize::WORD),
  5019. MODRM_RM,
  5020. READ),
  5021. // CMP r32, r/m32
  5022. MachineCodeTableEntry(false,
  5023. 0x3B,
  5024. (char)1,
  5025. false,
  5026. false,
  5027. false,
  5028. 0,
  5029. 0,
  5030. isGPRegister(
  5031. Framework::Assembly::MemoryBlockSize::DWORD),
  5032. MODRM_REG,
  5033. READ,
  5034. isGPRegisterOrMemoryAccess(
  5035. Framework::Assembly::MemoryBlockSize::DWORD),
  5036. MODRM_RM,
  5037. READ),
  5038. // CMP r64, r/m64
  5039. MachineCodeTableEntry(true,
  5040. 0x3B,
  5041. (char)1,
  5042. false,
  5043. false,
  5044. false,
  5045. 0,
  5046. 0,
  5047. isGPRegister(
  5048. Framework::Assembly::MemoryBlockSize::QWORD),
  5049. MODRM_REG,
  5050. READ,
  5051. isGPRegisterOrMemoryAccess(
  5052. Framework::Assembly::MemoryBlockSize::QWORD),
  5053. MODRM_RM,
  5054. READ),
  5055. }));
  5056. OperationCodeTable::machineCodeTranslationTable.add(
  5057. new OperationCodeTable(Framework::Assembly::CMPPD,
  5058. {
  5059. // CMPPD xmm1, xmm2/m128, imm8
  5060. MachineCodeTableEntry(false,
  5061. 0xC20F,
  5062. (char)2,
  5063. true,
  5064. false,
  5065. false,
  5066. 0,
  5067. 0,
  5068. isFPRegister(
  5069. Framework::Assembly::MemoryBlockSize::M128),
  5070. MODRM_REG,
  5071. READWRITE,
  5072. isFPRegisterOrMEmoryAccess(
  5073. Framework::Assembly::MemoryBlockSize::M128),
  5074. MODRM_RM,
  5075. READ,
  5076. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  5077. IMM8,
  5078. READ),
  5079. // VCMPPD xmm1, xmm2, xmm3/m128, imm8
  5080. MachineCodeTableEntry(false,
  5081. 0xC20F,
  5082. (char)2,
  5083. false,
  5084. true,
  5085. false,
  5086. 0b01,
  5087. 0,
  5088. isFPRegister(
  5089. Framework::Assembly::MemoryBlockSize::M128),
  5090. MODRM_REG,
  5091. WRITE,
  5092. isFPRegister(
  5093. Framework::Assembly::MemoryBlockSize::M128),
  5094. VEX_VVVV,
  5095. READ,
  5096. isFPRegisterOrMEmoryAccess(
  5097. Framework::Assembly::MemoryBlockSize::M128),
  5098. MODRM_RM,
  5099. READ,
  5100. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  5101. IMM8,
  5102. READ),
  5103. // VCMPPD ymm1, ymm2, ymm3/m256, imm8
  5104. MachineCodeTableEntry(false,
  5105. 0xC20F,
  5106. (char)2,
  5107. false,
  5108. true,
  5109. true,
  5110. 0b01,
  5111. 0,
  5112. isFPRegister(
  5113. Framework::Assembly::MemoryBlockSize::M256),
  5114. MODRM_REG,
  5115. WRITE,
  5116. isFPRegister(
  5117. Framework::Assembly::MemoryBlockSize::M256),
  5118. VEX_VVVV,
  5119. READ,
  5120. isFPRegisterOrMEmoryAccess(
  5121. Framework::Assembly::MemoryBlockSize::M256),
  5122. MODRM_RM,
  5123. READ,
  5124. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  5125. IMM8,
  5126. READ),
  5127. }));
  5128. OperationCodeTable::machineCodeTranslationTable.add(
  5129. new OperationCodeTable(Framework::Assembly::CMPPS,
  5130. {
  5131. // CMPPS xmm1, xmm2/m128, imm8
  5132. MachineCodeTableEntry(false,
  5133. 0xC20F,
  5134. (char)2,
  5135. false,
  5136. false,
  5137. false,
  5138. 0,
  5139. 0,
  5140. isFPRegister(
  5141. Framework::Assembly::MemoryBlockSize::M128),
  5142. MODRM_REG,
  5143. READWRITE,
  5144. isFPRegisterOrMEmoryAccess(
  5145. Framework::Assembly::MemoryBlockSize::M128),
  5146. MODRM_RM,
  5147. READ,
  5148. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  5149. IMM8,
  5150. READ),
  5151. // VCMPPS xmm1, xmm2, xmm3/m128, imm8
  5152. MachineCodeTableEntry(false,
  5153. 0xC20F,
  5154. (char)2,
  5155. false,
  5156. true,
  5157. false,
  5158. 0b00,
  5159. 0,
  5160. isFPRegister(
  5161. Framework::Assembly::MemoryBlockSize::M128),
  5162. MODRM_REG,
  5163. WRITE,
  5164. isFPRegister(
  5165. Framework::Assembly::MemoryBlockSize::M128),
  5166. VEX_VVVV,
  5167. READ,
  5168. isFPRegisterOrMEmoryAccess(
  5169. Framework::Assembly::MemoryBlockSize::M128),
  5170. MODRM_RM,
  5171. READ,
  5172. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  5173. IMM8,
  5174. READ),
  5175. // VCMPPS ymm1, ymm2, ymm3/m256, imm8
  5176. MachineCodeTableEntry(false,
  5177. 0xC20F,
  5178. (char)2,
  5179. false,
  5180. true,
  5181. true,
  5182. 0b00,
  5183. 0,
  5184. isFPRegister(
  5185. Framework::Assembly::MemoryBlockSize::M256),
  5186. MODRM_REG,
  5187. WRITE,
  5188. isFPRegister(
  5189. Framework::Assembly::MemoryBlockSize::M256),
  5190. VEX_VVVV,
  5191. READ,
  5192. isFPRegisterOrMEmoryAccess(
  5193. Framework::Assembly::MemoryBlockSize::M256),
  5194. MODRM_RM,
  5195. READ,
  5196. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  5197. IMM8,
  5198. READ),
  5199. }));
  5200. OperationCodeTable::machineCodeTranslationTable.add(
  5201. new OperationCodeTable(Framework::Assembly::CMPSD,
  5202. {
  5203. // CMPSD xmm1, xmm2/m128, imm8
  5204. MachineCodeTableEntry(false,
  5205. 0xC20FF2,
  5206. (char)3,
  5207. false,
  5208. false,
  5209. false,
  5210. 0,
  5211. 0,
  5212. isFPRegister(
  5213. Framework::Assembly::MemoryBlockSize::M128),
  5214. MODRM_REG,
  5215. READWRITE,
  5216. isFPRegisterOrMEmoryAccess(
  5217. Framework::Assembly::MemoryBlockSize::M128),
  5218. MODRM_RM,
  5219. READ,
  5220. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  5221. IMM8,
  5222. READ),
  5223. // VCMPSD xmm1, xmm2, xmm3/m128, imm8
  5224. MachineCodeTableEntry(false,
  5225. 0xC20F,
  5226. (char)2,
  5227. false,
  5228. true,
  5229. false,
  5230. 0b11,
  5231. 0,
  5232. isFPRegister(
  5233. Framework::Assembly::MemoryBlockSize::M128),
  5234. MODRM_REG,
  5235. WRITE,
  5236. isFPRegister(
  5237. Framework::Assembly::MemoryBlockSize::M128),
  5238. VEX_VVVV,
  5239. READ,
  5240. isFPRegisterOrMEmoryAccess(
  5241. Framework::Assembly::MemoryBlockSize::M128),
  5242. MODRM_RM,
  5243. READ,
  5244. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  5245. IMM8,
  5246. READ),
  5247. }));
  5248. OperationCodeTable::machineCodeTranslationTable.add(
  5249. new OperationCodeTable(Framework::Assembly::CMPSS,
  5250. {
  5251. // CMPSS xmm1, xmm2/m128, imm8
  5252. MachineCodeTableEntry(false,
  5253. 0xC20FF3,
  5254. (char)3,
  5255. false,
  5256. false,
  5257. false,
  5258. 0,
  5259. 0,
  5260. isFPRegister(
  5261. Framework::Assembly::MemoryBlockSize::M128),
  5262. MODRM_REG,
  5263. READWRITE,
  5264. isFPRegisterOrMEmoryAccess(
  5265. Framework::Assembly::MemoryBlockSize::M128),
  5266. MODRM_RM,
  5267. READ,
  5268. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  5269. IMM8,
  5270. READ),
  5271. // VCMPSS xmm1, xmm2, xmm3/m128, imm8
  5272. MachineCodeTableEntry(false,
  5273. 0xC20F,
  5274. (char)2,
  5275. false,
  5276. true,
  5277. false,
  5278. 0b10,
  5279. 0,
  5280. isFPRegister(
  5281. Framework::Assembly::MemoryBlockSize::M128),
  5282. MODRM_REG,
  5283. WRITE,
  5284. isFPRegister(
  5285. Framework::Assembly::MemoryBlockSize::M128),
  5286. VEX_VVVV,
  5287. READ,
  5288. isFPRegisterOrMEmoryAccess(
  5289. Framework::Assembly::MemoryBlockSize::M128),
  5290. MODRM_RM,
  5291. READ,
  5292. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  5293. IMM8,
  5294. READ),
  5295. }));
  5296. OperationCodeTable::machineCodeTranslationTable.add(
  5297. new OperationCodeTable(Framework::Assembly::MOV,
  5298. {// MOV r/m8, r8
  5299. MachineCodeTableEntry(false,
  5300. 0x88,
  5301. (char)1,
  5302. false,
  5303. false,
  5304. false,
  5305. 0,
  5306. 0,
  5307. isGPRegisterOrMemoryAccess(
  5308. Framework::Assembly::MemoryBlockSize::BYTE),
  5309. MODRM_RM,
  5310. WRITE,
  5311. isGPRegister(
  5312. Framework::Assembly::MemoryBlockSize::BYTE),
  5313. MODRM_REG,
  5314. READ),
  5315. // MOV r/m16, r16
  5316. MachineCodeTableEntry(false,
  5317. 0x89,
  5318. (char)1,
  5319. true,
  5320. false,
  5321. false,
  5322. 0,
  5323. 0,
  5324. isGPRegisterOrMemoryAccess(
  5325. Framework::Assembly::MemoryBlockSize::WORD),
  5326. MODRM_RM,
  5327. WRITE,
  5328. isGPRegister(
  5329. Framework::Assembly::MemoryBlockSize::WORD),
  5330. MODRM_REG,
  5331. READ),
  5332. // MOV r/m32, r32
  5333. MachineCodeTableEntry(false,
  5334. 0x89,
  5335. (char)1,
  5336. false,
  5337. false,
  5338. false,
  5339. 0,
  5340. 0,
  5341. isGPRegisterOrMemoryAccess(
  5342. Framework::Assembly::MemoryBlockSize::DWORD),
  5343. MODRM_RM,
  5344. WRITE,
  5345. isGPRegister(
  5346. Framework::Assembly::MemoryBlockSize::DWORD),
  5347. MODRM_REG,
  5348. READ),
  5349. // MOV r/m64, r64
  5350. MachineCodeTableEntry(true,
  5351. 0x89,
  5352. (char)1,
  5353. false,
  5354. false,
  5355. false,
  5356. 0,
  5357. 0,
  5358. isGPRegisterOrMemoryAccess(
  5359. Framework::Assembly::MemoryBlockSize::QWORD),
  5360. MODRM_RM,
  5361. WRITE,
  5362. isGPRegister(
  5363. Framework::Assembly::MemoryBlockSize::QWORD),
  5364. MODRM_REG,
  5365. READ),
  5366. // MOV r8, r/m8
  5367. MachineCodeTableEntry(false,
  5368. 0x8A,
  5369. (char)1,
  5370. false,
  5371. false,
  5372. false,
  5373. 0,
  5374. 0,
  5375. isGPRegister(
  5376. Framework::Assembly::MemoryBlockSize::BYTE),
  5377. MODRM_REG,
  5378. WRITE,
  5379. isGPRegisterOrMemoryAccess(
  5380. Framework::Assembly::MemoryBlockSize::BYTE),
  5381. MODRM_RM,
  5382. READ),
  5383. // MOV r/m16, r16
  5384. MachineCodeTableEntry(false,
  5385. 0x8B,
  5386. (char)1,
  5387. true,
  5388. false,
  5389. false,
  5390. 0,
  5391. 0,
  5392. isGPRegister(
  5393. Framework::Assembly::MemoryBlockSize::WORD),
  5394. MODRM_REG,
  5395. WRITE,
  5396. isGPRegisterOrMemoryAccess(
  5397. Framework::Assembly::MemoryBlockSize::WORD),
  5398. MODRM_RM,
  5399. READ),
  5400. // MOV r/m32, r32
  5401. MachineCodeTableEntry(false,
  5402. 0x8B,
  5403. (char)1,
  5404. false,
  5405. false,
  5406. false,
  5407. 0,
  5408. 0,
  5409. isGPRegister(
  5410. Framework::Assembly::MemoryBlockSize::DWORD),
  5411. MODRM_REG,
  5412. WRITE,
  5413. isGPRegisterOrMemoryAccess(
  5414. Framework::Assembly::MemoryBlockSize::DWORD),
  5415. MODRM_RM,
  5416. READ),
  5417. // MOV r/m64, r64
  5418. MachineCodeTableEntry(true,
  5419. 0x8B,
  5420. (char)1,
  5421. false,
  5422. false,
  5423. false,
  5424. 0,
  5425. 0,
  5426. isGPRegister(
  5427. Framework::Assembly::MemoryBlockSize::QWORD),
  5428. MODRM_REG,
  5429. WRITE,
  5430. isGPRegisterOrMemoryAccess(
  5431. Framework::Assembly::MemoryBlockSize::QWORD),
  5432. MODRM_RM,
  5433. READ),
  5434. // Move imm8 to r8
  5435. MachineCodeTableEntry(false,
  5436. 0xB0,
  5437. (char)1,
  5438. false,
  5439. false,
  5440. false,
  5441. 0,
  5442. 0,
  5443. isGPRegister(
  5444. Framework::Assembly::MemoryBlockSize::BYTE),
  5445. OPCODE_RD,
  5446. WRITE,
  5447. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  5448. IMM8,
  5449. READ),
  5450. // MOV r16, imm16
  5451. MachineCodeTableEntry(false,
  5452. 0xB8,
  5453. (char)1,
  5454. true,
  5455. false,
  5456. false,
  5457. 0,
  5458. 0,
  5459. isGPRegister(
  5460. Framework::Assembly::MemoryBlockSize::WORD),
  5461. OPCODE_RD,
  5462. WRITE,
  5463. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  5464. IMM16,
  5465. READ),
  5466. // MOV r32, imm32
  5467. MachineCodeTableEntry(false,
  5468. 0xB8,
  5469. (char)1,
  5470. false,
  5471. false,
  5472. false,
  5473. 0,
  5474. 0,
  5475. isGPRegister(
  5476. Framework::Assembly::MemoryBlockSize::DWORD),
  5477. OPCODE_RD,
  5478. WRITE,
  5479. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  5480. IMM32,
  5481. READ),
  5482. // MOV r64, imm64
  5483. MachineCodeTableEntry(true,
  5484. 0xB8,
  5485. (char)1,
  5486. false,
  5487. false,
  5488. false,
  5489. 0,
  5490. 0,
  5491. isGPRegister(
  5492. Framework::Assembly::MemoryBlockSize::QWORD),
  5493. OPCODE_RD,
  5494. WRITE,
  5495. isIMM(Framework::Assembly::MemoryBlockSize::QWORD),
  5496. IMM64,
  5497. READ),
  5498. // MOV r/m8, imm8
  5499. MachineCodeTableEntry(false,
  5500. 0xC6,
  5501. (char)1,
  5502. false,
  5503. false,
  5504. false,
  5505. 0,
  5506. 0,
  5507. isGPRegisterOrMemoryAccess(
  5508. Framework::Assembly::MemoryBlockSize::BYTE),
  5509. MODRM_RM,
  5510. WRITE,
  5511. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  5512. IMM8,
  5513. READ),
  5514. // MOV r/m16, imm16
  5515. MachineCodeTableEntry(false,
  5516. 0xC7,
  5517. (char)1,
  5518. true,
  5519. false,
  5520. false,
  5521. 0,
  5522. 0,
  5523. isGPRegisterOrMemoryAccess(
  5524. Framework::Assembly::MemoryBlockSize::WORD),
  5525. MODRM_RM,
  5526. WRITE,
  5527. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  5528. IMM16,
  5529. READ),
  5530. // MOV r/m32, imm32
  5531. MachineCodeTableEntry(false,
  5532. 0xC7,
  5533. (char)1,
  5534. false,
  5535. false,
  5536. false,
  5537. 0,
  5538. 0,
  5539. isGPRegisterOrMemoryAccess(
  5540. Framework::Assembly::MemoryBlockSize::DWORD),
  5541. MODRM_RM,
  5542. WRITE,
  5543. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  5544. IMM32,
  5545. READ),
  5546. // MOV r/m64, imm64
  5547. MachineCodeTableEntry(true,
  5548. 0xC7,
  5549. (char)1,
  5550. false,
  5551. false,
  5552. false,
  5553. 0,
  5554. 0,
  5555. isGPRegisterOrMemoryAccess(
  5556. Framework::Assembly::MemoryBlockSize::QWORD),
  5557. MODRM_RM,
  5558. WRITE,
  5559. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  5560. IMM32,
  5561. READ)}));
  5562. OperationCodeTable::machineCodeTranslationTable.add(
  5563. new OperationCodeTable(Framework::Assembly::MOVAPD,
  5564. {
  5565. // MOVAPD xmm1, xmm2/m128
  5566. MachineCodeTableEntry(false,
  5567. 0x280F,
  5568. (char)2,
  5569. true,
  5570. false,
  5571. false,
  5572. 0,
  5573. 0,
  5574. isFPRegister(
  5575. Framework::Assembly::MemoryBlockSize::M128),
  5576. MODRM_REG,
  5577. WRITE,
  5578. isFPRegisterOrMEmoryAccess(
  5579. Framework::Assembly::MemoryBlockSize::M128),
  5580. MODRM_RM,
  5581. READ),
  5582. // MOVAPD xmm2/m128, xmm1
  5583. MachineCodeTableEntry(false,
  5584. 0x290F,
  5585. (char)2,
  5586. true,
  5587. false,
  5588. false,
  5589. 0,
  5590. 0,
  5591. isFPRegisterOrMEmoryAccess(
  5592. Framework::Assembly::MemoryBlockSize::M128),
  5593. MODRM_RM,
  5594. WRITE,
  5595. isFPRegister(
  5596. Framework::Assembly::MemoryBlockSize::M128),
  5597. MODRM_REG,
  5598. READ),
  5599. // MOVAPD xmm1, xmm2/m128
  5600. MachineCodeTableEntry(false,
  5601. 0x280F,
  5602. (char)2,
  5603. false,
  5604. true,
  5605. false,
  5606. 0b01,
  5607. 0,
  5608. isFPRegister(
  5609. Framework::Assembly::MemoryBlockSize::M128),
  5610. MODRM_REG,
  5611. WRITE,
  5612. isFPRegisterOrMEmoryAccess(
  5613. Framework::Assembly::MemoryBlockSize::M128),
  5614. MODRM_RM,
  5615. READ),
  5616. // VMOVAPD xmm2/m128, xmm1
  5617. MachineCodeTableEntry(false,
  5618. 0x290F,
  5619. (char)2,
  5620. false,
  5621. true,
  5622. false,
  5623. 0b01,
  5624. 0,
  5625. isFPRegisterOrMEmoryAccess(
  5626. Framework::Assembly::MemoryBlockSize::M128),
  5627. MODRM_RM,
  5628. WRITE,
  5629. isFPRegister(
  5630. Framework::Assembly::MemoryBlockSize::M128),
  5631. MODRM_REG,
  5632. READ),
  5633. // MOVAPD ymm1, ymm2/m256
  5634. MachineCodeTableEntry(false,
  5635. 0x280F,
  5636. (char)2,
  5637. false,
  5638. true,
  5639. true,
  5640. 0b01,
  5641. 0,
  5642. isFPRegister(
  5643. Framework::Assembly::MemoryBlockSize::M256),
  5644. MODRM_REG,
  5645. WRITE,
  5646. isFPRegisterOrMEmoryAccess(
  5647. Framework::Assembly::MemoryBlockSize::M256),
  5648. MODRM_RM,
  5649. READ),
  5650. // VMOVAPD ymm2/m256, ymm1
  5651. MachineCodeTableEntry(false,
  5652. 0x290F,
  5653. (char)2,
  5654. false,
  5655. true,
  5656. true,
  5657. 0b01,
  5658. 0,
  5659. isFPRegisterOrMEmoryAccess(
  5660. Framework::Assembly::MemoryBlockSize::M256),
  5661. MODRM_RM,
  5662. WRITE,
  5663. isFPRegister(
  5664. Framework::Assembly::MemoryBlockSize::M256),
  5665. MODRM_REG,
  5666. READ),
  5667. }));
  5668. OperationCodeTable::machineCodeTranslationTable.add(
  5669. new OperationCodeTable(Framework::Assembly::MOVAPS,
  5670. {
  5671. // MOVAPS xmm1, xmm2/m128
  5672. MachineCodeTableEntry(false,
  5673. 0x280F,
  5674. (char)2,
  5675. false,
  5676. false,
  5677. false,
  5678. 0,
  5679. 0,
  5680. isFPRegister(
  5681. Framework::Assembly::MemoryBlockSize::M128),
  5682. MODRM_REG,
  5683. WRITE,
  5684. isFPRegisterOrMEmoryAccess(
  5685. Framework::Assembly::MemoryBlockSize::M128),
  5686. MODRM_RM,
  5687. READ),
  5688. // MOVAPS xmm2/m128, xmm1
  5689. MachineCodeTableEntry(false,
  5690. 0x290F,
  5691. (char)2,
  5692. false,
  5693. false,
  5694. false,
  5695. 0,
  5696. 0,
  5697. isFPRegisterOrMEmoryAccess(
  5698. Framework::Assembly::MemoryBlockSize::M128),
  5699. MODRM_RM,
  5700. WRITE,
  5701. isFPRegister(
  5702. Framework::Assembly::MemoryBlockSize::M128),
  5703. MODRM_REG,
  5704. READ),
  5705. // VMOVAPS xmm1, xmm2/m128
  5706. MachineCodeTableEntry(false,
  5707. 0x280F,
  5708. (char)2,
  5709. false,
  5710. true,
  5711. false,
  5712. 0b00,
  5713. 0,
  5714. isFPRegister(
  5715. Framework::Assembly::MemoryBlockSize::M128),
  5716. MODRM_REG,
  5717. WRITE,
  5718. isFPRegisterOrMEmoryAccess(
  5719. Framework::Assembly::MemoryBlockSize::M128),
  5720. MODRM_RM,
  5721. READ),
  5722. // VMOVAPS xmm2/m128, xmm1
  5723. MachineCodeTableEntry(false,
  5724. 0x290F,
  5725. (char)2,
  5726. false,
  5727. true,
  5728. false,
  5729. 0b00,
  5730. 0,
  5731. isFPRegisterOrMEmoryAccess(
  5732. Framework::Assembly::MemoryBlockSize::M128),
  5733. MODRM_RM,
  5734. WRITE,
  5735. isFPRegister(
  5736. Framework::Assembly::MemoryBlockSize::M128),
  5737. MODRM_REG,
  5738. READ),
  5739. // VMOVAPS ymm1, ymm2/m256
  5740. MachineCodeTableEntry(false,
  5741. 0x280F,
  5742. (char)2,
  5743. false,
  5744. true,
  5745. true,
  5746. 0b00,
  5747. 0,
  5748. isFPRegister(
  5749. Framework::Assembly::MemoryBlockSize::M256),
  5750. MODRM_REG,
  5751. WRITE,
  5752. isFPRegisterOrMEmoryAccess(
  5753. Framework::Assembly::MemoryBlockSize::M256),
  5754. MODRM_RM,
  5755. READ),
  5756. // VMOVAPS ymm2/m256, ymm1
  5757. MachineCodeTableEntry(false,
  5758. 0x290F,
  5759. (char)2,
  5760. false,
  5761. true,
  5762. true,
  5763. 0b00,
  5764. 0,
  5765. isFPRegisterOrMEmoryAccess(
  5766. Framework::Assembly::MemoryBlockSize::M256),
  5767. MODRM_RM,
  5768. WRITE,
  5769. isFPRegister(
  5770. Framework::Assembly::MemoryBlockSize::M256),
  5771. MODRM_REG,
  5772. READ),
  5773. }));
  5774. OperationCodeTable::machineCodeTranslationTable.add(
  5775. new OperationCodeTable(Framework::Assembly::MOVSD,
  5776. {
  5777. // MOVSD xmm1, xmm2/m64
  5778. MachineCodeTableEntry(false,
  5779. 0x100FF2,
  5780. (char)3,
  5781. false,
  5782. false,
  5783. false,
  5784. 0,
  5785. 0,
  5786. isFPRegister(
  5787. Framework::Assembly::MemoryBlockSize::M128),
  5788. MODRM_REG,
  5789. WRITE,
  5790. isFPRegisterOrMEmoryAccess(
  5791. Framework::Assembly::MemoryBlockSize::M128,
  5792. Framework::Assembly::MemoryBlockSize::QWORD),
  5793. MODRM_RM,
  5794. READ),
  5795. // MOVSD xmm2/m128, xmm1
  5796. MachineCodeTableEntry(false,
  5797. 0x110FF2,
  5798. (char)3,
  5799. false,
  5800. false,
  5801. false,
  5802. 0,
  5803. 0,
  5804. isFPRegisterOrMEmoryAccess(
  5805. Framework::Assembly::MemoryBlockSize::M128,
  5806. Framework::Assembly::MemoryBlockSize::QWORD),
  5807. MODRM_RM,
  5808. WRITE,
  5809. isFPRegister(
  5810. Framework::Assembly::MemoryBlockSize::M128),
  5811. MODRM_REG,
  5812. READ),
  5813. // VMOVSD VMOVSD xmm1, xmm2, xmm3
  5814. MachineCodeTableEntry(false,
  5815. 0x100F,
  5816. (char)2,
  5817. false,
  5818. true,
  5819. false,
  5820. 0b11,
  5821. 0,
  5822. isFPRegister(
  5823. Framework::Assembly::MemoryBlockSize::M128),
  5824. MODRM_REG,
  5825. WRITE,
  5826. isFPRegister(
  5827. Framework::Assembly::MemoryBlockSize::M128),
  5828. VEX_VVVV,
  5829. READ,
  5830. isFPRegister(
  5831. Framework::Assembly::MemoryBlockSize::M128),
  5832. MODRM_RM,
  5833. READ),
  5834. }));
  5835. OperationCodeTable::machineCodeTranslationTable.add(
  5836. new OperationCodeTable(Framework::Assembly::MOVSS,
  5837. {
  5838. // MOVSS xmm1, xmm2/m32
  5839. MachineCodeTableEntry(false,
  5840. 0x100FF3,
  5841. (char)3,
  5842. false,
  5843. false,
  5844. false,
  5845. 0,
  5846. 0,
  5847. isFPRegister(
  5848. Framework::Assembly::MemoryBlockSize::M128),
  5849. MODRM_REG,
  5850. WRITE,
  5851. isFPRegisterOrMEmoryAccess(
  5852. Framework::Assembly::MemoryBlockSize::M128,
  5853. Framework::Assembly::MemoryBlockSize::DWORD),
  5854. MODRM_RM,
  5855. READ),
  5856. // MOVSS xmm2/m128, xmm1
  5857. MachineCodeTableEntry(false,
  5858. 0x110FF3,
  5859. (char)3,
  5860. false,
  5861. false,
  5862. false,
  5863. 0,
  5864. 0,
  5865. isFPRegisterOrMEmoryAccess(
  5866. Framework::Assembly::MemoryBlockSize::M128,
  5867. Framework::Assembly::MemoryBlockSize::QWORD),
  5868. MODRM_RM,
  5869. WRITE,
  5870. isFPRegister(
  5871. Framework::Assembly::MemoryBlockSize::M128),
  5872. MODRM_REG,
  5873. READ),
  5874. // VMOVSS VMOVSD xmm1, xmm2, xmm3
  5875. MachineCodeTableEntry(false,
  5876. 0x100F,
  5877. (char)2,
  5878. false,
  5879. true,
  5880. false,
  5881. 0b10,
  5882. 0,
  5883. isFPRegister(
  5884. Framework::Assembly::MemoryBlockSize::M128),
  5885. MODRM_REG,
  5886. WRITE,
  5887. isFPRegister(
  5888. Framework::Assembly::MemoryBlockSize::M128),
  5889. VEX_VVVV,
  5890. READ,
  5891. isFPRegister(
  5892. Framework::Assembly::MemoryBlockSize::M128),
  5893. MODRM_RM,
  5894. READ),
  5895. }));
  5896. OperationCodeTable::machineCodeTranslationTable.add(
  5897. new OperationCodeTable(Framework::Assembly::LEA,
  5898. {
  5899. // LEA r16,m
  5900. MachineCodeTableEntry(
  5901. false,
  5902. 0x8D,
  5903. (char)1,
  5904. true,
  5905. false,
  5906. false,
  5907. 0,
  5908. 0,
  5909. isGPRegister(
  5910. Framework::Assembly::MemoryBlockSize::WORD),
  5911. MODRM_REG,
  5912. WRITE,
  5913. [](const Framework::Assembly::OperationArgument& p) {
  5914. return p.asMemoryAccessArgument();
  5915. },
  5916. MODRM_RM,
  5917. READ),
  5918. // LEA r32,m
  5919. MachineCodeTableEntry(
  5920. false,
  5921. 0x8D,
  5922. (char)1,
  5923. false,
  5924. false,
  5925. false,
  5926. 0,
  5927. 0,
  5928. isGPRegister(
  5929. Framework::Assembly::MemoryBlockSize::DWORD),
  5930. MODRM_REG,
  5931. WRITE,
  5932. [](const Framework::Assembly::OperationArgument& p) {
  5933. return p.asMemoryAccessArgument();
  5934. },
  5935. MODRM_RM,
  5936. READ),
  5937. // LEA r64,m
  5938. MachineCodeTableEntry(
  5939. true,
  5940. 0x8D,
  5941. (char)1,
  5942. false,
  5943. false,
  5944. false,
  5945. 0,
  5946. 0,
  5947. isGPRegister(
  5948. Framework::Assembly::MemoryBlockSize::QWORD),
  5949. MODRM_REG,
  5950. WRITE,
  5951. [](const Framework::Assembly::OperationArgument& p) {
  5952. return p.asMemoryAccessArgument();
  5953. },
  5954. MODRM_RM,
  5955. READ),
  5956. }));
  5957. OperationCodeTable::machineCodeTranslationTable.add(
  5958. new JumpOperationCodeTable(Framework::Assembly::JMP,
  5959. 1,
  5960. {// JMP rel32
  5961. MachineCodeTableEntry(false,
  5962. 0xE9,
  5963. (char)1,
  5964. false,
  5965. false,
  5966. false,
  5967. 0,
  5968. 0,
  5969. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  5970. IMM32,
  5971. READ)}));
  5972. OperationCodeTable::machineCodeTranslationTable.add(
  5973. new JumpOperationCodeTable(Framework::Assembly::JZ,
  5974. 2,
  5975. {// JZ rel32
  5976. MachineCodeTableEntry(false,
  5977. 0x840F,
  5978. (char)2,
  5979. false,
  5980. false,
  5981. false,
  5982. 0,
  5983. 0,
  5984. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  5985. IMM32,
  5986. READ)}));
  5987. OperationCodeTable::machineCodeTranslationTable.add(
  5988. new JumpOperationCodeTable(Framework::Assembly::JNZ,
  5989. 2,
  5990. {// JNZ rel32
  5991. MachineCodeTableEntry(false,
  5992. 0x850F,
  5993. (char)2,
  5994. false,
  5995. false,
  5996. false,
  5997. 0,
  5998. 0,
  5999. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6000. IMM32,
  6001. READ)}));
  6002. OperationCodeTable::machineCodeTranslationTable.add(
  6003. new JumpOperationCodeTable(Framework::Assembly::JG,
  6004. 2,
  6005. {// JG rel32
  6006. MachineCodeTableEntry(false,
  6007. 0x8F0F,
  6008. (char)2,
  6009. false,
  6010. false,
  6011. false,
  6012. 0,
  6013. 0,
  6014. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6015. IMM32,
  6016. READ)}));
  6017. OperationCodeTable::machineCodeTranslationTable.add(
  6018. new JumpOperationCodeTable(Framework::Assembly::JGE,
  6019. 2,
  6020. {// JGE rel32
  6021. MachineCodeTableEntry(false,
  6022. 0x8D0F,
  6023. (char)2,
  6024. false,
  6025. false,
  6026. false,
  6027. 0,
  6028. 0,
  6029. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6030. IMM32,
  6031. READ)}));
  6032. OperationCodeTable::machineCodeTranslationTable.add(
  6033. new JumpOperationCodeTable(Framework::Assembly::JL,
  6034. 2,
  6035. {// JL rel32
  6036. MachineCodeTableEntry(false,
  6037. 0x8C0F,
  6038. (char)2,
  6039. false,
  6040. false,
  6041. false,
  6042. 0,
  6043. 0,
  6044. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6045. IMM32,
  6046. READ)}));
  6047. OperationCodeTable::machineCodeTranslationTable.add(
  6048. new JumpOperationCodeTable(Framework::Assembly::JLE,
  6049. 2,
  6050. {// JLE rel32
  6051. MachineCodeTableEntry(false,
  6052. 0x8E0F,
  6053. (char)2,
  6054. false,
  6055. false,
  6056. false,
  6057. 0,
  6058. 0,
  6059. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6060. IMM32,
  6061. READ)}));
  6062. OperationCodeTable::machineCodeTranslationTable.add(
  6063. new JumpOperationCodeTable(Framework::Assembly::JA,
  6064. 2,
  6065. {// JA rel32
  6066. MachineCodeTableEntry(false,
  6067. 0x870F,
  6068. (char)2,
  6069. false,
  6070. false,
  6071. false,
  6072. 0,
  6073. 0,
  6074. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6075. IMM32,
  6076. READ)}));
  6077. OperationCodeTable::machineCodeTranslationTable.add(
  6078. new JumpOperationCodeTable(Framework::Assembly::JC,
  6079. 2,
  6080. {// JC rel32
  6081. MachineCodeTableEntry(false,
  6082. 0x820F,
  6083. (char)2,
  6084. false,
  6085. false,
  6086. false,
  6087. 0,
  6088. 0,
  6089. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6090. IMM32,
  6091. READ)}));
  6092. OperationCodeTable::machineCodeTranslationTable.add(
  6093. new JumpOperationCodeTable(Framework::Assembly::JNC,
  6094. 2,
  6095. {// JNC rel32
  6096. MachineCodeTableEntry(false,
  6097. 0x830F,
  6098. (char)2,
  6099. false,
  6100. false,
  6101. false,
  6102. 0,
  6103. 0,
  6104. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6105. IMM32,
  6106. READ)}));
  6107. OperationCodeTable::machineCodeTranslationTable.add(
  6108. new JumpOperationCodeTable(Framework::Assembly::JBE,
  6109. 2,
  6110. {// JBE rel32
  6111. MachineCodeTableEntry(false,
  6112. 0x860F,
  6113. (char)2,
  6114. false,
  6115. false,
  6116. false,
  6117. 0,
  6118. 0,
  6119. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6120. IMM32,
  6121. READ)}));
  6122. OperationCodeTable::machineCodeTranslationTable.add(
  6123. new JumpOperationCodeTable(Framework::Assembly::JO,
  6124. 2,
  6125. {// JO rel32
  6126. MachineCodeTableEntry(false,
  6127. 0x800F,
  6128. (char)2,
  6129. false,
  6130. false,
  6131. false,
  6132. 0,
  6133. 0,
  6134. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6135. IMM32,
  6136. READ)}));
  6137. OperationCodeTable::machineCodeTranslationTable.add(
  6138. new JumpOperationCodeTable(Framework::Assembly::JNO,
  6139. 2,
  6140. {// JNO rel32
  6141. MachineCodeTableEntry(false,
  6142. 0x810F,
  6143. (char)2,
  6144. false,
  6145. false,
  6146. false,
  6147. 0,
  6148. 0,
  6149. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6150. IMM32,
  6151. READ)}));
  6152. OperationCodeTable::machineCodeTranslationTable.add(
  6153. new JumpOperationCodeTable(Framework::Assembly::JP,
  6154. 2,
  6155. {// JP rel32
  6156. MachineCodeTableEntry(false,
  6157. 0x8A0F,
  6158. (char)2,
  6159. false,
  6160. false,
  6161. false,
  6162. 0,
  6163. 0,
  6164. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6165. IMM32,
  6166. READ)}));
  6167. OperationCodeTable::machineCodeTranslationTable.add(
  6168. new JumpOperationCodeTable(Framework::Assembly::JNP,
  6169. 2,
  6170. {// JNP rel32
  6171. MachineCodeTableEntry(false,
  6172. 0x8B0F,
  6173. (char)2,
  6174. false,
  6175. false,
  6176. false,
  6177. 0,
  6178. 0,
  6179. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6180. IMM32,
  6181. READ)}));
  6182. OperationCodeTable::machineCodeTranslationTable.add(
  6183. new JumpOperationCodeTable(Framework::Assembly::JS,
  6184. 2,
  6185. {// JS rel32
  6186. MachineCodeTableEntry(false,
  6187. 0x880F,
  6188. (char)2,
  6189. false,
  6190. false,
  6191. false,
  6192. 0,
  6193. 0,
  6194. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6195. IMM32,
  6196. READ)}));
  6197. OperationCodeTable::machineCodeTranslationTable.add(
  6198. new JumpOperationCodeTable(Framework::Assembly::JNS,
  6199. 2,
  6200. {// JNS rel32
  6201. MachineCodeTableEntry(false,
  6202. 0x890F,
  6203. (char)2,
  6204. false,
  6205. false,
  6206. false,
  6207. 0,
  6208. 0,
  6209. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6210. IMM32,
  6211. READ)}));
  6212. OperationCodeTable::machineCodeTranslationTable.add(
  6213. new OperationCodeTable(Framework::Assembly::CALL,
  6214. {// CALL rel32
  6215. MachineCodeTableEntry(false,
  6216. 0xE8,
  6217. (char)1,
  6218. false,
  6219. false,
  6220. false,
  6221. 0,
  6222. 0,
  6223. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6224. IMM32,
  6225. READ),
  6226. // CALL r/m64
  6227. MachineCodeTableEntry(false,
  6228. 0xFF,
  6229. (char)1,
  6230. false,
  6231. false,
  6232. false,
  6233. 0,
  6234. 0b010,
  6235. isGPRegisterOrMemoryAccess(
  6236. Framework::Assembly::MemoryBlockSize::QWORD),
  6237. MODRM_RM,
  6238. READ)}));
  6239. OperationCodeTable::machineCodeTranslationTable.add(
  6240. new OperationCodeTable(Framework::Assembly::RET,
  6241. {// RET
  6242. MachineCodeTableEntry(
  6243. false, 0xC3, (char)1, false, false, false, 0, 0)}));
  6244. OperationCodeTable::machineCodeTranslationTable.add(
  6245. new OperationCodeTable(Framework::Assembly::PUSH,
  6246. {
  6247. // PUSH r/m16
  6248. MachineCodeTableEntry(false,
  6249. 0xFF,
  6250. (char)1,
  6251. true,
  6252. false,
  6253. false,
  6254. 0,
  6255. 0b110,
  6256. isGPRegisterOrMemoryAccess(
  6257. Framework::Assembly::MemoryBlockSize::WORD),
  6258. MODRM_RM,
  6259. READ),
  6260. // PUSH r/m64
  6261. MachineCodeTableEntry(false,
  6262. 0xFF,
  6263. (char)1,
  6264. false,
  6265. false,
  6266. false,
  6267. 0,
  6268. 0b110,
  6269. isGPRegisterOrMemoryAccess(
  6270. Framework::Assembly::MemoryBlockSize::QWORD),
  6271. MODRM_RM,
  6272. READ),
  6273. // PUSH imm8
  6274. MachineCodeTableEntry(false,
  6275. 0x6A,
  6276. (char)1,
  6277. false,
  6278. false,
  6279. false,
  6280. 0,
  6281. 0,
  6282. isIMM(Framework::Assembly::MemoryBlockSize::BYTE),
  6283. IMM8,
  6284. READ),
  6285. // PUSH imm16
  6286. MachineCodeTableEntry(false,
  6287. 0x68,
  6288. (char)1,
  6289. true,
  6290. false,
  6291. false,
  6292. 0,
  6293. 0,
  6294. isIMM(Framework::Assembly::MemoryBlockSize::WORD),
  6295. IMM16,
  6296. READ),
  6297. // PUSH imm32
  6298. MachineCodeTableEntry(false,
  6299. 0x68,
  6300. (char)1,
  6301. false,
  6302. false,
  6303. false,
  6304. 0,
  6305. 0,
  6306. isIMM(Framework::Assembly::MemoryBlockSize::DWORD),
  6307. IMM32,
  6308. READ),
  6309. }));
  6310. OperationCodeTable::machineCodeTranslationTable.add(
  6311. new OperationCodeTable(Framework::Assembly::POP,
  6312. {
  6313. // POP r/m16
  6314. MachineCodeTableEntry(false,
  6315. 0x8F,
  6316. (char)1,
  6317. true,
  6318. false,
  6319. false,
  6320. 0,
  6321. 0,
  6322. isGPRegisterOrMemoryAccess(
  6323. Framework::Assembly::MemoryBlockSize::WORD),
  6324. MODRM_RM,
  6325. READ),
  6326. // POP r/m64
  6327. MachineCodeTableEntry(false,
  6328. 0x8F,
  6329. (char)1,
  6330. false,
  6331. false,
  6332. false,
  6333. 0,
  6334. 0,
  6335. isGPRegisterOrMemoryAccess(
  6336. Framework::Assembly::MemoryBlockSize::QWORD),
  6337. MODRM_RM,
  6338. READ),
  6339. }));
  6340. }
  6341. }
  6342. bool Framework::Assembly::OperationArgument::usesRegister(GPRegister reg) const
  6343. {
  6344. return false;
  6345. }
  6346. bool Framework::Assembly::OperationArgument::usesRegister(FPRegister reg) const
  6347. {
  6348. return false;
  6349. }
  6350. void Framework::Assembly::OperationArgument::replaceRegister(
  6351. GPRegister oldReg, GPRegister newReg)
  6352. {}
  6353. void Framework::Assembly::OperationArgument::replaceRegister(
  6354. FPRegister oldReg, FPRegister newReg)
  6355. {}
  6356. void Framework::Assembly::OperationArgument::addJumpLabelPrefix(
  6357. Text labelPrefix)
  6358. {}
  6359. const Framework::Assembly::GPRegisterArgument*
  6360. Framework::Assembly::OperationArgument::asGPRegisterArgument() const
  6361. {
  6362. return dynamic_cast<const GPRegisterArgument*>(this);
  6363. }
  6364. const Framework::Assembly::MemoryAccessArgument*
  6365. Framework::Assembly::OperationArgument::asMemoryAccessArgument() const
  6366. {
  6367. return dynamic_cast<const MemoryAccessArgument*>(this);
  6368. }
  6369. const Framework::Assembly::ConstantArgument*
  6370. Framework::Assembly::OperationArgument::asConstantArgument() const
  6371. {
  6372. return dynamic_cast<const ConstantArgument*>(this);
  6373. }
  6374. const Framework::Assembly::FPRegisterArgument*
  6375. Framework::Assembly::OperationArgument::asFPRegisterArgument() const
  6376. {
  6377. return dynamic_cast<const FPRegisterArgument*>(this);
  6378. }
  6379. const Framework::Assembly::JumpTargetArgument*
  6380. Framework::Assembly::OperationArgument::asJumpTargetArgument() const
  6381. {
  6382. return dynamic_cast<const JumpTargetArgument*>(this);
  6383. }
  6384. Framework::Assembly::GPRegisterArgument::GPRegisterArgument(
  6385. GPRegister reg, GPRegisterPart part)
  6386. : reg(reg),
  6387. part(part)
  6388. {}
  6389. bool Framework::Assembly::GPRegisterArgument::usesRegister(GPRegister reg) const
  6390. {
  6391. return this->reg == reg;
  6392. }
  6393. void Framework::Assembly::GPRegisterArgument::replaceRegister(
  6394. GPRegister oldReg, GPRegister newReg)
  6395. {
  6396. if (reg == oldReg)
  6397. {
  6398. reg = newReg;
  6399. }
  6400. }
  6401. Framework::Assembly::GPRegister
  6402. Framework::Assembly::GPRegisterArgument::getRegister() const
  6403. {
  6404. return reg;
  6405. }
  6406. Framework::Assembly::GPRegisterPart
  6407. Framework::Assembly::GPRegisterArgument::getPart() const
  6408. {
  6409. return part;
  6410. }
  6411. Framework::Assembly::FPRegisterArgument::FPRegisterArgument(
  6412. FPRegister reg, FPRegisterPart part)
  6413. : reg(reg),
  6414. part(part)
  6415. {}
  6416. bool Framework::Assembly::FPRegisterArgument::usesRegister(FPRegister reg) const
  6417. {
  6418. return this->reg == reg;
  6419. }
  6420. void Framework::Assembly::FPRegisterArgument::replaceRegister(
  6421. FPRegister oldReg, FPRegister newReg)
  6422. {
  6423. if (reg == oldReg)
  6424. {
  6425. reg = newReg;
  6426. }
  6427. }
  6428. Framework::Assembly::FPRegister
  6429. Framework::Assembly::FPRegisterArgument::getRegister() const
  6430. {
  6431. return reg;
  6432. }
  6433. Framework::Assembly::FPRegisterPart
  6434. Framework::Assembly::FPRegisterArgument::getPart() const
  6435. {
  6436. return part;
  6437. }
  6438. Framework::Assembly::MemoryAccessArgument::MemoryAccessArgument(
  6439. MemoryBlockSize blockSize,
  6440. GPRegister address,
  6441. bool useAddressReg,
  6442. int offset,
  6443. bool useOffsetReg,
  6444. GPRegister offsetReg)
  6445. : blockSize(blockSize),
  6446. useAddressReg(useAddressReg),
  6447. address(address),
  6448. offset(offset),
  6449. offsetReg(offsetReg),
  6450. useOffsetReg(useOffsetReg)
  6451. {}
  6452. bool Framework::Assembly::MemoryAccessArgument::usesRegister(
  6453. GPRegister reg) const
  6454. {
  6455. return (useAddressReg && this->address == reg)
  6456. || (useOffsetReg && offsetReg == reg);
  6457. }
  6458. void Framework::Assembly::MemoryAccessArgument::replaceRegister(
  6459. GPRegister oldReg, GPRegister newReg)
  6460. {
  6461. if (useAddressReg && address == oldReg)
  6462. {
  6463. address = newReg;
  6464. }
  6465. if (useOffsetReg && offsetReg == oldReg)
  6466. {
  6467. offsetReg = newReg;
  6468. }
  6469. }
  6470. bool Framework::Assembly::MemoryAccessArgument::isUsingAddressRegister() const
  6471. {
  6472. return useAddressReg;
  6473. }
  6474. Framework::Assembly::GPRegister
  6475. Framework::Assembly::MemoryAccessArgument::getAddressRegister() const
  6476. {
  6477. return address;
  6478. }
  6479. int Framework::Assembly::MemoryAccessArgument::getOffset() const
  6480. {
  6481. return offset;
  6482. }
  6483. bool Framework::Assembly::MemoryAccessArgument::isUsingOffsetRegister() const
  6484. {
  6485. return useOffsetReg;
  6486. }
  6487. Framework::Assembly::GPRegister
  6488. Framework::Assembly::MemoryAccessArgument::getOffsetRegister() const
  6489. {
  6490. return offsetReg;
  6491. }
  6492. Framework::Assembly::MemoryBlockSize
  6493. Framework::Assembly::MemoryAccessArgument::getBlockSize() const
  6494. {
  6495. return blockSize;
  6496. }
  6497. Framework::Assembly::ConstantArgument::ConstantArgument(
  6498. __int64 value, MemoryBlockSize size)
  6499. : value(value),
  6500. size(size)
  6501. {}
  6502. Framework::Assembly::ConstantArgument::ConstantArgument(
  6503. int value, MemoryBlockSize size)
  6504. : value((__int64)value),
  6505. size(size)
  6506. {}
  6507. Framework::Assembly::ConstantArgument::ConstantArgument(
  6508. short value, MemoryBlockSize size)
  6509. : value((__int64)value),
  6510. size(size)
  6511. {}
  6512. Framework::Assembly::ConstantArgument::ConstantArgument(
  6513. char value, MemoryBlockSize size)
  6514. : value((__int64)value),
  6515. size(size)
  6516. {}
  6517. __int64 Framework::Assembly::ConstantArgument::getValue() const
  6518. {
  6519. return value;
  6520. }
  6521. Framework::Assembly::MemoryBlockSize
  6522. Framework::Assembly::ConstantArgument::getSize() const
  6523. {
  6524. return size;
  6525. }
  6526. Framework::Assembly::JumpTargetArgument::JumpTargetArgument(Text name)
  6527. : name(name)
  6528. {}
  6529. void Framework::Assembly::JumpTargetArgument::addJumpLabelPrefix(
  6530. Text labelPrefix)
  6531. {
  6532. name = labelPrefix + name;
  6533. }
  6534. const Framework::Text& Framework::Assembly::JumpTargetArgument::getLabel() const
  6535. {
  6536. return name;
  6537. }
  6538. Framework::Assembly::Instruction::Instruction(
  6539. Operation op, std::initializer_list<OperationArgument*> args)
  6540. : ReferenceCounter(),
  6541. op(op),
  6542. args(args)
  6543. {}
  6544. Framework::Assembly::Instruction::~Instruction()
  6545. {
  6546. for (auto arg : args)
  6547. {
  6548. delete arg;
  6549. }
  6550. }
  6551. bool Framework::Assembly::Instruction::writesToRegister(
  6552. GPRegister reg, const AssemblyBlock* block) const
  6553. {
  6554. __intializeMachineCodeTranslationTable();
  6555. for (OperationCodeTable* tableEntry :
  6556. OperationCodeTable::machineCodeTranslationTable)
  6557. {
  6558. if (tableEntry->getOperation() == op)
  6559. {
  6560. MachineCodeTableEntry& entry
  6561. = tableEntry->getEntry(args, block, this);
  6562. for (GPRegister r : entry.getImpliedWriteGPRegs())
  6563. {
  6564. if (r == reg)
  6565. {
  6566. return 1;
  6567. }
  6568. }
  6569. int index = 0;
  6570. for (const OperationArgument* arg : args)
  6571. {
  6572. OperandRW rw = entry.getOperandRW(index);
  6573. if (rw == WRITE || rw == READWRITE)
  6574. {
  6575. if (arg->asGPRegisterArgument()
  6576. && arg->asGPRegisterArgument()->getRegister() == reg)
  6577. {
  6578. return 1;
  6579. }
  6580. }
  6581. index++;
  6582. }
  6583. }
  6584. }
  6585. return 0;
  6586. }
  6587. bool Framework::Assembly::Instruction::writesToRegister(
  6588. FPRegister reg, const AssemblyBlock* block) const
  6589. {
  6590. __intializeMachineCodeTranslationTable();
  6591. for (OperationCodeTable* tableEntry :
  6592. OperationCodeTable::machineCodeTranslationTable)
  6593. {
  6594. if (tableEntry->getOperation() == op)
  6595. {
  6596. MachineCodeTableEntry& entry
  6597. = tableEntry->getEntry(args, block, this);
  6598. for (FPRegister r : entry.getImpliedWriteFPRegs())
  6599. {
  6600. if (r == reg)
  6601. {
  6602. return 1;
  6603. }
  6604. }
  6605. int index = 0;
  6606. for (const OperationArgument* arg : args)
  6607. {
  6608. OperandRW rw = entry.getOperandRW(index);
  6609. if (rw == WRITE || rw == READWRITE)
  6610. {
  6611. if (arg->asFPRegisterArgument()
  6612. && arg->asFPRegisterArgument()->getRegister() == reg)
  6613. {
  6614. return 1;
  6615. }
  6616. }
  6617. index++;
  6618. }
  6619. }
  6620. }
  6621. return 0;
  6622. }
  6623. bool Framework::Assembly::Instruction::readsFromRegister(
  6624. GPRegister reg, const AssemblyBlock* block) const
  6625. {
  6626. __intializeMachineCodeTranslationTable();
  6627. for (OperationCodeTable* tableEntry :
  6628. OperationCodeTable::machineCodeTranslationTable)
  6629. {
  6630. if (tableEntry->getOperation() == op)
  6631. {
  6632. const MachineCodeTableEntry& entry
  6633. = tableEntry->getEntry(args, block, this);
  6634. for (GPRegister r : entry.getImpliedReadGPRegs())
  6635. {
  6636. if (r == reg)
  6637. {
  6638. return 1;
  6639. }
  6640. }
  6641. int index = 0;
  6642. for (const OperationArgument* arg : args)
  6643. {
  6644. OperandRW rw = entry.getOperandRW(index);
  6645. if (rw == READ || rw == READWRITE)
  6646. {
  6647. if (arg->asGPRegisterArgument()
  6648. && arg->asGPRegisterArgument()->getRegister() == reg)
  6649. {
  6650. return 1;
  6651. }
  6652. }
  6653. if (arg->asMemoryAccessArgument()
  6654. && arg->asMemoryAccessArgument()->usesRegister(reg))
  6655. {
  6656. return 1;
  6657. }
  6658. index++;
  6659. }
  6660. }
  6661. }
  6662. return 0;
  6663. }
  6664. bool Framework::Assembly::Instruction::readsFromRegister(
  6665. FPRegister reg, const AssemblyBlock* block) const
  6666. {
  6667. __intializeMachineCodeTranslationTable();
  6668. for (OperationCodeTable* tableEntry :
  6669. OperationCodeTable::machineCodeTranslationTable)
  6670. {
  6671. if (tableEntry->getOperation() == op)
  6672. {
  6673. MachineCodeTableEntry& entry
  6674. = tableEntry->getEntry(args, block, this);
  6675. for (FPRegister r : entry.getImpliedReadFPRegs())
  6676. {
  6677. if (r == reg)
  6678. {
  6679. return 1;
  6680. }
  6681. }
  6682. int index = 0;
  6683. for (const OperationArgument* arg : args)
  6684. {
  6685. OperandRW rw = entry.getOperandRW(index);
  6686. if (rw == READ || rw == READWRITE)
  6687. {
  6688. if (arg->asFPRegisterArgument()
  6689. && arg->asFPRegisterArgument()->getRegister() == reg)
  6690. {
  6691. return 1;
  6692. }
  6693. }
  6694. index++;
  6695. }
  6696. }
  6697. }
  6698. return 0;
  6699. }
  6700. bool Framework::Assembly::Instruction::isReplacementPossible(
  6701. GPRegister oldReg, GPRegister newReg, const AssemblyBlock* block) const
  6702. {
  6703. __intializeMachineCodeTranslationTable();
  6704. for (OperationCodeTable* tableEntry :
  6705. OperationCodeTable::machineCodeTranslationTable)
  6706. {
  6707. if (tableEntry->getOperation() == op)
  6708. {
  6709. MachineCodeTableEntry& entry
  6710. = tableEntry->getEntry(args, block, this);
  6711. for (GPRegister r : entry.getImpliedReadGPRegs())
  6712. {
  6713. if (r == oldReg)
  6714. {
  6715. return 0;
  6716. }
  6717. }
  6718. for (GPRegister r : entry.getImpliedWriteGPRegs())
  6719. {
  6720. if (r == oldReg)
  6721. {
  6722. return 0;
  6723. }
  6724. }
  6725. }
  6726. }
  6727. if (newReg == RBP || newReg == RSI || newReg == RDI)
  6728. {
  6729. if (oldReg == RBP || oldReg == RSI || oldReg == RDI)
  6730. {
  6731. return 1;
  6732. }
  6733. else
  6734. {
  6735. return 0;
  6736. }
  6737. }
  6738. if (newReg >= R8)
  6739. {
  6740. return oldReg >= R8;
  6741. }
  6742. return oldReg < R8;
  6743. }
  6744. bool Framework::Assembly::Instruction::isReplacementPossible(
  6745. FPRegister oldReg, FPRegister newReg, const AssemblyBlock* block) const
  6746. {
  6747. __intializeMachineCodeTranslationTable();
  6748. for (OperationCodeTable* tableEntry :
  6749. OperationCodeTable::machineCodeTranslationTable)
  6750. {
  6751. if (tableEntry->getOperation() == op)
  6752. {
  6753. MachineCodeTableEntry& entry
  6754. = tableEntry->getEntry(args, block, this);
  6755. for (FPRegister r : entry.getImpliedReadFPRegs())
  6756. {
  6757. if (r == oldReg)
  6758. {
  6759. return 0;
  6760. }
  6761. }
  6762. for (FPRegister r : entry.getImpliedWriteFPRegs())
  6763. {
  6764. if (r == oldReg)
  6765. {
  6766. return 0;
  6767. }
  6768. }
  6769. }
  6770. }
  6771. return 1;
  6772. }
  6773. void Framework::Assembly::Instruction::replaceRegister(
  6774. GPRegister oldReg, GPRegister newReg)
  6775. {
  6776. for (auto arg : args)
  6777. {
  6778. arg->replaceRegister(oldReg, newReg);
  6779. }
  6780. }
  6781. void Framework::Assembly::Instruction::replaceRegister(
  6782. FPRegister oldReg, FPRegister newReg)
  6783. {
  6784. for (auto arg : args)
  6785. {
  6786. arg->replaceRegister(oldReg, newReg);
  6787. }
  6788. }
  6789. void Framework::Assembly::Instruction::addJumpLabelPrefix(Text labelPrefix)
  6790. {
  6791. for (auto arg : args)
  6792. {
  6793. arg->addJumpLabelPrefix(labelPrefix);
  6794. }
  6795. }
  6796. void Framework::Assembly::Instruction::compile(
  6797. StreamWriter* byteCodeWriter, const AssemblyBlock* block) const
  6798. {
  6799. __intializeMachineCodeTranslationTable();
  6800. for (OperationCodeTable* tableEntry :
  6801. OperationCodeTable::machineCodeTranslationTable)
  6802. {
  6803. if (tableEntry->getOperation() == op)
  6804. {
  6805. MachineCodeInstruction instr
  6806. = tableEntry->getInstruction(args, block, this);
  6807. instr.write(*byteCodeWriter);
  6808. return;
  6809. }
  6810. }
  6811. Text err;
  6812. err.append() << "Failed to compile instruction: operation code " << (int)op
  6813. << " not found in translation table. args: \n";
  6814. for (auto arg : args)
  6815. {
  6816. err.append() << " " << typeid(*arg).name() << "\n";
  6817. }
  6818. throw err.getText();
  6819. }
  6820. int Framework::Assembly::Instruction::compiledSize(
  6821. const AssemblyBlock* block) const
  6822. {
  6823. __intializeMachineCodeTranslationTable();
  6824. for (OperationCodeTable* tableEntry :
  6825. OperationCodeTable::machineCodeTranslationTable)
  6826. {
  6827. if (tableEntry->getOperation() == op)
  6828. {
  6829. MachineCodeInstruction instr
  6830. = tableEntry->getInstruction(args, block, this);
  6831. return instr.calculateSize();
  6832. }
  6833. }
  6834. return 0;
  6835. }
  6836. Framework::Assembly::Operation
  6837. Framework::Assembly::Instruction::getOperation() const
  6838. {
  6839. return op;
  6840. }
  6841. bool Framework::Assembly::Instruction::definesLabel(Text label) const
  6842. {
  6843. return op == NOP && args.size() == 1 && args.at(0)->asJumpTargetArgument()
  6844. && args.at(0)->asJumpTargetArgument()->getLabel().istGleich(label);
  6845. }
  6846. Framework::Assembly::AssemblyBlock::AssemblyBlock()
  6847. : inlineIndex(0),
  6848. compiledCode(0)
  6849. {}
  6850. Framework::Assembly::AssemblyBlock::~AssemblyBlock()
  6851. {
  6852. if (compiledCode != 0)
  6853. {
  6854. // Free the compiled code memory
  6855. VirtualFree(compiledCode, 0, MEM_RELEASE);
  6856. }
  6857. }
  6858. void Framework::Assembly::AssemblyBlock::addInstruction(Instruction* instr)
  6859. {
  6860. instructions.add(instr);
  6861. }
  6862. void Framework::Assembly::AssemblyBlock::defineJumpTarget(Text name)
  6863. {
  6864. instructions.add(new Instruction(NOP, {new JumpTargetArgument(name)}));
  6865. }
  6866. void Framework::Assembly::AssemblyBlock::addJump(
  6867. Operation jumpOp, Text targetName)
  6868. {
  6869. instructions.add(
  6870. new Instruction(jumpOp, {new JumpTargetArgument(targetName)}));
  6871. }
  6872. void Framework::Assembly::AssemblyBlock::addLoadValue(
  6873. char* valueAddress, GPRegister target)
  6874. {
  6875. instructions.add(new Instruction(MOV,
  6876. {new GPRegisterArgument(target),
  6877. new ConstantArgument(reinterpret_cast<__int64>(valueAddress))}));
  6878. instructions.add(new Instruction(MOV,
  6879. {new GPRegisterArgument(target, LOWER8),
  6880. new MemoryAccessArgument(MemoryBlockSize::BYTE, target)}));
  6881. }
  6882. void Framework::Assembly::AssemblyBlock::addLoadValue(
  6883. short* valueAddress, GPRegister target)
  6884. {
  6885. instructions.add(new Instruction(MOV,
  6886. {new GPRegisterArgument(target),
  6887. new ConstantArgument(reinterpret_cast<__int64>(valueAddress))}));
  6888. instructions.add(new Instruction(MOV,
  6889. {new GPRegisterArgument(target, LOWER16),
  6890. new MemoryAccessArgument(MemoryBlockSize::WORD, target)}));
  6891. }
  6892. void Framework::Assembly::AssemblyBlock::addLoadValue(
  6893. int* valueAddress, GPRegister target)
  6894. {
  6895. instructions.add(new Instruction(MOV,
  6896. {new GPRegisterArgument(target),
  6897. new ConstantArgument(reinterpret_cast<__int64>(valueAddress))}));
  6898. instructions.add(new Instruction(MOV,
  6899. {new GPRegisterArgument(target, LOWER32),
  6900. new MemoryAccessArgument(MemoryBlockSize::DWORD, target)}));
  6901. }
  6902. void Framework::Assembly::AssemblyBlock::addLoadValue(
  6903. __int64* valueAddress, GPRegister target)
  6904. {
  6905. instructions.add(new Instruction(MOV,
  6906. {new GPRegisterArgument(target),
  6907. new ConstantArgument(reinterpret_cast<__int64>(valueAddress))}));
  6908. instructions.add(new Instruction(MOV,
  6909. {new GPRegisterArgument(target),
  6910. new MemoryAccessArgument(MemoryBlockSize::QWORD, target)}));
  6911. }
  6912. void Framework::Assembly::AssemblyBlock::addLoadValue(
  6913. float* valueAddress, FPRegister target, GPRegister temp)
  6914. {
  6915. instructions.add(new Instruction(MOV,
  6916. {new GPRegisterArgument(temp),
  6917. new ConstantArgument(reinterpret_cast<__int64>(valueAddress))}));
  6918. instructions.add(new Instruction(MOVSS,
  6919. {new FPRegisterArgument(target),
  6920. new MemoryAccessArgument(MemoryBlockSize::DWORD, temp)}));
  6921. }
  6922. void Framework::Assembly::AssemblyBlock::addLoadValue(
  6923. double* valueAddress, FPRegister target, GPRegister temp)
  6924. {
  6925. instructions.add(new Instruction(MOV,
  6926. {new GPRegisterArgument(temp),
  6927. new ConstantArgument(reinterpret_cast<__int64>(valueAddress))}));
  6928. instructions.add(new Instruction(MOVSD,
  6929. {new FPRegisterArgument(target),
  6930. new MemoryAccessArgument(MemoryBlockSize::QWORD, temp)}));
  6931. }
  6932. void Framework::Assembly::AssemblyBlock::addCall(
  6933. void* functionAddress, GPRegister temp)
  6934. {
  6935. instructions.add(new Instruction(MOV,
  6936. {new GPRegisterArgument(temp),
  6937. new ConstantArgument(reinterpret_cast<__int64>(functionAddress))}));
  6938. instructions.add(new Instruction(
  6939. CALL, {new MemoryAccessArgument(MemoryBlockSize::QWORD, temp)}));
  6940. }
  6941. void Framework::Assembly::AssemblyBlock::addReturn()
  6942. {
  6943. instructions.add(new Instruction(RET, {}));
  6944. }
  6945. void Framework::Assembly::AssemblyBlock::addPush(
  6946. GPRegister reg, GPRegisterPart part)
  6947. {
  6948. instructions.add(
  6949. new Instruction(PUSH, {new GPRegisterArgument(reg, part)}));
  6950. }
  6951. void Framework::Assembly::AssemblyBlock::addPop(
  6952. GPRegister reg, GPRegisterPart part)
  6953. {
  6954. instructions.add(new Instruction(POP, {new GPRegisterArgument(reg, part)}));
  6955. }
  6956. void Framework::Assembly::AssemblyBlock::addPush(
  6957. FPRegister reg, FPRegisterPart part)
  6958. {
  6959. instructions.add(new Instruction(SUB,
  6960. {new GPRegisterArgument(RSP),
  6961. new ConstantArgument(part == X ? 16 : 32)}));
  6962. instructions.add(new Instruction(MOVAPD,
  6963. {new MemoryAccessArgument(
  6964. part == X ? MemoryBlockSize::M128 : MemoryBlockSize::M256, RSP),
  6965. new FPRegisterArgument(reg, part)}));
  6966. }
  6967. void Framework::Assembly::AssemblyBlock::addPop(
  6968. FPRegister reg, FPRegisterPart part)
  6969. {
  6970. instructions.add(new Instruction(MOVAPD,
  6971. {new FPRegisterArgument(reg, part),
  6972. new MemoryAccessArgument(
  6973. part == X ? MemoryBlockSize::M128 : MemoryBlockSize::M256,
  6974. RSP)}));
  6975. instructions.add(new Instruction(ADD,
  6976. {new GPRegisterArgument(RSP),
  6977. new ConstantArgument(part == X ? 16 : 32)}));
  6978. }
  6979. void Framework::Assembly::AssemblyBlock::addBlock(AssemblyBlock* block,
  6980. std::initializer_list<GPRegister> preservedGPRegisters,
  6981. std::initializer_list<FPRegister> preservedFPRegisters,
  6982. GPRegister* blockResultGpReg,
  6983. FPRegister* blockResultFpReg)
  6984. {
  6985. RCArray<Instruction> tempInstructions;
  6986. for (GPRegister preservedReg : preservedGPRegisters)
  6987. {
  6988. if (block->writesToRegister(preservedReg))
  6989. {
  6990. bool replaced = false;
  6991. for (int i = 0; i < 16; i++)
  6992. {
  6993. if (i == 4)
  6994. {
  6995. continue; // Skip RSP (stack counter register)
  6996. }
  6997. bool found = false;
  6998. for (GPRegister r : preservedGPRegisters)
  6999. {
  7000. if (r == (GPRegister)i)
  7001. {
  7002. found = true;
  7003. break;
  7004. }
  7005. }
  7006. if (found)
  7007. {
  7008. continue;
  7009. }
  7010. GPRegister newReg = (GPRegister)i;
  7011. if (!block->writesToRegister(newReg)
  7012. && !block->readsFromRegister(newReg)
  7013. && block->isReplacementPossible(preservedReg, newReg))
  7014. {
  7015. if (preservedReg == RAX)
  7016. {
  7017. *blockResultGpReg = newReg;
  7018. }
  7019. replaced = true;
  7020. block->replaceRegister(preservedReg, newReg);
  7021. break;
  7022. }
  7023. }
  7024. if (!replaced)
  7025. {
  7026. addPush(preservedReg);
  7027. tempInstructions.add(
  7028. new Instruction(
  7029. POP, {new GPRegisterArgument(preservedReg)}),
  7030. 0);
  7031. }
  7032. }
  7033. }
  7034. for (FPRegister preservedReg : preservedFPRegisters)
  7035. {
  7036. if (block->writesToRegister(preservedReg))
  7037. {
  7038. bool replaced = false;
  7039. for (int i = 0; i < __FP_REGISTER_COUNT; i++)
  7040. {
  7041. bool found = false;
  7042. for (FPRegister r : preservedFPRegisters)
  7043. {
  7044. if (r == (FPRegister)i)
  7045. {
  7046. found = true;
  7047. break;
  7048. }
  7049. }
  7050. if (found)
  7051. {
  7052. continue;
  7053. }
  7054. FPRegister newReg = (FPRegister)i;
  7055. if (!block->writesToRegister(newReg)
  7056. && !block->readsFromRegister(newReg)
  7057. && block->isReplacementPossible(preservedReg, newReg))
  7058. {
  7059. if (preservedReg == MM0)
  7060. {
  7061. *blockResultFpReg = newReg;
  7062. }
  7063. replaced = true;
  7064. block->replaceRegister(preservedReg, newReg);
  7065. break;
  7066. }
  7067. }
  7068. if (!replaced)
  7069. {
  7070. addPush(preservedReg);
  7071. tempInstructions.add(new Instruction(MOVAPD,
  7072. {new FPRegisterArgument(preservedReg, Y),
  7073. new MemoryAccessArgument(MemoryBlockSize::M256, RSP)}));
  7074. tempInstructions.add(new Instruction(ADD,
  7075. {new GPRegisterArgument(RSP), new ConstantArgument(32)}));
  7076. }
  7077. }
  7078. }
  7079. int index = 0;
  7080. Text prefix = "inlined_";
  7081. prefix.append() << inlineIndex << "_";
  7082. block->addJumpLabelPrefix(prefix);
  7083. bool returnFound = false;
  7084. for (const auto& instr : block->instructions)
  7085. {
  7086. if (instr->getOperation() == RET)
  7087. {
  7088. if (index != block->instructions.getEintragAnzahl() - 1)
  7089. {
  7090. returnFound = true;
  7091. instructions.add(new Instruction(
  7092. JMP, {new JumpTargetArgument(Text("after_") + prefix)}));
  7093. }
  7094. }
  7095. else
  7096. {
  7097. instructions.add(dynamic_cast<Instruction*>(instr->getThis()));
  7098. }
  7099. index++;
  7100. }
  7101. if (returnFound)
  7102. {
  7103. defineJumpTarget(Text("after_") + prefix);
  7104. }
  7105. for (const auto& instr : tempInstructions)
  7106. {
  7107. instructions.add(dynamic_cast<Instruction*>(instr->getThis()));
  7108. }
  7109. }
  7110. bool Framework::Assembly::AssemblyBlock::writesToRegister(GPRegister reg) const
  7111. {
  7112. for (const auto& instr : instructions)
  7113. {
  7114. if (instr->writesToRegister(reg, this))
  7115. {
  7116. return true;
  7117. }
  7118. }
  7119. return false;
  7120. }
  7121. bool Framework::Assembly::AssemblyBlock::writesToRegister(FPRegister reg) const
  7122. {
  7123. for (const auto& instr : instructions)
  7124. {
  7125. if (instr->writesToRegister(reg, this))
  7126. {
  7127. return true;
  7128. }
  7129. }
  7130. return false;
  7131. }
  7132. bool Framework::Assembly::AssemblyBlock::readsFromRegister(GPRegister reg) const
  7133. {
  7134. for (const auto& instr : instructions)
  7135. {
  7136. if (instr->readsFromRegister(reg, this))
  7137. {
  7138. return true;
  7139. }
  7140. }
  7141. return false;
  7142. }
  7143. bool Framework::Assembly::AssemblyBlock::readsFromRegister(FPRegister reg) const
  7144. {
  7145. for (const auto& instr : instructions)
  7146. {
  7147. if (instr->readsFromRegister(reg, this))
  7148. {
  7149. return true;
  7150. }
  7151. }
  7152. return false;
  7153. }
  7154. bool Framework::Assembly::AssemblyBlock::isReplacementPossible(
  7155. GPRegister oldReg, GPRegister newReg) const
  7156. {
  7157. for (const auto& instr : instructions)
  7158. {
  7159. if (!instr->isReplacementPossible(oldReg, newReg, this))
  7160. {
  7161. return false;
  7162. }
  7163. }
  7164. return true;
  7165. }
  7166. bool Framework::Assembly::AssemblyBlock::isReplacementPossible(
  7167. FPRegister oldReg, FPRegister newReg) const
  7168. {
  7169. for (const auto& instr : instructions)
  7170. {
  7171. if (!instr->isReplacementPossible(oldReg, newReg, this))
  7172. {
  7173. return false;
  7174. }
  7175. }
  7176. return true;
  7177. }
  7178. void Framework::Assembly::AssemblyBlock::replaceRegister(
  7179. GPRegister oldReg, GPRegister newReg)
  7180. {
  7181. for (const auto& instr : instructions)
  7182. {
  7183. instr->replaceRegister(oldReg, newReg);
  7184. }
  7185. }
  7186. void Framework::Assembly::AssemblyBlock::replaceRegister(
  7187. FPRegister oldReg, FPRegister newReg)
  7188. {
  7189. for (const auto& instr : instructions)
  7190. {
  7191. instr->replaceRegister(oldReg, newReg);
  7192. }
  7193. }
  7194. void Framework::Assembly::AssemblyBlock::addJumpLabelPrefix(Text labelPrefix)
  7195. {
  7196. for (const auto& instr : instructions)
  7197. {
  7198. instr->addJumpLabelPrefix(labelPrefix);
  7199. }
  7200. }
  7201. const Framework::RCArray<Framework::Assembly::Instruction>&
  7202. Framework::Assembly::AssemblyBlock::getInstructions() const
  7203. {
  7204. return instructions;
  7205. }
  7206. void* Framework::Assembly::AssemblyBlock::compile()
  7207. {
  7208. if (compiledCode != 0)
  7209. {
  7210. return compiledCode;
  7211. }
  7212. InMemoryBuffer buffer;
  7213. int index = 0;
  7214. // check non-volatile registers
  7215. RCArray<Instruction> restoreInstructions;
  7216. for (GPRegister nvReg : {RBX, RBP, RSI, RDI, R12, R13, R14, R15})
  7217. {
  7218. if (writesToRegister(nvReg))
  7219. {
  7220. Instruction pushInstr(
  7221. PUSH, {new GPRegisterArgument(nvReg, FULL64)});
  7222. pushInstr.compile(&buffer, this);
  7223. restoreInstructions.add(
  7224. new Instruction(POP, {new GPRegisterArgument(nvReg, FULL64)}),
  7225. 0);
  7226. }
  7227. }
  7228. for (FPRegister nvReg :
  7229. {MM6, MM7, MM8, MM9, MM10, MM11, MM12, MM13, MM14, MM15})
  7230. {
  7231. if (writesToRegister(nvReg))
  7232. {
  7233. Instruction subInst(
  7234. SUB, {new GPRegisterArgument(RSP), new ConstantArgument(32)});
  7235. subInst.compile(&buffer, this);
  7236. Instruction pushInstr(MOVAPD,
  7237. {new MemoryAccessArgument(MemoryBlockSize::M256, RSP),
  7238. new FPRegisterArgument(nvReg, Y)});
  7239. pushInstr.compile(&buffer, this);
  7240. restoreInstructions.add(new Instruction(MOVAPD,
  7241. {new FPRegisterArgument(nvReg, Y),
  7242. new MemoryAccessArgument(MemoryBlockSize::M256, RSP)}));
  7243. restoreInstructions.add(new Instruction(
  7244. ADD, {new GPRegisterArgument(RSP), new ConstantArgument(32)}));
  7245. }
  7246. }
  7247. // replace return instructions with jumps to the end
  7248. if (restoreInstructions.getEintragAnzahl() > 0)
  7249. {
  7250. bool needed = false;
  7251. for (int index = 0; index < instructions.getEintragAnzahl(); index++)
  7252. {
  7253. if (instructions.z(index)->getOperation() == RET)
  7254. {
  7255. if (index < instructions.getEintragAnzahl() - 1)
  7256. {
  7257. needed = true;
  7258. instructions.set(
  7259. new Instruction(JMP,
  7260. {new JumpTargetArgument(
  7261. Text("_restore_non_volatile_registers"))}),
  7262. index);
  7263. }
  7264. else
  7265. {
  7266. // remove last RET instruction, will be added after non
  7267. // volatile registers were restored from the stack
  7268. instructions.remove(index);
  7269. }
  7270. }
  7271. }
  7272. if (needed)
  7273. {
  7274. defineJumpTarget(Text("_restore_non_volatile_registers"));
  7275. }
  7276. }
  7277. // compile instructions
  7278. for (const auto& instr : instructions)
  7279. {
  7280. instr->compile(&buffer, this);
  7281. }
  7282. // restore non-volatile registers
  7283. for (const auto& instr : restoreInstructions)
  7284. {
  7285. instr->compile(&buffer, this);
  7286. }
  7287. // add final RET instruction
  7288. if (instructions.z(instructions.getLastIndex())->getOperation() != RET)
  7289. {
  7290. Instruction retInstr(RET, {});
  7291. retInstr.compile(&buffer, this);
  7292. }
  7293. int totalSize = (int)buffer.getSize();
  7294. // Allocate executable memory
  7295. compiledCode = VirtualAlloc(nullptr, totalSize, MEM_COMMIT, PAGE_READWRITE);
  7296. if (compiledCode == nullptr)
  7297. {
  7298. throw std::runtime_error("Failed to allocate executable memory.");
  7299. }
  7300. // Write the compiled code into the allocated memory
  7301. buffer.lese((char*)compiledCode, totalSize);
  7302. DWORD dummy;
  7303. VirtualProtect(compiledCode, totalSize, PAGE_EXECUTE_READ, &dummy);
  7304. return compiledCode;
  7305. }