am33.igen 211 KB

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