asmz.go 174 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043
  1. // Based on cmd/internal/obj/ppc64/asm9.go.
  2. //
  3. // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
  4. // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
  5. // Portions Copyright © 1997-1999 Vita Nuova Limited
  6. // Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com)
  7. // Portions Copyright © 2004,2006 Bruce Ellis
  8. // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
  9. // Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others
  10. // Portions Copyright © 2009 The Go Authors. All rights reserved.
  11. //
  12. // Permission is hereby granted, free of charge, to any person obtaining a copy
  13. // of this software and associated documentation files (the "Software"), to deal
  14. // in the Software without restriction, including without limitation the rights
  15. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  16. // copies of the Software, and to permit persons to whom the Software is
  17. // furnished to do so, subject to the following conditions:
  18. //
  19. // The above copyright notice and this permission notice shall be included in
  20. // all copies or substantial portions of the Software.
  21. //
  22. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  23. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  24. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  25. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  26. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  27. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  28. // THE SOFTWARE.
  29. package s390x
  30. import (
  31. "github.com/twitchyliquid64/golang-asm/obj"
  32. "github.com/twitchyliquid64/golang-asm/objabi"
  33. "fmt"
  34. "log"
  35. "math"
  36. "sort"
  37. )
  38. // ctxtz holds state while assembling a single function.
  39. // Each function gets a fresh ctxtz.
  40. // This allows for multiple functions to be safely concurrently assembled.
  41. type ctxtz struct {
  42. ctxt *obj.Link
  43. newprog obj.ProgAlloc
  44. cursym *obj.LSym
  45. autosize int32
  46. instoffset int64
  47. pc int64
  48. }
  49. // instruction layout.
  50. const (
  51. funcAlign = 16
  52. )
  53. type Optab struct {
  54. as obj.As // opcode
  55. i uint8 // handler index
  56. a1 uint8 // From
  57. a2 uint8 // Reg
  58. a3 uint8 // RestArgs[0]
  59. a4 uint8 // RestArgs[1]
  60. a5 uint8 // RestArgs[2]
  61. a6 uint8 // To
  62. }
  63. var optab = []Optab{
  64. // zero-length instructions
  65. {i: 0, as: obj.ATEXT, a1: C_ADDR, a6: C_TEXTSIZE},
  66. {i: 0, as: obj.ATEXT, a1: C_ADDR, a3: C_LCON, a6: C_TEXTSIZE},
  67. {i: 0, as: obj.APCDATA, a1: C_LCON, a6: C_LCON},
  68. {i: 0, as: obj.AFUNCDATA, a1: C_SCON, a6: C_ADDR},
  69. {i: 0, as: obj.ANOP},
  70. {i: 0, as: obj.ANOP, a1: C_SAUTO},
  71. // move register
  72. {i: 1, as: AMOVD, a1: C_REG, a6: C_REG},
  73. {i: 1, as: AMOVB, a1: C_REG, a6: C_REG},
  74. {i: 1, as: AMOVBZ, a1: C_REG, a6: C_REG},
  75. {i: 1, as: AMOVW, a1: C_REG, a6: C_REG},
  76. {i: 1, as: AMOVWZ, a1: C_REG, a6: C_REG},
  77. {i: 1, as: AFMOVD, a1: C_FREG, a6: C_FREG},
  78. {i: 1, as: AMOVDBR, a1: C_REG, a6: C_REG},
  79. // load constant
  80. {i: 26, as: AMOVD, a1: C_LACON, a6: C_REG},
  81. {i: 26, as: AMOVW, a1: C_LACON, a6: C_REG},
  82. {i: 26, as: AMOVWZ, a1: C_LACON, a6: C_REG},
  83. {i: 3, as: AMOVD, a1: C_DCON, a6: C_REG},
  84. {i: 3, as: AMOVW, a1: C_DCON, a6: C_REG},
  85. {i: 3, as: AMOVWZ, a1: C_DCON, a6: C_REG},
  86. {i: 3, as: AMOVB, a1: C_DCON, a6: C_REG},
  87. {i: 3, as: AMOVBZ, a1: C_DCON, a6: C_REG},
  88. // store constant
  89. {i: 72, as: AMOVD, a1: C_SCON, a6: C_LAUTO},
  90. {i: 72, as: AMOVD, a1: C_ADDCON, a6: C_LAUTO},
  91. {i: 72, as: AMOVW, a1: C_SCON, a6: C_LAUTO},
  92. {i: 72, as: AMOVW, a1: C_ADDCON, a6: C_LAUTO},
  93. {i: 72, as: AMOVWZ, a1: C_SCON, a6: C_LAUTO},
  94. {i: 72, as: AMOVWZ, a1: C_ADDCON, a6: C_LAUTO},
  95. {i: 72, as: AMOVB, a1: C_SCON, a6: C_LAUTO},
  96. {i: 72, as: AMOVB, a1: C_ADDCON, a6: C_LAUTO},
  97. {i: 72, as: AMOVBZ, a1: C_SCON, a6: C_LAUTO},
  98. {i: 72, as: AMOVBZ, a1: C_ADDCON, a6: C_LAUTO},
  99. {i: 72, as: AMOVD, a1: C_SCON, a6: C_LOREG},
  100. {i: 72, as: AMOVD, a1: C_ADDCON, a6: C_LOREG},
  101. {i: 72, as: AMOVW, a1: C_SCON, a6: C_LOREG},
  102. {i: 72, as: AMOVW, a1: C_ADDCON, a6: C_LOREG},
  103. {i: 72, as: AMOVWZ, a1: C_SCON, a6: C_LOREG},
  104. {i: 72, as: AMOVWZ, a1: C_ADDCON, a6: C_LOREG},
  105. {i: 72, as: AMOVB, a1: C_SCON, a6: C_LOREG},
  106. {i: 72, as: AMOVB, a1: C_ADDCON, a6: C_LOREG},
  107. {i: 72, as: AMOVBZ, a1: C_SCON, a6: C_LOREG},
  108. {i: 72, as: AMOVBZ, a1: C_ADDCON, a6: C_LOREG},
  109. // store
  110. {i: 35, as: AMOVD, a1: C_REG, a6: C_LAUTO},
  111. {i: 35, as: AMOVW, a1: C_REG, a6: C_LAUTO},
  112. {i: 35, as: AMOVWZ, a1: C_REG, a6: C_LAUTO},
  113. {i: 35, as: AMOVBZ, a1: C_REG, a6: C_LAUTO},
  114. {i: 35, as: AMOVB, a1: C_REG, a6: C_LAUTO},
  115. {i: 35, as: AMOVDBR, a1: C_REG, a6: C_LAUTO},
  116. {i: 35, as: AMOVHBR, a1: C_REG, a6: C_LAUTO},
  117. {i: 35, as: AMOVD, a1: C_REG, a6: C_LOREG},
  118. {i: 35, as: AMOVW, a1: C_REG, a6: C_LOREG},
  119. {i: 35, as: AMOVWZ, a1: C_REG, a6: C_LOREG},
  120. {i: 35, as: AMOVBZ, a1: C_REG, a6: C_LOREG},
  121. {i: 35, as: AMOVB, a1: C_REG, a6: C_LOREG},
  122. {i: 35, as: AMOVDBR, a1: C_REG, a6: C_LOREG},
  123. {i: 35, as: AMOVHBR, a1: C_REG, a6: C_LOREG},
  124. {i: 74, as: AMOVD, a1: C_REG, a6: C_ADDR},
  125. {i: 74, as: AMOVW, a1: C_REG, a6: C_ADDR},
  126. {i: 74, as: AMOVWZ, a1: C_REG, a6: C_ADDR},
  127. {i: 74, as: AMOVBZ, a1: C_REG, a6: C_ADDR},
  128. {i: 74, as: AMOVB, a1: C_REG, a6: C_ADDR},
  129. // load
  130. {i: 36, as: AMOVD, a1: C_LAUTO, a6: C_REG},
  131. {i: 36, as: AMOVW, a1: C_LAUTO, a6: C_REG},
  132. {i: 36, as: AMOVWZ, a1: C_LAUTO, a6: C_REG},
  133. {i: 36, as: AMOVBZ, a1: C_LAUTO, a6: C_REG},
  134. {i: 36, as: AMOVB, a1: C_LAUTO, a6: C_REG},
  135. {i: 36, as: AMOVDBR, a1: C_LAUTO, a6: C_REG},
  136. {i: 36, as: AMOVHBR, a1: C_LAUTO, a6: C_REG},
  137. {i: 36, as: AMOVD, a1: C_LOREG, a6: C_REG},
  138. {i: 36, as: AMOVW, a1: C_LOREG, a6: C_REG},
  139. {i: 36, as: AMOVWZ, a1: C_LOREG, a6: C_REG},
  140. {i: 36, as: AMOVBZ, a1: C_LOREG, a6: C_REG},
  141. {i: 36, as: AMOVB, a1: C_LOREG, a6: C_REG},
  142. {i: 36, as: AMOVDBR, a1: C_LOREG, a6: C_REG},
  143. {i: 36, as: AMOVHBR, a1: C_LOREG, a6: C_REG},
  144. {i: 75, as: AMOVD, a1: C_ADDR, a6: C_REG},
  145. {i: 75, as: AMOVW, a1: C_ADDR, a6: C_REG},
  146. {i: 75, as: AMOVWZ, a1: C_ADDR, a6: C_REG},
  147. {i: 75, as: AMOVBZ, a1: C_ADDR, a6: C_REG},
  148. {i: 75, as: AMOVB, a1: C_ADDR, a6: C_REG},
  149. // interlocked load and op
  150. {i: 99, as: ALAAG, a1: C_REG, a2: C_REG, a6: C_LOREG},
  151. // integer arithmetic
  152. {i: 2, as: AADD, a1: C_REG, a2: C_REG, a6: C_REG},
  153. {i: 2, as: AADD, a1: C_REG, a6: C_REG},
  154. {i: 22, as: AADD, a1: C_LCON, a2: C_REG, a6: C_REG},
  155. {i: 22, as: AADD, a1: C_LCON, a6: C_REG},
  156. {i: 12, as: AADD, a1: C_LOREG, a6: C_REG},
  157. {i: 12, as: AADD, a1: C_LAUTO, a6: C_REG},
  158. {i: 21, as: ASUB, a1: C_LCON, a2: C_REG, a6: C_REG},
  159. {i: 21, as: ASUB, a1: C_LCON, a6: C_REG},
  160. {i: 12, as: ASUB, a1: C_LOREG, a6: C_REG},
  161. {i: 12, as: ASUB, a1: C_LAUTO, a6: C_REG},
  162. {i: 4, as: AMULHD, a1: C_REG, a6: C_REG},
  163. {i: 4, as: AMULHD, a1: C_REG, a2: C_REG, a6: C_REG},
  164. {i: 62, as: AMLGR, a1: C_REG, a6: C_REG},
  165. {i: 2, as: ADIVW, a1: C_REG, a2: C_REG, a6: C_REG},
  166. {i: 2, as: ADIVW, a1: C_REG, a6: C_REG},
  167. {i: 10, as: ASUB, a1: C_REG, a2: C_REG, a6: C_REG},
  168. {i: 10, as: ASUB, a1: C_REG, a6: C_REG},
  169. {i: 47, as: ANEG, a1: C_REG, a6: C_REG},
  170. {i: 47, as: ANEG, a6: C_REG},
  171. // integer logical
  172. {i: 6, as: AAND, a1: C_REG, a2: C_REG, a6: C_REG},
  173. {i: 6, as: AAND, a1: C_REG, a6: C_REG},
  174. {i: 23, as: AAND, a1: C_LCON, a6: C_REG},
  175. {i: 12, as: AAND, a1: C_LOREG, a6: C_REG},
  176. {i: 12, as: AAND, a1: C_LAUTO, a6: C_REG},
  177. {i: 6, as: AANDW, a1: C_REG, a2: C_REG, a6: C_REG},
  178. {i: 6, as: AANDW, a1: C_REG, a6: C_REG},
  179. {i: 24, as: AANDW, a1: C_LCON, a6: C_REG},
  180. {i: 12, as: AANDW, a1: C_LOREG, a6: C_REG},
  181. {i: 12, as: AANDW, a1: C_LAUTO, a6: C_REG},
  182. {i: 7, as: ASLD, a1: C_REG, a6: C_REG},
  183. {i: 7, as: ASLD, a1: C_REG, a2: C_REG, a6: C_REG},
  184. {i: 7, as: ASLD, a1: C_SCON, a2: C_REG, a6: C_REG},
  185. {i: 7, as: ASLD, a1: C_SCON, a6: C_REG},
  186. {i: 13, as: ARNSBG, a1: C_SCON, a3: C_SCON, a4: C_SCON, a5: C_REG, a6: C_REG},
  187. // compare and swap
  188. {i: 79, as: ACSG, a1: C_REG, a2: C_REG, a6: C_SOREG},
  189. // floating point
  190. {i: 32, as: AFADD, a1: C_FREG, a6: C_FREG},
  191. {i: 33, as: AFABS, a1: C_FREG, a6: C_FREG},
  192. {i: 33, as: AFABS, a6: C_FREG},
  193. {i: 34, as: AFMADD, a1: C_FREG, a2: C_FREG, a6: C_FREG},
  194. {i: 32, as: AFMUL, a1: C_FREG, a6: C_FREG},
  195. {i: 36, as: AFMOVD, a1: C_LAUTO, a6: C_FREG},
  196. {i: 36, as: AFMOVD, a1: C_LOREG, a6: C_FREG},
  197. {i: 75, as: AFMOVD, a1: C_ADDR, a6: C_FREG},
  198. {i: 35, as: AFMOVD, a1: C_FREG, a6: C_LAUTO},
  199. {i: 35, as: AFMOVD, a1: C_FREG, a6: C_LOREG},
  200. {i: 74, as: AFMOVD, a1: C_FREG, a6: C_ADDR},
  201. {i: 67, as: AFMOVD, a1: C_ZCON, a6: C_FREG},
  202. {i: 81, as: ALDGR, a1: C_REG, a6: C_FREG},
  203. {i: 81, as: ALGDR, a1: C_FREG, a6: C_REG},
  204. {i: 82, as: ACEFBRA, a1: C_REG, a6: C_FREG},
  205. {i: 83, as: ACFEBRA, a1: C_FREG, a6: C_REG},
  206. {i: 48, as: AFIEBR, a1: C_SCON, a2: C_FREG, a6: C_FREG},
  207. {i: 49, as: ACPSDR, a1: C_FREG, a2: C_FREG, a6: C_FREG},
  208. {i: 50, as: ALTDBR, a1: C_FREG, a6: C_FREG},
  209. {i: 51, as: ATCDB, a1: C_FREG, a6: C_SCON},
  210. // load symbol address (plus offset)
  211. {i: 19, as: AMOVD, a1: C_SYMADDR, a6: C_REG},
  212. {i: 93, as: AMOVD, a1: C_GOTADDR, a6: C_REG},
  213. {i: 94, as: AMOVD, a1: C_TLS_LE, a6: C_REG},
  214. {i: 95, as: AMOVD, a1: C_TLS_IE, a6: C_REG},
  215. // system call
  216. {i: 5, as: ASYSCALL},
  217. {i: 77, as: ASYSCALL, a1: C_SCON},
  218. // branch
  219. {i: 16, as: ABEQ, a6: C_SBRA},
  220. {i: 16, as: ABRC, a1: C_SCON, a6: C_SBRA},
  221. {i: 11, as: ABR, a6: C_LBRA},
  222. {i: 16, as: ABC, a1: C_SCON, a2: C_REG, a6: C_LBRA},
  223. {i: 18, as: ABR, a6: C_REG},
  224. {i: 18, as: ABR, a1: C_REG, a6: C_REG},
  225. {i: 15, as: ABR, a6: C_ZOREG},
  226. {i: 15, as: ABC, a6: C_ZOREG},
  227. // compare and branch
  228. {i: 89, as: ACGRJ, a1: C_SCON, a2: C_REG, a3: C_REG, a6: C_SBRA},
  229. {i: 89, as: ACMPBEQ, a1: C_REG, a2: C_REG, a6: C_SBRA},
  230. {i: 89, as: ACLGRJ, a1: C_SCON, a2: C_REG, a3: C_REG, a6: C_SBRA},
  231. {i: 89, as: ACMPUBEQ, a1: C_REG, a2: C_REG, a6: C_SBRA},
  232. {i: 90, as: ACGIJ, a1: C_SCON, a2: C_REG, a3: C_ADDCON, a6: C_SBRA},
  233. {i: 90, as: ACGIJ, a1: C_SCON, a2: C_REG, a3: C_SCON, a6: C_SBRA},
  234. {i: 90, as: ACMPBEQ, a1: C_REG, a3: C_ADDCON, a6: C_SBRA},
  235. {i: 90, as: ACMPBEQ, a1: C_REG, a3: C_SCON, a6: C_SBRA},
  236. {i: 90, as: ACLGIJ, a1: C_SCON, a2: C_REG, a3: C_ADDCON, a6: C_SBRA},
  237. {i: 90, as: ACMPUBEQ, a1: C_REG, a3: C_ANDCON, a6: C_SBRA},
  238. // branch on count
  239. {i: 41, as: ABRCT, a1: C_REG, a6: C_SBRA},
  240. {i: 41, as: ABRCTG, a1: C_REG, a6: C_SBRA},
  241. // move on condition
  242. {i: 17, as: AMOVDEQ, a1: C_REG, a6: C_REG},
  243. // load on condition
  244. {i: 25, as: ALOCGR, a1: C_SCON, a2: C_REG, a6: C_REG},
  245. // find leftmost one
  246. {i: 8, as: AFLOGR, a1: C_REG, a6: C_REG},
  247. // population count
  248. {i: 9, as: APOPCNT, a1: C_REG, a6: C_REG},
  249. // compare
  250. {i: 70, as: ACMP, a1: C_REG, a6: C_REG},
  251. {i: 71, as: ACMP, a1: C_REG, a6: C_LCON},
  252. {i: 70, as: ACMPU, a1: C_REG, a6: C_REG},
  253. {i: 71, as: ACMPU, a1: C_REG, a6: C_LCON},
  254. {i: 70, as: AFCMPO, a1: C_FREG, a6: C_FREG},
  255. {i: 70, as: AFCMPO, a1: C_FREG, a2: C_REG, a6: C_FREG},
  256. // test under mask
  257. {i: 91, as: ATMHH, a1: C_REG, a6: C_ANDCON},
  258. // insert program mask
  259. {i: 92, as: AIPM, a1: C_REG},
  260. // set program mask
  261. {i: 76, as: ASPM, a1: C_REG},
  262. // 32-bit access registers
  263. {i: 68, as: AMOVW, a1: C_AREG, a6: C_REG},
  264. {i: 68, as: AMOVWZ, a1: C_AREG, a6: C_REG},
  265. {i: 69, as: AMOVW, a1: C_REG, a6: C_AREG},
  266. {i: 69, as: AMOVWZ, a1: C_REG, a6: C_AREG},
  267. // macros
  268. {i: 96, as: ACLEAR, a1: C_LCON, a6: C_LOREG},
  269. {i: 96, as: ACLEAR, a1: C_LCON, a6: C_LAUTO},
  270. // load/store multiple
  271. {i: 97, as: ASTMG, a1: C_REG, a2: C_REG, a6: C_LOREG},
  272. {i: 97, as: ASTMG, a1: C_REG, a2: C_REG, a6: C_LAUTO},
  273. {i: 98, as: ALMG, a1: C_LOREG, a2: C_REG, a6: C_REG},
  274. {i: 98, as: ALMG, a1: C_LAUTO, a2: C_REG, a6: C_REG},
  275. // bytes
  276. {i: 40, as: ABYTE, a1: C_SCON},
  277. {i: 40, as: AWORD, a1: C_LCON},
  278. {i: 31, as: ADWORD, a1: C_LCON},
  279. {i: 31, as: ADWORD, a1: C_DCON},
  280. // fast synchronization
  281. {i: 80, as: ASYNC},
  282. // store clock
  283. {i: 88, as: ASTCK, a6: C_SAUTO},
  284. {i: 88, as: ASTCK, a6: C_SOREG},
  285. // storage and storage
  286. {i: 84, as: AMVC, a1: C_SCON, a3: C_LOREG, a6: C_LOREG},
  287. {i: 84, as: AMVC, a1: C_SCON, a3: C_LOREG, a6: C_LAUTO},
  288. {i: 84, as: AMVC, a1: C_SCON, a3: C_LAUTO, a6: C_LAUTO},
  289. // address
  290. {i: 85, as: ALARL, a1: C_LCON, a6: C_REG},
  291. {i: 85, as: ALARL, a1: C_SYMADDR, a6: C_REG},
  292. {i: 86, as: ALA, a1: C_SOREG, a6: C_REG},
  293. {i: 86, as: ALA, a1: C_SAUTO, a6: C_REG},
  294. {i: 87, as: AEXRL, a1: C_SYMADDR, a6: C_REG},
  295. // undefined (deliberate illegal instruction)
  296. {i: 78, as: obj.AUNDEF},
  297. // 2 byte no-operation
  298. {i: 66, as: ANOPH},
  299. // vector instructions
  300. // VRX store
  301. {i: 100, as: AVST, a1: C_VREG, a6: C_SOREG},
  302. {i: 100, as: AVST, a1: C_VREG, a6: C_SAUTO},
  303. {i: 100, as: AVSTEG, a1: C_SCON, a2: C_VREG, a6: C_SOREG},
  304. {i: 100, as: AVSTEG, a1: C_SCON, a2: C_VREG, a6: C_SAUTO},
  305. // VRX load
  306. {i: 101, as: AVL, a1: C_SOREG, a6: C_VREG},
  307. {i: 101, as: AVL, a1: C_SAUTO, a6: C_VREG},
  308. {i: 101, as: AVLEG, a1: C_SCON, a3: C_SOREG, a6: C_VREG},
  309. {i: 101, as: AVLEG, a1: C_SCON, a3: C_SAUTO, a6: C_VREG},
  310. // VRV scatter
  311. {i: 102, as: AVSCEG, a1: C_SCON, a2: C_VREG, a6: C_SOREG},
  312. {i: 102, as: AVSCEG, a1: C_SCON, a2: C_VREG, a6: C_SAUTO},
  313. // VRV gather
  314. {i: 103, as: AVGEG, a1: C_SCON, a3: C_SOREG, a6: C_VREG},
  315. {i: 103, as: AVGEG, a1: C_SCON, a3: C_SAUTO, a6: C_VREG},
  316. // VRS element shift/rotate and load gr to/from vr element
  317. {i: 104, as: AVESLG, a1: C_SCON, a2: C_VREG, a6: C_VREG},
  318. {i: 104, as: AVESLG, a1: C_REG, a2: C_VREG, a6: C_VREG},
  319. {i: 104, as: AVESLG, a1: C_SCON, a6: C_VREG},
  320. {i: 104, as: AVESLG, a1: C_REG, a6: C_VREG},
  321. {i: 104, as: AVLGVG, a1: C_SCON, a2: C_VREG, a6: C_REG},
  322. {i: 104, as: AVLGVG, a1: C_REG, a2: C_VREG, a6: C_REG},
  323. {i: 104, as: AVLVGG, a1: C_SCON, a2: C_REG, a6: C_VREG},
  324. {i: 104, as: AVLVGG, a1: C_REG, a2: C_REG, a6: C_VREG},
  325. // VRS store multiple
  326. {i: 105, as: AVSTM, a1: C_VREG, a2: C_VREG, a6: C_SOREG},
  327. {i: 105, as: AVSTM, a1: C_VREG, a2: C_VREG, a6: C_SAUTO},
  328. // VRS load multiple
  329. {i: 106, as: AVLM, a1: C_SOREG, a2: C_VREG, a6: C_VREG},
  330. {i: 106, as: AVLM, a1: C_SAUTO, a2: C_VREG, a6: C_VREG},
  331. // VRS store with length
  332. {i: 107, as: AVSTL, a1: C_REG, a2: C_VREG, a6: C_SOREG},
  333. {i: 107, as: AVSTL, a1: C_REG, a2: C_VREG, a6: C_SAUTO},
  334. // VRS load with length
  335. {i: 108, as: AVLL, a1: C_REG, a3: C_SOREG, a6: C_VREG},
  336. {i: 108, as: AVLL, a1: C_REG, a3: C_SAUTO, a6: C_VREG},
  337. // VRI-a
  338. {i: 109, as: AVGBM, a1: C_ANDCON, a6: C_VREG},
  339. {i: 109, as: AVZERO, a6: C_VREG},
  340. {i: 109, as: AVREPIG, a1: C_ADDCON, a6: C_VREG},
  341. {i: 109, as: AVREPIG, a1: C_SCON, a6: C_VREG},
  342. {i: 109, as: AVLEIG, a1: C_SCON, a3: C_ADDCON, a6: C_VREG},
  343. {i: 109, as: AVLEIG, a1: C_SCON, a3: C_SCON, a6: C_VREG},
  344. // VRI-b generate mask
  345. {i: 110, as: AVGMG, a1: C_SCON, a3: C_SCON, a6: C_VREG},
  346. // VRI-c replicate
  347. {i: 111, as: AVREPG, a1: C_UCON, a2: C_VREG, a6: C_VREG},
  348. // VRI-d element rotate and insert under mask and
  349. // shift left double by byte
  350. {i: 112, as: AVERIMG, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
  351. {i: 112, as: AVSLDB, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
  352. // VRI-d fp test data class immediate
  353. {i: 113, as: AVFTCIDB, a1: C_SCON, a2: C_VREG, a6: C_VREG},
  354. // VRR-a load reg
  355. {i: 114, as: AVLR, a1: C_VREG, a6: C_VREG},
  356. // VRR-a compare
  357. {i: 115, as: AVECG, a1: C_VREG, a6: C_VREG},
  358. // VRR-b
  359. {i: 117, as: AVCEQG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
  360. {i: 117, as: AVFAEF, a1: C_VREG, a2: C_VREG, a6: C_VREG},
  361. {i: 117, as: AVPKSG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
  362. // VRR-c
  363. {i: 118, as: AVAQ, a1: C_VREG, a2: C_VREG, a6: C_VREG},
  364. {i: 118, as: AVAQ, a1: C_VREG, a6: C_VREG},
  365. {i: 118, as: AVNOT, a1: C_VREG, a6: C_VREG},
  366. {i: 123, as: AVPDI, a1: C_SCON, a2: C_VREG, a3: C_VREG, a6: C_VREG},
  367. // VRR-c shifts
  368. {i: 119, as: AVERLLVG, a1: C_VREG, a2: C_VREG, a6: C_VREG},
  369. {i: 119, as: AVERLLVG, a1: C_VREG, a6: C_VREG},
  370. // VRR-d
  371. {i: 120, as: AVACQ, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG},
  372. // VRR-e
  373. {i: 121, as: AVSEL, a1: C_VREG, a2: C_VREG, a3: C_VREG, a6: C_VREG},
  374. // VRR-f
  375. {i: 122, as: AVLVGP, a1: C_REG, a2: C_REG, a6: C_VREG},
  376. }
  377. var oprange [ALAST & obj.AMask][]Optab
  378. var xcmp [C_NCLASS][C_NCLASS]bool
  379. func spanz(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
  380. if ctxt.Retpoline {
  381. ctxt.Diag("-spectre=ret not supported on s390x")
  382. ctxt.Retpoline = false // don't keep printing
  383. }
  384. p := cursym.Func.Text
  385. if p == nil || p.Link == nil { // handle external functions and ELF section symbols
  386. return
  387. }
  388. if oprange[AORW&obj.AMask] == nil {
  389. ctxt.Diag("s390x ops not initialized, call s390x.buildop first")
  390. }
  391. c := ctxtz{ctxt: ctxt, newprog: newprog, cursym: cursym, autosize: int32(p.To.Offset)}
  392. buffer := make([]byte, 0)
  393. changed := true
  394. loop := 0
  395. for changed {
  396. if loop > 100 {
  397. c.ctxt.Diag("stuck in spanz loop")
  398. break
  399. }
  400. changed = false
  401. buffer = buffer[:0]
  402. c.cursym.R = make([]obj.Reloc, 0)
  403. for p := c.cursym.Func.Text; p != nil; p = p.Link {
  404. pc := int64(len(buffer))
  405. if pc != p.Pc {
  406. changed = true
  407. }
  408. p.Pc = pc
  409. c.pc = p.Pc
  410. c.asmout(p, &buffer)
  411. if pc == int64(len(buffer)) {
  412. switch p.As {
  413. case obj.ANOP, obj.AFUNCDATA, obj.APCDATA, obj.ATEXT:
  414. // ok
  415. default:
  416. c.ctxt.Diag("zero-width instruction\n%v", p)
  417. }
  418. }
  419. }
  420. loop++
  421. }
  422. c.cursym.Size = int64(len(buffer))
  423. if c.cursym.Size%funcAlign != 0 {
  424. c.cursym.Size += funcAlign - (c.cursym.Size % funcAlign)
  425. }
  426. c.cursym.Grow(c.cursym.Size)
  427. copy(c.cursym.P, buffer)
  428. // Mark nonpreemptible instruction sequences.
  429. // We use REGTMP as a scratch register during call injection,
  430. // so instruction sequences that use REGTMP are unsafe to
  431. // preempt asynchronously.
  432. obj.MarkUnsafePoints(c.ctxt, c.cursym.Func.Text, c.newprog, c.isUnsafePoint, nil)
  433. }
  434. // Return whether p is an unsafe point.
  435. func (c *ctxtz) isUnsafePoint(p *obj.Prog) bool {
  436. if p.From.Reg == REGTMP || p.To.Reg == REGTMP || p.Reg == REGTMP {
  437. return true
  438. }
  439. for _, a := range p.RestArgs {
  440. if a.Reg == REGTMP {
  441. return true
  442. }
  443. }
  444. return p.Mark&USETMP != 0
  445. }
  446. func isint32(v int64) bool {
  447. return int64(int32(v)) == v
  448. }
  449. func isuint32(v uint64) bool {
  450. return uint64(uint32(v)) == v
  451. }
  452. func (c *ctxtz) aclass(a *obj.Addr) int {
  453. switch a.Type {
  454. case obj.TYPE_NONE:
  455. return C_NONE
  456. case obj.TYPE_REG:
  457. if REG_R0 <= a.Reg && a.Reg <= REG_R15 {
  458. return C_REG
  459. }
  460. if REG_F0 <= a.Reg && a.Reg <= REG_F15 {
  461. return C_FREG
  462. }
  463. if REG_AR0 <= a.Reg && a.Reg <= REG_AR15 {
  464. return C_AREG
  465. }
  466. if REG_V0 <= a.Reg && a.Reg <= REG_V31 {
  467. return C_VREG
  468. }
  469. return C_GOK
  470. case obj.TYPE_MEM:
  471. switch a.Name {
  472. case obj.NAME_EXTERN,
  473. obj.NAME_STATIC:
  474. if a.Sym == nil {
  475. // must have a symbol
  476. break
  477. }
  478. c.instoffset = a.Offset
  479. if a.Sym.Type == objabi.STLSBSS {
  480. if c.ctxt.Flag_shared {
  481. return C_TLS_IE // initial exec model
  482. }
  483. return C_TLS_LE // local exec model
  484. }
  485. return C_ADDR
  486. case obj.NAME_GOTREF:
  487. return C_GOTADDR
  488. case obj.NAME_AUTO:
  489. if a.Reg == REGSP {
  490. // unset base register for better printing, since
  491. // a.Offset is still relative to pseudo-SP.
  492. a.Reg = obj.REG_NONE
  493. }
  494. c.instoffset = int64(c.autosize) + a.Offset
  495. if c.instoffset >= -BIG && c.instoffset < BIG {
  496. return C_SAUTO
  497. }
  498. return C_LAUTO
  499. case obj.NAME_PARAM:
  500. if a.Reg == REGSP {
  501. // unset base register for better printing, since
  502. // a.Offset is still relative to pseudo-FP.
  503. a.Reg = obj.REG_NONE
  504. }
  505. c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
  506. if c.instoffset >= -BIG && c.instoffset < BIG {
  507. return C_SAUTO
  508. }
  509. return C_LAUTO
  510. case obj.NAME_NONE:
  511. c.instoffset = a.Offset
  512. if c.instoffset == 0 {
  513. return C_ZOREG
  514. }
  515. if c.instoffset >= -BIG && c.instoffset < BIG {
  516. return C_SOREG
  517. }
  518. return C_LOREG
  519. }
  520. return C_GOK
  521. case obj.TYPE_TEXTSIZE:
  522. return C_TEXTSIZE
  523. case obj.TYPE_FCONST:
  524. if f64, ok := a.Val.(float64); ok && math.Float64bits(f64) == 0 {
  525. return C_ZCON
  526. }
  527. c.ctxt.Diag("cannot handle the floating point constant %v", a.Val)
  528. case obj.TYPE_CONST,
  529. obj.TYPE_ADDR:
  530. switch a.Name {
  531. case obj.NAME_NONE:
  532. c.instoffset = a.Offset
  533. if a.Reg != 0 {
  534. if -BIG <= c.instoffset && c.instoffset <= BIG {
  535. return C_SACON
  536. }
  537. if isint32(c.instoffset) {
  538. return C_LACON
  539. }
  540. return C_DACON
  541. }
  542. case obj.NAME_EXTERN,
  543. obj.NAME_STATIC:
  544. s := a.Sym
  545. if s == nil {
  546. return C_GOK
  547. }
  548. c.instoffset = a.Offset
  549. return C_SYMADDR
  550. case obj.NAME_AUTO:
  551. if a.Reg == REGSP {
  552. // unset base register for better printing, since
  553. // a.Offset is still relative to pseudo-SP.
  554. a.Reg = obj.REG_NONE
  555. }
  556. c.instoffset = int64(c.autosize) + a.Offset
  557. if c.instoffset >= -BIG && c.instoffset < BIG {
  558. return C_SACON
  559. }
  560. return C_LACON
  561. case obj.NAME_PARAM:
  562. if a.Reg == REGSP {
  563. // unset base register for better printing, since
  564. // a.Offset is still relative to pseudo-FP.
  565. a.Reg = obj.REG_NONE
  566. }
  567. c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
  568. if c.instoffset >= -BIG && c.instoffset < BIG {
  569. return C_SACON
  570. }
  571. return C_LACON
  572. default:
  573. return C_GOK
  574. }
  575. if c.instoffset == 0 {
  576. return C_ZCON
  577. }
  578. if c.instoffset >= 0 {
  579. if c.instoffset <= 0x7fff {
  580. return C_SCON
  581. }
  582. if c.instoffset <= 0xffff {
  583. return C_ANDCON
  584. }
  585. if c.instoffset&0xffff == 0 && isuint32(uint64(c.instoffset)) { /* && (instoffset & (1<<31)) == 0) */
  586. return C_UCON
  587. }
  588. if isint32(c.instoffset) || isuint32(uint64(c.instoffset)) {
  589. return C_LCON
  590. }
  591. return C_DCON
  592. }
  593. if c.instoffset >= -0x8000 {
  594. return C_ADDCON
  595. }
  596. if c.instoffset&0xffff == 0 && isint32(c.instoffset) {
  597. return C_UCON
  598. }
  599. if isint32(c.instoffset) {
  600. return C_LCON
  601. }
  602. return C_DCON
  603. case obj.TYPE_BRANCH:
  604. return C_SBRA
  605. }
  606. return C_GOK
  607. }
  608. func (c *ctxtz) oplook(p *obj.Prog) *Optab {
  609. // Return cached optab entry if available.
  610. if p.Optab != 0 {
  611. return &optab[p.Optab-1]
  612. }
  613. if len(p.RestArgs) > 3 {
  614. c.ctxt.Diag("too many RestArgs: got %v, maximum is 3\n", len(p.RestArgs))
  615. return nil
  616. }
  617. // Initialize classes for all arguments.
  618. p.From.Class = int8(c.aclass(&p.From) + 1)
  619. p.To.Class = int8(c.aclass(&p.To) + 1)
  620. for i := range p.RestArgs {
  621. p.RestArgs[i].Class = int8(c.aclass(&p.RestArgs[i]) + 1)
  622. }
  623. // Mirrors the argument list in Optab.
  624. args := [...]int8{
  625. p.From.Class - 1,
  626. C_NONE, // p.Reg
  627. C_NONE, // p.RestArgs[0]
  628. C_NONE, // p.RestArgs[1]
  629. C_NONE, // p.RestArgs[2]
  630. p.To.Class - 1,
  631. }
  632. // Fill in argument class for p.Reg.
  633. switch {
  634. case REG_R0 <= p.Reg && p.Reg <= REG_R15:
  635. args[1] = C_REG
  636. case REG_V0 <= p.Reg && p.Reg <= REG_V31:
  637. args[1] = C_VREG
  638. case REG_F0 <= p.Reg && p.Reg <= REG_F15:
  639. args[1] = C_FREG
  640. case REG_AR0 <= p.Reg && p.Reg <= REG_AR15:
  641. args[1] = C_AREG
  642. }
  643. // Fill in argument classes for p.RestArgs.
  644. for i, a := range p.RestArgs {
  645. args[2+i] = a.Class - 1
  646. }
  647. // Lookup op in optab.
  648. ops := oprange[p.As&obj.AMask]
  649. cmp := [len(args)]*[C_NCLASS]bool{}
  650. for i := range cmp {
  651. cmp[i] = &xcmp[args[i]]
  652. }
  653. for i := range ops {
  654. op := &ops[i]
  655. if cmp[0][op.a1] && cmp[1][op.a2] &&
  656. cmp[2][op.a3] && cmp[3][op.a4] &&
  657. cmp[4][op.a5] && cmp[5][op.a6] {
  658. p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
  659. return op
  660. }
  661. }
  662. // Cannot find a case; abort.
  663. s := ""
  664. for _, a := range args {
  665. s += fmt.Sprintf(" %v", DRconv(int(a)))
  666. }
  667. c.ctxt.Diag("illegal combination %v%v\n", p.As, s)
  668. c.ctxt.Diag("prog: %v\n", p)
  669. return nil
  670. }
  671. func cmp(a int, b int) bool {
  672. if a == b {
  673. return true
  674. }
  675. switch a {
  676. case C_DCON:
  677. if b == C_LCON {
  678. return true
  679. }
  680. fallthrough
  681. case C_LCON:
  682. if b == C_ZCON || b == C_SCON || b == C_UCON || b == C_ADDCON || b == C_ANDCON {
  683. return true
  684. }
  685. case C_ADDCON:
  686. if b == C_ZCON || b == C_SCON {
  687. return true
  688. }
  689. case C_ANDCON:
  690. if b == C_ZCON || b == C_SCON {
  691. return true
  692. }
  693. case C_UCON:
  694. if b == C_ZCON || b == C_SCON {
  695. return true
  696. }
  697. case C_SCON:
  698. if b == C_ZCON {
  699. return true
  700. }
  701. case C_LACON:
  702. if b == C_SACON {
  703. return true
  704. }
  705. case C_LBRA:
  706. if b == C_SBRA {
  707. return true
  708. }
  709. case C_LAUTO:
  710. if b == C_SAUTO {
  711. return true
  712. }
  713. case C_LOREG:
  714. if b == C_ZOREG || b == C_SOREG {
  715. return true
  716. }
  717. case C_SOREG:
  718. if b == C_ZOREG {
  719. return true
  720. }
  721. case C_ANY:
  722. return true
  723. }
  724. return false
  725. }
  726. type ocmp []Optab
  727. func (x ocmp) Len() int {
  728. return len(x)
  729. }
  730. func (x ocmp) Swap(i, j int) {
  731. x[i], x[j] = x[j], x[i]
  732. }
  733. func (x ocmp) Less(i, j int) bool {
  734. p1 := &x[i]
  735. p2 := &x[j]
  736. n := int(p1.as) - int(p2.as)
  737. if n != 0 {
  738. return n < 0
  739. }
  740. n = int(p1.a1) - int(p2.a1)
  741. if n != 0 {
  742. return n < 0
  743. }
  744. n = int(p1.a2) - int(p2.a2)
  745. if n != 0 {
  746. return n < 0
  747. }
  748. n = int(p1.a3) - int(p2.a3)
  749. if n != 0 {
  750. return n < 0
  751. }
  752. n = int(p1.a4) - int(p2.a4)
  753. if n != 0 {
  754. return n < 0
  755. }
  756. return false
  757. }
  758. func opset(a, b obj.As) {
  759. oprange[a&obj.AMask] = oprange[b&obj.AMask]
  760. }
  761. func buildop(ctxt *obj.Link) {
  762. if oprange[AORW&obj.AMask] != nil {
  763. // Already initialized; stop now.
  764. // This happens in the cmd/asm tests,
  765. // each of which re-initializes the arch.
  766. return
  767. }
  768. for i := 0; i < C_NCLASS; i++ {
  769. for n := 0; n < C_NCLASS; n++ {
  770. if cmp(n, i) {
  771. xcmp[i][n] = true
  772. }
  773. }
  774. }
  775. sort.Sort(ocmp(optab))
  776. for i := 0; i < len(optab); i++ {
  777. r := optab[i].as
  778. start := i
  779. for ; i+1 < len(optab); i++ {
  780. if optab[i+1].as != r {
  781. break
  782. }
  783. }
  784. oprange[r&obj.AMask] = optab[start : i+1]
  785. // opset() aliases optab ranges for similar instructions, to reduce the number of optabs in the array.
  786. // oprange[] is used by oplook() to find the Optab entry that applies to a given Prog.
  787. switch r {
  788. case AADD:
  789. opset(AADDC, r)
  790. opset(AADDW, r)
  791. opset(AADDE, r)
  792. opset(AMULLD, r)
  793. opset(AMULLW, r)
  794. case ADIVW:
  795. opset(ADIVD, r)
  796. opset(ADIVDU, r)
  797. opset(ADIVWU, r)
  798. opset(AMODD, r)
  799. opset(AMODDU, r)
  800. opset(AMODW, r)
  801. opset(AMODWU, r)
  802. case AMULHD:
  803. opset(AMULHDU, r)
  804. case AMOVBZ:
  805. opset(AMOVH, r)
  806. opset(AMOVHZ, r)
  807. case ALA:
  808. opset(ALAY, r)
  809. case AMVC:
  810. opset(AMVCIN, r)
  811. opset(ACLC, r)
  812. opset(AXC, r)
  813. opset(AOC, r)
  814. opset(ANC, r)
  815. case ASTCK:
  816. opset(ASTCKC, r)
  817. opset(ASTCKE, r)
  818. opset(ASTCKF, r)
  819. case ALAAG:
  820. opset(ALAA, r)
  821. opset(ALAAL, r)
  822. opset(ALAALG, r)
  823. opset(ALAN, r)
  824. opset(ALANG, r)
  825. opset(ALAX, r)
  826. opset(ALAXG, r)
  827. opset(ALAO, r)
  828. opset(ALAOG, r)
  829. case ASTMG:
  830. opset(ASTMY, r)
  831. case ALMG:
  832. opset(ALMY, r)
  833. case ABEQ:
  834. opset(ABGE, r)
  835. opset(ABGT, r)
  836. opset(ABLE, r)
  837. opset(ABLT, r)
  838. opset(ABNE, r)
  839. opset(ABVC, r)
  840. opset(ABVS, r)
  841. opset(ABLEU, r)
  842. opset(ABLTU, r)
  843. case ABR:
  844. opset(ABL, r)
  845. case ABC:
  846. opset(ABCL, r)
  847. case AFABS:
  848. opset(AFNABS, r)
  849. opset(ALPDFR, r)
  850. opset(ALNDFR, r)
  851. opset(AFNEG, r)
  852. opset(AFNEGS, r)
  853. opset(ALEDBR, r)
  854. opset(ALDEBR, r)
  855. opset(AFSQRT, r)
  856. opset(AFSQRTS, r)
  857. case AFADD:
  858. opset(AFADDS, r)
  859. opset(AFDIV, r)
  860. opset(AFDIVS, r)
  861. opset(AFSUB, r)
  862. opset(AFSUBS, r)
  863. case AFMADD:
  864. opset(AFMADDS, r)
  865. opset(AFMSUB, r)
  866. opset(AFMSUBS, r)
  867. case AFMUL:
  868. opset(AFMULS, r)
  869. case AFCMPO:
  870. opset(AFCMPU, r)
  871. opset(ACEBR, r)
  872. case AAND:
  873. opset(AOR, r)
  874. opset(AXOR, r)
  875. case AANDW:
  876. opset(AORW, r)
  877. opset(AXORW, r)
  878. case ASLD:
  879. opset(ASRD, r)
  880. opset(ASLW, r)
  881. opset(ASRW, r)
  882. opset(ASRAD, r)
  883. opset(ASRAW, r)
  884. opset(ARLL, r)
  885. opset(ARLLG, r)
  886. case ARNSBG:
  887. opset(ARXSBG, r)
  888. opset(AROSBG, r)
  889. opset(ARNSBGT, r)
  890. opset(ARXSBGT, r)
  891. opset(AROSBGT, r)
  892. opset(ARISBG, r)
  893. opset(ARISBGN, r)
  894. opset(ARISBGZ, r)
  895. opset(ARISBGNZ, r)
  896. opset(ARISBHG, r)
  897. opset(ARISBLG, r)
  898. opset(ARISBHGZ, r)
  899. opset(ARISBLGZ, r)
  900. case ACSG:
  901. opset(ACS, r)
  902. case ASUB:
  903. opset(ASUBC, r)
  904. opset(ASUBE, r)
  905. opset(ASUBW, r)
  906. case ANEG:
  907. opset(ANEGW, r)
  908. case AFMOVD:
  909. opset(AFMOVS, r)
  910. case AMOVDBR:
  911. opset(AMOVWBR, r)
  912. case ACMP:
  913. opset(ACMPW, r)
  914. case ACMPU:
  915. opset(ACMPWU, r)
  916. case ATMHH:
  917. opset(ATMHL, r)
  918. opset(ATMLH, r)
  919. opset(ATMLL, r)
  920. case ACEFBRA:
  921. opset(ACDFBRA, r)
  922. opset(ACEGBRA, r)
  923. opset(ACDGBRA, r)
  924. opset(ACELFBR, r)
  925. opset(ACDLFBR, r)
  926. opset(ACELGBR, r)
  927. opset(ACDLGBR, r)
  928. case ACFEBRA:
  929. opset(ACFDBRA, r)
  930. opset(ACGEBRA, r)
  931. opset(ACGDBRA, r)
  932. opset(ACLFEBR, r)
  933. opset(ACLFDBR, r)
  934. opset(ACLGEBR, r)
  935. opset(ACLGDBR, r)
  936. case AFIEBR:
  937. opset(AFIDBR, r)
  938. case ACMPBEQ:
  939. opset(ACMPBGE, r)
  940. opset(ACMPBGT, r)
  941. opset(ACMPBLE, r)
  942. opset(ACMPBLT, r)
  943. opset(ACMPBNE, r)
  944. case ACMPUBEQ:
  945. opset(ACMPUBGE, r)
  946. opset(ACMPUBGT, r)
  947. opset(ACMPUBLE, r)
  948. opset(ACMPUBLT, r)
  949. opset(ACMPUBNE, r)
  950. case ACGRJ:
  951. opset(ACRJ, r)
  952. case ACLGRJ:
  953. opset(ACLRJ, r)
  954. case ACGIJ:
  955. opset(ACIJ, r)
  956. case ACLGIJ:
  957. opset(ACLIJ, r)
  958. case AMOVDEQ:
  959. opset(AMOVDGE, r)
  960. opset(AMOVDGT, r)
  961. opset(AMOVDLE, r)
  962. opset(AMOVDLT, r)
  963. opset(AMOVDNE, r)
  964. case ALOCGR:
  965. opset(ALOCR, r)
  966. case ALTDBR:
  967. opset(ALTEBR, r)
  968. case ATCDB:
  969. opset(ATCEB, r)
  970. case AVL:
  971. opset(AVLLEZB, r)
  972. opset(AVLLEZH, r)
  973. opset(AVLLEZF, r)
  974. opset(AVLLEZG, r)
  975. opset(AVLREPB, r)
  976. opset(AVLREPH, r)
  977. opset(AVLREPF, r)
  978. opset(AVLREPG, r)
  979. case AVLEG:
  980. opset(AVLBB, r)
  981. opset(AVLEB, r)
  982. opset(AVLEH, r)
  983. opset(AVLEF, r)
  984. opset(AVLEG, r)
  985. opset(AVLREP, r)
  986. case AVSTEG:
  987. opset(AVSTEB, r)
  988. opset(AVSTEH, r)
  989. opset(AVSTEF, r)
  990. case AVSCEG:
  991. opset(AVSCEF, r)
  992. case AVGEG:
  993. opset(AVGEF, r)
  994. case AVESLG:
  995. opset(AVESLB, r)
  996. opset(AVESLH, r)
  997. opset(AVESLF, r)
  998. opset(AVERLLB, r)
  999. opset(AVERLLH, r)
  1000. opset(AVERLLF, r)
  1001. opset(AVERLLG, r)
  1002. opset(AVESRAB, r)
  1003. opset(AVESRAH, r)
  1004. opset(AVESRAF, r)
  1005. opset(AVESRAG, r)
  1006. opset(AVESRLB, r)
  1007. opset(AVESRLH, r)
  1008. opset(AVESRLF, r)
  1009. opset(AVESRLG, r)
  1010. case AVLGVG:
  1011. opset(AVLGVB, r)
  1012. opset(AVLGVH, r)
  1013. opset(AVLGVF, r)
  1014. case AVLVGG:
  1015. opset(AVLVGB, r)
  1016. opset(AVLVGH, r)
  1017. opset(AVLVGF, r)
  1018. case AVZERO:
  1019. opset(AVONE, r)
  1020. case AVREPIG:
  1021. opset(AVREPIB, r)
  1022. opset(AVREPIH, r)
  1023. opset(AVREPIF, r)
  1024. case AVLEIG:
  1025. opset(AVLEIB, r)
  1026. opset(AVLEIH, r)
  1027. opset(AVLEIF, r)
  1028. case AVGMG:
  1029. opset(AVGMB, r)
  1030. opset(AVGMH, r)
  1031. opset(AVGMF, r)
  1032. case AVREPG:
  1033. opset(AVREPB, r)
  1034. opset(AVREPH, r)
  1035. opset(AVREPF, r)
  1036. case AVERIMG:
  1037. opset(AVERIMB, r)
  1038. opset(AVERIMH, r)
  1039. opset(AVERIMF, r)
  1040. case AVFTCIDB:
  1041. opset(AWFTCIDB, r)
  1042. case AVLR:
  1043. opset(AVUPHB, r)
  1044. opset(AVUPHH, r)
  1045. opset(AVUPHF, r)
  1046. opset(AVUPLHB, r)
  1047. opset(AVUPLHH, r)
  1048. opset(AVUPLHF, r)
  1049. opset(AVUPLB, r)
  1050. opset(AVUPLHW, r)
  1051. opset(AVUPLF, r)
  1052. opset(AVUPLLB, r)
  1053. opset(AVUPLLH, r)
  1054. opset(AVUPLLF, r)
  1055. opset(AVCLZB, r)
  1056. opset(AVCLZH, r)
  1057. opset(AVCLZF, r)
  1058. opset(AVCLZG, r)
  1059. opset(AVCTZB, r)
  1060. opset(AVCTZH, r)
  1061. opset(AVCTZF, r)
  1062. opset(AVCTZG, r)
  1063. opset(AVLDEB, r)
  1064. opset(AWLDEB, r)
  1065. opset(AVFLCDB, r)
  1066. opset(AWFLCDB, r)
  1067. opset(AVFLNDB, r)
  1068. opset(AWFLNDB, r)
  1069. opset(AVFLPDB, r)
  1070. opset(AWFLPDB, r)
  1071. opset(AVFSQDB, r)
  1072. opset(AWFSQDB, r)
  1073. opset(AVISTRB, r)
  1074. opset(AVISTRH, r)
  1075. opset(AVISTRF, r)
  1076. opset(AVISTRBS, r)
  1077. opset(AVISTRHS, r)
  1078. opset(AVISTRFS, r)
  1079. opset(AVLCB, r)
  1080. opset(AVLCH, r)
  1081. opset(AVLCF, r)
  1082. opset(AVLCG, r)
  1083. opset(AVLPB, r)
  1084. opset(AVLPH, r)
  1085. opset(AVLPF, r)
  1086. opset(AVLPG, r)
  1087. opset(AVPOPCT, r)
  1088. opset(AVSEGB, r)
  1089. opset(AVSEGH, r)
  1090. opset(AVSEGF, r)
  1091. case AVECG:
  1092. opset(AVECB, r)
  1093. opset(AVECH, r)
  1094. opset(AVECF, r)
  1095. opset(AVECLB, r)
  1096. opset(AVECLH, r)
  1097. opset(AVECLF, r)
  1098. opset(AVECLG, r)
  1099. opset(AWFCDB, r)
  1100. opset(AWFKDB, r)
  1101. case AVCEQG:
  1102. opset(AVCEQB, r)
  1103. opset(AVCEQH, r)
  1104. opset(AVCEQF, r)
  1105. opset(AVCEQBS, r)
  1106. opset(AVCEQHS, r)
  1107. opset(AVCEQFS, r)
  1108. opset(AVCEQGS, r)
  1109. opset(AVCHB, r)
  1110. opset(AVCHH, r)
  1111. opset(AVCHF, r)
  1112. opset(AVCHG, r)
  1113. opset(AVCHBS, r)
  1114. opset(AVCHHS, r)
  1115. opset(AVCHFS, r)
  1116. opset(AVCHGS, r)
  1117. opset(AVCHLB, r)
  1118. opset(AVCHLH, r)
  1119. opset(AVCHLF, r)
  1120. opset(AVCHLG, r)
  1121. opset(AVCHLBS, r)
  1122. opset(AVCHLHS, r)
  1123. opset(AVCHLFS, r)
  1124. opset(AVCHLGS, r)
  1125. case AVFAEF:
  1126. opset(AVFAEB, r)
  1127. opset(AVFAEH, r)
  1128. opset(AVFAEBS, r)
  1129. opset(AVFAEHS, r)
  1130. opset(AVFAEFS, r)
  1131. opset(AVFAEZB, r)
  1132. opset(AVFAEZH, r)
  1133. opset(AVFAEZF, r)
  1134. opset(AVFAEZBS, r)
  1135. opset(AVFAEZHS, r)
  1136. opset(AVFAEZFS, r)
  1137. opset(AVFEEB, r)
  1138. opset(AVFEEH, r)
  1139. opset(AVFEEF, r)
  1140. opset(AVFEEBS, r)
  1141. opset(AVFEEHS, r)
  1142. opset(AVFEEFS, r)
  1143. opset(AVFEEZB, r)
  1144. opset(AVFEEZH, r)
  1145. opset(AVFEEZF, r)
  1146. opset(AVFEEZBS, r)
  1147. opset(AVFEEZHS, r)
  1148. opset(AVFEEZFS, r)
  1149. opset(AVFENEB, r)
  1150. opset(AVFENEH, r)
  1151. opset(AVFENEF, r)
  1152. opset(AVFENEBS, r)
  1153. opset(AVFENEHS, r)
  1154. opset(AVFENEFS, r)
  1155. opset(AVFENEZB, r)
  1156. opset(AVFENEZH, r)
  1157. opset(AVFENEZF, r)
  1158. opset(AVFENEZBS, r)
  1159. opset(AVFENEZHS, r)
  1160. opset(AVFENEZFS, r)
  1161. case AVPKSG:
  1162. opset(AVPKSH, r)
  1163. opset(AVPKSF, r)
  1164. opset(AVPKSHS, r)
  1165. opset(AVPKSFS, r)
  1166. opset(AVPKSGS, r)
  1167. opset(AVPKLSH, r)
  1168. opset(AVPKLSF, r)
  1169. opset(AVPKLSG, r)
  1170. opset(AVPKLSHS, r)
  1171. opset(AVPKLSFS, r)
  1172. opset(AVPKLSGS, r)
  1173. case AVAQ:
  1174. opset(AVAB, r)
  1175. opset(AVAH, r)
  1176. opset(AVAF, r)
  1177. opset(AVAG, r)
  1178. opset(AVACCB, r)
  1179. opset(AVACCH, r)
  1180. opset(AVACCF, r)
  1181. opset(AVACCG, r)
  1182. opset(AVACCQ, r)
  1183. opset(AVN, r)
  1184. opset(AVNC, r)
  1185. opset(AVAVGB, r)
  1186. opset(AVAVGH, r)
  1187. opset(AVAVGF, r)
  1188. opset(AVAVGG, r)
  1189. opset(AVAVGLB, r)
  1190. opset(AVAVGLH, r)
  1191. opset(AVAVGLF, r)
  1192. opset(AVAVGLG, r)
  1193. opset(AVCKSM, r)
  1194. opset(AVX, r)
  1195. opset(AVFADB, r)
  1196. opset(AWFADB, r)
  1197. opset(AVFCEDB, r)
  1198. opset(AVFCEDBS, r)
  1199. opset(AWFCEDB, r)
  1200. opset(AWFCEDBS, r)
  1201. opset(AVFCHDB, r)
  1202. opset(AVFCHDBS, r)
  1203. opset(AWFCHDB, r)
  1204. opset(AWFCHDBS, r)
  1205. opset(AVFCHEDB, r)
  1206. opset(AVFCHEDBS, r)
  1207. opset(AWFCHEDB, r)
  1208. opset(AWFCHEDBS, r)
  1209. opset(AVFMDB, r)
  1210. opset(AWFMDB, r)
  1211. opset(AVGFMB, r)
  1212. opset(AVGFMH, r)
  1213. opset(AVGFMF, r)
  1214. opset(AVGFMG, r)
  1215. opset(AVMXB, r)
  1216. opset(AVMXH, r)
  1217. opset(AVMXF, r)
  1218. opset(AVMXG, r)
  1219. opset(AVMXLB, r)
  1220. opset(AVMXLH, r)
  1221. opset(AVMXLF, r)
  1222. opset(AVMXLG, r)
  1223. opset(AVMNB, r)
  1224. opset(AVMNH, r)
  1225. opset(AVMNF, r)
  1226. opset(AVMNG, r)
  1227. opset(AVMNLB, r)
  1228. opset(AVMNLH, r)
  1229. opset(AVMNLF, r)
  1230. opset(AVMNLG, r)
  1231. opset(AVMRHB, r)
  1232. opset(AVMRHH, r)
  1233. opset(AVMRHF, r)
  1234. opset(AVMRHG, r)
  1235. opset(AVMRLB, r)
  1236. opset(AVMRLH, r)
  1237. opset(AVMRLF, r)
  1238. opset(AVMRLG, r)
  1239. opset(AVMEB, r)
  1240. opset(AVMEH, r)
  1241. opset(AVMEF, r)
  1242. opset(AVMLEB, r)
  1243. opset(AVMLEH, r)
  1244. opset(AVMLEF, r)
  1245. opset(AVMOB, r)
  1246. opset(AVMOH, r)
  1247. opset(AVMOF, r)
  1248. opset(AVMLOB, r)
  1249. opset(AVMLOH, r)
  1250. opset(AVMLOF, r)
  1251. opset(AVMHB, r)
  1252. opset(AVMHH, r)
  1253. opset(AVMHF, r)
  1254. opset(AVMLHB, r)
  1255. opset(AVMLHH, r)
  1256. opset(AVMLHF, r)
  1257. opset(AVMLH, r)
  1258. opset(AVMLHW, r)
  1259. opset(AVMLF, r)
  1260. opset(AVNO, r)
  1261. opset(AVO, r)
  1262. opset(AVPKH, r)
  1263. opset(AVPKF, r)
  1264. opset(AVPKG, r)
  1265. opset(AVSUMGH, r)
  1266. opset(AVSUMGF, r)
  1267. opset(AVSUMQF, r)
  1268. opset(AVSUMQG, r)
  1269. opset(AVSUMB, r)
  1270. opset(AVSUMH, r)
  1271. case AVERLLVG:
  1272. opset(AVERLLVB, r)
  1273. opset(AVERLLVH, r)
  1274. opset(AVERLLVF, r)
  1275. opset(AVESLVB, r)
  1276. opset(AVESLVH, r)
  1277. opset(AVESLVF, r)
  1278. opset(AVESLVG, r)
  1279. opset(AVESRAVB, r)
  1280. opset(AVESRAVH, r)
  1281. opset(AVESRAVF, r)
  1282. opset(AVESRAVG, r)
  1283. opset(AVESRLVB, r)
  1284. opset(AVESRLVH, r)
  1285. opset(AVESRLVF, r)
  1286. opset(AVESRLVG, r)
  1287. opset(AVFDDB, r)
  1288. opset(AWFDDB, r)
  1289. opset(AVFSDB, r)
  1290. opset(AWFSDB, r)
  1291. opset(AVSL, r)
  1292. opset(AVSLB, r)
  1293. opset(AVSRA, r)
  1294. opset(AVSRAB, r)
  1295. opset(AVSRL, r)
  1296. opset(AVSRLB, r)
  1297. opset(AVSB, r)
  1298. opset(AVSH, r)
  1299. opset(AVSF, r)
  1300. opset(AVSG, r)
  1301. opset(AVSQ, r)
  1302. opset(AVSCBIB, r)
  1303. opset(AVSCBIH, r)
  1304. opset(AVSCBIF, r)
  1305. opset(AVSCBIG, r)
  1306. opset(AVSCBIQ, r)
  1307. case AVACQ:
  1308. opset(AVACCCQ, r)
  1309. opset(AVGFMAB, r)
  1310. opset(AVGFMAH, r)
  1311. opset(AVGFMAF, r)
  1312. opset(AVGFMAG, r)
  1313. opset(AVMALB, r)
  1314. opset(AVMALHW, r)
  1315. opset(AVMALF, r)
  1316. opset(AVMAHB, r)
  1317. opset(AVMAHH, r)
  1318. opset(AVMAHF, r)
  1319. opset(AVMALHB, r)
  1320. opset(AVMALHH, r)
  1321. opset(AVMALHF, r)
  1322. opset(AVMAEB, r)
  1323. opset(AVMAEH, r)
  1324. opset(AVMAEF, r)
  1325. opset(AVMALEB, r)
  1326. opset(AVMALEH, r)
  1327. opset(AVMALEF, r)
  1328. opset(AVMAOB, r)
  1329. opset(AVMAOH, r)
  1330. opset(AVMAOF, r)
  1331. opset(AVMALOB, r)
  1332. opset(AVMALOH, r)
  1333. opset(AVMALOF, r)
  1334. opset(AVSTRCB, r)
  1335. opset(AVSTRCH, r)
  1336. opset(AVSTRCF, r)
  1337. opset(AVSTRCBS, r)
  1338. opset(AVSTRCHS, r)
  1339. opset(AVSTRCFS, r)
  1340. opset(AVSTRCZB, r)
  1341. opset(AVSTRCZH, r)
  1342. opset(AVSTRCZF, r)
  1343. opset(AVSTRCZBS, r)
  1344. opset(AVSTRCZHS, r)
  1345. opset(AVSTRCZFS, r)
  1346. opset(AVSBCBIQ, r)
  1347. opset(AVSBIQ, r)
  1348. opset(AVMSLG, r)
  1349. opset(AVMSLEG, r)
  1350. opset(AVMSLOG, r)
  1351. opset(AVMSLEOG, r)
  1352. case AVSEL:
  1353. opset(AVFMADB, r)
  1354. opset(AWFMADB, r)
  1355. opset(AVFMSDB, r)
  1356. opset(AWFMSDB, r)
  1357. opset(AVPERM, r)
  1358. }
  1359. }
  1360. }
  1361. const (
  1362. op_A uint32 = 0x5A00 // FORMAT_RX1 ADD (32)
  1363. op_AD uint32 = 0x6A00 // FORMAT_RX1 ADD NORMALIZED (long HFP)
  1364. op_ADB uint32 = 0xED1A // FORMAT_RXE ADD (long BFP)
  1365. op_ADBR uint32 = 0xB31A // FORMAT_RRE ADD (long BFP)
  1366. op_ADR uint32 = 0x2A00 // FORMAT_RR ADD NORMALIZED (long HFP)
  1367. op_ADTR uint32 = 0xB3D2 // FORMAT_RRF1 ADD (long DFP)
  1368. op_ADTRA uint32 = 0xB3D2 // FORMAT_RRF1 ADD (long DFP)
  1369. op_AE uint32 = 0x7A00 // FORMAT_RX1 ADD NORMALIZED (short HFP)
  1370. op_AEB uint32 = 0xED0A // FORMAT_RXE ADD (short BFP)
  1371. op_AEBR uint32 = 0xB30A // FORMAT_RRE ADD (short BFP)
  1372. op_AER uint32 = 0x3A00 // FORMAT_RR ADD NORMALIZED (short HFP)
  1373. op_AFI uint32 = 0xC209 // FORMAT_RIL1 ADD IMMEDIATE (32)
  1374. op_AG uint32 = 0xE308 // FORMAT_RXY1 ADD (64)
  1375. op_AGF uint32 = 0xE318 // FORMAT_RXY1 ADD (64<-32)
  1376. op_AGFI uint32 = 0xC208 // FORMAT_RIL1 ADD IMMEDIATE (64<-32)
  1377. op_AGFR uint32 = 0xB918 // FORMAT_RRE ADD (64<-32)
  1378. op_AGHI uint32 = 0xA70B // FORMAT_RI1 ADD HALFWORD IMMEDIATE (64)
  1379. op_AGHIK uint32 = 0xECD9 // FORMAT_RIE4 ADD IMMEDIATE (64<-16)
  1380. op_AGR uint32 = 0xB908 // FORMAT_RRE ADD (64)
  1381. op_AGRK uint32 = 0xB9E8 // FORMAT_RRF1 ADD (64)
  1382. op_AGSI uint32 = 0xEB7A // FORMAT_SIY ADD IMMEDIATE (64<-8)
  1383. op_AH uint32 = 0x4A00 // FORMAT_RX1 ADD HALFWORD
  1384. op_AHHHR uint32 = 0xB9C8 // FORMAT_RRF1 ADD HIGH (32)
  1385. op_AHHLR uint32 = 0xB9D8 // FORMAT_RRF1 ADD HIGH (32)
  1386. op_AHI uint32 = 0xA70A // FORMAT_RI1 ADD HALFWORD IMMEDIATE (32)
  1387. op_AHIK uint32 = 0xECD8 // FORMAT_RIE4 ADD IMMEDIATE (32<-16)
  1388. op_AHY uint32 = 0xE37A // FORMAT_RXY1 ADD HALFWORD
  1389. op_AIH uint32 = 0xCC08 // FORMAT_RIL1 ADD IMMEDIATE HIGH (32)
  1390. op_AL uint32 = 0x5E00 // FORMAT_RX1 ADD LOGICAL (32)
  1391. op_ALC uint32 = 0xE398 // FORMAT_RXY1 ADD LOGICAL WITH CARRY (32)
  1392. op_ALCG uint32 = 0xE388 // FORMAT_RXY1 ADD LOGICAL WITH CARRY (64)
  1393. op_ALCGR uint32 = 0xB988 // FORMAT_RRE ADD LOGICAL WITH CARRY (64)
  1394. op_ALCR uint32 = 0xB998 // FORMAT_RRE ADD LOGICAL WITH CARRY (32)
  1395. op_ALFI uint32 = 0xC20B // FORMAT_RIL1 ADD LOGICAL IMMEDIATE (32)
  1396. op_ALG uint32 = 0xE30A // FORMAT_RXY1 ADD LOGICAL (64)
  1397. op_ALGF uint32 = 0xE31A // FORMAT_RXY1 ADD LOGICAL (64<-32)
  1398. op_ALGFI uint32 = 0xC20A // FORMAT_RIL1 ADD LOGICAL IMMEDIATE (64<-32)
  1399. op_ALGFR uint32 = 0xB91A // FORMAT_RRE ADD LOGICAL (64<-32)
  1400. op_ALGHSIK uint32 = 0xECDB // FORMAT_RIE4 ADD LOGICAL WITH SIGNED IMMEDIATE (64<-16)
  1401. op_ALGR uint32 = 0xB90A // FORMAT_RRE ADD LOGICAL (64)
  1402. op_ALGRK uint32 = 0xB9EA // FORMAT_RRF1 ADD LOGICAL (64)
  1403. op_ALGSI uint32 = 0xEB7E // FORMAT_SIY ADD LOGICAL WITH SIGNED IMMEDIATE (64<-8)
  1404. op_ALHHHR uint32 = 0xB9CA // FORMAT_RRF1 ADD LOGICAL HIGH (32)
  1405. op_ALHHLR uint32 = 0xB9DA // FORMAT_RRF1 ADD LOGICAL HIGH (32)
  1406. op_ALHSIK uint32 = 0xECDA // FORMAT_RIE4 ADD LOGICAL WITH SIGNED IMMEDIATE (32<-16)
  1407. op_ALR uint32 = 0x1E00 // FORMAT_RR ADD LOGICAL (32)
  1408. op_ALRK uint32 = 0xB9FA // FORMAT_RRF1 ADD LOGICAL (32)
  1409. op_ALSI uint32 = 0xEB6E // FORMAT_SIY ADD LOGICAL WITH SIGNED IMMEDIATE (32<-8)
  1410. op_ALSIH uint32 = 0xCC0A // FORMAT_RIL1 ADD LOGICAL WITH SIGNED IMMEDIATE HIGH (32)
  1411. op_ALSIHN uint32 = 0xCC0B // FORMAT_RIL1 ADD LOGICAL WITH SIGNED IMMEDIATE HIGH (32)
  1412. op_ALY uint32 = 0xE35E // FORMAT_RXY1 ADD LOGICAL (32)
  1413. op_AP uint32 = 0xFA00 // FORMAT_SS2 ADD DECIMAL
  1414. op_AR uint32 = 0x1A00 // FORMAT_RR ADD (32)
  1415. op_ARK uint32 = 0xB9F8 // FORMAT_RRF1 ADD (32)
  1416. op_ASI uint32 = 0xEB6A // FORMAT_SIY ADD IMMEDIATE (32<-8)
  1417. op_AU uint32 = 0x7E00 // FORMAT_RX1 ADD UNNORMALIZED (short HFP)
  1418. op_AUR uint32 = 0x3E00 // FORMAT_RR ADD UNNORMALIZED (short HFP)
  1419. op_AW uint32 = 0x6E00 // FORMAT_RX1 ADD UNNORMALIZED (long HFP)
  1420. op_AWR uint32 = 0x2E00 // FORMAT_RR ADD UNNORMALIZED (long HFP)
  1421. op_AXBR uint32 = 0xB34A // FORMAT_RRE ADD (extended BFP)
  1422. op_AXR uint32 = 0x3600 // FORMAT_RR ADD NORMALIZED (extended HFP)
  1423. op_AXTR uint32 = 0xB3DA // FORMAT_RRF1 ADD (extended DFP)
  1424. op_AXTRA uint32 = 0xB3DA // FORMAT_RRF1 ADD (extended DFP)
  1425. op_AY uint32 = 0xE35A // FORMAT_RXY1 ADD (32)
  1426. op_BAKR uint32 = 0xB240 // FORMAT_RRE BRANCH AND STACK
  1427. op_BAL uint32 = 0x4500 // FORMAT_RX1 BRANCH AND LINK
  1428. op_BALR uint32 = 0x0500 // FORMAT_RR BRANCH AND LINK
  1429. op_BAS uint32 = 0x4D00 // FORMAT_RX1 BRANCH AND SAVE
  1430. op_BASR uint32 = 0x0D00 // FORMAT_RR BRANCH AND SAVE
  1431. op_BASSM uint32 = 0x0C00 // FORMAT_RR BRANCH AND SAVE AND SET MODE
  1432. op_BC uint32 = 0x4700 // FORMAT_RX2 BRANCH ON CONDITION
  1433. op_BCR uint32 = 0x0700 // FORMAT_RR BRANCH ON CONDITION
  1434. op_BCT uint32 = 0x4600 // FORMAT_RX1 BRANCH ON COUNT (32)
  1435. op_BCTG uint32 = 0xE346 // FORMAT_RXY1 BRANCH ON COUNT (64)
  1436. op_BCTGR uint32 = 0xB946 // FORMAT_RRE BRANCH ON COUNT (64)
  1437. op_BCTR uint32 = 0x0600 // FORMAT_RR BRANCH ON COUNT (32)
  1438. op_BPP uint32 = 0xC700 // FORMAT_SMI BRANCH PREDICTION PRELOAD
  1439. op_BPRP uint32 = 0xC500 // FORMAT_MII BRANCH PREDICTION RELATIVE PRELOAD
  1440. op_BRAS uint32 = 0xA705 // FORMAT_RI2 BRANCH RELATIVE AND SAVE
  1441. op_BRASL uint32 = 0xC005 // FORMAT_RIL2 BRANCH RELATIVE AND SAVE LONG
  1442. op_BRC uint32 = 0xA704 // FORMAT_RI3 BRANCH RELATIVE ON CONDITION
  1443. op_BRCL uint32 = 0xC004 // FORMAT_RIL3 BRANCH RELATIVE ON CONDITION LONG
  1444. op_BRCT uint32 = 0xA706 // FORMAT_RI2 BRANCH RELATIVE ON COUNT (32)
  1445. op_BRCTG uint32 = 0xA707 // FORMAT_RI2 BRANCH RELATIVE ON COUNT (64)
  1446. op_BRCTH uint32 = 0xCC06 // FORMAT_RIL2 BRANCH RELATIVE ON COUNT HIGH (32)
  1447. op_BRXH uint32 = 0x8400 // FORMAT_RSI BRANCH RELATIVE ON INDEX HIGH (32)
  1448. op_BRXHG uint32 = 0xEC44 // FORMAT_RIE5 BRANCH RELATIVE ON INDEX HIGH (64)
  1449. op_BRXLE uint32 = 0x8500 // FORMAT_RSI BRANCH RELATIVE ON INDEX LOW OR EQ. (32)
  1450. op_BRXLG uint32 = 0xEC45 // FORMAT_RIE5 BRANCH RELATIVE ON INDEX LOW OR EQ. (64)
  1451. op_BSA uint32 = 0xB25A // FORMAT_RRE BRANCH AND SET AUTHORITY
  1452. op_BSG uint32 = 0xB258 // FORMAT_RRE BRANCH IN SUBSPACE GROUP
  1453. op_BSM uint32 = 0x0B00 // FORMAT_RR BRANCH AND SET MODE
  1454. op_BXH uint32 = 0x8600 // FORMAT_RS1 BRANCH ON INDEX HIGH (32)
  1455. op_BXHG uint32 = 0xEB44 // FORMAT_RSY1 BRANCH ON INDEX HIGH (64)
  1456. op_BXLE uint32 = 0x8700 // FORMAT_RS1 BRANCH ON INDEX LOW OR EQUAL (32)
  1457. op_BXLEG uint32 = 0xEB45 // FORMAT_RSY1 BRANCH ON INDEX LOW OR EQUAL (64)
  1458. op_C uint32 = 0x5900 // FORMAT_RX1 COMPARE (32)
  1459. op_CD uint32 = 0x6900 // FORMAT_RX1 COMPARE (long HFP)
  1460. op_CDB uint32 = 0xED19 // FORMAT_RXE COMPARE (long BFP)
  1461. op_CDBR uint32 = 0xB319 // FORMAT_RRE COMPARE (long BFP)
  1462. op_CDFBR uint32 = 0xB395 // FORMAT_RRE CONVERT FROM FIXED (32 to long BFP)
  1463. op_CDFBRA uint32 = 0xB395 // FORMAT_RRF5 CONVERT FROM FIXED (32 to long BFP)
  1464. op_CDFR uint32 = 0xB3B5 // FORMAT_RRE CONVERT FROM FIXED (32 to long HFP)
  1465. op_CDFTR uint32 = 0xB951 // FORMAT_RRE CONVERT FROM FIXED (32 to long DFP)
  1466. op_CDGBR uint32 = 0xB3A5 // FORMAT_RRE CONVERT FROM FIXED (64 to long BFP)
  1467. op_CDGBRA uint32 = 0xB3A5 // FORMAT_RRF5 CONVERT FROM FIXED (64 to long BFP)
  1468. op_CDGR uint32 = 0xB3C5 // FORMAT_RRE CONVERT FROM FIXED (64 to long HFP)
  1469. op_CDGTR uint32 = 0xB3F1 // FORMAT_RRE CONVERT FROM FIXED (64 to long DFP)
  1470. op_CDGTRA uint32 = 0xB3F1 // FORMAT_RRF5 CONVERT FROM FIXED (64 to long DFP)
  1471. op_CDLFBR uint32 = 0xB391 // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to long BFP)
  1472. op_CDLFTR uint32 = 0xB953 // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to long DFP)
  1473. op_CDLGBR uint32 = 0xB3A1 // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to long BFP)
  1474. op_CDLGTR uint32 = 0xB952 // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to long DFP)
  1475. op_CDR uint32 = 0x2900 // FORMAT_RR COMPARE (long HFP)
  1476. op_CDS uint32 = 0xBB00 // FORMAT_RS1 COMPARE DOUBLE AND SWAP (32)
  1477. op_CDSG uint32 = 0xEB3E // FORMAT_RSY1 COMPARE DOUBLE AND SWAP (64)
  1478. op_CDSTR uint32 = 0xB3F3 // FORMAT_RRE CONVERT FROM SIGNED PACKED (64 to long DFP)
  1479. op_CDSY uint32 = 0xEB31 // FORMAT_RSY1 COMPARE DOUBLE AND SWAP (32)
  1480. op_CDTR uint32 = 0xB3E4 // FORMAT_RRE COMPARE (long DFP)
  1481. op_CDUTR uint32 = 0xB3F2 // FORMAT_RRE CONVERT FROM UNSIGNED PACKED (64 to long DFP)
  1482. op_CDZT uint32 = 0xEDAA // FORMAT_RSL CONVERT FROM ZONED (to long DFP)
  1483. op_CE uint32 = 0x7900 // FORMAT_RX1 COMPARE (short HFP)
  1484. op_CEB uint32 = 0xED09 // FORMAT_RXE COMPARE (short BFP)
  1485. op_CEBR uint32 = 0xB309 // FORMAT_RRE COMPARE (short BFP)
  1486. op_CEDTR uint32 = 0xB3F4 // FORMAT_RRE COMPARE BIASED EXPONENT (long DFP)
  1487. op_CEFBR uint32 = 0xB394 // FORMAT_RRE CONVERT FROM FIXED (32 to short BFP)
  1488. op_CEFBRA uint32 = 0xB394 // FORMAT_RRF5 CONVERT FROM FIXED (32 to short BFP)
  1489. op_CEFR uint32 = 0xB3B4 // FORMAT_RRE CONVERT FROM FIXED (32 to short HFP)
  1490. op_CEGBR uint32 = 0xB3A4 // FORMAT_RRE CONVERT FROM FIXED (64 to short BFP)
  1491. op_CEGBRA uint32 = 0xB3A4 // FORMAT_RRF5 CONVERT FROM FIXED (64 to short BFP)
  1492. op_CEGR uint32 = 0xB3C4 // FORMAT_RRE CONVERT FROM FIXED (64 to short HFP)
  1493. op_CELFBR uint32 = 0xB390 // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to short BFP)
  1494. op_CELGBR uint32 = 0xB3A0 // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to short BFP)
  1495. op_CER uint32 = 0x3900 // FORMAT_RR COMPARE (short HFP)
  1496. op_CEXTR uint32 = 0xB3FC // FORMAT_RRE COMPARE BIASED EXPONENT (extended DFP)
  1497. op_CFC uint32 = 0xB21A // FORMAT_S COMPARE AND FORM CODEWORD
  1498. op_CFDBR uint32 = 0xB399 // FORMAT_RRF5 CONVERT TO FIXED (long BFP to 32)
  1499. op_CFDBRA uint32 = 0xB399 // FORMAT_RRF5 CONVERT TO FIXED (long BFP to 32)
  1500. op_CFDR uint32 = 0xB3B9 // FORMAT_RRF5 CONVERT TO FIXED (long HFP to 32)
  1501. op_CFDTR uint32 = 0xB941 // FORMAT_RRF5 CONVERT TO FIXED (long DFP to 32)
  1502. op_CFEBR uint32 = 0xB398 // FORMAT_RRF5 CONVERT TO FIXED (short BFP to 32)
  1503. op_CFEBRA uint32 = 0xB398 // FORMAT_RRF5 CONVERT TO FIXED (short BFP to 32)
  1504. op_CFER uint32 = 0xB3B8 // FORMAT_RRF5 CONVERT TO FIXED (short HFP to 32)
  1505. op_CFI uint32 = 0xC20D // FORMAT_RIL1 COMPARE IMMEDIATE (32)
  1506. op_CFXBR uint32 = 0xB39A // FORMAT_RRF5 CONVERT TO FIXED (extended BFP to 32)
  1507. op_CFXBRA uint32 = 0xB39A // FORMAT_RRF5 CONVERT TO FIXED (extended BFP to 32)
  1508. op_CFXR uint32 = 0xB3BA // FORMAT_RRF5 CONVERT TO FIXED (extended HFP to 32)
  1509. op_CFXTR uint32 = 0xB949 // FORMAT_RRF5 CONVERT TO FIXED (extended DFP to 32)
  1510. op_CG uint32 = 0xE320 // FORMAT_RXY1 COMPARE (64)
  1511. op_CGDBR uint32 = 0xB3A9 // FORMAT_RRF5 CONVERT TO FIXED (long BFP to 64)
  1512. op_CGDBRA uint32 = 0xB3A9 // FORMAT_RRF5 CONVERT TO FIXED (long BFP to 64)
  1513. op_CGDR uint32 = 0xB3C9 // FORMAT_RRF5 CONVERT TO FIXED (long HFP to 64)
  1514. op_CGDTR uint32 = 0xB3E1 // FORMAT_RRF5 CONVERT TO FIXED (long DFP to 64)
  1515. op_CGDTRA uint32 = 0xB3E1 // FORMAT_RRF5 CONVERT TO FIXED (long DFP to 64)
  1516. op_CGEBR uint32 = 0xB3A8 // FORMAT_RRF5 CONVERT TO FIXED (short BFP to 64)
  1517. op_CGEBRA uint32 = 0xB3A8 // FORMAT_RRF5 CONVERT TO FIXED (short BFP to 64)
  1518. op_CGER uint32 = 0xB3C8 // FORMAT_RRF5 CONVERT TO FIXED (short HFP to 64)
  1519. op_CGF uint32 = 0xE330 // FORMAT_RXY1 COMPARE (64<-32)
  1520. op_CGFI uint32 = 0xC20C // FORMAT_RIL1 COMPARE IMMEDIATE (64<-32)
  1521. op_CGFR uint32 = 0xB930 // FORMAT_RRE COMPARE (64<-32)
  1522. op_CGFRL uint32 = 0xC60C // FORMAT_RIL2 COMPARE RELATIVE LONG (64<-32)
  1523. op_CGH uint32 = 0xE334 // FORMAT_RXY1 COMPARE HALFWORD (64<-16)
  1524. op_CGHI uint32 = 0xA70F // FORMAT_RI1 COMPARE HALFWORD IMMEDIATE (64<-16)
  1525. op_CGHRL uint32 = 0xC604 // FORMAT_RIL2 COMPARE HALFWORD RELATIVE LONG (64<-16)
  1526. op_CGHSI uint32 = 0xE558 // FORMAT_SIL COMPARE HALFWORD IMMEDIATE (64<-16)
  1527. op_CGIB uint32 = 0xECFC // FORMAT_RIS COMPARE IMMEDIATE AND BRANCH (64<-8)
  1528. op_CGIJ uint32 = 0xEC7C // FORMAT_RIE3 COMPARE IMMEDIATE AND BRANCH RELATIVE (64<-8)
  1529. op_CGIT uint32 = 0xEC70 // FORMAT_RIE1 COMPARE IMMEDIATE AND TRAP (64<-16)
  1530. op_CGR uint32 = 0xB920 // FORMAT_RRE COMPARE (64)
  1531. op_CGRB uint32 = 0xECE4 // FORMAT_RRS COMPARE AND BRANCH (64)
  1532. op_CGRJ uint32 = 0xEC64 // FORMAT_RIE2 COMPARE AND BRANCH RELATIVE (64)
  1533. op_CGRL uint32 = 0xC608 // FORMAT_RIL2 COMPARE RELATIVE LONG (64)
  1534. op_CGRT uint32 = 0xB960 // FORMAT_RRF3 COMPARE AND TRAP (64)
  1535. op_CGXBR uint32 = 0xB3AA // FORMAT_RRF5 CONVERT TO FIXED (extended BFP to 64)
  1536. op_CGXBRA uint32 = 0xB3AA // FORMAT_RRF5 CONVERT TO FIXED (extended BFP to 64)
  1537. op_CGXR uint32 = 0xB3CA // FORMAT_RRF5 CONVERT TO FIXED (extended HFP to 64)
  1538. op_CGXTR uint32 = 0xB3E9 // FORMAT_RRF5 CONVERT TO FIXED (extended DFP to 64)
  1539. op_CGXTRA uint32 = 0xB3E9 // FORMAT_RRF5 CONVERT TO FIXED (extended DFP to 64)
  1540. op_CH uint32 = 0x4900 // FORMAT_RX1 COMPARE HALFWORD (32<-16)
  1541. op_CHF uint32 = 0xE3CD // FORMAT_RXY1 COMPARE HIGH (32)
  1542. op_CHHR uint32 = 0xB9CD // FORMAT_RRE COMPARE HIGH (32)
  1543. op_CHHSI uint32 = 0xE554 // FORMAT_SIL COMPARE HALFWORD IMMEDIATE (16)
  1544. op_CHI uint32 = 0xA70E // FORMAT_RI1 COMPARE HALFWORD IMMEDIATE (32<-16)
  1545. op_CHLR uint32 = 0xB9DD // FORMAT_RRE COMPARE HIGH (32)
  1546. op_CHRL uint32 = 0xC605 // FORMAT_RIL2 COMPARE HALFWORD RELATIVE LONG (32<-16)
  1547. op_CHSI uint32 = 0xE55C // FORMAT_SIL COMPARE HALFWORD IMMEDIATE (32<-16)
  1548. op_CHY uint32 = 0xE379 // FORMAT_RXY1 COMPARE HALFWORD (32<-16)
  1549. op_CIB uint32 = 0xECFE // FORMAT_RIS COMPARE IMMEDIATE AND BRANCH (32<-8)
  1550. op_CIH uint32 = 0xCC0D // FORMAT_RIL1 COMPARE IMMEDIATE HIGH (32)
  1551. op_CIJ uint32 = 0xEC7E // FORMAT_RIE3 COMPARE IMMEDIATE AND BRANCH RELATIVE (32<-8)
  1552. op_CIT uint32 = 0xEC72 // FORMAT_RIE1 COMPARE IMMEDIATE AND TRAP (32<-16)
  1553. op_CKSM uint32 = 0xB241 // FORMAT_RRE CHECKSUM
  1554. op_CL uint32 = 0x5500 // FORMAT_RX1 COMPARE LOGICAL (32)
  1555. op_CLC uint32 = 0xD500 // FORMAT_SS1 COMPARE LOGICAL (character)
  1556. op_CLCL uint32 = 0x0F00 // FORMAT_RR COMPARE LOGICAL LONG
  1557. op_CLCLE uint32 = 0xA900 // FORMAT_RS1 COMPARE LOGICAL LONG EXTENDED
  1558. op_CLCLU uint32 = 0xEB8F // FORMAT_RSY1 COMPARE LOGICAL LONG UNICODE
  1559. op_CLFDBR uint32 = 0xB39D // FORMAT_RRF5 CONVERT TO LOGICAL (long BFP to 32)
  1560. op_CLFDTR uint32 = 0xB943 // FORMAT_RRF5 CONVERT TO LOGICAL (long DFP to 32)
  1561. op_CLFEBR uint32 = 0xB39C // FORMAT_RRF5 CONVERT TO LOGICAL (short BFP to 32)
  1562. op_CLFHSI uint32 = 0xE55D // FORMAT_SIL COMPARE LOGICAL IMMEDIATE (32<-16)
  1563. op_CLFI uint32 = 0xC20F // FORMAT_RIL1 COMPARE LOGICAL IMMEDIATE (32)
  1564. op_CLFIT uint32 = 0xEC73 // FORMAT_RIE1 COMPARE LOGICAL IMMEDIATE AND TRAP (32<-16)
  1565. op_CLFXBR uint32 = 0xB39E // FORMAT_RRF5 CONVERT TO LOGICAL (extended BFP to 32)
  1566. op_CLFXTR uint32 = 0xB94B // FORMAT_RRF5 CONVERT TO LOGICAL (extended DFP to 32)
  1567. op_CLG uint32 = 0xE321 // FORMAT_RXY1 COMPARE LOGICAL (64)
  1568. op_CLGDBR uint32 = 0xB3AD // FORMAT_RRF5 CONVERT TO LOGICAL (long BFP to 64)
  1569. op_CLGDTR uint32 = 0xB942 // FORMAT_RRF5 CONVERT TO LOGICAL (long DFP to 64)
  1570. op_CLGEBR uint32 = 0xB3AC // FORMAT_RRF5 CONVERT TO LOGICAL (short BFP to 64)
  1571. op_CLGF uint32 = 0xE331 // FORMAT_RXY1 COMPARE LOGICAL (64<-32)
  1572. op_CLGFI uint32 = 0xC20E // FORMAT_RIL1 COMPARE LOGICAL IMMEDIATE (64<-32)
  1573. op_CLGFR uint32 = 0xB931 // FORMAT_RRE COMPARE LOGICAL (64<-32)
  1574. op_CLGFRL uint32 = 0xC60E // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (64<-32)
  1575. op_CLGHRL uint32 = 0xC606 // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (64<-16)
  1576. op_CLGHSI uint32 = 0xE559 // FORMAT_SIL COMPARE LOGICAL IMMEDIATE (64<-16)
  1577. op_CLGIB uint32 = 0xECFD // FORMAT_RIS COMPARE LOGICAL IMMEDIATE AND BRANCH (64<-8)
  1578. op_CLGIJ uint32 = 0xEC7D // FORMAT_RIE3 COMPARE LOGICAL IMMEDIATE AND BRANCH RELATIVE (64<-8)
  1579. op_CLGIT uint32 = 0xEC71 // FORMAT_RIE1 COMPARE LOGICAL IMMEDIATE AND TRAP (64<-16)
  1580. op_CLGR uint32 = 0xB921 // FORMAT_RRE COMPARE LOGICAL (64)
  1581. op_CLGRB uint32 = 0xECE5 // FORMAT_RRS COMPARE LOGICAL AND BRANCH (64)
  1582. op_CLGRJ uint32 = 0xEC65 // FORMAT_RIE2 COMPARE LOGICAL AND BRANCH RELATIVE (64)
  1583. op_CLGRL uint32 = 0xC60A // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (64)
  1584. op_CLGRT uint32 = 0xB961 // FORMAT_RRF3 COMPARE LOGICAL AND TRAP (64)
  1585. op_CLGT uint32 = 0xEB2B // FORMAT_RSY2 COMPARE LOGICAL AND TRAP (64)
  1586. op_CLGXBR uint32 = 0xB3AE // FORMAT_RRF5 CONVERT TO LOGICAL (extended BFP to 64)
  1587. op_CLGXTR uint32 = 0xB94A // FORMAT_RRF5 CONVERT TO LOGICAL (extended DFP to 64)
  1588. op_CLHF uint32 = 0xE3CF // FORMAT_RXY1 COMPARE LOGICAL HIGH (32)
  1589. op_CLHHR uint32 = 0xB9CF // FORMAT_RRE COMPARE LOGICAL HIGH (32)
  1590. op_CLHHSI uint32 = 0xE555 // FORMAT_SIL COMPARE LOGICAL IMMEDIATE (16)
  1591. op_CLHLR uint32 = 0xB9DF // FORMAT_RRE COMPARE LOGICAL HIGH (32)
  1592. op_CLHRL uint32 = 0xC607 // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (32<-16)
  1593. op_CLI uint32 = 0x9500 // FORMAT_SI COMPARE LOGICAL (immediate)
  1594. op_CLIB uint32 = 0xECFF // FORMAT_RIS COMPARE LOGICAL IMMEDIATE AND BRANCH (32<-8)
  1595. op_CLIH uint32 = 0xCC0F // FORMAT_RIL1 COMPARE LOGICAL IMMEDIATE HIGH (32)
  1596. op_CLIJ uint32 = 0xEC7F // FORMAT_RIE3 COMPARE LOGICAL IMMEDIATE AND BRANCH RELATIVE (32<-8)
  1597. op_CLIY uint32 = 0xEB55 // FORMAT_SIY COMPARE LOGICAL (immediate)
  1598. op_CLM uint32 = 0xBD00 // FORMAT_RS2 COMPARE LOGICAL CHAR. UNDER MASK (low)
  1599. op_CLMH uint32 = 0xEB20 // FORMAT_RSY2 COMPARE LOGICAL CHAR. UNDER MASK (high)
  1600. op_CLMY uint32 = 0xEB21 // FORMAT_RSY2 COMPARE LOGICAL CHAR. UNDER MASK (low)
  1601. op_CLR uint32 = 0x1500 // FORMAT_RR COMPARE LOGICAL (32)
  1602. op_CLRB uint32 = 0xECF7 // FORMAT_RRS COMPARE LOGICAL AND BRANCH (32)
  1603. op_CLRJ uint32 = 0xEC77 // FORMAT_RIE2 COMPARE LOGICAL AND BRANCH RELATIVE (32)
  1604. op_CLRL uint32 = 0xC60F // FORMAT_RIL2 COMPARE LOGICAL RELATIVE LONG (32)
  1605. op_CLRT uint32 = 0xB973 // FORMAT_RRF3 COMPARE LOGICAL AND TRAP (32)
  1606. op_CLST uint32 = 0xB25D // FORMAT_RRE COMPARE LOGICAL STRING
  1607. op_CLT uint32 = 0xEB23 // FORMAT_RSY2 COMPARE LOGICAL AND TRAP (32)
  1608. op_CLY uint32 = 0xE355 // FORMAT_RXY1 COMPARE LOGICAL (32)
  1609. op_CMPSC uint32 = 0xB263 // FORMAT_RRE COMPRESSION CALL
  1610. op_CP uint32 = 0xF900 // FORMAT_SS2 COMPARE DECIMAL
  1611. op_CPSDR uint32 = 0xB372 // FORMAT_RRF2 COPY SIGN (long)
  1612. op_CPYA uint32 = 0xB24D // FORMAT_RRE COPY ACCESS
  1613. op_CR uint32 = 0x1900 // FORMAT_RR COMPARE (32)
  1614. op_CRB uint32 = 0xECF6 // FORMAT_RRS COMPARE AND BRANCH (32)
  1615. op_CRDTE uint32 = 0xB98F // FORMAT_RRF2 COMPARE AND REPLACE DAT TABLE ENTRY
  1616. op_CRJ uint32 = 0xEC76 // FORMAT_RIE2 COMPARE AND BRANCH RELATIVE (32)
  1617. op_CRL uint32 = 0xC60D // FORMAT_RIL2 COMPARE RELATIVE LONG (32)
  1618. op_CRT uint32 = 0xB972 // FORMAT_RRF3 COMPARE AND TRAP (32)
  1619. op_CS uint32 = 0xBA00 // FORMAT_RS1 COMPARE AND SWAP (32)
  1620. op_CSCH uint32 = 0xB230 // FORMAT_S CLEAR SUBCHANNEL
  1621. op_CSDTR uint32 = 0xB3E3 // FORMAT_RRF4 CONVERT TO SIGNED PACKED (long DFP to 64)
  1622. op_CSG uint32 = 0xEB30 // FORMAT_RSY1 COMPARE AND SWAP (64)
  1623. op_CSP uint32 = 0xB250 // FORMAT_RRE COMPARE AND SWAP AND PURGE
  1624. op_CSPG uint32 = 0xB98A // FORMAT_RRE COMPARE AND SWAP AND PURGE
  1625. op_CSST uint32 = 0xC802 // FORMAT_SSF COMPARE AND SWAP AND STORE
  1626. op_CSXTR uint32 = 0xB3EB // FORMAT_RRF4 CONVERT TO SIGNED PACKED (extended DFP to 128)
  1627. op_CSY uint32 = 0xEB14 // FORMAT_RSY1 COMPARE AND SWAP (32)
  1628. op_CU12 uint32 = 0xB2A7 // FORMAT_RRF3 CONVERT UTF-8 TO UTF-16
  1629. op_CU14 uint32 = 0xB9B0 // FORMAT_RRF3 CONVERT UTF-8 TO UTF-32
  1630. op_CU21 uint32 = 0xB2A6 // FORMAT_RRF3 CONVERT UTF-16 TO UTF-8
  1631. op_CU24 uint32 = 0xB9B1 // FORMAT_RRF3 CONVERT UTF-16 TO UTF-32
  1632. op_CU41 uint32 = 0xB9B2 // FORMAT_RRE CONVERT UTF-32 TO UTF-8
  1633. op_CU42 uint32 = 0xB9B3 // FORMAT_RRE CONVERT UTF-32 TO UTF-16
  1634. op_CUDTR uint32 = 0xB3E2 // FORMAT_RRE CONVERT TO UNSIGNED PACKED (long DFP to 64)
  1635. op_CUSE uint32 = 0xB257 // FORMAT_RRE COMPARE UNTIL SUBSTRING EQUAL
  1636. op_CUTFU uint32 = 0xB2A7 // FORMAT_RRF3 CONVERT UTF-8 TO UNICODE
  1637. op_CUUTF uint32 = 0xB2A6 // FORMAT_RRF3 CONVERT UNICODE TO UTF-8
  1638. op_CUXTR uint32 = 0xB3EA // FORMAT_RRE CONVERT TO UNSIGNED PACKED (extended DFP to 128)
  1639. op_CVB uint32 = 0x4F00 // FORMAT_RX1 CONVERT TO BINARY (32)
  1640. op_CVBG uint32 = 0xE30E // FORMAT_RXY1 CONVERT TO BINARY (64)
  1641. op_CVBY uint32 = 0xE306 // FORMAT_RXY1 CONVERT TO BINARY (32)
  1642. op_CVD uint32 = 0x4E00 // FORMAT_RX1 CONVERT TO DECIMAL (32)
  1643. op_CVDG uint32 = 0xE32E // FORMAT_RXY1 CONVERT TO DECIMAL (64)
  1644. op_CVDY uint32 = 0xE326 // FORMAT_RXY1 CONVERT TO DECIMAL (32)
  1645. op_CXBR uint32 = 0xB349 // FORMAT_RRE COMPARE (extended BFP)
  1646. op_CXFBR uint32 = 0xB396 // FORMAT_RRE CONVERT FROM FIXED (32 to extended BFP)
  1647. op_CXFBRA uint32 = 0xB396 // FORMAT_RRF5 CONVERT FROM FIXED (32 to extended BFP)
  1648. op_CXFR uint32 = 0xB3B6 // FORMAT_RRE CONVERT FROM FIXED (32 to extended HFP)
  1649. op_CXFTR uint32 = 0xB959 // FORMAT_RRE CONVERT FROM FIXED (32 to extended DFP)
  1650. op_CXGBR uint32 = 0xB3A6 // FORMAT_RRE CONVERT FROM FIXED (64 to extended BFP)
  1651. op_CXGBRA uint32 = 0xB3A6 // FORMAT_RRF5 CONVERT FROM FIXED (64 to extended BFP)
  1652. op_CXGR uint32 = 0xB3C6 // FORMAT_RRE CONVERT FROM FIXED (64 to extended HFP)
  1653. op_CXGTR uint32 = 0xB3F9 // FORMAT_RRE CONVERT FROM FIXED (64 to extended DFP)
  1654. op_CXGTRA uint32 = 0xB3F9 // FORMAT_RRF5 CONVERT FROM FIXED (64 to extended DFP)
  1655. op_CXLFBR uint32 = 0xB392 // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to extended BFP)
  1656. op_CXLFTR uint32 = 0xB95B // FORMAT_RRF5 CONVERT FROM LOGICAL (32 to extended DFP)
  1657. op_CXLGBR uint32 = 0xB3A2 // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to extended BFP)
  1658. op_CXLGTR uint32 = 0xB95A // FORMAT_RRF5 CONVERT FROM LOGICAL (64 to extended DFP)
  1659. op_CXR uint32 = 0xB369 // FORMAT_RRE COMPARE (extended HFP)
  1660. op_CXSTR uint32 = 0xB3FB // FORMAT_RRE CONVERT FROM SIGNED PACKED (128 to extended DFP)
  1661. op_CXTR uint32 = 0xB3EC // FORMAT_RRE COMPARE (extended DFP)
  1662. op_CXUTR uint32 = 0xB3FA // FORMAT_RRE CONVERT FROM UNSIGNED PACKED (128 to ext. DFP)
  1663. op_CXZT uint32 = 0xEDAB // FORMAT_RSL CONVERT FROM ZONED (to extended DFP)
  1664. op_CY uint32 = 0xE359 // FORMAT_RXY1 COMPARE (32)
  1665. op_CZDT uint32 = 0xEDA8 // FORMAT_RSL CONVERT TO ZONED (from long DFP)
  1666. op_CZXT uint32 = 0xEDA9 // FORMAT_RSL CONVERT TO ZONED (from extended DFP)
  1667. op_D uint32 = 0x5D00 // FORMAT_RX1 DIVIDE (32<-64)
  1668. op_DD uint32 = 0x6D00 // FORMAT_RX1 DIVIDE (long HFP)
  1669. op_DDB uint32 = 0xED1D // FORMAT_RXE DIVIDE (long BFP)
  1670. op_DDBR uint32 = 0xB31D // FORMAT_RRE DIVIDE (long BFP)
  1671. op_DDR uint32 = 0x2D00 // FORMAT_RR DIVIDE (long HFP)
  1672. op_DDTR uint32 = 0xB3D1 // FORMAT_RRF1 DIVIDE (long DFP)
  1673. op_DDTRA uint32 = 0xB3D1 // FORMAT_RRF1 DIVIDE (long DFP)
  1674. op_DE uint32 = 0x7D00 // FORMAT_RX1 DIVIDE (short HFP)
  1675. op_DEB uint32 = 0xED0D // FORMAT_RXE DIVIDE (short BFP)
  1676. op_DEBR uint32 = 0xB30D // FORMAT_RRE DIVIDE (short BFP)
  1677. op_DER uint32 = 0x3D00 // FORMAT_RR DIVIDE (short HFP)
  1678. op_DIDBR uint32 = 0xB35B // FORMAT_RRF2 DIVIDE TO INTEGER (long BFP)
  1679. op_DIEBR uint32 = 0xB353 // FORMAT_RRF2 DIVIDE TO INTEGER (short BFP)
  1680. op_DL uint32 = 0xE397 // FORMAT_RXY1 DIVIDE LOGICAL (32<-64)
  1681. op_DLG uint32 = 0xE387 // FORMAT_RXY1 DIVIDE LOGICAL (64<-128)
  1682. op_DLGR uint32 = 0xB987 // FORMAT_RRE DIVIDE LOGICAL (64<-128)
  1683. op_DLR uint32 = 0xB997 // FORMAT_RRE DIVIDE LOGICAL (32<-64)
  1684. op_DP uint32 = 0xFD00 // FORMAT_SS2 DIVIDE DECIMAL
  1685. op_DR uint32 = 0x1D00 // FORMAT_RR DIVIDE (32<-64)
  1686. op_DSG uint32 = 0xE30D // FORMAT_RXY1 DIVIDE SINGLE (64)
  1687. op_DSGF uint32 = 0xE31D // FORMAT_RXY1 DIVIDE SINGLE (64<-32)
  1688. op_DSGFR uint32 = 0xB91D // FORMAT_RRE DIVIDE SINGLE (64<-32)
  1689. op_DSGR uint32 = 0xB90D // FORMAT_RRE DIVIDE SINGLE (64)
  1690. op_DXBR uint32 = 0xB34D // FORMAT_RRE DIVIDE (extended BFP)
  1691. op_DXR uint32 = 0xB22D // FORMAT_RRE DIVIDE (extended HFP)
  1692. op_DXTR uint32 = 0xB3D9 // FORMAT_RRF1 DIVIDE (extended DFP)
  1693. op_DXTRA uint32 = 0xB3D9 // FORMAT_RRF1 DIVIDE (extended DFP)
  1694. op_EAR uint32 = 0xB24F // FORMAT_RRE EXTRACT ACCESS
  1695. op_ECAG uint32 = 0xEB4C // FORMAT_RSY1 EXTRACT CACHE ATTRIBUTE
  1696. op_ECTG uint32 = 0xC801 // FORMAT_SSF EXTRACT CPU TIME
  1697. op_ED uint32 = 0xDE00 // FORMAT_SS1 EDIT
  1698. op_EDMK uint32 = 0xDF00 // FORMAT_SS1 EDIT AND MARK
  1699. op_EEDTR uint32 = 0xB3E5 // FORMAT_RRE EXTRACT BIASED EXPONENT (long DFP to 64)
  1700. op_EEXTR uint32 = 0xB3ED // FORMAT_RRE EXTRACT BIASED EXPONENT (extended DFP to 64)
  1701. op_EFPC uint32 = 0xB38C // FORMAT_RRE EXTRACT FPC
  1702. op_EPAIR uint32 = 0xB99A // FORMAT_RRE EXTRACT PRIMARY ASN AND INSTANCE
  1703. op_EPAR uint32 = 0xB226 // FORMAT_RRE EXTRACT PRIMARY ASN
  1704. op_EPSW uint32 = 0xB98D // FORMAT_RRE EXTRACT PSW
  1705. op_EREG uint32 = 0xB249 // FORMAT_RRE EXTRACT STACKED REGISTERS (32)
  1706. op_EREGG uint32 = 0xB90E // FORMAT_RRE EXTRACT STACKED REGISTERS (64)
  1707. op_ESAIR uint32 = 0xB99B // FORMAT_RRE EXTRACT SECONDARY ASN AND INSTANCE
  1708. op_ESAR uint32 = 0xB227 // FORMAT_RRE EXTRACT SECONDARY ASN
  1709. op_ESDTR uint32 = 0xB3E7 // FORMAT_RRE EXTRACT SIGNIFICANCE (long DFP)
  1710. op_ESEA uint32 = 0xB99D // FORMAT_RRE EXTRACT AND SET EXTENDED AUTHORITY
  1711. op_ESTA uint32 = 0xB24A // FORMAT_RRE EXTRACT STACKED STATE
  1712. op_ESXTR uint32 = 0xB3EF // FORMAT_RRE EXTRACT SIGNIFICANCE (extended DFP)
  1713. op_ETND uint32 = 0xB2EC // FORMAT_RRE EXTRACT TRANSACTION NESTING DEPTH
  1714. op_EX uint32 = 0x4400 // FORMAT_RX1 EXECUTE
  1715. op_EXRL uint32 = 0xC600 // FORMAT_RIL2 EXECUTE RELATIVE LONG
  1716. op_FIDBR uint32 = 0xB35F // FORMAT_RRF5 LOAD FP INTEGER (long BFP)
  1717. op_FIDBRA uint32 = 0xB35F // FORMAT_RRF5 LOAD FP INTEGER (long BFP)
  1718. op_FIDR uint32 = 0xB37F // FORMAT_RRE LOAD FP INTEGER (long HFP)
  1719. op_FIDTR uint32 = 0xB3D7 // FORMAT_RRF5 LOAD FP INTEGER (long DFP)
  1720. op_FIEBR uint32 = 0xB357 // FORMAT_RRF5 LOAD FP INTEGER (short BFP)
  1721. op_FIEBRA uint32 = 0xB357 // FORMAT_RRF5 LOAD FP INTEGER (short BFP)
  1722. op_FIER uint32 = 0xB377 // FORMAT_RRE LOAD FP INTEGER (short HFP)
  1723. op_FIXBR uint32 = 0xB347 // FORMAT_RRF5 LOAD FP INTEGER (extended BFP)
  1724. op_FIXBRA uint32 = 0xB347 // FORMAT_RRF5 LOAD FP INTEGER (extended BFP)
  1725. op_FIXR uint32 = 0xB367 // FORMAT_RRE LOAD FP INTEGER (extended HFP)
  1726. op_FIXTR uint32 = 0xB3DF // FORMAT_RRF5 LOAD FP INTEGER (extended DFP)
  1727. op_FLOGR uint32 = 0xB983 // FORMAT_RRE FIND LEFTMOST ONE
  1728. op_HDR uint32 = 0x2400 // FORMAT_RR HALVE (long HFP)
  1729. op_HER uint32 = 0x3400 // FORMAT_RR HALVE (short HFP)
  1730. op_HSCH uint32 = 0xB231 // FORMAT_S HALT SUBCHANNEL
  1731. op_IAC uint32 = 0xB224 // FORMAT_RRE INSERT ADDRESS SPACE CONTROL
  1732. op_IC uint32 = 0x4300 // FORMAT_RX1 INSERT CHARACTER
  1733. op_ICM uint32 = 0xBF00 // FORMAT_RS2 INSERT CHARACTERS UNDER MASK (low)
  1734. op_ICMH uint32 = 0xEB80 // FORMAT_RSY2 INSERT CHARACTERS UNDER MASK (high)
  1735. op_ICMY uint32 = 0xEB81 // FORMAT_RSY2 INSERT CHARACTERS UNDER MASK (low)
  1736. op_ICY uint32 = 0xE373 // FORMAT_RXY1 INSERT CHARACTER
  1737. op_IDTE uint32 = 0xB98E // FORMAT_RRF2 INVALIDATE DAT TABLE ENTRY
  1738. op_IEDTR uint32 = 0xB3F6 // FORMAT_RRF2 INSERT BIASED EXPONENT (64 to long DFP)
  1739. op_IEXTR uint32 = 0xB3FE // FORMAT_RRF2 INSERT BIASED EXPONENT (64 to extended DFP)
  1740. op_IIHF uint32 = 0xC008 // FORMAT_RIL1 INSERT IMMEDIATE (high)
  1741. op_IIHH uint32 = 0xA500 // FORMAT_RI1 INSERT IMMEDIATE (high high)
  1742. op_IIHL uint32 = 0xA501 // FORMAT_RI1 INSERT IMMEDIATE (high low)
  1743. op_IILF uint32 = 0xC009 // FORMAT_RIL1 INSERT IMMEDIATE (low)
  1744. op_IILH uint32 = 0xA502 // FORMAT_RI1 INSERT IMMEDIATE (low high)
  1745. op_IILL uint32 = 0xA503 // FORMAT_RI1 INSERT IMMEDIATE (low low)
  1746. op_IPK uint32 = 0xB20B // FORMAT_S INSERT PSW KEY
  1747. op_IPM uint32 = 0xB222 // FORMAT_RRE INSERT PROGRAM MASK
  1748. op_IPTE uint32 = 0xB221 // FORMAT_RRF1 INVALIDATE PAGE TABLE ENTRY
  1749. op_ISKE uint32 = 0xB229 // FORMAT_RRE INSERT STORAGE KEY EXTENDED
  1750. op_IVSK uint32 = 0xB223 // FORMAT_RRE INSERT VIRTUAL STORAGE KEY
  1751. op_KDB uint32 = 0xED18 // FORMAT_RXE COMPARE AND SIGNAL (long BFP)
  1752. op_KDBR uint32 = 0xB318 // FORMAT_RRE COMPARE AND SIGNAL (long BFP)
  1753. op_KDTR uint32 = 0xB3E0 // FORMAT_RRE COMPARE AND SIGNAL (long DFP)
  1754. op_KEB uint32 = 0xED08 // FORMAT_RXE COMPARE AND SIGNAL (short BFP)
  1755. op_KEBR uint32 = 0xB308 // FORMAT_RRE COMPARE AND SIGNAL (short BFP)
  1756. op_KIMD uint32 = 0xB93E // FORMAT_RRE COMPUTE INTERMEDIATE MESSAGE DIGEST
  1757. op_KLMD uint32 = 0xB93F // FORMAT_RRE COMPUTE LAST MESSAGE DIGEST
  1758. op_KM uint32 = 0xB92E // FORMAT_RRE CIPHER MESSAGE
  1759. op_KMAC uint32 = 0xB91E // FORMAT_RRE COMPUTE MESSAGE AUTHENTICATION CODE
  1760. op_KMC uint32 = 0xB92F // FORMAT_RRE CIPHER MESSAGE WITH CHAINING
  1761. op_KMCTR uint32 = 0xB92D // FORMAT_RRF2 CIPHER MESSAGE WITH COUNTER
  1762. op_KMF uint32 = 0xB92A // FORMAT_RRE CIPHER MESSAGE WITH CFB
  1763. op_KMO uint32 = 0xB92B // FORMAT_RRE CIPHER MESSAGE WITH OFB
  1764. op_KXBR uint32 = 0xB348 // FORMAT_RRE COMPARE AND SIGNAL (extended BFP)
  1765. op_KXTR uint32 = 0xB3E8 // FORMAT_RRE COMPARE AND SIGNAL (extended DFP)
  1766. op_L uint32 = 0x5800 // FORMAT_RX1 LOAD (32)
  1767. op_LA uint32 = 0x4100 // FORMAT_RX1 LOAD ADDRESS
  1768. op_LAA uint32 = 0xEBF8 // FORMAT_RSY1 LOAD AND ADD (32)
  1769. op_LAAG uint32 = 0xEBE8 // FORMAT_RSY1 LOAD AND ADD (64)
  1770. op_LAAL uint32 = 0xEBFA // FORMAT_RSY1 LOAD AND ADD LOGICAL (32)
  1771. op_LAALG uint32 = 0xEBEA // FORMAT_RSY1 LOAD AND ADD LOGICAL (64)
  1772. op_LAE uint32 = 0x5100 // FORMAT_RX1 LOAD ADDRESS EXTENDED
  1773. op_LAEY uint32 = 0xE375 // FORMAT_RXY1 LOAD ADDRESS EXTENDED
  1774. op_LAM uint32 = 0x9A00 // FORMAT_RS1 LOAD ACCESS MULTIPLE
  1775. op_LAMY uint32 = 0xEB9A // FORMAT_RSY1 LOAD ACCESS MULTIPLE
  1776. op_LAN uint32 = 0xEBF4 // FORMAT_RSY1 LOAD AND AND (32)
  1777. op_LANG uint32 = 0xEBE4 // FORMAT_RSY1 LOAD AND AND (64)
  1778. op_LAO uint32 = 0xEBF6 // FORMAT_RSY1 LOAD AND OR (32)
  1779. op_LAOG uint32 = 0xEBE6 // FORMAT_RSY1 LOAD AND OR (64)
  1780. op_LARL uint32 = 0xC000 // FORMAT_RIL2 LOAD ADDRESS RELATIVE LONG
  1781. op_LASP uint32 = 0xE500 // FORMAT_SSE LOAD ADDRESS SPACE PARAMETERS
  1782. op_LAT uint32 = 0xE39F // FORMAT_RXY1 LOAD AND TRAP (32L<-32)
  1783. op_LAX uint32 = 0xEBF7 // FORMAT_RSY1 LOAD AND EXCLUSIVE OR (32)
  1784. op_LAXG uint32 = 0xEBE7 // FORMAT_RSY1 LOAD AND EXCLUSIVE OR (64)
  1785. op_LAY uint32 = 0xE371 // FORMAT_RXY1 LOAD ADDRESS
  1786. op_LB uint32 = 0xE376 // FORMAT_RXY1 LOAD BYTE (32)
  1787. op_LBH uint32 = 0xE3C0 // FORMAT_RXY1 LOAD BYTE HIGH (32<-8)
  1788. op_LBR uint32 = 0xB926 // FORMAT_RRE LOAD BYTE (32)
  1789. op_LCDBR uint32 = 0xB313 // FORMAT_RRE LOAD COMPLEMENT (long BFP)
  1790. op_LCDFR uint32 = 0xB373 // FORMAT_RRE LOAD COMPLEMENT (long)
  1791. op_LCDR uint32 = 0x2300 // FORMAT_RR LOAD COMPLEMENT (long HFP)
  1792. op_LCEBR uint32 = 0xB303 // FORMAT_RRE LOAD COMPLEMENT (short BFP)
  1793. op_LCER uint32 = 0x3300 // FORMAT_RR LOAD COMPLEMENT (short HFP)
  1794. op_LCGFR uint32 = 0xB913 // FORMAT_RRE LOAD COMPLEMENT (64<-32)
  1795. op_LCGR uint32 = 0xB903 // FORMAT_RRE LOAD COMPLEMENT (64)
  1796. op_LCR uint32 = 0x1300 // FORMAT_RR LOAD COMPLEMENT (32)
  1797. op_LCTL uint32 = 0xB700 // FORMAT_RS1 LOAD CONTROL (32)
  1798. op_LCTLG uint32 = 0xEB2F // FORMAT_RSY1 LOAD CONTROL (64)
  1799. op_LCXBR uint32 = 0xB343 // FORMAT_RRE LOAD COMPLEMENT (extended BFP)
  1800. op_LCXR uint32 = 0xB363 // FORMAT_RRE LOAD COMPLEMENT (extended HFP)
  1801. op_LD uint32 = 0x6800 // FORMAT_RX1 LOAD (long)
  1802. op_LDE uint32 = 0xED24 // FORMAT_RXE LOAD LENGTHENED (short to long HFP)
  1803. op_LDEB uint32 = 0xED04 // FORMAT_RXE LOAD LENGTHENED (short to long BFP)
  1804. op_LDEBR uint32 = 0xB304 // FORMAT_RRE LOAD LENGTHENED (short to long BFP)
  1805. op_LDER uint32 = 0xB324 // FORMAT_RRE LOAD LENGTHENED (short to long HFP)
  1806. op_LDETR uint32 = 0xB3D4 // FORMAT_RRF4 LOAD LENGTHENED (short to long DFP)
  1807. op_LDGR uint32 = 0xB3C1 // FORMAT_RRE LOAD FPR FROM GR (64 to long)
  1808. op_LDR uint32 = 0x2800 // FORMAT_RR LOAD (long)
  1809. op_LDXBR uint32 = 0xB345 // FORMAT_RRE LOAD ROUNDED (extended to long BFP)
  1810. op_LDXBRA uint32 = 0xB345 // FORMAT_RRF5 LOAD ROUNDED (extended to long BFP)
  1811. op_LDXR uint32 = 0x2500 // FORMAT_RR LOAD ROUNDED (extended to long HFP)
  1812. op_LDXTR uint32 = 0xB3DD // FORMAT_RRF5 LOAD ROUNDED (extended to long DFP)
  1813. op_LDY uint32 = 0xED65 // FORMAT_RXY1 LOAD (long)
  1814. op_LE uint32 = 0x7800 // FORMAT_RX1 LOAD (short)
  1815. op_LEDBR uint32 = 0xB344 // FORMAT_RRE LOAD ROUNDED (long to short BFP)
  1816. op_LEDBRA uint32 = 0xB344 // FORMAT_RRF5 LOAD ROUNDED (long to short BFP)
  1817. op_LEDR uint32 = 0x3500 // FORMAT_RR LOAD ROUNDED (long to short HFP)
  1818. op_LEDTR uint32 = 0xB3D5 // FORMAT_RRF5 LOAD ROUNDED (long to short DFP)
  1819. op_LER uint32 = 0x3800 // FORMAT_RR LOAD (short)
  1820. op_LEXBR uint32 = 0xB346 // FORMAT_RRE LOAD ROUNDED (extended to short BFP)
  1821. op_LEXBRA uint32 = 0xB346 // FORMAT_RRF5 LOAD ROUNDED (extended to short BFP)
  1822. op_LEXR uint32 = 0xB366 // FORMAT_RRE LOAD ROUNDED (extended to short HFP)
  1823. op_LEY uint32 = 0xED64 // FORMAT_RXY1 LOAD (short)
  1824. op_LFAS uint32 = 0xB2BD // FORMAT_S LOAD FPC AND SIGNAL
  1825. op_LFH uint32 = 0xE3CA // FORMAT_RXY1 LOAD HIGH (32)
  1826. op_LFHAT uint32 = 0xE3C8 // FORMAT_RXY1 LOAD HIGH AND TRAP (32H<-32)
  1827. op_LFPC uint32 = 0xB29D // FORMAT_S LOAD FPC
  1828. op_LG uint32 = 0xE304 // FORMAT_RXY1 LOAD (64)
  1829. op_LGAT uint32 = 0xE385 // FORMAT_RXY1 LOAD AND TRAP (64)
  1830. op_LGB uint32 = 0xE377 // FORMAT_RXY1 LOAD BYTE (64)
  1831. op_LGBR uint32 = 0xB906 // FORMAT_RRE LOAD BYTE (64)
  1832. op_LGDR uint32 = 0xB3CD // FORMAT_RRE LOAD GR FROM FPR (long to 64)
  1833. op_LGF uint32 = 0xE314 // FORMAT_RXY1 LOAD (64<-32)
  1834. op_LGFI uint32 = 0xC001 // FORMAT_RIL1 LOAD IMMEDIATE (64<-32)
  1835. op_LGFR uint32 = 0xB914 // FORMAT_RRE LOAD (64<-32)
  1836. op_LGFRL uint32 = 0xC40C // FORMAT_RIL2 LOAD RELATIVE LONG (64<-32)
  1837. op_LGH uint32 = 0xE315 // FORMAT_RXY1 LOAD HALFWORD (64)
  1838. op_LGHI uint32 = 0xA709 // FORMAT_RI1 LOAD HALFWORD IMMEDIATE (64)
  1839. op_LGHR uint32 = 0xB907 // FORMAT_RRE LOAD HALFWORD (64)
  1840. op_LGHRL uint32 = 0xC404 // FORMAT_RIL2 LOAD HALFWORD RELATIVE LONG (64<-16)
  1841. op_LGR uint32 = 0xB904 // FORMAT_RRE LOAD (64)
  1842. op_LGRL uint32 = 0xC408 // FORMAT_RIL2 LOAD RELATIVE LONG (64)
  1843. op_LH uint32 = 0x4800 // FORMAT_RX1 LOAD HALFWORD (32)
  1844. op_LHH uint32 = 0xE3C4 // FORMAT_RXY1 LOAD HALFWORD HIGH (32<-16)
  1845. op_LHI uint32 = 0xA708 // FORMAT_RI1 LOAD HALFWORD IMMEDIATE (32)
  1846. op_LHR uint32 = 0xB927 // FORMAT_RRE LOAD HALFWORD (32)
  1847. op_LHRL uint32 = 0xC405 // FORMAT_RIL2 LOAD HALFWORD RELATIVE LONG (32<-16)
  1848. op_LHY uint32 = 0xE378 // FORMAT_RXY1 LOAD HALFWORD (32)
  1849. op_LLC uint32 = 0xE394 // FORMAT_RXY1 LOAD LOGICAL CHARACTER (32)
  1850. op_LLCH uint32 = 0xE3C2 // FORMAT_RXY1 LOAD LOGICAL CHARACTER HIGH (32<-8)
  1851. op_LLCR uint32 = 0xB994 // FORMAT_RRE LOAD LOGICAL CHARACTER (32)
  1852. op_LLGC uint32 = 0xE390 // FORMAT_RXY1 LOAD LOGICAL CHARACTER (64)
  1853. op_LLGCR uint32 = 0xB984 // FORMAT_RRE LOAD LOGICAL CHARACTER (64)
  1854. op_LLGF uint32 = 0xE316 // FORMAT_RXY1 LOAD LOGICAL (64<-32)
  1855. op_LLGFAT uint32 = 0xE39D // FORMAT_RXY1 LOAD LOGICAL AND TRAP (64<-32)
  1856. op_LLGFR uint32 = 0xB916 // FORMAT_RRE LOAD LOGICAL (64<-32)
  1857. op_LLGFRL uint32 = 0xC40E // FORMAT_RIL2 LOAD LOGICAL RELATIVE LONG (64<-32)
  1858. op_LLGH uint32 = 0xE391 // FORMAT_RXY1 LOAD LOGICAL HALFWORD (64)
  1859. op_LLGHR uint32 = 0xB985 // FORMAT_RRE LOAD LOGICAL HALFWORD (64)
  1860. op_LLGHRL uint32 = 0xC406 // FORMAT_RIL2 LOAD LOGICAL HALFWORD RELATIVE LONG (64<-16)
  1861. op_LLGT uint32 = 0xE317 // FORMAT_RXY1 LOAD LOGICAL THIRTY ONE BITS
  1862. op_LLGTAT uint32 = 0xE39C // FORMAT_RXY1 LOAD LOGICAL THIRTY ONE BITS AND TRAP (64<-31)
  1863. op_LLGTR uint32 = 0xB917 // FORMAT_RRE LOAD LOGICAL THIRTY ONE BITS
  1864. op_LLH uint32 = 0xE395 // FORMAT_RXY1 LOAD LOGICAL HALFWORD (32)
  1865. op_LLHH uint32 = 0xE3C6 // FORMAT_RXY1 LOAD LOGICAL HALFWORD HIGH (32<-16)
  1866. op_LLHR uint32 = 0xB995 // FORMAT_RRE LOAD LOGICAL HALFWORD (32)
  1867. op_LLHRL uint32 = 0xC402 // FORMAT_RIL2 LOAD LOGICAL HALFWORD RELATIVE LONG (32<-16)
  1868. op_LLIHF uint32 = 0xC00E // FORMAT_RIL1 LOAD LOGICAL IMMEDIATE (high)
  1869. op_LLIHH uint32 = 0xA50C // FORMAT_RI1 LOAD LOGICAL IMMEDIATE (high high)
  1870. op_LLIHL uint32 = 0xA50D // FORMAT_RI1 LOAD LOGICAL IMMEDIATE (high low)
  1871. op_LLILF uint32 = 0xC00F // FORMAT_RIL1 LOAD LOGICAL IMMEDIATE (low)
  1872. op_LLILH uint32 = 0xA50E // FORMAT_RI1 LOAD LOGICAL IMMEDIATE (low high)
  1873. op_LLILL uint32 = 0xA50F // FORMAT_RI1 LOAD LOGICAL IMMEDIATE (low low)
  1874. op_LM uint32 = 0x9800 // FORMAT_RS1 LOAD MULTIPLE (32)
  1875. op_LMD uint32 = 0xEF00 // FORMAT_SS5 LOAD MULTIPLE DISJOINT
  1876. op_LMG uint32 = 0xEB04 // FORMAT_RSY1 LOAD MULTIPLE (64)
  1877. op_LMH uint32 = 0xEB96 // FORMAT_RSY1 LOAD MULTIPLE HIGH
  1878. op_LMY uint32 = 0xEB98 // FORMAT_RSY1 LOAD MULTIPLE (32)
  1879. op_LNDBR uint32 = 0xB311 // FORMAT_RRE LOAD NEGATIVE (long BFP)
  1880. op_LNDFR uint32 = 0xB371 // FORMAT_RRE LOAD NEGATIVE (long)
  1881. op_LNDR uint32 = 0x2100 // FORMAT_RR LOAD NEGATIVE (long HFP)
  1882. op_LNEBR uint32 = 0xB301 // FORMAT_RRE LOAD NEGATIVE (short BFP)
  1883. op_LNER uint32 = 0x3100 // FORMAT_RR LOAD NEGATIVE (short HFP)
  1884. op_LNGFR uint32 = 0xB911 // FORMAT_RRE LOAD NEGATIVE (64<-32)
  1885. op_LNGR uint32 = 0xB901 // FORMAT_RRE LOAD NEGATIVE (64)
  1886. op_LNR uint32 = 0x1100 // FORMAT_RR LOAD NEGATIVE (32)
  1887. op_LNXBR uint32 = 0xB341 // FORMAT_RRE LOAD NEGATIVE (extended BFP)
  1888. op_LNXR uint32 = 0xB361 // FORMAT_RRE LOAD NEGATIVE (extended HFP)
  1889. op_LOC uint32 = 0xEBF2 // FORMAT_RSY2 LOAD ON CONDITION (32)
  1890. op_LOCG uint32 = 0xEBE2 // FORMAT_RSY2 LOAD ON CONDITION (64)
  1891. op_LOCGR uint32 = 0xB9E2 // FORMAT_RRF3 LOAD ON CONDITION (64)
  1892. op_LOCR uint32 = 0xB9F2 // FORMAT_RRF3 LOAD ON CONDITION (32)
  1893. op_LPD uint32 = 0xC804 // FORMAT_SSF LOAD PAIR DISJOINT (32)
  1894. op_LPDBR uint32 = 0xB310 // FORMAT_RRE LOAD POSITIVE (long BFP)
  1895. op_LPDFR uint32 = 0xB370 // FORMAT_RRE LOAD POSITIVE (long)
  1896. op_LPDG uint32 = 0xC805 // FORMAT_SSF LOAD PAIR DISJOINT (64)
  1897. op_LPDR uint32 = 0x2000 // FORMAT_RR LOAD POSITIVE (long HFP)
  1898. op_LPEBR uint32 = 0xB300 // FORMAT_RRE LOAD POSITIVE (short BFP)
  1899. op_LPER uint32 = 0x3000 // FORMAT_RR LOAD POSITIVE (short HFP)
  1900. op_LPGFR uint32 = 0xB910 // FORMAT_RRE LOAD POSITIVE (64<-32)
  1901. op_LPGR uint32 = 0xB900 // FORMAT_RRE LOAD POSITIVE (64)
  1902. op_LPQ uint32 = 0xE38F // FORMAT_RXY1 LOAD PAIR FROM QUADWORD
  1903. op_LPR uint32 = 0x1000 // FORMAT_RR LOAD POSITIVE (32)
  1904. op_LPSW uint32 = 0x8200 // FORMAT_S LOAD PSW
  1905. op_LPSWE uint32 = 0xB2B2 // FORMAT_S LOAD PSW EXTENDED
  1906. op_LPTEA uint32 = 0xB9AA // FORMAT_RRF2 LOAD PAGE TABLE ENTRY ADDRESS
  1907. op_LPXBR uint32 = 0xB340 // FORMAT_RRE LOAD POSITIVE (extended BFP)
  1908. op_LPXR uint32 = 0xB360 // FORMAT_RRE LOAD POSITIVE (extended HFP)
  1909. op_LR uint32 = 0x1800 // FORMAT_RR LOAD (32)
  1910. op_LRA uint32 = 0xB100 // FORMAT_RX1 LOAD REAL ADDRESS (32)
  1911. op_LRAG uint32 = 0xE303 // FORMAT_RXY1 LOAD REAL ADDRESS (64)
  1912. op_LRAY uint32 = 0xE313 // FORMAT_RXY1 LOAD REAL ADDRESS (32)
  1913. op_LRDR uint32 = 0x2500 // FORMAT_RR LOAD ROUNDED (extended to long HFP)
  1914. op_LRER uint32 = 0x3500 // FORMAT_RR LOAD ROUNDED (long to short HFP)
  1915. op_LRL uint32 = 0xC40D // FORMAT_RIL2 LOAD RELATIVE LONG (32)
  1916. op_LRV uint32 = 0xE31E // FORMAT_RXY1 LOAD REVERSED (32)
  1917. op_LRVG uint32 = 0xE30F // FORMAT_RXY1 LOAD REVERSED (64)
  1918. op_LRVGR uint32 = 0xB90F // FORMAT_RRE LOAD REVERSED (64)
  1919. op_LRVH uint32 = 0xE31F // FORMAT_RXY1 LOAD REVERSED (16)
  1920. op_LRVR uint32 = 0xB91F // FORMAT_RRE LOAD REVERSED (32)
  1921. op_LT uint32 = 0xE312 // FORMAT_RXY1 LOAD AND TEST (32)
  1922. op_LTDBR uint32 = 0xB312 // FORMAT_RRE LOAD AND TEST (long BFP)
  1923. op_LTDR uint32 = 0x2200 // FORMAT_RR LOAD AND TEST (long HFP)
  1924. op_LTDTR uint32 = 0xB3D6 // FORMAT_RRE LOAD AND TEST (long DFP)
  1925. op_LTEBR uint32 = 0xB302 // FORMAT_RRE LOAD AND TEST (short BFP)
  1926. op_LTER uint32 = 0x3200 // FORMAT_RR LOAD AND TEST (short HFP)
  1927. op_LTG uint32 = 0xE302 // FORMAT_RXY1 LOAD AND TEST (64)
  1928. op_LTGF uint32 = 0xE332 // FORMAT_RXY1 LOAD AND TEST (64<-32)
  1929. op_LTGFR uint32 = 0xB912 // FORMAT_RRE LOAD AND TEST (64<-32)
  1930. op_LTGR uint32 = 0xB902 // FORMAT_RRE LOAD AND TEST (64)
  1931. op_LTR uint32 = 0x1200 // FORMAT_RR LOAD AND TEST (32)
  1932. op_LTXBR uint32 = 0xB342 // FORMAT_RRE LOAD AND TEST (extended BFP)
  1933. op_LTXR uint32 = 0xB362 // FORMAT_RRE LOAD AND TEST (extended HFP)
  1934. op_LTXTR uint32 = 0xB3DE // FORMAT_RRE LOAD AND TEST (extended DFP)
  1935. op_LURA uint32 = 0xB24B // FORMAT_RRE LOAD USING REAL ADDRESS (32)
  1936. op_LURAG uint32 = 0xB905 // FORMAT_RRE LOAD USING REAL ADDRESS (64)
  1937. op_LXD uint32 = 0xED25 // FORMAT_RXE LOAD LENGTHENED (long to extended HFP)
  1938. op_LXDB uint32 = 0xED05 // FORMAT_RXE LOAD LENGTHENED (long to extended BFP)
  1939. op_LXDBR uint32 = 0xB305 // FORMAT_RRE LOAD LENGTHENED (long to extended BFP)
  1940. op_LXDR uint32 = 0xB325 // FORMAT_RRE LOAD LENGTHENED (long to extended HFP)
  1941. op_LXDTR uint32 = 0xB3DC // FORMAT_RRF4 LOAD LENGTHENED (long to extended DFP)
  1942. op_LXE uint32 = 0xED26 // FORMAT_RXE LOAD LENGTHENED (short to extended HFP)
  1943. op_LXEB uint32 = 0xED06 // FORMAT_RXE LOAD LENGTHENED (short to extended BFP)
  1944. op_LXEBR uint32 = 0xB306 // FORMAT_RRE LOAD LENGTHENED (short to extended BFP)
  1945. op_LXER uint32 = 0xB326 // FORMAT_RRE LOAD LENGTHENED (short to extended HFP)
  1946. op_LXR uint32 = 0xB365 // FORMAT_RRE LOAD (extended)
  1947. op_LY uint32 = 0xE358 // FORMAT_RXY1 LOAD (32)
  1948. op_LZDR uint32 = 0xB375 // FORMAT_RRE LOAD ZERO (long)
  1949. op_LZER uint32 = 0xB374 // FORMAT_RRE LOAD ZERO (short)
  1950. op_LZXR uint32 = 0xB376 // FORMAT_RRE LOAD ZERO (extended)
  1951. op_M uint32 = 0x5C00 // FORMAT_RX1 MULTIPLY (64<-32)
  1952. op_MAD uint32 = 0xED3E // FORMAT_RXF MULTIPLY AND ADD (long HFP)
  1953. op_MADB uint32 = 0xED1E // FORMAT_RXF MULTIPLY AND ADD (long BFP)
  1954. op_MADBR uint32 = 0xB31E // FORMAT_RRD MULTIPLY AND ADD (long BFP)
  1955. op_MADR uint32 = 0xB33E // FORMAT_RRD MULTIPLY AND ADD (long HFP)
  1956. op_MAE uint32 = 0xED2E // FORMAT_RXF MULTIPLY AND ADD (short HFP)
  1957. op_MAEB uint32 = 0xED0E // FORMAT_RXF MULTIPLY AND ADD (short BFP)
  1958. op_MAEBR uint32 = 0xB30E // FORMAT_RRD MULTIPLY AND ADD (short BFP)
  1959. op_MAER uint32 = 0xB32E // FORMAT_RRD MULTIPLY AND ADD (short HFP)
  1960. op_MAY uint32 = 0xED3A // FORMAT_RXF MULTIPLY & ADD UNNORMALIZED (long to ext. HFP)
  1961. op_MAYH uint32 = 0xED3C // FORMAT_RXF MULTIPLY AND ADD UNNRM. (long to ext. high HFP)
  1962. op_MAYHR uint32 = 0xB33C // FORMAT_RRD MULTIPLY AND ADD UNNRM. (long to ext. high HFP)
  1963. op_MAYL uint32 = 0xED38 // FORMAT_RXF MULTIPLY AND ADD UNNRM. (long to ext. low HFP)
  1964. op_MAYLR uint32 = 0xB338 // FORMAT_RRD MULTIPLY AND ADD UNNRM. (long to ext. low HFP)
  1965. op_MAYR uint32 = 0xB33A // FORMAT_RRD MULTIPLY & ADD UNNORMALIZED (long to ext. HFP)
  1966. op_MC uint32 = 0xAF00 // FORMAT_SI MONITOR CALL
  1967. op_MD uint32 = 0x6C00 // FORMAT_RX1 MULTIPLY (long HFP)
  1968. op_MDB uint32 = 0xED1C // FORMAT_RXE MULTIPLY (long BFP)
  1969. op_MDBR uint32 = 0xB31C // FORMAT_RRE MULTIPLY (long BFP)
  1970. op_MDE uint32 = 0x7C00 // FORMAT_RX1 MULTIPLY (short to long HFP)
  1971. op_MDEB uint32 = 0xED0C // FORMAT_RXE MULTIPLY (short to long BFP)
  1972. op_MDEBR uint32 = 0xB30C // FORMAT_RRE MULTIPLY (short to long BFP)
  1973. op_MDER uint32 = 0x3C00 // FORMAT_RR MULTIPLY (short to long HFP)
  1974. op_MDR uint32 = 0x2C00 // FORMAT_RR MULTIPLY (long HFP)
  1975. op_MDTR uint32 = 0xB3D0 // FORMAT_RRF1 MULTIPLY (long DFP)
  1976. op_MDTRA uint32 = 0xB3D0 // FORMAT_RRF1 MULTIPLY (long DFP)
  1977. op_ME uint32 = 0x7C00 // FORMAT_RX1 MULTIPLY (short to long HFP)
  1978. op_MEE uint32 = 0xED37 // FORMAT_RXE MULTIPLY (short HFP)
  1979. op_MEEB uint32 = 0xED17 // FORMAT_RXE MULTIPLY (short BFP)
  1980. op_MEEBR uint32 = 0xB317 // FORMAT_RRE MULTIPLY (short BFP)
  1981. op_MEER uint32 = 0xB337 // FORMAT_RRE MULTIPLY (short HFP)
  1982. op_MER uint32 = 0x3C00 // FORMAT_RR MULTIPLY (short to long HFP)
  1983. op_MFY uint32 = 0xE35C // FORMAT_RXY1 MULTIPLY (64<-32)
  1984. op_MGHI uint32 = 0xA70D // FORMAT_RI1 MULTIPLY HALFWORD IMMEDIATE (64)
  1985. op_MH uint32 = 0x4C00 // FORMAT_RX1 MULTIPLY HALFWORD (32)
  1986. op_MHI uint32 = 0xA70C // FORMAT_RI1 MULTIPLY HALFWORD IMMEDIATE (32)
  1987. op_MHY uint32 = 0xE37C // FORMAT_RXY1 MULTIPLY HALFWORD (32)
  1988. op_ML uint32 = 0xE396 // FORMAT_RXY1 MULTIPLY LOGICAL (64<-32)
  1989. op_MLG uint32 = 0xE386 // FORMAT_RXY1 MULTIPLY LOGICAL (128<-64)
  1990. op_MLGR uint32 = 0xB986 // FORMAT_RRE MULTIPLY LOGICAL (128<-64)
  1991. op_MLR uint32 = 0xB996 // FORMAT_RRE MULTIPLY LOGICAL (64<-32)
  1992. op_MP uint32 = 0xFC00 // FORMAT_SS2 MULTIPLY DECIMAL
  1993. op_MR uint32 = 0x1C00 // FORMAT_RR MULTIPLY (64<-32)
  1994. op_MS uint32 = 0x7100 // FORMAT_RX1 MULTIPLY SINGLE (32)
  1995. op_MSCH uint32 = 0xB232 // FORMAT_S MODIFY SUBCHANNEL
  1996. op_MSD uint32 = 0xED3F // FORMAT_RXF MULTIPLY AND SUBTRACT (long HFP)
  1997. op_MSDB uint32 = 0xED1F // FORMAT_RXF MULTIPLY AND SUBTRACT (long BFP)
  1998. op_MSDBR uint32 = 0xB31F // FORMAT_RRD MULTIPLY AND SUBTRACT (long BFP)
  1999. op_MSDR uint32 = 0xB33F // FORMAT_RRD MULTIPLY AND SUBTRACT (long HFP)
  2000. op_MSE uint32 = 0xED2F // FORMAT_RXF MULTIPLY AND SUBTRACT (short HFP)
  2001. op_MSEB uint32 = 0xED0F // FORMAT_RXF MULTIPLY AND SUBTRACT (short BFP)
  2002. op_MSEBR uint32 = 0xB30F // FORMAT_RRD MULTIPLY AND SUBTRACT (short BFP)
  2003. op_MSER uint32 = 0xB32F // FORMAT_RRD MULTIPLY AND SUBTRACT (short HFP)
  2004. op_MSFI uint32 = 0xC201 // FORMAT_RIL1 MULTIPLY SINGLE IMMEDIATE (32)
  2005. op_MSG uint32 = 0xE30C // FORMAT_RXY1 MULTIPLY SINGLE (64)
  2006. op_MSGF uint32 = 0xE31C // FORMAT_RXY1 MULTIPLY SINGLE (64<-32)
  2007. op_MSGFI uint32 = 0xC200 // FORMAT_RIL1 MULTIPLY SINGLE IMMEDIATE (64<-32)
  2008. op_MSGFR uint32 = 0xB91C // FORMAT_RRE MULTIPLY SINGLE (64<-32)
  2009. op_MSGR uint32 = 0xB90C // FORMAT_RRE MULTIPLY SINGLE (64)
  2010. op_MSR uint32 = 0xB252 // FORMAT_RRE MULTIPLY SINGLE (32)
  2011. op_MSTA uint32 = 0xB247 // FORMAT_RRE MODIFY STACKED STATE
  2012. op_MSY uint32 = 0xE351 // FORMAT_RXY1 MULTIPLY SINGLE (32)
  2013. op_MVC uint32 = 0xD200 // FORMAT_SS1 MOVE (character)
  2014. op_MVCDK uint32 = 0xE50F // FORMAT_SSE MOVE WITH DESTINATION KEY
  2015. op_MVCIN uint32 = 0xE800 // FORMAT_SS1 MOVE INVERSE
  2016. op_MVCK uint32 = 0xD900 // FORMAT_SS4 MOVE WITH KEY
  2017. op_MVCL uint32 = 0x0E00 // FORMAT_RR MOVE LONG
  2018. op_MVCLE uint32 = 0xA800 // FORMAT_RS1 MOVE LONG EXTENDED
  2019. op_MVCLU uint32 = 0xEB8E // FORMAT_RSY1 MOVE LONG UNICODE
  2020. op_MVCOS uint32 = 0xC800 // FORMAT_SSF MOVE WITH OPTIONAL SPECIFICATIONS
  2021. op_MVCP uint32 = 0xDA00 // FORMAT_SS4 MOVE TO PRIMARY
  2022. op_MVCS uint32 = 0xDB00 // FORMAT_SS4 MOVE TO SECONDARY
  2023. op_MVCSK uint32 = 0xE50E // FORMAT_SSE MOVE WITH SOURCE KEY
  2024. op_MVGHI uint32 = 0xE548 // FORMAT_SIL MOVE (64<-16)
  2025. op_MVHHI uint32 = 0xE544 // FORMAT_SIL MOVE (16<-16)
  2026. op_MVHI uint32 = 0xE54C // FORMAT_SIL MOVE (32<-16)
  2027. op_MVI uint32 = 0x9200 // FORMAT_SI MOVE (immediate)
  2028. op_MVIY uint32 = 0xEB52 // FORMAT_SIY MOVE (immediate)
  2029. op_MVN uint32 = 0xD100 // FORMAT_SS1 MOVE NUMERICS
  2030. op_MVO uint32 = 0xF100 // FORMAT_SS2 MOVE WITH OFFSET
  2031. op_MVPG uint32 = 0xB254 // FORMAT_RRE MOVE PAGE
  2032. op_MVST uint32 = 0xB255 // FORMAT_RRE MOVE STRING
  2033. op_MVZ uint32 = 0xD300 // FORMAT_SS1 MOVE ZONES
  2034. op_MXBR uint32 = 0xB34C // FORMAT_RRE MULTIPLY (extended BFP)
  2035. op_MXD uint32 = 0x6700 // FORMAT_RX1 MULTIPLY (long to extended HFP)
  2036. op_MXDB uint32 = 0xED07 // FORMAT_RXE MULTIPLY (long to extended BFP)
  2037. op_MXDBR uint32 = 0xB307 // FORMAT_RRE MULTIPLY (long to extended BFP)
  2038. op_MXDR uint32 = 0x2700 // FORMAT_RR MULTIPLY (long to extended HFP)
  2039. op_MXR uint32 = 0x2600 // FORMAT_RR MULTIPLY (extended HFP)
  2040. op_MXTR uint32 = 0xB3D8 // FORMAT_RRF1 MULTIPLY (extended DFP)
  2041. op_MXTRA uint32 = 0xB3D8 // FORMAT_RRF1 MULTIPLY (extended DFP)
  2042. op_MY uint32 = 0xED3B // FORMAT_RXF MULTIPLY UNNORMALIZED (long to ext. HFP)
  2043. op_MYH uint32 = 0xED3D // FORMAT_RXF MULTIPLY UNNORM. (long to ext. high HFP)
  2044. op_MYHR uint32 = 0xB33D // FORMAT_RRD MULTIPLY UNNORM. (long to ext. high HFP)
  2045. op_MYL uint32 = 0xED39 // FORMAT_RXF MULTIPLY UNNORM. (long to ext. low HFP)
  2046. op_MYLR uint32 = 0xB339 // FORMAT_RRD MULTIPLY UNNORM. (long to ext. low HFP)
  2047. op_MYR uint32 = 0xB33B // FORMAT_RRD MULTIPLY UNNORMALIZED (long to ext. HFP)
  2048. op_N uint32 = 0x5400 // FORMAT_RX1 AND (32)
  2049. op_NC uint32 = 0xD400 // FORMAT_SS1 AND (character)
  2050. op_NG uint32 = 0xE380 // FORMAT_RXY1 AND (64)
  2051. op_NGR uint32 = 0xB980 // FORMAT_RRE AND (64)
  2052. op_NGRK uint32 = 0xB9E4 // FORMAT_RRF1 AND (64)
  2053. op_NI uint32 = 0x9400 // FORMAT_SI AND (immediate)
  2054. op_NIAI uint32 = 0xB2FA // FORMAT_IE NEXT INSTRUCTION ACCESS INTENT
  2055. op_NIHF uint32 = 0xC00A // FORMAT_RIL1 AND IMMEDIATE (high)
  2056. op_NIHH uint32 = 0xA504 // FORMAT_RI1 AND IMMEDIATE (high high)
  2057. op_NIHL uint32 = 0xA505 // FORMAT_RI1 AND IMMEDIATE (high low)
  2058. op_NILF uint32 = 0xC00B // FORMAT_RIL1 AND IMMEDIATE (low)
  2059. op_NILH uint32 = 0xA506 // FORMAT_RI1 AND IMMEDIATE (low high)
  2060. op_NILL uint32 = 0xA507 // FORMAT_RI1 AND IMMEDIATE (low low)
  2061. op_NIY uint32 = 0xEB54 // FORMAT_SIY AND (immediate)
  2062. op_NR uint32 = 0x1400 // FORMAT_RR AND (32)
  2063. op_NRK uint32 = 0xB9F4 // FORMAT_RRF1 AND (32)
  2064. op_NTSTG uint32 = 0xE325 // FORMAT_RXY1 NONTRANSACTIONAL STORE
  2065. op_NY uint32 = 0xE354 // FORMAT_RXY1 AND (32)
  2066. op_O uint32 = 0x5600 // FORMAT_RX1 OR (32)
  2067. op_OC uint32 = 0xD600 // FORMAT_SS1 OR (character)
  2068. op_OG uint32 = 0xE381 // FORMAT_RXY1 OR (64)
  2069. op_OGR uint32 = 0xB981 // FORMAT_RRE OR (64)
  2070. op_OGRK uint32 = 0xB9E6 // FORMAT_RRF1 OR (64)
  2071. op_OI uint32 = 0x9600 // FORMAT_SI OR (immediate)
  2072. op_OIHF uint32 = 0xC00C // FORMAT_RIL1 OR IMMEDIATE (high)
  2073. op_OIHH uint32 = 0xA508 // FORMAT_RI1 OR IMMEDIATE (high high)
  2074. op_OIHL uint32 = 0xA509 // FORMAT_RI1 OR IMMEDIATE (high low)
  2075. op_OILF uint32 = 0xC00D // FORMAT_RIL1 OR IMMEDIATE (low)
  2076. op_OILH uint32 = 0xA50A // FORMAT_RI1 OR IMMEDIATE (low high)
  2077. op_OILL uint32 = 0xA50B // FORMAT_RI1 OR IMMEDIATE (low low)
  2078. op_OIY uint32 = 0xEB56 // FORMAT_SIY OR (immediate)
  2079. op_OR uint32 = 0x1600 // FORMAT_RR OR (32)
  2080. op_ORK uint32 = 0xB9F6 // FORMAT_RRF1 OR (32)
  2081. op_OY uint32 = 0xE356 // FORMAT_RXY1 OR (32)
  2082. op_PACK uint32 = 0xF200 // FORMAT_SS2 PACK
  2083. op_PALB uint32 = 0xB248 // FORMAT_RRE PURGE ALB
  2084. op_PC uint32 = 0xB218 // FORMAT_S PROGRAM CALL
  2085. op_PCC uint32 = 0xB92C // FORMAT_RRE PERFORM CRYPTOGRAPHIC COMPUTATION
  2086. op_PCKMO uint32 = 0xB928 // FORMAT_RRE PERFORM CRYPTOGRAPHIC KEY MGMT. OPERATIONS
  2087. op_PFD uint32 = 0xE336 // FORMAT_RXY2 PREFETCH DATA
  2088. op_PFDRL uint32 = 0xC602 // FORMAT_RIL3 PREFETCH DATA RELATIVE LONG
  2089. op_PFMF uint32 = 0xB9AF // FORMAT_RRE PERFORM FRAME MANAGEMENT FUNCTION
  2090. op_PFPO uint32 = 0x010A // FORMAT_E PERFORM FLOATING-POINT OPERATION
  2091. op_PGIN uint32 = 0xB22E // FORMAT_RRE PAGE IN
  2092. op_PGOUT uint32 = 0xB22F // FORMAT_RRE PAGE OUT
  2093. op_PKA uint32 = 0xE900 // FORMAT_SS6 PACK ASCII
  2094. op_PKU uint32 = 0xE100 // FORMAT_SS6 PACK UNICODE
  2095. op_PLO uint32 = 0xEE00 // FORMAT_SS5 PERFORM LOCKED OPERATION
  2096. op_POPCNT uint32 = 0xB9E1 // FORMAT_RRE POPULATION COUNT
  2097. op_PPA uint32 = 0xB2E8 // FORMAT_RRF3 PERFORM PROCESSOR ASSIST
  2098. op_PR uint32 = 0x0101 // FORMAT_E PROGRAM RETURN
  2099. op_PT uint32 = 0xB228 // FORMAT_RRE PROGRAM TRANSFER
  2100. op_PTF uint32 = 0xB9A2 // FORMAT_RRE PERFORM TOPOLOGY FUNCTION
  2101. op_PTFF uint32 = 0x0104 // FORMAT_E PERFORM TIMING FACILITY FUNCTION
  2102. op_PTI uint32 = 0xB99E // FORMAT_RRE PROGRAM TRANSFER WITH INSTANCE
  2103. op_PTLB uint32 = 0xB20D // FORMAT_S PURGE TLB
  2104. op_QADTR uint32 = 0xB3F5 // FORMAT_RRF2 QUANTIZE (long DFP)
  2105. op_QAXTR uint32 = 0xB3FD // FORMAT_RRF2 QUANTIZE (extended DFP)
  2106. op_RCHP uint32 = 0xB23B // FORMAT_S RESET CHANNEL PATH
  2107. op_RISBG uint32 = 0xEC55 // FORMAT_RIE6 ROTATE THEN INSERT SELECTED BITS
  2108. op_RISBGN uint32 = 0xEC59 // FORMAT_RIE6 ROTATE THEN INSERT SELECTED BITS
  2109. op_RISBHG uint32 = 0xEC5D // FORMAT_RIE6 ROTATE THEN INSERT SELECTED BITS HIGH
  2110. op_RISBLG uint32 = 0xEC51 // FORMAT_RIE6 ROTATE THEN INSERT SELECTED BITS LOW
  2111. op_RLL uint32 = 0xEB1D // FORMAT_RSY1 ROTATE LEFT SINGLE LOGICAL (32)
  2112. op_RLLG uint32 = 0xEB1C // FORMAT_RSY1 ROTATE LEFT SINGLE LOGICAL (64)
  2113. op_RNSBG uint32 = 0xEC54 // FORMAT_RIE6 ROTATE THEN AND SELECTED BITS
  2114. op_ROSBG uint32 = 0xEC56 // FORMAT_RIE6 ROTATE THEN OR SELECTED BITS
  2115. op_RP uint32 = 0xB277 // FORMAT_S RESUME PROGRAM
  2116. op_RRBE uint32 = 0xB22A // FORMAT_RRE RESET REFERENCE BIT EXTENDED
  2117. op_RRBM uint32 = 0xB9AE // FORMAT_RRE RESET REFERENCE BITS MULTIPLE
  2118. op_RRDTR uint32 = 0xB3F7 // FORMAT_RRF2 REROUND (long DFP)
  2119. op_RRXTR uint32 = 0xB3FF // FORMAT_RRF2 REROUND (extended DFP)
  2120. op_RSCH uint32 = 0xB238 // FORMAT_S RESUME SUBCHANNEL
  2121. op_RXSBG uint32 = 0xEC57 // FORMAT_RIE6 ROTATE THEN EXCLUSIVE OR SELECTED BITS
  2122. op_S uint32 = 0x5B00 // FORMAT_RX1 SUBTRACT (32)
  2123. op_SAC uint32 = 0xB219 // FORMAT_S SET ADDRESS SPACE CONTROL
  2124. op_SACF uint32 = 0xB279 // FORMAT_S SET ADDRESS SPACE CONTROL FAST
  2125. op_SAL uint32 = 0xB237 // FORMAT_S SET ADDRESS LIMIT
  2126. op_SAM24 uint32 = 0x010C // FORMAT_E SET ADDRESSING MODE (24)
  2127. op_SAM31 uint32 = 0x010D // FORMAT_E SET ADDRESSING MODE (31)
  2128. op_SAM64 uint32 = 0x010E // FORMAT_E SET ADDRESSING MODE (64)
  2129. op_SAR uint32 = 0xB24E // FORMAT_RRE SET ACCESS
  2130. op_SCHM uint32 = 0xB23C // FORMAT_S SET CHANNEL MONITOR
  2131. op_SCK uint32 = 0xB204 // FORMAT_S SET CLOCK
  2132. op_SCKC uint32 = 0xB206 // FORMAT_S SET CLOCK COMPARATOR
  2133. op_SCKPF uint32 = 0x0107 // FORMAT_E SET CLOCK PROGRAMMABLE FIELD
  2134. op_SD uint32 = 0x6B00 // FORMAT_RX1 SUBTRACT NORMALIZED (long HFP)
  2135. op_SDB uint32 = 0xED1B // FORMAT_RXE SUBTRACT (long BFP)
  2136. op_SDBR uint32 = 0xB31B // FORMAT_RRE SUBTRACT (long BFP)
  2137. op_SDR uint32 = 0x2B00 // FORMAT_RR SUBTRACT NORMALIZED (long HFP)
  2138. op_SDTR uint32 = 0xB3D3 // FORMAT_RRF1 SUBTRACT (long DFP)
  2139. op_SDTRA uint32 = 0xB3D3 // FORMAT_RRF1 SUBTRACT (long DFP)
  2140. op_SE uint32 = 0x7B00 // FORMAT_RX1 SUBTRACT NORMALIZED (short HFP)
  2141. op_SEB uint32 = 0xED0B // FORMAT_RXE SUBTRACT (short BFP)
  2142. op_SEBR uint32 = 0xB30B // FORMAT_RRE SUBTRACT (short BFP)
  2143. op_SER uint32 = 0x3B00 // FORMAT_RR SUBTRACT NORMALIZED (short HFP)
  2144. op_SFASR uint32 = 0xB385 // FORMAT_RRE SET FPC AND SIGNAL
  2145. op_SFPC uint32 = 0xB384 // FORMAT_RRE SET FPC
  2146. op_SG uint32 = 0xE309 // FORMAT_RXY1 SUBTRACT (64)
  2147. op_SGF uint32 = 0xE319 // FORMAT_RXY1 SUBTRACT (64<-32)
  2148. op_SGFR uint32 = 0xB919 // FORMAT_RRE SUBTRACT (64<-32)
  2149. op_SGR uint32 = 0xB909 // FORMAT_RRE SUBTRACT (64)
  2150. op_SGRK uint32 = 0xB9E9 // FORMAT_RRF1 SUBTRACT (64)
  2151. op_SH uint32 = 0x4B00 // FORMAT_RX1 SUBTRACT HALFWORD
  2152. op_SHHHR uint32 = 0xB9C9 // FORMAT_RRF1 SUBTRACT HIGH (32)
  2153. op_SHHLR uint32 = 0xB9D9 // FORMAT_RRF1 SUBTRACT HIGH (32)
  2154. op_SHY uint32 = 0xE37B // FORMAT_RXY1 SUBTRACT HALFWORD
  2155. op_SIGP uint32 = 0xAE00 // FORMAT_RS1 SIGNAL PROCESSOR
  2156. op_SL uint32 = 0x5F00 // FORMAT_RX1 SUBTRACT LOGICAL (32)
  2157. op_SLA uint32 = 0x8B00 // FORMAT_RS1 SHIFT LEFT SINGLE (32)
  2158. op_SLAG uint32 = 0xEB0B // FORMAT_RSY1 SHIFT LEFT SINGLE (64)
  2159. op_SLAK uint32 = 0xEBDD // FORMAT_RSY1 SHIFT LEFT SINGLE (32)
  2160. op_SLB uint32 = 0xE399 // FORMAT_RXY1 SUBTRACT LOGICAL WITH BORROW (32)
  2161. op_SLBG uint32 = 0xE389 // FORMAT_RXY1 SUBTRACT LOGICAL WITH BORROW (64)
  2162. op_SLBGR uint32 = 0xB989 // FORMAT_RRE SUBTRACT LOGICAL WITH BORROW (64)
  2163. op_SLBR uint32 = 0xB999 // FORMAT_RRE SUBTRACT LOGICAL WITH BORROW (32)
  2164. op_SLDA uint32 = 0x8F00 // FORMAT_RS1 SHIFT LEFT DOUBLE
  2165. op_SLDL uint32 = 0x8D00 // FORMAT_RS1 SHIFT LEFT DOUBLE LOGICAL
  2166. op_SLDT uint32 = 0xED40 // FORMAT_RXF SHIFT SIGNIFICAND LEFT (long DFP)
  2167. op_SLFI uint32 = 0xC205 // FORMAT_RIL1 SUBTRACT LOGICAL IMMEDIATE (32)
  2168. op_SLG uint32 = 0xE30B // FORMAT_RXY1 SUBTRACT LOGICAL (64)
  2169. op_SLGF uint32 = 0xE31B // FORMAT_RXY1 SUBTRACT LOGICAL (64<-32)
  2170. op_SLGFI uint32 = 0xC204 // FORMAT_RIL1 SUBTRACT LOGICAL IMMEDIATE (64<-32)
  2171. op_SLGFR uint32 = 0xB91B // FORMAT_RRE SUBTRACT LOGICAL (64<-32)
  2172. op_SLGR uint32 = 0xB90B // FORMAT_RRE SUBTRACT LOGICAL (64)
  2173. op_SLGRK uint32 = 0xB9EB // FORMAT_RRF1 SUBTRACT LOGICAL (64)
  2174. op_SLHHHR uint32 = 0xB9CB // FORMAT_RRF1 SUBTRACT LOGICAL HIGH (32)
  2175. op_SLHHLR uint32 = 0xB9DB // FORMAT_RRF1 SUBTRACT LOGICAL HIGH (32)
  2176. op_SLL uint32 = 0x8900 // FORMAT_RS1 SHIFT LEFT SINGLE LOGICAL (32)
  2177. op_SLLG uint32 = 0xEB0D // FORMAT_RSY1 SHIFT LEFT SINGLE LOGICAL (64)
  2178. op_SLLK uint32 = 0xEBDF // FORMAT_RSY1 SHIFT LEFT SINGLE LOGICAL (32)
  2179. op_SLR uint32 = 0x1F00 // FORMAT_RR SUBTRACT LOGICAL (32)
  2180. op_SLRK uint32 = 0xB9FB // FORMAT_RRF1 SUBTRACT LOGICAL (32)
  2181. op_SLXT uint32 = 0xED48 // FORMAT_RXF SHIFT SIGNIFICAND LEFT (extended DFP)
  2182. op_SLY uint32 = 0xE35F // FORMAT_RXY1 SUBTRACT LOGICAL (32)
  2183. op_SP uint32 = 0xFB00 // FORMAT_SS2 SUBTRACT DECIMAL
  2184. op_SPKA uint32 = 0xB20A // FORMAT_S SET PSW KEY FROM ADDRESS
  2185. op_SPM uint32 = 0x0400 // FORMAT_RR SET PROGRAM MASK
  2186. op_SPT uint32 = 0xB208 // FORMAT_S SET CPU TIMER
  2187. op_SPX uint32 = 0xB210 // FORMAT_S SET PREFIX
  2188. op_SQD uint32 = 0xED35 // FORMAT_RXE SQUARE ROOT (long HFP)
  2189. op_SQDB uint32 = 0xED15 // FORMAT_RXE SQUARE ROOT (long BFP)
  2190. op_SQDBR uint32 = 0xB315 // FORMAT_RRE SQUARE ROOT (long BFP)
  2191. op_SQDR uint32 = 0xB244 // FORMAT_RRE SQUARE ROOT (long HFP)
  2192. op_SQE uint32 = 0xED34 // FORMAT_RXE SQUARE ROOT (short HFP)
  2193. op_SQEB uint32 = 0xED14 // FORMAT_RXE SQUARE ROOT (short BFP)
  2194. op_SQEBR uint32 = 0xB314 // FORMAT_RRE SQUARE ROOT (short BFP)
  2195. op_SQER uint32 = 0xB245 // FORMAT_RRE SQUARE ROOT (short HFP)
  2196. op_SQXBR uint32 = 0xB316 // FORMAT_RRE SQUARE ROOT (extended BFP)
  2197. op_SQXR uint32 = 0xB336 // FORMAT_RRE SQUARE ROOT (extended HFP)
  2198. op_SR uint32 = 0x1B00 // FORMAT_RR SUBTRACT (32)
  2199. op_SRA uint32 = 0x8A00 // FORMAT_RS1 SHIFT RIGHT SINGLE (32)
  2200. op_SRAG uint32 = 0xEB0A // FORMAT_RSY1 SHIFT RIGHT SINGLE (64)
  2201. op_SRAK uint32 = 0xEBDC // FORMAT_RSY1 SHIFT RIGHT SINGLE (32)
  2202. op_SRDA uint32 = 0x8E00 // FORMAT_RS1 SHIFT RIGHT DOUBLE
  2203. op_SRDL uint32 = 0x8C00 // FORMAT_RS1 SHIFT RIGHT DOUBLE LOGICAL
  2204. op_SRDT uint32 = 0xED41 // FORMAT_RXF SHIFT SIGNIFICAND RIGHT (long DFP)
  2205. op_SRK uint32 = 0xB9F9 // FORMAT_RRF1 SUBTRACT (32)
  2206. op_SRL uint32 = 0x8800 // FORMAT_RS1 SHIFT RIGHT SINGLE LOGICAL (32)
  2207. op_SRLG uint32 = 0xEB0C // FORMAT_RSY1 SHIFT RIGHT SINGLE LOGICAL (64)
  2208. op_SRLK uint32 = 0xEBDE // FORMAT_RSY1 SHIFT RIGHT SINGLE LOGICAL (32)
  2209. op_SRNM uint32 = 0xB299 // FORMAT_S SET BFP ROUNDING MODE (2 bit)
  2210. op_SRNMB uint32 = 0xB2B8 // FORMAT_S SET BFP ROUNDING MODE (3 bit)
  2211. op_SRNMT uint32 = 0xB2B9 // FORMAT_S SET DFP ROUNDING MODE
  2212. op_SRP uint32 = 0xF000 // FORMAT_SS3 SHIFT AND ROUND DECIMAL
  2213. op_SRST uint32 = 0xB25E // FORMAT_RRE SEARCH STRING
  2214. op_SRSTU uint32 = 0xB9BE // FORMAT_RRE SEARCH STRING UNICODE
  2215. op_SRXT uint32 = 0xED49 // FORMAT_RXF SHIFT SIGNIFICAND RIGHT (extended DFP)
  2216. op_SSAIR uint32 = 0xB99F // FORMAT_RRE SET SECONDARY ASN WITH INSTANCE
  2217. op_SSAR uint32 = 0xB225 // FORMAT_RRE SET SECONDARY ASN
  2218. op_SSCH uint32 = 0xB233 // FORMAT_S START SUBCHANNEL
  2219. op_SSKE uint32 = 0xB22B // FORMAT_RRF3 SET STORAGE KEY EXTENDED
  2220. op_SSM uint32 = 0x8000 // FORMAT_S SET SYSTEM MASK
  2221. op_ST uint32 = 0x5000 // FORMAT_RX1 STORE (32)
  2222. op_STAM uint32 = 0x9B00 // FORMAT_RS1 STORE ACCESS MULTIPLE
  2223. op_STAMY uint32 = 0xEB9B // FORMAT_RSY1 STORE ACCESS MULTIPLE
  2224. op_STAP uint32 = 0xB212 // FORMAT_S STORE CPU ADDRESS
  2225. op_STC uint32 = 0x4200 // FORMAT_RX1 STORE CHARACTER
  2226. op_STCH uint32 = 0xE3C3 // FORMAT_RXY1 STORE CHARACTER HIGH (8)
  2227. op_STCK uint32 = 0xB205 // FORMAT_S STORE CLOCK
  2228. op_STCKC uint32 = 0xB207 // FORMAT_S STORE CLOCK COMPARATOR
  2229. op_STCKE uint32 = 0xB278 // FORMAT_S STORE CLOCK EXTENDED
  2230. op_STCKF uint32 = 0xB27C // FORMAT_S STORE CLOCK FAST
  2231. op_STCM uint32 = 0xBE00 // FORMAT_RS2 STORE CHARACTERS UNDER MASK (low)
  2232. op_STCMH uint32 = 0xEB2C // FORMAT_RSY2 STORE CHARACTERS UNDER MASK (high)
  2233. op_STCMY uint32 = 0xEB2D // FORMAT_RSY2 STORE CHARACTERS UNDER MASK (low)
  2234. op_STCPS uint32 = 0xB23A // FORMAT_S STORE CHANNEL PATH STATUS
  2235. op_STCRW uint32 = 0xB239 // FORMAT_S STORE CHANNEL REPORT WORD
  2236. op_STCTG uint32 = 0xEB25 // FORMAT_RSY1 STORE CONTROL (64)
  2237. op_STCTL uint32 = 0xB600 // FORMAT_RS1 STORE CONTROL (32)
  2238. op_STCY uint32 = 0xE372 // FORMAT_RXY1 STORE CHARACTER
  2239. op_STD uint32 = 0x6000 // FORMAT_RX1 STORE (long)
  2240. op_STDY uint32 = 0xED67 // FORMAT_RXY1 STORE (long)
  2241. op_STE uint32 = 0x7000 // FORMAT_RX1 STORE (short)
  2242. op_STEY uint32 = 0xED66 // FORMAT_RXY1 STORE (short)
  2243. op_STFH uint32 = 0xE3CB // FORMAT_RXY1 STORE HIGH (32)
  2244. op_STFL uint32 = 0xB2B1 // FORMAT_S STORE FACILITY LIST
  2245. op_STFLE uint32 = 0xB2B0 // FORMAT_S STORE FACILITY LIST EXTENDED
  2246. op_STFPC uint32 = 0xB29C // FORMAT_S STORE FPC
  2247. op_STG uint32 = 0xE324 // FORMAT_RXY1 STORE (64)
  2248. op_STGRL uint32 = 0xC40B // FORMAT_RIL2 STORE RELATIVE LONG (64)
  2249. op_STH uint32 = 0x4000 // FORMAT_RX1 STORE HALFWORD
  2250. op_STHH uint32 = 0xE3C7 // FORMAT_RXY1 STORE HALFWORD HIGH (16)
  2251. op_STHRL uint32 = 0xC407 // FORMAT_RIL2 STORE HALFWORD RELATIVE LONG
  2252. op_STHY uint32 = 0xE370 // FORMAT_RXY1 STORE HALFWORD
  2253. op_STIDP uint32 = 0xB202 // FORMAT_S STORE CPU ID
  2254. op_STM uint32 = 0x9000 // FORMAT_RS1 STORE MULTIPLE (32)
  2255. op_STMG uint32 = 0xEB24 // FORMAT_RSY1 STORE MULTIPLE (64)
  2256. op_STMH uint32 = 0xEB26 // FORMAT_RSY1 STORE MULTIPLE HIGH
  2257. op_STMY uint32 = 0xEB90 // FORMAT_RSY1 STORE MULTIPLE (32)
  2258. op_STNSM uint32 = 0xAC00 // FORMAT_SI STORE THEN AND SYSTEM MASK
  2259. op_STOC uint32 = 0xEBF3 // FORMAT_RSY2 STORE ON CONDITION (32)
  2260. op_STOCG uint32 = 0xEBE3 // FORMAT_RSY2 STORE ON CONDITION (64)
  2261. op_STOSM uint32 = 0xAD00 // FORMAT_SI STORE THEN OR SYSTEM MASK
  2262. op_STPQ uint32 = 0xE38E // FORMAT_RXY1 STORE PAIR TO QUADWORD
  2263. op_STPT uint32 = 0xB209 // FORMAT_S STORE CPU TIMER
  2264. op_STPX uint32 = 0xB211 // FORMAT_S STORE PREFIX
  2265. op_STRAG uint32 = 0xE502 // FORMAT_SSE STORE REAL ADDRESS
  2266. op_STRL uint32 = 0xC40F // FORMAT_RIL2 STORE RELATIVE LONG (32)
  2267. op_STRV uint32 = 0xE33E // FORMAT_RXY1 STORE REVERSED (32)
  2268. op_STRVG uint32 = 0xE32F // FORMAT_RXY1 STORE REVERSED (64)
  2269. op_STRVH uint32 = 0xE33F // FORMAT_RXY1 STORE REVERSED (16)
  2270. op_STSCH uint32 = 0xB234 // FORMAT_S STORE SUBCHANNEL
  2271. op_STSI uint32 = 0xB27D // FORMAT_S STORE SYSTEM INFORMATION
  2272. op_STURA uint32 = 0xB246 // FORMAT_RRE STORE USING REAL ADDRESS (32)
  2273. op_STURG uint32 = 0xB925 // FORMAT_RRE STORE USING REAL ADDRESS (64)
  2274. op_STY uint32 = 0xE350 // FORMAT_RXY1 STORE (32)
  2275. op_SU uint32 = 0x7F00 // FORMAT_RX1 SUBTRACT UNNORMALIZED (short HFP)
  2276. op_SUR uint32 = 0x3F00 // FORMAT_RR SUBTRACT UNNORMALIZED (short HFP)
  2277. op_SVC uint32 = 0x0A00 // FORMAT_I SUPERVISOR CALL
  2278. op_SW uint32 = 0x6F00 // FORMAT_RX1 SUBTRACT UNNORMALIZED (long HFP)
  2279. op_SWR uint32 = 0x2F00 // FORMAT_RR SUBTRACT UNNORMALIZED (long HFP)
  2280. op_SXBR uint32 = 0xB34B // FORMAT_RRE SUBTRACT (extended BFP)
  2281. op_SXR uint32 = 0x3700 // FORMAT_RR SUBTRACT NORMALIZED (extended HFP)
  2282. op_SXTR uint32 = 0xB3DB // FORMAT_RRF1 SUBTRACT (extended DFP)
  2283. op_SXTRA uint32 = 0xB3DB // FORMAT_RRF1 SUBTRACT (extended DFP)
  2284. op_SY uint32 = 0xE35B // FORMAT_RXY1 SUBTRACT (32)
  2285. op_TABORT uint32 = 0xB2FC // FORMAT_S TRANSACTION ABORT
  2286. op_TAM uint32 = 0x010B // FORMAT_E TEST ADDRESSING MODE
  2287. op_TAR uint32 = 0xB24C // FORMAT_RRE TEST ACCESS
  2288. op_TB uint32 = 0xB22C // FORMAT_RRE TEST BLOCK
  2289. op_TBDR uint32 = 0xB351 // FORMAT_RRF5 CONVERT HFP TO BFP (long)
  2290. op_TBEDR uint32 = 0xB350 // FORMAT_RRF5 CONVERT HFP TO BFP (long to short)
  2291. op_TBEGIN uint32 = 0xE560 // FORMAT_SIL TRANSACTION BEGIN
  2292. op_TBEGINC uint32 = 0xE561 // FORMAT_SIL TRANSACTION BEGIN
  2293. op_TCDB uint32 = 0xED11 // FORMAT_RXE TEST DATA CLASS (long BFP)
  2294. op_TCEB uint32 = 0xED10 // FORMAT_RXE TEST DATA CLASS (short BFP)
  2295. op_TCXB uint32 = 0xED12 // FORMAT_RXE TEST DATA CLASS (extended BFP)
  2296. op_TDCDT uint32 = 0xED54 // FORMAT_RXE TEST DATA CLASS (long DFP)
  2297. op_TDCET uint32 = 0xED50 // FORMAT_RXE TEST DATA CLASS (short DFP)
  2298. op_TDCXT uint32 = 0xED58 // FORMAT_RXE TEST DATA CLASS (extended DFP)
  2299. op_TDGDT uint32 = 0xED55 // FORMAT_RXE TEST DATA GROUP (long DFP)
  2300. op_TDGET uint32 = 0xED51 // FORMAT_RXE TEST DATA GROUP (short DFP)
  2301. op_TDGXT uint32 = 0xED59 // FORMAT_RXE TEST DATA GROUP (extended DFP)
  2302. op_TEND uint32 = 0xB2F8 // FORMAT_S TRANSACTION END
  2303. op_THDER uint32 = 0xB358 // FORMAT_RRE CONVERT BFP TO HFP (short to long)
  2304. op_THDR uint32 = 0xB359 // FORMAT_RRE CONVERT BFP TO HFP (long)
  2305. op_TM uint32 = 0x9100 // FORMAT_SI TEST UNDER MASK
  2306. op_TMH uint32 = 0xA700 // FORMAT_RI1 TEST UNDER MASK HIGH
  2307. op_TMHH uint32 = 0xA702 // FORMAT_RI1 TEST UNDER MASK (high high)
  2308. op_TMHL uint32 = 0xA703 // FORMAT_RI1 TEST UNDER MASK (high low)
  2309. op_TML uint32 = 0xA701 // FORMAT_RI1 TEST UNDER MASK LOW
  2310. op_TMLH uint32 = 0xA700 // FORMAT_RI1 TEST UNDER MASK (low high)
  2311. op_TMLL uint32 = 0xA701 // FORMAT_RI1 TEST UNDER MASK (low low)
  2312. op_TMY uint32 = 0xEB51 // FORMAT_SIY TEST UNDER MASK
  2313. op_TP uint32 = 0xEBC0 // FORMAT_RSL TEST DECIMAL
  2314. op_TPI uint32 = 0xB236 // FORMAT_S TEST PENDING INTERRUPTION
  2315. op_TPROT uint32 = 0xE501 // FORMAT_SSE TEST PROTECTION
  2316. op_TR uint32 = 0xDC00 // FORMAT_SS1 TRANSLATE
  2317. op_TRACE uint32 = 0x9900 // FORMAT_RS1 TRACE (32)
  2318. op_TRACG uint32 = 0xEB0F // FORMAT_RSY1 TRACE (64)
  2319. op_TRAP2 uint32 = 0x01FF // FORMAT_E TRAP
  2320. op_TRAP4 uint32 = 0xB2FF // FORMAT_S TRAP
  2321. op_TRE uint32 = 0xB2A5 // FORMAT_RRE TRANSLATE EXTENDED
  2322. op_TROO uint32 = 0xB993 // FORMAT_RRF3 TRANSLATE ONE TO ONE
  2323. op_TROT uint32 = 0xB992 // FORMAT_RRF3 TRANSLATE ONE TO TWO
  2324. op_TRT uint32 = 0xDD00 // FORMAT_SS1 TRANSLATE AND TEST
  2325. op_TRTE uint32 = 0xB9BF // FORMAT_RRF3 TRANSLATE AND TEST EXTENDED
  2326. op_TRTO uint32 = 0xB991 // FORMAT_RRF3 TRANSLATE TWO TO ONE
  2327. op_TRTR uint32 = 0xD000 // FORMAT_SS1 TRANSLATE AND TEST REVERSE
  2328. op_TRTRE uint32 = 0xB9BD // FORMAT_RRF3 TRANSLATE AND TEST REVERSE EXTENDED
  2329. op_TRTT uint32 = 0xB990 // FORMAT_RRF3 TRANSLATE TWO TO TWO
  2330. op_TS uint32 = 0x9300 // FORMAT_S TEST AND SET
  2331. op_TSCH uint32 = 0xB235 // FORMAT_S TEST SUBCHANNEL
  2332. op_UNPK uint32 = 0xF300 // FORMAT_SS2 UNPACK
  2333. op_UNPKA uint32 = 0xEA00 // FORMAT_SS1 UNPACK ASCII
  2334. op_UNPKU uint32 = 0xE200 // FORMAT_SS1 UNPACK UNICODE
  2335. op_UPT uint32 = 0x0102 // FORMAT_E UPDATE TREE
  2336. op_X uint32 = 0x5700 // FORMAT_RX1 EXCLUSIVE OR (32)
  2337. op_XC uint32 = 0xD700 // FORMAT_SS1 EXCLUSIVE OR (character)
  2338. op_XG uint32 = 0xE382 // FORMAT_RXY1 EXCLUSIVE OR (64)
  2339. op_XGR uint32 = 0xB982 // FORMAT_RRE EXCLUSIVE OR (64)
  2340. op_XGRK uint32 = 0xB9E7 // FORMAT_RRF1 EXCLUSIVE OR (64)
  2341. op_XI uint32 = 0x9700 // FORMAT_SI EXCLUSIVE OR (immediate)
  2342. op_XIHF uint32 = 0xC006 // FORMAT_RIL1 EXCLUSIVE OR IMMEDIATE (high)
  2343. op_XILF uint32 = 0xC007 // FORMAT_RIL1 EXCLUSIVE OR IMMEDIATE (low)
  2344. op_XIY uint32 = 0xEB57 // FORMAT_SIY EXCLUSIVE OR (immediate)
  2345. op_XR uint32 = 0x1700 // FORMAT_RR EXCLUSIVE OR (32)
  2346. op_XRK uint32 = 0xB9F7 // FORMAT_RRF1 EXCLUSIVE OR (32)
  2347. op_XSCH uint32 = 0xB276 // FORMAT_S CANCEL SUBCHANNEL
  2348. op_XY uint32 = 0xE357 // FORMAT_RXY1 EXCLUSIVE OR (32)
  2349. op_ZAP uint32 = 0xF800 // FORMAT_SS2 ZERO AND ADD
  2350. // added in z13
  2351. op_CXPT uint32 = 0xEDAF // RSL-b CONVERT FROM PACKED (to extended DFP)
  2352. op_CDPT uint32 = 0xEDAE // RSL-b CONVERT FROM PACKED (to long DFP)
  2353. op_CPXT uint32 = 0xEDAD // RSL-b CONVERT TO PACKED (from extended DFP)
  2354. op_CPDT uint32 = 0xEDAC // RSL-b CONVERT TO PACKED (from long DFP)
  2355. op_LZRF uint32 = 0xE33B // RXY-a LOAD AND ZERO RIGHTMOST BYTE (32)
  2356. op_LZRG uint32 = 0xE32A // RXY-a LOAD AND ZERO RIGHTMOST BYTE (64)
  2357. op_LCCB uint32 = 0xE727 // RXE LOAD COUNT TO BLOCK BOUNDARY
  2358. op_LOCHHI uint32 = 0xEC4E // RIE-g LOAD HALFWORD HIGH IMMEDIATE ON CONDITION (32←16)
  2359. op_LOCHI uint32 = 0xEC42 // RIE-g LOAD HALFWORD IMMEDIATE ON CONDITION (32←16)
  2360. op_LOCGHI uint32 = 0xEC46 // RIE-g LOAD HALFWORD IMMEDIATE ON CONDITION (64←16)
  2361. op_LOCFH uint32 = 0xEBE0 // RSY-b LOAD HIGH ON CONDITION (32)
  2362. op_LOCFHR uint32 = 0xB9E0 // RRF-c LOAD HIGH ON CONDITION (32)
  2363. op_LLZRGF uint32 = 0xE33A // RXY-a LOAD LOGICAL AND ZERO RIGHTMOST BYTE (64←32)
  2364. op_STOCFH uint32 = 0xEBE1 // RSY-b STORE HIGH ON CONDITION
  2365. op_VA uint32 = 0xE7F3 // VRR-c VECTOR ADD
  2366. op_VACC uint32 = 0xE7F1 // VRR-c VECTOR ADD COMPUTE CARRY
  2367. op_VAC uint32 = 0xE7BB // VRR-d VECTOR ADD WITH CARRY
  2368. op_VACCC uint32 = 0xE7B9 // VRR-d VECTOR ADD WITH CARRY COMPUTE CARRY
  2369. op_VN uint32 = 0xE768 // VRR-c VECTOR AND
  2370. op_VNC uint32 = 0xE769 // VRR-c VECTOR AND WITH COMPLEMENT
  2371. op_VAVG uint32 = 0xE7F2 // VRR-c VECTOR AVERAGE
  2372. op_VAVGL uint32 = 0xE7F0 // VRR-c VECTOR AVERAGE LOGICAL
  2373. op_VCKSM uint32 = 0xE766 // VRR-c VECTOR CHECKSUM
  2374. op_VCEQ uint32 = 0xE7F8 // VRR-b VECTOR COMPARE EQUAL
  2375. op_VCH uint32 = 0xE7FB // VRR-b VECTOR COMPARE HIGH
  2376. op_VCHL uint32 = 0xE7F9 // VRR-b VECTOR COMPARE HIGH LOGICAL
  2377. op_VCLZ uint32 = 0xE753 // VRR-a VECTOR COUNT LEADING ZEROS
  2378. op_VCTZ uint32 = 0xE752 // VRR-a VECTOR COUNT TRAILING ZEROS
  2379. op_VEC uint32 = 0xE7DB // VRR-a VECTOR ELEMENT COMPARE
  2380. op_VECL uint32 = 0xE7D9 // VRR-a VECTOR ELEMENT COMPARE LOGICAL
  2381. op_VERIM uint32 = 0xE772 // VRI-d VECTOR ELEMENT ROTATE AND INSERT UNDER MASK
  2382. op_VERLL uint32 = 0xE733 // VRS-a VECTOR ELEMENT ROTATE LEFT LOGICAL
  2383. op_VERLLV uint32 = 0xE773 // VRR-c VECTOR ELEMENT ROTATE LEFT LOGICAL
  2384. op_VESLV uint32 = 0xE770 // VRR-c VECTOR ELEMENT SHIFT LEFT
  2385. op_VESL uint32 = 0xE730 // VRS-a VECTOR ELEMENT SHIFT LEFT
  2386. op_VESRA uint32 = 0xE73A // VRS-a VECTOR ELEMENT SHIFT RIGHT ARITHMETIC
  2387. op_VESRAV uint32 = 0xE77A // VRR-c VECTOR ELEMENT SHIFT RIGHT ARITHMETIC
  2388. op_VESRL uint32 = 0xE738 // VRS-a VECTOR ELEMENT SHIFT RIGHT LOGICAL
  2389. op_VESRLV uint32 = 0xE778 // VRR-c VECTOR ELEMENT SHIFT RIGHT LOGICAL
  2390. op_VX uint32 = 0xE76D // VRR-c VECTOR EXCLUSIVE OR
  2391. op_VFAE uint32 = 0xE782 // VRR-b VECTOR FIND ANY ELEMENT EQUAL
  2392. op_VFEE uint32 = 0xE780 // VRR-b VECTOR FIND ELEMENT EQUAL
  2393. op_VFENE uint32 = 0xE781 // VRR-b VECTOR FIND ELEMENT NOT EQUAL
  2394. op_VFA uint32 = 0xE7E3 // VRR-c VECTOR FP ADD
  2395. op_WFK uint32 = 0xE7CA // VRR-a VECTOR FP COMPARE AND SIGNAL SCALAR
  2396. op_VFCE uint32 = 0xE7E8 // VRR-c VECTOR FP COMPARE EQUAL
  2397. op_VFCH uint32 = 0xE7EB // VRR-c VECTOR FP COMPARE HIGH
  2398. op_VFCHE uint32 = 0xE7EA // VRR-c VECTOR FP COMPARE HIGH OR EQUAL
  2399. op_WFC uint32 = 0xE7CB // VRR-a VECTOR FP COMPARE SCALAR
  2400. op_VCDG uint32 = 0xE7C3 // VRR-a VECTOR FP CONVERT FROM FIXED 64-BIT
  2401. op_VCDLG uint32 = 0xE7C1 // VRR-a VECTOR FP CONVERT FROM LOGICAL 64-BIT
  2402. op_VCGD uint32 = 0xE7C2 // VRR-a VECTOR FP CONVERT TO FIXED 64-BIT
  2403. op_VCLGD uint32 = 0xE7C0 // VRR-a VECTOR FP CONVERT TO LOGICAL 64-BIT
  2404. op_VFD uint32 = 0xE7E5 // VRR-c VECTOR FP DIVIDE
  2405. op_VLDE uint32 = 0xE7C4 // VRR-a VECTOR FP LOAD LENGTHENED
  2406. op_VLED uint32 = 0xE7C5 // VRR-a VECTOR FP LOAD ROUNDED
  2407. op_VFM uint32 = 0xE7E7 // VRR-c VECTOR FP MULTIPLY
  2408. op_VFMA uint32 = 0xE78F // VRR-e VECTOR FP MULTIPLY AND ADD
  2409. op_VFMS uint32 = 0xE78E // VRR-e VECTOR FP MULTIPLY AND SUBTRACT
  2410. op_VFPSO uint32 = 0xE7CC // VRR-a VECTOR FP PERFORM SIGN OPERATION
  2411. op_VFSQ uint32 = 0xE7CE // VRR-a VECTOR FP SQUARE ROOT
  2412. op_VFS uint32 = 0xE7E2 // VRR-c VECTOR FP SUBTRACT
  2413. op_VFTCI uint32 = 0xE74A // VRI-e VECTOR FP TEST DATA CLASS IMMEDIATE
  2414. op_VGFM uint32 = 0xE7B4 // VRR-c VECTOR GALOIS FIELD MULTIPLY SUM
  2415. op_VGFMA uint32 = 0xE7BC // VRR-d VECTOR GALOIS FIELD MULTIPLY SUM AND ACCUMULATE
  2416. op_VGEF uint32 = 0xE713 // VRV VECTOR GATHER ELEMENT (32)
  2417. op_VGEG uint32 = 0xE712 // VRV VECTOR GATHER ELEMENT (64)
  2418. op_VGBM uint32 = 0xE744 // VRI-a VECTOR GENERATE BYTE MASK
  2419. op_VGM uint32 = 0xE746 // VRI-b VECTOR GENERATE MASK
  2420. op_VISTR uint32 = 0xE75C // VRR-a VECTOR ISOLATE STRING
  2421. op_VL uint32 = 0xE706 // VRX VECTOR LOAD
  2422. op_VLR uint32 = 0xE756 // VRR-a VECTOR LOAD
  2423. op_VLREP uint32 = 0xE705 // VRX VECTOR LOAD AND REPLICATE
  2424. op_VLC uint32 = 0xE7DE // VRR-a VECTOR LOAD COMPLEMENT
  2425. op_VLEH uint32 = 0xE701 // VRX VECTOR LOAD ELEMENT (16)
  2426. op_VLEF uint32 = 0xE703 // VRX VECTOR LOAD ELEMENT (32)
  2427. op_VLEG uint32 = 0xE702 // VRX VECTOR LOAD ELEMENT (64)
  2428. op_VLEB uint32 = 0xE700 // VRX VECTOR LOAD ELEMENT (8)
  2429. op_VLEIH uint32 = 0xE741 // VRI-a VECTOR LOAD ELEMENT IMMEDIATE (16)
  2430. op_VLEIF uint32 = 0xE743 // VRI-a VECTOR LOAD ELEMENT IMMEDIATE (32)
  2431. op_VLEIG uint32 = 0xE742 // VRI-a VECTOR LOAD ELEMENT IMMEDIATE (64)
  2432. op_VLEIB uint32 = 0xE740 // VRI-a VECTOR LOAD ELEMENT IMMEDIATE (8)
  2433. op_VFI uint32 = 0xE7C7 // VRR-a VECTOR LOAD FP INTEGER
  2434. op_VLGV uint32 = 0xE721 // VRS-c VECTOR LOAD GR FROM VR ELEMENT
  2435. op_VLLEZ uint32 = 0xE704 // VRX VECTOR LOAD LOGICAL ELEMENT AND ZERO
  2436. op_VLM uint32 = 0xE736 // VRS-a VECTOR LOAD MULTIPLE
  2437. op_VLP uint32 = 0xE7DF // VRR-a VECTOR LOAD POSITIVE
  2438. op_VLBB uint32 = 0xE707 // VRX VECTOR LOAD TO BLOCK BOUNDARY
  2439. op_VLVG uint32 = 0xE722 // VRS-b VECTOR LOAD VR ELEMENT FROM GR
  2440. op_VLVGP uint32 = 0xE762 // VRR-f VECTOR LOAD VR FROM GRS DISJOINT
  2441. op_VLL uint32 = 0xE737 // VRS-b VECTOR LOAD WITH LENGTH
  2442. op_VMX uint32 = 0xE7FF // VRR-c VECTOR MAXIMUM
  2443. op_VMXL uint32 = 0xE7FD // VRR-c VECTOR MAXIMUM LOGICAL
  2444. op_VMRH uint32 = 0xE761 // VRR-c VECTOR MERGE HIGH
  2445. op_VMRL uint32 = 0xE760 // VRR-c VECTOR MERGE LOW
  2446. op_VMN uint32 = 0xE7FE // VRR-c VECTOR MINIMUM
  2447. op_VMNL uint32 = 0xE7FC // VRR-c VECTOR MINIMUM LOGICAL
  2448. op_VMAE uint32 = 0xE7AE // VRR-d VECTOR MULTIPLY AND ADD EVEN
  2449. op_VMAH uint32 = 0xE7AB // VRR-d VECTOR MULTIPLY AND ADD HIGH
  2450. op_VMALE uint32 = 0xE7AC // VRR-d VECTOR MULTIPLY AND ADD LOGICAL EVEN
  2451. op_VMALH uint32 = 0xE7A9 // VRR-d VECTOR MULTIPLY AND ADD LOGICAL HIGH
  2452. op_VMALO uint32 = 0xE7AD // VRR-d VECTOR MULTIPLY AND ADD LOGICAL ODD
  2453. op_VMAL uint32 = 0xE7AA // VRR-d VECTOR MULTIPLY AND ADD LOW
  2454. op_VMAO uint32 = 0xE7AF // VRR-d VECTOR MULTIPLY AND ADD ODD
  2455. op_VME uint32 = 0xE7A6 // VRR-c VECTOR MULTIPLY EVEN
  2456. op_VMH uint32 = 0xE7A3 // VRR-c VECTOR MULTIPLY HIGH
  2457. op_VMLE uint32 = 0xE7A4 // VRR-c VECTOR MULTIPLY EVEN LOGICAL
  2458. op_VMLH uint32 = 0xE7A1 // VRR-c VECTOR MULTIPLY HIGH LOGICAL
  2459. op_VMLO uint32 = 0xE7A5 // VRR-c VECTOR MULTIPLY ODD LOGICAL
  2460. op_VML uint32 = 0xE7A2 // VRR-c VECTOR MULTIPLY LOW
  2461. op_VMO uint32 = 0xE7A7 // VRR-c VECTOR MULTIPLY ODD
  2462. op_VNO uint32 = 0xE76B // VRR-c VECTOR NOR
  2463. op_VO uint32 = 0xE76A // VRR-c VECTOR OR
  2464. op_VPK uint32 = 0xE794 // VRR-c VECTOR PACK
  2465. op_VPKLS uint32 = 0xE795 // VRR-b VECTOR PACK LOGICAL SATURATE
  2466. op_VPKS uint32 = 0xE797 // VRR-b VECTOR PACK SATURATE
  2467. op_VPERM uint32 = 0xE78C // VRR-e VECTOR PERMUTE
  2468. op_VPDI uint32 = 0xE784 // VRR-c VECTOR PERMUTE DOUBLEWORD IMMEDIATE
  2469. op_VPOPCT uint32 = 0xE750 // VRR-a VECTOR POPULATION COUNT
  2470. op_VREP uint32 = 0xE74D // VRI-c VECTOR REPLICATE
  2471. op_VREPI uint32 = 0xE745 // VRI-a VECTOR REPLICATE IMMEDIATE
  2472. op_VSCEF uint32 = 0xE71B // VRV VECTOR SCATTER ELEMENT (32)
  2473. op_VSCEG uint32 = 0xE71A // VRV VECTOR SCATTER ELEMENT (64)
  2474. op_VSEL uint32 = 0xE78D // VRR-e VECTOR SELECT
  2475. op_VSL uint32 = 0xE774 // VRR-c VECTOR SHIFT LEFT
  2476. op_VSLB uint32 = 0xE775 // VRR-c VECTOR SHIFT LEFT BY BYTE
  2477. op_VSLDB uint32 = 0xE777 // VRI-d VECTOR SHIFT LEFT DOUBLE BY BYTE
  2478. op_VSRA uint32 = 0xE77E // VRR-c VECTOR SHIFT RIGHT ARITHMETIC
  2479. op_VSRAB uint32 = 0xE77F // VRR-c VECTOR SHIFT RIGHT ARITHMETIC BY BYTE
  2480. op_VSRL uint32 = 0xE77C // VRR-c VECTOR SHIFT RIGHT LOGICAL
  2481. op_VSRLB uint32 = 0xE77D // VRR-c VECTOR SHIFT RIGHT LOGICAL BY BYTE
  2482. op_VSEG uint32 = 0xE75F // VRR-a VECTOR SIGN EXTEND TO DOUBLEWORD
  2483. op_VST uint32 = 0xE70E // VRX VECTOR STORE
  2484. op_VSTEH uint32 = 0xE709 // VRX VECTOR STORE ELEMENT (16)
  2485. op_VSTEF uint32 = 0xE70B // VRX VECTOR STORE ELEMENT (32)
  2486. op_VSTEG uint32 = 0xE70A // VRX VECTOR STORE ELEMENT (64)
  2487. op_VSTEB uint32 = 0xE708 // VRX VECTOR STORE ELEMENT (8)
  2488. op_VSTM uint32 = 0xE73E // VRS-a VECTOR STORE MULTIPLE
  2489. op_VSTL uint32 = 0xE73F // VRS-b VECTOR STORE WITH LENGTH
  2490. op_VSTRC uint32 = 0xE78A // VRR-d VECTOR STRING RANGE COMPARE
  2491. op_VS uint32 = 0xE7F7 // VRR-c VECTOR SUBTRACT
  2492. op_VSCBI uint32 = 0xE7F5 // VRR-c VECTOR SUBTRACT COMPUTE BORROW INDICATION
  2493. op_VSBCBI uint32 = 0xE7BD // VRR-d VECTOR SUBTRACT WITH BORROW COMPUTE BORROW INDICATION
  2494. op_VSBI uint32 = 0xE7BF // VRR-d VECTOR SUBTRACT WITH BORROW INDICATION
  2495. op_VSUMG uint32 = 0xE765 // VRR-c VECTOR SUM ACROSS DOUBLEWORD
  2496. op_VSUMQ uint32 = 0xE767 // VRR-c VECTOR SUM ACROSS QUADWORD
  2497. op_VSUM uint32 = 0xE764 // VRR-c VECTOR SUM ACROSS WORD
  2498. op_VTM uint32 = 0xE7D8 // VRR-a VECTOR TEST UNDER MASK
  2499. op_VUPH uint32 = 0xE7D7 // VRR-a VECTOR UNPACK HIGH
  2500. op_VUPLH uint32 = 0xE7D5 // VRR-a VECTOR UNPACK LOGICAL HIGH
  2501. op_VUPLL uint32 = 0xE7D4 // VRR-a VECTOR UNPACK LOGICAL LOW
  2502. op_VUPL uint32 = 0xE7D6 // VRR-a VECTOR UNPACK LOW
  2503. op_VMSL uint32 = 0xE7B8 // VRR-d VECTOR MULTIPLY SUM LOGICAL
  2504. )
  2505. func oclass(a *obj.Addr) int {
  2506. return int(a.Class) - 1
  2507. }
  2508. // Add a relocation for the immediate in a RIL style instruction.
  2509. // The addend will be adjusted as required.
  2510. func (c *ctxtz) addrilreloc(sym *obj.LSym, add int64) *obj.Reloc {
  2511. if sym == nil {
  2512. c.ctxt.Diag("require symbol to apply relocation")
  2513. }
  2514. offset := int64(2) // relocation offset from start of instruction
  2515. rel := obj.Addrel(c.cursym)
  2516. rel.Off = int32(c.pc + offset)
  2517. rel.Siz = 4
  2518. rel.Sym = sym
  2519. rel.Add = add + offset + int64(rel.Siz)
  2520. rel.Type = objabi.R_PCRELDBL
  2521. return rel
  2522. }
  2523. func (c *ctxtz) addrilrelocoffset(sym *obj.LSym, add, offset int64) *obj.Reloc {
  2524. if sym == nil {
  2525. c.ctxt.Diag("require symbol to apply relocation")
  2526. }
  2527. offset += int64(2) // relocation offset from start of instruction
  2528. rel := obj.Addrel(c.cursym)
  2529. rel.Off = int32(c.pc + offset)
  2530. rel.Siz = 4
  2531. rel.Sym = sym
  2532. rel.Add = add + offset + int64(rel.Siz)
  2533. rel.Type = objabi.R_PCRELDBL
  2534. return rel
  2535. }
  2536. // Add a CALL relocation for the immediate in a RIL style instruction.
  2537. // The addend will be adjusted as required.
  2538. func (c *ctxtz) addcallreloc(sym *obj.LSym, add int64) *obj.Reloc {
  2539. if sym == nil {
  2540. c.ctxt.Diag("require symbol to apply relocation")
  2541. }
  2542. offset := int64(2) // relocation offset from start of instruction
  2543. rel := obj.Addrel(c.cursym)
  2544. rel.Off = int32(c.pc + offset)
  2545. rel.Siz = 4
  2546. rel.Sym = sym
  2547. rel.Add = add + offset + int64(rel.Siz)
  2548. rel.Type = objabi.R_CALL
  2549. return rel
  2550. }
  2551. func (c *ctxtz) branchMask(p *obj.Prog) CCMask {
  2552. switch p.As {
  2553. case ABRC, ALOCR, ALOCGR,
  2554. ACRJ, ACGRJ, ACIJ, ACGIJ,
  2555. ACLRJ, ACLGRJ, ACLIJ, ACLGIJ:
  2556. return CCMask(p.From.Offset)
  2557. case ABEQ, ACMPBEQ, ACMPUBEQ, AMOVDEQ:
  2558. return Equal
  2559. case ABGE, ACMPBGE, ACMPUBGE, AMOVDGE:
  2560. return GreaterOrEqual
  2561. case ABGT, ACMPBGT, ACMPUBGT, AMOVDGT:
  2562. return Greater
  2563. case ABLE, ACMPBLE, ACMPUBLE, AMOVDLE:
  2564. return LessOrEqual
  2565. case ABLT, ACMPBLT, ACMPUBLT, AMOVDLT:
  2566. return Less
  2567. case ABNE, ACMPBNE, ACMPUBNE, AMOVDNE:
  2568. return NotEqual
  2569. case ABLEU: // LE or unordered
  2570. return NotGreater
  2571. case ABLTU: // LT or unordered
  2572. return LessOrUnordered
  2573. case ABVC:
  2574. return Never // needs extra instruction
  2575. case ABVS:
  2576. return Unordered
  2577. }
  2578. c.ctxt.Diag("unknown conditional branch %v", p.As)
  2579. return Always
  2580. }
  2581. func regtmp(p *obj.Prog) uint32 {
  2582. p.Mark |= USETMP
  2583. return REGTMP
  2584. }
  2585. func (c *ctxtz) asmout(p *obj.Prog, asm *[]byte) {
  2586. o := c.oplook(p)
  2587. if o == nil {
  2588. return
  2589. }
  2590. // If REGTMP is used in generated code, we need to set USETMP on p.Mark.
  2591. // So we use regtmp(p) for REGTMP.
  2592. switch o.i {
  2593. default:
  2594. c.ctxt.Diag("unknown index %d", o.i)
  2595. case 0: // PSEUDO OPS
  2596. break
  2597. case 1: // mov reg reg
  2598. switch p.As {
  2599. default:
  2600. c.ctxt.Diag("unhandled operation: %v", p.As)
  2601. case AMOVD:
  2602. zRRE(op_LGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2603. // sign extend
  2604. case AMOVW:
  2605. zRRE(op_LGFR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2606. case AMOVH:
  2607. zRRE(op_LGHR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2608. case AMOVB:
  2609. zRRE(op_LGBR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2610. // zero extend
  2611. case AMOVWZ:
  2612. zRRE(op_LLGFR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2613. case AMOVHZ:
  2614. zRRE(op_LLGHR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2615. case AMOVBZ:
  2616. zRRE(op_LLGCR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2617. // reverse bytes
  2618. case AMOVDBR:
  2619. zRRE(op_LRVGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2620. case AMOVWBR:
  2621. zRRE(op_LRVR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2622. // floating point
  2623. case AFMOVD, AFMOVS:
  2624. zRR(op_LDR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2625. }
  2626. case 2: // arithmetic op reg [reg] reg
  2627. r := p.Reg
  2628. if r == 0 {
  2629. r = p.To.Reg
  2630. }
  2631. var opcode uint32
  2632. switch p.As {
  2633. default:
  2634. c.ctxt.Diag("invalid opcode")
  2635. case AADD:
  2636. opcode = op_AGRK
  2637. case AADDC:
  2638. opcode = op_ALGRK
  2639. case AADDE:
  2640. opcode = op_ALCGR
  2641. case AADDW:
  2642. opcode = op_ARK
  2643. case AMULLW:
  2644. opcode = op_MSGFR
  2645. case AMULLD:
  2646. opcode = op_MSGR
  2647. case ADIVW, AMODW:
  2648. opcode = op_DSGFR
  2649. case ADIVWU, AMODWU:
  2650. opcode = op_DLR
  2651. case ADIVD, AMODD:
  2652. opcode = op_DSGR
  2653. case ADIVDU, AMODDU:
  2654. opcode = op_DLGR
  2655. }
  2656. switch p.As {
  2657. default:
  2658. case AADD, AADDC, AADDW:
  2659. if p.As == AADDW && r == p.To.Reg {
  2660. zRR(op_AR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2661. } else {
  2662. zRRF(opcode, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(r), asm)
  2663. }
  2664. case AADDE, AMULLW, AMULLD:
  2665. if r == p.To.Reg {
  2666. zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2667. } else if p.From.Reg == p.To.Reg {
  2668. zRRE(opcode, uint32(p.To.Reg), uint32(r), asm)
  2669. } else {
  2670. zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
  2671. zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2672. }
  2673. case ADIVW, ADIVWU, ADIVD, ADIVDU:
  2674. if p.As == ADIVWU || p.As == ADIVDU {
  2675. zRI(op_LGHI, regtmp(p), 0, asm)
  2676. }
  2677. zRRE(op_LGR, REGTMP2, uint32(r), asm)
  2678. zRRE(opcode, regtmp(p), uint32(p.From.Reg), asm)
  2679. zRRE(op_LGR, uint32(p.To.Reg), REGTMP2, asm)
  2680. case AMODW, AMODWU, AMODD, AMODDU:
  2681. if p.As == AMODWU || p.As == AMODDU {
  2682. zRI(op_LGHI, regtmp(p), 0, asm)
  2683. }
  2684. zRRE(op_LGR, REGTMP2, uint32(r), asm)
  2685. zRRE(opcode, regtmp(p), uint32(p.From.Reg), asm)
  2686. zRRE(op_LGR, uint32(p.To.Reg), regtmp(p), asm)
  2687. }
  2688. case 3: // mov $constant reg
  2689. v := c.vregoff(&p.From)
  2690. switch p.As {
  2691. case AMOVBZ:
  2692. v = int64(uint8(v))
  2693. case AMOVHZ:
  2694. v = int64(uint16(v))
  2695. case AMOVWZ:
  2696. v = int64(uint32(v))
  2697. case AMOVB:
  2698. v = int64(int8(v))
  2699. case AMOVH:
  2700. v = int64(int16(v))
  2701. case AMOVW:
  2702. v = int64(int32(v))
  2703. }
  2704. if int64(int16(v)) == v {
  2705. zRI(op_LGHI, uint32(p.To.Reg), uint32(v), asm)
  2706. } else if v&0xffff0000 == v {
  2707. zRI(op_LLILH, uint32(p.To.Reg), uint32(v>>16), asm)
  2708. } else if v&0xffff00000000 == v {
  2709. zRI(op_LLIHL, uint32(p.To.Reg), uint32(v>>32), asm)
  2710. } else if uint64(v)&0xffff000000000000 == uint64(v) {
  2711. zRI(op_LLIHH, uint32(p.To.Reg), uint32(v>>48), asm)
  2712. } else if int64(int32(v)) == v {
  2713. zRIL(_a, op_LGFI, uint32(p.To.Reg), uint32(v), asm)
  2714. } else if int64(uint32(v)) == v {
  2715. zRIL(_a, op_LLILF, uint32(p.To.Reg), uint32(v), asm)
  2716. } else if uint64(v)&0xffffffff00000000 == uint64(v) {
  2717. zRIL(_a, op_LLIHF, uint32(p.To.Reg), uint32(v>>32), asm)
  2718. } else {
  2719. zRIL(_a, op_LLILF, uint32(p.To.Reg), uint32(v), asm)
  2720. zRIL(_a, op_IIHF, uint32(p.To.Reg), uint32(v>>32), asm)
  2721. }
  2722. case 4: // multiply high (a*b)>>64
  2723. r := p.Reg
  2724. if r == 0 {
  2725. r = p.To.Reg
  2726. }
  2727. zRRE(op_LGR, REGTMP2, uint32(r), asm)
  2728. zRRE(op_MLGR, regtmp(p), uint32(p.From.Reg), asm)
  2729. switch p.As {
  2730. case AMULHDU:
  2731. // Unsigned: move result into correct register.
  2732. zRRE(op_LGR, uint32(p.To.Reg), regtmp(p), asm)
  2733. case AMULHD:
  2734. // Signed: need to convert result.
  2735. // See Hacker's Delight 8-3.
  2736. zRSY(op_SRAG, REGTMP2, uint32(p.From.Reg), 0, 63, asm)
  2737. zRRE(op_NGR, REGTMP2, uint32(r), asm)
  2738. zRRE(op_SGR, regtmp(p), REGTMP2, asm)
  2739. zRSY(op_SRAG, REGTMP2, uint32(r), 0, 63, asm)
  2740. zRRE(op_NGR, REGTMP2, uint32(p.From.Reg), asm)
  2741. zRRF(op_SGRK, REGTMP2, 0, uint32(p.To.Reg), regtmp(p), asm)
  2742. }
  2743. case 5: // syscall
  2744. zI(op_SVC, 0, asm)
  2745. case 6: // logical op reg [reg] reg
  2746. var oprr, oprre, oprrf uint32
  2747. switch p.As {
  2748. case AAND:
  2749. oprre = op_NGR
  2750. oprrf = op_NGRK
  2751. case AANDW:
  2752. oprr = op_NR
  2753. oprrf = op_NRK
  2754. case AOR:
  2755. oprre = op_OGR
  2756. oprrf = op_OGRK
  2757. case AORW:
  2758. oprr = op_OR
  2759. oprrf = op_ORK
  2760. case AXOR:
  2761. oprre = op_XGR
  2762. oprrf = op_XGRK
  2763. case AXORW:
  2764. oprr = op_XR
  2765. oprrf = op_XRK
  2766. }
  2767. if p.Reg == 0 {
  2768. if oprr != 0 {
  2769. zRR(oprr, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2770. } else {
  2771. zRRE(oprre, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2772. }
  2773. } else {
  2774. zRRF(oprrf, uint32(p.Reg), 0, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2775. }
  2776. case 7: // shift/rotate reg [reg] reg
  2777. d2 := c.vregoff(&p.From)
  2778. b2 := p.From.Reg
  2779. r3 := p.Reg
  2780. if r3 == 0 {
  2781. r3 = p.To.Reg
  2782. }
  2783. r1 := p.To.Reg
  2784. var opcode uint32
  2785. switch p.As {
  2786. default:
  2787. case ASLD:
  2788. opcode = op_SLLG
  2789. case ASRD:
  2790. opcode = op_SRLG
  2791. case ASLW:
  2792. opcode = op_SLLK
  2793. case ASRW:
  2794. opcode = op_SRLK
  2795. case ARLL:
  2796. opcode = op_RLL
  2797. case ARLLG:
  2798. opcode = op_RLLG
  2799. case ASRAW:
  2800. opcode = op_SRAK
  2801. case ASRAD:
  2802. opcode = op_SRAG
  2803. }
  2804. zRSY(opcode, uint32(r1), uint32(r3), uint32(b2), uint32(d2), asm)
  2805. case 8: // find leftmost one
  2806. if p.To.Reg&1 != 0 {
  2807. c.ctxt.Diag("target must be an even-numbered register")
  2808. }
  2809. // FLOGR also writes a mask to p.To.Reg+1.
  2810. zRRE(op_FLOGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2811. case 9: // population count
  2812. zRRE(op_POPCNT, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2813. case 10: // subtract reg [reg] reg
  2814. r := int(p.Reg)
  2815. switch p.As {
  2816. default:
  2817. case ASUB:
  2818. if r == 0 {
  2819. zRRE(op_SGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2820. } else {
  2821. zRRF(op_SGRK, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(r), asm)
  2822. }
  2823. case ASUBC:
  2824. if r == 0 {
  2825. zRRE(op_SLGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2826. } else {
  2827. zRRF(op_SLGRK, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(r), asm)
  2828. }
  2829. case ASUBE:
  2830. if r == 0 {
  2831. r = int(p.To.Reg)
  2832. }
  2833. if r == int(p.To.Reg) {
  2834. zRRE(op_SLBGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2835. } else if p.From.Reg == p.To.Reg {
  2836. zRRE(op_LGR, regtmp(p), uint32(p.From.Reg), asm)
  2837. zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
  2838. zRRE(op_SLBGR, uint32(p.To.Reg), regtmp(p), asm)
  2839. } else {
  2840. zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
  2841. zRRE(op_SLBGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2842. }
  2843. case ASUBW:
  2844. if r == 0 {
  2845. zRR(op_SR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2846. } else {
  2847. zRRF(op_SRK, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(r), asm)
  2848. }
  2849. }
  2850. case 11: // br/bl
  2851. v := int32(0)
  2852. if p.To.Target() != nil {
  2853. v = int32((p.To.Target().Pc - p.Pc) >> 1)
  2854. }
  2855. if p.As == ABR && p.To.Sym == nil && int32(int16(v)) == v {
  2856. zRI(op_BRC, 0xF, uint32(v), asm)
  2857. } else {
  2858. if p.As == ABL {
  2859. zRIL(_b, op_BRASL, uint32(REG_LR), uint32(v), asm)
  2860. } else {
  2861. zRIL(_c, op_BRCL, 0xF, uint32(v), asm)
  2862. }
  2863. if p.To.Sym != nil {
  2864. c.addcallreloc(p.To.Sym, p.To.Offset)
  2865. }
  2866. }
  2867. case 12:
  2868. r1 := p.To.Reg
  2869. d2 := c.vregoff(&p.From)
  2870. b2 := p.From.Reg
  2871. if b2 == 0 {
  2872. b2 = REGSP
  2873. }
  2874. x2 := p.From.Index
  2875. if -DISP20/2 > d2 || d2 >= DISP20/2 {
  2876. zRIL(_a, op_LGFI, regtmp(p), uint32(d2), asm)
  2877. if x2 != 0 {
  2878. zRX(op_LA, regtmp(p), regtmp(p), uint32(x2), 0, asm)
  2879. }
  2880. x2 = int16(regtmp(p))
  2881. d2 = 0
  2882. }
  2883. var opx, opxy uint32
  2884. switch p.As {
  2885. case AADD:
  2886. opxy = op_AG
  2887. case AADDC:
  2888. opxy = op_ALG
  2889. case AADDE:
  2890. opxy = op_ALCG
  2891. case AADDW:
  2892. opx = op_A
  2893. opxy = op_AY
  2894. case AMULLW:
  2895. opx = op_MS
  2896. opxy = op_MSY
  2897. case AMULLD:
  2898. opxy = op_MSG
  2899. case ASUB:
  2900. opxy = op_SG
  2901. case ASUBC:
  2902. opxy = op_SLG
  2903. case ASUBE:
  2904. opxy = op_SLBG
  2905. case ASUBW:
  2906. opx = op_S
  2907. opxy = op_SY
  2908. case AAND:
  2909. opxy = op_NG
  2910. case AANDW:
  2911. opx = op_N
  2912. opxy = op_NY
  2913. case AOR:
  2914. opxy = op_OG
  2915. case AORW:
  2916. opx = op_O
  2917. opxy = op_OY
  2918. case AXOR:
  2919. opxy = op_XG
  2920. case AXORW:
  2921. opx = op_X
  2922. opxy = op_XY
  2923. }
  2924. if opx != 0 && 0 <= d2 && d2 < DISP12 {
  2925. zRX(opx, uint32(r1), uint32(x2), uint32(b2), uint32(d2), asm)
  2926. } else {
  2927. zRXY(opxy, uint32(r1), uint32(x2), uint32(b2), uint32(d2), asm)
  2928. }
  2929. case 13: // rotate, followed by operation
  2930. r1 := p.To.Reg
  2931. r2 := p.RestArgs[2].Reg
  2932. i3 := uint8(p.From.Offset) // start
  2933. i4 := uint8(p.RestArgs[0].Offset) // end
  2934. i5 := uint8(p.RestArgs[1].Offset) // rotate amount
  2935. switch p.As {
  2936. case ARNSBGT, ARXSBGT, AROSBGT:
  2937. i3 |= 0x80 // test-results
  2938. case ARISBGZ, ARISBGNZ, ARISBHGZ, ARISBLGZ:
  2939. i4 |= 0x80 // zero-remaining-bits
  2940. }
  2941. var opcode uint32
  2942. switch p.As {
  2943. case ARNSBG, ARNSBGT:
  2944. opcode = op_RNSBG
  2945. case ARXSBG, ARXSBGT:
  2946. opcode = op_RXSBG
  2947. case AROSBG, AROSBGT:
  2948. opcode = op_ROSBG
  2949. case ARISBG, ARISBGZ:
  2950. opcode = op_RISBG
  2951. case ARISBGN, ARISBGNZ:
  2952. opcode = op_RISBGN
  2953. case ARISBHG, ARISBHGZ:
  2954. opcode = op_RISBHG
  2955. case ARISBLG, ARISBLGZ:
  2956. opcode = op_RISBLG
  2957. }
  2958. zRIE(_f, uint32(opcode), uint32(r1), uint32(r2), 0, uint32(i3), uint32(i4), 0, uint32(i5), asm)
  2959. case 15: // br/bl (reg)
  2960. r := p.To.Reg
  2961. if p.As == ABCL || p.As == ABL {
  2962. zRR(op_BASR, uint32(REG_LR), uint32(r), asm)
  2963. } else {
  2964. zRR(op_BCR, uint32(Always), uint32(r), asm)
  2965. }
  2966. case 16: // conditional branch
  2967. v := int32(0)
  2968. if p.To.Target() != nil {
  2969. v = int32((p.To.Target().Pc - p.Pc) >> 1)
  2970. }
  2971. mask := uint32(c.branchMask(p))
  2972. if p.To.Sym == nil && int32(int16(v)) == v {
  2973. zRI(op_BRC, mask, uint32(v), asm)
  2974. } else {
  2975. zRIL(_c, op_BRCL, mask, uint32(v), asm)
  2976. }
  2977. if p.To.Sym != nil {
  2978. c.addrilreloc(p.To.Sym, p.To.Offset)
  2979. }
  2980. case 17: // move on condition
  2981. m3 := uint32(c.branchMask(p))
  2982. zRRF(op_LOCGR, m3, 0, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  2983. case 18: // br/bl reg
  2984. if p.As == ABL {
  2985. zRR(op_BASR, uint32(REG_LR), uint32(p.To.Reg), asm)
  2986. } else {
  2987. zRR(op_BCR, uint32(Always), uint32(p.To.Reg), asm)
  2988. }
  2989. case 19: // mov $sym+n(SB) reg
  2990. d := c.vregoff(&p.From)
  2991. zRIL(_b, op_LARL, uint32(p.To.Reg), 0, asm)
  2992. if d&1 != 0 {
  2993. zRX(op_LA, uint32(p.To.Reg), uint32(p.To.Reg), 0, 1, asm)
  2994. d -= 1
  2995. }
  2996. c.addrilreloc(p.From.Sym, d)
  2997. case 21: // subtract $constant [reg] reg
  2998. v := c.vregoff(&p.From)
  2999. r := p.Reg
  3000. if r == 0 {
  3001. r = p.To.Reg
  3002. }
  3003. switch p.As {
  3004. case ASUB:
  3005. zRIL(_a, op_LGFI, uint32(regtmp(p)), uint32(v), asm)
  3006. zRRF(op_SLGRK, uint32(regtmp(p)), 0, uint32(p.To.Reg), uint32(r), asm)
  3007. case ASUBC:
  3008. if r != p.To.Reg {
  3009. zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
  3010. }
  3011. zRIL(_a, op_SLGFI, uint32(p.To.Reg), uint32(v), asm)
  3012. case ASUBW:
  3013. if r != p.To.Reg {
  3014. zRR(op_LR, uint32(p.To.Reg), uint32(r), asm)
  3015. }
  3016. zRIL(_a, op_SLFI, uint32(p.To.Reg), uint32(v), asm)
  3017. }
  3018. case 22: // add/multiply $constant [reg] reg
  3019. v := c.vregoff(&p.From)
  3020. r := p.Reg
  3021. if r == 0 {
  3022. r = p.To.Reg
  3023. }
  3024. var opri, opril, oprie uint32
  3025. switch p.As {
  3026. case AADD:
  3027. opri = op_AGHI
  3028. opril = op_AGFI
  3029. oprie = op_AGHIK
  3030. case AADDC:
  3031. opril = op_ALGFI
  3032. oprie = op_ALGHSIK
  3033. case AADDW:
  3034. opri = op_AHI
  3035. opril = op_AFI
  3036. oprie = op_AHIK
  3037. case AMULLW:
  3038. opri = op_MHI
  3039. opril = op_MSFI
  3040. case AMULLD:
  3041. opri = op_MGHI
  3042. opril = op_MSGFI
  3043. }
  3044. if r != p.To.Reg && (oprie == 0 || int64(int16(v)) != v) {
  3045. switch p.As {
  3046. case AADD, AADDC, AMULLD:
  3047. zRRE(op_LGR, uint32(p.To.Reg), uint32(r), asm)
  3048. case AADDW, AMULLW:
  3049. zRR(op_LR, uint32(p.To.Reg), uint32(r), asm)
  3050. }
  3051. r = p.To.Reg
  3052. }
  3053. if opri != 0 && r == p.To.Reg && int64(int16(v)) == v {
  3054. zRI(opri, uint32(p.To.Reg), uint32(v), asm)
  3055. } else if oprie != 0 && int64(int16(v)) == v {
  3056. zRIE(_d, oprie, uint32(p.To.Reg), uint32(r), uint32(v), 0, 0, 0, 0, asm)
  3057. } else {
  3058. zRIL(_a, opril, uint32(p.To.Reg), uint32(v), asm)
  3059. }
  3060. case 23: // 64-bit logical op $constant reg
  3061. // TODO(mundaym): merge with case 24.
  3062. v := c.vregoff(&p.From)
  3063. switch p.As {
  3064. default:
  3065. c.ctxt.Diag("%v is not supported", p)
  3066. case AAND:
  3067. if v >= 0 { // needs zero extend
  3068. zRIL(_a, op_LGFI, regtmp(p), uint32(v), asm)
  3069. zRRE(op_NGR, uint32(p.To.Reg), regtmp(p), asm)
  3070. } else if int64(int16(v)) == v {
  3071. zRI(op_NILL, uint32(p.To.Reg), uint32(v), asm)
  3072. } else { // r.To.Reg & 0xffffffff00000000 & uint32(v)
  3073. zRIL(_a, op_NILF, uint32(p.To.Reg), uint32(v), asm)
  3074. }
  3075. case AOR:
  3076. if int64(uint32(v)) != v { // needs sign extend
  3077. zRIL(_a, op_LGFI, regtmp(p), uint32(v), asm)
  3078. zRRE(op_OGR, uint32(p.To.Reg), regtmp(p), asm)
  3079. } else if int64(uint16(v)) == v {
  3080. zRI(op_OILL, uint32(p.To.Reg), uint32(v), asm)
  3081. } else {
  3082. zRIL(_a, op_OILF, uint32(p.To.Reg), uint32(v), asm)
  3083. }
  3084. case AXOR:
  3085. if int64(uint32(v)) != v { // needs sign extend
  3086. zRIL(_a, op_LGFI, regtmp(p), uint32(v), asm)
  3087. zRRE(op_XGR, uint32(p.To.Reg), regtmp(p), asm)
  3088. } else {
  3089. zRIL(_a, op_XILF, uint32(p.To.Reg), uint32(v), asm)
  3090. }
  3091. }
  3092. case 24: // 32-bit logical op $constant reg
  3093. v := c.vregoff(&p.From)
  3094. switch p.As {
  3095. case AANDW:
  3096. if uint32(v&0xffff0000) == 0xffff0000 {
  3097. zRI(op_NILL, uint32(p.To.Reg), uint32(v), asm)
  3098. } else if uint32(v&0x0000ffff) == 0x0000ffff {
  3099. zRI(op_NILH, uint32(p.To.Reg), uint32(v)>>16, asm)
  3100. } else {
  3101. zRIL(_a, op_NILF, uint32(p.To.Reg), uint32(v), asm)
  3102. }
  3103. case AORW:
  3104. if uint32(v&0xffff0000) == 0 {
  3105. zRI(op_OILL, uint32(p.To.Reg), uint32(v), asm)
  3106. } else if uint32(v&0x0000ffff) == 0 {
  3107. zRI(op_OILH, uint32(p.To.Reg), uint32(v)>>16, asm)
  3108. } else {
  3109. zRIL(_a, op_OILF, uint32(p.To.Reg), uint32(v), asm)
  3110. }
  3111. case AXORW:
  3112. zRIL(_a, op_XILF, uint32(p.To.Reg), uint32(v), asm)
  3113. }
  3114. case 25: // load on condition (register)
  3115. m3 := uint32(c.branchMask(p))
  3116. var opcode uint32
  3117. switch p.As {
  3118. case ALOCR:
  3119. opcode = op_LOCR
  3120. case ALOCGR:
  3121. opcode = op_LOCGR
  3122. }
  3123. zRRF(opcode, m3, 0, uint32(p.To.Reg), uint32(p.Reg), asm)
  3124. case 26: // MOVD $offset(base)(index), reg
  3125. v := c.regoff(&p.From)
  3126. r := p.From.Reg
  3127. if r == 0 {
  3128. r = REGSP
  3129. }
  3130. i := p.From.Index
  3131. if v >= 0 && v < DISP12 {
  3132. zRX(op_LA, uint32(p.To.Reg), uint32(r), uint32(i), uint32(v), asm)
  3133. } else if v >= -DISP20/2 && v < DISP20/2 {
  3134. zRXY(op_LAY, uint32(p.To.Reg), uint32(r), uint32(i), uint32(v), asm)
  3135. } else {
  3136. zRIL(_a, op_LGFI, regtmp(p), uint32(v), asm)
  3137. zRX(op_LA, uint32(p.To.Reg), uint32(r), regtmp(p), uint32(i), asm)
  3138. }
  3139. case 31: // dword
  3140. wd := uint64(c.vregoff(&p.From))
  3141. *asm = append(*asm,
  3142. uint8(wd>>56),
  3143. uint8(wd>>48),
  3144. uint8(wd>>40),
  3145. uint8(wd>>32),
  3146. uint8(wd>>24),
  3147. uint8(wd>>16),
  3148. uint8(wd>>8),
  3149. uint8(wd))
  3150. case 32: // float op freg freg
  3151. var opcode uint32
  3152. switch p.As {
  3153. default:
  3154. c.ctxt.Diag("invalid opcode")
  3155. case AFADD:
  3156. opcode = op_ADBR
  3157. case AFADDS:
  3158. opcode = op_AEBR
  3159. case AFDIV:
  3160. opcode = op_DDBR
  3161. case AFDIVS:
  3162. opcode = op_DEBR
  3163. case AFMUL:
  3164. opcode = op_MDBR
  3165. case AFMULS:
  3166. opcode = op_MEEBR
  3167. case AFSUB:
  3168. opcode = op_SDBR
  3169. case AFSUBS:
  3170. opcode = op_SEBR
  3171. }
  3172. zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  3173. case 33: // float op [freg] freg
  3174. r := p.From.Reg
  3175. if oclass(&p.From) == C_NONE {
  3176. r = p.To.Reg
  3177. }
  3178. var opcode uint32
  3179. switch p.As {
  3180. default:
  3181. case AFABS:
  3182. opcode = op_LPDBR
  3183. case AFNABS:
  3184. opcode = op_LNDBR
  3185. case ALPDFR:
  3186. opcode = op_LPDFR
  3187. case ALNDFR:
  3188. opcode = op_LNDFR
  3189. case AFNEG:
  3190. opcode = op_LCDFR
  3191. case AFNEGS:
  3192. opcode = op_LCEBR
  3193. case ALEDBR:
  3194. opcode = op_LEDBR
  3195. case ALDEBR:
  3196. opcode = op_LDEBR
  3197. case AFSQRT:
  3198. opcode = op_SQDBR
  3199. case AFSQRTS:
  3200. opcode = op_SQEBR
  3201. }
  3202. zRRE(opcode, uint32(p.To.Reg), uint32(r), asm)
  3203. case 34: // float multiply-add freg freg freg
  3204. var opcode uint32
  3205. switch p.As {
  3206. default:
  3207. c.ctxt.Diag("invalid opcode")
  3208. case AFMADD:
  3209. opcode = op_MADBR
  3210. case AFMADDS:
  3211. opcode = op_MAEBR
  3212. case AFMSUB:
  3213. opcode = op_MSDBR
  3214. case AFMSUBS:
  3215. opcode = op_MSEBR
  3216. }
  3217. zRRD(opcode, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), asm)
  3218. case 35: // mov reg mem (no relocation)
  3219. d2 := c.regoff(&p.To)
  3220. b2 := p.To.Reg
  3221. if b2 == 0 {
  3222. b2 = REGSP
  3223. }
  3224. x2 := p.To.Index
  3225. if d2 < -DISP20/2 || d2 >= DISP20/2 {
  3226. zRIL(_a, op_LGFI, regtmp(p), uint32(d2), asm)
  3227. if x2 != 0 {
  3228. zRX(op_LA, regtmp(p), regtmp(p), uint32(x2), 0, asm)
  3229. }
  3230. x2 = int16(regtmp(p))
  3231. d2 = 0
  3232. }
  3233. // Emits an RX instruction if an appropriate one exists and the displacement fits in 12 bits. Otherwise use an RXY instruction.
  3234. if op, ok := c.zopstore12(p.As); ok && isU12(d2) {
  3235. zRX(op, uint32(p.From.Reg), uint32(x2), uint32(b2), uint32(d2), asm)
  3236. } else {
  3237. zRXY(c.zopstore(p.As), uint32(p.From.Reg), uint32(x2), uint32(b2), uint32(d2), asm)
  3238. }
  3239. case 36: // mov mem reg (no relocation)
  3240. d2 := c.regoff(&p.From)
  3241. b2 := p.From.Reg
  3242. if b2 == 0 {
  3243. b2 = REGSP
  3244. }
  3245. x2 := p.From.Index
  3246. if d2 < -DISP20/2 || d2 >= DISP20/2 {
  3247. zRIL(_a, op_LGFI, regtmp(p), uint32(d2), asm)
  3248. if x2 != 0 {
  3249. zRX(op_LA, regtmp(p), regtmp(p), uint32(x2), 0, asm)
  3250. }
  3251. x2 = int16(regtmp(p))
  3252. d2 = 0
  3253. }
  3254. // Emits an RX instruction if an appropriate one exists and the displacement fits in 12 bits. Otherwise use an RXY instruction.
  3255. if op, ok := c.zopload12(p.As); ok && isU12(d2) {
  3256. zRX(op, uint32(p.To.Reg), uint32(x2), uint32(b2), uint32(d2), asm)
  3257. } else {
  3258. zRXY(c.zopload(p.As), uint32(p.To.Reg), uint32(x2), uint32(b2), uint32(d2), asm)
  3259. }
  3260. case 40: // word/byte
  3261. wd := uint32(c.regoff(&p.From))
  3262. if p.As == AWORD { //WORD
  3263. *asm = append(*asm, uint8(wd>>24), uint8(wd>>16), uint8(wd>>8), uint8(wd))
  3264. } else { //BYTE
  3265. *asm = append(*asm, uint8(wd))
  3266. }
  3267. case 41: // branch on count
  3268. r1 := p.From.Reg
  3269. ri2 := (p.To.Target().Pc - p.Pc) >> 1
  3270. if int64(int16(ri2)) != ri2 {
  3271. c.ctxt.Diag("branch target too far away")
  3272. }
  3273. var opcode uint32
  3274. switch p.As {
  3275. case ABRCT:
  3276. opcode = op_BRCT
  3277. case ABRCTG:
  3278. opcode = op_BRCTG
  3279. }
  3280. zRI(opcode, uint32(r1), uint32(ri2), asm)
  3281. case 47: // negate [reg] reg
  3282. r := p.From.Reg
  3283. if r == 0 {
  3284. r = p.To.Reg
  3285. }
  3286. switch p.As {
  3287. case ANEG:
  3288. zRRE(op_LCGR, uint32(p.To.Reg), uint32(r), asm)
  3289. case ANEGW:
  3290. zRRE(op_LCGFR, uint32(p.To.Reg), uint32(r), asm)
  3291. }
  3292. case 48: // floating-point round to integer
  3293. m3 := c.vregoff(&p.From)
  3294. if 0 > m3 || m3 > 7 {
  3295. c.ctxt.Diag("mask (%v) must be in the range [0, 7]", m3)
  3296. }
  3297. var opcode uint32
  3298. switch p.As {
  3299. case AFIEBR:
  3300. opcode = op_FIEBR
  3301. case AFIDBR:
  3302. opcode = op_FIDBR
  3303. }
  3304. zRRF(opcode, uint32(m3), 0, uint32(p.To.Reg), uint32(p.Reg), asm)
  3305. case 49: // copysign
  3306. zRRF(op_CPSDR, uint32(p.From.Reg), 0, uint32(p.To.Reg), uint32(p.Reg), asm)
  3307. case 50: // load and test
  3308. var opcode uint32
  3309. switch p.As {
  3310. case ALTEBR:
  3311. opcode = op_LTEBR
  3312. case ALTDBR:
  3313. opcode = op_LTDBR
  3314. }
  3315. zRRE(opcode, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  3316. case 51: // test data class (immediate only)
  3317. var opcode uint32
  3318. switch p.As {
  3319. case ATCEB:
  3320. opcode = op_TCEB
  3321. case ATCDB:
  3322. opcode = op_TCDB
  3323. }
  3324. d2 := c.regoff(&p.To)
  3325. zRXE(opcode, uint32(p.From.Reg), 0, 0, uint32(d2), 0, asm)
  3326. case 62: // equivalent of Mul64 in math/bits
  3327. zRRE(op_MLGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  3328. case 66:
  3329. zRR(op_BCR, uint32(Never), 0, asm)
  3330. case 67: // fmov $0 freg
  3331. var opcode uint32
  3332. switch p.As {
  3333. case AFMOVS:
  3334. opcode = op_LZER
  3335. case AFMOVD:
  3336. opcode = op_LZDR
  3337. }
  3338. zRRE(opcode, uint32(p.To.Reg), 0, asm)
  3339. case 68: // movw areg reg
  3340. zRRE(op_EAR, uint32(p.To.Reg), uint32(p.From.Reg-REG_AR0), asm)
  3341. case 69: // movw reg areg
  3342. zRRE(op_SAR, uint32(p.To.Reg-REG_AR0), uint32(p.From.Reg), asm)
  3343. case 70: // cmp reg reg
  3344. if p.As == ACMPW || p.As == ACMPWU {
  3345. zRR(c.zoprr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), asm)
  3346. } else {
  3347. zRRE(c.zoprre(p.As), uint32(p.From.Reg), uint32(p.To.Reg), asm)
  3348. }
  3349. case 71: // cmp reg $constant
  3350. v := c.vregoff(&p.To)
  3351. switch p.As {
  3352. case ACMP, ACMPW:
  3353. if int64(int32(v)) != v {
  3354. c.ctxt.Diag("%v overflows an int32", v)
  3355. }
  3356. case ACMPU, ACMPWU:
  3357. if int64(uint32(v)) != v {
  3358. c.ctxt.Diag("%v overflows a uint32", v)
  3359. }
  3360. }
  3361. if p.As == ACMP && int64(int16(v)) == v {
  3362. zRI(op_CGHI, uint32(p.From.Reg), uint32(v), asm)
  3363. } else if p.As == ACMPW && int64(int16(v)) == v {
  3364. zRI(op_CHI, uint32(p.From.Reg), uint32(v), asm)
  3365. } else {
  3366. zRIL(_a, c.zopril(p.As), uint32(p.From.Reg), uint32(v), asm)
  3367. }
  3368. case 72: // mov $constant mem
  3369. v := c.regoff(&p.From)
  3370. d := c.regoff(&p.To)
  3371. r := p.To.Reg
  3372. if p.To.Index != 0 {
  3373. c.ctxt.Diag("cannot use index register")
  3374. }
  3375. if r == 0 {
  3376. r = REGSP
  3377. }
  3378. var opcode uint32
  3379. switch p.As {
  3380. case AMOVD:
  3381. opcode = op_MVGHI
  3382. case AMOVW, AMOVWZ:
  3383. opcode = op_MVHI
  3384. case AMOVH, AMOVHZ:
  3385. opcode = op_MVHHI
  3386. case AMOVB, AMOVBZ:
  3387. opcode = op_MVI
  3388. }
  3389. if d < 0 || d >= DISP12 {
  3390. if r == int16(regtmp(p)) {
  3391. c.ctxt.Diag("displacement must be in range [0, 4096) to use %v", r)
  3392. }
  3393. if d >= -DISP20/2 && d < DISP20/2 {
  3394. if opcode == op_MVI {
  3395. opcode = op_MVIY
  3396. } else {
  3397. zRXY(op_LAY, uint32(regtmp(p)), 0, uint32(r), uint32(d), asm)
  3398. r = int16(regtmp(p))
  3399. d = 0
  3400. }
  3401. } else {
  3402. zRIL(_a, op_LGFI, regtmp(p), uint32(d), asm)
  3403. zRX(op_LA, regtmp(p), regtmp(p), uint32(r), 0, asm)
  3404. r = int16(regtmp(p))
  3405. d = 0
  3406. }
  3407. }
  3408. switch opcode {
  3409. case op_MVI:
  3410. zSI(opcode, uint32(v), uint32(r), uint32(d), asm)
  3411. case op_MVIY:
  3412. zSIY(opcode, uint32(v), uint32(r), uint32(d), asm)
  3413. default:
  3414. zSIL(opcode, uint32(r), uint32(d), uint32(v), asm)
  3415. }
  3416. case 74: // mov reg addr (including relocation)
  3417. i2 := c.regoff(&p.To)
  3418. switch p.As {
  3419. case AMOVD:
  3420. zRIL(_b, op_STGRL, uint32(p.From.Reg), 0, asm)
  3421. case AMOVW, AMOVWZ: // The zero extension doesn't affect store instructions
  3422. zRIL(_b, op_STRL, uint32(p.From.Reg), 0, asm)
  3423. case AMOVH, AMOVHZ: // The zero extension doesn't affect store instructions
  3424. zRIL(_b, op_STHRL, uint32(p.From.Reg), 0, asm)
  3425. case AMOVB, AMOVBZ: // The zero extension doesn't affect store instructions
  3426. zRIL(_b, op_LARL, regtmp(p), 0, asm)
  3427. adj := uint32(0) // adjustment needed for odd addresses
  3428. if i2&1 != 0 {
  3429. i2 -= 1
  3430. adj = 1
  3431. }
  3432. zRX(op_STC, uint32(p.From.Reg), 0, regtmp(p), adj, asm)
  3433. case AFMOVD:
  3434. zRIL(_b, op_LARL, regtmp(p), 0, asm)
  3435. zRX(op_STD, uint32(p.From.Reg), 0, regtmp(p), 0, asm)
  3436. case AFMOVS:
  3437. zRIL(_b, op_LARL, regtmp(p), 0, asm)
  3438. zRX(op_STE, uint32(p.From.Reg), 0, regtmp(p), 0, asm)
  3439. }
  3440. c.addrilreloc(p.To.Sym, int64(i2))
  3441. case 75: // mov addr reg (including relocation)
  3442. i2 := c.regoff(&p.From)
  3443. switch p.As {
  3444. case AMOVD:
  3445. if i2&1 != 0 {
  3446. zRIL(_b, op_LARL, regtmp(p), 0, asm)
  3447. zRXY(op_LG, uint32(p.To.Reg), regtmp(p), 0, 1, asm)
  3448. i2 -= 1
  3449. } else {
  3450. zRIL(_b, op_LGRL, uint32(p.To.Reg), 0, asm)
  3451. }
  3452. case AMOVW:
  3453. zRIL(_b, op_LGFRL, uint32(p.To.Reg), 0, asm)
  3454. case AMOVWZ:
  3455. zRIL(_b, op_LLGFRL, uint32(p.To.Reg), 0, asm)
  3456. case AMOVH:
  3457. zRIL(_b, op_LGHRL, uint32(p.To.Reg), 0, asm)
  3458. case AMOVHZ:
  3459. zRIL(_b, op_LLGHRL, uint32(p.To.Reg), 0, asm)
  3460. case AMOVB, AMOVBZ:
  3461. zRIL(_b, op_LARL, regtmp(p), 0, asm)
  3462. adj := uint32(0) // adjustment needed for odd addresses
  3463. if i2&1 != 0 {
  3464. i2 -= 1
  3465. adj = 1
  3466. }
  3467. switch p.As {
  3468. case AMOVB:
  3469. zRXY(op_LGB, uint32(p.To.Reg), 0, regtmp(p), adj, asm)
  3470. case AMOVBZ:
  3471. zRXY(op_LLGC, uint32(p.To.Reg), 0, regtmp(p), adj, asm)
  3472. }
  3473. case AFMOVD:
  3474. zRIL(_a, op_LARL, regtmp(p), 0, asm)
  3475. zRX(op_LD, uint32(p.To.Reg), 0, regtmp(p), 0, asm)
  3476. case AFMOVS:
  3477. zRIL(_a, op_LARL, regtmp(p), 0, asm)
  3478. zRX(op_LE, uint32(p.To.Reg), 0, regtmp(p), 0, asm)
  3479. }
  3480. c.addrilreloc(p.From.Sym, int64(i2))
  3481. case 76: // set program mask
  3482. zRR(op_SPM, uint32(p.From.Reg), 0, asm)
  3483. case 77: // syscall $constant
  3484. if p.From.Offset > 255 || p.From.Offset < 1 {
  3485. c.ctxt.Diag("illegal system call; system call number out of range: %v", p)
  3486. zE(op_TRAP2, asm) // trap always
  3487. } else {
  3488. zI(op_SVC, uint32(p.From.Offset), asm)
  3489. }
  3490. case 78: // undef
  3491. // "An instruction consisting entirely of binary 0s is guaranteed
  3492. // always to be an illegal instruction."
  3493. *asm = append(*asm, 0, 0, 0, 0)
  3494. case 79: // compare and swap reg reg reg
  3495. v := c.regoff(&p.To)
  3496. if v < 0 {
  3497. v = 0
  3498. }
  3499. if p.As == ACS {
  3500. zRS(op_CS, uint32(p.From.Reg), uint32(p.Reg), uint32(p.To.Reg), uint32(v), asm)
  3501. } else if p.As == ACSG {
  3502. zRSY(op_CSG, uint32(p.From.Reg), uint32(p.Reg), uint32(p.To.Reg), uint32(v), asm)
  3503. }
  3504. case 80: // sync
  3505. zRR(op_BCR, uint32(NotEqual), 0, asm)
  3506. case 81: // float to fixed and fixed to float moves (no conversion)
  3507. switch p.As {
  3508. case ALDGR:
  3509. zRRE(op_LDGR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  3510. case ALGDR:
  3511. zRRE(op_LGDR, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  3512. }
  3513. case 82: // fixed to float conversion
  3514. var opcode uint32
  3515. switch p.As {
  3516. default:
  3517. log.Fatalf("unexpected opcode %v", p.As)
  3518. case ACEFBRA:
  3519. opcode = op_CEFBRA
  3520. case ACDFBRA:
  3521. opcode = op_CDFBRA
  3522. case ACEGBRA:
  3523. opcode = op_CEGBRA
  3524. case ACDGBRA:
  3525. opcode = op_CDGBRA
  3526. case ACELFBR:
  3527. opcode = op_CELFBR
  3528. case ACDLFBR:
  3529. opcode = op_CDLFBR
  3530. case ACELGBR:
  3531. opcode = op_CELGBR
  3532. case ACDLGBR:
  3533. opcode = op_CDLGBR
  3534. }
  3535. // set immediate operand M3 to 0 to use the default BFP rounding mode
  3536. // (usually round to nearest, ties to even)
  3537. // TODO(mundaym): should this be fixed at round to nearest, ties to even?
  3538. // M4 is reserved and must be 0
  3539. zRRF(opcode, 0, 0, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  3540. case 83: // float to fixed conversion
  3541. var opcode uint32
  3542. switch p.As {
  3543. default:
  3544. log.Fatalf("unexpected opcode %v", p.As)
  3545. case ACFEBRA:
  3546. opcode = op_CFEBRA
  3547. case ACFDBRA:
  3548. opcode = op_CFDBRA
  3549. case ACGEBRA:
  3550. opcode = op_CGEBRA
  3551. case ACGDBRA:
  3552. opcode = op_CGDBRA
  3553. case ACLFEBR:
  3554. opcode = op_CLFEBR
  3555. case ACLFDBR:
  3556. opcode = op_CLFDBR
  3557. case ACLGEBR:
  3558. opcode = op_CLGEBR
  3559. case ACLGDBR:
  3560. opcode = op_CLGDBR
  3561. }
  3562. // set immediate operand M3 to 5 for rounding toward zero (required by Go spec)
  3563. // M4 is reserved and must be 0
  3564. zRRF(opcode, 5, 0, uint32(p.To.Reg), uint32(p.From.Reg), asm)
  3565. case 84: // storage-and-storage operations $length mem mem
  3566. l := c.regoff(&p.From)
  3567. if l < 1 || l > 256 {
  3568. c.ctxt.Diag("number of bytes (%v) not in range [1,256]", l)
  3569. }
  3570. if p.GetFrom3().Index != 0 || p.To.Index != 0 {
  3571. c.ctxt.Diag("cannot use index reg")
  3572. }
  3573. b1 := p.To.Reg
  3574. b2 := p.GetFrom3().Reg
  3575. if b1 == 0 {
  3576. b1 = REGSP
  3577. }
  3578. if b2 == 0 {
  3579. b2 = REGSP
  3580. }
  3581. d1 := c.regoff(&p.To)
  3582. d2 := c.regoff(p.GetFrom3())
  3583. if d1 < 0 || d1 >= DISP12 {
  3584. if b2 == int16(regtmp(p)) {
  3585. c.ctxt.Diag("regtmp(p) conflict")
  3586. }
  3587. if b1 != int16(regtmp(p)) {
  3588. zRRE(op_LGR, regtmp(p), uint32(b1), asm)
  3589. }
  3590. zRIL(_a, op_AGFI, regtmp(p), uint32(d1), asm)
  3591. if d1 == d2 && b1 == b2 {
  3592. d2 = 0
  3593. b2 = int16(regtmp(p))
  3594. }
  3595. d1 = 0
  3596. b1 = int16(regtmp(p))
  3597. }
  3598. if d2 < 0 || d2 >= DISP12 {
  3599. if b1 == REGTMP2 {
  3600. c.ctxt.Diag("REGTMP2 conflict")
  3601. }
  3602. if b2 != REGTMP2 {
  3603. zRRE(op_LGR, REGTMP2, uint32(b2), asm)
  3604. }
  3605. zRIL(_a, op_AGFI, REGTMP2, uint32(d2), asm)
  3606. d2 = 0
  3607. b2 = REGTMP2
  3608. }
  3609. var opcode uint32
  3610. switch p.As {
  3611. default:
  3612. c.ctxt.Diag("unexpected opcode %v", p.As)
  3613. case AMVC:
  3614. opcode = op_MVC
  3615. case AMVCIN:
  3616. opcode = op_MVCIN
  3617. case ACLC:
  3618. opcode = op_CLC
  3619. // swap operand order for CLC so that it matches CMP
  3620. b1, b2 = b2, b1
  3621. d1, d2 = d2, d1
  3622. case AXC:
  3623. opcode = op_XC
  3624. case AOC:
  3625. opcode = op_OC
  3626. case ANC:
  3627. opcode = op_NC
  3628. }
  3629. zSS(_a, opcode, uint32(l-1), 0, uint32(b1), uint32(d1), uint32(b2), uint32(d2), asm)
  3630. case 85: // load address relative long
  3631. v := c.regoff(&p.From)
  3632. if p.From.Sym == nil {
  3633. if (v & 1) != 0 {
  3634. c.ctxt.Diag("cannot use LARL with odd offset: %v", v)
  3635. }
  3636. } else {
  3637. c.addrilreloc(p.From.Sym, int64(v))
  3638. v = 0
  3639. }
  3640. zRIL(_b, op_LARL, uint32(p.To.Reg), uint32(v>>1), asm)
  3641. case 86: // load address
  3642. d := c.vregoff(&p.From)
  3643. x := p.From.Index
  3644. b := p.From.Reg
  3645. if b == 0 {
  3646. b = REGSP
  3647. }
  3648. switch p.As {
  3649. case ALA:
  3650. zRX(op_LA, uint32(p.To.Reg), uint32(x), uint32(b), uint32(d), asm)
  3651. case ALAY:
  3652. zRXY(op_LAY, uint32(p.To.Reg), uint32(x), uint32(b), uint32(d), asm)
  3653. }
  3654. case 87: // execute relative long
  3655. v := c.vregoff(&p.From)
  3656. if p.From.Sym == nil {
  3657. if v&1 != 0 {
  3658. c.ctxt.Diag("cannot use EXRL with odd offset: %v", v)
  3659. }
  3660. } else {
  3661. c.addrilreloc(p.From.Sym, v)
  3662. v = 0
  3663. }
  3664. zRIL(_b, op_EXRL, uint32(p.To.Reg), uint32(v>>1), asm)
  3665. case 88: // store clock
  3666. var opcode uint32
  3667. switch p.As {
  3668. case ASTCK:
  3669. opcode = op_STCK
  3670. case ASTCKC:
  3671. opcode = op_STCKC
  3672. case ASTCKE:
  3673. opcode = op_STCKE
  3674. case ASTCKF:
  3675. opcode = op_STCKF
  3676. }
  3677. v := c.vregoff(&p.To)
  3678. r := p.To.Reg
  3679. if r == 0 {
  3680. r = REGSP
  3681. }
  3682. zS(opcode, uint32(r), uint32(v), asm)
  3683. case 89: // compare and branch reg reg
  3684. var v int32
  3685. if p.To.Target() != nil {
  3686. v = int32((p.To.Target().Pc - p.Pc) >> 1)
  3687. }
  3688. // Some instructions take a mask as the first argument.
  3689. r1, r2 := p.From.Reg, p.Reg
  3690. if p.From.Type == obj.TYPE_CONST {
  3691. r1, r2 = p.Reg, p.RestArgs[0].Reg
  3692. }
  3693. m3 := uint32(c.branchMask(p))
  3694. var opcode uint32
  3695. switch p.As {
  3696. case ACRJ:
  3697. // COMPARE AND BRANCH RELATIVE (32)
  3698. opcode = op_CRJ
  3699. case ACGRJ, ACMPBEQ, ACMPBGE, ACMPBGT, ACMPBLE, ACMPBLT, ACMPBNE:
  3700. // COMPARE AND BRANCH RELATIVE (64)
  3701. opcode = op_CGRJ
  3702. case ACLRJ:
  3703. // COMPARE LOGICAL AND BRANCH RELATIVE (32)
  3704. opcode = op_CLRJ
  3705. case ACLGRJ, ACMPUBEQ, ACMPUBGE, ACMPUBGT, ACMPUBLE, ACMPUBLT, ACMPUBNE:
  3706. // COMPARE LOGICAL AND BRANCH RELATIVE (64)
  3707. opcode = op_CLGRJ
  3708. }
  3709. if int32(int16(v)) != v {
  3710. // The branch is too far for one instruction so crack
  3711. // `CMPBEQ x, y, target` into:
  3712. //
  3713. // CMPBNE x, y, 2(PC)
  3714. // BR target
  3715. //
  3716. // Note that the instruction sequence MUST NOT clobber
  3717. // the condition code.
  3718. m3 ^= 0xe // invert 3-bit mask
  3719. zRIE(_b, opcode, uint32(r1), uint32(r2), uint32(sizeRIE+sizeRIL)/2, 0, 0, m3, 0, asm)
  3720. zRIL(_c, op_BRCL, uint32(Always), uint32(v-sizeRIE/2), asm)
  3721. } else {
  3722. zRIE(_b, opcode, uint32(r1), uint32(r2), uint32(v), 0, 0, m3, 0, asm)
  3723. }
  3724. case 90: // compare and branch reg $constant
  3725. var v int32
  3726. if p.To.Target() != nil {
  3727. v = int32((p.To.Target().Pc - p.Pc) >> 1)
  3728. }
  3729. // Some instructions take a mask as the first argument.
  3730. r1, i2 := p.From.Reg, p.RestArgs[0].Offset
  3731. if p.From.Type == obj.TYPE_CONST {
  3732. r1 = p.Reg
  3733. }
  3734. m3 := uint32(c.branchMask(p))
  3735. var opcode uint32
  3736. switch p.As {
  3737. case ACIJ:
  3738. opcode = op_CIJ
  3739. case ACGIJ, ACMPBEQ, ACMPBGE, ACMPBGT, ACMPBLE, ACMPBLT, ACMPBNE:
  3740. opcode = op_CGIJ
  3741. case ACLIJ:
  3742. opcode = op_CLIJ
  3743. case ACLGIJ, ACMPUBEQ, ACMPUBGE, ACMPUBGT, ACMPUBLE, ACMPUBLT, ACMPUBNE:
  3744. opcode = op_CLGIJ
  3745. }
  3746. if int32(int16(v)) != v {
  3747. // The branch is too far for one instruction so crack
  3748. // `CMPBEQ x, $0, target` into:
  3749. //
  3750. // CMPBNE x, $0, 2(PC)
  3751. // BR target
  3752. //
  3753. // Note that the instruction sequence MUST NOT clobber
  3754. // the condition code.
  3755. m3 ^= 0xe // invert 3-bit mask
  3756. zRIE(_c, opcode, uint32(r1), m3, uint32(sizeRIE+sizeRIL)/2, 0, 0, 0, uint32(i2), asm)
  3757. zRIL(_c, op_BRCL, uint32(Always), uint32(v-sizeRIE/2), asm)
  3758. } else {
  3759. zRIE(_c, opcode, uint32(r1), m3, uint32(v), 0, 0, 0, uint32(i2), asm)
  3760. }
  3761. case 91: // test under mask (immediate)
  3762. var opcode uint32
  3763. switch p.As {
  3764. case ATMHH:
  3765. opcode = op_TMHH
  3766. case ATMHL:
  3767. opcode = op_TMHL
  3768. case ATMLH:
  3769. opcode = op_TMLH
  3770. case ATMLL:
  3771. opcode = op_TMLL
  3772. }
  3773. zRI(opcode, uint32(p.From.Reg), uint32(c.vregoff(&p.To)), asm)
  3774. case 92: // insert program mask
  3775. zRRE(op_IPM, uint32(p.From.Reg), 0, asm)
  3776. case 93: // GOT lookup
  3777. v := c.vregoff(&p.To)
  3778. if v != 0 {
  3779. c.ctxt.Diag("invalid offset against GOT slot %v", p)
  3780. }
  3781. zRIL(_b, op_LGRL, uint32(p.To.Reg), 0, asm)
  3782. rel := obj.Addrel(c.cursym)
  3783. rel.Off = int32(c.pc + 2)
  3784. rel.Siz = 4
  3785. rel.Sym = p.From.Sym
  3786. rel.Type = objabi.R_GOTPCREL
  3787. rel.Add = 2 + int64(rel.Siz)
  3788. case 94: // TLS local exec model
  3789. zRIL(_b, op_LARL, regtmp(p), (sizeRIL+sizeRXY+sizeRI)>>1, asm)
  3790. zRXY(op_LG, uint32(p.To.Reg), regtmp(p), 0, 0, asm)
  3791. zRI(op_BRC, 0xF, (sizeRI+8)>>1, asm)
  3792. *asm = append(*asm, 0, 0, 0, 0, 0, 0, 0, 0)
  3793. rel := obj.Addrel(c.cursym)
  3794. rel.Off = int32(c.pc + sizeRIL + sizeRXY + sizeRI)
  3795. rel.Siz = 8
  3796. rel.Sym = p.From.Sym
  3797. rel.Type = objabi.R_TLS_LE
  3798. rel.Add = 0
  3799. case 95: // TLS initial exec model
  3800. // Assembly | Relocation symbol | Done Here?
  3801. // --------------------------------------------------------------
  3802. // ear %r11, %a0 | |
  3803. // sllg %r11, %r11, 32 | |
  3804. // ear %r11, %a1 | |
  3805. // larl %r10, <var>@indntpoff | R_390_TLS_IEENT | Y
  3806. // lg %r10, 0(%r10) | R_390_TLS_LOAD (tag) | Y
  3807. // la %r10, 0(%r10, %r11) | |
  3808. // --------------------------------------------------------------
  3809. // R_390_TLS_IEENT
  3810. zRIL(_b, op_LARL, regtmp(p), 0, asm)
  3811. ieent := obj.Addrel(c.cursym)
  3812. ieent.Off = int32(c.pc + 2)
  3813. ieent.Siz = 4
  3814. ieent.Sym = p.From.Sym
  3815. ieent.Type = objabi.R_TLS_IE
  3816. ieent.Add = 2 + int64(ieent.Siz)
  3817. // R_390_TLS_LOAD
  3818. zRXY(op_LGF, uint32(p.To.Reg), regtmp(p), 0, 0, asm)
  3819. // TODO(mundaym): add R_390_TLS_LOAD relocation here
  3820. // not strictly required but might allow the linker to optimize
  3821. case 96: // clear macro
  3822. length := c.vregoff(&p.From)
  3823. offset := c.vregoff(&p.To)
  3824. reg := p.To.Reg
  3825. if reg == 0 {
  3826. reg = REGSP
  3827. }
  3828. if length <= 0 {
  3829. c.ctxt.Diag("cannot CLEAR %d bytes, must be greater than 0", length)
  3830. }
  3831. for length > 0 {
  3832. if offset < 0 || offset >= DISP12 {
  3833. if offset >= -DISP20/2 && offset < DISP20/2 {
  3834. zRXY(op_LAY, regtmp(p), uint32(reg), 0, uint32(offset), asm)
  3835. } else {
  3836. if reg != int16(regtmp(p)) {
  3837. zRRE(op_LGR, regtmp(p), uint32(reg), asm)
  3838. }
  3839. zRIL(_a, op_AGFI, regtmp(p), uint32(offset), asm)
  3840. }
  3841. reg = int16(regtmp(p))
  3842. offset = 0
  3843. }
  3844. size := length
  3845. if size > 256 {
  3846. size = 256
  3847. }
  3848. switch size {
  3849. case 1:
  3850. zSI(op_MVI, 0, uint32(reg), uint32(offset), asm)
  3851. case 2:
  3852. zSIL(op_MVHHI, uint32(reg), uint32(offset), 0, asm)
  3853. case 4:
  3854. zSIL(op_MVHI, uint32(reg), uint32(offset), 0, asm)
  3855. case 8:
  3856. zSIL(op_MVGHI, uint32(reg), uint32(offset), 0, asm)
  3857. default:
  3858. zSS(_a, op_XC, uint32(size-1), 0, uint32(reg), uint32(offset), uint32(reg), uint32(offset), asm)
  3859. }
  3860. length -= size
  3861. offset += size
  3862. }
  3863. case 97: // store multiple
  3864. rstart := p.From.Reg
  3865. rend := p.Reg
  3866. offset := c.regoff(&p.To)
  3867. reg := p.To.Reg
  3868. if reg == 0 {
  3869. reg = REGSP
  3870. }
  3871. if offset < -DISP20/2 || offset >= DISP20/2 {
  3872. if reg != int16(regtmp(p)) {
  3873. zRRE(op_LGR, regtmp(p), uint32(reg), asm)
  3874. }
  3875. zRIL(_a, op_AGFI, regtmp(p), uint32(offset), asm)
  3876. reg = int16(regtmp(p))
  3877. offset = 0
  3878. }
  3879. switch p.As {
  3880. case ASTMY:
  3881. if offset >= 0 && offset < DISP12 {
  3882. zRS(op_STM, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
  3883. } else {
  3884. zRSY(op_STMY, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
  3885. }
  3886. case ASTMG:
  3887. zRSY(op_STMG, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
  3888. }
  3889. case 98: // load multiple
  3890. rstart := p.Reg
  3891. rend := p.To.Reg
  3892. offset := c.regoff(&p.From)
  3893. reg := p.From.Reg
  3894. if reg == 0 {
  3895. reg = REGSP
  3896. }
  3897. if offset < -DISP20/2 || offset >= DISP20/2 {
  3898. if reg != int16(regtmp(p)) {
  3899. zRRE(op_LGR, regtmp(p), uint32(reg), asm)
  3900. }
  3901. zRIL(_a, op_AGFI, regtmp(p), uint32(offset), asm)
  3902. reg = int16(regtmp(p))
  3903. offset = 0
  3904. }
  3905. switch p.As {
  3906. case ALMY:
  3907. if offset >= 0 && offset < DISP12 {
  3908. zRS(op_LM, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
  3909. } else {
  3910. zRSY(op_LMY, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
  3911. }
  3912. case ALMG:
  3913. zRSY(op_LMG, uint32(rstart), uint32(rend), uint32(reg), uint32(offset), asm)
  3914. }
  3915. case 99: // interlocked load and op
  3916. if p.To.Index != 0 {
  3917. c.ctxt.Diag("cannot use indexed address")
  3918. }
  3919. offset := c.regoff(&p.To)
  3920. if offset < -DISP20/2 || offset >= DISP20/2 {
  3921. c.ctxt.Diag("%v does not fit into 20-bit signed integer", offset)
  3922. }
  3923. var opcode uint32
  3924. switch p.As {
  3925. case ALAA:
  3926. opcode = op_LAA
  3927. case ALAAG:
  3928. opcode = op_LAAG
  3929. case ALAAL:
  3930. opcode = op_LAAL
  3931. case ALAALG:
  3932. opcode = op_LAALG
  3933. case ALAN:
  3934. opcode = op_LAN
  3935. case ALANG:
  3936. opcode = op_LANG
  3937. case ALAX:
  3938. opcode = op_LAX
  3939. case ALAXG:
  3940. opcode = op_LAXG
  3941. case ALAO:
  3942. opcode = op_LAO
  3943. case ALAOG:
  3944. opcode = op_LAOG
  3945. }
  3946. zRSY(opcode, uint32(p.Reg), uint32(p.From.Reg), uint32(p.To.Reg), uint32(offset), asm)
  3947. case 100: // VRX STORE
  3948. op, m3, _ := vop(p.As)
  3949. v1 := p.From.Reg
  3950. if p.Reg != 0 {
  3951. m3 = uint32(c.vregoff(&p.From))
  3952. v1 = p.Reg
  3953. }
  3954. b2 := p.To.Reg
  3955. if b2 == 0 {
  3956. b2 = REGSP
  3957. }
  3958. d2 := uint32(c.vregoff(&p.To))
  3959. zVRX(op, uint32(v1), uint32(p.To.Index), uint32(b2), d2, m3, asm)
  3960. case 101: // VRX LOAD
  3961. op, m3, _ := vop(p.As)
  3962. src := &p.From
  3963. if p.GetFrom3() != nil {
  3964. m3 = uint32(c.vregoff(&p.From))
  3965. src = p.GetFrom3()
  3966. }
  3967. b2 := src.Reg
  3968. if b2 == 0 {
  3969. b2 = REGSP
  3970. }
  3971. d2 := uint32(c.vregoff(src))
  3972. zVRX(op, uint32(p.To.Reg), uint32(src.Index), uint32(b2), d2, m3, asm)
  3973. case 102: // VRV SCATTER
  3974. op, _, _ := vop(p.As)
  3975. m3 := uint32(c.vregoff(&p.From))
  3976. b2 := p.To.Reg
  3977. if b2 == 0 {
  3978. b2 = REGSP
  3979. }
  3980. d2 := uint32(c.vregoff(&p.To))
  3981. zVRV(op, uint32(p.Reg), uint32(p.To.Index), uint32(b2), d2, m3, asm)
  3982. case 103: // VRV GATHER
  3983. op, _, _ := vop(p.As)
  3984. m3 := uint32(c.vregoff(&p.From))
  3985. b2 := p.GetFrom3().Reg
  3986. if b2 == 0 {
  3987. b2 = REGSP
  3988. }
  3989. d2 := uint32(c.vregoff(p.GetFrom3()))
  3990. zVRV(op, uint32(p.To.Reg), uint32(p.GetFrom3().Index), uint32(b2), d2, m3, asm)
  3991. case 104: // VRS SHIFT/ROTATE and LOAD GR FROM VR ELEMENT
  3992. op, m4, _ := vop(p.As)
  3993. fr := p.Reg
  3994. if fr == 0 {
  3995. fr = p.To.Reg
  3996. }
  3997. bits := uint32(c.vregoff(&p.From))
  3998. zVRS(op, uint32(p.To.Reg), uint32(fr), uint32(p.From.Reg), bits, m4, asm)
  3999. case 105: // VRS STORE MULTIPLE
  4000. op, _, _ := vop(p.As)
  4001. offset := uint32(c.vregoff(&p.To))
  4002. reg := p.To.Reg
  4003. if reg == 0 {
  4004. reg = REGSP
  4005. }
  4006. zVRS(op, uint32(p.From.Reg), uint32(p.Reg), uint32(reg), offset, 0, asm)
  4007. case 106: // VRS LOAD MULTIPLE
  4008. op, _, _ := vop(p.As)
  4009. offset := uint32(c.vregoff(&p.From))
  4010. reg := p.From.Reg
  4011. if reg == 0 {
  4012. reg = REGSP
  4013. }
  4014. zVRS(op, uint32(p.Reg), uint32(p.To.Reg), uint32(reg), offset, 0, asm)
  4015. case 107: // VRS STORE WITH LENGTH
  4016. op, _, _ := vop(p.As)
  4017. offset := uint32(c.vregoff(&p.To))
  4018. reg := p.To.Reg
  4019. if reg == 0 {
  4020. reg = REGSP
  4021. }
  4022. zVRS(op, uint32(p.Reg), uint32(p.From.Reg), uint32(reg), offset, 0, asm)
  4023. case 108: // VRS LOAD WITH LENGTH
  4024. op, _, _ := vop(p.As)
  4025. offset := uint32(c.vregoff(p.GetFrom3()))
  4026. reg := p.GetFrom3().Reg
  4027. if reg == 0 {
  4028. reg = REGSP
  4029. }
  4030. zVRS(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(reg), offset, 0, asm)
  4031. case 109: // VRI-a
  4032. op, m3, _ := vop(p.As)
  4033. i2 := uint32(c.vregoff(&p.From))
  4034. if p.GetFrom3() != nil {
  4035. m3 = uint32(c.vregoff(&p.From))
  4036. i2 = uint32(c.vregoff(p.GetFrom3()))
  4037. }
  4038. switch p.As {
  4039. case AVZERO:
  4040. i2 = 0
  4041. case AVONE:
  4042. i2 = 0xffff
  4043. }
  4044. zVRIa(op, uint32(p.To.Reg), i2, m3, asm)
  4045. case 110:
  4046. op, m4, _ := vop(p.As)
  4047. i2 := uint32(c.vregoff(&p.From))
  4048. i3 := uint32(c.vregoff(p.GetFrom3()))
  4049. zVRIb(op, uint32(p.To.Reg), i2, i3, m4, asm)
  4050. case 111:
  4051. op, m4, _ := vop(p.As)
  4052. i2 := uint32(c.vregoff(&p.From))
  4053. zVRIc(op, uint32(p.To.Reg), uint32(p.Reg), i2, m4, asm)
  4054. case 112:
  4055. op, m5, _ := vop(p.As)
  4056. i4 := uint32(c.vregoff(&p.From))
  4057. zVRId(op, uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), i4, m5, asm)
  4058. case 113:
  4059. op, m4, _ := vop(p.As)
  4060. m5 := singleElementMask(p.As)
  4061. i3 := uint32(c.vregoff(&p.From))
  4062. zVRIe(op, uint32(p.To.Reg), uint32(p.Reg), i3, m5, m4, asm)
  4063. case 114: // VRR-a
  4064. op, m3, m5 := vop(p.As)
  4065. m4 := singleElementMask(p.As)
  4066. zVRRa(op, uint32(p.To.Reg), uint32(p.From.Reg), m5, m4, m3, asm)
  4067. case 115: // VRR-a COMPARE
  4068. op, m3, m5 := vop(p.As)
  4069. m4 := singleElementMask(p.As)
  4070. zVRRa(op, uint32(p.From.Reg), uint32(p.To.Reg), m5, m4, m3, asm)
  4071. case 117: // VRR-b
  4072. op, m4, m5 := vop(p.As)
  4073. zVRRb(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), m5, m4, asm)
  4074. case 118: // VRR-c
  4075. op, m4, m6 := vop(p.As)
  4076. m5 := singleElementMask(p.As)
  4077. v3 := p.Reg
  4078. if v3 == 0 {
  4079. v3 = p.To.Reg
  4080. }
  4081. zVRRc(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(v3), m6, m5, m4, asm)
  4082. case 119: // VRR-c SHIFT/ROTATE/DIVIDE/SUB (rhs value on the left, like SLD, DIV etc.)
  4083. op, m4, m6 := vop(p.As)
  4084. m5 := singleElementMask(p.As)
  4085. v2 := p.Reg
  4086. if v2 == 0 {
  4087. v2 = p.To.Reg
  4088. }
  4089. zVRRc(op, uint32(p.To.Reg), uint32(v2), uint32(p.From.Reg), m6, m5, m4, asm)
  4090. case 120: // VRR-d
  4091. op, m6, _ := vop(p.As)
  4092. m5 := singleElementMask(p.As)
  4093. v1 := uint32(p.To.Reg)
  4094. v2 := uint32(p.From.Reg)
  4095. v3 := uint32(p.Reg)
  4096. v4 := uint32(p.GetFrom3().Reg)
  4097. zVRRd(op, v1, v2, v3, m6, m5, v4, asm)
  4098. case 121: // VRR-e
  4099. op, m6, _ := vop(p.As)
  4100. m5 := singleElementMask(p.As)
  4101. v1 := uint32(p.To.Reg)
  4102. v2 := uint32(p.From.Reg)
  4103. v3 := uint32(p.Reg)
  4104. v4 := uint32(p.GetFrom3().Reg)
  4105. zVRRe(op, v1, v2, v3, m6, m5, v4, asm)
  4106. case 122: // VRR-f LOAD VRS FROM GRS DISJOINT
  4107. op, _, _ := vop(p.As)
  4108. zVRRf(op, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), asm)
  4109. case 123: // VPDI $m4, V2, V3, V1
  4110. op, _, _ := vop(p.As)
  4111. m4 := c.regoff(&p.From)
  4112. zVRRc(op, uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), 0, 0, uint32(m4), asm)
  4113. }
  4114. }
  4115. func (c *ctxtz) vregoff(a *obj.Addr) int64 {
  4116. c.instoffset = 0
  4117. if a != nil {
  4118. c.aclass(a)
  4119. }
  4120. return c.instoffset
  4121. }
  4122. func (c *ctxtz) regoff(a *obj.Addr) int32 {
  4123. return int32(c.vregoff(a))
  4124. }
  4125. // find if the displacement is within 12 bit
  4126. func isU12(displacement int32) bool {
  4127. return displacement >= 0 && displacement < DISP12
  4128. }
  4129. // zopload12 returns the RX op with 12 bit displacement for the given load
  4130. func (c *ctxtz) zopload12(a obj.As) (uint32, bool) {
  4131. switch a {
  4132. case AFMOVD:
  4133. return op_LD, true
  4134. case AFMOVS:
  4135. return op_LE, true
  4136. }
  4137. return 0, false
  4138. }
  4139. // zopload returns the RXY op for the given load
  4140. func (c *ctxtz) zopload(a obj.As) uint32 {
  4141. switch a {
  4142. // fixed point load
  4143. case AMOVD:
  4144. return op_LG
  4145. case AMOVW:
  4146. return op_LGF
  4147. case AMOVWZ:
  4148. return op_LLGF
  4149. case AMOVH:
  4150. return op_LGH
  4151. case AMOVHZ:
  4152. return op_LLGH
  4153. case AMOVB:
  4154. return op_LGB
  4155. case AMOVBZ:
  4156. return op_LLGC
  4157. // floating point load
  4158. case AFMOVD:
  4159. return op_LDY
  4160. case AFMOVS:
  4161. return op_LEY
  4162. // byte reversed load
  4163. case AMOVDBR:
  4164. return op_LRVG
  4165. case AMOVWBR:
  4166. return op_LRV
  4167. case AMOVHBR:
  4168. return op_LRVH
  4169. }
  4170. c.ctxt.Diag("unknown store opcode %v", a)
  4171. return 0
  4172. }
  4173. // zopstore12 returns the RX op with 12 bit displacement for the given store
  4174. func (c *ctxtz) zopstore12(a obj.As) (uint32, bool) {
  4175. switch a {
  4176. case AFMOVD:
  4177. return op_STD, true
  4178. case AFMOVS:
  4179. return op_STE, true
  4180. case AMOVW, AMOVWZ:
  4181. return op_ST, true
  4182. case AMOVH, AMOVHZ:
  4183. return op_STH, true
  4184. case AMOVB, AMOVBZ:
  4185. return op_STC, true
  4186. }
  4187. return 0, false
  4188. }
  4189. // zopstore returns the RXY op for the given store
  4190. func (c *ctxtz) zopstore(a obj.As) uint32 {
  4191. switch a {
  4192. // fixed point store
  4193. case AMOVD:
  4194. return op_STG
  4195. case AMOVW, AMOVWZ:
  4196. return op_STY
  4197. case AMOVH, AMOVHZ:
  4198. return op_STHY
  4199. case AMOVB, AMOVBZ:
  4200. return op_STCY
  4201. // floating point store
  4202. case AFMOVD:
  4203. return op_STDY
  4204. case AFMOVS:
  4205. return op_STEY
  4206. // byte reversed store
  4207. case AMOVDBR:
  4208. return op_STRVG
  4209. case AMOVWBR:
  4210. return op_STRV
  4211. case AMOVHBR:
  4212. return op_STRVH
  4213. }
  4214. c.ctxt.Diag("unknown store opcode %v", a)
  4215. return 0
  4216. }
  4217. // zoprre returns the RRE op for the given a
  4218. func (c *ctxtz) zoprre(a obj.As) uint32 {
  4219. switch a {
  4220. case ACMP:
  4221. return op_CGR
  4222. case ACMPU:
  4223. return op_CLGR
  4224. case AFCMPO: //ordered
  4225. return op_KDBR
  4226. case AFCMPU: //unordered
  4227. return op_CDBR
  4228. case ACEBR:
  4229. return op_CEBR
  4230. }
  4231. c.ctxt.Diag("unknown rre opcode %v", a)
  4232. return 0
  4233. }
  4234. // zoprr returns the RR op for the given a
  4235. func (c *ctxtz) zoprr(a obj.As) uint32 {
  4236. switch a {
  4237. case ACMPW:
  4238. return op_CR
  4239. case ACMPWU:
  4240. return op_CLR
  4241. }
  4242. c.ctxt.Diag("unknown rr opcode %v", a)
  4243. return 0
  4244. }
  4245. // zopril returns the RIL op for the given a
  4246. func (c *ctxtz) zopril(a obj.As) uint32 {
  4247. switch a {
  4248. case ACMP:
  4249. return op_CGFI
  4250. case ACMPU:
  4251. return op_CLGFI
  4252. case ACMPW:
  4253. return op_CFI
  4254. case ACMPWU:
  4255. return op_CLFI
  4256. }
  4257. c.ctxt.Diag("unknown ril opcode %v", a)
  4258. return 0
  4259. }
  4260. // z instructions sizes
  4261. const (
  4262. sizeE = 2
  4263. sizeI = 2
  4264. sizeIE = 4
  4265. sizeMII = 6
  4266. sizeRI = 4
  4267. sizeRI1 = 4
  4268. sizeRI2 = 4
  4269. sizeRI3 = 4
  4270. sizeRIE = 6
  4271. sizeRIE1 = 6
  4272. sizeRIE2 = 6
  4273. sizeRIE3 = 6
  4274. sizeRIE4 = 6
  4275. sizeRIE5 = 6
  4276. sizeRIE6 = 6
  4277. sizeRIL = 6
  4278. sizeRIL1 = 6
  4279. sizeRIL2 = 6
  4280. sizeRIL3 = 6
  4281. sizeRIS = 6
  4282. sizeRR = 2
  4283. sizeRRD = 4
  4284. sizeRRE = 4
  4285. sizeRRF = 4
  4286. sizeRRF1 = 4
  4287. sizeRRF2 = 4
  4288. sizeRRF3 = 4
  4289. sizeRRF4 = 4
  4290. sizeRRF5 = 4
  4291. sizeRRR = 2
  4292. sizeRRS = 6
  4293. sizeRS = 4
  4294. sizeRS1 = 4
  4295. sizeRS2 = 4
  4296. sizeRSI = 4
  4297. sizeRSL = 6
  4298. sizeRSY = 6
  4299. sizeRSY1 = 6
  4300. sizeRSY2 = 6
  4301. sizeRX = 4
  4302. sizeRX1 = 4
  4303. sizeRX2 = 4
  4304. sizeRXE = 6
  4305. sizeRXF = 6
  4306. sizeRXY = 6
  4307. sizeRXY1 = 6
  4308. sizeRXY2 = 6
  4309. sizeS = 4
  4310. sizeSI = 4
  4311. sizeSIL = 6
  4312. sizeSIY = 6
  4313. sizeSMI = 6
  4314. sizeSS = 6
  4315. sizeSS1 = 6
  4316. sizeSS2 = 6
  4317. sizeSS3 = 6
  4318. sizeSS4 = 6
  4319. sizeSS5 = 6
  4320. sizeSS6 = 6
  4321. sizeSSE = 6
  4322. sizeSSF = 6
  4323. )
  4324. // instruction format variations
  4325. type form int
  4326. const (
  4327. _a form = iota
  4328. _b
  4329. _c
  4330. _d
  4331. _e
  4332. _f
  4333. )
  4334. func zE(op uint32, asm *[]byte) {
  4335. *asm = append(*asm, uint8(op>>8), uint8(op))
  4336. }
  4337. func zI(op, i1 uint32, asm *[]byte) {
  4338. *asm = append(*asm, uint8(op>>8), uint8(i1))
  4339. }
  4340. func zMII(op, m1, ri2, ri3 uint32, asm *[]byte) {
  4341. *asm = append(*asm,
  4342. uint8(op>>8),
  4343. (uint8(m1)<<4)|uint8((ri2>>8)&0x0F),
  4344. uint8(ri2),
  4345. uint8(ri3>>16),
  4346. uint8(ri3>>8),
  4347. uint8(ri3))
  4348. }
  4349. func zRI(op, r1_m1, i2_ri2 uint32, asm *[]byte) {
  4350. *asm = append(*asm,
  4351. uint8(op>>8),
  4352. (uint8(r1_m1)<<4)|(uint8(op)&0x0F),
  4353. uint8(i2_ri2>>8),
  4354. uint8(i2_ri2))
  4355. }
  4356. // Expected argument values for the instruction formats.
  4357. //
  4358. // Format a1 a2 a3 a4 a5 a6 a7
  4359. // ------------------------------------
  4360. // a r1, 0, i2, 0, 0, m3, 0
  4361. // b r1, r2, ri4, 0, 0, m3, 0
  4362. // c r1, m3, ri4, 0, 0, 0, i2
  4363. // d r1, r3, i2, 0, 0, 0, 0
  4364. // e r1, r3, ri2, 0, 0, 0, 0
  4365. // f r1, r2, 0, i3, i4, 0, i5
  4366. // g r1, m3, i2, 0, 0, 0, 0
  4367. func zRIE(f form, op, r1, r2_m3_r3, i2_ri4_ri2, i3, i4, m3, i2_i5 uint32, asm *[]byte) {
  4368. *asm = append(*asm, uint8(op>>8), uint8(r1)<<4|uint8(r2_m3_r3&0x0F))
  4369. switch f {
  4370. default:
  4371. *asm = append(*asm, uint8(i2_ri4_ri2>>8), uint8(i2_ri4_ri2))
  4372. case _f:
  4373. *asm = append(*asm, uint8(i3), uint8(i4))
  4374. }
  4375. switch f {
  4376. case _a, _b:
  4377. *asm = append(*asm, uint8(m3)<<4)
  4378. default:
  4379. *asm = append(*asm, uint8(i2_i5))
  4380. }
  4381. *asm = append(*asm, uint8(op))
  4382. }
  4383. func zRIL(f form, op, r1_m1, i2_ri2 uint32, asm *[]byte) {
  4384. if f == _a || f == _b {
  4385. r1_m1 = r1_m1 - obj.RBaseS390X // this is a register base
  4386. }
  4387. *asm = append(*asm,
  4388. uint8(op>>8),
  4389. (uint8(r1_m1)<<4)|(uint8(op)&0x0F),
  4390. uint8(i2_ri2>>24),
  4391. uint8(i2_ri2>>16),
  4392. uint8(i2_ri2>>8),
  4393. uint8(i2_ri2))
  4394. }
  4395. func zRIS(op, r1, m3, b4, d4, i2 uint32, asm *[]byte) {
  4396. *asm = append(*asm,
  4397. uint8(op>>8),
  4398. (uint8(r1)<<4)|uint8(m3&0x0F),
  4399. (uint8(b4)<<4)|(uint8(d4>>8)&0x0F),
  4400. uint8(d4),
  4401. uint8(i2),
  4402. uint8(op))
  4403. }
  4404. func zRR(op, r1, r2 uint32, asm *[]byte) {
  4405. *asm = append(*asm, uint8(op>>8), (uint8(r1)<<4)|uint8(r2&0x0F))
  4406. }
  4407. func zRRD(op, r1, r3, r2 uint32, asm *[]byte) {
  4408. *asm = append(*asm,
  4409. uint8(op>>8),
  4410. uint8(op),
  4411. uint8(r1)<<4,
  4412. (uint8(r3)<<4)|uint8(r2&0x0F))
  4413. }
  4414. func zRRE(op, r1, r2 uint32, asm *[]byte) {
  4415. *asm = append(*asm,
  4416. uint8(op>>8),
  4417. uint8(op),
  4418. 0,
  4419. (uint8(r1)<<4)|uint8(r2&0x0F))
  4420. }
  4421. func zRRF(op, r3_m3, m4, r1, r2 uint32, asm *[]byte) {
  4422. *asm = append(*asm,
  4423. uint8(op>>8),
  4424. uint8(op),
  4425. (uint8(r3_m3)<<4)|uint8(m4&0x0F),
  4426. (uint8(r1)<<4)|uint8(r2&0x0F))
  4427. }
  4428. func zRRS(op, r1, r2, b4, d4, m3 uint32, asm *[]byte) {
  4429. *asm = append(*asm,
  4430. uint8(op>>8),
  4431. (uint8(r1)<<4)|uint8(r2&0x0F),
  4432. (uint8(b4)<<4)|uint8((d4>>8)&0x0F),
  4433. uint8(d4),
  4434. uint8(m3)<<4,
  4435. uint8(op))
  4436. }
  4437. func zRS(op, r1, r3_m3, b2, d2 uint32, asm *[]byte) {
  4438. *asm = append(*asm,
  4439. uint8(op>>8),
  4440. (uint8(r1)<<4)|uint8(r3_m3&0x0F),
  4441. (uint8(b2)<<4)|uint8((d2>>8)&0x0F),
  4442. uint8(d2))
  4443. }
  4444. func zRSI(op, r1, r3, ri2 uint32, asm *[]byte) {
  4445. *asm = append(*asm,
  4446. uint8(op>>8),
  4447. (uint8(r1)<<4)|uint8(r3&0x0F),
  4448. uint8(ri2>>8),
  4449. uint8(ri2))
  4450. }
  4451. func zRSL(op, l1, b2, d2 uint32, asm *[]byte) {
  4452. *asm = append(*asm,
  4453. uint8(op>>8),
  4454. uint8(l1),
  4455. (uint8(b2)<<4)|uint8((d2>>8)&0x0F),
  4456. uint8(d2),
  4457. uint8(op))
  4458. }
  4459. func zRSY(op, r1, r3_m3, b2, d2 uint32, asm *[]byte) {
  4460. dl2 := uint16(d2) & 0x0FFF
  4461. *asm = append(*asm,
  4462. uint8(op>>8),
  4463. (uint8(r1)<<4)|uint8(r3_m3&0x0F),
  4464. (uint8(b2)<<4)|(uint8(dl2>>8)&0x0F),
  4465. uint8(dl2),
  4466. uint8(d2>>12),
  4467. uint8(op))
  4468. }
  4469. func zRX(op, r1_m1, x2, b2, d2 uint32, asm *[]byte) {
  4470. *asm = append(*asm,
  4471. uint8(op>>8),
  4472. (uint8(r1_m1)<<4)|uint8(x2&0x0F),
  4473. (uint8(b2)<<4)|uint8((d2>>8)&0x0F),
  4474. uint8(d2))
  4475. }
  4476. func zRXE(op, r1, x2, b2, d2, m3 uint32, asm *[]byte) {
  4477. *asm = append(*asm,
  4478. uint8(op>>8),
  4479. (uint8(r1)<<4)|uint8(x2&0x0F),
  4480. (uint8(b2)<<4)|uint8((d2>>8)&0x0F),
  4481. uint8(d2),
  4482. uint8(m3)<<4,
  4483. uint8(op))
  4484. }
  4485. func zRXF(op, r3, x2, b2, d2, m1 uint32, asm *[]byte) {
  4486. *asm = append(*asm,
  4487. uint8(op>>8),
  4488. (uint8(r3)<<4)|uint8(x2&0x0F),
  4489. (uint8(b2)<<4)|uint8((d2>>8)&0x0F),
  4490. uint8(d2),
  4491. uint8(m1)<<4,
  4492. uint8(op))
  4493. }
  4494. func zRXY(op, r1_m1, x2, b2, d2 uint32, asm *[]byte) {
  4495. dl2 := uint16(d2) & 0x0FFF
  4496. *asm = append(*asm,
  4497. uint8(op>>8),
  4498. (uint8(r1_m1)<<4)|uint8(x2&0x0F),
  4499. (uint8(b2)<<4)|(uint8(dl2>>8)&0x0F),
  4500. uint8(dl2),
  4501. uint8(d2>>12),
  4502. uint8(op))
  4503. }
  4504. func zS(op, b2, d2 uint32, asm *[]byte) {
  4505. *asm = append(*asm,
  4506. uint8(op>>8),
  4507. uint8(op),
  4508. (uint8(b2)<<4)|uint8((d2>>8)&0x0F),
  4509. uint8(d2))
  4510. }
  4511. func zSI(op, i2, b1, d1 uint32, asm *[]byte) {
  4512. *asm = append(*asm,
  4513. uint8(op>>8),
  4514. uint8(i2),
  4515. (uint8(b1)<<4)|uint8((d1>>8)&0x0F),
  4516. uint8(d1))
  4517. }
  4518. func zSIL(op, b1, d1, i2 uint32, asm *[]byte) {
  4519. *asm = append(*asm,
  4520. uint8(op>>8),
  4521. uint8(op),
  4522. (uint8(b1)<<4)|uint8((d1>>8)&0x0F),
  4523. uint8(d1),
  4524. uint8(i2>>8),
  4525. uint8(i2))
  4526. }
  4527. func zSIY(op, i2, b1, d1 uint32, asm *[]byte) {
  4528. dl1 := uint16(d1) & 0x0FFF
  4529. *asm = append(*asm,
  4530. uint8(op>>8),
  4531. uint8(i2),
  4532. (uint8(b1)<<4)|(uint8(dl1>>8)&0x0F),
  4533. uint8(dl1),
  4534. uint8(d1>>12),
  4535. uint8(op))
  4536. }
  4537. func zSMI(op, m1, b3, d3, ri2 uint32, asm *[]byte) {
  4538. *asm = append(*asm,
  4539. uint8(op>>8),
  4540. uint8(m1)<<4,
  4541. (uint8(b3)<<4)|uint8((d3>>8)&0x0F),
  4542. uint8(d3),
  4543. uint8(ri2>>8),
  4544. uint8(ri2))
  4545. }
  4546. // Expected argument values for the instruction formats.
  4547. //
  4548. // Format a1 a2 a3 a4 a5 a6
  4549. // -------------------------------
  4550. // a l1, 0, b1, d1, b2, d2
  4551. // b l1, l2, b1, d1, b2, d2
  4552. // c l1, i3, b1, d1, b2, d2
  4553. // d r1, r3, b1, d1, b2, d2
  4554. // e r1, r3, b2, d2, b4, d4
  4555. // f 0, l2, b1, d1, b2, d2
  4556. func zSS(f form, op, l1_r1, l2_i3_r3, b1_b2, d1_d2, b2_b4, d2_d4 uint32, asm *[]byte) {
  4557. *asm = append(*asm, uint8(op>>8))
  4558. switch f {
  4559. case _a:
  4560. *asm = append(*asm, uint8(l1_r1))
  4561. case _b, _c, _d, _e:
  4562. *asm = append(*asm, (uint8(l1_r1)<<4)|uint8(l2_i3_r3&0x0F))
  4563. case _f:
  4564. *asm = append(*asm, uint8(l2_i3_r3))
  4565. }
  4566. *asm = append(*asm,
  4567. (uint8(b1_b2)<<4)|uint8((d1_d2>>8)&0x0F),
  4568. uint8(d1_d2),
  4569. (uint8(b2_b4)<<4)|uint8((d2_d4>>8)&0x0F),
  4570. uint8(d2_d4))
  4571. }
  4572. func zSSE(op, b1, d1, b2, d2 uint32, asm *[]byte) {
  4573. *asm = append(*asm,
  4574. uint8(op>>8),
  4575. uint8(op),
  4576. (uint8(b1)<<4)|uint8((d1>>8)&0x0F),
  4577. uint8(d1),
  4578. (uint8(b2)<<4)|uint8((d2>>8)&0x0F),
  4579. uint8(d2))
  4580. }
  4581. func zSSF(op, r3, b1, d1, b2, d2 uint32, asm *[]byte) {
  4582. *asm = append(*asm,
  4583. uint8(op>>8),
  4584. (uint8(r3)<<4)|(uint8(op)&0x0F),
  4585. (uint8(b1)<<4)|uint8((d1>>8)&0x0F),
  4586. uint8(d1),
  4587. (uint8(b2)<<4)|uint8((d2>>8)&0x0F),
  4588. uint8(d2))
  4589. }
  4590. func rxb(va, vb, vc, vd uint32) uint8 {
  4591. mask := uint8(0)
  4592. if va >= REG_V16 && va <= REG_V31 {
  4593. mask |= 0x8
  4594. }
  4595. if vb >= REG_V16 && vb <= REG_V31 {
  4596. mask |= 0x4
  4597. }
  4598. if vc >= REG_V16 && vc <= REG_V31 {
  4599. mask |= 0x2
  4600. }
  4601. if vd >= REG_V16 && vd <= REG_V31 {
  4602. mask |= 0x1
  4603. }
  4604. return mask
  4605. }
  4606. func zVRX(op, v1, x2, b2, d2, m3 uint32, asm *[]byte) {
  4607. *asm = append(*asm,
  4608. uint8(op>>8),
  4609. (uint8(v1)<<4)|(uint8(x2)&0xf),
  4610. (uint8(b2)<<4)|(uint8(d2>>8)&0xf),
  4611. uint8(d2),
  4612. (uint8(m3)<<4)|rxb(v1, 0, 0, 0),
  4613. uint8(op))
  4614. }
  4615. func zVRV(op, v1, v2, b2, d2, m3 uint32, asm *[]byte) {
  4616. *asm = append(*asm,
  4617. uint8(op>>8),
  4618. (uint8(v1)<<4)|(uint8(v2)&0xf),
  4619. (uint8(b2)<<4)|(uint8(d2>>8)&0xf),
  4620. uint8(d2),
  4621. (uint8(m3)<<4)|rxb(v1, v2, 0, 0),
  4622. uint8(op))
  4623. }
  4624. func zVRS(op, v1, v3_r3, b2, d2, m4 uint32, asm *[]byte) {
  4625. *asm = append(*asm,
  4626. uint8(op>>8),
  4627. (uint8(v1)<<4)|(uint8(v3_r3)&0xf),
  4628. (uint8(b2)<<4)|(uint8(d2>>8)&0xf),
  4629. uint8(d2),
  4630. (uint8(m4)<<4)|rxb(v1, v3_r3, 0, 0),
  4631. uint8(op))
  4632. }
  4633. func zVRRa(op, v1, v2, m5, m4, m3 uint32, asm *[]byte) {
  4634. *asm = append(*asm,
  4635. uint8(op>>8),
  4636. (uint8(v1)<<4)|(uint8(v2)&0xf),
  4637. 0,
  4638. (uint8(m5)<<4)|(uint8(m4)&0xf),
  4639. (uint8(m3)<<4)|rxb(v1, v2, 0, 0),
  4640. uint8(op))
  4641. }
  4642. func zVRRb(op, v1, v2, v3, m5, m4 uint32, asm *[]byte) {
  4643. *asm = append(*asm,
  4644. uint8(op>>8),
  4645. (uint8(v1)<<4)|(uint8(v2)&0xf),
  4646. uint8(v3)<<4,
  4647. uint8(m5)<<4,
  4648. (uint8(m4)<<4)|rxb(v1, v2, v3, 0),
  4649. uint8(op))
  4650. }
  4651. func zVRRc(op, v1, v2, v3, m6, m5, m4 uint32, asm *[]byte) {
  4652. *asm = append(*asm,
  4653. uint8(op>>8),
  4654. (uint8(v1)<<4)|(uint8(v2)&0xf),
  4655. uint8(v3)<<4,
  4656. (uint8(m6)<<4)|(uint8(m5)&0xf),
  4657. (uint8(m4)<<4)|rxb(v1, v2, v3, 0),
  4658. uint8(op))
  4659. }
  4660. func zVRRd(op, v1, v2, v3, m5, m6, v4 uint32, asm *[]byte) {
  4661. *asm = append(*asm,
  4662. uint8(op>>8),
  4663. (uint8(v1)<<4)|(uint8(v2)&0xf),
  4664. (uint8(v3)<<4)|(uint8(m5)&0xf),
  4665. uint8(m6)<<4,
  4666. (uint8(v4)<<4)|rxb(v1, v2, v3, v4),
  4667. uint8(op))
  4668. }
  4669. func zVRRe(op, v1, v2, v3, m6, m5, v4 uint32, asm *[]byte) {
  4670. *asm = append(*asm,
  4671. uint8(op>>8),
  4672. (uint8(v1)<<4)|(uint8(v2)&0xf),
  4673. (uint8(v3)<<4)|(uint8(m6)&0xf),
  4674. uint8(m5),
  4675. (uint8(v4)<<4)|rxb(v1, v2, v3, v4),
  4676. uint8(op))
  4677. }
  4678. func zVRRf(op, v1, r2, r3 uint32, asm *[]byte) {
  4679. *asm = append(*asm,
  4680. uint8(op>>8),
  4681. (uint8(v1)<<4)|(uint8(r2)&0xf),
  4682. uint8(r3)<<4,
  4683. 0,
  4684. rxb(v1, 0, 0, 0),
  4685. uint8(op))
  4686. }
  4687. func zVRIa(op, v1, i2, m3 uint32, asm *[]byte) {
  4688. *asm = append(*asm,
  4689. uint8(op>>8),
  4690. uint8(v1)<<4,
  4691. uint8(i2>>8),
  4692. uint8(i2),
  4693. (uint8(m3)<<4)|rxb(v1, 0, 0, 0),
  4694. uint8(op))
  4695. }
  4696. func zVRIb(op, v1, i2, i3, m4 uint32, asm *[]byte) {
  4697. *asm = append(*asm,
  4698. uint8(op>>8),
  4699. uint8(v1)<<4,
  4700. uint8(i2),
  4701. uint8(i3),
  4702. (uint8(m4)<<4)|rxb(v1, 0, 0, 0),
  4703. uint8(op))
  4704. }
  4705. func zVRIc(op, v1, v3, i2, m4 uint32, asm *[]byte) {
  4706. *asm = append(*asm,
  4707. uint8(op>>8),
  4708. (uint8(v1)<<4)|(uint8(v3)&0xf),
  4709. uint8(i2>>8),
  4710. uint8(i2),
  4711. (uint8(m4)<<4)|rxb(v1, v3, 0, 0),
  4712. uint8(op))
  4713. }
  4714. func zVRId(op, v1, v2, v3, i4, m5 uint32, asm *[]byte) {
  4715. *asm = append(*asm,
  4716. uint8(op>>8),
  4717. (uint8(v1)<<4)|(uint8(v2)&0xf),
  4718. uint8(v3)<<4,
  4719. uint8(i4),
  4720. (uint8(m5)<<4)|rxb(v1, v2, v3, 0),
  4721. uint8(op))
  4722. }
  4723. func zVRIe(op, v1, v2, i3, m5, m4 uint32, asm *[]byte) {
  4724. *asm = append(*asm,
  4725. uint8(op>>8),
  4726. (uint8(v1)<<4)|(uint8(v2)&0xf),
  4727. uint8(i3>>4),
  4728. (uint8(i3)<<4)|(uint8(m5)&0xf),
  4729. (uint8(m4)<<4)|rxb(v1, v2, 0, 0),
  4730. uint8(op))
  4731. }