i386-dis.c 313 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614
  1. /* Print i386 instructions for GDB, the GNU debugger.
  2. Copyright (C) 1988-2022 Free Software Foundation, Inc.
  3. This file is part of the GNU opcodes library.
  4. This library is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 3, or (at your option)
  7. any later version.
  8. It is distributed in the hope that it will be useful, but WITHOUT
  9. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
  11. License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  15. MA 02110-1301, USA. */
  16. /* 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu)
  17. July 1988
  18. modified by John Hassey (hassey@dg-rtp.dg.com)
  19. x86-64 support added by Jan Hubicka (jh@suse.cz)
  20. VIA PadLock support by Michal Ludvig (mludvig@suse.cz). */
  21. /* The main tables describing the instructions is essentially a copy
  22. of the "Opcode Map" chapter (Appendix A) of the Intel 80386
  23. Programmers Manual. Usually, there is a capital letter, followed
  24. by a small letter. The capital letter tell the addressing mode,
  25. and the small letter tells about the operand size. Refer to
  26. the Intel manual for details. */
  27. #include "sysdep.h"
  28. #include "disassemble.h"
  29. #include "opintl.h"
  30. #include "opcode/i386.h"
  31. #include "libiberty.h"
  32. #include "safe-ctype.h"
  33. #include <setjmp.h>
  34. typedef struct instr_info instr_info;
  35. static int print_insn (bfd_vma, instr_info *);
  36. static void dofloat (instr_info *, int);
  37. static void OP_ST (instr_info *, int, int);
  38. static void OP_STi (instr_info *, int, int);
  39. static int putop (instr_info *, const char *, int);
  40. static void oappend (instr_info *, const char *);
  41. static void append_seg (instr_info *);
  42. static void OP_indirE (instr_info *, int, int);
  43. static void print_operand_value (instr_info *, char *, int, bfd_vma);
  44. static void OP_E_memory (instr_info *, int, int);
  45. static void print_displacement (instr_info *, char *, bfd_vma);
  46. static void OP_E (instr_info *, int, int);
  47. static void OP_G (instr_info *, int, int);
  48. static bfd_vma get64 (instr_info *);
  49. static bfd_signed_vma get32 (instr_info *);
  50. static bfd_signed_vma get32s (instr_info *);
  51. static int get16 (instr_info *);
  52. static void set_op (instr_info *, bfd_vma, int);
  53. static void OP_Skip_MODRM (instr_info *, int, int);
  54. static void OP_REG (instr_info *, int, int);
  55. static void OP_IMREG (instr_info *, int, int);
  56. static void OP_I (instr_info *, int, int);
  57. static void OP_I64 (instr_info *, int, int);
  58. static void OP_sI (instr_info *, int, int);
  59. static void OP_J (instr_info *, int, int);
  60. static void OP_SEG (instr_info *, int, int);
  61. static void OP_DIR (instr_info *, int, int);
  62. static void OP_OFF (instr_info *, int, int);
  63. static void OP_OFF64 (instr_info *, int, int);
  64. static void ptr_reg (instr_info *, int, int);
  65. static void OP_ESreg (instr_info *, int, int);
  66. static void OP_DSreg (instr_info *, int, int);
  67. static void OP_C (instr_info *, int, int);
  68. static void OP_D (instr_info *, int, int);
  69. static void OP_T (instr_info *, int, int);
  70. static void OP_MMX (instr_info *, int, int);
  71. static void OP_XMM (instr_info *, int, int);
  72. static void OP_EM (instr_info *, int, int);
  73. static void OP_EX (instr_info *, int, int);
  74. static void OP_EMC (instr_info *, int,int);
  75. static void OP_MXC (instr_info *, int,int);
  76. static void OP_MS (instr_info *, int, int);
  77. static void OP_XS (instr_info *, int, int);
  78. static void OP_M (instr_info *, int, int);
  79. static void OP_VEX (instr_info *, int, int);
  80. static void OP_VexR (instr_info *, int, int);
  81. static void OP_VexW (instr_info *, int, int);
  82. static void OP_Rounding (instr_info *, int, int);
  83. static void OP_REG_VexI4 (instr_info *, int, int);
  84. static void OP_VexI4 (instr_info *, int, int);
  85. static void PCLMUL_Fixup (instr_info *, int, int);
  86. static void VPCMP_Fixup (instr_info *, int, int);
  87. static void VPCOM_Fixup (instr_info *, int, int);
  88. static void OP_0f07 (instr_info *, int, int);
  89. static void OP_Monitor (instr_info *, int, int);
  90. static void OP_Mwait (instr_info *, int, int);
  91. static void NOP_Fixup1 (instr_info *, int, int);
  92. static void NOP_Fixup2 (instr_info *, int, int);
  93. static void OP_3DNowSuffix (instr_info *, int, int);
  94. static void CMP_Fixup (instr_info *, int, int);
  95. static void BadOp (instr_info *);
  96. static void REP_Fixup (instr_info *, int, int);
  97. static void SEP_Fixup (instr_info *, int, int);
  98. static void BND_Fixup (instr_info *, int, int);
  99. static void NOTRACK_Fixup (instr_info *, int, int);
  100. static void HLE_Fixup1 (instr_info *, int, int);
  101. static void HLE_Fixup2 (instr_info *, int, int);
  102. static void HLE_Fixup3 (instr_info *, int, int);
  103. static void CMPXCHG8B_Fixup (instr_info *, int, int);
  104. static void XMM_Fixup (instr_info *, int, int);
  105. static void FXSAVE_Fixup (instr_info *, int, int);
  106. static void MOVSXD_Fixup (instr_info *, int, int);
  107. static void DistinctDest_Fixup (instr_info *, int, int);
  108. struct dis_private {
  109. /* Points to first byte not fetched. */
  110. bfd_byte *max_fetched;
  111. bfd_byte the_buffer[MAX_MNEM_SIZE];
  112. bfd_vma insn_start;
  113. int orig_sizeflag;
  114. OPCODES_SIGJMP_BUF bailout;
  115. };
  116. enum address_mode
  117. {
  118. mode_16bit,
  119. mode_32bit,
  120. mode_64bit
  121. };
  122. enum x86_64_isa
  123. {
  124. amd64 = 1,
  125. intel64
  126. };
  127. struct instr_info
  128. {
  129. enum address_mode address_mode;
  130. /* Flags for the prefixes for the current instruction. See below. */
  131. int prefixes;
  132. /* REX prefix the current instruction. See below. */
  133. unsigned char rex;
  134. /* Bits of REX we've already used. */
  135. unsigned char rex_used;
  136. bool need_modrm;
  137. bool need_vex;
  138. bool has_sib;
  139. /* Flags for ins->prefixes which we somehow handled when printing the
  140. current instruction. */
  141. int used_prefixes;
  142. /* Flags for EVEX bits which we somehow handled when printing the
  143. current instruction. */
  144. int evex_used;
  145. char obuf[100];
  146. char *obufp;
  147. char *mnemonicendp;
  148. char scratchbuf[100];
  149. unsigned char *start_codep;
  150. unsigned char *insn_codep;
  151. unsigned char *codep;
  152. unsigned char *end_codep;
  153. int last_lock_prefix;
  154. int last_repz_prefix;
  155. int last_repnz_prefix;
  156. int last_data_prefix;
  157. int last_addr_prefix;
  158. int last_rex_prefix;
  159. int last_seg_prefix;
  160. int fwait_prefix;
  161. /* The active segment register prefix. */
  162. int active_seg_prefix;
  163. #define MAX_CODE_LENGTH 15
  164. /* We can up to 14 ins->prefixes since the maximum instruction length is
  165. 15bytes. */
  166. int all_prefixes[MAX_CODE_LENGTH - 1];
  167. disassemble_info *info;
  168. struct
  169. {
  170. int mod;
  171. int reg;
  172. int rm;
  173. }
  174. modrm;
  175. struct
  176. {
  177. int scale;
  178. int index;
  179. int base;
  180. }
  181. sib;
  182. struct
  183. {
  184. int register_specifier;
  185. int length;
  186. int prefix;
  187. int mask_register_specifier;
  188. int ll;
  189. bool w;
  190. bool evex;
  191. bool r;
  192. bool v;
  193. bool zeroing;
  194. bool b;
  195. bool no_broadcast;
  196. }
  197. vex;
  198. /* Remember if the current op is a jump instruction. */
  199. bool op_is_jump;
  200. bool two_source_ops;
  201. unsigned char op_ad;
  202. signed char op_index[MAX_OPERANDS];
  203. char op_out[MAX_OPERANDS][100];
  204. bfd_vma op_address[MAX_OPERANDS];
  205. bfd_vma op_riprel[MAX_OPERANDS];
  206. bfd_vma start_pc;
  207. /* On the 386's of 1988, the maximum length of an instruction is 15 bytes.
  208. * (see topic "Redundant ins->prefixes" in the "Differences from 8086"
  209. * section of the "Virtual 8086 Mode" chapter.)
  210. * 'pc' should be the address of this instruction, it will
  211. * be used to print the target address if this is a relative jump or call
  212. * The function returns the length of this instruction in bytes.
  213. */
  214. char intel_syntax;
  215. bool intel_mnemonic;
  216. char open_char;
  217. char close_char;
  218. char separator_char;
  219. char scale_char;
  220. enum x86_64_isa isa64;
  221. };
  222. /* Mark parts used in the REX prefix. When we are testing for
  223. empty prefix (for 8bit register REX extension), just mask it
  224. out. Otherwise test for REX bit is excuse for existence of REX
  225. only in case value is nonzero. */
  226. #define USED_REX(value) \
  227. { \
  228. if (value) \
  229. { \
  230. if ((ins->rex & value)) \
  231. ins->rex_used |= (value) | REX_OPCODE; \
  232. } \
  233. else \
  234. ins->rex_used |= REX_OPCODE; \
  235. }
  236. #define EVEX_b_used 1
  237. /* Flags stored in PREFIXES. */
  238. #define PREFIX_REPZ 1
  239. #define PREFIX_REPNZ 2
  240. #define PREFIX_LOCK 4
  241. #define PREFIX_CS 8
  242. #define PREFIX_SS 0x10
  243. #define PREFIX_DS 0x20
  244. #define PREFIX_ES 0x40
  245. #define PREFIX_FS 0x80
  246. #define PREFIX_GS 0x100
  247. #define PREFIX_DATA 0x200
  248. #define PREFIX_ADDR 0x400
  249. #define PREFIX_FWAIT 0x800
  250. /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
  251. to ADDR (exclusive) are valid. Returns 1 for success, longjmps
  252. on error. */
  253. #define FETCH_DATA(info, addr) \
  254. ((addr) <= ((struct dis_private *) (info->private_data))->max_fetched \
  255. ? 1 : fetch_data ((info), (addr)))
  256. static int
  257. fetch_data (struct disassemble_info *info, bfd_byte *addr)
  258. {
  259. int status;
  260. struct dis_private *priv = (struct dis_private *) info->private_data;
  261. bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
  262. if (addr <= priv->the_buffer + MAX_MNEM_SIZE)
  263. status = (*info->read_memory_func) (start,
  264. priv->max_fetched,
  265. addr - priv->max_fetched,
  266. info);
  267. else
  268. status = -1;
  269. if (status != 0)
  270. {
  271. /* If we did manage to read at least one byte, then
  272. print_insn_i386 will do something sensible. Otherwise, print
  273. an error. We do that here because this is where we know
  274. STATUS. */
  275. if (priv->max_fetched == priv->the_buffer)
  276. (*info->memory_error_func) (status, start, info);
  277. OPCODES_SIGLONGJMP (priv->bailout, 1);
  278. }
  279. else
  280. priv->max_fetched = addr;
  281. return 1;
  282. }
  283. /* Possible values for prefix requirement. */
  284. #define PREFIX_IGNORED_SHIFT 16
  285. #define PREFIX_IGNORED_REPZ (PREFIX_REPZ << PREFIX_IGNORED_SHIFT)
  286. #define PREFIX_IGNORED_REPNZ (PREFIX_REPNZ << PREFIX_IGNORED_SHIFT)
  287. #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT)
  288. #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT)
  289. #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT)
  290. /* Opcode prefixes. */
  291. #define PREFIX_OPCODE (PREFIX_REPZ \
  292. | PREFIX_REPNZ \
  293. | PREFIX_DATA)
  294. /* Prefixes ignored. */
  295. #define PREFIX_IGNORED (PREFIX_IGNORED_REPZ \
  296. | PREFIX_IGNORED_REPNZ \
  297. | PREFIX_IGNORED_DATA)
  298. #define XX { NULL, 0 }
  299. #define Bad_Opcode NULL, { { NULL, 0 } }, 0
  300. #define Eb { OP_E, b_mode }
  301. #define Ebnd { OP_E, bnd_mode }
  302. #define EbS { OP_E, b_swap_mode }
  303. #define EbndS { OP_E, bnd_swap_mode }
  304. #define Ev { OP_E, v_mode }
  305. #define Eva { OP_E, va_mode }
  306. #define Ev_bnd { OP_E, v_bnd_mode }
  307. #define EvS { OP_E, v_swap_mode }
  308. #define Ed { OP_E, d_mode }
  309. #define Edq { OP_E, dq_mode }
  310. #define Edb { OP_E, db_mode }
  311. #define Edw { OP_E, dw_mode }
  312. #define Eq { OP_E, q_mode }
  313. #define indirEv { OP_indirE, indir_v_mode }
  314. #define indirEp { OP_indirE, f_mode }
  315. #define stackEv { OP_E, stack_v_mode }
  316. #define Em { OP_E, m_mode }
  317. #define Ew { OP_E, w_mode }
  318. #define M { OP_M, 0 } /* lea, lgdt, etc. */
  319. #define Ma { OP_M, a_mode }
  320. #define Mb { OP_M, b_mode }
  321. #define Md { OP_M, d_mode }
  322. #define Mo { OP_M, o_mode }
  323. #define Mp { OP_M, f_mode } /* 32 or 48 bit memory operand for LDS, LES etc */
  324. #define Mq { OP_M, q_mode }
  325. #define Mv { OP_M, v_mode }
  326. #define Mv_bnd { OP_M, v_bndmk_mode }
  327. #define Mx { OP_M, x_mode }
  328. #define Mxmm { OP_M, xmm_mode }
  329. #define Gb { OP_G, b_mode }
  330. #define Gbnd { OP_G, bnd_mode }
  331. #define Gv { OP_G, v_mode }
  332. #define Gd { OP_G, d_mode }
  333. #define Gdq { OP_G, dq_mode }
  334. #define Gm { OP_G, m_mode }
  335. #define Gva { OP_G, va_mode }
  336. #define Gw { OP_G, w_mode }
  337. #define Ib { OP_I, b_mode }
  338. #define sIb { OP_sI, b_mode } /* sign extened byte */
  339. #define sIbT { OP_sI, b_T_mode } /* sign extened byte like 'T' */
  340. #define Iv { OP_I, v_mode }
  341. #define sIv { OP_sI, v_mode }
  342. #define Iv64 { OP_I64, v_mode }
  343. #define Id { OP_I, d_mode }
  344. #define Iw { OP_I, w_mode }
  345. #define I1 { OP_I, const_1_mode }
  346. #define Jb { OP_J, b_mode }
  347. #define Jv { OP_J, v_mode }
  348. #define Jdqw { OP_J, dqw_mode }
  349. #define Cm { OP_C, m_mode }
  350. #define Dm { OP_D, m_mode }
  351. #define Td { OP_T, d_mode }
  352. #define Skip_MODRM { OP_Skip_MODRM, 0 }
  353. #define RMeAX { OP_REG, eAX_reg }
  354. #define RMeBX { OP_REG, eBX_reg }
  355. #define RMeCX { OP_REG, eCX_reg }
  356. #define RMeDX { OP_REG, eDX_reg }
  357. #define RMeSP { OP_REG, eSP_reg }
  358. #define RMeBP { OP_REG, eBP_reg }
  359. #define RMeSI { OP_REG, eSI_reg }
  360. #define RMeDI { OP_REG, eDI_reg }
  361. #define RMrAX { OP_REG, rAX_reg }
  362. #define RMrBX { OP_REG, rBX_reg }
  363. #define RMrCX { OP_REG, rCX_reg }
  364. #define RMrDX { OP_REG, rDX_reg }
  365. #define RMrSP { OP_REG, rSP_reg }
  366. #define RMrBP { OP_REG, rBP_reg }
  367. #define RMrSI { OP_REG, rSI_reg }
  368. #define RMrDI { OP_REG, rDI_reg }
  369. #define RMAL { OP_REG, al_reg }
  370. #define RMCL { OP_REG, cl_reg }
  371. #define RMDL { OP_REG, dl_reg }
  372. #define RMBL { OP_REG, bl_reg }
  373. #define RMAH { OP_REG, ah_reg }
  374. #define RMCH { OP_REG, ch_reg }
  375. #define RMDH { OP_REG, dh_reg }
  376. #define RMBH { OP_REG, bh_reg }
  377. #define RMAX { OP_REG, ax_reg }
  378. #define RMDX { OP_REG, dx_reg }
  379. #define eAX { OP_IMREG, eAX_reg }
  380. #define AL { OP_IMREG, al_reg }
  381. #define CL { OP_IMREG, cl_reg }
  382. #define zAX { OP_IMREG, z_mode_ax_reg }
  383. #define indirDX { OP_IMREG, indir_dx_reg }
  384. #define Sw { OP_SEG, w_mode }
  385. #define Sv { OP_SEG, v_mode }
  386. #define Ap { OP_DIR, 0 }
  387. #define Ob { OP_OFF64, b_mode }
  388. #define Ov { OP_OFF64, v_mode }
  389. #define Xb { OP_DSreg, eSI_reg }
  390. #define Xv { OP_DSreg, eSI_reg }
  391. #define Xz { OP_DSreg, eSI_reg }
  392. #define Yb { OP_ESreg, eDI_reg }
  393. #define Yv { OP_ESreg, eDI_reg }
  394. #define DSBX { OP_DSreg, eBX_reg }
  395. #define es { OP_REG, es_reg }
  396. #define ss { OP_REG, ss_reg }
  397. #define cs { OP_REG, cs_reg }
  398. #define ds { OP_REG, ds_reg }
  399. #define fs { OP_REG, fs_reg }
  400. #define gs { OP_REG, gs_reg }
  401. #define MX { OP_MMX, 0 }
  402. #define XM { OP_XMM, 0 }
  403. #define XMScalar { OP_XMM, scalar_mode }
  404. #define XMGatherD { OP_XMM, vex_vsib_d_w_dq_mode }
  405. #define XMGatherQ { OP_XMM, vex_vsib_q_w_dq_mode }
  406. #define XMM { OP_XMM, xmm_mode }
  407. #define TMM { OP_XMM, tmm_mode }
  408. #define XMxmmq { OP_XMM, xmmq_mode }
  409. #define EM { OP_EM, v_mode }
  410. #define EMS { OP_EM, v_swap_mode }
  411. #define EMd { OP_EM, d_mode }
  412. #define EMx { OP_EM, x_mode }
  413. #define EXbwUnit { OP_EX, bw_unit_mode }
  414. #define EXb { OP_EX, b_mode }
  415. #define EXw { OP_EX, w_mode }
  416. #define EXd { OP_EX, d_mode }
  417. #define EXdS { OP_EX, d_swap_mode }
  418. #define EXwS { OP_EX, w_swap_mode }
  419. #define EXq { OP_EX, q_mode }
  420. #define EXqS { OP_EX, q_swap_mode }
  421. #define EXdq { OP_EX, dq_mode }
  422. #define EXx { OP_EX, x_mode }
  423. #define EXxh { OP_EX, xh_mode }
  424. #define EXxS { OP_EX, x_swap_mode }
  425. #define EXxmm { OP_EX, xmm_mode }
  426. #define EXymm { OP_EX, ymm_mode }
  427. #define EXtmm { OP_EX, tmm_mode }
  428. #define EXxmmq { OP_EX, xmmq_mode }
  429. #define EXxmmqh { OP_EX, evex_half_bcst_xmmqh_mode }
  430. #define EXEvexHalfBcstXmmq { OP_EX, evex_half_bcst_xmmq_mode }
  431. #define EXxmmdw { OP_EX, xmmdw_mode }
  432. #define EXxmmqd { OP_EX, xmmqd_mode }
  433. #define EXxmmqdh { OP_EX, evex_half_bcst_xmmqdh_mode }
  434. #define EXymmq { OP_EX, ymmq_mode }
  435. #define EXEvexXGscat { OP_EX, evex_x_gscat_mode }
  436. #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode }
  437. #define MS { OP_MS, v_mode }
  438. #define XS { OP_XS, v_mode }
  439. #define EMCq { OP_EMC, q_mode }
  440. #define MXC { OP_MXC, 0 }
  441. #define OPSUF { OP_3DNowSuffix, 0 }
  442. #define SEP { SEP_Fixup, 0 }
  443. #define CMP { CMP_Fixup, 0 }
  444. #define XMM0 { XMM_Fixup, 0 }
  445. #define FXSAVE { FXSAVE_Fixup, 0 }
  446. #define Vex { OP_VEX, x_mode }
  447. #define VexW { OP_VexW, x_mode }
  448. #define VexScalar { OP_VEX, scalar_mode }
  449. #define VexScalarR { OP_VexR, scalar_mode }
  450. #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode }
  451. #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode }
  452. #define VexGdq { OP_VEX, dq_mode }
  453. #define VexTmm { OP_VEX, tmm_mode }
  454. #define XMVexI4 { OP_REG_VexI4, x_mode }
  455. #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode }
  456. #define VexI4 { OP_VexI4, 0 }
  457. #define PCLMUL { PCLMUL_Fixup, 0 }
  458. #define VPCMP { VPCMP_Fixup, 0 }
  459. #define VPCOM { VPCOM_Fixup, 0 }
  460. #define EXxEVexR { OP_Rounding, evex_rounding_mode }
  461. #define EXxEVexR64 { OP_Rounding, evex_rounding_64_mode }
  462. #define EXxEVexS { OP_Rounding, evex_sae_mode }
  463. #define MaskG { OP_G, mask_mode }
  464. #define MaskE { OP_E, mask_mode }
  465. #define MaskBDE { OP_E, mask_bd_mode }
  466. #define MaskVex { OP_VEX, mask_mode }
  467. #define MVexVSIBDWpX { OP_M, vex_vsib_d_w_dq_mode }
  468. #define MVexVSIBQWpX { OP_M, vex_vsib_q_w_dq_mode }
  469. #define MVexSIBMEM { OP_M, vex_sibmem_mode }
  470. /* Used handle "rep" prefix for string instructions. */
  471. #define Xbr { REP_Fixup, eSI_reg }
  472. #define Xvr { REP_Fixup, eSI_reg }
  473. #define Ybr { REP_Fixup, eDI_reg }
  474. #define Yvr { REP_Fixup, eDI_reg }
  475. #define Yzr { REP_Fixup, eDI_reg }
  476. #define indirDXr { REP_Fixup, indir_dx_reg }
  477. #define ALr { REP_Fixup, al_reg }
  478. #define eAXr { REP_Fixup, eAX_reg }
  479. /* Used handle HLE prefix for lockable instructions. */
  480. #define Ebh1 { HLE_Fixup1, b_mode }
  481. #define Evh1 { HLE_Fixup1, v_mode }
  482. #define Ebh2 { HLE_Fixup2, b_mode }
  483. #define Evh2 { HLE_Fixup2, v_mode }
  484. #define Ebh3 { HLE_Fixup3, b_mode }
  485. #define Evh3 { HLE_Fixup3, v_mode }
  486. #define BND { BND_Fixup, 0 }
  487. #define NOTRACK { NOTRACK_Fixup, 0 }
  488. #define cond_jump_flag { NULL, cond_jump_mode }
  489. #define loop_jcxz_flag { NULL, loop_jcxz_mode }
  490. /* bits in sizeflag */
  491. #define SUFFIX_ALWAYS 4
  492. #define AFLAG 2
  493. #define DFLAG 1
  494. enum
  495. {
  496. /* byte operand */
  497. b_mode = 1,
  498. /* byte operand with operand swapped */
  499. b_swap_mode,
  500. /* byte operand, sign extend like 'T' suffix */
  501. b_T_mode,
  502. /* operand size depends on prefixes */
  503. v_mode,
  504. /* operand size depends on prefixes with operand swapped */
  505. v_swap_mode,
  506. /* operand size depends on address prefix */
  507. va_mode,
  508. /* word operand */
  509. w_mode,
  510. /* double word operand */
  511. d_mode,
  512. /* word operand with operand swapped */
  513. w_swap_mode,
  514. /* double word operand with operand swapped */
  515. d_swap_mode,
  516. /* quad word operand */
  517. q_mode,
  518. /* quad word operand with operand swapped */
  519. q_swap_mode,
  520. /* ten-byte operand */
  521. t_mode,
  522. /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
  523. broadcast enabled. */
  524. x_mode,
  525. /* Similar to x_mode, but with different EVEX mem shifts. */
  526. evex_x_gscat_mode,
  527. /* Similar to x_mode, but with yet different EVEX mem shifts. */
  528. bw_unit_mode,
  529. /* Similar to x_mode, but with disabled broadcast. */
  530. evex_x_nobcst_mode,
  531. /* Similar to x_mode, but with operands swapped and disabled broadcast
  532. in EVEX. */
  533. x_swap_mode,
  534. /* 16-byte XMM, 32-byte YMM or 64-byte ZMM operand. In EVEX with
  535. broadcast of 16bit enabled. */
  536. xh_mode,
  537. /* 16-byte XMM operand */
  538. xmm_mode,
  539. /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
  540. memory operand (depending on vector length). Broadcast isn't
  541. allowed. */
  542. xmmq_mode,
  543. /* Same as xmmq_mode, but broadcast is allowed. */
  544. evex_half_bcst_xmmq_mode,
  545. /* XMM, XMM or YMM register operand, or quad word, xmmword or ymmword
  546. memory operand (depending on vector length). 16bit broadcast. */
  547. evex_half_bcst_xmmqh_mode,
  548. /* 16-byte XMM, word, double word or quad word operand. */
  549. xmmdw_mode,
  550. /* 16-byte XMM, double word, quad word operand or xmm word operand. */
  551. xmmqd_mode,
  552. /* 16-byte XMM, double word, quad word operand or xmm word operand.
  553. 16bit broadcast. */
  554. evex_half_bcst_xmmqdh_mode,
  555. /* 32-byte YMM operand */
  556. ymm_mode,
  557. /* quad word, ymmword or zmmword memory operand. */
  558. ymmq_mode,
  559. /* TMM operand */
  560. tmm_mode,
  561. /* d_mode in 32bit, q_mode in 64bit mode. */
  562. m_mode,
  563. /* pair of v_mode operands */
  564. a_mode,
  565. cond_jump_mode,
  566. loop_jcxz_mode,
  567. movsxd_mode,
  568. v_bnd_mode,
  569. /* like v_bnd_mode in 32bit, no RIP-rel in 64bit mode. */
  570. v_bndmk_mode,
  571. /* operand size depends on REX.W / VEX.W. */
  572. dq_mode,
  573. /* Displacements like v_mode without considering Intel64 ISA. */
  574. dqw_mode,
  575. /* bounds operand */
  576. bnd_mode,
  577. /* bounds operand with operand swapped */
  578. bnd_swap_mode,
  579. /* 4- or 6-byte pointer operand */
  580. f_mode,
  581. const_1_mode,
  582. /* v_mode for indirect branch opcodes. */
  583. indir_v_mode,
  584. /* v_mode for stack-related opcodes. */
  585. stack_v_mode,
  586. /* non-quad operand size depends on prefixes */
  587. z_mode,
  588. /* 16-byte operand */
  589. o_mode,
  590. /* registers like d_mode, memory like b_mode. */
  591. db_mode,
  592. /* registers like d_mode, memory like w_mode. */
  593. dw_mode,
  594. /* Operand size depends on the VEX.W bit, with VSIB dword indices. */
  595. vex_vsib_d_w_dq_mode,
  596. /* Operand size depends on the VEX.W bit, with VSIB qword indices. */
  597. vex_vsib_q_w_dq_mode,
  598. /* mandatory non-vector SIB. */
  599. vex_sibmem_mode,
  600. /* scalar, ignore vector length. */
  601. scalar_mode,
  602. /* Static rounding. */
  603. evex_rounding_mode,
  604. /* Static rounding, 64-bit mode only. */
  605. evex_rounding_64_mode,
  606. /* Supress all exceptions. */
  607. evex_sae_mode,
  608. /* Mask register operand. */
  609. mask_mode,
  610. /* Mask register operand. */
  611. mask_bd_mode,
  612. es_reg,
  613. cs_reg,
  614. ss_reg,
  615. ds_reg,
  616. fs_reg,
  617. gs_reg,
  618. eAX_reg,
  619. eCX_reg,
  620. eDX_reg,
  621. eBX_reg,
  622. eSP_reg,
  623. eBP_reg,
  624. eSI_reg,
  625. eDI_reg,
  626. al_reg,
  627. cl_reg,
  628. dl_reg,
  629. bl_reg,
  630. ah_reg,
  631. ch_reg,
  632. dh_reg,
  633. bh_reg,
  634. ax_reg,
  635. cx_reg,
  636. dx_reg,
  637. bx_reg,
  638. sp_reg,
  639. bp_reg,
  640. si_reg,
  641. di_reg,
  642. rAX_reg,
  643. rCX_reg,
  644. rDX_reg,
  645. rBX_reg,
  646. rSP_reg,
  647. rBP_reg,
  648. rSI_reg,
  649. rDI_reg,
  650. z_mode_ax_reg,
  651. indir_dx_reg
  652. };
  653. enum
  654. {
  655. FLOATCODE = 1,
  656. USE_REG_TABLE,
  657. USE_MOD_TABLE,
  658. USE_RM_TABLE,
  659. USE_PREFIX_TABLE,
  660. USE_X86_64_TABLE,
  661. USE_3BYTE_TABLE,
  662. USE_XOP_8F_TABLE,
  663. USE_VEX_C4_TABLE,
  664. USE_VEX_C5_TABLE,
  665. USE_VEX_LEN_TABLE,
  666. USE_VEX_W_TABLE,
  667. USE_EVEX_TABLE,
  668. USE_EVEX_LEN_TABLE
  669. };
  670. #define FLOAT NULL, { { NULL, FLOATCODE } }, 0
  671. #define DIS386(T, I) NULL, { { NULL, (T)}, { NULL, (I) } }, 0
  672. #define DIS386_PREFIX(T, I, P) NULL, { { NULL, (T)}, { NULL, (I) } }, P
  673. #define REG_TABLE(I) DIS386 (USE_REG_TABLE, (I))
  674. #define MOD_TABLE(I) DIS386 (USE_MOD_TABLE, (I))
  675. #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I))
  676. #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I))
  677. #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I))
  678. #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I))
  679. #define THREE_BYTE_TABLE_PREFIX(I, P) DIS386_PREFIX (USE_3BYTE_TABLE, (I), P)
  680. #define XOP_8F_TABLE(I) DIS386 (USE_XOP_8F_TABLE, (I))
  681. #define VEX_C4_TABLE(I) DIS386 (USE_VEX_C4_TABLE, (I))
  682. #define VEX_C5_TABLE(I) DIS386 (USE_VEX_C5_TABLE, (I))
  683. #define VEX_LEN_TABLE(I) DIS386 (USE_VEX_LEN_TABLE, (I))
  684. #define VEX_W_TABLE(I) DIS386 (USE_VEX_W_TABLE, (I))
  685. #define EVEX_TABLE(I) DIS386 (USE_EVEX_TABLE, (I))
  686. #define EVEX_LEN_TABLE(I) DIS386 (USE_EVEX_LEN_TABLE, (I))
  687. enum
  688. {
  689. REG_80 = 0,
  690. REG_81,
  691. REG_83,
  692. REG_8F,
  693. REG_C0,
  694. REG_C1,
  695. REG_C6,
  696. REG_C7,
  697. REG_D0,
  698. REG_D1,
  699. REG_D2,
  700. REG_D3,
  701. REG_F6,
  702. REG_F7,
  703. REG_FE,
  704. REG_FF,
  705. REG_0F00,
  706. REG_0F01,
  707. REG_0F0D,
  708. REG_0F18,
  709. REG_0F1C_P_0_MOD_0,
  710. REG_0F1E_P_1_MOD_3,
  711. REG_0F38D8_PREFIX_1,
  712. REG_0F3A0F_PREFIX_1_MOD_3,
  713. REG_0F71_MOD_0,
  714. REG_0F72_MOD_0,
  715. REG_0F73_MOD_0,
  716. REG_0FA6,
  717. REG_0FA7,
  718. REG_0FAE,
  719. REG_0FBA,
  720. REG_0FC7,
  721. REG_VEX_0F71_M_0,
  722. REG_VEX_0F72_M_0,
  723. REG_VEX_0F73_M_0,
  724. REG_VEX_0FAE,
  725. REG_VEX_0F3849_X86_64_P_0_W_0_M_1,
  726. REG_VEX_0F38F3_L_0,
  727. REG_XOP_09_01_L_0,
  728. REG_XOP_09_02_L_0,
  729. REG_XOP_09_12_M_1_L_0,
  730. REG_XOP_0A_12_L_0,
  731. REG_EVEX_0F71,
  732. REG_EVEX_0F72,
  733. REG_EVEX_0F73,
  734. REG_EVEX_0F38C6_M_0_L_2,
  735. REG_EVEX_0F38C7_M_0_L_2
  736. };
  737. enum
  738. {
  739. MOD_62_32BIT = 0,
  740. MOD_8D,
  741. MOD_C4_32BIT,
  742. MOD_C5_32BIT,
  743. MOD_C6_REG_7,
  744. MOD_C7_REG_7,
  745. MOD_FF_REG_3,
  746. MOD_FF_REG_5,
  747. MOD_0F01_REG_0,
  748. MOD_0F01_REG_1,
  749. MOD_0F01_REG_2,
  750. MOD_0F01_REG_3,
  751. MOD_0F01_REG_5,
  752. MOD_0F01_REG_7,
  753. MOD_0F12_PREFIX_0,
  754. MOD_0F12_PREFIX_2,
  755. MOD_0F13,
  756. MOD_0F16_PREFIX_0,
  757. MOD_0F16_PREFIX_2,
  758. MOD_0F17,
  759. MOD_0F18_REG_0,
  760. MOD_0F18_REG_1,
  761. MOD_0F18_REG_2,
  762. MOD_0F18_REG_3,
  763. MOD_0F1A_PREFIX_0,
  764. MOD_0F1B_PREFIX_0,
  765. MOD_0F1B_PREFIX_1,
  766. MOD_0F1C_PREFIX_0,
  767. MOD_0F1E_PREFIX_1,
  768. MOD_0F2B_PREFIX_0,
  769. MOD_0F2B_PREFIX_1,
  770. MOD_0F2B_PREFIX_2,
  771. MOD_0F2B_PREFIX_3,
  772. MOD_0F50,
  773. MOD_0F71,
  774. MOD_0F72,
  775. MOD_0F73,
  776. MOD_0FAE_REG_0,
  777. MOD_0FAE_REG_1,
  778. MOD_0FAE_REG_2,
  779. MOD_0FAE_REG_3,
  780. MOD_0FAE_REG_4,
  781. MOD_0FAE_REG_5,
  782. MOD_0FAE_REG_6,
  783. MOD_0FAE_REG_7,
  784. MOD_0FB2,
  785. MOD_0FB4,
  786. MOD_0FB5,
  787. MOD_0FC3,
  788. MOD_0FC7_REG_3,
  789. MOD_0FC7_REG_4,
  790. MOD_0FC7_REG_5,
  791. MOD_0FC7_REG_6,
  792. MOD_0FC7_REG_7,
  793. MOD_0FD7,
  794. MOD_0FE7_PREFIX_2,
  795. MOD_0FF0_PREFIX_3,
  796. MOD_0F382A,
  797. MOD_0F38DC_PREFIX_1,
  798. MOD_0F38DD_PREFIX_1,
  799. MOD_0F38DE_PREFIX_1,
  800. MOD_0F38DF_PREFIX_1,
  801. MOD_0F38F5,
  802. MOD_0F38F6_PREFIX_0,
  803. MOD_0F38F8_PREFIX_1,
  804. MOD_0F38F8_PREFIX_2,
  805. MOD_0F38F8_PREFIX_3,
  806. MOD_0F38F9,
  807. MOD_0F38FA_PREFIX_1,
  808. MOD_0F38FB_PREFIX_1,
  809. MOD_0F3A0F_PREFIX_1,
  810. MOD_VEX_0F12_PREFIX_0,
  811. MOD_VEX_0F12_PREFIX_2,
  812. MOD_VEX_0F13,
  813. MOD_VEX_0F16_PREFIX_0,
  814. MOD_VEX_0F16_PREFIX_2,
  815. MOD_VEX_0F17,
  816. MOD_VEX_0F2B,
  817. MOD_VEX_0F41_L_1,
  818. MOD_VEX_0F42_L_1,
  819. MOD_VEX_0F44_L_0,
  820. MOD_VEX_0F45_L_1,
  821. MOD_VEX_0F46_L_1,
  822. MOD_VEX_0F47_L_1,
  823. MOD_VEX_0F4A_L_1,
  824. MOD_VEX_0F4B_L_1,
  825. MOD_VEX_0F50,
  826. MOD_VEX_0F71,
  827. MOD_VEX_0F72,
  828. MOD_VEX_0F73,
  829. MOD_VEX_0F91_L_0,
  830. MOD_VEX_0F92_L_0,
  831. MOD_VEX_0F93_L_0,
  832. MOD_VEX_0F98_L_0,
  833. MOD_VEX_0F99_L_0,
  834. MOD_VEX_0FAE_REG_2,
  835. MOD_VEX_0FAE_REG_3,
  836. MOD_VEX_0FD7,
  837. MOD_VEX_0FE7,
  838. MOD_VEX_0FF0_PREFIX_3,
  839. MOD_VEX_0F381A,
  840. MOD_VEX_0F382A,
  841. MOD_VEX_0F382C,
  842. MOD_VEX_0F382D,
  843. MOD_VEX_0F382E,
  844. MOD_VEX_0F382F,
  845. MOD_VEX_0F3849_X86_64_P_0_W_0,
  846. MOD_VEX_0F3849_X86_64_P_2_W_0,
  847. MOD_VEX_0F3849_X86_64_P_3_W_0,
  848. MOD_VEX_0F384B_X86_64_P_1_W_0,
  849. MOD_VEX_0F384B_X86_64_P_2_W_0,
  850. MOD_VEX_0F384B_X86_64_P_3_W_0,
  851. MOD_VEX_0F385A,
  852. MOD_VEX_0F385C_X86_64_P_1_W_0,
  853. MOD_VEX_0F385E_X86_64_P_0_W_0,
  854. MOD_VEX_0F385E_X86_64_P_1_W_0,
  855. MOD_VEX_0F385E_X86_64_P_2_W_0,
  856. MOD_VEX_0F385E_X86_64_P_3_W_0,
  857. MOD_VEX_0F388C,
  858. MOD_VEX_0F388E,
  859. MOD_VEX_0F3A30_L_0,
  860. MOD_VEX_0F3A31_L_0,
  861. MOD_VEX_0F3A32_L_0,
  862. MOD_VEX_0F3A33_L_0,
  863. MOD_XOP_09_12,
  864. MOD_EVEX_0F381A,
  865. MOD_EVEX_0F381B,
  866. MOD_EVEX_0F3828_P_1,
  867. MOD_EVEX_0F382A_P_1_W_1,
  868. MOD_EVEX_0F3838_P_1,
  869. MOD_EVEX_0F383A_P_1_W_0,
  870. MOD_EVEX_0F385A,
  871. MOD_EVEX_0F385B,
  872. MOD_EVEX_0F387A_W_0,
  873. MOD_EVEX_0F387B_W_0,
  874. MOD_EVEX_0F387C,
  875. MOD_EVEX_0F38C6,
  876. MOD_EVEX_0F38C7,
  877. };
  878. enum
  879. {
  880. RM_C6_REG_7 = 0,
  881. RM_C7_REG_7,
  882. RM_0F01_REG_0,
  883. RM_0F01_REG_1,
  884. RM_0F01_REG_2,
  885. RM_0F01_REG_3,
  886. RM_0F01_REG_5_MOD_3,
  887. RM_0F01_REG_7_MOD_3,
  888. RM_0F1E_P_1_MOD_3_REG_7,
  889. RM_0FAE_REG_6_MOD_3_P_0,
  890. RM_0FAE_REG_7_MOD_3,
  891. RM_0F3A0F_P_1_MOD_3_REG_0,
  892. RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0
  893. };
  894. enum
  895. {
  896. PREFIX_90 = 0,
  897. PREFIX_0F01_REG_1_RM_4,
  898. PREFIX_0F01_REG_1_RM_5,
  899. PREFIX_0F01_REG_1_RM_6,
  900. PREFIX_0F01_REG_1_RM_7,
  901. PREFIX_0F01_REG_3_RM_1,
  902. PREFIX_0F01_REG_5_MOD_0,
  903. PREFIX_0F01_REG_5_MOD_3_RM_0,
  904. PREFIX_0F01_REG_5_MOD_3_RM_1,
  905. PREFIX_0F01_REG_5_MOD_3_RM_2,
  906. PREFIX_0F01_REG_5_MOD_3_RM_4,
  907. PREFIX_0F01_REG_5_MOD_3_RM_5,
  908. PREFIX_0F01_REG_5_MOD_3_RM_6,
  909. PREFIX_0F01_REG_5_MOD_3_RM_7,
  910. PREFIX_0F01_REG_7_MOD_3_RM_2,
  911. PREFIX_0F01_REG_7_MOD_3_RM_6,
  912. PREFIX_0F01_REG_7_MOD_3_RM_7,
  913. PREFIX_0F09,
  914. PREFIX_0F10,
  915. PREFIX_0F11,
  916. PREFIX_0F12,
  917. PREFIX_0F16,
  918. PREFIX_0F1A,
  919. PREFIX_0F1B,
  920. PREFIX_0F1C,
  921. PREFIX_0F1E,
  922. PREFIX_0F2A,
  923. PREFIX_0F2B,
  924. PREFIX_0F2C,
  925. PREFIX_0F2D,
  926. PREFIX_0F2E,
  927. PREFIX_0F2F,
  928. PREFIX_0F51,
  929. PREFIX_0F52,
  930. PREFIX_0F53,
  931. PREFIX_0F58,
  932. PREFIX_0F59,
  933. PREFIX_0F5A,
  934. PREFIX_0F5B,
  935. PREFIX_0F5C,
  936. PREFIX_0F5D,
  937. PREFIX_0F5E,
  938. PREFIX_0F5F,
  939. PREFIX_0F60,
  940. PREFIX_0F61,
  941. PREFIX_0F62,
  942. PREFIX_0F6F,
  943. PREFIX_0F70,
  944. PREFIX_0F78,
  945. PREFIX_0F79,
  946. PREFIX_0F7C,
  947. PREFIX_0F7D,
  948. PREFIX_0F7E,
  949. PREFIX_0F7F,
  950. PREFIX_0FAE_REG_0_MOD_3,
  951. PREFIX_0FAE_REG_1_MOD_3,
  952. PREFIX_0FAE_REG_2_MOD_3,
  953. PREFIX_0FAE_REG_3_MOD_3,
  954. PREFIX_0FAE_REG_4_MOD_0,
  955. PREFIX_0FAE_REG_4_MOD_3,
  956. PREFIX_0FAE_REG_5_MOD_3,
  957. PREFIX_0FAE_REG_6_MOD_0,
  958. PREFIX_0FAE_REG_6_MOD_3,
  959. PREFIX_0FAE_REG_7_MOD_0,
  960. PREFIX_0FB8,
  961. PREFIX_0FBC,
  962. PREFIX_0FBD,
  963. PREFIX_0FC2,
  964. PREFIX_0FC7_REG_6_MOD_0,
  965. PREFIX_0FC7_REG_6_MOD_3,
  966. PREFIX_0FC7_REG_7_MOD_3,
  967. PREFIX_0FD0,
  968. PREFIX_0FD6,
  969. PREFIX_0FE6,
  970. PREFIX_0FE7,
  971. PREFIX_0FF0,
  972. PREFIX_0FF7,
  973. PREFIX_0F38D8,
  974. PREFIX_0F38DC,
  975. PREFIX_0F38DD,
  976. PREFIX_0F38DE,
  977. PREFIX_0F38DF,
  978. PREFIX_0F38F0,
  979. PREFIX_0F38F1,
  980. PREFIX_0F38F6,
  981. PREFIX_0F38F8,
  982. PREFIX_0F38FA,
  983. PREFIX_0F38FB,
  984. PREFIX_0F3A0F,
  985. PREFIX_VEX_0F10,
  986. PREFIX_VEX_0F11,
  987. PREFIX_VEX_0F12,
  988. PREFIX_VEX_0F16,
  989. PREFIX_VEX_0F2A,
  990. PREFIX_VEX_0F2C,
  991. PREFIX_VEX_0F2D,
  992. PREFIX_VEX_0F2E,
  993. PREFIX_VEX_0F2F,
  994. PREFIX_VEX_0F41_L_1_M_1_W_0,
  995. PREFIX_VEX_0F41_L_1_M_1_W_1,
  996. PREFIX_VEX_0F42_L_1_M_1_W_0,
  997. PREFIX_VEX_0F42_L_1_M_1_W_1,
  998. PREFIX_VEX_0F44_L_0_M_1_W_0,
  999. PREFIX_VEX_0F44_L_0_M_1_W_1,
  1000. PREFIX_VEX_0F45_L_1_M_1_W_0,
  1001. PREFIX_VEX_0F45_L_1_M_1_W_1,
  1002. PREFIX_VEX_0F46_L_1_M_1_W_0,
  1003. PREFIX_VEX_0F46_L_1_M_1_W_1,
  1004. PREFIX_VEX_0F47_L_1_M_1_W_0,
  1005. PREFIX_VEX_0F47_L_1_M_1_W_1,
  1006. PREFIX_VEX_0F4A_L_1_M_1_W_0,
  1007. PREFIX_VEX_0F4A_L_1_M_1_W_1,
  1008. PREFIX_VEX_0F4B_L_1_M_1_W_0,
  1009. PREFIX_VEX_0F4B_L_1_M_1_W_1,
  1010. PREFIX_VEX_0F51,
  1011. PREFIX_VEX_0F52,
  1012. PREFIX_VEX_0F53,
  1013. PREFIX_VEX_0F58,
  1014. PREFIX_VEX_0F59,
  1015. PREFIX_VEX_0F5A,
  1016. PREFIX_VEX_0F5B,
  1017. PREFIX_VEX_0F5C,
  1018. PREFIX_VEX_0F5D,
  1019. PREFIX_VEX_0F5E,
  1020. PREFIX_VEX_0F5F,
  1021. PREFIX_VEX_0F6F,
  1022. PREFIX_VEX_0F70,
  1023. PREFIX_VEX_0F7C,
  1024. PREFIX_VEX_0F7D,
  1025. PREFIX_VEX_0F7E,
  1026. PREFIX_VEX_0F7F,
  1027. PREFIX_VEX_0F90_L_0_W_0,
  1028. PREFIX_VEX_0F90_L_0_W_1,
  1029. PREFIX_VEX_0F91_L_0_M_0_W_0,
  1030. PREFIX_VEX_0F91_L_0_M_0_W_1,
  1031. PREFIX_VEX_0F92_L_0_M_1_W_0,
  1032. PREFIX_VEX_0F92_L_0_M_1_W_1,
  1033. PREFIX_VEX_0F93_L_0_M_1_W_0,
  1034. PREFIX_VEX_0F93_L_0_M_1_W_1,
  1035. PREFIX_VEX_0F98_L_0_M_1_W_0,
  1036. PREFIX_VEX_0F98_L_0_M_1_W_1,
  1037. PREFIX_VEX_0F99_L_0_M_1_W_0,
  1038. PREFIX_VEX_0F99_L_0_M_1_W_1,
  1039. PREFIX_VEX_0FC2,
  1040. PREFIX_VEX_0FD0,
  1041. PREFIX_VEX_0FE6,
  1042. PREFIX_VEX_0FF0,
  1043. PREFIX_VEX_0F3849_X86_64,
  1044. PREFIX_VEX_0F384B_X86_64,
  1045. PREFIX_VEX_0F385C_X86_64,
  1046. PREFIX_VEX_0F385E_X86_64,
  1047. PREFIX_VEX_0F38F5_L_0,
  1048. PREFIX_VEX_0F38F6_L_0,
  1049. PREFIX_VEX_0F38F7_L_0,
  1050. PREFIX_VEX_0F3AF0_L_0,
  1051. PREFIX_EVEX_0F5B,
  1052. PREFIX_EVEX_0F6F,
  1053. PREFIX_EVEX_0F70,
  1054. PREFIX_EVEX_0F78,
  1055. PREFIX_EVEX_0F79,
  1056. PREFIX_EVEX_0F7A,
  1057. PREFIX_EVEX_0F7B,
  1058. PREFIX_EVEX_0F7E,
  1059. PREFIX_EVEX_0F7F,
  1060. PREFIX_EVEX_0FC2,
  1061. PREFIX_EVEX_0FE6,
  1062. PREFIX_EVEX_0F3810,
  1063. PREFIX_EVEX_0F3811,
  1064. PREFIX_EVEX_0F3812,
  1065. PREFIX_EVEX_0F3813,
  1066. PREFIX_EVEX_0F3814,
  1067. PREFIX_EVEX_0F3815,
  1068. PREFIX_EVEX_0F3820,
  1069. PREFIX_EVEX_0F3821,
  1070. PREFIX_EVEX_0F3822,
  1071. PREFIX_EVEX_0F3823,
  1072. PREFIX_EVEX_0F3824,
  1073. PREFIX_EVEX_0F3825,
  1074. PREFIX_EVEX_0F3826,
  1075. PREFIX_EVEX_0F3827,
  1076. PREFIX_EVEX_0F3828,
  1077. PREFIX_EVEX_0F3829,
  1078. PREFIX_EVEX_0F382A,
  1079. PREFIX_EVEX_0F3830,
  1080. PREFIX_EVEX_0F3831,
  1081. PREFIX_EVEX_0F3832,
  1082. PREFIX_EVEX_0F3833,
  1083. PREFIX_EVEX_0F3834,
  1084. PREFIX_EVEX_0F3835,
  1085. PREFIX_EVEX_0F3838,
  1086. PREFIX_EVEX_0F3839,
  1087. PREFIX_EVEX_0F383A,
  1088. PREFIX_EVEX_0F3852,
  1089. PREFIX_EVEX_0F3853,
  1090. PREFIX_EVEX_0F3868,
  1091. PREFIX_EVEX_0F3872,
  1092. PREFIX_EVEX_0F389A,
  1093. PREFIX_EVEX_0F389B,
  1094. PREFIX_EVEX_0F38AA,
  1095. PREFIX_EVEX_0F38AB,
  1096. PREFIX_EVEX_0F3A08,
  1097. PREFIX_EVEX_0F3A0A,
  1098. PREFIX_EVEX_0F3A26,
  1099. PREFIX_EVEX_0F3A27,
  1100. PREFIX_EVEX_0F3A56,
  1101. PREFIX_EVEX_0F3A57,
  1102. PREFIX_EVEX_0F3A66,
  1103. PREFIX_EVEX_0F3A67,
  1104. PREFIX_EVEX_0F3AC2,
  1105. PREFIX_EVEX_MAP5_10,
  1106. PREFIX_EVEX_MAP5_11,
  1107. PREFIX_EVEX_MAP5_1D,
  1108. PREFIX_EVEX_MAP5_2A,
  1109. PREFIX_EVEX_MAP5_2C,
  1110. PREFIX_EVEX_MAP5_2D,
  1111. PREFIX_EVEX_MAP5_2E,
  1112. PREFIX_EVEX_MAP5_2F,
  1113. PREFIX_EVEX_MAP5_51,
  1114. PREFIX_EVEX_MAP5_58,
  1115. PREFIX_EVEX_MAP5_59,
  1116. PREFIX_EVEX_MAP5_5A,
  1117. PREFIX_EVEX_MAP5_5B,
  1118. PREFIX_EVEX_MAP5_5C,
  1119. PREFIX_EVEX_MAP5_5D,
  1120. PREFIX_EVEX_MAP5_5E,
  1121. PREFIX_EVEX_MAP5_5F,
  1122. PREFIX_EVEX_MAP5_78,
  1123. PREFIX_EVEX_MAP5_79,
  1124. PREFIX_EVEX_MAP5_7A,
  1125. PREFIX_EVEX_MAP5_7B,
  1126. PREFIX_EVEX_MAP5_7C,
  1127. PREFIX_EVEX_MAP5_7D,
  1128. PREFIX_EVEX_MAP6_13,
  1129. PREFIX_EVEX_MAP6_56,
  1130. PREFIX_EVEX_MAP6_57,
  1131. PREFIX_EVEX_MAP6_D6,
  1132. PREFIX_EVEX_MAP6_D7,
  1133. };
  1134. enum
  1135. {
  1136. X86_64_06 = 0,
  1137. X86_64_07,
  1138. X86_64_0E,
  1139. X86_64_16,
  1140. X86_64_17,
  1141. X86_64_1E,
  1142. X86_64_1F,
  1143. X86_64_27,
  1144. X86_64_2F,
  1145. X86_64_37,
  1146. X86_64_3F,
  1147. X86_64_60,
  1148. X86_64_61,
  1149. X86_64_62,
  1150. X86_64_63,
  1151. X86_64_6D,
  1152. X86_64_6F,
  1153. X86_64_82,
  1154. X86_64_9A,
  1155. X86_64_C2,
  1156. X86_64_C3,
  1157. X86_64_C4,
  1158. X86_64_C5,
  1159. X86_64_CE,
  1160. X86_64_D4,
  1161. X86_64_D5,
  1162. X86_64_E8,
  1163. X86_64_E9,
  1164. X86_64_EA,
  1165. X86_64_0F01_REG_0,
  1166. X86_64_0F01_REG_1,
  1167. X86_64_0F01_REG_1_RM_5_PREFIX_2,
  1168. X86_64_0F01_REG_1_RM_6_PREFIX_2,
  1169. X86_64_0F01_REG_1_RM_7_PREFIX_2,
  1170. X86_64_0F01_REG_2,
  1171. X86_64_0F01_REG_3,
  1172. X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1,
  1173. X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1,
  1174. X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1,
  1175. X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1,
  1176. X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1,
  1177. X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3,
  1178. X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1,
  1179. X86_64_0F24,
  1180. X86_64_0F26,
  1181. X86_64_0FC7_REG_6_MOD_3_PREFIX_1,
  1182. X86_64_VEX_0F3849,
  1183. X86_64_VEX_0F384B,
  1184. X86_64_VEX_0F385C,
  1185. X86_64_VEX_0F385E
  1186. };
  1187. enum
  1188. {
  1189. THREE_BYTE_0F38 = 0,
  1190. THREE_BYTE_0F3A
  1191. };
  1192. enum
  1193. {
  1194. XOP_08 = 0,
  1195. XOP_09,
  1196. XOP_0A
  1197. };
  1198. enum
  1199. {
  1200. VEX_0F = 0,
  1201. VEX_0F38,
  1202. VEX_0F3A
  1203. };
  1204. enum
  1205. {
  1206. EVEX_0F = 0,
  1207. EVEX_0F38,
  1208. EVEX_0F3A,
  1209. EVEX_MAP5,
  1210. EVEX_MAP6,
  1211. };
  1212. enum
  1213. {
  1214. VEX_LEN_0F12_P_0_M_0 = 0,
  1215. VEX_LEN_0F12_P_0_M_1,
  1216. #define VEX_LEN_0F12_P_2_M_0 VEX_LEN_0F12_P_0_M_0
  1217. VEX_LEN_0F13_M_0,
  1218. VEX_LEN_0F16_P_0_M_0,
  1219. VEX_LEN_0F16_P_0_M_1,
  1220. #define VEX_LEN_0F16_P_2_M_0 VEX_LEN_0F16_P_0_M_0
  1221. VEX_LEN_0F17_M_0,
  1222. VEX_LEN_0F41,
  1223. VEX_LEN_0F42,
  1224. VEX_LEN_0F44,
  1225. VEX_LEN_0F45,
  1226. VEX_LEN_0F46,
  1227. VEX_LEN_0F47,
  1228. VEX_LEN_0F4A,
  1229. VEX_LEN_0F4B,
  1230. VEX_LEN_0F6E,
  1231. VEX_LEN_0F77,
  1232. VEX_LEN_0F7E_P_1,
  1233. VEX_LEN_0F7E_P_2,
  1234. VEX_LEN_0F90,
  1235. VEX_LEN_0F91,
  1236. VEX_LEN_0F92,
  1237. VEX_LEN_0F93,
  1238. VEX_LEN_0F98,
  1239. VEX_LEN_0F99,
  1240. VEX_LEN_0FAE_R_2_M_0,
  1241. VEX_LEN_0FAE_R_3_M_0,
  1242. VEX_LEN_0FC4,
  1243. VEX_LEN_0FC5,
  1244. VEX_LEN_0FD6,
  1245. VEX_LEN_0FF7,
  1246. VEX_LEN_0F3816,
  1247. VEX_LEN_0F3819,
  1248. VEX_LEN_0F381A_M_0,
  1249. VEX_LEN_0F3836,
  1250. VEX_LEN_0F3841,
  1251. VEX_LEN_0F3849_X86_64_P_0_W_0_M_0,
  1252. VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0,
  1253. VEX_LEN_0F3849_X86_64_P_2_W_0_M_0,
  1254. VEX_LEN_0F3849_X86_64_P_3_W_0_M_0,
  1255. VEX_LEN_0F384B_X86_64_P_1_W_0_M_0,
  1256. VEX_LEN_0F384B_X86_64_P_2_W_0_M_0,
  1257. VEX_LEN_0F384B_X86_64_P_3_W_0_M_0,
  1258. VEX_LEN_0F385A_M_0,
  1259. VEX_LEN_0F385C_X86_64_P_1_W_0_M_0,
  1260. VEX_LEN_0F385E_X86_64_P_0_W_0_M_0,
  1261. VEX_LEN_0F385E_X86_64_P_1_W_0_M_0,
  1262. VEX_LEN_0F385E_X86_64_P_2_W_0_M_0,
  1263. VEX_LEN_0F385E_X86_64_P_3_W_0_M_0,
  1264. VEX_LEN_0F38DB,
  1265. VEX_LEN_0F38F2,
  1266. VEX_LEN_0F38F3,
  1267. VEX_LEN_0F38F5,
  1268. VEX_LEN_0F38F6,
  1269. VEX_LEN_0F38F7,
  1270. VEX_LEN_0F3A00,
  1271. VEX_LEN_0F3A01,
  1272. VEX_LEN_0F3A06,
  1273. VEX_LEN_0F3A14,
  1274. VEX_LEN_0F3A15,
  1275. VEX_LEN_0F3A16,
  1276. VEX_LEN_0F3A17,
  1277. VEX_LEN_0F3A18,
  1278. VEX_LEN_0F3A19,
  1279. VEX_LEN_0F3A20,
  1280. VEX_LEN_0F3A21,
  1281. VEX_LEN_0F3A22,
  1282. VEX_LEN_0F3A30,
  1283. VEX_LEN_0F3A31,
  1284. VEX_LEN_0F3A32,
  1285. VEX_LEN_0F3A33,
  1286. VEX_LEN_0F3A38,
  1287. VEX_LEN_0F3A39,
  1288. VEX_LEN_0F3A41,
  1289. VEX_LEN_0F3A46,
  1290. VEX_LEN_0F3A60,
  1291. VEX_LEN_0F3A61,
  1292. VEX_LEN_0F3A62,
  1293. VEX_LEN_0F3A63,
  1294. VEX_LEN_0F3ADF,
  1295. VEX_LEN_0F3AF0,
  1296. VEX_LEN_0FXOP_08_85,
  1297. VEX_LEN_0FXOP_08_86,
  1298. VEX_LEN_0FXOP_08_87,
  1299. VEX_LEN_0FXOP_08_8E,
  1300. VEX_LEN_0FXOP_08_8F,
  1301. VEX_LEN_0FXOP_08_95,
  1302. VEX_LEN_0FXOP_08_96,
  1303. VEX_LEN_0FXOP_08_97,
  1304. VEX_LEN_0FXOP_08_9E,
  1305. VEX_LEN_0FXOP_08_9F,
  1306. VEX_LEN_0FXOP_08_A3,
  1307. VEX_LEN_0FXOP_08_A6,
  1308. VEX_LEN_0FXOP_08_B6,
  1309. VEX_LEN_0FXOP_08_C0,
  1310. VEX_LEN_0FXOP_08_C1,
  1311. VEX_LEN_0FXOP_08_C2,
  1312. VEX_LEN_0FXOP_08_C3,
  1313. VEX_LEN_0FXOP_08_CC,
  1314. VEX_LEN_0FXOP_08_CD,
  1315. VEX_LEN_0FXOP_08_CE,
  1316. VEX_LEN_0FXOP_08_CF,
  1317. VEX_LEN_0FXOP_08_EC,
  1318. VEX_LEN_0FXOP_08_ED,
  1319. VEX_LEN_0FXOP_08_EE,
  1320. VEX_LEN_0FXOP_08_EF,
  1321. VEX_LEN_0FXOP_09_01,
  1322. VEX_LEN_0FXOP_09_02,
  1323. VEX_LEN_0FXOP_09_12_M_1,
  1324. VEX_LEN_0FXOP_09_82_W_0,
  1325. VEX_LEN_0FXOP_09_83_W_0,
  1326. VEX_LEN_0FXOP_09_90,
  1327. VEX_LEN_0FXOP_09_91,
  1328. VEX_LEN_0FXOP_09_92,
  1329. VEX_LEN_0FXOP_09_93,
  1330. VEX_LEN_0FXOP_09_94,
  1331. VEX_LEN_0FXOP_09_95,
  1332. VEX_LEN_0FXOP_09_96,
  1333. VEX_LEN_0FXOP_09_97,
  1334. VEX_LEN_0FXOP_09_98,
  1335. VEX_LEN_0FXOP_09_99,
  1336. VEX_LEN_0FXOP_09_9A,
  1337. VEX_LEN_0FXOP_09_9B,
  1338. VEX_LEN_0FXOP_09_C1,
  1339. VEX_LEN_0FXOP_09_C2,
  1340. VEX_LEN_0FXOP_09_C3,
  1341. VEX_LEN_0FXOP_09_C6,
  1342. VEX_LEN_0FXOP_09_C7,
  1343. VEX_LEN_0FXOP_09_CB,
  1344. VEX_LEN_0FXOP_09_D1,
  1345. VEX_LEN_0FXOP_09_D2,
  1346. VEX_LEN_0FXOP_09_D3,
  1347. VEX_LEN_0FXOP_09_D6,
  1348. VEX_LEN_0FXOP_09_D7,
  1349. VEX_LEN_0FXOP_09_DB,
  1350. VEX_LEN_0FXOP_09_E1,
  1351. VEX_LEN_0FXOP_09_E2,
  1352. VEX_LEN_0FXOP_09_E3,
  1353. VEX_LEN_0FXOP_0A_12,
  1354. };
  1355. enum
  1356. {
  1357. EVEX_LEN_0F3816 = 0,
  1358. EVEX_LEN_0F3819,
  1359. EVEX_LEN_0F381A_M_0,
  1360. EVEX_LEN_0F381B_M_0,
  1361. EVEX_LEN_0F3836,
  1362. EVEX_LEN_0F385A_M_0,
  1363. EVEX_LEN_0F385B_M_0,
  1364. EVEX_LEN_0F38C6_M_0,
  1365. EVEX_LEN_0F38C7_M_0,
  1366. EVEX_LEN_0F3A00,
  1367. EVEX_LEN_0F3A01,
  1368. EVEX_LEN_0F3A18,
  1369. EVEX_LEN_0F3A19,
  1370. EVEX_LEN_0F3A1A,
  1371. EVEX_LEN_0F3A1B,
  1372. EVEX_LEN_0F3A23,
  1373. EVEX_LEN_0F3A38,
  1374. EVEX_LEN_0F3A39,
  1375. EVEX_LEN_0F3A3A,
  1376. EVEX_LEN_0F3A3B,
  1377. EVEX_LEN_0F3A43
  1378. };
  1379. enum
  1380. {
  1381. VEX_W_0F41_L_1_M_1 = 0,
  1382. VEX_W_0F42_L_1_M_1,
  1383. VEX_W_0F44_L_0_M_1,
  1384. VEX_W_0F45_L_1_M_1,
  1385. VEX_W_0F46_L_1_M_1,
  1386. VEX_W_0F47_L_1_M_1,
  1387. VEX_W_0F4A_L_1_M_1,
  1388. VEX_W_0F4B_L_1_M_1,
  1389. VEX_W_0F90_L_0,
  1390. VEX_W_0F91_L_0_M_0,
  1391. VEX_W_0F92_L_0_M_1,
  1392. VEX_W_0F93_L_0_M_1,
  1393. VEX_W_0F98_L_0_M_1,
  1394. VEX_W_0F99_L_0_M_1,
  1395. VEX_W_0F380C,
  1396. VEX_W_0F380D,
  1397. VEX_W_0F380E,
  1398. VEX_W_0F380F,
  1399. VEX_W_0F3813,
  1400. VEX_W_0F3816_L_1,
  1401. VEX_W_0F3818,
  1402. VEX_W_0F3819_L_1,
  1403. VEX_W_0F381A_M_0_L_1,
  1404. VEX_W_0F382C_M_0,
  1405. VEX_W_0F382D_M_0,
  1406. VEX_W_0F382E_M_0,
  1407. VEX_W_0F382F_M_0,
  1408. VEX_W_0F3836,
  1409. VEX_W_0F3846,
  1410. VEX_W_0F3849_X86_64_P_0,
  1411. VEX_W_0F3849_X86_64_P_2,
  1412. VEX_W_0F3849_X86_64_P_3,
  1413. VEX_W_0F384B_X86_64_P_1,
  1414. VEX_W_0F384B_X86_64_P_2,
  1415. VEX_W_0F384B_X86_64_P_3,
  1416. VEX_W_0F3850,
  1417. VEX_W_0F3851,
  1418. VEX_W_0F3852,
  1419. VEX_W_0F3853,
  1420. VEX_W_0F3858,
  1421. VEX_W_0F3859,
  1422. VEX_W_0F385A_M_0_L_0,
  1423. VEX_W_0F385C_X86_64_P_1,
  1424. VEX_W_0F385E_X86_64_P_0,
  1425. VEX_W_0F385E_X86_64_P_1,
  1426. VEX_W_0F385E_X86_64_P_2,
  1427. VEX_W_0F385E_X86_64_P_3,
  1428. VEX_W_0F3878,
  1429. VEX_W_0F3879,
  1430. VEX_W_0F38CF,
  1431. VEX_W_0F3A00_L_1,
  1432. VEX_W_0F3A01_L_1,
  1433. VEX_W_0F3A02,
  1434. VEX_W_0F3A04,
  1435. VEX_W_0F3A05,
  1436. VEX_W_0F3A06_L_1,
  1437. VEX_W_0F3A18_L_1,
  1438. VEX_W_0F3A19_L_1,
  1439. VEX_W_0F3A1D,
  1440. VEX_W_0F3A38_L_1,
  1441. VEX_W_0F3A39_L_1,
  1442. VEX_W_0F3A46_L_1,
  1443. VEX_W_0F3A4A,
  1444. VEX_W_0F3A4B,
  1445. VEX_W_0F3A4C,
  1446. VEX_W_0F3ACE,
  1447. VEX_W_0F3ACF,
  1448. VEX_W_0FXOP_08_85_L_0,
  1449. VEX_W_0FXOP_08_86_L_0,
  1450. VEX_W_0FXOP_08_87_L_0,
  1451. VEX_W_0FXOP_08_8E_L_0,
  1452. VEX_W_0FXOP_08_8F_L_0,
  1453. VEX_W_0FXOP_08_95_L_0,
  1454. VEX_W_0FXOP_08_96_L_0,
  1455. VEX_W_0FXOP_08_97_L_0,
  1456. VEX_W_0FXOP_08_9E_L_0,
  1457. VEX_W_0FXOP_08_9F_L_0,
  1458. VEX_W_0FXOP_08_A6_L_0,
  1459. VEX_W_0FXOP_08_B6_L_0,
  1460. VEX_W_0FXOP_08_C0_L_0,
  1461. VEX_W_0FXOP_08_C1_L_0,
  1462. VEX_W_0FXOP_08_C2_L_0,
  1463. VEX_W_0FXOP_08_C3_L_0,
  1464. VEX_W_0FXOP_08_CC_L_0,
  1465. VEX_W_0FXOP_08_CD_L_0,
  1466. VEX_W_0FXOP_08_CE_L_0,
  1467. VEX_W_0FXOP_08_CF_L_0,
  1468. VEX_W_0FXOP_08_EC_L_0,
  1469. VEX_W_0FXOP_08_ED_L_0,
  1470. VEX_W_0FXOP_08_EE_L_0,
  1471. VEX_W_0FXOP_08_EF_L_0,
  1472. VEX_W_0FXOP_09_80,
  1473. VEX_W_0FXOP_09_81,
  1474. VEX_W_0FXOP_09_82,
  1475. VEX_W_0FXOP_09_83,
  1476. VEX_W_0FXOP_09_C1_L_0,
  1477. VEX_W_0FXOP_09_C2_L_0,
  1478. VEX_W_0FXOP_09_C3_L_0,
  1479. VEX_W_0FXOP_09_C6_L_0,
  1480. VEX_W_0FXOP_09_C7_L_0,
  1481. VEX_W_0FXOP_09_CB_L_0,
  1482. VEX_W_0FXOP_09_D1_L_0,
  1483. VEX_W_0FXOP_09_D2_L_0,
  1484. VEX_W_0FXOP_09_D3_L_0,
  1485. VEX_W_0FXOP_09_D6_L_0,
  1486. VEX_W_0FXOP_09_D7_L_0,
  1487. VEX_W_0FXOP_09_DB_L_0,
  1488. VEX_W_0FXOP_09_E1_L_0,
  1489. VEX_W_0FXOP_09_E2_L_0,
  1490. VEX_W_0FXOP_09_E3_L_0,
  1491. EVEX_W_0F5B_P_0,
  1492. EVEX_W_0F62,
  1493. EVEX_W_0F66,
  1494. EVEX_W_0F6A,
  1495. EVEX_W_0F6B,
  1496. EVEX_W_0F6C,
  1497. EVEX_W_0F6D,
  1498. EVEX_W_0F6F_P_1,
  1499. EVEX_W_0F6F_P_2,
  1500. EVEX_W_0F6F_P_3,
  1501. EVEX_W_0F70_P_2,
  1502. EVEX_W_0F72_R_2,
  1503. EVEX_W_0F72_R_6,
  1504. EVEX_W_0F73_R_2,
  1505. EVEX_W_0F73_R_6,
  1506. EVEX_W_0F76,
  1507. EVEX_W_0F78_P_0,
  1508. EVEX_W_0F78_P_2,
  1509. EVEX_W_0F79_P_0,
  1510. EVEX_W_0F79_P_2,
  1511. EVEX_W_0F7A_P_1,
  1512. EVEX_W_0F7A_P_2,
  1513. EVEX_W_0F7A_P_3,
  1514. EVEX_W_0F7B_P_2,
  1515. EVEX_W_0F7E_P_1,
  1516. EVEX_W_0F7F_P_1,
  1517. EVEX_W_0F7F_P_2,
  1518. EVEX_W_0F7F_P_3,
  1519. EVEX_W_0FD2,
  1520. EVEX_W_0FD3,
  1521. EVEX_W_0FD4,
  1522. EVEX_W_0FD6,
  1523. EVEX_W_0FE6_P_1,
  1524. EVEX_W_0FE7,
  1525. EVEX_W_0FF2,
  1526. EVEX_W_0FF3,
  1527. EVEX_W_0FF4,
  1528. EVEX_W_0FFA,
  1529. EVEX_W_0FFB,
  1530. EVEX_W_0FFE,
  1531. EVEX_W_0F3810_P_1,
  1532. EVEX_W_0F3810_P_2,
  1533. EVEX_W_0F3811_P_1,
  1534. EVEX_W_0F3811_P_2,
  1535. EVEX_W_0F3812_P_1,
  1536. EVEX_W_0F3812_P_2,
  1537. EVEX_W_0F3813_P_1,
  1538. EVEX_W_0F3814_P_1,
  1539. EVEX_W_0F3815_P_1,
  1540. EVEX_W_0F3819_L_n,
  1541. EVEX_W_0F381A_M_0_L_n,
  1542. EVEX_W_0F381B_M_0_L_2,
  1543. EVEX_W_0F381E,
  1544. EVEX_W_0F381F,
  1545. EVEX_W_0F3820_P_1,
  1546. EVEX_W_0F3821_P_1,
  1547. EVEX_W_0F3822_P_1,
  1548. EVEX_W_0F3823_P_1,
  1549. EVEX_W_0F3824_P_1,
  1550. EVEX_W_0F3825_P_1,
  1551. EVEX_W_0F3825_P_2,
  1552. EVEX_W_0F3828_P_2,
  1553. EVEX_W_0F3829_P_2,
  1554. EVEX_W_0F382A_P_1,
  1555. EVEX_W_0F382A_P_2,
  1556. EVEX_W_0F382B,
  1557. EVEX_W_0F3830_P_1,
  1558. EVEX_W_0F3831_P_1,
  1559. EVEX_W_0F3832_P_1,
  1560. EVEX_W_0F3833_P_1,
  1561. EVEX_W_0F3834_P_1,
  1562. EVEX_W_0F3835_P_1,
  1563. EVEX_W_0F3835_P_2,
  1564. EVEX_W_0F3837,
  1565. EVEX_W_0F383A_P_1,
  1566. EVEX_W_0F3859,
  1567. EVEX_W_0F385A_M_0_L_n,
  1568. EVEX_W_0F385B_M_0_L_2,
  1569. EVEX_W_0F3870,
  1570. EVEX_W_0F3872_P_2,
  1571. EVEX_W_0F387A,
  1572. EVEX_W_0F387B,
  1573. EVEX_W_0F3883,
  1574. EVEX_W_0F3A18_L_n,
  1575. EVEX_W_0F3A19_L_n,
  1576. EVEX_W_0F3A1A_L_2,
  1577. EVEX_W_0F3A1B_L_2,
  1578. EVEX_W_0F3A21,
  1579. EVEX_W_0F3A23_L_n,
  1580. EVEX_W_0F3A38_L_n,
  1581. EVEX_W_0F3A39_L_n,
  1582. EVEX_W_0F3A3A_L_2,
  1583. EVEX_W_0F3A3B_L_2,
  1584. EVEX_W_0F3A42,
  1585. EVEX_W_0F3A43_L_n,
  1586. EVEX_W_0F3A70,
  1587. EVEX_W_0F3A72,
  1588. EVEX_W_MAP5_5B_P_0,
  1589. EVEX_W_MAP5_7A_P_3,
  1590. };
  1591. typedef void (*op_rtn) (instr_info *ins, int bytemode, int sizeflag);
  1592. struct dis386 {
  1593. const char *name;
  1594. struct
  1595. {
  1596. op_rtn rtn;
  1597. int bytemode;
  1598. } op[MAX_OPERANDS];
  1599. unsigned int prefix_requirement;
  1600. };
  1601. /* Upper case letters in the instruction names here are macros.
  1602. 'A' => print 'b' if no register operands or suffix_always is true
  1603. 'B' => print 'b' if suffix_always is true
  1604. 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand
  1605. size prefix
  1606. 'D' => print 'w' if no register operands or 'w', 'l' or 'q', if
  1607. suffix_always is true
  1608. 'E' => print 'e' if 32-bit form of jcxz
  1609. 'F' => print 'w' or 'l' depending on address size prefix (loop insns)
  1610. 'G' => print 'w' or 'l' depending on operand size prefix (i/o insns)
  1611. 'H' => print ",pt" or ",pn" branch hint
  1612. 'I' unused.
  1613. 'J' unused.
  1614. 'K' => print 'd' or 'q' if rex prefix is present.
  1615. 'L' unused.
  1616. 'M' => print 'r' if intel_mnemonic is false.
  1617. 'N' => print 'n' if instruction has no wait "prefix"
  1618. 'O' => print 'd' or 'o' (or 'q' in Intel mode)
  1619. 'P' => behave as 'T' except with register operand outside of suffix_always
  1620. mode
  1621. 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always
  1622. is true
  1623. 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode)
  1624. 'S' => print 'w', 'l' or 'q' if suffix_always is true
  1625. 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size
  1626. prefix or if suffix_always is true.
  1627. 'U' unused.
  1628. 'V' unused.
  1629. 'W' => print 'b', 'w' or 'l' ('d' in Intel mode)
  1630. 'X' => print 's', 'd' depending on data16 prefix (for XMM)
  1631. 'Y' unused.
  1632. 'Z' => print 'q' in 64bit mode and 'l' otherwise, if suffix_always is true.
  1633. '!' => change condition from true to false or from false to true.
  1634. '%' => add 1 upper case letter to the macro.
  1635. '^' => print 'w', 'l', or 'q' (Intel64 ISA only) depending on operand size
  1636. prefix or suffix_always is true (lcall/ljmp).
  1637. '@' => in 64bit mode for Intel64 ISA or if instruction
  1638. has no operand sizing prefix, print 'q' if suffix_always is true or
  1639. nothing otherwise; behave as 'P' in all other cases
  1640. 2 upper case letter macros:
  1641. "XY" => print 'x' or 'y' if suffix_always is true or no register
  1642. operands and no broadcast.
  1643. "XZ" => print 'x', 'y', or 'z' if suffix_always is true or no
  1644. register operands and no broadcast.
  1645. "XW" => print 's', 'd' depending on the VEX.W bit (for FMA)
  1646. "XD" => print 'd' if !EVEX or EVEX.W=1, EVEX.W=0 is not a valid encoding
  1647. "XH" => print 'h' if EVEX.W=0, EVEX.W=1 is not a valid encoding (for FP16)
  1648. "XS" => print 's' if !EVEX or EVEX.W=0, EVEX.W=1 is not a valid encoding
  1649. "XV" => print "{vex3}" pseudo prefix
  1650. "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond
  1651. being false, or no operand at all in 64bit mode, or if suffix_always
  1652. is true.
  1653. "LB" => print "abs" in 64bit mode and behave as 'B' otherwise
  1654. "LS" => print "abs" in 64bit mode and behave as 'S' otherwise
  1655. "LV" => print "abs" for 64bit operand and behave as 'S' otherwise
  1656. "DQ" => print 'd' or 'q' depending on the VEX.W bit
  1657. "BW" => print 'b' or 'w' depending on the VEX.W bit
  1658. "LP" => print 'w' or 'l' ('d' in Intel mode) if instruction has
  1659. an operand size prefix, or suffix_always is true. print
  1660. 'q' if rex prefix is present.
  1661. Many of the above letters print nothing in Intel mode. See "putop"
  1662. for the details.
  1663. Braces '{' and '}', and vertical bars '|', indicate alternative
  1664. mnemonic strings for AT&T and Intel. */
  1665. static const struct dis386 dis386[] = {
  1666. /* 00 */
  1667. { "addB", { Ebh1, Gb }, 0 },
  1668. { "addS", { Evh1, Gv }, 0 },
  1669. { "addB", { Gb, EbS }, 0 },
  1670. { "addS", { Gv, EvS }, 0 },
  1671. { "addB", { AL, Ib }, 0 },
  1672. { "addS", { eAX, Iv }, 0 },
  1673. { X86_64_TABLE (X86_64_06) },
  1674. { X86_64_TABLE (X86_64_07) },
  1675. /* 08 */
  1676. { "orB", { Ebh1, Gb }, 0 },
  1677. { "orS", { Evh1, Gv }, 0 },
  1678. { "orB", { Gb, EbS }, 0 },
  1679. { "orS", { Gv, EvS }, 0 },
  1680. { "orB", { AL, Ib }, 0 },
  1681. { "orS", { eAX, Iv }, 0 },
  1682. { X86_64_TABLE (X86_64_0E) },
  1683. { Bad_Opcode }, /* 0x0f extended opcode escape */
  1684. /* 10 */
  1685. { "adcB", { Ebh1, Gb }, 0 },
  1686. { "adcS", { Evh1, Gv }, 0 },
  1687. { "adcB", { Gb, EbS }, 0 },
  1688. { "adcS", { Gv, EvS }, 0 },
  1689. { "adcB", { AL, Ib }, 0 },
  1690. { "adcS", { eAX, Iv }, 0 },
  1691. { X86_64_TABLE (X86_64_16) },
  1692. { X86_64_TABLE (X86_64_17) },
  1693. /* 18 */
  1694. { "sbbB", { Ebh1, Gb }, 0 },
  1695. { "sbbS", { Evh1, Gv }, 0 },
  1696. { "sbbB", { Gb, EbS }, 0 },
  1697. { "sbbS", { Gv, EvS }, 0 },
  1698. { "sbbB", { AL, Ib }, 0 },
  1699. { "sbbS", { eAX, Iv }, 0 },
  1700. { X86_64_TABLE (X86_64_1E) },
  1701. { X86_64_TABLE (X86_64_1F) },
  1702. /* 20 */
  1703. { "andB", { Ebh1, Gb }, 0 },
  1704. { "andS", { Evh1, Gv }, 0 },
  1705. { "andB", { Gb, EbS }, 0 },
  1706. { "andS", { Gv, EvS }, 0 },
  1707. { "andB", { AL, Ib }, 0 },
  1708. { "andS", { eAX, Iv }, 0 },
  1709. { Bad_Opcode }, /* SEG ES prefix */
  1710. { X86_64_TABLE (X86_64_27) },
  1711. /* 28 */
  1712. { "subB", { Ebh1, Gb }, 0 },
  1713. { "subS", { Evh1, Gv }, 0 },
  1714. { "subB", { Gb, EbS }, 0 },
  1715. { "subS", { Gv, EvS }, 0 },
  1716. { "subB", { AL, Ib }, 0 },
  1717. { "subS", { eAX, Iv }, 0 },
  1718. { Bad_Opcode }, /* SEG CS prefix */
  1719. { X86_64_TABLE (X86_64_2F) },
  1720. /* 30 */
  1721. { "xorB", { Ebh1, Gb }, 0 },
  1722. { "xorS", { Evh1, Gv }, 0 },
  1723. { "xorB", { Gb, EbS }, 0 },
  1724. { "xorS", { Gv, EvS }, 0 },
  1725. { "xorB", { AL, Ib }, 0 },
  1726. { "xorS", { eAX, Iv }, 0 },
  1727. { Bad_Opcode }, /* SEG SS prefix */
  1728. { X86_64_TABLE (X86_64_37) },
  1729. /* 38 */
  1730. { "cmpB", { Eb, Gb }, 0 },
  1731. { "cmpS", { Ev, Gv }, 0 },
  1732. { "cmpB", { Gb, EbS }, 0 },
  1733. { "cmpS", { Gv, EvS }, 0 },
  1734. { "cmpB", { AL, Ib }, 0 },
  1735. { "cmpS", { eAX, Iv }, 0 },
  1736. { Bad_Opcode }, /* SEG DS prefix */
  1737. { X86_64_TABLE (X86_64_3F) },
  1738. /* 40 */
  1739. { "inc{S|}", { RMeAX }, 0 },
  1740. { "inc{S|}", { RMeCX }, 0 },
  1741. { "inc{S|}", { RMeDX }, 0 },
  1742. { "inc{S|}", { RMeBX }, 0 },
  1743. { "inc{S|}", { RMeSP }, 0 },
  1744. { "inc{S|}", { RMeBP }, 0 },
  1745. { "inc{S|}", { RMeSI }, 0 },
  1746. { "inc{S|}", { RMeDI }, 0 },
  1747. /* 48 */
  1748. { "dec{S|}", { RMeAX }, 0 },
  1749. { "dec{S|}", { RMeCX }, 0 },
  1750. { "dec{S|}", { RMeDX }, 0 },
  1751. { "dec{S|}", { RMeBX }, 0 },
  1752. { "dec{S|}", { RMeSP }, 0 },
  1753. { "dec{S|}", { RMeBP }, 0 },
  1754. { "dec{S|}", { RMeSI }, 0 },
  1755. { "dec{S|}", { RMeDI }, 0 },
  1756. /* 50 */
  1757. { "push{!P|}", { RMrAX }, 0 },
  1758. { "push{!P|}", { RMrCX }, 0 },
  1759. { "push{!P|}", { RMrDX }, 0 },
  1760. { "push{!P|}", { RMrBX }, 0 },
  1761. { "push{!P|}", { RMrSP }, 0 },
  1762. { "push{!P|}", { RMrBP }, 0 },
  1763. { "push{!P|}", { RMrSI }, 0 },
  1764. { "push{!P|}", { RMrDI }, 0 },
  1765. /* 58 */
  1766. { "pop{!P|}", { RMrAX }, 0 },
  1767. { "pop{!P|}", { RMrCX }, 0 },
  1768. { "pop{!P|}", { RMrDX }, 0 },
  1769. { "pop{!P|}", { RMrBX }, 0 },
  1770. { "pop{!P|}", { RMrSP }, 0 },
  1771. { "pop{!P|}", { RMrBP }, 0 },
  1772. { "pop{!P|}", { RMrSI }, 0 },
  1773. { "pop{!P|}", { RMrDI }, 0 },
  1774. /* 60 */
  1775. { X86_64_TABLE (X86_64_60) },
  1776. { X86_64_TABLE (X86_64_61) },
  1777. { X86_64_TABLE (X86_64_62) },
  1778. { X86_64_TABLE (X86_64_63) },
  1779. { Bad_Opcode }, /* seg fs */
  1780. { Bad_Opcode }, /* seg gs */
  1781. { Bad_Opcode }, /* op size prefix */
  1782. { Bad_Opcode }, /* adr size prefix */
  1783. /* 68 */
  1784. { "pushP", { sIv }, 0 },
  1785. { "imulS", { Gv, Ev, Iv }, 0 },
  1786. { "pushP", { sIbT }, 0 },
  1787. { "imulS", { Gv, Ev, sIb }, 0 },
  1788. { "ins{b|}", { Ybr, indirDX }, 0 },
  1789. { X86_64_TABLE (X86_64_6D) },
  1790. { "outs{b|}", { indirDXr, Xb }, 0 },
  1791. { X86_64_TABLE (X86_64_6F) },
  1792. /* 70 */
  1793. { "joH", { Jb, BND, cond_jump_flag }, 0 },
  1794. { "jnoH", { Jb, BND, cond_jump_flag }, 0 },
  1795. { "jbH", { Jb, BND, cond_jump_flag }, 0 },
  1796. { "jaeH", { Jb, BND, cond_jump_flag }, 0 },
  1797. { "jeH", { Jb, BND, cond_jump_flag }, 0 },
  1798. { "jneH", { Jb, BND, cond_jump_flag }, 0 },
  1799. { "jbeH", { Jb, BND, cond_jump_flag }, 0 },
  1800. { "jaH", { Jb, BND, cond_jump_flag }, 0 },
  1801. /* 78 */
  1802. { "jsH", { Jb, BND, cond_jump_flag }, 0 },
  1803. { "jnsH", { Jb, BND, cond_jump_flag }, 0 },
  1804. { "jpH", { Jb, BND, cond_jump_flag }, 0 },
  1805. { "jnpH", { Jb, BND, cond_jump_flag }, 0 },
  1806. { "jlH", { Jb, BND, cond_jump_flag }, 0 },
  1807. { "jgeH", { Jb, BND, cond_jump_flag }, 0 },
  1808. { "jleH", { Jb, BND, cond_jump_flag }, 0 },
  1809. { "jgH", { Jb, BND, cond_jump_flag }, 0 },
  1810. /* 80 */
  1811. { REG_TABLE (REG_80) },
  1812. { REG_TABLE (REG_81) },
  1813. { X86_64_TABLE (X86_64_82) },
  1814. { REG_TABLE (REG_83) },
  1815. { "testB", { Eb, Gb }, 0 },
  1816. { "testS", { Ev, Gv }, 0 },
  1817. { "xchgB", { Ebh2, Gb }, 0 },
  1818. { "xchgS", { Evh2, Gv }, 0 },
  1819. /* 88 */
  1820. { "movB", { Ebh3, Gb }, 0 },
  1821. { "movS", { Evh3, Gv }, 0 },
  1822. { "movB", { Gb, EbS }, 0 },
  1823. { "movS", { Gv, EvS }, 0 },
  1824. { "movD", { Sv, Sw }, 0 },
  1825. { MOD_TABLE (MOD_8D) },
  1826. { "movD", { Sw, Sv }, 0 },
  1827. { REG_TABLE (REG_8F) },
  1828. /* 90 */
  1829. { PREFIX_TABLE (PREFIX_90) },
  1830. { "xchgS", { RMeCX, eAX }, 0 },
  1831. { "xchgS", { RMeDX, eAX }, 0 },
  1832. { "xchgS", { RMeBX, eAX }, 0 },
  1833. { "xchgS", { RMeSP, eAX }, 0 },
  1834. { "xchgS", { RMeBP, eAX }, 0 },
  1835. { "xchgS", { RMeSI, eAX }, 0 },
  1836. { "xchgS", { RMeDI, eAX }, 0 },
  1837. /* 98 */
  1838. { "cW{t|}R", { XX }, 0 },
  1839. { "cR{t|}O", { XX }, 0 },
  1840. { X86_64_TABLE (X86_64_9A) },
  1841. { Bad_Opcode }, /* fwait */
  1842. { "pushfP", { XX }, 0 },
  1843. { "popfP", { XX }, 0 },
  1844. { "sahf", { XX }, 0 },
  1845. { "lahf", { XX }, 0 },
  1846. /* a0 */
  1847. { "mov%LB", { AL, Ob }, 0 },
  1848. { "mov%LS", { eAX, Ov }, 0 },
  1849. { "mov%LB", { Ob, AL }, 0 },
  1850. { "mov%LS", { Ov, eAX }, 0 },
  1851. { "movs{b|}", { Ybr, Xb }, 0 },
  1852. { "movs{R|}", { Yvr, Xv }, 0 },
  1853. { "cmps{b|}", { Xb, Yb }, 0 },
  1854. { "cmps{R|}", { Xv, Yv }, 0 },
  1855. /* a8 */
  1856. { "testB", { AL, Ib }, 0 },
  1857. { "testS", { eAX, Iv }, 0 },
  1858. { "stosB", { Ybr, AL }, 0 },
  1859. { "stosS", { Yvr, eAX }, 0 },
  1860. { "lodsB", { ALr, Xb }, 0 },
  1861. { "lodsS", { eAXr, Xv }, 0 },
  1862. { "scasB", { AL, Yb }, 0 },
  1863. { "scasS", { eAX, Yv }, 0 },
  1864. /* b0 */
  1865. { "movB", { RMAL, Ib }, 0 },
  1866. { "movB", { RMCL, Ib }, 0 },
  1867. { "movB", { RMDL, Ib }, 0 },
  1868. { "movB", { RMBL, Ib }, 0 },
  1869. { "movB", { RMAH, Ib }, 0 },
  1870. { "movB", { RMCH, Ib }, 0 },
  1871. { "movB", { RMDH, Ib }, 0 },
  1872. { "movB", { RMBH, Ib }, 0 },
  1873. /* b8 */
  1874. { "mov%LV", { RMeAX, Iv64 }, 0 },
  1875. { "mov%LV", { RMeCX, Iv64 }, 0 },
  1876. { "mov%LV", { RMeDX, Iv64 }, 0 },
  1877. { "mov%LV", { RMeBX, Iv64 }, 0 },
  1878. { "mov%LV", { RMeSP, Iv64 }, 0 },
  1879. { "mov%LV", { RMeBP, Iv64 }, 0 },
  1880. { "mov%LV", { RMeSI, Iv64 }, 0 },
  1881. { "mov%LV", { RMeDI, Iv64 }, 0 },
  1882. /* c0 */
  1883. { REG_TABLE (REG_C0) },
  1884. { REG_TABLE (REG_C1) },
  1885. { X86_64_TABLE (X86_64_C2) },
  1886. { X86_64_TABLE (X86_64_C3) },
  1887. { X86_64_TABLE (X86_64_C4) },
  1888. { X86_64_TABLE (X86_64_C5) },
  1889. { REG_TABLE (REG_C6) },
  1890. { REG_TABLE (REG_C7) },
  1891. /* c8 */
  1892. { "enterP", { Iw, Ib }, 0 },
  1893. { "leaveP", { XX }, 0 },
  1894. { "{l|}ret{|f}%LP", { Iw }, 0 },
  1895. { "{l|}ret{|f}%LP", { XX }, 0 },
  1896. { "int3", { XX }, 0 },
  1897. { "int", { Ib }, 0 },
  1898. { X86_64_TABLE (X86_64_CE) },
  1899. { "iret%LP", { XX }, 0 },
  1900. /* d0 */
  1901. { REG_TABLE (REG_D0) },
  1902. { REG_TABLE (REG_D1) },
  1903. { REG_TABLE (REG_D2) },
  1904. { REG_TABLE (REG_D3) },
  1905. { X86_64_TABLE (X86_64_D4) },
  1906. { X86_64_TABLE (X86_64_D5) },
  1907. { Bad_Opcode },
  1908. { "xlat", { DSBX }, 0 },
  1909. /* d8 */
  1910. { FLOAT },
  1911. { FLOAT },
  1912. { FLOAT },
  1913. { FLOAT },
  1914. { FLOAT },
  1915. { FLOAT },
  1916. { FLOAT },
  1917. { FLOAT },
  1918. /* e0 */
  1919. { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 },
  1920. { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 },
  1921. { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 },
  1922. { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 },
  1923. { "inB", { AL, Ib }, 0 },
  1924. { "inG", { zAX, Ib }, 0 },
  1925. { "outB", { Ib, AL }, 0 },
  1926. { "outG", { Ib, zAX }, 0 },
  1927. /* e8 */
  1928. { X86_64_TABLE (X86_64_E8) },
  1929. { X86_64_TABLE (X86_64_E9) },
  1930. { X86_64_TABLE (X86_64_EA) },
  1931. { "jmp", { Jb, BND }, 0 },
  1932. { "inB", { AL, indirDX }, 0 },
  1933. { "inG", { zAX, indirDX }, 0 },
  1934. { "outB", { indirDX, AL }, 0 },
  1935. { "outG", { indirDX, zAX }, 0 },
  1936. /* f0 */
  1937. { Bad_Opcode }, /* lock prefix */
  1938. { "int1", { XX }, 0 },
  1939. { Bad_Opcode }, /* repne */
  1940. { Bad_Opcode }, /* repz */
  1941. { "hlt", { XX }, 0 },
  1942. { "cmc", { XX }, 0 },
  1943. { REG_TABLE (REG_F6) },
  1944. { REG_TABLE (REG_F7) },
  1945. /* f8 */
  1946. { "clc", { XX }, 0 },
  1947. { "stc", { XX }, 0 },
  1948. { "cli", { XX }, 0 },
  1949. { "sti", { XX }, 0 },
  1950. { "cld", { XX }, 0 },
  1951. { "std", { XX }, 0 },
  1952. { REG_TABLE (REG_FE) },
  1953. { REG_TABLE (REG_FF) },
  1954. };
  1955. static const struct dis386 dis386_twobyte[] = {
  1956. /* 00 */
  1957. { REG_TABLE (REG_0F00 ) },
  1958. { REG_TABLE (REG_0F01 ) },
  1959. { "larS", { Gv, Ew }, 0 },
  1960. { "lslS", { Gv, Ew }, 0 },
  1961. { Bad_Opcode },
  1962. { "syscall", { XX }, 0 },
  1963. { "clts", { XX }, 0 },
  1964. { "sysret%LQ", { XX }, 0 },
  1965. /* 08 */
  1966. { "invd", { XX }, 0 },
  1967. { PREFIX_TABLE (PREFIX_0F09) },
  1968. { Bad_Opcode },
  1969. { "ud2", { XX }, 0 },
  1970. { Bad_Opcode },
  1971. { REG_TABLE (REG_0F0D) },
  1972. { "femms", { XX }, 0 },
  1973. { "", { MX, EM, OPSUF }, 0 }, /* See OP_3DNowSuffix. */
  1974. /* 10 */
  1975. { PREFIX_TABLE (PREFIX_0F10) },
  1976. { PREFIX_TABLE (PREFIX_0F11) },
  1977. { PREFIX_TABLE (PREFIX_0F12) },
  1978. { MOD_TABLE (MOD_0F13) },
  1979. { "unpcklpX", { XM, EXx }, PREFIX_OPCODE },
  1980. { "unpckhpX", { XM, EXx }, PREFIX_OPCODE },
  1981. { PREFIX_TABLE (PREFIX_0F16) },
  1982. { MOD_TABLE (MOD_0F17) },
  1983. /* 18 */
  1984. { REG_TABLE (REG_0F18) },
  1985. { "nopQ", { Ev }, 0 },
  1986. { PREFIX_TABLE (PREFIX_0F1A) },
  1987. { PREFIX_TABLE (PREFIX_0F1B) },
  1988. { PREFIX_TABLE (PREFIX_0F1C) },
  1989. { "nopQ", { Ev }, 0 },
  1990. { PREFIX_TABLE (PREFIX_0F1E) },
  1991. { "nopQ", { Ev }, 0 },
  1992. /* 20 */
  1993. { "movZ", { Em, Cm }, 0 },
  1994. { "movZ", { Em, Dm }, 0 },
  1995. { "movZ", { Cm, Em }, 0 },
  1996. { "movZ", { Dm, Em }, 0 },
  1997. { X86_64_TABLE (X86_64_0F24) },
  1998. { Bad_Opcode },
  1999. { X86_64_TABLE (X86_64_0F26) },
  2000. { Bad_Opcode },
  2001. /* 28 */
  2002. { "movapX", { XM, EXx }, PREFIX_OPCODE },
  2003. { "movapX", { EXxS, XM }, PREFIX_OPCODE },
  2004. { PREFIX_TABLE (PREFIX_0F2A) },
  2005. { PREFIX_TABLE (PREFIX_0F2B) },
  2006. { PREFIX_TABLE (PREFIX_0F2C) },
  2007. { PREFIX_TABLE (PREFIX_0F2D) },
  2008. { PREFIX_TABLE (PREFIX_0F2E) },
  2009. { PREFIX_TABLE (PREFIX_0F2F) },
  2010. /* 30 */
  2011. { "wrmsr", { XX }, 0 },
  2012. { "rdtsc", { XX }, 0 },
  2013. { "rdmsr", { XX }, 0 },
  2014. { "rdpmc", { XX }, 0 },
  2015. { "sysenter", { SEP }, 0 },
  2016. { "sysexit%LQ", { SEP }, 0 },
  2017. { Bad_Opcode },
  2018. { "getsec", { XX }, 0 },
  2019. /* 38 */
  2020. { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F38, PREFIX_OPCODE) },
  2021. { Bad_Opcode },
  2022. { THREE_BYTE_TABLE_PREFIX (THREE_BYTE_0F3A, PREFIX_OPCODE) },
  2023. { Bad_Opcode },
  2024. { Bad_Opcode },
  2025. { Bad_Opcode },
  2026. { Bad_Opcode },
  2027. { Bad_Opcode },
  2028. /* 40 */
  2029. { "cmovoS", { Gv, Ev }, 0 },
  2030. { "cmovnoS", { Gv, Ev }, 0 },
  2031. { "cmovbS", { Gv, Ev }, 0 },
  2032. { "cmovaeS", { Gv, Ev }, 0 },
  2033. { "cmoveS", { Gv, Ev }, 0 },
  2034. { "cmovneS", { Gv, Ev }, 0 },
  2035. { "cmovbeS", { Gv, Ev }, 0 },
  2036. { "cmovaS", { Gv, Ev }, 0 },
  2037. /* 48 */
  2038. { "cmovsS", { Gv, Ev }, 0 },
  2039. { "cmovnsS", { Gv, Ev }, 0 },
  2040. { "cmovpS", { Gv, Ev }, 0 },
  2041. { "cmovnpS", { Gv, Ev }, 0 },
  2042. { "cmovlS", { Gv, Ev }, 0 },
  2043. { "cmovgeS", { Gv, Ev }, 0 },
  2044. { "cmovleS", { Gv, Ev }, 0 },
  2045. { "cmovgS", { Gv, Ev }, 0 },
  2046. /* 50 */
  2047. { MOD_TABLE (MOD_0F50) },
  2048. { PREFIX_TABLE (PREFIX_0F51) },
  2049. { PREFIX_TABLE (PREFIX_0F52) },
  2050. { PREFIX_TABLE (PREFIX_0F53) },
  2051. { "andpX", { XM, EXx }, PREFIX_OPCODE },
  2052. { "andnpX", { XM, EXx }, PREFIX_OPCODE },
  2053. { "orpX", { XM, EXx }, PREFIX_OPCODE },
  2054. { "xorpX", { XM, EXx }, PREFIX_OPCODE },
  2055. /* 58 */
  2056. { PREFIX_TABLE (PREFIX_0F58) },
  2057. { PREFIX_TABLE (PREFIX_0F59) },
  2058. { PREFIX_TABLE (PREFIX_0F5A) },
  2059. { PREFIX_TABLE (PREFIX_0F5B) },
  2060. { PREFIX_TABLE (PREFIX_0F5C) },
  2061. { PREFIX_TABLE (PREFIX_0F5D) },
  2062. { PREFIX_TABLE (PREFIX_0F5E) },
  2063. { PREFIX_TABLE (PREFIX_0F5F) },
  2064. /* 60 */
  2065. { PREFIX_TABLE (PREFIX_0F60) },
  2066. { PREFIX_TABLE (PREFIX_0F61) },
  2067. { PREFIX_TABLE (PREFIX_0F62) },
  2068. { "packsswb", { MX, EM }, PREFIX_OPCODE },
  2069. { "pcmpgtb", { MX, EM }, PREFIX_OPCODE },
  2070. { "pcmpgtw", { MX, EM }, PREFIX_OPCODE },
  2071. { "pcmpgtd", { MX, EM }, PREFIX_OPCODE },
  2072. { "packuswb", { MX, EM }, PREFIX_OPCODE },
  2073. /* 68 */
  2074. { "punpckhbw", { MX, EM }, PREFIX_OPCODE },
  2075. { "punpckhwd", { MX, EM }, PREFIX_OPCODE },
  2076. { "punpckhdq", { MX, EM }, PREFIX_OPCODE },
  2077. { "packssdw", { MX, EM }, PREFIX_OPCODE },
  2078. { "punpcklqdq", { XM, EXx }, PREFIX_DATA },
  2079. { "punpckhqdq", { XM, EXx }, PREFIX_DATA },
  2080. { "movK", { MX, Edq }, PREFIX_OPCODE },
  2081. { PREFIX_TABLE (PREFIX_0F6F) },
  2082. /* 70 */
  2083. { PREFIX_TABLE (PREFIX_0F70) },
  2084. { MOD_TABLE (MOD_0F71) },
  2085. { MOD_TABLE (MOD_0F72) },
  2086. { MOD_TABLE (MOD_0F73) },
  2087. { "pcmpeqb", { MX, EM }, PREFIX_OPCODE },
  2088. { "pcmpeqw", { MX, EM }, PREFIX_OPCODE },
  2089. { "pcmpeqd", { MX, EM }, PREFIX_OPCODE },
  2090. { "emms", { XX }, PREFIX_OPCODE },
  2091. /* 78 */
  2092. { PREFIX_TABLE (PREFIX_0F78) },
  2093. { PREFIX_TABLE (PREFIX_0F79) },
  2094. { Bad_Opcode },
  2095. { Bad_Opcode },
  2096. { PREFIX_TABLE (PREFIX_0F7C) },
  2097. { PREFIX_TABLE (PREFIX_0F7D) },
  2098. { PREFIX_TABLE (PREFIX_0F7E) },
  2099. { PREFIX_TABLE (PREFIX_0F7F) },
  2100. /* 80 */
  2101. { "joH", { Jv, BND, cond_jump_flag }, 0 },
  2102. { "jnoH", { Jv, BND, cond_jump_flag }, 0 },
  2103. { "jbH", { Jv, BND, cond_jump_flag }, 0 },
  2104. { "jaeH", { Jv, BND, cond_jump_flag }, 0 },
  2105. { "jeH", { Jv, BND, cond_jump_flag }, 0 },
  2106. { "jneH", { Jv, BND, cond_jump_flag }, 0 },
  2107. { "jbeH", { Jv, BND, cond_jump_flag }, 0 },
  2108. { "jaH", { Jv, BND, cond_jump_flag }, 0 },
  2109. /* 88 */
  2110. { "jsH", { Jv, BND, cond_jump_flag }, 0 },
  2111. { "jnsH", { Jv, BND, cond_jump_flag }, 0 },
  2112. { "jpH", { Jv, BND, cond_jump_flag }, 0 },
  2113. { "jnpH", { Jv, BND, cond_jump_flag }, 0 },
  2114. { "jlH", { Jv, BND, cond_jump_flag }, 0 },
  2115. { "jgeH", { Jv, BND, cond_jump_flag }, 0 },
  2116. { "jleH", { Jv, BND, cond_jump_flag }, 0 },
  2117. { "jgH", { Jv, BND, cond_jump_flag }, 0 },
  2118. /* 90 */
  2119. { "seto", { Eb }, 0 },
  2120. { "setno", { Eb }, 0 },
  2121. { "setb", { Eb }, 0 },
  2122. { "setae", { Eb }, 0 },
  2123. { "sete", { Eb }, 0 },
  2124. { "setne", { Eb }, 0 },
  2125. { "setbe", { Eb }, 0 },
  2126. { "seta", { Eb }, 0 },
  2127. /* 98 */
  2128. { "sets", { Eb }, 0 },
  2129. { "setns", { Eb }, 0 },
  2130. { "setp", { Eb }, 0 },
  2131. { "setnp", { Eb }, 0 },
  2132. { "setl", { Eb }, 0 },
  2133. { "setge", { Eb }, 0 },
  2134. { "setle", { Eb }, 0 },
  2135. { "setg", { Eb }, 0 },
  2136. /* a0 */
  2137. { "pushP", { fs }, 0 },
  2138. { "popP", { fs }, 0 },
  2139. { "cpuid", { XX }, 0 },
  2140. { "btS", { Ev, Gv }, 0 },
  2141. { "shldS", { Ev, Gv, Ib }, 0 },
  2142. { "shldS", { Ev, Gv, CL }, 0 },
  2143. { REG_TABLE (REG_0FA6) },
  2144. { REG_TABLE (REG_0FA7) },
  2145. /* a8 */
  2146. { "pushP", { gs }, 0 },
  2147. { "popP", { gs }, 0 },
  2148. { "rsm", { XX }, 0 },
  2149. { "btsS", { Evh1, Gv }, 0 },
  2150. { "shrdS", { Ev, Gv, Ib }, 0 },
  2151. { "shrdS", { Ev, Gv, CL }, 0 },
  2152. { REG_TABLE (REG_0FAE) },
  2153. { "imulS", { Gv, Ev }, 0 },
  2154. /* b0 */
  2155. { "cmpxchgB", { Ebh1, Gb }, 0 },
  2156. { "cmpxchgS", { Evh1, Gv }, 0 },
  2157. { MOD_TABLE (MOD_0FB2) },
  2158. { "btrS", { Evh1, Gv }, 0 },
  2159. { MOD_TABLE (MOD_0FB4) },
  2160. { MOD_TABLE (MOD_0FB5) },
  2161. { "movz{bR|x}", { Gv, Eb }, 0 },
  2162. { "movz{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movzww ! */
  2163. /* b8 */
  2164. { PREFIX_TABLE (PREFIX_0FB8) },
  2165. { "ud1S", { Gv, Ev }, 0 },
  2166. { REG_TABLE (REG_0FBA) },
  2167. { "btcS", { Evh1, Gv }, 0 },
  2168. { PREFIX_TABLE (PREFIX_0FBC) },
  2169. { PREFIX_TABLE (PREFIX_0FBD) },
  2170. { "movs{bR|x}", { Gv, Eb }, 0 },
  2171. { "movs{wR|x}", { Gv, Ew }, 0 }, /* yes, there really is movsww ! */
  2172. /* c0 */
  2173. { "xaddB", { Ebh1, Gb }, 0 },
  2174. { "xaddS", { Evh1, Gv }, 0 },
  2175. { PREFIX_TABLE (PREFIX_0FC2) },
  2176. { MOD_TABLE (MOD_0FC3) },
  2177. { "pinsrw", { MX, Edw, Ib }, PREFIX_OPCODE },
  2178. { "pextrw", { Gd, MS, Ib }, PREFIX_OPCODE },
  2179. { "shufpX", { XM, EXx, Ib }, PREFIX_OPCODE },
  2180. { REG_TABLE (REG_0FC7) },
  2181. /* c8 */
  2182. { "bswap", { RMeAX }, 0 },
  2183. { "bswap", { RMeCX }, 0 },
  2184. { "bswap", { RMeDX }, 0 },
  2185. { "bswap", { RMeBX }, 0 },
  2186. { "bswap", { RMeSP }, 0 },
  2187. { "bswap", { RMeBP }, 0 },
  2188. { "bswap", { RMeSI }, 0 },
  2189. { "bswap", { RMeDI }, 0 },
  2190. /* d0 */
  2191. { PREFIX_TABLE (PREFIX_0FD0) },
  2192. { "psrlw", { MX, EM }, PREFIX_OPCODE },
  2193. { "psrld", { MX, EM }, PREFIX_OPCODE },
  2194. { "psrlq", { MX, EM }, PREFIX_OPCODE },
  2195. { "paddq", { MX, EM }, PREFIX_OPCODE },
  2196. { "pmullw", { MX, EM }, PREFIX_OPCODE },
  2197. { PREFIX_TABLE (PREFIX_0FD6) },
  2198. { MOD_TABLE (MOD_0FD7) },
  2199. /* d8 */
  2200. { "psubusb", { MX, EM }, PREFIX_OPCODE },
  2201. { "psubusw", { MX, EM }, PREFIX_OPCODE },
  2202. { "pminub", { MX, EM }, PREFIX_OPCODE },
  2203. { "pand", { MX, EM }, PREFIX_OPCODE },
  2204. { "paddusb", { MX, EM }, PREFIX_OPCODE },
  2205. { "paddusw", { MX, EM }, PREFIX_OPCODE },
  2206. { "pmaxub", { MX, EM }, PREFIX_OPCODE },
  2207. { "pandn", { MX, EM }, PREFIX_OPCODE },
  2208. /* e0 */
  2209. { "pavgb", { MX, EM }, PREFIX_OPCODE },
  2210. { "psraw", { MX, EM }, PREFIX_OPCODE },
  2211. { "psrad", { MX, EM }, PREFIX_OPCODE },
  2212. { "pavgw", { MX, EM }, PREFIX_OPCODE },
  2213. { "pmulhuw", { MX, EM }, PREFIX_OPCODE },
  2214. { "pmulhw", { MX, EM }, PREFIX_OPCODE },
  2215. { PREFIX_TABLE (PREFIX_0FE6) },
  2216. { PREFIX_TABLE (PREFIX_0FE7) },
  2217. /* e8 */
  2218. { "psubsb", { MX, EM }, PREFIX_OPCODE },
  2219. { "psubsw", { MX, EM }, PREFIX_OPCODE },
  2220. { "pminsw", { MX, EM }, PREFIX_OPCODE },
  2221. { "por", { MX, EM }, PREFIX_OPCODE },
  2222. { "paddsb", { MX, EM }, PREFIX_OPCODE },
  2223. { "paddsw", { MX, EM }, PREFIX_OPCODE },
  2224. { "pmaxsw", { MX, EM }, PREFIX_OPCODE },
  2225. { "pxor", { MX, EM }, PREFIX_OPCODE },
  2226. /* f0 */
  2227. { PREFIX_TABLE (PREFIX_0FF0) },
  2228. { "psllw", { MX, EM }, PREFIX_OPCODE },
  2229. { "pslld", { MX, EM }, PREFIX_OPCODE },
  2230. { "psllq", { MX, EM }, PREFIX_OPCODE },
  2231. { "pmuludq", { MX, EM }, PREFIX_OPCODE },
  2232. { "pmaddwd", { MX, EM }, PREFIX_OPCODE },
  2233. { "psadbw", { MX, EM }, PREFIX_OPCODE },
  2234. { PREFIX_TABLE (PREFIX_0FF7) },
  2235. /* f8 */
  2236. { "psubb", { MX, EM }, PREFIX_OPCODE },
  2237. { "psubw", { MX, EM }, PREFIX_OPCODE },
  2238. { "psubd", { MX, EM }, PREFIX_OPCODE },
  2239. { "psubq", { MX, EM }, PREFIX_OPCODE },
  2240. { "paddb", { MX, EM }, PREFIX_OPCODE },
  2241. { "paddw", { MX, EM }, PREFIX_OPCODE },
  2242. { "paddd", { MX, EM }, PREFIX_OPCODE },
  2243. { "ud0S", { Gv, Ev }, 0 },
  2244. };
  2245. static const bool onebyte_has_modrm[256] = {
  2246. /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
  2247. /* ------------------------------- */
  2248. /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
  2249. /* 10 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 10 */
  2250. /* 20 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 20 */
  2251. /* 30 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 30 */
  2252. /* 40 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 40 */
  2253. /* 50 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 50 */
  2254. /* 60 */ 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, /* 60 */
  2255. /* 70 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 70 */
  2256. /* 80 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 80 */
  2257. /* 90 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 90 */
  2258. /* a0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* a0 */
  2259. /* b0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* b0 */
  2260. /* c0 */ 1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, /* c0 */
  2261. /* d0 */ 1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1, /* d0 */
  2262. /* e0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* e0 */
  2263. /* f0 */ 0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1 /* f0 */
  2264. /* ------------------------------- */
  2265. /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
  2266. };
  2267. static const bool twobyte_has_modrm[256] = {
  2268. /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
  2269. /* ------------------------------- */
  2270. /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
  2271. /* 10 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 1f */
  2272. /* 20 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 2f */
  2273. /* 30 */ 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, /* 3f */
  2274. /* 40 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 4f */
  2275. /* 50 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 5f */
  2276. /* 60 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 6f */
  2277. /* 70 */ 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, /* 7f */
  2278. /* 80 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 8f */
  2279. /* 90 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* 9f */
  2280. /* a0 */ 0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1, /* af */
  2281. /* b0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* bf */
  2282. /* c0 */ 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, /* cf */
  2283. /* d0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* df */
  2284. /* e0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, /* ef */
  2285. /* f0 */ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 /* ff */
  2286. /* ------------------------------- */
  2287. /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
  2288. };
  2289. struct op
  2290. {
  2291. const char *name;
  2292. unsigned int len;
  2293. };
  2294. /* If we are accessing mod/rm/reg without need_modrm set, then the
  2295. values are stale. Hitting this abort likely indicates that you
  2296. need to update onebyte_has_modrm or twobyte_has_modrm. */
  2297. #define MODRM_CHECK if (!ins->need_modrm) abort ()
  2298. static const char *const intel_index16[] = {
  2299. "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
  2300. };
  2301. static const char *const att_names64[] = {
  2302. "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
  2303. "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
  2304. };
  2305. static const char *const att_names32[] = {
  2306. "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
  2307. "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
  2308. };
  2309. static const char *const att_names16[] = {
  2310. "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
  2311. "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
  2312. };
  2313. static const char *const att_names8[] = {
  2314. "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
  2315. };
  2316. static const char *const att_names8rex[] = {
  2317. "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
  2318. "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
  2319. };
  2320. static const char *const att_names_seg[] = {
  2321. "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
  2322. };
  2323. static const char att_index64[] = "%riz";
  2324. static const char att_index32[] = "%eiz";
  2325. static const char *const att_index16[] = {
  2326. "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
  2327. };
  2328. static const char *const att_names_mm[] = {
  2329. "%mm0", "%mm1", "%mm2", "%mm3",
  2330. "%mm4", "%mm5", "%mm6", "%mm7"
  2331. };
  2332. static const char *const att_names_bnd[] = {
  2333. "%bnd0", "%bnd1", "%bnd2", "%bnd3"
  2334. };
  2335. static const char *const att_names_xmm[] = {
  2336. "%xmm0", "%xmm1", "%xmm2", "%xmm3",
  2337. "%xmm4", "%xmm5", "%xmm6", "%xmm7",
  2338. "%xmm8", "%xmm9", "%xmm10", "%xmm11",
  2339. "%xmm12", "%xmm13", "%xmm14", "%xmm15",
  2340. "%xmm16", "%xmm17", "%xmm18", "%xmm19",
  2341. "%xmm20", "%xmm21", "%xmm22", "%xmm23",
  2342. "%xmm24", "%xmm25", "%xmm26", "%xmm27",
  2343. "%xmm28", "%xmm29", "%xmm30", "%xmm31"
  2344. };
  2345. static const char *const att_names_ymm[] = {
  2346. "%ymm0", "%ymm1", "%ymm2", "%ymm3",
  2347. "%ymm4", "%ymm5", "%ymm6", "%ymm7",
  2348. "%ymm8", "%ymm9", "%ymm10", "%ymm11",
  2349. "%ymm12", "%ymm13", "%ymm14", "%ymm15",
  2350. "%ymm16", "%ymm17", "%ymm18", "%ymm19",
  2351. "%ymm20", "%ymm21", "%ymm22", "%ymm23",
  2352. "%ymm24", "%ymm25", "%ymm26", "%ymm27",
  2353. "%ymm28", "%ymm29", "%ymm30", "%ymm31"
  2354. };
  2355. static const char *const att_names_zmm[] = {
  2356. "%zmm0", "%zmm1", "%zmm2", "%zmm3",
  2357. "%zmm4", "%zmm5", "%zmm6", "%zmm7",
  2358. "%zmm8", "%zmm9", "%zmm10", "%zmm11",
  2359. "%zmm12", "%zmm13", "%zmm14", "%zmm15",
  2360. "%zmm16", "%zmm17", "%zmm18", "%zmm19",
  2361. "%zmm20", "%zmm21", "%zmm22", "%zmm23",
  2362. "%zmm24", "%zmm25", "%zmm26", "%zmm27",
  2363. "%zmm28", "%zmm29", "%zmm30", "%zmm31"
  2364. };
  2365. static const char *const att_names_tmm[] = {
  2366. "%tmm0", "%tmm1", "%tmm2", "%tmm3",
  2367. "%tmm4", "%tmm5", "%tmm6", "%tmm7"
  2368. };
  2369. static const char *const att_names_mask[] = {
  2370. "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
  2371. };
  2372. static const char *const names_rounding[] =
  2373. {
  2374. "{rn-",
  2375. "{rd-",
  2376. "{ru-",
  2377. "{rz-"
  2378. };
  2379. static const struct dis386 reg_table[][8] = {
  2380. /* REG_80 */
  2381. {
  2382. { "addA", { Ebh1, Ib }, 0 },
  2383. { "orA", { Ebh1, Ib }, 0 },
  2384. { "adcA", { Ebh1, Ib }, 0 },
  2385. { "sbbA", { Ebh1, Ib }, 0 },
  2386. { "andA", { Ebh1, Ib }, 0 },
  2387. { "subA", { Ebh1, Ib }, 0 },
  2388. { "xorA", { Ebh1, Ib }, 0 },
  2389. { "cmpA", { Eb, Ib }, 0 },
  2390. },
  2391. /* REG_81 */
  2392. {
  2393. { "addQ", { Evh1, Iv }, 0 },
  2394. { "orQ", { Evh1, Iv }, 0 },
  2395. { "adcQ", { Evh1, Iv }, 0 },
  2396. { "sbbQ", { Evh1, Iv }, 0 },
  2397. { "andQ", { Evh1, Iv }, 0 },
  2398. { "subQ", { Evh1, Iv }, 0 },
  2399. { "xorQ", { Evh1, Iv }, 0 },
  2400. { "cmpQ", { Ev, Iv }, 0 },
  2401. },
  2402. /* REG_83 */
  2403. {
  2404. { "addQ", { Evh1, sIb }, 0 },
  2405. { "orQ", { Evh1, sIb }, 0 },
  2406. { "adcQ", { Evh1, sIb }, 0 },
  2407. { "sbbQ", { Evh1, sIb }, 0 },
  2408. { "andQ", { Evh1, sIb }, 0 },
  2409. { "subQ", { Evh1, sIb }, 0 },
  2410. { "xorQ", { Evh1, sIb }, 0 },
  2411. { "cmpQ", { Ev, sIb }, 0 },
  2412. },
  2413. /* REG_8F */
  2414. {
  2415. { "pop{P|}", { stackEv }, 0 },
  2416. { XOP_8F_TABLE (XOP_09) },
  2417. { Bad_Opcode },
  2418. { Bad_Opcode },
  2419. { Bad_Opcode },
  2420. { XOP_8F_TABLE (XOP_09) },
  2421. },
  2422. /* REG_C0 */
  2423. {
  2424. { "rolA", { Eb, Ib }, 0 },
  2425. { "rorA", { Eb, Ib }, 0 },
  2426. { "rclA", { Eb, Ib }, 0 },
  2427. { "rcrA", { Eb, Ib }, 0 },
  2428. { "shlA", { Eb, Ib }, 0 },
  2429. { "shrA", { Eb, Ib }, 0 },
  2430. { "shlA", { Eb, Ib }, 0 },
  2431. { "sarA", { Eb, Ib }, 0 },
  2432. },
  2433. /* REG_C1 */
  2434. {
  2435. { "rolQ", { Ev, Ib }, 0 },
  2436. { "rorQ", { Ev, Ib }, 0 },
  2437. { "rclQ", { Ev, Ib }, 0 },
  2438. { "rcrQ", { Ev, Ib }, 0 },
  2439. { "shlQ", { Ev, Ib }, 0 },
  2440. { "shrQ", { Ev, Ib }, 0 },
  2441. { "shlQ", { Ev, Ib }, 0 },
  2442. { "sarQ", { Ev, Ib }, 0 },
  2443. },
  2444. /* REG_C6 */
  2445. {
  2446. { "movA", { Ebh3, Ib }, 0 },
  2447. { Bad_Opcode },
  2448. { Bad_Opcode },
  2449. { Bad_Opcode },
  2450. { Bad_Opcode },
  2451. { Bad_Opcode },
  2452. { Bad_Opcode },
  2453. { MOD_TABLE (MOD_C6_REG_7) },
  2454. },
  2455. /* REG_C7 */
  2456. {
  2457. { "movQ", { Evh3, Iv }, 0 },
  2458. { Bad_Opcode },
  2459. { Bad_Opcode },
  2460. { Bad_Opcode },
  2461. { Bad_Opcode },
  2462. { Bad_Opcode },
  2463. { Bad_Opcode },
  2464. { MOD_TABLE (MOD_C7_REG_7) },
  2465. },
  2466. /* REG_D0 */
  2467. {
  2468. { "rolA", { Eb, I1 }, 0 },
  2469. { "rorA", { Eb, I1 }, 0 },
  2470. { "rclA", { Eb, I1 }, 0 },
  2471. { "rcrA", { Eb, I1 }, 0 },
  2472. { "shlA", { Eb, I1 }, 0 },
  2473. { "shrA", { Eb, I1 }, 0 },
  2474. { "shlA", { Eb, I1 }, 0 },
  2475. { "sarA", { Eb, I1 }, 0 },
  2476. },
  2477. /* REG_D1 */
  2478. {
  2479. { "rolQ", { Ev, I1 }, 0 },
  2480. { "rorQ", { Ev, I1 }, 0 },
  2481. { "rclQ", { Ev, I1 }, 0 },
  2482. { "rcrQ", { Ev, I1 }, 0 },
  2483. { "shlQ", { Ev, I1 }, 0 },
  2484. { "shrQ", { Ev, I1 }, 0 },
  2485. { "shlQ", { Ev, I1 }, 0 },
  2486. { "sarQ", { Ev, I1 }, 0 },
  2487. },
  2488. /* REG_D2 */
  2489. {
  2490. { "rolA", { Eb, CL }, 0 },
  2491. { "rorA", { Eb, CL }, 0 },
  2492. { "rclA", { Eb, CL }, 0 },
  2493. { "rcrA", { Eb, CL }, 0 },
  2494. { "shlA", { Eb, CL }, 0 },
  2495. { "shrA", { Eb, CL }, 0 },
  2496. { "shlA", { Eb, CL }, 0 },
  2497. { "sarA", { Eb, CL }, 0 },
  2498. },
  2499. /* REG_D3 */
  2500. {
  2501. { "rolQ", { Ev, CL }, 0 },
  2502. { "rorQ", { Ev, CL }, 0 },
  2503. { "rclQ", { Ev, CL }, 0 },
  2504. { "rcrQ", { Ev, CL }, 0 },
  2505. { "shlQ", { Ev, CL }, 0 },
  2506. { "shrQ", { Ev, CL }, 0 },
  2507. { "shlQ", { Ev, CL }, 0 },
  2508. { "sarQ", { Ev, CL }, 0 },
  2509. },
  2510. /* REG_F6 */
  2511. {
  2512. { "testA", { Eb, Ib }, 0 },
  2513. { "testA", { Eb, Ib }, 0 },
  2514. { "notA", { Ebh1 }, 0 },
  2515. { "negA", { Ebh1 }, 0 },
  2516. { "mulA", { Eb }, 0 }, /* Don't print the implicit %al register, */
  2517. { "imulA", { Eb }, 0 }, /* to distinguish these opcodes from other */
  2518. { "divA", { Eb }, 0 }, /* mul/imul opcodes. Do the same for div */
  2519. { "idivA", { Eb }, 0 }, /* and idiv for consistency. */
  2520. },
  2521. /* REG_F7 */
  2522. {
  2523. { "testQ", { Ev, Iv }, 0 },
  2524. { "testQ", { Ev, Iv }, 0 },
  2525. { "notQ", { Evh1 }, 0 },
  2526. { "negQ", { Evh1 }, 0 },
  2527. { "mulQ", { Ev }, 0 }, /* Don't print the implicit register. */
  2528. { "imulQ", { Ev }, 0 },
  2529. { "divQ", { Ev }, 0 },
  2530. { "idivQ", { Ev }, 0 },
  2531. },
  2532. /* REG_FE */
  2533. {
  2534. { "incA", { Ebh1 }, 0 },
  2535. { "decA", { Ebh1 }, 0 },
  2536. },
  2537. /* REG_FF */
  2538. {
  2539. { "incQ", { Evh1 }, 0 },
  2540. { "decQ", { Evh1 }, 0 },
  2541. { "call{@|}", { NOTRACK, indirEv, BND }, 0 },
  2542. { MOD_TABLE (MOD_FF_REG_3) },
  2543. { "jmp{@|}", { NOTRACK, indirEv, BND }, 0 },
  2544. { MOD_TABLE (MOD_FF_REG_5) },
  2545. { "push{P|}", { stackEv }, 0 },
  2546. { Bad_Opcode },
  2547. },
  2548. /* REG_0F00 */
  2549. {
  2550. { "sldtD", { Sv }, 0 },
  2551. { "strD", { Sv }, 0 },
  2552. { "lldt", { Ew }, 0 },
  2553. { "ltr", { Ew }, 0 },
  2554. { "verr", { Ew }, 0 },
  2555. { "verw", { Ew }, 0 },
  2556. { Bad_Opcode },
  2557. { Bad_Opcode },
  2558. },
  2559. /* REG_0F01 */
  2560. {
  2561. { MOD_TABLE (MOD_0F01_REG_0) },
  2562. { MOD_TABLE (MOD_0F01_REG_1) },
  2563. { MOD_TABLE (MOD_0F01_REG_2) },
  2564. { MOD_TABLE (MOD_0F01_REG_3) },
  2565. { "smswD", { Sv }, 0 },
  2566. { MOD_TABLE (MOD_0F01_REG_5) },
  2567. { "lmsw", { Ew }, 0 },
  2568. { MOD_TABLE (MOD_0F01_REG_7) },
  2569. },
  2570. /* REG_0F0D */
  2571. {
  2572. { "prefetch", { Mb }, 0 },
  2573. { "prefetchw", { Mb }, 0 },
  2574. { "prefetchwt1", { Mb }, 0 },
  2575. { "prefetch", { Mb }, 0 },
  2576. { "prefetch", { Mb }, 0 },
  2577. { "prefetch", { Mb }, 0 },
  2578. { "prefetch", { Mb }, 0 },
  2579. { "prefetch", { Mb }, 0 },
  2580. },
  2581. /* REG_0F18 */
  2582. {
  2583. { MOD_TABLE (MOD_0F18_REG_0) },
  2584. { MOD_TABLE (MOD_0F18_REG_1) },
  2585. { MOD_TABLE (MOD_0F18_REG_2) },
  2586. { MOD_TABLE (MOD_0F18_REG_3) },
  2587. { "nopQ", { Ev }, 0 },
  2588. { "nopQ", { Ev }, 0 },
  2589. { "nopQ", { Ev }, 0 },
  2590. { "nopQ", { Ev }, 0 },
  2591. },
  2592. /* REG_0F1C_P_0_MOD_0 */
  2593. {
  2594. { "cldemote", { Mb }, 0 },
  2595. { "nopQ", { Ev }, 0 },
  2596. { "nopQ", { Ev }, 0 },
  2597. { "nopQ", { Ev }, 0 },
  2598. { "nopQ", { Ev }, 0 },
  2599. { "nopQ", { Ev }, 0 },
  2600. { "nopQ", { Ev }, 0 },
  2601. { "nopQ", { Ev }, 0 },
  2602. },
  2603. /* REG_0F1E_P_1_MOD_3 */
  2604. {
  2605. { "nopQ", { Ev }, PREFIX_IGNORED },
  2606. { "rdsspK", { Edq }, 0 },
  2607. { "nopQ", { Ev }, PREFIX_IGNORED },
  2608. { "nopQ", { Ev }, PREFIX_IGNORED },
  2609. { "nopQ", { Ev }, PREFIX_IGNORED },
  2610. { "nopQ", { Ev }, PREFIX_IGNORED },
  2611. { "nopQ", { Ev }, PREFIX_IGNORED },
  2612. { RM_TABLE (RM_0F1E_P_1_MOD_3_REG_7) },
  2613. },
  2614. /* REG_0F38D8_PREFIX_1 */
  2615. {
  2616. { "aesencwide128kl", { M }, 0 },
  2617. { "aesdecwide128kl", { M }, 0 },
  2618. { "aesencwide256kl", { M }, 0 },
  2619. { "aesdecwide256kl", { M }, 0 },
  2620. },
  2621. /* REG_0F3A0F_PREFIX_1_MOD_3 */
  2622. {
  2623. { RM_TABLE (RM_0F3A0F_P_1_MOD_3_REG_0) },
  2624. },
  2625. /* REG_0F71_MOD_0 */
  2626. {
  2627. { Bad_Opcode },
  2628. { Bad_Opcode },
  2629. { "psrlw", { MS, Ib }, PREFIX_OPCODE },
  2630. { Bad_Opcode },
  2631. { "psraw", { MS, Ib }, PREFIX_OPCODE },
  2632. { Bad_Opcode },
  2633. { "psllw", { MS, Ib }, PREFIX_OPCODE },
  2634. },
  2635. /* REG_0F72_MOD_0 */
  2636. {
  2637. { Bad_Opcode },
  2638. { Bad_Opcode },
  2639. { "psrld", { MS, Ib }, PREFIX_OPCODE },
  2640. { Bad_Opcode },
  2641. { "psrad", { MS, Ib }, PREFIX_OPCODE },
  2642. { Bad_Opcode },
  2643. { "pslld", { MS, Ib }, PREFIX_OPCODE },
  2644. },
  2645. /* REG_0F73_MOD_0 */
  2646. {
  2647. { Bad_Opcode },
  2648. { Bad_Opcode },
  2649. { "psrlq", { MS, Ib }, PREFIX_OPCODE },
  2650. { "psrldq", { XS, Ib }, PREFIX_DATA },
  2651. { Bad_Opcode },
  2652. { Bad_Opcode },
  2653. { "psllq", { MS, Ib }, PREFIX_OPCODE },
  2654. { "pslldq", { XS, Ib }, PREFIX_DATA },
  2655. },
  2656. /* REG_0FA6 */
  2657. {
  2658. { "montmul", { { OP_0f07, 0 } }, 0 },
  2659. { "xsha1", { { OP_0f07, 0 } }, 0 },
  2660. { "xsha256", { { OP_0f07, 0 } }, 0 },
  2661. },
  2662. /* REG_0FA7 */
  2663. {
  2664. { "xstore-rng", { { OP_0f07, 0 } }, 0 },
  2665. { "xcrypt-ecb", { { OP_0f07, 0 } }, 0 },
  2666. { "xcrypt-cbc", { { OP_0f07, 0 } }, 0 },
  2667. { "xcrypt-ctr", { { OP_0f07, 0 } }, 0 },
  2668. { "xcrypt-cfb", { { OP_0f07, 0 } }, 0 },
  2669. { "xcrypt-ofb", { { OP_0f07, 0 } }, 0 },
  2670. },
  2671. /* REG_0FAE */
  2672. {
  2673. { MOD_TABLE (MOD_0FAE_REG_0) },
  2674. { MOD_TABLE (MOD_0FAE_REG_1) },
  2675. { MOD_TABLE (MOD_0FAE_REG_2) },
  2676. { MOD_TABLE (MOD_0FAE_REG_3) },
  2677. { MOD_TABLE (MOD_0FAE_REG_4) },
  2678. { MOD_TABLE (MOD_0FAE_REG_5) },
  2679. { MOD_TABLE (MOD_0FAE_REG_6) },
  2680. { MOD_TABLE (MOD_0FAE_REG_7) },
  2681. },
  2682. /* REG_0FBA */
  2683. {
  2684. { Bad_Opcode },
  2685. { Bad_Opcode },
  2686. { Bad_Opcode },
  2687. { Bad_Opcode },
  2688. { "btQ", { Ev, Ib }, 0 },
  2689. { "btsQ", { Evh1, Ib }, 0 },
  2690. { "btrQ", { Evh1, Ib }, 0 },
  2691. { "btcQ", { Evh1, Ib }, 0 },
  2692. },
  2693. /* REG_0FC7 */
  2694. {
  2695. { Bad_Opcode },
  2696. { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 },
  2697. { Bad_Opcode },
  2698. { MOD_TABLE (MOD_0FC7_REG_3) },
  2699. { MOD_TABLE (MOD_0FC7_REG_4) },
  2700. { MOD_TABLE (MOD_0FC7_REG_5) },
  2701. { MOD_TABLE (MOD_0FC7_REG_6) },
  2702. { MOD_TABLE (MOD_0FC7_REG_7) },
  2703. },
  2704. /* REG_VEX_0F71_M_0 */
  2705. {
  2706. { Bad_Opcode },
  2707. { Bad_Opcode },
  2708. { "vpsrlw", { Vex, XS, Ib }, PREFIX_DATA },
  2709. { Bad_Opcode },
  2710. { "vpsraw", { Vex, XS, Ib }, PREFIX_DATA },
  2711. { Bad_Opcode },
  2712. { "vpsllw", { Vex, XS, Ib }, PREFIX_DATA },
  2713. },
  2714. /* REG_VEX_0F72_M_0 */
  2715. {
  2716. { Bad_Opcode },
  2717. { Bad_Opcode },
  2718. { "vpsrld", { Vex, XS, Ib }, PREFIX_DATA },
  2719. { Bad_Opcode },
  2720. { "vpsrad", { Vex, XS, Ib }, PREFIX_DATA },
  2721. { Bad_Opcode },
  2722. { "vpslld", { Vex, XS, Ib }, PREFIX_DATA },
  2723. },
  2724. /* REG_VEX_0F73_M_0 */
  2725. {
  2726. { Bad_Opcode },
  2727. { Bad_Opcode },
  2728. { "vpsrlq", { Vex, XS, Ib }, PREFIX_DATA },
  2729. { "vpsrldq", { Vex, XS, Ib }, PREFIX_DATA },
  2730. { Bad_Opcode },
  2731. { Bad_Opcode },
  2732. { "vpsllq", { Vex, XS, Ib }, PREFIX_DATA },
  2733. { "vpslldq", { Vex, XS, Ib }, PREFIX_DATA },
  2734. },
  2735. /* REG_VEX_0FAE */
  2736. {
  2737. { Bad_Opcode },
  2738. { Bad_Opcode },
  2739. { MOD_TABLE (MOD_VEX_0FAE_REG_2) },
  2740. { MOD_TABLE (MOD_VEX_0FAE_REG_3) },
  2741. },
  2742. /* REG_VEX_0F3849_X86_64_P_0_W_0_M_1 */
  2743. {
  2744. { RM_TABLE (RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0) },
  2745. },
  2746. /* REG_VEX_0F38F3_L_0 */
  2747. {
  2748. { Bad_Opcode },
  2749. { "blsrS", { VexGdq, Edq }, PREFIX_OPCODE },
  2750. { "blsmskS", { VexGdq, Edq }, PREFIX_OPCODE },
  2751. { "blsiS", { VexGdq, Edq }, PREFIX_OPCODE },
  2752. },
  2753. /* REG_XOP_09_01_L_0 */
  2754. {
  2755. { Bad_Opcode },
  2756. { "blcfill", { VexGdq, Edq }, 0 },
  2757. { "blsfill", { VexGdq, Edq }, 0 },
  2758. { "blcs", { VexGdq, Edq }, 0 },
  2759. { "tzmsk", { VexGdq, Edq }, 0 },
  2760. { "blcic", { VexGdq, Edq }, 0 },
  2761. { "blsic", { VexGdq, Edq }, 0 },
  2762. { "t1mskc", { VexGdq, Edq }, 0 },
  2763. },
  2764. /* REG_XOP_09_02_L_0 */
  2765. {
  2766. { Bad_Opcode },
  2767. { "blcmsk", { VexGdq, Edq }, 0 },
  2768. { Bad_Opcode },
  2769. { Bad_Opcode },
  2770. { Bad_Opcode },
  2771. { Bad_Opcode },
  2772. { "blci", { VexGdq, Edq }, 0 },
  2773. },
  2774. /* REG_XOP_09_12_M_1_L_0 */
  2775. {
  2776. { "llwpcb", { Edq }, 0 },
  2777. { "slwpcb", { Edq }, 0 },
  2778. },
  2779. /* REG_XOP_0A_12_L_0 */
  2780. {
  2781. { "lwpins", { VexGdq, Ed, Id }, 0 },
  2782. { "lwpval", { VexGdq, Ed, Id }, 0 },
  2783. },
  2784. #include "i386-dis-evex-reg.h"
  2785. };
  2786. static const struct dis386 prefix_table[][4] = {
  2787. /* PREFIX_90 */
  2788. {
  2789. { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
  2790. { "pause", { XX }, 0 },
  2791. { "xchgS", { { NOP_Fixup1, eAX_reg }, { NOP_Fixup2, eAX_reg } }, 0 },
  2792. { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
  2793. },
  2794. /* PREFIX_0F01_REG_1_RM_4 */
  2795. {
  2796. { Bad_Opcode },
  2797. { Bad_Opcode },
  2798. { "tdcall", { Skip_MODRM }, 0 },
  2799. { Bad_Opcode },
  2800. },
  2801. /* PREFIX_0F01_REG_1_RM_5 */
  2802. {
  2803. { Bad_Opcode },
  2804. { Bad_Opcode },
  2805. { X86_64_TABLE (X86_64_0F01_REG_1_RM_5_PREFIX_2) },
  2806. { Bad_Opcode },
  2807. },
  2808. /* PREFIX_0F01_REG_1_RM_6 */
  2809. {
  2810. { Bad_Opcode },
  2811. { Bad_Opcode },
  2812. { X86_64_TABLE (X86_64_0F01_REG_1_RM_6_PREFIX_2) },
  2813. { Bad_Opcode },
  2814. },
  2815. /* PREFIX_0F01_REG_1_RM_7 */
  2816. {
  2817. { "encls", { Skip_MODRM }, 0 },
  2818. { Bad_Opcode },
  2819. { X86_64_TABLE (X86_64_0F01_REG_1_RM_7_PREFIX_2) },
  2820. { Bad_Opcode },
  2821. },
  2822. /* PREFIX_0F01_REG_3_RM_1 */
  2823. {
  2824. { "vmmcall", { Skip_MODRM }, 0 },
  2825. { "vmgexit", { Skip_MODRM }, 0 },
  2826. { Bad_Opcode },
  2827. { "vmgexit", { Skip_MODRM }, 0 },
  2828. },
  2829. /* PREFIX_0F01_REG_5_MOD_0 */
  2830. {
  2831. { Bad_Opcode },
  2832. { "rstorssp", { Mq }, PREFIX_OPCODE },
  2833. },
  2834. /* PREFIX_0F01_REG_5_MOD_3_RM_0 */
  2835. {
  2836. { "serialize", { Skip_MODRM }, PREFIX_OPCODE },
  2837. { "setssbsy", { Skip_MODRM }, PREFIX_OPCODE },
  2838. { Bad_Opcode },
  2839. { "xsusldtrk", { Skip_MODRM }, PREFIX_OPCODE },
  2840. },
  2841. /* PREFIX_0F01_REG_5_MOD_3_RM_1 */
  2842. {
  2843. { Bad_Opcode },
  2844. { Bad_Opcode },
  2845. { Bad_Opcode },
  2846. { "xresldtrk", { Skip_MODRM }, PREFIX_OPCODE },
  2847. },
  2848. /* PREFIX_0F01_REG_5_MOD_3_RM_2 */
  2849. {
  2850. { Bad_Opcode },
  2851. { "saveprevssp", { Skip_MODRM }, PREFIX_OPCODE },
  2852. },
  2853. /* PREFIX_0F01_REG_5_MOD_3_RM_4 */
  2854. {
  2855. { Bad_Opcode },
  2856. { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1) },
  2857. },
  2858. /* PREFIX_0F01_REG_5_MOD_3_RM_5 */
  2859. {
  2860. { Bad_Opcode },
  2861. { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1) },
  2862. },
  2863. /* PREFIX_0F01_REG_5_MOD_3_RM_6 */
  2864. {
  2865. { "rdpkru", { Skip_MODRM }, 0 },
  2866. { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1) },
  2867. },
  2868. /* PREFIX_0F01_REG_5_MOD_3_RM_7 */
  2869. {
  2870. { "wrpkru", { Skip_MODRM }, 0 },
  2871. { X86_64_TABLE (X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1) },
  2872. },
  2873. /* PREFIX_0F01_REG_7_MOD_3_RM_2 */
  2874. {
  2875. { "monitorx", { { OP_Monitor, 0 } }, 0 },
  2876. { "mcommit", { Skip_MODRM }, 0 },
  2877. },
  2878. /* PREFIX_0F01_REG_7_MOD_3_RM_6 */
  2879. {
  2880. { "invlpgb", { Skip_MODRM }, 0 },
  2881. { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1) },
  2882. { Bad_Opcode },
  2883. { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3) },
  2884. },
  2885. /* PREFIX_0F01_REG_7_MOD_3_RM_7 */
  2886. {
  2887. { "tlbsync", { Skip_MODRM }, 0 },
  2888. { X86_64_TABLE (X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1) },
  2889. { Bad_Opcode },
  2890. { "pvalidate", { Skip_MODRM }, 0 },
  2891. },
  2892. /* PREFIX_0F09 */
  2893. {
  2894. { "wbinvd", { XX }, 0 },
  2895. { "wbnoinvd", { XX }, 0 },
  2896. },
  2897. /* PREFIX_0F10 */
  2898. {
  2899. { "movups", { XM, EXx }, PREFIX_OPCODE },
  2900. { "movss", { XM, EXd }, PREFIX_OPCODE },
  2901. { "movupd", { XM, EXx }, PREFIX_OPCODE },
  2902. { "movsd", { XM, EXq }, PREFIX_OPCODE },
  2903. },
  2904. /* PREFIX_0F11 */
  2905. {
  2906. { "movups", { EXxS, XM }, PREFIX_OPCODE },
  2907. { "movss", { EXdS, XM }, PREFIX_OPCODE },
  2908. { "movupd", { EXxS, XM }, PREFIX_OPCODE },
  2909. { "movsd", { EXqS, XM }, PREFIX_OPCODE },
  2910. },
  2911. /* PREFIX_0F12 */
  2912. {
  2913. { MOD_TABLE (MOD_0F12_PREFIX_0) },
  2914. { "movsldup", { XM, EXx }, PREFIX_OPCODE },
  2915. { MOD_TABLE (MOD_0F12_PREFIX_2) },
  2916. { "movddup", { XM, EXq }, PREFIX_OPCODE },
  2917. },
  2918. /* PREFIX_0F16 */
  2919. {
  2920. { MOD_TABLE (MOD_0F16_PREFIX_0) },
  2921. { "movshdup", { XM, EXx }, PREFIX_OPCODE },
  2922. { MOD_TABLE (MOD_0F16_PREFIX_2) },
  2923. },
  2924. /* PREFIX_0F1A */
  2925. {
  2926. { MOD_TABLE (MOD_0F1A_PREFIX_0) },
  2927. { "bndcl", { Gbnd, Ev_bnd }, 0 },
  2928. { "bndmov", { Gbnd, Ebnd }, 0 },
  2929. { "bndcu", { Gbnd, Ev_bnd }, 0 },
  2930. },
  2931. /* PREFIX_0F1B */
  2932. {
  2933. { MOD_TABLE (MOD_0F1B_PREFIX_0) },
  2934. { MOD_TABLE (MOD_0F1B_PREFIX_1) },
  2935. { "bndmov", { EbndS, Gbnd }, 0 },
  2936. { "bndcn", { Gbnd, Ev_bnd }, 0 },
  2937. },
  2938. /* PREFIX_0F1C */
  2939. {
  2940. { MOD_TABLE (MOD_0F1C_PREFIX_0) },
  2941. { "nopQ", { Ev }, PREFIX_IGNORED },
  2942. { "nopQ", { Ev }, 0 },
  2943. { "nopQ", { Ev }, PREFIX_IGNORED },
  2944. },
  2945. /* PREFIX_0F1E */
  2946. {
  2947. { "nopQ", { Ev }, 0 },
  2948. { MOD_TABLE (MOD_0F1E_PREFIX_1) },
  2949. { "nopQ", { Ev }, 0 },
  2950. { NULL, { XX }, PREFIX_IGNORED },
  2951. },
  2952. /* PREFIX_0F2A */
  2953. {
  2954. { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
  2955. { "cvtsi2ss{%LQ|}", { XM, Edq }, PREFIX_OPCODE },
  2956. { "cvtpi2pd", { XM, EMCq }, PREFIX_OPCODE },
  2957. { "cvtsi2sd{%LQ|}", { XM, Edq }, 0 },
  2958. },
  2959. /* PREFIX_0F2B */
  2960. {
  2961. { MOD_TABLE (MOD_0F2B_PREFIX_0) },
  2962. { MOD_TABLE (MOD_0F2B_PREFIX_1) },
  2963. { MOD_TABLE (MOD_0F2B_PREFIX_2) },
  2964. { MOD_TABLE (MOD_0F2B_PREFIX_3) },
  2965. },
  2966. /* PREFIX_0F2C */
  2967. {
  2968. { "cvttps2pi", { MXC, EXq }, PREFIX_OPCODE },
  2969. { "cvttss2si", { Gdq, EXd }, PREFIX_OPCODE },
  2970. { "cvttpd2pi", { MXC, EXx }, PREFIX_OPCODE },
  2971. { "cvttsd2si", { Gdq, EXq }, PREFIX_OPCODE },
  2972. },
  2973. /* PREFIX_0F2D */
  2974. {
  2975. { "cvtps2pi", { MXC, EXq }, PREFIX_OPCODE },
  2976. { "cvtss2si", { Gdq, EXd }, PREFIX_OPCODE },
  2977. { "cvtpd2pi", { MXC, EXx }, PREFIX_OPCODE },
  2978. { "cvtsd2si", { Gdq, EXq }, PREFIX_OPCODE },
  2979. },
  2980. /* PREFIX_0F2E */
  2981. {
  2982. { "ucomiss",{ XM, EXd }, 0 },
  2983. { Bad_Opcode },
  2984. { "ucomisd",{ XM, EXq }, 0 },
  2985. },
  2986. /* PREFIX_0F2F */
  2987. {
  2988. { "comiss", { XM, EXd }, 0 },
  2989. { Bad_Opcode },
  2990. { "comisd", { XM, EXq }, 0 },
  2991. },
  2992. /* PREFIX_0F51 */
  2993. {
  2994. { "sqrtps", { XM, EXx }, PREFIX_OPCODE },
  2995. { "sqrtss", { XM, EXd }, PREFIX_OPCODE },
  2996. { "sqrtpd", { XM, EXx }, PREFIX_OPCODE },
  2997. { "sqrtsd", { XM, EXq }, PREFIX_OPCODE },
  2998. },
  2999. /* PREFIX_0F52 */
  3000. {
  3001. { "rsqrtps",{ XM, EXx }, PREFIX_OPCODE },
  3002. { "rsqrtss",{ XM, EXd }, PREFIX_OPCODE },
  3003. },
  3004. /* PREFIX_0F53 */
  3005. {
  3006. { "rcpps", { XM, EXx }, PREFIX_OPCODE },
  3007. { "rcpss", { XM, EXd }, PREFIX_OPCODE },
  3008. },
  3009. /* PREFIX_0F58 */
  3010. {
  3011. { "addps", { XM, EXx }, PREFIX_OPCODE },
  3012. { "addss", { XM, EXd }, PREFIX_OPCODE },
  3013. { "addpd", { XM, EXx }, PREFIX_OPCODE },
  3014. { "addsd", { XM, EXq }, PREFIX_OPCODE },
  3015. },
  3016. /* PREFIX_0F59 */
  3017. {
  3018. { "mulps", { XM, EXx }, PREFIX_OPCODE },
  3019. { "mulss", { XM, EXd }, PREFIX_OPCODE },
  3020. { "mulpd", { XM, EXx }, PREFIX_OPCODE },
  3021. { "mulsd", { XM, EXq }, PREFIX_OPCODE },
  3022. },
  3023. /* PREFIX_0F5A */
  3024. {
  3025. { "cvtps2pd", { XM, EXq }, PREFIX_OPCODE },
  3026. { "cvtss2sd", { XM, EXd }, PREFIX_OPCODE },
  3027. { "cvtpd2ps", { XM, EXx }, PREFIX_OPCODE },
  3028. { "cvtsd2ss", { XM, EXq }, PREFIX_OPCODE },
  3029. },
  3030. /* PREFIX_0F5B */
  3031. {
  3032. { "cvtdq2ps", { XM, EXx }, PREFIX_OPCODE },
  3033. { "cvttps2dq", { XM, EXx }, PREFIX_OPCODE },
  3034. { "cvtps2dq", { XM, EXx }, PREFIX_OPCODE },
  3035. },
  3036. /* PREFIX_0F5C */
  3037. {
  3038. { "subps", { XM, EXx }, PREFIX_OPCODE },
  3039. { "subss", { XM, EXd }, PREFIX_OPCODE },
  3040. { "subpd", { XM, EXx }, PREFIX_OPCODE },
  3041. { "subsd", { XM, EXq }, PREFIX_OPCODE },
  3042. },
  3043. /* PREFIX_0F5D */
  3044. {
  3045. { "minps", { XM, EXx }, PREFIX_OPCODE },
  3046. { "minss", { XM, EXd }, PREFIX_OPCODE },
  3047. { "minpd", { XM, EXx }, PREFIX_OPCODE },
  3048. { "minsd", { XM, EXq }, PREFIX_OPCODE },
  3049. },
  3050. /* PREFIX_0F5E */
  3051. {
  3052. { "divps", { XM, EXx }, PREFIX_OPCODE },
  3053. { "divss", { XM, EXd }, PREFIX_OPCODE },
  3054. { "divpd", { XM, EXx }, PREFIX_OPCODE },
  3055. { "divsd", { XM, EXq }, PREFIX_OPCODE },
  3056. },
  3057. /* PREFIX_0F5F */
  3058. {
  3059. { "maxps", { XM, EXx }, PREFIX_OPCODE },
  3060. { "maxss", { XM, EXd }, PREFIX_OPCODE },
  3061. { "maxpd", { XM, EXx }, PREFIX_OPCODE },
  3062. { "maxsd", { XM, EXq }, PREFIX_OPCODE },
  3063. },
  3064. /* PREFIX_0F60 */
  3065. {
  3066. { "punpcklbw",{ MX, EMd }, PREFIX_OPCODE },
  3067. { Bad_Opcode },
  3068. { "punpcklbw",{ MX, EMx }, PREFIX_OPCODE },
  3069. },
  3070. /* PREFIX_0F61 */
  3071. {
  3072. { "punpcklwd",{ MX, EMd }, PREFIX_OPCODE },
  3073. { Bad_Opcode },
  3074. { "punpcklwd",{ MX, EMx }, PREFIX_OPCODE },
  3075. },
  3076. /* PREFIX_0F62 */
  3077. {
  3078. { "punpckldq",{ MX, EMd }, PREFIX_OPCODE },
  3079. { Bad_Opcode },
  3080. { "punpckldq",{ MX, EMx }, PREFIX_OPCODE },
  3081. },
  3082. /* PREFIX_0F6F */
  3083. {
  3084. { "movq", { MX, EM }, PREFIX_OPCODE },
  3085. { "movdqu", { XM, EXx }, PREFIX_OPCODE },
  3086. { "movdqa", { XM, EXx }, PREFIX_OPCODE },
  3087. },
  3088. /* PREFIX_0F70 */
  3089. {
  3090. { "pshufw", { MX, EM, Ib }, PREFIX_OPCODE },
  3091. { "pshufhw",{ XM, EXx, Ib }, PREFIX_OPCODE },
  3092. { "pshufd", { XM, EXx, Ib }, PREFIX_OPCODE },
  3093. { "pshuflw",{ XM, EXx, Ib }, PREFIX_OPCODE },
  3094. },
  3095. /* PREFIX_0F78 */
  3096. {
  3097. {"vmread", { Em, Gm }, 0 },
  3098. { Bad_Opcode },
  3099. {"extrq", { XS, Ib, Ib }, 0 },
  3100. {"insertq", { XM, XS, Ib, Ib }, 0 },
  3101. },
  3102. /* PREFIX_0F79 */
  3103. {
  3104. {"vmwrite", { Gm, Em }, 0 },
  3105. { Bad_Opcode },
  3106. {"extrq", { XM, XS }, 0 },
  3107. {"insertq", { XM, XS }, 0 },
  3108. },
  3109. /* PREFIX_0F7C */
  3110. {
  3111. { Bad_Opcode },
  3112. { Bad_Opcode },
  3113. { "haddpd", { XM, EXx }, PREFIX_OPCODE },
  3114. { "haddps", { XM, EXx }, PREFIX_OPCODE },
  3115. },
  3116. /* PREFIX_0F7D */
  3117. {
  3118. { Bad_Opcode },
  3119. { Bad_Opcode },
  3120. { "hsubpd", { XM, EXx }, PREFIX_OPCODE },
  3121. { "hsubps", { XM, EXx }, PREFIX_OPCODE },
  3122. },
  3123. /* PREFIX_0F7E */
  3124. {
  3125. { "movK", { Edq, MX }, PREFIX_OPCODE },
  3126. { "movq", { XM, EXq }, PREFIX_OPCODE },
  3127. { "movK", { Edq, XM }, PREFIX_OPCODE },
  3128. },
  3129. /* PREFIX_0F7F */
  3130. {
  3131. { "movq", { EMS, MX }, PREFIX_OPCODE },
  3132. { "movdqu", { EXxS, XM }, PREFIX_OPCODE },
  3133. { "movdqa", { EXxS, XM }, PREFIX_OPCODE },
  3134. },
  3135. /* PREFIX_0FAE_REG_0_MOD_3 */
  3136. {
  3137. { Bad_Opcode },
  3138. { "rdfsbase", { Ev }, 0 },
  3139. },
  3140. /* PREFIX_0FAE_REG_1_MOD_3 */
  3141. {
  3142. { Bad_Opcode },
  3143. { "rdgsbase", { Ev }, 0 },
  3144. },
  3145. /* PREFIX_0FAE_REG_2_MOD_3 */
  3146. {
  3147. { Bad_Opcode },
  3148. { "wrfsbase", { Ev }, 0 },
  3149. },
  3150. /* PREFIX_0FAE_REG_3_MOD_3 */
  3151. {
  3152. { Bad_Opcode },
  3153. { "wrgsbase", { Ev }, 0 },
  3154. },
  3155. /* PREFIX_0FAE_REG_4_MOD_0 */
  3156. {
  3157. { "xsave", { FXSAVE }, 0 },
  3158. { "ptwrite{%LQ|}", { Edq }, 0 },
  3159. },
  3160. /* PREFIX_0FAE_REG_4_MOD_3 */
  3161. {
  3162. { Bad_Opcode },
  3163. { "ptwrite{%LQ|}", { Edq }, 0 },
  3164. },
  3165. /* PREFIX_0FAE_REG_5_MOD_3 */
  3166. {
  3167. { "lfence", { Skip_MODRM }, 0 },
  3168. { "incsspK", { Edq }, PREFIX_OPCODE },
  3169. },
  3170. /* PREFIX_0FAE_REG_6_MOD_0 */
  3171. {
  3172. { "xsaveopt", { FXSAVE }, PREFIX_OPCODE },
  3173. { "clrssbsy", { Mq }, PREFIX_OPCODE },
  3174. { "clwb", { Mb }, PREFIX_OPCODE },
  3175. },
  3176. /* PREFIX_0FAE_REG_6_MOD_3 */
  3177. {
  3178. { RM_TABLE (RM_0FAE_REG_6_MOD_3_P_0) },
  3179. { "umonitor", { Eva }, PREFIX_OPCODE },
  3180. { "tpause", { Edq }, PREFIX_OPCODE },
  3181. { "umwait", { Edq }, PREFIX_OPCODE },
  3182. },
  3183. /* PREFIX_0FAE_REG_7_MOD_0 */
  3184. {
  3185. { "clflush", { Mb }, 0 },
  3186. { Bad_Opcode },
  3187. { "clflushopt", { Mb }, 0 },
  3188. },
  3189. /* PREFIX_0FB8 */
  3190. {
  3191. { Bad_Opcode },
  3192. { "popcntS", { Gv, Ev }, 0 },
  3193. },
  3194. /* PREFIX_0FBC */
  3195. {
  3196. { "bsfS", { Gv, Ev }, 0 },
  3197. { "tzcntS", { Gv, Ev }, 0 },
  3198. { "bsfS", { Gv, Ev }, 0 },
  3199. },
  3200. /* PREFIX_0FBD */
  3201. {
  3202. { "bsrS", { Gv, Ev }, 0 },
  3203. { "lzcntS", { Gv, Ev }, 0 },
  3204. { "bsrS", { Gv, Ev }, 0 },
  3205. },
  3206. /* PREFIX_0FC2 */
  3207. {
  3208. { "cmpps", { XM, EXx, CMP }, PREFIX_OPCODE },
  3209. { "cmpss", { XM, EXd, CMP }, PREFIX_OPCODE },
  3210. { "cmppd", { XM, EXx, CMP }, PREFIX_OPCODE },
  3211. { "cmpsd", { XM, EXq, CMP }, PREFIX_OPCODE },
  3212. },
  3213. /* PREFIX_0FC7_REG_6_MOD_0 */
  3214. {
  3215. { "vmptrld",{ Mq }, 0 },
  3216. { "vmxon", { Mq }, 0 },
  3217. { "vmclear",{ Mq }, 0 },
  3218. },
  3219. /* PREFIX_0FC7_REG_6_MOD_3 */
  3220. {
  3221. { "rdrand", { Ev }, 0 },
  3222. { X86_64_TABLE (X86_64_0FC7_REG_6_MOD_3_PREFIX_1) },
  3223. { "rdrand", { Ev }, 0 }
  3224. },
  3225. /* PREFIX_0FC7_REG_7_MOD_3 */
  3226. {
  3227. { "rdseed", { Ev }, 0 },
  3228. { "rdpid", { Em }, 0 },
  3229. { "rdseed", { Ev }, 0 },
  3230. },
  3231. /* PREFIX_0FD0 */
  3232. {
  3233. { Bad_Opcode },
  3234. { Bad_Opcode },
  3235. { "addsubpd", { XM, EXx }, 0 },
  3236. { "addsubps", { XM, EXx }, 0 },
  3237. },
  3238. /* PREFIX_0FD6 */
  3239. {
  3240. { Bad_Opcode },
  3241. { "movq2dq",{ XM, MS }, 0 },
  3242. { "movq", { EXqS, XM }, 0 },
  3243. { "movdq2q",{ MX, XS }, 0 },
  3244. },
  3245. /* PREFIX_0FE6 */
  3246. {
  3247. { Bad_Opcode },
  3248. { "cvtdq2pd", { XM, EXq }, PREFIX_OPCODE },
  3249. { "cvttpd2dq", { XM, EXx }, PREFIX_OPCODE },
  3250. { "cvtpd2dq", { XM, EXx }, PREFIX_OPCODE },
  3251. },
  3252. /* PREFIX_0FE7 */
  3253. {
  3254. { "movntq", { Mq, MX }, PREFIX_OPCODE },
  3255. { Bad_Opcode },
  3256. { MOD_TABLE (MOD_0FE7_PREFIX_2) },
  3257. },
  3258. /* PREFIX_0FF0 */
  3259. {
  3260. { Bad_Opcode },
  3261. { Bad_Opcode },
  3262. { Bad_Opcode },
  3263. { MOD_TABLE (MOD_0FF0_PREFIX_3) },
  3264. },
  3265. /* PREFIX_0FF7 */
  3266. {
  3267. { "maskmovq", { MX, MS }, PREFIX_OPCODE },
  3268. { Bad_Opcode },
  3269. { "maskmovdqu", { XM, XS }, PREFIX_OPCODE },
  3270. },
  3271. /* PREFIX_0F38D8 */
  3272. {
  3273. { Bad_Opcode },
  3274. { REG_TABLE (REG_0F38D8_PREFIX_1) },
  3275. },
  3276. /* PREFIX_0F38DC */
  3277. {
  3278. { Bad_Opcode },
  3279. { MOD_TABLE (MOD_0F38DC_PREFIX_1) },
  3280. { "aesenc", { XM, EXx }, 0 },
  3281. },
  3282. /* PREFIX_0F38DD */
  3283. {
  3284. { Bad_Opcode },
  3285. { MOD_TABLE (MOD_0F38DD_PREFIX_1) },
  3286. { "aesenclast", { XM, EXx }, 0 },
  3287. },
  3288. /* PREFIX_0F38DE */
  3289. {
  3290. { Bad_Opcode },
  3291. { MOD_TABLE (MOD_0F38DE_PREFIX_1) },
  3292. { "aesdec", { XM, EXx }, 0 },
  3293. },
  3294. /* PREFIX_0F38DF */
  3295. {
  3296. { Bad_Opcode },
  3297. { MOD_TABLE (MOD_0F38DF_PREFIX_1) },
  3298. { "aesdeclast", { XM, EXx }, 0 },
  3299. },
  3300. /* PREFIX_0F38F0 */
  3301. {
  3302. { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
  3303. { Bad_Opcode },
  3304. { "movbeS", { Gv, Mv }, PREFIX_OPCODE },
  3305. { "crc32A", { Gdq, Eb }, PREFIX_OPCODE },
  3306. },
  3307. /* PREFIX_0F38F1 */
  3308. {
  3309. { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
  3310. { Bad_Opcode },
  3311. { "movbeS", { Mv, Gv }, PREFIX_OPCODE },
  3312. { "crc32Q", { Gdq, Ev }, PREFIX_OPCODE },
  3313. },
  3314. /* PREFIX_0F38F6 */
  3315. {
  3316. { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
  3317. { "adoxS", { Gdq, Edq}, PREFIX_OPCODE },
  3318. { "adcxS", { Gdq, Edq}, PREFIX_OPCODE },
  3319. { Bad_Opcode },
  3320. },
  3321. /* PREFIX_0F38F8 */
  3322. {
  3323. { Bad_Opcode },
  3324. { MOD_TABLE (MOD_0F38F8_PREFIX_1) },
  3325. { MOD_TABLE (MOD_0F38F8_PREFIX_2) },
  3326. { MOD_TABLE (MOD_0F38F8_PREFIX_3) },
  3327. },
  3328. /* PREFIX_0F38FA */
  3329. {
  3330. { Bad_Opcode },
  3331. { MOD_TABLE (MOD_0F38FA_PREFIX_1) },
  3332. },
  3333. /* PREFIX_0F38FB */
  3334. {
  3335. { Bad_Opcode },
  3336. { MOD_TABLE (MOD_0F38FB_PREFIX_1) },
  3337. },
  3338. /* PREFIX_0F3A0F */
  3339. {
  3340. { Bad_Opcode },
  3341. { MOD_TABLE (MOD_0F3A0F_PREFIX_1)},
  3342. },
  3343. /* PREFIX_VEX_0F10 */
  3344. {
  3345. { "vmovupX", { XM, EXEvexXNoBcst }, PREFIX_OPCODE },
  3346. { "vmovs%XS", { XMScalar, VexScalarR, EXd }, 0 },
  3347. { "vmovupX", { XM, EXEvexXNoBcst }, PREFIX_OPCODE },
  3348. { "vmovs%XD", { XMScalar, VexScalarR, EXq }, 0 },
  3349. },
  3350. /* PREFIX_VEX_0F11 */
  3351. {
  3352. { "vmovupX", { EXxS, XM }, PREFIX_OPCODE },
  3353. { "vmovs%XS", { EXdS, VexScalarR, XMScalar }, 0 },
  3354. { "vmovupX", { EXxS, XM }, PREFIX_OPCODE },
  3355. { "vmovs%XD", { EXqS, VexScalarR, XMScalar }, 0 },
  3356. },
  3357. /* PREFIX_VEX_0F12 */
  3358. {
  3359. { MOD_TABLE (MOD_VEX_0F12_PREFIX_0) },
  3360. { "vmov%XSldup", { XM, EXEvexXNoBcst }, 0 },
  3361. { MOD_TABLE (MOD_VEX_0F12_PREFIX_2) },
  3362. { "vmov%XDdup", { XM, EXymmq }, 0 },
  3363. },
  3364. /* PREFIX_VEX_0F16 */
  3365. {
  3366. { MOD_TABLE (MOD_VEX_0F16_PREFIX_0) },
  3367. { "vmov%XShdup", { XM, EXEvexXNoBcst }, 0 },
  3368. { MOD_TABLE (MOD_VEX_0F16_PREFIX_2) },
  3369. },
  3370. /* PREFIX_VEX_0F2A */
  3371. {
  3372. { Bad_Opcode },
  3373. { "vcvtsi2ss{%LQ|}", { XMScalar, VexScalar, EXxEVexR, Edq }, 0 },
  3374. { Bad_Opcode },
  3375. { "vcvtsi2sd{%LQ|}", { XMScalar, VexScalar, EXxEVexR64, Edq }, 0 },
  3376. },
  3377. /* PREFIX_VEX_0F2C */
  3378. {
  3379. { Bad_Opcode },
  3380. { "vcvttss2si", { Gdq, EXd, EXxEVexS }, 0 },
  3381. { Bad_Opcode },
  3382. { "vcvttsd2si", { Gdq, EXq, EXxEVexS }, 0 },
  3383. },
  3384. /* PREFIX_VEX_0F2D */
  3385. {
  3386. { Bad_Opcode },
  3387. { "vcvtss2si", { Gdq, EXd, EXxEVexR }, 0 },
  3388. { Bad_Opcode },
  3389. { "vcvtsd2si", { Gdq, EXq, EXxEVexR }, 0 },
  3390. },
  3391. /* PREFIX_VEX_0F2E */
  3392. {
  3393. { "vucomisX", { XMScalar, EXd, EXxEVexS }, PREFIX_OPCODE },
  3394. { Bad_Opcode },
  3395. { "vucomisX", { XMScalar, EXq, EXxEVexS }, PREFIX_OPCODE },
  3396. },
  3397. /* PREFIX_VEX_0F2F */
  3398. {
  3399. { "vcomisX", { XMScalar, EXd, EXxEVexS }, PREFIX_OPCODE },
  3400. { Bad_Opcode },
  3401. { "vcomisX", { XMScalar, EXq, EXxEVexS }, PREFIX_OPCODE },
  3402. },
  3403. /* PREFIX_VEX_0F41_L_1_M_1_W_0 */
  3404. {
  3405. { "kandw", { MaskG, MaskVex, MaskE }, 0 },
  3406. { Bad_Opcode },
  3407. { "kandb", { MaskG, MaskVex, MaskE }, 0 },
  3408. },
  3409. /* PREFIX_VEX_0F41_L_1_M_1_W_1 */
  3410. {
  3411. { "kandq", { MaskG, MaskVex, MaskE }, 0 },
  3412. { Bad_Opcode },
  3413. { "kandd", { MaskG, MaskVex, MaskE }, 0 },
  3414. },
  3415. /* PREFIX_VEX_0F42_L_1_M_1_W_0 */
  3416. {
  3417. { "kandnw", { MaskG, MaskVex, MaskE }, 0 },
  3418. { Bad_Opcode },
  3419. { "kandnb", { MaskG, MaskVex, MaskE }, 0 },
  3420. },
  3421. /* PREFIX_VEX_0F42_L_1_M_1_W_1 */
  3422. {
  3423. { "kandnq", { MaskG, MaskVex, MaskE }, 0 },
  3424. { Bad_Opcode },
  3425. { "kandnd", { MaskG, MaskVex, MaskE }, 0 },
  3426. },
  3427. /* PREFIX_VEX_0F44_L_0_M_1_W_0 */
  3428. {
  3429. { "knotw", { MaskG, MaskE }, 0 },
  3430. { Bad_Opcode },
  3431. { "knotb", { MaskG, MaskE }, 0 },
  3432. },
  3433. /* PREFIX_VEX_0F44_L_0_M_1_W_1 */
  3434. {
  3435. { "knotq", { MaskG, MaskE }, 0 },
  3436. { Bad_Opcode },
  3437. { "knotd", { MaskG, MaskE }, 0 },
  3438. },
  3439. /* PREFIX_VEX_0F45_L_1_M_1_W_0 */
  3440. {
  3441. { "korw", { MaskG, MaskVex, MaskE }, 0 },
  3442. { Bad_Opcode },
  3443. { "korb", { MaskG, MaskVex, MaskE }, 0 },
  3444. },
  3445. /* PREFIX_VEX_0F45_L_1_M_1_W_1 */
  3446. {
  3447. { "korq", { MaskG, MaskVex, MaskE }, 0 },
  3448. { Bad_Opcode },
  3449. { "kord", { MaskG, MaskVex, MaskE }, 0 },
  3450. },
  3451. /* PREFIX_VEX_0F46_L_1_M_1_W_0 */
  3452. {
  3453. { "kxnorw", { MaskG, MaskVex, MaskE }, 0 },
  3454. { Bad_Opcode },
  3455. { "kxnorb", { MaskG, MaskVex, MaskE }, 0 },
  3456. },
  3457. /* PREFIX_VEX_0F46_L_1_M_1_W_1 */
  3458. {
  3459. { "kxnorq", { MaskG, MaskVex, MaskE }, 0 },
  3460. { Bad_Opcode },
  3461. { "kxnord", { MaskG, MaskVex, MaskE }, 0 },
  3462. },
  3463. /* PREFIX_VEX_0F47_L_1_M_1_W_0 */
  3464. {
  3465. { "kxorw", { MaskG, MaskVex, MaskE }, 0 },
  3466. { Bad_Opcode },
  3467. { "kxorb", { MaskG, MaskVex, MaskE }, 0 },
  3468. },
  3469. /* PREFIX_VEX_0F47_L_1_M_1_W_1 */
  3470. {
  3471. { "kxorq", { MaskG, MaskVex, MaskE }, 0 },
  3472. { Bad_Opcode },
  3473. { "kxord", { MaskG, MaskVex, MaskE }, 0 },
  3474. },
  3475. /* PREFIX_VEX_0F4A_L_1_M_1_W_0 */
  3476. {
  3477. { "kaddw", { MaskG, MaskVex, MaskE }, 0 },
  3478. { Bad_Opcode },
  3479. { "kaddb", { MaskG, MaskVex, MaskE }, 0 },
  3480. },
  3481. /* PREFIX_VEX_0F4A_L_1_M_1_W_1 */
  3482. {
  3483. { "kaddq", { MaskG, MaskVex, MaskE }, 0 },
  3484. { Bad_Opcode },
  3485. { "kaddd", { MaskG, MaskVex, MaskE }, 0 },
  3486. },
  3487. /* PREFIX_VEX_0F4B_L_1_M_1_W_0 */
  3488. {
  3489. { "kunpckwd", { MaskG, MaskVex, MaskE }, 0 },
  3490. { Bad_Opcode },
  3491. { "kunpckbw", { MaskG, MaskVex, MaskE }, 0 },
  3492. },
  3493. /* PREFIX_VEX_0F4B_L_1_M_1_W_1 */
  3494. {
  3495. { "kunpckdq", { MaskG, MaskVex, MaskE }, 0 },
  3496. },
  3497. /* PREFIX_VEX_0F51 */
  3498. {
  3499. { "vsqrtpX", { XM, EXx, EXxEVexR }, PREFIX_OPCODE },
  3500. { "vsqrts%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
  3501. { "vsqrtpX", { XM, EXx, EXxEVexR }, PREFIX_OPCODE },
  3502. { "vsqrts%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
  3503. },
  3504. /* PREFIX_VEX_0F52 */
  3505. {
  3506. { "vrsqrtps", { XM, EXx }, 0 },
  3507. { "vrsqrtss", { XMScalar, VexScalar, EXd }, 0 },
  3508. },
  3509. /* PREFIX_VEX_0F53 */
  3510. {
  3511. { "vrcpps", { XM, EXx }, 0 },
  3512. { "vrcpss", { XMScalar, VexScalar, EXd }, 0 },
  3513. },
  3514. /* PREFIX_VEX_0F58 */
  3515. {
  3516. { "vaddpX", { XM, Vex, EXx, EXxEVexR }, PREFIX_OPCODE },
  3517. { "vadds%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
  3518. { "vaddpX", { XM, Vex, EXx, EXxEVexR }, PREFIX_OPCODE },
  3519. { "vadds%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
  3520. },
  3521. /* PREFIX_VEX_0F59 */
  3522. {
  3523. { "vmulpX", { XM, Vex, EXx, EXxEVexR }, PREFIX_OPCODE },
  3524. { "vmuls%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
  3525. { "vmulpX", { XM, Vex, EXx, EXxEVexR }, PREFIX_OPCODE },
  3526. { "vmuls%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
  3527. },
  3528. /* PREFIX_VEX_0F5A */
  3529. {
  3530. { "vcvtp%XS2pd", { XM, EXEvexHalfBcstXmmq, EXxEVexS }, 0 },
  3531. { "vcvts%XS2sd", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
  3532. { "vcvtp%XD2ps%XY", { XMxmmq, EXx, EXxEVexR }, 0 },
  3533. { "vcvts%XD2ss", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
  3534. },
  3535. /* PREFIX_VEX_0F5B */
  3536. {
  3537. { "vcvtdq2ps", { XM, EXx }, 0 },
  3538. { "vcvttps2dq", { XM, EXx }, 0 },
  3539. { "vcvtps2dq", { XM, EXx }, 0 },
  3540. },
  3541. /* PREFIX_VEX_0F5C */
  3542. {
  3543. { "vsubpX", { XM, Vex, EXx, EXxEVexR }, PREFIX_OPCODE },
  3544. { "vsubs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
  3545. { "vsubpX", { XM, Vex, EXx, EXxEVexR }, PREFIX_OPCODE },
  3546. { "vsubs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
  3547. },
  3548. /* PREFIX_VEX_0F5D */
  3549. {
  3550. { "vminpX", { XM, Vex, EXx, EXxEVexS }, PREFIX_OPCODE },
  3551. { "vmins%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
  3552. { "vminpX", { XM, Vex, EXx, EXxEVexS }, PREFIX_OPCODE },
  3553. { "vmins%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
  3554. },
  3555. /* PREFIX_VEX_0F5E */
  3556. {
  3557. { "vdivpX", { XM, Vex, EXx, EXxEVexR }, PREFIX_OPCODE },
  3558. { "vdivs%XS", { XMScalar, VexScalar, EXd, EXxEVexR }, 0 },
  3559. { "vdivpX", { XM, Vex, EXx, EXxEVexR }, PREFIX_OPCODE },
  3560. { "vdivs%XD", { XMScalar, VexScalar, EXq, EXxEVexR }, 0 },
  3561. },
  3562. /* PREFIX_VEX_0F5F */
  3563. {
  3564. { "vmaxpX", { XM, Vex, EXx, EXxEVexS }, PREFIX_OPCODE },
  3565. { "vmaxs%XS", { XMScalar, VexScalar, EXd, EXxEVexS }, 0 },
  3566. { "vmaxpX", { XM, Vex, EXx, EXxEVexS }, PREFIX_OPCODE },
  3567. { "vmaxs%XD", { XMScalar, VexScalar, EXq, EXxEVexS }, 0 },
  3568. },
  3569. /* PREFIX_VEX_0F6F */
  3570. {
  3571. { Bad_Opcode },
  3572. { "vmovdqu", { XM, EXx }, 0 },
  3573. { "vmovdqa", { XM, EXx }, 0 },
  3574. },
  3575. /* PREFIX_VEX_0F70 */
  3576. {
  3577. { Bad_Opcode },
  3578. { "vpshufhw", { XM, EXx, Ib }, 0 },
  3579. { "vpshufd", { XM, EXx, Ib }, 0 },
  3580. { "vpshuflw", { XM, EXx, Ib }, 0 },
  3581. },
  3582. /* PREFIX_VEX_0F7C */
  3583. {
  3584. { Bad_Opcode },
  3585. { Bad_Opcode },
  3586. { "vhaddpd", { XM, Vex, EXx }, 0 },
  3587. { "vhaddps", { XM, Vex, EXx }, 0 },
  3588. },
  3589. /* PREFIX_VEX_0F7D */
  3590. {
  3591. { Bad_Opcode },
  3592. { Bad_Opcode },
  3593. { "vhsubpd", { XM, Vex, EXx }, 0 },
  3594. { "vhsubps", { XM, Vex, EXx }, 0 },
  3595. },
  3596. /* PREFIX_VEX_0F7E */
  3597. {
  3598. { Bad_Opcode },
  3599. { VEX_LEN_TABLE (VEX_LEN_0F7E_P_1) },
  3600. { VEX_LEN_TABLE (VEX_LEN_0F7E_P_2) },
  3601. },
  3602. /* PREFIX_VEX_0F7F */
  3603. {
  3604. { Bad_Opcode },
  3605. { "vmovdqu", { EXxS, XM }, 0 },
  3606. { "vmovdqa", { EXxS, XM }, 0 },
  3607. },
  3608. /* PREFIX_VEX_0F90_L_0_W_0 */
  3609. {
  3610. { "kmovw", { MaskG, MaskE }, 0 },
  3611. { Bad_Opcode },
  3612. { "kmovb", { MaskG, MaskBDE }, 0 },
  3613. },
  3614. /* PREFIX_VEX_0F90_L_0_W_1 */
  3615. {
  3616. { "kmovq", { MaskG, MaskE }, 0 },
  3617. { Bad_Opcode },
  3618. { "kmovd", { MaskG, MaskBDE }, 0 },
  3619. },
  3620. /* PREFIX_VEX_0F91_L_0_M_0_W_0 */
  3621. {
  3622. { "kmovw", { Ew, MaskG }, 0 },
  3623. { Bad_Opcode },
  3624. { "kmovb", { Eb, MaskG }, 0 },
  3625. },
  3626. /* PREFIX_VEX_0F91_L_0_M_0_W_1 */
  3627. {
  3628. { "kmovq", { Eq, MaskG }, 0 },
  3629. { Bad_Opcode },
  3630. { "kmovd", { Ed, MaskG }, 0 },
  3631. },
  3632. /* PREFIX_VEX_0F92_L_0_M_1_W_0 */
  3633. {
  3634. { "kmovw", { MaskG, Edq }, 0 },
  3635. { Bad_Opcode },
  3636. { "kmovb", { MaskG, Edq }, 0 },
  3637. { "kmovd", { MaskG, Edq }, 0 },
  3638. },
  3639. /* PREFIX_VEX_0F92_L_0_M_1_W_1 */
  3640. {
  3641. { Bad_Opcode },
  3642. { Bad_Opcode },
  3643. { Bad_Opcode },
  3644. { "kmovK", { MaskG, Edq }, 0 },
  3645. },
  3646. /* PREFIX_VEX_0F93_L_0_M_1_W_0 */
  3647. {
  3648. { "kmovw", { Gdq, MaskE }, 0 },
  3649. { Bad_Opcode },
  3650. { "kmovb", { Gdq, MaskE }, 0 },
  3651. { "kmovd", { Gdq, MaskE }, 0 },
  3652. },
  3653. /* PREFIX_VEX_0F93_L_0_M_1_W_1 */
  3654. {
  3655. { Bad_Opcode },
  3656. { Bad_Opcode },
  3657. { Bad_Opcode },
  3658. { "kmovK", { Gdq, MaskE }, 0 },
  3659. },
  3660. /* PREFIX_VEX_0F98_L_0_M_1_W_0 */
  3661. {
  3662. { "kortestw", { MaskG, MaskE }, 0 },
  3663. { Bad_Opcode },
  3664. { "kortestb", { MaskG, MaskE }, 0 },
  3665. },
  3666. /* PREFIX_VEX_0F98_L_0_M_1_W_1 */
  3667. {
  3668. { "kortestq", { MaskG, MaskE }, 0 },
  3669. { Bad_Opcode },
  3670. { "kortestd", { MaskG, MaskE }, 0 },
  3671. },
  3672. /* PREFIX_VEX_0F99_L_0_M_1_W_0 */
  3673. {
  3674. { "ktestw", { MaskG, MaskE }, 0 },
  3675. { Bad_Opcode },
  3676. { "ktestb", { MaskG, MaskE }, 0 },
  3677. },
  3678. /* PREFIX_VEX_0F99_L_0_M_1_W_1 */
  3679. {
  3680. { "ktestq", { MaskG, MaskE }, 0 },
  3681. { Bad_Opcode },
  3682. { "ktestd", { MaskG, MaskE }, 0 },
  3683. },
  3684. /* PREFIX_VEX_0FC2 */
  3685. {
  3686. { "vcmpps", { XM, Vex, EXx, CMP }, 0 },
  3687. { "vcmpss", { XMScalar, VexScalar, EXd, CMP }, 0 },
  3688. { "vcmppd", { XM, Vex, EXx, CMP }, 0 },
  3689. { "vcmpsd", { XMScalar, VexScalar, EXq, CMP }, 0 },
  3690. },
  3691. /* PREFIX_VEX_0FD0 */
  3692. {
  3693. { Bad_Opcode },
  3694. { Bad_Opcode },
  3695. { "vaddsubpd", { XM, Vex, EXx }, 0 },
  3696. { "vaddsubps", { XM, Vex, EXx }, 0 },
  3697. },
  3698. /* PREFIX_VEX_0FE6 */
  3699. {
  3700. { Bad_Opcode },
  3701. { "vcvtdq2pd", { XM, EXxmmq }, 0 },
  3702. { "vcvttpd2dq%XY", { XMM, EXx }, 0 },
  3703. { "vcvtpd2dq%XY", { XMM, EXx }, 0 },
  3704. },
  3705. /* PREFIX_VEX_0FF0 */
  3706. {
  3707. { Bad_Opcode },
  3708. { Bad_Opcode },
  3709. { Bad_Opcode },
  3710. { MOD_TABLE (MOD_VEX_0FF0_PREFIX_3) },
  3711. },
  3712. /* PREFIX_VEX_0F3849_X86_64 */
  3713. {
  3714. { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_0) },
  3715. { Bad_Opcode },
  3716. { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_2) },
  3717. { VEX_W_TABLE (VEX_W_0F3849_X86_64_P_3) },
  3718. },
  3719. /* PREFIX_VEX_0F384B_X86_64 */
  3720. {
  3721. { Bad_Opcode },
  3722. { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_1) },
  3723. { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_2) },
  3724. { VEX_W_TABLE (VEX_W_0F384B_X86_64_P_3) },
  3725. },
  3726. /* PREFIX_VEX_0F385C_X86_64 */
  3727. {
  3728. { Bad_Opcode },
  3729. { VEX_W_TABLE (VEX_W_0F385C_X86_64_P_1) },
  3730. { Bad_Opcode },
  3731. },
  3732. /* PREFIX_VEX_0F385E_X86_64 */
  3733. {
  3734. { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_0) },
  3735. { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_1) },
  3736. { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_2) },
  3737. { VEX_W_TABLE (VEX_W_0F385E_X86_64_P_3) },
  3738. },
  3739. /* PREFIX_VEX_0F38F5_L_0 */
  3740. {
  3741. { "bzhiS", { Gdq, Edq, VexGdq }, 0 },
  3742. { "pextS", { Gdq, VexGdq, Edq }, 0 },
  3743. { Bad_Opcode },
  3744. { "pdepS", { Gdq, VexGdq, Edq }, 0 },
  3745. },
  3746. /* PREFIX_VEX_0F38F6_L_0 */
  3747. {
  3748. { Bad_Opcode },
  3749. { Bad_Opcode },
  3750. { Bad_Opcode },
  3751. { "mulxS", { Gdq, VexGdq, Edq }, 0 },
  3752. },
  3753. /* PREFIX_VEX_0F38F7_L_0 */
  3754. {
  3755. { "bextrS", { Gdq, Edq, VexGdq }, 0 },
  3756. { "sarxS", { Gdq, Edq, VexGdq }, 0 },
  3757. { "shlxS", { Gdq, Edq, VexGdq }, 0 },
  3758. { "shrxS", { Gdq, Edq, VexGdq }, 0 },
  3759. },
  3760. /* PREFIX_VEX_0F3AF0_L_0 */
  3761. {
  3762. { Bad_Opcode },
  3763. { Bad_Opcode },
  3764. { Bad_Opcode },
  3765. { "rorxS", { Gdq, Edq, Ib }, 0 },
  3766. },
  3767. #include "i386-dis-evex-prefix.h"
  3768. };
  3769. static const struct dis386 x86_64_table[][2] = {
  3770. /* X86_64_06 */
  3771. {
  3772. { "pushP", { es }, 0 },
  3773. },
  3774. /* X86_64_07 */
  3775. {
  3776. { "popP", { es }, 0 },
  3777. },
  3778. /* X86_64_0E */
  3779. {
  3780. { "pushP", { cs }, 0 },
  3781. },
  3782. /* X86_64_16 */
  3783. {
  3784. { "pushP", { ss }, 0 },
  3785. },
  3786. /* X86_64_17 */
  3787. {
  3788. { "popP", { ss }, 0 },
  3789. },
  3790. /* X86_64_1E */
  3791. {
  3792. { "pushP", { ds }, 0 },
  3793. },
  3794. /* X86_64_1F */
  3795. {
  3796. { "popP", { ds }, 0 },
  3797. },
  3798. /* X86_64_27 */
  3799. {
  3800. { "daa", { XX }, 0 },
  3801. },
  3802. /* X86_64_2F */
  3803. {
  3804. { "das", { XX }, 0 },
  3805. },
  3806. /* X86_64_37 */
  3807. {
  3808. { "aaa", { XX }, 0 },
  3809. },
  3810. /* X86_64_3F */
  3811. {
  3812. { "aas", { XX }, 0 },
  3813. },
  3814. /* X86_64_60 */
  3815. {
  3816. { "pushaP", { XX }, 0 },
  3817. },
  3818. /* X86_64_61 */
  3819. {
  3820. { "popaP", { XX }, 0 },
  3821. },
  3822. /* X86_64_62 */
  3823. {
  3824. { MOD_TABLE (MOD_62_32BIT) },
  3825. { EVEX_TABLE (EVEX_0F) },
  3826. },
  3827. /* X86_64_63 */
  3828. {
  3829. { "arpl", { Ew, Gw }, 0 },
  3830. { "movs", { Gv, { MOVSXD_Fixup, movsxd_mode } }, 0 },
  3831. },
  3832. /* X86_64_6D */
  3833. {
  3834. { "ins{R|}", { Yzr, indirDX }, 0 },
  3835. { "ins{G|}", { Yzr, indirDX }, 0 },
  3836. },
  3837. /* X86_64_6F */
  3838. {
  3839. { "outs{R|}", { indirDXr, Xz }, 0 },
  3840. { "outs{G|}", { indirDXr, Xz }, 0 },
  3841. },
  3842. /* X86_64_82 */
  3843. {
  3844. /* Opcode 0x82 is an alias of opcode 0x80 in 32-bit mode. */
  3845. { REG_TABLE (REG_80) },
  3846. },
  3847. /* X86_64_9A */
  3848. {
  3849. { "{l|}call{P|}", { Ap }, 0 },
  3850. },
  3851. /* X86_64_C2 */
  3852. {
  3853. { "retP", { Iw, BND }, 0 },
  3854. { "ret@", { Iw, BND }, 0 },
  3855. },
  3856. /* X86_64_C3 */
  3857. {
  3858. { "retP", { BND }, 0 },
  3859. { "ret@", { BND }, 0 },
  3860. },
  3861. /* X86_64_C4 */
  3862. {
  3863. { MOD_TABLE (MOD_C4_32BIT) },
  3864. { VEX_C4_TABLE (VEX_0F) },
  3865. },
  3866. /* X86_64_C5 */
  3867. {
  3868. { MOD_TABLE (MOD_C5_32BIT) },
  3869. { VEX_C5_TABLE (VEX_0F) },
  3870. },
  3871. /* X86_64_CE */
  3872. {
  3873. { "into", { XX }, 0 },
  3874. },
  3875. /* X86_64_D4 */
  3876. {
  3877. { "aam", { Ib }, 0 },
  3878. },
  3879. /* X86_64_D5 */
  3880. {
  3881. { "aad", { Ib }, 0 },
  3882. },
  3883. /* X86_64_E8 */
  3884. {
  3885. { "callP", { Jv, BND }, 0 },
  3886. { "call@", { Jv, BND }, 0 }
  3887. },
  3888. /* X86_64_E9 */
  3889. {
  3890. { "jmpP", { Jv, BND }, 0 },
  3891. { "jmp@", { Jv, BND }, 0 }
  3892. },
  3893. /* X86_64_EA */
  3894. {
  3895. { "{l|}jmp{P|}", { Ap }, 0 },
  3896. },
  3897. /* X86_64_0F01_REG_0 */
  3898. {
  3899. { "sgdt{Q|Q}", { M }, 0 },
  3900. { "sgdt", { M }, 0 },
  3901. },
  3902. /* X86_64_0F01_REG_1 */
  3903. {
  3904. { "sidt{Q|Q}", { M }, 0 },
  3905. { "sidt", { M }, 0 },
  3906. },
  3907. /* X86_64_0F01_REG_1_RM_5_PREFIX_2 */
  3908. {
  3909. { Bad_Opcode },
  3910. { "seamret", { Skip_MODRM }, 0 },
  3911. },
  3912. /* X86_64_0F01_REG_1_RM_6_PREFIX_2 */
  3913. {
  3914. { Bad_Opcode },
  3915. { "seamops", { Skip_MODRM }, 0 },
  3916. },
  3917. /* X86_64_0F01_REG_1_RM_7_PREFIX_2 */
  3918. {
  3919. { Bad_Opcode },
  3920. { "seamcall", { Skip_MODRM }, 0 },
  3921. },
  3922. /* X86_64_0F01_REG_2 */
  3923. {
  3924. { "lgdt{Q|Q}", { M }, 0 },
  3925. { "lgdt", { M }, 0 },
  3926. },
  3927. /* X86_64_0F01_REG_3 */
  3928. {
  3929. { "lidt{Q|Q}", { M }, 0 },
  3930. { "lidt", { M }, 0 },
  3931. },
  3932. /* X86_64_0F01_REG_5_MOD_3_RM_4_PREFIX_1 */
  3933. {
  3934. { Bad_Opcode },
  3935. { "uiret", { Skip_MODRM }, 0 },
  3936. },
  3937. /* X86_64_0F01_REG_5_MOD_3_RM_5_PREFIX_1 */
  3938. {
  3939. { Bad_Opcode },
  3940. { "testui", { Skip_MODRM }, 0 },
  3941. },
  3942. /* X86_64_0F01_REG_5_MOD_3_RM_6_PREFIX_1 */
  3943. {
  3944. { Bad_Opcode },
  3945. { "clui", { Skip_MODRM }, 0 },
  3946. },
  3947. /* X86_64_0F01_REG_5_MOD_3_RM_7_PREFIX_1 */
  3948. {
  3949. { Bad_Opcode },
  3950. { "stui", { Skip_MODRM }, 0 },
  3951. },
  3952. /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_1 */
  3953. {
  3954. { Bad_Opcode },
  3955. { "rmpadjust", { Skip_MODRM }, 0 },
  3956. },
  3957. /* X86_64_0F01_REG_7_MOD_3_RM_6_PREFIX_3 */
  3958. {
  3959. { Bad_Opcode },
  3960. { "rmpupdate", { Skip_MODRM }, 0 },
  3961. },
  3962. /* X86_64_0F01_REG_7_MOD_3_RM_7_PREFIX_1 */
  3963. {
  3964. { Bad_Opcode },
  3965. { "psmash", { Skip_MODRM }, 0 },
  3966. },
  3967. {
  3968. /* X86_64_0F24 */
  3969. { "movZ", { Em, Td }, 0 },
  3970. },
  3971. {
  3972. /* X86_64_0F26 */
  3973. { "movZ", { Td, Em }, 0 },
  3974. },
  3975. /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */
  3976. {
  3977. { Bad_Opcode },
  3978. { "senduipi", { Eq }, 0 },
  3979. },
  3980. /* X86_64_VEX_0F3849 */
  3981. {
  3982. { Bad_Opcode },
  3983. { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64) },
  3984. },
  3985. /* X86_64_VEX_0F384B */
  3986. {
  3987. { Bad_Opcode },
  3988. { PREFIX_TABLE (PREFIX_VEX_0F384B_X86_64) },
  3989. },
  3990. /* X86_64_VEX_0F385C */
  3991. {
  3992. { Bad_Opcode },
  3993. { PREFIX_TABLE (PREFIX_VEX_0F385C_X86_64) },
  3994. },
  3995. /* X86_64_VEX_0F385E */
  3996. {
  3997. { Bad_Opcode },
  3998. { PREFIX_TABLE (PREFIX_VEX_0F385E_X86_64) },
  3999. },
  4000. };
  4001. static const struct dis386 three_byte_table[][256] = {
  4002. /* THREE_BYTE_0F38 */
  4003. {
  4004. /* 00 */
  4005. { "pshufb", { MX, EM }, PREFIX_OPCODE },
  4006. { "phaddw", { MX, EM }, PREFIX_OPCODE },
  4007. { "phaddd", { MX, EM }, PREFIX_OPCODE },
  4008. { "phaddsw", { MX, EM }, PREFIX_OPCODE },
  4009. { "pmaddubsw", { MX, EM }, PREFIX_OPCODE },
  4010. { "phsubw", { MX, EM }, PREFIX_OPCODE },
  4011. { "phsubd", { MX, EM }, PREFIX_OPCODE },
  4012. { "phsubsw", { MX, EM }, PREFIX_OPCODE },
  4013. /* 08 */
  4014. { "psignb", { MX, EM }, PREFIX_OPCODE },
  4015. { "psignw", { MX, EM }, PREFIX_OPCODE },
  4016. { "psignd", { MX, EM }, PREFIX_OPCODE },
  4017. { "pmulhrsw", { MX, EM }, PREFIX_OPCODE },
  4018. { Bad_Opcode },
  4019. { Bad_Opcode },
  4020. { Bad_Opcode },
  4021. { Bad_Opcode },
  4022. /* 10 */
  4023. { "pblendvb", { XM, EXx, XMM0 }, PREFIX_DATA },
  4024. { Bad_Opcode },
  4025. { Bad_Opcode },
  4026. { Bad_Opcode },
  4027. { "blendvps", { XM, EXx, XMM0 }, PREFIX_DATA },
  4028. { "blendvpd", { XM, EXx, XMM0 }, PREFIX_DATA },
  4029. { Bad_Opcode },
  4030. { "ptest", { XM, EXx }, PREFIX_DATA },
  4031. /* 18 */
  4032. { Bad_Opcode },
  4033. { Bad_Opcode },
  4034. { Bad_Opcode },
  4035. { Bad_Opcode },
  4036. { "pabsb", { MX, EM }, PREFIX_OPCODE },
  4037. { "pabsw", { MX, EM }, PREFIX_OPCODE },
  4038. { "pabsd", { MX, EM }, PREFIX_OPCODE },
  4039. { Bad_Opcode },
  4040. /* 20 */
  4041. { "pmovsxbw", { XM, EXq }, PREFIX_DATA },
  4042. { "pmovsxbd", { XM, EXd }, PREFIX_DATA },
  4043. { "pmovsxbq", { XM, EXw }, PREFIX_DATA },
  4044. { "pmovsxwd", { XM, EXq }, PREFIX_DATA },
  4045. { "pmovsxwq", { XM, EXd }, PREFIX_DATA },
  4046. { "pmovsxdq", { XM, EXq }, PREFIX_DATA },
  4047. { Bad_Opcode },
  4048. { Bad_Opcode },
  4049. /* 28 */
  4050. { "pmuldq", { XM, EXx }, PREFIX_DATA },
  4051. { "pcmpeqq", { XM, EXx }, PREFIX_DATA },
  4052. { MOD_TABLE (MOD_0F382A) },
  4053. { "packusdw", { XM, EXx }, PREFIX_DATA },
  4054. { Bad_Opcode },
  4055. { Bad_Opcode },
  4056. { Bad_Opcode },
  4057. { Bad_Opcode },
  4058. /* 30 */
  4059. { "pmovzxbw", { XM, EXq }, PREFIX_DATA },
  4060. { "pmovzxbd", { XM, EXd }, PREFIX_DATA },
  4061. { "pmovzxbq", { XM, EXw }, PREFIX_DATA },
  4062. { "pmovzxwd", { XM, EXq }, PREFIX_DATA },
  4063. { "pmovzxwq", { XM, EXd }, PREFIX_DATA },
  4064. { "pmovzxdq", { XM, EXq }, PREFIX_DATA },
  4065. { Bad_Opcode },
  4066. { "pcmpgtq", { XM, EXx }, PREFIX_DATA },
  4067. /* 38 */
  4068. { "pminsb", { XM, EXx }, PREFIX_DATA },
  4069. { "pminsd", { XM, EXx }, PREFIX_DATA },
  4070. { "pminuw", { XM, EXx }, PREFIX_DATA },
  4071. { "pminud", { XM, EXx }, PREFIX_DATA },
  4072. { "pmaxsb", { XM, EXx }, PREFIX_DATA },
  4073. { "pmaxsd", { XM, EXx }, PREFIX_DATA },
  4074. { "pmaxuw", { XM, EXx }, PREFIX_DATA },
  4075. { "pmaxud", { XM, EXx }, PREFIX_DATA },
  4076. /* 40 */
  4077. { "pmulld", { XM, EXx }, PREFIX_DATA },
  4078. { "phminposuw", { XM, EXx }, PREFIX_DATA },
  4079. { Bad_Opcode },
  4080. { Bad_Opcode },
  4081. { Bad_Opcode },
  4082. { Bad_Opcode },
  4083. { Bad_Opcode },
  4084. { Bad_Opcode },
  4085. /* 48 */
  4086. { Bad_Opcode },
  4087. { Bad_Opcode },
  4088. { Bad_Opcode },
  4089. { Bad_Opcode },
  4090. { Bad_Opcode },
  4091. { Bad_Opcode },
  4092. { Bad_Opcode },
  4093. { Bad_Opcode },
  4094. /* 50 */
  4095. { Bad_Opcode },
  4096. { Bad_Opcode },
  4097. { Bad_Opcode },
  4098. { Bad_Opcode },
  4099. { Bad_Opcode },
  4100. { Bad_Opcode },
  4101. { Bad_Opcode },
  4102. { Bad_Opcode },
  4103. /* 58 */
  4104. { Bad_Opcode },
  4105. { Bad_Opcode },
  4106. { Bad_Opcode },
  4107. { Bad_Opcode },
  4108. { Bad_Opcode },
  4109. { Bad_Opcode },
  4110. { Bad_Opcode },
  4111. { Bad_Opcode },
  4112. /* 60 */
  4113. { Bad_Opcode },
  4114. { Bad_Opcode },
  4115. { Bad_Opcode },
  4116. { Bad_Opcode },
  4117. { Bad_Opcode },
  4118. { Bad_Opcode },
  4119. { Bad_Opcode },
  4120. { Bad_Opcode },
  4121. /* 68 */
  4122. { Bad_Opcode },
  4123. { Bad_Opcode },
  4124. { Bad_Opcode },
  4125. { Bad_Opcode },
  4126. { Bad_Opcode },
  4127. { Bad_Opcode },
  4128. { Bad_Opcode },
  4129. { Bad_Opcode },
  4130. /* 70 */
  4131. { Bad_Opcode },
  4132. { Bad_Opcode },
  4133. { Bad_Opcode },
  4134. { Bad_Opcode },
  4135. { Bad_Opcode },
  4136. { Bad_Opcode },
  4137. { Bad_Opcode },
  4138. { Bad_Opcode },
  4139. /* 78 */
  4140. { Bad_Opcode },
  4141. { Bad_Opcode },
  4142. { Bad_Opcode },
  4143. { Bad_Opcode },
  4144. { Bad_Opcode },
  4145. { Bad_Opcode },
  4146. { Bad_Opcode },
  4147. { Bad_Opcode },
  4148. /* 80 */
  4149. { "invept", { Gm, Mo }, PREFIX_DATA },
  4150. { "invvpid", { Gm, Mo }, PREFIX_DATA },
  4151. { "invpcid", { Gm, M }, PREFIX_DATA },
  4152. { Bad_Opcode },
  4153. { Bad_Opcode },
  4154. { Bad_Opcode },
  4155. { Bad_Opcode },
  4156. { Bad_Opcode },
  4157. /* 88 */
  4158. { Bad_Opcode },
  4159. { Bad_Opcode },
  4160. { Bad_Opcode },
  4161. { Bad_Opcode },
  4162. { Bad_Opcode },
  4163. { Bad_Opcode },
  4164. { Bad_Opcode },
  4165. { Bad_Opcode },
  4166. /* 90 */
  4167. { Bad_Opcode },
  4168. { Bad_Opcode },
  4169. { Bad_Opcode },
  4170. { Bad_Opcode },
  4171. { Bad_Opcode },
  4172. { Bad_Opcode },
  4173. { Bad_Opcode },
  4174. { Bad_Opcode },
  4175. /* 98 */
  4176. { Bad_Opcode },
  4177. { Bad_Opcode },
  4178. { Bad_Opcode },
  4179. { Bad_Opcode },
  4180. { Bad_Opcode },
  4181. { Bad_Opcode },
  4182. { Bad_Opcode },
  4183. { Bad_Opcode },
  4184. /* a0 */
  4185. { Bad_Opcode },
  4186. { Bad_Opcode },
  4187. { Bad_Opcode },
  4188. { Bad_Opcode },
  4189. { Bad_Opcode },
  4190. { Bad_Opcode },
  4191. { Bad_Opcode },
  4192. { Bad_Opcode },
  4193. /* a8 */
  4194. { Bad_Opcode },
  4195. { Bad_Opcode },
  4196. { Bad_Opcode },
  4197. { Bad_Opcode },
  4198. { Bad_Opcode },
  4199. { Bad_Opcode },
  4200. { Bad_Opcode },
  4201. { Bad_Opcode },
  4202. /* b0 */
  4203. { Bad_Opcode },
  4204. { Bad_Opcode },
  4205. { Bad_Opcode },
  4206. { Bad_Opcode },
  4207. { Bad_Opcode },
  4208. { Bad_Opcode },
  4209. { Bad_Opcode },
  4210. { Bad_Opcode },
  4211. /* b8 */
  4212. { Bad_Opcode },
  4213. { Bad_Opcode },
  4214. { Bad_Opcode },
  4215. { Bad_Opcode },
  4216. { Bad_Opcode },
  4217. { Bad_Opcode },
  4218. { Bad_Opcode },
  4219. { Bad_Opcode },
  4220. /* c0 */
  4221. { Bad_Opcode },
  4222. { Bad_Opcode },
  4223. { Bad_Opcode },
  4224. { Bad_Opcode },
  4225. { Bad_Opcode },
  4226. { Bad_Opcode },
  4227. { Bad_Opcode },
  4228. { Bad_Opcode },
  4229. /* c8 */
  4230. { "sha1nexte", { XM, EXxmm }, PREFIX_OPCODE },
  4231. { "sha1msg1", { XM, EXxmm }, PREFIX_OPCODE },
  4232. { "sha1msg2", { XM, EXxmm }, PREFIX_OPCODE },
  4233. { "sha256rnds2", { XM, EXxmm, XMM0 }, PREFIX_OPCODE },
  4234. { "sha256msg1", { XM, EXxmm }, PREFIX_OPCODE },
  4235. { "sha256msg2", { XM, EXxmm }, PREFIX_OPCODE },
  4236. { Bad_Opcode },
  4237. { "gf2p8mulb", { XM, EXxmm }, PREFIX_DATA },
  4238. /* d0 */
  4239. { Bad_Opcode },
  4240. { Bad_Opcode },
  4241. { Bad_Opcode },
  4242. { Bad_Opcode },
  4243. { Bad_Opcode },
  4244. { Bad_Opcode },
  4245. { Bad_Opcode },
  4246. { Bad_Opcode },
  4247. /* d8 */
  4248. { PREFIX_TABLE (PREFIX_0F38D8) },
  4249. { Bad_Opcode },
  4250. { Bad_Opcode },
  4251. { "aesimc", { XM, EXx }, PREFIX_DATA },
  4252. { PREFIX_TABLE (PREFIX_0F38DC) },
  4253. { PREFIX_TABLE (PREFIX_0F38DD) },
  4254. { PREFIX_TABLE (PREFIX_0F38DE) },
  4255. { PREFIX_TABLE (PREFIX_0F38DF) },
  4256. /* e0 */
  4257. { Bad_Opcode },
  4258. { Bad_Opcode },
  4259. { Bad_Opcode },
  4260. { Bad_Opcode },
  4261. { Bad_Opcode },
  4262. { Bad_Opcode },
  4263. { Bad_Opcode },
  4264. { Bad_Opcode },
  4265. /* e8 */
  4266. { Bad_Opcode },
  4267. { Bad_Opcode },
  4268. { Bad_Opcode },
  4269. { Bad_Opcode },
  4270. { Bad_Opcode },
  4271. { Bad_Opcode },
  4272. { Bad_Opcode },
  4273. { Bad_Opcode },
  4274. /* f0 */
  4275. { PREFIX_TABLE (PREFIX_0F38F0) },
  4276. { PREFIX_TABLE (PREFIX_0F38F1) },
  4277. { Bad_Opcode },
  4278. { Bad_Opcode },
  4279. { Bad_Opcode },
  4280. { MOD_TABLE (MOD_0F38F5) },
  4281. { PREFIX_TABLE (PREFIX_0F38F6) },
  4282. { Bad_Opcode },
  4283. /* f8 */
  4284. { PREFIX_TABLE (PREFIX_0F38F8) },
  4285. { MOD_TABLE (MOD_0F38F9) },
  4286. { PREFIX_TABLE (PREFIX_0F38FA) },
  4287. { PREFIX_TABLE (PREFIX_0F38FB) },
  4288. { Bad_Opcode },
  4289. { Bad_Opcode },
  4290. { Bad_Opcode },
  4291. { Bad_Opcode },
  4292. },
  4293. /* THREE_BYTE_0F3A */
  4294. {
  4295. /* 00 */
  4296. { Bad_Opcode },
  4297. { Bad_Opcode },
  4298. { Bad_Opcode },
  4299. { Bad_Opcode },
  4300. { Bad_Opcode },
  4301. { Bad_Opcode },
  4302. { Bad_Opcode },
  4303. { Bad_Opcode },
  4304. /* 08 */
  4305. { "roundps", { XM, EXx, Ib }, PREFIX_DATA },
  4306. { "roundpd", { XM, EXx, Ib }, PREFIX_DATA },
  4307. { "roundss", { XM, EXd, Ib }, PREFIX_DATA },
  4308. { "roundsd", { XM, EXq, Ib }, PREFIX_DATA },
  4309. { "blendps", { XM, EXx, Ib }, PREFIX_DATA },
  4310. { "blendpd", { XM, EXx, Ib }, PREFIX_DATA },
  4311. { "pblendw", { XM, EXx, Ib }, PREFIX_DATA },
  4312. { "palignr", { MX, EM, Ib }, PREFIX_OPCODE },
  4313. /* 10 */
  4314. { Bad_Opcode },
  4315. { Bad_Opcode },
  4316. { Bad_Opcode },
  4317. { Bad_Opcode },
  4318. { "pextrb", { Edb, XM, Ib }, PREFIX_DATA },
  4319. { "pextrw", { Edw, XM, Ib }, PREFIX_DATA },
  4320. { "pextrK", { Edq, XM, Ib }, PREFIX_DATA },
  4321. { "extractps", { Ed, XM, Ib }, PREFIX_DATA },
  4322. /* 18 */
  4323. { Bad_Opcode },
  4324. { Bad_Opcode },
  4325. { Bad_Opcode },
  4326. { Bad_Opcode },
  4327. { Bad_Opcode },
  4328. { Bad_Opcode },
  4329. { Bad_Opcode },
  4330. { Bad_Opcode },
  4331. /* 20 */
  4332. { "pinsrb", { XM, Edb, Ib }, PREFIX_DATA },
  4333. { "insertps", { XM, EXd, Ib }, PREFIX_DATA },
  4334. { "pinsrK", { XM, Edq, Ib }, PREFIX_DATA },
  4335. { Bad_Opcode },
  4336. { Bad_Opcode },
  4337. { Bad_Opcode },
  4338. { Bad_Opcode },
  4339. { Bad_Opcode },
  4340. /* 28 */
  4341. { Bad_Opcode },
  4342. { Bad_Opcode },
  4343. { Bad_Opcode },
  4344. { Bad_Opcode },
  4345. { Bad_Opcode },
  4346. { Bad_Opcode },
  4347. { Bad_Opcode },
  4348. { Bad_Opcode },
  4349. /* 30 */
  4350. { Bad_Opcode },
  4351. { Bad_Opcode },
  4352. { Bad_Opcode },
  4353. { Bad_Opcode },
  4354. { Bad_Opcode },
  4355. { Bad_Opcode },
  4356. { Bad_Opcode },
  4357. { Bad_Opcode },
  4358. /* 38 */
  4359. { Bad_Opcode },
  4360. { Bad_Opcode },
  4361. { Bad_Opcode },
  4362. { Bad_Opcode },
  4363. { Bad_Opcode },
  4364. { Bad_Opcode },
  4365. { Bad_Opcode },
  4366. { Bad_Opcode },
  4367. /* 40 */
  4368. { "dpps", { XM, EXx, Ib }, PREFIX_DATA },
  4369. { "dppd", { XM, EXx, Ib }, PREFIX_DATA },
  4370. { "mpsadbw", { XM, EXx, Ib }, PREFIX_DATA },
  4371. { Bad_Opcode },
  4372. { "pclmulqdq", { XM, EXx, PCLMUL }, PREFIX_DATA },
  4373. { Bad_Opcode },
  4374. { Bad_Opcode },
  4375. { Bad_Opcode },
  4376. /* 48 */
  4377. { Bad_Opcode },
  4378. { Bad_Opcode },
  4379. { Bad_Opcode },
  4380. { Bad_Opcode },
  4381. { Bad_Opcode },
  4382. { Bad_Opcode },
  4383. { Bad_Opcode },
  4384. { Bad_Opcode },
  4385. /* 50 */
  4386. { Bad_Opcode },
  4387. { Bad_Opcode },
  4388. { Bad_Opcode },
  4389. { Bad_Opcode },
  4390. { Bad_Opcode },
  4391. { Bad_Opcode },
  4392. { Bad_Opcode },
  4393. { Bad_Opcode },
  4394. /* 58 */
  4395. { Bad_Opcode },
  4396. { Bad_Opcode },
  4397. { Bad_Opcode },
  4398. { Bad_Opcode },
  4399. { Bad_Opcode },
  4400. { Bad_Opcode },
  4401. { Bad_Opcode },
  4402. { Bad_Opcode },
  4403. /* 60 */
  4404. { "pcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
  4405. { "pcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
  4406. { "pcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
  4407. { "pcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
  4408. { Bad_Opcode },
  4409. { Bad_Opcode },
  4410. { Bad_Opcode },
  4411. { Bad_Opcode },
  4412. /* 68 */
  4413. { Bad_Opcode },
  4414. { Bad_Opcode },
  4415. { Bad_Opcode },
  4416. { Bad_Opcode },
  4417. { Bad_Opcode },
  4418. { Bad_Opcode },
  4419. { Bad_Opcode },
  4420. { Bad_Opcode },
  4421. /* 70 */
  4422. { Bad_Opcode },
  4423. { Bad_Opcode },
  4424. { Bad_Opcode },
  4425. { Bad_Opcode },
  4426. { Bad_Opcode },
  4427. { Bad_Opcode },
  4428. { Bad_Opcode },
  4429. { Bad_Opcode },
  4430. /* 78 */
  4431. { Bad_Opcode },
  4432. { Bad_Opcode },
  4433. { Bad_Opcode },
  4434. { Bad_Opcode },
  4435. { Bad_Opcode },
  4436. { Bad_Opcode },
  4437. { Bad_Opcode },
  4438. { Bad_Opcode },
  4439. /* 80 */
  4440. { Bad_Opcode },
  4441. { Bad_Opcode },
  4442. { Bad_Opcode },
  4443. { Bad_Opcode },
  4444. { Bad_Opcode },
  4445. { Bad_Opcode },
  4446. { Bad_Opcode },
  4447. { Bad_Opcode },
  4448. /* 88 */
  4449. { Bad_Opcode },
  4450. { Bad_Opcode },
  4451. { Bad_Opcode },
  4452. { Bad_Opcode },
  4453. { Bad_Opcode },
  4454. { Bad_Opcode },
  4455. { Bad_Opcode },
  4456. { Bad_Opcode },
  4457. /* 90 */
  4458. { Bad_Opcode },
  4459. { Bad_Opcode },
  4460. { Bad_Opcode },
  4461. { Bad_Opcode },
  4462. { Bad_Opcode },
  4463. { Bad_Opcode },
  4464. { Bad_Opcode },
  4465. { Bad_Opcode },
  4466. /* 98 */
  4467. { Bad_Opcode },
  4468. { Bad_Opcode },
  4469. { Bad_Opcode },
  4470. { Bad_Opcode },
  4471. { Bad_Opcode },
  4472. { Bad_Opcode },
  4473. { Bad_Opcode },
  4474. { Bad_Opcode },
  4475. /* a0 */
  4476. { Bad_Opcode },
  4477. { Bad_Opcode },
  4478. { Bad_Opcode },
  4479. { Bad_Opcode },
  4480. { Bad_Opcode },
  4481. { Bad_Opcode },
  4482. { Bad_Opcode },
  4483. { Bad_Opcode },
  4484. /* a8 */
  4485. { Bad_Opcode },
  4486. { Bad_Opcode },
  4487. { Bad_Opcode },
  4488. { Bad_Opcode },
  4489. { Bad_Opcode },
  4490. { Bad_Opcode },
  4491. { Bad_Opcode },
  4492. { Bad_Opcode },
  4493. /* b0 */
  4494. { Bad_Opcode },
  4495. { Bad_Opcode },
  4496. { Bad_Opcode },
  4497. { Bad_Opcode },
  4498. { Bad_Opcode },
  4499. { Bad_Opcode },
  4500. { Bad_Opcode },
  4501. { Bad_Opcode },
  4502. /* b8 */
  4503. { Bad_Opcode },
  4504. { Bad_Opcode },
  4505. { Bad_Opcode },
  4506. { Bad_Opcode },
  4507. { Bad_Opcode },
  4508. { Bad_Opcode },
  4509. { Bad_Opcode },
  4510. { Bad_Opcode },
  4511. /* c0 */
  4512. { Bad_Opcode },
  4513. { Bad_Opcode },
  4514. { Bad_Opcode },
  4515. { Bad_Opcode },
  4516. { Bad_Opcode },
  4517. { Bad_Opcode },
  4518. { Bad_Opcode },
  4519. { Bad_Opcode },
  4520. /* c8 */
  4521. { Bad_Opcode },
  4522. { Bad_Opcode },
  4523. { Bad_Opcode },
  4524. { Bad_Opcode },
  4525. { "sha1rnds4", { XM, EXxmm, Ib }, PREFIX_OPCODE },
  4526. { Bad_Opcode },
  4527. { "gf2p8affineqb", { XM, EXxmm, Ib }, PREFIX_DATA },
  4528. { "gf2p8affineinvqb", { XM, EXxmm, Ib }, PREFIX_DATA },
  4529. /* d0 */
  4530. { Bad_Opcode },
  4531. { Bad_Opcode },
  4532. { Bad_Opcode },
  4533. { Bad_Opcode },
  4534. { Bad_Opcode },
  4535. { Bad_Opcode },
  4536. { Bad_Opcode },
  4537. { Bad_Opcode },
  4538. /* d8 */
  4539. { Bad_Opcode },
  4540. { Bad_Opcode },
  4541. { Bad_Opcode },
  4542. { Bad_Opcode },
  4543. { Bad_Opcode },
  4544. { Bad_Opcode },
  4545. { Bad_Opcode },
  4546. { "aeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
  4547. /* e0 */
  4548. { Bad_Opcode },
  4549. { Bad_Opcode },
  4550. { Bad_Opcode },
  4551. { Bad_Opcode },
  4552. { Bad_Opcode },
  4553. { Bad_Opcode },
  4554. { Bad_Opcode },
  4555. { Bad_Opcode },
  4556. /* e8 */
  4557. { Bad_Opcode },
  4558. { Bad_Opcode },
  4559. { Bad_Opcode },
  4560. { Bad_Opcode },
  4561. { Bad_Opcode },
  4562. { Bad_Opcode },
  4563. { Bad_Opcode },
  4564. { Bad_Opcode },
  4565. /* f0 */
  4566. { PREFIX_TABLE (PREFIX_0F3A0F) },
  4567. { Bad_Opcode },
  4568. { Bad_Opcode },
  4569. { Bad_Opcode },
  4570. { Bad_Opcode },
  4571. { Bad_Opcode },
  4572. { Bad_Opcode },
  4573. { Bad_Opcode },
  4574. /* f8 */
  4575. { Bad_Opcode },
  4576. { Bad_Opcode },
  4577. { Bad_Opcode },
  4578. { Bad_Opcode },
  4579. { Bad_Opcode },
  4580. { Bad_Opcode },
  4581. { Bad_Opcode },
  4582. { Bad_Opcode },
  4583. },
  4584. };
  4585. static const struct dis386 xop_table[][256] = {
  4586. /* XOP_08 */
  4587. {
  4588. /* 00 */
  4589. { Bad_Opcode },
  4590. { Bad_Opcode },
  4591. { Bad_Opcode },
  4592. { Bad_Opcode },
  4593. { Bad_Opcode },
  4594. { Bad_Opcode },
  4595. { Bad_Opcode },
  4596. { Bad_Opcode },
  4597. /* 08 */
  4598. { Bad_Opcode },
  4599. { Bad_Opcode },
  4600. { Bad_Opcode },
  4601. { Bad_Opcode },
  4602. { Bad_Opcode },
  4603. { Bad_Opcode },
  4604. { Bad_Opcode },
  4605. { Bad_Opcode },
  4606. /* 10 */
  4607. { Bad_Opcode },
  4608. { Bad_Opcode },
  4609. { Bad_Opcode },
  4610. { Bad_Opcode },
  4611. { Bad_Opcode },
  4612. { Bad_Opcode },
  4613. { Bad_Opcode },
  4614. { Bad_Opcode },
  4615. /* 18 */
  4616. { Bad_Opcode },
  4617. { Bad_Opcode },
  4618. { Bad_Opcode },
  4619. { Bad_Opcode },
  4620. { Bad_Opcode },
  4621. { Bad_Opcode },
  4622. { Bad_Opcode },
  4623. { Bad_Opcode },
  4624. /* 20 */
  4625. { Bad_Opcode },
  4626. { Bad_Opcode },
  4627. { Bad_Opcode },
  4628. { Bad_Opcode },
  4629. { Bad_Opcode },
  4630. { Bad_Opcode },
  4631. { Bad_Opcode },
  4632. { Bad_Opcode },
  4633. /* 28 */
  4634. { Bad_Opcode },
  4635. { Bad_Opcode },
  4636. { Bad_Opcode },
  4637. { Bad_Opcode },
  4638. { Bad_Opcode },
  4639. { Bad_Opcode },
  4640. { Bad_Opcode },
  4641. { Bad_Opcode },
  4642. /* 30 */
  4643. { Bad_Opcode },
  4644. { Bad_Opcode },
  4645. { Bad_Opcode },
  4646. { Bad_Opcode },
  4647. { Bad_Opcode },
  4648. { Bad_Opcode },
  4649. { Bad_Opcode },
  4650. { Bad_Opcode },
  4651. /* 38 */
  4652. { Bad_Opcode },
  4653. { Bad_Opcode },
  4654. { Bad_Opcode },
  4655. { Bad_Opcode },
  4656. { Bad_Opcode },
  4657. { Bad_Opcode },
  4658. { Bad_Opcode },
  4659. { Bad_Opcode },
  4660. /* 40 */
  4661. { Bad_Opcode },
  4662. { Bad_Opcode },
  4663. { Bad_Opcode },
  4664. { Bad_Opcode },
  4665. { Bad_Opcode },
  4666. { Bad_Opcode },
  4667. { Bad_Opcode },
  4668. { Bad_Opcode },
  4669. /* 48 */
  4670. { Bad_Opcode },
  4671. { Bad_Opcode },
  4672. { Bad_Opcode },
  4673. { Bad_Opcode },
  4674. { Bad_Opcode },
  4675. { Bad_Opcode },
  4676. { Bad_Opcode },
  4677. { Bad_Opcode },
  4678. /* 50 */
  4679. { Bad_Opcode },
  4680. { Bad_Opcode },
  4681. { Bad_Opcode },
  4682. { Bad_Opcode },
  4683. { Bad_Opcode },
  4684. { Bad_Opcode },
  4685. { Bad_Opcode },
  4686. { Bad_Opcode },
  4687. /* 58 */
  4688. { Bad_Opcode },
  4689. { Bad_Opcode },
  4690. { Bad_Opcode },
  4691. { Bad_Opcode },
  4692. { Bad_Opcode },
  4693. { Bad_Opcode },
  4694. { Bad_Opcode },
  4695. { Bad_Opcode },
  4696. /* 60 */
  4697. { Bad_Opcode },
  4698. { Bad_Opcode },
  4699. { Bad_Opcode },
  4700. { Bad_Opcode },
  4701. { Bad_Opcode },
  4702. { Bad_Opcode },
  4703. { Bad_Opcode },
  4704. { Bad_Opcode },
  4705. /* 68 */
  4706. { Bad_Opcode },
  4707. { Bad_Opcode },
  4708. { Bad_Opcode },
  4709. { Bad_Opcode },
  4710. { Bad_Opcode },
  4711. { Bad_Opcode },
  4712. { Bad_Opcode },
  4713. { Bad_Opcode },
  4714. /* 70 */
  4715. { Bad_Opcode },
  4716. { Bad_Opcode },
  4717. { Bad_Opcode },
  4718. { Bad_Opcode },
  4719. { Bad_Opcode },
  4720. { Bad_Opcode },
  4721. { Bad_Opcode },
  4722. { Bad_Opcode },
  4723. /* 78 */
  4724. { Bad_Opcode },
  4725. { Bad_Opcode },
  4726. { Bad_Opcode },
  4727. { Bad_Opcode },
  4728. { Bad_Opcode },
  4729. { Bad_Opcode },
  4730. { Bad_Opcode },
  4731. { Bad_Opcode },
  4732. /* 80 */
  4733. { Bad_Opcode },
  4734. { Bad_Opcode },
  4735. { Bad_Opcode },
  4736. { Bad_Opcode },
  4737. { Bad_Opcode },
  4738. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_85) },
  4739. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_86) },
  4740. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_87) },
  4741. /* 88 */
  4742. { Bad_Opcode },
  4743. { Bad_Opcode },
  4744. { Bad_Opcode },
  4745. { Bad_Opcode },
  4746. { Bad_Opcode },
  4747. { Bad_Opcode },
  4748. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8E) },
  4749. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_8F) },
  4750. /* 90 */
  4751. { Bad_Opcode },
  4752. { Bad_Opcode },
  4753. { Bad_Opcode },
  4754. { Bad_Opcode },
  4755. { Bad_Opcode },
  4756. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_95) },
  4757. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_96) },
  4758. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_97) },
  4759. /* 98 */
  4760. { Bad_Opcode },
  4761. { Bad_Opcode },
  4762. { Bad_Opcode },
  4763. { Bad_Opcode },
  4764. { Bad_Opcode },
  4765. { Bad_Opcode },
  4766. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9E) },
  4767. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_9F) },
  4768. /* a0 */
  4769. { Bad_Opcode },
  4770. { Bad_Opcode },
  4771. { "vpcmov", { XM, Vex, EXx, XMVexI4 }, 0 },
  4772. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A3) },
  4773. { Bad_Opcode },
  4774. { Bad_Opcode },
  4775. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_A6) },
  4776. { Bad_Opcode },
  4777. /* a8 */
  4778. { Bad_Opcode },
  4779. { Bad_Opcode },
  4780. { Bad_Opcode },
  4781. { Bad_Opcode },
  4782. { Bad_Opcode },
  4783. { Bad_Opcode },
  4784. { Bad_Opcode },
  4785. { Bad_Opcode },
  4786. /* b0 */
  4787. { Bad_Opcode },
  4788. { Bad_Opcode },
  4789. { Bad_Opcode },
  4790. { Bad_Opcode },
  4791. { Bad_Opcode },
  4792. { Bad_Opcode },
  4793. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_B6) },
  4794. { Bad_Opcode },
  4795. /* b8 */
  4796. { Bad_Opcode },
  4797. { Bad_Opcode },
  4798. { Bad_Opcode },
  4799. { Bad_Opcode },
  4800. { Bad_Opcode },
  4801. { Bad_Opcode },
  4802. { Bad_Opcode },
  4803. { Bad_Opcode },
  4804. /* c0 */
  4805. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C0) },
  4806. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C1) },
  4807. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C2) },
  4808. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_C3) },
  4809. { Bad_Opcode },
  4810. { Bad_Opcode },
  4811. { Bad_Opcode },
  4812. { Bad_Opcode },
  4813. /* c8 */
  4814. { Bad_Opcode },
  4815. { Bad_Opcode },
  4816. { Bad_Opcode },
  4817. { Bad_Opcode },
  4818. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CC) },
  4819. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CD) },
  4820. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CE) },
  4821. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_CF) },
  4822. /* d0 */
  4823. { Bad_Opcode },
  4824. { Bad_Opcode },
  4825. { Bad_Opcode },
  4826. { Bad_Opcode },
  4827. { Bad_Opcode },
  4828. { Bad_Opcode },
  4829. { Bad_Opcode },
  4830. { Bad_Opcode },
  4831. /* d8 */
  4832. { Bad_Opcode },
  4833. { Bad_Opcode },
  4834. { Bad_Opcode },
  4835. { Bad_Opcode },
  4836. { Bad_Opcode },
  4837. { Bad_Opcode },
  4838. { Bad_Opcode },
  4839. { Bad_Opcode },
  4840. /* e0 */
  4841. { Bad_Opcode },
  4842. { Bad_Opcode },
  4843. { Bad_Opcode },
  4844. { Bad_Opcode },
  4845. { Bad_Opcode },
  4846. { Bad_Opcode },
  4847. { Bad_Opcode },
  4848. { Bad_Opcode },
  4849. /* e8 */
  4850. { Bad_Opcode },
  4851. { Bad_Opcode },
  4852. { Bad_Opcode },
  4853. { Bad_Opcode },
  4854. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EC) },
  4855. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_ED) },
  4856. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EE) },
  4857. { VEX_LEN_TABLE (VEX_LEN_0FXOP_08_EF) },
  4858. /* f0 */
  4859. { Bad_Opcode },
  4860. { Bad_Opcode },
  4861. { Bad_Opcode },
  4862. { Bad_Opcode },
  4863. { Bad_Opcode },
  4864. { Bad_Opcode },
  4865. { Bad_Opcode },
  4866. { Bad_Opcode },
  4867. /* f8 */
  4868. { Bad_Opcode },
  4869. { Bad_Opcode },
  4870. { Bad_Opcode },
  4871. { Bad_Opcode },
  4872. { Bad_Opcode },
  4873. { Bad_Opcode },
  4874. { Bad_Opcode },
  4875. { Bad_Opcode },
  4876. },
  4877. /* XOP_09 */
  4878. {
  4879. /* 00 */
  4880. { Bad_Opcode },
  4881. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_01) },
  4882. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_02) },
  4883. { Bad_Opcode },
  4884. { Bad_Opcode },
  4885. { Bad_Opcode },
  4886. { Bad_Opcode },
  4887. { Bad_Opcode },
  4888. /* 08 */
  4889. { Bad_Opcode },
  4890. { Bad_Opcode },
  4891. { Bad_Opcode },
  4892. { Bad_Opcode },
  4893. { Bad_Opcode },
  4894. { Bad_Opcode },
  4895. { Bad_Opcode },
  4896. { Bad_Opcode },
  4897. /* 10 */
  4898. { Bad_Opcode },
  4899. { Bad_Opcode },
  4900. { MOD_TABLE (MOD_XOP_09_12) },
  4901. { Bad_Opcode },
  4902. { Bad_Opcode },
  4903. { Bad_Opcode },
  4904. { Bad_Opcode },
  4905. { Bad_Opcode },
  4906. /* 18 */
  4907. { Bad_Opcode },
  4908. { Bad_Opcode },
  4909. { Bad_Opcode },
  4910. { Bad_Opcode },
  4911. { Bad_Opcode },
  4912. { Bad_Opcode },
  4913. { Bad_Opcode },
  4914. { Bad_Opcode },
  4915. /* 20 */
  4916. { Bad_Opcode },
  4917. { Bad_Opcode },
  4918. { Bad_Opcode },
  4919. { Bad_Opcode },
  4920. { Bad_Opcode },
  4921. { Bad_Opcode },
  4922. { Bad_Opcode },
  4923. { Bad_Opcode },
  4924. /* 28 */
  4925. { Bad_Opcode },
  4926. { Bad_Opcode },
  4927. { Bad_Opcode },
  4928. { Bad_Opcode },
  4929. { Bad_Opcode },
  4930. { Bad_Opcode },
  4931. { Bad_Opcode },
  4932. { Bad_Opcode },
  4933. /* 30 */
  4934. { Bad_Opcode },
  4935. { Bad_Opcode },
  4936. { Bad_Opcode },
  4937. { Bad_Opcode },
  4938. { Bad_Opcode },
  4939. { Bad_Opcode },
  4940. { Bad_Opcode },
  4941. { Bad_Opcode },
  4942. /* 38 */
  4943. { Bad_Opcode },
  4944. { Bad_Opcode },
  4945. { Bad_Opcode },
  4946. { Bad_Opcode },
  4947. { Bad_Opcode },
  4948. { Bad_Opcode },
  4949. { Bad_Opcode },
  4950. { Bad_Opcode },
  4951. /* 40 */
  4952. { Bad_Opcode },
  4953. { Bad_Opcode },
  4954. { Bad_Opcode },
  4955. { Bad_Opcode },
  4956. { Bad_Opcode },
  4957. { Bad_Opcode },
  4958. { Bad_Opcode },
  4959. { Bad_Opcode },
  4960. /* 48 */
  4961. { Bad_Opcode },
  4962. { Bad_Opcode },
  4963. { Bad_Opcode },
  4964. { Bad_Opcode },
  4965. { Bad_Opcode },
  4966. { Bad_Opcode },
  4967. { Bad_Opcode },
  4968. { Bad_Opcode },
  4969. /* 50 */
  4970. { Bad_Opcode },
  4971. { Bad_Opcode },
  4972. { Bad_Opcode },
  4973. { Bad_Opcode },
  4974. { Bad_Opcode },
  4975. { Bad_Opcode },
  4976. { Bad_Opcode },
  4977. { Bad_Opcode },
  4978. /* 58 */
  4979. { Bad_Opcode },
  4980. { Bad_Opcode },
  4981. { Bad_Opcode },
  4982. { Bad_Opcode },
  4983. { Bad_Opcode },
  4984. { Bad_Opcode },
  4985. { Bad_Opcode },
  4986. { Bad_Opcode },
  4987. /* 60 */
  4988. { Bad_Opcode },
  4989. { Bad_Opcode },
  4990. { Bad_Opcode },
  4991. { Bad_Opcode },
  4992. { Bad_Opcode },
  4993. { Bad_Opcode },
  4994. { Bad_Opcode },
  4995. { Bad_Opcode },
  4996. /* 68 */
  4997. { Bad_Opcode },
  4998. { Bad_Opcode },
  4999. { Bad_Opcode },
  5000. { Bad_Opcode },
  5001. { Bad_Opcode },
  5002. { Bad_Opcode },
  5003. { Bad_Opcode },
  5004. { Bad_Opcode },
  5005. /* 70 */
  5006. { Bad_Opcode },
  5007. { Bad_Opcode },
  5008. { Bad_Opcode },
  5009. { Bad_Opcode },
  5010. { Bad_Opcode },
  5011. { Bad_Opcode },
  5012. { Bad_Opcode },
  5013. { Bad_Opcode },
  5014. /* 78 */
  5015. { Bad_Opcode },
  5016. { Bad_Opcode },
  5017. { Bad_Opcode },
  5018. { Bad_Opcode },
  5019. { Bad_Opcode },
  5020. { Bad_Opcode },
  5021. { Bad_Opcode },
  5022. { Bad_Opcode },
  5023. /* 80 */
  5024. { VEX_W_TABLE (VEX_W_0FXOP_09_80) },
  5025. { VEX_W_TABLE (VEX_W_0FXOP_09_81) },
  5026. { VEX_W_TABLE (VEX_W_0FXOP_09_82) },
  5027. { VEX_W_TABLE (VEX_W_0FXOP_09_83) },
  5028. { Bad_Opcode },
  5029. { Bad_Opcode },
  5030. { Bad_Opcode },
  5031. { Bad_Opcode },
  5032. /* 88 */
  5033. { Bad_Opcode },
  5034. { Bad_Opcode },
  5035. { Bad_Opcode },
  5036. { Bad_Opcode },
  5037. { Bad_Opcode },
  5038. { Bad_Opcode },
  5039. { Bad_Opcode },
  5040. { Bad_Opcode },
  5041. /* 90 */
  5042. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_90) },
  5043. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_91) },
  5044. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_92) },
  5045. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_93) },
  5046. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_94) },
  5047. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_95) },
  5048. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_96) },
  5049. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_97) },
  5050. /* 98 */
  5051. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_98) },
  5052. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_99) },
  5053. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9A) },
  5054. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_9B) },
  5055. { Bad_Opcode },
  5056. { Bad_Opcode },
  5057. { Bad_Opcode },
  5058. { Bad_Opcode },
  5059. /* a0 */
  5060. { Bad_Opcode },
  5061. { Bad_Opcode },
  5062. { Bad_Opcode },
  5063. { Bad_Opcode },
  5064. { Bad_Opcode },
  5065. { Bad_Opcode },
  5066. { Bad_Opcode },
  5067. { Bad_Opcode },
  5068. /* a8 */
  5069. { Bad_Opcode },
  5070. { Bad_Opcode },
  5071. { Bad_Opcode },
  5072. { Bad_Opcode },
  5073. { Bad_Opcode },
  5074. { Bad_Opcode },
  5075. { Bad_Opcode },
  5076. { Bad_Opcode },
  5077. /* b0 */
  5078. { Bad_Opcode },
  5079. { Bad_Opcode },
  5080. { Bad_Opcode },
  5081. { Bad_Opcode },
  5082. { Bad_Opcode },
  5083. { Bad_Opcode },
  5084. { Bad_Opcode },
  5085. { Bad_Opcode },
  5086. /* b8 */
  5087. { Bad_Opcode },
  5088. { Bad_Opcode },
  5089. { Bad_Opcode },
  5090. { Bad_Opcode },
  5091. { Bad_Opcode },
  5092. { Bad_Opcode },
  5093. { Bad_Opcode },
  5094. { Bad_Opcode },
  5095. /* c0 */
  5096. { Bad_Opcode },
  5097. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C1) },
  5098. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C2) },
  5099. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C3) },
  5100. { Bad_Opcode },
  5101. { Bad_Opcode },
  5102. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C6) },
  5103. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_C7) },
  5104. /* c8 */
  5105. { Bad_Opcode },
  5106. { Bad_Opcode },
  5107. { Bad_Opcode },
  5108. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_CB) },
  5109. { Bad_Opcode },
  5110. { Bad_Opcode },
  5111. { Bad_Opcode },
  5112. { Bad_Opcode },
  5113. /* d0 */
  5114. { Bad_Opcode },
  5115. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D1) },
  5116. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D2) },
  5117. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D3) },
  5118. { Bad_Opcode },
  5119. { Bad_Opcode },
  5120. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D6) },
  5121. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_D7) },
  5122. /* d8 */
  5123. { Bad_Opcode },
  5124. { Bad_Opcode },
  5125. { Bad_Opcode },
  5126. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_DB) },
  5127. { Bad_Opcode },
  5128. { Bad_Opcode },
  5129. { Bad_Opcode },
  5130. { Bad_Opcode },
  5131. /* e0 */
  5132. { Bad_Opcode },
  5133. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E1) },
  5134. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E2) },
  5135. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_E3) },
  5136. { Bad_Opcode },
  5137. { Bad_Opcode },
  5138. { Bad_Opcode },
  5139. { Bad_Opcode },
  5140. /* e8 */
  5141. { Bad_Opcode },
  5142. { Bad_Opcode },
  5143. { Bad_Opcode },
  5144. { Bad_Opcode },
  5145. { Bad_Opcode },
  5146. { Bad_Opcode },
  5147. { Bad_Opcode },
  5148. { Bad_Opcode },
  5149. /* f0 */
  5150. { Bad_Opcode },
  5151. { Bad_Opcode },
  5152. { Bad_Opcode },
  5153. { Bad_Opcode },
  5154. { Bad_Opcode },
  5155. { Bad_Opcode },
  5156. { Bad_Opcode },
  5157. { Bad_Opcode },
  5158. /* f8 */
  5159. { Bad_Opcode },
  5160. { Bad_Opcode },
  5161. { Bad_Opcode },
  5162. { Bad_Opcode },
  5163. { Bad_Opcode },
  5164. { Bad_Opcode },
  5165. { Bad_Opcode },
  5166. { Bad_Opcode },
  5167. },
  5168. /* XOP_0A */
  5169. {
  5170. /* 00 */
  5171. { Bad_Opcode },
  5172. { Bad_Opcode },
  5173. { Bad_Opcode },
  5174. { Bad_Opcode },
  5175. { Bad_Opcode },
  5176. { Bad_Opcode },
  5177. { Bad_Opcode },
  5178. { Bad_Opcode },
  5179. /* 08 */
  5180. { Bad_Opcode },
  5181. { Bad_Opcode },
  5182. { Bad_Opcode },
  5183. { Bad_Opcode },
  5184. { Bad_Opcode },
  5185. { Bad_Opcode },
  5186. { Bad_Opcode },
  5187. { Bad_Opcode },
  5188. /* 10 */
  5189. { "bextrS", { Gdq, Edq, Id }, 0 },
  5190. { Bad_Opcode },
  5191. { VEX_LEN_TABLE (VEX_LEN_0FXOP_0A_12) },
  5192. { Bad_Opcode },
  5193. { Bad_Opcode },
  5194. { Bad_Opcode },
  5195. { Bad_Opcode },
  5196. { Bad_Opcode },
  5197. /* 18 */
  5198. { Bad_Opcode },
  5199. { Bad_Opcode },
  5200. { Bad_Opcode },
  5201. { Bad_Opcode },
  5202. { Bad_Opcode },
  5203. { Bad_Opcode },
  5204. { Bad_Opcode },
  5205. { Bad_Opcode },
  5206. /* 20 */
  5207. { Bad_Opcode },
  5208. { Bad_Opcode },
  5209. { Bad_Opcode },
  5210. { Bad_Opcode },
  5211. { Bad_Opcode },
  5212. { Bad_Opcode },
  5213. { Bad_Opcode },
  5214. { Bad_Opcode },
  5215. /* 28 */
  5216. { Bad_Opcode },
  5217. { Bad_Opcode },
  5218. { Bad_Opcode },
  5219. { Bad_Opcode },
  5220. { Bad_Opcode },
  5221. { Bad_Opcode },
  5222. { Bad_Opcode },
  5223. { Bad_Opcode },
  5224. /* 30 */
  5225. { Bad_Opcode },
  5226. { Bad_Opcode },
  5227. { Bad_Opcode },
  5228. { Bad_Opcode },
  5229. { Bad_Opcode },
  5230. { Bad_Opcode },
  5231. { Bad_Opcode },
  5232. { Bad_Opcode },
  5233. /* 38 */
  5234. { Bad_Opcode },
  5235. { Bad_Opcode },
  5236. { Bad_Opcode },
  5237. { Bad_Opcode },
  5238. { Bad_Opcode },
  5239. { Bad_Opcode },
  5240. { Bad_Opcode },
  5241. { Bad_Opcode },
  5242. /* 40 */
  5243. { Bad_Opcode },
  5244. { Bad_Opcode },
  5245. { Bad_Opcode },
  5246. { Bad_Opcode },
  5247. { Bad_Opcode },
  5248. { Bad_Opcode },
  5249. { Bad_Opcode },
  5250. { Bad_Opcode },
  5251. /* 48 */
  5252. { Bad_Opcode },
  5253. { Bad_Opcode },
  5254. { Bad_Opcode },
  5255. { Bad_Opcode },
  5256. { Bad_Opcode },
  5257. { Bad_Opcode },
  5258. { Bad_Opcode },
  5259. { Bad_Opcode },
  5260. /* 50 */
  5261. { Bad_Opcode },
  5262. { Bad_Opcode },
  5263. { Bad_Opcode },
  5264. { Bad_Opcode },
  5265. { Bad_Opcode },
  5266. { Bad_Opcode },
  5267. { Bad_Opcode },
  5268. { Bad_Opcode },
  5269. /* 58 */
  5270. { Bad_Opcode },
  5271. { Bad_Opcode },
  5272. { Bad_Opcode },
  5273. { Bad_Opcode },
  5274. { Bad_Opcode },
  5275. { Bad_Opcode },
  5276. { Bad_Opcode },
  5277. { Bad_Opcode },
  5278. /* 60 */
  5279. { Bad_Opcode },
  5280. { Bad_Opcode },
  5281. { Bad_Opcode },
  5282. { Bad_Opcode },
  5283. { Bad_Opcode },
  5284. { Bad_Opcode },
  5285. { Bad_Opcode },
  5286. { Bad_Opcode },
  5287. /* 68 */
  5288. { Bad_Opcode },
  5289. { Bad_Opcode },
  5290. { Bad_Opcode },
  5291. { Bad_Opcode },
  5292. { Bad_Opcode },
  5293. { Bad_Opcode },
  5294. { Bad_Opcode },
  5295. { Bad_Opcode },
  5296. /* 70 */
  5297. { Bad_Opcode },
  5298. { Bad_Opcode },
  5299. { Bad_Opcode },
  5300. { Bad_Opcode },
  5301. { Bad_Opcode },
  5302. { Bad_Opcode },
  5303. { Bad_Opcode },
  5304. { Bad_Opcode },
  5305. /* 78 */
  5306. { Bad_Opcode },
  5307. { Bad_Opcode },
  5308. { Bad_Opcode },
  5309. { Bad_Opcode },
  5310. { Bad_Opcode },
  5311. { Bad_Opcode },
  5312. { Bad_Opcode },
  5313. { Bad_Opcode },
  5314. /* 80 */
  5315. { Bad_Opcode },
  5316. { Bad_Opcode },
  5317. { Bad_Opcode },
  5318. { Bad_Opcode },
  5319. { Bad_Opcode },
  5320. { Bad_Opcode },
  5321. { Bad_Opcode },
  5322. { Bad_Opcode },
  5323. /* 88 */
  5324. { Bad_Opcode },
  5325. { Bad_Opcode },
  5326. { Bad_Opcode },
  5327. { Bad_Opcode },
  5328. { Bad_Opcode },
  5329. { Bad_Opcode },
  5330. { Bad_Opcode },
  5331. { Bad_Opcode },
  5332. /* 90 */
  5333. { Bad_Opcode },
  5334. { Bad_Opcode },
  5335. { Bad_Opcode },
  5336. { Bad_Opcode },
  5337. { Bad_Opcode },
  5338. { Bad_Opcode },
  5339. { Bad_Opcode },
  5340. { Bad_Opcode },
  5341. /* 98 */
  5342. { Bad_Opcode },
  5343. { Bad_Opcode },
  5344. { Bad_Opcode },
  5345. { Bad_Opcode },
  5346. { Bad_Opcode },
  5347. { Bad_Opcode },
  5348. { Bad_Opcode },
  5349. { Bad_Opcode },
  5350. /* a0 */
  5351. { Bad_Opcode },
  5352. { Bad_Opcode },
  5353. { Bad_Opcode },
  5354. { Bad_Opcode },
  5355. { Bad_Opcode },
  5356. { Bad_Opcode },
  5357. { Bad_Opcode },
  5358. { Bad_Opcode },
  5359. /* a8 */
  5360. { Bad_Opcode },
  5361. { Bad_Opcode },
  5362. { Bad_Opcode },
  5363. { Bad_Opcode },
  5364. { Bad_Opcode },
  5365. { Bad_Opcode },
  5366. { Bad_Opcode },
  5367. { Bad_Opcode },
  5368. /* b0 */
  5369. { Bad_Opcode },
  5370. { Bad_Opcode },
  5371. { Bad_Opcode },
  5372. { Bad_Opcode },
  5373. { Bad_Opcode },
  5374. { Bad_Opcode },
  5375. { Bad_Opcode },
  5376. { Bad_Opcode },
  5377. /* b8 */
  5378. { Bad_Opcode },
  5379. { Bad_Opcode },
  5380. { Bad_Opcode },
  5381. { Bad_Opcode },
  5382. { Bad_Opcode },
  5383. { Bad_Opcode },
  5384. { Bad_Opcode },
  5385. { Bad_Opcode },
  5386. /* c0 */
  5387. { Bad_Opcode },
  5388. { Bad_Opcode },
  5389. { Bad_Opcode },
  5390. { Bad_Opcode },
  5391. { Bad_Opcode },
  5392. { Bad_Opcode },
  5393. { Bad_Opcode },
  5394. { Bad_Opcode },
  5395. /* c8 */
  5396. { Bad_Opcode },
  5397. { Bad_Opcode },
  5398. { Bad_Opcode },
  5399. { Bad_Opcode },
  5400. { Bad_Opcode },
  5401. { Bad_Opcode },
  5402. { Bad_Opcode },
  5403. { Bad_Opcode },
  5404. /* d0 */
  5405. { Bad_Opcode },
  5406. { Bad_Opcode },
  5407. { Bad_Opcode },
  5408. { Bad_Opcode },
  5409. { Bad_Opcode },
  5410. { Bad_Opcode },
  5411. { Bad_Opcode },
  5412. { Bad_Opcode },
  5413. /* d8 */
  5414. { Bad_Opcode },
  5415. { Bad_Opcode },
  5416. { Bad_Opcode },
  5417. { Bad_Opcode },
  5418. { Bad_Opcode },
  5419. { Bad_Opcode },
  5420. { Bad_Opcode },
  5421. { Bad_Opcode },
  5422. /* e0 */
  5423. { Bad_Opcode },
  5424. { Bad_Opcode },
  5425. { Bad_Opcode },
  5426. { Bad_Opcode },
  5427. { Bad_Opcode },
  5428. { Bad_Opcode },
  5429. { Bad_Opcode },
  5430. { Bad_Opcode },
  5431. /* e8 */
  5432. { Bad_Opcode },
  5433. { Bad_Opcode },
  5434. { Bad_Opcode },
  5435. { Bad_Opcode },
  5436. { Bad_Opcode },
  5437. { Bad_Opcode },
  5438. { Bad_Opcode },
  5439. { Bad_Opcode },
  5440. /* f0 */
  5441. { Bad_Opcode },
  5442. { Bad_Opcode },
  5443. { Bad_Opcode },
  5444. { Bad_Opcode },
  5445. { Bad_Opcode },
  5446. { Bad_Opcode },
  5447. { Bad_Opcode },
  5448. { Bad_Opcode },
  5449. /* f8 */
  5450. { Bad_Opcode },
  5451. { Bad_Opcode },
  5452. { Bad_Opcode },
  5453. { Bad_Opcode },
  5454. { Bad_Opcode },
  5455. { Bad_Opcode },
  5456. { Bad_Opcode },
  5457. { Bad_Opcode },
  5458. },
  5459. };
  5460. static const struct dis386 vex_table[][256] = {
  5461. /* VEX_0F */
  5462. {
  5463. /* 00 */
  5464. { Bad_Opcode },
  5465. { Bad_Opcode },
  5466. { Bad_Opcode },
  5467. { Bad_Opcode },
  5468. { Bad_Opcode },
  5469. { Bad_Opcode },
  5470. { Bad_Opcode },
  5471. { Bad_Opcode },
  5472. /* 08 */
  5473. { Bad_Opcode },
  5474. { Bad_Opcode },
  5475. { Bad_Opcode },
  5476. { Bad_Opcode },
  5477. { Bad_Opcode },
  5478. { Bad_Opcode },
  5479. { Bad_Opcode },
  5480. { Bad_Opcode },
  5481. /* 10 */
  5482. { PREFIX_TABLE (PREFIX_VEX_0F10) },
  5483. { PREFIX_TABLE (PREFIX_VEX_0F11) },
  5484. { PREFIX_TABLE (PREFIX_VEX_0F12) },
  5485. { MOD_TABLE (MOD_VEX_0F13) },
  5486. { "vunpcklpX", { XM, Vex, EXx }, PREFIX_OPCODE },
  5487. { "vunpckhpX", { XM, Vex, EXx }, PREFIX_OPCODE },
  5488. { PREFIX_TABLE (PREFIX_VEX_0F16) },
  5489. { MOD_TABLE (MOD_VEX_0F17) },
  5490. /* 18 */
  5491. { Bad_Opcode },
  5492. { Bad_Opcode },
  5493. { Bad_Opcode },
  5494. { Bad_Opcode },
  5495. { Bad_Opcode },
  5496. { Bad_Opcode },
  5497. { Bad_Opcode },
  5498. { Bad_Opcode },
  5499. /* 20 */
  5500. { Bad_Opcode },
  5501. { Bad_Opcode },
  5502. { Bad_Opcode },
  5503. { Bad_Opcode },
  5504. { Bad_Opcode },
  5505. { Bad_Opcode },
  5506. { Bad_Opcode },
  5507. { Bad_Opcode },
  5508. /* 28 */
  5509. { "vmovapX", { XM, EXx }, PREFIX_OPCODE },
  5510. { "vmovapX", { EXxS, XM }, PREFIX_OPCODE },
  5511. { PREFIX_TABLE (PREFIX_VEX_0F2A) },
  5512. { MOD_TABLE (MOD_VEX_0F2B) },
  5513. { PREFIX_TABLE (PREFIX_VEX_0F2C) },
  5514. { PREFIX_TABLE (PREFIX_VEX_0F2D) },
  5515. { PREFIX_TABLE (PREFIX_VEX_0F2E) },
  5516. { PREFIX_TABLE (PREFIX_VEX_0F2F) },
  5517. /* 30 */
  5518. { Bad_Opcode },
  5519. { Bad_Opcode },
  5520. { Bad_Opcode },
  5521. { Bad_Opcode },
  5522. { Bad_Opcode },
  5523. { Bad_Opcode },
  5524. { Bad_Opcode },
  5525. { Bad_Opcode },
  5526. /* 38 */
  5527. { Bad_Opcode },
  5528. { Bad_Opcode },
  5529. { Bad_Opcode },
  5530. { Bad_Opcode },
  5531. { Bad_Opcode },
  5532. { Bad_Opcode },
  5533. { Bad_Opcode },
  5534. { Bad_Opcode },
  5535. /* 40 */
  5536. { Bad_Opcode },
  5537. { VEX_LEN_TABLE (VEX_LEN_0F41) },
  5538. { VEX_LEN_TABLE (VEX_LEN_0F42) },
  5539. { Bad_Opcode },
  5540. { VEX_LEN_TABLE (VEX_LEN_0F44) },
  5541. { VEX_LEN_TABLE (VEX_LEN_0F45) },
  5542. { VEX_LEN_TABLE (VEX_LEN_0F46) },
  5543. { VEX_LEN_TABLE (VEX_LEN_0F47) },
  5544. /* 48 */
  5545. { Bad_Opcode },
  5546. { Bad_Opcode },
  5547. { VEX_LEN_TABLE (VEX_LEN_0F4A) },
  5548. { VEX_LEN_TABLE (VEX_LEN_0F4B) },
  5549. { Bad_Opcode },
  5550. { Bad_Opcode },
  5551. { Bad_Opcode },
  5552. { Bad_Opcode },
  5553. /* 50 */
  5554. { MOD_TABLE (MOD_VEX_0F50) },
  5555. { PREFIX_TABLE (PREFIX_VEX_0F51) },
  5556. { PREFIX_TABLE (PREFIX_VEX_0F52) },
  5557. { PREFIX_TABLE (PREFIX_VEX_0F53) },
  5558. { "vandpX", { XM, Vex, EXx }, PREFIX_OPCODE },
  5559. { "vandnpX", { XM, Vex, EXx }, PREFIX_OPCODE },
  5560. { "vorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
  5561. { "vxorpX", { XM, Vex, EXx }, PREFIX_OPCODE },
  5562. /* 58 */
  5563. { PREFIX_TABLE (PREFIX_VEX_0F58) },
  5564. { PREFIX_TABLE (PREFIX_VEX_0F59) },
  5565. { PREFIX_TABLE (PREFIX_VEX_0F5A) },
  5566. { PREFIX_TABLE (PREFIX_VEX_0F5B) },
  5567. { PREFIX_TABLE (PREFIX_VEX_0F5C) },
  5568. { PREFIX_TABLE (PREFIX_VEX_0F5D) },
  5569. { PREFIX_TABLE (PREFIX_VEX_0F5E) },
  5570. { PREFIX_TABLE (PREFIX_VEX_0F5F) },
  5571. /* 60 */
  5572. { "vpunpcklbw", { XM, Vex, EXx }, PREFIX_DATA },
  5573. { "vpunpcklwd", { XM, Vex, EXx }, PREFIX_DATA },
  5574. { "vpunpckldq", { XM, Vex, EXx }, PREFIX_DATA },
  5575. { "vpacksswb", { XM, Vex, EXx }, PREFIX_DATA },
  5576. { "vpcmpgtb", { XM, Vex, EXx }, PREFIX_DATA },
  5577. { "vpcmpgtw", { XM, Vex, EXx }, PREFIX_DATA },
  5578. { "vpcmpgtd", { XM, Vex, EXx }, PREFIX_DATA },
  5579. { "vpackuswb", { XM, Vex, EXx }, PREFIX_DATA },
  5580. /* 68 */
  5581. { "vpunpckhbw", { XM, Vex, EXx }, PREFIX_DATA },
  5582. { "vpunpckhwd", { XM, Vex, EXx }, PREFIX_DATA },
  5583. { "vpunpckhdq", { XM, Vex, EXx }, PREFIX_DATA },
  5584. { "vpackssdw", { XM, Vex, EXx }, PREFIX_DATA },
  5585. { "vpunpcklqdq", { XM, Vex, EXx }, PREFIX_DATA },
  5586. { "vpunpckhqdq", { XM, Vex, EXx }, PREFIX_DATA },
  5587. { VEX_LEN_TABLE (VEX_LEN_0F6E) },
  5588. { PREFIX_TABLE (PREFIX_VEX_0F6F) },
  5589. /* 70 */
  5590. { PREFIX_TABLE (PREFIX_VEX_0F70) },
  5591. { MOD_TABLE (MOD_VEX_0F71) },
  5592. { MOD_TABLE (MOD_VEX_0F72) },
  5593. { MOD_TABLE (MOD_VEX_0F73) },
  5594. { "vpcmpeqb", { XM, Vex, EXx }, PREFIX_DATA },
  5595. { "vpcmpeqw", { XM, Vex, EXx }, PREFIX_DATA },
  5596. { "vpcmpeqd", { XM, Vex, EXx }, PREFIX_DATA },
  5597. { VEX_LEN_TABLE (VEX_LEN_0F77) },
  5598. /* 78 */
  5599. { Bad_Opcode },
  5600. { Bad_Opcode },
  5601. { Bad_Opcode },
  5602. { Bad_Opcode },
  5603. { PREFIX_TABLE (PREFIX_VEX_0F7C) },
  5604. { PREFIX_TABLE (PREFIX_VEX_0F7D) },
  5605. { PREFIX_TABLE (PREFIX_VEX_0F7E) },
  5606. { PREFIX_TABLE (PREFIX_VEX_0F7F) },
  5607. /* 80 */
  5608. { Bad_Opcode },
  5609. { Bad_Opcode },
  5610. { Bad_Opcode },
  5611. { Bad_Opcode },
  5612. { Bad_Opcode },
  5613. { Bad_Opcode },
  5614. { Bad_Opcode },
  5615. { Bad_Opcode },
  5616. /* 88 */
  5617. { Bad_Opcode },
  5618. { Bad_Opcode },
  5619. { Bad_Opcode },
  5620. { Bad_Opcode },
  5621. { Bad_Opcode },
  5622. { Bad_Opcode },
  5623. { Bad_Opcode },
  5624. { Bad_Opcode },
  5625. /* 90 */
  5626. { VEX_LEN_TABLE (VEX_LEN_0F90) },
  5627. { VEX_LEN_TABLE (VEX_LEN_0F91) },
  5628. { VEX_LEN_TABLE (VEX_LEN_0F92) },
  5629. { VEX_LEN_TABLE (VEX_LEN_0F93) },
  5630. { Bad_Opcode },
  5631. { Bad_Opcode },
  5632. { Bad_Opcode },
  5633. { Bad_Opcode },
  5634. /* 98 */
  5635. { VEX_LEN_TABLE (VEX_LEN_0F98) },
  5636. { VEX_LEN_TABLE (VEX_LEN_0F99) },
  5637. { Bad_Opcode },
  5638. { Bad_Opcode },
  5639. { Bad_Opcode },
  5640. { Bad_Opcode },
  5641. { Bad_Opcode },
  5642. { Bad_Opcode },
  5643. /* a0 */
  5644. { Bad_Opcode },
  5645. { Bad_Opcode },
  5646. { Bad_Opcode },
  5647. { Bad_Opcode },
  5648. { Bad_Opcode },
  5649. { Bad_Opcode },
  5650. { Bad_Opcode },
  5651. { Bad_Opcode },
  5652. /* a8 */
  5653. { Bad_Opcode },
  5654. { Bad_Opcode },
  5655. { Bad_Opcode },
  5656. { Bad_Opcode },
  5657. { Bad_Opcode },
  5658. { Bad_Opcode },
  5659. { REG_TABLE (REG_VEX_0FAE) },
  5660. { Bad_Opcode },
  5661. /* b0 */
  5662. { Bad_Opcode },
  5663. { Bad_Opcode },
  5664. { Bad_Opcode },
  5665. { Bad_Opcode },
  5666. { Bad_Opcode },
  5667. { Bad_Opcode },
  5668. { Bad_Opcode },
  5669. { Bad_Opcode },
  5670. /* b8 */
  5671. { Bad_Opcode },
  5672. { Bad_Opcode },
  5673. { Bad_Opcode },
  5674. { Bad_Opcode },
  5675. { Bad_Opcode },
  5676. { Bad_Opcode },
  5677. { Bad_Opcode },
  5678. { Bad_Opcode },
  5679. /* c0 */
  5680. { Bad_Opcode },
  5681. { Bad_Opcode },
  5682. { PREFIX_TABLE (PREFIX_VEX_0FC2) },
  5683. { Bad_Opcode },
  5684. { VEX_LEN_TABLE (VEX_LEN_0FC4) },
  5685. { VEX_LEN_TABLE (VEX_LEN_0FC5) },
  5686. { "vshufpX", { XM, Vex, EXx, Ib }, PREFIX_OPCODE },
  5687. { Bad_Opcode },
  5688. /* c8 */
  5689. { Bad_Opcode },
  5690. { Bad_Opcode },
  5691. { Bad_Opcode },
  5692. { Bad_Opcode },
  5693. { Bad_Opcode },
  5694. { Bad_Opcode },
  5695. { Bad_Opcode },
  5696. { Bad_Opcode },
  5697. /* d0 */
  5698. { PREFIX_TABLE (PREFIX_VEX_0FD0) },
  5699. { "vpsrlw", { XM, Vex, EXxmm }, PREFIX_DATA },
  5700. { "vpsrld", { XM, Vex, EXxmm }, PREFIX_DATA },
  5701. { "vpsrlq", { XM, Vex, EXxmm }, PREFIX_DATA },
  5702. { "vpaddq", { XM, Vex, EXx }, PREFIX_DATA },
  5703. { "vpmullw", { XM, Vex, EXx }, PREFIX_DATA },
  5704. { VEX_LEN_TABLE (VEX_LEN_0FD6) },
  5705. { MOD_TABLE (MOD_VEX_0FD7) },
  5706. /* d8 */
  5707. { "vpsubusb", { XM, Vex, EXx }, PREFIX_DATA },
  5708. { "vpsubusw", { XM, Vex, EXx }, PREFIX_DATA },
  5709. { "vpminub", { XM, Vex, EXx }, PREFIX_DATA },
  5710. { "vpand", { XM, Vex, EXx }, PREFIX_DATA },
  5711. { "vpaddusb", { XM, Vex, EXx }, PREFIX_DATA },
  5712. { "vpaddusw", { XM, Vex, EXx }, PREFIX_DATA },
  5713. { "vpmaxub", { XM, Vex, EXx }, PREFIX_DATA },
  5714. { "vpandn", { XM, Vex, EXx }, PREFIX_DATA },
  5715. /* e0 */
  5716. { "vpavgb", { XM, Vex, EXx }, PREFIX_DATA },
  5717. { "vpsraw", { XM, Vex, EXxmm }, PREFIX_DATA },
  5718. { "vpsrad", { XM, Vex, EXxmm }, PREFIX_DATA },
  5719. { "vpavgw", { XM, Vex, EXx }, PREFIX_DATA },
  5720. { "vpmulhuw", { XM, Vex, EXx }, PREFIX_DATA },
  5721. { "vpmulhw", { XM, Vex, EXx }, PREFIX_DATA },
  5722. { PREFIX_TABLE (PREFIX_VEX_0FE6) },
  5723. { MOD_TABLE (MOD_VEX_0FE7) },
  5724. /* e8 */
  5725. { "vpsubsb", { XM, Vex, EXx }, PREFIX_DATA },
  5726. { "vpsubsw", { XM, Vex, EXx }, PREFIX_DATA },
  5727. { "vpminsw", { XM, Vex, EXx }, PREFIX_DATA },
  5728. { "vpor", { XM, Vex, EXx }, PREFIX_DATA },
  5729. { "vpaddsb", { XM, Vex, EXx }, PREFIX_DATA },
  5730. { "vpaddsw", { XM, Vex, EXx }, PREFIX_DATA },
  5731. { "vpmaxsw", { XM, Vex, EXx }, PREFIX_DATA },
  5732. { "vpxor", { XM, Vex, EXx }, PREFIX_DATA },
  5733. /* f0 */
  5734. { PREFIX_TABLE (PREFIX_VEX_0FF0) },
  5735. { "vpsllw", { XM, Vex, EXxmm }, PREFIX_DATA },
  5736. { "vpslld", { XM, Vex, EXxmm }, PREFIX_DATA },
  5737. { "vpsllq", { XM, Vex, EXxmm }, PREFIX_DATA },
  5738. { "vpmuludq", { XM, Vex, EXx }, PREFIX_DATA },
  5739. { "vpmaddwd", { XM, Vex, EXx }, PREFIX_DATA },
  5740. { "vpsadbw", { XM, Vex, EXx }, PREFIX_DATA },
  5741. { VEX_LEN_TABLE (VEX_LEN_0FF7) },
  5742. /* f8 */
  5743. { "vpsubb", { XM, Vex, EXx }, PREFIX_DATA },
  5744. { "vpsubw", { XM, Vex, EXx }, PREFIX_DATA },
  5745. { "vpsubd", { XM, Vex, EXx }, PREFIX_DATA },
  5746. { "vpsubq", { XM, Vex, EXx }, PREFIX_DATA },
  5747. { "vpaddb", { XM, Vex, EXx }, PREFIX_DATA },
  5748. { "vpaddw", { XM, Vex, EXx }, PREFIX_DATA },
  5749. { "vpaddd", { XM, Vex, EXx }, PREFIX_DATA },
  5750. { Bad_Opcode },
  5751. },
  5752. /* VEX_0F38 */
  5753. {
  5754. /* 00 */
  5755. { "vpshufb", { XM, Vex, EXx }, PREFIX_DATA },
  5756. { "vphaddw", { XM, Vex, EXx }, PREFIX_DATA },
  5757. { "vphaddd", { XM, Vex, EXx }, PREFIX_DATA },
  5758. { "vphaddsw", { XM, Vex, EXx }, PREFIX_DATA },
  5759. { "vpmaddubsw", { XM, Vex, EXx }, PREFIX_DATA },
  5760. { "vphsubw", { XM, Vex, EXx }, PREFIX_DATA },
  5761. { "vphsubd", { XM, Vex, EXx }, PREFIX_DATA },
  5762. { "vphsubsw", { XM, Vex, EXx }, PREFIX_DATA },
  5763. /* 08 */
  5764. { "vpsignb", { XM, Vex, EXx }, PREFIX_DATA },
  5765. { "vpsignw", { XM, Vex, EXx }, PREFIX_DATA },
  5766. { "vpsignd", { XM, Vex, EXx }, PREFIX_DATA },
  5767. { "vpmulhrsw", { XM, Vex, EXx }, PREFIX_DATA },
  5768. { VEX_W_TABLE (VEX_W_0F380C) },
  5769. { VEX_W_TABLE (VEX_W_0F380D) },
  5770. { VEX_W_TABLE (VEX_W_0F380E) },
  5771. { VEX_W_TABLE (VEX_W_0F380F) },
  5772. /* 10 */
  5773. { Bad_Opcode },
  5774. { Bad_Opcode },
  5775. { Bad_Opcode },
  5776. { VEX_W_TABLE (VEX_W_0F3813) },
  5777. { Bad_Opcode },
  5778. { Bad_Opcode },
  5779. { VEX_LEN_TABLE (VEX_LEN_0F3816) },
  5780. { "vptest", { XM, EXx }, PREFIX_DATA },
  5781. /* 18 */
  5782. { VEX_W_TABLE (VEX_W_0F3818) },
  5783. { VEX_LEN_TABLE (VEX_LEN_0F3819) },
  5784. { MOD_TABLE (MOD_VEX_0F381A) },
  5785. { Bad_Opcode },
  5786. { "vpabsb", { XM, EXx }, PREFIX_DATA },
  5787. { "vpabsw", { XM, EXx }, PREFIX_DATA },
  5788. { "vpabsd", { XM, EXx }, PREFIX_DATA },
  5789. { Bad_Opcode },
  5790. /* 20 */
  5791. { "vpmovsxbw", { XM, EXxmmq }, PREFIX_DATA },
  5792. { "vpmovsxbd", { XM, EXxmmqd }, PREFIX_DATA },
  5793. { "vpmovsxbq", { XM, EXxmmdw }, PREFIX_DATA },
  5794. { "vpmovsxwd", { XM, EXxmmq }, PREFIX_DATA },
  5795. { "vpmovsxwq", { XM, EXxmmqd }, PREFIX_DATA },
  5796. { "vpmovsxdq", { XM, EXxmmq }, PREFIX_DATA },
  5797. { Bad_Opcode },
  5798. { Bad_Opcode },
  5799. /* 28 */
  5800. { "vpmuldq", { XM, Vex, EXx }, PREFIX_DATA },
  5801. { "vpcmpeqq", { XM, Vex, EXx }, PREFIX_DATA },
  5802. { MOD_TABLE (MOD_VEX_0F382A) },
  5803. { "vpackusdw", { XM, Vex, EXx }, PREFIX_DATA },
  5804. { MOD_TABLE (MOD_VEX_0F382C) },
  5805. { MOD_TABLE (MOD_VEX_0F382D) },
  5806. { MOD_TABLE (MOD_VEX_0F382E) },
  5807. { MOD_TABLE (MOD_VEX_0F382F) },
  5808. /* 30 */
  5809. { "vpmovzxbw", { XM, EXxmmq }, PREFIX_DATA },
  5810. { "vpmovzxbd", { XM, EXxmmqd }, PREFIX_DATA },
  5811. { "vpmovzxbq", { XM, EXxmmdw }, PREFIX_DATA },
  5812. { "vpmovzxwd", { XM, EXxmmq }, PREFIX_DATA },
  5813. { "vpmovzxwq", { XM, EXxmmqd }, PREFIX_DATA },
  5814. { "vpmovzxdq", { XM, EXxmmq }, PREFIX_DATA },
  5815. { VEX_LEN_TABLE (VEX_LEN_0F3836) },
  5816. { "vpcmpgtq", { XM, Vex, EXx }, PREFIX_DATA },
  5817. /* 38 */
  5818. { "vpminsb", { XM, Vex, EXx }, PREFIX_DATA },
  5819. { "vpminsd", { XM, Vex, EXx }, PREFIX_DATA },
  5820. { "vpminuw", { XM, Vex, EXx }, PREFIX_DATA },
  5821. { "vpminud", { XM, Vex, EXx }, PREFIX_DATA },
  5822. { "vpmaxsb", { XM, Vex, EXx }, PREFIX_DATA },
  5823. { "vpmaxsd", { XM, Vex, EXx }, PREFIX_DATA },
  5824. { "vpmaxuw", { XM, Vex, EXx }, PREFIX_DATA },
  5825. { "vpmaxud", { XM, Vex, EXx }, PREFIX_DATA },
  5826. /* 40 */
  5827. { "vpmulld", { XM, Vex, EXx }, PREFIX_DATA },
  5828. { VEX_LEN_TABLE (VEX_LEN_0F3841) },
  5829. { Bad_Opcode },
  5830. { Bad_Opcode },
  5831. { Bad_Opcode },
  5832. { "vpsrlv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
  5833. { VEX_W_TABLE (VEX_W_0F3846) },
  5834. { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA },
  5835. /* 48 */
  5836. { Bad_Opcode },
  5837. { X86_64_TABLE (X86_64_VEX_0F3849) },
  5838. { Bad_Opcode },
  5839. { X86_64_TABLE (X86_64_VEX_0F384B) },
  5840. { Bad_Opcode },
  5841. { Bad_Opcode },
  5842. { Bad_Opcode },
  5843. { Bad_Opcode },
  5844. /* 50 */
  5845. { VEX_W_TABLE (VEX_W_0F3850) },
  5846. { VEX_W_TABLE (VEX_W_0F3851) },
  5847. { VEX_W_TABLE (VEX_W_0F3852) },
  5848. { VEX_W_TABLE (VEX_W_0F3853) },
  5849. { Bad_Opcode },
  5850. { Bad_Opcode },
  5851. { Bad_Opcode },
  5852. { Bad_Opcode },
  5853. /* 58 */
  5854. { VEX_W_TABLE (VEX_W_0F3858) },
  5855. { VEX_W_TABLE (VEX_W_0F3859) },
  5856. { MOD_TABLE (MOD_VEX_0F385A) },
  5857. { Bad_Opcode },
  5858. { X86_64_TABLE (X86_64_VEX_0F385C) },
  5859. { Bad_Opcode },
  5860. { X86_64_TABLE (X86_64_VEX_0F385E) },
  5861. { Bad_Opcode },
  5862. /* 60 */
  5863. { Bad_Opcode },
  5864. { Bad_Opcode },
  5865. { Bad_Opcode },
  5866. { Bad_Opcode },
  5867. { Bad_Opcode },
  5868. { Bad_Opcode },
  5869. { Bad_Opcode },
  5870. { Bad_Opcode },
  5871. /* 68 */
  5872. { Bad_Opcode },
  5873. { Bad_Opcode },
  5874. { Bad_Opcode },
  5875. { Bad_Opcode },
  5876. { Bad_Opcode },
  5877. { Bad_Opcode },
  5878. { Bad_Opcode },
  5879. { Bad_Opcode },
  5880. /* 70 */
  5881. { Bad_Opcode },
  5882. { Bad_Opcode },
  5883. { Bad_Opcode },
  5884. { Bad_Opcode },
  5885. { Bad_Opcode },
  5886. { Bad_Opcode },
  5887. { Bad_Opcode },
  5888. { Bad_Opcode },
  5889. /* 78 */
  5890. { VEX_W_TABLE (VEX_W_0F3878) },
  5891. { VEX_W_TABLE (VEX_W_0F3879) },
  5892. { Bad_Opcode },
  5893. { Bad_Opcode },
  5894. { Bad_Opcode },
  5895. { Bad_Opcode },
  5896. { Bad_Opcode },
  5897. { Bad_Opcode },
  5898. /* 80 */
  5899. { Bad_Opcode },
  5900. { Bad_Opcode },
  5901. { Bad_Opcode },
  5902. { Bad_Opcode },
  5903. { Bad_Opcode },
  5904. { Bad_Opcode },
  5905. { Bad_Opcode },
  5906. { Bad_Opcode },
  5907. /* 88 */
  5908. { Bad_Opcode },
  5909. { Bad_Opcode },
  5910. { Bad_Opcode },
  5911. { Bad_Opcode },
  5912. { MOD_TABLE (MOD_VEX_0F388C) },
  5913. { Bad_Opcode },
  5914. { MOD_TABLE (MOD_VEX_0F388E) },
  5915. { Bad_Opcode },
  5916. /* 90 */
  5917. { "vpgatherd%DQ", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
  5918. { "vpgatherq%DQ", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
  5919. { "vgatherdp%XW", { XM, MVexVSIBDWpX, VexGatherD }, PREFIX_DATA },
  5920. { "vgatherqp%XW", { XMGatherQ, MVexVSIBQWpX, VexGatherQ }, PREFIX_DATA },
  5921. { Bad_Opcode },
  5922. { Bad_Opcode },
  5923. { "vfmaddsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5924. { "vfmsubadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5925. /* 98 */
  5926. { "vfmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5927. { "vfmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
  5928. { "vfmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5929. { "vfmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
  5930. { "vfnmadd132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5931. { "vfnmadd132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
  5932. { "vfnmsub132p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5933. { "vfnmsub132s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
  5934. /* a0 */
  5935. { Bad_Opcode },
  5936. { Bad_Opcode },
  5937. { Bad_Opcode },
  5938. { Bad_Opcode },
  5939. { Bad_Opcode },
  5940. { Bad_Opcode },
  5941. { "vfmaddsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5942. { "vfmsubadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5943. /* a8 */
  5944. { "vfmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5945. { "vfmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
  5946. { "vfmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5947. { "vfmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
  5948. { "vfnmadd213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5949. { "vfnmadd213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
  5950. { "vfnmsub213p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5951. { "vfnmsub213s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
  5952. /* b0 */
  5953. { Bad_Opcode },
  5954. { Bad_Opcode },
  5955. { Bad_Opcode },
  5956. { Bad_Opcode },
  5957. { Bad_Opcode },
  5958. { Bad_Opcode },
  5959. { "vfmaddsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5960. { "vfmsubadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5961. /* b8 */
  5962. { "vfmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5963. { "vfmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
  5964. { "vfmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5965. { "vfmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
  5966. { "vfnmadd231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5967. { "vfnmadd231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
  5968. { "vfnmsub231p%XW", { XM, Vex, EXx }, PREFIX_DATA },
  5969. { "vfnmsub231s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA },
  5970. /* c0 */
  5971. { Bad_Opcode },
  5972. { Bad_Opcode },
  5973. { Bad_Opcode },
  5974. { Bad_Opcode },
  5975. { Bad_Opcode },
  5976. { Bad_Opcode },
  5977. { Bad_Opcode },
  5978. { Bad_Opcode },
  5979. /* c8 */
  5980. { Bad_Opcode },
  5981. { Bad_Opcode },
  5982. { Bad_Opcode },
  5983. { Bad_Opcode },
  5984. { Bad_Opcode },
  5985. { Bad_Opcode },
  5986. { Bad_Opcode },
  5987. { VEX_W_TABLE (VEX_W_0F38CF) },
  5988. /* d0 */
  5989. { Bad_Opcode },
  5990. { Bad_Opcode },
  5991. { Bad_Opcode },
  5992. { Bad_Opcode },
  5993. { Bad_Opcode },
  5994. { Bad_Opcode },
  5995. { Bad_Opcode },
  5996. { Bad_Opcode },
  5997. /* d8 */
  5998. { Bad_Opcode },
  5999. { Bad_Opcode },
  6000. { Bad_Opcode },
  6001. { VEX_LEN_TABLE (VEX_LEN_0F38DB) },
  6002. { "vaesenc", { XM, Vex, EXx }, PREFIX_DATA },
  6003. { "vaesenclast", { XM, Vex, EXx }, PREFIX_DATA },
  6004. { "vaesdec", { XM, Vex, EXx }, PREFIX_DATA },
  6005. { "vaesdeclast", { XM, Vex, EXx }, PREFIX_DATA },
  6006. /* e0 */
  6007. { Bad_Opcode },
  6008. { Bad_Opcode },
  6009. { Bad_Opcode },
  6010. { Bad_Opcode },
  6011. { Bad_Opcode },
  6012. { Bad_Opcode },
  6013. { Bad_Opcode },
  6014. { Bad_Opcode },
  6015. /* e8 */
  6016. { Bad_Opcode },
  6017. { Bad_Opcode },
  6018. { Bad_Opcode },
  6019. { Bad_Opcode },
  6020. { Bad_Opcode },
  6021. { Bad_Opcode },
  6022. { Bad_Opcode },
  6023. { Bad_Opcode },
  6024. /* f0 */
  6025. { Bad_Opcode },
  6026. { Bad_Opcode },
  6027. { VEX_LEN_TABLE (VEX_LEN_0F38F2) },
  6028. { VEX_LEN_TABLE (VEX_LEN_0F38F3) },
  6029. { Bad_Opcode },
  6030. { VEX_LEN_TABLE (VEX_LEN_0F38F5) },
  6031. { VEX_LEN_TABLE (VEX_LEN_0F38F6) },
  6032. { VEX_LEN_TABLE (VEX_LEN_0F38F7) },
  6033. /* f8 */
  6034. { Bad_Opcode },
  6035. { Bad_Opcode },
  6036. { Bad_Opcode },
  6037. { Bad_Opcode },
  6038. { Bad_Opcode },
  6039. { Bad_Opcode },
  6040. { Bad_Opcode },
  6041. { Bad_Opcode },
  6042. },
  6043. /* VEX_0F3A */
  6044. {
  6045. /* 00 */
  6046. { VEX_LEN_TABLE (VEX_LEN_0F3A00) },
  6047. { VEX_LEN_TABLE (VEX_LEN_0F3A01) },
  6048. { VEX_W_TABLE (VEX_W_0F3A02) },
  6049. { Bad_Opcode },
  6050. { VEX_W_TABLE (VEX_W_0F3A04) },
  6051. { VEX_W_TABLE (VEX_W_0F3A05) },
  6052. { VEX_LEN_TABLE (VEX_LEN_0F3A06) },
  6053. { Bad_Opcode },
  6054. /* 08 */
  6055. { "vroundps", { XM, EXx, Ib }, PREFIX_DATA },
  6056. { "vroundpd", { XM, EXx, Ib }, PREFIX_DATA },
  6057. { "vroundss", { XMScalar, VexScalar, EXd, Ib }, PREFIX_DATA },
  6058. { "vroundsd", { XMScalar, VexScalar, EXq, Ib }, PREFIX_DATA },
  6059. { "vblendps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
  6060. { "vblendpd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
  6061. { "vpblendw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
  6062. { "vpalignr", { XM, Vex, EXx, Ib }, PREFIX_DATA },
  6063. /* 10 */
  6064. { Bad_Opcode },
  6065. { Bad_Opcode },
  6066. { Bad_Opcode },
  6067. { Bad_Opcode },
  6068. { VEX_LEN_TABLE (VEX_LEN_0F3A14) },
  6069. { VEX_LEN_TABLE (VEX_LEN_0F3A15) },
  6070. { VEX_LEN_TABLE (VEX_LEN_0F3A16) },
  6071. { VEX_LEN_TABLE (VEX_LEN_0F3A17) },
  6072. /* 18 */
  6073. { VEX_LEN_TABLE (VEX_LEN_0F3A18) },
  6074. { VEX_LEN_TABLE (VEX_LEN_0F3A19) },
  6075. { Bad_Opcode },
  6076. { Bad_Opcode },
  6077. { Bad_Opcode },
  6078. { VEX_W_TABLE (VEX_W_0F3A1D) },
  6079. { Bad_Opcode },
  6080. { Bad_Opcode },
  6081. /* 20 */
  6082. { VEX_LEN_TABLE (VEX_LEN_0F3A20) },
  6083. { VEX_LEN_TABLE (VEX_LEN_0F3A21) },
  6084. { VEX_LEN_TABLE (VEX_LEN_0F3A22) },
  6085. { Bad_Opcode },
  6086. { Bad_Opcode },
  6087. { Bad_Opcode },
  6088. { Bad_Opcode },
  6089. { Bad_Opcode },
  6090. /* 28 */
  6091. { Bad_Opcode },
  6092. { Bad_Opcode },
  6093. { Bad_Opcode },
  6094. { Bad_Opcode },
  6095. { Bad_Opcode },
  6096. { Bad_Opcode },
  6097. { Bad_Opcode },
  6098. { Bad_Opcode },
  6099. /* 30 */
  6100. { VEX_LEN_TABLE (VEX_LEN_0F3A30) },
  6101. { VEX_LEN_TABLE (VEX_LEN_0F3A31) },
  6102. { VEX_LEN_TABLE (VEX_LEN_0F3A32) },
  6103. { VEX_LEN_TABLE (VEX_LEN_0F3A33) },
  6104. { Bad_Opcode },
  6105. { Bad_Opcode },
  6106. { Bad_Opcode },
  6107. { Bad_Opcode },
  6108. /* 38 */
  6109. { VEX_LEN_TABLE (VEX_LEN_0F3A38) },
  6110. { VEX_LEN_TABLE (VEX_LEN_0F3A39) },
  6111. { Bad_Opcode },
  6112. { Bad_Opcode },
  6113. { Bad_Opcode },
  6114. { Bad_Opcode },
  6115. { Bad_Opcode },
  6116. { Bad_Opcode },
  6117. /* 40 */
  6118. { "vdpps", { XM, Vex, EXx, Ib }, PREFIX_DATA },
  6119. { VEX_LEN_TABLE (VEX_LEN_0F3A41) },
  6120. { "vmpsadbw", { XM, Vex, EXx, Ib }, PREFIX_DATA },
  6121. { Bad_Opcode },
  6122. { "vpclmulqdq", { XM, Vex, EXx, PCLMUL }, PREFIX_DATA },
  6123. { Bad_Opcode },
  6124. { VEX_LEN_TABLE (VEX_LEN_0F3A46) },
  6125. { Bad_Opcode },
  6126. /* 48 */
  6127. { "vpermil2ps", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
  6128. { "vpermil2pd", { XM, Vex, EXx, XMVexI4, VexI4 }, PREFIX_DATA },
  6129. { VEX_W_TABLE (VEX_W_0F3A4A) },
  6130. { VEX_W_TABLE (VEX_W_0F3A4B) },
  6131. { VEX_W_TABLE (VEX_W_0F3A4C) },
  6132. { Bad_Opcode },
  6133. { Bad_Opcode },
  6134. { Bad_Opcode },
  6135. /* 50 */
  6136. { Bad_Opcode },
  6137. { Bad_Opcode },
  6138. { Bad_Opcode },
  6139. { Bad_Opcode },
  6140. { Bad_Opcode },
  6141. { Bad_Opcode },
  6142. { Bad_Opcode },
  6143. { Bad_Opcode },
  6144. /* 58 */
  6145. { Bad_Opcode },
  6146. { Bad_Opcode },
  6147. { Bad_Opcode },
  6148. { Bad_Opcode },
  6149. { "vfmaddsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  6150. { "vfmaddsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  6151. { "vfmsubaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  6152. { "vfmsubaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  6153. /* 60 */
  6154. { VEX_LEN_TABLE (VEX_LEN_0F3A60) },
  6155. { VEX_LEN_TABLE (VEX_LEN_0F3A61) },
  6156. { VEX_LEN_TABLE (VEX_LEN_0F3A62) },
  6157. { VEX_LEN_TABLE (VEX_LEN_0F3A63) },
  6158. { Bad_Opcode },
  6159. { Bad_Opcode },
  6160. { Bad_Opcode },
  6161. { Bad_Opcode },
  6162. /* 68 */
  6163. { "vfmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  6164. { "vfmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  6165. { "vfmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
  6166. { "vfmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
  6167. { "vfmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  6168. { "vfmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  6169. { "vfmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
  6170. { "vfmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
  6171. /* 70 */
  6172. { Bad_Opcode },
  6173. { Bad_Opcode },
  6174. { Bad_Opcode },
  6175. { Bad_Opcode },
  6176. { Bad_Opcode },
  6177. { Bad_Opcode },
  6178. { Bad_Opcode },
  6179. { Bad_Opcode },
  6180. /* 78 */
  6181. { "vfnmaddps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  6182. { "vfnmaddpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  6183. { "vfnmaddss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
  6184. { "vfnmaddsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
  6185. { "vfnmsubps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  6186. { "vfnmsubpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  6187. { "vfnmsubss", { XMScalar, VexScalar, EXd, XMVexScalarI4 }, PREFIX_DATA },
  6188. { "vfnmsubsd", { XMScalar, VexScalar, EXq, XMVexScalarI4 }, PREFIX_DATA },
  6189. /* 80 */
  6190. { Bad_Opcode },
  6191. { Bad_Opcode },
  6192. { Bad_Opcode },
  6193. { Bad_Opcode },
  6194. { Bad_Opcode },
  6195. { Bad_Opcode },
  6196. { Bad_Opcode },
  6197. { Bad_Opcode },
  6198. /* 88 */
  6199. { Bad_Opcode },
  6200. { Bad_Opcode },
  6201. { Bad_Opcode },
  6202. { Bad_Opcode },
  6203. { Bad_Opcode },
  6204. { Bad_Opcode },
  6205. { Bad_Opcode },
  6206. { Bad_Opcode },
  6207. /* 90 */
  6208. { Bad_Opcode },
  6209. { Bad_Opcode },
  6210. { Bad_Opcode },
  6211. { Bad_Opcode },
  6212. { Bad_Opcode },
  6213. { Bad_Opcode },
  6214. { Bad_Opcode },
  6215. { Bad_Opcode },
  6216. /* 98 */
  6217. { Bad_Opcode },
  6218. { Bad_Opcode },
  6219. { Bad_Opcode },
  6220. { Bad_Opcode },
  6221. { Bad_Opcode },
  6222. { Bad_Opcode },
  6223. { Bad_Opcode },
  6224. { Bad_Opcode },
  6225. /* a0 */
  6226. { Bad_Opcode },
  6227. { Bad_Opcode },
  6228. { Bad_Opcode },
  6229. { Bad_Opcode },
  6230. { Bad_Opcode },
  6231. { Bad_Opcode },
  6232. { Bad_Opcode },
  6233. { Bad_Opcode },
  6234. /* a8 */
  6235. { Bad_Opcode },
  6236. { Bad_Opcode },
  6237. { Bad_Opcode },
  6238. { Bad_Opcode },
  6239. { Bad_Opcode },
  6240. { Bad_Opcode },
  6241. { Bad_Opcode },
  6242. { Bad_Opcode },
  6243. /* b0 */
  6244. { Bad_Opcode },
  6245. { Bad_Opcode },
  6246. { Bad_Opcode },
  6247. { Bad_Opcode },
  6248. { Bad_Opcode },
  6249. { Bad_Opcode },
  6250. { Bad_Opcode },
  6251. { Bad_Opcode },
  6252. /* b8 */
  6253. { Bad_Opcode },
  6254. { Bad_Opcode },
  6255. { Bad_Opcode },
  6256. { Bad_Opcode },
  6257. { Bad_Opcode },
  6258. { Bad_Opcode },
  6259. { Bad_Opcode },
  6260. { Bad_Opcode },
  6261. /* c0 */
  6262. { Bad_Opcode },
  6263. { Bad_Opcode },
  6264. { Bad_Opcode },
  6265. { Bad_Opcode },
  6266. { Bad_Opcode },
  6267. { Bad_Opcode },
  6268. { Bad_Opcode },
  6269. { Bad_Opcode },
  6270. /* c8 */
  6271. { Bad_Opcode },
  6272. { Bad_Opcode },
  6273. { Bad_Opcode },
  6274. { Bad_Opcode },
  6275. { Bad_Opcode },
  6276. { Bad_Opcode },
  6277. { VEX_W_TABLE (VEX_W_0F3ACE) },
  6278. { VEX_W_TABLE (VEX_W_0F3ACF) },
  6279. /* d0 */
  6280. { Bad_Opcode },
  6281. { Bad_Opcode },
  6282. { Bad_Opcode },
  6283. { Bad_Opcode },
  6284. { Bad_Opcode },
  6285. { Bad_Opcode },
  6286. { Bad_Opcode },
  6287. { Bad_Opcode },
  6288. /* d8 */
  6289. { Bad_Opcode },
  6290. { Bad_Opcode },
  6291. { Bad_Opcode },
  6292. { Bad_Opcode },
  6293. { Bad_Opcode },
  6294. { Bad_Opcode },
  6295. { Bad_Opcode },
  6296. { VEX_LEN_TABLE (VEX_LEN_0F3ADF) },
  6297. /* e0 */
  6298. { Bad_Opcode },
  6299. { Bad_Opcode },
  6300. { Bad_Opcode },
  6301. { Bad_Opcode },
  6302. { Bad_Opcode },
  6303. { Bad_Opcode },
  6304. { Bad_Opcode },
  6305. { Bad_Opcode },
  6306. /* e8 */
  6307. { Bad_Opcode },
  6308. { Bad_Opcode },
  6309. { Bad_Opcode },
  6310. { Bad_Opcode },
  6311. { Bad_Opcode },
  6312. { Bad_Opcode },
  6313. { Bad_Opcode },
  6314. { Bad_Opcode },
  6315. /* f0 */
  6316. { VEX_LEN_TABLE (VEX_LEN_0F3AF0) },
  6317. { Bad_Opcode },
  6318. { Bad_Opcode },
  6319. { Bad_Opcode },
  6320. { Bad_Opcode },
  6321. { Bad_Opcode },
  6322. { Bad_Opcode },
  6323. { Bad_Opcode },
  6324. /* f8 */
  6325. { Bad_Opcode },
  6326. { Bad_Opcode },
  6327. { Bad_Opcode },
  6328. { Bad_Opcode },
  6329. { Bad_Opcode },
  6330. { Bad_Opcode },
  6331. { Bad_Opcode },
  6332. { Bad_Opcode },
  6333. },
  6334. };
  6335. #include "i386-dis-evex.h"
  6336. static const struct dis386 vex_len_table[][2] = {
  6337. /* VEX_LEN_0F12_P_0_M_0 / VEX_LEN_0F12_P_2_M_0 */
  6338. {
  6339. { "vmovlpX", { XM, Vex, EXq }, PREFIX_OPCODE },
  6340. },
  6341. /* VEX_LEN_0F12_P_0_M_1 */
  6342. {
  6343. { "vmovhlp%XS", { XM, Vex, EXq }, 0 },
  6344. },
  6345. /* VEX_LEN_0F13_M_0 */
  6346. {
  6347. { "vmovlpX", { EXq, XM }, PREFIX_OPCODE },
  6348. },
  6349. /* VEX_LEN_0F16_P_0_M_0 / VEX_LEN_0F16_P_2_M_0 */
  6350. {
  6351. { "vmovhpX", { XM, Vex, EXq }, PREFIX_OPCODE },
  6352. },
  6353. /* VEX_LEN_0F16_P_0_M_1 */
  6354. {
  6355. { "vmovlhp%XS", { XM, Vex, EXq }, 0 },
  6356. },
  6357. /* VEX_LEN_0F17_M_0 */
  6358. {
  6359. { "vmovhpX", { EXq, XM }, PREFIX_OPCODE },
  6360. },
  6361. /* VEX_LEN_0F41 */
  6362. {
  6363. { Bad_Opcode },
  6364. { MOD_TABLE (MOD_VEX_0F41_L_1) },
  6365. },
  6366. /* VEX_LEN_0F42 */
  6367. {
  6368. { Bad_Opcode },
  6369. { MOD_TABLE (MOD_VEX_0F42_L_1) },
  6370. },
  6371. /* VEX_LEN_0F44 */
  6372. {
  6373. { MOD_TABLE (MOD_VEX_0F44_L_0) },
  6374. },
  6375. /* VEX_LEN_0F45 */
  6376. {
  6377. { Bad_Opcode },
  6378. { MOD_TABLE (MOD_VEX_0F45_L_1) },
  6379. },
  6380. /* VEX_LEN_0F46 */
  6381. {
  6382. { Bad_Opcode },
  6383. { MOD_TABLE (MOD_VEX_0F46_L_1) },
  6384. },
  6385. /* VEX_LEN_0F47 */
  6386. {
  6387. { Bad_Opcode },
  6388. { MOD_TABLE (MOD_VEX_0F47_L_1) },
  6389. },
  6390. /* VEX_LEN_0F4A */
  6391. {
  6392. { Bad_Opcode },
  6393. { MOD_TABLE (MOD_VEX_0F4A_L_1) },
  6394. },
  6395. /* VEX_LEN_0F4B */
  6396. {
  6397. { Bad_Opcode },
  6398. { MOD_TABLE (MOD_VEX_0F4B_L_1) },
  6399. },
  6400. /* VEX_LEN_0F6E */
  6401. {
  6402. { "vmovK", { XMScalar, Edq }, PREFIX_DATA },
  6403. },
  6404. /* VEX_LEN_0F77 */
  6405. {
  6406. { "vzeroupper", { XX }, 0 },
  6407. { "vzeroall", { XX }, 0 },
  6408. },
  6409. /* VEX_LEN_0F7E_P_1 */
  6410. {
  6411. { "vmovq", { XMScalar, EXq }, 0 },
  6412. },
  6413. /* VEX_LEN_0F7E_P_2 */
  6414. {
  6415. { "vmovK", { Edq, XMScalar }, 0 },
  6416. },
  6417. /* VEX_LEN_0F90 */
  6418. {
  6419. { VEX_W_TABLE (VEX_W_0F90_L_0) },
  6420. },
  6421. /* VEX_LEN_0F91 */
  6422. {
  6423. { MOD_TABLE (MOD_VEX_0F91_L_0) },
  6424. },
  6425. /* VEX_LEN_0F92 */
  6426. {
  6427. { MOD_TABLE (MOD_VEX_0F92_L_0) },
  6428. },
  6429. /* VEX_LEN_0F93 */
  6430. {
  6431. { MOD_TABLE (MOD_VEX_0F93_L_0) },
  6432. },
  6433. /* VEX_LEN_0F98 */
  6434. {
  6435. { MOD_TABLE (MOD_VEX_0F98_L_0) },
  6436. },
  6437. /* VEX_LEN_0F99 */
  6438. {
  6439. { MOD_TABLE (MOD_VEX_0F99_L_0) },
  6440. },
  6441. /* VEX_LEN_0FAE_R_2_M_0 */
  6442. {
  6443. { "vldmxcsr", { Md }, 0 },
  6444. },
  6445. /* VEX_LEN_0FAE_R_3_M_0 */
  6446. {
  6447. { "vstmxcsr", { Md }, 0 },
  6448. },
  6449. /* VEX_LEN_0FC4 */
  6450. {
  6451. { "vpinsrw", { XM, Vex, Edw, Ib }, PREFIX_DATA },
  6452. },
  6453. /* VEX_LEN_0FC5 */
  6454. {
  6455. { "vpextrw", { Gd, XS, Ib }, PREFIX_DATA },
  6456. },
  6457. /* VEX_LEN_0FD6 */
  6458. {
  6459. { "vmovq", { EXqS, XMScalar }, PREFIX_DATA },
  6460. },
  6461. /* VEX_LEN_0FF7 */
  6462. {
  6463. { "vmaskmovdqu", { XM, XS }, PREFIX_DATA },
  6464. },
  6465. /* VEX_LEN_0F3816 */
  6466. {
  6467. { Bad_Opcode },
  6468. { VEX_W_TABLE (VEX_W_0F3816_L_1) },
  6469. },
  6470. /* VEX_LEN_0F3819 */
  6471. {
  6472. { Bad_Opcode },
  6473. { VEX_W_TABLE (VEX_W_0F3819_L_1) },
  6474. },
  6475. /* VEX_LEN_0F381A_M_0 */
  6476. {
  6477. { Bad_Opcode },
  6478. { VEX_W_TABLE (VEX_W_0F381A_M_0_L_1) },
  6479. },
  6480. /* VEX_LEN_0F3836 */
  6481. {
  6482. { Bad_Opcode },
  6483. { VEX_W_TABLE (VEX_W_0F3836) },
  6484. },
  6485. /* VEX_LEN_0F3841 */
  6486. {
  6487. { "vphminposuw", { XM, EXx }, PREFIX_DATA },
  6488. },
  6489. /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_0 */
  6490. {
  6491. { "ldtilecfg", { M }, 0 },
  6492. },
  6493. /* VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0 */
  6494. {
  6495. { "tilerelease", { Skip_MODRM }, 0 },
  6496. },
  6497. /* VEX_LEN_0F3849_X86_64_P_2_W_0_M_0 */
  6498. {
  6499. { "sttilecfg", { M }, 0 },
  6500. },
  6501. /* VEX_LEN_0F3849_X86_64_P_3_W_0_M_0 */
  6502. {
  6503. { "tilezero", { TMM, Skip_MODRM }, 0 },
  6504. },
  6505. /* VEX_LEN_0F384B_X86_64_P_1_W_0_M_0 */
  6506. {
  6507. { "tilestored", { MVexSIBMEM, TMM }, 0 },
  6508. },
  6509. /* VEX_LEN_0F384B_X86_64_P_2_W_0_M_0 */
  6510. {
  6511. { "tileloaddt1", { TMM, MVexSIBMEM }, 0 },
  6512. },
  6513. /* VEX_LEN_0F384B_X86_64_P_3_W_0_M_0 */
  6514. {
  6515. { "tileloadd", { TMM, MVexSIBMEM }, 0 },
  6516. },
  6517. /* VEX_LEN_0F385A_M_0 */
  6518. {
  6519. { Bad_Opcode },
  6520. { VEX_W_TABLE (VEX_W_0F385A_M_0_L_0) },
  6521. },
  6522. /* VEX_LEN_0F385C_X86_64_P_1_W_0_M_0 */
  6523. {
  6524. { "tdpbf16ps", { TMM, EXtmm, VexTmm }, 0 },
  6525. },
  6526. /* VEX_LEN_0F385E_X86_64_P_0_W_0_M_0 */
  6527. {
  6528. { "tdpbuud", {TMM, EXtmm, VexTmm }, 0 },
  6529. },
  6530. /* VEX_LEN_0F385E_X86_64_P_1_W_0_M_0 */
  6531. {
  6532. { "tdpbsud", {TMM, EXtmm, VexTmm }, 0 },
  6533. },
  6534. /* VEX_LEN_0F385E_X86_64_P_2_W_0_M_0 */
  6535. {
  6536. { "tdpbusd", {TMM, EXtmm, VexTmm }, 0 },
  6537. },
  6538. /* VEX_LEN_0F385E_X86_64_P_3_W_0_M_0 */
  6539. {
  6540. { "tdpbssd", {TMM, EXtmm, VexTmm }, 0 },
  6541. },
  6542. /* VEX_LEN_0F38DB */
  6543. {
  6544. { "vaesimc", { XM, EXx }, PREFIX_DATA },
  6545. },
  6546. /* VEX_LEN_0F38F2 */
  6547. {
  6548. { "andnS", { Gdq, VexGdq, Edq }, PREFIX_OPCODE },
  6549. },
  6550. /* VEX_LEN_0F38F3 */
  6551. {
  6552. { REG_TABLE(REG_VEX_0F38F3_L_0) },
  6553. },
  6554. /* VEX_LEN_0F38F5 */
  6555. {
  6556. { PREFIX_TABLE(PREFIX_VEX_0F38F5_L_0) },
  6557. },
  6558. /* VEX_LEN_0F38F6 */
  6559. {
  6560. { PREFIX_TABLE(PREFIX_VEX_0F38F6_L_0) },
  6561. },
  6562. /* VEX_LEN_0F38F7 */
  6563. {
  6564. { PREFIX_TABLE(PREFIX_VEX_0F38F7_L_0) },
  6565. },
  6566. /* VEX_LEN_0F3A00 */
  6567. {
  6568. { Bad_Opcode },
  6569. { VEX_W_TABLE (VEX_W_0F3A00_L_1) },
  6570. },
  6571. /* VEX_LEN_0F3A01 */
  6572. {
  6573. { Bad_Opcode },
  6574. { VEX_W_TABLE (VEX_W_0F3A01_L_1) },
  6575. },
  6576. /* VEX_LEN_0F3A06 */
  6577. {
  6578. { Bad_Opcode },
  6579. { VEX_W_TABLE (VEX_W_0F3A06_L_1) },
  6580. },
  6581. /* VEX_LEN_0F3A14 */
  6582. {
  6583. { "vpextrb", { Edb, XM, Ib }, PREFIX_DATA },
  6584. },
  6585. /* VEX_LEN_0F3A15 */
  6586. {
  6587. { "vpextrw", { Edw, XM, Ib }, PREFIX_DATA },
  6588. },
  6589. /* VEX_LEN_0F3A16 */
  6590. {
  6591. { "vpextrK", { Edq, XM, Ib }, PREFIX_DATA },
  6592. },
  6593. /* VEX_LEN_0F3A17 */
  6594. {
  6595. { "vextractps", { Ed, XM, Ib }, PREFIX_DATA },
  6596. },
  6597. /* VEX_LEN_0F3A18 */
  6598. {
  6599. { Bad_Opcode },
  6600. { VEX_W_TABLE (VEX_W_0F3A18_L_1) },
  6601. },
  6602. /* VEX_LEN_0F3A19 */
  6603. {
  6604. { Bad_Opcode },
  6605. { VEX_W_TABLE (VEX_W_0F3A19_L_1) },
  6606. },
  6607. /* VEX_LEN_0F3A20 */
  6608. {
  6609. { "vpinsrb", { XM, Vex, Edb, Ib }, PREFIX_DATA },
  6610. },
  6611. /* VEX_LEN_0F3A21 */
  6612. {
  6613. { "vinsertps", { XM, Vex, EXd, Ib }, PREFIX_DATA },
  6614. },
  6615. /* VEX_LEN_0F3A22 */
  6616. {
  6617. { "vpinsrK", { XM, Vex, Edq, Ib }, PREFIX_DATA },
  6618. },
  6619. /* VEX_LEN_0F3A30 */
  6620. {
  6621. { MOD_TABLE (MOD_VEX_0F3A30_L_0) },
  6622. },
  6623. /* VEX_LEN_0F3A31 */
  6624. {
  6625. { MOD_TABLE (MOD_VEX_0F3A31_L_0) },
  6626. },
  6627. /* VEX_LEN_0F3A32 */
  6628. {
  6629. { MOD_TABLE (MOD_VEX_0F3A32_L_0) },
  6630. },
  6631. /* VEX_LEN_0F3A33 */
  6632. {
  6633. { MOD_TABLE (MOD_VEX_0F3A33_L_0) },
  6634. },
  6635. /* VEX_LEN_0F3A38 */
  6636. {
  6637. { Bad_Opcode },
  6638. { VEX_W_TABLE (VEX_W_0F3A38_L_1) },
  6639. },
  6640. /* VEX_LEN_0F3A39 */
  6641. {
  6642. { Bad_Opcode },
  6643. { VEX_W_TABLE (VEX_W_0F3A39_L_1) },
  6644. },
  6645. /* VEX_LEN_0F3A41 */
  6646. {
  6647. { "vdppd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
  6648. },
  6649. /* VEX_LEN_0F3A46 */
  6650. {
  6651. { Bad_Opcode },
  6652. { VEX_W_TABLE (VEX_W_0F3A46_L_1) },
  6653. },
  6654. /* VEX_LEN_0F3A60 */
  6655. {
  6656. { "vpcmpestrm!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
  6657. },
  6658. /* VEX_LEN_0F3A61 */
  6659. {
  6660. { "vpcmpestri!%LQ", { XM, EXx, Ib }, PREFIX_DATA },
  6661. },
  6662. /* VEX_LEN_0F3A62 */
  6663. {
  6664. { "vpcmpistrm", { XM, EXx, Ib }, PREFIX_DATA },
  6665. },
  6666. /* VEX_LEN_0F3A63 */
  6667. {
  6668. { "vpcmpistri", { XM, EXx, Ib }, PREFIX_DATA },
  6669. },
  6670. /* VEX_LEN_0F3ADF */
  6671. {
  6672. { "vaeskeygenassist", { XM, EXx, Ib }, PREFIX_DATA },
  6673. },
  6674. /* VEX_LEN_0F3AF0 */
  6675. {
  6676. { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) },
  6677. },
  6678. /* VEX_LEN_0FXOP_08_85 */
  6679. {
  6680. { VEX_W_TABLE (VEX_W_0FXOP_08_85_L_0) },
  6681. },
  6682. /* VEX_LEN_0FXOP_08_86 */
  6683. {
  6684. { VEX_W_TABLE (VEX_W_0FXOP_08_86_L_0) },
  6685. },
  6686. /* VEX_LEN_0FXOP_08_87 */
  6687. {
  6688. { VEX_W_TABLE (VEX_W_0FXOP_08_87_L_0) },
  6689. },
  6690. /* VEX_LEN_0FXOP_08_8E */
  6691. {
  6692. { VEX_W_TABLE (VEX_W_0FXOP_08_8E_L_0) },
  6693. },
  6694. /* VEX_LEN_0FXOP_08_8F */
  6695. {
  6696. { VEX_W_TABLE (VEX_W_0FXOP_08_8F_L_0) },
  6697. },
  6698. /* VEX_LEN_0FXOP_08_95 */
  6699. {
  6700. { VEX_W_TABLE (VEX_W_0FXOP_08_95_L_0) },
  6701. },
  6702. /* VEX_LEN_0FXOP_08_96 */
  6703. {
  6704. { VEX_W_TABLE (VEX_W_0FXOP_08_96_L_0) },
  6705. },
  6706. /* VEX_LEN_0FXOP_08_97 */
  6707. {
  6708. { VEX_W_TABLE (VEX_W_0FXOP_08_97_L_0) },
  6709. },
  6710. /* VEX_LEN_0FXOP_08_9E */
  6711. {
  6712. { VEX_W_TABLE (VEX_W_0FXOP_08_9E_L_0) },
  6713. },
  6714. /* VEX_LEN_0FXOP_08_9F */
  6715. {
  6716. { VEX_W_TABLE (VEX_W_0FXOP_08_9F_L_0) },
  6717. },
  6718. /* VEX_LEN_0FXOP_08_A3 */
  6719. {
  6720. { "vpperm", { XM, Vex, EXx, XMVexI4 }, 0 },
  6721. },
  6722. /* VEX_LEN_0FXOP_08_A6 */
  6723. {
  6724. { VEX_W_TABLE (VEX_W_0FXOP_08_A6_L_0) },
  6725. },
  6726. /* VEX_LEN_0FXOP_08_B6 */
  6727. {
  6728. { VEX_W_TABLE (VEX_W_0FXOP_08_B6_L_0) },
  6729. },
  6730. /* VEX_LEN_0FXOP_08_C0 */
  6731. {
  6732. { VEX_W_TABLE (VEX_W_0FXOP_08_C0_L_0) },
  6733. },
  6734. /* VEX_LEN_0FXOP_08_C1 */
  6735. {
  6736. { VEX_W_TABLE (VEX_W_0FXOP_08_C1_L_0) },
  6737. },
  6738. /* VEX_LEN_0FXOP_08_C2 */
  6739. {
  6740. { VEX_W_TABLE (VEX_W_0FXOP_08_C2_L_0) },
  6741. },
  6742. /* VEX_LEN_0FXOP_08_C3 */
  6743. {
  6744. { VEX_W_TABLE (VEX_W_0FXOP_08_C3_L_0) },
  6745. },
  6746. /* VEX_LEN_0FXOP_08_CC */
  6747. {
  6748. { VEX_W_TABLE (VEX_W_0FXOP_08_CC_L_0) },
  6749. },
  6750. /* VEX_LEN_0FXOP_08_CD */
  6751. {
  6752. { VEX_W_TABLE (VEX_W_0FXOP_08_CD_L_0) },
  6753. },
  6754. /* VEX_LEN_0FXOP_08_CE */
  6755. {
  6756. { VEX_W_TABLE (VEX_W_0FXOP_08_CE_L_0) },
  6757. },
  6758. /* VEX_LEN_0FXOP_08_CF */
  6759. {
  6760. { VEX_W_TABLE (VEX_W_0FXOP_08_CF_L_0) },
  6761. },
  6762. /* VEX_LEN_0FXOP_08_EC */
  6763. {
  6764. { VEX_W_TABLE (VEX_W_0FXOP_08_EC_L_0) },
  6765. },
  6766. /* VEX_LEN_0FXOP_08_ED */
  6767. {
  6768. { VEX_W_TABLE (VEX_W_0FXOP_08_ED_L_0) },
  6769. },
  6770. /* VEX_LEN_0FXOP_08_EE */
  6771. {
  6772. { VEX_W_TABLE (VEX_W_0FXOP_08_EE_L_0) },
  6773. },
  6774. /* VEX_LEN_0FXOP_08_EF */
  6775. {
  6776. { VEX_W_TABLE (VEX_W_0FXOP_08_EF_L_0) },
  6777. },
  6778. /* VEX_LEN_0FXOP_09_01 */
  6779. {
  6780. { REG_TABLE (REG_XOP_09_01_L_0) },
  6781. },
  6782. /* VEX_LEN_0FXOP_09_02 */
  6783. {
  6784. { REG_TABLE (REG_XOP_09_02_L_0) },
  6785. },
  6786. /* VEX_LEN_0FXOP_09_12_M_1 */
  6787. {
  6788. { REG_TABLE (REG_XOP_09_12_M_1_L_0) },
  6789. },
  6790. /* VEX_LEN_0FXOP_09_82_W_0 */
  6791. {
  6792. { "vfrczss", { XM, EXd }, 0 },
  6793. },
  6794. /* VEX_LEN_0FXOP_09_83_W_0 */
  6795. {
  6796. { "vfrczsd", { XM, EXq }, 0 },
  6797. },
  6798. /* VEX_LEN_0FXOP_09_90 */
  6799. {
  6800. { "vprotb", { XM, EXx, VexW }, 0 },
  6801. },
  6802. /* VEX_LEN_0FXOP_09_91 */
  6803. {
  6804. { "vprotw", { XM, EXx, VexW }, 0 },
  6805. },
  6806. /* VEX_LEN_0FXOP_09_92 */
  6807. {
  6808. { "vprotd", { XM, EXx, VexW }, 0 },
  6809. },
  6810. /* VEX_LEN_0FXOP_09_93 */
  6811. {
  6812. { "vprotq", { XM, EXx, VexW }, 0 },
  6813. },
  6814. /* VEX_LEN_0FXOP_09_94 */
  6815. {
  6816. { "vpshlb", { XM, EXx, VexW }, 0 },
  6817. },
  6818. /* VEX_LEN_0FXOP_09_95 */
  6819. {
  6820. { "vpshlw", { XM, EXx, VexW }, 0 },
  6821. },
  6822. /* VEX_LEN_0FXOP_09_96 */
  6823. {
  6824. { "vpshld", { XM, EXx, VexW }, 0 },
  6825. },
  6826. /* VEX_LEN_0FXOP_09_97 */
  6827. {
  6828. { "vpshlq", { XM, EXx, VexW }, 0 },
  6829. },
  6830. /* VEX_LEN_0FXOP_09_98 */
  6831. {
  6832. { "vpshab", { XM, EXx, VexW }, 0 },
  6833. },
  6834. /* VEX_LEN_0FXOP_09_99 */
  6835. {
  6836. { "vpshaw", { XM, EXx, VexW }, 0 },
  6837. },
  6838. /* VEX_LEN_0FXOP_09_9A */
  6839. {
  6840. { "vpshad", { XM, EXx, VexW }, 0 },
  6841. },
  6842. /* VEX_LEN_0FXOP_09_9B */
  6843. {
  6844. { "vpshaq", { XM, EXx, VexW }, 0 },
  6845. },
  6846. /* VEX_LEN_0FXOP_09_C1 */
  6847. {
  6848. { VEX_W_TABLE (VEX_W_0FXOP_09_C1_L_0) },
  6849. },
  6850. /* VEX_LEN_0FXOP_09_C2 */
  6851. {
  6852. { VEX_W_TABLE (VEX_W_0FXOP_09_C2_L_0) },
  6853. },
  6854. /* VEX_LEN_0FXOP_09_C3 */
  6855. {
  6856. { VEX_W_TABLE (VEX_W_0FXOP_09_C3_L_0) },
  6857. },
  6858. /* VEX_LEN_0FXOP_09_C6 */
  6859. {
  6860. { VEX_W_TABLE (VEX_W_0FXOP_09_C6_L_0) },
  6861. },
  6862. /* VEX_LEN_0FXOP_09_C7 */
  6863. {
  6864. { VEX_W_TABLE (VEX_W_0FXOP_09_C7_L_0) },
  6865. },
  6866. /* VEX_LEN_0FXOP_09_CB */
  6867. {
  6868. { VEX_W_TABLE (VEX_W_0FXOP_09_CB_L_0) },
  6869. },
  6870. /* VEX_LEN_0FXOP_09_D1 */
  6871. {
  6872. { VEX_W_TABLE (VEX_W_0FXOP_09_D1_L_0) },
  6873. },
  6874. /* VEX_LEN_0FXOP_09_D2 */
  6875. {
  6876. { VEX_W_TABLE (VEX_W_0FXOP_09_D2_L_0) },
  6877. },
  6878. /* VEX_LEN_0FXOP_09_D3 */
  6879. {
  6880. { VEX_W_TABLE (VEX_W_0FXOP_09_D3_L_0) },
  6881. },
  6882. /* VEX_LEN_0FXOP_09_D6 */
  6883. {
  6884. { VEX_W_TABLE (VEX_W_0FXOP_09_D6_L_0) },
  6885. },
  6886. /* VEX_LEN_0FXOP_09_D7 */
  6887. {
  6888. { VEX_W_TABLE (VEX_W_0FXOP_09_D7_L_0) },
  6889. },
  6890. /* VEX_LEN_0FXOP_09_DB */
  6891. {
  6892. { VEX_W_TABLE (VEX_W_0FXOP_09_DB_L_0) },
  6893. },
  6894. /* VEX_LEN_0FXOP_09_E1 */
  6895. {
  6896. { VEX_W_TABLE (VEX_W_0FXOP_09_E1_L_0) },
  6897. },
  6898. /* VEX_LEN_0FXOP_09_E2 */
  6899. {
  6900. { VEX_W_TABLE (VEX_W_0FXOP_09_E2_L_0) },
  6901. },
  6902. /* VEX_LEN_0FXOP_09_E3 */
  6903. {
  6904. { VEX_W_TABLE (VEX_W_0FXOP_09_E3_L_0) },
  6905. },
  6906. /* VEX_LEN_0FXOP_0A_12 */
  6907. {
  6908. { REG_TABLE (REG_XOP_0A_12_L_0) },
  6909. },
  6910. };
  6911. #include "i386-dis-evex-len.h"
  6912. static const struct dis386 vex_w_table[][2] = {
  6913. {
  6914. /* VEX_W_0F41_L_1_M_1 */
  6915. { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_0) },
  6916. { PREFIX_TABLE (PREFIX_VEX_0F41_L_1_M_1_W_1) },
  6917. },
  6918. {
  6919. /* VEX_W_0F42_L_1_M_1 */
  6920. { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_0) },
  6921. { PREFIX_TABLE (PREFIX_VEX_0F42_L_1_M_1_W_1) },
  6922. },
  6923. {
  6924. /* VEX_W_0F44_L_0_M_1 */
  6925. { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_0) },
  6926. { PREFIX_TABLE (PREFIX_VEX_0F44_L_0_M_1_W_1) },
  6927. },
  6928. {
  6929. /* VEX_W_0F45_L_1_M_1 */
  6930. { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_0) },
  6931. { PREFIX_TABLE (PREFIX_VEX_0F45_L_1_M_1_W_1) },
  6932. },
  6933. {
  6934. /* VEX_W_0F46_L_1_M_1 */
  6935. { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_0) },
  6936. { PREFIX_TABLE (PREFIX_VEX_0F46_L_1_M_1_W_1) },
  6937. },
  6938. {
  6939. /* VEX_W_0F47_L_1_M_1 */
  6940. { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_0) },
  6941. { PREFIX_TABLE (PREFIX_VEX_0F47_L_1_M_1_W_1) },
  6942. },
  6943. {
  6944. /* VEX_W_0F4A_L_1_M_1 */
  6945. { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_0) },
  6946. { PREFIX_TABLE (PREFIX_VEX_0F4A_L_1_M_1_W_1) },
  6947. },
  6948. {
  6949. /* VEX_W_0F4B_L_1_M_1 */
  6950. { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_0) },
  6951. { PREFIX_TABLE (PREFIX_VEX_0F4B_L_1_M_1_W_1) },
  6952. },
  6953. {
  6954. /* VEX_W_0F90_L_0 */
  6955. { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_0) },
  6956. { PREFIX_TABLE (PREFIX_VEX_0F90_L_0_W_1) },
  6957. },
  6958. {
  6959. /* VEX_W_0F91_L_0_M_0 */
  6960. { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_0) },
  6961. { PREFIX_TABLE (PREFIX_VEX_0F91_L_0_M_0_W_1) },
  6962. },
  6963. {
  6964. /* VEX_W_0F92_L_0_M_1 */
  6965. { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_0) },
  6966. { PREFIX_TABLE (PREFIX_VEX_0F92_L_0_M_1_W_1) },
  6967. },
  6968. {
  6969. /* VEX_W_0F93_L_0_M_1 */
  6970. { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_0) },
  6971. { PREFIX_TABLE (PREFIX_VEX_0F93_L_0_M_1_W_1) },
  6972. },
  6973. {
  6974. /* VEX_W_0F98_L_0_M_1 */
  6975. { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_0) },
  6976. { PREFIX_TABLE (PREFIX_VEX_0F98_L_0_M_1_W_1) },
  6977. },
  6978. {
  6979. /* VEX_W_0F99_L_0_M_1 */
  6980. { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_0) },
  6981. { PREFIX_TABLE (PREFIX_VEX_0F99_L_0_M_1_W_1) },
  6982. },
  6983. {
  6984. /* VEX_W_0F380C */
  6985. { "vpermilps", { XM, Vex, EXx }, PREFIX_DATA },
  6986. },
  6987. {
  6988. /* VEX_W_0F380D */
  6989. { "vpermilpd", { XM, Vex, EXx }, PREFIX_DATA },
  6990. },
  6991. {
  6992. /* VEX_W_0F380E */
  6993. { "vtestps", { XM, EXx }, PREFIX_DATA },
  6994. },
  6995. {
  6996. /* VEX_W_0F380F */
  6997. { "vtestpd", { XM, EXx }, PREFIX_DATA },
  6998. },
  6999. {
  7000. /* VEX_W_0F3813 */
  7001. { "vcvtph2ps", { XM, EXxmmq }, PREFIX_DATA },
  7002. },
  7003. {
  7004. /* VEX_W_0F3816_L_1 */
  7005. { "vpermps", { XM, Vex, EXx }, PREFIX_DATA },
  7006. },
  7007. {
  7008. /* VEX_W_0F3818 */
  7009. { "vbroadcastss", { XM, EXd }, PREFIX_DATA },
  7010. },
  7011. {
  7012. /* VEX_W_0F3819_L_1 */
  7013. { "vbroadcastsd", { XM, EXq }, PREFIX_DATA },
  7014. },
  7015. {
  7016. /* VEX_W_0F381A_M_0_L_1 */
  7017. { "vbroadcastf128", { XM, Mxmm }, PREFIX_DATA },
  7018. },
  7019. {
  7020. /* VEX_W_0F382C_M_0 */
  7021. { "vmaskmovps", { XM, Vex, Mx }, PREFIX_DATA },
  7022. },
  7023. {
  7024. /* VEX_W_0F382D_M_0 */
  7025. { "vmaskmovpd", { XM, Vex, Mx }, PREFIX_DATA },
  7026. },
  7027. {
  7028. /* VEX_W_0F382E_M_0 */
  7029. { "vmaskmovps", { Mx, Vex, XM }, PREFIX_DATA },
  7030. },
  7031. {
  7032. /* VEX_W_0F382F_M_0 */
  7033. { "vmaskmovpd", { Mx, Vex, XM }, PREFIX_DATA },
  7034. },
  7035. {
  7036. /* VEX_W_0F3836 */
  7037. { "vpermd", { XM, Vex, EXx }, PREFIX_DATA },
  7038. },
  7039. {
  7040. /* VEX_W_0F3846 */
  7041. { "vpsravd", { XM, Vex, EXx }, PREFIX_DATA },
  7042. },
  7043. {
  7044. /* VEX_W_0F3849_X86_64_P_0 */
  7045. { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_0_W_0) },
  7046. },
  7047. {
  7048. /* VEX_W_0F3849_X86_64_P_2 */
  7049. { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_2_W_0) },
  7050. },
  7051. {
  7052. /* VEX_W_0F3849_X86_64_P_3 */
  7053. { MOD_TABLE (MOD_VEX_0F3849_X86_64_P_3_W_0) },
  7054. },
  7055. {
  7056. /* VEX_W_0F384B_X86_64_P_1 */
  7057. { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_1_W_0) },
  7058. },
  7059. {
  7060. /* VEX_W_0F384B_X86_64_P_2 */
  7061. { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_2_W_0) },
  7062. },
  7063. {
  7064. /* VEX_W_0F384B_X86_64_P_3 */
  7065. { MOD_TABLE (MOD_VEX_0F384B_X86_64_P_3_W_0) },
  7066. },
  7067. {
  7068. /* VEX_W_0F3850 */
  7069. { "%XV vpdpbusd", { XM, Vex, EXx }, 0 },
  7070. },
  7071. {
  7072. /* VEX_W_0F3851 */
  7073. { "%XV vpdpbusds", { XM, Vex, EXx }, 0 },
  7074. },
  7075. {
  7076. /* VEX_W_0F3852 */
  7077. { "%XV vpdpwssd", { XM, Vex, EXx }, 0 },
  7078. },
  7079. {
  7080. /* VEX_W_0F3853 */
  7081. { "%XV vpdpwssds", { XM, Vex, EXx }, 0 },
  7082. },
  7083. {
  7084. /* VEX_W_0F3858 */
  7085. { "vpbroadcastd", { XM, EXd }, PREFIX_DATA },
  7086. },
  7087. {
  7088. /* VEX_W_0F3859 */
  7089. { "vpbroadcastq", { XM, EXq }, PREFIX_DATA },
  7090. },
  7091. {
  7092. /* VEX_W_0F385A_M_0_L_0 */
  7093. { "vbroadcasti128", { XM, Mxmm }, PREFIX_DATA },
  7094. },
  7095. {
  7096. /* VEX_W_0F385C_X86_64_P_1 */
  7097. { MOD_TABLE (MOD_VEX_0F385C_X86_64_P_1_W_0) },
  7098. },
  7099. {
  7100. /* VEX_W_0F385E_X86_64_P_0 */
  7101. { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_0_W_0) },
  7102. },
  7103. {
  7104. /* VEX_W_0F385E_X86_64_P_1 */
  7105. { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_1_W_0) },
  7106. },
  7107. {
  7108. /* VEX_W_0F385E_X86_64_P_2 */
  7109. { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_2_W_0) },
  7110. },
  7111. {
  7112. /* VEX_W_0F385E_X86_64_P_3 */
  7113. { MOD_TABLE (MOD_VEX_0F385E_X86_64_P_3_W_0) },
  7114. },
  7115. {
  7116. /* VEX_W_0F3878 */
  7117. { "vpbroadcastb", { XM, EXb }, PREFIX_DATA },
  7118. },
  7119. {
  7120. /* VEX_W_0F3879 */
  7121. { "vpbroadcastw", { XM, EXw }, PREFIX_DATA },
  7122. },
  7123. {
  7124. /* VEX_W_0F38CF */
  7125. { "vgf2p8mulb", { XM, Vex, EXx }, PREFIX_DATA },
  7126. },
  7127. {
  7128. /* VEX_W_0F3A00_L_1 */
  7129. { Bad_Opcode },
  7130. { "vpermq", { XM, EXx, Ib }, PREFIX_DATA },
  7131. },
  7132. {
  7133. /* VEX_W_0F3A01_L_1 */
  7134. { Bad_Opcode },
  7135. { "vpermpd", { XM, EXx, Ib }, PREFIX_DATA },
  7136. },
  7137. {
  7138. /* VEX_W_0F3A02 */
  7139. { "vpblendd", { XM, Vex, EXx, Ib }, PREFIX_DATA },
  7140. },
  7141. {
  7142. /* VEX_W_0F3A04 */
  7143. { "vpermilps", { XM, EXx, Ib }, PREFIX_DATA },
  7144. },
  7145. {
  7146. /* VEX_W_0F3A05 */
  7147. { "vpermilpd", { XM, EXx, Ib }, PREFIX_DATA },
  7148. },
  7149. {
  7150. /* VEX_W_0F3A06_L_1 */
  7151. { "vperm2f128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
  7152. },
  7153. {
  7154. /* VEX_W_0F3A18_L_1 */
  7155. { "vinsertf128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
  7156. },
  7157. {
  7158. /* VEX_W_0F3A19_L_1 */
  7159. { "vextractf128", { EXxmm, XM, Ib }, PREFIX_DATA },
  7160. },
  7161. {
  7162. /* VEX_W_0F3A1D */
  7163. { "vcvtps2ph", { EXxmmq, XM, EXxEVexS, Ib }, PREFIX_DATA },
  7164. },
  7165. {
  7166. /* VEX_W_0F3A38_L_1 */
  7167. { "vinserti128", { XM, Vex, EXxmm, Ib }, PREFIX_DATA },
  7168. },
  7169. {
  7170. /* VEX_W_0F3A39_L_1 */
  7171. { "vextracti128", { EXxmm, XM, Ib }, PREFIX_DATA },
  7172. },
  7173. {
  7174. /* VEX_W_0F3A46_L_1 */
  7175. { "vperm2i128", { XM, Vex, EXx, Ib }, PREFIX_DATA },
  7176. },
  7177. {
  7178. /* VEX_W_0F3A4A */
  7179. { "vblendvps", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  7180. },
  7181. {
  7182. /* VEX_W_0F3A4B */
  7183. { "vblendvpd", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  7184. },
  7185. {
  7186. /* VEX_W_0F3A4C */
  7187. { "vpblendvb", { XM, Vex, EXx, XMVexI4 }, PREFIX_DATA },
  7188. },
  7189. {
  7190. /* VEX_W_0F3ACE */
  7191. { Bad_Opcode },
  7192. { "vgf2p8affineqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
  7193. },
  7194. {
  7195. /* VEX_W_0F3ACF */
  7196. { Bad_Opcode },
  7197. { "vgf2p8affineinvqb", { XM, Vex, EXx, Ib }, PREFIX_DATA },
  7198. },
  7199. /* VEX_W_0FXOP_08_85_L_0 */
  7200. {
  7201. { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 },
  7202. },
  7203. /* VEX_W_0FXOP_08_86_L_0 */
  7204. {
  7205. { "vpmacsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
  7206. },
  7207. /* VEX_W_0FXOP_08_87_L_0 */
  7208. {
  7209. { "vpmacssdql", { XM, Vex, EXx, XMVexI4 }, 0 },
  7210. },
  7211. /* VEX_W_0FXOP_08_8E_L_0 */
  7212. {
  7213. { "vpmacssdd", { XM, Vex, EXx, XMVexI4 }, 0 },
  7214. },
  7215. /* VEX_W_0FXOP_08_8F_L_0 */
  7216. {
  7217. { "vpmacssdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
  7218. },
  7219. /* VEX_W_0FXOP_08_95_L_0 */
  7220. {
  7221. { "vpmacsww", { XM, Vex, EXx, XMVexI4 }, 0 },
  7222. },
  7223. /* VEX_W_0FXOP_08_96_L_0 */
  7224. {
  7225. { "vpmacswd", { XM, Vex, EXx, XMVexI4 }, 0 },
  7226. },
  7227. /* VEX_W_0FXOP_08_97_L_0 */
  7228. {
  7229. { "vpmacsdql", { XM, Vex, EXx, XMVexI4 }, 0 },
  7230. },
  7231. /* VEX_W_0FXOP_08_9E_L_0 */
  7232. {
  7233. { "vpmacsdd", { XM, Vex, EXx, XMVexI4 }, 0 },
  7234. },
  7235. /* VEX_W_0FXOP_08_9F_L_0 */
  7236. {
  7237. { "vpmacsdqh", { XM, Vex, EXx, XMVexI4 }, 0 },
  7238. },
  7239. /* VEX_W_0FXOP_08_A6_L_0 */
  7240. {
  7241. { "vpmadcsswd", { XM, Vex, EXx, XMVexI4 }, 0 },
  7242. },
  7243. /* VEX_W_0FXOP_08_B6_L_0 */
  7244. {
  7245. { "vpmadcswd", { XM, Vex, EXx, XMVexI4 }, 0 },
  7246. },
  7247. /* VEX_W_0FXOP_08_C0_L_0 */
  7248. {
  7249. { "vprotb", { XM, EXx, Ib }, 0 },
  7250. },
  7251. /* VEX_W_0FXOP_08_C1_L_0 */
  7252. {
  7253. { "vprotw", { XM, EXx, Ib }, 0 },
  7254. },
  7255. /* VEX_W_0FXOP_08_C2_L_0 */
  7256. {
  7257. { "vprotd", { XM, EXx, Ib }, 0 },
  7258. },
  7259. /* VEX_W_0FXOP_08_C3_L_0 */
  7260. {
  7261. { "vprotq", { XM, EXx, Ib }, 0 },
  7262. },
  7263. /* VEX_W_0FXOP_08_CC_L_0 */
  7264. {
  7265. { "vpcomb", { XM, Vex, EXx, VPCOM }, 0 },
  7266. },
  7267. /* VEX_W_0FXOP_08_CD_L_0 */
  7268. {
  7269. { "vpcomw", { XM, Vex, EXx, VPCOM }, 0 },
  7270. },
  7271. /* VEX_W_0FXOP_08_CE_L_0 */
  7272. {
  7273. { "vpcomd", { XM, Vex, EXx, VPCOM }, 0 },
  7274. },
  7275. /* VEX_W_0FXOP_08_CF_L_0 */
  7276. {
  7277. { "vpcomq", { XM, Vex, EXx, VPCOM }, 0 },
  7278. },
  7279. /* VEX_W_0FXOP_08_EC_L_0 */
  7280. {
  7281. { "vpcomub", { XM, Vex, EXx, VPCOM }, 0 },
  7282. },
  7283. /* VEX_W_0FXOP_08_ED_L_0 */
  7284. {
  7285. { "vpcomuw", { XM, Vex, EXx, VPCOM }, 0 },
  7286. },
  7287. /* VEX_W_0FXOP_08_EE_L_0 */
  7288. {
  7289. { "vpcomud", { XM, Vex, EXx, VPCOM }, 0 },
  7290. },
  7291. /* VEX_W_0FXOP_08_EF_L_0 */
  7292. {
  7293. { "vpcomuq", { XM, Vex, EXx, VPCOM }, 0 },
  7294. },
  7295. /* VEX_W_0FXOP_09_80 */
  7296. {
  7297. { "vfrczps", { XM, EXx }, 0 },
  7298. },
  7299. /* VEX_W_0FXOP_09_81 */
  7300. {
  7301. { "vfrczpd", { XM, EXx }, 0 },
  7302. },
  7303. /* VEX_W_0FXOP_09_82 */
  7304. {
  7305. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_82_W_0) },
  7306. },
  7307. /* VEX_W_0FXOP_09_83 */
  7308. {
  7309. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_83_W_0) },
  7310. },
  7311. /* VEX_W_0FXOP_09_C1_L_0 */
  7312. {
  7313. { "vphaddbw", { XM, EXxmm }, 0 },
  7314. },
  7315. /* VEX_W_0FXOP_09_C2_L_0 */
  7316. {
  7317. { "vphaddbd", { XM, EXxmm }, 0 },
  7318. },
  7319. /* VEX_W_0FXOP_09_C3_L_0 */
  7320. {
  7321. { "vphaddbq", { XM, EXxmm }, 0 },
  7322. },
  7323. /* VEX_W_0FXOP_09_C6_L_0 */
  7324. {
  7325. { "vphaddwd", { XM, EXxmm }, 0 },
  7326. },
  7327. /* VEX_W_0FXOP_09_C7_L_0 */
  7328. {
  7329. { "vphaddwq", { XM, EXxmm }, 0 },
  7330. },
  7331. /* VEX_W_0FXOP_09_CB_L_0 */
  7332. {
  7333. { "vphadddq", { XM, EXxmm }, 0 },
  7334. },
  7335. /* VEX_W_0FXOP_09_D1_L_0 */
  7336. {
  7337. { "vphaddubw", { XM, EXxmm }, 0 },
  7338. },
  7339. /* VEX_W_0FXOP_09_D2_L_0 */
  7340. {
  7341. { "vphaddubd", { XM, EXxmm }, 0 },
  7342. },
  7343. /* VEX_W_0FXOP_09_D3_L_0 */
  7344. {
  7345. { "vphaddubq", { XM, EXxmm }, 0 },
  7346. },
  7347. /* VEX_W_0FXOP_09_D6_L_0 */
  7348. {
  7349. { "vphadduwd", { XM, EXxmm }, 0 },
  7350. },
  7351. /* VEX_W_0FXOP_09_D7_L_0 */
  7352. {
  7353. { "vphadduwq", { XM, EXxmm }, 0 },
  7354. },
  7355. /* VEX_W_0FXOP_09_DB_L_0 */
  7356. {
  7357. { "vphaddudq", { XM, EXxmm }, 0 },
  7358. },
  7359. /* VEX_W_0FXOP_09_E1_L_0 */
  7360. {
  7361. { "vphsubbw", { XM, EXxmm }, 0 },
  7362. },
  7363. /* VEX_W_0FXOP_09_E2_L_0 */
  7364. {
  7365. { "vphsubwd", { XM, EXxmm }, 0 },
  7366. },
  7367. /* VEX_W_0FXOP_09_E3_L_0 */
  7368. {
  7369. { "vphsubdq", { XM, EXxmm }, 0 },
  7370. },
  7371. #include "i386-dis-evex-w.h"
  7372. };
  7373. static const struct dis386 mod_table[][2] = {
  7374. {
  7375. /* MOD_62_32BIT */
  7376. { "bound{S|}", { Gv, Ma }, 0 },
  7377. { EVEX_TABLE (EVEX_0F) },
  7378. },
  7379. {
  7380. /* MOD_8D */
  7381. { "leaS", { Gv, M }, 0 },
  7382. },
  7383. {
  7384. /* MOD_C4_32BIT */
  7385. { "lesS", { Gv, Mp }, 0 },
  7386. { VEX_C4_TABLE (VEX_0F) },
  7387. },
  7388. {
  7389. /* MOD_C5_32BIT */
  7390. { "ldsS", { Gv, Mp }, 0 },
  7391. { VEX_C5_TABLE (VEX_0F) },
  7392. },
  7393. {
  7394. /* MOD_C6_REG_7 */
  7395. { Bad_Opcode },
  7396. { RM_TABLE (RM_C6_REG_7) },
  7397. },
  7398. {
  7399. /* MOD_C7_REG_7 */
  7400. { Bad_Opcode },
  7401. { RM_TABLE (RM_C7_REG_7) },
  7402. },
  7403. {
  7404. /* MOD_FF_REG_3 */
  7405. { "{l|}call^", { indirEp }, 0 },
  7406. },
  7407. {
  7408. /* MOD_FF_REG_5 */
  7409. { "{l|}jmp^", { indirEp }, 0 },
  7410. },
  7411. {
  7412. /* MOD_0F01_REG_0 */
  7413. { X86_64_TABLE (X86_64_0F01_REG_0) },
  7414. { RM_TABLE (RM_0F01_REG_0) },
  7415. },
  7416. {
  7417. /* MOD_0F01_REG_1 */
  7418. { X86_64_TABLE (X86_64_0F01_REG_1) },
  7419. { RM_TABLE (RM_0F01_REG_1) },
  7420. },
  7421. {
  7422. /* MOD_0F01_REG_2 */
  7423. { X86_64_TABLE (X86_64_0F01_REG_2) },
  7424. { RM_TABLE (RM_0F01_REG_2) },
  7425. },
  7426. {
  7427. /* MOD_0F01_REG_3 */
  7428. { X86_64_TABLE (X86_64_0F01_REG_3) },
  7429. { RM_TABLE (RM_0F01_REG_3) },
  7430. },
  7431. {
  7432. /* MOD_0F01_REG_5 */
  7433. { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_0) },
  7434. { RM_TABLE (RM_0F01_REG_5_MOD_3) },
  7435. },
  7436. {
  7437. /* MOD_0F01_REG_7 */
  7438. { "invlpg", { Mb }, 0 },
  7439. { RM_TABLE (RM_0F01_REG_7_MOD_3) },
  7440. },
  7441. {
  7442. /* MOD_0F12_PREFIX_0 */
  7443. { "movlpX", { XM, EXq }, 0 },
  7444. { "movhlps", { XM, EXq }, 0 },
  7445. },
  7446. {
  7447. /* MOD_0F12_PREFIX_2 */
  7448. { "movlpX", { XM, EXq }, 0 },
  7449. },
  7450. {
  7451. /* MOD_0F13 */
  7452. { "movlpX", { EXq, XM }, PREFIX_OPCODE },
  7453. },
  7454. {
  7455. /* MOD_0F16_PREFIX_0 */
  7456. { "movhpX", { XM, EXq }, 0 },
  7457. { "movlhps", { XM, EXq }, 0 },
  7458. },
  7459. {
  7460. /* MOD_0F16_PREFIX_2 */
  7461. { "movhpX", { XM, EXq }, 0 },
  7462. },
  7463. {
  7464. /* MOD_0F17 */
  7465. { "movhpX", { EXq, XM }, PREFIX_OPCODE },
  7466. },
  7467. {
  7468. /* MOD_0F18_REG_0 */
  7469. { "prefetchnta", { Mb }, 0 },
  7470. { "nopQ", { Ev }, 0 },
  7471. },
  7472. {
  7473. /* MOD_0F18_REG_1 */
  7474. { "prefetcht0", { Mb }, 0 },
  7475. { "nopQ", { Ev }, 0 },
  7476. },
  7477. {
  7478. /* MOD_0F18_REG_2 */
  7479. { "prefetcht1", { Mb }, 0 },
  7480. { "nopQ", { Ev }, 0 },
  7481. },
  7482. {
  7483. /* MOD_0F18_REG_3 */
  7484. { "prefetcht2", { Mb }, 0 },
  7485. { "nopQ", { Ev }, 0 },
  7486. },
  7487. {
  7488. /* MOD_0F1A_PREFIX_0 */
  7489. { "bndldx", { Gbnd, Mv_bnd }, 0 },
  7490. { "nopQ", { Ev }, 0 },
  7491. },
  7492. {
  7493. /* MOD_0F1B_PREFIX_0 */
  7494. { "bndstx", { Mv_bnd, Gbnd }, 0 },
  7495. { "nopQ", { Ev }, 0 },
  7496. },
  7497. {
  7498. /* MOD_0F1B_PREFIX_1 */
  7499. { "bndmk", { Gbnd, Mv_bnd }, 0 },
  7500. { "nopQ", { Ev }, PREFIX_IGNORED },
  7501. },
  7502. {
  7503. /* MOD_0F1C_PREFIX_0 */
  7504. { REG_TABLE (REG_0F1C_P_0_MOD_0) },
  7505. { "nopQ", { Ev }, 0 },
  7506. },
  7507. {
  7508. /* MOD_0F1E_PREFIX_1 */
  7509. { "nopQ", { Ev }, PREFIX_IGNORED },
  7510. { REG_TABLE (REG_0F1E_P_1_MOD_3) },
  7511. },
  7512. {
  7513. /* MOD_0F2B_PREFIX_0 */
  7514. {"movntps", { Mx, XM }, PREFIX_OPCODE },
  7515. },
  7516. {
  7517. /* MOD_0F2B_PREFIX_1 */
  7518. {"movntss", { Md, XM }, PREFIX_OPCODE },
  7519. },
  7520. {
  7521. /* MOD_0F2B_PREFIX_2 */
  7522. {"movntpd", { Mx, XM }, PREFIX_OPCODE },
  7523. },
  7524. {
  7525. /* MOD_0F2B_PREFIX_3 */
  7526. {"movntsd", { Mq, XM }, PREFIX_OPCODE },
  7527. },
  7528. {
  7529. /* MOD_0F50 */
  7530. { Bad_Opcode },
  7531. { "movmskpX", { Gdq, XS }, PREFIX_OPCODE },
  7532. },
  7533. {
  7534. /* MOD_0F71 */
  7535. { Bad_Opcode },
  7536. { REG_TABLE (REG_0F71_MOD_0) },
  7537. },
  7538. {
  7539. /* MOD_0F72 */
  7540. { Bad_Opcode },
  7541. { REG_TABLE (REG_0F72_MOD_0) },
  7542. },
  7543. {
  7544. /* MOD_0F73 */
  7545. { Bad_Opcode },
  7546. { REG_TABLE (REG_0F73_MOD_0) },
  7547. },
  7548. {
  7549. /* MOD_0FAE_REG_0 */
  7550. { "fxsave", { FXSAVE }, 0 },
  7551. { PREFIX_TABLE (PREFIX_0FAE_REG_0_MOD_3) },
  7552. },
  7553. {
  7554. /* MOD_0FAE_REG_1 */
  7555. { "fxrstor", { FXSAVE }, 0 },
  7556. { PREFIX_TABLE (PREFIX_0FAE_REG_1_MOD_3) },
  7557. },
  7558. {
  7559. /* MOD_0FAE_REG_2 */
  7560. { "ldmxcsr", { Md }, 0 },
  7561. { PREFIX_TABLE (PREFIX_0FAE_REG_2_MOD_3) },
  7562. },
  7563. {
  7564. /* MOD_0FAE_REG_3 */
  7565. { "stmxcsr", { Md }, 0 },
  7566. { PREFIX_TABLE (PREFIX_0FAE_REG_3_MOD_3) },
  7567. },
  7568. {
  7569. /* MOD_0FAE_REG_4 */
  7570. { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_0) },
  7571. { PREFIX_TABLE (PREFIX_0FAE_REG_4_MOD_3) },
  7572. },
  7573. {
  7574. /* MOD_0FAE_REG_5 */
  7575. { "xrstor", { FXSAVE }, PREFIX_OPCODE },
  7576. { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) },
  7577. },
  7578. {
  7579. /* MOD_0FAE_REG_6 */
  7580. { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_0) },
  7581. { PREFIX_TABLE (PREFIX_0FAE_REG_6_MOD_3) },
  7582. },
  7583. {
  7584. /* MOD_0FAE_REG_7 */
  7585. { PREFIX_TABLE (PREFIX_0FAE_REG_7_MOD_0) },
  7586. { RM_TABLE (RM_0FAE_REG_7_MOD_3) },
  7587. },
  7588. {
  7589. /* MOD_0FB2 */
  7590. { "lssS", { Gv, Mp }, 0 },
  7591. },
  7592. {
  7593. /* MOD_0FB4 */
  7594. { "lfsS", { Gv, Mp }, 0 },
  7595. },
  7596. {
  7597. /* MOD_0FB5 */
  7598. { "lgsS", { Gv, Mp }, 0 },
  7599. },
  7600. {
  7601. /* MOD_0FC3 */
  7602. { "movntiS", { Edq, Gdq }, PREFIX_OPCODE },
  7603. },
  7604. {
  7605. /* MOD_0FC7_REG_3 */
  7606. { "xrstors", { FXSAVE }, 0 },
  7607. },
  7608. {
  7609. /* MOD_0FC7_REG_4 */
  7610. { "xsavec", { FXSAVE }, 0 },
  7611. },
  7612. {
  7613. /* MOD_0FC7_REG_5 */
  7614. { "xsaves", { FXSAVE }, 0 },
  7615. },
  7616. {
  7617. /* MOD_0FC7_REG_6 */
  7618. { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_0) },
  7619. { PREFIX_TABLE (PREFIX_0FC7_REG_6_MOD_3) }
  7620. },
  7621. {
  7622. /* MOD_0FC7_REG_7 */
  7623. { "vmptrst", { Mq }, 0 },
  7624. { PREFIX_TABLE (PREFIX_0FC7_REG_7_MOD_3) }
  7625. },
  7626. {
  7627. /* MOD_0FD7 */
  7628. { Bad_Opcode },
  7629. { "pmovmskb", { Gdq, MS }, 0 },
  7630. },
  7631. {
  7632. /* MOD_0FE7_PREFIX_2 */
  7633. { "movntdq", { Mx, XM }, 0 },
  7634. },
  7635. {
  7636. /* MOD_0FF0_PREFIX_3 */
  7637. { "lddqu", { XM, M }, 0 },
  7638. },
  7639. {
  7640. /* MOD_0F382A */
  7641. { "movntdqa", { XM, Mx }, PREFIX_DATA },
  7642. },
  7643. {
  7644. /* MOD_0F38DC_PREFIX_1 */
  7645. { "aesenc128kl", { XM, M }, 0 },
  7646. { "loadiwkey", { XM, EXx }, 0 },
  7647. },
  7648. {
  7649. /* MOD_0F38DD_PREFIX_1 */
  7650. { "aesdec128kl", { XM, M }, 0 },
  7651. },
  7652. {
  7653. /* MOD_0F38DE_PREFIX_1 */
  7654. { "aesenc256kl", { XM, M }, 0 },
  7655. },
  7656. {
  7657. /* MOD_0F38DF_PREFIX_1 */
  7658. { "aesdec256kl", { XM, M }, 0 },
  7659. },
  7660. {
  7661. /* MOD_0F38F5 */
  7662. { "wrussK", { M, Gdq }, PREFIX_DATA },
  7663. },
  7664. {
  7665. /* MOD_0F38F6_PREFIX_0 */
  7666. { "wrssK", { M, Gdq }, PREFIX_OPCODE },
  7667. },
  7668. {
  7669. /* MOD_0F38F8_PREFIX_1 */
  7670. { "enqcmds", { Gva, M }, PREFIX_OPCODE },
  7671. },
  7672. {
  7673. /* MOD_0F38F8_PREFIX_2 */
  7674. { "movdir64b", { Gva, M }, PREFIX_OPCODE },
  7675. },
  7676. {
  7677. /* MOD_0F38F8_PREFIX_3 */
  7678. { "enqcmd", { Gva, M }, PREFIX_OPCODE },
  7679. },
  7680. {
  7681. /* MOD_0F38F9 */
  7682. { "movdiri", { Edq, Gdq }, PREFIX_OPCODE },
  7683. },
  7684. {
  7685. /* MOD_0F38FA_PREFIX_1 */
  7686. { Bad_Opcode },
  7687. { "encodekey128", { Gd, Ed }, 0 },
  7688. },
  7689. {
  7690. /* MOD_0F38FB_PREFIX_1 */
  7691. { Bad_Opcode },
  7692. { "encodekey256", { Gd, Ed }, 0 },
  7693. },
  7694. {
  7695. /* MOD_0F3A0F_PREFIX_1 */
  7696. { Bad_Opcode },
  7697. { REG_TABLE (REG_0F3A0F_PREFIX_1_MOD_3) },
  7698. },
  7699. {
  7700. /* MOD_VEX_0F12_PREFIX_0 */
  7701. { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_0) },
  7702. { VEX_LEN_TABLE (VEX_LEN_0F12_P_0_M_1) },
  7703. },
  7704. {
  7705. /* MOD_VEX_0F12_PREFIX_2 */
  7706. { VEX_LEN_TABLE (VEX_LEN_0F12_P_2_M_0) },
  7707. },
  7708. {
  7709. /* MOD_VEX_0F13 */
  7710. { VEX_LEN_TABLE (VEX_LEN_0F13_M_0) },
  7711. },
  7712. {
  7713. /* MOD_VEX_0F16_PREFIX_0 */
  7714. { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_0) },
  7715. { VEX_LEN_TABLE (VEX_LEN_0F16_P_0_M_1) },
  7716. },
  7717. {
  7718. /* MOD_VEX_0F16_PREFIX_2 */
  7719. { VEX_LEN_TABLE (VEX_LEN_0F16_P_2_M_0) },
  7720. },
  7721. {
  7722. /* MOD_VEX_0F17 */
  7723. { VEX_LEN_TABLE (VEX_LEN_0F17_M_0) },
  7724. },
  7725. {
  7726. /* MOD_VEX_0F2B */
  7727. { "vmovntpX", { Mx, XM }, PREFIX_OPCODE },
  7728. },
  7729. {
  7730. /* MOD_VEX_0F41_L_1 */
  7731. { Bad_Opcode },
  7732. { VEX_W_TABLE (VEX_W_0F41_L_1_M_1) },
  7733. },
  7734. {
  7735. /* MOD_VEX_0F42_L_1 */
  7736. { Bad_Opcode },
  7737. { VEX_W_TABLE (VEX_W_0F42_L_1_M_1) },
  7738. },
  7739. {
  7740. /* MOD_VEX_0F44_L_0 */
  7741. { Bad_Opcode },
  7742. { VEX_W_TABLE (VEX_W_0F44_L_0_M_1) },
  7743. },
  7744. {
  7745. /* MOD_VEX_0F45_L_1 */
  7746. { Bad_Opcode },
  7747. { VEX_W_TABLE (VEX_W_0F45_L_1_M_1) },
  7748. },
  7749. {
  7750. /* MOD_VEX_0F46_L_1 */
  7751. { Bad_Opcode },
  7752. { VEX_W_TABLE (VEX_W_0F46_L_1_M_1) },
  7753. },
  7754. {
  7755. /* MOD_VEX_0F47_L_1 */
  7756. { Bad_Opcode },
  7757. { VEX_W_TABLE (VEX_W_0F47_L_1_M_1) },
  7758. },
  7759. {
  7760. /* MOD_VEX_0F4A_L_1 */
  7761. { Bad_Opcode },
  7762. { VEX_W_TABLE (VEX_W_0F4A_L_1_M_1) },
  7763. },
  7764. {
  7765. /* MOD_VEX_0F4B_L_1 */
  7766. { Bad_Opcode },
  7767. { VEX_W_TABLE (VEX_W_0F4B_L_1_M_1) },
  7768. },
  7769. {
  7770. /* MOD_VEX_0F50 */
  7771. { Bad_Opcode },
  7772. { "vmovmskpX", { Gdq, XS }, PREFIX_OPCODE },
  7773. },
  7774. {
  7775. /* MOD_VEX_0F71 */
  7776. { Bad_Opcode },
  7777. { REG_TABLE (REG_VEX_0F71_M_0) },
  7778. },
  7779. {
  7780. /* MOD_VEX_0F72 */
  7781. { Bad_Opcode },
  7782. { REG_TABLE (REG_VEX_0F72_M_0) },
  7783. },
  7784. {
  7785. /* MOD_VEX_0F73 */
  7786. { Bad_Opcode },
  7787. { REG_TABLE (REG_VEX_0F73_M_0) },
  7788. },
  7789. {
  7790. /* MOD_VEX_0F91_L_0 */
  7791. { VEX_W_TABLE (VEX_W_0F91_L_0_M_0) },
  7792. },
  7793. {
  7794. /* MOD_VEX_0F92_L_0 */
  7795. { Bad_Opcode },
  7796. { VEX_W_TABLE (VEX_W_0F92_L_0_M_1) },
  7797. },
  7798. {
  7799. /* MOD_VEX_0F93_L_0 */
  7800. { Bad_Opcode },
  7801. { VEX_W_TABLE (VEX_W_0F93_L_0_M_1) },
  7802. },
  7803. {
  7804. /* MOD_VEX_0F98_L_0 */
  7805. { Bad_Opcode },
  7806. { VEX_W_TABLE (VEX_W_0F98_L_0_M_1) },
  7807. },
  7808. {
  7809. /* MOD_VEX_0F99_L_0 */
  7810. { Bad_Opcode },
  7811. { VEX_W_TABLE (VEX_W_0F99_L_0_M_1) },
  7812. },
  7813. {
  7814. /* MOD_VEX_0FAE_REG_2 */
  7815. { VEX_LEN_TABLE (VEX_LEN_0FAE_R_2_M_0) },
  7816. },
  7817. {
  7818. /* MOD_VEX_0FAE_REG_3 */
  7819. { VEX_LEN_TABLE (VEX_LEN_0FAE_R_3_M_0) },
  7820. },
  7821. {
  7822. /* MOD_VEX_0FD7 */
  7823. { Bad_Opcode },
  7824. { "vpmovmskb", { Gdq, XS }, PREFIX_DATA },
  7825. },
  7826. {
  7827. /* MOD_VEX_0FE7 */
  7828. { "vmovntdq", { Mx, XM }, PREFIX_DATA },
  7829. },
  7830. {
  7831. /* MOD_VEX_0FF0_PREFIX_3 */
  7832. { "vlddqu", { XM, M }, 0 },
  7833. },
  7834. {
  7835. /* MOD_VEX_0F381A */
  7836. { VEX_LEN_TABLE (VEX_LEN_0F381A_M_0) },
  7837. },
  7838. {
  7839. /* MOD_VEX_0F382A */
  7840. { "vmovntdqa", { XM, Mx }, PREFIX_DATA },
  7841. },
  7842. {
  7843. /* MOD_VEX_0F382C */
  7844. { VEX_W_TABLE (VEX_W_0F382C_M_0) },
  7845. },
  7846. {
  7847. /* MOD_VEX_0F382D */
  7848. { VEX_W_TABLE (VEX_W_0F382D_M_0) },
  7849. },
  7850. {
  7851. /* MOD_VEX_0F382E */
  7852. { VEX_W_TABLE (VEX_W_0F382E_M_0) },
  7853. },
  7854. {
  7855. /* MOD_VEX_0F382F */
  7856. { VEX_W_TABLE (VEX_W_0F382F_M_0) },
  7857. },
  7858. {
  7859. /* MOD_VEX_0F3849_X86_64_P_0_W_0 */
  7860. { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_0) },
  7861. { REG_TABLE (REG_VEX_0F3849_X86_64_P_0_W_0_M_1) },
  7862. },
  7863. {
  7864. /* MOD_VEX_0F3849_X86_64_P_2_W_0 */
  7865. { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_2_W_0_M_0) },
  7866. },
  7867. {
  7868. /* MOD_VEX_0F3849_X86_64_P_3_W_0 */
  7869. { Bad_Opcode },
  7870. { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_3_W_0_M_0) },
  7871. },
  7872. {
  7873. /* MOD_VEX_0F384B_X86_64_P_1_W_0 */
  7874. { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_1_W_0_M_0) },
  7875. },
  7876. {
  7877. /* MOD_VEX_0F384B_X86_64_P_2_W_0 */
  7878. { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_2_W_0_M_0) },
  7879. },
  7880. {
  7881. /* MOD_VEX_0F384B_X86_64_P_3_W_0 */
  7882. { VEX_LEN_TABLE (VEX_LEN_0F384B_X86_64_P_3_W_0_M_0) },
  7883. },
  7884. {
  7885. /* MOD_VEX_0F385A */
  7886. { VEX_LEN_TABLE (VEX_LEN_0F385A_M_0) },
  7887. },
  7888. {
  7889. /* MOD_VEX_0F385C_X86_64_P_1_W_0 */
  7890. { Bad_Opcode },
  7891. { VEX_LEN_TABLE (VEX_LEN_0F385C_X86_64_P_1_W_0_M_0) },
  7892. },
  7893. {
  7894. /* MOD_VEX_0F385E_X86_64_P_0_W_0 */
  7895. { Bad_Opcode },
  7896. { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_0_W_0_M_0) },
  7897. },
  7898. {
  7899. /* MOD_VEX_0F385E_X86_64_P_1_W_0 */
  7900. { Bad_Opcode },
  7901. { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_1_W_0_M_0) },
  7902. },
  7903. {
  7904. /* MOD_VEX_0F385E_X86_64_P_2_W_0 */
  7905. { Bad_Opcode },
  7906. { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_2_W_0_M_0) },
  7907. },
  7908. {
  7909. /* MOD_VEX_0F385E_X86_64_P_3_W_0 */
  7910. { Bad_Opcode },
  7911. { VEX_LEN_TABLE (VEX_LEN_0F385E_X86_64_P_3_W_0_M_0) },
  7912. },
  7913. {
  7914. /* MOD_VEX_0F388C */
  7915. { "vpmaskmov%DQ", { XM, Vex, Mx }, PREFIX_DATA },
  7916. },
  7917. {
  7918. /* MOD_VEX_0F388E */
  7919. { "vpmaskmov%DQ", { Mx, Vex, XM }, PREFIX_DATA },
  7920. },
  7921. {
  7922. /* MOD_VEX_0F3A30_L_0 */
  7923. { Bad_Opcode },
  7924. { "kshiftr%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
  7925. },
  7926. {
  7927. /* MOD_VEX_0F3A31_L_0 */
  7928. { Bad_Opcode },
  7929. { "kshiftr%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
  7930. },
  7931. {
  7932. /* MOD_VEX_0F3A32_L_0 */
  7933. { Bad_Opcode },
  7934. { "kshiftl%BW", { MaskG, MaskE, Ib }, PREFIX_DATA },
  7935. },
  7936. {
  7937. /* MOD_VEX_0F3A33_L_0 */
  7938. { Bad_Opcode },
  7939. { "kshiftl%DQ", { MaskG, MaskE, Ib }, PREFIX_DATA },
  7940. },
  7941. {
  7942. /* MOD_XOP_09_12 */
  7943. { Bad_Opcode },
  7944. { VEX_LEN_TABLE (VEX_LEN_0FXOP_09_12_M_1) },
  7945. },
  7946. #include "i386-dis-evex-mod.h"
  7947. };
  7948. static const struct dis386 rm_table[][8] = {
  7949. {
  7950. /* RM_C6_REG_7 */
  7951. { "xabort", { Skip_MODRM, Ib }, 0 },
  7952. },
  7953. {
  7954. /* RM_C7_REG_7 */
  7955. { "xbeginT", { Skip_MODRM, Jdqw }, 0 },
  7956. },
  7957. {
  7958. /* RM_0F01_REG_0 */
  7959. { "enclv", { Skip_MODRM }, 0 },
  7960. { "vmcall", { Skip_MODRM }, 0 },
  7961. { "vmlaunch", { Skip_MODRM }, 0 },
  7962. { "vmresume", { Skip_MODRM }, 0 },
  7963. { "vmxoff", { Skip_MODRM }, 0 },
  7964. { "pconfig", { Skip_MODRM }, 0 },
  7965. },
  7966. {
  7967. /* RM_0F01_REG_1 */
  7968. { "monitor", { { OP_Monitor, 0 } }, 0 },
  7969. { "mwait", { { OP_Mwait, 0 } }, 0 },
  7970. { "clac", { Skip_MODRM }, 0 },
  7971. { "stac", { Skip_MODRM }, 0 },
  7972. { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_4) },
  7973. { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_5) },
  7974. { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_6) },
  7975. { PREFIX_TABLE (PREFIX_0F01_REG_1_RM_7) },
  7976. },
  7977. {
  7978. /* RM_0F01_REG_2 */
  7979. { "xgetbv", { Skip_MODRM }, 0 },
  7980. { "xsetbv", { Skip_MODRM }, 0 },
  7981. { Bad_Opcode },
  7982. { Bad_Opcode },
  7983. { "vmfunc", { Skip_MODRM }, 0 },
  7984. { "xend", { Skip_MODRM }, 0 },
  7985. { "xtest", { Skip_MODRM }, 0 },
  7986. { "enclu", { Skip_MODRM }, 0 },
  7987. },
  7988. {
  7989. /* RM_0F01_REG_3 */
  7990. { "vmrun", { Skip_MODRM }, 0 },
  7991. { PREFIX_TABLE (PREFIX_0F01_REG_3_RM_1) },
  7992. { "vmload", { Skip_MODRM }, 0 },
  7993. { "vmsave", { Skip_MODRM }, 0 },
  7994. { "stgi", { Skip_MODRM }, 0 },
  7995. { "clgi", { Skip_MODRM }, 0 },
  7996. { "skinit", { Skip_MODRM }, 0 },
  7997. { "invlpga", { Skip_MODRM }, 0 },
  7998. },
  7999. {
  8000. /* RM_0F01_REG_5_MOD_3 */
  8001. { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_0) },
  8002. { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_1) },
  8003. { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_2) },
  8004. { Bad_Opcode },
  8005. { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_4) },
  8006. { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_5) },
  8007. { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_6) },
  8008. { PREFIX_TABLE (PREFIX_0F01_REG_5_MOD_3_RM_7) },
  8009. },
  8010. {
  8011. /* RM_0F01_REG_7_MOD_3 */
  8012. { "swapgs", { Skip_MODRM }, 0 },
  8013. { "rdtscp", { Skip_MODRM }, 0 },
  8014. { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_2) },
  8015. { "mwaitx", { { OP_Mwait, eBX_reg } }, PREFIX_OPCODE },
  8016. { "clzero", { Skip_MODRM }, 0 },
  8017. { "rdpru", { Skip_MODRM }, 0 },
  8018. { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_6) },
  8019. { PREFIX_TABLE (PREFIX_0F01_REG_7_MOD_3_RM_7) },
  8020. },
  8021. {
  8022. /* RM_0F1E_P_1_MOD_3_REG_7 */
  8023. { "nopQ", { Ev }, PREFIX_IGNORED },
  8024. { "nopQ", { Ev }, PREFIX_IGNORED },
  8025. { "endbr64", { Skip_MODRM }, 0 },
  8026. { "endbr32", { Skip_MODRM }, 0 },
  8027. { "nopQ", { Ev }, PREFIX_IGNORED },
  8028. { "nopQ", { Ev }, PREFIX_IGNORED },
  8029. { "nopQ", { Ev }, PREFIX_IGNORED },
  8030. { "nopQ", { Ev }, PREFIX_IGNORED },
  8031. },
  8032. {
  8033. /* RM_0FAE_REG_6_MOD_3 */
  8034. { "mfence", { Skip_MODRM }, 0 },
  8035. },
  8036. {
  8037. /* RM_0FAE_REG_7_MOD_3 */
  8038. { "sfence", { Skip_MODRM }, 0 },
  8039. },
  8040. {
  8041. /* RM_0F3A0F_P_1_MOD_3_REG_0 */
  8042. { "hreset", { Skip_MODRM, Ib }, 0 },
  8043. },
  8044. {
  8045. /* RM_VEX_0F3849_X86_64_P_0_W_0_M_1_R_0 */
  8046. { VEX_LEN_TABLE (VEX_LEN_0F3849_X86_64_P_0_W_0_M_1_REG_0_RM_0) },
  8047. },
  8048. };
  8049. #define INTERNAL_DISASSEMBLER_ERROR _("<internal disassembler error>")
  8050. /* We use the high bit to indicate different name for the same
  8051. prefix. */
  8052. #define REP_PREFIX (0xf3 | 0x100)
  8053. #define XACQUIRE_PREFIX (0xf2 | 0x200)
  8054. #define XRELEASE_PREFIX (0xf3 | 0x400)
  8055. #define BND_PREFIX (0xf2 | 0x400)
  8056. #define NOTRACK_PREFIX (0x3e | 0x100)
  8057. static int
  8058. ckprefix (instr_info *ins)
  8059. {
  8060. int newrex, i, length;
  8061. ins->rex = 0;
  8062. ins->prefixes = 0;
  8063. ins->used_prefixes = 0;
  8064. ins->rex_used = 0;
  8065. ins->evex_used = 0;
  8066. ins->last_lock_prefix = -1;
  8067. ins->last_repz_prefix = -1;
  8068. ins->last_repnz_prefix = -1;
  8069. ins->last_data_prefix = -1;
  8070. ins->last_addr_prefix = -1;
  8071. ins->last_rex_prefix = -1;
  8072. ins->last_seg_prefix = -1;
  8073. ins->fwait_prefix = -1;
  8074. ins->active_seg_prefix = 0;
  8075. for (i = 0; i < (int) ARRAY_SIZE (ins->all_prefixes); i++)
  8076. ins->all_prefixes[i] = 0;
  8077. i = 0;
  8078. length = 0;
  8079. /* The maximum instruction length is 15bytes. */
  8080. while (length < MAX_CODE_LENGTH - 1)
  8081. {
  8082. FETCH_DATA (ins->info, ins->codep + 1);
  8083. newrex = 0;
  8084. switch (*ins->codep)
  8085. {
  8086. /* REX prefixes family. */
  8087. case 0x40:
  8088. case 0x41:
  8089. case 0x42:
  8090. case 0x43:
  8091. case 0x44:
  8092. case 0x45:
  8093. case 0x46:
  8094. case 0x47:
  8095. case 0x48:
  8096. case 0x49:
  8097. case 0x4a:
  8098. case 0x4b:
  8099. case 0x4c:
  8100. case 0x4d:
  8101. case 0x4e:
  8102. case 0x4f:
  8103. if (ins->address_mode == mode_64bit)
  8104. newrex = *ins->codep;
  8105. else
  8106. return 1;
  8107. ins->last_rex_prefix = i;
  8108. break;
  8109. case 0xf3:
  8110. ins->prefixes |= PREFIX_REPZ;
  8111. ins->last_repz_prefix = i;
  8112. break;
  8113. case 0xf2:
  8114. ins->prefixes |= PREFIX_REPNZ;
  8115. ins->last_repnz_prefix = i;
  8116. break;
  8117. case 0xf0:
  8118. ins->prefixes |= PREFIX_LOCK;
  8119. ins->last_lock_prefix = i;
  8120. break;
  8121. case 0x2e:
  8122. ins->prefixes |= PREFIX_CS;
  8123. ins->last_seg_prefix = i;
  8124. if (ins->address_mode != mode_64bit)
  8125. ins->active_seg_prefix = PREFIX_CS;
  8126. break;
  8127. case 0x36:
  8128. ins->prefixes |= PREFIX_SS;
  8129. ins->last_seg_prefix = i;
  8130. if (ins->address_mode != mode_64bit)
  8131. ins->active_seg_prefix = PREFIX_SS;
  8132. break;
  8133. case 0x3e:
  8134. ins->prefixes |= PREFIX_DS;
  8135. ins->last_seg_prefix = i;
  8136. if (ins->address_mode != mode_64bit)
  8137. ins->active_seg_prefix = PREFIX_DS;
  8138. break;
  8139. case 0x26:
  8140. ins->prefixes |= PREFIX_ES;
  8141. ins->last_seg_prefix = i;
  8142. if (ins->address_mode != mode_64bit)
  8143. ins->active_seg_prefix = PREFIX_ES;
  8144. break;
  8145. case 0x64:
  8146. ins->prefixes |= PREFIX_FS;
  8147. ins->last_seg_prefix = i;
  8148. ins->active_seg_prefix = PREFIX_FS;
  8149. break;
  8150. case 0x65:
  8151. ins->prefixes |= PREFIX_GS;
  8152. ins->last_seg_prefix = i;
  8153. ins->active_seg_prefix = PREFIX_GS;
  8154. break;
  8155. case 0x66:
  8156. ins->prefixes |= PREFIX_DATA;
  8157. ins->last_data_prefix = i;
  8158. break;
  8159. case 0x67:
  8160. ins->prefixes |= PREFIX_ADDR;
  8161. ins->last_addr_prefix = i;
  8162. break;
  8163. case FWAIT_OPCODE:
  8164. /* fwait is really an instruction. If there are prefixes
  8165. before the fwait, they belong to the fwait, *not* to the
  8166. following instruction. */
  8167. ins->fwait_prefix = i;
  8168. if (ins->prefixes || ins->rex)
  8169. {
  8170. ins->prefixes |= PREFIX_FWAIT;
  8171. ins->codep++;
  8172. /* This ensures that the previous REX prefixes are noticed
  8173. as unused prefixes, as in the return case below. */
  8174. ins->rex_used = ins->rex;
  8175. return 1;
  8176. }
  8177. ins->prefixes = PREFIX_FWAIT;
  8178. break;
  8179. default:
  8180. return 1;
  8181. }
  8182. /* Rex is ignored when followed by another prefix. */
  8183. if (ins->rex)
  8184. {
  8185. ins->rex_used = ins->rex;
  8186. return 1;
  8187. }
  8188. if (*ins->codep != FWAIT_OPCODE)
  8189. ins->all_prefixes[i++] = *ins->codep;
  8190. ins->rex = newrex;
  8191. ins->codep++;
  8192. length++;
  8193. }
  8194. return 0;
  8195. }
  8196. /* Return the name of the prefix byte PREF, or NULL if PREF is not a
  8197. prefix byte. */
  8198. static const char *
  8199. prefix_name (instr_info *ins, int pref, int sizeflag)
  8200. {
  8201. static const char *rexes [16] =
  8202. {
  8203. "rex", /* 0x40 */
  8204. "rex.B", /* 0x41 */
  8205. "rex.X", /* 0x42 */
  8206. "rex.XB", /* 0x43 */
  8207. "rex.R", /* 0x44 */
  8208. "rex.RB", /* 0x45 */
  8209. "rex.RX", /* 0x46 */
  8210. "rex.RXB", /* 0x47 */
  8211. "rex.W", /* 0x48 */
  8212. "rex.WB", /* 0x49 */
  8213. "rex.WX", /* 0x4a */
  8214. "rex.WXB", /* 0x4b */
  8215. "rex.WR", /* 0x4c */
  8216. "rex.WRB", /* 0x4d */
  8217. "rex.WRX", /* 0x4e */
  8218. "rex.WRXB", /* 0x4f */
  8219. };
  8220. switch (pref)
  8221. {
  8222. /* REX prefixes family. */
  8223. case 0x40:
  8224. case 0x41:
  8225. case 0x42:
  8226. case 0x43:
  8227. case 0x44:
  8228. case 0x45:
  8229. case 0x46:
  8230. case 0x47:
  8231. case 0x48:
  8232. case 0x49:
  8233. case 0x4a:
  8234. case 0x4b:
  8235. case 0x4c:
  8236. case 0x4d:
  8237. case 0x4e:
  8238. case 0x4f:
  8239. return rexes [pref - 0x40];
  8240. case 0xf3:
  8241. return "repz";
  8242. case 0xf2:
  8243. return "repnz";
  8244. case 0xf0:
  8245. return "lock";
  8246. case 0x2e:
  8247. return "cs";
  8248. case 0x36:
  8249. return "ss";
  8250. case 0x3e:
  8251. return "ds";
  8252. case 0x26:
  8253. return "es";
  8254. case 0x64:
  8255. return "fs";
  8256. case 0x65:
  8257. return "gs";
  8258. case 0x66:
  8259. return (sizeflag & DFLAG) ? "data16" : "data32";
  8260. case 0x67:
  8261. if (ins->address_mode == mode_64bit)
  8262. return (sizeflag & AFLAG) ? "addr32" : "addr64";
  8263. else
  8264. return (sizeflag & AFLAG) ? "addr16" : "addr32";
  8265. case FWAIT_OPCODE:
  8266. return "fwait";
  8267. case REP_PREFIX:
  8268. return "rep";
  8269. case XACQUIRE_PREFIX:
  8270. return "xacquire";
  8271. case XRELEASE_PREFIX:
  8272. return "xrelease";
  8273. case BND_PREFIX:
  8274. return "bnd";
  8275. case NOTRACK_PREFIX:
  8276. return "notrack";
  8277. default:
  8278. return NULL;
  8279. }
  8280. }
  8281. /* Here for backwards compatibility. When gdb stops using
  8282. print_insn_i386_att and print_insn_i386_intel these functions can
  8283. disappear, and print_insn_i386 be merged into print_insn. */
  8284. int
  8285. print_insn_i386_att (bfd_vma pc, disassemble_info *info)
  8286. {
  8287. instr_info ins;
  8288. ins.info = info;
  8289. ins.intel_syntax = 0;
  8290. return print_insn (pc, &ins);
  8291. }
  8292. int
  8293. print_insn_i386_intel (bfd_vma pc, disassemble_info *info)
  8294. {
  8295. instr_info ins;
  8296. ins.info = info;
  8297. ins.intel_syntax = 1;
  8298. return print_insn (pc, &ins);
  8299. }
  8300. int
  8301. print_insn_i386 (bfd_vma pc, disassemble_info *info)
  8302. {
  8303. instr_info ins;
  8304. ins.info = info;
  8305. ins.intel_syntax = -1;
  8306. return print_insn (pc, &ins);
  8307. }
  8308. void
  8309. print_i386_disassembler_options (FILE *stream)
  8310. {
  8311. fprintf (stream, _("\n\
  8312. The following i386/x86-64 specific disassembler options are supported for use\n\
  8313. with the -M switch (multiple options should be separated by commas):\n"));
  8314. fprintf (stream, _(" x86-64 Disassemble in 64bit mode\n"));
  8315. fprintf (stream, _(" i386 Disassemble in 32bit mode\n"));
  8316. fprintf (stream, _(" i8086 Disassemble in 16bit mode\n"));
  8317. fprintf (stream, _(" att Display instruction in AT&T syntax\n"));
  8318. fprintf (stream, _(" intel Display instruction in Intel syntax\n"));
  8319. fprintf (stream, _(" att-mnemonic\n"
  8320. " Display instruction in AT&T mnemonic\n"));
  8321. fprintf (stream, _(" intel-mnemonic\n"
  8322. " Display instruction in Intel mnemonic\n"));
  8323. fprintf (stream, _(" addr64 Assume 64bit address size\n"));
  8324. fprintf (stream, _(" addr32 Assume 32bit address size\n"));
  8325. fprintf (stream, _(" addr16 Assume 16bit address size\n"));
  8326. fprintf (stream, _(" data32 Assume 32bit data size\n"));
  8327. fprintf (stream, _(" data16 Assume 16bit data size\n"));
  8328. fprintf (stream, _(" suffix Always display instruction suffix in AT&T syntax\n"));
  8329. fprintf (stream, _(" amd64 Display instruction in AMD64 ISA\n"));
  8330. fprintf (stream, _(" intel64 Display instruction in Intel64 ISA\n"));
  8331. }
  8332. /* Bad opcode. */
  8333. static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 };
  8334. /* Get a pointer to struct dis386 with a valid name. */
  8335. static const struct dis386 *
  8336. get_valid_dis386 (const struct dis386 *dp, instr_info *ins)
  8337. {
  8338. int vindex, vex_table_index;
  8339. if (dp->name != NULL)
  8340. return dp;
  8341. switch (dp->op[0].bytemode)
  8342. {
  8343. case USE_REG_TABLE:
  8344. dp = &reg_table[dp->op[1].bytemode][ins->modrm.reg];
  8345. break;
  8346. case USE_MOD_TABLE:
  8347. vindex = ins->modrm.mod == 0x3 ? 1 : 0;
  8348. dp = &mod_table[dp->op[1].bytemode][vindex];
  8349. break;
  8350. case USE_RM_TABLE:
  8351. dp = &rm_table[dp->op[1].bytemode][ins->modrm.rm];
  8352. break;
  8353. case USE_PREFIX_TABLE:
  8354. if (ins->need_vex)
  8355. {
  8356. /* The prefix in VEX is implicit. */
  8357. switch (ins->vex.prefix)
  8358. {
  8359. case 0:
  8360. vindex = 0;
  8361. break;
  8362. case REPE_PREFIX_OPCODE:
  8363. vindex = 1;
  8364. break;
  8365. case DATA_PREFIX_OPCODE:
  8366. vindex = 2;
  8367. break;
  8368. case REPNE_PREFIX_OPCODE:
  8369. vindex = 3;
  8370. break;
  8371. default:
  8372. abort ();
  8373. break;
  8374. }
  8375. }
  8376. else
  8377. {
  8378. int last_prefix = -1;
  8379. int prefix = 0;
  8380. vindex = 0;
  8381. /* We check PREFIX_REPNZ and PREFIX_REPZ before PREFIX_DATA.
  8382. When there are multiple PREFIX_REPNZ and PREFIX_REPZ, the
  8383. last one wins. */
  8384. if ((ins->prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
  8385. {
  8386. if (ins->last_repz_prefix > ins->last_repnz_prefix)
  8387. {
  8388. vindex = 1;
  8389. prefix = PREFIX_REPZ;
  8390. last_prefix = ins->last_repz_prefix;
  8391. }
  8392. else
  8393. {
  8394. vindex = 3;
  8395. prefix = PREFIX_REPNZ;
  8396. last_prefix = ins->last_repnz_prefix;
  8397. }
  8398. /* Check if prefix should be ignored. */
  8399. if ((((prefix_table[dp->op[1].bytemode][vindex].prefix_requirement
  8400. & PREFIX_IGNORED) >> PREFIX_IGNORED_SHIFT)
  8401. & prefix) != 0
  8402. && !prefix_table[dp->op[1].bytemode][vindex].name)
  8403. vindex = 0;
  8404. }
  8405. if (vindex == 0 && (ins->prefixes & PREFIX_DATA) != 0)
  8406. {
  8407. vindex = 2;
  8408. prefix = PREFIX_DATA;
  8409. last_prefix = ins->last_data_prefix;
  8410. }
  8411. if (vindex != 0)
  8412. {
  8413. ins->used_prefixes |= prefix;
  8414. ins->all_prefixes[last_prefix] = 0;
  8415. }
  8416. }
  8417. dp = &prefix_table[dp->op[1].bytemode][vindex];
  8418. break;
  8419. case USE_X86_64_TABLE:
  8420. vindex = ins->address_mode == mode_64bit ? 1 : 0;
  8421. dp = &x86_64_table[dp->op[1].bytemode][vindex];
  8422. break;
  8423. case USE_3BYTE_TABLE:
  8424. FETCH_DATA (ins->info, ins->codep + 2);
  8425. vindex = *ins->codep++;
  8426. dp = &three_byte_table[dp->op[1].bytemode][vindex];
  8427. ins->end_codep = ins->codep;
  8428. ins->modrm.mod = (*ins->codep >> 6) & 3;
  8429. ins->modrm.reg = (*ins->codep >> 3) & 7;
  8430. ins->modrm.rm = *ins->codep & 7;
  8431. break;
  8432. case USE_VEX_LEN_TABLE:
  8433. if (!ins->need_vex)
  8434. abort ();
  8435. switch (ins->vex.length)
  8436. {
  8437. case 128:
  8438. vindex = 0;
  8439. break;
  8440. case 512:
  8441. /* This allows re-using in particular table entries where only
  8442. 128-bit operand size (VEX.L=0 / EVEX.L'L=0) are valid. */
  8443. if (ins->vex.evex)
  8444. {
  8445. case 256:
  8446. vindex = 1;
  8447. break;
  8448. }
  8449. /* Fall through. */
  8450. default:
  8451. abort ();
  8452. break;
  8453. }
  8454. dp = &vex_len_table[dp->op[1].bytemode][vindex];
  8455. break;
  8456. case USE_EVEX_LEN_TABLE:
  8457. if (!ins->vex.evex)
  8458. abort ();
  8459. switch (ins->vex.length)
  8460. {
  8461. case 128:
  8462. vindex = 0;
  8463. break;
  8464. case 256:
  8465. vindex = 1;
  8466. break;
  8467. case 512:
  8468. vindex = 2;
  8469. break;
  8470. default:
  8471. abort ();
  8472. break;
  8473. }
  8474. dp = &evex_len_table[dp->op[1].bytemode][vindex];
  8475. break;
  8476. case USE_XOP_8F_TABLE:
  8477. FETCH_DATA (ins->info, ins->codep + 3);
  8478. ins->rex = ~(*ins->codep >> 5) & 0x7;
  8479. /* VEX_TABLE_INDEX is the mmmmm part of the XOP byte 1 "RCB.mmmmm". */
  8480. switch ((*ins->codep & 0x1f))
  8481. {
  8482. default:
  8483. dp = &bad_opcode;
  8484. return dp;
  8485. case 0x8:
  8486. vex_table_index = XOP_08;
  8487. break;
  8488. case 0x9:
  8489. vex_table_index = XOP_09;
  8490. break;
  8491. case 0xa:
  8492. vex_table_index = XOP_0A;
  8493. break;
  8494. }
  8495. ins->codep++;
  8496. ins->vex.w = *ins->codep & 0x80;
  8497. if (ins->vex.w && ins->address_mode == mode_64bit)
  8498. ins->rex |= REX_W;
  8499. ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
  8500. if (ins->address_mode != mode_64bit)
  8501. {
  8502. /* In 16/32-bit mode REX_B is silently ignored. */
  8503. ins->rex &= ~REX_B;
  8504. }
  8505. ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
  8506. switch ((*ins->codep & 0x3))
  8507. {
  8508. case 0:
  8509. break;
  8510. case 1:
  8511. ins->vex.prefix = DATA_PREFIX_OPCODE;
  8512. break;
  8513. case 2:
  8514. ins->vex.prefix = REPE_PREFIX_OPCODE;
  8515. break;
  8516. case 3:
  8517. ins->vex.prefix = REPNE_PREFIX_OPCODE;
  8518. break;
  8519. }
  8520. ins->need_vex = true;
  8521. ins->codep++;
  8522. vindex = *ins->codep++;
  8523. dp = &xop_table[vex_table_index][vindex];
  8524. ins->end_codep = ins->codep;
  8525. FETCH_DATA (ins->info, ins->codep + 1);
  8526. ins->modrm.mod = (*ins->codep >> 6) & 3;
  8527. ins->modrm.reg = (*ins->codep >> 3) & 7;
  8528. ins->modrm.rm = *ins->codep & 7;
  8529. /* No XOP encoding so far allows for a non-zero embedded prefix. Avoid
  8530. having to decode the bits for every otherwise valid encoding. */
  8531. if (ins->vex.prefix)
  8532. return &bad_opcode;
  8533. break;
  8534. case USE_VEX_C4_TABLE:
  8535. /* VEX prefix. */
  8536. FETCH_DATA (ins->info, ins->codep + 3);
  8537. ins->rex = ~(*ins->codep >> 5) & 0x7;
  8538. switch ((*ins->codep & 0x1f))
  8539. {
  8540. default:
  8541. dp = &bad_opcode;
  8542. return dp;
  8543. case 0x1:
  8544. vex_table_index = VEX_0F;
  8545. break;
  8546. case 0x2:
  8547. vex_table_index = VEX_0F38;
  8548. break;
  8549. case 0x3:
  8550. vex_table_index = VEX_0F3A;
  8551. break;
  8552. }
  8553. ins->codep++;
  8554. ins->vex.w = *ins->codep & 0x80;
  8555. if (ins->address_mode == mode_64bit)
  8556. {
  8557. if (ins->vex.w)
  8558. ins->rex |= REX_W;
  8559. }
  8560. else
  8561. {
  8562. /* For the 3-byte VEX prefix in 32-bit mode, the REX_B bit
  8563. is ignored, other REX bits are 0 and the highest bit in
  8564. VEX.vvvv is also ignored (but we mustn't clear it here). */
  8565. ins->rex = 0;
  8566. }
  8567. ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
  8568. ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
  8569. switch ((*ins->codep & 0x3))
  8570. {
  8571. case 0:
  8572. break;
  8573. case 1:
  8574. ins->vex.prefix = DATA_PREFIX_OPCODE;
  8575. break;
  8576. case 2:
  8577. ins->vex.prefix = REPE_PREFIX_OPCODE;
  8578. break;
  8579. case 3:
  8580. ins->vex.prefix = REPNE_PREFIX_OPCODE;
  8581. break;
  8582. }
  8583. ins->need_vex = true;
  8584. ins->codep++;
  8585. vindex = *ins->codep++;
  8586. dp = &vex_table[vex_table_index][vindex];
  8587. ins->end_codep = ins->codep;
  8588. /* There is no MODRM byte for VEX0F 77. */
  8589. if (vex_table_index != VEX_0F || vindex != 0x77)
  8590. {
  8591. FETCH_DATA (ins->info, ins->codep + 1);
  8592. ins->modrm.mod = (*ins->codep >> 6) & 3;
  8593. ins->modrm.reg = (*ins->codep >> 3) & 7;
  8594. ins->modrm.rm = *ins->codep & 7;
  8595. }
  8596. break;
  8597. case USE_VEX_C5_TABLE:
  8598. /* VEX prefix. */
  8599. FETCH_DATA (ins->info, ins->codep + 2);
  8600. ins->rex = (*ins->codep & 0x80) ? 0 : REX_R;
  8601. /* For the 2-byte VEX prefix in 32-bit mode, the highest bit in
  8602. VEX.vvvv is 1. */
  8603. ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
  8604. ins->vex.length = (*ins->codep & 0x4) ? 256 : 128;
  8605. switch ((*ins->codep & 0x3))
  8606. {
  8607. case 0:
  8608. break;
  8609. case 1:
  8610. ins->vex.prefix = DATA_PREFIX_OPCODE;
  8611. break;
  8612. case 2:
  8613. ins->vex.prefix = REPE_PREFIX_OPCODE;
  8614. break;
  8615. case 3:
  8616. ins->vex.prefix = REPNE_PREFIX_OPCODE;
  8617. break;
  8618. }
  8619. ins->need_vex = true;
  8620. ins->codep++;
  8621. vindex = *ins->codep++;
  8622. dp = &vex_table[dp->op[1].bytemode][vindex];
  8623. ins->end_codep = ins->codep;
  8624. /* There is no MODRM byte for VEX 77. */
  8625. if (vindex != 0x77)
  8626. {
  8627. FETCH_DATA (ins->info, ins->codep + 1);
  8628. ins->modrm.mod = (*ins->codep >> 6) & 3;
  8629. ins->modrm.reg = (*ins->codep >> 3) & 7;
  8630. ins->modrm.rm = *ins->codep & 7;
  8631. }
  8632. break;
  8633. case USE_VEX_W_TABLE:
  8634. if (!ins->need_vex)
  8635. abort ();
  8636. dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w];
  8637. break;
  8638. case USE_EVEX_TABLE:
  8639. ins->two_source_ops = false;
  8640. /* EVEX prefix. */
  8641. ins->vex.evex = true;
  8642. FETCH_DATA (ins->info, ins->codep + 4);
  8643. /* The first byte after 0x62. */
  8644. ins->rex = ~(*ins->codep >> 5) & 0x7;
  8645. ins->vex.r = *ins->codep & 0x10;
  8646. switch ((*ins->codep & 0xf))
  8647. {
  8648. default:
  8649. return &bad_opcode;
  8650. case 0x1:
  8651. vex_table_index = EVEX_0F;
  8652. break;
  8653. case 0x2:
  8654. vex_table_index = EVEX_0F38;
  8655. break;
  8656. case 0x3:
  8657. vex_table_index = EVEX_0F3A;
  8658. break;
  8659. case 0x5:
  8660. vex_table_index = EVEX_MAP5;
  8661. break;
  8662. case 0x6:
  8663. vex_table_index = EVEX_MAP6;
  8664. break;
  8665. }
  8666. /* The second byte after 0x62. */
  8667. ins->codep++;
  8668. ins->vex.w = *ins->codep & 0x80;
  8669. if (ins->vex.w && ins->address_mode == mode_64bit)
  8670. ins->rex |= REX_W;
  8671. ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf;
  8672. /* The U bit. */
  8673. if (!(*ins->codep & 0x4))
  8674. return &bad_opcode;
  8675. switch ((*ins->codep & 0x3))
  8676. {
  8677. case 0:
  8678. break;
  8679. case 1:
  8680. ins->vex.prefix = DATA_PREFIX_OPCODE;
  8681. break;
  8682. case 2:
  8683. ins->vex.prefix = REPE_PREFIX_OPCODE;
  8684. break;
  8685. case 3:
  8686. ins->vex.prefix = REPNE_PREFIX_OPCODE;
  8687. break;
  8688. }
  8689. /* The third byte after 0x62. */
  8690. ins->codep++;
  8691. /* Remember the static rounding bits. */
  8692. ins->vex.ll = (*ins->codep >> 5) & 3;
  8693. ins->vex.b = *ins->codep & 0x10;
  8694. ins->vex.v = *ins->codep & 0x8;
  8695. ins->vex.mask_register_specifier = *ins->codep & 0x7;
  8696. ins->vex.zeroing = *ins->codep & 0x80;
  8697. if (ins->address_mode != mode_64bit)
  8698. {
  8699. /* In 16/32-bit mode silently ignore following bits. */
  8700. ins->rex &= ~REX_B;
  8701. ins->vex.r = true;
  8702. }
  8703. ins->need_vex = true;
  8704. ins->codep++;
  8705. vindex = *ins->codep++;
  8706. dp = &evex_table[vex_table_index][vindex];
  8707. ins->end_codep = ins->codep;
  8708. FETCH_DATA (ins->info, ins->codep + 1);
  8709. ins->modrm.mod = (*ins->codep >> 6) & 3;
  8710. ins->modrm.reg = (*ins->codep >> 3) & 7;
  8711. ins->modrm.rm = *ins->codep & 7;
  8712. /* Set vector length. */
  8713. if (ins->modrm.mod == 3 && ins->vex.b)
  8714. ins->vex.length = 512;
  8715. else
  8716. {
  8717. switch (ins->vex.ll)
  8718. {
  8719. case 0x0:
  8720. ins->vex.length = 128;
  8721. break;
  8722. case 0x1:
  8723. ins->vex.length = 256;
  8724. break;
  8725. case 0x2:
  8726. ins->vex.length = 512;
  8727. break;
  8728. default:
  8729. return &bad_opcode;
  8730. }
  8731. }
  8732. break;
  8733. case 0:
  8734. dp = &bad_opcode;
  8735. break;
  8736. default:
  8737. abort ();
  8738. }
  8739. if (dp->name != NULL)
  8740. return dp;
  8741. else
  8742. return get_valid_dis386 (dp, ins);
  8743. }
  8744. static void
  8745. get_sib (instr_info *ins, int sizeflag)
  8746. {
  8747. /* If modrm.mod == 3, operand must be register. */
  8748. if (ins->need_modrm
  8749. && ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
  8750. && ins->modrm.mod != 3
  8751. && ins->modrm.rm == 4)
  8752. {
  8753. FETCH_DATA (ins->info, ins->codep + 2);
  8754. ins->sib.index = (ins->codep[1] >> 3) & 7;
  8755. ins->sib.scale = (ins->codep[1] >> 6) & 3;
  8756. ins->sib.base = ins->codep[1] & 7;
  8757. ins->has_sib = true;
  8758. }
  8759. else
  8760. ins->has_sib = false;
  8761. }
  8762. /* Like oappend (below), but S is a string starting with '%'.
  8763. In Intel syntax, the '%' is elided. */
  8764. static void
  8765. oappend_maybe_intel (instr_info *ins, const char *s)
  8766. {
  8767. oappend (ins, s + ins->intel_syntax);
  8768. }
  8769. static int
  8770. print_insn (bfd_vma pc, instr_info *ins)
  8771. {
  8772. const struct dis386 *dp;
  8773. int i;
  8774. char *op_txt[MAX_OPERANDS];
  8775. int needcomma;
  8776. int sizeflag, orig_sizeflag;
  8777. const char *p;
  8778. struct dis_private priv;
  8779. int prefix_length;
  8780. ins->isa64 = 0;
  8781. ins->intel_mnemonic = !SYSV386_COMPAT;
  8782. ins->op_is_jump = false;
  8783. priv.orig_sizeflag = AFLAG | DFLAG;
  8784. if ((ins->info->mach & bfd_mach_i386_i386) != 0)
  8785. ins->address_mode = mode_32bit;
  8786. else if (ins->info->mach == bfd_mach_i386_i8086)
  8787. {
  8788. ins->address_mode = mode_16bit;
  8789. priv.orig_sizeflag = 0;
  8790. }
  8791. else
  8792. ins->address_mode = mode_64bit;
  8793. if (ins->intel_syntax == (char) -1)
  8794. ins->intel_syntax = (ins->info->mach & bfd_mach_i386_intel_syntax) != 0;
  8795. for (p = ins->info->disassembler_options; p != NULL;)
  8796. {
  8797. if (startswith (p, "amd64"))
  8798. ins->isa64 = amd64;
  8799. else if (startswith (p, "intel64"))
  8800. ins->isa64 = intel64;
  8801. else if (startswith (p, "x86-64"))
  8802. {
  8803. ins->address_mode = mode_64bit;
  8804. priv.orig_sizeflag |= AFLAG | DFLAG;
  8805. }
  8806. else if (startswith (p, "i386"))
  8807. {
  8808. ins->address_mode = mode_32bit;
  8809. priv.orig_sizeflag |= AFLAG | DFLAG;
  8810. }
  8811. else if (startswith (p, "i8086"))
  8812. {
  8813. ins->address_mode = mode_16bit;
  8814. priv.orig_sizeflag &= ~(AFLAG | DFLAG);
  8815. }
  8816. else if (startswith (p, "intel"))
  8817. {
  8818. ins->intel_syntax = 1;
  8819. if (startswith (p + 5, "-mnemonic"))
  8820. ins->intel_mnemonic = true;
  8821. }
  8822. else if (startswith (p, "att"))
  8823. {
  8824. ins->intel_syntax = 0;
  8825. if (startswith (p + 3, "-mnemonic"))
  8826. ins->intel_mnemonic = false;
  8827. }
  8828. else if (startswith (p, "addr"))
  8829. {
  8830. if (ins->address_mode == mode_64bit)
  8831. {
  8832. if (p[4] == '3' && p[5] == '2')
  8833. priv.orig_sizeflag &= ~AFLAG;
  8834. else if (p[4] == '6' && p[5] == '4')
  8835. priv.orig_sizeflag |= AFLAG;
  8836. }
  8837. else
  8838. {
  8839. if (p[4] == '1' && p[5] == '6')
  8840. priv.orig_sizeflag &= ~AFLAG;
  8841. else if (p[4] == '3' && p[5] == '2')
  8842. priv.orig_sizeflag |= AFLAG;
  8843. }
  8844. }
  8845. else if (startswith (p, "data"))
  8846. {
  8847. if (p[4] == '1' && p[5] == '6')
  8848. priv.orig_sizeflag &= ~DFLAG;
  8849. else if (p[4] == '3' && p[5] == '2')
  8850. priv.orig_sizeflag |= DFLAG;
  8851. }
  8852. else if (startswith (p, "suffix"))
  8853. priv.orig_sizeflag |= SUFFIX_ALWAYS;
  8854. p = strchr (p, ',');
  8855. if (p != NULL)
  8856. p++;
  8857. }
  8858. if (ins->address_mode == mode_64bit && sizeof (bfd_vma) < 8)
  8859. {
  8860. (*ins->info->fprintf_styled_func) (ins->info->stream, dis_style_text,
  8861. _("64-bit address is disabled"));
  8862. return -1;
  8863. }
  8864. if (ins->intel_syntax)
  8865. {
  8866. ins->open_char = '[';
  8867. ins->close_char = ']';
  8868. ins->separator_char = '+';
  8869. ins->scale_char = '*';
  8870. }
  8871. else
  8872. {
  8873. ins->open_char = '(';
  8874. ins->close_char = ')';
  8875. ins->separator_char = ',';
  8876. ins->scale_char = ',';
  8877. }
  8878. /* The output looks better if we put 7 bytes on a line, since that
  8879. puts most long word instructions on a single line. */
  8880. ins->info->bytes_per_line = 7;
  8881. ins->info->private_data = &priv;
  8882. priv.max_fetched = priv.the_buffer;
  8883. priv.insn_start = pc;
  8884. ins->obuf[0] = 0;
  8885. for (i = 0; i < MAX_OPERANDS; ++i)
  8886. {
  8887. ins->op_out[i][0] = 0;
  8888. ins->op_index[i] = -1;
  8889. }
  8890. ins->start_pc = pc;
  8891. ins->start_codep = priv.the_buffer;
  8892. ins->codep = priv.the_buffer;
  8893. if (OPCODES_SIGSETJMP (priv.bailout) != 0)
  8894. {
  8895. const char *name;
  8896. /* Getting here means we tried for data but didn't get it. That
  8897. means we have an incomplete instruction of some sort. Just
  8898. print the first byte as a prefix or a .byte pseudo-op. */
  8899. if (ins->codep > priv.the_buffer)
  8900. {
  8901. name = prefix_name (ins, priv.the_buffer[0], priv.orig_sizeflag);
  8902. if (name != NULL)
  8903. (*ins->info->fprintf_styled_func)
  8904. (ins->info->stream, dis_style_mnemonic, "%s", name);
  8905. else
  8906. {
  8907. /* Just print the first byte as a .byte instruction. */
  8908. (*ins->info->fprintf_styled_func)
  8909. (ins->info->stream, dis_style_assembler_directive, ".byte ");
  8910. (*ins->info->fprintf_styled_func)
  8911. (ins->info->stream, dis_style_immediate, "0x%x",
  8912. (unsigned int) priv.the_buffer[0]);
  8913. }
  8914. return 1;
  8915. }
  8916. return -1;
  8917. }
  8918. ins->obufp = ins->obuf;
  8919. sizeflag = priv.orig_sizeflag;
  8920. if (!ckprefix (ins) || ins->rex_used)
  8921. {
  8922. /* Too many ins->prefixes or unused REX ins->prefixes. */
  8923. for (i = 0;
  8924. i < (int) ARRAY_SIZE (ins->all_prefixes) && ins->all_prefixes[i];
  8925. i++)
  8926. (*ins->info->fprintf_styled_func)
  8927. (ins->info->stream, dis_style_mnemonic, "%s%s",
  8928. (i == 0 ? "" : " "), prefix_name (ins, ins->all_prefixes[i],
  8929. sizeflag));
  8930. return i;
  8931. }
  8932. ins->insn_codep = ins->codep;
  8933. FETCH_DATA (ins->info, ins->codep + 1);
  8934. ins->two_source_ops = (*ins->codep == 0x62) || (*ins->codep == 0xc8);
  8935. if (((ins->prefixes & PREFIX_FWAIT)
  8936. && ((*ins->codep < 0xd8) || (*ins->codep > 0xdf))))
  8937. {
  8938. /* Handle ins->prefixes before fwait. */
  8939. for (i = 0; i < ins->fwait_prefix && ins->all_prefixes[i];
  8940. i++)
  8941. (*ins->info->fprintf_styled_func)
  8942. (ins->info->stream, dis_style_mnemonic, "%s ",
  8943. prefix_name (ins, ins->all_prefixes[i], sizeflag));
  8944. (*ins->info->fprintf_styled_func)
  8945. (ins->info->stream, dis_style_mnemonic, "fwait");
  8946. return i + 1;
  8947. }
  8948. if (*ins->codep == 0x0f)
  8949. {
  8950. unsigned char threebyte;
  8951. ins->codep++;
  8952. FETCH_DATA (ins->info, ins->codep + 1);
  8953. threebyte = *ins->codep;
  8954. dp = &dis386_twobyte[threebyte];
  8955. ins->need_modrm = twobyte_has_modrm[threebyte];
  8956. ins->codep++;
  8957. }
  8958. else
  8959. {
  8960. dp = &dis386[*ins->codep];
  8961. ins->need_modrm = onebyte_has_modrm[*ins->codep];
  8962. ins->codep++;
  8963. }
  8964. /* Save sizeflag for printing the extra ins->prefixes later before updating
  8965. it for mnemonic and operand processing. The prefix names depend
  8966. only on the address mode. */
  8967. orig_sizeflag = sizeflag;
  8968. if (ins->prefixes & PREFIX_ADDR)
  8969. sizeflag ^= AFLAG;
  8970. if ((ins->prefixes & PREFIX_DATA))
  8971. sizeflag ^= DFLAG;
  8972. ins->end_codep = ins->codep;
  8973. if (ins->need_modrm)
  8974. {
  8975. FETCH_DATA (ins->info, ins->codep + 1);
  8976. ins->modrm.mod = (*ins->codep >> 6) & 3;
  8977. ins->modrm.reg = (*ins->codep >> 3) & 7;
  8978. ins->modrm.rm = *ins->codep & 7;
  8979. }
  8980. else
  8981. memset (&ins->modrm, 0, sizeof (ins->modrm));
  8982. ins->need_vex = false;
  8983. memset (&ins->vex, 0, sizeof (ins->vex));
  8984. if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
  8985. {
  8986. get_sib (ins, sizeflag);
  8987. dofloat (ins, sizeflag);
  8988. }
  8989. else
  8990. {
  8991. dp = get_valid_dis386 (dp, ins);
  8992. if (dp != NULL && putop (ins, dp->name, sizeflag) == 0)
  8993. {
  8994. get_sib (ins, sizeflag);
  8995. for (i = 0; i < MAX_OPERANDS; ++i)
  8996. {
  8997. ins->obufp = ins->op_out[i];
  8998. ins->op_ad = MAX_OPERANDS - 1 - i;
  8999. if (dp->op[i].rtn)
  9000. (*dp->op[i].rtn) (ins, dp->op[i].bytemode, sizeflag);
  9001. /* For EVEX instruction after the last operand masking
  9002. should be printed. */
  9003. if (i == 0 && ins->vex.evex)
  9004. {
  9005. /* Don't print {%k0}. */
  9006. if (ins->vex.mask_register_specifier)
  9007. {
  9008. oappend (ins, "{");
  9009. oappend_maybe_intel (ins,
  9010. att_names_mask
  9011. [ins->vex.mask_register_specifier]);
  9012. oappend (ins, "}");
  9013. }
  9014. if (ins->vex.zeroing)
  9015. oappend (ins, "{z}");
  9016. /* S/G insns require a mask and don't allow
  9017. zeroing-masking. */
  9018. if ((dp->op[0].bytemode == vex_vsib_d_w_dq_mode
  9019. || dp->op[0].bytemode == vex_vsib_q_w_dq_mode)
  9020. && (ins->vex.mask_register_specifier == 0
  9021. || ins->vex.zeroing))
  9022. oappend (ins, "/(bad)");
  9023. }
  9024. }
  9025. /* Check whether rounding control was enabled for an insn not
  9026. supporting it. */
  9027. if (ins->modrm.mod == 3 && ins->vex.b
  9028. && !(ins->evex_used & EVEX_b_used))
  9029. {
  9030. for (i = 0; i < MAX_OPERANDS; ++i)
  9031. {
  9032. ins->obufp = ins->op_out[i];
  9033. if (*ins->obufp)
  9034. continue;
  9035. oappend (ins, names_rounding[ins->vex.ll]);
  9036. oappend (ins, "bad}");
  9037. break;
  9038. }
  9039. }
  9040. }
  9041. }
  9042. /* Clear instruction information. */
  9043. ins->info->insn_info_valid = 0;
  9044. ins->info->branch_delay_insns = 0;
  9045. ins->info->data_size = 0;
  9046. ins->info->insn_type = dis_noninsn;
  9047. ins->info->target = 0;
  9048. ins->info->target2 = 0;
  9049. /* Reset jump operation indicator. */
  9050. ins->op_is_jump = false;
  9051. {
  9052. int jump_detection = 0;
  9053. /* Extract flags. */
  9054. for (i = 0; i < MAX_OPERANDS; ++i)
  9055. {
  9056. if ((dp->op[i].rtn == OP_J)
  9057. || (dp->op[i].rtn == OP_indirE))
  9058. jump_detection |= 1;
  9059. else if ((dp->op[i].rtn == BND_Fixup)
  9060. || (!dp->op[i].rtn && !dp->op[i].bytemode))
  9061. jump_detection |= 2;
  9062. else if ((dp->op[i].bytemode == cond_jump_mode)
  9063. || (dp->op[i].bytemode == loop_jcxz_mode))
  9064. jump_detection |= 4;
  9065. }
  9066. /* Determine if this is a jump or branch. */
  9067. if ((jump_detection & 0x3) == 0x3)
  9068. {
  9069. ins->op_is_jump = true;
  9070. if (jump_detection & 0x4)
  9071. ins->info->insn_type = dis_condbranch;
  9072. else
  9073. ins->info->insn_type = (dp->name && !strncmp (dp->name, "call", 4))
  9074. ? dis_jsr : dis_branch;
  9075. }
  9076. }
  9077. /* If VEX.vvvv and EVEX.vvvv are unused, they must be all 1s, which
  9078. are all 0s in inverted form. */
  9079. if (ins->need_vex && ins->vex.register_specifier != 0)
  9080. {
  9081. (*ins->info->fprintf_styled_func) (ins->info->stream, dis_style_text,
  9082. "(bad)");
  9083. return ins->end_codep - priv.the_buffer;
  9084. }
  9085. /* If EVEX.z is set, there must be an actual mask register in use. */
  9086. if (ins->vex.zeroing && ins->vex.mask_register_specifier == 0)
  9087. {
  9088. (*ins->info->fprintf_styled_func) (ins->info->stream, dis_style_text,
  9089. "(bad)");
  9090. return ins->end_codep - priv.the_buffer;
  9091. }
  9092. switch (dp->prefix_requirement)
  9093. {
  9094. case PREFIX_DATA:
  9095. /* If only the data prefix is marked as mandatory, its absence renders
  9096. the encoding invalid. Most other PREFIX_OPCODE rules still apply. */
  9097. if (ins->need_vex ? !ins->vex.prefix : !(ins->prefixes & PREFIX_DATA))
  9098. {
  9099. (*ins->info->fprintf_styled_func) (ins->info->stream,
  9100. dis_style_text, "(bad)");
  9101. return ins->end_codep - priv.the_buffer;
  9102. }
  9103. ins->used_prefixes |= PREFIX_DATA;
  9104. /* Fall through. */
  9105. case PREFIX_OPCODE:
  9106. /* If the mandatory PREFIX_REPZ/PREFIX_REPNZ/PREFIX_DATA prefix is
  9107. unused, opcode is invalid. Since the PREFIX_DATA prefix may be
  9108. used by putop and MMX/SSE operand and may be overridden by the
  9109. PREFIX_REPZ/PREFIX_REPNZ fix, we check the PREFIX_DATA prefix
  9110. separately. */
  9111. if (((ins->need_vex
  9112. ? ins->vex.prefix == REPE_PREFIX_OPCODE
  9113. || ins->vex.prefix == REPNE_PREFIX_OPCODE
  9114. : (ins->prefixes
  9115. & (PREFIX_REPZ | PREFIX_REPNZ)) != 0)
  9116. && (ins->used_prefixes
  9117. & (PREFIX_REPZ | PREFIX_REPNZ)) == 0)
  9118. || (((ins->need_vex
  9119. ? ins->vex.prefix == DATA_PREFIX_OPCODE
  9120. : ((ins->prefixes
  9121. & (PREFIX_REPZ | PREFIX_REPNZ | PREFIX_DATA))
  9122. == PREFIX_DATA))
  9123. && (ins->used_prefixes & PREFIX_DATA) == 0))
  9124. || (ins->vex.evex && dp->prefix_requirement != PREFIX_DATA
  9125. && !ins->vex.w != !(ins->used_prefixes & PREFIX_DATA)))
  9126. {
  9127. (*ins->info->fprintf_styled_func) (ins->info->stream,
  9128. dis_style_text, "(bad)");
  9129. return ins->end_codep - priv.the_buffer;
  9130. }
  9131. break;
  9132. case PREFIX_IGNORED:
  9133. /* Zap data size and rep prefixes from used_prefixes and reinstate their
  9134. origins in all_prefixes. */
  9135. ins->used_prefixes &= ~PREFIX_OPCODE;
  9136. if (ins->last_data_prefix >= 0)
  9137. ins->all_prefixes[ins->last_data_prefix] = 0x66;
  9138. if (ins->last_repz_prefix >= 0)
  9139. ins->all_prefixes[ins->last_repz_prefix] = 0xf3;
  9140. if (ins->last_repnz_prefix >= 0)
  9141. ins->all_prefixes[ins->last_repnz_prefix] = 0xf2;
  9142. break;
  9143. }
  9144. /* Check if the REX prefix is used. */
  9145. if ((ins->rex ^ ins->rex_used) == 0
  9146. && !ins->need_vex && ins->last_rex_prefix >= 0)
  9147. ins->all_prefixes[ins->last_rex_prefix] = 0;
  9148. /* Check if the SEG prefix is used. */
  9149. if ((ins->prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES
  9150. | PREFIX_FS | PREFIX_GS)) != 0
  9151. && (ins->used_prefixes & ins->active_seg_prefix) != 0)
  9152. ins->all_prefixes[ins->last_seg_prefix] = 0;
  9153. /* Check if the ADDR prefix is used. */
  9154. if ((ins->prefixes & PREFIX_ADDR) != 0
  9155. && (ins->used_prefixes & PREFIX_ADDR) != 0)
  9156. ins->all_prefixes[ins->last_addr_prefix] = 0;
  9157. /* Check if the DATA prefix is used. */
  9158. if ((ins->prefixes & PREFIX_DATA) != 0
  9159. && (ins->used_prefixes & PREFIX_DATA) != 0
  9160. && !ins->need_vex)
  9161. ins->all_prefixes[ins->last_data_prefix] = 0;
  9162. /* Print the extra ins->prefixes. */
  9163. prefix_length = 0;
  9164. for (i = 0; i < (int) ARRAY_SIZE (ins->all_prefixes); i++)
  9165. if (ins->all_prefixes[i])
  9166. {
  9167. const char *name;
  9168. name = prefix_name (ins, ins->all_prefixes[i], orig_sizeflag);
  9169. if (name == NULL)
  9170. abort ();
  9171. prefix_length += strlen (name) + 1;
  9172. (*ins->info->fprintf_styled_func)
  9173. (ins->info->stream, dis_style_mnemonic, "%s ", name);
  9174. }
  9175. /* Check maximum code length. */
  9176. if ((ins->codep - ins->start_codep) > MAX_CODE_LENGTH)
  9177. {
  9178. (*ins->info->fprintf_styled_func)
  9179. (ins->info->stream, dis_style_text, "(bad)");
  9180. return MAX_CODE_LENGTH;
  9181. }
  9182. ins->obufp = ins->mnemonicendp;
  9183. for (i = strlen (ins->obuf) + prefix_length; i < 6; i++)
  9184. oappend (ins, " ");
  9185. oappend (ins, " ");
  9186. (*ins->info->fprintf_styled_func)
  9187. (ins->info->stream, dis_style_mnemonic, "%s", ins->obuf);
  9188. /* The enter and bound instructions are printed with operands in the same
  9189. order as the intel book; everything else is printed in reverse order. */
  9190. if (ins->intel_syntax || ins->two_source_ops)
  9191. {
  9192. bfd_vma riprel;
  9193. for (i = 0; i < MAX_OPERANDS; ++i)
  9194. op_txt[i] = ins->op_out[i];
  9195. if (ins->intel_syntax && dp && dp->op[2].rtn == OP_Rounding
  9196. && dp->op[3].rtn == OP_E && dp->op[4].rtn == NULL)
  9197. {
  9198. op_txt[2] = ins->op_out[3];
  9199. op_txt[3] = ins->op_out[2];
  9200. }
  9201. for (i = 0; i < (MAX_OPERANDS >> 1); ++i)
  9202. {
  9203. ins->op_ad = ins->op_index[i];
  9204. ins->op_index[i] = ins->op_index[MAX_OPERANDS - 1 - i];
  9205. ins->op_index[MAX_OPERANDS - 1 - i] = ins->op_ad;
  9206. riprel = ins->op_riprel[i];
  9207. ins->op_riprel[i] = ins->op_riprel[MAX_OPERANDS - 1 - i];
  9208. ins->op_riprel[MAX_OPERANDS - 1 - i] = riprel;
  9209. }
  9210. }
  9211. else
  9212. {
  9213. for (i = 0; i < MAX_OPERANDS; ++i)
  9214. op_txt[MAX_OPERANDS - 1 - i] = ins->op_out[i];
  9215. }
  9216. needcomma = 0;
  9217. for (i = 0; i < MAX_OPERANDS; ++i)
  9218. if (*op_txt[i])
  9219. {
  9220. if (needcomma)
  9221. (*ins->info->fprintf_styled_func) (ins->info->stream,
  9222. dis_style_text, ",");
  9223. if (ins->op_index[i] != -1 && !ins->op_riprel[i])
  9224. {
  9225. bfd_vma target = (bfd_vma) ins->op_address[ins->op_index[i]];
  9226. if (ins->op_is_jump)
  9227. {
  9228. ins->info->insn_info_valid = 1;
  9229. ins->info->branch_delay_insns = 0;
  9230. ins->info->data_size = 0;
  9231. ins->info->target = target;
  9232. ins->info->target2 = 0;
  9233. }
  9234. (*ins->info->print_address_func) (target, ins->info);
  9235. }
  9236. else
  9237. (*ins->info->fprintf_styled_func) (ins->info->stream,
  9238. dis_style_text, "%s",
  9239. op_txt[i]);
  9240. needcomma = 1;
  9241. }
  9242. for (i = 0; i < MAX_OPERANDS; i++)
  9243. if (ins->op_index[i] != -1 && ins->op_riprel[i])
  9244. {
  9245. (*ins->info->fprintf_styled_func) (ins->info->stream,
  9246. dis_style_comment_start,
  9247. " # ");
  9248. (*ins->info->print_address_func) ((bfd_vma)
  9249. (ins->start_pc + (ins->codep - ins->start_codep)
  9250. + ins->op_address[ins->op_index[i]]), ins->info);
  9251. break;
  9252. }
  9253. return ins->codep - priv.the_buffer;
  9254. }
  9255. static const char *float_mem[] = {
  9256. /* d8 */
  9257. "fadd{s|}",
  9258. "fmul{s|}",
  9259. "fcom{s|}",
  9260. "fcomp{s|}",
  9261. "fsub{s|}",
  9262. "fsubr{s|}",
  9263. "fdiv{s|}",
  9264. "fdivr{s|}",
  9265. /* d9 */
  9266. "fld{s|}",
  9267. "(bad)",
  9268. "fst{s|}",
  9269. "fstp{s|}",
  9270. "fldenv{C|C}",
  9271. "fldcw",
  9272. "fNstenv{C|C}",
  9273. "fNstcw",
  9274. /* da */
  9275. "fiadd{l|}",
  9276. "fimul{l|}",
  9277. "ficom{l|}",
  9278. "ficomp{l|}",
  9279. "fisub{l|}",
  9280. "fisubr{l|}",
  9281. "fidiv{l|}",
  9282. "fidivr{l|}",
  9283. /* db */
  9284. "fild{l|}",
  9285. "fisttp{l|}",
  9286. "fist{l|}",
  9287. "fistp{l|}",
  9288. "(bad)",
  9289. "fld{t|}",
  9290. "(bad)",
  9291. "fstp{t|}",
  9292. /* dc */
  9293. "fadd{l|}",
  9294. "fmul{l|}",
  9295. "fcom{l|}",
  9296. "fcomp{l|}",
  9297. "fsub{l|}",
  9298. "fsubr{l|}",
  9299. "fdiv{l|}",
  9300. "fdivr{l|}",
  9301. /* dd */
  9302. "fld{l|}",
  9303. "fisttp{ll|}",
  9304. "fst{l||}",
  9305. "fstp{l|}",
  9306. "frstor{C|C}",
  9307. "(bad)",
  9308. "fNsave{C|C}",
  9309. "fNstsw",
  9310. /* de */
  9311. "fiadd{s|}",
  9312. "fimul{s|}",
  9313. "ficom{s|}",
  9314. "ficomp{s|}",
  9315. "fisub{s|}",
  9316. "fisubr{s|}",
  9317. "fidiv{s|}",
  9318. "fidivr{s|}",
  9319. /* df */
  9320. "fild{s|}",
  9321. "fisttp{s|}",
  9322. "fist{s|}",
  9323. "fistp{s|}",
  9324. "fbld",
  9325. "fild{ll|}",
  9326. "fbstp",
  9327. "fistp{ll|}",
  9328. };
  9329. static const unsigned char float_mem_mode[] = {
  9330. /* d8 */
  9331. d_mode,
  9332. d_mode,
  9333. d_mode,
  9334. d_mode,
  9335. d_mode,
  9336. d_mode,
  9337. d_mode,
  9338. d_mode,
  9339. /* d9 */
  9340. d_mode,
  9341. 0,
  9342. d_mode,
  9343. d_mode,
  9344. 0,
  9345. w_mode,
  9346. 0,
  9347. w_mode,
  9348. /* da */
  9349. d_mode,
  9350. d_mode,
  9351. d_mode,
  9352. d_mode,
  9353. d_mode,
  9354. d_mode,
  9355. d_mode,
  9356. d_mode,
  9357. /* db */
  9358. d_mode,
  9359. d_mode,
  9360. d_mode,
  9361. d_mode,
  9362. 0,
  9363. t_mode,
  9364. 0,
  9365. t_mode,
  9366. /* dc */
  9367. q_mode,
  9368. q_mode,
  9369. q_mode,
  9370. q_mode,
  9371. q_mode,
  9372. q_mode,
  9373. q_mode,
  9374. q_mode,
  9375. /* dd */
  9376. q_mode,
  9377. q_mode,
  9378. q_mode,
  9379. q_mode,
  9380. 0,
  9381. 0,
  9382. 0,
  9383. w_mode,
  9384. /* de */
  9385. w_mode,
  9386. w_mode,
  9387. w_mode,
  9388. w_mode,
  9389. w_mode,
  9390. w_mode,
  9391. w_mode,
  9392. w_mode,
  9393. /* df */
  9394. w_mode,
  9395. w_mode,
  9396. w_mode,
  9397. w_mode,
  9398. t_mode,
  9399. q_mode,
  9400. t_mode,
  9401. q_mode
  9402. };
  9403. #define ST { OP_ST, 0 }
  9404. #define STi { OP_STi, 0 }
  9405. #define FGRPd9_2 NULL, { { NULL, 1 } }, 0
  9406. #define FGRPd9_4 NULL, { { NULL, 2 } }, 0
  9407. #define FGRPd9_5 NULL, { { NULL, 3 } }, 0
  9408. #define FGRPd9_6 NULL, { { NULL, 4 } }, 0
  9409. #define FGRPd9_7 NULL, { { NULL, 5 } }, 0
  9410. #define FGRPda_5 NULL, { { NULL, 6 } }, 0
  9411. #define FGRPdb_4 NULL, { { NULL, 7 } }, 0
  9412. #define FGRPde_3 NULL, { { NULL, 8 } }, 0
  9413. #define FGRPdf_4 NULL, { { NULL, 9 } }, 0
  9414. static const struct dis386 float_reg[][8] = {
  9415. /* d8 */
  9416. {
  9417. { "fadd", { ST, STi }, 0 },
  9418. { "fmul", { ST, STi }, 0 },
  9419. { "fcom", { STi }, 0 },
  9420. { "fcomp", { STi }, 0 },
  9421. { "fsub", { ST, STi }, 0 },
  9422. { "fsubr", { ST, STi }, 0 },
  9423. { "fdiv", { ST, STi }, 0 },
  9424. { "fdivr", { ST, STi }, 0 },
  9425. },
  9426. /* d9 */
  9427. {
  9428. { "fld", { STi }, 0 },
  9429. { "fxch", { STi }, 0 },
  9430. { FGRPd9_2 },
  9431. { Bad_Opcode },
  9432. { FGRPd9_4 },
  9433. { FGRPd9_5 },
  9434. { FGRPd9_6 },
  9435. { FGRPd9_7 },
  9436. },
  9437. /* da */
  9438. {
  9439. { "fcmovb", { ST, STi }, 0 },
  9440. { "fcmove", { ST, STi }, 0 },
  9441. { "fcmovbe",{ ST, STi }, 0 },
  9442. { "fcmovu", { ST, STi }, 0 },
  9443. { Bad_Opcode },
  9444. { FGRPda_5 },
  9445. { Bad_Opcode },
  9446. { Bad_Opcode },
  9447. },
  9448. /* db */
  9449. {
  9450. { "fcmovnb",{ ST, STi }, 0 },
  9451. { "fcmovne",{ ST, STi }, 0 },
  9452. { "fcmovnbe",{ ST, STi }, 0 },
  9453. { "fcmovnu",{ ST, STi }, 0 },
  9454. { FGRPdb_4 },
  9455. { "fucomi", { ST, STi }, 0 },
  9456. { "fcomi", { ST, STi }, 0 },
  9457. { Bad_Opcode },
  9458. },
  9459. /* dc */
  9460. {
  9461. { "fadd", { STi, ST }, 0 },
  9462. { "fmul", { STi, ST }, 0 },
  9463. { Bad_Opcode },
  9464. { Bad_Opcode },
  9465. { "fsub{!M|r}", { STi, ST }, 0 },
  9466. { "fsub{M|}", { STi, ST }, 0 },
  9467. { "fdiv{!M|r}", { STi, ST }, 0 },
  9468. { "fdiv{M|}", { STi, ST }, 0 },
  9469. },
  9470. /* dd */
  9471. {
  9472. { "ffree", { STi }, 0 },
  9473. { Bad_Opcode },
  9474. { "fst", { STi }, 0 },
  9475. { "fstp", { STi }, 0 },
  9476. { "fucom", { STi }, 0 },
  9477. { "fucomp", { STi }, 0 },
  9478. { Bad_Opcode },
  9479. { Bad_Opcode },
  9480. },
  9481. /* de */
  9482. {
  9483. { "faddp", { STi, ST }, 0 },
  9484. { "fmulp", { STi, ST }, 0 },
  9485. { Bad_Opcode },
  9486. { FGRPde_3 },
  9487. { "fsub{!M|r}p", { STi, ST }, 0 },
  9488. { "fsub{M|}p", { STi, ST }, 0 },
  9489. { "fdiv{!M|r}p", { STi, ST }, 0 },
  9490. { "fdiv{M|}p", { STi, ST }, 0 },
  9491. },
  9492. /* df */
  9493. {
  9494. { "ffreep", { STi }, 0 },
  9495. { Bad_Opcode },
  9496. { Bad_Opcode },
  9497. { Bad_Opcode },
  9498. { FGRPdf_4 },
  9499. { "fucomip", { ST, STi }, 0 },
  9500. { "fcomip", { ST, STi }, 0 },
  9501. { Bad_Opcode },
  9502. },
  9503. };
  9504. static const char *const fgrps[][8] = {
  9505. /* Bad opcode 0 */
  9506. {
  9507. "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
  9508. },
  9509. /* d9_2 1 */
  9510. {
  9511. "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
  9512. },
  9513. /* d9_4 2 */
  9514. {
  9515. "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)",
  9516. },
  9517. /* d9_5 3 */
  9518. {
  9519. "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)",
  9520. },
  9521. /* d9_6 4 */
  9522. {
  9523. "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp",
  9524. },
  9525. /* d9_7 5 */
  9526. {
  9527. "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos",
  9528. },
  9529. /* da_5 6 */
  9530. {
  9531. "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
  9532. },
  9533. /* db_4 7 */
  9534. {
  9535. "fNeni(8087 only)","fNdisi(8087 only)","fNclex","fNinit",
  9536. "fNsetpm(287 only)","frstpm(287 only)","(bad)","(bad)",
  9537. },
  9538. /* de_3 8 */
  9539. {
  9540. "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
  9541. },
  9542. /* df_4 9 */
  9543. {
  9544. "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
  9545. },
  9546. };
  9547. static void
  9548. swap_operand (instr_info *ins)
  9549. {
  9550. ins->mnemonicendp[0] = '.';
  9551. ins->mnemonicendp[1] = 's';
  9552. ins->mnemonicendp[2] = '\0';
  9553. ins->mnemonicendp += 2;
  9554. }
  9555. static void
  9556. OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  9557. int sizeflag ATTRIBUTE_UNUSED)
  9558. {
  9559. /* Skip mod/rm byte. */
  9560. MODRM_CHECK;
  9561. ins->codep++;
  9562. }
  9563. static void
  9564. dofloat (instr_info *ins, int sizeflag)
  9565. {
  9566. const struct dis386 *dp;
  9567. unsigned char floatop;
  9568. floatop = ins->codep[-1];
  9569. if (ins->modrm.mod != 3)
  9570. {
  9571. int fp_indx = (floatop - 0xd8) * 8 + ins->modrm.reg;
  9572. putop (ins, float_mem[fp_indx], sizeflag);
  9573. ins->obufp = ins->op_out[0];
  9574. ins->op_ad = 2;
  9575. OP_E (ins, float_mem_mode[fp_indx], sizeflag);
  9576. return;
  9577. }
  9578. /* Skip mod/rm byte. */
  9579. MODRM_CHECK;
  9580. ins->codep++;
  9581. dp = &float_reg[floatop - 0xd8][ins->modrm.reg];
  9582. if (dp->name == NULL)
  9583. {
  9584. putop (ins, fgrps[dp->op[0].bytemode][ins->modrm.rm], sizeflag);
  9585. /* Instruction fnstsw is only one with strange arg. */
  9586. if (floatop == 0xdf && ins->codep[-1] == 0xe0)
  9587. strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax);
  9588. }
  9589. else
  9590. {
  9591. putop (ins, dp->name, sizeflag);
  9592. ins->obufp = ins->op_out[0];
  9593. ins->op_ad = 2;
  9594. if (dp->op[0].rtn)
  9595. (*dp->op[0].rtn) (ins, dp->op[0].bytemode, sizeflag);
  9596. ins->obufp = ins->op_out[1];
  9597. ins->op_ad = 1;
  9598. if (dp->op[1].rtn)
  9599. (*dp->op[1].rtn) (ins, dp->op[1].bytemode, sizeflag);
  9600. }
  9601. }
  9602. static void
  9603. OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  9604. int sizeflag ATTRIBUTE_UNUSED)
  9605. {
  9606. oappend_maybe_intel (ins, "%st");
  9607. }
  9608. static void
  9609. OP_STi (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  9610. int sizeflag ATTRIBUTE_UNUSED)
  9611. {
  9612. sprintf (ins->scratchbuf, "%%st(%d)", ins->modrm.rm);
  9613. oappend_maybe_intel (ins, ins->scratchbuf);
  9614. }
  9615. /* Capital letters in template are macros. */
  9616. static int
  9617. putop (instr_info *ins, const char *in_template, int sizeflag)
  9618. {
  9619. const char *p;
  9620. int alt = 0;
  9621. int cond = 1;
  9622. unsigned int l = 0, len = 0;
  9623. char last[4];
  9624. for (p = in_template; *p; p++)
  9625. {
  9626. if (len > l)
  9627. {
  9628. if (l >= sizeof (last) || !ISUPPER (*p))
  9629. abort ();
  9630. last[l++] = *p;
  9631. continue;
  9632. }
  9633. switch (*p)
  9634. {
  9635. default:
  9636. *ins->obufp++ = *p;
  9637. break;
  9638. case '%':
  9639. len++;
  9640. break;
  9641. case '!':
  9642. cond = 0;
  9643. break;
  9644. case '{':
  9645. if (ins->intel_syntax)
  9646. {
  9647. while (*++p != '|')
  9648. if (*p == '}' || *p == '\0')
  9649. abort ();
  9650. alt = 1;
  9651. }
  9652. break;
  9653. case '|':
  9654. while (*++p != '}')
  9655. {
  9656. if (*p == '\0')
  9657. abort ();
  9658. }
  9659. break;
  9660. case '}':
  9661. alt = 0;
  9662. break;
  9663. case 'A':
  9664. if (ins->intel_syntax)
  9665. break;
  9666. if ((ins->need_modrm && ins->modrm.mod != 3)
  9667. || (sizeflag & SUFFIX_ALWAYS))
  9668. *ins->obufp++ = 'b';
  9669. break;
  9670. case 'B':
  9671. if (l == 0)
  9672. {
  9673. case_B:
  9674. if (ins->intel_syntax)
  9675. break;
  9676. if (sizeflag & SUFFIX_ALWAYS)
  9677. *ins->obufp++ = 'b';
  9678. }
  9679. else if (l == 1 && last[0] == 'L')
  9680. {
  9681. if (ins->address_mode == mode_64bit
  9682. && !(ins->prefixes & PREFIX_ADDR))
  9683. {
  9684. *ins->obufp++ = 'a';
  9685. *ins->obufp++ = 'b';
  9686. *ins->obufp++ = 's';
  9687. }
  9688. goto case_B;
  9689. }
  9690. else
  9691. abort ();
  9692. break;
  9693. case 'C':
  9694. if (ins->intel_syntax && !alt)
  9695. break;
  9696. if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
  9697. {
  9698. if (sizeflag & DFLAG)
  9699. *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
  9700. else
  9701. *ins->obufp++ = ins->intel_syntax ? 'w' : 's';
  9702. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  9703. }
  9704. break;
  9705. case 'D':
  9706. if (l == 1)
  9707. {
  9708. switch (last[0])
  9709. {
  9710. case 'X':
  9711. if (!ins->vex.evex || ins->vex.w)
  9712. *ins->obufp++ = 'd';
  9713. else
  9714. oappend (ins, "{bad}");
  9715. break;
  9716. default:
  9717. abort ();
  9718. }
  9719. break;
  9720. }
  9721. if (l)
  9722. abort ();
  9723. if (ins->intel_syntax || !(sizeflag & SUFFIX_ALWAYS))
  9724. break;
  9725. USED_REX (REX_W);
  9726. if (ins->modrm.mod == 3)
  9727. {
  9728. if (ins->rex & REX_W)
  9729. *ins->obufp++ = 'q';
  9730. else
  9731. {
  9732. if (sizeflag & DFLAG)
  9733. *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
  9734. else
  9735. *ins->obufp++ = 'w';
  9736. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  9737. }
  9738. }
  9739. else
  9740. *ins->obufp++ = 'w';
  9741. break;
  9742. case 'E': /* For jcxz/jecxz */
  9743. if (ins->address_mode == mode_64bit)
  9744. {
  9745. if (sizeflag & AFLAG)
  9746. *ins->obufp++ = 'r';
  9747. else
  9748. *ins->obufp++ = 'e';
  9749. }
  9750. else
  9751. if (sizeflag & AFLAG)
  9752. *ins->obufp++ = 'e';
  9753. ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
  9754. break;
  9755. case 'F':
  9756. if (ins->intel_syntax)
  9757. break;
  9758. if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS))
  9759. {
  9760. if (sizeflag & AFLAG)
  9761. *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
  9762. else
  9763. *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w';
  9764. ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
  9765. }
  9766. break;
  9767. case 'G':
  9768. if (ins->intel_syntax || (ins->obufp[-1] != 's'
  9769. && !(sizeflag & SUFFIX_ALWAYS)))
  9770. break;
  9771. if ((ins->rex & REX_W) || (sizeflag & DFLAG))
  9772. *ins->obufp++ = 'l';
  9773. else
  9774. *ins->obufp++ = 'w';
  9775. if (!(ins->rex & REX_W))
  9776. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  9777. break;
  9778. case 'H':
  9779. if (l == 0)
  9780. {
  9781. if (ins->intel_syntax)
  9782. break;
  9783. if ((ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_CS
  9784. || (ins->prefixes & (PREFIX_CS | PREFIX_DS)) == PREFIX_DS)
  9785. {
  9786. ins->used_prefixes |= ins->prefixes & (PREFIX_CS | PREFIX_DS);
  9787. *ins->obufp++ = ',';
  9788. *ins->obufp++ = 'p';
  9789. /* Set active_seg_prefix even if not set in 64-bit mode
  9790. because here it is a valid branch hint. */
  9791. if (ins->prefixes & PREFIX_DS)
  9792. {
  9793. ins->active_seg_prefix = PREFIX_DS;
  9794. *ins->obufp++ = 't';
  9795. }
  9796. else
  9797. {
  9798. ins->active_seg_prefix = PREFIX_CS;
  9799. *ins->obufp++ = 'n';
  9800. }
  9801. }
  9802. }
  9803. else if (l == 1 && last[0] == 'X')
  9804. {
  9805. if (!ins->vex.w)
  9806. *ins->obufp++ = 'h';
  9807. else
  9808. oappend (ins, "{bad}");
  9809. }
  9810. else
  9811. abort ();
  9812. break;
  9813. case 'K':
  9814. USED_REX (REX_W);
  9815. if (ins->rex & REX_W)
  9816. *ins->obufp++ = 'q';
  9817. else
  9818. *ins->obufp++ = 'd';
  9819. break;
  9820. case 'L':
  9821. abort ();
  9822. case 'M':
  9823. if (ins->intel_mnemonic != cond)
  9824. *ins->obufp++ = 'r';
  9825. break;
  9826. case 'N':
  9827. if ((ins->prefixes & PREFIX_FWAIT) == 0)
  9828. *ins->obufp++ = 'n';
  9829. else
  9830. ins->used_prefixes |= PREFIX_FWAIT;
  9831. break;
  9832. case 'O':
  9833. USED_REX (REX_W);
  9834. if (ins->rex & REX_W)
  9835. *ins->obufp++ = 'o';
  9836. else if (ins->intel_syntax && (sizeflag & DFLAG))
  9837. *ins->obufp++ = 'q';
  9838. else
  9839. *ins->obufp++ = 'd';
  9840. if (!(ins->rex & REX_W))
  9841. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  9842. break;
  9843. case '@':
  9844. if (ins->address_mode == mode_64bit
  9845. && (ins->isa64 == intel64 || (ins->rex & REX_W)
  9846. || !(ins->prefixes & PREFIX_DATA)))
  9847. {
  9848. if (sizeflag & SUFFIX_ALWAYS)
  9849. *ins->obufp++ = 'q';
  9850. break;
  9851. }
  9852. /* Fall through. */
  9853. case 'P':
  9854. if (l == 0)
  9855. {
  9856. if ((ins->modrm.mod == 3 || !cond)
  9857. && !(sizeflag & SUFFIX_ALWAYS))
  9858. break;
  9859. /* Fall through. */
  9860. case 'T':
  9861. if ((!(ins->rex & REX_W) && (ins->prefixes & PREFIX_DATA))
  9862. || ((sizeflag & SUFFIX_ALWAYS)
  9863. && ins->address_mode != mode_64bit))
  9864. {
  9865. *ins->obufp++ = (sizeflag & DFLAG)
  9866. ? ins->intel_syntax ? 'd' : 'l' : 'w';
  9867. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  9868. }
  9869. else if (sizeflag & SUFFIX_ALWAYS)
  9870. *ins->obufp++ = 'q';
  9871. }
  9872. else if (l == 1 && last[0] == 'L')
  9873. {
  9874. if ((ins->prefixes & PREFIX_DATA)
  9875. || (ins->rex & REX_W)
  9876. || (sizeflag & SUFFIX_ALWAYS))
  9877. {
  9878. USED_REX (REX_W);
  9879. if (ins->rex & REX_W)
  9880. *ins->obufp++ = 'q';
  9881. else
  9882. {
  9883. if (sizeflag & DFLAG)
  9884. *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
  9885. else
  9886. *ins->obufp++ = 'w';
  9887. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  9888. }
  9889. }
  9890. }
  9891. else
  9892. abort ();
  9893. break;
  9894. case 'Q':
  9895. if (l == 0)
  9896. {
  9897. if (ins->intel_syntax && !alt)
  9898. break;
  9899. USED_REX (REX_W);
  9900. if ((ins->need_modrm && ins->modrm.mod != 3)
  9901. || (sizeflag & SUFFIX_ALWAYS))
  9902. {
  9903. if (ins->rex & REX_W)
  9904. *ins->obufp++ = 'q';
  9905. else
  9906. {
  9907. if (sizeflag & DFLAG)
  9908. *ins->obufp++ = ins->intel_syntax ? 'd' : 'l';
  9909. else
  9910. *ins->obufp++ = 'w';
  9911. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  9912. }
  9913. }
  9914. }
  9915. else if (l == 1 && last[0] == 'D')
  9916. *ins->obufp++ = ins->vex.w ? 'q' : 'd';
  9917. else if (l == 1 && last[0] == 'L')
  9918. {
  9919. if (cond ? ins->modrm.mod == 3 && !(sizeflag & SUFFIX_ALWAYS)
  9920. : ins->address_mode != mode_64bit)
  9921. break;
  9922. if ((ins->rex & REX_W))
  9923. {
  9924. USED_REX (REX_W);
  9925. *ins->obufp++ = 'q';
  9926. }
  9927. else if ((ins->address_mode == mode_64bit && cond)
  9928. || (sizeflag & SUFFIX_ALWAYS))
  9929. *ins->obufp++ = ins->intel_syntax? 'd' : 'l';
  9930. }
  9931. else
  9932. abort ();
  9933. break;
  9934. case 'R':
  9935. USED_REX (REX_W);
  9936. if (ins->rex & REX_W)
  9937. *ins->obufp++ = 'q';
  9938. else if (sizeflag & DFLAG)
  9939. {
  9940. if (ins->intel_syntax)
  9941. *ins->obufp++ = 'd';
  9942. else
  9943. *ins->obufp++ = 'l';
  9944. }
  9945. else
  9946. *ins->obufp++ = 'w';
  9947. if (ins->intel_syntax && !p[1]
  9948. && ((ins->rex & REX_W) || (sizeflag & DFLAG)))
  9949. *ins->obufp++ = 'e';
  9950. if (!(ins->rex & REX_W))
  9951. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  9952. break;
  9953. case 'S':
  9954. if (l == 0)
  9955. {
  9956. case_S:
  9957. if (ins->intel_syntax)
  9958. break;
  9959. if (sizeflag & SUFFIX_ALWAYS)
  9960. {
  9961. if (ins->rex & REX_W)
  9962. *ins->obufp++ = 'q';
  9963. else
  9964. {
  9965. if (sizeflag & DFLAG)
  9966. *ins->obufp++ = 'l';
  9967. else
  9968. *ins->obufp++ = 'w';
  9969. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  9970. }
  9971. }
  9972. break;
  9973. }
  9974. if (l != 1)
  9975. abort ();
  9976. switch (last[0])
  9977. {
  9978. case 'L':
  9979. if (ins->address_mode == mode_64bit
  9980. && !(ins->prefixes & PREFIX_ADDR))
  9981. {
  9982. *ins->obufp++ = 'a';
  9983. *ins->obufp++ = 'b';
  9984. *ins->obufp++ = 's';
  9985. }
  9986. goto case_S;
  9987. case 'X':
  9988. if (!ins->vex.evex || !ins->vex.w)
  9989. *ins->obufp++ = 's';
  9990. else
  9991. oappend (ins, "{bad}");
  9992. break;
  9993. default:
  9994. abort ();
  9995. }
  9996. break;
  9997. case 'V':
  9998. if (l == 0)
  9999. abort ();
  10000. else if (l == 1
  10001. && (last[0] == 'L' || last[0] == 'X'))
  10002. {
  10003. if (last[0] == 'X')
  10004. {
  10005. *ins->obufp++ = '{';
  10006. *ins->obufp++ = 'v';
  10007. *ins->obufp++ = 'e';
  10008. *ins->obufp++ = 'x';
  10009. *ins->obufp++ = '}';
  10010. }
  10011. else if (ins->rex & REX_W)
  10012. {
  10013. *ins->obufp++ = 'a';
  10014. *ins->obufp++ = 'b';
  10015. *ins->obufp++ = 's';
  10016. }
  10017. }
  10018. else
  10019. abort ();
  10020. goto case_S;
  10021. case 'W':
  10022. if (l == 0)
  10023. {
  10024. /* operand size flag for cwtl, cbtw */
  10025. USED_REX (REX_W);
  10026. if (ins->rex & REX_W)
  10027. {
  10028. if (ins->intel_syntax)
  10029. *ins->obufp++ = 'd';
  10030. else
  10031. *ins->obufp++ = 'l';
  10032. }
  10033. else if (sizeflag & DFLAG)
  10034. *ins->obufp++ = 'w';
  10035. else
  10036. *ins->obufp++ = 'b';
  10037. if (!(ins->rex & REX_W))
  10038. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  10039. }
  10040. else if (l == 1)
  10041. {
  10042. if (!ins->need_vex)
  10043. abort ();
  10044. if (last[0] == 'X')
  10045. *ins->obufp++ = ins->vex.w ? 'd': 's';
  10046. else if (last[0] == 'B')
  10047. *ins->obufp++ = ins->vex.w ? 'w': 'b';
  10048. else
  10049. abort ();
  10050. }
  10051. else
  10052. abort ();
  10053. break;
  10054. case 'X':
  10055. if (l != 0)
  10056. abort ();
  10057. if (ins->need_vex
  10058. ? ins->vex.prefix == DATA_PREFIX_OPCODE
  10059. : ins->prefixes & PREFIX_DATA)
  10060. {
  10061. *ins->obufp++ = 'd';
  10062. ins->used_prefixes |= PREFIX_DATA;
  10063. }
  10064. else
  10065. *ins->obufp++ = 's';
  10066. break;
  10067. case 'Y':
  10068. if (l == 1 && last[0] == 'X')
  10069. {
  10070. if (!ins->need_vex)
  10071. abort ();
  10072. if (ins->intel_syntax
  10073. || ((ins->modrm.mod == 3 || ins->vex.b)
  10074. && !(sizeflag & SUFFIX_ALWAYS)))
  10075. break;
  10076. switch (ins->vex.length)
  10077. {
  10078. case 128:
  10079. *ins->obufp++ = 'x';
  10080. break;
  10081. case 256:
  10082. *ins->obufp++ = 'y';
  10083. break;
  10084. case 512:
  10085. if (!ins->vex.evex)
  10086. default:
  10087. abort ();
  10088. }
  10089. }
  10090. else
  10091. abort ();
  10092. break;
  10093. case 'Z':
  10094. if (l == 0)
  10095. {
  10096. /* These insns ignore ModR/M.mod: Force it to 3 for OP_E(). */
  10097. ins->modrm.mod = 3;
  10098. if (!ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
  10099. *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l';
  10100. }
  10101. else if (l == 1 && last[0] == 'X')
  10102. {
  10103. if (!ins->vex.evex)
  10104. abort ();
  10105. if (ins->intel_syntax
  10106. || ((ins->modrm.mod == 3 || ins->vex.b)
  10107. && !(sizeflag & SUFFIX_ALWAYS)))
  10108. break;
  10109. switch (ins->vex.length)
  10110. {
  10111. case 128:
  10112. *ins->obufp++ = 'x';
  10113. break;
  10114. case 256:
  10115. *ins->obufp++ = 'y';
  10116. break;
  10117. case 512:
  10118. *ins->obufp++ = 'z';
  10119. break;
  10120. default:
  10121. abort ();
  10122. }
  10123. }
  10124. else
  10125. abort ();
  10126. break;
  10127. case '^':
  10128. if (ins->intel_syntax)
  10129. break;
  10130. if (ins->isa64 == intel64 && (ins->rex & REX_W))
  10131. {
  10132. USED_REX (REX_W);
  10133. *ins->obufp++ = 'q';
  10134. break;
  10135. }
  10136. if ((ins->prefixes & PREFIX_DATA) || (sizeflag & SUFFIX_ALWAYS))
  10137. {
  10138. if (sizeflag & DFLAG)
  10139. *ins->obufp++ = 'l';
  10140. else
  10141. *ins->obufp++ = 'w';
  10142. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  10143. }
  10144. break;
  10145. }
  10146. if (len == l)
  10147. len = l = 0;
  10148. }
  10149. *ins->obufp = 0;
  10150. ins->mnemonicendp = ins->obufp;
  10151. return 0;
  10152. }
  10153. static void
  10154. oappend (instr_info *ins, const char *s)
  10155. {
  10156. ins->obufp = stpcpy (ins->obufp, s);
  10157. }
  10158. static void
  10159. append_seg (instr_info *ins)
  10160. {
  10161. /* Only print the active segment register. */
  10162. if (!ins->active_seg_prefix)
  10163. return;
  10164. ins->used_prefixes |= ins->active_seg_prefix;
  10165. switch (ins->active_seg_prefix)
  10166. {
  10167. case PREFIX_CS:
  10168. oappend_maybe_intel (ins, "%cs:");
  10169. break;
  10170. case PREFIX_DS:
  10171. oappend_maybe_intel (ins, "%ds:");
  10172. break;
  10173. case PREFIX_SS:
  10174. oappend_maybe_intel (ins, "%ss:");
  10175. break;
  10176. case PREFIX_ES:
  10177. oappend_maybe_intel (ins, "%es:");
  10178. break;
  10179. case PREFIX_FS:
  10180. oappend_maybe_intel (ins, "%fs:");
  10181. break;
  10182. case PREFIX_GS:
  10183. oappend_maybe_intel (ins, "%gs:");
  10184. break;
  10185. default:
  10186. break;
  10187. }
  10188. }
  10189. static void
  10190. OP_indirE (instr_info *ins, int bytemode, int sizeflag)
  10191. {
  10192. if (!ins->intel_syntax)
  10193. oappend (ins, "*");
  10194. OP_E (ins, bytemode, sizeflag);
  10195. }
  10196. static void
  10197. print_operand_value (instr_info *ins, char *buf, int hex, bfd_vma disp)
  10198. {
  10199. if (ins->address_mode == mode_64bit)
  10200. {
  10201. if (hex)
  10202. {
  10203. char tmp[30];
  10204. int i;
  10205. buf[0] = '0';
  10206. buf[1] = 'x';
  10207. sprintf_vma (tmp, disp);
  10208. for (i = 0; tmp[i] == '0' && tmp[i + 1]; i++);
  10209. strcpy (buf + 2, tmp + i);
  10210. }
  10211. else
  10212. {
  10213. bfd_signed_vma v = disp;
  10214. char tmp[30];
  10215. int i;
  10216. if (v < 0)
  10217. {
  10218. *(buf++) = '-';
  10219. v = -disp;
  10220. /* Check for possible overflow on 0x8000000000000000. */
  10221. if (v < 0)
  10222. {
  10223. strcpy (buf, "9223372036854775808");
  10224. return;
  10225. }
  10226. }
  10227. if (!v)
  10228. {
  10229. strcpy (buf, "0");
  10230. return;
  10231. }
  10232. i = 0;
  10233. tmp[29] = 0;
  10234. while (v)
  10235. {
  10236. tmp[28 - i] = (v % 10) + '0';
  10237. v /= 10;
  10238. i++;
  10239. }
  10240. strcpy (buf, tmp + 29 - i);
  10241. }
  10242. }
  10243. else
  10244. {
  10245. if (hex)
  10246. sprintf (buf, "0x%x", (unsigned int) disp);
  10247. else
  10248. sprintf (buf, "%d", (int) disp);
  10249. }
  10250. }
  10251. /* Put DISP in BUF as signed hex number. */
  10252. static void
  10253. print_displacement (instr_info *ins, char *buf, bfd_vma disp)
  10254. {
  10255. bfd_signed_vma val = disp;
  10256. char tmp[30];
  10257. int i, j = 0;
  10258. if (val < 0)
  10259. {
  10260. buf[j++] = '-';
  10261. val = -disp;
  10262. /* Check for possible overflow. */
  10263. if (val < 0)
  10264. {
  10265. switch (ins->address_mode)
  10266. {
  10267. case mode_64bit:
  10268. strcpy (buf + j, "0x8000000000000000");
  10269. break;
  10270. case mode_32bit:
  10271. strcpy (buf + j, "0x80000000");
  10272. break;
  10273. case mode_16bit:
  10274. strcpy (buf + j, "0x8000");
  10275. break;
  10276. }
  10277. return;
  10278. }
  10279. }
  10280. buf[j++] = '0';
  10281. buf[j++] = 'x';
  10282. sprintf_vma (tmp, (bfd_vma) val);
  10283. for (i = 0; tmp[i] == '0'; i++)
  10284. continue;
  10285. if (tmp[i] == '\0')
  10286. i--;
  10287. strcpy (buf + j, tmp + i);
  10288. }
  10289. static void
  10290. intel_operand_size (instr_info *ins, int bytemode, int sizeflag)
  10291. {
  10292. if (ins->vex.b)
  10293. {
  10294. if (!ins->vex.no_broadcast)
  10295. switch (bytemode)
  10296. {
  10297. case x_mode:
  10298. case evex_half_bcst_xmmq_mode:
  10299. if (ins->vex.w)
  10300. oappend (ins, "QWORD PTR ");
  10301. else
  10302. oappend (ins, "DWORD PTR ");
  10303. break;
  10304. case xh_mode:
  10305. case evex_half_bcst_xmmqh_mode:
  10306. case evex_half_bcst_xmmqdh_mode:
  10307. oappend (ins, "WORD PTR ");
  10308. break;
  10309. default:
  10310. ins->vex.no_broadcast = true;
  10311. break;
  10312. }
  10313. return;
  10314. }
  10315. switch (bytemode)
  10316. {
  10317. case b_mode:
  10318. case b_swap_mode:
  10319. case db_mode:
  10320. oappend (ins, "BYTE PTR ");
  10321. break;
  10322. case w_mode:
  10323. case w_swap_mode:
  10324. case dw_mode:
  10325. oappend (ins, "WORD PTR ");
  10326. break;
  10327. case indir_v_mode:
  10328. if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
  10329. {
  10330. oappend (ins, "QWORD PTR ");
  10331. break;
  10332. }
  10333. /* Fall through. */
  10334. case stack_v_mode:
  10335. if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
  10336. || (ins->rex & REX_W)))
  10337. {
  10338. oappend (ins, "QWORD PTR ");
  10339. break;
  10340. }
  10341. /* Fall through. */
  10342. case v_mode:
  10343. case v_swap_mode:
  10344. case dq_mode:
  10345. USED_REX (REX_W);
  10346. if (ins->rex & REX_W)
  10347. oappend (ins, "QWORD PTR ");
  10348. else if (bytemode == dq_mode)
  10349. oappend (ins, "DWORD PTR ");
  10350. else
  10351. {
  10352. if (sizeflag & DFLAG)
  10353. oappend (ins, "DWORD PTR ");
  10354. else
  10355. oappend (ins, "WORD PTR ");
  10356. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  10357. }
  10358. break;
  10359. case z_mode:
  10360. if ((ins->rex & REX_W) || (sizeflag & DFLAG))
  10361. *ins->obufp++ = 'D';
  10362. oappend (ins, "WORD PTR ");
  10363. if (!(ins->rex & REX_W))
  10364. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  10365. break;
  10366. case a_mode:
  10367. if (sizeflag & DFLAG)
  10368. oappend (ins, "QWORD PTR ");
  10369. else
  10370. oappend (ins, "DWORD PTR ");
  10371. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  10372. break;
  10373. case movsxd_mode:
  10374. if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
  10375. oappend (ins, "WORD PTR ");
  10376. else
  10377. oappend (ins, "DWORD PTR ");
  10378. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  10379. break;
  10380. case d_mode:
  10381. case d_swap_mode:
  10382. oappend (ins, "DWORD PTR ");
  10383. break;
  10384. case q_mode:
  10385. case q_swap_mode:
  10386. oappend (ins, "QWORD PTR ");
  10387. break;
  10388. case m_mode:
  10389. if (ins->address_mode == mode_64bit)
  10390. oappend (ins, "QWORD PTR ");
  10391. else
  10392. oappend (ins, "DWORD PTR ");
  10393. break;
  10394. case f_mode:
  10395. if (sizeflag & DFLAG)
  10396. oappend (ins, "FWORD PTR ");
  10397. else
  10398. oappend (ins, "DWORD PTR ");
  10399. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  10400. break;
  10401. case t_mode:
  10402. oappend (ins, "TBYTE PTR ");
  10403. break;
  10404. case x_mode:
  10405. case xh_mode:
  10406. case x_swap_mode:
  10407. case evex_x_gscat_mode:
  10408. case evex_x_nobcst_mode:
  10409. case bw_unit_mode:
  10410. if (ins->need_vex)
  10411. {
  10412. switch (ins->vex.length)
  10413. {
  10414. case 128:
  10415. oappend (ins, "XMMWORD PTR ");
  10416. break;
  10417. case 256:
  10418. oappend (ins, "YMMWORD PTR ");
  10419. break;
  10420. case 512:
  10421. oappend (ins, "ZMMWORD PTR ");
  10422. break;
  10423. default:
  10424. abort ();
  10425. }
  10426. }
  10427. else
  10428. oappend (ins, "XMMWORD PTR ");
  10429. break;
  10430. case xmm_mode:
  10431. oappend (ins, "XMMWORD PTR ");
  10432. break;
  10433. case ymm_mode:
  10434. oappend (ins, "YMMWORD PTR ");
  10435. break;
  10436. case xmmq_mode:
  10437. case evex_half_bcst_xmmqh_mode:
  10438. case evex_half_bcst_xmmq_mode:
  10439. if (!ins->need_vex)
  10440. abort ();
  10441. switch (ins->vex.length)
  10442. {
  10443. case 128:
  10444. oappend (ins, "QWORD PTR ");
  10445. break;
  10446. case 256:
  10447. oappend (ins, "XMMWORD PTR ");
  10448. break;
  10449. case 512:
  10450. oappend (ins, "YMMWORD PTR ");
  10451. break;
  10452. default:
  10453. abort ();
  10454. }
  10455. break;
  10456. case xmmdw_mode:
  10457. if (!ins->need_vex)
  10458. abort ();
  10459. switch (ins->vex.length)
  10460. {
  10461. case 128:
  10462. oappend (ins, "WORD PTR ");
  10463. break;
  10464. case 256:
  10465. oappend (ins, "DWORD PTR ");
  10466. break;
  10467. case 512:
  10468. oappend (ins, "QWORD PTR ");
  10469. break;
  10470. default:
  10471. abort ();
  10472. }
  10473. break;
  10474. case xmmqd_mode:
  10475. case evex_half_bcst_xmmqdh_mode:
  10476. if (!ins->need_vex)
  10477. abort ();
  10478. switch (ins->vex.length)
  10479. {
  10480. case 128:
  10481. oappend (ins, "DWORD PTR ");
  10482. break;
  10483. case 256:
  10484. oappend (ins, "QWORD PTR ");
  10485. break;
  10486. case 512:
  10487. oappend (ins, "XMMWORD PTR ");
  10488. break;
  10489. default:
  10490. abort ();
  10491. }
  10492. break;
  10493. case ymmq_mode:
  10494. if (!ins->need_vex)
  10495. abort ();
  10496. switch (ins->vex.length)
  10497. {
  10498. case 128:
  10499. oappend (ins, "QWORD PTR ");
  10500. break;
  10501. case 256:
  10502. oappend (ins, "YMMWORD PTR ");
  10503. break;
  10504. case 512:
  10505. oappend (ins, "ZMMWORD PTR ");
  10506. break;
  10507. default:
  10508. abort ();
  10509. }
  10510. break;
  10511. case o_mode:
  10512. oappend (ins, "OWORD PTR ");
  10513. break;
  10514. case vex_vsib_d_w_dq_mode:
  10515. case vex_vsib_q_w_dq_mode:
  10516. if (!ins->need_vex)
  10517. abort ();
  10518. if (ins->vex.w)
  10519. oappend (ins, "QWORD PTR ");
  10520. else
  10521. oappend (ins, "DWORD PTR ");
  10522. break;
  10523. case mask_bd_mode:
  10524. if (!ins->need_vex || ins->vex.length != 128)
  10525. abort ();
  10526. if (ins->vex.w)
  10527. oappend (ins, "DWORD PTR ");
  10528. else
  10529. oappend (ins, "BYTE PTR ");
  10530. break;
  10531. case mask_mode:
  10532. if (!ins->need_vex)
  10533. abort ();
  10534. if (ins->vex.w)
  10535. oappend (ins, "QWORD PTR ");
  10536. else
  10537. oappend (ins, "WORD PTR ");
  10538. break;
  10539. case v_bnd_mode:
  10540. case v_bndmk_mode:
  10541. default:
  10542. break;
  10543. }
  10544. }
  10545. static void
  10546. print_register (instr_info *ins, unsigned int reg, unsigned int rexmask,
  10547. int bytemode, int sizeflag)
  10548. {
  10549. const char *const *names;
  10550. USED_REX (rexmask);
  10551. if (ins->rex & rexmask)
  10552. reg += 8;
  10553. switch (bytemode)
  10554. {
  10555. case b_mode:
  10556. case b_swap_mode:
  10557. if (reg & 4)
  10558. USED_REX (0);
  10559. if (ins->rex)
  10560. names = att_names8rex;
  10561. else
  10562. names = att_names8;
  10563. break;
  10564. case w_mode:
  10565. names = att_names16;
  10566. break;
  10567. case d_mode:
  10568. case dw_mode:
  10569. case db_mode:
  10570. names = att_names32;
  10571. break;
  10572. case q_mode:
  10573. names = att_names64;
  10574. break;
  10575. case m_mode:
  10576. case v_bnd_mode:
  10577. names = ins->address_mode == mode_64bit ? att_names64 : att_names32;
  10578. break;
  10579. case bnd_mode:
  10580. case bnd_swap_mode:
  10581. if (reg > 0x3)
  10582. {
  10583. oappend (ins, "(bad)");
  10584. return;
  10585. }
  10586. names = att_names_bnd;
  10587. break;
  10588. case indir_v_mode:
  10589. if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
  10590. {
  10591. names = att_names64;
  10592. break;
  10593. }
  10594. /* Fall through. */
  10595. case stack_v_mode:
  10596. if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
  10597. || (ins->rex & REX_W)))
  10598. {
  10599. names = att_names64;
  10600. break;
  10601. }
  10602. bytemode = v_mode;
  10603. /* Fall through. */
  10604. case v_mode:
  10605. case v_swap_mode:
  10606. case dq_mode:
  10607. USED_REX (REX_W);
  10608. if (ins->rex & REX_W)
  10609. names = att_names64;
  10610. else if (bytemode != v_mode && bytemode != v_swap_mode)
  10611. names = att_names32;
  10612. else
  10613. {
  10614. if (sizeflag & DFLAG)
  10615. names = att_names32;
  10616. else
  10617. names = att_names16;
  10618. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  10619. }
  10620. break;
  10621. case movsxd_mode:
  10622. if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
  10623. names = att_names16;
  10624. else
  10625. names = att_names32;
  10626. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  10627. break;
  10628. case va_mode:
  10629. names = (ins->address_mode == mode_64bit
  10630. ? att_names64 : att_names32);
  10631. if (!(ins->prefixes & PREFIX_ADDR))
  10632. names = (ins->address_mode == mode_16bit
  10633. ? att_names16 : names);
  10634. else
  10635. {
  10636. /* Remove "addr16/addr32". */
  10637. ins->all_prefixes[ins->last_addr_prefix] = 0;
  10638. names = (ins->address_mode != mode_32bit
  10639. ? att_names32 : att_names16);
  10640. ins->used_prefixes |= PREFIX_ADDR;
  10641. }
  10642. break;
  10643. case mask_bd_mode:
  10644. case mask_mode:
  10645. if (reg > 0x7)
  10646. {
  10647. oappend (ins, "(bad)");
  10648. return;
  10649. }
  10650. names = att_names_mask;
  10651. break;
  10652. case 0:
  10653. return;
  10654. default:
  10655. oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
  10656. return;
  10657. }
  10658. oappend_maybe_intel (ins, names[reg]);
  10659. }
  10660. static void
  10661. OP_E_memory (instr_info *ins, int bytemode, int sizeflag)
  10662. {
  10663. bfd_vma disp = 0;
  10664. int add = (ins->rex & REX_B) ? 8 : 0;
  10665. int riprel = 0;
  10666. int shift;
  10667. if (ins->vex.evex)
  10668. {
  10669. switch (bytemode)
  10670. {
  10671. case dw_mode:
  10672. case w_mode:
  10673. case w_swap_mode:
  10674. shift = 1;
  10675. break;
  10676. case db_mode:
  10677. case b_mode:
  10678. shift = 0;
  10679. break;
  10680. case dq_mode:
  10681. if (ins->address_mode != mode_64bit)
  10682. {
  10683. case d_mode:
  10684. case d_swap_mode:
  10685. shift = 2;
  10686. break;
  10687. }
  10688. /* fall through */
  10689. case vex_vsib_d_w_dq_mode:
  10690. case vex_vsib_q_w_dq_mode:
  10691. case evex_x_gscat_mode:
  10692. shift = ins->vex.w ? 3 : 2;
  10693. break;
  10694. case xh_mode:
  10695. case evex_half_bcst_xmmqh_mode:
  10696. case evex_half_bcst_xmmqdh_mode:
  10697. if (ins->vex.b)
  10698. {
  10699. shift = ins->vex.w ? 2 : 1;
  10700. break;
  10701. }
  10702. /* Fall through. */
  10703. case x_mode:
  10704. case evex_half_bcst_xmmq_mode:
  10705. if (ins->vex.b)
  10706. {
  10707. shift = ins->vex.w ? 3 : 2;
  10708. break;
  10709. }
  10710. /* Fall through. */
  10711. case xmmqd_mode:
  10712. case xmmdw_mode:
  10713. case xmmq_mode:
  10714. case ymmq_mode:
  10715. case evex_x_nobcst_mode:
  10716. case x_swap_mode:
  10717. switch (ins->vex.length)
  10718. {
  10719. case 128:
  10720. shift = 4;
  10721. break;
  10722. case 256:
  10723. shift = 5;
  10724. break;
  10725. case 512:
  10726. shift = 6;
  10727. break;
  10728. default:
  10729. abort ();
  10730. }
  10731. /* Make necessary corrections to shift for modes that need it. */
  10732. if (bytemode == xmmq_mode
  10733. || bytemode == evex_half_bcst_xmmqh_mode
  10734. || bytemode == evex_half_bcst_xmmq_mode
  10735. || (bytemode == ymmq_mode && ins->vex.length == 128))
  10736. shift -= 1;
  10737. else if (bytemode == xmmqd_mode
  10738. || bytemode == evex_half_bcst_xmmqdh_mode)
  10739. shift -= 2;
  10740. else if (bytemode == xmmdw_mode)
  10741. shift -= 3;
  10742. break;
  10743. case ymm_mode:
  10744. shift = 5;
  10745. break;
  10746. case xmm_mode:
  10747. shift = 4;
  10748. break;
  10749. case q_mode:
  10750. case q_swap_mode:
  10751. shift = 3;
  10752. break;
  10753. case bw_unit_mode:
  10754. shift = ins->vex.w ? 1 : 0;
  10755. break;
  10756. default:
  10757. abort ();
  10758. }
  10759. }
  10760. else
  10761. shift = 0;
  10762. USED_REX (REX_B);
  10763. if (ins->intel_syntax)
  10764. intel_operand_size (ins, bytemode, sizeflag);
  10765. append_seg (ins);
  10766. if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
  10767. {
  10768. /* 32/64 bit address mode */
  10769. int havedisp;
  10770. int havebase;
  10771. int needindex;
  10772. int needaddr32;
  10773. int base, rbase;
  10774. int vindex = 0;
  10775. int scale = 0;
  10776. int addr32flag = !((sizeflag & AFLAG)
  10777. || bytemode == v_bnd_mode
  10778. || bytemode == v_bndmk_mode
  10779. || bytemode == bnd_mode
  10780. || bytemode == bnd_swap_mode);
  10781. bool check_gather = false;
  10782. const char *const *indexes = NULL;
  10783. havebase = 1;
  10784. base = ins->modrm.rm;
  10785. if (base == 4)
  10786. {
  10787. vindex = ins->sib.index;
  10788. USED_REX (REX_X);
  10789. if (ins->rex & REX_X)
  10790. vindex += 8;
  10791. switch (bytemode)
  10792. {
  10793. case vex_vsib_d_w_dq_mode:
  10794. case vex_vsib_q_w_dq_mode:
  10795. if (!ins->need_vex)
  10796. abort ();
  10797. if (ins->vex.evex)
  10798. {
  10799. if (!ins->vex.v)
  10800. vindex += 16;
  10801. check_gather = ins->obufp == ins->op_out[1];
  10802. }
  10803. switch (ins->vex.length)
  10804. {
  10805. case 128:
  10806. indexes = att_names_xmm;
  10807. break;
  10808. case 256:
  10809. if (!ins->vex.w
  10810. || bytemode == vex_vsib_q_w_dq_mode)
  10811. indexes = att_names_ymm;
  10812. else
  10813. indexes = att_names_xmm;
  10814. break;
  10815. case 512:
  10816. if (!ins->vex.w
  10817. || bytemode == vex_vsib_q_w_dq_mode)
  10818. indexes = att_names_zmm;
  10819. else
  10820. indexes = att_names_ymm;
  10821. break;
  10822. default:
  10823. abort ();
  10824. }
  10825. break;
  10826. default:
  10827. if (vindex != 4)
  10828. indexes = ins->address_mode == mode_64bit && !addr32flag
  10829. ? att_names64 : att_names32;
  10830. break;
  10831. }
  10832. scale = ins->sib.scale;
  10833. base = ins->sib.base;
  10834. ins->codep++;
  10835. }
  10836. else
  10837. {
  10838. /* Check for mandatory SIB. */
  10839. if (bytemode == vex_vsib_d_w_dq_mode
  10840. || bytemode == vex_vsib_q_w_dq_mode
  10841. || bytemode == vex_sibmem_mode)
  10842. {
  10843. oappend (ins, "(bad)");
  10844. return;
  10845. }
  10846. }
  10847. rbase = base + add;
  10848. switch (ins->modrm.mod)
  10849. {
  10850. case 0:
  10851. if (base == 5)
  10852. {
  10853. havebase = 0;
  10854. if (ins->address_mode == mode_64bit && !ins->has_sib)
  10855. riprel = 1;
  10856. disp = get32s (ins);
  10857. if (riprel && bytemode == v_bndmk_mode)
  10858. {
  10859. oappend (ins, "(bad)");
  10860. return;
  10861. }
  10862. }
  10863. break;
  10864. case 1:
  10865. FETCH_DATA (ins->info, ins->codep + 1);
  10866. disp = *ins->codep++;
  10867. if ((disp & 0x80) != 0)
  10868. disp -= 0x100;
  10869. if (ins->vex.evex && shift > 0)
  10870. disp <<= shift;
  10871. break;
  10872. case 2:
  10873. disp = get32s (ins);
  10874. break;
  10875. }
  10876. needindex = 0;
  10877. needaddr32 = 0;
  10878. if (ins->has_sib
  10879. && !havebase
  10880. && !indexes
  10881. && ins->address_mode != mode_16bit)
  10882. {
  10883. if (ins->address_mode == mode_64bit)
  10884. {
  10885. if (addr32flag)
  10886. {
  10887. /* Without base nor index registers, zero-extend the
  10888. lower 32-bit displacement to 64 bits. */
  10889. disp = (unsigned int) disp;
  10890. needindex = 1;
  10891. }
  10892. needaddr32 = 1;
  10893. }
  10894. else
  10895. {
  10896. /* In 32-bit mode, we need index register to tell [offset]
  10897. from [eiz*1 + offset]. */
  10898. needindex = 1;
  10899. }
  10900. }
  10901. havedisp = (havebase
  10902. || needindex
  10903. || (ins->has_sib && (indexes || scale != 0)));
  10904. if (!ins->intel_syntax)
  10905. if (ins->modrm.mod != 0 || base == 5)
  10906. {
  10907. if (havedisp || riprel)
  10908. print_displacement (ins, ins->scratchbuf, disp);
  10909. else
  10910. print_operand_value (ins, ins->scratchbuf, 1, disp);
  10911. oappend (ins, ins->scratchbuf);
  10912. if (riprel)
  10913. {
  10914. set_op (ins, disp, 1);
  10915. oappend (ins, !addr32flag ? "(%rip)" : "(%eip)");
  10916. }
  10917. }
  10918. if ((havebase || indexes || needindex || needaddr32 || riprel)
  10919. && (ins->address_mode != mode_64bit
  10920. || ((bytemode != v_bnd_mode)
  10921. && (bytemode != v_bndmk_mode)
  10922. && (bytemode != bnd_mode)
  10923. && (bytemode != bnd_swap_mode))))
  10924. ins->used_prefixes |= PREFIX_ADDR;
  10925. if (havedisp || (ins->intel_syntax && riprel))
  10926. {
  10927. *ins->obufp++ = ins->open_char;
  10928. if (ins->intel_syntax && riprel)
  10929. {
  10930. set_op (ins, disp, 1);
  10931. oappend (ins, !addr32flag ? "rip" : "eip");
  10932. }
  10933. *ins->obufp = '\0';
  10934. if (havebase)
  10935. oappend_maybe_intel (ins,
  10936. (ins->address_mode == mode_64bit && !addr32flag
  10937. ? att_names64 : att_names32)[rbase]);
  10938. if (ins->has_sib)
  10939. {
  10940. /* ESP/RSP won't allow index. If base isn't ESP/RSP,
  10941. print index to tell base + index from base. */
  10942. if (scale != 0
  10943. || needindex
  10944. || indexes
  10945. || (havebase && base != ESP_REG_NUM))
  10946. {
  10947. if (!ins->intel_syntax || havebase)
  10948. {
  10949. *ins->obufp++ = ins->separator_char;
  10950. *ins->obufp = '\0';
  10951. }
  10952. if (indexes)
  10953. {
  10954. if (ins->address_mode == mode_64bit || vindex < 16)
  10955. oappend_maybe_intel (ins, indexes[vindex]);
  10956. else
  10957. oappend (ins, "(bad)");
  10958. }
  10959. else
  10960. oappend_maybe_intel (ins,
  10961. ins->address_mode == mode_64bit
  10962. && !addr32flag ? att_index64
  10963. : att_index32);
  10964. *ins->obufp++ = ins->scale_char;
  10965. *ins->obufp = '\0';
  10966. sprintf (ins->scratchbuf, "%d", 1 << scale);
  10967. oappend (ins, ins->scratchbuf);
  10968. }
  10969. }
  10970. if (ins->intel_syntax
  10971. && (disp || ins->modrm.mod != 0 || base == 5))
  10972. {
  10973. if (!havedisp || (bfd_signed_vma) disp >= 0)
  10974. {
  10975. *ins->obufp++ = '+';
  10976. *ins->obufp = '\0';
  10977. }
  10978. else if (ins->modrm.mod != 1 && disp != -disp)
  10979. {
  10980. *ins->obufp++ = '-';
  10981. *ins->obufp = '\0';
  10982. disp = - (bfd_signed_vma) disp;
  10983. }
  10984. if (havedisp)
  10985. print_displacement (ins, ins->scratchbuf, disp);
  10986. else
  10987. print_operand_value (ins, ins->scratchbuf, 1, disp);
  10988. oappend (ins, ins->scratchbuf);
  10989. }
  10990. *ins->obufp++ = ins->close_char;
  10991. *ins->obufp = '\0';
  10992. if (check_gather)
  10993. {
  10994. /* Both XMM/YMM/ZMM registers must be distinct. */
  10995. int modrm_reg = ins->modrm.reg;
  10996. if (ins->rex & REX_R)
  10997. modrm_reg += 8;
  10998. if (!ins->vex.r)
  10999. modrm_reg += 16;
  11000. if (vindex == modrm_reg)
  11001. oappend (ins, "/(bad)");
  11002. }
  11003. }
  11004. else if (ins->intel_syntax)
  11005. {
  11006. if (ins->modrm.mod != 0 || base == 5)
  11007. {
  11008. if (!ins->active_seg_prefix)
  11009. {
  11010. oappend_maybe_intel (ins, att_names_seg[ds_reg - es_reg]);
  11011. oappend (ins, ":");
  11012. }
  11013. print_operand_value (ins, ins->scratchbuf, 1, disp);
  11014. oappend (ins, ins->scratchbuf);
  11015. }
  11016. }
  11017. }
  11018. else if (bytemode == v_bnd_mode
  11019. || bytemode == v_bndmk_mode
  11020. || bytemode == bnd_mode
  11021. || bytemode == bnd_swap_mode
  11022. || bytemode == vex_vsib_d_w_dq_mode
  11023. || bytemode == vex_vsib_q_w_dq_mode)
  11024. {
  11025. oappend (ins, "(bad)");
  11026. return;
  11027. }
  11028. else
  11029. {
  11030. /* 16 bit address mode */
  11031. ins->used_prefixes |= ins->prefixes & PREFIX_ADDR;
  11032. switch (ins->modrm.mod)
  11033. {
  11034. case 0:
  11035. if (ins->modrm.rm == 6)
  11036. {
  11037. disp = get16 (ins);
  11038. if ((disp & 0x8000) != 0)
  11039. disp -= 0x10000;
  11040. }
  11041. break;
  11042. case 1:
  11043. FETCH_DATA (ins->info, ins->codep + 1);
  11044. disp = *ins->codep++;
  11045. if ((disp & 0x80) != 0)
  11046. disp -= 0x100;
  11047. if (ins->vex.evex && shift > 0)
  11048. disp <<= shift;
  11049. break;
  11050. case 2:
  11051. disp = get16 (ins);
  11052. if ((disp & 0x8000) != 0)
  11053. disp -= 0x10000;
  11054. break;
  11055. }
  11056. if (!ins->intel_syntax)
  11057. if (ins->modrm.mod != 0 || ins->modrm.rm == 6)
  11058. {
  11059. print_displacement (ins, ins->scratchbuf, disp);
  11060. oappend (ins, ins->scratchbuf);
  11061. }
  11062. if (ins->modrm.mod != 0 || ins->modrm.rm != 6)
  11063. {
  11064. *ins->obufp++ = ins->open_char;
  11065. *ins->obufp = '\0';
  11066. oappend (ins,
  11067. (ins->intel_syntax ? intel_index16
  11068. : att_index16)[ins->modrm.rm]);
  11069. if (ins->intel_syntax
  11070. && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6))
  11071. {
  11072. if ((bfd_signed_vma) disp >= 0)
  11073. {
  11074. *ins->obufp++ = '+';
  11075. *ins->obufp = '\0';
  11076. }
  11077. else if (ins->modrm.mod != 1)
  11078. {
  11079. *ins->obufp++ = '-';
  11080. *ins->obufp = '\0';
  11081. disp = - (bfd_signed_vma) disp;
  11082. }
  11083. print_displacement (ins, ins->scratchbuf, disp);
  11084. oappend (ins, ins->scratchbuf);
  11085. }
  11086. *ins->obufp++ = ins->close_char;
  11087. *ins->obufp = '\0';
  11088. }
  11089. else if (ins->intel_syntax)
  11090. {
  11091. if (!ins->active_seg_prefix)
  11092. {
  11093. oappend_maybe_intel (ins, att_names_seg[ds_reg - es_reg]);
  11094. oappend (ins, ":");
  11095. }
  11096. print_operand_value (ins, ins->scratchbuf, 1, disp & 0xffff);
  11097. oappend (ins, ins->scratchbuf);
  11098. }
  11099. }
  11100. if (ins->vex.b)
  11101. {
  11102. ins->evex_used |= EVEX_b_used;
  11103. /* Broadcast can only ever be valid for memory sources. */
  11104. if (ins->obufp == ins->op_out[0])
  11105. ins->vex.no_broadcast = true;
  11106. if (!ins->vex.no_broadcast)
  11107. {
  11108. if (bytemode == xh_mode)
  11109. {
  11110. if (ins->vex.w)
  11111. oappend (ins, "{bad}");
  11112. else
  11113. {
  11114. switch (ins->vex.length)
  11115. {
  11116. case 128:
  11117. oappend (ins, "{1to8}");
  11118. break;
  11119. case 256:
  11120. oappend (ins, "{1to16}");
  11121. break;
  11122. case 512:
  11123. oappend (ins, "{1to32}");
  11124. break;
  11125. default:
  11126. abort ();
  11127. }
  11128. }
  11129. }
  11130. else if (bytemode == q_mode
  11131. || bytemode == ymmq_mode)
  11132. ins->vex.no_broadcast = true;
  11133. else if (ins->vex.w
  11134. || bytemode == evex_half_bcst_xmmqdh_mode
  11135. || bytemode == evex_half_bcst_xmmq_mode)
  11136. {
  11137. switch (ins->vex.length)
  11138. {
  11139. case 128:
  11140. oappend (ins, "{1to2}");
  11141. break;
  11142. case 256:
  11143. oappend (ins, "{1to4}");
  11144. break;
  11145. case 512:
  11146. oappend (ins, "{1to8}");
  11147. break;
  11148. default:
  11149. abort ();
  11150. }
  11151. }
  11152. else if (bytemode == x_mode
  11153. || bytemode == evex_half_bcst_xmmqh_mode)
  11154. {
  11155. switch (ins->vex.length)
  11156. {
  11157. case 128:
  11158. oappend (ins, "{1to4}");
  11159. break;
  11160. case 256:
  11161. oappend (ins, "{1to8}");
  11162. break;
  11163. case 512:
  11164. oappend (ins, "{1to16}");
  11165. break;
  11166. default:
  11167. abort ();
  11168. }
  11169. }
  11170. else
  11171. ins->vex.no_broadcast = true;
  11172. }
  11173. if (ins->vex.no_broadcast)
  11174. oappend (ins, "{bad}");
  11175. }
  11176. }
  11177. static void
  11178. OP_E (instr_info *ins, int bytemode, int sizeflag)
  11179. {
  11180. /* Skip mod/rm byte. */
  11181. MODRM_CHECK;
  11182. ins->codep++;
  11183. if (ins->modrm.mod == 3)
  11184. {
  11185. if ((sizeflag & SUFFIX_ALWAYS)
  11186. && (bytemode == b_swap_mode
  11187. || bytemode == bnd_swap_mode
  11188. || bytemode == v_swap_mode))
  11189. swap_operand (ins);
  11190. print_register (ins, ins->modrm.rm, REX_B, bytemode, sizeflag);
  11191. }
  11192. else
  11193. OP_E_memory (ins, bytemode, sizeflag);
  11194. }
  11195. static void
  11196. OP_G (instr_info *ins, int bytemode, int sizeflag)
  11197. {
  11198. if (ins->vex.evex && !ins->vex.r && ins->address_mode == mode_64bit)
  11199. {
  11200. oappend (ins, "(bad)");
  11201. return;
  11202. }
  11203. print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag);
  11204. }
  11205. #ifdef BFD64
  11206. static bfd_vma
  11207. get64 (instr_info *ins)
  11208. {
  11209. bfd_vma x;
  11210. unsigned int a;
  11211. unsigned int b;
  11212. FETCH_DATA (ins->info, ins->codep + 8);
  11213. a = *ins->codep++ & 0xff;
  11214. a |= (*ins->codep++ & 0xff) << 8;
  11215. a |= (*ins->codep++ & 0xff) << 16;
  11216. a |= (*ins->codep++ & 0xffu) << 24;
  11217. b = *ins->codep++ & 0xff;
  11218. b |= (*ins->codep++ & 0xff) << 8;
  11219. b |= (*ins->codep++ & 0xff) << 16;
  11220. b |= (*ins->codep++ & 0xffu) << 24;
  11221. x = a + ((bfd_vma) b << 32);
  11222. return x;
  11223. }
  11224. #else
  11225. static bfd_vma
  11226. get64 (instr_info *ins ATTRIBUTE_UNUSED)
  11227. {
  11228. abort ();
  11229. return 0;
  11230. }
  11231. #endif
  11232. static bfd_signed_vma
  11233. get32 (instr_info *ins)
  11234. {
  11235. bfd_signed_vma x = 0;
  11236. FETCH_DATA (ins->info, ins->codep + 4);
  11237. x = *ins->codep++ & (bfd_signed_vma) 0xff;
  11238. x |= (*ins->codep++ & (bfd_signed_vma) 0xff) << 8;
  11239. x |= (*ins->codep++ & (bfd_signed_vma) 0xff) << 16;
  11240. x |= (*ins->codep++ & (bfd_signed_vma) 0xff) << 24;
  11241. return x;
  11242. }
  11243. static bfd_signed_vma
  11244. get32s (instr_info *ins)
  11245. {
  11246. bfd_signed_vma x = 0;
  11247. FETCH_DATA (ins->info, ins->codep + 4);
  11248. x = *ins->codep++ & (bfd_signed_vma) 0xff;
  11249. x |= (*ins->codep++ & (bfd_signed_vma) 0xff) << 8;
  11250. x |= (*ins->codep++ & (bfd_signed_vma) 0xff) << 16;
  11251. x |= (*ins->codep++ & (bfd_signed_vma) 0xff) << 24;
  11252. x = (x ^ ((bfd_signed_vma) 1 << 31)) - ((bfd_signed_vma) 1 << 31);
  11253. return x;
  11254. }
  11255. static int
  11256. get16 (instr_info *ins)
  11257. {
  11258. int x = 0;
  11259. FETCH_DATA (ins->info, ins->codep + 2);
  11260. x = *ins->codep++ & 0xff;
  11261. x |= (*ins->codep++ & 0xff) << 8;
  11262. return x;
  11263. }
  11264. static void
  11265. set_op (instr_info *ins, bfd_vma op, int riprel)
  11266. {
  11267. ins->op_index[ins->op_ad] = ins->op_ad;
  11268. if (ins->address_mode == mode_64bit)
  11269. {
  11270. ins->op_address[ins->op_ad] = op;
  11271. ins->op_riprel[ins->op_ad] = riprel;
  11272. }
  11273. else
  11274. {
  11275. /* Mask to get a 32-bit address. */
  11276. ins->op_address[ins->op_ad] = op & 0xffffffff;
  11277. ins->op_riprel[ins->op_ad] = riprel & 0xffffffff;
  11278. }
  11279. }
  11280. static void
  11281. OP_REG (instr_info *ins, int code, int sizeflag)
  11282. {
  11283. const char *s;
  11284. int add;
  11285. switch (code)
  11286. {
  11287. case es_reg: case ss_reg: case cs_reg:
  11288. case ds_reg: case fs_reg: case gs_reg:
  11289. oappend_maybe_intel (ins, att_names_seg[code - es_reg]);
  11290. return;
  11291. }
  11292. USED_REX (REX_B);
  11293. if (ins->rex & REX_B)
  11294. add = 8;
  11295. else
  11296. add = 0;
  11297. switch (code)
  11298. {
  11299. case ax_reg: case cx_reg: case dx_reg: case bx_reg:
  11300. case sp_reg: case bp_reg: case si_reg: case di_reg:
  11301. s = att_names16[code - ax_reg + add];
  11302. break;
  11303. case ah_reg: case ch_reg: case dh_reg: case bh_reg:
  11304. USED_REX (0);
  11305. /* Fall through. */
  11306. case al_reg: case cl_reg: case dl_reg: case bl_reg:
  11307. if (ins->rex)
  11308. s = att_names8rex[code - al_reg + add];
  11309. else
  11310. s = att_names8[code - al_reg];
  11311. break;
  11312. case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
  11313. case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
  11314. if (ins->address_mode == mode_64bit
  11315. && ((sizeflag & DFLAG) || (ins->rex & REX_W)))
  11316. {
  11317. s = att_names64[code - rAX_reg + add];
  11318. break;
  11319. }
  11320. code += eAX_reg - rAX_reg;
  11321. /* Fall through. */
  11322. case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg:
  11323. case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
  11324. USED_REX (REX_W);
  11325. if (ins->rex & REX_W)
  11326. s = att_names64[code - eAX_reg + add];
  11327. else
  11328. {
  11329. if (sizeflag & DFLAG)
  11330. s = att_names32[code - eAX_reg + add];
  11331. else
  11332. s = att_names16[code - eAX_reg + add];
  11333. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  11334. }
  11335. break;
  11336. default:
  11337. oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
  11338. return;
  11339. }
  11340. oappend_maybe_intel (ins, s);
  11341. }
  11342. static void
  11343. OP_IMREG (instr_info *ins, int code, int sizeflag)
  11344. {
  11345. const char *s;
  11346. switch (code)
  11347. {
  11348. case indir_dx_reg:
  11349. if (!ins->intel_syntax)
  11350. {
  11351. oappend (ins, "(%dx)");
  11352. return;
  11353. }
  11354. s = att_names16[dx_reg - ax_reg];
  11355. break;
  11356. case al_reg: case cl_reg:
  11357. s = att_names8[code - al_reg];
  11358. break;
  11359. case eAX_reg:
  11360. USED_REX (REX_W);
  11361. if (ins->rex & REX_W)
  11362. {
  11363. s = *att_names64;
  11364. break;
  11365. }
  11366. /* Fall through. */
  11367. case z_mode_ax_reg:
  11368. if ((ins->rex & REX_W) || (sizeflag & DFLAG))
  11369. s = *att_names32;
  11370. else
  11371. s = *att_names16;
  11372. if (!(ins->rex & REX_W))
  11373. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  11374. break;
  11375. default:
  11376. oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
  11377. return;
  11378. }
  11379. oappend_maybe_intel (ins, s);
  11380. }
  11381. static void
  11382. OP_I (instr_info *ins, int bytemode, int sizeflag)
  11383. {
  11384. bfd_signed_vma op;
  11385. bfd_signed_vma mask = -1;
  11386. switch (bytemode)
  11387. {
  11388. case b_mode:
  11389. FETCH_DATA (ins->info, ins->codep + 1);
  11390. op = *ins->codep++;
  11391. mask = 0xff;
  11392. break;
  11393. case v_mode:
  11394. USED_REX (REX_W);
  11395. if (ins->rex & REX_W)
  11396. op = get32s (ins);
  11397. else
  11398. {
  11399. if (sizeflag & DFLAG)
  11400. {
  11401. op = get32 (ins);
  11402. mask = 0xffffffff;
  11403. }
  11404. else
  11405. {
  11406. op = get16 (ins);
  11407. mask = 0xfffff;
  11408. }
  11409. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  11410. }
  11411. break;
  11412. case d_mode:
  11413. mask = 0xffffffff;
  11414. op = get32 (ins);
  11415. break;
  11416. case w_mode:
  11417. mask = 0xfffff;
  11418. op = get16 (ins);
  11419. break;
  11420. case const_1_mode:
  11421. if (ins->intel_syntax)
  11422. oappend (ins, "1");
  11423. return;
  11424. default:
  11425. oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
  11426. return;
  11427. }
  11428. op &= mask;
  11429. ins->scratchbuf[0] = '$';
  11430. print_operand_value (ins, ins->scratchbuf + 1, 1, op);
  11431. oappend_maybe_intel (ins, ins->scratchbuf);
  11432. ins->scratchbuf[0] = '\0';
  11433. }
  11434. static void
  11435. OP_I64 (instr_info *ins, int bytemode, int sizeflag)
  11436. {
  11437. if (bytemode != v_mode || ins->address_mode != mode_64bit
  11438. || !(ins->rex & REX_W))
  11439. {
  11440. OP_I (ins, bytemode, sizeflag);
  11441. return;
  11442. }
  11443. USED_REX (REX_W);
  11444. ins->scratchbuf[0] = '$';
  11445. print_operand_value (ins, ins->scratchbuf + 1, 1, get64 (ins));
  11446. oappend_maybe_intel (ins, ins->scratchbuf);
  11447. ins->scratchbuf[0] = '\0';
  11448. }
  11449. static void
  11450. OP_sI (instr_info *ins, int bytemode, int sizeflag)
  11451. {
  11452. bfd_signed_vma op;
  11453. switch (bytemode)
  11454. {
  11455. case b_mode:
  11456. case b_T_mode:
  11457. FETCH_DATA (ins->info, ins->codep + 1);
  11458. op = *ins->codep++;
  11459. if ((op & 0x80) != 0)
  11460. op -= 0x100;
  11461. if (bytemode == b_T_mode)
  11462. {
  11463. if (ins->address_mode != mode_64bit
  11464. || !((sizeflag & DFLAG) || (ins->rex & REX_W)))
  11465. {
  11466. /* The operand-size prefix is overridden by a REX prefix. */
  11467. if ((sizeflag & DFLAG) || (ins->rex & REX_W))
  11468. op &= 0xffffffff;
  11469. else
  11470. op &= 0xffff;
  11471. }
  11472. }
  11473. else
  11474. {
  11475. if (!(ins->rex & REX_W))
  11476. {
  11477. if (sizeflag & DFLAG)
  11478. op &= 0xffffffff;
  11479. else
  11480. op &= 0xffff;
  11481. }
  11482. }
  11483. break;
  11484. case v_mode:
  11485. /* The operand-size prefix is overridden by a REX prefix. */
  11486. if ((sizeflag & DFLAG) || (ins->rex & REX_W))
  11487. op = get32s (ins);
  11488. else
  11489. op = get16 (ins);
  11490. break;
  11491. default:
  11492. oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
  11493. return;
  11494. }
  11495. ins->scratchbuf[0] = '$';
  11496. print_operand_value (ins, ins->scratchbuf + 1, 1, op);
  11497. oappend_maybe_intel (ins, ins->scratchbuf);
  11498. }
  11499. static void
  11500. OP_J (instr_info *ins, int bytemode, int sizeflag)
  11501. {
  11502. bfd_vma disp;
  11503. bfd_vma mask = -1;
  11504. bfd_vma segment = 0;
  11505. switch (bytemode)
  11506. {
  11507. case b_mode:
  11508. FETCH_DATA (ins->info, ins->codep + 1);
  11509. disp = *ins->codep++;
  11510. if ((disp & 0x80) != 0)
  11511. disp -= 0x100;
  11512. break;
  11513. case v_mode:
  11514. case dqw_mode:
  11515. if ((sizeflag & DFLAG)
  11516. || (ins->address_mode == mode_64bit
  11517. && ((ins->isa64 == intel64 && bytemode != dqw_mode)
  11518. || (ins->rex & REX_W))))
  11519. disp = get32s (ins);
  11520. else
  11521. {
  11522. disp = get16 (ins);
  11523. if ((disp & 0x8000) != 0)
  11524. disp -= 0x10000;
  11525. /* In 16bit mode, address is wrapped around at 64k within
  11526. the same segment. Otherwise, a data16 prefix on a jump
  11527. instruction means that the pc is masked to 16 bits after
  11528. the displacement is added! */
  11529. mask = 0xffff;
  11530. if ((ins->prefixes & PREFIX_DATA) == 0)
  11531. segment = ((ins->start_pc + (ins->codep - ins->start_codep))
  11532. & ~((bfd_vma) 0xffff));
  11533. }
  11534. if (ins->address_mode != mode_64bit
  11535. || (ins->isa64 != intel64 && !(ins->rex & REX_W)))
  11536. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  11537. break;
  11538. default:
  11539. oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
  11540. return;
  11541. }
  11542. disp = ((ins->start_pc + (ins->codep - ins->start_codep) + disp) & mask)
  11543. | segment;
  11544. set_op (ins, disp, 0);
  11545. print_operand_value (ins, ins->scratchbuf, 1, disp);
  11546. oappend (ins, ins->scratchbuf);
  11547. }
  11548. static void
  11549. OP_SEG (instr_info *ins, int bytemode, int sizeflag)
  11550. {
  11551. if (bytemode == w_mode)
  11552. oappend_maybe_intel (ins, att_names_seg[ins->modrm.reg]);
  11553. else
  11554. OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag);
  11555. }
  11556. static void
  11557. OP_DIR (instr_info *ins, int dummy ATTRIBUTE_UNUSED, int sizeflag)
  11558. {
  11559. int seg, offset;
  11560. if (sizeflag & DFLAG)
  11561. {
  11562. offset = get32 (ins);
  11563. seg = get16 (ins);
  11564. }
  11565. else
  11566. {
  11567. offset = get16 (ins);
  11568. seg = get16 (ins);
  11569. }
  11570. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  11571. if (ins->intel_syntax)
  11572. sprintf (ins->scratchbuf, "0x%x:0x%x", seg, offset);
  11573. else
  11574. sprintf (ins->scratchbuf, "$0x%x,$0x%x", seg, offset);
  11575. oappend (ins, ins->scratchbuf);
  11576. }
  11577. static void
  11578. OP_OFF (instr_info *ins, int bytemode, int sizeflag)
  11579. {
  11580. bfd_vma off;
  11581. if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
  11582. intel_operand_size (ins, bytemode, sizeflag);
  11583. append_seg (ins);
  11584. if ((sizeflag & AFLAG) || ins->address_mode == mode_64bit)
  11585. off = get32 (ins);
  11586. else
  11587. off = get16 (ins);
  11588. if (ins->intel_syntax)
  11589. {
  11590. if (!ins->active_seg_prefix)
  11591. {
  11592. oappend_maybe_intel (ins, att_names_seg[ds_reg - es_reg]);
  11593. oappend (ins, ":");
  11594. }
  11595. }
  11596. print_operand_value (ins, ins->scratchbuf, 1, off);
  11597. oappend (ins, ins->scratchbuf);
  11598. }
  11599. static void
  11600. OP_OFF64 (instr_info *ins, int bytemode, int sizeflag)
  11601. {
  11602. bfd_vma off;
  11603. if (ins->address_mode != mode_64bit
  11604. || (ins->prefixes & PREFIX_ADDR))
  11605. {
  11606. OP_OFF (ins, bytemode, sizeflag);
  11607. return;
  11608. }
  11609. if (ins->intel_syntax && (sizeflag & SUFFIX_ALWAYS))
  11610. intel_operand_size (ins, bytemode, sizeflag);
  11611. append_seg (ins);
  11612. off = get64 (ins);
  11613. if (ins->intel_syntax)
  11614. {
  11615. if (!ins->active_seg_prefix)
  11616. {
  11617. oappend_maybe_intel (ins, att_names_seg[ds_reg - es_reg]);
  11618. oappend (ins, ":");
  11619. }
  11620. }
  11621. print_operand_value (ins, ins->scratchbuf, 1, off);
  11622. oappend (ins, ins->scratchbuf);
  11623. }
  11624. static void
  11625. ptr_reg (instr_info *ins, int code, int sizeflag)
  11626. {
  11627. const char *s;
  11628. *ins->obufp++ = ins->open_char;
  11629. ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR);
  11630. if (ins->address_mode == mode_64bit)
  11631. {
  11632. if (!(sizeflag & AFLAG))
  11633. s = att_names32[code - eAX_reg];
  11634. else
  11635. s = att_names64[code - eAX_reg];
  11636. }
  11637. else if (sizeflag & AFLAG)
  11638. s = att_names32[code - eAX_reg];
  11639. else
  11640. s = att_names16[code - eAX_reg];
  11641. oappend_maybe_intel (ins, s);
  11642. *ins->obufp++ = ins->close_char;
  11643. *ins->obufp = 0;
  11644. }
  11645. static void
  11646. OP_ESreg (instr_info *ins, int code, int sizeflag)
  11647. {
  11648. if (ins->intel_syntax)
  11649. {
  11650. switch (ins->codep[-1])
  11651. {
  11652. case 0x6d: /* insw/insl */
  11653. intel_operand_size (ins, z_mode, sizeflag);
  11654. break;
  11655. case 0xa5: /* movsw/movsl/movsq */
  11656. case 0xa7: /* cmpsw/cmpsl/cmpsq */
  11657. case 0xab: /* stosw/stosl */
  11658. case 0xaf: /* scasw/scasl */
  11659. intel_operand_size (ins, v_mode, sizeflag);
  11660. break;
  11661. default:
  11662. intel_operand_size (ins, b_mode, sizeflag);
  11663. }
  11664. }
  11665. oappend_maybe_intel (ins, "%es:");
  11666. ptr_reg (ins, code, sizeflag);
  11667. }
  11668. static void
  11669. OP_DSreg (instr_info *ins, int code, int sizeflag)
  11670. {
  11671. if (ins->intel_syntax)
  11672. {
  11673. switch (ins->codep[-1])
  11674. {
  11675. case 0x6f: /* outsw/outsl */
  11676. intel_operand_size (ins, z_mode, sizeflag);
  11677. break;
  11678. case 0xa5: /* movsw/movsl/movsq */
  11679. case 0xa7: /* cmpsw/cmpsl/cmpsq */
  11680. case 0xad: /* lodsw/lodsl/lodsq */
  11681. intel_operand_size (ins, v_mode, sizeflag);
  11682. break;
  11683. default:
  11684. intel_operand_size (ins, b_mode, sizeflag);
  11685. }
  11686. }
  11687. /* Set ins->active_seg_prefix to PREFIX_DS if it is unset so that the
  11688. default segment register DS is printed. */
  11689. if (!ins->active_seg_prefix)
  11690. ins->active_seg_prefix = PREFIX_DS;
  11691. append_seg (ins);
  11692. ptr_reg (ins, code, sizeflag);
  11693. }
  11694. static void
  11695. OP_C (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
  11696. int sizeflag ATTRIBUTE_UNUSED)
  11697. {
  11698. int add;
  11699. if (ins->rex & REX_R)
  11700. {
  11701. USED_REX (REX_R);
  11702. add = 8;
  11703. }
  11704. else if (ins->address_mode != mode_64bit && (ins->prefixes & PREFIX_LOCK))
  11705. {
  11706. ins->all_prefixes[ins->last_lock_prefix] = 0;
  11707. ins->used_prefixes |= PREFIX_LOCK;
  11708. add = 8;
  11709. }
  11710. else
  11711. add = 0;
  11712. sprintf (ins->scratchbuf, "%%cr%d", ins->modrm.reg + add);
  11713. oappend_maybe_intel (ins, ins->scratchbuf);
  11714. }
  11715. static void
  11716. OP_D (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
  11717. int sizeflag ATTRIBUTE_UNUSED)
  11718. {
  11719. int add;
  11720. USED_REX (REX_R);
  11721. if (ins->rex & REX_R)
  11722. add = 8;
  11723. else
  11724. add = 0;
  11725. if (ins->intel_syntax)
  11726. sprintf (ins->scratchbuf, "dr%d", ins->modrm.reg + add);
  11727. else
  11728. sprintf (ins->scratchbuf, "%%db%d", ins->modrm.reg + add);
  11729. oappend (ins, ins->scratchbuf);
  11730. }
  11731. static void
  11732. OP_T (instr_info *ins, int dummy ATTRIBUTE_UNUSED,
  11733. int sizeflag ATTRIBUTE_UNUSED)
  11734. {
  11735. sprintf (ins->scratchbuf, "%%tr%d", ins->modrm.reg);
  11736. oappend_maybe_intel (ins, ins->scratchbuf);
  11737. }
  11738. static void
  11739. OP_MMX (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  11740. int sizeflag ATTRIBUTE_UNUSED)
  11741. {
  11742. int reg = ins->modrm.reg;
  11743. const char *const *names;
  11744. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  11745. if (ins->prefixes & PREFIX_DATA)
  11746. {
  11747. names = att_names_xmm;
  11748. USED_REX (REX_R);
  11749. if (ins->rex & REX_R)
  11750. reg += 8;
  11751. }
  11752. else
  11753. names = att_names_mm;
  11754. oappend_maybe_intel (ins, names[reg]);
  11755. }
  11756. static void
  11757. print_vector_reg (instr_info *ins, unsigned int reg, int bytemode)
  11758. {
  11759. const char *const *names;
  11760. if (bytemode == xmmq_mode
  11761. || bytemode == evex_half_bcst_xmmqh_mode
  11762. || bytemode == evex_half_bcst_xmmq_mode)
  11763. {
  11764. switch (ins->vex.length)
  11765. {
  11766. case 128:
  11767. case 256:
  11768. names = att_names_xmm;
  11769. break;
  11770. case 512:
  11771. names = att_names_ymm;
  11772. break;
  11773. default:
  11774. abort ();
  11775. }
  11776. }
  11777. else if (bytemode == ymm_mode)
  11778. names = att_names_ymm;
  11779. else if (bytemode == tmm_mode)
  11780. {
  11781. if (reg >= 8)
  11782. {
  11783. oappend (ins, "(bad)");
  11784. return;
  11785. }
  11786. names = att_names_tmm;
  11787. }
  11788. else if (ins->need_vex
  11789. && bytemode != xmm_mode
  11790. && bytemode != scalar_mode
  11791. && bytemode != xmmdw_mode
  11792. && bytemode != xmmqd_mode
  11793. && bytemode != evex_half_bcst_xmmqdh_mode
  11794. && bytemode != w_swap_mode
  11795. && bytemode != b_mode
  11796. && bytemode != w_mode
  11797. && bytemode != d_mode
  11798. && bytemode != q_mode)
  11799. {
  11800. switch (ins->vex.length)
  11801. {
  11802. case 128:
  11803. names = att_names_xmm;
  11804. break;
  11805. case 256:
  11806. if (ins->vex.w
  11807. || bytemode != vex_vsib_q_w_dq_mode)
  11808. names = att_names_ymm;
  11809. else
  11810. names = att_names_xmm;
  11811. break;
  11812. case 512:
  11813. if (ins->vex.w
  11814. || bytemode != vex_vsib_q_w_dq_mode)
  11815. names = att_names_zmm;
  11816. else
  11817. names = att_names_ymm;
  11818. break;
  11819. default:
  11820. abort ();
  11821. }
  11822. }
  11823. else
  11824. names = att_names_xmm;
  11825. oappend_maybe_intel (ins, names[reg]);
  11826. }
  11827. static void
  11828. OP_XMM (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
  11829. {
  11830. unsigned int reg = ins->modrm.reg;
  11831. USED_REX (REX_R);
  11832. if (ins->rex & REX_R)
  11833. reg += 8;
  11834. if (ins->vex.evex)
  11835. {
  11836. if (!ins->vex.r)
  11837. reg += 16;
  11838. }
  11839. if (bytemode == tmm_mode)
  11840. ins->modrm.reg = reg;
  11841. else if (bytemode == scalar_mode)
  11842. ins->vex.no_broadcast = true;
  11843. print_vector_reg (ins, reg, bytemode);
  11844. }
  11845. static void
  11846. OP_EM (instr_info *ins, int bytemode, int sizeflag)
  11847. {
  11848. int reg;
  11849. const char *const *names;
  11850. if (ins->modrm.mod != 3)
  11851. {
  11852. if (ins->intel_syntax
  11853. && (bytemode == v_mode || bytemode == v_swap_mode))
  11854. {
  11855. bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
  11856. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  11857. }
  11858. OP_E (ins, bytemode, sizeflag);
  11859. return;
  11860. }
  11861. if ((sizeflag & SUFFIX_ALWAYS) && bytemode == v_swap_mode)
  11862. swap_operand (ins);
  11863. /* Skip mod/rm byte. */
  11864. MODRM_CHECK;
  11865. ins->codep++;
  11866. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  11867. reg = ins->modrm.rm;
  11868. if (ins->prefixes & PREFIX_DATA)
  11869. {
  11870. names = att_names_xmm;
  11871. USED_REX (REX_B);
  11872. if (ins->rex & REX_B)
  11873. reg += 8;
  11874. }
  11875. else
  11876. names = att_names_mm;
  11877. oappend_maybe_intel (ins, names[reg]);
  11878. }
  11879. /* cvt* are the only instructions in sse2 which have
  11880. both SSE and MMX operands and also have 0x66 prefix
  11881. in their opcode. 0x66 was originally used to differentiate
  11882. between SSE and MMX instruction(operands). So we have to handle the
  11883. cvt* separately using OP_EMC and OP_MXC */
  11884. static void
  11885. OP_EMC (instr_info *ins, int bytemode, int sizeflag)
  11886. {
  11887. if (ins->modrm.mod != 3)
  11888. {
  11889. if (ins->intel_syntax && bytemode == v_mode)
  11890. {
  11891. bytemode = (ins->prefixes & PREFIX_DATA) ? x_mode : q_mode;
  11892. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  11893. }
  11894. OP_E (ins, bytemode, sizeflag);
  11895. return;
  11896. }
  11897. /* Skip mod/rm byte. */
  11898. MODRM_CHECK;
  11899. ins->codep++;
  11900. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  11901. oappend_maybe_intel (ins, att_names_mm[ins->modrm.rm]);
  11902. }
  11903. static void
  11904. OP_MXC (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  11905. int sizeflag ATTRIBUTE_UNUSED)
  11906. {
  11907. ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
  11908. oappend_maybe_intel (ins, att_names_mm[ins->modrm.reg]);
  11909. }
  11910. static void
  11911. OP_EX (instr_info *ins, int bytemode, int sizeflag)
  11912. {
  11913. int reg;
  11914. /* Skip mod/rm byte. */
  11915. MODRM_CHECK;
  11916. ins->codep++;
  11917. if (bytemode == dq_mode)
  11918. bytemode = ins->vex.w ? q_mode : d_mode;
  11919. if (ins->modrm.mod != 3)
  11920. {
  11921. OP_E_memory (ins, bytemode, sizeflag);
  11922. return;
  11923. }
  11924. reg = ins->modrm.rm;
  11925. USED_REX (REX_B);
  11926. if (ins->rex & REX_B)
  11927. reg += 8;
  11928. if (ins->vex.evex)
  11929. {
  11930. USED_REX (REX_X);
  11931. if ((ins->rex & REX_X))
  11932. reg += 16;
  11933. }
  11934. if ((sizeflag & SUFFIX_ALWAYS)
  11935. && (bytemode == x_swap_mode
  11936. || bytemode == w_swap_mode
  11937. || bytemode == d_swap_mode
  11938. || bytemode == q_swap_mode))
  11939. swap_operand (ins);
  11940. if (bytemode == tmm_mode)
  11941. ins->modrm.rm = reg;
  11942. print_vector_reg (ins, reg, bytemode);
  11943. }
  11944. static void
  11945. OP_MS (instr_info *ins, int bytemode, int sizeflag)
  11946. {
  11947. if (ins->modrm.mod == 3)
  11948. OP_EM (ins, bytemode, sizeflag);
  11949. else
  11950. BadOp (ins);
  11951. }
  11952. static void
  11953. OP_XS (instr_info *ins, int bytemode, int sizeflag)
  11954. {
  11955. if (ins->modrm.mod == 3)
  11956. OP_EX (ins, bytemode, sizeflag);
  11957. else
  11958. BadOp (ins);
  11959. }
  11960. static void
  11961. OP_M (instr_info *ins, int bytemode, int sizeflag)
  11962. {
  11963. if (ins->modrm.mod == 3)
  11964. /* bad bound,lea,lds,les,lfs,lgs,lss,cmpxchg8b,vmptrst modrm */
  11965. BadOp (ins);
  11966. else
  11967. OP_E (ins, bytemode, sizeflag);
  11968. }
  11969. static void
  11970. OP_0f07 (instr_info *ins, int bytemode, int sizeflag)
  11971. {
  11972. if (ins->modrm.mod != 3 || ins->modrm.rm != 0)
  11973. BadOp (ins);
  11974. else
  11975. OP_E (ins, bytemode, sizeflag);
  11976. }
  11977. /* NOP is an alias of "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in
  11978. 32bit mode and "xchg %rax,%rax" in 64bit mode. */
  11979. static void
  11980. NOP_Fixup1 (instr_info *ins, int bytemode, int sizeflag)
  11981. {
  11982. if ((ins->prefixes & PREFIX_DATA) != 0
  11983. || (ins->rex != 0
  11984. && ins->rex != 0x48
  11985. && ins->address_mode == mode_64bit))
  11986. OP_REG (ins, bytemode, sizeflag);
  11987. else
  11988. strcpy (ins->obuf, "nop");
  11989. }
  11990. static void
  11991. NOP_Fixup2 (instr_info *ins, int bytemode, int sizeflag)
  11992. {
  11993. if ((ins->prefixes & PREFIX_DATA) != 0
  11994. || (ins->rex != 0
  11995. && ins->rex != 0x48
  11996. && ins->address_mode == mode_64bit))
  11997. OP_IMREG (ins, bytemode, sizeflag);
  11998. }
  11999. static const char *const Suffix3DNow[] = {
  12000. /* 00 */ NULL, NULL, NULL, NULL,
  12001. /* 04 */ NULL, NULL, NULL, NULL,
  12002. /* 08 */ NULL, NULL, NULL, NULL,
  12003. /* 0C */ "pi2fw", "pi2fd", NULL, NULL,
  12004. /* 10 */ NULL, NULL, NULL, NULL,
  12005. /* 14 */ NULL, NULL, NULL, NULL,
  12006. /* 18 */ NULL, NULL, NULL, NULL,
  12007. /* 1C */ "pf2iw", "pf2id", NULL, NULL,
  12008. /* 20 */ NULL, NULL, NULL, NULL,
  12009. /* 24 */ NULL, NULL, NULL, NULL,
  12010. /* 28 */ NULL, NULL, NULL, NULL,
  12011. /* 2C */ NULL, NULL, NULL, NULL,
  12012. /* 30 */ NULL, NULL, NULL, NULL,
  12013. /* 34 */ NULL, NULL, NULL, NULL,
  12014. /* 38 */ NULL, NULL, NULL, NULL,
  12015. /* 3C */ NULL, NULL, NULL, NULL,
  12016. /* 40 */ NULL, NULL, NULL, NULL,
  12017. /* 44 */ NULL, NULL, NULL, NULL,
  12018. /* 48 */ NULL, NULL, NULL, NULL,
  12019. /* 4C */ NULL, NULL, NULL, NULL,
  12020. /* 50 */ NULL, NULL, NULL, NULL,
  12021. /* 54 */ NULL, NULL, NULL, NULL,
  12022. /* 58 */ NULL, NULL, NULL, NULL,
  12023. /* 5C */ NULL, NULL, NULL, NULL,
  12024. /* 60 */ NULL, NULL, NULL, NULL,
  12025. /* 64 */ NULL, NULL, NULL, NULL,
  12026. /* 68 */ NULL, NULL, NULL, NULL,
  12027. /* 6C */ NULL, NULL, NULL, NULL,
  12028. /* 70 */ NULL, NULL, NULL, NULL,
  12029. /* 74 */ NULL, NULL, NULL, NULL,
  12030. /* 78 */ NULL, NULL, NULL, NULL,
  12031. /* 7C */ NULL, NULL, NULL, NULL,
  12032. /* 80 */ NULL, NULL, NULL, NULL,
  12033. /* 84 */ NULL, NULL, NULL, NULL,
  12034. /* 88 */ NULL, NULL, "pfnacc", NULL,
  12035. /* 8C */ NULL, NULL, "pfpnacc", NULL,
  12036. /* 90 */ "pfcmpge", NULL, NULL, NULL,
  12037. /* 94 */ "pfmin", NULL, "pfrcp", "pfrsqrt",
  12038. /* 98 */ NULL, NULL, "pfsub", NULL,
  12039. /* 9C */ NULL, NULL, "pfadd", NULL,
  12040. /* A0 */ "pfcmpgt", NULL, NULL, NULL,
  12041. /* A4 */ "pfmax", NULL, "pfrcpit1", "pfrsqit1",
  12042. /* A8 */ NULL, NULL, "pfsubr", NULL,
  12043. /* AC */ NULL, NULL, "pfacc", NULL,
  12044. /* B0 */ "pfcmpeq", NULL, NULL, NULL,
  12045. /* B4 */ "pfmul", NULL, "pfrcpit2", "pmulhrw",
  12046. /* B8 */ NULL, NULL, NULL, "pswapd",
  12047. /* BC */ NULL, NULL, NULL, "pavgusb",
  12048. /* C0 */ NULL, NULL, NULL, NULL,
  12049. /* C4 */ NULL, NULL, NULL, NULL,
  12050. /* C8 */ NULL, NULL, NULL, NULL,
  12051. /* CC */ NULL, NULL, NULL, NULL,
  12052. /* D0 */ NULL, NULL, NULL, NULL,
  12053. /* D4 */ NULL, NULL, NULL, NULL,
  12054. /* D8 */ NULL, NULL, NULL, NULL,
  12055. /* DC */ NULL, NULL, NULL, NULL,
  12056. /* E0 */ NULL, NULL, NULL, NULL,
  12057. /* E4 */ NULL, NULL, NULL, NULL,
  12058. /* E8 */ NULL, NULL, NULL, NULL,
  12059. /* EC */ NULL, NULL, NULL, NULL,
  12060. /* F0 */ NULL, NULL, NULL, NULL,
  12061. /* F4 */ NULL, NULL, NULL, NULL,
  12062. /* F8 */ NULL, NULL, NULL, NULL,
  12063. /* FC */ NULL, NULL, NULL, NULL,
  12064. };
  12065. static void
  12066. OP_3DNowSuffix (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  12067. int sizeflag ATTRIBUTE_UNUSED)
  12068. {
  12069. const char *mnemonic;
  12070. FETCH_DATA (ins->info, ins->codep + 1);
  12071. /* AMD 3DNow! instructions are specified by an opcode suffix in the
  12072. place where an 8-bit immediate would normally go. ie. the last
  12073. byte of the instruction. */
  12074. ins->obufp = ins->mnemonicendp;
  12075. mnemonic = Suffix3DNow[*ins->codep++ & 0xff];
  12076. if (mnemonic)
  12077. oappend (ins, mnemonic);
  12078. else
  12079. {
  12080. /* Since a variable sized ins->modrm/ins->sib chunk is between the start
  12081. of the opcode (0x0f0f) and the opcode suffix, we need to do
  12082. all the ins->modrm processing first, and don't know until now that
  12083. we have a bad opcode. This necessitates some cleaning up. */
  12084. ins->op_out[0][0] = '\0';
  12085. ins->op_out[1][0] = '\0';
  12086. BadOp (ins);
  12087. }
  12088. ins->mnemonicendp = ins->obufp;
  12089. }
  12090. static const struct op simd_cmp_op[] =
  12091. {
  12092. { STRING_COMMA_LEN ("eq") },
  12093. { STRING_COMMA_LEN ("lt") },
  12094. { STRING_COMMA_LEN ("le") },
  12095. { STRING_COMMA_LEN ("unord") },
  12096. { STRING_COMMA_LEN ("neq") },
  12097. { STRING_COMMA_LEN ("nlt") },
  12098. { STRING_COMMA_LEN ("nle") },
  12099. { STRING_COMMA_LEN ("ord") }
  12100. };
  12101. static const struct op vex_cmp_op[] =
  12102. {
  12103. { STRING_COMMA_LEN ("eq_uq") },
  12104. { STRING_COMMA_LEN ("nge") },
  12105. { STRING_COMMA_LEN ("ngt") },
  12106. { STRING_COMMA_LEN ("false") },
  12107. { STRING_COMMA_LEN ("neq_oq") },
  12108. { STRING_COMMA_LEN ("ge") },
  12109. { STRING_COMMA_LEN ("gt") },
  12110. { STRING_COMMA_LEN ("true") },
  12111. { STRING_COMMA_LEN ("eq_os") },
  12112. { STRING_COMMA_LEN ("lt_oq") },
  12113. { STRING_COMMA_LEN ("le_oq") },
  12114. { STRING_COMMA_LEN ("unord_s") },
  12115. { STRING_COMMA_LEN ("neq_us") },
  12116. { STRING_COMMA_LEN ("nlt_uq") },
  12117. { STRING_COMMA_LEN ("nle_uq") },
  12118. { STRING_COMMA_LEN ("ord_s") },
  12119. { STRING_COMMA_LEN ("eq_us") },
  12120. { STRING_COMMA_LEN ("nge_uq") },
  12121. { STRING_COMMA_LEN ("ngt_uq") },
  12122. { STRING_COMMA_LEN ("false_os") },
  12123. { STRING_COMMA_LEN ("neq_os") },
  12124. { STRING_COMMA_LEN ("ge_oq") },
  12125. { STRING_COMMA_LEN ("gt_oq") },
  12126. { STRING_COMMA_LEN ("true_us") },
  12127. };
  12128. static void
  12129. CMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  12130. int sizeflag ATTRIBUTE_UNUSED)
  12131. {
  12132. unsigned int cmp_type;
  12133. FETCH_DATA (ins->info, ins->codep + 1);
  12134. cmp_type = *ins->codep++ & 0xff;
  12135. if (cmp_type < ARRAY_SIZE (simd_cmp_op))
  12136. {
  12137. char suffix[3];
  12138. char *p = ins->mnemonicendp - 2;
  12139. suffix[0] = p[0];
  12140. suffix[1] = p[1];
  12141. suffix[2] = '\0';
  12142. sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
  12143. ins->mnemonicendp += simd_cmp_op[cmp_type].len;
  12144. }
  12145. else if (ins->need_vex
  12146. && cmp_type < ARRAY_SIZE (simd_cmp_op) + ARRAY_SIZE (vex_cmp_op))
  12147. {
  12148. char suffix[3];
  12149. char *p = ins->mnemonicendp - 2;
  12150. suffix[0] = p[0];
  12151. suffix[1] = p[1];
  12152. suffix[2] = '\0';
  12153. cmp_type -= ARRAY_SIZE (simd_cmp_op);
  12154. sprintf (p, "%s%s", vex_cmp_op[cmp_type].name, suffix);
  12155. ins->mnemonicendp += vex_cmp_op[cmp_type].len;
  12156. }
  12157. else
  12158. {
  12159. /* We have a reserved extension byte. Output it directly. */
  12160. ins->scratchbuf[0] = '$';
  12161. print_operand_value (ins, ins->scratchbuf + 1, 1, cmp_type);
  12162. oappend_maybe_intel (ins, ins->scratchbuf);
  12163. ins->scratchbuf[0] = '\0';
  12164. }
  12165. }
  12166. static void
  12167. OP_Mwait (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
  12168. {
  12169. /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx */
  12170. if (!ins->intel_syntax)
  12171. {
  12172. strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax);
  12173. strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
  12174. if (bytemode == eBX_reg)
  12175. strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
  12176. ins->two_source_ops = true;
  12177. }
  12178. /* Skip mod/rm byte. */
  12179. MODRM_CHECK;
  12180. ins->codep++;
  12181. }
  12182. static void
  12183. OP_Monitor (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  12184. int sizeflag ATTRIBUTE_UNUSED)
  12185. {
  12186. /* monitor %{e,r,}ax,%ecx,%edx" */
  12187. if (!ins->intel_syntax)
  12188. {
  12189. const char *const *names = (ins->address_mode == mode_64bit
  12190. ? att_names64 : att_names32);
  12191. if (ins->prefixes & PREFIX_ADDR)
  12192. {
  12193. /* Remove "addr16/addr32". */
  12194. ins->all_prefixes[ins->last_addr_prefix] = 0;
  12195. names = (ins->address_mode != mode_32bit
  12196. ? att_names32 : att_names16);
  12197. ins->used_prefixes |= PREFIX_ADDR;
  12198. }
  12199. else if (ins->address_mode == mode_16bit)
  12200. names = att_names16;
  12201. strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
  12202. strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
  12203. strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
  12204. ins->two_source_ops = true;
  12205. }
  12206. /* Skip mod/rm byte. */
  12207. MODRM_CHECK;
  12208. ins->codep++;
  12209. }
  12210. static void
  12211. BadOp (instr_info *ins)
  12212. {
  12213. /* Throw away prefixes and 1st. opcode byte. */
  12214. ins->codep = ins->insn_codep + 1;
  12215. oappend (ins, "(bad)");
  12216. }
  12217. static void
  12218. REP_Fixup (instr_info *ins, int bytemode, int sizeflag)
  12219. {
  12220. /* The 0xf3 prefix should be displayed as "rep" for ins, outs, movs,
  12221. lods and stos. */
  12222. if (ins->prefixes & PREFIX_REPZ)
  12223. ins->all_prefixes[ins->last_repz_prefix] = REP_PREFIX;
  12224. switch (bytemode)
  12225. {
  12226. case al_reg:
  12227. case eAX_reg:
  12228. case indir_dx_reg:
  12229. OP_IMREG (ins, bytemode, sizeflag);
  12230. break;
  12231. case eDI_reg:
  12232. OP_ESreg (ins, bytemode, sizeflag);
  12233. break;
  12234. case eSI_reg:
  12235. OP_DSreg (ins, bytemode, sizeflag);
  12236. break;
  12237. default:
  12238. abort ();
  12239. break;
  12240. }
  12241. }
  12242. static void
  12243. SEP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  12244. int sizeflag ATTRIBUTE_UNUSED)
  12245. {
  12246. if (ins->isa64 != amd64)
  12247. return;
  12248. ins->obufp = ins->obuf;
  12249. BadOp (ins);
  12250. ins->mnemonicendp = ins->obufp;
  12251. ++ins->codep;
  12252. }
  12253. /* For BND-prefixed instructions 0xF2 prefix should be displayed as
  12254. "bnd". */
  12255. static void
  12256. BND_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  12257. int sizeflag ATTRIBUTE_UNUSED)
  12258. {
  12259. if (ins->prefixes & PREFIX_REPNZ)
  12260. ins->all_prefixes[ins->last_repnz_prefix] = BND_PREFIX;
  12261. }
  12262. /* For NOTRACK-prefixed instructions, 0x3E prefix should be displayed as
  12263. "notrack". */
  12264. static void
  12265. NOTRACK_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  12266. int sizeflag ATTRIBUTE_UNUSED)
  12267. {
  12268. /* Since active_seg_prefix is not set in 64-bit mode, check whether
  12269. we've seen a PREFIX_DS. */
  12270. if ((ins->prefixes & PREFIX_DS) != 0
  12271. && (ins->address_mode != mode_64bit || ins->last_data_prefix < 0))
  12272. {
  12273. /* NOTRACK prefix is only valid on indirect branch instructions.
  12274. NB: DATA prefix is unsupported for Intel64. */
  12275. ins->active_seg_prefix = 0;
  12276. ins->all_prefixes[ins->last_seg_prefix] = NOTRACK_PREFIX;
  12277. }
  12278. }
  12279. /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
  12280. "xacquire"/"xrelease" for memory operand if there is a LOCK prefix.
  12281. */
  12282. static void
  12283. HLE_Fixup1 (instr_info *ins, int bytemode, int sizeflag)
  12284. {
  12285. if (ins->modrm.mod != 3
  12286. && (ins->prefixes & PREFIX_LOCK) != 0)
  12287. {
  12288. if (ins->prefixes & PREFIX_REPZ)
  12289. ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
  12290. if (ins->prefixes & PREFIX_REPNZ)
  12291. ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
  12292. }
  12293. OP_E (ins, bytemode, sizeflag);
  12294. }
  12295. /* Similar to OP_E. But the 0xf2/0xf3 ins->prefixes should be displayed as
  12296. "xacquire"/"xrelease" for memory operand. No check for LOCK prefix.
  12297. */
  12298. static void
  12299. HLE_Fixup2 (instr_info *ins, int bytemode, int sizeflag)
  12300. {
  12301. if (ins->modrm.mod != 3)
  12302. {
  12303. if (ins->prefixes & PREFIX_REPZ)
  12304. ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
  12305. if (ins->prefixes & PREFIX_REPNZ)
  12306. ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
  12307. }
  12308. OP_E (ins, bytemode, sizeflag);
  12309. }
  12310. /* Similar to OP_E. But the 0xf3 prefixes should be displayed as
  12311. "xrelease" for memory operand. No check for LOCK prefix. */
  12312. static void
  12313. HLE_Fixup3 (instr_info *ins, int bytemode, int sizeflag)
  12314. {
  12315. if (ins->modrm.mod != 3
  12316. && ins->last_repz_prefix > ins->last_repnz_prefix
  12317. && (ins->prefixes & PREFIX_REPZ) != 0)
  12318. ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
  12319. OP_E (ins, bytemode, sizeflag);
  12320. }
  12321. static void
  12322. CMPXCHG8B_Fixup (instr_info *ins, int bytemode, int sizeflag)
  12323. {
  12324. USED_REX (REX_W);
  12325. if (ins->rex & REX_W)
  12326. {
  12327. /* Change cmpxchg8b to cmpxchg16b. */
  12328. char *p = ins->mnemonicendp - 2;
  12329. ins->mnemonicendp = stpcpy (p, "16b");
  12330. bytemode = o_mode;
  12331. }
  12332. else if ((ins->prefixes & PREFIX_LOCK) != 0)
  12333. {
  12334. if (ins->prefixes & PREFIX_REPZ)
  12335. ins->all_prefixes[ins->last_repz_prefix] = XRELEASE_PREFIX;
  12336. if (ins->prefixes & PREFIX_REPNZ)
  12337. ins->all_prefixes[ins->last_repnz_prefix] = XACQUIRE_PREFIX;
  12338. }
  12339. OP_M (ins, bytemode, sizeflag);
  12340. }
  12341. static void
  12342. XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
  12343. {
  12344. const char *const *names = att_names_xmm;
  12345. if (ins->need_vex)
  12346. {
  12347. switch (ins->vex.length)
  12348. {
  12349. case 128:
  12350. break;
  12351. case 256:
  12352. names = att_names_ymm;
  12353. break;
  12354. default:
  12355. abort ();
  12356. }
  12357. }
  12358. oappend_maybe_intel (ins, names[reg]);
  12359. }
  12360. static void
  12361. FXSAVE_Fixup (instr_info *ins, int bytemode, int sizeflag)
  12362. {
  12363. /* Add proper suffix to "fxsave" and "fxrstor". */
  12364. USED_REX (REX_W);
  12365. if (ins->rex & REX_W)
  12366. {
  12367. char *p = ins->mnemonicendp;
  12368. *p++ = '6';
  12369. *p++ = '4';
  12370. *p = '\0';
  12371. ins->mnemonicendp = p;
  12372. }
  12373. OP_M (ins, bytemode, sizeflag);
  12374. }
  12375. /* Display the destination register operand for instructions with
  12376. VEX. */
  12377. static void
  12378. OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
  12379. {
  12380. int reg, modrm_reg, sib_index = -1;
  12381. const char *const *names;
  12382. if (!ins->need_vex)
  12383. abort ();
  12384. reg = ins->vex.register_specifier;
  12385. ins->vex.register_specifier = 0;
  12386. if (ins->address_mode != mode_64bit)
  12387. {
  12388. if (ins->vex.evex && !ins->vex.v)
  12389. {
  12390. oappend (ins, "(bad)");
  12391. return;
  12392. }
  12393. reg &= 7;
  12394. }
  12395. else if (ins->vex.evex && !ins->vex.v)
  12396. reg += 16;
  12397. switch (bytemode)
  12398. {
  12399. case scalar_mode:
  12400. oappend_maybe_intel (ins, att_names_xmm[reg]);
  12401. return;
  12402. case vex_vsib_d_w_dq_mode:
  12403. case vex_vsib_q_w_dq_mode:
  12404. /* This must be the 3rd operand. */
  12405. if (ins->obufp != ins->op_out[2])
  12406. abort ();
  12407. if (ins->vex.length == 128
  12408. || (bytemode != vex_vsib_d_w_dq_mode
  12409. && !ins->vex.w))
  12410. oappend_maybe_intel (ins, att_names_xmm[reg]);
  12411. else
  12412. oappend_maybe_intel (ins, att_names_ymm[reg]);
  12413. /* All 3 XMM/YMM registers must be distinct. */
  12414. modrm_reg = ins->modrm.reg;
  12415. if (ins->rex & REX_R)
  12416. modrm_reg += 8;
  12417. if (ins->has_sib && ins->modrm.rm == 4)
  12418. {
  12419. sib_index = ins->sib.index;
  12420. if (ins->rex & REX_X)
  12421. sib_index += 8;
  12422. }
  12423. if (reg == modrm_reg || reg == sib_index)
  12424. strcpy (ins->obufp, "/(bad)");
  12425. if (modrm_reg == sib_index || modrm_reg == reg)
  12426. strcat (ins->op_out[0], "/(bad)");
  12427. if (sib_index == modrm_reg || sib_index == reg)
  12428. strcat (ins->op_out[1], "/(bad)");
  12429. return;
  12430. case tmm_mode:
  12431. /* All 3 TMM registers must be distinct. */
  12432. if (reg >= 8)
  12433. oappend (ins, "(bad)");
  12434. else
  12435. {
  12436. /* This must be the 3rd operand. */
  12437. if (ins->obufp != ins->op_out[2])
  12438. abort ();
  12439. oappend_maybe_intel (ins, att_names_tmm[reg]);
  12440. if (reg == ins->modrm.reg || reg == ins->modrm.rm)
  12441. strcpy (ins->obufp, "/(bad)");
  12442. }
  12443. if (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg
  12444. || ins->modrm.rm == reg)
  12445. {
  12446. if (ins->modrm.reg <= 8
  12447. && (ins->modrm.reg == ins->modrm.rm || ins->modrm.reg == reg))
  12448. strcat (ins->op_out[0], "/(bad)");
  12449. if (ins->modrm.rm <= 8
  12450. && (ins->modrm.rm == ins->modrm.reg || ins->modrm.rm == reg))
  12451. strcat (ins->op_out[1], "/(bad)");
  12452. }
  12453. return;
  12454. }
  12455. switch (ins->vex.length)
  12456. {
  12457. case 128:
  12458. switch (bytemode)
  12459. {
  12460. case x_mode:
  12461. names = att_names_xmm;
  12462. break;
  12463. case dq_mode:
  12464. if (ins->rex & REX_W)
  12465. names = att_names64;
  12466. else
  12467. names = att_names32;
  12468. break;
  12469. case mask_bd_mode:
  12470. case mask_mode:
  12471. if (reg > 0x7)
  12472. {
  12473. oappend (ins, "(bad)");
  12474. return;
  12475. }
  12476. names = att_names_mask;
  12477. break;
  12478. default:
  12479. abort ();
  12480. return;
  12481. }
  12482. break;
  12483. case 256:
  12484. switch (bytemode)
  12485. {
  12486. case x_mode:
  12487. names = att_names_ymm;
  12488. break;
  12489. case mask_bd_mode:
  12490. case mask_mode:
  12491. if (reg > 0x7)
  12492. {
  12493. oappend (ins, "(bad)");
  12494. return;
  12495. }
  12496. names = att_names_mask;
  12497. break;
  12498. default:
  12499. /* See PR binutils/20893 for a reproducer. */
  12500. oappend (ins, "(bad)");
  12501. return;
  12502. }
  12503. break;
  12504. case 512:
  12505. names = att_names_zmm;
  12506. break;
  12507. default:
  12508. abort ();
  12509. break;
  12510. }
  12511. oappend_maybe_intel (ins, names[reg]);
  12512. }
  12513. static void
  12514. OP_VexR (instr_info *ins, int bytemode, int sizeflag)
  12515. {
  12516. if (ins->modrm.mod == 3)
  12517. OP_VEX (ins, bytemode, sizeflag);
  12518. }
  12519. static void
  12520. OP_VexW (instr_info *ins, int bytemode, int sizeflag)
  12521. {
  12522. OP_VEX (ins, bytemode, sizeflag);
  12523. if (ins->vex.w)
  12524. {
  12525. /* Swap 2nd and 3rd operands. */
  12526. strcpy (ins->scratchbuf, ins->op_out[2]);
  12527. strcpy (ins->op_out[2], ins->op_out[1]);
  12528. strcpy (ins->op_out[1], ins->scratchbuf);
  12529. }
  12530. }
  12531. static void
  12532. OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
  12533. {
  12534. int reg;
  12535. const char *const *names = att_names_xmm;
  12536. FETCH_DATA (ins->info, ins->codep + 1);
  12537. reg = *ins->codep++;
  12538. if (bytemode != x_mode && bytemode != scalar_mode)
  12539. abort ();
  12540. reg >>= 4;
  12541. if (ins->address_mode != mode_64bit)
  12542. reg &= 7;
  12543. if (bytemode == x_mode && ins->vex.length == 256)
  12544. names = att_names_ymm;
  12545. oappend_maybe_intel (ins, names[reg]);
  12546. if (ins->vex.w)
  12547. {
  12548. /* Swap 3rd and 4th operands. */
  12549. strcpy (ins->scratchbuf, ins->op_out[3]);
  12550. strcpy (ins->op_out[3], ins->op_out[2]);
  12551. strcpy (ins->op_out[2], ins->scratchbuf);
  12552. }
  12553. }
  12554. static void
  12555. OP_VexI4 (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  12556. int sizeflag ATTRIBUTE_UNUSED)
  12557. {
  12558. ins->scratchbuf[0] = '$';
  12559. print_operand_value (ins, ins->scratchbuf + 1, 1, ins->codep[-1] & 0xf);
  12560. oappend_maybe_intel (ins, ins->scratchbuf);
  12561. }
  12562. static void
  12563. VPCMP_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  12564. int sizeflag ATTRIBUTE_UNUSED)
  12565. {
  12566. unsigned int cmp_type;
  12567. if (!ins->vex.evex)
  12568. abort ();
  12569. FETCH_DATA (ins->info, ins->codep + 1);
  12570. cmp_type = *ins->codep++ & 0xff;
  12571. /* There are aliases for immediates 0, 1, 2, 4, 5, 6.
  12572. If it's the case, print suffix, otherwise - print the immediate. */
  12573. if (cmp_type < ARRAY_SIZE (simd_cmp_op)
  12574. && cmp_type != 3
  12575. && cmp_type != 7)
  12576. {
  12577. char suffix[3];
  12578. char *p = ins->mnemonicendp - 2;
  12579. /* vpcmp* can have both one- and two-lettered suffix. */
  12580. if (p[0] == 'p')
  12581. {
  12582. p++;
  12583. suffix[0] = p[0];
  12584. suffix[1] = '\0';
  12585. }
  12586. else
  12587. {
  12588. suffix[0] = p[0];
  12589. suffix[1] = p[1];
  12590. suffix[2] = '\0';
  12591. }
  12592. sprintf (p, "%s%s", simd_cmp_op[cmp_type].name, suffix);
  12593. ins->mnemonicendp += simd_cmp_op[cmp_type].len;
  12594. }
  12595. else
  12596. {
  12597. /* We have a reserved extension byte. Output it directly. */
  12598. ins->scratchbuf[0] = '$';
  12599. print_operand_value (ins, ins->scratchbuf + 1, 1, cmp_type);
  12600. oappend_maybe_intel (ins, ins->scratchbuf);
  12601. ins->scratchbuf[0] = '\0';
  12602. }
  12603. }
  12604. static const struct op xop_cmp_op[] =
  12605. {
  12606. { STRING_COMMA_LEN ("lt") },
  12607. { STRING_COMMA_LEN ("le") },
  12608. { STRING_COMMA_LEN ("gt") },
  12609. { STRING_COMMA_LEN ("ge") },
  12610. { STRING_COMMA_LEN ("eq") },
  12611. { STRING_COMMA_LEN ("neq") },
  12612. { STRING_COMMA_LEN ("false") },
  12613. { STRING_COMMA_LEN ("true") }
  12614. };
  12615. static void
  12616. VPCOM_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  12617. int sizeflag ATTRIBUTE_UNUSED)
  12618. {
  12619. unsigned int cmp_type;
  12620. FETCH_DATA (ins->info, ins->codep + 1);
  12621. cmp_type = *ins->codep++ & 0xff;
  12622. if (cmp_type < ARRAY_SIZE (xop_cmp_op))
  12623. {
  12624. char suffix[3];
  12625. char *p = ins->mnemonicendp - 2;
  12626. /* vpcom* can have both one- and two-lettered suffix. */
  12627. if (p[0] == 'm')
  12628. {
  12629. p++;
  12630. suffix[0] = p[0];
  12631. suffix[1] = '\0';
  12632. }
  12633. else
  12634. {
  12635. suffix[0] = p[0];
  12636. suffix[1] = p[1];
  12637. suffix[2] = '\0';
  12638. }
  12639. sprintf (p, "%s%s", xop_cmp_op[cmp_type].name, suffix);
  12640. ins->mnemonicendp += xop_cmp_op[cmp_type].len;
  12641. }
  12642. else
  12643. {
  12644. /* We have a reserved extension byte. Output it directly. */
  12645. ins->scratchbuf[0] = '$';
  12646. print_operand_value (ins, ins->scratchbuf + 1, 1, cmp_type);
  12647. oappend_maybe_intel (ins, ins->scratchbuf);
  12648. ins->scratchbuf[0] = '\0';
  12649. }
  12650. }
  12651. static const struct op pclmul_op[] =
  12652. {
  12653. { STRING_COMMA_LEN ("lql") },
  12654. { STRING_COMMA_LEN ("hql") },
  12655. { STRING_COMMA_LEN ("lqh") },
  12656. { STRING_COMMA_LEN ("hqh") }
  12657. };
  12658. static void
  12659. PCLMUL_Fixup (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
  12660. int sizeflag ATTRIBUTE_UNUSED)
  12661. {
  12662. unsigned int pclmul_type;
  12663. FETCH_DATA (ins->info, ins->codep + 1);
  12664. pclmul_type = *ins->codep++ & 0xff;
  12665. switch (pclmul_type)
  12666. {
  12667. case 0x10:
  12668. pclmul_type = 2;
  12669. break;
  12670. case 0x11:
  12671. pclmul_type = 3;
  12672. break;
  12673. default:
  12674. break;
  12675. }
  12676. if (pclmul_type < ARRAY_SIZE (pclmul_op))
  12677. {
  12678. char suffix[4];
  12679. char *p = ins->mnemonicendp - 3;
  12680. suffix[0] = p[0];
  12681. suffix[1] = p[1];
  12682. suffix[2] = p[2];
  12683. suffix[3] = '\0';
  12684. sprintf (p, "%s%s", pclmul_op[pclmul_type].name, suffix);
  12685. ins->mnemonicendp += pclmul_op[pclmul_type].len;
  12686. }
  12687. else
  12688. {
  12689. /* We have a reserved extension byte. Output it directly. */
  12690. ins->scratchbuf[0] = '$';
  12691. print_operand_value (ins, ins->scratchbuf + 1, 1, pclmul_type);
  12692. oappend_maybe_intel (ins, ins->scratchbuf);
  12693. ins->scratchbuf[0] = '\0';
  12694. }
  12695. }
  12696. static void
  12697. MOVSXD_Fixup (instr_info *ins, int bytemode, int sizeflag)
  12698. {
  12699. /* Add proper suffix to "movsxd". */
  12700. char *p = ins->mnemonicendp;
  12701. switch (bytemode)
  12702. {
  12703. case movsxd_mode:
  12704. if (!ins->intel_syntax)
  12705. {
  12706. USED_REX (REX_W);
  12707. if (ins->rex & REX_W)
  12708. {
  12709. *p++ = 'l';
  12710. *p++ = 'q';
  12711. break;
  12712. }
  12713. }
  12714. *p++ = 'x';
  12715. *p++ = 'd';
  12716. break;
  12717. default:
  12718. oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
  12719. break;
  12720. }
  12721. ins->mnemonicendp = p;
  12722. *p = '\0';
  12723. OP_E (ins, bytemode, sizeflag);
  12724. }
  12725. static void
  12726. DistinctDest_Fixup (instr_info *ins, int bytemode, int sizeflag)
  12727. {
  12728. unsigned int reg = ins->vex.register_specifier;
  12729. unsigned int modrm_reg = ins->modrm.reg;
  12730. unsigned int modrm_rm = ins->modrm.rm;
  12731. /* Calc destination register number. */
  12732. if (ins->rex & REX_R)
  12733. modrm_reg += 8;
  12734. if (!ins->vex.r)
  12735. modrm_reg += 16;
  12736. /* Calc src1 register number. */
  12737. if (ins->address_mode != mode_64bit)
  12738. reg &= 7;
  12739. else if (ins->vex.evex && !ins->vex.v)
  12740. reg += 16;
  12741. /* Calc src2 register number. */
  12742. if (ins->modrm.mod == 3)
  12743. {
  12744. if (ins->rex & REX_B)
  12745. modrm_rm += 8;
  12746. if (ins->rex & REX_X)
  12747. modrm_rm += 16;
  12748. }
  12749. /* Destination and source registers must be distinct, output bad if
  12750. dest == src1 or dest == src2. */
  12751. if (modrm_reg == reg
  12752. || (ins->modrm.mod == 3
  12753. && modrm_reg == modrm_rm))
  12754. {
  12755. oappend (ins, "(bad)");
  12756. }
  12757. else
  12758. OP_XMM (ins, bytemode, sizeflag);
  12759. }
  12760. static void
  12761. OP_Rounding (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
  12762. {
  12763. if (ins->modrm.mod != 3 || !ins->vex.b)
  12764. return;
  12765. switch (bytemode)
  12766. {
  12767. case evex_rounding_64_mode:
  12768. if (ins->address_mode != mode_64bit || !ins->vex.w)
  12769. return;
  12770. /* Fall through. */
  12771. case evex_rounding_mode:
  12772. ins->evex_used |= EVEX_b_used;
  12773. oappend (ins, names_rounding[ins->vex.ll]);
  12774. break;
  12775. case evex_sae_mode:
  12776. ins->evex_used |= EVEX_b_used;
  12777. oappend (ins, "{");
  12778. break;
  12779. default:
  12780. abort ();
  12781. }
  12782. oappend (ins, "sae}");
  12783. }