asm9.go 148 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367
  1. // cmd/9l/optab.c, cmd/9l/asmout.c from Vita Nuova.
  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 ppc64
  30. import (
  31. "github.com/twitchyliquid64/golang-asm/obj"
  32. "github.com/twitchyliquid64/golang-asm/objabi"
  33. "encoding/binary"
  34. "fmt"
  35. "log"
  36. "math"
  37. "sort"
  38. )
  39. // ctxt9 holds state while assembling a single function.
  40. // Each function gets a fresh ctxt9.
  41. // This allows for multiple functions to be safely concurrently assembled.
  42. type ctxt9 struct {
  43. ctxt *obj.Link
  44. newprog obj.ProgAlloc
  45. cursym *obj.LSym
  46. autosize int32
  47. instoffset int64
  48. pc int64
  49. }
  50. // Instruction layout.
  51. const (
  52. funcAlign = 16
  53. funcAlignMask = funcAlign - 1
  54. )
  55. const (
  56. r0iszero = 1
  57. )
  58. type Optab struct {
  59. as obj.As // Opcode
  60. a1 uint8
  61. a2 uint8
  62. a3 uint8
  63. a4 uint8
  64. type_ int8 // cases in asmout below. E.g., 44 = st r,(ra+rb); 45 = ld (ra+rb), r
  65. size int8
  66. param int16
  67. }
  68. // This optab contains a list of opcodes with the operand
  69. // combinations that are implemented. Not all opcodes are in this
  70. // table, but are added later in buildop by calling opset for those
  71. // opcodes which allow the same operand combinations as an opcode
  72. // already in the table.
  73. //
  74. // The type field in the Optabl identifies the case in asmout where
  75. // the instruction word is assembled.
  76. var optab = []Optab{
  77. {obj.ATEXT, C_LEXT, C_NONE, C_NONE, C_TEXTSIZE, 0, 0, 0},
  78. {obj.ATEXT, C_LEXT, C_NONE, C_LCON, C_TEXTSIZE, 0, 0, 0},
  79. {obj.ATEXT, C_ADDR, C_NONE, C_NONE, C_TEXTSIZE, 0, 0, 0},
  80. {obj.ATEXT, C_ADDR, C_NONE, C_LCON, C_TEXTSIZE, 0, 0, 0},
  81. /* move register */
  82. {AMOVD, C_REG, C_NONE, C_NONE, C_REG, 1, 4, 0},
  83. {AMOVB, C_REG, C_NONE, C_NONE, C_REG, 12, 4, 0},
  84. {AMOVBZ, C_REG, C_NONE, C_NONE, C_REG, 13, 4, 0},
  85. {AMOVW, C_REG, C_NONE, C_NONE, C_REG, 12, 4, 0},
  86. {AMOVWZ, C_REG, C_NONE, C_NONE, C_REG, 13, 4, 0},
  87. {AADD, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
  88. {AADD, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
  89. {AADD, C_SCON, C_REG, C_NONE, C_REG, 4, 4, 0},
  90. {AADD, C_SCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
  91. {AADD, C_ADDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
  92. {AADD, C_ADDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
  93. {AADD, C_UCON, C_REG, C_NONE, C_REG, 20, 4, 0},
  94. {AADD, C_UCON, C_NONE, C_NONE, C_REG, 20, 4, 0},
  95. {AADD, C_ANDCON, C_REG, C_NONE, C_REG, 22, 8, 0},
  96. {AADD, C_ANDCON, C_NONE, C_NONE, C_REG, 22, 8, 0},
  97. {AADD, C_LCON, C_REG, C_NONE, C_REG, 22, 12, 0},
  98. {AADD, C_LCON, C_NONE, C_NONE, C_REG, 22, 12, 0},
  99. {AADDIS, C_ADDCON, C_REG, C_NONE, C_REG, 20, 4, 0},
  100. {AADDIS, C_ADDCON, C_NONE, C_NONE, C_REG, 20, 4, 0},
  101. {AADDC, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
  102. {AADDC, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
  103. {AADDC, C_ADDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
  104. {AADDC, C_ADDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
  105. {AADDC, C_LCON, C_REG, C_NONE, C_REG, 22, 12, 0},
  106. {AADDC, C_LCON, C_NONE, C_NONE, C_REG, 22, 12, 0},
  107. {AAND, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0}, /* logical, no literal */
  108. {AAND, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
  109. {AANDCC, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
  110. {AANDCC, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
  111. {AANDCC, C_ANDCON, C_NONE, C_NONE, C_REG, 58, 4, 0},
  112. {AANDCC, C_ANDCON, C_REG, C_NONE, C_REG, 58, 4, 0},
  113. {AANDCC, C_UCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
  114. {AANDCC, C_UCON, C_REG, C_NONE, C_REG, 59, 4, 0},
  115. {AANDCC, C_ADDCON, C_NONE, C_NONE, C_REG, 23, 8, 0},
  116. {AANDCC, C_ADDCON, C_REG, C_NONE, C_REG, 23, 8, 0},
  117. {AANDCC, C_LCON, C_NONE, C_NONE, C_REG, 23, 12, 0},
  118. {AANDCC, C_LCON, C_REG, C_NONE, C_REG, 23, 12, 0},
  119. {AANDISCC, C_ANDCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
  120. {AANDISCC, C_ANDCON, C_REG, C_NONE, C_REG, 59, 4, 0},
  121. {AMULLW, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0},
  122. {AMULLW, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
  123. {AMULLW, C_ADDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
  124. {AMULLW, C_ADDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
  125. {AMULLW, C_ANDCON, C_REG, C_NONE, C_REG, 4, 4, 0},
  126. {AMULLW, C_ANDCON, C_NONE, C_NONE, C_REG, 4, 4, 0},
  127. {AMULLW, C_LCON, C_REG, C_NONE, C_REG, 22, 12, 0},
  128. {AMULLW, C_LCON, C_NONE, C_NONE, C_REG, 22, 12, 0},
  129. {ASUBC, C_REG, C_REG, C_NONE, C_REG, 10, 4, 0},
  130. {ASUBC, C_REG, C_NONE, C_NONE, C_REG, 10, 4, 0},
  131. {ASUBC, C_REG, C_NONE, C_ADDCON, C_REG, 27, 4, 0},
  132. {ASUBC, C_REG, C_NONE, C_LCON, C_REG, 28, 12, 0},
  133. {AOR, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0}, /* logical, literal not cc (or/xor) */
  134. {AOR, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
  135. {AOR, C_ANDCON, C_NONE, C_NONE, C_REG, 58, 4, 0},
  136. {AOR, C_ANDCON, C_REG, C_NONE, C_REG, 58, 4, 0},
  137. {AOR, C_UCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
  138. {AOR, C_UCON, C_REG, C_NONE, C_REG, 59, 4, 0},
  139. {AOR, C_ADDCON, C_NONE, C_NONE, C_REG, 23, 8, 0},
  140. {AOR, C_ADDCON, C_REG, C_NONE, C_REG, 23, 8, 0},
  141. {AOR, C_LCON, C_NONE, C_NONE, C_REG, 23, 12, 0},
  142. {AOR, C_LCON, C_REG, C_NONE, C_REG, 23, 12, 0},
  143. {AORIS, C_ANDCON, C_NONE, C_NONE, C_REG, 59, 4, 0},
  144. {AORIS, C_ANDCON, C_REG, C_NONE, C_REG, 59, 4, 0},
  145. {ADIVW, C_REG, C_REG, C_NONE, C_REG, 2, 4, 0}, /* op r1[,r2],r3 */
  146. {ADIVW, C_REG, C_NONE, C_NONE, C_REG, 2, 4, 0},
  147. {ASUB, C_REG, C_REG, C_NONE, C_REG, 10, 4, 0}, /* op r2[,r1],r3 */
  148. {ASUB, C_REG, C_NONE, C_NONE, C_REG, 10, 4, 0},
  149. {ASLW, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
  150. {ASLW, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
  151. {ASLD, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
  152. {ASLD, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
  153. {ASLD, C_SCON, C_REG, C_NONE, C_REG, 25, 4, 0},
  154. {ASLD, C_SCON, C_NONE, C_NONE, C_REG, 25, 4, 0},
  155. {ASLW, C_SCON, C_REG, C_NONE, C_REG, 57, 4, 0},
  156. {ASLW, C_SCON, C_NONE, C_NONE, C_REG, 57, 4, 0},
  157. {ASRAW, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
  158. {ASRAW, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
  159. {ASRAW, C_SCON, C_REG, C_NONE, C_REG, 56, 4, 0},
  160. {ASRAW, C_SCON, C_NONE, C_NONE, C_REG, 56, 4, 0},
  161. {ASRAD, C_REG, C_NONE, C_NONE, C_REG, 6, 4, 0},
  162. {ASRAD, C_REG, C_REG, C_NONE, C_REG, 6, 4, 0},
  163. {ASRAD, C_SCON, C_REG, C_NONE, C_REG, 56, 4, 0},
  164. {ASRAD, C_SCON, C_NONE, C_NONE, C_REG, 56, 4, 0},
  165. {ARLWMI, C_SCON, C_REG, C_LCON, C_REG, 62, 4, 0},
  166. {ARLWMI, C_REG, C_REG, C_LCON, C_REG, 63, 4, 0},
  167. {ARLDMI, C_SCON, C_REG, C_LCON, C_REG, 30, 4, 0},
  168. {ARLDC, C_SCON, C_REG, C_LCON, C_REG, 29, 4, 0},
  169. {ARLDCL, C_SCON, C_REG, C_LCON, C_REG, 29, 4, 0},
  170. {ARLDCL, C_REG, C_REG, C_LCON, C_REG, 14, 4, 0},
  171. {ARLDICL, C_REG, C_REG, C_LCON, C_REG, 14, 4, 0},
  172. {ARLDICL, C_SCON, C_REG, C_LCON, C_REG, 14, 4, 0},
  173. {ARLDCL, C_REG, C_NONE, C_LCON, C_REG, 14, 4, 0},
  174. {AFADD, C_FREG, C_NONE, C_NONE, C_FREG, 2, 4, 0},
  175. {AFADD, C_FREG, C_FREG, C_NONE, C_FREG, 2, 4, 0},
  176. {AFABS, C_FREG, C_NONE, C_NONE, C_FREG, 33, 4, 0},
  177. {AFABS, C_NONE, C_NONE, C_NONE, C_FREG, 33, 4, 0},
  178. {AFMOVD, C_FREG, C_NONE, C_NONE, C_FREG, 33, 4, 0},
  179. {AFMADD, C_FREG, C_FREG, C_FREG, C_FREG, 34, 4, 0},
  180. {AFMUL, C_FREG, C_NONE, C_NONE, C_FREG, 32, 4, 0},
  181. {AFMUL, C_FREG, C_FREG, C_NONE, C_FREG, 32, 4, 0},
  182. /* store, short offset */
  183. {AMOVD, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
  184. {AMOVW, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
  185. {AMOVWZ, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
  186. {AMOVBZ, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
  187. {AMOVBZU, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
  188. {AMOVB, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
  189. {AMOVBU, C_REG, C_REG, C_NONE, C_ZOREG, 7, 4, REGZERO},
  190. {AMOVD, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
  191. {AMOVW, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
  192. {AMOVWZ, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
  193. {AMOVBZ, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
  194. {AMOVB, C_REG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
  195. {AMOVD, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
  196. {AMOVW, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
  197. {AMOVWZ, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
  198. {AMOVBZ, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
  199. {AMOVB, C_REG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
  200. {AMOVD, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
  201. {AMOVW, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
  202. {AMOVWZ, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
  203. {AMOVBZ, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
  204. {AMOVBZU, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
  205. {AMOVB, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
  206. {AMOVBU, C_REG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
  207. /* load, short offset */
  208. {AMOVD, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
  209. {AMOVW, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
  210. {AMOVWZ, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
  211. {AMOVBZ, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
  212. {AMOVBZU, C_ZOREG, C_REG, C_NONE, C_REG, 8, 4, REGZERO},
  213. {AMOVB, C_ZOREG, C_REG, C_NONE, C_REG, 9, 8, REGZERO},
  214. {AMOVBU, C_ZOREG, C_REG, C_NONE, C_REG, 9, 8, REGZERO},
  215. {AMOVD, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
  216. {AMOVW, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
  217. {AMOVWZ, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
  218. {AMOVBZ, C_SEXT, C_NONE, C_NONE, C_REG, 8, 4, REGSB},
  219. {AMOVB, C_SEXT, C_NONE, C_NONE, C_REG, 9, 8, REGSB},
  220. {AMOVD, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
  221. {AMOVW, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
  222. {AMOVWZ, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
  223. {AMOVBZ, C_SAUTO, C_NONE, C_NONE, C_REG, 8, 4, REGSP},
  224. {AMOVB, C_SAUTO, C_NONE, C_NONE, C_REG, 9, 8, REGSP},
  225. {AMOVD, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
  226. {AMOVW, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
  227. {AMOVWZ, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
  228. {AMOVBZ, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
  229. {AMOVBZU, C_SOREG, C_NONE, C_NONE, C_REG, 8, 4, REGZERO},
  230. {AMOVB, C_SOREG, C_NONE, C_NONE, C_REG, 9, 8, REGZERO},
  231. {AMOVBU, C_SOREG, C_NONE, C_NONE, C_REG, 9, 8, REGZERO},
  232. /* store, long offset */
  233. {AMOVD, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
  234. {AMOVW, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
  235. {AMOVWZ, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
  236. {AMOVBZ, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
  237. {AMOVB, C_REG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
  238. {AMOVD, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
  239. {AMOVW, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
  240. {AMOVWZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
  241. {AMOVBZ, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
  242. {AMOVB, C_REG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
  243. {AMOVD, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
  244. {AMOVW, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
  245. {AMOVWZ, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
  246. {AMOVBZ, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
  247. {AMOVB, C_REG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
  248. {AMOVD, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
  249. {AMOVW, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
  250. {AMOVWZ, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
  251. {AMOVBZ, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
  252. {AMOVB, C_REG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
  253. /* load, long offset */
  254. {AMOVD, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
  255. {AMOVW, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
  256. {AMOVWZ, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
  257. {AMOVBZ, C_LEXT, C_NONE, C_NONE, C_REG, 36, 8, REGSB},
  258. {AMOVB, C_LEXT, C_NONE, C_NONE, C_REG, 37, 12, REGSB},
  259. {AMOVD, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
  260. {AMOVW, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
  261. {AMOVWZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
  262. {AMOVBZ, C_LAUTO, C_NONE, C_NONE, C_REG, 36, 8, REGSP},
  263. {AMOVB, C_LAUTO, C_NONE, C_NONE, C_REG, 37, 12, REGSP},
  264. {AMOVD, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
  265. {AMOVW, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
  266. {AMOVWZ, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
  267. {AMOVBZ, C_LOREG, C_NONE, C_NONE, C_REG, 36, 8, REGZERO},
  268. {AMOVB, C_LOREG, C_NONE, C_NONE, C_REG, 37, 12, REGZERO},
  269. {AMOVD, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
  270. {AMOVW, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
  271. {AMOVWZ, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
  272. {AMOVBZ, C_ADDR, C_NONE, C_NONE, C_REG, 75, 8, 0},
  273. {AMOVB, C_ADDR, C_NONE, C_NONE, C_REG, 76, 12, 0},
  274. {AMOVD, C_TLS_LE, C_NONE, C_NONE, C_REG, 79, 4, 0},
  275. {AMOVD, C_TLS_IE, C_NONE, C_NONE, C_REG, 80, 8, 0},
  276. {AMOVD, C_GOTADDR, C_NONE, C_NONE, C_REG, 81, 8, 0},
  277. {AMOVD, C_TOCADDR, C_NONE, C_NONE, C_REG, 95, 8, 0},
  278. /* load constant */
  279. {AMOVD, C_SECON, C_NONE, C_NONE, C_REG, 3, 4, REGSB},
  280. {AMOVD, C_SACON, C_NONE, C_NONE, C_REG, 3, 4, REGSP},
  281. {AMOVD, C_LECON, C_NONE, C_NONE, C_REG, 26, 8, REGSB},
  282. {AMOVD, C_LACON, C_NONE, C_NONE, C_REG, 26, 8, REGSP},
  283. {AMOVD, C_ADDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
  284. {AMOVD, C_ANDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
  285. {AMOVW, C_SECON, C_NONE, C_NONE, C_REG, 3, 4, REGSB}, /* TO DO: check */
  286. {AMOVW, C_SACON, C_NONE, C_NONE, C_REG, 3, 4, REGSP},
  287. {AMOVW, C_LECON, C_NONE, C_NONE, C_REG, 26, 8, REGSB},
  288. {AMOVW, C_LACON, C_NONE, C_NONE, C_REG, 26, 8, REGSP},
  289. {AMOVW, C_ADDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
  290. {AMOVW, C_ANDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
  291. {AMOVWZ, C_SECON, C_NONE, C_NONE, C_REG, 3, 4, REGSB}, /* TO DO: check */
  292. {AMOVWZ, C_SACON, C_NONE, C_NONE, C_REG, 3, 4, REGSP},
  293. {AMOVWZ, C_LECON, C_NONE, C_NONE, C_REG, 26, 8, REGSB},
  294. {AMOVWZ, C_LACON, C_NONE, C_NONE, C_REG, 26, 8, REGSP},
  295. {AMOVWZ, C_ADDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
  296. {AMOVWZ, C_ANDCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
  297. /* load unsigned/long constants (TO DO: check) */
  298. {AMOVD, C_UCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
  299. {AMOVD, C_LCON, C_NONE, C_NONE, C_REG, 19, 8, 0},
  300. {AMOVW, C_UCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
  301. {AMOVW, C_LCON, C_NONE, C_NONE, C_REG, 19, 8, 0},
  302. {AMOVWZ, C_UCON, C_NONE, C_NONE, C_REG, 3, 4, REGZERO},
  303. {AMOVWZ, C_LCON, C_NONE, C_NONE, C_REG, 19, 8, 0},
  304. {AMOVHBR, C_ZOREG, C_REG, C_NONE, C_REG, 45, 4, 0},
  305. {AMOVHBR, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
  306. {AMOVHBR, C_REG, C_REG, C_NONE, C_ZOREG, 44, 4, 0},
  307. {AMOVHBR, C_REG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
  308. {ASYSCALL, C_NONE, C_NONE, C_NONE, C_NONE, 5, 4, 0},
  309. {ASYSCALL, C_REG, C_NONE, C_NONE, C_NONE, 77, 12, 0},
  310. {ASYSCALL, C_SCON, C_NONE, C_NONE, C_NONE, 77, 12, 0},
  311. {ABEQ, C_NONE, C_NONE, C_NONE, C_SBRA, 16, 4, 0},
  312. {ABEQ, C_CREG, C_NONE, C_NONE, C_SBRA, 16, 4, 0},
  313. {ABR, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0},
  314. {ABR, C_NONE, C_NONE, C_NONE, C_LBRAPIC, 11, 8, 0},
  315. {ABC, C_SCON, C_REG, C_NONE, C_SBRA, 16, 4, 0},
  316. {ABC, C_SCON, C_REG, C_NONE, C_LBRA, 17, 4, 0},
  317. {ABR, C_NONE, C_NONE, C_NONE, C_LR, 18, 4, 0},
  318. {ABR, C_NONE, C_NONE, C_NONE, C_CTR, 18, 4, 0},
  319. {ABR, C_REG, C_NONE, C_NONE, C_CTR, 18, 4, 0},
  320. {ABR, C_NONE, C_NONE, C_NONE, C_ZOREG, 15, 8, 0},
  321. {ABC, C_NONE, C_REG, C_NONE, C_LR, 18, 4, 0},
  322. {ABC, C_NONE, C_REG, C_NONE, C_CTR, 18, 4, 0},
  323. {ABC, C_SCON, C_REG, C_NONE, C_LR, 18, 4, 0},
  324. {ABC, C_SCON, C_REG, C_NONE, C_CTR, 18, 4, 0},
  325. {ABC, C_NONE, C_NONE, C_NONE, C_ZOREG, 15, 8, 0},
  326. {AFMOVD, C_SEXT, C_NONE, C_NONE, C_FREG, 8, 4, REGSB},
  327. {AFMOVD, C_SAUTO, C_NONE, C_NONE, C_FREG, 8, 4, REGSP},
  328. {AFMOVD, C_SOREG, C_NONE, C_NONE, C_FREG, 8, 4, REGZERO},
  329. {AFMOVD, C_LEXT, C_NONE, C_NONE, C_FREG, 36, 8, REGSB},
  330. {AFMOVD, C_LAUTO, C_NONE, C_NONE, C_FREG, 36, 8, REGSP},
  331. {AFMOVD, C_LOREG, C_NONE, C_NONE, C_FREG, 36, 8, REGZERO},
  332. {AFMOVD, C_ZCON, C_NONE, C_NONE, C_FREG, 24, 4, 0},
  333. {AFMOVD, C_ADDCON, C_NONE, C_NONE, C_FREG, 24, 8, 0},
  334. {AFMOVD, C_ADDR, C_NONE, C_NONE, C_FREG, 75, 8, 0},
  335. {AFMOVD, C_FREG, C_NONE, C_NONE, C_SEXT, 7, 4, REGSB},
  336. {AFMOVD, C_FREG, C_NONE, C_NONE, C_SAUTO, 7, 4, REGSP},
  337. {AFMOVD, C_FREG, C_NONE, C_NONE, C_SOREG, 7, 4, REGZERO},
  338. {AFMOVD, C_FREG, C_NONE, C_NONE, C_LEXT, 35, 8, REGSB},
  339. {AFMOVD, C_FREG, C_NONE, C_NONE, C_LAUTO, 35, 8, REGSP},
  340. {AFMOVD, C_FREG, C_NONE, C_NONE, C_LOREG, 35, 8, REGZERO},
  341. {AFMOVD, C_FREG, C_NONE, C_NONE, C_ADDR, 74, 8, 0},
  342. {AFMOVSX, C_ZOREG, C_REG, C_NONE, C_FREG, 45, 4, 0},
  343. {AFMOVSX, C_ZOREG, C_NONE, C_NONE, C_FREG, 45, 4, 0},
  344. {AFMOVSX, C_FREG, C_REG, C_NONE, C_ZOREG, 44, 4, 0},
  345. {AFMOVSX, C_FREG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
  346. {AFMOVSZ, C_ZOREG, C_REG, C_NONE, C_FREG, 45, 4, 0},
  347. {AFMOVSZ, C_ZOREG, C_NONE, C_NONE, C_FREG, 45, 4, 0},
  348. {ASYNC, C_NONE, C_NONE, C_NONE, C_NONE, 46, 4, 0},
  349. {AWORD, C_LCON, C_NONE, C_NONE, C_NONE, 40, 4, 0},
  350. {ADWORD, C_LCON, C_NONE, C_NONE, C_NONE, 31, 8, 0},
  351. {ADWORD, C_DCON, C_NONE, C_NONE, C_NONE, 31, 8, 0},
  352. {AADDME, C_REG, C_NONE, C_NONE, C_REG, 47, 4, 0},
  353. {AEXTSB, C_REG, C_NONE, C_NONE, C_REG, 48, 4, 0},
  354. {AEXTSB, C_NONE, C_NONE, C_NONE, C_REG, 48, 4, 0},
  355. {AISEL, C_LCON, C_REG, C_REG, C_REG, 84, 4, 0},
  356. {AISEL, C_ZCON, C_REG, C_REG, C_REG, 84, 4, 0},
  357. {ANEG, C_REG, C_NONE, C_NONE, C_REG, 47, 4, 0},
  358. {ANEG, C_NONE, C_NONE, C_NONE, C_REG, 47, 4, 0},
  359. {AREM, C_REG, C_NONE, C_NONE, C_REG, 50, 12, 0},
  360. {AREM, C_REG, C_REG, C_NONE, C_REG, 50, 12, 0},
  361. {AREMU, C_REG, C_NONE, C_NONE, C_REG, 50, 16, 0},
  362. {AREMU, C_REG, C_REG, C_NONE, C_REG, 50, 16, 0},
  363. {AREMD, C_REG, C_NONE, C_NONE, C_REG, 51, 12, 0},
  364. {AREMD, C_REG, C_REG, C_NONE, C_REG, 51, 12, 0},
  365. {AMTFSB0, C_SCON, C_NONE, C_NONE, C_NONE, 52, 4, 0},
  366. {AMOVFL, C_FPSCR, C_NONE, C_NONE, C_FREG, 53, 4, 0},
  367. {AMOVFL, C_FREG, C_NONE, C_NONE, C_FPSCR, 64, 4, 0},
  368. {AMOVFL, C_FREG, C_NONE, C_LCON, C_FPSCR, 64, 4, 0},
  369. {AMOVFL, C_LCON, C_NONE, C_NONE, C_FPSCR, 65, 4, 0},
  370. {AMOVD, C_MSR, C_NONE, C_NONE, C_REG, 54, 4, 0}, /* mfmsr */
  371. {AMOVD, C_REG, C_NONE, C_NONE, C_MSR, 54, 4, 0}, /* mtmsrd */
  372. {AMOVWZ, C_REG, C_NONE, C_NONE, C_MSR, 54, 4, 0}, /* mtmsr */
  373. /* Other ISA 2.05+ instructions */
  374. {APOPCNTD, C_REG, C_NONE, C_NONE, C_REG, 93, 4, 0}, /* population count, x-form */
  375. {ACMPB, C_REG, C_REG, C_NONE, C_REG, 92, 4, 0}, /* compare byte, x-form */
  376. {ACMPEQB, C_REG, C_REG, C_NONE, C_CREG, 92, 4, 0}, /* compare equal byte, x-form, ISA 3.0 */
  377. {ACMPEQB, C_REG, C_NONE, C_NONE, C_REG, 70, 4, 0},
  378. {AFTDIV, C_FREG, C_FREG, C_NONE, C_SCON, 92, 4, 0}, /* floating test for sw divide, x-form */
  379. {AFTSQRT, C_FREG, C_NONE, C_NONE, C_SCON, 93, 4, 0}, /* floating test for sw square root, x-form */
  380. {ACOPY, C_REG, C_NONE, C_NONE, C_REG, 92, 4, 0}, /* copy/paste facility, x-form */
  381. {ADARN, C_SCON, C_NONE, C_NONE, C_REG, 92, 4, 0}, /* deliver random number, x-form */
  382. {ALDMX, C_SOREG, C_NONE, C_NONE, C_REG, 45, 4, 0}, /* load doubleword monitored, x-form */
  383. {AMADDHD, C_REG, C_REG, C_REG, C_REG, 83, 4, 0}, /* multiply-add high/low doubleword, va-form */
  384. {AADDEX, C_REG, C_REG, C_SCON, C_REG, 94, 4, 0}, /* add extended using alternate carry, z23-form */
  385. {ACRAND, C_CREG, C_NONE, C_NONE, C_CREG, 2, 4, 0}, /* logical ops for condition registers xl-form */
  386. /* Vector instructions */
  387. /* Vector load */
  388. {ALV, C_SOREG, C_NONE, C_NONE, C_VREG, 45, 4, 0}, /* vector load, x-form */
  389. /* Vector store */
  390. {ASTV, C_VREG, C_NONE, C_NONE, C_SOREG, 44, 4, 0}, /* vector store, x-form */
  391. /* Vector logical */
  392. {AVAND, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector and, vx-form */
  393. {AVOR, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector or, vx-form */
  394. /* Vector add */
  395. {AVADDUM, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector add unsigned modulo, vx-form */
  396. {AVADDCU, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector add & write carry unsigned, vx-form */
  397. {AVADDUS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector add unsigned saturate, vx-form */
  398. {AVADDSS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector add signed saturate, vx-form */
  399. {AVADDE, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector add extended, va-form */
  400. /* Vector subtract */
  401. {AVSUBUM, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector subtract unsigned modulo, vx-form */
  402. {AVSUBCU, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector subtract & write carry unsigned, vx-form */
  403. {AVSUBUS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector subtract unsigned saturate, vx-form */
  404. {AVSUBSS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector subtract signed saturate, vx-form */
  405. {AVSUBE, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector subtract extended, va-form */
  406. /* Vector multiply */
  407. {AVMULESB, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 9}, /* vector multiply, vx-form */
  408. {AVPMSUM, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector polynomial multiply & sum, vx-form */
  409. {AVMSUMUDM, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector multiply-sum, va-form */
  410. /* Vector rotate */
  411. {AVR, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector rotate, vx-form */
  412. /* Vector shift */
  413. {AVS, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector shift, vx-form */
  414. {AVSA, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector shift algebraic, vx-form */
  415. {AVSOI, C_ANDCON, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector shift by octet immediate, va-form */
  416. /* Vector count */
  417. {AVCLZ, C_VREG, C_NONE, C_NONE, C_VREG, 85, 4, 0}, /* vector count leading zeros, vx-form */
  418. {AVPOPCNT, C_VREG, C_NONE, C_NONE, C_VREG, 85, 4, 0}, /* vector population count, vx-form */
  419. /* Vector compare */
  420. {AVCMPEQ, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector compare equal, vc-form */
  421. {AVCMPGT, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector compare greater than, vc-form */
  422. {AVCMPNEZB, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector compare not equal, vx-form */
  423. /* Vector merge */
  424. {AVMRGOW, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector merge odd word, vx-form */
  425. /* Vector permute */
  426. {AVPERM, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector permute, va-form */
  427. /* Vector bit permute */
  428. {AVBPERMQ, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector bit permute, vx-form */
  429. /* Vector select */
  430. {AVSEL, C_VREG, C_VREG, C_VREG, C_VREG, 83, 4, 0}, /* vector select, va-form */
  431. /* Vector splat */
  432. {AVSPLTB, C_SCON, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector splat, vx-form */
  433. {AVSPLTB, C_ADDCON, C_VREG, C_NONE, C_VREG, 82, 4, 0},
  434. {AVSPLTISB, C_SCON, C_NONE, C_NONE, C_VREG, 82, 4, 0}, /* vector splat immediate, vx-form */
  435. {AVSPLTISB, C_ADDCON, C_NONE, C_NONE, C_VREG, 82, 4, 0},
  436. /* Vector AES */
  437. {AVCIPH, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector AES cipher, vx-form */
  438. {AVNCIPH, C_VREG, C_VREG, C_NONE, C_VREG, 82, 4, 0}, /* vector AES inverse cipher, vx-form */
  439. {AVSBOX, C_VREG, C_NONE, C_NONE, C_VREG, 82, 4, 0}, /* vector AES subbytes, vx-form */
  440. /* Vector SHA */
  441. {AVSHASIGMA, C_ANDCON, C_VREG, C_ANDCON, C_VREG, 82, 4, 0}, /* vector SHA sigma, vx-form */
  442. /* VSX vector load */
  443. {ALXVD2X, C_SOREG, C_NONE, C_NONE, C_VSREG, 87, 4, 0}, /* vsx vector load, xx1-form */
  444. {ALXV, C_SOREG, C_NONE, C_NONE, C_VSREG, 96, 4, 0}, /* vsx vector load, dq-form */
  445. {ALXVL, C_REG, C_REG, C_NONE, C_VSREG, 98, 4, 0}, /* vsx vector load length */
  446. /* VSX vector store */
  447. {ASTXVD2X, C_VSREG, C_NONE, C_NONE, C_SOREG, 86, 4, 0}, /* vsx vector store, xx1-form */
  448. {ASTXV, C_VSREG, C_NONE, C_NONE, C_SOREG, 97, 4, 0}, /* vsx vector store, dq-form */
  449. {ASTXVL, C_VSREG, C_REG, C_NONE, C_REG, 99, 4, 0}, /* vsx vector store with length x-form */
  450. /* VSX scalar load */
  451. {ALXSDX, C_SOREG, C_NONE, C_NONE, C_VSREG, 87, 4, 0}, /* vsx scalar load, xx1-form */
  452. /* VSX scalar store */
  453. {ASTXSDX, C_VSREG, C_NONE, C_NONE, C_SOREG, 86, 4, 0}, /* vsx scalar store, xx1-form */
  454. /* VSX scalar as integer load */
  455. {ALXSIWAX, C_SOREG, C_NONE, C_NONE, C_VSREG, 87, 4, 0}, /* vsx scalar as integer load, xx1-form */
  456. /* VSX scalar store as integer */
  457. {ASTXSIWX, C_VSREG, C_NONE, C_NONE, C_SOREG, 86, 4, 0}, /* vsx scalar as integer store, xx1-form */
  458. /* VSX move from VSR */
  459. {AMFVSRD, C_VSREG, C_NONE, C_NONE, C_REG, 88, 4, 0}, /* vsx move from vsr, xx1-form */
  460. {AMFVSRD, C_FREG, C_NONE, C_NONE, C_REG, 88, 4, 0},
  461. {AMFVSRD, C_VREG, C_NONE, C_NONE, C_REG, 88, 4, 0},
  462. /* VSX move to VSR */
  463. {AMTVSRD, C_REG, C_NONE, C_NONE, C_VSREG, 88, 4, 0}, /* vsx move to vsr, xx1-form */
  464. {AMTVSRD, C_REG, C_REG, C_NONE, C_VSREG, 88, 4, 0},
  465. {AMTVSRD, C_REG, C_NONE, C_NONE, C_FREG, 88, 4, 0},
  466. {AMTVSRD, C_REG, C_NONE, C_NONE, C_VREG, 88, 4, 0},
  467. /* VSX logical */
  468. {AXXLAND, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0}, /* vsx and, xx3-form */
  469. {AXXLOR, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0}, /* vsx or, xx3-form */
  470. /* VSX select */
  471. {AXXSEL, C_VSREG, C_VSREG, C_VSREG, C_VSREG, 91, 4, 0}, /* vsx select, xx4-form */
  472. /* VSX merge */
  473. {AXXMRGHW, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0}, /* vsx merge, xx3-form */
  474. /* VSX splat */
  475. {AXXSPLTW, C_VSREG, C_NONE, C_SCON, C_VSREG, 89, 4, 0}, /* vsx splat, xx2-form */
  476. {AXXSPLTIB, C_SCON, C_NONE, C_NONE, C_VSREG, 100, 4, 0}, /* vsx splat, xx2-form */
  477. /* VSX permute */
  478. {AXXPERM, C_VSREG, C_VSREG, C_NONE, C_VSREG, 90, 4, 0}, /* vsx permute, xx3-form */
  479. /* VSX shift */
  480. {AXXSLDWI, C_VSREG, C_VSREG, C_SCON, C_VSREG, 90, 4, 0}, /* vsx shift immediate, xx3-form */
  481. /* VSX reverse bytes */
  482. {AXXBRQ, C_VSREG, C_NONE, C_NONE, C_VSREG, 101, 4, 0}, /* vsx reverse bytes */
  483. /* VSX scalar FP-FP conversion */
  484. {AXSCVDPSP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx scalar fp-fp conversion, xx2-form */
  485. /* VSX vector FP-FP conversion */
  486. {AXVCVDPSP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx vector fp-fp conversion, xx2-form */
  487. /* VSX scalar FP-integer conversion */
  488. {AXSCVDPSXDS, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx scalar fp-integer conversion, xx2-form */
  489. /* VSX scalar integer-FP conversion */
  490. {AXSCVSXDDP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx scalar integer-fp conversion, xx2-form */
  491. /* VSX vector FP-integer conversion */
  492. {AXVCVDPSXDS, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx vector fp-integer conversion, xx2-form */
  493. /* VSX vector integer-FP conversion */
  494. {AXVCVSXDDP, C_VSREG, C_NONE, C_NONE, C_VSREG, 89, 4, 0}, /* vsx vector integer-fp conversion, xx2-form */
  495. /* 64-bit special registers */
  496. {AMOVD, C_REG, C_NONE, C_NONE, C_SPR, 66, 4, 0},
  497. {AMOVD, C_REG, C_NONE, C_NONE, C_LR, 66, 4, 0},
  498. {AMOVD, C_REG, C_NONE, C_NONE, C_CTR, 66, 4, 0},
  499. {AMOVD, C_REG, C_NONE, C_NONE, C_XER, 66, 4, 0},
  500. {AMOVD, C_SPR, C_NONE, C_NONE, C_REG, 66, 4, 0},
  501. {AMOVD, C_LR, C_NONE, C_NONE, C_REG, 66, 4, 0},
  502. {AMOVD, C_CTR, C_NONE, C_NONE, C_REG, 66, 4, 0},
  503. {AMOVD, C_XER, C_NONE, C_NONE, C_REG, 66, 4, 0},
  504. /* 32-bit special registers (gloss over sign-extension or not?) */
  505. {AMOVW, C_REG, C_NONE, C_NONE, C_SPR, 66, 4, 0},
  506. {AMOVW, C_REG, C_NONE, C_NONE, C_CTR, 66, 4, 0},
  507. {AMOVW, C_REG, C_NONE, C_NONE, C_XER, 66, 4, 0},
  508. {AMOVW, C_SPR, C_NONE, C_NONE, C_REG, 66, 4, 0},
  509. {AMOVW, C_XER, C_NONE, C_NONE, C_REG, 66, 4, 0},
  510. {AMOVWZ, C_REG, C_NONE, C_NONE, C_SPR, 66, 4, 0},
  511. {AMOVWZ, C_REG, C_NONE, C_NONE, C_CTR, 66, 4, 0},
  512. {AMOVWZ, C_REG, C_NONE, C_NONE, C_XER, 66, 4, 0},
  513. {AMOVWZ, C_SPR, C_NONE, C_NONE, C_REG, 66, 4, 0},
  514. {AMOVWZ, C_XER, C_NONE, C_NONE, C_REG, 66, 4, 0},
  515. {AMOVFL, C_FPSCR, C_NONE, C_NONE, C_CREG, 73, 4, 0},
  516. {AMOVFL, C_CREG, C_NONE, C_NONE, C_CREG, 67, 4, 0},
  517. {AMOVW, C_CREG, C_NONE, C_NONE, C_REG, 68, 4, 0},
  518. {AMOVWZ, C_CREG, C_NONE, C_NONE, C_REG, 68, 4, 0},
  519. {AMOVFL, C_REG, C_NONE, C_NONE, C_LCON, 69, 4, 0},
  520. {AMOVFL, C_REG, C_NONE, C_NONE, C_CREG, 69, 4, 0},
  521. {AMOVW, C_REG, C_NONE, C_NONE, C_CREG, 69, 4, 0},
  522. {AMOVWZ, C_REG, C_NONE, C_NONE, C_CREG, 69, 4, 0},
  523. {ACMP, C_REG, C_NONE, C_NONE, C_REG, 70, 4, 0},
  524. {ACMP, C_REG, C_REG, C_NONE, C_REG, 70, 4, 0},
  525. {ACMP, C_REG, C_NONE, C_NONE, C_ADDCON, 71, 4, 0},
  526. {ACMP, C_REG, C_REG, C_NONE, C_ADDCON, 71, 4, 0},
  527. {ACMPU, C_REG, C_NONE, C_NONE, C_REG, 70, 4, 0},
  528. {ACMPU, C_REG, C_REG, C_NONE, C_REG, 70, 4, 0},
  529. {ACMPU, C_REG, C_NONE, C_NONE, C_ANDCON, 71, 4, 0},
  530. {ACMPU, C_REG, C_REG, C_NONE, C_ANDCON, 71, 4, 0},
  531. {AFCMPO, C_FREG, C_NONE, C_NONE, C_FREG, 70, 4, 0},
  532. {AFCMPO, C_FREG, C_REG, C_NONE, C_FREG, 70, 4, 0},
  533. {ATW, C_LCON, C_REG, C_NONE, C_REG, 60, 4, 0},
  534. {ATW, C_LCON, C_REG, C_NONE, C_ADDCON, 61, 4, 0},
  535. {ADCBF, C_ZOREG, C_NONE, C_NONE, C_NONE, 43, 4, 0},
  536. {ADCBF, C_SOREG, C_NONE, C_NONE, C_NONE, 43, 4, 0},
  537. {ADCBF, C_ZOREG, C_REG, C_NONE, C_SCON, 43, 4, 0},
  538. {ADCBF, C_SOREG, C_NONE, C_NONE, C_SCON, 43, 4, 0},
  539. {AECOWX, C_REG, C_REG, C_NONE, C_ZOREG, 44, 4, 0},
  540. {AECIWX, C_ZOREG, C_REG, C_NONE, C_REG, 45, 4, 0},
  541. {AECOWX, C_REG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
  542. {AECIWX, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
  543. {ALDAR, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
  544. {ALDAR, C_ZOREG, C_NONE, C_ANDCON, C_REG, 45, 4, 0},
  545. {AEIEIO, C_NONE, C_NONE, C_NONE, C_NONE, 46, 4, 0},
  546. {ATLBIE, C_REG, C_NONE, C_NONE, C_NONE, 49, 4, 0},
  547. {ATLBIE, C_SCON, C_NONE, C_NONE, C_REG, 49, 4, 0},
  548. {ASLBMFEE, C_REG, C_NONE, C_NONE, C_REG, 55, 4, 0},
  549. {ASLBMTE, C_REG, C_NONE, C_NONE, C_REG, 55, 4, 0},
  550. {ASTSW, C_REG, C_NONE, C_NONE, C_ZOREG, 44, 4, 0},
  551. {ASTSW, C_REG, C_NONE, C_LCON, C_ZOREG, 41, 4, 0},
  552. {ALSW, C_ZOREG, C_NONE, C_NONE, C_REG, 45, 4, 0},
  553. {ALSW, C_ZOREG, C_NONE, C_LCON, C_REG, 42, 4, 0},
  554. {obj.AUNDEF, C_NONE, C_NONE, C_NONE, C_NONE, 78, 4, 0},
  555. {obj.APCDATA, C_LCON, C_NONE, C_NONE, C_LCON, 0, 0, 0},
  556. {obj.AFUNCDATA, C_SCON, C_NONE, C_NONE, C_ADDR, 0, 0, 0},
  557. {obj.ANOP, C_NONE, C_NONE, C_NONE, C_NONE, 0, 0, 0},
  558. {obj.ANOP, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // NOP operand variations added for #40689
  559. {obj.ANOP, C_REG, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // to preserve previous behavior
  560. {obj.ANOP, C_FREG, C_NONE, C_NONE, C_NONE, 0, 0, 0},
  561. {obj.ADUFFZERO, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL
  562. {obj.ADUFFCOPY, C_NONE, C_NONE, C_NONE, C_LBRA, 11, 4, 0}, // same as ABR/ABL
  563. {obj.APCALIGN, C_LCON, C_NONE, C_NONE, C_NONE, 0, 0, 0}, // align code
  564. {obj.AXXX, C_NONE, C_NONE, C_NONE, C_NONE, 0, 4, 0},
  565. }
  566. var oprange [ALAST & obj.AMask][]Optab
  567. var xcmp [C_NCLASS][C_NCLASS]bool
  568. // padding bytes to add to align code as requested
  569. func addpad(pc, a int64, ctxt *obj.Link, cursym *obj.LSym) int {
  570. // For 16 and 32 byte alignment, there is a tradeoff
  571. // between aligning the code and adding too many NOPs.
  572. switch a {
  573. case 8:
  574. if pc&7 != 0 {
  575. return 4
  576. }
  577. case 16:
  578. // Align to 16 bytes if possible but add at
  579. // most 2 NOPs.
  580. switch pc & 15 {
  581. case 4, 12:
  582. return 4
  583. case 8:
  584. return 8
  585. }
  586. case 32:
  587. // Align to 32 bytes if possible but add at
  588. // most 3 NOPs.
  589. switch pc & 31 {
  590. case 4, 20:
  591. return 12
  592. case 8, 24:
  593. return 8
  594. case 12, 28:
  595. return 4
  596. }
  597. // When 32 byte alignment is requested on Linux,
  598. // promote the function's alignment to 32. On AIX
  599. // the function alignment is not changed which might
  600. // result in 16 byte alignment but that is still fine.
  601. // TODO: alignment on AIX
  602. if ctxt.Headtype != objabi.Haix && cursym.Func.Align < 32 {
  603. cursym.Func.Align = 32
  604. }
  605. default:
  606. ctxt.Diag("Unexpected alignment: %d for PCALIGN directive\n", a)
  607. }
  608. return 0
  609. }
  610. func span9(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
  611. p := cursym.Func.Text
  612. if p == nil || p.Link == nil { // handle external functions and ELF section symbols
  613. return
  614. }
  615. if oprange[AANDN&obj.AMask] == nil {
  616. ctxt.Diag("ppc64 ops not initialized, call ppc64.buildop first")
  617. }
  618. c := ctxt9{ctxt: ctxt, newprog: newprog, cursym: cursym, autosize: int32(p.To.Offset)}
  619. pc := int64(0)
  620. p.Pc = pc
  621. var m int
  622. var o *Optab
  623. for p = p.Link; p != nil; p = p.Link {
  624. p.Pc = pc
  625. o = c.oplook(p)
  626. m = int(o.size)
  627. if m == 0 {
  628. if p.As == obj.APCALIGN {
  629. a := c.vregoff(&p.From)
  630. m = addpad(pc, a, ctxt, cursym)
  631. } else {
  632. if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA {
  633. ctxt.Diag("zero-width instruction\n%v", p)
  634. }
  635. continue
  636. }
  637. }
  638. pc += int64(m)
  639. }
  640. c.cursym.Size = pc
  641. /*
  642. * if any procedure is large enough to
  643. * generate a large SBRA branch, then
  644. * generate extra passes putting branches
  645. * around jmps to fix. this is rare.
  646. */
  647. bflag := 1
  648. var otxt int64
  649. var q *obj.Prog
  650. for bflag != 0 {
  651. bflag = 0
  652. pc = 0
  653. for p = c.cursym.Func.Text.Link; p != nil; p = p.Link {
  654. p.Pc = pc
  655. o = c.oplook(p)
  656. // very large conditional branches
  657. if (o.type_ == 16 || o.type_ == 17) && p.To.Target() != nil {
  658. otxt = p.To.Target().Pc - pc
  659. if otxt < -(1<<15)+10 || otxt >= (1<<15)-10 {
  660. q = c.newprog()
  661. q.Link = p.Link
  662. p.Link = q
  663. q.As = ABR
  664. q.To.Type = obj.TYPE_BRANCH
  665. q.To.SetTarget(p.To.Target())
  666. p.To.SetTarget(q)
  667. q = c.newprog()
  668. q.Link = p.Link
  669. p.Link = q
  670. q.As = ABR
  671. q.To.Type = obj.TYPE_BRANCH
  672. q.To.SetTarget(q.Link.Link)
  673. //addnop(p->link);
  674. //addnop(p);
  675. bflag = 1
  676. }
  677. }
  678. m = int(o.size)
  679. if m == 0 {
  680. if p.As == obj.APCALIGN {
  681. a := c.vregoff(&p.From)
  682. m = addpad(pc, a, ctxt, cursym)
  683. } else {
  684. if p.As != obj.ANOP && p.As != obj.AFUNCDATA && p.As != obj.APCDATA {
  685. ctxt.Diag("zero-width instruction\n%v", p)
  686. }
  687. continue
  688. }
  689. }
  690. pc += int64(m)
  691. }
  692. c.cursym.Size = pc
  693. }
  694. if r := pc & funcAlignMask; r != 0 {
  695. pc += funcAlign - r
  696. }
  697. c.cursym.Size = pc
  698. /*
  699. * lay out the code, emitting code and data relocations.
  700. */
  701. c.cursym.Grow(c.cursym.Size)
  702. bp := c.cursym.P
  703. var i int32
  704. var out [6]uint32
  705. for p := c.cursym.Func.Text.Link; p != nil; p = p.Link {
  706. c.pc = p.Pc
  707. o = c.oplook(p)
  708. if int(o.size) > 4*len(out) {
  709. log.Fatalf("out array in span9 is too small, need at least %d for %v", o.size/4, p)
  710. }
  711. // asmout is not set up to add large amounts of padding
  712. if o.type_ == 0 && p.As == obj.APCALIGN {
  713. pad := LOP_RRR(OP_OR, REGZERO, REGZERO, REGZERO)
  714. aln := c.vregoff(&p.From)
  715. v := addpad(p.Pc, aln, c.ctxt, c.cursym)
  716. if v > 0 {
  717. // Same padding instruction for all
  718. for i = 0; i < int32(v/4); i++ {
  719. c.ctxt.Arch.ByteOrder.PutUint32(bp, pad)
  720. bp = bp[4:]
  721. }
  722. }
  723. } else {
  724. c.asmout(p, o, out[:])
  725. for i = 0; i < int32(o.size/4); i++ {
  726. c.ctxt.Arch.ByteOrder.PutUint32(bp, out[i])
  727. bp = bp[4:]
  728. }
  729. }
  730. }
  731. }
  732. func isint32(v int64) bool {
  733. return int64(int32(v)) == v
  734. }
  735. func isuint32(v uint64) bool {
  736. return uint64(uint32(v)) == v
  737. }
  738. func (c *ctxt9) aclass(a *obj.Addr) int {
  739. switch a.Type {
  740. case obj.TYPE_NONE:
  741. return C_NONE
  742. case obj.TYPE_REG:
  743. if REG_R0 <= a.Reg && a.Reg <= REG_R31 {
  744. return C_REG
  745. }
  746. if REG_F0 <= a.Reg && a.Reg <= REG_F31 {
  747. return C_FREG
  748. }
  749. if REG_V0 <= a.Reg && a.Reg <= REG_V31 {
  750. return C_VREG
  751. }
  752. if REG_VS0 <= a.Reg && a.Reg <= REG_VS63 {
  753. return C_VSREG
  754. }
  755. if REG_CR0 <= a.Reg && a.Reg <= REG_CR7 || a.Reg == REG_CR {
  756. return C_CREG
  757. }
  758. if REG_SPR0 <= a.Reg && a.Reg <= REG_SPR0+1023 {
  759. switch a.Reg {
  760. case REG_LR:
  761. return C_LR
  762. case REG_XER:
  763. return C_XER
  764. case REG_CTR:
  765. return C_CTR
  766. }
  767. return C_SPR
  768. }
  769. if REG_DCR0 <= a.Reg && a.Reg <= REG_DCR0+1023 {
  770. return C_SPR
  771. }
  772. if a.Reg == REG_FPSCR {
  773. return C_FPSCR
  774. }
  775. if a.Reg == REG_MSR {
  776. return C_MSR
  777. }
  778. return C_GOK
  779. case obj.TYPE_MEM:
  780. switch a.Name {
  781. case obj.NAME_EXTERN,
  782. obj.NAME_STATIC:
  783. if a.Sym == nil {
  784. break
  785. }
  786. c.instoffset = a.Offset
  787. if a.Sym != nil { // use relocation
  788. if a.Sym.Type == objabi.STLSBSS {
  789. if c.ctxt.Flag_shared {
  790. return C_TLS_IE
  791. } else {
  792. return C_TLS_LE
  793. }
  794. }
  795. return C_ADDR
  796. }
  797. return C_LEXT
  798. case obj.NAME_GOTREF:
  799. return C_GOTADDR
  800. case obj.NAME_TOCREF:
  801. return C_TOCADDR
  802. case obj.NAME_AUTO:
  803. c.instoffset = int64(c.autosize) + a.Offset
  804. if c.instoffset >= -BIG && c.instoffset < BIG {
  805. return C_SAUTO
  806. }
  807. return C_LAUTO
  808. case obj.NAME_PARAM:
  809. c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
  810. if c.instoffset >= -BIG && c.instoffset < BIG {
  811. return C_SAUTO
  812. }
  813. return C_LAUTO
  814. case obj.NAME_NONE:
  815. c.instoffset = a.Offset
  816. if c.instoffset == 0 {
  817. return C_ZOREG
  818. }
  819. if c.instoffset >= -BIG && c.instoffset < BIG {
  820. return C_SOREG
  821. }
  822. return C_LOREG
  823. }
  824. return C_GOK
  825. case obj.TYPE_TEXTSIZE:
  826. return C_TEXTSIZE
  827. case obj.TYPE_FCONST:
  828. // The only cases where FCONST will occur are with float64 +/- 0.
  829. // All other float constants are generated in memory.
  830. f64 := a.Val.(float64)
  831. if f64 == 0 {
  832. if math.Signbit(f64) {
  833. return C_ADDCON
  834. }
  835. return C_ZCON
  836. }
  837. log.Fatalf("Unexpected nonzero FCONST operand %v", a)
  838. case obj.TYPE_CONST,
  839. obj.TYPE_ADDR:
  840. switch a.Name {
  841. case obj.NAME_NONE:
  842. c.instoffset = a.Offset
  843. if a.Reg != 0 {
  844. if -BIG <= c.instoffset && c.instoffset <= BIG {
  845. return C_SACON
  846. }
  847. if isint32(c.instoffset) {
  848. return C_LACON
  849. }
  850. return C_DACON
  851. }
  852. case obj.NAME_EXTERN,
  853. obj.NAME_STATIC:
  854. s := a.Sym
  855. if s == nil {
  856. return C_GOK
  857. }
  858. c.instoffset = a.Offset
  859. /* not sure why this barfs */
  860. return C_LCON
  861. case obj.NAME_AUTO:
  862. c.instoffset = int64(c.autosize) + a.Offset
  863. if c.instoffset >= -BIG && c.instoffset < BIG {
  864. return C_SACON
  865. }
  866. return C_LACON
  867. case obj.NAME_PARAM:
  868. c.instoffset = int64(c.autosize) + a.Offset + c.ctxt.FixedFrameSize()
  869. if c.instoffset >= -BIG && c.instoffset < BIG {
  870. return C_SACON
  871. }
  872. return C_LACON
  873. default:
  874. return C_GOK
  875. }
  876. if c.instoffset >= 0 {
  877. if c.instoffset == 0 {
  878. return C_ZCON
  879. }
  880. if c.instoffset <= 0x7fff {
  881. return C_SCON
  882. }
  883. if c.instoffset <= 0xffff {
  884. return C_ANDCON
  885. }
  886. if c.instoffset&0xffff == 0 && isuint32(uint64(c.instoffset)) { /* && (instoffset & (1<<31)) == 0) */
  887. return C_UCON
  888. }
  889. if isint32(c.instoffset) || isuint32(uint64(c.instoffset)) {
  890. return C_LCON
  891. }
  892. return C_DCON
  893. }
  894. if c.instoffset >= -0x8000 {
  895. return C_ADDCON
  896. }
  897. if c.instoffset&0xffff == 0 && isint32(c.instoffset) {
  898. return C_UCON
  899. }
  900. if isint32(c.instoffset) {
  901. return C_LCON
  902. }
  903. return C_DCON
  904. case obj.TYPE_BRANCH:
  905. if a.Sym != nil && c.ctxt.Flag_dynlink {
  906. return C_LBRAPIC
  907. }
  908. return C_SBRA
  909. }
  910. return C_GOK
  911. }
  912. func prasm(p *obj.Prog) {
  913. fmt.Printf("%v\n", p)
  914. }
  915. func (c *ctxt9) oplook(p *obj.Prog) *Optab {
  916. a1 := int(p.Optab)
  917. if a1 != 0 {
  918. return &optab[a1-1]
  919. }
  920. a1 = int(p.From.Class)
  921. if a1 == 0 {
  922. a1 = c.aclass(&p.From) + 1
  923. p.From.Class = int8(a1)
  924. }
  925. a1--
  926. a3 := C_NONE + 1
  927. if p.GetFrom3() != nil {
  928. a3 = int(p.GetFrom3().Class)
  929. if a3 == 0 {
  930. a3 = c.aclass(p.GetFrom3()) + 1
  931. p.GetFrom3().Class = int8(a3)
  932. }
  933. }
  934. a3--
  935. a4 := int(p.To.Class)
  936. if a4 == 0 {
  937. a4 = c.aclass(&p.To) + 1
  938. p.To.Class = int8(a4)
  939. }
  940. a4--
  941. a2 := C_NONE
  942. if p.Reg != 0 {
  943. if REG_R0 <= p.Reg && p.Reg <= REG_R31 {
  944. a2 = C_REG
  945. } else if REG_V0 <= p.Reg && p.Reg <= REG_V31 {
  946. a2 = C_VREG
  947. } else if REG_VS0 <= p.Reg && p.Reg <= REG_VS63 {
  948. a2 = C_VSREG
  949. } else if REG_F0 <= p.Reg && p.Reg <= REG_F31 {
  950. a2 = C_FREG
  951. }
  952. }
  953. // c.ctxt.Logf("oplook %v %d %d %d %d\n", p, a1, a2, a3, a4)
  954. ops := oprange[p.As&obj.AMask]
  955. c1 := &xcmp[a1]
  956. c3 := &xcmp[a3]
  957. c4 := &xcmp[a4]
  958. for i := range ops {
  959. op := &ops[i]
  960. if int(op.a2) == a2 && c1[op.a1] && c3[op.a3] && c4[op.a4] {
  961. p.Optab = uint16(cap(optab) - cap(ops) + i + 1)
  962. return op
  963. }
  964. }
  965. c.ctxt.Diag("illegal combination %v %v %v %v %v", p.As, DRconv(a1), DRconv(a2), DRconv(a3), DRconv(a4))
  966. prasm(p)
  967. if ops == nil {
  968. ops = optab
  969. }
  970. return &ops[0]
  971. }
  972. func cmp(a int, b int) bool {
  973. if a == b {
  974. return true
  975. }
  976. switch a {
  977. case C_LCON:
  978. if b == C_ZCON || b == C_SCON || b == C_UCON || b == C_ADDCON || b == C_ANDCON {
  979. return true
  980. }
  981. case C_ADDCON:
  982. if b == C_ZCON || b == C_SCON {
  983. return true
  984. }
  985. case C_ANDCON:
  986. if b == C_ZCON || b == C_SCON {
  987. return true
  988. }
  989. case C_SPR:
  990. if b == C_LR || b == C_XER || b == C_CTR {
  991. return true
  992. }
  993. case C_UCON:
  994. if b == C_ZCON {
  995. return true
  996. }
  997. case C_SCON:
  998. if b == C_ZCON {
  999. return true
  1000. }
  1001. case C_LACON:
  1002. if b == C_SACON {
  1003. return true
  1004. }
  1005. case C_LBRA:
  1006. if b == C_SBRA {
  1007. return true
  1008. }
  1009. case C_LEXT:
  1010. if b == C_SEXT {
  1011. return true
  1012. }
  1013. case C_LAUTO:
  1014. if b == C_SAUTO {
  1015. return true
  1016. }
  1017. case C_REG:
  1018. if b == C_ZCON {
  1019. return r0iszero != 0 /*TypeKind(100016)*/
  1020. }
  1021. case C_LOREG:
  1022. if b == C_ZOREG || b == C_SOREG {
  1023. return true
  1024. }
  1025. case C_SOREG:
  1026. if b == C_ZOREG {
  1027. return true
  1028. }
  1029. case C_ANY:
  1030. return true
  1031. }
  1032. return false
  1033. }
  1034. type ocmp []Optab
  1035. func (x ocmp) Len() int {
  1036. return len(x)
  1037. }
  1038. func (x ocmp) Swap(i, j int) {
  1039. x[i], x[j] = x[j], x[i]
  1040. }
  1041. // Used when sorting the optab. Sorting is
  1042. // done in a way so that the best choice of
  1043. // opcode/operand combination is considered first.
  1044. func (x ocmp) Less(i, j int) bool {
  1045. p1 := &x[i]
  1046. p2 := &x[j]
  1047. n := int(p1.as) - int(p2.as)
  1048. // same opcode
  1049. if n != 0 {
  1050. return n < 0
  1051. }
  1052. // Consider those that generate fewer
  1053. // instructions first.
  1054. n = int(p1.size) - int(p2.size)
  1055. if n != 0 {
  1056. return n < 0
  1057. }
  1058. // operand order should match
  1059. // better choices first
  1060. n = int(p1.a1) - int(p2.a1)
  1061. if n != 0 {
  1062. return n < 0
  1063. }
  1064. n = int(p1.a2) - int(p2.a2)
  1065. if n != 0 {
  1066. return n < 0
  1067. }
  1068. n = int(p1.a3) - int(p2.a3)
  1069. if n != 0 {
  1070. return n < 0
  1071. }
  1072. n = int(p1.a4) - int(p2.a4)
  1073. if n != 0 {
  1074. return n < 0
  1075. }
  1076. return false
  1077. }
  1078. // Add an entry to the opcode table for
  1079. // a new opcode b0 with the same operand combinations
  1080. // as opcode a.
  1081. func opset(a, b0 obj.As) {
  1082. oprange[a&obj.AMask] = oprange[b0]
  1083. }
  1084. // Build the opcode table
  1085. func buildop(ctxt *obj.Link) {
  1086. if oprange[AANDN&obj.AMask] != nil {
  1087. // Already initialized; stop now.
  1088. // This happens in the cmd/asm tests,
  1089. // each of which re-initializes the arch.
  1090. return
  1091. }
  1092. var n int
  1093. for i := 0; i < C_NCLASS; i++ {
  1094. for n = 0; n < C_NCLASS; n++ {
  1095. if cmp(n, i) {
  1096. xcmp[i][n] = true
  1097. }
  1098. }
  1099. }
  1100. for n = 0; optab[n].as != obj.AXXX; n++ {
  1101. }
  1102. sort.Sort(ocmp(optab[:n]))
  1103. for i := 0; i < n; i++ {
  1104. r := optab[i].as
  1105. r0 := r & obj.AMask
  1106. start := i
  1107. for optab[i].as == r {
  1108. i++
  1109. }
  1110. oprange[r0] = optab[start:i]
  1111. i--
  1112. switch r {
  1113. default:
  1114. ctxt.Diag("unknown op in build: %v", r)
  1115. log.Fatalf("instruction missing from switch in asm9.go:buildop: %v", r)
  1116. case ADCBF: /* unary indexed: op (b+a); op (b) */
  1117. opset(ADCBI, r0)
  1118. opset(ADCBST, r0)
  1119. opset(ADCBT, r0)
  1120. opset(ADCBTST, r0)
  1121. opset(ADCBZ, r0)
  1122. opset(AICBI, r0)
  1123. case AECOWX: /* indexed store: op s,(b+a); op s,(b) */
  1124. opset(ASTWCCC, r0)
  1125. opset(ASTHCCC, r0)
  1126. opset(ASTBCCC, r0)
  1127. opset(ASTDCCC, r0)
  1128. case AREM: /* macro */
  1129. opset(AREM, r0)
  1130. case AREMU:
  1131. opset(AREMU, r0)
  1132. case AREMD:
  1133. opset(AREMDU, r0)
  1134. case ADIVW: /* op Rb[,Ra],Rd */
  1135. opset(AMULHW, r0)
  1136. opset(AMULHWCC, r0)
  1137. opset(AMULHWU, r0)
  1138. opset(AMULHWUCC, r0)
  1139. opset(AMULLWCC, r0)
  1140. opset(AMULLWVCC, r0)
  1141. opset(AMULLWV, r0)
  1142. opset(ADIVWCC, r0)
  1143. opset(ADIVWV, r0)
  1144. opset(ADIVWVCC, r0)
  1145. opset(ADIVWU, r0)
  1146. opset(ADIVWUCC, r0)
  1147. opset(ADIVWUV, r0)
  1148. opset(ADIVWUVCC, r0)
  1149. opset(AMODUD, r0)
  1150. opset(AMODUW, r0)
  1151. opset(AMODSD, r0)
  1152. opset(AMODSW, r0)
  1153. opset(AADDCC, r0)
  1154. opset(AADDCV, r0)
  1155. opset(AADDCVCC, r0)
  1156. opset(AADDV, r0)
  1157. opset(AADDVCC, r0)
  1158. opset(AADDE, r0)
  1159. opset(AADDECC, r0)
  1160. opset(AADDEV, r0)
  1161. opset(AADDEVCC, r0)
  1162. opset(AMULHD, r0)
  1163. opset(AMULHDCC, r0)
  1164. opset(AMULHDU, r0)
  1165. opset(AMULHDUCC, r0)
  1166. opset(AMULLD, r0)
  1167. opset(AMULLDCC, r0)
  1168. opset(AMULLDVCC, r0)
  1169. opset(AMULLDV, r0)
  1170. opset(ADIVD, r0)
  1171. opset(ADIVDCC, r0)
  1172. opset(ADIVDE, r0)
  1173. opset(ADIVDEU, r0)
  1174. opset(ADIVDECC, r0)
  1175. opset(ADIVDEUCC, r0)
  1176. opset(ADIVDVCC, r0)
  1177. opset(ADIVDV, r0)
  1178. opset(ADIVDU, r0)
  1179. opset(ADIVDUV, r0)
  1180. opset(ADIVDUVCC, r0)
  1181. opset(ADIVDUCC, r0)
  1182. case ACRAND:
  1183. opset(ACRANDN, r0)
  1184. opset(ACREQV, r0)
  1185. opset(ACRNAND, r0)
  1186. opset(ACRNOR, r0)
  1187. opset(ACROR, r0)
  1188. opset(ACRORN, r0)
  1189. opset(ACRXOR, r0)
  1190. case APOPCNTD: /* popcntd, popcntw, popcntb, cnttzw, cnttzd */
  1191. opset(APOPCNTW, r0)
  1192. opset(APOPCNTB, r0)
  1193. opset(ACNTTZW, r0)
  1194. opset(ACNTTZWCC, r0)
  1195. opset(ACNTTZD, r0)
  1196. opset(ACNTTZDCC, r0)
  1197. case ACOPY: /* copy, paste. */
  1198. opset(APASTECC, r0)
  1199. case AMADDHD: /* maddhd, maddhdu, maddld */
  1200. opset(AMADDHDU, r0)
  1201. opset(AMADDLD, r0)
  1202. case AMOVBZ: /* lbz, stz, rlwm(r/r), lhz, lha, stz, and x variants */
  1203. opset(AMOVH, r0)
  1204. opset(AMOVHZ, r0)
  1205. case AMOVBZU: /* lbz[x]u, stb[x]u, lhz[x]u, lha[x]u, sth[u]x, ld[x]u, std[u]x */
  1206. opset(AMOVHU, r0)
  1207. opset(AMOVHZU, r0)
  1208. opset(AMOVWU, r0)
  1209. opset(AMOVWZU, r0)
  1210. opset(AMOVDU, r0)
  1211. opset(AMOVMW, r0)
  1212. case ALV: /* lvebx, lvehx, lvewx, lvx, lvxl, lvsl, lvsr */
  1213. opset(ALVEBX, r0)
  1214. opset(ALVEHX, r0)
  1215. opset(ALVEWX, r0)
  1216. opset(ALVX, r0)
  1217. opset(ALVXL, r0)
  1218. opset(ALVSL, r0)
  1219. opset(ALVSR, r0)
  1220. case ASTV: /* stvebx, stvehx, stvewx, stvx, stvxl */
  1221. opset(ASTVEBX, r0)
  1222. opset(ASTVEHX, r0)
  1223. opset(ASTVEWX, r0)
  1224. opset(ASTVX, r0)
  1225. opset(ASTVXL, r0)
  1226. case AVAND: /* vand, vandc, vnand */
  1227. opset(AVAND, r0)
  1228. opset(AVANDC, r0)
  1229. opset(AVNAND, r0)
  1230. case AVMRGOW: /* vmrgew, vmrgow */
  1231. opset(AVMRGEW, r0)
  1232. case AVOR: /* vor, vorc, vxor, vnor, veqv */
  1233. opset(AVOR, r0)
  1234. opset(AVORC, r0)
  1235. opset(AVXOR, r0)
  1236. opset(AVNOR, r0)
  1237. opset(AVEQV, r0)
  1238. case AVADDUM: /* vaddubm, vadduhm, vadduwm, vaddudm, vadduqm */
  1239. opset(AVADDUBM, r0)
  1240. opset(AVADDUHM, r0)
  1241. opset(AVADDUWM, r0)
  1242. opset(AVADDUDM, r0)
  1243. opset(AVADDUQM, r0)
  1244. case AVADDCU: /* vaddcuq, vaddcuw */
  1245. opset(AVADDCUQ, r0)
  1246. opset(AVADDCUW, r0)
  1247. case AVADDUS: /* vaddubs, vadduhs, vadduws */
  1248. opset(AVADDUBS, r0)
  1249. opset(AVADDUHS, r0)
  1250. opset(AVADDUWS, r0)
  1251. case AVADDSS: /* vaddsbs, vaddshs, vaddsws */
  1252. opset(AVADDSBS, r0)
  1253. opset(AVADDSHS, r0)
  1254. opset(AVADDSWS, r0)
  1255. case AVADDE: /* vaddeuqm, vaddecuq */
  1256. opset(AVADDEUQM, r0)
  1257. opset(AVADDECUQ, r0)
  1258. case AVSUBUM: /* vsububm, vsubuhm, vsubuwm, vsubudm, vsubuqm */
  1259. opset(AVSUBUBM, r0)
  1260. opset(AVSUBUHM, r0)
  1261. opset(AVSUBUWM, r0)
  1262. opset(AVSUBUDM, r0)
  1263. opset(AVSUBUQM, r0)
  1264. case AVSUBCU: /* vsubcuq, vsubcuw */
  1265. opset(AVSUBCUQ, r0)
  1266. opset(AVSUBCUW, r0)
  1267. case AVSUBUS: /* vsububs, vsubuhs, vsubuws */
  1268. opset(AVSUBUBS, r0)
  1269. opset(AVSUBUHS, r0)
  1270. opset(AVSUBUWS, r0)
  1271. case AVSUBSS: /* vsubsbs, vsubshs, vsubsws */
  1272. opset(AVSUBSBS, r0)
  1273. opset(AVSUBSHS, r0)
  1274. opset(AVSUBSWS, r0)
  1275. case AVSUBE: /* vsubeuqm, vsubecuq */
  1276. opset(AVSUBEUQM, r0)
  1277. opset(AVSUBECUQ, r0)
  1278. case AVMULESB: /* vmulesb, vmulosb, vmuleub, vmuloub, vmulosh, vmulouh, vmulesw, vmulosw, vmuleuw, vmulouw, vmuluwm */
  1279. opset(AVMULOSB, r0)
  1280. opset(AVMULEUB, r0)
  1281. opset(AVMULOUB, r0)
  1282. opset(AVMULESH, r0)
  1283. opset(AVMULOSH, r0)
  1284. opset(AVMULEUH, r0)
  1285. opset(AVMULOUH, r0)
  1286. opset(AVMULESW, r0)
  1287. opset(AVMULOSW, r0)
  1288. opset(AVMULEUW, r0)
  1289. opset(AVMULOUW, r0)
  1290. opset(AVMULUWM, r0)
  1291. case AVPMSUM: /* vpmsumb, vpmsumh, vpmsumw, vpmsumd */
  1292. opset(AVPMSUMB, r0)
  1293. opset(AVPMSUMH, r0)
  1294. opset(AVPMSUMW, r0)
  1295. opset(AVPMSUMD, r0)
  1296. case AVR: /* vrlb, vrlh, vrlw, vrld */
  1297. opset(AVRLB, r0)
  1298. opset(AVRLH, r0)
  1299. opset(AVRLW, r0)
  1300. opset(AVRLD, r0)
  1301. case AVS: /* vs[l,r], vs[l,r]o, vs[l,r]b, vs[l,r]h, vs[l,r]w, vs[l,r]d */
  1302. opset(AVSLB, r0)
  1303. opset(AVSLH, r0)
  1304. opset(AVSLW, r0)
  1305. opset(AVSL, r0)
  1306. opset(AVSLO, r0)
  1307. opset(AVSRB, r0)
  1308. opset(AVSRH, r0)
  1309. opset(AVSRW, r0)
  1310. opset(AVSR, r0)
  1311. opset(AVSRO, r0)
  1312. opset(AVSLD, r0)
  1313. opset(AVSRD, r0)
  1314. case AVSA: /* vsrab, vsrah, vsraw, vsrad */
  1315. opset(AVSRAB, r0)
  1316. opset(AVSRAH, r0)
  1317. opset(AVSRAW, r0)
  1318. opset(AVSRAD, r0)
  1319. case AVSOI: /* vsldoi */
  1320. opset(AVSLDOI, r0)
  1321. case AVCLZ: /* vclzb, vclzh, vclzw, vclzd */
  1322. opset(AVCLZB, r0)
  1323. opset(AVCLZH, r0)
  1324. opset(AVCLZW, r0)
  1325. opset(AVCLZD, r0)
  1326. case AVPOPCNT: /* vpopcntb, vpopcnth, vpopcntw, vpopcntd */
  1327. opset(AVPOPCNTB, r0)
  1328. opset(AVPOPCNTH, r0)
  1329. opset(AVPOPCNTW, r0)
  1330. opset(AVPOPCNTD, r0)
  1331. case AVCMPEQ: /* vcmpequb[.], vcmpequh[.], vcmpequw[.], vcmpequd[.] */
  1332. opset(AVCMPEQUB, r0)
  1333. opset(AVCMPEQUBCC, r0)
  1334. opset(AVCMPEQUH, r0)
  1335. opset(AVCMPEQUHCC, r0)
  1336. opset(AVCMPEQUW, r0)
  1337. opset(AVCMPEQUWCC, r0)
  1338. opset(AVCMPEQUD, r0)
  1339. opset(AVCMPEQUDCC, r0)
  1340. case AVCMPGT: /* vcmpgt[u,s]b[.], vcmpgt[u,s]h[.], vcmpgt[u,s]w[.], vcmpgt[u,s]d[.] */
  1341. opset(AVCMPGTUB, r0)
  1342. opset(AVCMPGTUBCC, r0)
  1343. opset(AVCMPGTUH, r0)
  1344. opset(AVCMPGTUHCC, r0)
  1345. opset(AVCMPGTUW, r0)
  1346. opset(AVCMPGTUWCC, r0)
  1347. opset(AVCMPGTUD, r0)
  1348. opset(AVCMPGTUDCC, r0)
  1349. opset(AVCMPGTSB, r0)
  1350. opset(AVCMPGTSBCC, r0)
  1351. opset(AVCMPGTSH, r0)
  1352. opset(AVCMPGTSHCC, r0)
  1353. opset(AVCMPGTSW, r0)
  1354. opset(AVCMPGTSWCC, r0)
  1355. opset(AVCMPGTSD, r0)
  1356. opset(AVCMPGTSDCC, r0)
  1357. case AVCMPNEZB: /* vcmpnezb[.] */
  1358. opset(AVCMPNEZBCC, r0)
  1359. opset(AVCMPNEB, r0)
  1360. opset(AVCMPNEBCC, r0)
  1361. opset(AVCMPNEH, r0)
  1362. opset(AVCMPNEHCC, r0)
  1363. opset(AVCMPNEW, r0)
  1364. opset(AVCMPNEWCC, r0)
  1365. case AVPERM: /* vperm */
  1366. opset(AVPERMXOR, r0)
  1367. opset(AVPERMR, r0)
  1368. case AVBPERMQ: /* vbpermq, vbpermd */
  1369. opset(AVBPERMD, r0)
  1370. case AVSEL: /* vsel */
  1371. opset(AVSEL, r0)
  1372. case AVSPLTB: /* vspltb, vsplth, vspltw */
  1373. opset(AVSPLTH, r0)
  1374. opset(AVSPLTW, r0)
  1375. case AVSPLTISB: /* vspltisb, vspltish, vspltisw */
  1376. opset(AVSPLTISH, r0)
  1377. opset(AVSPLTISW, r0)
  1378. case AVCIPH: /* vcipher, vcipherlast */
  1379. opset(AVCIPHER, r0)
  1380. opset(AVCIPHERLAST, r0)
  1381. case AVNCIPH: /* vncipher, vncipherlast */
  1382. opset(AVNCIPHER, r0)
  1383. opset(AVNCIPHERLAST, r0)
  1384. case AVSBOX: /* vsbox */
  1385. opset(AVSBOX, r0)
  1386. case AVSHASIGMA: /* vshasigmaw, vshasigmad */
  1387. opset(AVSHASIGMAW, r0)
  1388. opset(AVSHASIGMAD, r0)
  1389. case ALXVD2X: /* lxvd2x, lxvdsx, lxvw4x, lxvh8x, lxvb16x */
  1390. opset(ALXVDSX, r0)
  1391. opset(ALXVW4X, r0)
  1392. opset(ALXVH8X, r0)
  1393. opset(ALXVB16X, r0)
  1394. case ALXV: /* lxv */
  1395. opset(ALXV, r0)
  1396. case ALXVL: /* lxvl, lxvll, lxvx */
  1397. opset(ALXVLL, r0)
  1398. opset(ALXVX, r0)
  1399. case ASTXVD2X: /* stxvd2x, stxvdsx, stxvw4x, stxvh8x, stxvb16x */
  1400. opset(ASTXVW4X, r0)
  1401. opset(ASTXVH8X, r0)
  1402. opset(ASTXVB16X, r0)
  1403. case ASTXV: /* stxv */
  1404. opset(ASTXV, r0)
  1405. case ASTXVL: /* stxvl, stxvll, stvx */
  1406. opset(ASTXVLL, r0)
  1407. opset(ASTXVX, r0)
  1408. case ALXSDX: /* lxsdx */
  1409. opset(ALXSDX, r0)
  1410. case ASTXSDX: /* stxsdx */
  1411. opset(ASTXSDX, r0)
  1412. case ALXSIWAX: /* lxsiwax, lxsiwzx */
  1413. opset(ALXSIWZX, r0)
  1414. case ASTXSIWX: /* stxsiwx */
  1415. opset(ASTXSIWX, r0)
  1416. case AMFVSRD: /* mfvsrd, mfvsrwz (and extended mnemonics), mfvsrld */
  1417. opset(AMFFPRD, r0)
  1418. opset(AMFVRD, r0)
  1419. opset(AMFVSRWZ, r0)
  1420. opset(AMFVSRLD, r0)
  1421. case AMTVSRD: /* mtvsrd, mtvsrwa, mtvsrwz (and extended mnemonics), mtvsrdd, mtvsrws */
  1422. opset(AMTFPRD, r0)
  1423. opset(AMTVRD, r0)
  1424. opset(AMTVSRWA, r0)
  1425. opset(AMTVSRWZ, r0)
  1426. opset(AMTVSRDD, r0)
  1427. opset(AMTVSRWS, r0)
  1428. case AXXLAND: /* xxland, xxlandc, xxleqv, xxlnand */
  1429. opset(AXXLANDC, r0)
  1430. opset(AXXLEQV, r0)
  1431. opset(AXXLNAND, r0)
  1432. case AXXLOR: /* xxlorc, xxlnor, xxlor, xxlxor */
  1433. opset(AXXLORC, r0)
  1434. opset(AXXLNOR, r0)
  1435. opset(AXXLORQ, r0)
  1436. opset(AXXLXOR, r0)
  1437. case AXXSEL: /* xxsel */
  1438. opset(AXXSEL, r0)
  1439. case AXXMRGHW: /* xxmrghw, xxmrglw */
  1440. opset(AXXMRGLW, r0)
  1441. case AXXSPLTW: /* xxspltw */
  1442. opset(AXXSPLTW, r0)
  1443. case AXXSPLTIB: /* xxspltib */
  1444. opset(AXXSPLTIB, r0)
  1445. case AXXPERM: /* xxpermdi */
  1446. opset(AXXPERM, r0)
  1447. case AXXSLDWI: /* xxsldwi */
  1448. opset(AXXPERMDI, r0)
  1449. opset(AXXSLDWI, r0)
  1450. case AXXBRQ: /* xxbrq, xxbrd, xxbrw, xxbrh */
  1451. opset(AXXBRD, r0)
  1452. opset(AXXBRW, r0)
  1453. opset(AXXBRH, r0)
  1454. case AXSCVDPSP: /* xscvdpsp, xscvspdp, xscvdpspn, xscvspdpn */
  1455. opset(AXSCVSPDP, r0)
  1456. opset(AXSCVDPSPN, r0)
  1457. opset(AXSCVSPDPN, r0)
  1458. case AXVCVDPSP: /* xvcvdpsp, xvcvspdp */
  1459. opset(AXVCVSPDP, r0)
  1460. case AXSCVDPSXDS: /* xscvdpsxds, xscvdpsxws, xscvdpuxds, xscvdpuxws */
  1461. opset(AXSCVDPSXWS, r0)
  1462. opset(AXSCVDPUXDS, r0)
  1463. opset(AXSCVDPUXWS, r0)
  1464. case AXSCVSXDDP: /* xscvsxddp, xscvuxddp, xscvsxdsp, xscvuxdsp */
  1465. opset(AXSCVUXDDP, r0)
  1466. opset(AXSCVSXDSP, r0)
  1467. opset(AXSCVUXDSP, r0)
  1468. case AXVCVDPSXDS: /* xvcvdpsxds, xvcvdpsxws, xvcvdpuxds, xvcvdpuxws, xvcvspsxds, xvcvspsxws, xvcvspuxds, xvcvspuxws */
  1469. opset(AXVCVDPSXDS, r0)
  1470. opset(AXVCVDPSXWS, r0)
  1471. opset(AXVCVDPUXDS, r0)
  1472. opset(AXVCVDPUXWS, r0)
  1473. opset(AXVCVSPSXDS, r0)
  1474. opset(AXVCVSPSXWS, r0)
  1475. opset(AXVCVSPUXDS, r0)
  1476. opset(AXVCVSPUXWS, r0)
  1477. case AXVCVSXDDP: /* xvcvsxddp, xvcvsxwdp, xvcvuxddp, xvcvuxwdp, xvcvsxdsp, xvcvsxwsp, xvcvuxdsp, xvcvuxwsp */
  1478. opset(AXVCVSXWDP, r0)
  1479. opset(AXVCVUXDDP, r0)
  1480. opset(AXVCVUXWDP, r0)
  1481. opset(AXVCVSXDSP, r0)
  1482. opset(AXVCVSXWSP, r0)
  1483. opset(AXVCVUXDSP, r0)
  1484. opset(AXVCVUXWSP, r0)
  1485. case AAND: /* logical op Rb,Rs,Ra; no literal */
  1486. opset(AANDN, r0)
  1487. opset(AANDNCC, r0)
  1488. opset(AEQV, r0)
  1489. opset(AEQVCC, r0)
  1490. opset(ANAND, r0)
  1491. opset(ANANDCC, r0)
  1492. opset(ANOR, r0)
  1493. opset(ANORCC, r0)
  1494. opset(AORCC, r0)
  1495. opset(AORN, r0)
  1496. opset(AORNCC, r0)
  1497. opset(AXORCC, r0)
  1498. case AADDME: /* op Ra, Rd */
  1499. opset(AADDMECC, r0)
  1500. opset(AADDMEV, r0)
  1501. opset(AADDMEVCC, r0)
  1502. opset(AADDZE, r0)
  1503. opset(AADDZECC, r0)
  1504. opset(AADDZEV, r0)
  1505. opset(AADDZEVCC, r0)
  1506. opset(ASUBME, r0)
  1507. opset(ASUBMECC, r0)
  1508. opset(ASUBMEV, r0)
  1509. opset(ASUBMEVCC, r0)
  1510. opset(ASUBZE, r0)
  1511. opset(ASUBZECC, r0)
  1512. opset(ASUBZEV, r0)
  1513. opset(ASUBZEVCC, r0)
  1514. case AADDC:
  1515. opset(AADDCCC, r0)
  1516. case ABEQ:
  1517. opset(ABGE, r0)
  1518. opset(ABGT, r0)
  1519. opset(ABLE, r0)
  1520. opset(ABLT, r0)
  1521. opset(ABNE, r0)
  1522. opset(ABVC, r0)
  1523. opset(ABVS, r0)
  1524. case ABR:
  1525. opset(ABL, r0)
  1526. case ABC:
  1527. opset(ABCL, r0)
  1528. case AEXTSB: /* op Rs, Ra */
  1529. opset(AEXTSBCC, r0)
  1530. opset(AEXTSH, r0)
  1531. opset(AEXTSHCC, r0)
  1532. opset(ACNTLZW, r0)
  1533. opset(ACNTLZWCC, r0)
  1534. opset(ACNTLZD, r0)
  1535. opset(AEXTSW, r0)
  1536. opset(AEXTSWCC, r0)
  1537. opset(ACNTLZDCC, r0)
  1538. case AFABS: /* fop [s,]d */
  1539. opset(AFABSCC, r0)
  1540. opset(AFNABS, r0)
  1541. opset(AFNABSCC, r0)
  1542. opset(AFNEG, r0)
  1543. opset(AFNEGCC, r0)
  1544. opset(AFRSP, r0)
  1545. opset(AFRSPCC, r0)
  1546. opset(AFCTIW, r0)
  1547. opset(AFCTIWCC, r0)
  1548. opset(AFCTIWZ, r0)
  1549. opset(AFCTIWZCC, r0)
  1550. opset(AFCTID, r0)
  1551. opset(AFCTIDCC, r0)
  1552. opset(AFCTIDZ, r0)
  1553. opset(AFCTIDZCC, r0)
  1554. opset(AFCFID, r0)
  1555. opset(AFCFIDCC, r0)
  1556. opset(AFCFIDU, r0)
  1557. opset(AFCFIDUCC, r0)
  1558. opset(AFCFIDS, r0)
  1559. opset(AFCFIDSCC, r0)
  1560. opset(AFRES, r0)
  1561. opset(AFRESCC, r0)
  1562. opset(AFRIM, r0)
  1563. opset(AFRIMCC, r0)
  1564. opset(AFRIP, r0)
  1565. opset(AFRIPCC, r0)
  1566. opset(AFRIZ, r0)
  1567. opset(AFRIZCC, r0)
  1568. opset(AFRIN, r0)
  1569. opset(AFRINCC, r0)
  1570. opset(AFRSQRTE, r0)
  1571. opset(AFRSQRTECC, r0)
  1572. opset(AFSQRT, r0)
  1573. opset(AFSQRTCC, r0)
  1574. opset(AFSQRTS, r0)
  1575. opset(AFSQRTSCC, r0)
  1576. case AFADD:
  1577. opset(AFADDS, r0)
  1578. opset(AFADDCC, r0)
  1579. opset(AFADDSCC, r0)
  1580. opset(AFCPSGN, r0)
  1581. opset(AFCPSGNCC, r0)
  1582. opset(AFDIV, r0)
  1583. opset(AFDIVS, r0)
  1584. opset(AFDIVCC, r0)
  1585. opset(AFDIVSCC, r0)
  1586. opset(AFSUB, r0)
  1587. opset(AFSUBS, r0)
  1588. opset(AFSUBCC, r0)
  1589. opset(AFSUBSCC, r0)
  1590. case AFMADD:
  1591. opset(AFMADDCC, r0)
  1592. opset(AFMADDS, r0)
  1593. opset(AFMADDSCC, r0)
  1594. opset(AFMSUB, r0)
  1595. opset(AFMSUBCC, r0)
  1596. opset(AFMSUBS, r0)
  1597. opset(AFMSUBSCC, r0)
  1598. opset(AFNMADD, r0)
  1599. opset(AFNMADDCC, r0)
  1600. opset(AFNMADDS, r0)
  1601. opset(AFNMADDSCC, r0)
  1602. opset(AFNMSUB, r0)
  1603. opset(AFNMSUBCC, r0)
  1604. opset(AFNMSUBS, r0)
  1605. opset(AFNMSUBSCC, r0)
  1606. opset(AFSEL, r0)
  1607. opset(AFSELCC, r0)
  1608. case AFMUL:
  1609. opset(AFMULS, r0)
  1610. opset(AFMULCC, r0)
  1611. opset(AFMULSCC, r0)
  1612. case AFCMPO:
  1613. opset(AFCMPU, r0)
  1614. case AISEL:
  1615. opset(AISEL, r0)
  1616. case AMTFSB0:
  1617. opset(AMTFSB0CC, r0)
  1618. opset(AMTFSB1, r0)
  1619. opset(AMTFSB1CC, r0)
  1620. case ANEG: /* op [Ra,] Rd */
  1621. opset(ANEGCC, r0)
  1622. opset(ANEGV, r0)
  1623. opset(ANEGVCC, r0)
  1624. case AOR: /* or/xor Rb,Rs,Ra; ori/xori $uimm,Rs,R */
  1625. opset(AXOR, r0)
  1626. case AORIS: /* oris/xoris $uimm,Rs,Ra */
  1627. opset(AXORIS, r0)
  1628. case ASLW:
  1629. opset(ASLWCC, r0)
  1630. opset(ASRW, r0)
  1631. opset(ASRWCC, r0)
  1632. opset(AROTLW, r0)
  1633. case ASLD:
  1634. opset(ASLDCC, r0)
  1635. opset(ASRD, r0)
  1636. opset(ASRDCC, r0)
  1637. opset(AROTL, r0)
  1638. case ASRAW: /* sraw Rb,Rs,Ra; srawi sh,Rs,Ra */
  1639. opset(ASRAWCC, r0)
  1640. case ASRAD: /* sraw Rb,Rs,Ra; srawi sh,Rs,Ra */
  1641. opset(ASRADCC, r0)
  1642. case ASUB: /* SUB Ra,Rb,Rd => subf Rd,ra,rb */
  1643. opset(ASUB, r0)
  1644. opset(ASUBCC, r0)
  1645. opset(ASUBV, r0)
  1646. opset(ASUBVCC, r0)
  1647. opset(ASUBCCC, r0)
  1648. opset(ASUBCV, r0)
  1649. opset(ASUBCVCC, r0)
  1650. opset(ASUBE, r0)
  1651. opset(ASUBECC, r0)
  1652. opset(ASUBEV, r0)
  1653. opset(ASUBEVCC, r0)
  1654. case ASYNC:
  1655. opset(AISYNC, r0)
  1656. opset(ALWSYNC, r0)
  1657. opset(APTESYNC, r0)
  1658. opset(ATLBSYNC, r0)
  1659. case ARLWMI:
  1660. opset(ARLWMICC, r0)
  1661. opset(ARLWNM, r0)
  1662. opset(ARLWNMCC, r0)
  1663. opset(ACLRLSLWI, r0)
  1664. case ARLDMI:
  1665. opset(ARLDMICC, r0)
  1666. opset(ARLDIMI, r0)
  1667. opset(ARLDIMICC, r0)
  1668. case ARLDC:
  1669. opset(ARLDCCC, r0)
  1670. case ARLDCL:
  1671. opset(ARLDCR, r0)
  1672. opset(ARLDCLCC, r0)
  1673. opset(ARLDCRCC, r0)
  1674. case ARLDICL:
  1675. opset(ARLDICLCC, r0)
  1676. opset(ARLDICR, r0)
  1677. opset(ARLDICRCC, r0)
  1678. opset(ARLDIC, r0)
  1679. opset(ARLDICCC, r0)
  1680. opset(ACLRLSLDI, r0)
  1681. case AFMOVD:
  1682. opset(AFMOVDCC, r0)
  1683. opset(AFMOVDU, r0)
  1684. opset(AFMOVS, r0)
  1685. opset(AFMOVSU, r0)
  1686. case ALDAR:
  1687. opset(ALBAR, r0)
  1688. opset(ALHAR, r0)
  1689. opset(ALWAR, r0)
  1690. case ASYSCALL: /* just the op; flow of control */
  1691. opset(ARFI, r0)
  1692. opset(ARFCI, r0)
  1693. opset(ARFID, r0)
  1694. opset(AHRFID, r0)
  1695. case AMOVHBR:
  1696. opset(AMOVWBR, r0)
  1697. opset(AMOVDBR, r0)
  1698. case ASLBMFEE:
  1699. opset(ASLBMFEV, r0)
  1700. case ATW:
  1701. opset(ATD, r0)
  1702. case ATLBIE:
  1703. opset(ASLBIE, r0)
  1704. opset(ATLBIEL, r0)
  1705. case AEIEIO:
  1706. opset(ASLBIA, r0)
  1707. case ACMP:
  1708. opset(ACMPW, r0)
  1709. case ACMPU:
  1710. opset(ACMPWU, r0)
  1711. case ACMPB:
  1712. opset(ACMPB, r0)
  1713. case AFTDIV:
  1714. opset(AFTDIV, r0)
  1715. case AFTSQRT:
  1716. opset(AFTSQRT, r0)
  1717. case AADD,
  1718. AADDIS,
  1719. AANDCC, /* and. Rb,Rs,Ra; andi. $uimm,Rs,Ra */
  1720. AANDISCC,
  1721. AFMOVSX,
  1722. AFMOVSZ,
  1723. ALSW,
  1724. AMOVW,
  1725. /* load/store/move word with sign extension; special 32-bit move; move 32-bit literals */
  1726. AMOVWZ, /* load/store/move word with zero extension; move 32-bit literals */
  1727. AMOVD, /* load/store/move 64-bit values, including 32-bit literals with/without sign-extension */
  1728. AMOVB, /* macro: move byte with sign extension */
  1729. AMOVBU, /* macro: move byte with sign extension & update */
  1730. AMOVFL,
  1731. AMULLW,
  1732. /* op $s[,r2],r3; op r1[,r2],r3; no cc/v */
  1733. ASUBC, /* op r1,$s,r3; op r1[,r2],r3 */
  1734. ASTSW,
  1735. ASLBMTE,
  1736. AWORD,
  1737. ADWORD,
  1738. ADARN,
  1739. ALDMX,
  1740. AVMSUMUDM,
  1741. AADDEX,
  1742. ACMPEQB,
  1743. AECIWX,
  1744. obj.ANOP,
  1745. obj.ATEXT,
  1746. obj.AUNDEF,
  1747. obj.AFUNCDATA,
  1748. obj.APCALIGN,
  1749. obj.APCDATA,
  1750. obj.ADUFFZERO,
  1751. obj.ADUFFCOPY:
  1752. break
  1753. }
  1754. }
  1755. }
  1756. func OPVXX1(o uint32, xo uint32, oe uint32) uint32 {
  1757. return o<<26 | xo<<1 | oe<<11
  1758. }
  1759. func OPVXX2(o uint32, xo uint32, oe uint32) uint32 {
  1760. return o<<26 | xo<<2 | oe<<11
  1761. }
  1762. func OPVXX2VA(o uint32, xo uint32, oe uint32) uint32 {
  1763. return o<<26 | xo<<2 | oe<<16
  1764. }
  1765. func OPVXX3(o uint32, xo uint32, oe uint32) uint32 {
  1766. return o<<26 | xo<<3 | oe<<11
  1767. }
  1768. func OPVXX4(o uint32, xo uint32, oe uint32) uint32 {
  1769. return o<<26 | xo<<4 | oe<<11
  1770. }
  1771. func OPDQ(o uint32, xo uint32, oe uint32) uint32 {
  1772. return o<<26 | xo | oe<<4
  1773. }
  1774. func OPVX(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
  1775. return o<<26 | xo | oe<<11 | rc&1
  1776. }
  1777. func OPVC(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
  1778. return o<<26 | xo | oe<<11 | (rc&1)<<10
  1779. }
  1780. func OPVCC(o uint32, xo uint32, oe uint32, rc uint32) uint32 {
  1781. return o<<26 | xo<<1 | oe<<10 | rc&1
  1782. }
  1783. func OPCC(o uint32, xo uint32, rc uint32) uint32 {
  1784. return OPVCC(o, xo, 0, rc)
  1785. }
  1786. /* the order is dest, a/s, b/imm for both arithmetic and logical operations */
  1787. func AOP_RRR(op uint32, d uint32, a uint32, b uint32) uint32 {
  1788. return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11
  1789. }
  1790. /* VX-form 2-register operands, r/none/r */
  1791. func AOP_RR(op uint32, d uint32, a uint32) uint32 {
  1792. return op | (d&31)<<21 | (a&31)<<11
  1793. }
  1794. /* VA-form 4-register operands */
  1795. func AOP_RRRR(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
  1796. return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c&31)<<6
  1797. }
  1798. func AOP_IRR(op uint32, d uint32, a uint32, simm uint32) uint32 {
  1799. return op | (d&31)<<21 | (a&31)<<16 | simm&0xFFFF
  1800. }
  1801. /* VX-form 2-register + UIM operands */
  1802. func AOP_VIRR(op uint32, d uint32, a uint32, simm uint32) uint32 {
  1803. return op | (d&31)<<21 | (simm&0xFFFF)<<16 | (a&31)<<11
  1804. }
  1805. /* VX-form 2-register + ST + SIX operands */
  1806. func AOP_IIRR(op uint32, d uint32, a uint32, sbit uint32, simm uint32) uint32 {
  1807. return op | (d&31)<<21 | (a&31)<<16 | (sbit&1)<<15 | (simm&0xF)<<11
  1808. }
  1809. /* VA-form 3-register + SHB operands */
  1810. func AOP_IRRR(op uint32, d uint32, a uint32, b uint32, simm uint32) uint32 {
  1811. return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (simm&0xF)<<6
  1812. }
  1813. /* VX-form 1-register + SIM operands */
  1814. func AOP_IR(op uint32, d uint32, simm uint32) uint32 {
  1815. return op | (d&31)<<21 | (simm&31)<<16
  1816. }
  1817. /* XX1-form 3-register operands, 1 VSR operand */
  1818. func AOP_XX1(op uint32, d uint32, a uint32, b uint32) uint32 {
  1819. /* For the XX-form encodings, we need the VSX register number to be exactly */
  1820. /* between 0-63, so we can properly set the rightmost bits. */
  1821. r := d - REG_VS0
  1822. return op | (r&31)<<21 | (a&31)<<16 | (b&31)<<11 | (r&32)>>5
  1823. }
  1824. /* XX2-form 3-register operands, 2 VSR operands */
  1825. func AOP_XX2(op uint32, d uint32, a uint32, b uint32) uint32 {
  1826. xt := d - REG_VS0
  1827. xb := b - REG_VS0
  1828. return op | (xt&31)<<21 | (a&3)<<16 | (xb&31)<<11 | (xb&32)>>4 | (xt&32)>>5
  1829. }
  1830. /* XX3-form 3 VSR operands */
  1831. func AOP_XX3(op uint32, d uint32, a uint32, b uint32) uint32 {
  1832. xt := d - REG_VS0
  1833. xa := a - REG_VS0
  1834. xb := b - REG_VS0
  1835. return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
  1836. }
  1837. /* XX3-form 3 VSR operands + immediate */
  1838. func AOP_XX3I(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
  1839. xt := d - REG_VS0
  1840. xa := a - REG_VS0
  1841. xb := b - REG_VS0
  1842. return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (c&3)<<8 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
  1843. }
  1844. /* XX4-form, 4 VSR operands */
  1845. func AOP_XX4(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
  1846. xt := d - REG_VS0
  1847. xa := a - REG_VS0
  1848. xb := b - REG_VS0
  1849. xc := c - REG_VS0
  1850. return op | (xt&31)<<21 | (xa&31)<<16 | (xb&31)<<11 | (xc&31)<<6 | (xc&32)>>2 | (xa&32)>>3 | (xb&32)>>4 | (xt&32)>>5
  1851. }
  1852. /* DQ-form, VSR register, register + offset operands */
  1853. func AOP_DQ(op uint32, d uint32, a uint32, b uint32) uint32 {
  1854. /* For the DQ-form encodings, we need the VSX register number to be exactly */
  1855. /* between 0-63, so we can properly set the SX bit. */
  1856. r := d - REG_VS0
  1857. /* The EA for this instruction form is (RA) + DQ << 4, where DQ is a 12-bit signed integer. */
  1858. /* In order to match the output of the GNU objdump (and make the usage in Go asm easier), the */
  1859. /* instruction is called using the sign extended value (i.e. a valid offset would be -32752 or 32752, */
  1860. /* not -2047 or 2047), so 'b' needs to be adjusted to the expected 12-bit DQ value. Bear in mind that */
  1861. /* bits 0 to 3 in 'dq' need to be zero, otherwise this will generate an illegal instruction. */
  1862. /* If in doubt how this instruction form is encoded, refer to ISA 3.0b, pages 492 and 507. */
  1863. dq := b >> 4
  1864. return op | (r&31)<<21 | (a&31)<<16 | (dq&4095)<<4 | (r&32)>>2
  1865. }
  1866. /* Z23-form, 3-register operands + CY field */
  1867. func AOP_Z23I(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
  1868. return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c&3)<<7
  1869. }
  1870. /* X-form, 3-register operands + EH field */
  1871. func AOP_RRRI(op uint32, d uint32, a uint32, b uint32, c uint32) uint32 {
  1872. return op | (d&31)<<21 | (a&31)<<16 | (b&31)<<11 | (c & 1)
  1873. }
  1874. func LOP_RRR(op uint32, a uint32, s uint32, b uint32) uint32 {
  1875. return op | (s&31)<<21 | (a&31)<<16 | (b&31)<<11
  1876. }
  1877. func LOP_IRR(op uint32, a uint32, s uint32, uimm uint32) uint32 {
  1878. return op | (s&31)<<21 | (a&31)<<16 | uimm&0xFFFF
  1879. }
  1880. func OP_BR(op uint32, li uint32, aa uint32) uint32 {
  1881. return op | li&0x03FFFFFC | aa<<1
  1882. }
  1883. func OP_BC(op uint32, bo uint32, bi uint32, bd uint32, aa uint32) uint32 {
  1884. return op | (bo&0x1F)<<21 | (bi&0x1F)<<16 | bd&0xFFFC | aa<<1
  1885. }
  1886. func OP_BCR(op uint32, bo uint32, bi uint32) uint32 {
  1887. return op | (bo&0x1F)<<21 | (bi&0x1F)<<16
  1888. }
  1889. func OP_RLW(op uint32, a uint32, s uint32, sh uint32, mb uint32, me uint32) uint32 {
  1890. return op | (s&31)<<21 | (a&31)<<16 | (sh&31)<<11 | (mb&31)<<6 | (me&31)<<1
  1891. }
  1892. func AOP_RLDIC(op uint32, a uint32, s uint32, sh uint32, m uint32) uint32 {
  1893. return op | (s&31)<<21 | (a&31)<<16 | (sh&31)<<11 | ((sh&32)>>5)<<1 | (m&31)<<6 | ((m&32)>>5)<<5
  1894. }
  1895. func AOP_ISEL(op uint32, t uint32, a uint32, b uint32, bc uint32) uint32 {
  1896. return op | (t&31)<<21 | (a&31)<<16 | (b&31)<<11 | (bc&0x1F)<<6
  1897. }
  1898. const (
  1899. /* each rhs is OPVCC(_, _, _, _) */
  1900. OP_ADD = 31<<26 | 266<<1 | 0<<10 | 0
  1901. OP_ADDI = 14<<26 | 0<<1 | 0<<10 | 0
  1902. OP_ADDIS = 15<<26 | 0<<1 | 0<<10 | 0
  1903. OP_ANDI = 28<<26 | 0<<1 | 0<<10 | 0
  1904. OP_EXTSB = 31<<26 | 954<<1 | 0<<10 | 0
  1905. OP_EXTSH = 31<<26 | 922<<1 | 0<<10 | 0
  1906. OP_EXTSW = 31<<26 | 986<<1 | 0<<10 | 0
  1907. OP_ISEL = 31<<26 | 15<<1 | 0<<10 | 0
  1908. OP_MCRF = 19<<26 | 0<<1 | 0<<10 | 0
  1909. OP_MCRFS = 63<<26 | 64<<1 | 0<<10 | 0
  1910. OP_MCRXR = 31<<26 | 512<<1 | 0<<10 | 0
  1911. OP_MFCR = 31<<26 | 19<<1 | 0<<10 | 0
  1912. OP_MFFS = 63<<26 | 583<<1 | 0<<10 | 0
  1913. OP_MFMSR = 31<<26 | 83<<1 | 0<<10 | 0
  1914. OP_MFSPR = 31<<26 | 339<<1 | 0<<10 | 0
  1915. OP_MFSR = 31<<26 | 595<<1 | 0<<10 | 0
  1916. OP_MFSRIN = 31<<26 | 659<<1 | 0<<10 | 0
  1917. OP_MTCRF = 31<<26 | 144<<1 | 0<<10 | 0
  1918. OP_MTFSF = 63<<26 | 711<<1 | 0<<10 | 0
  1919. OP_MTFSFI = 63<<26 | 134<<1 | 0<<10 | 0
  1920. OP_MTMSR = 31<<26 | 146<<1 | 0<<10 | 0
  1921. OP_MTMSRD = 31<<26 | 178<<1 | 0<<10 | 0
  1922. OP_MTSPR = 31<<26 | 467<<1 | 0<<10 | 0
  1923. OP_MTSR = 31<<26 | 210<<1 | 0<<10 | 0
  1924. OP_MTSRIN = 31<<26 | 242<<1 | 0<<10 | 0
  1925. OP_MULLW = 31<<26 | 235<<1 | 0<<10 | 0
  1926. OP_MULLD = 31<<26 | 233<<1 | 0<<10 | 0
  1927. OP_OR = 31<<26 | 444<<1 | 0<<10 | 0
  1928. OP_ORI = 24<<26 | 0<<1 | 0<<10 | 0
  1929. OP_ORIS = 25<<26 | 0<<1 | 0<<10 | 0
  1930. OP_RLWINM = 21<<26 | 0<<1 | 0<<10 | 0
  1931. OP_RLWNM = 23<<26 | 0<<1 | 0<<10 | 0
  1932. OP_SUBF = 31<<26 | 40<<1 | 0<<10 | 0
  1933. OP_RLDIC = 30<<26 | 4<<1 | 0<<10 | 0
  1934. OP_RLDICR = 30<<26 | 2<<1 | 0<<10 | 0
  1935. OP_RLDICL = 30<<26 | 0<<1 | 0<<10 | 0
  1936. OP_RLDCL = 30<<26 | 8<<1 | 0<<10 | 0
  1937. )
  1938. func oclass(a *obj.Addr) int {
  1939. return int(a.Class) - 1
  1940. }
  1941. const (
  1942. D_FORM = iota
  1943. DS_FORM
  1944. )
  1945. // This function determines when a non-indexed load or store is D or
  1946. // DS form for use in finding the size of the offset field in the instruction.
  1947. // The size is needed when setting the offset value in the instruction
  1948. // and when generating relocation for that field.
  1949. // DS form instructions include: ld, ldu, lwa, std, stdu. All other
  1950. // loads and stores with an offset field are D form. This function should
  1951. // only be called with the same opcodes as are handled by opstore and opload.
  1952. func (c *ctxt9) opform(insn uint32) int {
  1953. switch insn {
  1954. default:
  1955. c.ctxt.Diag("bad insn in loadform: %x", insn)
  1956. case OPVCC(58, 0, 0, 0), // ld
  1957. OPVCC(58, 0, 0, 1), // ldu
  1958. OPVCC(58, 0, 0, 0) | 1<<1, // lwa
  1959. OPVCC(62, 0, 0, 0), // std
  1960. OPVCC(62, 0, 0, 1): //stdu
  1961. return DS_FORM
  1962. case OP_ADDI, // add
  1963. OPVCC(32, 0, 0, 0), // lwz
  1964. OPVCC(33, 0, 0, 0), // lwzu
  1965. OPVCC(34, 0, 0, 0), // lbz
  1966. OPVCC(35, 0, 0, 0), // lbzu
  1967. OPVCC(40, 0, 0, 0), // lhz
  1968. OPVCC(41, 0, 0, 0), // lhzu
  1969. OPVCC(42, 0, 0, 0), // lha
  1970. OPVCC(43, 0, 0, 0), // lhau
  1971. OPVCC(46, 0, 0, 0), // lmw
  1972. OPVCC(48, 0, 0, 0), // lfs
  1973. OPVCC(49, 0, 0, 0), // lfsu
  1974. OPVCC(50, 0, 0, 0), // lfd
  1975. OPVCC(51, 0, 0, 0), // lfdu
  1976. OPVCC(36, 0, 0, 0), // stw
  1977. OPVCC(37, 0, 0, 0), // stwu
  1978. OPVCC(38, 0, 0, 0), // stb
  1979. OPVCC(39, 0, 0, 0), // stbu
  1980. OPVCC(44, 0, 0, 0), // sth
  1981. OPVCC(45, 0, 0, 0), // sthu
  1982. OPVCC(47, 0, 0, 0), // stmw
  1983. OPVCC(52, 0, 0, 0), // stfs
  1984. OPVCC(53, 0, 0, 0), // stfsu
  1985. OPVCC(54, 0, 0, 0), // stfd
  1986. OPVCC(55, 0, 0, 0): // stfdu
  1987. return D_FORM
  1988. }
  1989. return 0
  1990. }
  1991. // Encode instructions and create relocation for accessing s+d according to the
  1992. // instruction op with source or destination (as appropriate) register reg.
  1993. func (c *ctxt9) symbolAccess(s *obj.LSym, d int64, reg int16, op uint32) (o1, o2 uint32) {
  1994. if c.ctxt.Headtype == objabi.Haix {
  1995. // Every symbol access must be made via a TOC anchor.
  1996. c.ctxt.Diag("symbolAccess called for %s", s.Name)
  1997. }
  1998. var base uint32
  1999. form := c.opform(op)
  2000. if c.ctxt.Flag_shared {
  2001. base = REG_R2
  2002. } else {
  2003. base = REG_R0
  2004. }
  2005. o1 = AOP_IRR(OP_ADDIS, REGTMP, base, 0)
  2006. o2 = AOP_IRR(op, uint32(reg), REGTMP, 0)
  2007. rel := obj.Addrel(c.cursym)
  2008. rel.Off = int32(c.pc)
  2009. rel.Siz = 8
  2010. rel.Sym = s
  2011. rel.Add = d
  2012. if c.ctxt.Flag_shared {
  2013. switch form {
  2014. case D_FORM:
  2015. rel.Type = objabi.R_ADDRPOWER_TOCREL
  2016. case DS_FORM:
  2017. rel.Type = objabi.R_ADDRPOWER_TOCREL_DS
  2018. }
  2019. } else {
  2020. switch form {
  2021. case D_FORM:
  2022. rel.Type = objabi.R_ADDRPOWER
  2023. case DS_FORM:
  2024. rel.Type = objabi.R_ADDRPOWER_DS
  2025. }
  2026. }
  2027. return
  2028. }
  2029. /*
  2030. * 32-bit masks
  2031. */
  2032. func getmask(m []byte, v uint32) bool {
  2033. m[1] = 0
  2034. m[0] = m[1]
  2035. if v != ^uint32(0) && v&(1<<31) != 0 && v&1 != 0 { /* MB > ME */
  2036. if getmask(m, ^v) {
  2037. i := int(m[0])
  2038. m[0] = m[1] + 1
  2039. m[1] = byte(i - 1)
  2040. return true
  2041. }
  2042. return false
  2043. }
  2044. for i := 0; i < 32; i++ {
  2045. if v&(1<<uint(31-i)) != 0 {
  2046. m[0] = byte(i)
  2047. for {
  2048. m[1] = byte(i)
  2049. i++
  2050. if i >= 32 || v&(1<<uint(31-i)) == 0 {
  2051. break
  2052. }
  2053. }
  2054. for ; i < 32; i++ {
  2055. if v&(1<<uint(31-i)) != 0 {
  2056. return false
  2057. }
  2058. }
  2059. return true
  2060. }
  2061. }
  2062. return false
  2063. }
  2064. func (c *ctxt9) maskgen(p *obj.Prog, m []byte, v uint32) {
  2065. if !getmask(m, v) {
  2066. c.ctxt.Diag("cannot generate mask #%x\n%v", v, p)
  2067. }
  2068. }
  2069. /*
  2070. * 64-bit masks (rldic etc)
  2071. */
  2072. func getmask64(m []byte, v uint64) bool {
  2073. m[1] = 0
  2074. m[0] = m[1]
  2075. for i := 0; i < 64; i++ {
  2076. if v&(uint64(1)<<uint(63-i)) != 0 {
  2077. m[0] = byte(i)
  2078. for {
  2079. m[1] = byte(i)
  2080. i++
  2081. if i >= 64 || v&(uint64(1)<<uint(63-i)) == 0 {
  2082. break
  2083. }
  2084. }
  2085. for ; i < 64; i++ {
  2086. if v&(uint64(1)<<uint(63-i)) != 0 {
  2087. return false
  2088. }
  2089. }
  2090. return true
  2091. }
  2092. }
  2093. return false
  2094. }
  2095. func (c *ctxt9) maskgen64(p *obj.Prog, m []byte, v uint64) {
  2096. if !getmask64(m, v) {
  2097. c.ctxt.Diag("cannot generate mask #%x\n%v", v, p)
  2098. }
  2099. }
  2100. func loadu32(r int, d int64) uint32 {
  2101. v := int32(d >> 16)
  2102. if isuint32(uint64(d)) {
  2103. return LOP_IRR(OP_ORIS, uint32(r), REGZERO, uint32(v))
  2104. }
  2105. return AOP_IRR(OP_ADDIS, uint32(r), REGZERO, uint32(v))
  2106. }
  2107. func high16adjusted(d int32) uint16 {
  2108. if d&0x8000 != 0 {
  2109. return uint16((d >> 16) + 1)
  2110. }
  2111. return uint16(d >> 16)
  2112. }
  2113. func (c *ctxt9) asmout(p *obj.Prog, o *Optab, out []uint32) {
  2114. o1 := uint32(0)
  2115. o2 := uint32(0)
  2116. o3 := uint32(0)
  2117. o4 := uint32(0)
  2118. o5 := uint32(0)
  2119. //print("%v => case %d\n", p, o->type);
  2120. switch o.type_ {
  2121. default:
  2122. c.ctxt.Diag("unknown type %d", o.type_)
  2123. prasm(p)
  2124. case 0: /* pseudo ops */
  2125. break
  2126. case 1: /* mov r1,r2 ==> OR Rs,Rs,Ra */
  2127. if p.To.Reg == REGZERO && p.From.Type == obj.TYPE_CONST {
  2128. v := c.regoff(&p.From)
  2129. if r0iszero != 0 /*TypeKind(100016)*/ && v != 0 {
  2130. //nerrors--;
  2131. c.ctxt.Diag("literal operation on R0\n%v", p)
  2132. }
  2133. o1 = LOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(v))
  2134. break
  2135. }
  2136. o1 = LOP_RRR(OP_OR, uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.From.Reg))
  2137. case 2: /* int/cr/fp op Rb,[Ra],Rd */
  2138. r := int(p.Reg)
  2139. if r == 0 {
  2140. r = int(p.To.Reg)
  2141. }
  2142. o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
  2143. case 3: /* mov $soreg/addcon/andcon/ucon, r ==> addis/oris/addi/ori $i,reg',r */
  2144. d := c.vregoff(&p.From)
  2145. v := int32(d)
  2146. r := int(p.From.Reg)
  2147. if r == 0 {
  2148. r = int(o.param)
  2149. }
  2150. if r0iszero != 0 /*TypeKind(100016)*/ && p.To.Reg == 0 && (r != 0 || v != 0) {
  2151. c.ctxt.Diag("literal operation on R0\n%v", p)
  2152. }
  2153. a := OP_ADDI
  2154. if o.a1 == C_UCON {
  2155. if d&0xffff != 0 {
  2156. log.Fatalf("invalid handling of %v", p)
  2157. }
  2158. // For UCON operands the value is right shifted 16, using ADDIS if the
  2159. // value should be signed, ORIS if unsigned.
  2160. v >>= 16
  2161. if r == REGZERO && isuint32(uint64(d)) {
  2162. o1 = LOP_IRR(OP_ORIS, uint32(p.To.Reg), REGZERO, uint32(v))
  2163. break
  2164. }
  2165. a = OP_ADDIS
  2166. } else if int64(int16(d)) != d {
  2167. // Operand is 16 bit value with sign bit set
  2168. if o.a1 == C_ANDCON {
  2169. // Needs unsigned 16 bit so use ORI
  2170. if r == 0 || r == REGZERO {
  2171. o1 = LOP_IRR(uint32(OP_ORI), uint32(p.To.Reg), uint32(0), uint32(v))
  2172. break
  2173. }
  2174. // With ADDCON, needs signed 16 bit value, fall through to use ADDI
  2175. } else if o.a1 != C_ADDCON {
  2176. log.Fatalf("invalid handling of %v", p)
  2177. }
  2178. }
  2179. o1 = AOP_IRR(uint32(a), uint32(p.To.Reg), uint32(r), uint32(v))
  2180. case 4: /* add/mul $scon,[r1],r2 */
  2181. v := c.regoff(&p.From)
  2182. r := int(p.Reg)
  2183. if r == 0 {
  2184. r = int(p.To.Reg)
  2185. }
  2186. if r0iszero != 0 /*TypeKind(100016)*/ && p.To.Reg == 0 {
  2187. c.ctxt.Diag("literal operation on R0\n%v", p)
  2188. }
  2189. if int32(int16(v)) != v {
  2190. log.Fatalf("mishandled instruction %v", p)
  2191. }
  2192. o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
  2193. case 5: /* syscall */
  2194. o1 = c.oprrr(p.As)
  2195. case 6: /* logical op Rb,[Rs,]Ra; no literal */
  2196. r := int(p.Reg)
  2197. if r == 0 {
  2198. r = int(p.To.Reg)
  2199. }
  2200. // AROTL and AROTLW are extended mnemonics, which map to RLDCL and RLWNM.
  2201. switch p.As {
  2202. case AROTL:
  2203. o1 = AOP_RLDIC(OP_RLDCL, uint32(p.To.Reg), uint32(r), uint32(p.From.Reg), uint32(0))
  2204. case AROTLW:
  2205. o1 = OP_RLW(OP_RLWNM, uint32(p.To.Reg), uint32(r), uint32(p.From.Reg), 0, 31)
  2206. default:
  2207. o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
  2208. }
  2209. case 7: /* mov r, soreg ==> stw o(r) */
  2210. r := int(p.To.Reg)
  2211. if r == 0 {
  2212. r = int(o.param)
  2213. }
  2214. v := c.regoff(&p.To)
  2215. if p.To.Type == obj.TYPE_MEM && p.To.Index != 0 {
  2216. if v != 0 {
  2217. c.ctxt.Diag("illegal indexed instruction\n%v", p)
  2218. }
  2219. if c.ctxt.Flag_shared && r == REG_R13 {
  2220. rel := obj.Addrel(c.cursym)
  2221. rel.Off = int32(c.pc)
  2222. rel.Siz = 4
  2223. // This (and the matching part in the load case
  2224. // below) are the only places in the ppc64 toolchain
  2225. // that knows the name of the tls variable. Possibly
  2226. // we could add some assembly syntax so that the name
  2227. // of the variable does not have to be assumed.
  2228. rel.Sym = c.ctxt.Lookup("runtime.tls_g")
  2229. rel.Type = objabi.R_POWER_TLS
  2230. }
  2231. o1 = AOP_RRR(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(r))
  2232. } else {
  2233. if int32(int16(v)) != v {
  2234. log.Fatalf("mishandled instruction %v", p)
  2235. }
  2236. // Offsets in DS form stores must be a multiple of 4
  2237. inst := c.opstore(p.As)
  2238. if c.opform(inst) == DS_FORM && v&0x3 != 0 {
  2239. log.Fatalf("invalid offset for DS form load/store %v", p)
  2240. }
  2241. o1 = AOP_IRR(inst, uint32(p.From.Reg), uint32(r), uint32(v))
  2242. }
  2243. case 8: /* mov soreg, r ==> lbz/lhz/lwz o(r) */
  2244. r := int(p.From.Reg)
  2245. if r == 0 {
  2246. r = int(o.param)
  2247. }
  2248. v := c.regoff(&p.From)
  2249. if p.From.Type == obj.TYPE_MEM && p.From.Index != 0 {
  2250. if v != 0 {
  2251. c.ctxt.Diag("illegal indexed instruction\n%v", p)
  2252. }
  2253. if c.ctxt.Flag_shared && r == REG_R13 {
  2254. rel := obj.Addrel(c.cursym)
  2255. rel.Off = int32(c.pc)
  2256. rel.Siz = 4
  2257. rel.Sym = c.ctxt.Lookup("runtime.tls_g")
  2258. rel.Type = objabi.R_POWER_TLS
  2259. }
  2260. o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(r))
  2261. } else {
  2262. if int32(int16(v)) != v {
  2263. log.Fatalf("mishandled instruction %v", p)
  2264. }
  2265. // Offsets in DS form loads must be a multiple of 4
  2266. inst := c.opload(p.As)
  2267. if c.opform(inst) == DS_FORM && v&0x3 != 0 {
  2268. log.Fatalf("invalid offset for DS form load/store %v", p)
  2269. }
  2270. o1 = AOP_IRR(inst, uint32(p.To.Reg), uint32(r), uint32(v))
  2271. }
  2272. case 9: /* movb soreg, r ==> lbz o(r),r2; extsb r2,r2 */
  2273. r := int(p.From.Reg)
  2274. if r == 0 {
  2275. r = int(o.param)
  2276. }
  2277. v := c.regoff(&p.From)
  2278. if p.From.Type == obj.TYPE_MEM && p.From.Index != 0 {
  2279. if v != 0 {
  2280. c.ctxt.Diag("illegal indexed instruction\n%v", p)
  2281. }
  2282. o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(r))
  2283. } else {
  2284. o1 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
  2285. }
  2286. o2 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
  2287. case 10: /* sub Ra,[Rb],Rd => subf Rd,Ra,Rb */
  2288. r := int(p.Reg)
  2289. if r == 0 {
  2290. r = int(p.To.Reg)
  2291. }
  2292. o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(r))
  2293. case 11: /* br/bl lbra */
  2294. v := int32(0)
  2295. if p.To.Target() != nil {
  2296. v = int32(p.To.Target().Pc - p.Pc)
  2297. if v&03 != 0 {
  2298. c.ctxt.Diag("odd branch target address\n%v", p)
  2299. v &^= 03
  2300. }
  2301. if v < -(1<<25) || v >= 1<<24 {
  2302. c.ctxt.Diag("branch too far\n%v", p)
  2303. }
  2304. }
  2305. o1 = OP_BR(c.opirr(p.As), uint32(v), 0)
  2306. if p.To.Sym != nil {
  2307. rel := obj.Addrel(c.cursym)
  2308. rel.Off = int32(c.pc)
  2309. rel.Siz = 4
  2310. rel.Sym = p.To.Sym
  2311. v += int32(p.To.Offset)
  2312. if v&03 != 0 {
  2313. c.ctxt.Diag("odd branch target address\n%v", p)
  2314. v &^= 03
  2315. }
  2316. rel.Add = int64(v)
  2317. rel.Type = objabi.R_CALLPOWER
  2318. }
  2319. o2 = 0x60000000 // nop, sometimes overwritten by ld r2, 24(r1) when dynamic linking
  2320. case 12: /* movb r,r (extsb); movw r,r (extsw) */
  2321. if p.To.Reg == REGZERO && p.From.Type == obj.TYPE_CONST {
  2322. v := c.regoff(&p.From)
  2323. if r0iszero != 0 /*TypeKind(100016)*/ && v != 0 {
  2324. c.ctxt.Diag("literal operation on R0\n%v", p)
  2325. }
  2326. o1 = LOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(v))
  2327. break
  2328. }
  2329. if p.As == AMOVW {
  2330. o1 = LOP_RRR(OP_EXTSW, uint32(p.To.Reg), uint32(p.From.Reg), 0)
  2331. } else {
  2332. o1 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.From.Reg), 0)
  2333. }
  2334. case 13: /* mov[bhw]z r,r; uses rlwinm not andi. to avoid changing CC */
  2335. if p.As == AMOVBZ {
  2336. o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.From.Reg), 0, 24, 31)
  2337. } else if p.As == AMOVH {
  2338. o1 = LOP_RRR(OP_EXTSH, uint32(p.To.Reg), uint32(p.From.Reg), 0)
  2339. } else if p.As == AMOVHZ {
  2340. o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.From.Reg), 0, 16, 31)
  2341. } else if p.As == AMOVWZ {
  2342. o1 = OP_RLW(OP_RLDIC, uint32(p.To.Reg), uint32(p.From.Reg), 0, 0, 0) | 1<<5 /* MB=32 */
  2343. } else {
  2344. c.ctxt.Diag("internal: bad mov[bhw]z\n%v", p)
  2345. }
  2346. case 14: /* rldc[lr] Rb,Rs,$mask,Ra -- left, right give different masks */
  2347. r := int(p.Reg)
  2348. if r == 0 {
  2349. r = int(p.To.Reg)
  2350. }
  2351. d := c.vregoff(p.GetFrom3())
  2352. var a int
  2353. switch p.As {
  2354. // These opcodes expect a mask operand that has to be converted into the
  2355. // appropriate operand. The way these were defined, not all valid masks are possible.
  2356. // Left here for compatibility in case they were used or generated.
  2357. case ARLDCL, ARLDCLCC:
  2358. var mask [2]uint8
  2359. c.maskgen64(p, mask[:], uint64(d))
  2360. a = int(mask[0]) /* MB */
  2361. if mask[1] != 63 {
  2362. c.ctxt.Diag("invalid mask for rotate: %x (end != bit 63)\n%v", uint64(d), p)
  2363. }
  2364. o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
  2365. o1 |= (uint32(a) & 31) << 6
  2366. if a&0x20 != 0 {
  2367. o1 |= 1 << 5 /* mb[5] is top bit */
  2368. }
  2369. case ARLDCR, ARLDCRCC:
  2370. var mask [2]uint8
  2371. c.maskgen64(p, mask[:], uint64(d))
  2372. a = int(mask[1]) /* ME */
  2373. if mask[0] != 0 {
  2374. c.ctxt.Diag("invalid mask for rotate: %x %x (start != 0)\n%v", uint64(d), mask[0], p)
  2375. }
  2376. o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg))
  2377. o1 |= (uint32(a) & 31) << 6
  2378. if a&0x20 != 0 {
  2379. o1 |= 1 << 5 /* mb[5] is top bit */
  2380. }
  2381. // These opcodes use a shift count like the ppc64 asm, no mask conversion done
  2382. case ARLDICR, ARLDICRCC:
  2383. me := int(d)
  2384. sh := c.regoff(&p.From)
  2385. if me < 0 || me > 63 || sh > 63 {
  2386. c.ctxt.Diag("Invalid me or sh for RLDICR: %x %x\n%v", int(d), sh)
  2387. }
  2388. o1 = AOP_RLDIC(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(sh), uint32(me))
  2389. case ARLDICL, ARLDICLCC, ARLDIC, ARLDICCC:
  2390. mb := int(d)
  2391. sh := c.regoff(&p.From)
  2392. if mb < 0 || mb > 63 || sh > 63 {
  2393. c.ctxt.Diag("Invalid mb or sh for RLDIC, RLDICL: %x %x\n%v", mb, sh)
  2394. }
  2395. o1 = AOP_RLDIC(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), uint32(sh), uint32(mb))
  2396. case ACLRLSLDI:
  2397. // This is an extended mnemonic defined in the ISA section C.8.1
  2398. // clrlsldi ra,rs,n,b --> rldic ra,rs,n,b-n
  2399. // It maps onto RLDIC so is directly generated here based on the operands from
  2400. // the clrlsldi.
  2401. b := int(d)
  2402. n := c.regoff(&p.From)
  2403. if n > int32(b) || b > 63 {
  2404. c.ctxt.Diag("Invalid n or b for CLRLSLDI: %x %x\n%v", n, b)
  2405. }
  2406. o1 = AOP_RLDIC(OP_RLDIC, uint32(p.To.Reg), uint32(r), uint32(n), uint32(b)-uint32(n))
  2407. default:
  2408. c.ctxt.Diag("unexpected op in rldc case\n%v", p)
  2409. a = 0
  2410. }
  2411. case 17, /* bc bo,bi,lbra (same for now) */
  2412. 16: /* bc bo,bi,sbra */
  2413. a := 0
  2414. r := int(p.Reg)
  2415. if p.From.Type == obj.TYPE_CONST {
  2416. a = int(c.regoff(&p.From))
  2417. } else if p.From.Type == obj.TYPE_REG {
  2418. if r != 0 {
  2419. c.ctxt.Diag("unexpected register setting for branch with CR: %d\n", r)
  2420. }
  2421. // BI values for the CR
  2422. switch p.From.Reg {
  2423. case REG_CR0:
  2424. r = BI_CR0
  2425. case REG_CR1:
  2426. r = BI_CR1
  2427. case REG_CR2:
  2428. r = BI_CR2
  2429. case REG_CR3:
  2430. r = BI_CR3
  2431. case REG_CR4:
  2432. r = BI_CR4
  2433. case REG_CR5:
  2434. r = BI_CR5
  2435. case REG_CR6:
  2436. r = BI_CR6
  2437. case REG_CR7:
  2438. r = BI_CR7
  2439. default:
  2440. c.ctxt.Diag("unrecognized register: expecting CR\n")
  2441. }
  2442. }
  2443. v := int32(0)
  2444. if p.To.Target() != nil {
  2445. v = int32(p.To.Target().Pc - p.Pc)
  2446. }
  2447. if v&03 != 0 {
  2448. c.ctxt.Diag("odd branch target address\n%v", p)
  2449. v &^= 03
  2450. }
  2451. if v < -(1<<16) || v >= 1<<15 {
  2452. c.ctxt.Diag("branch too far\n%v", p)
  2453. }
  2454. o1 = OP_BC(c.opirr(p.As), uint32(a), uint32(r), uint32(v), 0)
  2455. case 15: /* br/bl (r) => mov r,lr; br/bl (lr) */
  2456. var v int32
  2457. if p.As == ABC || p.As == ABCL {
  2458. v = c.regoff(&p.To) & 31
  2459. } else {
  2460. v = 20 /* unconditional */
  2461. }
  2462. o1 = AOP_RRR(OP_MTSPR, uint32(p.To.Reg), 0, 0) | (REG_LR&0x1f)<<16 | ((REG_LR>>5)&0x1f)<<11
  2463. o2 = OPVCC(19, 16, 0, 0)
  2464. if p.As == ABL || p.As == ABCL {
  2465. o2 |= 1
  2466. }
  2467. o2 = OP_BCR(o2, uint32(v), uint32(p.To.Index))
  2468. case 18: /* br/bl (lr/ctr); bc/bcl bo,bi,(lr/ctr) */
  2469. var v int32
  2470. if p.As == ABC || p.As == ABCL {
  2471. v = c.regoff(&p.From) & 31
  2472. } else {
  2473. v = 20 /* unconditional */
  2474. }
  2475. r := int(p.Reg)
  2476. if r == 0 {
  2477. r = 0
  2478. }
  2479. switch oclass(&p.To) {
  2480. case C_CTR:
  2481. o1 = OPVCC(19, 528, 0, 0)
  2482. case C_LR:
  2483. o1 = OPVCC(19, 16, 0, 0)
  2484. default:
  2485. c.ctxt.Diag("bad optab entry (18): %d\n%v", p.To.Class, p)
  2486. v = 0
  2487. }
  2488. if p.As == ABL || p.As == ABCL {
  2489. o1 |= 1
  2490. }
  2491. o1 = OP_BCR(o1, uint32(v), uint32(r))
  2492. case 19: /* mov $lcon,r ==> cau+or */
  2493. d := c.vregoff(&p.From)
  2494. if p.From.Sym == nil {
  2495. o1 = loadu32(int(p.To.Reg), d)
  2496. o2 = LOP_IRR(OP_ORI, uint32(p.To.Reg), uint32(p.To.Reg), uint32(int32(d)))
  2497. } else {
  2498. o1, o2 = c.symbolAccess(p.From.Sym, d, p.To.Reg, OP_ADDI)
  2499. }
  2500. case 20: /* add $ucon,,r | addis $addcon,r,r */
  2501. v := c.regoff(&p.From)
  2502. r := int(p.Reg)
  2503. if r == 0 {
  2504. r = int(p.To.Reg)
  2505. }
  2506. if p.As == AADD && (r0iszero == 0 /*TypeKind(100016)*/ && p.Reg == 0 || r0iszero != 0 /*TypeKind(100016)*/ && p.To.Reg == 0) {
  2507. c.ctxt.Diag("literal operation on R0\n%v", p)
  2508. }
  2509. if p.As == AADDIS {
  2510. o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
  2511. } else {
  2512. o1 = AOP_IRR(c.opirr(AADDIS), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
  2513. }
  2514. case 22: /* add $lcon/$andcon,r1,r2 ==> oris+ori+add/ori+add */
  2515. if p.To.Reg == REGTMP || p.Reg == REGTMP {
  2516. c.ctxt.Diag("can't synthesize large constant\n%v", p)
  2517. }
  2518. d := c.vregoff(&p.From)
  2519. r := int(p.Reg)
  2520. if r == 0 {
  2521. r = int(p.To.Reg)
  2522. }
  2523. if p.From.Sym != nil {
  2524. c.ctxt.Diag("%v is not supported", p)
  2525. }
  2526. // If operand is ANDCON, generate 2 instructions using
  2527. // ORI for unsigned value; with LCON 3 instructions.
  2528. if o.size == 8 {
  2529. o1 = LOP_IRR(OP_ORI, REGTMP, REGZERO, uint32(int32(d)))
  2530. o2 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
  2531. } else {
  2532. o1 = loadu32(REGTMP, d)
  2533. o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(int32(d)))
  2534. o3 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
  2535. }
  2536. case 23: /* and $lcon/$addcon,r1,r2 ==> oris+ori+and/addi+and */
  2537. if p.To.Reg == REGTMP || p.Reg == REGTMP {
  2538. c.ctxt.Diag("can't synthesize large constant\n%v", p)
  2539. }
  2540. d := c.vregoff(&p.From)
  2541. r := int(p.Reg)
  2542. if r == 0 {
  2543. r = int(p.To.Reg)
  2544. }
  2545. // With ADDCON operand, generate 2 instructions using ADDI for signed value,
  2546. // with LCON operand generate 3 instructions.
  2547. if o.size == 8 {
  2548. o1 = LOP_IRR(OP_ADDI, REGZERO, REGTMP, uint32(int32(d)))
  2549. o2 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
  2550. } else {
  2551. o1 = loadu32(REGTMP, d)
  2552. o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(int32(d)))
  2553. o3 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), REGTMP, uint32(r))
  2554. }
  2555. if p.From.Sym != nil {
  2556. c.ctxt.Diag("%v is not supported", p)
  2557. }
  2558. case 24: /* lfd fA,float64(0) -> xxlxor xsA,xsaA,xsaA + fneg for -0 */
  2559. o1 = AOP_XX3I(c.oprrr(AXXLXOR), uint32(p.To.Reg), uint32(p.To.Reg), uint32(p.To.Reg), uint32(0))
  2560. // This is needed for -0.
  2561. if o.size == 8 {
  2562. o2 = AOP_RRR(c.oprrr(AFNEG), uint32(p.To.Reg), 0, uint32(p.To.Reg))
  2563. }
  2564. case 25:
  2565. /* sld[.] $sh,rS,rA -> rldicr[.] $sh,rS,mask(0,63-sh),rA; srd[.] -> rldicl */
  2566. v := c.regoff(&p.From)
  2567. if v < 0 {
  2568. v = 0
  2569. } else if v > 63 {
  2570. v = 63
  2571. }
  2572. r := int(p.Reg)
  2573. if r == 0 {
  2574. r = int(p.To.Reg)
  2575. }
  2576. var a int
  2577. op := uint32(0)
  2578. switch p.As {
  2579. case ASLD, ASLDCC:
  2580. a = int(63 - v)
  2581. op = OP_RLDICR
  2582. case ASRD, ASRDCC:
  2583. a = int(v)
  2584. v = 64 - v
  2585. op = OP_RLDICL
  2586. case AROTL:
  2587. a = int(0)
  2588. op = OP_RLDICL
  2589. default:
  2590. c.ctxt.Diag("unexpected op in sldi case\n%v", p)
  2591. a = 0
  2592. o1 = 0
  2593. }
  2594. o1 = AOP_RLDIC(op, uint32(p.To.Reg), uint32(r), uint32(v), uint32(a))
  2595. if p.As == ASLDCC || p.As == ASRDCC {
  2596. o1 |= 1 // Set the condition code bit
  2597. }
  2598. case 26: /* mov $lsext/auto/oreg,,r2 ==> addis+addi */
  2599. if p.To.Reg == REGTMP {
  2600. c.ctxt.Diag("can't synthesize large constant\n%v", p)
  2601. }
  2602. v := c.regoff(&p.From)
  2603. r := int(p.From.Reg)
  2604. if r == 0 {
  2605. r = int(o.param)
  2606. }
  2607. o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
  2608. o2 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), REGTMP, uint32(v))
  2609. case 27: /* subc ra,$simm,rd => subfic rd,ra,$simm */
  2610. v := c.regoff(p.GetFrom3())
  2611. r := int(p.From.Reg)
  2612. o1 = AOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
  2613. case 28: /* subc r1,$lcon,r2 ==> cau+or+subfc */
  2614. if p.To.Reg == REGTMP || p.From.Reg == REGTMP {
  2615. c.ctxt.Diag("can't synthesize large constant\n%v", p)
  2616. }
  2617. v := c.regoff(p.GetFrom3())
  2618. o1 = AOP_IRR(OP_ADDIS, REGTMP, REGZERO, uint32(v)>>16)
  2619. o2 = LOP_IRR(OP_ORI, REGTMP, REGTMP, uint32(v))
  2620. o3 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), REGTMP)
  2621. if p.From.Sym != nil {
  2622. c.ctxt.Diag("%v is not supported", p)
  2623. }
  2624. case 29: /* rldic[lr]? $sh,s,$mask,a -- left, right, plain give different masks */
  2625. v := c.regoff(&p.From)
  2626. d := c.vregoff(p.GetFrom3())
  2627. var mask [2]uint8
  2628. c.maskgen64(p, mask[:], uint64(d))
  2629. var a int
  2630. switch p.As {
  2631. case ARLDC, ARLDCCC:
  2632. a = int(mask[0]) /* MB */
  2633. if int32(mask[1]) != (63 - v) {
  2634. c.ctxt.Diag("invalid mask for shift: %x %x (shift %d)\n%v", uint64(d), mask[1], v, p)
  2635. }
  2636. case ARLDCL, ARLDCLCC:
  2637. a = int(mask[0]) /* MB */
  2638. if mask[1] != 63 {
  2639. c.ctxt.Diag("invalid mask for shift: %x %s (shift %d)\n%v", uint64(d), mask[1], v, p)
  2640. }
  2641. case ARLDCR, ARLDCRCC:
  2642. a = int(mask[1]) /* ME */
  2643. if mask[0] != 0 {
  2644. c.ctxt.Diag("invalid mask for shift: %x %x (shift %d)\n%v", uint64(d), mask[0], v, p)
  2645. }
  2646. default:
  2647. c.ctxt.Diag("unexpected op in rldic case\n%v", p)
  2648. a = 0
  2649. }
  2650. o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
  2651. o1 |= (uint32(a) & 31) << 6
  2652. if v&0x20 != 0 {
  2653. o1 |= 1 << 1
  2654. }
  2655. if a&0x20 != 0 {
  2656. o1 |= 1 << 5 /* mb[5] is top bit */
  2657. }
  2658. case 30: /* rldimi $sh,s,$mask,a */
  2659. v := c.regoff(&p.From)
  2660. d := c.vregoff(p.GetFrom3())
  2661. // Original opcodes had mask operands which had to be converted to a shift count as expected by
  2662. // the ppc64 asm.
  2663. switch p.As {
  2664. case ARLDMI, ARLDMICC:
  2665. var mask [2]uint8
  2666. c.maskgen64(p, mask[:], uint64(d))
  2667. if int32(mask[1]) != (63 - v) {
  2668. c.ctxt.Diag("invalid mask for shift: %x %x (shift %d)\n%v", uint64(d), mask[1], v, p)
  2669. }
  2670. o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
  2671. o1 |= (uint32(mask[0]) & 31) << 6
  2672. if v&0x20 != 0 {
  2673. o1 |= 1 << 1
  2674. }
  2675. if mask[0]&0x20 != 0 {
  2676. o1 |= 1 << 5 /* mb[5] is top bit */
  2677. }
  2678. // Opcodes with shift count operands.
  2679. case ARLDIMI, ARLDIMICC:
  2680. o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), (uint32(v) & 0x1F))
  2681. o1 |= (uint32(d) & 31) << 6
  2682. if d&0x20 != 0 {
  2683. o1 |= 1 << 5
  2684. }
  2685. if v&0x20 != 0 {
  2686. o1 |= 1 << 1
  2687. }
  2688. }
  2689. case 31: /* dword */
  2690. d := c.vregoff(&p.From)
  2691. if c.ctxt.Arch.ByteOrder == binary.BigEndian {
  2692. o1 = uint32(d >> 32)
  2693. o2 = uint32(d)
  2694. } else {
  2695. o1 = uint32(d)
  2696. o2 = uint32(d >> 32)
  2697. }
  2698. if p.From.Sym != nil {
  2699. rel := obj.Addrel(c.cursym)
  2700. rel.Off = int32(c.pc)
  2701. rel.Siz = 8
  2702. rel.Sym = p.From.Sym
  2703. rel.Add = p.From.Offset
  2704. rel.Type = objabi.R_ADDR
  2705. o2 = 0
  2706. o1 = o2
  2707. }
  2708. case 32: /* fmul frc,fra,frd */
  2709. r := int(p.Reg)
  2710. if r == 0 {
  2711. r = int(p.To.Reg)
  2712. }
  2713. o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0) | (uint32(p.From.Reg)&31)<<6
  2714. case 33: /* fabs [frb,]frd; fmr. frb,frd */
  2715. r := int(p.From.Reg)
  2716. if oclass(&p.From) == C_NONE {
  2717. r = int(p.To.Reg)
  2718. }
  2719. o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), 0, uint32(r))
  2720. case 34: /* FMADDx fra,frb,frc,frt (t=a*c±b) */
  2721. o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg)) | (uint32(p.GetFrom3().Reg)&31)<<6
  2722. case 35: /* mov r,lext/lauto/loreg ==> cau $(v>>16),sb,r'; store o(r') */
  2723. v := c.regoff(&p.To)
  2724. r := int(p.To.Reg)
  2725. if r == 0 {
  2726. r = int(o.param)
  2727. }
  2728. // Offsets in DS form stores must be a multiple of 4
  2729. inst := c.opstore(p.As)
  2730. if c.opform(inst) == DS_FORM && v&0x3 != 0 {
  2731. log.Fatalf("invalid offset for DS form load/store %v", p)
  2732. }
  2733. o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
  2734. o2 = AOP_IRR(inst, uint32(p.From.Reg), REGTMP, uint32(v))
  2735. case 36: /* mov bz/h/hz lext/lauto/lreg,r ==> lbz/lha/lhz etc */
  2736. v := c.regoff(&p.From)
  2737. r := int(p.From.Reg)
  2738. if r == 0 {
  2739. r = int(o.param)
  2740. }
  2741. o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
  2742. o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), REGTMP, uint32(v))
  2743. case 37: /* movb lext/lauto/lreg,r ==> lbz o(reg),r; extsb r */
  2744. v := c.regoff(&p.From)
  2745. r := int(p.From.Reg)
  2746. if r == 0 {
  2747. r = int(o.param)
  2748. }
  2749. o1 = AOP_IRR(OP_ADDIS, REGTMP, uint32(r), uint32(high16adjusted(v)))
  2750. o2 = AOP_IRR(c.opload(p.As), uint32(p.To.Reg), REGTMP, uint32(v))
  2751. o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
  2752. case 40: /* word */
  2753. o1 = uint32(c.regoff(&p.From))
  2754. case 41: /* stswi */
  2755. o1 = AOP_RRR(c.opirr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), 0) | (uint32(c.regoff(p.GetFrom3()))&0x7F)<<11
  2756. case 42: /* lswi */
  2757. o1 = AOP_RRR(c.opirr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), 0) | (uint32(c.regoff(p.GetFrom3()))&0x7F)<<11
  2758. case 43: /* data cache instructions: op (Ra+[Rb]), [th|l] */
  2759. /* TH field for dcbt/dcbtst: */
  2760. /* 0 = Block access - program will soon access EA. */
  2761. /* 8-15 = Stream access - sequence of access (data stream). See section 4.3.2 of the ISA for details. */
  2762. /* 16 = Block access - program will soon make a transient access to EA. */
  2763. /* 17 = Block access - program will not access EA for a long time. */
  2764. /* L field for dcbf: */
  2765. /* 0 = invalidates the block containing EA in all processors. */
  2766. /* 1 = same as 0, but with limited scope (i.e. block in the current processor will not be reused soon). */
  2767. /* 3 = same as 1, but with even more limited scope (i.e. block in the current processor primary cache will not be reused soon). */
  2768. if p.To.Type == obj.TYPE_NONE {
  2769. o1 = AOP_RRR(c.oprrr(p.As), 0, uint32(p.From.Index), uint32(p.From.Reg))
  2770. } else {
  2771. th := c.regoff(&p.To)
  2772. o1 = AOP_RRR(c.oprrr(p.As), uint32(th), uint32(p.From.Index), uint32(p.From.Reg))
  2773. }
  2774. case 44: /* indexed store */
  2775. o1 = AOP_RRR(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(p.To.Reg))
  2776. case 45: /* indexed load */
  2777. switch p.As {
  2778. /* The assembler accepts a 4-operand l*arx instruction. The fourth operand is an Exclusive Access Hint (EH) */
  2779. /* The EH field can be used as a lock acquire/release hint as follows: */
  2780. /* 0 = Atomic Update (fetch-and-operate or similar algorithm) */
  2781. /* 1 = Exclusive Access (lock acquire and release) */
  2782. case ALBAR, ALHAR, ALWAR, ALDAR:
  2783. if p.From3Type() != obj.TYPE_NONE {
  2784. eh := int(c.regoff(p.GetFrom3()))
  2785. if eh > 1 {
  2786. c.ctxt.Diag("illegal EH field\n%v", p)
  2787. }
  2788. o1 = AOP_RRRI(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg), uint32(eh))
  2789. } else {
  2790. o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
  2791. }
  2792. default:
  2793. o1 = AOP_RRR(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
  2794. }
  2795. case 46: /* plain op */
  2796. o1 = c.oprrr(p.As)
  2797. case 47: /* op Ra, Rd; also op [Ra,] Rd */
  2798. r := int(p.From.Reg)
  2799. if r == 0 {
  2800. r = int(p.To.Reg)
  2801. }
  2802. o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0)
  2803. case 48: /* op Rs, Ra */
  2804. r := int(p.From.Reg)
  2805. if r == 0 {
  2806. r = int(p.To.Reg)
  2807. }
  2808. o1 = LOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(r), 0)
  2809. case 49: /* op Rb; op $n, Rb */
  2810. if p.From.Type != obj.TYPE_REG { /* tlbie $L, rB */
  2811. v := c.regoff(&p.From) & 1
  2812. o1 = AOP_RRR(c.oprrr(p.As), 0, 0, uint32(p.To.Reg)) | uint32(v)<<21
  2813. } else {
  2814. o1 = AOP_RRR(c.oprrr(p.As), 0, 0, uint32(p.From.Reg))
  2815. }
  2816. case 50: /* rem[u] r1[,r2],r3 */
  2817. r := int(p.Reg)
  2818. if r == 0 {
  2819. r = int(p.To.Reg)
  2820. }
  2821. v := c.oprrr(p.As)
  2822. t := v & (1<<10 | 1) /* OE|Rc */
  2823. o1 = AOP_RRR(v&^t, REGTMP, uint32(r), uint32(p.From.Reg))
  2824. o2 = AOP_RRR(OP_MULLW, REGTMP, REGTMP, uint32(p.From.Reg))
  2825. o3 = AOP_RRR(OP_SUBF|t, uint32(p.To.Reg), REGTMP, uint32(r))
  2826. if p.As == AREMU {
  2827. o4 = o3
  2828. /* Clear top 32 bits */
  2829. o3 = OP_RLW(OP_RLDIC, REGTMP, REGTMP, 0, 0, 0) | 1<<5
  2830. }
  2831. case 51: /* remd[u] r1[,r2],r3 */
  2832. r := int(p.Reg)
  2833. if r == 0 {
  2834. r = int(p.To.Reg)
  2835. }
  2836. v := c.oprrr(p.As)
  2837. t := v & (1<<10 | 1) /* OE|Rc */
  2838. o1 = AOP_RRR(v&^t, REGTMP, uint32(r), uint32(p.From.Reg))
  2839. o2 = AOP_RRR(OP_MULLD, REGTMP, REGTMP, uint32(p.From.Reg))
  2840. o3 = AOP_RRR(OP_SUBF|t, uint32(p.To.Reg), REGTMP, uint32(r))
  2841. /* cases 50,51: removed; can be reused. */
  2842. /* cases 50,51: removed; can be reused. */
  2843. case 52: /* mtfsbNx cr(n) */
  2844. v := c.regoff(&p.From) & 31
  2845. o1 = AOP_RRR(c.oprrr(p.As), uint32(v), 0, 0)
  2846. case 53: /* mffsX ,fr1 */
  2847. o1 = AOP_RRR(OP_MFFS, uint32(p.To.Reg), 0, 0)
  2848. case 54: /* mov msr,r1; mov r1, msr*/
  2849. if oclass(&p.From) == C_REG {
  2850. if p.As == AMOVD {
  2851. o1 = AOP_RRR(OP_MTMSRD, uint32(p.From.Reg), 0, 0)
  2852. } else {
  2853. o1 = AOP_RRR(OP_MTMSR, uint32(p.From.Reg), 0, 0)
  2854. }
  2855. } else {
  2856. o1 = AOP_RRR(OP_MFMSR, uint32(p.To.Reg), 0, 0)
  2857. }
  2858. case 55: /* op Rb, Rd */
  2859. o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), 0, uint32(p.From.Reg))
  2860. case 56: /* sra $sh,[s,]a; srd $sh,[s,]a */
  2861. v := c.regoff(&p.From)
  2862. r := int(p.Reg)
  2863. if r == 0 {
  2864. r = int(p.To.Reg)
  2865. }
  2866. o1 = AOP_RRR(c.opirr(p.As), uint32(r), uint32(p.To.Reg), uint32(v)&31)
  2867. if (p.As == ASRAD || p.As == ASRADCC) && (v&0x20 != 0) {
  2868. o1 |= 1 << 1 /* mb[5] */
  2869. }
  2870. case 57: /* slw $sh,[s,]a -> rlwinm ... */
  2871. v := c.regoff(&p.From)
  2872. r := int(p.Reg)
  2873. if r == 0 {
  2874. r = int(p.To.Reg)
  2875. }
  2876. /*
  2877. * Let user (gs) shoot himself in the foot.
  2878. * qc has already complained.
  2879. *
  2880. if(v < 0 || v > 31)
  2881. ctxt->diag("illegal shift %ld\n%v", v, p);
  2882. */
  2883. if v < 0 {
  2884. v = 0
  2885. } else if v > 32 {
  2886. v = 32
  2887. }
  2888. var mask [2]uint8
  2889. switch p.As {
  2890. case AROTLW:
  2891. mask[0], mask[1] = 0, 31
  2892. case ASRW, ASRWCC:
  2893. mask[0], mask[1] = uint8(v), 31
  2894. v = 32 - v
  2895. default:
  2896. mask[0], mask[1] = 0, uint8(31-v)
  2897. }
  2898. o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(r), uint32(v), uint32(mask[0]), uint32(mask[1]))
  2899. if p.As == ASLWCC || p.As == ASRWCC {
  2900. o1 |= 1 // set the condition code
  2901. }
  2902. case 58: /* logical $andcon,[s],a */
  2903. v := c.regoff(&p.From)
  2904. r := int(p.Reg)
  2905. if r == 0 {
  2906. r = int(p.To.Reg)
  2907. }
  2908. o1 = LOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
  2909. case 59: /* or/xor/and $ucon,,r | oris/xoris/andis $addcon,r,r */
  2910. v := c.regoff(&p.From)
  2911. r := int(p.Reg)
  2912. if r == 0 {
  2913. r = int(p.To.Reg)
  2914. }
  2915. switch p.As {
  2916. case AOR:
  2917. o1 = LOP_IRR(c.opirr(AORIS), uint32(p.To.Reg), uint32(r), uint32(v)>>16) /* oris, xoris, andis. */
  2918. case AXOR:
  2919. o1 = LOP_IRR(c.opirr(AXORIS), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
  2920. case AANDCC:
  2921. o1 = LOP_IRR(c.opirr(AANDISCC), uint32(p.To.Reg), uint32(r), uint32(v)>>16)
  2922. default:
  2923. o1 = LOP_IRR(c.opirr(p.As), uint32(p.To.Reg), uint32(r), uint32(v))
  2924. }
  2925. case 60: /* tw to,a,b */
  2926. r := int(c.regoff(&p.From) & 31)
  2927. o1 = AOP_RRR(c.oprrr(p.As), uint32(r), uint32(p.Reg), uint32(p.To.Reg))
  2928. case 61: /* tw to,a,$simm */
  2929. r := int(c.regoff(&p.From) & 31)
  2930. v := c.regoff(&p.To)
  2931. o1 = AOP_IRR(c.opirr(p.As), uint32(r), uint32(p.Reg), uint32(v))
  2932. case 62: /* rlwmi $sh,s,$mask,a */
  2933. v := c.regoff(&p.From)
  2934. switch p.As {
  2935. case ACLRLSLWI:
  2936. b := c.regoff(p.GetFrom3())
  2937. // This is an extended mnemonic described in the ISA C.8.2
  2938. // clrlslwi ra,rs,n,b -> rlwinm ra,rs,n,b-n,31-n
  2939. // It maps onto rlwinm which is directly generated here.
  2940. if v < 0 || v > 32 || b > 32 {
  2941. c.ctxt.Diag("Invalid n or b for CLRLSLWI: %x %x\n%v", v, b)
  2942. }
  2943. o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.Reg), uint32(v), uint32(b-v), uint32(31-v))
  2944. default:
  2945. var mask [2]uint8
  2946. c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3())))
  2947. o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(v))
  2948. o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1
  2949. }
  2950. case 63: /* rlwmi b,s,$mask,a */
  2951. v := c.regoff(&p.From)
  2952. switch p.As {
  2953. case ACLRLSLWI:
  2954. b := c.regoff(p.GetFrom3())
  2955. if v > b || b > 32 {
  2956. // Message will match operands from the ISA even though in the
  2957. // code it uses 'v'
  2958. c.ctxt.Diag("Invalid n or b for CLRLSLWI: %x %x\n%v", v, b)
  2959. }
  2960. // This is an extended mnemonic described in the ISA C.8.2
  2961. // clrlslwi ra,rs,n,b -> rlwinm ra,rs,n,b-n,31-n
  2962. // It generates the rlwinm directly here.
  2963. o1 = OP_RLW(OP_RLWINM, uint32(p.To.Reg), uint32(p.Reg), uint32(v), uint32(b-v), uint32(31-v))
  2964. default:
  2965. var mask [2]uint8
  2966. c.maskgen(p, mask[:], uint32(c.regoff(p.GetFrom3())))
  2967. o1 = AOP_RRR(c.opirr(p.As), uint32(p.Reg), uint32(p.To.Reg), uint32(v))
  2968. o1 |= (uint32(mask[0])&31)<<6 | (uint32(mask[1])&31)<<1
  2969. }
  2970. case 64: /* mtfsf fr[, $m] {,fpcsr} */
  2971. var v int32
  2972. if p.From3Type() != obj.TYPE_NONE {
  2973. v = c.regoff(p.GetFrom3()) & 255
  2974. } else {
  2975. v = 255
  2976. }
  2977. o1 = OP_MTFSF | uint32(v)<<17 | uint32(p.From.Reg)<<11
  2978. case 65: /* MOVFL $imm,FPSCR(n) => mtfsfi crfd,imm */
  2979. if p.To.Reg == 0 {
  2980. c.ctxt.Diag("must specify FPSCR(n)\n%v", p)
  2981. }
  2982. o1 = OP_MTFSFI | (uint32(p.To.Reg)&15)<<23 | (uint32(c.regoff(&p.From))&31)<<12
  2983. case 66: /* mov spr,r1; mov r1,spr, also dcr */
  2984. var r int
  2985. var v int32
  2986. if REG_R0 <= p.From.Reg && p.From.Reg <= REG_R31 {
  2987. r = int(p.From.Reg)
  2988. v = int32(p.To.Reg)
  2989. if REG_DCR0 <= v && v <= REG_DCR0+1023 {
  2990. o1 = OPVCC(31, 451, 0, 0) /* mtdcr */
  2991. } else {
  2992. o1 = OPVCC(31, 467, 0, 0) /* mtspr */
  2993. }
  2994. } else {
  2995. r = int(p.To.Reg)
  2996. v = int32(p.From.Reg)
  2997. if REG_DCR0 <= v && v <= REG_DCR0+1023 {
  2998. o1 = OPVCC(31, 323, 0, 0) /* mfdcr */
  2999. } else {
  3000. o1 = OPVCC(31, 339, 0, 0) /* mfspr */
  3001. }
  3002. }
  3003. o1 = AOP_RRR(o1, uint32(r), 0, 0) | (uint32(v)&0x1f)<<16 | ((uint32(v)>>5)&0x1f)<<11
  3004. case 67: /* mcrf crfD,crfS */
  3005. if p.From.Type != obj.TYPE_REG || p.From.Reg < REG_CR0 || REG_CR7 < p.From.Reg || p.To.Type != obj.TYPE_REG || p.To.Reg < REG_CR0 || REG_CR7 < p.To.Reg {
  3006. c.ctxt.Diag("illegal CR field number\n%v", p)
  3007. }
  3008. o1 = AOP_RRR(OP_MCRF, ((uint32(p.To.Reg) & 7) << 2), ((uint32(p.From.Reg) & 7) << 2), 0)
  3009. case 68: /* mfcr rD; mfocrf CRM,rD */
  3010. if p.From.Type == obj.TYPE_REG && REG_CR0 <= p.From.Reg && p.From.Reg <= REG_CR7 {
  3011. v := int32(1 << uint(7-(p.To.Reg&7))) /* CR(n) */
  3012. o1 = AOP_RRR(OP_MFCR, uint32(p.To.Reg), 0, 0) | 1<<20 | uint32(v)<<12 /* new form, mfocrf */
  3013. } else {
  3014. o1 = AOP_RRR(OP_MFCR, uint32(p.To.Reg), 0, 0) /* old form, whole register */
  3015. }
  3016. case 69: /* mtcrf CRM,rS */
  3017. var v int32
  3018. if p.From3Type() != obj.TYPE_NONE {
  3019. if p.To.Reg != 0 {
  3020. c.ctxt.Diag("can't use both mask and CR(n)\n%v", p)
  3021. }
  3022. v = c.regoff(p.GetFrom3()) & 0xff
  3023. } else {
  3024. if p.To.Reg == 0 {
  3025. v = 0xff /* CR */
  3026. } else {
  3027. v = 1 << uint(7-(p.To.Reg&7)) /* CR(n) */
  3028. }
  3029. }
  3030. o1 = AOP_RRR(OP_MTCRF, uint32(p.From.Reg), 0, 0) | uint32(v)<<12
  3031. case 70: /* [f]cmp r,r,cr*/
  3032. var r int
  3033. if p.Reg == 0 {
  3034. r = 0
  3035. } else {
  3036. r = (int(p.Reg) & 7) << 2
  3037. }
  3038. o1 = AOP_RRR(c.oprrr(p.As), uint32(r), uint32(p.From.Reg), uint32(p.To.Reg))
  3039. case 71: /* cmp[l] r,i,cr*/
  3040. var r int
  3041. if p.Reg == 0 {
  3042. r = 0
  3043. } else {
  3044. r = (int(p.Reg) & 7) << 2
  3045. }
  3046. o1 = AOP_RRR(c.opirr(p.As), uint32(r), uint32(p.From.Reg), 0) | uint32(c.regoff(&p.To))&0xffff
  3047. case 72: /* slbmte (Rb+Rs -> slb[Rb]) -> Rs, Rb */
  3048. o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), 0, uint32(p.To.Reg))
  3049. case 73: /* mcrfs crfD,crfS */
  3050. if p.From.Type != obj.TYPE_REG || p.From.Reg != REG_FPSCR || p.To.Type != obj.TYPE_REG || p.To.Reg < REG_CR0 || REG_CR7 < p.To.Reg {
  3051. c.ctxt.Diag("illegal FPSCR/CR field number\n%v", p)
  3052. }
  3053. o1 = AOP_RRR(OP_MCRFS, ((uint32(p.To.Reg) & 7) << 2), ((0 & 7) << 2), 0)
  3054. case 77: /* syscall $scon, syscall Rx */
  3055. if p.From.Type == obj.TYPE_CONST {
  3056. if p.From.Offset > BIG || p.From.Offset < -BIG {
  3057. c.ctxt.Diag("illegal syscall, sysnum too large: %v", p)
  3058. }
  3059. o1 = AOP_IRR(OP_ADDI, REGZERO, REGZERO, uint32(p.From.Offset))
  3060. } else if p.From.Type == obj.TYPE_REG {
  3061. o1 = LOP_RRR(OP_OR, REGZERO, uint32(p.From.Reg), uint32(p.From.Reg))
  3062. } else {
  3063. c.ctxt.Diag("illegal syscall: %v", p)
  3064. o1 = 0x7fe00008 // trap always
  3065. }
  3066. o2 = c.oprrr(p.As)
  3067. o3 = AOP_RRR(c.oprrr(AXOR), REGZERO, REGZERO, REGZERO) // XOR R0, R0
  3068. case 78: /* undef */
  3069. o1 = 0 /* "An instruction consisting entirely of binary 0s is guaranteed
  3070. always to be an illegal instruction." */
  3071. /* relocation operations */
  3072. case 74:
  3073. v := c.vregoff(&p.To)
  3074. // Offsets in DS form stores must be a multiple of 4
  3075. inst := c.opstore(p.As)
  3076. if c.opform(inst) == DS_FORM && v&0x3 != 0 {
  3077. log.Fatalf("invalid offset for DS form load/store %v", p)
  3078. }
  3079. o1, o2 = c.symbolAccess(p.To.Sym, v, p.From.Reg, inst)
  3080. //if(dlm) reloc(&p->to, p->pc, 1);
  3081. case 75:
  3082. v := c.vregoff(&p.From)
  3083. // Offsets in DS form loads must be a multiple of 4
  3084. inst := c.opload(p.As)
  3085. if c.opform(inst) == DS_FORM && v&0x3 != 0 {
  3086. log.Fatalf("invalid offset for DS form load/store %v", p)
  3087. }
  3088. o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst)
  3089. //if(dlm) reloc(&p->from, p->pc, 1);
  3090. case 76:
  3091. v := c.vregoff(&p.From)
  3092. // Offsets in DS form loads must be a multiple of 4
  3093. inst := c.opload(p.As)
  3094. if c.opform(inst) == DS_FORM && v&0x3 != 0 {
  3095. log.Fatalf("invalid offset for DS form load/store %v", p)
  3096. }
  3097. o1, o2 = c.symbolAccess(p.From.Sym, v, p.To.Reg, inst)
  3098. o3 = LOP_RRR(OP_EXTSB, uint32(p.To.Reg), uint32(p.To.Reg), 0)
  3099. //if(dlm) reloc(&p->from, p->pc, 1);
  3100. case 79:
  3101. if p.From.Offset != 0 {
  3102. c.ctxt.Diag("invalid offset against tls var %v", p)
  3103. }
  3104. o1 = AOP_IRR(OP_ADDI, uint32(p.To.Reg), REGZERO, 0)
  3105. rel := obj.Addrel(c.cursym)
  3106. rel.Off = int32(c.pc)
  3107. rel.Siz = 4
  3108. rel.Sym = p.From.Sym
  3109. rel.Type = objabi.R_POWER_TLS_LE
  3110. case 80:
  3111. if p.From.Offset != 0 {
  3112. c.ctxt.Diag("invalid offset against tls var %v", p)
  3113. }
  3114. o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
  3115. o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0)
  3116. rel := obj.Addrel(c.cursym)
  3117. rel.Off = int32(c.pc)
  3118. rel.Siz = 8
  3119. rel.Sym = p.From.Sym
  3120. rel.Type = objabi.R_POWER_TLS_IE
  3121. case 81:
  3122. v := c.vregoff(&p.To)
  3123. if v != 0 {
  3124. c.ctxt.Diag("invalid offset against GOT slot %v", p)
  3125. }
  3126. o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
  3127. o2 = AOP_IRR(c.opload(AMOVD), uint32(p.To.Reg), uint32(p.To.Reg), 0)
  3128. rel := obj.Addrel(c.cursym)
  3129. rel.Off = int32(c.pc)
  3130. rel.Siz = 8
  3131. rel.Sym = p.From.Sym
  3132. rel.Type = objabi.R_ADDRPOWER_GOT
  3133. case 82: /* vector instructions, VX-form and VC-form */
  3134. if p.From.Type == obj.TYPE_REG {
  3135. /* reg reg none OR reg reg reg */
  3136. /* 3-register operand order: VRA, VRB, VRT */
  3137. /* 2-register operand order: VRA, VRT */
  3138. o1 = AOP_RRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
  3139. } else if p.From3Type() == obj.TYPE_CONST {
  3140. /* imm imm reg reg */
  3141. /* operand order: SIX, VRA, ST, VRT */
  3142. six := int(c.regoff(&p.From))
  3143. st := int(c.regoff(p.GetFrom3()))
  3144. o1 = AOP_IIRR(c.opiirr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(st), uint32(six))
  3145. } else if p.From3Type() == obj.TYPE_NONE && p.Reg != 0 {
  3146. /* imm reg reg */
  3147. /* operand order: UIM, VRB, VRT */
  3148. uim := int(c.regoff(&p.From))
  3149. o1 = AOP_VIRR(c.opirr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(uim))
  3150. } else {
  3151. /* imm reg */
  3152. /* operand order: SIM, VRT */
  3153. sim := int(c.regoff(&p.From))
  3154. o1 = AOP_IR(c.opirr(p.As), uint32(p.To.Reg), uint32(sim))
  3155. }
  3156. case 83: /* vector instructions, VA-form */
  3157. if p.From.Type == obj.TYPE_REG {
  3158. /* reg reg reg reg */
  3159. /* 4-register operand order: VRA, VRB, VRC, VRT */
  3160. o1 = AOP_RRRR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg))
  3161. } else if p.From.Type == obj.TYPE_CONST {
  3162. /* imm reg reg reg */
  3163. /* operand order: SHB, VRA, VRB, VRT */
  3164. shb := int(c.regoff(&p.From))
  3165. o1 = AOP_IRRR(c.opirrr(p.As), uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), uint32(shb))
  3166. }
  3167. case 84: // ISEL BC,RA,RB,RT -> isel rt,ra,rb,bc
  3168. bc := c.vregoff(&p.From)
  3169. // rt = To.Reg, ra = p.Reg, rb = p.From3.Reg
  3170. o1 = AOP_ISEL(OP_ISEL, uint32(p.To.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg), uint32(bc))
  3171. case 85: /* vector instructions, VX-form */
  3172. /* reg none reg */
  3173. /* 2-register operand order: VRB, VRT */
  3174. o1 = AOP_RR(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg))
  3175. case 86: /* VSX indexed store, XX1-form */
  3176. /* reg reg reg */
  3177. /* 3-register operand order: XT, (RB)(RA*1) */
  3178. o1 = AOP_XX1(c.opstorex(p.As), uint32(p.From.Reg), uint32(p.To.Index), uint32(p.To.Reg))
  3179. case 87: /* VSX indexed load, XX1-form */
  3180. /* reg reg reg */
  3181. /* 3-register operand order: (RB)(RA*1), XT */
  3182. o1 = AOP_XX1(c.oploadx(p.As), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg))
  3183. case 88: /* VSX instructions, XX1-form */
  3184. /* reg reg none OR reg reg reg */
  3185. /* 3-register operand order: RA, RB, XT */
  3186. /* 2-register operand order: XS, RA or RA, XT */
  3187. xt := int32(p.To.Reg)
  3188. xs := int32(p.From.Reg)
  3189. /* We need to treat the special case of extended mnemonics that may have a FREG/VREG as an argument */
  3190. if REG_V0 <= xt && xt <= REG_V31 {
  3191. /* Convert V0-V31 to VS32-VS63 */
  3192. xt = xt + 64
  3193. o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg))
  3194. } else if REG_F0 <= xt && xt <= REG_F31 {
  3195. /* Convert F0-F31 to VS0-VS31 */
  3196. xt = xt + 64
  3197. o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg))
  3198. } else if REG_VS0 <= xt && xt <= REG_VS63 {
  3199. o1 = AOP_XX1(c.oprrr(p.As), uint32(xt), uint32(p.From.Reg), uint32(p.Reg))
  3200. } else if REG_V0 <= xs && xs <= REG_V31 {
  3201. /* Likewise for XS */
  3202. xs = xs + 64
  3203. o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg))
  3204. } else if REG_F0 <= xs && xs <= REG_F31 {
  3205. xs = xs + 64
  3206. o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg))
  3207. } else if REG_VS0 <= xs && xs <= REG_VS63 {
  3208. o1 = AOP_XX1(c.oprrr(p.As), uint32(xs), uint32(p.To.Reg), uint32(p.Reg))
  3209. }
  3210. case 89: /* VSX instructions, XX2-form */
  3211. /* reg none reg OR reg imm reg */
  3212. /* 2-register operand order: XB, XT or XB, UIM, XT*/
  3213. uim := int(c.regoff(p.GetFrom3()))
  3214. o1 = AOP_XX2(c.oprrr(p.As), uint32(p.To.Reg), uint32(uim), uint32(p.From.Reg))
  3215. case 90: /* VSX instructions, XX3-form */
  3216. if p.From3Type() == obj.TYPE_NONE {
  3217. /* reg reg reg */
  3218. /* 3-register operand order: XA, XB, XT */
  3219. o1 = AOP_XX3(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
  3220. } else if p.From3Type() == obj.TYPE_CONST {
  3221. /* reg reg reg imm */
  3222. /* operand order: XA, XB, DM, XT */
  3223. dm := int(c.regoff(p.GetFrom3()))
  3224. o1 = AOP_XX3I(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(dm))
  3225. }
  3226. case 91: /* VSX instructions, XX4-form */
  3227. /* reg reg reg reg */
  3228. /* 3-register operand order: XA, XB, XC, XT */
  3229. o1 = AOP_XX4(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(p.GetFrom3().Reg))
  3230. case 92: /* X-form instructions, 3-operands */
  3231. if p.To.Type == obj.TYPE_CONST {
  3232. /* imm reg reg */
  3233. xf := int32(p.From.Reg)
  3234. if REG_F0 <= xf && xf <= REG_F31 {
  3235. /* operand order: FRA, FRB, BF */
  3236. bf := int(c.regoff(&p.To)) << 2
  3237. o1 = AOP_RRR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg), uint32(p.Reg))
  3238. } else {
  3239. /* operand order: RA, RB, L */
  3240. l := int(c.regoff(&p.To))
  3241. o1 = AOP_RRR(c.opirr(p.As), uint32(l), uint32(p.From.Reg), uint32(p.Reg))
  3242. }
  3243. } else if p.From3Type() == obj.TYPE_CONST {
  3244. /* reg reg imm */
  3245. /* operand order: RB, L, RA */
  3246. l := int(c.regoff(p.GetFrom3()))
  3247. o1 = AOP_RRR(c.opirr(p.As), uint32(l), uint32(p.To.Reg), uint32(p.From.Reg))
  3248. } else if p.To.Type == obj.TYPE_REG {
  3249. cr := int32(p.To.Reg)
  3250. if REG_CR0 <= cr && cr <= REG_CR7 {
  3251. /* cr reg reg */
  3252. /* operand order: RA, RB, BF */
  3253. bf := (int(p.To.Reg) & 7) << 2
  3254. o1 = AOP_RRR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg), uint32(p.Reg))
  3255. } else if p.From.Type == obj.TYPE_CONST {
  3256. /* reg imm */
  3257. /* operand order: L, RT */
  3258. l := int(c.regoff(&p.From))
  3259. o1 = AOP_RRR(c.opirr(p.As), uint32(p.To.Reg), uint32(l), uint32(p.Reg))
  3260. } else {
  3261. switch p.As {
  3262. case ACOPY, APASTECC:
  3263. o1 = AOP_RRR(c.opirr(p.As), uint32(1), uint32(p.From.Reg), uint32(p.To.Reg))
  3264. default:
  3265. /* reg reg reg */
  3266. /* operand order: RS, RB, RA */
  3267. o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
  3268. }
  3269. }
  3270. }
  3271. case 93: /* X-form instructions, 2-operands */
  3272. if p.To.Type == obj.TYPE_CONST {
  3273. /* imm reg */
  3274. /* operand order: FRB, BF */
  3275. bf := int(c.regoff(&p.To)) << 2
  3276. o1 = AOP_RR(c.opirr(p.As), uint32(bf), uint32(p.From.Reg))
  3277. } else if p.Reg == 0 {
  3278. /* popcnt* r,r, X-form */
  3279. /* operand order: RS, RA */
  3280. o1 = AOP_RRR(c.oprrr(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(p.Reg))
  3281. }
  3282. case 94: /* Z23-form instructions, 4-operands */
  3283. /* reg reg reg imm */
  3284. /* operand order: RA, RB, CY, RT */
  3285. cy := int(c.regoff(p.GetFrom3()))
  3286. o1 = AOP_Z23I(c.oprrr(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg), uint32(cy))
  3287. case 95: /* Retrieve TOC relative symbol */
  3288. /* This code is for AIX only */
  3289. v := c.vregoff(&p.From)
  3290. if v != 0 {
  3291. c.ctxt.Diag("invalid offset against TOC slot %v", p)
  3292. }
  3293. inst := c.opload(p.As)
  3294. if c.opform(inst) != DS_FORM {
  3295. c.ctxt.Diag("invalid form for a TOC access in %v", p)
  3296. }
  3297. o1 = AOP_IRR(OP_ADDIS, uint32(p.To.Reg), REG_R2, 0)
  3298. o2 = AOP_IRR(inst, uint32(p.To.Reg), uint32(p.To.Reg), 0)
  3299. rel := obj.Addrel(c.cursym)
  3300. rel.Off = int32(c.pc)
  3301. rel.Siz = 8
  3302. rel.Sym = p.From.Sym
  3303. rel.Type = objabi.R_ADDRPOWER_TOCREL_DS
  3304. case 96: /* VSX load, DQ-form */
  3305. /* reg imm reg */
  3306. /* operand order: (RA)(DQ), XT */
  3307. dq := int16(c.regoff(&p.From))
  3308. if (dq & 15) != 0 {
  3309. c.ctxt.Diag("invalid offset for DQ form load/store %v", dq)
  3310. }
  3311. o1 = AOP_DQ(c.opload(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(dq))
  3312. case 97: /* VSX store, DQ-form */
  3313. /* reg imm reg */
  3314. /* operand order: XT, (RA)(DQ) */
  3315. dq := int16(c.regoff(&p.To))
  3316. if (dq & 15) != 0 {
  3317. c.ctxt.Diag("invalid offset for DQ form load/store %v", dq)
  3318. }
  3319. o1 = AOP_DQ(c.opstore(p.As), uint32(p.From.Reg), uint32(p.To.Reg), uint32(dq))
  3320. case 98: /* VSX indexed load or load with length (also left-justified), x-form */
  3321. /* vsreg, reg, reg */
  3322. o1 = AOP_XX1(c.opload(p.As), uint32(p.To.Reg), uint32(p.From.Reg), uint32(p.Reg))
  3323. case 99: /* VSX store with length (also left-justified) x-form */
  3324. /* reg, reg, vsreg */
  3325. o1 = AOP_XX1(c.opstore(p.As), uint32(p.From.Reg), uint32(p.Reg), uint32(p.To.Reg))
  3326. case 100: /* VSX X-form XXSPLTIB */
  3327. if p.From.Type == obj.TYPE_CONST {
  3328. /* imm reg */
  3329. uim := int(c.regoff(&p.From))
  3330. /* imm reg */
  3331. /* Use AOP_XX1 form with 0 for one of the registers. */
  3332. o1 = AOP_XX1(c.oprrr(p.As), uint32(p.To.Reg), uint32(0), uint32(uim))
  3333. } else {
  3334. c.ctxt.Diag("invalid ops for %v", p.As)
  3335. }
  3336. case 101:
  3337. o1 = AOP_XX2(c.oprrr(p.As), uint32(p.To.Reg), uint32(0), uint32(p.From.Reg))
  3338. }
  3339. out[0] = o1
  3340. out[1] = o2
  3341. out[2] = o3
  3342. out[3] = o4
  3343. out[4] = o5
  3344. }
  3345. func (c *ctxt9) vregoff(a *obj.Addr) int64 {
  3346. c.instoffset = 0
  3347. if a != nil {
  3348. c.aclass(a)
  3349. }
  3350. return c.instoffset
  3351. }
  3352. func (c *ctxt9) regoff(a *obj.Addr) int32 {
  3353. return int32(c.vregoff(a))
  3354. }
  3355. func (c *ctxt9) oprrr(a obj.As) uint32 {
  3356. switch a {
  3357. case AADD:
  3358. return OPVCC(31, 266, 0, 0)
  3359. case AADDCC:
  3360. return OPVCC(31, 266, 0, 1)
  3361. case AADDV:
  3362. return OPVCC(31, 266, 1, 0)
  3363. case AADDVCC:
  3364. return OPVCC(31, 266, 1, 1)
  3365. case AADDC:
  3366. return OPVCC(31, 10, 0, 0)
  3367. case AADDCCC:
  3368. return OPVCC(31, 10, 0, 1)
  3369. case AADDCV:
  3370. return OPVCC(31, 10, 1, 0)
  3371. case AADDCVCC:
  3372. return OPVCC(31, 10, 1, 1)
  3373. case AADDE:
  3374. return OPVCC(31, 138, 0, 0)
  3375. case AADDECC:
  3376. return OPVCC(31, 138, 0, 1)
  3377. case AADDEV:
  3378. return OPVCC(31, 138, 1, 0)
  3379. case AADDEVCC:
  3380. return OPVCC(31, 138, 1, 1)
  3381. case AADDME:
  3382. return OPVCC(31, 234, 0, 0)
  3383. case AADDMECC:
  3384. return OPVCC(31, 234, 0, 1)
  3385. case AADDMEV:
  3386. return OPVCC(31, 234, 1, 0)
  3387. case AADDMEVCC:
  3388. return OPVCC(31, 234, 1, 1)
  3389. case AADDZE:
  3390. return OPVCC(31, 202, 0, 0)
  3391. case AADDZECC:
  3392. return OPVCC(31, 202, 0, 1)
  3393. case AADDZEV:
  3394. return OPVCC(31, 202, 1, 0)
  3395. case AADDZEVCC:
  3396. return OPVCC(31, 202, 1, 1)
  3397. case AADDEX:
  3398. return OPVCC(31, 170, 0, 0) /* addex - v3.0b */
  3399. case AAND:
  3400. return OPVCC(31, 28, 0, 0)
  3401. case AANDCC:
  3402. return OPVCC(31, 28, 0, 1)
  3403. case AANDN:
  3404. return OPVCC(31, 60, 0, 0)
  3405. case AANDNCC:
  3406. return OPVCC(31, 60, 0, 1)
  3407. case ACMP:
  3408. return OPVCC(31, 0, 0, 0) | 1<<21 /* L=1 */
  3409. case ACMPU:
  3410. return OPVCC(31, 32, 0, 0) | 1<<21
  3411. case ACMPW:
  3412. return OPVCC(31, 0, 0, 0) /* L=0 */
  3413. case ACMPWU:
  3414. return OPVCC(31, 32, 0, 0)
  3415. case ACMPB:
  3416. return OPVCC(31, 508, 0, 0) /* cmpb - v2.05 */
  3417. case ACMPEQB:
  3418. return OPVCC(31, 224, 0, 0) /* cmpeqb - v3.00 */
  3419. case ACNTLZW:
  3420. return OPVCC(31, 26, 0, 0)
  3421. case ACNTLZWCC:
  3422. return OPVCC(31, 26, 0, 1)
  3423. case ACNTLZD:
  3424. return OPVCC(31, 58, 0, 0)
  3425. case ACNTLZDCC:
  3426. return OPVCC(31, 58, 0, 1)
  3427. case ACRAND:
  3428. return OPVCC(19, 257, 0, 0)
  3429. case ACRANDN:
  3430. return OPVCC(19, 129, 0, 0)
  3431. case ACREQV:
  3432. return OPVCC(19, 289, 0, 0)
  3433. case ACRNAND:
  3434. return OPVCC(19, 225, 0, 0)
  3435. case ACRNOR:
  3436. return OPVCC(19, 33, 0, 0)
  3437. case ACROR:
  3438. return OPVCC(19, 449, 0, 0)
  3439. case ACRORN:
  3440. return OPVCC(19, 417, 0, 0)
  3441. case ACRXOR:
  3442. return OPVCC(19, 193, 0, 0)
  3443. case ADCBF:
  3444. return OPVCC(31, 86, 0, 0)
  3445. case ADCBI:
  3446. return OPVCC(31, 470, 0, 0)
  3447. case ADCBST:
  3448. return OPVCC(31, 54, 0, 0)
  3449. case ADCBT:
  3450. return OPVCC(31, 278, 0, 0)
  3451. case ADCBTST:
  3452. return OPVCC(31, 246, 0, 0)
  3453. case ADCBZ:
  3454. return OPVCC(31, 1014, 0, 0)
  3455. case AMODUD:
  3456. return OPVCC(31, 265, 0, 0) /* modud - v3.0 */
  3457. case AMODUW:
  3458. return OPVCC(31, 267, 0, 0) /* moduw - v3.0 */
  3459. case AMODSD:
  3460. return OPVCC(31, 777, 0, 0) /* modsd - v3.0 */
  3461. case AMODSW:
  3462. return OPVCC(31, 779, 0, 0) /* modsw - v3.0 */
  3463. case ADIVW, AREM:
  3464. return OPVCC(31, 491, 0, 0)
  3465. case ADIVWCC:
  3466. return OPVCC(31, 491, 0, 1)
  3467. case ADIVWV:
  3468. return OPVCC(31, 491, 1, 0)
  3469. case ADIVWVCC:
  3470. return OPVCC(31, 491, 1, 1)
  3471. case ADIVWU, AREMU:
  3472. return OPVCC(31, 459, 0, 0)
  3473. case ADIVWUCC:
  3474. return OPVCC(31, 459, 0, 1)
  3475. case ADIVWUV:
  3476. return OPVCC(31, 459, 1, 0)
  3477. case ADIVWUVCC:
  3478. return OPVCC(31, 459, 1, 1)
  3479. case ADIVD, AREMD:
  3480. return OPVCC(31, 489, 0, 0)
  3481. case ADIVDCC:
  3482. return OPVCC(31, 489, 0, 1)
  3483. case ADIVDE:
  3484. return OPVCC(31, 425, 0, 0)
  3485. case ADIVDECC:
  3486. return OPVCC(31, 425, 0, 1)
  3487. case ADIVDEU:
  3488. return OPVCC(31, 393, 0, 0)
  3489. case ADIVDEUCC:
  3490. return OPVCC(31, 393, 0, 1)
  3491. case ADIVDV:
  3492. return OPVCC(31, 489, 1, 0)
  3493. case ADIVDVCC:
  3494. return OPVCC(31, 489, 1, 1)
  3495. case ADIVDU, AREMDU:
  3496. return OPVCC(31, 457, 0, 0)
  3497. case ADIVDUCC:
  3498. return OPVCC(31, 457, 0, 1)
  3499. case ADIVDUV:
  3500. return OPVCC(31, 457, 1, 0)
  3501. case ADIVDUVCC:
  3502. return OPVCC(31, 457, 1, 1)
  3503. case AEIEIO:
  3504. return OPVCC(31, 854, 0, 0)
  3505. case AEQV:
  3506. return OPVCC(31, 284, 0, 0)
  3507. case AEQVCC:
  3508. return OPVCC(31, 284, 0, 1)
  3509. case AEXTSB:
  3510. return OPVCC(31, 954, 0, 0)
  3511. case AEXTSBCC:
  3512. return OPVCC(31, 954, 0, 1)
  3513. case AEXTSH:
  3514. return OPVCC(31, 922, 0, 0)
  3515. case AEXTSHCC:
  3516. return OPVCC(31, 922, 0, 1)
  3517. case AEXTSW:
  3518. return OPVCC(31, 986, 0, 0)
  3519. case AEXTSWCC:
  3520. return OPVCC(31, 986, 0, 1)
  3521. case AFABS:
  3522. return OPVCC(63, 264, 0, 0)
  3523. case AFABSCC:
  3524. return OPVCC(63, 264, 0, 1)
  3525. case AFADD:
  3526. return OPVCC(63, 21, 0, 0)
  3527. case AFADDCC:
  3528. return OPVCC(63, 21, 0, 1)
  3529. case AFADDS:
  3530. return OPVCC(59, 21, 0, 0)
  3531. case AFADDSCC:
  3532. return OPVCC(59, 21, 0, 1)
  3533. case AFCMPO:
  3534. return OPVCC(63, 32, 0, 0)
  3535. case AFCMPU:
  3536. return OPVCC(63, 0, 0, 0)
  3537. case AFCFID:
  3538. return OPVCC(63, 846, 0, 0)
  3539. case AFCFIDCC:
  3540. return OPVCC(63, 846, 0, 1)
  3541. case AFCFIDU:
  3542. return OPVCC(63, 974, 0, 0)
  3543. case AFCFIDUCC:
  3544. return OPVCC(63, 974, 0, 1)
  3545. case AFCFIDS:
  3546. return OPVCC(59, 846, 0, 0)
  3547. case AFCFIDSCC:
  3548. return OPVCC(59, 846, 0, 1)
  3549. case AFCTIW:
  3550. return OPVCC(63, 14, 0, 0)
  3551. case AFCTIWCC:
  3552. return OPVCC(63, 14, 0, 1)
  3553. case AFCTIWZ:
  3554. return OPVCC(63, 15, 0, 0)
  3555. case AFCTIWZCC:
  3556. return OPVCC(63, 15, 0, 1)
  3557. case AFCTID:
  3558. return OPVCC(63, 814, 0, 0)
  3559. case AFCTIDCC:
  3560. return OPVCC(63, 814, 0, 1)
  3561. case AFCTIDZ:
  3562. return OPVCC(63, 815, 0, 0)
  3563. case AFCTIDZCC:
  3564. return OPVCC(63, 815, 0, 1)
  3565. case AFDIV:
  3566. return OPVCC(63, 18, 0, 0)
  3567. case AFDIVCC:
  3568. return OPVCC(63, 18, 0, 1)
  3569. case AFDIVS:
  3570. return OPVCC(59, 18, 0, 0)
  3571. case AFDIVSCC:
  3572. return OPVCC(59, 18, 0, 1)
  3573. case AFMADD:
  3574. return OPVCC(63, 29, 0, 0)
  3575. case AFMADDCC:
  3576. return OPVCC(63, 29, 0, 1)
  3577. case AFMADDS:
  3578. return OPVCC(59, 29, 0, 0)
  3579. case AFMADDSCC:
  3580. return OPVCC(59, 29, 0, 1)
  3581. case AFMOVS, AFMOVD:
  3582. return OPVCC(63, 72, 0, 0) /* load */
  3583. case AFMOVDCC:
  3584. return OPVCC(63, 72, 0, 1)
  3585. case AFMSUB:
  3586. return OPVCC(63, 28, 0, 0)
  3587. case AFMSUBCC:
  3588. return OPVCC(63, 28, 0, 1)
  3589. case AFMSUBS:
  3590. return OPVCC(59, 28, 0, 0)
  3591. case AFMSUBSCC:
  3592. return OPVCC(59, 28, 0, 1)
  3593. case AFMUL:
  3594. return OPVCC(63, 25, 0, 0)
  3595. case AFMULCC:
  3596. return OPVCC(63, 25, 0, 1)
  3597. case AFMULS:
  3598. return OPVCC(59, 25, 0, 0)
  3599. case AFMULSCC:
  3600. return OPVCC(59, 25, 0, 1)
  3601. case AFNABS:
  3602. return OPVCC(63, 136, 0, 0)
  3603. case AFNABSCC:
  3604. return OPVCC(63, 136, 0, 1)
  3605. case AFNEG:
  3606. return OPVCC(63, 40, 0, 0)
  3607. case AFNEGCC:
  3608. return OPVCC(63, 40, 0, 1)
  3609. case AFNMADD:
  3610. return OPVCC(63, 31, 0, 0)
  3611. case AFNMADDCC:
  3612. return OPVCC(63, 31, 0, 1)
  3613. case AFNMADDS:
  3614. return OPVCC(59, 31, 0, 0)
  3615. case AFNMADDSCC:
  3616. return OPVCC(59, 31, 0, 1)
  3617. case AFNMSUB:
  3618. return OPVCC(63, 30, 0, 0)
  3619. case AFNMSUBCC:
  3620. return OPVCC(63, 30, 0, 1)
  3621. case AFNMSUBS:
  3622. return OPVCC(59, 30, 0, 0)
  3623. case AFNMSUBSCC:
  3624. return OPVCC(59, 30, 0, 1)
  3625. case AFCPSGN:
  3626. return OPVCC(63, 8, 0, 0)
  3627. case AFCPSGNCC:
  3628. return OPVCC(63, 8, 0, 1)
  3629. case AFRES:
  3630. return OPVCC(59, 24, 0, 0)
  3631. case AFRESCC:
  3632. return OPVCC(59, 24, 0, 1)
  3633. case AFRIM:
  3634. return OPVCC(63, 488, 0, 0)
  3635. case AFRIMCC:
  3636. return OPVCC(63, 488, 0, 1)
  3637. case AFRIP:
  3638. return OPVCC(63, 456, 0, 0)
  3639. case AFRIPCC:
  3640. return OPVCC(63, 456, 0, 1)
  3641. case AFRIZ:
  3642. return OPVCC(63, 424, 0, 0)
  3643. case AFRIZCC:
  3644. return OPVCC(63, 424, 0, 1)
  3645. case AFRIN:
  3646. return OPVCC(63, 392, 0, 0)
  3647. case AFRINCC:
  3648. return OPVCC(63, 392, 0, 1)
  3649. case AFRSP:
  3650. return OPVCC(63, 12, 0, 0)
  3651. case AFRSPCC:
  3652. return OPVCC(63, 12, 0, 1)
  3653. case AFRSQRTE:
  3654. return OPVCC(63, 26, 0, 0)
  3655. case AFRSQRTECC:
  3656. return OPVCC(63, 26, 0, 1)
  3657. case AFSEL:
  3658. return OPVCC(63, 23, 0, 0)
  3659. case AFSELCC:
  3660. return OPVCC(63, 23, 0, 1)
  3661. case AFSQRT:
  3662. return OPVCC(63, 22, 0, 0)
  3663. case AFSQRTCC:
  3664. return OPVCC(63, 22, 0, 1)
  3665. case AFSQRTS:
  3666. return OPVCC(59, 22, 0, 0)
  3667. case AFSQRTSCC:
  3668. return OPVCC(59, 22, 0, 1)
  3669. case AFSUB:
  3670. return OPVCC(63, 20, 0, 0)
  3671. case AFSUBCC:
  3672. return OPVCC(63, 20, 0, 1)
  3673. case AFSUBS:
  3674. return OPVCC(59, 20, 0, 0)
  3675. case AFSUBSCC:
  3676. return OPVCC(59, 20, 0, 1)
  3677. case AICBI:
  3678. return OPVCC(31, 982, 0, 0)
  3679. case AISYNC:
  3680. return OPVCC(19, 150, 0, 0)
  3681. case AMTFSB0:
  3682. return OPVCC(63, 70, 0, 0)
  3683. case AMTFSB0CC:
  3684. return OPVCC(63, 70, 0, 1)
  3685. case AMTFSB1:
  3686. return OPVCC(63, 38, 0, 0)
  3687. case AMTFSB1CC:
  3688. return OPVCC(63, 38, 0, 1)
  3689. case AMULHW:
  3690. return OPVCC(31, 75, 0, 0)
  3691. case AMULHWCC:
  3692. return OPVCC(31, 75, 0, 1)
  3693. case AMULHWU:
  3694. return OPVCC(31, 11, 0, 0)
  3695. case AMULHWUCC:
  3696. return OPVCC(31, 11, 0, 1)
  3697. case AMULLW:
  3698. return OPVCC(31, 235, 0, 0)
  3699. case AMULLWCC:
  3700. return OPVCC(31, 235, 0, 1)
  3701. case AMULLWV:
  3702. return OPVCC(31, 235, 1, 0)
  3703. case AMULLWVCC:
  3704. return OPVCC(31, 235, 1, 1)
  3705. case AMULHD:
  3706. return OPVCC(31, 73, 0, 0)
  3707. case AMULHDCC:
  3708. return OPVCC(31, 73, 0, 1)
  3709. case AMULHDU:
  3710. return OPVCC(31, 9, 0, 0)
  3711. case AMULHDUCC:
  3712. return OPVCC(31, 9, 0, 1)
  3713. case AMULLD:
  3714. return OPVCC(31, 233, 0, 0)
  3715. case AMULLDCC:
  3716. return OPVCC(31, 233, 0, 1)
  3717. case AMULLDV:
  3718. return OPVCC(31, 233, 1, 0)
  3719. case AMULLDVCC:
  3720. return OPVCC(31, 233, 1, 1)
  3721. case ANAND:
  3722. return OPVCC(31, 476, 0, 0)
  3723. case ANANDCC:
  3724. return OPVCC(31, 476, 0, 1)
  3725. case ANEG:
  3726. return OPVCC(31, 104, 0, 0)
  3727. case ANEGCC:
  3728. return OPVCC(31, 104, 0, 1)
  3729. case ANEGV:
  3730. return OPVCC(31, 104, 1, 0)
  3731. case ANEGVCC:
  3732. return OPVCC(31, 104, 1, 1)
  3733. case ANOR:
  3734. return OPVCC(31, 124, 0, 0)
  3735. case ANORCC:
  3736. return OPVCC(31, 124, 0, 1)
  3737. case AOR:
  3738. return OPVCC(31, 444, 0, 0)
  3739. case AORCC:
  3740. return OPVCC(31, 444, 0, 1)
  3741. case AORN:
  3742. return OPVCC(31, 412, 0, 0)
  3743. case AORNCC:
  3744. return OPVCC(31, 412, 0, 1)
  3745. case APOPCNTD:
  3746. return OPVCC(31, 506, 0, 0) /* popcntd - v2.06 */
  3747. case APOPCNTW:
  3748. return OPVCC(31, 378, 0, 0) /* popcntw - v2.06 */
  3749. case APOPCNTB:
  3750. return OPVCC(31, 122, 0, 0) /* popcntb - v2.02 */
  3751. case ACNTTZW:
  3752. return OPVCC(31, 538, 0, 0) /* cnttzw - v3.00 */
  3753. case ACNTTZWCC:
  3754. return OPVCC(31, 538, 0, 1) /* cnttzw. - v3.00 */
  3755. case ACNTTZD:
  3756. return OPVCC(31, 570, 0, 0) /* cnttzd - v3.00 */
  3757. case ACNTTZDCC:
  3758. return OPVCC(31, 570, 0, 1) /* cnttzd. - v3.00 */
  3759. case ARFI:
  3760. return OPVCC(19, 50, 0, 0)
  3761. case ARFCI:
  3762. return OPVCC(19, 51, 0, 0)
  3763. case ARFID:
  3764. return OPVCC(19, 18, 0, 0)
  3765. case AHRFID:
  3766. return OPVCC(19, 274, 0, 0)
  3767. case ARLWMI:
  3768. return OPVCC(20, 0, 0, 0)
  3769. case ARLWMICC:
  3770. return OPVCC(20, 0, 0, 1)
  3771. case ARLWNM:
  3772. return OPVCC(23, 0, 0, 0)
  3773. case ARLWNMCC:
  3774. return OPVCC(23, 0, 0, 1)
  3775. case ARLDCL:
  3776. return OPVCC(30, 8, 0, 0)
  3777. case ARLDCLCC:
  3778. return OPVCC(30, 0, 0, 1)
  3779. case ARLDCR:
  3780. return OPVCC(30, 9, 0, 0)
  3781. case ARLDCRCC:
  3782. return OPVCC(30, 9, 0, 1)
  3783. case ARLDICL:
  3784. return OPVCC(30, 0, 0, 0)
  3785. case ARLDICLCC:
  3786. return OPVCC(30, 0, 0, 1)
  3787. case ARLDICR:
  3788. return OPVCC(30, 0, 0, 0) | 2<<1 // rldicr
  3789. case ARLDICRCC:
  3790. return OPVCC(30, 0, 0, 1) | 2<<1 // rldicr.
  3791. case ARLDIC:
  3792. return OPVCC(30, 0, 0, 0) | 4<<1 // rldic
  3793. case ARLDICCC:
  3794. return OPVCC(30, 0, 0, 1) | 4<<1 // rldic.
  3795. case ASYSCALL:
  3796. return OPVCC(17, 1, 0, 0)
  3797. case ASLW:
  3798. return OPVCC(31, 24, 0, 0)
  3799. case ASLWCC:
  3800. return OPVCC(31, 24, 0, 1)
  3801. case ASLD:
  3802. return OPVCC(31, 27, 0, 0)
  3803. case ASLDCC:
  3804. return OPVCC(31, 27, 0, 1)
  3805. case ASRAW:
  3806. return OPVCC(31, 792, 0, 0)
  3807. case ASRAWCC:
  3808. return OPVCC(31, 792, 0, 1)
  3809. case ASRAD:
  3810. return OPVCC(31, 794, 0, 0)
  3811. case ASRADCC:
  3812. return OPVCC(31, 794, 0, 1)
  3813. case ASRW:
  3814. return OPVCC(31, 536, 0, 0)
  3815. case ASRWCC:
  3816. return OPVCC(31, 536, 0, 1)
  3817. case ASRD:
  3818. return OPVCC(31, 539, 0, 0)
  3819. case ASRDCC:
  3820. return OPVCC(31, 539, 0, 1)
  3821. case ASUB:
  3822. return OPVCC(31, 40, 0, 0)
  3823. case ASUBCC:
  3824. return OPVCC(31, 40, 0, 1)
  3825. case ASUBV:
  3826. return OPVCC(31, 40, 1, 0)
  3827. case ASUBVCC:
  3828. return OPVCC(31, 40, 1, 1)
  3829. case ASUBC:
  3830. return OPVCC(31, 8, 0, 0)
  3831. case ASUBCCC:
  3832. return OPVCC(31, 8, 0, 1)
  3833. case ASUBCV:
  3834. return OPVCC(31, 8, 1, 0)
  3835. case ASUBCVCC:
  3836. return OPVCC(31, 8, 1, 1)
  3837. case ASUBE:
  3838. return OPVCC(31, 136, 0, 0)
  3839. case ASUBECC:
  3840. return OPVCC(31, 136, 0, 1)
  3841. case ASUBEV:
  3842. return OPVCC(31, 136, 1, 0)
  3843. case ASUBEVCC:
  3844. return OPVCC(31, 136, 1, 1)
  3845. case ASUBME:
  3846. return OPVCC(31, 232, 0, 0)
  3847. case ASUBMECC:
  3848. return OPVCC(31, 232, 0, 1)
  3849. case ASUBMEV:
  3850. return OPVCC(31, 232, 1, 0)
  3851. case ASUBMEVCC:
  3852. return OPVCC(31, 232, 1, 1)
  3853. case ASUBZE:
  3854. return OPVCC(31, 200, 0, 0)
  3855. case ASUBZECC:
  3856. return OPVCC(31, 200, 0, 1)
  3857. case ASUBZEV:
  3858. return OPVCC(31, 200, 1, 0)
  3859. case ASUBZEVCC:
  3860. return OPVCC(31, 200, 1, 1)
  3861. case ASYNC:
  3862. return OPVCC(31, 598, 0, 0)
  3863. case ALWSYNC:
  3864. return OPVCC(31, 598, 0, 0) | 1<<21
  3865. case APTESYNC:
  3866. return OPVCC(31, 598, 0, 0) | 2<<21
  3867. case ATLBIE:
  3868. return OPVCC(31, 306, 0, 0)
  3869. case ATLBIEL:
  3870. return OPVCC(31, 274, 0, 0)
  3871. case ATLBSYNC:
  3872. return OPVCC(31, 566, 0, 0)
  3873. case ASLBIA:
  3874. return OPVCC(31, 498, 0, 0)
  3875. case ASLBIE:
  3876. return OPVCC(31, 434, 0, 0)
  3877. case ASLBMFEE:
  3878. return OPVCC(31, 915, 0, 0)
  3879. case ASLBMFEV:
  3880. return OPVCC(31, 851, 0, 0)
  3881. case ASLBMTE:
  3882. return OPVCC(31, 402, 0, 0)
  3883. case ATW:
  3884. return OPVCC(31, 4, 0, 0)
  3885. case ATD:
  3886. return OPVCC(31, 68, 0, 0)
  3887. /* Vector (VMX/Altivec) instructions */
  3888. /* ISA 2.03 enables these for PPC970. For POWERx processors, these */
  3889. /* are enabled starting at POWER6 (ISA 2.05). */
  3890. case AVAND:
  3891. return OPVX(4, 1028, 0, 0) /* vand - v2.03 */
  3892. case AVANDC:
  3893. return OPVX(4, 1092, 0, 0) /* vandc - v2.03 */
  3894. case AVNAND:
  3895. return OPVX(4, 1412, 0, 0) /* vnand - v2.07 */
  3896. case AVOR:
  3897. return OPVX(4, 1156, 0, 0) /* vor - v2.03 */
  3898. case AVORC:
  3899. return OPVX(4, 1348, 0, 0) /* vorc - v2.07 */
  3900. case AVNOR:
  3901. return OPVX(4, 1284, 0, 0) /* vnor - v2.03 */
  3902. case AVXOR:
  3903. return OPVX(4, 1220, 0, 0) /* vxor - v2.03 */
  3904. case AVEQV:
  3905. return OPVX(4, 1668, 0, 0) /* veqv - v2.07 */
  3906. case AVADDUBM:
  3907. return OPVX(4, 0, 0, 0) /* vaddubm - v2.03 */
  3908. case AVADDUHM:
  3909. return OPVX(4, 64, 0, 0) /* vadduhm - v2.03 */
  3910. case AVADDUWM:
  3911. return OPVX(4, 128, 0, 0) /* vadduwm - v2.03 */
  3912. case AVADDUDM:
  3913. return OPVX(4, 192, 0, 0) /* vaddudm - v2.07 */
  3914. case AVADDUQM:
  3915. return OPVX(4, 256, 0, 0) /* vadduqm - v2.07 */
  3916. case AVADDCUQ:
  3917. return OPVX(4, 320, 0, 0) /* vaddcuq - v2.07 */
  3918. case AVADDCUW:
  3919. return OPVX(4, 384, 0, 0) /* vaddcuw - v2.03 */
  3920. case AVADDUBS:
  3921. return OPVX(4, 512, 0, 0) /* vaddubs - v2.03 */
  3922. case AVADDUHS:
  3923. return OPVX(4, 576, 0, 0) /* vadduhs - v2.03 */
  3924. case AVADDUWS:
  3925. return OPVX(4, 640, 0, 0) /* vadduws - v2.03 */
  3926. case AVADDSBS:
  3927. return OPVX(4, 768, 0, 0) /* vaddsbs - v2.03 */
  3928. case AVADDSHS:
  3929. return OPVX(4, 832, 0, 0) /* vaddshs - v2.03 */
  3930. case AVADDSWS:
  3931. return OPVX(4, 896, 0, 0) /* vaddsws - v2.03 */
  3932. case AVADDEUQM:
  3933. return OPVX(4, 60, 0, 0) /* vaddeuqm - v2.07 */
  3934. case AVADDECUQ:
  3935. return OPVX(4, 61, 0, 0) /* vaddecuq - v2.07 */
  3936. case AVMULESB:
  3937. return OPVX(4, 776, 0, 0) /* vmulesb - v2.03 */
  3938. case AVMULOSB:
  3939. return OPVX(4, 264, 0, 0) /* vmulosb - v2.03 */
  3940. case AVMULEUB:
  3941. return OPVX(4, 520, 0, 0) /* vmuleub - v2.03 */
  3942. case AVMULOUB:
  3943. return OPVX(4, 8, 0, 0) /* vmuloub - v2.03 */
  3944. case AVMULESH:
  3945. return OPVX(4, 840, 0, 0) /* vmulesh - v2.03 */
  3946. case AVMULOSH:
  3947. return OPVX(4, 328, 0, 0) /* vmulosh - v2.03 */
  3948. case AVMULEUH:
  3949. return OPVX(4, 584, 0, 0) /* vmuleuh - v2.03 */
  3950. case AVMULOUH:
  3951. return OPVX(4, 72, 0, 0) /* vmulouh - v2.03 */
  3952. case AVMULESW:
  3953. return OPVX(4, 904, 0, 0) /* vmulesw - v2.07 */
  3954. case AVMULOSW:
  3955. return OPVX(4, 392, 0, 0) /* vmulosw - v2.07 */
  3956. case AVMULEUW:
  3957. return OPVX(4, 648, 0, 0) /* vmuleuw - v2.07 */
  3958. case AVMULOUW:
  3959. return OPVX(4, 136, 0, 0) /* vmulouw - v2.07 */
  3960. case AVMULUWM:
  3961. return OPVX(4, 137, 0, 0) /* vmuluwm - v2.07 */
  3962. case AVPMSUMB:
  3963. return OPVX(4, 1032, 0, 0) /* vpmsumb - v2.07 */
  3964. case AVPMSUMH:
  3965. return OPVX(4, 1096, 0, 0) /* vpmsumh - v2.07 */
  3966. case AVPMSUMW:
  3967. return OPVX(4, 1160, 0, 0) /* vpmsumw - v2.07 */
  3968. case AVPMSUMD:
  3969. return OPVX(4, 1224, 0, 0) /* vpmsumd - v2.07 */
  3970. case AVMSUMUDM:
  3971. return OPVX(4, 35, 0, 0) /* vmsumudm - v3.00b */
  3972. case AVSUBUBM:
  3973. return OPVX(4, 1024, 0, 0) /* vsububm - v2.03 */
  3974. case AVSUBUHM:
  3975. return OPVX(4, 1088, 0, 0) /* vsubuhm - v2.03 */
  3976. case AVSUBUWM:
  3977. return OPVX(4, 1152, 0, 0) /* vsubuwm - v2.03 */
  3978. case AVSUBUDM:
  3979. return OPVX(4, 1216, 0, 0) /* vsubudm - v2.07 */
  3980. case AVSUBUQM:
  3981. return OPVX(4, 1280, 0, 0) /* vsubuqm - v2.07 */
  3982. case AVSUBCUQ:
  3983. return OPVX(4, 1344, 0, 0) /* vsubcuq - v2.07 */
  3984. case AVSUBCUW:
  3985. return OPVX(4, 1408, 0, 0) /* vsubcuw - v2.03 */
  3986. case AVSUBUBS:
  3987. return OPVX(4, 1536, 0, 0) /* vsububs - v2.03 */
  3988. case AVSUBUHS:
  3989. return OPVX(4, 1600, 0, 0) /* vsubuhs - v2.03 */
  3990. case AVSUBUWS:
  3991. return OPVX(4, 1664, 0, 0) /* vsubuws - v2.03 */
  3992. case AVSUBSBS:
  3993. return OPVX(4, 1792, 0, 0) /* vsubsbs - v2.03 */
  3994. case AVSUBSHS:
  3995. return OPVX(4, 1856, 0, 0) /* vsubshs - v2.03 */
  3996. case AVSUBSWS:
  3997. return OPVX(4, 1920, 0, 0) /* vsubsws - v2.03 */
  3998. case AVSUBEUQM:
  3999. return OPVX(4, 62, 0, 0) /* vsubeuqm - v2.07 */
  4000. case AVSUBECUQ:
  4001. return OPVX(4, 63, 0, 0) /* vsubecuq - v2.07 */
  4002. case AVRLB:
  4003. return OPVX(4, 4, 0, 0) /* vrlb - v2.03 */
  4004. case AVRLH:
  4005. return OPVX(4, 68, 0, 0) /* vrlh - v2.03 */
  4006. case AVRLW:
  4007. return OPVX(4, 132, 0, 0) /* vrlw - v2.03 */
  4008. case AVRLD:
  4009. return OPVX(4, 196, 0, 0) /* vrld - v2.07 */
  4010. case AVMRGOW:
  4011. return OPVX(4, 1676, 0, 0) /* vmrgow - v2.07 */
  4012. case AVMRGEW:
  4013. return OPVX(4, 1932, 0, 0) /* vmrgew - v2.07 */
  4014. case AVSLB:
  4015. return OPVX(4, 260, 0, 0) /* vslh - v2.03 */
  4016. case AVSLH:
  4017. return OPVX(4, 324, 0, 0) /* vslh - v2.03 */
  4018. case AVSLW:
  4019. return OPVX(4, 388, 0, 0) /* vslw - v2.03 */
  4020. case AVSL:
  4021. return OPVX(4, 452, 0, 0) /* vsl - v2.03 */
  4022. case AVSLO:
  4023. return OPVX(4, 1036, 0, 0) /* vsl - v2.03 */
  4024. case AVSRB:
  4025. return OPVX(4, 516, 0, 0) /* vsrb - v2.03 */
  4026. case AVSRH:
  4027. return OPVX(4, 580, 0, 0) /* vsrh - v2.03 */
  4028. case AVSRW:
  4029. return OPVX(4, 644, 0, 0) /* vsrw - v2.03 */
  4030. case AVSR:
  4031. return OPVX(4, 708, 0, 0) /* vsr - v2.03 */
  4032. case AVSRO:
  4033. return OPVX(4, 1100, 0, 0) /* vsro - v2.03 */
  4034. case AVSLD:
  4035. return OPVX(4, 1476, 0, 0) /* vsld - v2.07 */
  4036. case AVSRD:
  4037. return OPVX(4, 1732, 0, 0) /* vsrd - v2.07 */
  4038. case AVSRAB:
  4039. return OPVX(4, 772, 0, 0) /* vsrab - v2.03 */
  4040. case AVSRAH:
  4041. return OPVX(4, 836, 0, 0) /* vsrah - v2.03 */
  4042. case AVSRAW:
  4043. return OPVX(4, 900, 0, 0) /* vsraw - v2.03 */
  4044. case AVSRAD:
  4045. return OPVX(4, 964, 0, 0) /* vsrad - v2.07 */
  4046. case AVBPERMQ:
  4047. return OPVC(4, 1356, 0, 0) /* vbpermq - v2.07 */
  4048. case AVBPERMD:
  4049. return OPVC(4, 1484, 0, 0) /* vbpermd - v3.00 */
  4050. case AVCLZB:
  4051. return OPVX(4, 1794, 0, 0) /* vclzb - v2.07 */
  4052. case AVCLZH:
  4053. return OPVX(4, 1858, 0, 0) /* vclzh - v2.07 */
  4054. case AVCLZW:
  4055. return OPVX(4, 1922, 0, 0) /* vclzw - v2.07 */
  4056. case AVCLZD:
  4057. return OPVX(4, 1986, 0, 0) /* vclzd - v2.07 */
  4058. case AVPOPCNTB:
  4059. return OPVX(4, 1795, 0, 0) /* vpopcntb - v2.07 */
  4060. case AVPOPCNTH:
  4061. return OPVX(4, 1859, 0, 0) /* vpopcnth - v2.07 */
  4062. case AVPOPCNTW:
  4063. return OPVX(4, 1923, 0, 0) /* vpopcntw - v2.07 */
  4064. case AVPOPCNTD:
  4065. return OPVX(4, 1987, 0, 0) /* vpopcntd - v2.07 */
  4066. case AVCMPEQUB:
  4067. return OPVC(4, 6, 0, 0) /* vcmpequb - v2.03 */
  4068. case AVCMPEQUBCC:
  4069. return OPVC(4, 6, 0, 1) /* vcmpequb. - v2.03 */
  4070. case AVCMPEQUH:
  4071. return OPVC(4, 70, 0, 0) /* vcmpequh - v2.03 */
  4072. case AVCMPEQUHCC:
  4073. return OPVC(4, 70, 0, 1) /* vcmpequh. - v2.03 */
  4074. case AVCMPEQUW:
  4075. return OPVC(4, 134, 0, 0) /* vcmpequw - v2.03 */
  4076. case AVCMPEQUWCC:
  4077. return OPVC(4, 134, 0, 1) /* vcmpequw. - v2.03 */
  4078. case AVCMPEQUD:
  4079. return OPVC(4, 199, 0, 0) /* vcmpequd - v2.07 */
  4080. case AVCMPEQUDCC:
  4081. return OPVC(4, 199, 0, 1) /* vcmpequd. - v2.07 */
  4082. case AVCMPGTUB:
  4083. return OPVC(4, 518, 0, 0) /* vcmpgtub - v2.03 */
  4084. case AVCMPGTUBCC:
  4085. return OPVC(4, 518, 0, 1) /* vcmpgtub. - v2.03 */
  4086. case AVCMPGTUH:
  4087. return OPVC(4, 582, 0, 0) /* vcmpgtuh - v2.03 */
  4088. case AVCMPGTUHCC:
  4089. return OPVC(4, 582, 0, 1) /* vcmpgtuh. - v2.03 */
  4090. case AVCMPGTUW:
  4091. return OPVC(4, 646, 0, 0) /* vcmpgtuw - v2.03 */
  4092. case AVCMPGTUWCC:
  4093. return OPVC(4, 646, 0, 1) /* vcmpgtuw. - v2.03 */
  4094. case AVCMPGTUD:
  4095. return OPVC(4, 711, 0, 0) /* vcmpgtud - v2.07 */
  4096. case AVCMPGTUDCC:
  4097. return OPVC(4, 711, 0, 1) /* vcmpgtud. v2.07 */
  4098. case AVCMPGTSB:
  4099. return OPVC(4, 774, 0, 0) /* vcmpgtsb - v2.03 */
  4100. case AVCMPGTSBCC:
  4101. return OPVC(4, 774, 0, 1) /* vcmpgtsb. - v2.03 */
  4102. case AVCMPGTSH:
  4103. return OPVC(4, 838, 0, 0) /* vcmpgtsh - v2.03 */
  4104. case AVCMPGTSHCC:
  4105. return OPVC(4, 838, 0, 1) /* vcmpgtsh. - v2.03 */
  4106. case AVCMPGTSW:
  4107. return OPVC(4, 902, 0, 0) /* vcmpgtsw - v2.03 */
  4108. case AVCMPGTSWCC:
  4109. return OPVC(4, 902, 0, 1) /* vcmpgtsw. - v2.03 */
  4110. case AVCMPGTSD:
  4111. return OPVC(4, 967, 0, 0) /* vcmpgtsd - v2.07 */
  4112. case AVCMPGTSDCC:
  4113. return OPVC(4, 967, 0, 1) /* vcmpgtsd. - v2.07 */
  4114. case AVCMPNEZB:
  4115. return OPVC(4, 263, 0, 0) /* vcmpnezb - v3.00 */
  4116. case AVCMPNEZBCC:
  4117. return OPVC(4, 263, 0, 1) /* vcmpnezb. - v3.00 */
  4118. case AVCMPNEB:
  4119. return OPVC(4, 7, 0, 0) /* vcmpneb - v3.00 */
  4120. case AVCMPNEBCC:
  4121. return OPVC(4, 7, 0, 1) /* vcmpneb. - v3.00 */
  4122. case AVCMPNEH:
  4123. return OPVC(4, 71, 0, 0) /* vcmpneh - v3.00 */
  4124. case AVCMPNEHCC:
  4125. return OPVC(4, 71, 0, 1) /* vcmpneh. - v3.00 */
  4126. case AVCMPNEW:
  4127. return OPVC(4, 135, 0, 0) /* vcmpnew - v3.00 */
  4128. case AVCMPNEWCC:
  4129. return OPVC(4, 135, 0, 1) /* vcmpnew. - v3.00 */
  4130. case AVPERM:
  4131. return OPVX(4, 43, 0, 0) /* vperm - v2.03 */
  4132. case AVPERMXOR:
  4133. return OPVX(4, 45, 0, 0) /* vpermxor - v2.03 */
  4134. case AVPERMR:
  4135. return OPVX(4, 59, 0, 0) /* vpermr - v3.0 */
  4136. case AVSEL:
  4137. return OPVX(4, 42, 0, 0) /* vsel - v2.03 */
  4138. case AVCIPHER:
  4139. return OPVX(4, 1288, 0, 0) /* vcipher - v2.07 */
  4140. case AVCIPHERLAST:
  4141. return OPVX(4, 1289, 0, 0) /* vcipherlast - v2.07 */
  4142. case AVNCIPHER:
  4143. return OPVX(4, 1352, 0, 0) /* vncipher - v2.07 */
  4144. case AVNCIPHERLAST:
  4145. return OPVX(4, 1353, 0, 0) /* vncipherlast - v2.07 */
  4146. case AVSBOX:
  4147. return OPVX(4, 1480, 0, 0) /* vsbox - v2.07 */
  4148. /* End of vector instructions */
  4149. /* Vector scalar (VSX) instructions */
  4150. /* ISA 2.06 enables these for POWER7. */
  4151. case AMFVSRD, AMFVRD, AMFFPRD:
  4152. return OPVXX1(31, 51, 0) /* mfvsrd - v2.07 */
  4153. case AMFVSRWZ:
  4154. return OPVXX1(31, 115, 0) /* mfvsrwz - v2.07 */
  4155. case AMFVSRLD:
  4156. return OPVXX1(31, 307, 0) /* mfvsrld - v3.00 */
  4157. case AMTVSRD, AMTFPRD, AMTVRD:
  4158. return OPVXX1(31, 179, 0) /* mtvsrd - v2.07 */
  4159. case AMTVSRWA:
  4160. return OPVXX1(31, 211, 0) /* mtvsrwa - v2.07 */
  4161. case AMTVSRWZ:
  4162. return OPVXX1(31, 243, 0) /* mtvsrwz - v2.07 */
  4163. case AMTVSRDD:
  4164. return OPVXX1(31, 435, 0) /* mtvsrdd - v3.00 */
  4165. case AMTVSRWS:
  4166. return OPVXX1(31, 403, 0) /* mtvsrws - v3.00 */
  4167. case AXXLAND:
  4168. return OPVXX3(60, 130, 0) /* xxland - v2.06 */
  4169. case AXXLANDC:
  4170. return OPVXX3(60, 138, 0) /* xxlandc - v2.06 */
  4171. case AXXLEQV:
  4172. return OPVXX3(60, 186, 0) /* xxleqv - v2.07 */
  4173. case AXXLNAND:
  4174. return OPVXX3(60, 178, 0) /* xxlnand - v2.07 */
  4175. case AXXLORC:
  4176. return OPVXX3(60, 170, 0) /* xxlorc - v2.07 */
  4177. case AXXLNOR:
  4178. return OPVXX3(60, 162, 0) /* xxlnor - v2.06 */
  4179. case AXXLOR, AXXLORQ:
  4180. return OPVXX3(60, 146, 0) /* xxlor - v2.06 */
  4181. case AXXLXOR:
  4182. return OPVXX3(60, 154, 0) /* xxlxor - v2.06 */
  4183. case AXXSEL:
  4184. return OPVXX4(60, 3, 0) /* xxsel - v2.06 */
  4185. case AXXMRGHW:
  4186. return OPVXX3(60, 18, 0) /* xxmrghw - v2.06 */
  4187. case AXXMRGLW:
  4188. return OPVXX3(60, 50, 0) /* xxmrglw - v2.06 */
  4189. case AXXSPLTW:
  4190. return OPVXX2(60, 164, 0) /* xxspltw - v2.06 */
  4191. case AXXSPLTIB:
  4192. return OPVCC(60, 360, 0, 0) /* xxspltib - v3.0 */
  4193. case AXXPERM:
  4194. return OPVXX3(60, 26, 0) /* xxperm - v2.06 */
  4195. case AXXPERMDI:
  4196. return OPVXX3(60, 10, 0) /* xxpermdi - v2.06 */
  4197. case AXXSLDWI:
  4198. return OPVXX3(60, 2, 0) /* xxsldwi - v2.06 */
  4199. case AXXBRQ:
  4200. return OPVXX2VA(60, 475, 31) /* xxbrq - v3.0 */
  4201. case AXXBRD:
  4202. return OPVXX2VA(60, 475, 23) /* xxbrd - v3.0 */
  4203. case AXXBRW:
  4204. return OPVXX2VA(60, 475, 15) /* xxbrw - v3.0 */
  4205. case AXXBRH:
  4206. return OPVXX2VA(60, 475, 7) /* xxbrh - v3.0 */
  4207. case AXSCVDPSP:
  4208. return OPVXX2(60, 265, 0) /* xscvdpsp - v2.06 */
  4209. case AXSCVSPDP:
  4210. return OPVXX2(60, 329, 0) /* xscvspdp - v2.06 */
  4211. case AXSCVDPSPN:
  4212. return OPVXX2(60, 267, 0) /* xscvdpspn - v2.07 */
  4213. case AXSCVSPDPN:
  4214. return OPVXX2(60, 331, 0) /* xscvspdpn - v2.07 */
  4215. case AXVCVDPSP:
  4216. return OPVXX2(60, 393, 0) /* xvcvdpsp - v2.06 */
  4217. case AXVCVSPDP:
  4218. return OPVXX2(60, 457, 0) /* xvcvspdp - v2.06 */
  4219. case AXSCVDPSXDS:
  4220. return OPVXX2(60, 344, 0) /* xscvdpsxds - v2.06 */
  4221. case AXSCVDPSXWS:
  4222. return OPVXX2(60, 88, 0) /* xscvdpsxws - v2.06 */
  4223. case AXSCVDPUXDS:
  4224. return OPVXX2(60, 328, 0) /* xscvdpuxds - v2.06 */
  4225. case AXSCVDPUXWS:
  4226. return OPVXX2(60, 72, 0) /* xscvdpuxws - v2.06 */
  4227. case AXSCVSXDDP:
  4228. return OPVXX2(60, 376, 0) /* xscvsxddp - v2.06 */
  4229. case AXSCVUXDDP:
  4230. return OPVXX2(60, 360, 0) /* xscvuxddp - v2.06 */
  4231. case AXSCVSXDSP:
  4232. return OPVXX2(60, 312, 0) /* xscvsxdsp - v2.06 */
  4233. case AXSCVUXDSP:
  4234. return OPVXX2(60, 296, 0) /* xscvuxdsp - v2.06 */
  4235. case AXVCVDPSXDS:
  4236. return OPVXX2(60, 472, 0) /* xvcvdpsxds - v2.06 */
  4237. case AXVCVDPSXWS:
  4238. return OPVXX2(60, 216, 0) /* xvcvdpsxws - v2.06 */
  4239. case AXVCVDPUXDS:
  4240. return OPVXX2(60, 456, 0) /* xvcvdpuxds - v2.06 */
  4241. case AXVCVDPUXWS:
  4242. return OPVXX2(60, 200, 0) /* xvcvdpuxws - v2.06 */
  4243. case AXVCVSPSXDS:
  4244. return OPVXX2(60, 408, 0) /* xvcvspsxds - v2.07 */
  4245. case AXVCVSPSXWS:
  4246. return OPVXX2(60, 152, 0) /* xvcvspsxws - v2.07 */
  4247. case AXVCVSPUXDS:
  4248. return OPVXX2(60, 392, 0) /* xvcvspuxds - v2.07 */
  4249. case AXVCVSPUXWS:
  4250. return OPVXX2(60, 136, 0) /* xvcvspuxws - v2.07 */
  4251. case AXVCVSXDDP:
  4252. return OPVXX2(60, 504, 0) /* xvcvsxddp - v2.06 */
  4253. case AXVCVSXWDP:
  4254. return OPVXX2(60, 248, 0) /* xvcvsxwdp - v2.06 */
  4255. case AXVCVUXDDP:
  4256. return OPVXX2(60, 488, 0) /* xvcvuxddp - v2.06 */
  4257. case AXVCVUXWDP:
  4258. return OPVXX2(60, 232, 0) /* xvcvuxwdp - v2.06 */
  4259. case AXVCVSXDSP:
  4260. return OPVXX2(60, 440, 0) /* xvcvsxdsp - v2.06 */
  4261. case AXVCVSXWSP:
  4262. return OPVXX2(60, 184, 0) /* xvcvsxwsp - v2.06 */
  4263. case AXVCVUXDSP:
  4264. return OPVXX2(60, 424, 0) /* xvcvuxdsp - v2.06 */
  4265. case AXVCVUXWSP:
  4266. return OPVXX2(60, 168, 0) /* xvcvuxwsp - v2.06 */
  4267. /* End of VSX instructions */
  4268. case AMADDHD:
  4269. return OPVX(4, 48, 0, 0) /* maddhd - v3.00 */
  4270. case AMADDHDU:
  4271. return OPVX(4, 49, 0, 0) /* maddhdu - v3.00 */
  4272. case AMADDLD:
  4273. return OPVX(4, 51, 0, 0) /* maddld - v3.00 */
  4274. case AXOR:
  4275. return OPVCC(31, 316, 0, 0)
  4276. case AXORCC:
  4277. return OPVCC(31, 316, 0, 1)
  4278. }
  4279. c.ctxt.Diag("bad r/r, r/r/r or r/r/r/r opcode %v", a)
  4280. return 0
  4281. }
  4282. func (c *ctxt9) opirrr(a obj.As) uint32 {
  4283. switch a {
  4284. /* Vector (VMX/Altivec) instructions */
  4285. /* ISA 2.03 enables these for PPC970. For POWERx processors, these */
  4286. /* are enabled starting at POWER6 (ISA 2.05). */
  4287. case AVSLDOI:
  4288. return OPVX(4, 44, 0, 0) /* vsldoi - v2.03 */
  4289. }
  4290. c.ctxt.Diag("bad i/r/r/r opcode %v", a)
  4291. return 0
  4292. }
  4293. func (c *ctxt9) opiirr(a obj.As) uint32 {
  4294. switch a {
  4295. /* Vector (VMX/Altivec) instructions */
  4296. /* ISA 2.07 enables these for POWER8 and beyond. */
  4297. case AVSHASIGMAW:
  4298. return OPVX(4, 1666, 0, 0) /* vshasigmaw - v2.07 */
  4299. case AVSHASIGMAD:
  4300. return OPVX(4, 1730, 0, 0) /* vshasigmad - v2.07 */
  4301. }
  4302. c.ctxt.Diag("bad i/i/r/r opcode %v", a)
  4303. return 0
  4304. }
  4305. func (c *ctxt9) opirr(a obj.As) uint32 {
  4306. switch a {
  4307. case AADD:
  4308. return OPVCC(14, 0, 0, 0)
  4309. case AADDC:
  4310. return OPVCC(12, 0, 0, 0)
  4311. case AADDCCC:
  4312. return OPVCC(13, 0, 0, 0)
  4313. case AADDIS:
  4314. return OPVCC(15, 0, 0, 0) /* ADDIS */
  4315. case AANDCC:
  4316. return OPVCC(28, 0, 0, 0)
  4317. case AANDISCC:
  4318. return OPVCC(29, 0, 0, 0) /* ANDIS. */
  4319. case ABR:
  4320. return OPVCC(18, 0, 0, 0)
  4321. case ABL:
  4322. return OPVCC(18, 0, 0, 0) | 1
  4323. case obj.ADUFFZERO:
  4324. return OPVCC(18, 0, 0, 0) | 1
  4325. case obj.ADUFFCOPY:
  4326. return OPVCC(18, 0, 0, 0) | 1
  4327. case ABC:
  4328. return OPVCC(16, 0, 0, 0)
  4329. case ABCL:
  4330. return OPVCC(16, 0, 0, 0) | 1
  4331. case ABEQ:
  4332. return AOP_RRR(16<<26, 12, 2, 0)
  4333. case ABGE:
  4334. return AOP_RRR(16<<26, 4, 0, 0)
  4335. case ABGT:
  4336. return AOP_RRR(16<<26, 12, 1, 0)
  4337. case ABLE:
  4338. return AOP_RRR(16<<26, 4, 1, 0)
  4339. case ABLT:
  4340. return AOP_RRR(16<<26, 12, 0, 0)
  4341. case ABNE:
  4342. return AOP_RRR(16<<26, 4, 2, 0)
  4343. case ABVC:
  4344. return AOP_RRR(16<<26, 4, 3, 0) // apparently unordered-clear
  4345. case ABVS:
  4346. return AOP_RRR(16<<26, 12, 3, 0) // apparently unordered-set
  4347. case ACMP:
  4348. return OPVCC(11, 0, 0, 0) | 1<<21 /* L=1 */
  4349. case ACMPU:
  4350. return OPVCC(10, 0, 0, 0) | 1<<21
  4351. case ACMPW:
  4352. return OPVCC(11, 0, 0, 0) /* L=0 */
  4353. case ACMPWU:
  4354. return OPVCC(10, 0, 0, 0)
  4355. case ACMPEQB:
  4356. return OPVCC(31, 224, 0, 0) /* cmpeqb - v3.00 */
  4357. case ALSW:
  4358. return OPVCC(31, 597, 0, 0)
  4359. case ACOPY:
  4360. return OPVCC(31, 774, 0, 0) /* copy - v3.00 */
  4361. case APASTECC:
  4362. return OPVCC(31, 902, 0, 1) /* paste. - v3.00 */
  4363. case ADARN:
  4364. return OPVCC(31, 755, 0, 0) /* darn - v3.00 */
  4365. case AMULLW:
  4366. return OPVCC(7, 0, 0, 0)
  4367. case AOR:
  4368. return OPVCC(24, 0, 0, 0)
  4369. case AORIS:
  4370. return OPVCC(25, 0, 0, 0) /* ORIS */
  4371. case ARLWMI:
  4372. return OPVCC(20, 0, 0, 0) /* rlwimi */
  4373. case ARLWMICC:
  4374. return OPVCC(20, 0, 0, 1)
  4375. case ARLDMI:
  4376. return OPVCC(30, 0, 0, 0) | 3<<2 /* rldimi */
  4377. case ARLDMICC:
  4378. return OPVCC(30, 0, 0, 1) | 3<<2
  4379. case ARLDIMI:
  4380. return OPVCC(30, 0, 0, 0) | 3<<2 /* rldimi */
  4381. case ARLDIMICC:
  4382. return OPVCC(30, 0, 0, 1) | 3<<2
  4383. case ARLWNM:
  4384. return OPVCC(21, 0, 0, 0) /* rlwinm */
  4385. case ARLWNMCC:
  4386. return OPVCC(21, 0, 0, 1)
  4387. case ARLDCL:
  4388. return OPVCC(30, 0, 0, 0) /* rldicl */
  4389. case ARLDCLCC:
  4390. return OPVCC(30, 0, 0, 1)
  4391. case ARLDCR:
  4392. return OPVCC(30, 1, 0, 0) /* rldicr */
  4393. case ARLDCRCC:
  4394. return OPVCC(30, 1, 0, 1)
  4395. case ARLDC:
  4396. return OPVCC(30, 0, 0, 0) | 2<<2
  4397. case ARLDCCC:
  4398. return OPVCC(30, 0, 0, 1) | 2<<2
  4399. case ASRAW:
  4400. return OPVCC(31, 824, 0, 0)
  4401. case ASRAWCC:
  4402. return OPVCC(31, 824, 0, 1)
  4403. case ASRAD:
  4404. return OPVCC(31, (413 << 1), 0, 0)
  4405. case ASRADCC:
  4406. return OPVCC(31, (413 << 1), 0, 1)
  4407. case ASTSW:
  4408. return OPVCC(31, 725, 0, 0)
  4409. case ASUBC:
  4410. return OPVCC(8, 0, 0, 0)
  4411. case ATW:
  4412. return OPVCC(3, 0, 0, 0)
  4413. case ATD:
  4414. return OPVCC(2, 0, 0, 0)
  4415. /* Vector (VMX/Altivec) instructions */
  4416. /* ISA 2.03 enables these for PPC970. For POWERx processors, these */
  4417. /* are enabled starting at POWER6 (ISA 2.05). */
  4418. case AVSPLTB:
  4419. return OPVX(4, 524, 0, 0) /* vspltb - v2.03 */
  4420. case AVSPLTH:
  4421. return OPVX(4, 588, 0, 0) /* vsplth - v2.03 */
  4422. case AVSPLTW:
  4423. return OPVX(4, 652, 0, 0) /* vspltw - v2.03 */
  4424. case AVSPLTISB:
  4425. return OPVX(4, 780, 0, 0) /* vspltisb - v2.03 */
  4426. case AVSPLTISH:
  4427. return OPVX(4, 844, 0, 0) /* vspltish - v2.03 */
  4428. case AVSPLTISW:
  4429. return OPVX(4, 908, 0, 0) /* vspltisw - v2.03 */
  4430. /* End of vector instructions */
  4431. case AFTDIV:
  4432. return OPVCC(63, 128, 0, 0) /* ftdiv - v2.06 */
  4433. case AFTSQRT:
  4434. return OPVCC(63, 160, 0, 0) /* ftsqrt - v2.06 */
  4435. case AXOR:
  4436. return OPVCC(26, 0, 0, 0) /* XORIL */
  4437. case AXORIS:
  4438. return OPVCC(27, 0, 0, 0) /* XORIS */
  4439. }
  4440. c.ctxt.Diag("bad opcode i/r or i/r/r %v", a)
  4441. return 0
  4442. }
  4443. /*
  4444. * load o(a),d
  4445. */
  4446. func (c *ctxt9) opload(a obj.As) uint32 {
  4447. switch a {
  4448. case AMOVD:
  4449. return OPVCC(58, 0, 0, 0) /* ld */
  4450. case AMOVDU:
  4451. return OPVCC(58, 0, 0, 1) /* ldu */
  4452. case AMOVWZ:
  4453. return OPVCC(32, 0, 0, 0) /* lwz */
  4454. case AMOVWZU:
  4455. return OPVCC(33, 0, 0, 0) /* lwzu */
  4456. case AMOVW:
  4457. return OPVCC(58, 0, 0, 0) | 1<<1 /* lwa */
  4458. case ALXV:
  4459. return OPDQ(61, 1, 0) /* lxv - ISA v3.0 */
  4460. case ALXVL:
  4461. return OPVXX1(31, 269, 0) /* lxvl - ISA v3.0 */
  4462. case ALXVLL:
  4463. return OPVXX1(31, 301, 0) /* lxvll - ISA v3.0 */
  4464. case ALXVX:
  4465. return OPVXX1(31, 268, 0) /* lxvx - ISA v3.0 */
  4466. /* no AMOVWU */
  4467. case AMOVB, AMOVBZ:
  4468. return OPVCC(34, 0, 0, 0)
  4469. /* load */
  4470. case AMOVBU, AMOVBZU:
  4471. return OPVCC(35, 0, 0, 0)
  4472. case AFMOVD:
  4473. return OPVCC(50, 0, 0, 0)
  4474. case AFMOVDU:
  4475. return OPVCC(51, 0, 0, 0)
  4476. case AFMOVS:
  4477. return OPVCC(48, 0, 0, 0)
  4478. case AFMOVSU:
  4479. return OPVCC(49, 0, 0, 0)
  4480. case AMOVH:
  4481. return OPVCC(42, 0, 0, 0)
  4482. case AMOVHU:
  4483. return OPVCC(43, 0, 0, 0)
  4484. case AMOVHZ:
  4485. return OPVCC(40, 0, 0, 0)
  4486. case AMOVHZU:
  4487. return OPVCC(41, 0, 0, 0)
  4488. case AMOVMW:
  4489. return OPVCC(46, 0, 0, 0) /* lmw */
  4490. }
  4491. c.ctxt.Diag("bad load opcode %v", a)
  4492. return 0
  4493. }
  4494. /*
  4495. * indexed load a(b),d
  4496. */
  4497. func (c *ctxt9) oploadx(a obj.As) uint32 {
  4498. switch a {
  4499. case AMOVWZ:
  4500. return OPVCC(31, 23, 0, 0) /* lwzx */
  4501. case AMOVWZU:
  4502. return OPVCC(31, 55, 0, 0) /* lwzux */
  4503. case AMOVW:
  4504. return OPVCC(31, 341, 0, 0) /* lwax */
  4505. case AMOVWU:
  4506. return OPVCC(31, 373, 0, 0) /* lwaux */
  4507. case AMOVB, AMOVBZ:
  4508. return OPVCC(31, 87, 0, 0) /* lbzx */
  4509. case AMOVBU, AMOVBZU:
  4510. return OPVCC(31, 119, 0, 0) /* lbzux */
  4511. case AFMOVD:
  4512. return OPVCC(31, 599, 0, 0) /* lfdx */
  4513. case AFMOVDU:
  4514. return OPVCC(31, 631, 0, 0) /* lfdux */
  4515. case AFMOVS:
  4516. return OPVCC(31, 535, 0, 0) /* lfsx */
  4517. case AFMOVSU:
  4518. return OPVCC(31, 567, 0, 0) /* lfsux */
  4519. case AFMOVSX:
  4520. return OPVCC(31, 855, 0, 0) /* lfiwax - power6, isa 2.05 */
  4521. case AFMOVSZ:
  4522. return OPVCC(31, 887, 0, 0) /* lfiwzx - power7, isa 2.06 */
  4523. case AMOVH:
  4524. return OPVCC(31, 343, 0, 0) /* lhax */
  4525. case AMOVHU:
  4526. return OPVCC(31, 375, 0, 0) /* lhaux */
  4527. case AMOVHBR:
  4528. return OPVCC(31, 790, 0, 0) /* lhbrx */
  4529. case AMOVWBR:
  4530. return OPVCC(31, 534, 0, 0) /* lwbrx */
  4531. case AMOVDBR:
  4532. return OPVCC(31, 532, 0, 0) /* ldbrx */
  4533. case AMOVHZ:
  4534. return OPVCC(31, 279, 0, 0) /* lhzx */
  4535. case AMOVHZU:
  4536. return OPVCC(31, 311, 0, 0) /* lhzux */
  4537. case AECIWX:
  4538. return OPVCC(31, 310, 0, 0) /* eciwx */
  4539. case ALBAR:
  4540. return OPVCC(31, 52, 0, 0) /* lbarx */
  4541. case ALHAR:
  4542. return OPVCC(31, 116, 0, 0) /* lharx */
  4543. case ALWAR:
  4544. return OPVCC(31, 20, 0, 0) /* lwarx */
  4545. case ALDAR:
  4546. return OPVCC(31, 84, 0, 0) /* ldarx */
  4547. case ALSW:
  4548. return OPVCC(31, 533, 0, 0) /* lswx */
  4549. case AMOVD:
  4550. return OPVCC(31, 21, 0, 0) /* ldx */
  4551. case AMOVDU:
  4552. return OPVCC(31, 53, 0, 0) /* ldux */
  4553. case ALDMX:
  4554. return OPVCC(31, 309, 0, 0) /* ldmx */
  4555. /* Vector (VMX/Altivec) instructions */
  4556. case ALVEBX:
  4557. return OPVCC(31, 7, 0, 0) /* lvebx - v2.03 */
  4558. case ALVEHX:
  4559. return OPVCC(31, 39, 0, 0) /* lvehx - v2.03 */
  4560. case ALVEWX:
  4561. return OPVCC(31, 71, 0, 0) /* lvewx - v2.03 */
  4562. case ALVX:
  4563. return OPVCC(31, 103, 0, 0) /* lvx - v2.03 */
  4564. case ALVXL:
  4565. return OPVCC(31, 359, 0, 0) /* lvxl - v2.03 */
  4566. case ALVSL:
  4567. return OPVCC(31, 6, 0, 0) /* lvsl - v2.03 */
  4568. case ALVSR:
  4569. return OPVCC(31, 38, 0, 0) /* lvsr - v2.03 */
  4570. /* End of vector instructions */
  4571. /* Vector scalar (VSX) instructions */
  4572. case ALXVX:
  4573. return OPVXX1(31, 268, 0) /* lxvx - ISA v3.0 */
  4574. case ALXVD2X:
  4575. return OPVXX1(31, 844, 0) /* lxvd2x - v2.06 */
  4576. case ALXVW4X:
  4577. return OPVXX1(31, 780, 0) /* lxvw4x - v2.06 */
  4578. case ALXVH8X:
  4579. return OPVXX1(31, 812, 0) /* lxvh8x - v3.00 */
  4580. case ALXVB16X:
  4581. return OPVXX1(31, 876, 0) /* lxvb16x - v3.00 */
  4582. case ALXVDSX:
  4583. return OPVXX1(31, 332, 0) /* lxvdsx - v2.06 */
  4584. case ALXSDX:
  4585. return OPVXX1(31, 588, 0) /* lxsdx - v2.06 */
  4586. case ALXSIWAX:
  4587. return OPVXX1(31, 76, 0) /* lxsiwax - v2.07 */
  4588. case ALXSIWZX:
  4589. return OPVXX1(31, 12, 0) /* lxsiwzx - v2.07 */
  4590. }
  4591. c.ctxt.Diag("bad loadx opcode %v", a)
  4592. return 0
  4593. }
  4594. /*
  4595. * store s,o(d)
  4596. */
  4597. func (c *ctxt9) opstore(a obj.As) uint32 {
  4598. switch a {
  4599. case AMOVB, AMOVBZ:
  4600. return OPVCC(38, 0, 0, 0) /* stb */
  4601. case AMOVBU, AMOVBZU:
  4602. return OPVCC(39, 0, 0, 0) /* stbu */
  4603. case AFMOVD:
  4604. return OPVCC(54, 0, 0, 0) /* stfd */
  4605. case AFMOVDU:
  4606. return OPVCC(55, 0, 0, 0) /* stfdu */
  4607. case AFMOVS:
  4608. return OPVCC(52, 0, 0, 0) /* stfs */
  4609. case AFMOVSU:
  4610. return OPVCC(53, 0, 0, 0) /* stfsu */
  4611. case AMOVHZ, AMOVH:
  4612. return OPVCC(44, 0, 0, 0) /* sth */
  4613. case AMOVHZU, AMOVHU:
  4614. return OPVCC(45, 0, 0, 0) /* sthu */
  4615. case AMOVMW:
  4616. return OPVCC(47, 0, 0, 0) /* stmw */
  4617. case ASTSW:
  4618. return OPVCC(31, 725, 0, 0) /* stswi */
  4619. case AMOVWZ, AMOVW:
  4620. return OPVCC(36, 0, 0, 0) /* stw */
  4621. case AMOVWZU, AMOVWU:
  4622. return OPVCC(37, 0, 0, 0) /* stwu */
  4623. case AMOVD:
  4624. return OPVCC(62, 0, 0, 0) /* std */
  4625. case AMOVDU:
  4626. return OPVCC(62, 0, 0, 1) /* stdu */
  4627. case ASTXV:
  4628. return OPDQ(61, 5, 0) /* stxv ISA 3.0 */
  4629. case ASTXVL:
  4630. return OPVXX1(31, 397, 0) /* stxvl ISA 3.0 */
  4631. case ASTXVLL:
  4632. return OPVXX1(31, 429, 0) /* stxvll ISA 3.0 */
  4633. case ASTXVX:
  4634. return OPVXX1(31, 396, 0) /* stxvx - ISA v3.0 */
  4635. }
  4636. c.ctxt.Diag("unknown store opcode %v", a)
  4637. return 0
  4638. }
  4639. /*
  4640. * indexed store s,a(b)
  4641. */
  4642. func (c *ctxt9) opstorex(a obj.As) uint32 {
  4643. switch a {
  4644. case AMOVB, AMOVBZ:
  4645. return OPVCC(31, 215, 0, 0) /* stbx */
  4646. case AMOVBU, AMOVBZU:
  4647. return OPVCC(31, 247, 0, 0) /* stbux */
  4648. case AFMOVD:
  4649. return OPVCC(31, 727, 0, 0) /* stfdx */
  4650. case AFMOVDU:
  4651. return OPVCC(31, 759, 0, 0) /* stfdux */
  4652. case AFMOVS:
  4653. return OPVCC(31, 663, 0, 0) /* stfsx */
  4654. case AFMOVSU:
  4655. return OPVCC(31, 695, 0, 0) /* stfsux */
  4656. case AFMOVSX:
  4657. return OPVCC(31, 983, 0, 0) /* stfiwx */
  4658. case AMOVHZ, AMOVH:
  4659. return OPVCC(31, 407, 0, 0) /* sthx */
  4660. case AMOVHBR:
  4661. return OPVCC(31, 918, 0, 0) /* sthbrx */
  4662. case AMOVHZU, AMOVHU:
  4663. return OPVCC(31, 439, 0, 0) /* sthux */
  4664. case AMOVWZ, AMOVW:
  4665. return OPVCC(31, 151, 0, 0) /* stwx */
  4666. case AMOVWZU, AMOVWU:
  4667. return OPVCC(31, 183, 0, 0) /* stwux */
  4668. case ASTSW:
  4669. return OPVCC(31, 661, 0, 0) /* stswx */
  4670. case AMOVWBR:
  4671. return OPVCC(31, 662, 0, 0) /* stwbrx */
  4672. case AMOVDBR:
  4673. return OPVCC(31, 660, 0, 0) /* stdbrx */
  4674. case ASTBCCC:
  4675. return OPVCC(31, 694, 0, 1) /* stbcx. */
  4676. case ASTHCCC:
  4677. return OPVCC(31, 726, 0, 1) /* sthcx. */
  4678. case ASTWCCC:
  4679. return OPVCC(31, 150, 0, 1) /* stwcx. */
  4680. case ASTDCCC:
  4681. return OPVCC(31, 214, 0, 1) /* stwdx. */
  4682. case AECOWX:
  4683. return OPVCC(31, 438, 0, 0) /* ecowx */
  4684. case AMOVD:
  4685. return OPVCC(31, 149, 0, 0) /* stdx */
  4686. case AMOVDU:
  4687. return OPVCC(31, 181, 0, 0) /* stdux */
  4688. /* Vector (VMX/Altivec) instructions */
  4689. case ASTVEBX:
  4690. return OPVCC(31, 135, 0, 0) /* stvebx - v2.03 */
  4691. case ASTVEHX:
  4692. return OPVCC(31, 167, 0, 0) /* stvehx - v2.03 */
  4693. case ASTVEWX:
  4694. return OPVCC(31, 199, 0, 0) /* stvewx - v2.03 */
  4695. case ASTVX:
  4696. return OPVCC(31, 231, 0, 0) /* stvx - v2.03 */
  4697. case ASTVXL:
  4698. return OPVCC(31, 487, 0, 0) /* stvxl - v2.03 */
  4699. /* End of vector instructions */
  4700. /* Vector scalar (VSX) instructions */
  4701. case ASTXVX:
  4702. return OPVXX1(31, 396, 0) /* stxvx - v3.0 */
  4703. case ASTXVD2X:
  4704. return OPVXX1(31, 972, 0) /* stxvd2x - v2.06 */
  4705. case ASTXVW4X:
  4706. return OPVXX1(31, 908, 0) /* stxvw4x - v2.06 */
  4707. case ASTXVH8X:
  4708. return OPVXX1(31, 940, 0) /* stxvh8x - v3.0 */
  4709. case ASTXVB16X:
  4710. return OPVXX1(31, 1004, 0) /* stxvb16x - v3.0 */
  4711. case ASTXSDX:
  4712. return OPVXX1(31, 716, 0) /* stxsdx - v2.06 */
  4713. case ASTXSIWX:
  4714. return OPVXX1(31, 140, 0) /* stxsiwx - v2.07 */
  4715. /* End of vector scalar instructions */
  4716. }
  4717. c.ctxt.Diag("unknown storex opcode %v", a)
  4718. return 0
  4719. }