SVEInstrFormats.td 381 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560
  1. //=-- SVEInstrFormats.td - AArch64 SVE Instruction classes -*- tablegen -*--=//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // AArch64 Scalable Vector Extension (SVE) Instruction Class Definitions.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. def SDT_AArch64Setcc : SDTypeProfile<1, 4, [
  13. SDTCisVec<0>, SDTCisVec<1>, SDTCisVec<2>, SDTCisVec<3>,
  14. SDTCVecEltisVT<0, i1>, SDTCVecEltisVT<1, i1>, SDTCisSameAs<2, 3>,
  15. SDTCisVT<4, OtherVT>
  16. ]>;
  17. def AArch64setcc_z : SDNode<"AArch64ISD::SETCC_MERGE_ZERO", SDT_AArch64Setcc>;
  18. def SVEPatternOperand : AsmOperandClass {
  19. let Name = "SVEPattern";
  20. let ParserMethod = "tryParseSVEPattern";
  21. let PredicateMethod = "isSVEPattern";
  22. let RenderMethod = "addImmOperands";
  23. let DiagnosticType = "InvalidSVEPattern";
  24. }
  25. def sve_pred_enum : Operand<i32>, TImmLeaf<i32, [{
  26. return (((uint32_t)Imm) < 32);
  27. }]> {
  28. let PrintMethod = "printSVEPattern";
  29. let ParserMatchClass = SVEPatternOperand;
  30. }
  31. def SVEVecLenSpecifierOperand : AsmOperandClass {
  32. let Name = "SVEVecLenSpecifier";
  33. let ParserMethod = "tryParseSVEVecLenSpecifier";
  34. let PredicateMethod = "isSVEVecLenSpecifier";
  35. let RenderMethod = "addImmOperands";
  36. let DiagnosticType = "InvalidSVEVecLenSpecifier";
  37. }
  38. def sve_vec_len_specifier_enum : Operand<i32>, TImmLeaf<i32, [{
  39. return (((uint32_t)Imm) < 2);
  40. }]> {
  41. let PrintMethod = "printSVEVecLenSpecifier";
  42. let ParserMatchClass = SVEVecLenSpecifierOperand;
  43. }
  44. def SVEPrefetchOperand : AsmOperandClass {
  45. let Name = "SVEPrefetch";
  46. let ParserMethod = "tryParsePrefetch<true>";
  47. let PredicateMethod = "isPrefetch";
  48. let RenderMethod = "addPrefetchOperands";
  49. }
  50. def sve_prfop : Operand<i32>, TImmLeaf<i32, [{
  51. return (((uint32_t)Imm) <= 15);
  52. }]> {
  53. let PrintMethod = "printPrefetchOp<true>";
  54. let ParserMatchClass = SVEPrefetchOperand;
  55. }
  56. class SVELogicalImmOperand<int Width> : AsmOperandClass {
  57. let Name = "SVELogicalImm" # Width;
  58. let DiagnosticType = "LogicalSecondSource";
  59. let PredicateMethod = "isLogicalImm<int" # Width # "_t>";
  60. let RenderMethod = "addLogicalImmOperands<int" # Width # "_t>";
  61. }
  62. def sve_logical_imm8 : Operand<i64> {
  63. let ParserMatchClass = SVELogicalImmOperand<8>;
  64. let PrintMethod = "printLogicalImm<int8_t>";
  65. let MCOperandPredicate = [{
  66. if (!MCOp.isImm())
  67. return false;
  68. int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
  69. return AArch64_AM::isSVEMaskOfIdenticalElements<int8_t>(Val);
  70. }];
  71. }
  72. def sve_logical_imm16 : Operand<i64> {
  73. let ParserMatchClass = SVELogicalImmOperand<16>;
  74. let PrintMethod = "printLogicalImm<int16_t>";
  75. let MCOperandPredicate = [{
  76. if (!MCOp.isImm())
  77. return false;
  78. int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
  79. return AArch64_AM::isSVEMaskOfIdenticalElements<int16_t>(Val);
  80. }];
  81. }
  82. def sve_logical_imm32 : Operand<i64> {
  83. let ParserMatchClass = SVELogicalImmOperand<32>;
  84. let PrintMethod = "printLogicalImm<int32_t>";
  85. let MCOperandPredicate = [{
  86. if (!MCOp.isImm())
  87. return false;
  88. int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
  89. return AArch64_AM::isSVEMaskOfIdenticalElements<int32_t>(Val);
  90. }];
  91. }
  92. class SVEPreferredLogicalImmOperand<int Width> : AsmOperandClass {
  93. let Name = "SVEPreferredLogicalImm" # Width;
  94. let PredicateMethod = "isSVEPreferredLogicalImm<int" # Width # "_t>";
  95. let RenderMethod = "addLogicalImmOperands<int" # Width # "_t>";
  96. }
  97. def sve_preferred_logical_imm16 : Operand<i64> {
  98. let ParserMatchClass = SVEPreferredLogicalImmOperand<16>;
  99. let PrintMethod = "printSVELogicalImm<int16_t>";
  100. let MCOperandPredicate = [{
  101. if (!MCOp.isImm())
  102. return false;
  103. int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
  104. return AArch64_AM::isSVEMaskOfIdenticalElements<int16_t>(Val) &&
  105. AArch64_AM::isSVEMoveMaskPreferredLogicalImmediate(Val);
  106. }];
  107. }
  108. def sve_preferred_logical_imm32 : Operand<i64> {
  109. let ParserMatchClass = SVEPreferredLogicalImmOperand<32>;
  110. let PrintMethod = "printSVELogicalImm<int32_t>";
  111. let MCOperandPredicate = [{
  112. if (!MCOp.isImm())
  113. return false;
  114. int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
  115. return AArch64_AM::isSVEMaskOfIdenticalElements<int32_t>(Val) &&
  116. AArch64_AM::isSVEMoveMaskPreferredLogicalImmediate(Val);
  117. }];
  118. }
  119. def sve_preferred_logical_imm64 : Operand<i64> {
  120. let ParserMatchClass = SVEPreferredLogicalImmOperand<64>;
  121. let PrintMethod = "printSVELogicalImm<int64_t>";
  122. let MCOperandPredicate = [{
  123. if (!MCOp.isImm())
  124. return false;
  125. int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
  126. return AArch64_AM::isSVEMaskOfIdenticalElements<int64_t>(Val) &&
  127. AArch64_AM::isSVEMoveMaskPreferredLogicalImmediate(Val);
  128. }];
  129. }
  130. class SVELogicalImmNotOperand<int Width> : AsmOperandClass {
  131. let Name = "SVELogicalImm" # Width # "Not";
  132. let DiagnosticType = "LogicalSecondSource";
  133. let PredicateMethod = "isLogicalImm<int" # Width # "_t>";
  134. let RenderMethod = "addLogicalImmNotOperands<int" # Width # "_t>";
  135. }
  136. def sve_logical_imm8_not : Operand<i64> {
  137. let ParserMatchClass = SVELogicalImmNotOperand<8>;
  138. }
  139. def sve_logical_imm16_not : Operand<i64> {
  140. let ParserMatchClass = SVELogicalImmNotOperand<16>;
  141. }
  142. def sve_logical_imm32_not : Operand<i64> {
  143. let ParserMatchClass = SVELogicalImmNotOperand<32>;
  144. }
  145. class SVEShiftedImmOperand<int ElementWidth, string Infix, string Predicate>
  146. : AsmOperandClass {
  147. let Name = "SVE" # Infix # "Imm" # ElementWidth;
  148. let DiagnosticType = "Invalid" # Name;
  149. let RenderMethod = "addImmWithOptionalShiftOperands<8>";
  150. let ParserMethod = "tryParseImmWithOptionalShift";
  151. let PredicateMethod = Predicate;
  152. }
  153. def SVECpyImmOperand8 : SVEShiftedImmOperand<8, "Cpy", "isSVECpyImm<int8_t>">;
  154. def SVECpyImmOperand16 : SVEShiftedImmOperand<16, "Cpy", "isSVECpyImm<int16_t>">;
  155. def SVECpyImmOperand32 : SVEShiftedImmOperand<32, "Cpy", "isSVECpyImm<int32_t>">;
  156. def SVECpyImmOperand64 : SVEShiftedImmOperand<64, "Cpy", "isSVECpyImm<int64_t>">;
  157. def SVEAddSubImmOperand8 : SVEShiftedImmOperand<8, "AddSub", "isSVEAddSubImm<int8_t>">;
  158. def SVEAddSubImmOperand16 : SVEShiftedImmOperand<16, "AddSub", "isSVEAddSubImm<int16_t>">;
  159. def SVEAddSubImmOperand32 : SVEShiftedImmOperand<32, "AddSub", "isSVEAddSubImm<int32_t>">;
  160. def SVEAddSubImmOperand64 : SVEShiftedImmOperand<64, "AddSub", "isSVEAddSubImm<int64_t>">;
  161. class imm8_opt_lsl<int ElementWidth, string printType,
  162. AsmOperandClass OpndClass>
  163. : Operand<i32> {
  164. let EncoderMethod = "getImm8OptLsl";
  165. let DecoderMethod = "DecodeImm8OptLsl<" # ElementWidth # ">";
  166. let PrintMethod = "printImm8OptLsl<" # printType # ">";
  167. let ParserMatchClass = OpndClass;
  168. let MIOperandInfo = (ops i32imm, i32imm);
  169. }
  170. def cpy_imm8_opt_lsl_i8 : imm8_opt_lsl<8, "int8_t", SVECpyImmOperand8>;
  171. def cpy_imm8_opt_lsl_i16 : imm8_opt_lsl<16, "int16_t", SVECpyImmOperand16>;
  172. def cpy_imm8_opt_lsl_i32 : imm8_opt_lsl<32, "int32_t", SVECpyImmOperand32>;
  173. def cpy_imm8_opt_lsl_i64 : imm8_opt_lsl<64, "int64_t", SVECpyImmOperand64>;
  174. def addsub_imm8_opt_lsl_i8 : imm8_opt_lsl<8, "uint8_t", SVEAddSubImmOperand8>;
  175. def addsub_imm8_opt_lsl_i16 : imm8_opt_lsl<16, "uint16_t", SVEAddSubImmOperand16>;
  176. def addsub_imm8_opt_lsl_i32 : imm8_opt_lsl<32, "uint32_t", SVEAddSubImmOperand32>;
  177. def addsub_imm8_opt_lsl_i64 : imm8_opt_lsl<64, "uint64_t", SVEAddSubImmOperand64>;
  178. def SVEAddSubImm8Pat : ComplexPattern<i32, 2, "SelectSVEAddSubImm<MVT::i8>", []>;
  179. def SVEAddSubImm16Pat : ComplexPattern<i32, 2, "SelectSVEAddSubImm<MVT::i16>", []>;
  180. def SVEAddSubImm32Pat : ComplexPattern<i32, 2, "SelectSVEAddSubImm<MVT::i32>", []>;
  181. def SVEAddSubImm64Pat : ComplexPattern<i64, 2, "SelectSVEAddSubImm<MVT::i64>", []>;
  182. def SVECpyDupImm8Pat : ComplexPattern<i32, 2, "SelectSVECpyDupImm<MVT::i8>", []>;
  183. def SVECpyDupImm16Pat : ComplexPattern<i32, 2, "SelectSVECpyDupImm<MVT::i16>", []>;
  184. def SVECpyDupImm32Pat : ComplexPattern<i32, 2, "SelectSVECpyDupImm<MVT::i32>", []>;
  185. def SVECpyDupImm64Pat : ComplexPattern<i64, 2, "SelectSVECpyDupImm<MVT::i64>", []>;
  186. def SVELogicalImm8Pat : ComplexPattern<i32, 1, "SelectSVELogicalImm<MVT::i8>", []>;
  187. def SVELogicalImm16Pat : ComplexPattern<i32, 1, "SelectSVELogicalImm<MVT::i16>", []>;
  188. def SVELogicalImm32Pat : ComplexPattern<i32, 1, "SelectSVELogicalImm<MVT::i32>", []>;
  189. def SVELogicalImm64Pat : ComplexPattern<i64, 1, "SelectSVELogicalImm<MVT::i64>", []>;
  190. def SVELogicalImm8NotPat : ComplexPattern<i32, 1, "SelectSVELogicalImm<MVT::i8, true>", []>;
  191. def SVELogicalImm16NotPat : ComplexPattern<i32, 1, "SelectSVELogicalImm<MVT::i16, true>", []>;
  192. def SVELogicalImm32NotPat : ComplexPattern<i32, 1, "SelectSVELogicalImm<MVT::i32, true>", []>;
  193. def SVELogicalImm64NotPat : ComplexPattern<i64, 1, "SelectSVELogicalImm<MVT::i64, true>", []>;
  194. def SVEArithUImm8Pat : ComplexPattern<i32, 1, "SelectSVEArithImm<MVT::i8>", []>;
  195. def SVEArithUImm16Pat : ComplexPattern<i32, 1, "SelectSVEArithImm<MVT::i16>", []>;
  196. def SVEArithUImm32Pat : ComplexPattern<i32, 1, "SelectSVEArithImm<MVT::i32>", []>;
  197. def SVEArithUImm64Pat : ComplexPattern<i64, 1, "SelectSVEArithImm<MVT::i64>", []>;
  198. def SVEArithSImmPat32 : ComplexPattern<i32, 1, "SelectSVESignedArithImm", []>;
  199. def SVEArithSImmPat64 : ComplexPattern<i64, 1, "SelectSVESignedArithImm", []>;
  200. def SVEShiftImmL8 : ComplexPattern<i32, 1, "SelectSVEShiftImm<0, 7>", []>;
  201. def SVEShiftImmL16 : ComplexPattern<i32, 1, "SelectSVEShiftImm<0, 15>", []>;
  202. def SVEShiftImmL32 : ComplexPattern<i32, 1, "SelectSVEShiftImm<0, 31>", []>;
  203. def SVEShiftImmL64 : ComplexPattern<i64, 1, "SelectSVEShiftImm<0, 63>", []>;
  204. def SVEShiftImmR8 : ComplexPattern<i32, 1, "SelectSVEShiftImm<1, 8, true>", []>;
  205. def SVEShiftImmR16 : ComplexPattern<i32, 1, "SelectSVEShiftImm<1, 16, true>", []>;
  206. def SVEShiftImmR32 : ComplexPattern<i32, 1, "SelectSVEShiftImm<1, 32, true>", []>;
  207. def SVEShiftImmR64 : ComplexPattern<i64, 1, "SelectSVEShiftImm<1, 64, true>", []>;
  208. def SVEShiftSplatImmR : ComplexPattern<iAny, 1, "SelectSVEShiftSplatImmR", []>;
  209. def SVEAllActive : ComplexPattern<untyped, 0, "SelectAllActivePredicate", []>;
  210. class SVEExactFPImm<string Suffix, string ValA, string ValB> : AsmOperandClass {
  211. let Name = "SVEExactFPImmOperand" # Suffix;
  212. let DiagnosticType = "Invalid" # Name;
  213. let ParserMethod = "tryParseFPImm<false>";
  214. let PredicateMethod = "isExactFPImm<" # ValA # ", " # ValB # ">";
  215. let RenderMethod = "addExactFPImmOperands<" # ValA # ", " # ValB # ">";
  216. }
  217. class SVEExactFPImmOperand<string Suffix, string ValA, string ValB> : Operand<i32> {
  218. let PrintMethod = "printExactFPImm<" # ValA # ", " # ValB # ">";
  219. let ParserMatchClass = SVEExactFPImm<Suffix, ValA, ValB>;
  220. }
  221. def sve_fpimm_half_one
  222. : SVEExactFPImmOperand<"HalfOne", "AArch64ExactFPImm::half",
  223. "AArch64ExactFPImm::one">;
  224. def sve_fpimm_half_two
  225. : SVEExactFPImmOperand<"HalfTwo", "AArch64ExactFPImm::half",
  226. "AArch64ExactFPImm::two">;
  227. def sve_fpimm_zero_one
  228. : SVEExactFPImmOperand<"ZeroOne", "AArch64ExactFPImm::zero",
  229. "AArch64ExactFPImm::one">;
  230. def sve_incdec_imm : Operand<i32>, TImmLeaf<i32, [{
  231. return (((uint32_t)Imm) > 0) && (((uint32_t)Imm) < 17);
  232. }]> {
  233. let ParserMatchClass = Imm1_16Operand;
  234. let EncoderMethod = "getSVEIncDecImm";
  235. let DecoderMethod = "DecodeSVEIncDecImm";
  236. }
  237. // This allows i32 immediate extraction from i64 based arithmetic.
  238. def sve_cnt_mul_imm_i32 : ComplexPattern<i32, 1, "SelectCntImm<1, 16, 1, false>">;
  239. def sve_cnt_mul_imm_i64 : ComplexPattern<i64, 1, "SelectCntImm<1, 16, 1, false>">;
  240. def sve_cnt_shl_imm : ComplexPattern<i64, 1, "SelectCntImm<1, 16, 1, true>">;
  241. def sve_ext_imm_0_31 : ComplexPattern<i64, 1, "SelectEXTImm<31, 8>">;
  242. def sve_ext_imm_0_63 : ComplexPattern<i64, 1, "SelectEXTImm<63, 4>">;
  243. def sve_ext_imm_0_127 : ComplexPattern<i64, 1, "SelectEXTImm<127, 2>">;
  244. def sve_ext_imm_0_255 : ComplexPattern<i64, 1, "SelectEXTImm<255, 1>">;
  245. def int_aarch64_sve_cntp_oneuse : PatFrag<(ops node:$pred, node:$src2),
  246. (int_aarch64_sve_cntp node:$pred, node:$src2), [{
  247. return N->hasOneUse();
  248. }]>;
  249. def step_vector_oneuse : PatFrag<(ops node:$idx),
  250. (step_vector node:$idx), [{
  251. return N->hasOneUse();
  252. }]>;
  253. //===----------------------------------------------------------------------===//
  254. // SVE PTrue - These are used extensively throughout the pattern matching so
  255. // it's important we define them first.
  256. //===----------------------------------------------------------------------===//
  257. class sve_int_ptrue<bits<2> sz8_64, bits<3> opc, string asm, PPRRegOp pprty,
  258. ValueType vt, SDPatternOperator op>
  259. : I<(outs pprty:$Pd), (ins sve_pred_enum:$pattern),
  260. asm, "\t$Pd, $pattern",
  261. "",
  262. [(set (vt pprty:$Pd), (op sve_pred_enum:$pattern))]>, Sched<[]> {
  263. bits<4> Pd;
  264. bits<5> pattern;
  265. let Inst{31-24} = 0b00100101;
  266. let Inst{23-22} = sz8_64;
  267. let Inst{21-19} = 0b011;
  268. let Inst{18-17} = opc{2-1};
  269. let Inst{16} = opc{0};
  270. let Inst{15-10} = 0b111000;
  271. let Inst{9-5} = pattern;
  272. let Inst{4} = 0b0;
  273. let Inst{3-0} = Pd;
  274. let Defs = !if(!eq (opc{0}, 1), [NZCV], []);
  275. let ElementSize = pprty.ElementSize;
  276. let isReMaterializable = 1;
  277. }
  278. multiclass sve_int_ptrue<bits<3> opc, string asm, SDPatternOperator op> {
  279. def _B : sve_int_ptrue<0b00, opc, asm, PPR8, nxv16i1, op>;
  280. def _H : sve_int_ptrue<0b01, opc, asm, PPR16, nxv8i1, op>;
  281. def _S : sve_int_ptrue<0b10, opc, asm, PPR32, nxv4i1, op>;
  282. def _D : sve_int_ptrue<0b11, opc, asm, PPR64, nxv2i1, op>;
  283. def : InstAlias<asm # "\t$Pd",
  284. (!cast<Instruction>(NAME # _B) PPR8:$Pd, 0b11111), 1>;
  285. def : InstAlias<asm # "\t$Pd",
  286. (!cast<Instruction>(NAME # _H) PPR16:$Pd, 0b11111), 1>;
  287. def : InstAlias<asm # "\t$Pd",
  288. (!cast<Instruction>(NAME # _S) PPR32:$Pd, 0b11111), 1>;
  289. def : InstAlias<asm # "\t$Pd",
  290. (!cast<Instruction>(NAME # _D) PPR64:$Pd, 0b11111), 1>;
  291. }
  292. def SDT_AArch64PTrue : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVT<1, i32>]>;
  293. def AArch64ptrue : SDNode<"AArch64ISD::PTRUE", SDT_AArch64PTrue>;
  294. let Predicates = [HasSVEorSME] in {
  295. defm PTRUE : sve_int_ptrue<0b000, "ptrue", AArch64ptrue>;
  296. defm PTRUES : sve_int_ptrue<0b001, "ptrues", null_frag>;
  297. def : Pat<(nxv16i1 immAllOnesV), (PTRUE_B 31)>;
  298. def : Pat<(nxv8i1 immAllOnesV), (PTRUE_H 31)>;
  299. def : Pat<(nxv4i1 immAllOnesV), (PTRUE_S 31)>;
  300. def : Pat<(nxv2i1 immAllOnesV), (PTRUE_D 31)>;
  301. }
  302. //===----------------------------------------------------------------------===//
  303. // SVE pattern match helpers.
  304. //===----------------------------------------------------------------------===//
  305. class SVE_1_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
  306. Instruction inst>
  307. : Pat<(vtd (op vt1:$Op1)),
  308. (inst $Op1)>;
  309. class SVE_1_Op_Passthru_Pat<ValueType vtd, SDPatternOperator op, ValueType pg,
  310. ValueType vts, Instruction inst>
  311. : Pat<(vtd (op pg:$Op1, vts:$Op2, vtd:$Op3)),
  312. (inst $Op3, $Op1, $Op2)>;
  313. multiclass SVE_1_Op_PassthruUndef_Pat<ValueType vtd, SDPatternOperator op, ValueType pg,
  314. ValueType vts, Instruction inst> {
  315. def : Pat<(vtd (op pg:$Op1, vts:$Op2, (vtd undef))),
  316. (inst (IMPLICIT_DEF), $Op1, $Op2)>;
  317. def : Pat<(vtd (op (pg (SVEAllActive:$Op1)), vts:$Op2, vtd:$Op3)),
  318. (inst $Op3, $Op1, $Op2)>;
  319. }
  320. // Used to match FP_ROUND_MERGE_PASSTHRU, which has an additional flag for the
  321. // type of rounding. This is matched by timm0_1 in pattern below and ignored.
  322. class SVE_1_Op_Passthru_Round_Pat<ValueType vtd, SDPatternOperator op, ValueType pg,
  323. ValueType vts, Instruction inst>
  324. : Pat<(vtd (op pg:$Op1, vts:$Op2, (i64 timm0_1), vtd:$Op3)),
  325. (inst $Op3, $Op1, $Op2)>;
  326. multiclass SVE_1_Op_PassthruUndef_Round_Pat<ValueType vtd, SDPatternOperator op, ValueType pg,
  327. ValueType vts, Instruction inst>{
  328. def : Pat<(vtd (op pg:$Op1, vts:$Op2, (i64 timm0_1), (vtd undef))),
  329. (inst (IMPLICIT_DEF), $Op1, $Op2)>;
  330. def : Pat<(vtd (op (pg (SVEAllActive:$Op1)), vts:$Op2, (i64 timm0_1), vtd:$Op3)),
  331. (inst $Op3, $Op1, $Op2)>;
  332. }
  333. class SVE_1_Op_Imm_OptLsl_Pat<ValueType vt, SDPatternOperator op, ZPRRegOp zprty,
  334. ValueType it, ComplexPattern cpx, Instruction inst>
  335. : Pat<(vt (op (vt zprty:$Op1), (vt (splat_vector (it (cpx i32:$imm, i32:$shift)))))),
  336. (inst $Op1, i32:$imm, i32:$shift)>;
  337. class SVE_1_Op_Imm_Arith_All_Active<ValueType vt, ValueType pt, SDPatternOperator op,
  338. ZPRRegOp zprty, ValueType it, ComplexPattern cpx, Instruction inst>
  339. : Pat<(vt (op (pt (SVEAllActive)), (vt zprty:$Op1), (vt (splat_vector (it (cpx i32:$imm)))))),
  340. (inst $Op1, i32:$imm)>;
  341. class SVE_1_Op_Imm_Log_Pat<ValueType vt, SDPatternOperator op, ZPRRegOp zprty,
  342. ValueType it, ComplexPattern cpx, Instruction inst>
  343. : Pat<(vt (op (vt zprty:$Op1), (vt (splat_vector (it (cpx i64:$imm)))))),
  344. (inst $Op1, i64:$imm)>;
  345. class SVE_2_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
  346. ValueType vt2, Instruction inst>
  347. : Pat<(vtd (op vt1:$Op1, vt2:$Op2)),
  348. (inst $Op1, $Op2)>;
  349. class SVE_2_Op_Pred_All_Active<ValueType vtd, SDPatternOperator op,
  350. ValueType pt, ValueType vt1, ValueType vt2,
  351. Instruction inst>
  352. : Pat<(vtd (op (pt (SVEAllActive)), vt1:$Op1, vt2:$Op2)),
  353. (inst $Op1, $Op2)>;
  354. class SVE_2_Op_Pred_All_Active_Pt<ValueType vtd, SDPatternOperator op,
  355. ValueType pt, ValueType vt1, ValueType vt2,
  356. Instruction inst>
  357. : Pat<(vtd (op (pt (SVEAllActive:$Op1)), vt1:$Op2, vt2:$Op3)),
  358. (inst $Op1, $Op2, $Op3)>;
  359. class SVE_3_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
  360. ValueType vt2, ValueType vt3, Instruction inst>
  361. : Pat<(vtd (op vt1:$Op1, vt2:$Op2, vt3:$Op3)),
  362. (inst $Op1, $Op2, $Op3)>;
  363. multiclass SVE_3_Op_Undef_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
  364. ValueType vt2, ValueType vt3, Instruction inst> {
  365. def : Pat<(vtd (op (vt1 undef), vt2:$Op1, vt3:$Op2)),
  366. (inst (IMPLICIT_DEF), $Op1, $Op2)>;
  367. def : Pat<(vtd (op vt1:$Op1, (vt2 (SVEAllActive:$Op2)), vt3:$Op3)),
  368. (inst $Op1, $Op2, $Op3)>;
  369. }
  370. class SVE_4_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
  371. ValueType vt2, ValueType vt3, ValueType vt4,
  372. Instruction inst>
  373. : Pat<(vtd (op vt1:$Op1, vt2:$Op2, vt3:$Op3, vt4:$Op4)),
  374. (inst $Op1, $Op2, $Op3, $Op4)>;
  375. class SVE_2_Op_Imm_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
  376. ValueType vt2, Operand ImmTy, Instruction inst>
  377. : Pat<(vtd (op vt1:$Op1, (vt2 ImmTy:$Op2))),
  378. (inst $Op1, ImmTy:$Op2)>;
  379. class SVE_3_Op_Imm_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
  380. ValueType vt2, ValueType vt3, Operand ImmTy,
  381. Instruction inst>
  382. : Pat<(vtd (op vt1:$Op1, vt2:$Op2, (vt3 ImmTy:$Op3))),
  383. (inst $Op1, $Op2, ImmTy:$Op3)>;
  384. class SVE_4_Op_Imm_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
  385. ValueType vt2, ValueType vt3, ValueType vt4,
  386. Operand ImmTy, Instruction inst>
  387. : Pat<(vtd (op vt1:$Op1, vt2:$Op2, vt3:$Op3, (vt4 ImmTy:$Op4))),
  388. (inst $Op1, $Op2, $Op3, ImmTy:$Op4)>;
  389. def SVEDup0 : ComplexPattern<vAny, 0, "SelectDupZero", []>;
  390. def SVEDup0Undef : ComplexPattern<vAny, 0, "SelectDupZeroOrUndef", []>;
  391. let AddedComplexity = 1 in {
  392. class SVE_3_Op_Pat_SelZero<ValueType vtd, SDPatternOperator op, ValueType vt1,
  393. ValueType vt2, ValueType vt3, Instruction inst>
  394. : Pat<(vtd (vtd (op vt1:$Op1, (vselect vt1:$Op1, vt2:$Op2, (SVEDup0)), vt3:$Op3))),
  395. (inst $Op1, $Op2, $Op3)>;
  396. class SVE_3_Op_Pat_Shift_Imm_SelZero<ValueType vtd, SDPatternOperator op,
  397. ValueType vt1, ValueType vt2,
  398. Operand vt3, Instruction inst>
  399. : Pat<(vtd (op vt1:$Op1, (vselect vt1:$Op1, vt2:$Op2, (SVEDup0)), (i32 (vt3:$Op3)))),
  400. (inst $Op1, $Op2, vt3:$Op3)>;
  401. }
  402. //
  403. // Common but less generic patterns.
  404. //
  405. class SVE_1_Op_AllActive_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
  406. Instruction inst, Instruction ptrue>
  407. : Pat<(vtd (op vt1:$Op1)),
  408. (inst (IMPLICIT_DEF), (ptrue 31), $Op1)>;
  409. class SVE_2_Op_AllActive_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
  410. ValueType vt2, Instruction inst, Instruction ptrue>
  411. : Pat<(vtd (op vt1:$Op1, vt2:$Op2)),
  412. (inst (ptrue 31), $Op1, $Op2)>;
  413. class SVE_InReg_Extend<ValueType vt, SDPatternOperator op, ValueType pt,
  414. ValueType inreg_vt, Instruction inst>
  415. : Pat<(vt (op pt:$Pg, vt:$Src, inreg_vt, vt:$PassThru)),
  416. (inst $PassThru, $Pg, $Src)>;
  417. multiclass SVE_InReg_Extend_PassthruUndef<ValueType vt, SDPatternOperator op, ValueType pt,
  418. ValueType inreg_vt, Instruction inst> {
  419. def : Pat<(vt (op pt:$Pg, vt:$Src, inreg_vt, (vt undef))),
  420. (inst (IMPLICIT_DEF), $Pg, $Src)>;
  421. def : Pat<(vt (op (pt (SVEAllActive:$Pg)), vt:$Src, inreg_vt, vt:$PassThru)),
  422. (inst $PassThru, $Pg, $Src)>;
  423. }
  424. class SVE_Shift_DupImm_Pred_Pat<ValueType vt, SDPatternOperator op,
  425. ValueType pt, ValueType it,
  426. ComplexPattern cast, Instruction inst>
  427. : Pat<(vt (op pt:$Pg, vt:$Rn, (vt (splat_vector (it (cast i32:$imm)))))),
  428. (inst $Pg, $Rn, i32:$imm)>;
  429. class SVE_Shift_DupImm_All_Active_Pat<ValueType vt, SDPatternOperator op,
  430. ValueType pt, ValueType it,
  431. ComplexPattern cast, Instruction inst>
  432. : Pat<(vt (op (pt (SVEAllActive)), vt:$Rn, (vt (splat_vector (it (cast i32:$imm)))))),
  433. (inst $Rn, i32:$imm)>;
  434. class SVE_2_Op_Fp_Imm_Pat<ValueType vt, SDPatternOperator op,
  435. ValueType pt, ValueType it,
  436. FPImmLeaf immL, int imm,
  437. Instruction inst>
  438. : Pat<(vt (op (pt PPR_3b:$Pg), (vt ZPR:$Zs1), (vt (splat_vector (it immL))))),
  439. (inst $Pg, $Zs1, imm)>;
  440. class SVE_2_Op_Fp_Imm_Pat_Zero<ValueType vt, SDPatternOperator op,
  441. ValueType pt, ValueType it,
  442. FPImmLeaf immL, int imm,
  443. Instruction inst>
  444. : Pat<(vt (op pt:$Pg, (vselect pt:$Pg, vt:$Zs1, (SVEDup0)),
  445. (vt (splat_vector (it immL))))),
  446. (inst $Pg, $Zs1, imm)>;
  447. // Used to re-order the operands of BSP when lowering to BSL. BSP has the order:
  448. // mask, in1, in2 whereas BSL for SVE2 has them ordered in1, in2, mask
  449. class SVE_3_Op_BSP_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
  450. ValueType vt2, ValueType vt3, Instruction inst>
  451. : Pat<(vtd (op vt1:$Op1, vt2:$Op2, vt3:$Op3)),
  452. (inst $Op2, $Op3, $Op1)>;
  453. class SVE_Shift_Add_All_Active_Pat<ValueType vtd, SDPatternOperator op, ValueType pt,
  454. ValueType vt1, ValueType vt2, ValueType vt3,
  455. Instruction inst>
  456. : Pat<(vtd (add vt1:$Op1, (op (pt (SVEAllActive)), vt2:$Op2, vt3:$Op3))),
  457. (inst $Op1, $Op2, $Op3)>;
  458. class SVE2p1_Cvt_VG2_Pat<string name, SDPatternOperator intrinsic, ValueType out_vt, ValueType in_vt>
  459. : Pat<(out_vt (intrinsic in_vt:$Zn1, in_vt:$Zn2)),
  460. (!cast<Instruction>(name) (REG_SEQUENCE ZPR2Mul2, in_vt:$Zn1, zsub0, in_vt:$Zn2, zsub1))>;
  461. //===----------------------------------------------------------------------===//
  462. // SVE pattern match helpers.
  463. //===----------------------------------------------------------------------===//
  464. // Matches either an intrinsic, or a predicated operation with an all active predicate
  465. class EitherVSelectOrPassthruPatFrags<SDPatternOperator intrinsic, SDPatternOperator sdnode>
  466. : PatFrags<(ops node:$Pg, node:$Op1, node:$Op2), [
  467. (intrinsic node:$Pg, node:$Op1, node:$Op2),
  468. (vselect node:$Pg, (sdnode (SVEAllActive), node:$Op1, node:$Op2), node:$Op1),
  469. ]>;
  470. //
  471. // Pseudo -> Instruction mappings
  472. //
  473. def getSVEPseudoMap : InstrMapping {
  474. let FilterClass = "SVEPseudo2Instr";
  475. let RowFields = ["PseudoName"];
  476. let ColFields = ["IsInstr"];
  477. let KeyCol = ["0"];
  478. let ValueCols = [["1"]];
  479. }
  480. class SVEPseudo2Instr<string name, bit instr> {
  481. string PseudoName = name;
  482. bit IsInstr = instr;
  483. }
  484. // Lookup e.g. DIV -> DIVR
  485. def getSVERevInstr : InstrMapping {
  486. let FilterClass = "SVEInstr2Rev";
  487. let RowFields = ["InstrName"];
  488. let ColFields = ["isReverseInstr"];
  489. let KeyCol = ["0"];
  490. let ValueCols = [["1"]];
  491. }
  492. // Lookup e.g. DIVR -> DIV
  493. def getSVENonRevInstr : InstrMapping {
  494. let FilterClass = "SVEInstr2Rev";
  495. let RowFields = ["InstrName"];
  496. let ColFields = ["isReverseInstr"];
  497. let KeyCol = ["1"];
  498. let ValueCols = [["0"]];
  499. }
  500. class SVEInstr2Rev<string name1, string name2, bit name1IsReverseInstr> {
  501. string InstrName = !if(name1IsReverseInstr, name1, name2);
  502. bit isReverseInstr = name1IsReverseInstr;
  503. }
  504. //
  505. // Pseudos for destructive operands
  506. //
  507. let hasNoSchedulingInfo = 1 in {
  508. class PredTwoOpPseudo<string name, ZPRRegOp zprty,
  509. FalseLanesEnum flags = FalseLanesNone>
  510. : SVEPseudo2Instr<name, 0>,
  511. Pseudo<(outs zprty:$Zd), (ins PPR3bAny:$Pg, zprty:$Zs1, zprty:$Zs2), []> {
  512. let FalseLanes = flags;
  513. }
  514. class PredTwoOpImmPseudo<string name, ZPRRegOp zprty, Operand immty,
  515. FalseLanesEnum flags = FalseLanesNone>
  516. : SVEPseudo2Instr<name, 0>,
  517. Pseudo<(outs zprty:$Zd), (ins PPR3bAny:$Pg, zprty:$Zs1, immty:$imm), []> {
  518. let FalseLanes = flags;
  519. }
  520. class PredThreeOpPseudo<string name, ZPRRegOp zprty,
  521. FalseLanesEnum flags = FalseLanesNone>
  522. : SVEPseudo2Instr<name, 0>,
  523. Pseudo<(outs zprty:$Zd), (ins PPR3bAny:$Pg, zprty:$Zs1, zprty:$Zs2, zprty:$Zs3), []> {
  524. let FalseLanes = flags;
  525. }
  526. }
  527. //
  528. // Pseudos for passthru operands
  529. //
  530. let hasNoSchedulingInfo = 1 in {
  531. class PredOneOpPassthruPseudo<string name, ZPRRegOp zprty>
  532. : SVEPseudo2Instr<name, 0>,
  533. Pseudo<(outs zprty:$Zd), (ins zprty:$Passthru, PPR3bAny:$Pg, zprty:$Zs), []>;
  534. }
  535. //===----------------------------------------------------------------------===//
  536. // SVE Predicate Misc Group
  537. //===----------------------------------------------------------------------===//
  538. class sve_int_pfalse<bits<6> opc, string asm>
  539. : I<(outs PPR8:$Pd), (ins),
  540. asm, "\t$Pd",
  541. "",
  542. []>, Sched<[]> {
  543. bits<4> Pd;
  544. let Inst{31-24} = 0b00100101;
  545. let Inst{23-22} = opc{5-4};
  546. let Inst{21-19} = 0b011;
  547. let Inst{18-16} = opc{3-1};
  548. let Inst{15-10} = 0b111001;
  549. let Inst{9} = opc{0};
  550. let Inst{8-4} = 0b00000;
  551. let Inst{3-0} = Pd;
  552. let isReMaterializable = 1;
  553. }
  554. multiclass sve_int_pfalse<bits<6> opc, string asm> {
  555. def NAME : sve_int_pfalse<opc, asm>;
  556. def : InstAlias<"pfalse\t$Pd", (!cast<Instruction>(NAME) PNR8:$Pd), 0>;
  557. def : Pat<(nxv16i1 immAllZerosV), (!cast<Instruction>(NAME))>;
  558. def : Pat<(nxv8i1 immAllZerosV), (!cast<Instruction>(NAME))>;
  559. def : Pat<(nxv4i1 immAllZerosV), (!cast<Instruction>(NAME))>;
  560. def : Pat<(nxv2i1 immAllZerosV), (!cast<Instruction>(NAME))>;
  561. def : Pat<(nxv1i1 immAllZerosV), (!cast<Instruction>(NAME))>;
  562. }
  563. class sve_int_ptest<bits<6> opc, string asm, SDPatternOperator op>
  564. : I<(outs), (ins PPRAny:$Pg, PPR8:$Pn),
  565. asm, "\t$Pg, $Pn",
  566. "",
  567. [(op (nxv16i1 PPRAny:$Pg), (nxv16i1 PPR8:$Pn))]>, Sched<[]> {
  568. bits<4> Pg;
  569. bits<4> Pn;
  570. let Inst{31-24} = 0b00100101;
  571. let Inst{23-22} = opc{5-4};
  572. let Inst{21-19} = 0b010;
  573. let Inst{18-16} = opc{3-1};
  574. let Inst{15-14} = 0b11;
  575. let Inst{13-10} = Pg;
  576. let Inst{9} = opc{0};
  577. let Inst{8-5} = Pn;
  578. let Inst{4-0} = 0b00000;
  579. let Defs = [NZCV];
  580. let isCompare = 1;
  581. }
  582. multiclass sve_int_ptest<bits<6> opc, string asm, SDPatternOperator op,
  583. SDPatternOperator op_any> {
  584. def NAME : sve_int_ptest<opc, asm, op>;
  585. let hasNoSchedulingInfo = 1, isCompare = 1, Defs = [NZCV] in {
  586. def _ANY : Pseudo<(outs), (ins PPRAny:$Pg, PPR8:$Pn),
  587. [(op_any (nxv16i1 PPRAny:$Pg), (nxv16i1 PPR8:$Pn))]>,
  588. PseudoInstExpansion<(!cast<Instruction>(NAME) PPRAny:$Pg, PPR8:$Pn)>;
  589. }
  590. }
  591. class sve_int_pfirst_next<bits<2> sz8_64, bits<5> opc, string asm,
  592. PPRRegOp pprty>
  593. : I<(outs pprty:$Pdn), (ins PPRAny:$Pg, pprty:$_Pdn),
  594. asm, "\t$Pdn, $Pg, $_Pdn",
  595. "",
  596. []>, Sched<[]> {
  597. bits<4> Pdn;
  598. bits<4> Pg;
  599. let Inst{31-24} = 0b00100101;
  600. let Inst{23-22} = sz8_64;
  601. let Inst{21-19} = 0b011;
  602. let Inst{18-16} = opc{4-2};
  603. let Inst{15-11} = 0b11000;
  604. let Inst{10-9} = opc{1-0};
  605. let Inst{8-5} = Pg;
  606. let Inst{4} = 0;
  607. let Inst{3-0} = Pdn;
  608. let Constraints = "$Pdn = $_Pdn";
  609. let Defs = [NZCV];
  610. let isPTestLike = 1;
  611. let ElementSize = pprty.ElementSize;
  612. }
  613. multiclass sve_int_pfirst<bits<5> opc, string asm, SDPatternOperator op> {
  614. def _B : sve_int_pfirst_next<0b01, opc, asm, PPR8>;
  615. def : SVE_2_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, !cast<Instruction>(NAME # _B)>;
  616. }
  617. multiclass sve_int_pnext<bits<5> opc, string asm, SDPatternOperator op> {
  618. def _B : sve_int_pfirst_next<0b00, opc, asm, PPR8>;
  619. def _H : sve_int_pfirst_next<0b01, opc, asm, PPR16>;
  620. def _S : sve_int_pfirst_next<0b10, opc, asm, PPR32>;
  621. def _D : sve_int_pfirst_next<0b11, opc, asm, PPR64>;
  622. def : SVE_2_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, !cast<Instruction>(NAME # _B)>;
  623. def : SVE_2_Op_Pat<nxv8i1, op, nxv8i1, nxv8i1, !cast<Instruction>(NAME # _H)>;
  624. def : SVE_2_Op_Pat<nxv4i1, op, nxv4i1, nxv4i1, !cast<Instruction>(NAME # _S)>;
  625. def : SVE_2_Op_Pat<nxv2i1, op, nxv2i1, nxv2i1, !cast<Instruction>(NAME # _D)>;
  626. }
  627. //===----------------------------------------------------------------------===//
  628. // SVE Predicate Count Group
  629. //===----------------------------------------------------------------------===//
  630. class sve_int_count_r<bits<2> sz8_64, bits<5> opc, string asm,
  631. RegisterOperand dty, PPRRegOp pprty, RegisterOperand sty>
  632. : I<(outs dty:$Rdn), (ins pprty:$Pg, sty:$_Rdn),
  633. asm, "\t$Rdn, $Pg",
  634. "",
  635. []>, Sched<[]> {
  636. bits<5> Rdn;
  637. bits<4> Pg;
  638. let Inst{31-24} = 0b00100101;
  639. let Inst{23-22} = sz8_64;
  640. let Inst{21-19} = 0b101;
  641. let Inst{18-16} = opc{4-2};
  642. let Inst{15-11} = 0b10001;
  643. let Inst{10-9} = opc{1-0};
  644. let Inst{8-5} = Pg;
  645. let Inst{4-0} = Rdn;
  646. // Signed 32bit forms require their GPR operand printed.
  647. let AsmString = !if(!eq(opc{4,2-0}, 0b0000),
  648. !strconcat(asm, "\t$Rdn, $Pg, $_Rdn"),
  649. !strconcat(asm, "\t$Rdn, $Pg"));
  650. let Constraints = "$Rdn = $_Rdn";
  651. }
  652. multiclass sve_int_count_r_s32<bits<5> opc, string asm,
  653. SDPatternOperator op> {
  654. def _B : sve_int_count_r<0b00, opc, asm, GPR64z, PPR8, GPR64as32>;
  655. def _H : sve_int_count_r<0b01, opc, asm, GPR64z, PPR16, GPR64as32>;
  656. def _S : sve_int_count_r<0b10, opc, asm, GPR64z, PPR32, GPR64as32>;
  657. def _D : sve_int_count_r<0b11, opc, asm, GPR64z, PPR64, GPR64as32>;
  658. def : Pat<(i32 (op GPR32:$Rn, (nxv16i1 PPRAny:$Pg))),
  659. (EXTRACT_SUBREG (!cast<Instruction>(NAME # _B) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32)), sub_32)>;
  660. def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (nxv16i1 PPRAny:$Pg))))),
  661. (!cast<Instruction>(NAME # _B) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32))>;
  662. def : Pat<(i32 (op GPR32:$Rn, (nxv8i1 PPRAny:$Pg))),
  663. (EXTRACT_SUBREG (!cast<Instruction>(NAME # _H) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32)), sub_32)>;
  664. def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (nxv8i1 PPRAny:$Pg))))),
  665. (!cast<Instruction>(NAME # _H) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32))>;
  666. def : Pat<(i32 (op GPR32:$Rn, (nxv4i1 PPRAny:$Pg))),
  667. (EXTRACT_SUBREG (!cast<Instruction>(NAME # _S) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32)), sub_32)>;
  668. def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (nxv4i1 PPRAny:$Pg))))),
  669. (!cast<Instruction>(NAME # _S) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32))>;
  670. def : Pat<(i32 (op GPR32:$Rn, (nxv2i1 PPRAny:$Pg))),
  671. (EXTRACT_SUBREG (!cast<Instruction>(NAME # _D) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32)), sub_32)>;
  672. def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (nxv2i1 PPRAny:$Pg))))),
  673. (!cast<Instruction>(NAME # _D) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32))>;
  674. }
  675. multiclass sve_int_count_r_u32<bits<5> opc, string asm,
  676. SDPatternOperator op> {
  677. def _B : sve_int_count_r<0b00, opc, asm, GPR32z, PPR8, GPR32z>;
  678. def _H : sve_int_count_r<0b01, opc, asm, GPR32z, PPR16, GPR32z>;
  679. def _S : sve_int_count_r<0b10, opc, asm, GPR32z, PPR32, GPR32z>;
  680. def _D : sve_int_count_r<0b11, opc, asm, GPR32z, PPR64, GPR32z>;
  681. def : Pat<(i32 (op GPR32:$Rn, (nxv16i1 PPRAny:$Pg))),
  682. (!cast<Instruction>(NAME # _B) PPRAny:$Pg, $Rn)>;
  683. def : Pat<(i32 (op GPR32:$Rn, (nxv8i1 PPRAny:$Pg))),
  684. (!cast<Instruction>(NAME # _H) PPRAny:$Pg, $Rn)>;
  685. def : Pat<(i32 (op GPR32:$Rn, (nxv4i1 PPRAny:$Pg))),
  686. (!cast<Instruction>(NAME # _S) PPRAny:$Pg, $Rn)>;
  687. def : Pat<(i32 (op GPR32:$Rn, (nxv2i1 PPRAny:$Pg))),
  688. (!cast<Instruction>(NAME # _D) PPRAny:$Pg, $Rn)>;
  689. }
  690. multiclass sve_int_count_r_x64<bits<5> opc, string asm,
  691. SDPatternOperator op,
  692. SDPatternOperator combine_op = null_frag> {
  693. def _B : sve_int_count_r<0b00, opc, asm, GPR64z, PPR8, GPR64z>;
  694. def _H : sve_int_count_r<0b01, opc, asm, GPR64z, PPR16, GPR64z>;
  695. def _S : sve_int_count_r<0b10, opc, asm, GPR64z, PPR32, GPR64z>;
  696. def _D : sve_int_count_r<0b11, opc, asm, GPR64z, PPR64, GPR64z>;
  697. def : Pat<(i64 (op GPR64:$Rn, (nxv16i1 PPRAny:$Pg))),
  698. (!cast<Instruction>(NAME # _B) PPRAny:$Pg, $Rn)>;
  699. def : Pat<(i64 (op GPR64:$Rn, (nxv8i1 PPRAny:$Pg))),
  700. (!cast<Instruction>(NAME # _H) PPRAny:$Pg, $Rn)>;
  701. def : Pat<(i64 (op GPR64:$Rn, (nxv4i1 PPRAny:$Pg))),
  702. (!cast<Instruction>(NAME # _S) PPRAny:$Pg, $Rn)>;
  703. def : Pat<(i64 (op GPR64:$Rn, (nxv2i1 PPRAny:$Pg))),
  704. (!cast<Instruction>(NAME # _D) PPRAny:$Pg, $Rn)>;
  705. // combine_op(x, cntp(all_active, p)) ==> inst p, x
  706. def : Pat<(i64 (combine_op GPR64:$Rn, (int_aarch64_sve_cntp_oneuse (nxv16i1 (SVEAllActive)), (nxv16i1 PPRAny:$pred)))),
  707. (!cast<Instruction>(NAME # _B) PPRAny:$pred, $Rn)>;
  708. def : Pat<(i64 (combine_op GPR64:$Rn, (int_aarch64_sve_cntp_oneuse (nxv8i1 (SVEAllActive)), (nxv8i1 PPRAny:$pred)))),
  709. (!cast<Instruction>(NAME # _H) PPRAny:$pred, $Rn)>;
  710. def : Pat<(i64 (combine_op GPR64:$Rn, (int_aarch64_sve_cntp_oneuse (nxv4i1 (SVEAllActive)), (nxv4i1 PPRAny:$pred)))),
  711. (!cast<Instruction>(NAME # _S) PPRAny:$pred, $Rn)>;
  712. def : Pat<(i64 (combine_op GPR64:$Rn, (int_aarch64_sve_cntp_oneuse (nxv2i1 (SVEAllActive)), (nxv2i1 PPRAny:$pred)))),
  713. (!cast<Instruction>(NAME # _D) PPRAny:$pred, $Rn)>;
  714. // combine_op(x, cntp(p, p)) ==> inst p, x
  715. def : Pat<(i64 (combine_op GPR64:$Rn, (int_aarch64_sve_cntp_oneuse (nxv16i1 PPRAny:$pred), (nxv16i1 PPRAny:$pred)))),
  716. (!cast<Instruction>(NAME # _B) PPRAny:$pred, $Rn)>;
  717. def : Pat<(i64 (combine_op GPR64:$Rn, (int_aarch64_sve_cntp_oneuse (nxv8i1 PPRAny:$pred), (nxv8i1 PPRAny:$pred)))),
  718. (!cast<Instruction>(NAME # _H) PPRAny:$pred, $Rn)>;
  719. def : Pat<(i64 (combine_op GPR64:$Rn, (int_aarch64_sve_cntp_oneuse (nxv4i1 PPRAny:$pred), (nxv4i1 PPRAny:$pred)))),
  720. (!cast<Instruction>(NAME # _S) PPRAny:$pred, $Rn)>;
  721. def : Pat<(i64 (combine_op GPR64:$Rn, (int_aarch64_sve_cntp_oneuse (nxv2i1 PPRAny:$pred), (nxv2i1 PPRAny:$pred)))),
  722. (!cast<Instruction>(NAME # _D) PPRAny:$pred, $Rn)>;
  723. }
  724. class sve_int_count_v<bits<2> sz8_64, bits<5> opc, string asm,
  725. ZPRRegOp zprty, PPRRegOp pprty>
  726. : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, pprty:$Pm),
  727. asm, "\t$Zdn, $Pm",
  728. "",
  729. []>, Sched<[]> {
  730. bits<4> Pm;
  731. bits<5> Zdn;
  732. let Inst{31-24} = 0b00100101;
  733. let Inst{23-22} = sz8_64;
  734. let Inst{21-19} = 0b101;
  735. let Inst{18-16} = opc{4-2};
  736. let Inst{15-11} = 0b10000;
  737. let Inst{10-9} = opc{1-0};
  738. let Inst{8-5} = Pm;
  739. let Inst{4-0} = Zdn;
  740. let Constraints = "$Zdn = $_Zdn";
  741. let DestructiveInstType = DestructiveOther;
  742. let ElementSize = ElementSizeNone;
  743. }
  744. multiclass sve_int_count_v<bits<5> opc, string asm,
  745. SDPatternOperator op = null_frag> {
  746. def _H : sve_int_count_v<0b01, opc, asm, ZPR16, PPR16>;
  747. def _S : sve_int_count_v<0b10, opc, asm, ZPR32, PPR32>;
  748. def _D : sve_int_count_v<0b11, opc, asm, ZPR64, PPR64>;
  749. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, !cast<Instruction>(NAME # _H)>;
  750. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, !cast<Instruction>(NAME # _S)>;
  751. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, !cast<Instruction>(NAME # _D)>;
  752. def : InstAlias<asm # "\t$Zdn, $Pm",
  753. (!cast<Instruction>(NAME # "_H") ZPR16:$Zdn, PPRAny:$Pm), 0>;
  754. def : InstAlias<asm # "\t$Zdn, $Pm",
  755. (!cast<Instruction>(NAME # "_S") ZPR32:$Zdn, PPRAny:$Pm), 0>;
  756. def : InstAlias<asm # "\t$Zdn, $Pm",
  757. (!cast<Instruction>(NAME # "_D") ZPR64:$Zdn, PPRAny:$Pm), 0>;
  758. }
  759. class sve_int_pcount_pred<bits<2> sz8_64, bits<4> opc, string asm,
  760. PPRRegOp pprty>
  761. : I<(outs GPR64:$Rd), (ins PPRAny:$Pg, pprty:$Pn),
  762. asm, "\t$Rd, $Pg, $Pn",
  763. "",
  764. []>, Sched<[]> {
  765. bits<4> Pg;
  766. bits<4> Pn;
  767. bits<5> Rd;
  768. let Inst{31-24} = 0b00100101;
  769. let Inst{23-22} = sz8_64;
  770. let Inst{21-19} = 0b100;
  771. let Inst{18-16} = opc{3-1};
  772. let Inst{15-14} = 0b10;
  773. let Inst{13-10} = Pg;
  774. let Inst{9} = opc{0};
  775. let Inst{8-5} = Pn;
  776. let Inst{4-0} = Rd;
  777. }
  778. multiclass sve_int_pcount_pred<bits<4> opc, string asm,
  779. SDPatternOperator int_op> {
  780. def _B : sve_int_pcount_pred<0b00, opc, asm, PPR8>;
  781. def _H : sve_int_pcount_pred<0b01, opc, asm, PPR16>;
  782. def _S : sve_int_pcount_pred<0b10, opc, asm, PPR32>;
  783. def _D : sve_int_pcount_pred<0b11, opc, asm, PPR64>;
  784. def : SVE_2_Op_Pat<i64, int_op, nxv16i1, nxv16i1, !cast<Instruction>(NAME # _B)>;
  785. def : SVE_2_Op_Pat<i64, int_op, nxv8i1, nxv8i1, !cast<Instruction>(NAME # _H)>;
  786. def : SVE_2_Op_Pat<i64, int_op, nxv4i1, nxv4i1, !cast<Instruction>(NAME # _S)>;
  787. def : SVE_2_Op_Pat<i64, int_op, nxv2i1, nxv2i1, !cast<Instruction>(NAME # _D)>;
  788. }
  789. //===----------------------------------------------------------------------===//
  790. // SVE Element Count Group
  791. //===----------------------------------------------------------------------===//
  792. class sve_int_count<bits<3> opc, string asm>
  793. : I<(outs GPR64:$Rd), (ins sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
  794. asm, "\t$Rd, $pattern, mul $imm4",
  795. "",
  796. []>, Sched<[]> {
  797. bits<5> Rd;
  798. bits<4> imm4;
  799. bits<5> pattern;
  800. let Inst{31-24} = 0b00000100;
  801. let Inst{23-22} = opc{2-1};
  802. let Inst{21-20} = 0b10;
  803. let Inst{19-16} = imm4;
  804. let Inst{15-11} = 0b11100;
  805. let Inst{10} = opc{0};
  806. let Inst{9-5} = pattern;
  807. let Inst{4-0} = Rd;
  808. let isReMaterializable = 1;
  809. }
  810. multiclass sve_int_count<bits<3> opc, string asm, SDPatternOperator op> {
  811. def NAME : sve_int_count<opc, asm>;
  812. def : InstAlias<asm # "\t$Rd, $pattern",
  813. (!cast<Instruction>(NAME) GPR64:$Rd, sve_pred_enum:$pattern, 1), 1>;
  814. def : InstAlias<asm # "\t$Rd",
  815. (!cast<Instruction>(NAME) GPR64:$Rd, 0b11111, 1), 2>;
  816. def : Pat<(i64 (mul (op sve_pred_enum:$pattern), (sve_cnt_mul_imm_i64 i32:$imm))),
  817. (!cast<Instruction>(NAME) sve_pred_enum:$pattern, sve_incdec_imm:$imm)>;
  818. def : Pat<(i64 (shl (op sve_pred_enum:$pattern), (sve_cnt_shl_imm i32:$imm))),
  819. (!cast<Instruction>(NAME) sve_pred_enum:$pattern, sve_incdec_imm:$imm)>;
  820. def : Pat<(i64 (op sve_pred_enum:$pattern)),
  821. (!cast<Instruction>(NAME) sve_pred_enum:$pattern, 1)>;
  822. }
  823. class sve_int_countvlv<bits<5> opc, string asm, ZPRRegOp zprty>
  824. : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
  825. asm, "\t$Zdn, $pattern, mul $imm4",
  826. "",
  827. []>, Sched<[]> {
  828. bits<5> Zdn;
  829. bits<5> pattern;
  830. bits<4> imm4;
  831. let Inst{31-24} = 0b00000100;
  832. let Inst{23-22} = opc{4-3};
  833. let Inst{21} = 0b1;
  834. let Inst{20} = opc{2};
  835. let Inst{19-16} = imm4;
  836. let Inst{15-12} = 0b1100;
  837. let Inst{11-10} = opc{1-0};
  838. let Inst{9-5} = pattern;
  839. let Inst{4-0} = Zdn;
  840. let Constraints = "$Zdn = $_Zdn";
  841. let DestructiveInstType = DestructiveOther;
  842. let ElementSize = ElementSizeNone;
  843. }
  844. multiclass sve_int_countvlv<bits<5> opc, string asm, ZPRRegOp zprty,
  845. SDPatternOperator op = null_frag,
  846. ValueType vt = OtherVT> {
  847. def NAME : sve_int_countvlv<opc, asm, zprty>;
  848. def : InstAlias<asm # "\t$Zdn, $pattern",
  849. (!cast<Instruction>(NAME) zprty:$Zdn, sve_pred_enum:$pattern, 1), 1>;
  850. def : InstAlias<asm # "\t$Zdn",
  851. (!cast<Instruction>(NAME) zprty:$Zdn, 0b11111, 1), 2>;
  852. def : Pat<(vt (op (vt zprty:$Zn), (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))),
  853. (!cast<Instruction>(NAME) $Zn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4)>;
  854. }
  855. class sve_int_pred_pattern_a<bits<3> opc, string asm>
  856. : I<(outs GPR64:$Rdn), (ins GPR64:$_Rdn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
  857. asm, "\t$Rdn, $pattern, mul $imm4",
  858. "",
  859. []>, Sched<[]> {
  860. bits<5> Rdn;
  861. bits<5> pattern;
  862. bits<4> imm4;
  863. let Inst{31-24} = 0b00000100;
  864. let Inst{23-22} = opc{2-1};
  865. let Inst{21-20} = 0b11;
  866. let Inst{19-16} = imm4;
  867. let Inst{15-11} = 0b11100;
  868. let Inst{10} = opc{0};
  869. let Inst{9-5} = pattern;
  870. let Inst{4-0} = Rdn;
  871. let Constraints = "$Rdn = $_Rdn";
  872. }
  873. multiclass sve_int_pred_pattern_a<bits<3> opc, string asm,
  874. SDPatternOperator op,
  875. SDPatternOperator opcnt> {
  876. let Predicates = [HasSVEorSME] in {
  877. def NAME : sve_int_pred_pattern_a<opc, asm>;
  878. def : InstAlias<asm # "\t$Rdn, $pattern",
  879. (!cast<Instruction>(NAME) GPR64:$Rdn, sve_pred_enum:$pattern, 1), 1>;
  880. def : InstAlias<asm # "\t$Rdn",
  881. (!cast<Instruction>(NAME) GPR64:$Rdn, 0b11111, 1), 2>;
  882. }
  883. let Predicates = [HasSVEorSME, UseScalarIncVL] in {
  884. def : Pat<(i64 (op GPR64:$Rdn, (opcnt sve_pred_enum:$pattern))),
  885. (!cast<Instruction>(NAME) GPR64:$Rdn, sve_pred_enum:$pattern, 1)>;
  886. def : Pat<(i64 (op GPR64:$Rdn, (mul (opcnt sve_pred_enum:$pattern), (sve_cnt_mul_imm_i64 i32:$imm)))),
  887. (!cast<Instruction>(NAME) GPR64:$Rdn, sve_pred_enum:$pattern, $imm)>;
  888. def : Pat<(i64 (op GPR64:$Rdn, (shl (opcnt sve_pred_enum:$pattern), (sve_cnt_shl_imm i32:$imm)))),
  889. (!cast<Instruction>(NAME) GPR64:$Rdn, sve_pred_enum:$pattern, $imm)>;
  890. def : Pat<(i32 (op GPR32:$Rdn, (i32 (trunc (opcnt (sve_pred_enum:$pattern)))))),
  891. (i32 (EXTRACT_SUBREG (!cast<Instruction>(NAME) (INSERT_SUBREG (i64 (IMPLICIT_DEF)),
  892. GPR32:$Rdn, sub_32), sve_pred_enum:$pattern, 1),
  893. sub_32))>;
  894. def : Pat<(i32 (op GPR32:$Rdn, (mul (i32 (trunc (opcnt (sve_pred_enum:$pattern)))), (sve_cnt_mul_imm_i32 i32:$imm)))),
  895. (i32 (EXTRACT_SUBREG (!cast<Instruction>(NAME) (INSERT_SUBREG (i64 (IMPLICIT_DEF)),
  896. GPR32:$Rdn, sub_32), sve_pred_enum:$pattern, $imm),
  897. sub_32))>;
  898. def : Pat<(i32 (op GPR32:$Rdn, (shl (i32 (trunc (opcnt (sve_pred_enum:$pattern)))), (sve_cnt_shl_imm i32:$imm)))),
  899. (i32 (EXTRACT_SUBREG (!cast<Instruction>(NAME) (INSERT_SUBREG (i64 (IMPLICIT_DEF)),
  900. GPR32:$Rdn, sub_32), sve_pred_enum:$pattern, $imm),
  901. sub_32))>;
  902. }
  903. }
  904. class sve_int_pred_pattern_b<bits<5> opc, string asm, RegisterOperand dt,
  905. RegisterOperand st>
  906. : I<(outs dt:$Rdn), (ins st:$_Rdn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
  907. asm, "\t$Rdn, $pattern, mul $imm4",
  908. "",
  909. []>, Sched<[]> {
  910. bits<5> Rdn;
  911. bits<5> pattern;
  912. bits<4> imm4;
  913. let Inst{31-24} = 0b00000100;
  914. let Inst{23-22} = opc{4-3};
  915. let Inst{21} = 0b1;
  916. let Inst{20} = opc{2};
  917. let Inst{19-16} = imm4;
  918. let Inst{15-12} = 0b1111;
  919. let Inst{11-10} = opc{1-0};
  920. let Inst{9-5} = pattern;
  921. let Inst{4-0} = Rdn;
  922. // Signed 32bit forms require their GPR operand printed.
  923. let AsmString = !if(!eq(opc{2,0}, 0b00),
  924. !strconcat(asm, "\t$Rdn, $_Rdn, $pattern, mul $imm4"),
  925. !strconcat(asm, "\t$Rdn, $pattern, mul $imm4"));
  926. let Constraints = "$Rdn = $_Rdn";
  927. }
  928. multiclass sve_int_pred_pattern_b_s32<bits<5> opc, string asm,
  929. SDPatternOperator op> {
  930. def NAME : sve_int_pred_pattern_b<opc, asm, GPR64z, GPR64as32>;
  931. def : InstAlias<asm # "\t$Rd, $Rn, $pattern",
  932. (!cast<Instruction>(NAME) GPR64z:$Rd, GPR64as32:$Rn, sve_pred_enum:$pattern, 1), 1>;
  933. def : InstAlias<asm # "\t$Rd, $Rn",
  934. (!cast<Instruction>(NAME) GPR64z:$Rd, GPR64as32:$Rn, 0b11111, 1), 2>;
  935. // NOTE: Register allocation doesn't like tied operands of differing register
  936. // class, hence the extra INSERT_SUBREG complication.
  937. def : Pat<(i32 (op GPR32:$Rn, (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))),
  938. (EXTRACT_SUBREG (!cast<Instruction>(NAME) (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32), sve_pred_enum:$pattern, sve_incdec_imm:$imm4), sub_32)>;
  939. def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))))),
  940. (!cast<Instruction>(NAME) (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32), sve_pred_enum:$pattern, sve_incdec_imm:$imm4)>;
  941. }
  942. multiclass sve_int_pred_pattern_b_u32<bits<5> opc, string asm,
  943. SDPatternOperator op> {
  944. def NAME : sve_int_pred_pattern_b<opc, asm, GPR32z, GPR32z>;
  945. def : InstAlias<asm # "\t$Rdn, $pattern",
  946. (!cast<Instruction>(NAME) GPR32z:$Rdn, sve_pred_enum:$pattern, 1), 1>;
  947. def : InstAlias<asm # "\t$Rdn",
  948. (!cast<Instruction>(NAME) GPR32z:$Rdn, 0b11111, 1), 2>;
  949. def : Pat<(i32 (op GPR32:$Rn, (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))),
  950. (!cast<Instruction>(NAME) $Rn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4)>;
  951. }
  952. multiclass sve_int_pred_pattern_b_x64<bits<5> opc, string asm,
  953. SDPatternOperator op> {
  954. def NAME : sve_int_pred_pattern_b<opc, asm, GPR64z, GPR64z>;
  955. def : InstAlias<asm # "\t$Rdn, $pattern",
  956. (!cast<Instruction>(NAME) GPR64z:$Rdn, sve_pred_enum:$pattern, 1), 1>;
  957. def : InstAlias<asm # "\t$Rdn",
  958. (!cast<Instruction>(NAME) GPR64z:$Rdn, 0b11111, 1), 2>;
  959. def : Pat<(i64 (op GPR64:$Rn, (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))),
  960. (!cast<Instruction>(NAME) $Rn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4)>;
  961. }
  962. //===----------------------------------------------------------------------===//
  963. // SVE Permute - Cross Lane Group
  964. //===----------------------------------------------------------------------===//
  965. class sve_int_perm_dup_r<bits<2> sz8_64, string asm, ZPRRegOp zprty,
  966. ValueType vt, RegisterClass srcRegType,
  967. SDPatternOperator op>
  968. : I<(outs zprty:$Zd), (ins srcRegType:$Rn),
  969. asm, "\t$Zd, $Rn",
  970. "",
  971. [(set (vt zprty:$Zd), (op srcRegType:$Rn))]>, Sched<[]> {
  972. bits<5> Rn;
  973. bits<5> Zd;
  974. let Inst{31-24} = 0b00000101;
  975. let Inst{23-22} = sz8_64;
  976. let Inst{21-10} = 0b100000001110;
  977. let Inst{9-5} = Rn;
  978. let Inst{4-0} = Zd;
  979. }
  980. multiclass sve_int_perm_dup_r<string asm, SDPatternOperator op> {
  981. def _B : sve_int_perm_dup_r<0b00, asm, ZPR8, nxv16i8, GPR32sp, op>;
  982. def _H : sve_int_perm_dup_r<0b01, asm, ZPR16, nxv8i16, GPR32sp, op>;
  983. def _S : sve_int_perm_dup_r<0b10, asm, ZPR32, nxv4i32, GPR32sp, op>;
  984. def _D : sve_int_perm_dup_r<0b11, asm, ZPR64, nxv2i64, GPR64sp, op>;
  985. def : InstAlias<"mov $Zd, $Rn",
  986. (!cast<Instruction>(NAME # _B) ZPR8:$Zd, GPR32sp:$Rn), 1>;
  987. def : InstAlias<"mov $Zd, $Rn",
  988. (!cast<Instruction>(NAME # _H) ZPR16:$Zd, GPR32sp:$Rn), 1>;
  989. def : InstAlias<"mov $Zd, $Rn",
  990. (!cast<Instruction>(NAME # _S) ZPR32:$Zd, GPR32sp:$Rn), 1>;
  991. def : InstAlias<"mov $Zd, $Rn",
  992. (!cast<Instruction>(NAME # _D) ZPR64:$Zd, GPR64sp:$Rn), 1>;
  993. }
  994. class sve_int_perm_dup_i<bits<5> tsz, Operand immtype, string asm,
  995. ZPRRegOp zprty>
  996. : I<(outs zprty:$Zd), (ins zprty:$Zn, immtype:$idx),
  997. asm, "\t$Zd, $Zn$idx",
  998. "",
  999. []>, Sched<[]> {
  1000. bits<5> Zd;
  1001. bits<5> Zn;
  1002. bits<7> idx;
  1003. let Inst{31-24} = 0b00000101;
  1004. let Inst{23-22} = {?,?}; // imm3h
  1005. let Inst{21} = 0b1;
  1006. let Inst{20-16} = tsz;
  1007. let Inst{15-10} = 0b001000;
  1008. let Inst{9-5} = Zn;
  1009. let Inst{4-0} = Zd;
  1010. }
  1011. multiclass sve_int_perm_dup_i<string asm> {
  1012. def _B : sve_int_perm_dup_i<{?,?,?,?,1}, sve_elm_idx_extdup_b, asm, ZPR8> {
  1013. let Inst{23-22} = idx{5-4};
  1014. let Inst{20-17} = idx{3-0};
  1015. }
  1016. def _H : sve_int_perm_dup_i<{?,?,?,1,0}, sve_elm_idx_extdup_h, asm, ZPR16> {
  1017. let Inst{23-22} = idx{4-3};
  1018. let Inst{20-18} = idx{2-0};
  1019. }
  1020. def _S : sve_int_perm_dup_i<{?,?,1,0,0}, sve_elm_idx_extdup_s, asm, ZPR32> {
  1021. let Inst{23-22} = idx{3-2};
  1022. let Inst{20-19} = idx{1-0};
  1023. }
  1024. def _D : sve_int_perm_dup_i<{?,1,0,0,0}, sve_elm_idx_extdup_d, asm, ZPR64> {
  1025. let Inst{23-22} = idx{2-1};
  1026. let Inst{20} = idx{0};
  1027. }
  1028. def _Q : sve_int_perm_dup_i<{1,0,0,0,0}, sve_elm_idx_extdup_q, asm, ZPR128> {
  1029. let Inst{23-22} = idx{1-0};
  1030. }
  1031. def : InstAlias<"mov $Zd, $Zn$idx",
  1032. (!cast<Instruction>(NAME # _B) ZPR8:$Zd, ZPR8:$Zn, sve_elm_idx_extdup_b:$idx), 1>;
  1033. def : InstAlias<"mov $Zd, $Zn$idx",
  1034. (!cast<Instruction>(NAME # _H) ZPR16:$Zd, ZPR16:$Zn, sve_elm_idx_extdup_h:$idx), 1>;
  1035. def : InstAlias<"mov $Zd, $Zn$idx",
  1036. (!cast<Instruction>(NAME # _S) ZPR32:$Zd, ZPR32:$Zn, sve_elm_idx_extdup_s:$idx), 1>;
  1037. def : InstAlias<"mov $Zd, $Zn$idx",
  1038. (!cast<Instruction>(NAME # _D) ZPR64:$Zd, ZPR64:$Zn, sve_elm_idx_extdup_d:$idx), 1>;
  1039. def : InstAlias<"mov $Zd, $Zn$idx",
  1040. (!cast<Instruction>(NAME # _Q) ZPR128:$Zd, ZPR128:$Zn, sve_elm_idx_extdup_q:$idx), 1>;
  1041. def : InstAlias<"mov $Zd, $Bn",
  1042. (!cast<Instruction>(NAME # _B) ZPR8:$Zd, FPR8asZPR:$Bn, 0), 2>;
  1043. def : InstAlias<"mov $Zd, $Hn",
  1044. (!cast<Instruction>(NAME # _H) ZPR16:$Zd, FPR16asZPR:$Hn, 0), 2>;
  1045. def : InstAlias<"mov $Zd, $Sn",
  1046. (!cast<Instruction>(NAME # _S) ZPR32:$Zd, FPR32asZPR:$Sn, 0), 2>;
  1047. def : InstAlias<"mov $Zd, $Dn",
  1048. (!cast<Instruction>(NAME # _D) ZPR64:$Zd, FPR64asZPR:$Dn, 0), 2>;
  1049. def : InstAlias<"mov $Zd, $Qn",
  1050. (!cast<Instruction>(NAME # _Q) ZPR128:$Zd, FPR128asZPR:$Qn, 0), 2>;
  1051. // Duplicate extracted element of vector into all vector elements
  1052. def : Pat<(nxv16i8 (splat_vector (i32 (vector_extract (nxv16i8 ZPR:$vec), sve_elm_idx_extdup_b:$index)))),
  1053. (!cast<Instruction>(NAME # _B) ZPR:$vec, sve_elm_idx_extdup_b:$index)>;
  1054. def : Pat<(nxv8i16 (splat_vector (i32 (vector_extract (nxv8i16 ZPR:$vec), sve_elm_idx_extdup_h:$index)))),
  1055. (!cast<Instruction>(NAME # _H) ZPR:$vec, sve_elm_idx_extdup_h:$index)>;
  1056. def : Pat<(nxv4i32 (splat_vector (i32 (vector_extract (nxv4i32 ZPR:$vec), sve_elm_idx_extdup_s:$index)))),
  1057. (!cast<Instruction>(NAME # _S) ZPR:$vec, sve_elm_idx_extdup_s:$index)>;
  1058. def : Pat<(nxv2i64 (splat_vector (i64 (vector_extract (nxv2i64 ZPR:$vec), sve_elm_idx_extdup_d:$index)))),
  1059. (!cast<Instruction>(NAME # _D) ZPR:$vec, sve_elm_idx_extdup_d:$index)>;
  1060. def : Pat<(nxv8f16 (splat_vector (f16 (vector_extract (nxv8f16 ZPR:$vec), sve_elm_idx_extdup_h:$index)))),
  1061. (!cast<Instruction>(NAME # _H) ZPR:$vec, sve_elm_idx_extdup_h:$index)>;
  1062. def : Pat<(nxv8bf16 (splat_vector (bf16 (vector_extract (nxv8bf16 ZPR:$vec), sve_elm_idx_extdup_h:$index)))),
  1063. (!cast<Instruction>(NAME # _H) ZPR:$vec, sve_elm_idx_extdup_h:$index)>;
  1064. def : Pat<(nxv4f16 (splat_vector (f16 (vector_extract (nxv4f16 ZPR:$vec), sve_elm_idx_extdup_s:$index)))),
  1065. (!cast<Instruction>(NAME # _S) ZPR:$vec, sve_elm_idx_extdup_s:$index)>;
  1066. def : Pat<(nxv2f16 (splat_vector (f16 (vector_extract (nxv2f16 ZPR:$vec), sve_elm_idx_extdup_d:$index)))),
  1067. (!cast<Instruction>(NAME # _D) ZPR:$vec, sve_elm_idx_extdup_d:$index)>;
  1068. def : Pat<(nxv4f32 (splat_vector (f32 (vector_extract (nxv4f32 ZPR:$vec), sve_elm_idx_extdup_s:$index)))),
  1069. (!cast<Instruction>(NAME # _S) ZPR:$vec, sve_elm_idx_extdup_s:$index)>;
  1070. def : Pat<(nxv2f32 (splat_vector (f32 (vector_extract (nxv2f32 ZPR:$vec), sve_elm_idx_extdup_d:$index)))),
  1071. (!cast<Instruction>(NAME # _D) ZPR:$vec, sve_elm_idx_extdup_d:$index)>;
  1072. def : Pat<(nxv2f64 (splat_vector (f64 (vector_extract (nxv2f64 ZPR:$vec), sve_elm_idx_extdup_d:$index)))),
  1073. (!cast<Instruction>(NAME # _D) ZPR:$vec, sve_elm_idx_extdup_d:$index)>;
  1074. def : Pat<(nxv16i8 (AArch64duplane128 nxv16i8:$Op1, i64:$imm)),
  1075. (!cast<Instruction>(NAME # _Q) $Op1, $imm)>;
  1076. def : Pat<(nxv8i16 (AArch64duplane128 nxv8i16:$Op1, i64:$imm)),
  1077. (!cast<Instruction>(NAME # _Q) $Op1, $imm)>;
  1078. def : Pat<(nxv4i32 (AArch64duplane128 nxv4i32:$Op1, i64:$imm)),
  1079. (!cast<Instruction>(NAME # _Q) $Op1, $imm)>;
  1080. def : Pat<(nxv2i64 (AArch64duplane128 nxv2i64:$Op1, i64:$imm)),
  1081. (!cast<Instruction>(NAME # _Q) $Op1, $imm)>;
  1082. def : Pat<(nxv8f16 (AArch64duplane128 nxv8f16:$Op1, i64:$imm)),
  1083. (!cast<Instruction>(NAME # _Q) $Op1, $imm)>;
  1084. def : Pat<(nxv4f32 (AArch64duplane128 nxv4f32:$Op1, i64:$imm)),
  1085. (!cast<Instruction>(NAME # _Q) $Op1, $imm)>;
  1086. def : Pat<(nxv2f64 (AArch64duplane128 nxv2f64:$Op1, i64:$imm)),
  1087. (!cast<Instruction>(NAME # _Q) $Op1, $imm)>;
  1088. def : Pat<(nxv8bf16 (AArch64duplane128 nxv8bf16:$Op1, i64:$imm)),
  1089. (!cast<Instruction>(NAME # _Q) $Op1, $imm)>;
  1090. }
  1091. class sve_int_perm_tbl<bits<2> sz8_64, bits<2> opc, string asm, ZPRRegOp zprty,
  1092. RegisterOperand VecList>
  1093. : I<(outs zprty:$Zd), (ins VecList:$Zn, zprty:$Zm),
  1094. asm, "\t$Zd, $Zn, $Zm",
  1095. "",
  1096. []>, Sched<[]> {
  1097. bits<5> Zd;
  1098. bits<5> Zm;
  1099. bits<5> Zn;
  1100. let Inst{31-24} = 0b00000101;
  1101. let Inst{23-22} = sz8_64;
  1102. let Inst{21} = 0b1;
  1103. let Inst{20-16} = Zm;
  1104. let Inst{15-13} = 0b001;
  1105. let Inst{12-11} = opc;
  1106. let Inst{10} = 0b0;
  1107. let Inst{9-5} = Zn;
  1108. let Inst{4-0} = Zd;
  1109. }
  1110. multiclass sve_int_perm_tbl<string asm, SDPatternOperator op> {
  1111. def _B : sve_int_perm_tbl<0b00, 0b10, asm, ZPR8, Z_b>;
  1112. def _H : sve_int_perm_tbl<0b01, 0b10, asm, ZPR16, Z_h>;
  1113. def _S : sve_int_perm_tbl<0b10, 0b10, asm, ZPR32, Z_s>;
  1114. def _D : sve_int_perm_tbl<0b11, 0b10, asm, ZPR64, Z_d>;
  1115. def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
  1116. (!cast<Instruction>(NAME # _B) ZPR8:$Zd, ZPR8:$Zn, ZPR8:$Zm), 0>;
  1117. def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
  1118. (!cast<Instruction>(NAME # _H) ZPR16:$Zd, ZPR16:$Zn, ZPR16:$Zm), 0>;
  1119. def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
  1120. (!cast<Instruction>(NAME # _S) ZPR32:$Zd, ZPR32:$Zn, ZPR32:$Zm), 0>;
  1121. def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
  1122. (!cast<Instruction>(NAME # _D) ZPR64:$Zd, ZPR64:$Zn, ZPR64:$Zm), 0>;
  1123. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  1124. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  1125. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  1126. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  1127. def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  1128. def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  1129. def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  1130. def : SVE_2_Op_Pat<nxv8bf16, op, nxv8bf16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  1131. }
  1132. multiclass sve2_int_perm_tbl<string asm, SDPatternOperator op> {
  1133. def _B : sve_int_perm_tbl<0b00, 0b01, asm, ZPR8, ZZ_b>;
  1134. def _H : sve_int_perm_tbl<0b01, 0b01, asm, ZPR16, ZZ_h>;
  1135. def _S : sve_int_perm_tbl<0b10, 0b01, asm, ZPR32, ZZ_s>;
  1136. def _D : sve_int_perm_tbl<0b11, 0b01, asm, ZPR64, ZZ_d>;
  1137. def : Pat<(nxv16i8 (op nxv16i8:$Op1, nxv16i8:$Op2, nxv16i8:$Op3)),
  1138. (nxv16i8 (!cast<Instruction>(NAME # _B) (REG_SEQUENCE ZPR2, nxv16i8:$Op1, zsub0,
  1139. nxv16i8:$Op2, zsub1),
  1140. nxv16i8:$Op3))>;
  1141. def : Pat<(nxv8i16 (op nxv8i16:$Op1, nxv8i16:$Op2, nxv8i16:$Op3)),
  1142. (nxv8i16 (!cast<Instruction>(NAME # _H) (REG_SEQUENCE ZPR2, nxv8i16:$Op1, zsub0,
  1143. nxv8i16:$Op2, zsub1),
  1144. nxv8i16:$Op3))>;
  1145. def : Pat<(nxv4i32 (op nxv4i32:$Op1, nxv4i32:$Op2, nxv4i32:$Op3)),
  1146. (nxv4i32 (!cast<Instruction>(NAME # _S) (REG_SEQUENCE ZPR2, nxv4i32:$Op1, zsub0,
  1147. nxv4i32:$Op2, zsub1),
  1148. nxv4i32:$Op3))>;
  1149. def : Pat<(nxv2i64 (op nxv2i64:$Op1, nxv2i64:$Op2, nxv2i64:$Op3)),
  1150. (nxv2i64 (!cast<Instruction>(NAME # _D) (REG_SEQUENCE ZPR2, nxv2i64:$Op1, zsub0,
  1151. nxv2i64:$Op2, zsub1),
  1152. nxv2i64:$Op3))>;
  1153. def : Pat<(nxv8f16 (op nxv8f16:$Op1, nxv8f16:$Op2, nxv8i16:$Op3)),
  1154. (nxv8f16 (!cast<Instruction>(NAME # _H) (REG_SEQUENCE ZPR2, nxv8f16:$Op1, zsub0,
  1155. nxv8f16:$Op2, zsub1),
  1156. nxv8i16:$Op3))>;
  1157. def : Pat<(nxv4f32 (op nxv4f32:$Op1, nxv4f32:$Op2, nxv4i32:$Op3)),
  1158. (nxv4f32 (!cast<Instruction>(NAME # _S) (REG_SEQUENCE ZPR2, nxv4f32:$Op1, zsub0,
  1159. nxv4f32:$Op2, zsub1),
  1160. nxv4i32:$Op3))>;
  1161. def : Pat<(nxv2f64 (op nxv2f64:$Op1, nxv2f64:$Op2, nxv2i64:$Op3)),
  1162. (nxv2f64 (!cast<Instruction>(NAME # _D) (REG_SEQUENCE ZPR2, nxv2f64:$Op1, zsub0,
  1163. nxv2f64:$Op2, zsub1),
  1164. nxv2i64:$Op3))>;
  1165. def : Pat<(nxv8bf16 (op nxv8bf16:$Op1, nxv8bf16:$Op2, nxv8i16:$Op3)),
  1166. (nxv8bf16 (!cast<Instruction>(NAME # _H) (REG_SEQUENCE ZPR2, nxv8bf16:$Op1, zsub0,
  1167. nxv8bf16:$Op2, zsub1),
  1168. nxv8i16:$Op3))>;
  1169. }
  1170. class sve2_int_perm_tbx<bits<2> sz8_64, bits<2> opc, string asm, ZPRRegOp zprty>
  1171. : I<(outs zprty:$Zd), (ins zprty:$_Zd, zprty:$Zn, zprty:$Zm),
  1172. asm, "\t$Zd, $Zn, $Zm",
  1173. "",
  1174. []>, Sched<[]> {
  1175. bits<5> Zd;
  1176. bits<5> Zm;
  1177. bits<5> Zn;
  1178. let Inst{31-24} = 0b00000101;
  1179. let Inst{23-22} = sz8_64;
  1180. let Inst{21} = 0b1;
  1181. let Inst{20-16} = Zm;
  1182. let Inst{15-13} = 0b001;
  1183. let Inst{12-11} = opc;
  1184. let Inst{10} = 0b1;
  1185. let Inst{9-5} = Zn;
  1186. let Inst{4-0} = Zd;
  1187. let Constraints = "$Zd = $_Zd";
  1188. }
  1189. multiclass sve2_int_perm_tbx<string asm, bits<2> opc, SDPatternOperator op> {
  1190. def _B : sve2_int_perm_tbx<0b00, opc, asm, ZPR8>;
  1191. def _H : sve2_int_perm_tbx<0b01, opc, asm, ZPR16>;
  1192. def _S : sve2_int_perm_tbx<0b10, opc, asm, ZPR32>;
  1193. def _D : sve2_int_perm_tbx<0b11, opc, asm, ZPR64>;
  1194. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  1195. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  1196. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  1197. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  1198. def : SVE_3_Op_Pat<nxv8f16, op, nxv8f16, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  1199. def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  1200. def : SVE_3_Op_Pat<nxv2f64, op, nxv2f64, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  1201. def : SVE_3_Op_Pat<nxv8bf16, op, nxv8bf16, nxv8bf16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  1202. }
  1203. class sve_int_perm_reverse_z<bits<2> sz8_64, string asm, ZPRRegOp zprty>
  1204. : I<(outs zprty:$Zd), (ins zprty:$Zn),
  1205. asm, "\t$Zd, $Zn",
  1206. "",
  1207. []>, Sched<[]> {
  1208. bits<5> Zd;
  1209. bits<5> Zn;
  1210. let Inst{31-24} = 0b00000101;
  1211. let Inst{23-22} = sz8_64;
  1212. let Inst{21-10} = 0b111000001110;
  1213. let Inst{9-5} = Zn;
  1214. let Inst{4-0} = Zd;
  1215. }
  1216. multiclass sve_int_perm_reverse_z<string asm, SDPatternOperator op> {
  1217. def _B : sve_int_perm_reverse_z<0b00, asm, ZPR8>;
  1218. def _H : sve_int_perm_reverse_z<0b01, asm, ZPR16>;
  1219. def _S : sve_int_perm_reverse_z<0b10, asm, ZPR32>;
  1220. def _D : sve_int_perm_reverse_z<0b11, asm, ZPR64>;
  1221. def : SVE_1_Op_Pat<nxv16i8, op, nxv16i8, !cast<Instruction>(NAME # _B)>;
  1222. def : SVE_1_Op_Pat<nxv8i16, op, nxv8i16, !cast<Instruction>(NAME # _H)>;
  1223. def : SVE_1_Op_Pat<nxv4i32, op, nxv4i32, !cast<Instruction>(NAME # _S)>;
  1224. def : SVE_1_Op_Pat<nxv2i64, op, nxv2i64, !cast<Instruction>(NAME # _D)>;
  1225. def : SVE_1_Op_Pat<nxv2f16, op, nxv2f16, !cast<Instruction>(NAME # _D)>;
  1226. def : SVE_1_Op_Pat<nxv4f16, op, nxv4f16, !cast<Instruction>(NAME # _S)>;
  1227. def : SVE_1_Op_Pat<nxv8f16, op, nxv8f16, !cast<Instruction>(NAME # _H)>;
  1228. def : SVE_1_Op_Pat<nxv2f32, op, nxv2f32, !cast<Instruction>(NAME # _D)>;
  1229. def : SVE_1_Op_Pat<nxv4f32, op, nxv4f32, !cast<Instruction>(NAME # _S)>;
  1230. def : SVE_1_Op_Pat<nxv2f64, op, nxv2f64, !cast<Instruction>(NAME # _D)>;
  1231. def : SVE_1_Op_Pat<nxv2bf16, op, nxv2bf16, !cast<Instruction>(NAME # _D)>;
  1232. def : SVE_1_Op_Pat<nxv4bf16, op, nxv4bf16, !cast<Instruction>(NAME # _S)>;
  1233. def : SVE_1_Op_Pat<nxv8bf16, op, nxv8bf16, !cast<Instruction>(NAME # _H)>;
  1234. }
  1235. class sve_int_perm_reverse_p<bits<2> sz8_64, string asm, PPRRegOp pprty,
  1236. SDPatternOperator op>
  1237. : I<(outs pprty:$Pd), (ins pprty:$Pn),
  1238. asm, "\t$Pd, $Pn",
  1239. "",
  1240. [(set nxv16i1:$Pd, (op nxv16i1:$Pn))]>, Sched<[]> {
  1241. bits<4> Pd;
  1242. bits<4> Pn;
  1243. let Inst{31-24} = 0b00000101;
  1244. let Inst{23-22} = sz8_64;
  1245. let Inst{21-9} = 0b1101000100000;
  1246. let Inst{8-5} = Pn;
  1247. let Inst{4} = 0b0;
  1248. let Inst{3-0} = Pd;
  1249. }
  1250. multiclass sve_int_perm_reverse_p<string asm, SDPatternOperator ir_op,
  1251. SDPatternOperator op_b16,
  1252. SDPatternOperator op_b32,
  1253. SDPatternOperator op_b64> {
  1254. def _B : sve_int_perm_reverse_p<0b00, asm, PPR8, ir_op>;
  1255. def _H : sve_int_perm_reverse_p<0b01, asm, PPR16, op_b16>;
  1256. def _S : sve_int_perm_reverse_p<0b10, asm, PPR32, op_b32>;
  1257. def _D : sve_int_perm_reverse_p<0b11, asm, PPR64, op_b64>;
  1258. def : SVE_1_Op_Pat<nxv8i1, ir_op, nxv8i1, !cast<Instruction>(NAME # _H)>;
  1259. def : SVE_1_Op_Pat<nxv4i1, ir_op, nxv4i1, !cast<Instruction>(NAME # _S)>;
  1260. def : SVE_1_Op_Pat<nxv2i1, ir_op, nxv2i1, !cast<Instruction>(NAME # _D)>;
  1261. }
  1262. class sve_int_perm_unpk<bits<2> sz16_64, bits<2> opc, string asm,
  1263. ZPRRegOp zprty1, ZPRRegOp zprty2>
  1264. : I<(outs zprty1:$Zd), (ins zprty2:$Zn),
  1265. asm, "\t$Zd, $Zn",
  1266. "", []>, Sched<[]> {
  1267. bits<5> Zd;
  1268. bits<5> Zn;
  1269. let Inst{31-24} = 0b00000101;
  1270. let Inst{23-22} = sz16_64;
  1271. let Inst{21-18} = 0b1100;
  1272. let Inst{17-16} = opc;
  1273. let Inst{15-10} = 0b001110;
  1274. let Inst{9-5} = Zn;
  1275. let Inst{4-0} = Zd;
  1276. }
  1277. multiclass sve_int_perm_unpk<bits<2> opc, string asm, SDPatternOperator op> {
  1278. def _H : sve_int_perm_unpk<0b01, opc, asm, ZPR16, ZPR8>;
  1279. def _S : sve_int_perm_unpk<0b10, opc, asm, ZPR32, ZPR16>;
  1280. def _D : sve_int_perm_unpk<0b11, opc, asm, ZPR64, ZPR32>;
  1281. def : SVE_1_Op_Pat<nxv8i16, op, nxv16i8, !cast<Instruction>(NAME # _H)>;
  1282. def : SVE_1_Op_Pat<nxv4i32, op, nxv8i16, !cast<Instruction>(NAME # _S)>;
  1283. def : SVE_1_Op_Pat<nxv2i64, op, nxv4i32, !cast<Instruction>(NAME # _D)>;
  1284. }
  1285. class sve_int_perm_insrs<bits<2> sz8_64, string asm, ZPRRegOp zprty,
  1286. RegisterClass srcRegType>
  1287. : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, srcRegType:$Rm),
  1288. asm, "\t$Zdn, $Rm",
  1289. "",
  1290. []>, Sched<[]> {
  1291. bits<5> Rm;
  1292. bits<5> Zdn;
  1293. let Inst{31-24} = 0b00000101;
  1294. let Inst{23-22} = sz8_64;
  1295. let Inst{21-10} = 0b100100001110;
  1296. let Inst{9-5} = Rm;
  1297. let Inst{4-0} = Zdn;
  1298. let Constraints = "$Zdn = $_Zdn";
  1299. let DestructiveInstType = DestructiveOther;
  1300. }
  1301. multiclass sve_int_perm_insrs<string asm, SDPatternOperator op> {
  1302. def _B : sve_int_perm_insrs<0b00, asm, ZPR8, GPR32>;
  1303. def _H : sve_int_perm_insrs<0b01, asm, ZPR16, GPR32>;
  1304. def _S : sve_int_perm_insrs<0b10, asm, ZPR32, GPR32>;
  1305. def _D : sve_int_perm_insrs<0b11, asm, ZPR64, GPR64>;
  1306. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, i32, !cast<Instruction>(NAME # _B)>;
  1307. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, i32, !cast<Instruction>(NAME # _H)>;
  1308. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, i32, !cast<Instruction>(NAME # _S)>;
  1309. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, i64, !cast<Instruction>(NAME # _D)>;
  1310. }
  1311. class sve_int_perm_insrv<bits<2> sz8_64, string asm, ZPRRegOp zprty,
  1312. FPRasZPROperand srcOpType>
  1313. : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, srcOpType:$Vm),
  1314. asm, "\t$Zdn, $Vm",
  1315. "",
  1316. []>, Sched<[]> {
  1317. bits<5> Vm;
  1318. bits<5> Zdn;
  1319. let Inst{31-24} = 0b00000101;
  1320. let Inst{23-22} = sz8_64;
  1321. let Inst{21-10} = 0b110100001110;
  1322. let Inst{9-5} = Vm;
  1323. let Inst{4-0} = Zdn;
  1324. let Constraints = "$Zdn = $_Zdn";
  1325. let DestructiveInstType = DestructiveOther;
  1326. }
  1327. multiclass sve_int_perm_insrv<string asm, SDPatternOperator op> {
  1328. def _B : sve_int_perm_insrv<0b00, asm, ZPR8, FPR8asZPR>;
  1329. def _H : sve_int_perm_insrv<0b01, asm, ZPR16, FPR16asZPR>;
  1330. def _S : sve_int_perm_insrv<0b10, asm, ZPR32, FPR32asZPR>;
  1331. def _D : sve_int_perm_insrv<0b11, asm, ZPR64, FPR64asZPR>;
  1332. def : Pat<(nxv8f16 (op nxv8f16:$Zn, f16:$Vm)),
  1333. (!cast<Instruction>(NAME # _H) $Zn, (INSERT_SUBREG (IMPLICIT_DEF), $Vm, hsub))>;
  1334. def : Pat<(nxv4f32 (op nxv4f32:$Zn, f32:$Vm)),
  1335. (!cast<Instruction>(NAME # _S) $Zn, (INSERT_SUBREG (IMPLICIT_DEF), $Vm, ssub))>;
  1336. def : Pat<(nxv2f64 (op nxv2f64:$Zn, f64:$Vm)),
  1337. (!cast<Instruction>(NAME # _D) $Zn, (INSERT_SUBREG (IMPLICIT_DEF), $Vm, dsub))>;
  1338. def : Pat<(nxv8bf16 (op nxv8bf16:$Zn, bf16:$Vm)),
  1339. (!cast<Instruction>(NAME # _H) $Zn, (INSERT_SUBREG (IMPLICIT_DEF), $Vm, hsub))>;
  1340. // Keep integer insertions within the vector unit.
  1341. def : Pat<(nxv16i8 (op (nxv16i8 ZPR:$Zn), (i32 (vector_extract (nxv16i8 ZPR:$Vm), 0)))),
  1342. (!cast<Instruction>(NAME # _B) $Zn, ZPR:$Vm)>;
  1343. def : Pat<(nxv8i16 (op (nxv8i16 ZPR:$Zn), (i32 (vector_extract (nxv8i16 ZPR:$Vm), 0)))),
  1344. (!cast<Instruction>(NAME # _H) $Zn, ZPR:$Vm)>;
  1345. def : Pat<(nxv4i32 (op (nxv4i32 ZPR:$Zn), (i32 (vector_extract (nxv4i32 ZPR:$Vm), 0)))),
  1346. (!cast<Instruction>(NAME # _S) $Zn, ZPR: $Vm)>;
  1347. def : Pat<(nxv2i64 (op (nxv2i64 ZPR:$Zn), (i64 (vector_extract (nxv2i64 ZPR:$Vm), 0)))),
  1348. (!cast<Instruction>(NAME # _D) $Zn, ZPR:$Vm)>;
  1349. }
  1350. //===----------------------------------------------------------------------===//
  1351. // SVE Permute - Extract Group
  1352. //===----------------------------------------------------------------------===//
  1353. class sve_int_perm_extract_i<string asm>
  1354. : I<(outs ZPR8:$Zdn), (ins ZPR8:$_Zdn, ZPR8:$Zm, imm0_255:$imm8),
  1355. asm, "\t$Zdn, $_Zdn, $Zm, $imm8",
  1356. "", []>, Sched<[]> {
  1357. bits<5> Zdn;
  1358. bits<5> Zm;
  1359. bits<8> imm8;
  1360. let Inst{31-21} = 0b00000101001;
  1361. let Inst{20-16} = imm8{7-3};
  1362. let Inst{15-13} = 0b000;
  1363. let Inst{12-10} = imm8{2-0};
  1364. let Inst{9-5} = Zm;
  1365. let Inst{4-0} = Zdn;
  1366. let Constraints = "$Zdn = $_Zdn";
  1367. let DestructiveInstType = DestructiveOther;
  1368. let ElementSize = ElementSizeNone;
  1369. }
  1370. multiclass sve_int_perm_extract_i<string asm, SDPatternOperator op> {
  1371. def NAME : sve_int_perm_extract_i<asm>;
  1372. def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, imm0_255,
  1373. !cast<Instruction>(NAME)>;
  1374. }
  1375. class sve2_int_perm_extract_i_cons<string asm>
  1376. : I<(outs ZPR8:$Zd), (ins ZZ_b:$Zn, imm0_255:$imm8),
  1377. asm, "\t$Zd, $Zn, $imm8",
  1378. "", []>, Sched<[]> {
  1379. bits<5> Zd;
  1380. bits<5> Zn;
  1381. bits<8> imm8;
  1382. let Inst{31-21} = 0b00000101011;
  1383. let Inst{20-16} = imm8{7-3};
  1384. let Inst{15-13} = 0b000;
  1385. let Inst{12-10} = imm8{2-0};
  1386. let Inst{9-5} = Zn;
  1387. let Inst{4-0} = Zd;
  1388. }
  1389. //===----------------------------------------------------------------------===//
  1390. // SVE Vector Select Group
  1391. //===----------------------------------------------------------------------===//
  1392. class sve_int_sel_vvv<bits<2> sz8_64, string asm, ZPRRegOp zprty>
  1393. : I<(outs zprty:$Zd), (ins PPRAny:$Pg, zprty:$Zn, zprty:$Zm),
  1394. asm, "\t$Zd, $Pg, $Zn, $Zm",
  1395. "",
  1396. []>, Sched<[]> {
  1397. bits<4> Pg;
  1398. bits<5> Zd;
  1399. bits<5> Zm;
  1400. bits<5> Zn;
  1401. let Inst{31-24} = 0b00000101;
  1402. let Inst{23-22} = sz8_64;
  1403. let Inst{21} = 0b1;
  1404. let Inst{20-16} = Zm;
  1405. let Inst{15-14} = 0b11;
  1406. let Inst{13-10} = Pg;
  1407. let Inst{9-5} = Zn;
  1408. let Inst{4-0} = Zd;
  1409. }
  1410. multiclass sve_int_sel_vvv<string asm, SDPatternOperator op> {
  1411. def _B : sve_int_sel_vvv<0b00, asm, ZPR8>;
  1412. def _H : sve_int_sel_vvv<0b01, asm, ZPR16>;
  1413. def _S : sve_int_sel_vvv<0b10, asm, ZPR32>;
  1414. def _D : sve_int_sel_vvv<0b11, asm, ZPR64>;
  1415. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  1416. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  1417. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  1418. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  1419. def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  1420. def : SVE_3_Op_Pat<nxv4f16, op, nxv4i1, nxv4f16, nxv4f16, !cast<Instruction>(NAME # _S)>;
  1421. def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  1422. def : SVE_3_Op_Pat<nxv2f16, op, nxv2i1, nxv2f16, nxv2f16, !cast<Instruction>(NAME # _D)>;
  1423. def : SVE_3_Op_Pat<nxv2f32, op, nxv2i1, nxv2f32, nxv2f32, !cast<Instruction>(NAME # _D)>;
  1424. def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  1425. def : SVE_3_Op_Pat<nxv8bf16, op, nxv8i1, nxv8bf16, nxv8bf16, !cast<Instruction>(NAME # _H)>;
  1426. def : InstAlias<"mov $Zd, $Pg/m, $Zn",
  1427. (!cast<Instruction>(NAME # _B) ZPR8:$Zd, PPRAny:$Pg, ZPR8:$Zn, ZPR8:$Zd), 1>;
  1428. def : InstAlias<"mov $Zd, $Pg/m, $Zn",
  1429. (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, ZPR16:$Zn, ZPR16:$Zd), 1>;
  1430. def : InstAlias<"mov $Zd, $Pg/m, $Zn",
  1431. (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, ZPR32:$Zn, ZPR32:$Zd), 1>;
  1432. def : InstAlias<"mov $Zd, $Pg/m, $Zn",
  1433. (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, ZPR64:$Zn, ZPR64:$Zd), 1>;
  1434. }
  1435. //===----------------------------------------------------------------------===//
  1436. // SVE Predicate Logical Operations Group
  1437. //===----------------------------------------------------------------------===//
  1438. class sve_int_pred_log<bits<4> opc, string asm>
  1439. : I<(outs PPR8:$Pd), (ins PPRAny:$Pg, PPR8:$Pn, PPR8:$Pm),
  1440. asm, "\t$Pd, $Pg/z, $Pn, $Pm",
  1441. "",
  1442. []>, Sched<[]> {
  1443. bits<4> Pd;
  1444. bits<4> Pg;
  1445. bits<4> Pm;
  1446. bits<4> Pn;
  1447. let Inst{31-24} = 0b00100101;
  1448. let Inst{23-22} = opc{3-2};
  1449. let Inst{21-20} = 0b00;
  1450. let Inst{19-16} = Pm;
  1451. let Inst{15-14} = 0b01;
  1452. let Inst{13-10} = Pg;
  1453. let Inst{9} = opc{1};
  1454. let Inst{8-5} = Pn;
  1455. let Inst{4} = opc{0};
  1456. let Inst{3-0} = Pd;
  1457. // SEL has no predication qualifier.
  1458. let AsmString = !if(!eq(opc, 0b0011),
  1459. !strconcat(asm, "\t$Pd, $Pg, $Pn, $Pm"),
  1460. !strconcat(asm, "\t$Pd, $Pg/z, $Pn, $Pm"));
  1461. let Defs = !if(!eq (opc{2}, 1), [NZCV], []);
  1462. }
  1463. multiclass sve_int_pred_log<bits<4> opc, string asm, SDPatternOperator op,
  1464. SDPatternOperator op_nopred = null_frag> {
  1465. def NAME : sve_int_pred_log<opc, asm>;
  1466. def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, nxv16i1, !cast<Instruction>(NAME)>;
  1467. def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8i1, nxv8i1, !cast<Instruction>(NAME)>;
  1468. def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4i1, nxv4i1, !cast<Instruction>(NAME)>;
  1469. def : SVE_3_Op_Pat<nxv2i1, op, nxv2i1, nxv2i1, nxv2i1, !cast<Instruction>(NAME)>;
  1470. def : SVE_3_Op_Pat<nxv1i1, op, nxv1i1, nxv1i1, nxv1i1, !cast<Instruction>(NAME)>;
  1471. def : SVE_2_Op_AllActive_Pat<nxv16i1, op_nopred, nxv16i1, nxv16i1,
  1472. !cast<Instruction>(NAME), PTRUE_B>;
  1473. def : SVE_2_Op_AllActive_Pat<nxv8i1, op_nopred, nxv8i1, nxv8i1,
  1474. !cast<Instruction>(NAME), PTRUE_H>;
  1475. def : SVE_2_Op_AllActive_Pat<nxv4i1, op_nopred, nxv4i1, nxv4i1,
  1476. !cast<Instruction>(NAME), PTRUE_S>;
  1477. def : SVE_2_Op_AllActive_Pat<nxv2i1, op_nopred, nxv2i1, nxv2i1,
  1478. !cast<Instruction>(NAME), PTRUE_D>;
  1479. // Emulate .Q operation using a PTRUE_D when the other lanes don't matter.
  1480. def : SVE_2_Op_AllActive_Pat<nxv1i1, op_nopred, nxv1i1, nxv1i1,
  1481. !cast<Instruction>(NAME), PTRUE_D>;
  1482. }
  1483. // An instance of sve_int_pred_log_and but uses op_nopred's first operand as the
  1484. // general predicate.
  1485. multiclass sve_int_pred_log_v2<bits<4> opc, string asm, SDPatternOperator op,
  1486. SDPatternOperator op_nopred> :
  1487. sve_int_pred_log<opc, asm, op> {
  1488. def : Pat<(nxv16i1 (op_nopred nxv16i1:$Op1, nxv16i1:$Op2)),
  1489. (!cast<Instruction>(NAME) $Op1, $Op1, $Op2)>;
  1490. def : Pat<(nxv8i1 (op_nopred nxv8i1:$Op1, nxv8i1:$Op2)),
  1491. (!cast<Instruction>(NAME) $Op1, $Op1, $Op2)>;
  1492. def : Pat<(nxv4i1 (op_nopred nxv4i1:$Op1, nxv4i1:$Op2)),
  1493. (!cast<Instruction>(NAME) $Op1, $Op1, $Op2)>;
  1494. def : Pat<(nxv2i1 (op_nopred nxv2i1:$Op1, nxv2i1:$Op2)),
  1495. (!cast<Instruction>(NAME) $Op1, $Op1, $Op2)>;
  1496. // Emulate .Q operation using a PTRUE_D when the other lanes don't matter.
  1497. def : Pat<(nxv1i1 (op_nopred nxv1i1:$Op1, nxv1i1:$Op2)),
  1498. (!cast<Instruction>(NAME) $Op1, $Op1, $Op2)>;
  1499. }
  1500. //===----------------------------------------------------------------------===//
  1501. // SVE Logical Mask Immediate Group
  1502. //===----------------------------------------------------------------------===//
  1503. class sve_int_log_imm<bits<2> opc, string asm>
  1504. : I<(outs ZPR64:$Zdn), (ins ZPR64:$_Zdn, logical_imm64:$imms13),
  1505. asm, "\t$Zdn, $_Zdn, $imms13",
  1506. "", []>, Sched<[]> {
  1507. bits<5> Zdn;
  1508. bits<13> imms13;
  1509. let Inst{31-24} = 0b00000101;
  1510. let Inst{23-22} = opc;
  1511. let Inst{21-18} = 0b0000;
  1512. let Inst{17-5} = imms13;
  1513. let Inst{4-0} = Zdn;
  1514. let Constraints = "$Zdn = $_Zdn";
  1515. let DecoderMethod = "DecodeSVELogicalImmInstruction";
  1516. let DestructiveInstType = DestructiveOther;
  1517. let ElementSize = ElementSizeNone;
  1518. }
  1519. multiclass sve_int_log_imm<bits<2> opc, string asm, string alias, SDPatternOperator op> {
  1520. def NAME : sve_int_log_imm<opc, asm>;
  1521. def : SVE_1_Op_Imm_Log_Pat<nxv16i8, op, ZPR8, i32, SVELogicalImm8Pat, !cast<Instruction>(NAME)>;
  1522. def : SVE_1_Op_Imm_Log_Pat<nxv8i16, op, ZPR16, i32, SVELogicalImm16Pat, !cast<Instruction>(NAME)>;
  1523. def : SVE_1_Op_Imm_Log_Pat<nxv4i32, op, ZPR32, i32, SVELogicalImm32Pat, !cast<Instruction>(NAME)>;
  1524. def : SVE_1_Op_Imm_Log_Pat<nxv2i64, op, ZPR64, i64, SVELogicalImm64Pat, !cast<Instruction>(NAME)>;
  1525. def : InstAlias<asm # "\t$Zdn, $Zdn, $imm",
  1526. (!cast<Instruction>(NAME) ZPR8:$Zdn, sve_logical_imm8:$imm), 4>;
  1527. def : InstAlias<asm # "\t$Zdn, $Zdn, $imm",
  1528. (!cast<Instruction>(NAME) ZPR16:$Zdn, sve_logical_imm16:$imm), 3>;
  1529. def : InstAlias<asm # "\t$Zdn, $Zdn, $imm",
  1530. (!cast<Instruction>(NAME) ZPR32:$Zdn, sve_logical_imm32:$imm), 2>;
  1531. def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
  1532. (!cast<Instruction>(NAME) ZPR8:$Zdn, sve_logical_imm8_not:$imm), 0>;
  1533. def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
  1534. (!cast<Instruction>(NAME) ZPR16:$Zdn, sve_logical_imm16_not:$imm), 0>;
  1535. def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
  1536. (!cast<Instruction>(NAME) ZPR32:$Zdn, sve_logical_imm32_not:$imm), 0>;
  1537. def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
  1538. (!cast<Instruction>(NAME) ZPR64:$Zdn, logical_imm64_not:$imm), 0>;
  1539. }
  1540. multiclass sve_int_log_imm_bic<SDPatternOperator op> {
  1541. def : SVE_1_Op_Imm_Log_Pat<nxv16i8, op, ZPR8, i32, SVELogicalImm8NotPat, !cast<Instruction>("AND_ZI")>;
  1542. def : SVE_1_Op_Imm_Log_Pat<nxv8i16, op, ZPR16, i32, SVELogicalImm16NotPat, !cast<Instruction>("AND_ZI")>;
  1543. def : SVE_1_Op_Imm_Log_Pat<nxv4i32, op, ZPR32, i32, SVELogicalImm32NotPat, !cast<Instruction>("AND_ZI")>;
  1544. def : SVE_1_Op_Imm_Log_Pat<nxv2i64, op, ZPR64, i64, SVELogicalImm64NotPat, !cast<Instruction>("AND_ZI")>;
  1545. }
  1546. class sve_int_dup_mask_imm<string asm>
  1547. : I<(outs ZPR64:$Zd), (ins logical_imm64:$imms),
  1548. asm, "\t$Zd, $imms",
  1549. "",
  1550. []>, Sched<[]> {
  1551. bits<5> Zd;
  1552. bits<13> imms;
  1553. let Inst{31-18} = 0b00000101110000;
  1554. let Inst{17-5} = imms;
  1555. let Inst{4-0} = Zd;
  1556. let isReMaterializable = 1;
  1557. let DecoderMethod = "DecodeSVELogicalImmInstruction";
  1558. }
  1559. multiclass sve_int_dup_mask_imm<string asm> {
  1560. def NAME : sve_int_dup_mask_imm<asm>;
  1561. def : InstAlias<"dupm $Zd, $imm",
  1562. (!cast<Instruction>(NAME) ZPR8:$Zd, sve_logical_imm8:$imm), 4>;
  1563. def : InstAlias<"dupm $Zd, $imm",
  1564. (!cast<Instruction>(NAME) ZPR16:$Zd, sve_logical_imm16:$imm), 3>;
  1565. def : InstAlias<"dupm $Zd, $imm",
  1566. (!cast<Instruction>(NAME) ZPR32:$Zd, sve_logical_imm32:$imm), 2>;
  1567. // All Zd.b forms have a CPY/DUP equivalent, hence no byte alias here.
  1568. def : InstAlias<"mov $Zd, $imm",
  1569. (!cast<Instruction>(NAME) ZPR16:$Zd, sve_preferred_logical_imm16:$imm), 7>;
  1570. def : InstAlias<"mov $Zd, $imm",
  1571. (!cast<Instruction>(NAME) ZPR32:$Zd, sve_preferred_logical_imm32:$imm), 6>;
  1572. def : InstAlias<"mov $Zd, $imm",
  1573. (!cast<Instruction>(NAME) ZPR64:$Zd, sve_preferred_logical_imm64:$imm), 5>;
  1574. // NOTE: No pattern for nxv16i8 because DUP has full coverage.
  1575. def : Pat<(nxv8i16 (splat_vector (i32 (SVELogicalImm16Pat i64:$imm)))),
  1576. (!cast<Instruction>(NAME) i64:$imm)>;
  1577. def : Pat<(nxv4i32 (splat_vector (i32 (SVELogicalImm32Pat i64:$imm)))),
  1578. (!cast<Instruction>(NAME) i64:$imm)>;
  1579. def : Pat<(nxv2i64 (splat_vector (i64 (SVELogicalImm64Pat i64:$imm)))),
  1580. (!cast<Instruction>(NAME) i64:$imm)>;
  1581. }
  1582. //===----------------------------------------------------------------------===//
  1583. // SVE Integer Arithmetic - Unpredicated Group.
  1584. //===----------------------------------------------------------------------===//
  1585. class sve_int_bin_cons_arit_0<bits<2> sz8_64, bits<3> opc, string asm,
  1586. ZPRRegOp zprty>
  1587. : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
  1588. asm, "\t$Zd, $Zn, $Zm",
  1589. "", []>, Sched<[]> {
  1590. bits<5> Zd;
  1591. bits<5> Zm;
  1592. bits<5> Zn;
  1593. let Inst{31-24} = 0b00000100;
  1594. let Inst{23-22} = sz8_64;
  1595. let Inst{21} = 0b1;
  1596. let Inst{20-16} = Zm;
  1597. let Inst{15-13} = 0b000;
  1598. let Inst{12-10} = opc;
  1599. let Inst{9-5} = Zn;
  1600. let Inst{4-0} = Zd;
  1601. }
  1602. multiclass sve_int_bin_cons_arit_0<bits<3> opc, string asm, SDPatternOperator op> {
  1603. def _B : sve_int_bin_cons_arit_0<0b00, opc, asm, ZPR8>;
  1604. def _H : sve_int_bin_cons_arit_0<0b01, opc, asm, ZPR16>;
  1605. def _S : sve_int_bin_cons_arit_0<0b10, opc, asm, ZPR32>;
  1606. def _D : sve_int_bin_cons_arit_0<0b11, opc, asm, ZPR64>;
  1607. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  1608. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  1609. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  1610. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  1611. }
  1612. //===----------------------------------------------------------------------===//
  1613. // SVE Floating Point Arithmetic - Predicated Group
  1614. //===----------------------------------------------------------------------===//
  1615. class sve_fp_2op_i_p_zds<bits<2> sz, bits<3> opc, string asm,
  1616. ZPRRegOp zprty,
  1617. Operand imm_ty>
  1618. : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, imm_ty:$i1),
  1619. asm, "\t$Zdn, $Pg/m, $_Zdn, $i1",
  1620. "",
  1621. []>, Sched<[]> {
  1622. bits<3> Pg;
  1623. bits<5> Zdn;
  1624. bit i1;
  1625. let Inst{31-24} = 0b01100101;
  1626. let Inst{23-22} = sz;
  1627. let Inst{21-19} = 0b011;
  1628. let Inst{18-16} = opc;
  1629. let Inst{15-13} = 0b100;
  1630. let Inst{12-10} = Pg;
  1631. let Inst{9-6} = 0b0000;
  1632. let Inst{5} = i1;
  1633. let Inst{4-0} = Zdn;
  1634. let Constraints = "$Zdn = $_Zdn";
  1635. let DestructiveInstType = DestructiveOther;
  1636. let ElementSize = zprty.ElementSize;
  1637. }
  1638. multiclass sve_fp_2op_i_p_zds<bits<3> opc, string asm, string Ps, Operand imm_ty, FPImmLeaf A, FPImmLeaf B, SDPatternOperator op> {
  1639. let DestructiveInstType = DestructiveBinaryImm in {
  1640. def _H : SVEPseudo2Instr<Ps # _H, 1>, sve_fp_2op_i_p_zds<0b01, opc, asm, ZPR16, imm_ty>;
  1641. def _S : SVEPseudo2Instr<Ps # _S, 1>, sve_fp_2op_i_p_zds<0b10, opc, asm, ZPR32, imm_ty>;
  1642. def _D : SVEPseudo2Instr<Ps # _D, 1>, sve_fp_2op_i_p_zds<0b11, opc, asm, ZPR64, imm_ty>;
  1643. }
  1644. def : SVE_2_Op_Fp_Imm_Pat<nxv8f16, op, nxv8i1, f16, A, 0, !cast<Instruction>(NAME # "_H")>;
  1645. def : SVE_2_Op_Fp_Imm_Pat<nxv8f16, op, nxv8i1, f16, B, 1, !cast<Instruction>(NAME # "_H")>;
  1646. def : SVE_2_Op_Fp_Imm_Pat<nxv4f32, op, nxv4i1, f32, A, 0, !cast<Instruction>(NAME # "_S")>;
  1647. def : SVE_2_Op_Fp_Imm_Pat<nxv4f32, op, nxv4i1, f32, B, 1, !cast<Instruction>(NAME # "_S")>;
  1648. def : SVE_2_Op_Fp_Imm_Pat<nxv2f64, op, nxv2i1, f64, A, 0, !cast<Instruction>(NAME # "_D")>;
  1649. def : SVE_2_Op_Fp_Imm_Pat<nxv2f64, op, nxv2i1, f64, B, 1, !cast<Instruction>(NAME # "_D")>;
  1650. }
  1651. class sve_fp_2op_p_zds<bits<2> sz, bits<4> opc, string asm,
  1652. ZPRRegOp zprty>
  1653. : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
  1654. asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm",
  1655. "",
  1656. []>, Sched<[]> {
  1657. bits<3> Pg;
  1658. bits<5> Zdn;
  1659. bits<5> Zm;
  1660. let Inst{31-24} = 0b01100101;
  1661. let Inst{23-22} = sz;
  1662. let Inst{21-20} = 0b00;
  1663. let Inst{19-16} = opc;
  1664. let Inst{15-13} = 0b100;
  1665. let Inst{12-10} = Pg;
  1666. let Inst{9-5} = Zm;
  1667. let Inst{4-0} = Zdn;
  1668. let Constraints = "$Zdn = $_Zdn";
  1669. let DestructiveInstType = DestructiveOther;
  1670. let ElementSize = zprty.ElementSize;
  1671. }
  1672. multiclass sve_fp_2op_p_zds<bits<4> opc, string asm, string Ps,
  1673. SDPatternOperator op, DestructiveInstTypeEnum flags,
  1674. string revname="", bit isReverseInstr=0> {
  1675. let DestructiveInstType = flags in {
  1676. def _H : sve_fp_2op_p_zds<0b01, opc, asm, ZPR16>,
  1677. SVEPseudo2Instr<Ps # _H, 1>, SVEInstr2Rev<NAME # _H, revname # _H, isReverseInstr>;
  1678. def _S : sve_fp_2op_p_zds<0b10, opc, asm, ZPR32>,
  1679. SVEPseudo2Instr<Ps # _S, 1>, SVEInstr2Rev<NAME # _S, revname # _S, isReverseInstr>;
  1680. def _D : sve_fp_2op_p_zds<0b11, opc, asm, ZPR64>,
  1681. SVEPseudo2Instr<Ps # _D, 1>, SVEInstr2Rev<NAME # _D, revname # _D, isReverseInstr>;
  1682. }
  1683. def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  1684. def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  1685. def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  1686. }
  1687. multiclass sve_fp_2op_p_zds_fscale<bits<4> opc, string asm,
  1688. SDPatternOperator op> {
  1689. def _H : sve_fp_2op_p_zds<0b01, opc, asm, ZPR16>;
  1690. def _S : sve_fp_2op_p_zds<0b10, opc, asm, ZPR32>;
  1691. def _D : sve_fp_2op_p_zds<0b11, opc, asm, ZPR64>;
  1692. def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  1693. def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  1694. def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  1695. }
  1696. multiclass sve_fp_2op_p_zds_zeroing_hsd<SDPatternOperator op> {
  1697. def _ZERO_H : PredTwoOpPseudo<NAME # _H, ZPR16, FalseLanesZero>;
  1698. def _ZERO_S : PredTwoOpPseudo<NAME # _S, ZPR32, FalseLanesZero>;
  1699. def _ZERO_D : PredTwoOpPseudo<NAME # _D, ZPR64, FalseLanesZero>;
  1700. def : SVE_3_Op_Pat_SelZero<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Pseudo>(NAME # _ZERO_H)>;
  1701. def : SVE_3_Op_Pat_SelZero<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Pseudo>(NAME # _ZERO_S)>;
  1702. def : SVE_3_Op_Pat_SelZero<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Pseudo>(NAME # _ZERO_D)>;
  1703. }
  1704. class sve_fp_ftmad<bits<2> sz, string asm, ZPRRegOp zprty>
  1705. : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm, timm32_0_7:$imm3),
  1706. asm, "\t$Zdn, $_Zdn, $Zm, $imm3",
  1707. "",
  1708. []>, Sched<[]> {
  1709. bits<5> Zdn;
  1710. bits<5> Zm;
  1711. bits<3> imm3;
  1712. let Inst{31-24} = 0b01100101;
  1713. let Inst{23-22} = sz;
  1714. let Inst{21-19} = 0b010;
  1715. let Inst{18-16} = imm3;
  1716. let Inst{15-10} = 0b100000;
  1717. let Inst{9-5} = Zm;
  1718. let Inst{4-0} = Zdn;
  1719. let Constraints = "$Zdn = $_Zdn";
  1720. let DestructiveInstType = DestructiveOther;
  1721. let ElementSize = ElementSizeNone;
  1722. }
  1723. multiclass sve_fp_ftmad<string asm, SDPatternOperator op> {
  1724. def _H : sve_fp_ftmad<0b01, asm, ZPR16>;
  1725. def _S : sve_fp_ftmad<0b10, asm, ZPR32>;
  1726. def _D : sve_fp_ftmad<0b11, asm, ZPR64>;
  1727. def : Pat<(nxv8f16 (op (nxv8f16 ZPR16:$Zn), (nxv8f16 ZPR16:$Zm), (i32 timm32_0_7:$imm))),
  1728. (!cast<Instruction>(NAME # _H) ZPR16:$Zn, ZPR16:$Zm, timm32_0_7:$imm)>;
  1729. def : Pat<(nxv4f32 (op (nxv4f32 ZPR32:$Zn), (nxv4f32 ZPR32:$Zm), (i32 timm32_0_7:$imm))),
  1730. (!cast<Instruction>(NAME # _S) ZPR32:$Zn, ZPR32:$Zm, timm32_0_7:$imm)>;
  1731. def : Pat<(nxv2f64 (op (nxv2f64 ZPR64:$Zn), (nxv2f64 ZPR64:$Zm), (i32 timm32_0_7:$imm))),
  1732. (!cast<Instruction>(NAME # _D) ZPR64:$Zn, ZPR64:$Zm, timm32_0_7:$imm)>;
  1733. }
  1734. multiclass sve_fp_2op_i_p_zds_hfd<Operand imm_ty, FPImmLeaf A, FPImmLeaf B, SDPatternOperator ir_op = null_frag> {
  1735. def _UNDEF_H : PredTwoOpImmPseudo<NAME # _H, ZPR16, imm_ty, FalseLanesUndef>;
  1736. def _UNDEF_S : PredTwoOpImmPseudo<NAME # _S, ZPR32, imm_ty, FalseLanesUndef>;
  1737. def _UNDEF_D : PredTwoOpImmPseudo<NAME # _D, ZPR64, imm_ty, FalseLanesUndef>;
  1738. def : SVE_2_Op_Fp_Imm_Pat<nxv8f16, ir_op, nxv8i1, f16, A, 0, !cast<Instruction>(NAME # "_UNDEF_H")>;
  1739. def : SVE_2_Op_Fp_Imm_Pat<nxv8f16, ir_op, nxv8i1, f16, B, 1, !cast<Instruction>(NAME # "_UNDEF_H")>;
  1740. def : SVE_2_Op_Fp_Imm_Pat<nxv4f16, ir_op, nxv4i1, f16, A, 0, !cast<Instruction>(NAME # "_UNDEF_H")>;
  1741. def : SVE_2_Op_Fp_Imm_Pat<nxv4f16, ir_op, nxv4i1, f16, B, 1, !cast<Instruction>(NAME # "_UNDEF_H")>;
  1742. def : SVE_2_Op_Fp_Imm_Pat<nxv2f16, ir_op, nxv2i1, f16, A, 0, !cast<Instruction>(NAME # "_UNDEF_H")>;
  1743. def : SVE_2_Op_Fp_Imm_Pat<nxv2f16, ir_op, nxv2i1, f16, B, 1, !cast<Instruction>(NAME # "_UNDEF_H")>;
  1744. def : SVE_2_Op_Fp_Imm_Pat<nxv4f32, ir_op, nxv4i1, f32, A, 0, !cast<Instruction>(NAME # "_UNDEF_S")>;
  1745. def : SVE_2_Op_Fp_Imm_Pat<nxv4f32, ir_op, nxv4i1, f32, B, 1, !cast<Instruction>(NAME # "_UNDEF_S")>;
  1746. def : SVE_2_Op_Fp_Imm_Pat<nxv2f32, ir_op, nxv2i1, f32, A, 0, !cast<Instruction>(NAME # "_UNDEF_S")>;
  1747. def : SVE_2_Op_Fp_Imm_Pat<nxv2f32, ir_op, nxv2i1, f32, B, 1, !cast<Instruction>(NAME # "_UNDEF_S")>;
  1748. def : SVE_2_Op_Fp_Imm_Pat<nxv2f64, ir_op, nxv2i1, f64, A, 0, !cast<Instruction>(NAME # "_UNDEF_D")>;
  1749. def : SVE_2_Op_Fp_Imm_Pat<nxv2f64, ir_op, nxv2i1, f64, B, 1, !cast<Instruction>(NAME # "_UNDEF_D")>;
  1750. }
  1751. multiclass sve_fp_2op_i_p_zds_zeroing_hfd<Operand imm_ty, FPImmLeaf A, FPImmLeaf B, SDPatternOperator op> {
  1752. def _ZERO_H : PredTwoOpImmPseudo<NAME # _H, ZPR16, imm_ty, FalseLanesZero>;
  1753. def _ZERO_S : PredTwoOpImmPseudo<NAME # _S, ZPR32, imm_ty, FalseLanesZero>;
  1754. def _ZERO_D : PredTwoOpImmPseudo<NAME # _D, ZPR64, imm_ty, FalseLanesZero>;
  1755. let AddedComplexity = 2 in {
  1756. def : SVE_2_Op_Fp_Imm_Pat_Zero<nxv8f16, op, nxv8i1, f16, A, 0, !cast<Instruction>(NAME # "_ZERO_H")>;
  1757. def : SVE_2_Op_Fp_Imm_Pat_Zero<nxv8f16, op, nxv8i1, f16, B, 1, !cast<Instruction>(NAME # "_ZERO_H")>;
  1758. def : SVE_2_Op_Fp_Imm_Pat_Zero<nxv4f32, op, nxv4i1, f32, A, 0, !cast<Instruction>(NAME # "_ZERO_S")>;
  1759. def : SVE_2_Op_Fp_Imm_Pat_Zero<nxv4f32, op, nxv4i1, f32, B, 1, !cast<Instruction>(NAME # "_ZERO_S")>;
  1760. def : SVE_2_Op_Fp_Imm_Pat_Zero<nxv2f64, op, nxv2i1, f64, A, 0, !cast<Instruction>(NAME # "_ZERO_D")>;
  1761. def : SVE_2_Op_Fp_Imm_Pat_Zero<nxv2f64, op, nxv2i1, f64, B, 1, !cast<Instruction>(NAME # "_ZERO_D")>;
  1762. }
  1763. }
  1764. //===----------------------------------------------------------------------===//
  1765. // SVE Floating Point Arithmetic - Unpredicated Group
  1766. //===----------------------------------------------------------------------===//
  1767. class sve_fp_3op_u_zd<bits<2> sz, bits<3> opc, string asm, ZPRRegOp zprty>
  1768. : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
  1769. asm, "\t$Zd, $Zn, $Zm",
  1770. "",
  1771. []>, Sched<[]> {
  1772. bits<5> Zd;
  1773. bits<5> Zm;
  1774. bits<5> Zn;
  1775. let Inst{31-24} = 0b01100101;
  1776. let Inst{23-22} = sz;
  1777. let Inst{21} = 0b0;
  1778. let Inst{20-16} = Zm;
  1779. let Inst{15-13} = 0b000;
  1780. let Inst{12-10} = opc;
  1781. let Inst{9-5} = Zn;
  1782. let Inst{4-0} = Zd;
  1783. }
  1784. multiclass sve_fp_3op_u_zd<bits<3> opc, string asm, SDPatternOperator op,
  1785. SDPatternOperator predicated_op = null_frag> {
  1786. def _H : sve_fp_3op_u_zd<0b01, opc, asm, ZPR16>;
  1787. def _S : sve_fp_3op_u_zd<0b10, opc, asm, ZPR32>;
  1788. def _D : sve_fp_3op_u_zd<0b11, opc, asm, ZPR64>;
  1789. def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  1790. def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  1791. def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  1792. def : SVE_2_Op_Pred_All_Active<nxv8f16, predicated_op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  1793. def : SVE_2_Op_Pred_All_Active<nxv4f32, predicated_op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  1794. def : SVE_2_Op_Pred_All_Active<nxv2f64, predicated_op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  1795. }
  1796. multiclass sve_fp_3op_u_zd_ftsmul<bits<3> opc, string asm, SDPatternOperator op> {
  1797. def _H : sve_fp_3op_u_zd<0b01, opc, asm, ZPR16>;
  1798. def _S : sve_fp_3op_u_zd<0b10, opc, asm, ZPR32>;
  1799. def _D : sve_fp_3op_u_zd<0b11, opc, asm, ZPR64>;
  1800. def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  1801. def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  1802. def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  1803. }
  1804. //===----------------------------------------------------------------------===//
  1805. // SVE Floating Point Fused Multiply-Add Group
  1806. //===----------------------------------------------------------------------===//
  1807. class sve_fp_3op_p_zds_a<bits<2> sz, bits<2> opc, string asm, ZPRRegOp zprty>
  1808. : I<(outs zprty:$Zda), (ins PPR3bAny:$Pg, zprty:$_Zda, zprty:$Zn, zprty:$Zm),
  1809. asm, "\t$Zda, $Pg/m, $Zn, $Zm",
  1810. "",
  1811. []>, Sched<[]> {
  1812. bits<3> Pg;
  1813. bits<5> Zda;
  1814. bits<5> Zm;
  1815. bits<5> Zn;
  1816. let Inst{31-24} = 0b01100101;
  1817. let Inst{23-22} = sz;
  1818. let Inst{21} = 0b1;
  1819. let Inst{20-16} = Zm;
  1820. let Inst{15} = 0b0;
  1821. let Inst{14-13} = opc;
  1822. let Inst{12-10} = Pg;
  1823. let Inst{9-5} = Zn;
  1824. let Inst{4-0} = Zda;
  1825. let Constraints = "$Zda = $_Zda";
  1826. let ElementSize = zprty.ElementSize;
  1827. let DestructiveInstType = DestructiveTernaryCommWithRev;
  1828. }
  1829. multiclass sve_fp_3op_p_zds_a<bits<2> opc, string asm, string Ps,
  1830. SDPatternOperator op, string revname,
  1831. bit isReverseInstr=0> {
  1832. def _H : sve_fp_3op_p_zds_a<0b01, opc, asm, ZPR16>,
  1833. SVEPseudo2Instr<Ps # _H, 1>, SVEInstr2Rev<NAME # _H, revname # _H, isReverseInstr>;
  1834. def _S : sve_fp_3op_p_zds_a<0b10, opc, asm, ZPR32>,
  1835. SVEPseudo2Instr<Ps # _S, 1>, SVEInstr2Rev<NAME # _S, revname # _S, isReverseInstr>;
  1836. def _D : sve_fp_3op_p_zds_a<0b11, opc, asm, ZPR64>,
  1837. SVEPseudo2Instr<Ps # _D, 1>, SVEInstr2Rev<NAME # _D, revname # _D, isReverseInstr>;
  1838. def : SVE_4_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  1839. def : SVE_4_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  1840. def : SVE_4_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  1841. }
  1842. class sve_fp_3op_p_zds_b<bits<2> sz, bits<2> opc, string asm,
  1843. ZPRRegOp zprty>
  1844. : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm, zprty:$Za),
  1845. asm, "\t$Zdn, $Pg/m, $Zm, $Za",
  1846. "",
  1847. []>, Sched<[]> {
  1848. bits<3> Pg;
  1849. bits<5> Za;
  1850. bits<5> Zdn;
  1851. bits<5> Zm;
  1852. let Inst{31-24} = 0b01100101;
  1853. let Inst{23-22} = sz;
  1854. let Inst{21} = 0b1;
  1855. let Inst{20-16} = Za;
  1856. let Inst{15} = 0b1;
  1857. let Inst{14-13} = opc;
  1858. let Inst{12-10} = Pg;
  1859. let Inst{9-5} = Zm;
  1860. let Inst{4-0} = Zdn;
  1861. let Constraints = "$Zdn = $_Zdn";
  1862. let DestructiveInstType = DestructiveOther;
  1863. let ElementSize = zprty.ElementSize;
  1864. }
  1865. multiclass sve_fp_3op_p_zds_b<bits<2> opc, string asm, SDPatternOperator op,
  1866. string revname, bit isReverseInstr> {
  1867. def _H : sve_fp_3op_p_zds_b<0b01, opc, asm, ZPR16>,
  1868. SVEInstr2Rev<NAME # _H, revname # _H, isReverseInstr>;
  1869. def _S : sve_fp_3op_p_zds_b<0b10, opc, asm, ZPR32>,
  1870. SVEInstr2Rev<NAME # _S, revname # _S, isReverseInstr>;
  1871. def _D : sve_fp_3op_p_zds_b<0b11, opc, asm, ZPR64>,
  1872. SVEInstr2Rev<NAME # _D, revname # _D, isReverseInstr>;
  1873. def : SVE_4_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  1874. def : SVE_4_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  1875. def : SVE_4_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  1876. }
  1877. multiclass sve_fp_3op_p_zds_zx {
  1878. def _UNDEF_H : PredThreeOpPseudo<NAME # _H, ZPR16, FalseLanesUndef>;
  1879. def _UNDEF_S : PredThreeOpPseudo<NAME # _S, ZPR32, FalseLanesUndef>;
  1880. def _UNDEF_D : PredThreeOpPseudo<NAME # _D, ZPR64, FalseLanesUndef>;
  1881. }
  1882. //===----------------------------------------------------------------------===//
  1883. // SVE Floating Point Multiply-Add - Indexed Group
  1884. //===----------------------------------------------------------------------===//
  1885. class sve_fp_fma_by_indexed_elem<bits<2> sz, bits<2> opc, string asm,
  1886. ZPRRegOp zprty1,
  1887. ZPRRegOp zprty2, Operand itype>
  1888. : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty1:$Zn, zprty2:$Zm, itype:$iop),
  1889. asm, "\t$Zda, $Zn, $Zm$iop", "", []>, Sched<[]> {
  1890. bits<5> Zda;
  1891. bits<5> Zn;
  1892. let Inst{31-24} = 0b01100100;
  1893. let Inst{23-22} = sz;
  1894. let Inst{21} = 0b1;
  1895. let Inst{15-12} = 0b0000;
  1896. let Inst{11-10} = opc;
  1897. let Inst{9-5} = Zn;
  1898. let Inst{4-0} = Zda;
  1899. let Constraints = "$Zda = $_Zda";
  1900. let DestructiveInstType = DestructiveOther;
  1901. let ElementSize = ElementSizeNone;
  1902. }
  1903. multiclass sve2p1_fp_bfma_by_indexed_elem<string asm, bits<2> opc> {
  1904. def NAME : sve_fp_fma_by_indexed_elem<{0, ?}, opc, asm, ZPR16, ZPR3b16,
  1905. VectorIndexH32b> {
  1906. bits<3> Zm;
  1907. bits<3> iop;
  1908. let Inst{22} = iop{2};
  1909. let Inst{20-19} = iop{1-0};
  1910. let Inst{18-16} = Zm;
  1911. }
  1912. }
  1913. multiclass sve_fp_fma_by_indexed_elem<bits<2> opc, string asm,
  1914. SDPatternOperator op> {
  1915. def _H : sve_fp_fma_by_indexed_elem<{0, ?}, opc, asm, ZPR16, ZPR3b16, VectorIndexH32b> {
  1916. bits<3> Zm;
  1917. bits<3> iop;
  1918. let Inst{22} = iop{2};
  1919. let Inst{20-19} = iop{1-0};
  1920. let Inst{18-16} = Zm;
  1921. }
  1922. def _S : sve_fp_fma_by_indexed_elem<0b10, opc, asm, ZPR32, ZPR3b32, VectorIndexS32b> {
  1923. bits<3> Zm;
  1924. bits<2> iop;
  1925. let Inst{20-19} = iop;
  1926. let Inst{18-16} = Zm;
  1927. }
  1928. def _D : sve_fp_fma_by_indexed_elem<0b11, opc, asm, ZPR64, ZPR4b64, VectorIndexD32b> {
  1929. bits<4> Zm;
  1930. bit iop;
  1931. let Inst{20} = iop;
  1932. let Inst{19-16} = Zm;
  1933. }
  1934. def : Pat<(nxv8f16 (op nxv8f16:$Op1, nxv8f16:$Op2, nxv8f16:$Op3, (i32 VectorIndexH32b_timm:$idx))),
  1935. (!cast<Instruction>(NAME # _H) $Op1, $Op2, $Op3, VectorIndexH32b_timm:$idx)>;
  1936. def : Pat<(nxv4f32 (op nxv4f32:$Op1, nxv4f32:$Op2, nxv4f32:$Op3, (i32 VectorIndexS32b_timm:$idx))),
  1937. (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, VectorIndexS32b_timm:$idx)>;
  1938. def : Pat<(nxv2f64 (op nxv2f64:$Op1, nxv2f64:$Op2, nxv2f64:$Op3, (i32 VectorIndexD32b_timm:$idx))),
  1939. (!cast<Instruction>(NAME # _D) $Op1, $Op2, $Op3, VectorIndexD32b_timm:$idx)>;
  1940. }
  1941. //===----------------------------------------------------------------------===//
  1942. // SVE Floating Point Multiply - Indexed Group
  1943. //===----------------------------------------------------------------------===//
  1944. class sve_fp_fmul_by_indexed_elem<bits<2> sz, bit o2, string asm, ZPRRegOp zprty,
  1945. ZPRRegOp zprty2, Operand itype>
  1946. : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty2:$Zm, itype:$iop),
  1947. asm, "\t$Zd, $Zn, $Zm$iop", "", []>, Sched<[]> {
  1948. bits<5> Zd;
  1949. bits<5> Zn;
  1950. let Inst{31-24} = 0b01100100;
  1951. let Inst{23-22} = sz;
  1952. let Inst{21} = 0b1;
  1953. let Inst{15-12} = 0b0010;
  1954. let Inst{11} = o2;
  1955. let Inst{10} = 0b0;
  1956. let Inst{9-5} = Zn;
  1957. let Inst{4-0} = Zd;
  1958. }
  1959. multiclass sve2p1_fp_bfmul_by_indexed_elem<string asm> {
  1960. def NAME : sve_fp_fmul_by_indexed_elem<{0, ?}, 0b1, asm, ZPR16, ZPR3b16, VectorIndexH32b> {
  1961. bits<3> Zm;
  1962. bits<3> iop;
  1963. let Inst{22} = iop{2};
  1964. let Inst{20-19} = iop{1-0};
  1965. let Inst{18-16} = Zm;
  1966. }
  1967. }
  1968. multiclass sve_fp_fmul_by_indexed_elem<string asm, SDPatternOperator op> {
  1969. def _H : sve_fp_fmul_by_indexed_elem<{0, ?}, 0b0, asm, ZPR16, ZPR3b16, VectorIndexH32b> {
  1970. bits<3> Zm;
  1971. bits<3> iop;
  1972. let Inst{22} = iop{2};
  1973. let Inst{20-19} = iop{1-0};
  1974. let Inst{18-16} = Zm;
  1975. }
  1976. def _S : sve_fp_fmul_by_indexed_elem<0b10, 0b0, asm, ZPR32, ZPR3b32, VectorIndexS32b> {
  1977. bits<3> Zm;
  1978. bits<2> iop;
  1979. let Inst{20-19} = iop;
  1980. let Inst{18-16} = Zm;
  1981. }
  1982. def _D : sve_fp_fmul_by_indexed_elem<0b11, 0b0, asm, ZPR64, ZPR4b64, VectorIndexD32b> {
  1983. bits<4> Zm;
  1984. bit iop;
  1985. let Inst{20} = iop;
  1986. let Inst{19-16} = Zm;
  1987. }
  1988. def : Pat<(nxv8f16 (op nxv8f16:$Op1, nxv8f16:$Op2, (i32 VectorIndexH32b_timm:$idx))),
  1989. (!cast<Instruction>(NAME # _H) $Op1, $Op2, VectorIndexH32b_timm:$idx)>;
  1990. def : Pat<(nxv4f32 (op nxv4f32:$Op1, nxv4f32:$Op2, (i32 VectorIndexS32b_timm:$idx))),
  1991. (!cast<Instruction>(NAME # _S) $Op1, $Op2, VectorIndexS32b_timm:$idx)>;
  1992. def : Pat<(nxv2f64 (op nxv2f64:$Op1, nxv2f64:$Op2, (i32 VectorIndexD32b_timm:$idx))),
  1993. (!cast<Instruction>(NAME # _D) $Op1, $Op2, VectorIndexD32b_timm:$idx)>;
  1994. }
  1995. //===----------------------------------------------------------------------===//
  1996. // SVE Floating Point Complex Multiply-Add Group
  1997. //===----------------------------------------------------------------------===//
  1998. class sve_fp_fcmla<bits<2> sz, string asm, ZPRRegOp zprty>
  1999. : I<(outs zprty:$Zda), (ins PPR3bAny:$Pg, zprty:$_Zda, zprty:$Zn, zprty:$Zm,
  2000. complexrotateop:$imm),
  2001. asm, "\t$Zda, $Pg/m, $Zn, $Zm, $imm",
  2002. "", []>, Sched<[]> {
  2003. bits<5> Zda;
  2004. bits<3> Pg;
  2005. bits<5> Zn;
  2006. bits<5> Zm;
  2007. bits<2> imm;
  2008. let Inst{31-24} = 0b01100100;
  2009. let Inst{23-22} = sz;
  2010. let Inst{21} = 0;
  2011. let Inst{20-16} = Zm;
  2012. let Inst{15} = 0;
  2013. let Inst{14-13} = imm;
  2014. let Inst{12-10} = Pg;
  2015. let Inst{9-5} = Zn;
  2016. let Inst{4-0} = Zda;
  2017. let Constraints = "$Zda = $_Zda";
  2018. let DestructiveInstType = DestructiveOther;
  2019. let ElementSize = zprty.ElementSize;
  2020. }
  2021. multiclass sve_fp_fcmla<string asm, SDPatternOperator op> {
  2022. def _H : sve_fp_fcmla<0b01, asm, ZPR16>;
  2023. def _S : sve_fp_fcmla<0b10, asm, ZPR32>;
  2024. def _D : sve_fp_fcmla<0b11, asm, ZPR64>;
  2025. def : Pat<(nxv8f16 (op nxv8i1:$Op1, nxv8f16:$Op2, nxv8f16:$Op3, nxv8f16:$Op4, (i32 complexrotateop:$imm))),
  2026. (!cast<Instruction>(NAME # _H) $Op1, $Op2, $Op3, $Op4, complexrotateop:$imm)>;
  2027. def : Pat<(nxv4f32 (op nxv4i1:$Op1, nxv4f32:$Op2, nxv4f32:$Op3, nxv4f32:$Op4, (i32 complexrotateop:$imm))),
  2028. (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, $Op4, complexrotateop:$imm)>;
  2029. def : Pat<(nxv2f64 (op nxv2i1:$Op1, nxv2f64:$Op2, nxv2f64:$Op3, nxv2f64:$Op4, (i32 complexrotateop:$imm))),
  2030. (!cast<Instruction>(NAME # _D) $Op1, $Op2, $Op3, $Op4, complexrotateop:$imm)>;
  2031. }
  2032. //===----------------------------------------------------------------------===//
  2033. // SVE Floating Point Complex Multiply-Add - Indexed Group
  2034. //===----------------------------------------------------------------------===//
  2035. class sve_fp_fcmla_by_indexed_elem<bits<2> sz, string asm,
  2036. ZPRRegOp zprty,
  2037. ZPRRegOp zprty2, Operand itype>
  2038. : I<(outs zprty:$Zda), (ins zprty:$_Zda, zprty:$Zn, zprty2:$Zm, itype:$iop,
  2039. complexrotateop:$imm),
  2040. asm, "\t$Zda, $Zn, $Zm$iop, $imm",
  2041. "", []>, Sched<[]> {
  2042. bits<5> Zda;
  2043. bits<5> Zn;
  2044. bits<2> imm;
  2045. let Inst{31-24} = 0b01100100;
  2046. let Inst{23-22} = sz;
  2047. let Inst{21} = 0b1;
  2048. let Inst{15-12} = 0b0001;
  2049. let Inst{11-10} = imm;
  2050. let Inst{9-5} = Zn;
  2051. let Inst{4-0} = Zda;
  2052. let Constraints = "$Zda = $_Zda";
  2053. let DestructiveInstType = DestructiveOther;
  2054. let ElementSize = ElementSizeNone;
  2055. }
  2056. multiclass sve_fp_fcmla_by_indexed_elem<string asm, SDPatternOperator op> {
  2057. def _H : sve_fp_fcmla_by_indexed_elem<0b10, asm, ZPR16, ZPR3b16, VectorIndexS32b> {
  2058. bits<3> Zm;
  2059. bits<2> iop;
  2060. let Inst{20-19} = iop;
  2061. let Inst{18-16} = Zm;
  2062. }
  2063. def _S : sve_fp_fcmla_by_indexed_elem<0b11, asm, ZPR32, ZPR4b32, VectorIndexD32b> {
  2064. bits<4> Zm;
  2065. bits<1> iop;
  2066. let Inst{20} = iop;
  2067. let Inst{19-16} = Zm;
  2068. }
  2069. def : Pat<(nxv8f16 (op nxv8f16:$Op1, nxv8f16:$Op2, nxv8f16:$Op3, (i32 VectorIndexS32b_timm:$idx), (i32 complexrotateop:$imm))),
  2070. (!cast<Instruction>(NAME # _H) $Op1, $Op2, $Op3, VectorIndexS32b_timm:$idx, complexrotateop:$imm)>;
  2071. def : Pat<(nxv4f32 (op nxv4f32:$Op1, nxv4f32:$Op2, nxv4f32:$Op3, (i32 VectorIndexD32b_timm:$idx), (i32 complexrotateop:$imm))),
  2072. (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, VectorIndexD32b_timm:$idx, complexrotateop:$imm)>;
  2073. }
  2074. //===----------------------------------------------------------------------===//
  2075. // SVE Floating Point Complex Addition Group
  2076. //===----------------------------------------------------------------------===//
  2077. class sve_fp_fcadd<bits<2> sz, string asm, ZPRRegOp zprty>
  2078. : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm,
  2079. complexrotateopodd:$imm),
  2080. asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm, $imm",
  2081. "",
  2082. []>, Sched<[]> {
  2083. bits<5> Zdn;
  2084. bits<5> Zm;
  2085. bits<3> Pg;
  2086. bit imm;
  2087. let Inst{31-24} = 0b01100100;
  2088. let Inst{23-22} = sz;
  2089. let Inst{21-17} = 0;
  2090. let Inst{16} = imm;
  2091. let Inst{15-13} = 0b100;
  2092. let Inst{12-10} = Pg;
  2093. let Inst{9-5} = Zm;
  2094. let Inst{4-0} = Zdn;
  2095. let Constraints = "$Zdn = $_Zdn";
  2096. let DestructiveInstType = DestructiveOther;
  2097. let ElementSize = zprty.ElementSize;
  2098. }
  2099. multiclass sve_fp_fcadd<string asm, SDPatternOperator op> {
  2100. def _H : sve_fp_fcadd<0b01, asm, ZPR16>;
  2101. def _S : sve_fp_fcadd<0b10, asm, ZPR32>;
  2102. def _D : sve_fp_fcadd<0b11, asm, ZPR64>;
  2103. def : Pat<(nxv8f16 (op nxv8i1:$Op1, nxv8f16:$Op2, nxv8f16:$Op3, (i32 complexrotateopodd:$imm))),
  2104. (!cast<Instruction>(NAME # _H) $Op1, $Op2, $Op3, complexrotateopodd:$imm)>;
  2105. def : Pat<(nxv4f32 (op nxv4i1:$Op1, nxv4f32:$Op2, nxv4f32:$Op3, (i32 complexrotateopodd:$imm))),
  2106. (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, complexrotateopodd:$imm)>;
  2107. def : Pat<(nxv2f64 (op nxv2i1:$Op1, nxv2f64:$Op2, nxv2f64:$Op3, (i32 complexrotateopodd:$imm))),
  2108. (!cast<Instruction>(NAME # _D) $Op1, $Op2, $Op3, complexrotateopodd:$imm)>;
  2109. }
  2110. //===----------------------------------------------------------------------===//
  2111. // SVE2 Floating Point Convert Group
  2112. //===----------------------------------------------------------------------===//
  2113. class sve2_fp_convert_precision<bits<4> opc, string asm,
  2114. ZPRRegOp zprty1, ZPRRegOp zprty2>
  2115. : I<(outs zprty1:$Zd), (ins zprty1:$_Zd, PPR3bAny:$Pg, zprty2:$Zn),
  2116. asm, "\t$Zd, $Pg/m, $Zn",
  2117. "",
  2118. []>, Sched<[]> {
  2119. bits<5> Zd;
  2120. bits<5> Zn;
  2121. bits<3> Pg;
  2122. let Inst{31-24} = 0b01100100;
  2123. let Inst{23-22} = opc{3-2};
  2124. let Inst{21-18} = 0b0010;
  2125. let Inst{17-16} = opc{1-0};
  2126. let Inst{15-13} = 0b101;
  2127. let Inst{12-10} = Pg;
  2128. let Inst{9-5} = Zn;
  2129. let Inst{4-0} = Zd;
  2130. let Constraints = "$Zd = $_Zd";
  2131. }
  2132. multiclass sve2_fp_convert_down_narrow<string asm, string op> {
  2133. def _StoH : sve2_fp_convert_precision<0b1000, asm, ZPR16, ZPR32>;
  2134. def _DtoS : sve2_fp_convert_precision<0b1110, asm, ZPR32, ZPR64>;
  2135. def : SVE_3_Op_Pat<nxv8f16, !cast<SDPatternOperator>(op # _f16f32), nxv8f16, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _StoH)>;
  2136. def : SVE_3_Op_Pat<nxv4f32, !cast<SDPatternOperator>(op # _f32f64), nxv4f32, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _DtoS)>;
  2137. }
  2138. multiclass sve2_fp_convert_up_long<string asm, string op> {
  2139. def _HtoS : sve2_fp_convert_precision<0b1001, asm, ZPR32, ZPR16>;
  2140. def _StoD : sve2_fp_convert_precision<0b1111, asm, ZPR64, ZPR32>;
  2141. def : SVE_3_Op_Pat<nxv4f32, !cast<SDPatternOperator>(op # _f32f16), nxv4f32, nxv4i1, nxv8f16, !cast<Instruction>(NAME # _HtoS)>;
  2142. def : SVE_3_Op_Pat<nxv2f64, !cast<SDPatternOperator>(op # _f64f32), nxv2f64, nxv2i1, nxv4f32, !cast<Instruction>(NAME # _StoD)>;
  2143. }
  2144. multiclass sve2_fp_convert_down_odd_rounding_top<string asm, string op> {
  2145. def _DtoS : sve2_fp_convert_precision<0b0010, asm, ZPR32, ZPR64>;
  2146. def : SVE_3_Op_Pat<nxv4f32, !cast<SDPatternOperator>(op # _f32f64), nxv4f32, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _DtoS)>;
  2147. }
  2148. //===----------------------------------------------------------------------===//
  2149. // SVE2 Floating Point Pairwise Group
  2150. //===----------------------------------------------------------------------===//
  2151. class sve2_fp_pairwise_pred<bits<2> sz, bits<3> opc, string asm,
  2152. ZPRRegOp zprty>
  2153. : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
  2154. asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm",
  2155. "",
  2156. []>, Sched<[]> {
  2157. bits<3> Pg;
  2158. bits<5> Zm;
  2159. bits<5> Zdn;
  2160. let Inst{31-24} = 0b01100100;
  2161. let Inst{23-22} = sz;
  2162. let Inst{21-19} = 0b010;
  2163. let Inst{18-16} = opc;
  2164. let Inst{15-13} = 0b100;
  2165. let Inst{12-10} = Pg;
  2166. let Inst{9-5} = Zm;
  2167. let Inst{4-0} = Zdn;
  2168. let Constraints = "$Zdn = $_Zdn";
  2169. let DestructiveInstType = DestructiveOther;
  2170. let ElementSize = zprty.ElementSize;
  2171. }
  2172. multiclass sve2_fp_pairwise_pred<bits<3> opc, string asm,
  2173. SDPatternOperator op> {
  2174. def _H : sve2_fp_pairwise_pred<0b01, opc, asm, ZPR16>;
  2175. def _S : sve2_fp_pairwise_pred<0b10, opc, asm, ZPR32>;
  2176. def _D : sve2_fp_pairwise_pred<0b11, opc, asm, ZPR64>;
  2177. def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  2178. def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  2179. def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  2180. }
  2181. //===----------------------------------------------------------------------===//
  2182. // SVE2 Floating Point Widening Multiply-Add - Indexed Group
  2183. //===----------------------------------------------------------------------===//
  2184. class sve2_fp_mla_long_by_indexed_elem<bits<3> opc, string asm>
  2185. : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR3b16:$Zm,
  2186. VectorIndexH32b:$iop),
  2187. asm, "\t$Zda, $Zn, $Zm$iop",
  2188. "",
  2189. []>, Sched<[]> {
  2190. bits<5> Zda;
  2191. bits<5> Zn;
  2192. bits<3> Zm;
  2193. bits<3> iop;
  2194. let Inst{31-23} = 0b011001001;
  2195. let Inst{22} = opc{2};
  2196. let Inst{21} = 0b1;
  2197. let Inst{20-19} = iop{2-1};
  2198. let Inst{18-16} = Zm;
  2199. let Inst{15-14} = 0b01;
  2200. let Inst{13} = opc{1};
  2201. let Inst{12} = 0b0;
  2202. let Inst{11} = iop{0};
  2203. let Inst{10} = opc{0};
  2204. let Inst{9-5} = Zn;
  2205. let Inst{4-0} = Zda;
  2206. let Constraints = "$Zda = $_Zda";
  2207. let DestructiveInstType = DestructiveOther;
  2208. let ElementSize = ElementSizeNone;
  2209. }
  2210. multiclass sve2_fp_mla_long_by_indexed_elem<bits<3> opc, string asm,
  2211. ValueType OutVT, ValueType InVT,
  2212. SDPatternOperator op> {
  2213. def NAME : sve2_fp_mla_long_by_indexed_elem<opc, asm>;
  2214. def : SVE_4_Op_Imm_Pat<OutVT, op, OutVT, InVT, InVT, i32, VectorIndexH32b_timm, !cast<Instruction>(NAME)>;
  2215. }
  2216. //===----------------------------------------------------------------------===//
  2217. // SVE2 Floating Point Widening Multiply-Add Group
  2218. //===----------------------------------------------------------------------===//
  2219. class sve2_fp_mla_long<bits<3> opc, string asm>
  2220. : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR16:$Zm),
  2221. asm, "\t$Zda, $Zn, $Zm",
  2222. "",
  2223. []>, Sched<[]> {
  2224. bits<5> Zda;
  2225. bits<5> Zn;
  2226. bits<5> Zm;
  2227. let Inst{31-23} = 0b011001001;
  2228. let Inst{22} = opc{2};
  2229. let Inst{21} = 0b1;
  2230. let Inst{20-16} = Zm;
  2231. let Inst{15-14} = 0b10;
  2232. let Inst{13} = opc{1};
  2233. let Inst{12-11} = 0b00;
  2234. let Inst{10} = opc{0};
  2235. let Inst{9-5} = Zn;
  2236. let Inst{4-0} = Zda;
  2237. let Constraints = "$Zda = $_Zda";
  2238. let DestructiveInstType = DestructiveOther;
  2239. let ElementSize = ElementSizeNone;
  2240. }
  2241. multiclass sve2_fp_mla_long<bits<3> opc, string asm, ValueType OutVT,
  2242. ValueType InVT, SDPatternOperator op> {
  2243. def NAME : sve2_fp_mla_long<opc, asm>;
  2244. def : SVE_3_Op_Pat<OutVT, op, OutVT, InVT, InVT, !cast<Instruction>(NAME)>;
  2245. }
  2246. //===----------------------------------------------------------------------===//
  2247. // SVE Stack Allocation Group
  2248. //===----------------------------------------------------------------------===//
  2249. class sve_int_arith_vl<bit opc, string asm, bit streaming_sve = 0b0>
  2250. : I<(outs GPR64sp:$Rd), (ins GPR64sp:$Rn, simm6_32b:$imm6),
  2251. asm, "\t$Rd, $Rn, $imm6",
  2252. "",
  2253. []>, Sched<[]> {
  2254. bits<5> Rd;
  2255. bits<5> Rn;
  2256. bits<6> imm6;
  2257. let Inst{31-23} = 0b000001000;
  2258. let Inst{22} = opc;
  2259. let Inst{21} = 0b1;
  2260. let Inst{20-16} = Rn;
  2261. let Inst{15-12} = 0b0101;
  2262. let Inst{11} = streaming_sve;
  2263. let Inst{10-5} = imm6;
  2264. let Inst{4-0} = Rd;
  2265. }
  2266. class sve_int_read_vl_a<bit op, bits<5> opc2, string asm, bit streaming_sve = 0b0>
  2267. : I<(outs GPR64:$Rd), (ins simm6_32b:$imm6),
  2268. asm, "\t$Rd, $imm6",
  2269. "",
  2270. []>, Sched<[]> {
  2271. bits<5> Rd;
  2272. bits<6> imm6;
  2273. let Inst{31-23} = 0b000001001;
  2274. let Inst{22} = op;
  2275. let Inst{21} = 0b1;
  2276. let Inst{20-16} = opc2{4-0};
  2277. let Inst{15-12} = 0b0101;
  2278. let Inst{11} = streaming_sve;
  2279. let Inst{10-5} = imm6;
  2280. let Inst{4-0} = Rd;
  2281. let isReMaterializable = 1;
  2282. }
  2283. //===----------------------------------------------------------------------===//
  2284. // SVE Permute - In Lane Group
  2285. //===----------------------------------------------------------------------===//
  2286. class sve_int_perm_bin_perm_zz<bits<3> opc, bits<2> sz8_64, string asm,
  2287. ZPRRegOp zprty>
  2288. : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
  2289. asm, "\t$Zd, $Zn, $Zm",
  2290. "",
  2291. []>, Sched<[]> {
  2292. bits<5> Zd;
  2293. bits<5> Zm;
  2294. bits<5> Zn;
  2295. let Inst{31-24} = 0b00000101;
  2296. let Inst{23-22} = sz8_64;
  2297. let Inst{21} = 0b1;
  2298. let Inst{20-16} = Zm;
  2299. let Inst{15-13} = 0b011;
  2300. let Inst{12-10} = opc;
  2301. let Inst{9-5} = Zn;
  2302. let Inst{4-0} = Zd;
  2303. }
  2304. multiclass sve_int_perm_bin_perm_zz<bits<3> opc, string asm,
  2305. SDPatternOperator op> {
  2306. def _B : sve_int_perm_bin_perm_zz<opc, 0b00, asm, ZPR8>;
  2307. def _H : sve_int_perm_bin_perm_zz<opc, 0b01, asm, ZPR16>;
  2308. def _S : sve_int_perm_bin_perm_zz<opc, 0b10, asm, ZPR32>;
  2309. def _D : sve_int_perm_bin_perm_zz<opc, 0b11, asm, ZPR64>;
  2310. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  2311. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  2312. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  2313. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  2314. def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  2315. def : SVE_2_Op_Pat<nxv4f16, op, nxv4f16, nxv4f16, !cast<Instruction>(NAME # _S)>;
  2316. def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  2317. def : SVE_2_Op_Pat<nxv2f16, op, nxv2f16, nxv2f16, !cast<Instruction>(NAME # _D)>;
  2318. def : SVE_2_Op_Pat<nxv2f32, op, nxv2f32, nxv2f32, !cast<Instruction>(NAME # _D)>;
  2319. def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  2320. def : SVE_2_Op_Pat<nxv8bf16, op, nxv8bf16, nxv8bf16, !cast<Instruction>(NAME # _H)>;
  2321. }
  2322. //===----------------------------------------------------------------------===//
  2323. // SVE Floating Point Unary Operations Group
  2324. //===----------------------------------------------------------------------===//
  2325. class sve_fp_2op_p_zd<bits<7> opc, string asm, RegisterOperand i_zprtype,
  2326. RegisterOperand o_zprtype, ElementSizeEnum Sz>
  2327. : I<(outs o_zprtype:$Zd), (ins i_zprtype:$_Zd, PPR3bAny:$Pg, i_zprtype:$Zn),
  2328. asm, "\t$Zd, $Pg/m, $Zn",
  2329. "",
  2330. []>, Sched<[]> {
  2331. bits<3> Pg;
  2332. bits<5> Zd;
  2333. bits<5> Zn;
  2334. let Inst{31-24} = 0b01100101;
  2335. let Inst{23-22} = opc{6-5};
  2336. let Inst{21} = 0b0;
  2337. let Inst{20-16} = opc{4-0};
  2338. let Inst{15-13} = 0b101;
  2339. let Inst{12-10} = Pg;
  2340. let Inst{9-5} = Zn;
  2341. let Inst{4-0} = Zd;
  2342. let Constraints = "$Zd = $_Zd";
  2343. let DestructiveInstType = DestructiveUnaryPassthru;
  2344. let ElementSize = Sz;
  2345. }
  2346. multiclass sve_fp_2op_p_zd<bits<7> opc, string asm,
  2347. RegisterOperand i_zprtype,
  2348. RegisterOperand o_zprtype,
  2349. SDPatternOperator int_op,
  2350. SDPatternOperator ir_op, ValueType vt1,
  2351. ValueType vt2, ValueType vt3, ElementSizeEnum Sz> {
  2352. def NAME : sve_fp_2op_p_zd<opc, asm, i_zprtype, o_zprtype, Sz>,
  2353. SVEPseudo2Instr<NAME, 1>;
  2354. // convert vt1 to a packed type for the intrinsic patterns
  2355. defvar packedvt1 = !cond(!eq(!cast<string>(vt1), "nxv2f16"): nxv8f16,
  2356. !eq(!cast<string>(vt1), "nxv4f16"): nxv8f16,
  2357. !eq(!cast<string>(vt1), "nxv2f32"): nxv4f32,
  2358. 1 : vt1);
  2359. // convert vt3 to a packed type for the intrinsic patterns
  2360. defvar packedvt3 = !cond(!eq(!cast<string>(vt3), "nxv2f16"): nxv8f16,
  2361. !eq(!cast<string>(vt3), "nxv4f16"): nxv8f16,
  2362. !eq(!cast<string>(vt3), "nxv2f32"): nxv4f32,
  2363. 1 : vt3);
  2364. def : SVE_3_Op_Pat<packedvt1, int_op, packedvt1, vt2, packedvt3, !cast<Instruction>(NAME)>;
  2365. def : SVE_1_Op_Passthru_Pat<vt1, ir_op, vt2, vt3, !cast<Instruction>(NAME)>;
  2366. def _UNDEF : PredOneOpPassthruPseudo<NAME, !cast<ZPRRegOp>(i_zprtype)>;
  2367. defm : SVE_1_Op_PassthruUndef_Pat<vt1, ir_op, vt2, vt3, !cast<Instruction>(NAME # _UNDEF)>;
  2368. }
  2369. multiclass sve_fp_2op_p_zdr<bits<7> opc, string asm,
  2370. RegisterOperand i_zprtype,
  2371. RegisterOperand o_zprtype,
  2372. SDPatternOperator int_op,
  2373. SDPatternOperator ir_op, ValueType vt1,
  2374. ValueType vt2, ValueType vt3, ElementSizeEnum Sz> {
  2375. def NAME : sve_fp_2op_p_zd<opc, asm, i_zprtype, o_zprtype, Sz>,
  2376. SVEPseudo2Instr<NAME, 1>;
  2377. // convert vt1 to a packed type for the intrinsic patterns
  2378. defvar packedvt1 = !cond(!eq(!cast<string>(vt1), "nxv2f16"): nxv8f16,
  2379. !eq(!cast<string>(vt1), "nxv4f16"): nxv8f16,
  2380. !eq(!cast<string>(vt1), "nxv2f32"): nxv4f32,
  2381. 1 : vt1);
  2382. def : SVE_3_Op_Pat<packedvt1, int_op, packedvt1, vt2, vt3, !cast<Instruction>(NAME)>;
  2383. def : SVE_1_Op_Passthru_Round_Pat<vt1, ir_op, vt2, vt3, !cast<Instruction>(NAME)>;
  2384. def _UNDEF : PredOneOpPassthruPseudo<NAME, !cast<ZPRRegOp>(i_zprtype)>;
  2385. defm : SVE_1_Op_PassthruUndef_Round_Pat<vt1, ir_op, vt2, vt3, !cast<Instruction>(NAME # _UNDEF)>;
  2386. }
  2387. multiclass sve_fp_2op_p_zd_HSD<bits<5> opc, string asm, SDPatternOperator op> {
  2388. def _H : sve_fp_2op_p_zd<{ 0b01, opc }, asm, ZPR16, ZPR16, ElementSizeH>,
  2389. SVEPseudo2Instr<NAME # _H, 1>;
  2390. def _S : sve_fp_2op_p_zd<{ 0b10, opc }, asm, ZPR32, ZPR32, ElementSizeS>,
  2391. SVEPseudo2Instr<NAME # _S, 1>;
  2392. def _D : sve_fp_2op_p_zd<{ 0b11, opc }, asm, ZPR64, ZPR64, ElementSizeD>,
  2393. SVEPseudo2Instr<NAME # _D, 1>;
  2394. def : SVE_1_Op_Passthru_Pat<nxv8f16, op, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
  2395. def : SVE_1_Op_Passthru_Pat<nxv4f16, op, nxv4i1, nxv4f16, !cast<Instruction>(NAME # _H)>;
  2396. def : SVE_1_Op_Passthru_Pat<nxv2f16, op, nxv2i1, nxv2f16, !cast<Instruction>(NAME # _H)>;
  2397. def : SVE_1_Op_Passthru_Pat<nxv4f32, op, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
  2398. def : SVE_1_Op_Passthru_Pat<nxv2f32, op, nxv2i1, nxv2f32, !cast<Instruction>(NAME # _S)>;
  2399. def : SVE_1_Op_Passthru_Pat<nxv2f64, op, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
  2400. def _UNDEF_H : PredOneOpPassthruPseudo<NAME # _H, ZPR16>;
  2401. def _UNDEF_S : PredOneOpPassthruPseudo<NAME # _S, ZPR32>;
  2402. def _UNDEF_D : PredOneOpPassthruPseudo<NAME # _D, ZPR64>;
  2403. defm : SVE_1_Op_PassthruUndef_Pat<nxv8f16, op, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _UNDEF_H)>;
  2404. defm : SVE_1_Op_PassthruUndef_Pat<nxv4f16, op, nxv4i1, nxv4f16, !cast<Instruction>(NAME # _UNDEF_H)>;
  2405. defm : SVE_1_Op_PassthruUndef_Pat<nxv2f16, op, nxv2i1, nxv2f16, !cast<Instruction>(NAME # _UNDEF_H)>;
  2406. defm : SVE_1_Op_PassthruUndef_Pat<nxv4f32, op, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _UNDEF_S)>;
  2407. defm : SVE_1_Op_PassthruUndef_Pat<nxv2f32, op, nxv2i1, nxv2f32, !cast<Instruction>(NAME # _UNDEF_S)>;
  2408. defm : SVE_1_Op_PassthruUndef_Pat<nxv2f64, op, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _UNDEF_D)>;
  2409. }
  2410. multiclass sve2_fp_flogb<string asm, SDPatternOperator op> {
  2411. def _H : sve_fp_2op_p_zd<0b0011010, asm, ZPR16, ZPR16, ElementSizeH>;
  2412. def _S : sve_fp_2op_p_zd<0b0011100, asm, ZPR32, ZPR32, ElementSizeS>;
  2413. def _D : sve_fp_2op_p_zd<0b0011110, asm, ZPR64, ZPR64, ElementSizeD>;
  2414. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
  2415. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
  2416. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
  2417. }
  2418. multiclass sve2_fp_convert_down_odd_rounding<string asm, string op> {
  2419. def _DtoS : sve_fp_2op_p_zd<0b0001010, asm, ZPR64, ZPR32, ElementSizeD>;
  2420. def : SVE_3_Op_Pat<nxv4f32, !cast<SDPatternOperator>(op # _f32f64), nxv4f32, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _DtoS)>;
  2421. }
  2422. //===----------------------------------------------------------------------===//
  2423. // SVE Floating Point Unary Operations - Unpredicated Group
  2424. //===----------------------------------------------------------------------===//
  2425. class sve_fp_2op_u_zd<bits<2> sz, bits<3> opc, string asm,
  2426. ZPRRegOp zprty>
  2427. : I<(outs zprty:$Zd), (ins zprty:$Zn),
  2428. asm, "\t$Zd, $Zn",
  2429. "",
  2430. []>, Sched<[]> {
  2431. bits<5> Zd;
  2432. bits<5> Zn;
  2433. let Inst{31-24} = 0b01100101;
  2434. let Inst{23-22} = sz;
  2435. let Inst{21-19} = 0b001;
  2436. let Inst{18-16} = opc;
  2437. let Inst{15-10} = 0b001100;
  2438. let Inst{9-5} = Zn;
  2439. let Inst{4-0} = Zd;
  2440. }
  2441. multiclass sve_fp_2op_u_zd<bits<3> opc, string asm, SDPatternOperator op> {
  2442. def _H : sve_fp_2op_u_zd<0b01, opc, asm, ZPR16>;
  2443. def _S : sve_fp_2op_u_zd<0b10, opc, asm, ZPR32>;
  2444. def _D : sve_fp_2op_u_zd<0b11, opc, asm, ZPR64>;
  2445. def : SVE_1_Op_Pat<nxv8f16, op, nxv8f16, !cast<Instruction>(NAME # _H)>;
  2446. def : SVE_1_Op_Pat<nxv4f32, op, nxv4f32, !cast<Instruction>(NAME # _S)>;
  2447. def : SVE_1_Op_Pat<nxv2f64, op, nxv2f64, !cast<Instruction>(NAME # _D)>;
  2448. }
  2449. //===----------------------------------------------------------------------===//
  2450. // SVE Integer Arithmetic - Binary Predicated Group
  2451. //===----------------------------------------------------------------------===//
  2452. class sve_int_bin_pred_arit_log<bits<2> sz8_64, bits<2> fmt, bits<3> opc,
  2453. string asm, ZPRRegOp zprty>
  2454. : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
  2455. asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm", "", []>, Sched<[]> {
  2456. bits<3> Pg;
  2457. bits<5> Zdn;
  2458. bits<5> Zm;
  2459. let Inst{31-24} = 0b00000100;
  2460. let Inst{23-22} = sz8_64;
  2461. let Inst{21} = 0b0;
  2462. let Inst{20-19} = fmt;
  2463. let Inst{18-16} = opc;
  2464. let Inst{15-13} = 0b000;
  2465. let Inst{12-10} = Pg;
  2466. let Inst{9-5} = Zm;
  2467. let Inst{4-0} = Zdn;
  2468. let Constraints = "$Zdn = $_Zdn";
  2469. let DestructiveInstType = DestructiveOther;
  2470. let ElementSize = zprty.ElementSize;
  2471. }
  2472. multiclass sve_int_bin_pred_log<bits<3> opc, string asm, string Ps,
  2473. SDPatternOperator op,
  2474. DestructiveInstTypeEnum flags> {
  2475. let DestructiveInstType = flags in {
  2476. def _B : sve_int_bin_pred_arit_log<0b00, 0b11, opc, asm, ZPR8>,
  2477. SVEPseudo2Instr<Ps # _B, 1>;
  2478. def _H : sve_int_bin_pred_arit_log<0b01, 0b11, opc, asm, ZPR16>,
  2479. SVEPseudo2Instr<Ps # _H, 1>;
  2480. def _S : sve_int_bin_pred_arit_log<0b10, 0b11, opc, asm, ZPR32>,
  2481. SVEPseudo2Instr<Ps # _S, 1>;
  2482. def _D : sve_int_bin_pred_arit_log<0b11, 0b11, opc, asm, ZPR64>,
  2483. SVEPseudo2Instr<Ps # _D, 1>;
  2484. }
  2485. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  2486. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  2487. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  2488. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  2489. }
  2490. multiclass sve_int_bin_pred_arit_0<bits<3> opc, string asm, string Ps,
  2491. SDPatternOperator op,
  2492. DestructiveInstTypeEnum flags,
  2493. string revname="", bit isReverseInstr=0> {
  2494. let DestructiveInstType = flags in {
  2495. def _B : sve_int_bin_pred_arit_log<0b00, 0b00, opc, asm, ZPR8>,
  2496. SVEPseudo2Instr<Ps # _B, 1>, SVEInstr2Rev<NAME # _B, revname # _B, isReverseInstr>;
  2497. def _H : sve_int_bin_pred_arit_log<0b01, 0b00, opc, asm, ZPR16>,
  2498. SVEPseudo2Instr<Ps # _H, 1>, SVEInstr2Rev<NAME # _H, revname # _H, isReverseInstr>;
  2499. def _S : sve_int_bin_pred_arit_log<0b10, 0b00, opc, asm, ZPR32>,
  2500. SVEPseudo2Instr<Ps # _S, 1>, SVEInstr2Rev<NAME # _S, revname # _S, isReverseInstr>;
  2501. def _D : sve_int_bin_pred_arit_log<0b11, 0b00, opc, asm, ZPR64>,
  2502. SVEPseudo2Instr<Ps # _D, 1>, SVEInstr2Rev<NAME # _D, revname # _D, isReverseInstr>;
  2503. }
  2504. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  2505. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  2506. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  2507. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  2508. }
  2509. multiclass sve_int_bin_pred_arit_1<bits<3> opc, string asm, string Ps,
  2510. SDPatternOperator op,
  2511. DestructiveInstTypeEnum flags> {
  2512. let DestructiveInstType = flags in {
  2513. def _B : sve_int_bin_pred_arit_log<0b00, 0b01, opc, asm, ZPR8>,
  2514. SVEPseudo2Instr<Ps # _B, 1>;
  2515. def _H : sve_int_bin_pred_arit_log<0b01, 0b01, opc, asm, ZPR16>,
  2516. SVEPseudo2Instr<Ps # _H, 1>;
  2517. def _S : sve_int_bin_pred_arit_log<0b10, 0b01, opc, asm, ZPR32>,
  2518. SVEPseudo2Instr<Ps # _S, 1>;
  2519. def _D : sve_int_bin_pred_arit_log<0b11, 0b01, opc, asm, ZPR64>,
  2520. SVEPseudo2Instr<Ps # _D, 1>;
  2521. }
  2522. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  2523. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  2524. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  2525. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  2526. }
  2527. multiclass sve_int_bin_pred_arit_2<bits<3> opc, string asm, string Ps,
  2528. SDPatternOperator op,
  2529. DestructiveInstTypeEnum flags> {
  2530. let DestructiveInstType = flags in {
  2531. def _B : sve_int_bin_pred_arit_log<0b00, 0b10, opc, asm, ZPR8>,
  2532. SVEPseudo2Instr<Ps # _B, 1>;
  2533. def _H : sve_int_bin_pred_arit_log<0b01, 0b10, opc, asm, ZPR16>,
  2534. SVEPseudo2Instr<Ps # _H, 1>;
  2535. def _S : sve_int_bin_pred_arit_log<0b10, 0b10, opc, asm, ZPR32>,
  2536. SVEPseudo2Instr<Ps # _S, 1>;
  2537. def _D : sve_int_bin_pred_arit_log<0b11, 0b10, opc, asm, ZPR64>,
  2538. SVEPseudo2Instr<Ps # _D, 1>;
  2539. }
  2540. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  2541. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  2542. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  2543. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  2544. }
  2545. // Special case for divides which are not defined for 8b/16b elements.
  2546. multiclass sve_int_bin_pred_arit_2_div<bits<3> opc, string asm, string Ps,
  2547. SDPatternOperator op,
  2548. DestructiveInstTypeEnum flags,
  2549. string revname="", bit isReverseInstr=0> {
  2550. let DestructiveInstType = flags in {
  2551. def _S : sve_int_bin_pred_arit_log<0b10, 0b10, opc, asm, ZPR32>,
  2552. SVEPseudo2Instr<Ps # _S, 1>, SVEInstr2Rev<NAME # _S, revname # _S, isReverseInstr>;
  2553. def _D : sve_int_bin_pred_arit_log<0b11, 0b10, opc, asm, ZPR64>,
  2554. SVEPseudo2Instr<Ps # _D, 1>, SVEInstr2Rev<NAME # _D, revname # _D, isReverseInstr>;
  2555. }
  2556. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  2557. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  2558. }
  2559. //===----------------------------------------------------------------------===//
  2560. // SVE Integer Multiply-Add Group
  2561. //===----------------------------------------------------------------------===//
  2562. class sve_int_mladdsub_vvv_pred<bits<2> sz8_64, bits<1> opc, string asm,
  2563. ZPRRegOp zprty>
  2564. : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm, zprty:$Za),
  2565. asm, "\t$Zdn, $Pg/m, $Zm, $Za",
  2566. "",
  2567. []>, Sched<[]> {
  2568. bits<3> Pg;
  2569. bits<5> Zdn;
  2570. bits<5> Za;
  2571. bits<5> Zm;
  2572. let Inst{31-24} = 0b00000100;
  2573. let Inst{23-22} = sz8_64;
  2574. let Inst{21} = 0b0;
  2575. let Inst{20-16} = Zm;
  2576. let Inst{15-14} = 0b11;
  2577. let Inst{13} = opc;
  2578. let Inst{12-10} = Pg;
  2579. let Inst{9-5} = Za;
  2580. let Inst{4-0} = Zdn;
  2581. let Constraints = "$Zdn = $_Zdn";
  2582. let DestructiveInstType = DestructiveOther;
  2583. let ElementSize = zprty.ElementSize;
  2584. }
  2585. multiclass sve_int_mladdsub_vvv_pred<bits<1> opc, string asm, SDPatternOperator op> {
  2586. def _B : sve_int_mladdsub_vvv_pred<0b00, opc, asm, ZPR8>;
  2587. def _H : sve_int_mladdsub_vvv_pred<0b01, opc, asm, ZPR16>;
  2588. def _S : sve_int_mladdsub_vvv_pred<0b10, opc, asm, ZPR32>;
  2589. def _D : sve_int_mladdsub_vvv_pred<0b11, opc, asm, ZPR64>;
  2590. def : SVE_4_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  2591. def : SVE_4_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  2592. def : SVE_4_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  2593. def : SVE_4_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  2594. }
  2595. class sve_int_mlas_vvv_pred<bits<2> sz8_64, bits<1> opc, string asm,
  2596. ZPRRegOp zprty>
  2597. : I<(outs zprty:$Zda), (ins PPR3bAny:$Pg, zprty:$_Zda, zprty:$Zn, zprty:$Zm),
  2598. asm, "\t$Zda, $Pg/m, $Zn, $Zm",
  2599. "",
  2600. []>, Sched<[]> {
  2601. bits<3> Pg;
  2602. bits<5> Zda;
  2603. bits<5> Zm;
  2604. bits<5> Zn;
  2605. let Inst{31-24} = 0b00000100;
  2606. let Inst{23-22} = sz8_64;
  2607. let Inst{21} = 0b0;
  2608. let Inst{20-16} = Zm;
  2609. let Inst{15-14} = 0b01;
  2610. let Inst{13} = opc;
  2611. let Inst{12-10} = Pg;
  2612. let Inst{9-5} = Zn;
  2613. let Inst{4-0} = Zda;
  2614. let Constraints = "$Zda = $_Zda";
  2615. let DestructiveInstType = DestructiveOther;
  2616. let ElementSize = zprty.ElementSize;
  2617. }
  2618. multiclass sve_int_mlas_vvv_pred<bits<1> opc, string asm, SDPatternOperator op> {
  2619. def _B : sve_int_mlas_vvv_pred<0b00, opc, asm, ZPR8>;
  2620. def _H : sve_int_mlas_vvv_pred<0b01, opc, asm, ZPR16>;
  2621. def _S : sve_int_mlas_vvv_pred<0b10, opc, asm, ZPR32>;
  2622. def _D : sve_int_mlas_vvv_pred<0b11, opc, asm, ZPR64>;
  2623. def : SVE_4_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  2624. def : SVE_4_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  2625. def : SVE_4_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  2626. def : SVE_4_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  2627. }
  2628. //===----------------------------------------------------------------------===//
  2629. // SVE2 Integer Multiply-Add - Unpredicated Group
  2630. //===----------------------------------------------------------------------===//
  2631. class sve2_int_mla<bits<2> sz, bits<5> opc, string asm,
  2632. ZPRRegOp zprty1, ZPRRegOp zprty2>
  2633. : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm),
  2634. asm, "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
  2635. bits<5> Zda;
  2636. bits<5> Zn;
  2637. bits<5> Zm;
  2638. let Inst{31-24} = 0b01000100;
  2639. let Inst{23-22} = sz;
  2640. let Inst{21} = 0b0;
  2641. let Inst{20-16} = Zm;
  2642. let Inst{15} = 0b0;
  2643. let Inst{14-10} = opc;
  2644. let Inst{9-5} = Zn;
  2645. let Inst{4-0} = Zda;
  2646. let Constraints = "$Zda = $_Zda";
  2647. let DestructiveInstType = DestructiveOther;
  2648. let ElementSize = ElementSizeNone;
  2649. }
  2650. multiclass sve2_int_mla<bit S, string asm, SDPatternOperator op> {
  2651. def _B : sve2_int_mla<0b00, { 0b1110, S }, asm, ZPR8, ZPR8>;
  2652. def _H : sve2_int_mla<0b01, { 0b1110, S }, asm, ZPR16, ZPR16>;
  2653. def _S : sve2_int_mla<0b10, { 0b1110, S }, asm, ZPR32, ZPR32>;
  2654. def _D : sve2_int_mla<0b11, { 0b1110, S }, asm, ZPR64, ZPR64>;
  2655. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  2656. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  2657. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  2658. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  2659. }
  2660. multiclass sve2_int_mla_long<bits<5> opc, string asm, SDPatternOperator op> {
  2661. def _H : sve2_int_mla<0b01, opc, asm, ZPR16, ZPR8>;
  2662. def _S : sve2_int_mla<0b10, opc, asm, ZPR32, ZPR16>;
  2663. def _D : sve2_int_mla<0b11, opc, asm, ZPR64, ZPR32>;
  2664. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _H)>;
  2665. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _S)>;
  2666. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _D)>;
  2667. }
  2668. //===----------------------------------------------------------------------===//
  2669. // SVE2 Integer Multiply-Add - Indexed Group
  2670. //===----------------------------------------------------------------------===//
  2671. class sve2_int_mla_by_indexed_elem<bits<2> sz, bits<6> opc, string asm,
  2672. ZPRRegOp zprty1, ZPRRegOp zprty2,
  2673. ZPRRegOp zprty3, Operand itype>
  2674. : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty3:$Zm, itype:$iop),
  2675. asm, "\t$Zda, $Zn, $Zm$iop", "", []>, Sched<[]> {
  2676. bits<5> Zda;
  2677. bits<5> Zn;
  2678. let Inst{31-24} = 0b01000100;
  2679. let Inst{23-22} = sz;
  2680. let Inst{21} = 0b1;
  2681. let Inst{15-10} = opc;
  2682. let Inst{9-5} = Zn;
  2683. let Inst{4-0} = Zda;
  2684. let Constraints = "$Zda = $_Zda";
  2685. let DestructiveInstType = DestructiveOther;
  2686. let ElementSize = ElementSizeNone;
  2687. }
  2688. multiclass sve2_int_mla_by_indexed_elem<bits<2> opc, bit S, string asm,
  2689. SDPatternOperator op> {
  2690. def _H : sve2_int_mla_by_indexed_elem<{0, ?}, { 0b000, opc, S }, asm, ZPR16, ZPR16, ZPR3b16, VectorIndexH32b> {
  2691. bits<3> Zm;
  2692. bits<3> iop;
  2693. let Inst{22} = iop{2};
  2694. let Inst{20-19} = iop{1-0};
  2695. let Inst{18-16} = Zm;
  2696. }
  2697. def _S : sve2_int_mla_by_indexed_elem<0b10, { 0b000, opc, S }, asm, ZPR32, ZPR32, ZPR3b32, VectorIndexS32b> {
  2698. bits<3> Zm;
  2699. bits<2> iop;
  2700. let Inst{20-19} = iop;
  2701. let Inst{18-16} = Zm;
  2702. }
  2703. def _D : sve2_int_mla_by_indexed_elem<0b11, { 0b000, opc, S }, asm, ZPR64, ZPR64, ZPR4b64, VectorIndexD32b> {
  2704. bits<4> Zm;
  2705. bit iop;
  2706. let Inst{20} = iop;
  2707. let Inst{19-16} = Zm;
  2708. }
  2709. def : SVE_4_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, i32, VectorIndexH32b_timm, !cast<Instruction>(NAME # _H)>;
  2710. def : SVE_4_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME # _S)>;
  2711. def : SVE_4_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, i32, VectorIndexD32b_timm, !cast<Instruction>(NAME # _D)>;
  2712. }
  2713. //===----------------------------------------------------------------------===//
  2714. // SVE2 Integer Multiply-Add Long - Indexed Group
  2715. //===----------------------------------------------------------------------===//
  2716. multiclass sve2_int_mla_long_by_indexed_elem<bits<4> opc, string asm,
  2717. SDPatternOperator op> {
  2718. def _S : sve2_int_mla_by_indexed_elem<0b10, { opc{3}, 0b0, opc{2-1}, ?, opc{0} },
  2719. asm, ZPR32, ZPR16, ZPR3b16, VectorIndexH32b> {
  2720. bits<3> Zm;
  2721. bits<3> iop;
  2722. let Inst{20-19} = iop{2-1};
  2723. let Inst{18-16} = Zm;
  2724. let Inst{11} = iop{0};
  2725. }
  2726. def _D : sve2_int_mla_by_indexed_elem<0b11, { opc{3}, 0b0, opc{2-1}, ?, opc{0} },
  2727. asm, ZPR64, ZPR32, ZPR4b32, VectorIndexS32b> {
  2728. bits<4> Zm;
  2729. bits<2> iop;
  2730. let Inst{20} = iop{1};
  2731. let Inst{19-16} = Zm;
  2732. let Inst{11} = iop{0};
  2733. }
  2734. def : SVE_4_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv8i16, nxv8i16, i32, VectorIndexH32b_timm, !cast<Instruction>(NAME # _S)>;
  2735. def : SVE_4_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv4i32, nxv4i32, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME # _D)>;
  2736. }
  2737. //===----------------------------------------------------------------------===//
  2738. // SVE Integer Dot Product Group
  2739. //===----------------------------------------------------------------------===//
  2740. class sve_intx_dot<bit sz, bit U, string asm, ZPRRegOp zprty1,
  2741. ZPRRegOp zprty2>
  2742. : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm), asm,
  2743. "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
  2744. bits<5> Zda;
  2745. bits<5> Zn;
  2746. bits<5> Zm;
  2747. let Inst{31-23} = 0b010001001;
  2748. let Inst{22} = sz;
  2749. let Inst{21} = 0;
  2750. let Inst{20-16} = Zm;
  2751. let Inst{15-11} = 0;
  2752. let Inst{10} = U;
  2753. let Inst{9-5} = Zn;
  2754. let Inst{4-0} = Zda;
  2755. let Constraints = "$Zda = $_Zda";
  2756. let DestructiveInstType = DestructiveOther;
  2757. }
  2758. multiclass sve_intx_dot<bit opc, string asm, SDPatternOperator op> {
  2759. def _S : sve_intx_dot<0b0, opc, asm, ZPR32, ZPR8>;
  2760. def _D : sve_intx_dot<0b1, opc, asm, ZPR64, ZPR16>;
  2761. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _S)>;
  2762. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _D)>;
  2763. }
  2764. //===----------------------------------------------------------------------===//
  2765. // SVE Integer Dot Product Group - Indexed Group
  2766. //===----------------------------------------------------------------------===//
  2767. class sve_intx_dot_by_indexed_elem<bit sz, bit U, string asm,
  2768. ZPRRegOp zprty1, ZPRRegOp zprty2,
  2769. ZPRRegOp zprty3, Operand itype>
  2770. : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty3:$Zm, itype:$iop),
  2771. asm, "\t$Zda, $Zn, $Zm$iop",
  2772. "", []>, Sched<[]> {
  2773. bits<5> Zda;
  2774. bits<5> Zn;
  2775. let Inst{31-23} = 0b010001001;
  2776. let Inst{22} = sz;
  2777. let Inst{21} = 0b1;
  2778. let Inst{15-11} = 0;
  2779. let Inst{10} = U;
  2780. let Inst{9-5} = Zn;
  2781. let Inst{4-0} = Zda;
  2782. let Constraints = "$Zda = $_Zda";
  2783. let DestructiveInstType = DestructiveOther;
  2784. }
  2785. multiclass sve_intx_dot_by_indexed_elem<bit opc, string asm,
  2786. SDPatternOperator op> {
  2787. def _S : sve_intx_dot_by_indexed_elem<0b0, opc, asm, ZPR32, ZPR8, ZPR3b8, VectorIndexS32b_timm> {
  2788. bits<2> iop;
  2789. bits<3> Zm;
  2790. let Inst{20-19} = iop;
  2791. let Inst{18-16} = Zm;
  2792. }
  2793. def _D : sve_intx_dot_by_indexed_elem<0b1, opc, asm, ZPR64, ZPR16, ZPR4b16, VectorIndexD32b_timm> {
  2794. bits<1> iop;
  2795. bits<4> Zm;
  2796. let Inst{20} = iop;
  2797. let Inst{19-16} = Zm;
  2798. }
  2799. def : SVE_4_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv16i8, nxv16i8, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME # _S)>;
  2800. def : SVE_4_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv8i16, nxv8i16, i32, VectorIndexD32b_timm, !cast<Instruction>(NAME # _D)>;
  2801. }
  2802. //===----------------------------------------------------------------------===//
  2803. // SVE2 Complex Integer Dot Product Group
  2804. //===----------------------------------------------------------------------===//
  2805. class sve2_complex_int_arith<bits<2> sz, bits<4> opc, string asm,
  2806. ZPRRegOp zprty1, ZPRRegOp zprty2>
  2807. : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm,
  2808. complexrotateop:$rot),
  2809. asm, "\t$Zda, $Zn, $Zm, $rot", "", []>, Sched<[]> {
  2810. bits<5> Zda;
  2811. bits<5> Zn;
  2812. bits<5> Zm;
  2813. bits<2> rot;
  2814. let Inst{31-24} = 0b01000100;
  2815. let Inst{23-22} = sz;
  2816. let Inst{21} = 0b0;
  2817. let Inst{20-16} = Zm;
  2818. let Inst{15-12} = opc;
  2819. let Inst{11-10} = rot;
  2820. let Inst{9-5} = Zn;
  2821. let Inst{4-0} = Zda;
  2822. let Constraints = "$Zda = $_Zda";
  2823. let DestructiveInstType = DestructiveOther;
  2824. let ElementSize = ElementSizeNone;
  2825. }
  2826. multiclass sve2_cintx_dot<string asm, SDPatternOperator op> {
  2827. def _S : sve2_complex_int_arith<0b10, 0b0001, asm, ZPR32, ZPR8>;
  2828. def _D : sve2_complex_int_arith<0b11, 0b0001, asm, ZPR64, ZPR16>;
  2829. def : Pat<(nxv4i32 (op (nxv4i32 ZPR32:$Op1), (nxv16i8 ZPR8:$Op2), (nxv16i8 ZPR8:$Op3),
  2830. (i32 complexrotateop:$imm))),
  2831. (!cast<Instruction>(NAME # "_S") ZPR32:$Op1, ZPR8:$Op2, ZPR8:$Op3, complexrotateop:$imm)>;
  2832. def : Pat<(nxv2i64 (op (nxv2i64 ZPR64:$Op1), (nxv8i16 ZPR16:$Op2), (nxv8i16 ZPR16:$Op3),
  2833. (i32 complexrotateop:$imm))),
  2834. (!cast<Instruction>(NAME # "_D") ZPR64:$Op1, ZPR16:$Op2, ZPR16:$Op3, complexrotateop:$imm)>;
  2835. }
  2836. //===----------------------------------------------------------------------===//
  2837. // SVE2 Complex Multiply-Add Group
  2838. //===----------------------------------------------------------------------===//
  2839. multiclass sve2_int_cmla<bit opc, string asm, SDPatternOperator op> {
  2840. def _B : sve2_complex_int_arith<0b00, { 0b001, opc }, asm, ZPR8, ZPR8>;
  2841. def _H : sve2_complex_int_arith<0b01, { 0b001, opc }, asm, ZPR16, ZPR16>;
  2842. def _S : sve2_complex_int_arith<0b10, { 0b001, opc }, asm, ZPR32, ZPR32>;
  2843. def _D : sve2_complex_int_arith<0b11, { 0b001, opc }, asm, ZPR64, ZPR64>;
  2844. def : SVE_4_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, i32, complexrotateop, !cast<Instruction>(NAME # _B)>;
  2845. def : SVE_4_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, i32, complexrotateop, !cast<Instruction>(NAME # _H)>;
  2846. def : SVE_4_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, i32, complexrotateop, !cast<Instruction>(NAME # _S)>;
  2847. def : SVE_4_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, i32, complexrotateop, !cast<Instruction>(NAME # _D)>;
  2848. }
  2849. //===----------------------------------------------------------------------===//
  2850. // SVE2 Complex Integer Dot Product - Indexed Group
  2851. //===----------------------------------------------------------------------===//
  2852. class sve2_complex_int_arith_indexed<bits<2> sz, bits<4> opc, string asm,
  2853. ZPRRegOp zprty1, ZPRRegOp zprty2,
  2854. ZPRRegOp zprty3, Operand itype>
  2855. : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty3:$Zm, itype:$iop,
  2856. complexrotateop:$rot),
  2857. asm, "\t$Zda, $Zn, $Zm$iop, $rot", "", []>, Sched<[]> {
  2858. bits<5> Zda;
  2859. bits<5> Zn;
  2860. bits<2> rot;
  2861. let Inst{31-24} = 0b01000100;
  2862. let Inst{23-22} = sz;
  2863. let Inst{21} = 0b1;
  2864. let Inst{15-12} = opc;
  2865. let Inst{11-10} = rot;
  2866. let Inst{9-5} = Zn;
  2867. let Inst{4-0} = Zda;
  2868. let Constraints = "$Zda = $_Zda";
  2869. let DestructiveInstType = DestructiveOther;
  2870. let ElementSize = ElementSizeNone;
  2871. }
  2872. multiclass sve2_cintx_dot_by_indexed_elem<string asm, SDPatternOperator op> {
  2873. def _S : sve2_complex_int_arith_indexed<0b10, 0b0100, asm, ZPR32, ZPR8, ZPR3b8, VectorIndexS32b> {
  2874. bits<2> iop;
  2875. bits<3> Zm;
  2876. let Inst{20-19} = iop;
  2877. let Inst{18-16} = Zm;
  2878. }
  2879. def _D : sve2_complex_int_arith_indexed<0b11, 0b0100, asm, ZPR64, ZPR16, ZPR4b16, VectorIndexD32b> {
  2880. bit iop;
  2881. bits<4> Zm;
  2882. let Inst{20} = iop;
  2883. let Inst{19-16} = Zm;
  2884. }
  2885. def : Pat<(nxv4i32 (op (nxv4i32 ZPR32:$Op1), (nxv16i8 ZPR8:$Op2), (nxv16i8 ZPR8:$Op3),
  2886. (i32 VectorIndexS32b_timm:$idx), (i32 complexrotateop:$imm))),
  2887. (!cast<Instruction>(NAME # "_S") ZPR32:$Op1, ZPR8:$Op2, ZPR8:$Op3, VectorIndexS32b_timm:$idx, complexrotateop:$imm)>;
  2888. def : Pat<(nxv2i64 (op (nxv2i64 ZPR64:$Op1), (nxv8i16 ZPR16:$Op2), (nxv8i16 ZPR16:$Op3),
  2889. (i32 VectorIndexD32b_timm:$idx), (i32 complexrotateop:$imm))),
  2890. (!cast<Instruction>(NAME # "_D") ZPR64:$Op1, ZPR16:$Op2, ZPR16:$Op3, VectorIndexD32b_timm:$idx, complexrotateop:$imm)>;
  2891. }
  2892. //===----------------------------------------------------------------------===//
  2893. // SVE2 Complex Multiply-Add - Indexed Group
  2894. //===----------------------------------------------------------------------===//
  2895. multiclass sve2_cmla_by_indexed_elem<bit opc, string asm,
  2896. SDPatternOperator op> {
  2897. def _H : sve2_complex_int_arith_indexed<0b10, { 0b011, opc }, asm, ZPR16, ZPR16, ZPR3b16, VectorIndexS32b> {
  2898. bits<2> iop;
  2899. bits<3> Zm;
  2900. let Inst{20-19} = iop;
  2901. let Inst{18-16} = Zm;
  2902. }
  2903. def _S : sve2_complex_int_arith_indexed<0b11, { 0b011, opc }, asm, ZPR32, ZPR32, ZPR4b32, VectorIndexD32b> {
  2904. bit iop;
  2905. bits<4> Zm;
  2906. let Inst{20} = iop;
  2907. let Inst{19-16} = Zm;
  2908. }
  2909. def : Pat<(nxv8i16 (op (nxv8i16 ZPR16:$Op1), (nxv8i16 ZPR16:$Op2), (nxv8i16 ZPR16:$Op3),
  2910. (i32 VectorIndexS32b_timm:$idx), (i32 complexrotateop:$imm))),
  2911. (!cast<Instruction>(NAME # "_H") ZPR16:$Op1, ZPR16:$Op2, ZPR16:$Op3, VectorIndexS32b_timm:$idx, complexrotateop:$imm)>;
  2912. def : Pat<(nxv4i32 (op (nxv4i32 ZPR32:$Op1), (nxv4i32 ZPR32:$Op2), (nxv4i32 ZPR32:$Op3),
  2913. (i32 VectorIndexD32b_timm:$idx), (i32 complexrotateop:$imm))),
  2914. (!cast<Instruction>(NAME # "_S") ZPR32:$Op1, ZPR32:$Op2, ZPR32:$Op3, VectorIndexD32b_timm:$idx, complexrotateop:$imm)>;
  2915. }
  2916. //===----------------------------------------------------------------------===//
  2917. // SVE2 Integer Multiply - Unpredicated Group
  2918. //===----------------------------------------------------------------------===//
  2919. class sve2_int_mul<bits<2> sz, bits<3> opc, string asm, ZPRRegOp zprty>
  2920. : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
  2921. asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
  2922. bits<5> Zd;
  2923. bits<5> Zm;
  2924. bits<5> Zn;
  2925. let Inst{31-24} = 0b00000100;
  2926. let Inst{23-22} = sz;
  2927. let Inst{21} = 0b1;
  2928. let Inst{20-16} = Zm;
  2929. let Inst{15-13} = 0b011;
  2930. let Inst{12-10} = opc;
  2931. let Inst{9-5} = Zn;
  2932. let Inst{4-0} = Zd;
  2933. }
  2934. multiclass sve2_int_mul<bits<3> opc, string asm, SDPatternOperator op,
  2935. SDPatternOperator op_pred = null_frag> {
  2936. def _B : sve2_int_mul<0b00, opc, asm, ZPR8>;
  2937. def _H : sve2_int_mul<0b01, opc, asm, ZPR16>;
  2938. def _S : sve2_int_mul<0b10, opc, asm, ZPR32>;
  2939. def _D : sve2_int_mul<0b11, opc, asm, ZPR64>;
  2940. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  2941. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  2942. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  2943. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  2944. def : SVE_2_Op_Pred_All_Active<nxv16i8, op_pred, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  2945. def : SVE_2_Op_Pred_All_Active<nxv8i16, op_pred, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  2946. def : SVE_2_Op_Pred_All_Active<nxv4i32, op_pred, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  2947. def : SVE_2_Op_Pred_All_Active<nxv2i64, op_pred, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  2948. }
  2949. multiclass sve2_int_mul_single<bits<3> opc, string asm, SDPatternOperator op> {
  2950. def _B : sve2_int_mul<0b00, opc, asm, ZPR8>;
  2951. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  2952. }
  2953. //===----------------------------------------------------------------------===//
  2954. // SVE2 Integer Multiply - Indexed Group
  2955. //===----------------------------------------------------------------------===//
  2956. class sve2_int_mul_by_indexed_elem<bits<2> sz, bits<4> opc, string asm,
  2957. ZPRRegOp zprty1, ZPRRegOp zprty2,
  2958. ZPRRegOp zprty3, Operand itype>
  2959. : I<(outs zprty1:$Zd), (ins zprty2:$Zn, zprty3:$Zm, itype:$iop),
  2960. asm, "\t$Zd, $Zn, $Zm$iop", "", []>, Sched<[]> {
  2961. bits<5> Zd;
  2962. bits<5> Zn;
  2963. let Inst{31-24} = 0b01000100;
  2964. let Inst{23-22} = sz;
  2965. let Inst{21} = 0b1;
  2966. let Inst{15-14} = 0b11;
  2967. let Inst{13-10} = opc;
  2968. let Inst{9-5} = Zn;
  2969. let Inst{4-0} = Zd;
  2970. }
  2971. multiclass sve2_int_mul_by_indexed_elem<bits<4> opc, string asm,
  2972. SDPatternOperator op> {
  2973. def _H : sve2_int_mul_by_indexed_elem<{0, ?}, opc, asm, ZPR16, ZPR16, ZPR3b16, VectorIndexH32b> {
  2974. bits<3> Zm;
  2975. bits<3> iop;
  2976. let Inst{22} = iop{2};
  2977. let Inst{20-19} = iop{1-0};
  2978. let Inst{18-16} = Zm;
  2979. }
  2980. def _S : sve2_int_mul_by_indexed_elem<0b10, opc, asm, ZPR32, ZPR32, ZPR3b32, VectorIndexS32b> {
  2981. bits<3> Zm;
  2982. bits<2> iop;
  2983. let Inst{20-19} = iop;
  2984. let Inst{18-16} = Zm;
  2985. }
  2986. def _D : sve2_int_mul_by_indexed_elem<0b11, opc, asm, ZPR64, ZPR64, ZPR4b64, VectorIndexD32b> {
  2987. bits<4> Zm;
  2988. bit iop;
  2989. let Inst{20} = iop;
  2990. let Inst{19-16} = Zm;
  2991. }
  2992. def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, VectorIndexH32b_timm, !cast<Instruction>(NAME # _H)>;
  2993. def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME # _S)>;
  2994. def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, VectorIndexD32b_timm, !cast<Instruction>(NAME # _D)>;
  2995. }
  2996. multiclass sve2_int_mul_long_by_indexed_elem<bits<3> opc, string asm,
  2997. SDPatternOperator op> {
  2998. def _S : sve2_int_mul_by_indexed_elem<0b10, { opc{2-1}, ?, opc{0} }, asm,
  2999. ZPR32, ZPR16, ZPR3b16, VectorIndexH32b> {
  3000. bits<3> Zm;
  3001. bits<3> iop;
  3002. let Inst{20-19} = iop{2-1};
  3003. let Inst{18-16} = Zm;
  3004. let Inst{11} = iop{0};
  3005. }
  3006. def _D : sve2_int_mul_by_indexed_elem<0b11, { opc{2-1}, ?, opc{0} }, asm,
  3007. ZPR64, ZPR32, ZPR4b32, VectorIndexS32b> {
  3008. bits<4> Zm;
  3009. bits<2> iop;
  3010. let Inst{20} = iop{1};
  3011. let Inst{19-16} = Zm;
  3012. let Inst{11} = iop{0};
  3013. }
  3014. def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv8i16, nxv8i16, i32, VectorIndexH32b_timm, !cast<Instruction>(NAME # _S)>;
  3015. def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv4i32, nxv4i32, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME # _D)>;
  3016. }
  3017. //===----------------------------------------------------------------------===//
  3018. // SVE2 Integer - Predicated Group
  3019. //===----------------------------------------------------------------------===//
  3020. class sve2_int_arith_pred<bits<2> sz, bits<6> opc, string asm,
  3021. ZPRRegOp zprty>
  3022. : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
  3023. asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm", "", []>, Sched<[]> {
  3024. bits<3> Pg;
  3025. bits<5> Zm;
  3026. bits<5> Zdn;
  3027. let Inst{31-24} = 0b01000100;
  3028. let Inst{23-22} = sz;
  3029. let Inst{21-20} = 0b01;
  3030. let Inst{20-16} = opc{5-1};
  3031. let Inst{15-14} = 0b10;
  3032. let Inst{13} = opc{0};
  3033. let Inst{12-10} = Pg;
  3034. let Inst{9-5} = Zm;
  3035. let Inst{4-0} = Zdn;
  3036. let Constraints = "$Zdn = $_Zdn";
  3037. let DestructiveInstType = DestructiveOther;
  3038. let ElementSize = zprty.ElementSize;
  3039. }
  3040. multiclass sve2_int_arith_pred<bits<6> opc, string asm, SDPatternOperator op,
  3041. string Ps = "",
  3042. DestructiveInstTypeEnum flags=DestructiveOther,
  3043. string revname="", bit isReverseInstr=0> {
  3044. let DestructiveInstType = flags in {
  3045. def _B : sve2_int_arith_pred<0b00, opc, asm, ZPR8>,
  3046. SVEPseudo2Instr<Ps # _B, 1>, SVEInstr2Rev<NAME # _B, revname # _B, isReverseInstr>;
  3047. def _H : sve2_int_arith_pred<0b01, opc, asm, ZPR16>,
  3048. SVEPseudo2Instr<Ps # _H, 1>, SVEInstr2Rev<NAME # _H, revname # _H, isReverseInstr>;
  3049. def _S : sve2_int_arith_pred<0b10, opc, asm, ZPR32>,
  3050. SVEPseudo2Instr<Ps # _S, 1>, SVEInstr2Rev<NAME # _S, revname # _S, isReverseInstr>;
  3051. def _D : sve2_int_arith_pred<0b11, opc, asm, ZPR64>,
  3052. SVEPseudo2Instr<Ps # _D, 1>, SVEInstr2Rev<NAME # _D, revname # _D, isReverseInstr>;
  3053. }
  3054. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  3055. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  3056. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  3057. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  3058. }
  3059. class sve2_int_sadd_long_accum_pairwise<bits<2> sz, bit U, string asm,
  3060. ZPRRegOp zprty1, ZPRRegOp zprty2>
  3061. : I<(outs zprty1:$Zda), (ins PPR3bAny:$Pg, zprty1:$_Zda, zprty2:$Zn),
  3062. asm, "\t$Zda, $Pg/m, $Zn", "", []>, Sched<[]> {
  3063. bits<3> Pg;
  3064. bits<5> Zn;
  3065. bits<5> Zda;
  3066. let Inst{31-24} = 0b01000100;
  3067. let Inst{23-22} = sz;
  3068. let Inst{21-17} = 0b00010;
  3069. let Inst{16} = U;
  3070. let Inst{15-13} = 0b101;
  3071. let Inst{12-10} = Pg;
  3072. let Inst{9-5} = Zn;
  3073. let Inst{4-0} = Zda;
  3074. let Constraints = "$Zda = $_Zda";
  3075. let DestructiveInstType = DestructiveOther;
  3076. let ElementSize = zprty1.ElementSize;
  3077. }
  3078. multiclass sve2_int_sadd_long_accum_pairwise<bit U, string asm, SDPatternOperator op> {
  3079. def _H : sve2_int_sadd_long_accum_pairwise<0b01, U, asm, ZPR16, ZPR8>;
  3080. def _S : sve2_int_sadd_long_accum_pairwise<0b10, U, asm, ZPR32, ZPR16>;
  3081. def _D : sve2_int_sadd_long_accum_pairwise<0b11, U, asm, ZPR64, ZPR32>;
  3082. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv16i8, !cast<Instruction>(NAME # _H)>;
  3083. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv8i16, !cast<Instruction>(NAME # _S)>;
  3084. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv4i32, !cast<Instruction>(NAME # _D)>;
  3085. }
  3086. class sve2_int_un_pred_arit<bits<2> sz, bit Q, bits<2> opc,
  3087. string asm, ZPRRegOp zprty>
  3088. : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, zprty:$Zn),
  3089. asm, "\t$Zd, $Pg/m, $Zn",
  3090. "",
  3091. []>, Sched<[]> {
  3092. bits<3> Pg;
  3093. bits<5> Zd;
  3094. bits<5> Zn;
  3095. let Inst{31-24} = 0b01000100;
  3096. let Inst{23-22} = sz;
  3097. let Inst{21-20} = 0b00;
  3098. let Inst{19} = Q;
  3099. let Inst{18} = 0b0;
  3100. let Inst{17-16} = opc;
  3101. let Inst{15-13} = 0b101;
  3102. let Inst{12-10} = Pg;
  3103. let Inst{9-5} = Zn;
  3104. let Inst{4-0} = Zd;
  3105. let Constraints = "$Zd = $_Zd";
  3106. let DestructiveInstType = DestructiveUnaryPassthru;
  3107. let ElementSize = zprty.ElementSize;
  3108. }
  3109. multiclass sve2_int_un_pred_arit_s<bits<3> opc, string asm,
  3110. SDPatternOperator op> {
  3111. def _S : sve2_int_un_pred_arit<0b10, opc{2}, opc{1-0}, asm, ZPR32>,
  3112. SVEPseudo2Instr<NAME # _S, 1>;
  3113. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  3114. def _UNDEF_S : PredOneOpPassthruPseudo<NAME # _S, ZPR32>;
  3115. defm : SVE_3_Op_Undef_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4i32, !cast<Pseudo>(NAME # _UNDEF_S)>;
  3116. }
  3117. multiclass sve2_int_un_pred_arit<bits<3> opc, string asm, SDPatternOperator op> {
  3118. def _B : sve2_int_un_pred_arit<0b00, opc{2}, opc{1-0}, asm, ZPR8>,
  3119. SVEPseudo2Instr<NAME # _B, 1>;
  3120. def _H : sve2_int_un_pred_arit<0b01, opc{2}, opc{1-0}, asm, ZPR16>,
  3121. SVEPseudo2Instr<NAME # _H, 1>;
  3122. def _S : sve2_int_un_pred_arit<0b10, opc{2}, opc{1-0}, asm, ZPR32>,
  3123. SVEPseudo2Instr<NAME # _S, 1>;
  3124. def _D : sve2_int_un_pred_arit<0b11, opc{2}, opc{1-0}, asm, ZPR64>,
  3125. SVEPseudo2Instr<NAME # _D, 1>;
  3126. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
  3127. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
  3128. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  3129. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  3130. def _UNDEF_B : PredOneOpPassthruPseudo<NAME # _B, ZPR8>;
  3131. def _UNDEF_H : PredOneOpPassthruPseudo<NAME # _H, ZPR16>;
  3132. def _UNDEF_S : PredOneOpPassthruPseudo<NAME # _S, ZPR32>;
  3133. def _UNDEF_D : PredOneOpPassthruPseudo<NAME # _D, ZPR64>;
  3134. defm : SVE_3_Op_Undef_Pat<nxv16i8, op, nxv16i8, nxv16i1, nxv16i8, !cast<Pseudo>(NAME # _UNDEF_B)>;
  3135. defm : SVE_3_Op_Undef_Pat<nxv8i16, op, nxv8i16, nxv8i1, nxv8i16, !cast<Pseudo>(NAME # _UNDEF_H)>;
  3136. defm : SVE_3_Op_Undef_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4i32, !cast<Pseudo>(NAME # _UNDEF_S)>;
  3137. defm : SVE_3_Op_Undef_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2i64, !cast<Pseudo>(NAME # _UNDEF_D)>;
  3138. }
  3139. //===----------------------------------------------------------------------===//
  3140. // SVE2 Widening Integer Arithmetic Group
  3141. //===----------------------------------------------------------------------===//
  3142. class sve2_wide_int_arith<bits<2> sz, bits<5> opc, string asm,
  3143. ZPRRegOp zprty1, ZPRRegOp zprty2, ZPRRegOp zprty3>
  3144. : I<(outs zprty1:$Zd), (ins zprty2:$Zn, zprty3:$Zm),
  3145. asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
  3146. bits<5> Zd;
  3147. bits<5> Zn;
  3148. bits<5> Zm;
  3149. let Inst{31-24} = 0b01000101;
  3150. let Inst{23-22} = sz;
  3151. let Inst{21} = 0b0;
  3152. let Inst{20-16} = Zm;
  3153. let Inst{15} = 0b0;
  3154. let Inst{14-10} = opc;
  3155. let Inst{9-5} = Zn;
  3156. let Inst{4-0} = Zd;
  3157. }
  3158. multiclass sve2_wide_int_arith_long<bits<5> opc, string asm,
  3159. SDPatternOperator op> {
  3160. def _H : sve2_wide_int_arith<0b01, opc, asm, ZPR16, ZPR8, ZPR8>;
  3161. def _S : sve2_wide_int_arith<0b10, opc, asm, ZPR32, ZPR16, ZPR16>;
  3162. def _D : sve2_wide_int_arith<0b11, opc, asm, ZPR64, ZPR32, ZPR32>;
  3163. def : SVE_2_Op_Pat<nxv8i16, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _H)>;
  3164. def : SVE_2_Op_Pat<nxv4i32, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _S)>;
  3165. def : SVE_2_Op_Pat<nxv2i64, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _D)>;
  3166. }
  3167. multiclass sve2_wide_int_arith_wide<bits<3> opc, string asm,
  3168. SDPatternOperator op> {
  3169. def _H : sve2_wide_int_arith<0b01, { 0b10, opc }, asm, ZPR16, ZPR16, ZPR8>;
  3170. def _S : sve2_wide_int_arith<0b10, { 0b10, opc }, asm, ZPR32, ZPR32, ZPR16>;
  3171. def _D : sve2_wide_int_arith<0b11, { 0b10, opc }, asm, ZPR64, ZPR64, ZPR32>;
  3172. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv16i8, !cast<Instruction>(NAME # _H)>;
  3173. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv8i16, !cast<Instruction>(NAME # _S)>;
  3174. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv4i32, !cast<Instruction>(NAME # _D)>;
  3175. }
  3176. multiclass sve2_wide_int_arith_pmul<bits<2> sz, bits<5> opc, string asm,
  3177. SDPatternOperator op> {
  3178. def NAME : sve2_wide_int_arith<sz, opc, asm, ZPR128, ZPR64, ZPR64>;
  3179. // To avoid using 128 bit elements in the IR, the pattern below works with
  3180. // llvm intrinsics with the _pair suffix, to reflect that
  3181. // _Q is implemented as a pair of _D.
  3182. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME)>;
  3183. }
  3184. multiclass sve2_pmul_long<bits<1> opc, string asm, SDPatternOperator op> {
  3185. def _H : sve2_wide_int_arith<0b01, {0b1101, opc}, asm, ZPR16, ZPR8, ZPR8>;
  3186. def _D : sve2_wide_int_arith<0b11, {0b1101, opc}, asm, ZPR64, ZPR32, ZPR32>;
  3187. // To avoid using 128 bit elements in the IR, the patterns below work with
  3188. // llvm intrinsics with the _pair suffix, to reflect that
  3189. // _H is implemented as a pair of _B and _D is implemented as a pair of _S.
  3190. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _H)>;
  3191. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _D)>;
  3192. }
  3193. //===----------------------------------------------------------------------===//
  3194. // SVE2 Misc Group
  3195. //===----------------------------------------------------------------------===//
  3196. class sve2_misc<bits<2> sz, bits<4> opc, string asm,
  3197. ZPRRegOp zprty1, ZPRRegOp zprty2>
  3198. : I<(outs zprty1:$Zd), (ins zprty2:$Zn, zprty2:$Zm),
  3199. asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
  3200. bits<5> Zd;
  3201. bits<5> Zn;
  3202. bits<5> Zm;
  3203. let Inst{31-24} = 0b01000101;
  3204. let Inst{23-22} = sz;
  3205. let Inst{21} = 0b0;
  3206. let Inst{20-16} = Zm;
  3207. let Inst{15-14} = 0b10;
  3208. let Inst{13-10} = opc;
  3209. let Inst{9-5} = Zn;
  3210. let Inst{4-0} = Zd;
  3211. }
  3212. multiclass sve2_misc_bitwise<bits<4> opc, string asm, SDPatternOperator op> {
  3213. def _B : sve2_misc<0b00, opc, asm, ZPR8, ZPR8>;
  3214. def _H : sve2_misc<0b01, opc, asm, ZPR16, ZPR16>;
  3215. def _S : sve2_misc<0b10, opc, asm, ZPR32, ZPR32>;
  3216. def _D : sve2_misc<0b11, opc, asm, ZPR64, ZPR64>;
  3217. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  3218. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  3219. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  3220. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  3221. }
  3222. multiclass sve2_misc_int_addsub_long_interleaved<bits<2> opc, string asm,
  3223. SDPatternOperator op> {
  3224. def _H : sve2_misc<0b01, { 0b00, opc }, asm, ZPR16, ZPR8>;
  3225. def _S : sve2_misc<0b10, { 0b00, opc }, asm, ZPR32, ZPR16>;
  3226. def _D : sve2_misc<0b11, { 0b00, opc }, asm, ZPR64, ZPR32>;
  3227. def : SVE_2_Op_Pat<nxv8i16, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _H)>;
  3228. def : SVE_2_Op_Pat<nxv4i32, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _S)>;
  3229. def : SVE_2_Op_Pat<nxv2i64, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _D)>;
  3230. }
  3231. class sve2_bitwise_xor_interleaved<bits<2> sz, bits<1> opc, string asm,
  3232. ZPRRegOp zprty1, ZPRRegOp zprty2>
  3233. : I<(outs zprty1:$Zd), (ins zprty1:$_Zd, zprty2:$Zn, zprty2:$Zm),
  3234. asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
  3235. bits<5> Zd;
  3236. bits<5> Zn;
  3237. bits<5> Zm;
  3238. let Inst{31-24} = 0b01000101;
  3239. let Inst{23-22} = sz;
  3240. let Inst{21} = 0b0;
  3241. let Inst{20-16} = Zm;
  3242. let Inst{15-11} = 0b10010;
  3243. let Inst{10} = opc;
  3244. let Inst{9-5} = Zn;
  3245. let Inst{4-0} = Zd;
  3246. let Constraints = "$Zd = $_Zd";
  3247. let DestructiveInstType = DestructiveOther;
  3248. let ElementSize = ElementSizeNone;
  3249. }
  3250. multiclass sve2_bitwise_xor_interleaved<bit opc, string asm,
  3251. SDPatternOperator op> {
  3252. def _B : sve2_bitwise_xor_interleaved<0b00, opc, asm, ZPR8, ZPR8>;
  3253. def _H : sve2_bitwise_xor_interleaved<0b01, opc, asm, ZPR16, ZPR16>;
  3254. def _S : sve2_bitwise_xor_interleaved<0b10, opc, asm, ZPR32, ZPR32>;
  3255. def _D : sve2_bitwise_xor_interleaved<0b11, opc, asm, ZPR64, ZPR64>;
  3256. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  3257. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  3258. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  3259. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  3260. }
  3261. class sve2_bitwise_shift_left_long<bits<3> tsz8_64, bits<2> opc, string asm,
  3262. ZPRRegOp zprty1, ZPRRegOp zprty2,
  3263. Operand immtype>
  3264. : I<(outs zprty1:$Zd), (ins zprty2:$Zn, immtype:$imm),
  3265. asm, "\t$Zd, $Zn, $imm",
  3266. "", []>, Sched<[]> {
  3267. bits<5> Zd;
  3268. bits<5> Zn;
  3269. bits<5> imm;
  3270. let Inst{31-23} = 0b010001010;
  3271. let Inst{22} = tsz8_64{2};
  3272. let Inst{21} = 0b0;
  3273. let Inst{20-19} = tsz8_64{1-0};
  3274. let Inst{18-16} = imm{2-0}; // imm3
  3275. let Inst{15-12} = 0b1010;
  3276. let Inst{11-10} = opc;
  3277. let Inst{9-5} = Zn;
  3278. let Inst{4-0} = Zd;
  3279. }
  3280. multiclass sve2_bitwise_shift_left_long<bits<2> opc, string asm,
  3281. SDPatternOperator op> {
  3282. def _H : sve2_bitwise_shift_left_long<{0,0,1}, opc, asm,
  3283. ZPR16, ZPR8, vecshiftL8>;
  3284. def _S : sve2_bitwise_shift_left_long<{0,1,?}, opc, asm,
  3285. ZPR32, ZPR16, vecshiftL16> {
  3286. let Inst{19} = imm{3};
  3287. }
  3288. def _D : sve2_bitwise_shift_left_long<{1,?,?}, opc, asm,
  3289. ZPR64, ZPR32, vecshiftL32> {
  3290. let Inst{20-19} = imm{4-3};
  3291. }
  3292. def : SVE_2_Op_Imm_Pat<nxv8i16, op, nxv16i8, i32, tvecshiftL8, !cast<Instruction>(NAME # _H)>;
  3293. def : SVE_2_Op_Imm_Pat<nxv4i32, op, nxv8i16, i32, tvecshiftL16, !cast<Instruction>(NAME # _S)>;
  3294. def : SVE_2_Op_Imm_Pat<nxv2i64, op, nxv4i32, i32, tvecshiftL32, !cast<Instruction>(NAME # _D)>;
  3295. }
  3296. //===----------------------------------------------------------------------===//
  3297. // SVE2 Accumulate Group
  3298. //===----------------------------------------------------------------------===//
  3299. class sve2_int_bin_shift_imm<bits<4> tsz8_64, bit opc, string asm,
  3300. ZPRRegOp zprty, Operand immtype>
  3301. : I<(outs zprty:$Zd), (ins zprty:$_Zd, zprty:$Zn, immtype:$imm),
  3302. asm, "\t$Zd, $Zn, $imm",
  3303. "", []>, Sched<[]> {
  3304. bits<5> Zd;
  3305. bits<5> Zn;
  3306. bits<6> imm;
  3307. let Inst{31-24} = 0b01000101;
  3308. let Inst{23-22} = tsz8_64{3-2};
  3309. let Inst{21} = 0b0;
  3310. let Inst{20-19} = tsz8_64{1-0};
  3311. let Inst{18-16} = imm{2-0}; // imm3
  3312. let Inst{15-11} = 0b11110;
  3313. let Inst{10} = opc;
  3314. let Inst{9-5} = Zn;
  3315. let Inst{4-0} = Zd;
  3316. let Constraints = "$Zd = $_Zd";
  3317. }
  3318. multiclass sve2_int_bin_shift_imm_left<bit opc, string asm,
  3319. SDPatternOperator op> {
  3320. def _B : sve2_int_bin_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
  3321. def _H : sve2_int_bin_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
  3322. let Inst{19} = imm{3};
  3323. }
  3324. def _S : sve2_int_bin_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> {
  3325. let Inst{20-19} = imm{4-3};
  3326. }
  3327. def _D : sve2_int_bin_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> {
  3328. let Inst{22} = imm{5};
  3329. let Inst{20-19} = imm{4-3};
  3330. }
  3331. def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, tvecshiftL8, !cast<Instruction>(NAME # _B)>;
  3332. def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, tvecshiftL16, !cast<Instruction>(NAME # _H)>;
  3333. def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, tvecshiftL32, !cast<Instruction>(NAME # _S)>;
  3334. def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, tvecshiftL64, !cast<Instruction>(NAME # _D)>;
  3335. }
  3336. multiclass sve2_int_bin_shift_imm_right<bit opc, string asm,
  3337. SDPatternOperator op> {
  3338. def _B : sve2_int_bin_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
  3339. def _H : sve2_int_bin_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
  3340. let Inst{19} = imm{3};
  3341. }
  3342. def _S : sve2_int_bin_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
  3343. let Inst{20-19} = imm{4-3};
  3344. }
  3345. def _D : sve2_int_bin_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
  3346. let Inst{22} = imm{5};
  3347. let Inst{20-19} = imm{4-3};
  3348. }
  3349. def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
  3350. def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
  3351. def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
  3352. def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, tvecshiftR64, !cast<Instruction>(NAME # _D)>;
  3353. }
  3354. class sve2_int_bin_accum_shift_imm<bits<4> tsz8_64, bits<2> opc, string asm,
  3355. ZPRRegOp zprty, Operand immtype>
  3356. : I<(outs zprty:$Zda), (ins zprty:$_Zda, zprty:$Zn, immtype:$imm),
  3357. asm, "\t$Zda, $Zn, $imm",
  3358. "", []>, Sched<[]> {
  3359. bits<5> Zda;
  3360. bits<5> Zn;
  3361. bits<6> imm;
  3362. let Inst{31-24} = 0b01000101;
  3363. let Inst{23-22} = tsz8_64{3-2};
  3364. let Inst{21} = 0b0;
  3365. let Inst{20-19} = tsz8_64{1-0};
  3366. let Inst{18-16} = imm{2-0}; // imm3
  3367. let Inst{15-12} = 0b1110;
  3368. let Inst{11-10} = opc;
  3369. let Inst{9-5} = Zn;
  3370. let Inst{4-0} = Zda;
  3371. let Constraints = "$Zda = $_Zda";
  3372. let DestructiveInstType = DestructiveOther;
  3373. let ElementSize = ElementSizeNone;
  3374. }
  3375. multiclass sve2_int_bin_accum_shift_imm_right<bits<2> opc, string asm,
  3376. SDPatternOperator op,
  3377. SDPatternOperator shift_op = null_frag> {
  3378. def _B : sve2_int_bin_accum_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
  3379. def _H : sve2_int_bin_accum_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
  3380. let Inst{19} = imm{3};
  3381. }
  3382. def _S : sve2_int_bin_accum_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
  3383. let Inst{20-19} = imm{4-3};
  3384. }
  3385. def _D : sve2_int_bin_accum_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
  3386. let Inst{22} = imm{5};
  3387. let Inst{20-19} = imm{4-3};
  3388. }
  3389. def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
  3390. def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
  3391. def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
  3392. def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, tvecshiftR64, !cast<Instruction>(NAME # _D)>;
  3393. def : SVE_Shift_Add_All_Active_Pat<nxv16i8, shift_op, nxv16i1, nxv16i8, nxv16i8, i32, !cast<Instruction>(NAME # _B)>;
  3394. def : SVE_Shift_Add_All_Active_Pat<nxv8i16, shift_op, nxv8i1, nxv8i16, nxv8i16, i32, !cast<Instruction>(NAME # _H)>;
  3395. def : SVE_Shift_Add_All_Active_Pat<nxv4i32, shift_op, nxv4i1, nxv4i32, nxv4i32, i32, !cast<Instruction>(NAME # _S)>;
  3396. def : SVE_Shift_Add_All_Active_Pat<nxv2i64, shift_op, nxv2i1, nxv2i64, nxv2i64, i32, !cast<Instruction>(NAME # _D)>;
  3397. }
  3398. class sve2_int_cadd<bits<2> sz, bit opc, string asm, ZPRRegOp zprty>
  3399. : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm, complexrotateopodd:$rot),
  3400. asm, "\t$Zdn, $_Zdn, $Zm, $rot", "", []>, Sched<[]> {
  3401. bits<5> Zdn;
  3402. bits<5> Zm;
  3403. bit rot;
  3404. let Inst{31-24} = 0b01000101;
  3405. let Inst{23-22} = sz;
  3406. let Inst{21-17} = 0b00000;
  3407. let Inst{16} = opc;
  3408. let Inst{15-11} = 0b11011;
  3409. let Inst{10} = rot;
  3410. let Inst{9-5} = Zm;
  3411. let Inst{4-0} = Zdn;
  3412. let Constraints = "$Zdn = $_Zdn";
  3413. let DestructiveInstType = DestructiveOther;
  3414. let ElementSize = ElementSizeNone;
  3415. }
  3416. multiclass sve2_int_cadd<bit opc, string asm, SDPatternOperator op> {
  3417. def _B : sve2_int_cadd<0b00, opc, asm, ZPR8>;
  3418. def _H : sve2_int_cadd<0b01, opc, asm, ZPR16>;
  3419. def _S : sve2_int_cadd<0b10, opc, asm, ZPR32>;
  3420. def _D : sve2_int_cadd<0b11, opc, asm, ZPR64>;
  3421. def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, complexrotateopodd, !cast<Instruction>(NAME # _B)>;
  3422. def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, complexrotateopodd, !cast<Instruction>(NAME # _H)>;
  3423. def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, complexrotateopodd, !cast<Instruction>(NAME # _S)>;
  3424. def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, complexrotateopodd, !cast<Instruction>(NAME # _D)>;
  3425. }
  3426. class sve2_int_absdiff_accum<bits<2> sz, bits<4> opc, string asm,
  3427. ZPRRegOp zprty1, ZPRRegOp zprty2>
  3428. : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm),
  3429. asm, "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
  3430. bits<5> Zda;
  3431. bits<5> Zn;
  3432. bits<5> Zm;
  3433. let Inst{31-24} = 0b01000101;
  3434. let Inst{23-22} = sz;
  3435. let Inst{21} = 0b0;
  3436. let Inst{20-16} = Zm;
  3437. let Inst{15-14} = 0b11;
  3438. let Inst{13-10} = opc;
  3439. let Inst{9-5} = Zn;
  3440. let Inst{4-0} = Zda;
  3441. let Constraints = "$Zda = $_Zda";
  3442. let DestructiveInstType = DestructiveOther;
  3443. let ElementSize = ElementSizeNone;
  3444. }
  3445. multiclass sve2_int_absdiff_accum<bit opc, string asm, SDPatternOperator op> {
  3446. def _B : sve2_int_absdiff_accum<0b00, { 0b111, opc }, asm, ZPR8, ZPR8>;
  3447. def _H : sve2_int_absdiff_accum<0b01, { 0b111, opc }, asm, ZPR16, ZPR16>;
  3448. def _S : sve2_int_absdiff_accum<0b10, { 0b111, opc }, asm, ZPR32, ZPR32>;
  3449. def _D : sve2_int_absdiff_accum<0b11, { 0b111, opc }, asm, ZPR64, ZPR64>;
  3450. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  3451. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  3452. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  3453. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  3454. }
  3455. multiclass sve2_int_absdiff_accum_long<bits<2> opc, string asm,
  3456. SDPatternOperator op> {
  3457. def _H : sve2_int_absdiff_accum<0b01, { 0b00, opc }, asm, ZPR16, ZPR8>;
  3458. def _S : sve2_int_absdiff_accum<0b10, { 0b00, opc }, asm, ZPR32, ZPR16>;
  3459. def _D : sve2_int_absdiff_accum<0b11, { 0b00, opc }, asm, ZPR64, ZPR32>;
  3460. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _H)>;
  3461. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _S)>;
  3462. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _D)>;
  3463. }
  3464. multiclass sve2_int_addsub_long_carry<bits<2> opc, string asm,
  3465. SDPatternOperator op> {
  3466. def _S : sve2_int_absdiff_accum<{ opc{1}, 0b0 }, { 0b010, opc{0} }, asm,
  3467. ZPR32, ZPR32>;
  3468. def _D : sve2_int_absdiff_accum<{ opc{1}, 0b1 }, { 0b010, opc{0} }, asm,
  3469. ZPR64, ZPR64>;
  3470. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  3471. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  3472. }
  3473. //===----------------------------------------------------------------------===//
  3474. // SVE2 Narrowing Group
  3475. //===----------------------------------------------------------------------===//
  3476. class sve2_int_bin_shift_imm_narrow_bottom<bits<3> tsz8_64, bits<3> opc,
  3477. string asm, ZPRRegOp zprty1,
  3478. ZPRRegOp zprty2, Operand immtype>
  3479. : I<(outs zprty1:$Zd), (ins zprty2:$Zn, immtype:$imm),
  3480. asm, "\t$Zd, $Zn, $imm",
  3481. "", []>, Sched<[]> {
  3482. bits<5> Zd;
  3483. bits<5> Zn;
  3484. bits<5> imm;
  3485. let Inst{31-23} = 0b010001010;
  3486. let Inst{22} = tsz8_64{2};
  3487. let Inst{21} = 0b1;
  3488. let Inst{20-19} = tsz8_64{1-0};
  3489. let Inst{18-16} = imm{2-0}; // imm3
  3490. let Inst{15-14} = 0b00;
  3491. let Inst{13-11} = opc;
  3492. let Inst{10} = 0b0;
  3493. let Inst{9-5} = Zn;
  3494. let Inst{4-0} = Zd;
  3495. }
  3496. multiclass sve2_int_bin_shift_imm_right_narrow_bottom<bits<3> opc, string asm,
  3497. SDPatternOperator op> {
  3498. def _B : sve2_int_bin_shift_imm_narrow_bottom<{0,0,1}, opc, asm, ZPR8, ZPR16,
  3499. tvecshiftR8>;
  3500. def _H : sve2_int_bin_shift_imm_narrow_bottom<{0,1,?}, opc, asm, ZPR16, ZPR32,
  3501. tvecshiftR16> {
  3502. let Inst{19} = imm{3};
  3503. }
  3504. def _S : sve2_int_bin_shift_imm_narrow_bottom<{1,?,?}, opc, asm, ZPR32, ZPR64,
  3505. tvecshiftR32> {
  3506. let Inst{20-19} = imm{4-3};
  3507. }
  3508. def : SVE_2_Op_Imm_Pat<nxv16i8, op, nxv8i16, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
  3509. def : SVE_2_Op_Imm_Pat<nxv8i16, op, nxv4i32, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
  3510. def : SVE_2_Op_Imm_Pat<nxv4i32, op, nxv2i64, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
  3511. }
  3512. class sve2_int_bin_shift_imm_narrow_top<bits<3> tsz8_64, bits<3> opc,
  3513. string asm, ZPRRegOp zprty1,
  3514. ZPRRegOp zprty2, Operand immtype>
  3515. : I<(outs zprty1:$Zd), (ins zprty1:$_Zd, zprty2:$Zn, immtype:$imm),
  3516. asm, "\t$Zd, $Zn, $imm",
  3517. "", []>, Sched<[]> {
  3518. bits<5> Zd;
  3519. bits<5> Zn;
  3520. bits<5> imm;
  3521. let Inst{31-23} = 0b010001010;
  3522. let Inst{22} = tsz8_64{2};
  3523. let Inst{21} = 0b1;
  3524. let Inst{20-19} = tsz8_64{1-0};
  3525. let Inst{18-16} = imm{2-0}; // imm3
  3526. let Inst{15-14} = 0b00;
  3527. let Inst{13-11} = opc;
  3528. let Inst{10} = 0b1;
  3529. let Inst{9-5} = Zn;
  3530. let Inst{4-0} = Zd;
  3531. let Constraints = "$Zd = $_Zd";
  3532. }
  3533. multiclass sve2_int_bin_shift_imm_right_narrow_top<bits<3> opc, string asm,
  3534. SDPatternOperator op> {
  3535. def _B : sve2_int_bin_shift_imm_narrow_top<{0,0,1}, opc, asm, ZPR8, ZPR16,
  3536. tvecshiftR8>;
  3537. def _H : sve2_int_bin_shift_imm_narrow_top<{0,1,?}, opc, asm, ZPR16, ZPR32,
  3538. tvecshiftR16> {
  3539. let Inst{19} = imm{3};
  3540. }
  3541. def _S : sve2_int_bin_shift_imm_narrow_top<{1,?,?}, opc, asm, ZPR32, ZPR64,
  3542. tvecshiftR32> {
  3543. let Inst{20-19} = imm{4-3};
  3544. }
  3545. def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv8i16, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
  3546. def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv4i32, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
  3547. def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv2i64, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
  3548. }
  3549. class sve2_int_addsub_narrow_high_bottom<bits<2> sz, bits<2> opc, string asm,
  3550. ZPRRegOp zprty1, ZPRRegOp zprty2>
  3551. : I<(outs zprty1:$Zd), (ins zprty2:$Zn, zprty2:$Zm),
  3552. asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
  3553. bits<5> Zd;
  3554. bits<5> Zn;
  3555. bits<5> Zm;
  3556. let Inst{31-24} = 0b01000101;
  3557. let Inst{23-22} = sz;
  3558. let Inst{21} = 0b1;
  3559. let Inst{20-16} = Zm;
  3560. let Inst{15-13} = 0b011;
  3561. let Inst{12-11} = opc; // S, R
  3562. let Inst{10} = 0b0; // Top
  3563. let Inst{9-5} = Zn;
  3564. let Inst{4-0} = Zd;
  3565. }
  3566. multiclass sve2_int_addsub_narrow_high_bottom<bits<2> opc, string asm,
  3567. SDPatternOperator op> {
  3568. def _B : sve2_int_addsub_narrow_high_bottom<0b01, opc, asm, ZPR8, ZPR16>;
  3569. def _H : sve2_int_addsub_narrow_high_bottom<0b10, opc, asm, ZPR16, ZPR32>;
  3570. def _S : sve2_int_addsub_narrow_high_bottom<0b11, opc, asm, ZPR32, ZPR64>;
  3571. def : SVE_2_Op_Pat<nxv16i8, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _B)>;
  3572. def : SVE_2_Op_Pat<nxv8i16, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _H)>;
  3573. def : SVE_2_Op_Pat<nxv4i32, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _S)>;
  3574. }
  3575. class sve2_int_addsub_narrow_high_top<bits<2> sz, bits<2> opc, string asm,
  3576. ZPRRegOp zprty1, ZPRRegOp zprty2>
  3577. : I<(outs zprty1:$Zd), (ins zprty1:$_Zd, zprty2:$Zn, zprty2:$Zm),
  3578. asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
  3579. bits<5> Zd;
  3580. bits<5> Zn;
  3581. bits<5> Zm;
  3582. let Inst{31-24} = 0b01000101;
  3583. let Inst{23-22} = sz;
  3584. let Inst{21} = 0b1;
  3585. let Inst{20-16} = Zm;
  3586. let Inst{15-13} = 0b011;
  3587. let Inst{12-11} = opc; // S, R
  3588. let Inst{10} = 0b1; // Top
  3589. let Inst{9-5} = Zn;
  3590. let Inst{4-0} = Zd;
  3591. let Constraints = "$Zd = $_Zd";
  3592. }
  3593. multiclass sve2_int_addsub_narrow_high_top<bits<2> opc, string asm,
  3594. SDPatternOperator op> {
  3595. def _B : sve2_int_addsub_narrow_high_top<0b01, opc, asm, ZPR8, ZPR16>;
  3596. def _H : sve2_int_addsub_narrow_high_top<0b10, opc, asm, ZPR16, ZPR32>;
  3597. def _S : sve2_int_addsub_narrow_high_top<0b11, opc, asm, ZPR32, ZPR64>;
  3598. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _B)>;
  3599. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _H)>;
  3600. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _S)>;
  3601. }
  3602. class sve2_int_sat_extract_narrow_bottom<bits<3> tsz8_64, bits<2> opc, string asm,
  3603. ZPRRegOp zprty1, ZPRRegOp zprty2>
  3604. : I<(outs zprty1:$Zd), (ins zprty2:$Zn),
  3605. asm, "\t$Zd, $Zn", "", []>, Sched<[]> {
  3606. bits<5> Zd;
  3607. bits<5> Zn;
  3608. let Inst{31-23} = 0b010001010;
  3609. let Inst{22} = tsz8_64{2};
  3610. let Inst{21} = 0b1;
  3611. let Inst{20-19} = tsz8_64{1-0};
  3612. let Inst{18-13} = 0b000010;
  3613. let Inst{12-11} = opc;
  3614. let Inst{10} = 0b0;
  3615. let Inst{9-5} = Zn;
  3616. let Inst{4-0} = Zd;
  3617. }
  3618. multiclass sve2_int_sat_extract_narrow_bottom<bits<2> opc, string asm,
  3619. SDPatternOperator op> {
  3620. def _B : sve2_int_sat_extract_narrow_bottom<0b001, opc, asm, ZPR8, ZPR16>;
  3621. def _H : sve2_int_sat_extract_narrow_bottom<0b010, opc, asm, ZPR16, ZPR32>;
  3622. def _S : sve2_int_sat_extract_narrow_bottom<0b100, opc, asm, ZPR32, ZPR64>;
  3623. def : SVE_1_Op_Pat<nxv16i8, op, nxv8i16, !cast<Instruction>(NAME # _B)>;
  3624. def : SVE_1_Op_Pat<nxv8i16, op, nxv4i32, !cast<Instruction>(NAME # _H)>;
  3625. def : SVE_1_Op_Pat<nxv4i32, op, nxv2i64, !cast<Instruction>(NAME # _S)>;
  3626. }
  3627. class sve2_int_sat_extract_narrow_top<bits<3> tsz8_64, bits<2> opc, string asm,
  3628. ZPRRegOp zprty1, ZPRRegOp zprty2>
  3629. : I<(outs zprty1:$Zd), (ins zprty1:$_Zd, zprty2:$Zn),
  3630. asm, "\t$Zd, $Zn", "", []>, Sched<[]> {
  3631. bits<5> Zd;
  3632. bits<5> Zn;
  3633. let Inst{31-23} = 0b010001010;
  3634. let Inst{22} = tsz8_64{2};
  3635. let Inst{21} = 0b1;
  3636. let Inst{20-19} = tsz8_64{1-0};
  3637. let Inst{18-13} = 0b000010;
  3638. let Inst{12-11} = opc;
  3639. let Inst{10} = 0b1;
  3640. let Inst{9-5} = Zn;
  3641. let Inst{4-0} = Zd;
  3642. let Constraints = "$Zd = $_Zd";
  3643. }
  3644. multiclass sve2_int_sat_extract_narrow_top<bits<2> opc, string asm,
  3645. SDPatternOperator op> {
  3646. def _B : sve2_int_sat_extract_narrow_top<0b001, opc, asm, ZPR8, ZPR16>;
  3647. def _H : sve2_int_sat_extract_narrow_top<0b010, opc, asm, ZPR16, ZPR32>;
  3648. def _S : sve2_int_sat_extract_narrow_top<0b100, opc, asm, ZPR32, ZPR64>;
  3649. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv8i16, !cast<Instruction>(NAME # _B)>;
  3650. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv4i32, !cast<Instruction>(NAME # _H)>;
  3651. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
  3652. }
  3653. //===----------------------------------------------------------------------===//
  3654. // SVE Integer Arithmetic - Unary Predicated Group
  3655. //===----------------------------------------------------------------------===//
  3656. class sve_int_un_pred_arit<bits<2> sz8_64, bits<4> opc,
  3657. string asm, ZPRRegOp zprty>
  3658. : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, zprty:$Zn),
  3659. asm, "\t$Zd, $Pg/m, $Zn",
  3660. "",
  3661. []>, Sched<[]> {
  3662. bits<3> Pg;
  3663. bits<5> Zd;
  3664. bits<5> Zn;
  3665. let Inst{31-24} = 0b00000100;
  3666. let Inst{23-22} = sz8_64;
  3667. let Inst{21-20} = 0b01;
  3668. let Inst{19} = opc{0};
  3669. let Inst{18-16} = opc{3-1};
  3670. let Inst{15-13} = 0b101;
  3671. let Inst{12-10} = Pg;
  3672. let Inst{9-5} = Zn;
  3673. let Inst{4-0} = Zd;
  3674. let Constraints = "$Zd = $_Zd";
  3675. let DestructiveInstType = DestructiveUnaryPassthru;
  3676. let ElementSize = zprty.ElementSize;
  3677. }
  3678. multiclass sve_int_un_pred_arit_0<bits<3> opc, string asm,
  3679. SDPatternOperator op> {
  3680. def _B : sve_int_un_pred_arit<0b00, { opc, 0b0 }, asm, ZPR8>,
  3681. SVEPseudo2Instr<NAME # _B, 1>;
  3682. def _H : sve_int_un_pred_arit<0b01, { opc, 0b0 }, asm, ZPR16>,
  3683. SVEPseudo2Instr<NAME # _H, 1>;
  3684. def _S : sve_int_un_pred_arit<0b10, { opc, 0b0 }, asm, ZPR32>,
  3685. SVEPseudo2Instr<NAME # _S, 1>;
  3686. def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>,
  3687. SVEPseudo2Instr<NAME # _D, 1>;
  3688. def : SVE_1_Op_Passthru_Pat<nxv16i8, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
  3689. def : SVE_1_Op_Passthru_Pat<nxv8i16, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
  3690. def : SVE_1_Op_Passthru_Pat<nxv4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  3691. def : SVE_1_Op_Passthru_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  3692. def _UNDEF_B : PredOneOpPassthruPseudo<NAME # _B, ZPR8>;
  3693. def _UNDEF_H : PredOneOpPassthruPseudo<NAME # _H, ZPR16>;
  3694. def _UNDEF_S : PredOneOpPassthruPseudo<NAME # _S, ZPR32>;
  3695. def _UNDEF_D : PredOneOpPassthruPseudo<NAME # _D, ZPR64>;
  3696. defm : SVE_1_Op_PassthruUndef_Pat<nxv16i8, op, nxv16i1, nxv16i8, !cast<Pseudo>(NAME # _UNDEF_B)>;
  3697. defm : SVE_1_Op_PassthruUndef_Pat<nxv8i16, op, nxv8i1, nxv8i16, !cast<Pseudo>(NAME # _UNDEF_H)>;
  3698. defm : SVE_1_Op_PassthruUndef_Pat<nxv4i32, op, nxv4i1, nxv4i32, !cast<Pseudo>(NAME # _UNDEF_S)>;
  3699. defm : SVE_1_Op_PassthruUndef_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Pseudo>(NAME # _UNDEF_D)>;
  3700. }
  3701. multiclass sve_int_un_pred_arit_0_h<bits<3> opc, string asm,
  3702. SDPatternOperator op> {
  3703. def _H : sve_int_un_pred_arit<0b01, { opc, 0b0 }, asm, ZPR16>,
  3704. SVEPseudo2Instr<NAME # _H, 1>;
  3705. def _S : sve_int_un_pred_arit<0b10, { opc, 0b0 }, asm, ZPR32>,
  3706. SVEPseudo2Instr<NAME # _S, 1>;
  3707. def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>,
  3708. SVEPseudo2Instr<NAME # _D, 1>;
  3709. def : SVE_InReg_Extend<nxv8i16, op, nxv8i1, nxv8i8, !cast<Instruction>(NAME # _H)>;
  3710. def : SVE_InReg_Extend<nxv4i32, op, nxv4i1, nxv4i8, !cast<Instruction>(NAME # _S)>;
  3711. def : SVE_InReg_Extend<nxv2i64, op, nxv2i1, nxv2i8, !cast<Instruction>(NAME # _D)>;
  3712. def _UNDEF_H : PredOneOpPassthruPseudo<NAME # _H, ZPR16>;
  3713. def _UNDEF_S : PredOneOpPassthruPseudo<NAME # _S, ZPR32>;
  3714. def _UNDEF_D : PredOneOpPassthruPseudo<NAME # _D, ZPR64>;
  3715. defm : SVE_InReg_Extend_PassthruUndef<nxv8i16, op, nxv8i1, nxv8i8, !cast<Pseudo>(NAME # _UNDEF_H)>;
  3716. defm : SVE_InReg_Extend_PassthruUndef<nxv4i32, op, nxv4i1, nxv4i8, !cast<Pseudo>(NAME # _UNDEF_S)>;
  3717. defm : SVE_InReg_Extend_PassthruUndef<nxv2i64, op, nxv2i1, nxv2i8, !cast<Pseudo>(NAME # _UNDEF_D)>;
  3718. }
  3719. multiclass sve_int_un_pred_arit_0_w<bits<3> opc, string asm,
  3720. SDPatternOperator op> {
  3721. def _S : sve_int_un_pred_arit<0b10, { opc, 0b0 }, asm, ZPR32>,
  3722. SVEPseudo2Instr<NAME # _S, 1>;
  3723. def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>,
  3724. SVEPseudo2Instr<NAME # _D, 1>;
  3725. def : SVE_InReg_Extend<nxv4i32, op, nxv4i1, nxv4i16, !cast<Instruction>(NAME # _S)>;
  3726. def : SVE_InReg_Extend<nxv2i64, op, nxv2i1, nxv2i16, !cast<Instruction>(NAME # _D)>;
  3727. def _UNDEF_S : PredOneOpPassthruPseudo<NAME # _S, ZPR32>;
  3728. def _UNDEF_D : PredOneOpPassthruPseudo<NAME # _D, ZPR64>;
  3729. defm : SVE_InReg_Extend_PassthruUndef<nxv4i32, op, nxv4i1, nxv4i16, !cast<Pseudo>(NAME # _UNDEF_S)>;
  3730. defm : SVE_InReg_Extend_PassthruUndef<nxv2i64, op, nxv2i1, nxv2i16, !cast<Pseudo>(NAME # _UNDEF_D)>;
  3731. }
  3732. multiclass sve_int_un_pred_arit_0_d<bits<3> opc, string asm,
  3733. SDPatternOperator op> {
  3734. def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>,
  3735. SVEPseudo2Instr<NAME # _D, 1>;
  3736. def : SVE_InReg_Extend<nxv2i64, op, nxv2i1, nxv2i32, !cast<Instruction>(NAME # _D)>;
  3737. def _UNDEF_D : PredOneOpPassthruPseudo<NAME # _D, ZPR64>;
  3738. defm : SVE_InReg_Extend_PassthruUndef<nxv2i64, op, nxv2i1, nxv2i32, !cast<Pseudo>(NAME # _UNDEF_D)>;
  3739. }
  3740. multiclass sve_int_un_pred_arit_1<bits<3> opc, string asm,
  3741. SDPatternOperator op> {
  3742. def _B : sve_int_un_pred_arit<0b00, { opc, 0b1 }, asm, ZPR8>,
  3743. SVEPseudo2Instr<NAME # _B, 1>;
  3744. def _H : sve_int_un_pred_arit<0b01, { opc, 0b1 }, asm, ZPR16>,
  3745. SVEPseudo2Instr<NAME # _H, 1>;
  3746. def _S : sve_int_un_pred_arit<0b10, { opc, 0b1 }, asm, ZPR32>,
  3747. SVEPseudo2Instr<NAME # _S, 1>;
  3748. def _D : sve_int_un_pred_arit<0b11, { opc, 0b1 }, asm, ZPR64>,
  3749. SVEPseudo2Instr<NAME # _D, 1>;
  3750. def : SVE_1_Op_Passthru_Pat<nxv16i8, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
  3751. def : SVE_1_Op_Passthru_Pat<nxv8i16, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
  3752. def : SVE_1_Op_Passthru_Pat<nxv4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  3753. def : SVE_1_Op_Passthru_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  3754. def _UNDEF_B : PredOneOpPassthruPseudo<NAME # _B, ZPR8>;
  3755. def _UNDEF_H : PredOneOpPassthruPseudo<NAME # _H, ZPR16>;
  3756. def _UNDEF_S : PredOneOpPassthruPseudo<NAME # _S, ZPR32>;
  3757. def _UNDEF_D : PredOneOpPassthruPseudo<NAME # _D, ZPR64>;
  3758. defm : SVE_1_Op_PassthruUndef_Pat<nxv16i8, op, nxv16i1, nxv16i8, !cast<Pseudo>(NAME # _UNDEF_B)>;
  3759. defm : SVE_1_Op_PassthruUndef_Pat<nxv8i16, op, nxv8i1, nxv8i16, !cast<Pseudo>(NAME # _UNDEF_H)>;
  3760. defm : SVE_1_Op_PassthruUndef_Pat<nxv4i32, op, nxv4i1, nxv4i32, !cast<Pseudo>(NAME # _UNDEF_S)>;
  3761. defm : SVE_1_Op_PassthruUndef_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Pseudo>(NAME # _UNDEF_D)>;
  3762. }
  3763. multiclass sve_int_un_pred_arit_1_fp<bits<3> opc, string asm, SDPatternOperator op> {
  3764. def _H : sve_int_un_pred_arit<0b01, { opc, 0b1 }, asm, ZPR16>,
  3765. SVEPseudo2Instr<NAME # _H, 1>;
  3766. def _S : sve_int_un_pred_arit<0b10, { opc, 0b1 }, asm, ZPR32>,
  3767. SVEPseudo2Instr<NAME # _S, 1>;
  3768. def _D : sve_int_un_pred_arit<0b11, { opc, 0b1 }, asm, ZPR64>,
  3769. SVEPseudo2Instr<NAME # _D, 1>;
  3770. def : SVE_1_Op_Passthru_Pat<nxv8f16, op, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
  3771. def : SVE_1_Op_Passthru_Pat<nxv4f16, op, nxv4i1, nxv4f16, !cast<Instruction>(NAME # _H)>;
  3772. def : SVE_1_Op_Passthru_Pat<nxv2f16, op, nxv2i1, nxv2f16, !cast<Instruction>(NAME # _H)>;
  3773. def : SVE_1_Op_Passthru_Pat<nxv4f32, op, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
  3774. def : SVE_1_Op_Passthru_Pat<nxv2f32, op, nxv2i1, nxv2f32, !cast<Instruction>(NAME # _S)>;
  3775. def : SVE_1_Op_Passthru_Pat<nxv2f64, op, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
  3776. def _UNDEF_H : PredOneOpPassthruPseudo<NAME # _H, ZPR16>;
  3777. def _UNDEF_S : PredOneOpPassthruPseudo<NAME # _S, ZPR32>;
  3778. def _UNDEF_D : PredOneOpPassthruPseudo<NAME # _D, ZPR64>;
  3779. defm : SVE_1_Op_PassthruUndef_Pat<nxv8f16, op, nxv8i1, nxv8f16, !cast<Pseudo>(NAME # _UNDEF_H)>;
  3780. defm : SVE_1_Op_PassthruUndef_Pat<nxv4f16, op, nxv4i1, nxv4f16, !cast<Pseudo>(NAME # _UNDEF_H)>;
  3781. defm : SVE_1_Op_PassthruUndef_Pat<nxv2f16, op, nxv2i1, nxv2f16, !cast<Pseudo>(NAME # _UNDEF_H)>;
  3782. defm : SVE_1_Op_PassthruUndef_Pat<nxv4f32, op, nxv4i1, nxv4f32, !cast<Pseudo>(NAME # _UNDEF_S)>;
  3783. defm : SVE_1_Op_PassthruUndef_Pat<nxv2f32, op, nxv2i1, nxv2f32, !cast<Pseudo>(NAME # _UNDEF_S)>;
  3784. defm : SVE_1_Op_PassthruUndef_Pat<nxv2f64, op, nxv2i1, nxv2f64, !cast<Pseudo>(NAME # _UNDEF_D)>;
  3785. }
  3786. //===----------------------------------------------------------------------===//
  3787. // SVE Integer Wide Immediate - Unpredicated Group
  3788. //===----------------------------------------------------------------------===//
  3789. class sve_int_dup_imm<bits<2> sz8_64, string asm,
  3790. ZPRRegOp zprty, Operand immtype>
  3791. : I<(outs zprty:$Zd), (ins immtype:$imm),
  3792. asm, "\t$Zd, $imm",
  3793. "",
  3794. []>, Sched<[]> {
  3795. bits<5> Zd;
  3796. bits<9> imm;
  3797. let Inst{31-24} = 0b00100101;
  3798. let Inst{23-22} = sz8_64;
  3799. let Inst{21-14} = 0b11100011;
  3800. let Inst{13} = imm{8}; // sh
  3801. let Inst{12-5} = imm{7-0}; // imm8
  3802. let Inst{4-0} = Zd;
  3803. let isReMaterializable = 1;
  3804. }
  3805. multiclass sve_int_dup_imm<string asm> {
  3806. def _B : sve_int_dup_imm<0b00, asm, ZPR8, cpy_imm8_opt_lsl_i8>;
  3807. def _H : sve_int_dup_imm<0b01, asm, ZPR16, cpy_imm8_opt_lsl_i16>;
  3808. def _S : sve_int_dup_imm<0b10, asm, ZPR32, cpy_imm8_opt_lsl_i32>;
  3809. def _D : sve_int_dup_imm<0b11, asm, ZPR64, cpy_imm8_opt_lsl_i64>;
  3810. def : InstAlias<"mov $Zd, $imm",
  3811. (!cast<Instruction>(NAME # _B) ZPR8:$Zd, cpy_imm8_opt_lsl_i8:$imm), 1>;
  3812. def : InstAlias<"mov $Zd, $imm",
  3813. (!cast<Instruction>(NAME # _H) ZPR16:$Zd, cpy_imm8_opt_lsl_i16:$imm), 1>;
  3814. def : InstAlias<"mov $Zd, $imm",
  3815. (!cast<Instruction>(NAME # _S) ZPR32:$Zd, cpy_imm8_opt_lsl_i32:$imm), 1>;
  3816. def : InstAlias<"mov $Zd, $imm",
  3817. (!cast<Instruction>(NAME # _D) ZPR64:$Zd, cpy_imm8_opt_lsl_i64:$imm), 1>;
  3818. def : InstAlias<"fmov $Zd, #0.0",
  3819. (!cast<Instruction>(NAME # _H) ZPR16:$Zd, 0, 0), 1>;
  3820. def : InstAlias<"fmov $Zd, #0.0",
  3821. (!cast<Instruction>(NAME # _S) ZPR32:$Zd, 0, 0), 1>;
  3822. def : InstAlias<"fmov $Zd, #0.0",
  3823. (!cast<Instruction>(NAME # _D) ZPR64:$Zd, 0, 0), 1>;
  3824. }
  3825. class sve_int_dup_fpimm<bits<2> sz8_64, Operand fpimmtype,
  3826. string asm, ZPRRegOp zprty>
  3827. : I<(outs zprty:$Zd), (ins fpimmtype:$imm8),
  3828. asm, "\t$Zd, $imm8",
  3829. "",
  3830. []>, Sched<[]> {
  3831. bits<5> Zd;
  3832. bits<8> imm8;
  3833. let Inst{31-24} = 0b00100101;
  3834. let Inst{23-22} = sz8_64;
  3835. let Inst{21-14} = 0b11100111;
  3836. let Inst{13} = 0b0;
  3837. let Inst{12-5} = imm8;
  3838. let Inst{4-0} = Zd;
  3839. let isReMaterializable = 1;
  3840. }
  3841. multiclass sve_int_dup_fpimm<string asm> {
  3842. def _H : sve_int_dup_fpimm<0b01, fpimm16, asm, ZPR16>;
  3843. def _S : sve_int_dup_fpimm<0b10, fpimm32, asm, ZPR32>;
  3844. def _D : sve_int_dup_fpimm<0b11, fpimm64, asm, ZPR64>;
  3845. def : InstAlias<"fmov $Zd, $imm8",
  3846. (!cast<Instruction>(NAME # _H) ZPR16:$Zd, fpimm16:$imm8), 1>;
  3847. def : InstAlias<"fmov $Zd, $imm8",
  3848. (!cast<Instruction>(NAME # _S) ZPR32:$Zd, fpimm32:$imm8), 1>;
  3849. def : InstAlias<"fmov $Zd, $imm8",
  3850. (!cast<Instruction>(NAME # _D) ZPR64:$Zd, fpimm64:$imm8), 1>;
  3851. }
  3852. class sve_int_arith_imm0<bits<2> sz8_64, bits<3> opc, string asm,
  3853. ZPRRegOp zprty, Operand immtype>
  3854. : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, immtype:$imm),
  3855. asm, "\t$Zdn, $_Zdn, $imm",
  3856. "",
  3857. []>, Sched<[]> {
  3858. bits<5> Zdn;
  3859. bits<9> imm;
  3860. let Inst{31-24} = 0b00100101;
  3861. let Inst{23-22} = sz8_64;
  3862. let Inst{21-19} = 0b100;
  3863. let Inst{18-16} = opc;
  3864. let Inst{15-14} = 0b11;
  3865. let Inst{13} = imm{8}; // sh
  3866. let Inst{12-5} = imm{7-0}; // imm8
  3867. let Inst{4-0} = Zdn;
  3868. let Constraints = "$Zdn = $_Zdn";
  3869. let DestructiveInstType = DestructiveOther;
  3870. let ElementSize = ElementSizeNone;
  3871. }
  3872. multiclass sve_int_arith_imm0<bits<3> opc, string asm, SDPatternOperator op> {
  3873. def _B : sve_int_arith_imm0<0b00, opc, asm, ZPR8, addsub_imm8_opt_lsl_i8>;
  3874. def _H : sve_int_arith_imm0<0b01, opc, asm, ZPR16, addsub_imm8_opt_lsl_i16>;
  3875. def _S : sve_int_arith_imm0<0b10, opc, asm, ZPR32, addsub_imm8_opt_lsl_i32>;
  3876. def _D : sve_int_arith_imm0<0b11, opc, asm, ZPR64, addsub_imm8_opt_lsl_i64>;
  3877. def : SVE_1_Op_Imm_OptLsl_Pat<nxv16i8, op, ZPR8, i32, SVEAddSubImm8Pat, !cast<Instruction>(NAME # _B)>;
  3878. def : SVE_1_Op_Imm_OptLsl_Pat<nxv8i16, op, ZPR16, i32, SVEAddSubImm16Pat, !cast<Instruction>(NAME # _H)>;
  3879. def : SVE_1_Op_Imm_OptLsl_Pat<nxv4i32, op, ZPR32, i32, SVEAddSubImm32Pat, !cast<Instruction>(NAME # _S)>;
  3880. def : SVE_1_Op_Imm_OptLsl_Pat<nxv2i64, op, ZPR64, i64, SVEAddSubImm64Pat, !cast<Instruction>(NAME # _D)>;
  3881. }
  3882. class sve_int_arith_imm<bits<2> sz8_64, bits<6> opc, string asm,
  3883. ZPRRegOp zprty, Operand immtype>
  3884. : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, immtype:$imm),
  3885. asm, "\t$Zdn, $_Zdn, $imm",
  3886. "",
  3887. []>, Sched<[]> {
  3888. bits<5> Zdn;
  3889. bits<8> imm;
  3890. let Inst{31-24} = 0b00100101;
  3891. let Inst{23-22} = sz8_64;
  3892. let Inst{21-16} = opc;
  3893. let Inst{15-13} = 0b110;
  3894. let Inst{12-5} = imm;
  3895. let Inst{4-0} = Zdn;
  3896. let Constraints = "$Zdn = $_Zdn";
  3897. let DestructiveInstType = DestructiveOther;
  3898. let ElementSize = ElementSizeNone;
  3899. }
  3900. multiclass sve_int_arith_imm1<bits<2> opc, string asm, SDPatternOperator op> {
  3901. def _B : sve_int_arith_imm<0b00, { 0b1010, opc }, asm, ZPR8, simm8_32b>;
  3902. def _H : sve_int_arith_imm<0b01, { 0b1010, opc }, asm, ZPR16, simm8_32b>;
  3903. def _S : sve_int_arith_imm<0b10, { 0b1010, opc }, asm, ZPR32, simm8_32b>;
  3904. def _D : sve_int_arith_imm<0b11, { 0b1010, opc }, asm, ZPR64, simm8_32b>;
  3905. def : SVE_1_Op_Imm_Arith_All_Active<nxv16i8, nxv16i1, op, ZPR8, i32, SVEArithSImmPat32, !cast<Instruction>(NAME # _B)>;
  3906. def : SVE_1_Op_Imm_Arith_All_Active<nxv8i16, nxv8i1, op, ZPR16, i32, SVEArithSImmPat32, !cast<Instruction>(NAME # _H)>;
  3907. def : SVE_1_Op_Imm_Arith_All_Active<nxv4i32, nxv4i1, op, ZPR32, i32, SVEArithSImmPat32, !cast<Instruction>(NAME # _S)>;
  3908. def : SVE_1_Op_Imm_Arith_All_Active<nxv2i64, nxv2i1, op, ZPR64, i64, SVEArithSImmPat64, !cast<Instruction>(NAME # _D)>;
  3909. }
  3910. multiclass sve_int_arith_imm1_unsigned<bits<2> opc, string asm, SDPatternOperator op> {
  3911. def _B : sve_int_arith_imm<0b00, { 0b1010, opc }, asm, ZPR8, imm0_255>;
  3912. def _H : sve_int_arith_imm<0b01, { 0b1010, opc }, asm, ZPR16, imm0_255>;
  3913. def _S : sve_int_arith_imm<0b10, { 0b1010, opc }, asm, ZPR32, imm0_255>;
  3914. def _D : sve_int_arith_imm<0b11, { 0b1010, opc }, asm, ZPR64, imm0_255>;
  3915. def : SVE_1_Op_Imm_Arith_All_Active<nxv16i8, nxv16i1, op, ZPR8, i32, SVEArithUImm8Pat, !cast<Instruction>(NAME # _B)>;
  3916. def : SVE_1_Op_Imm_Arith_All_Active<nxv8i16, nxv8i1, op, ZPR16, i32, SVEArithUImm16Pat, !cast<Instruction>(NAME # _H)>;
  3917. def : SVE_1_Op_Imm_Arith_All_Active<nxv4i32, nxv4i1, op, ZPR32, i32, SVEArithUImm32Pat, !cast<Instruction>(NAME # _S)>;
  3918. def : SVE_1_Op_Imm_Arith_All_Active<nxv2i64, nxv2i1, op, ZPR64, i64, SVEArithUImm64Pat, !cast<Instruction>(NAME # _D)>;
  3919. }
  3920. multiclass sve_int_arith_imm2<string asm, SDPatternOperator op> {
  3921. def _B : sve_int_arith_imm<0b00, 0b110000, asm, ZPR8, simm8_32b>;
  3922. def _H : sve_int_arith_imm<0b01, 0b110000, asm, ZPR16, simm8_32b>;
  3923. def _S : sve_int_arith_imm<0b10, 0b110000, asm, ZPR32, simm8_32b>;
  3924. def _D : sve_int_arith_imm<0b11, 0b110000, asm, ZPR64, simm8_32b>;
  3925. def : SVE_1_Op_Imm_Arith_All_Active<nxv16i8, nxv16i1, op, ZPR8, i32, SVEArithSImmPat32, !cast<Instruction>(NAME # _B)>;
  3926. def : SVE_1_Op_Imm_Arith_All_Active<nxv8i16, nxv8i1, op, ZPR16, i32, SVEArithSImmPat32, !cast<Instruction>(NAME # _H)>;
  3927. def : SVE_1_Op_Imm_Arith_All_Active<nxv4i32, nxv4i1, op, ZPR32, i32, SVEArithSImmPat32, !cast<Instruction>(NAME # _S)>;
  3928. def : SVE_1_Op_Imm_Arith_All_Active<nxv2i64, nxv2i1, op, ZPR64, i64, SVEArithSImmPat64, !cast<Instruction>(NAME # _D)>;
  3929. }
  3930. //===----------------------------------------------------------------------===//
  3931. // SVE Bitwise Logical - Unpredicated Group
  3932. //===----------------------------------------------------------------------===//
  3933. class sve_int_bin_cons_log<bits<2> opc, string asm>
  3934. : I<(outs ZPR64:$Zd), (ins ZPR64:$Zn, ZPR64:$Zm),
  3935. asm, "\t$Zd, $Zn, $Zm",
  3936. "",
  3937. []>, Sched<[]> {
  3938. bits<5> Zd;
  3939. bits<5> Zm;
  3940. bits<5> Zn;
  3941. let Inst{31-24} = 0b00000100;
  3942. let Inst{23-22} = opc{1-0};
  3943. let Inst{21} = 0b1;
  3944. let Inst{20-16} = Zm;
  3945. let Inst{15-10} = 0b001100;
  3946. let Inst{9-5} = Zn;
  3947. let Inst{4-0} = Zd;
  3948. }
  3949. multiclass sve_int_bin_cons_log<bits<2> opc, string asm, SDPatternOperator op> {
  3950. def NAME : sve_int_bin_cons_log<opc, asm>;
  3951. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
  3952. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME)>;
  3953. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME)>;
  3954. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME)>;
  3955. def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
  3956. (!cast<Instruction>(NAME) ZPR8:$Zd, ZPR8:$Zn, ZPR8:$Zm), 1>;
  3957. def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
  3958. (!cast<Instruction>(NAME) ZPR16:$Zd, ZPR16:$Zn, ZPR16:$Zm), 1>;
  3959. def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
  3960. (!cast<Instruction>(NAME) ZPR32:$Zd, ZPR32:$Zn, ZPR32:$Zm), 1>;
  3961. }
  3962. class sve2_int_bitwise_ternary_op_d<bits<3> opc, string asm>
  3963. : I<(outs ZPR64:$Zdn), (ins ZPR64:$_Zdn, ZPR64:$Zm, ZPR64:$Zk),
  3964. asm, "\t$Zdn, $_Zdn, $Zm, $Zk",
  3965. "",
  3966. []>, Sched<[]> {
  3967. bits<5> Zdn;
  3968. bits<5> Zk;
  3969. bits<5> Zm;
  3970. let Inst{31-24} = 0b00000100;
  3971. let Inst{23-22} = opc{2-1};
  3972. let Inst{21} = 0b1;
  3973. let Inst{20-16} = Zm;
  3974. let Inst{15-11} = 0b00111;
  3975. let Inst{10} = opc{0};
  3976. let Inst{9-5} = Zk;
  3977. let Inst{4-0} = Zdn;
  3978. let Constraints = "$Zdn = $_Zdn";
  3979. let DestructiveInstType = DestructiveOther;
  3980. let ElementSize = ElementSizeNone;
  3981. }
  3982. multiclass sve2_int_bitwise_ternary_op<bits<3> opc, string asm, SDPatternOperator op,
  3983. SDPatternOperator ir_op = null_frag> {
  3984. def NAME : sve2_int_bitwise_ternary_op_d<opc, asm>;
  3985. def : InstAlias<asm # "\t$Zdn, $Zdn, $Zm, $Zk",
  3986. (!cast<Instruction>(NAME) ZPR8:$Zdn, ZPR8:$Zm, ZPR8:$Zk), 1>;
  3987. def : InstAlias<asm # "\t$Zdn, $Zdn, $Zm, $Zk",
  3988. (!cast<Instruction>(NAME) ZPR16:$Zdn, ZPR16:$Zm, ZPR16:$Zk), 1>;
  3989. def : InstAlias<asm # "\t$Zdn, $Zdn, $Zm, $Zk",
  3990. (!cast<Instruction>(NAME) ZPR32:$Zdn, ZPR32:$Zm, ZPR32:$Zk), 1>;
  3991. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
  3992. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME)>;
  3993. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME)>;
  3994. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME)>;
  3995. def : SVE_3_Op_BSP_Pat<nxv16i8, ir_op, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
  3996. def : SVE_3_Op_BSP_Pat<nxv8i16, ir_op, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME)>;
  3997. def : SVE_3_Op_BSP_Pat<nxv4i32, ir_op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME)>;
  3998. def : SVE_3_Op_BSP_Pat<nxv2i64, ir_op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME)>;
  3999. }
  4000. class sve2_int_rotate_right_imm<bits<4> tsz8_64, string asm,
  4001. ZPRRegOp zprty, Operand immtype>
  4002. : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm, immtype:$imm),
  4003. asm, "\t$Zdn, $_Zdn, $Zm, $imm",
  4004. "",
  4005. []>, Sched<[]> {
  4006. bits<5> Zdn;
  4007. bits<5> Zm;
  4008. bits<6> imm;
  4009. let Inst{31-24} = 0b00000100;
  4010. let Inst{23-22} = tsz8_64{3-2};
  4011. let Inst{21} = 0b1;
  4012. let Inst{20-19} = tsz8_64{1-0};
  4013. let Inst{18-16} = imm{2-0}; // imm3
  4014. let Inst{15-10} = 0b001101;
  4015. let Inst{9-5} = Zm;
  4016. let Inst{4-0} = Zdn;
  4017. let Constraints = "$Zdn = $_Zdn";
  4018. let DestructiveInstType = DestructiveOther;
  4019. let ElementSize = ElementSizeNone;
  4020. }
  4021. multiclass sve2_int_rotate_right_imm<string asm, SDPatternOperator op> {
  4022. def _B : sve2_int_rotate_right_imm<{0,0,0,1}, asm, ZPR8, vecshiftR8>;
  4023. def _H : sve2_int_rotate_right_imm<{0,0,1,?}, asm, ZPR16, vecshiftR16> {
  4024. let Inst{19} = imm{3};
  4025. }
  4026. def _S : sve2_int_rotate_right_imm<{0,1,?,?}, asm, ZPR32, vecshiftR32> {
  4027. let Inst{20-19} = imm{4-3};
  4028. }
  4029. def _D : sve2_int_rotate_right_imm<{1,?,?,?}, asm, ZPR64, vecshiftR64> {
  4030. let Inst{22} = imm{5};
  4031. let Inst{20-19} = imm{4-3};
  4032. }
  4033. def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
  4034. def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
  4035. def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
  4036. def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, tvecshiftR64, !cast<Instruction>(NAME # _D)>;
  4037. }
  4038. //===----------------------------------------------------------------------===//
  4039. // SVE Integer Wide Immediate - Predicated Group
  4040. //===----------------------------------------------------------------------===//
  4041. class sve_int_dup_fpimm_pred<bits<2> sz, Operand fpimmtype,
  4042. string asm, ZPRRegOp zprty>
  4043. : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPRAny:$Pg, fpimmtype:$imm8),
  4044. asm, "\t$Zd, $Pg/m, $imm8",
  4045. "",
  4046. []>, Sched<[]> {
  4047. bits<4> Pg;
  4048. bits<5> Zd;
  4049. bits<8> imm8;
  4050. let Inst{31-24} = 0b00000101;
  4051. let Inst{23-22} = sz;
  4052. let Inst{21-20} = 0b01;
  4053. let Inst{19-16} = Pg;
  4054. let Inst{15-13} = 0b110;
  4055. let Inst{12-5} = imm8;
  4056. let Inst{4-0} = Zd;
  4057. let Constraints = "$Zd = $_Zd";
  4058. let DestructiveInstType = DestructiveOther;
  4059. let ElementSize = zprty.ElementSize;
  4060. }
  4061. multiclass sve_int_dup_fpimm_pred<string asm> {
  4062. def _H : sve_int_dup_fpimm_pred<0b01, fpimm16, asm, ZPR16>;
  4063. def _S : sve_int_dup_fpimm_pred<0b10, fpimm32, asm, ZPR32>;
  4064. def _D : sve_int_dup_fpimm_pred<0b11, fpimm64, asm, ZPR64>;
  4065. def : InstAlias<"fmov $Zd, $Pg/m, $imm8",
  4066. (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, fpimm16:$imm8), 1>;
  4067. def : InstAlias<"fmov $Zd, $Pg/m, $imm8",
  4068. (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, fpimm32:$imm8), 1>;
  4069. def : InstAlias<"fmov $Zd, $Pg/m, $imm8",
  4070. (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, fpimm64:$imm8), 1>;
  4071. }
  4072. class sve_int_dup_imm_pred<bits<2> sz8_64, bit m, string asm,
  4073. ZPRRegOp zprty, string pred_qual, dag iops>
  4074. : I<(outs zprty:$Zd), iops,
  4075. asm, "\t$Zd, $Pg"#pred_qual#", $imm",
  4076. "", []>, Sched<[]> {
  4077. bits<5> Zd;
  4078. bits<4> Pg;
  4079. bits<9> imm;
  4080. let Inst{31-24} = 0b00000101;
  4081. let Inst{23-22} = sz8_64;
  4082. let Inst{21-20} = 0b01;
  4083. let Inst{19-16} = Pg;
  4084. let Inst{15} = 0b0;
  4085. let Inst{14} = m;
  4086. let Inst{13} = imm{8}; // sh
  4087. let Inst{12-5} = imm{7-0}; // imm8
  4088. let Inst{4-0} = Zd;
  4089. let DestructiveInstType = DestructiveOther;
  4090. let ElementSize = zprty.ElementSize;
  4091. }
  4092. multiclass sve_int_dup_imm_pred_merge_inst<
  4093. bits<2> sz8_64, string asm, ZPRRegOp zprty, imm8_opt_lsl cpyimm,
  4094. ValueType intty, ValueType predty, ValueType scalarty, ComplexPattern cpx> {
  4095. let Constraints = "$Zd = $_Zd" in
  4096. def NAME : sve_int_dup_imm_pred<sz8_64, 1, asm, zprty, "/m",
  4097. (ins zprty:$_Zd, PPRAny:$Pg, cpyimm:$imm)>;
  4098. def : InstAlias<"mov $Zd, $Pg/m, $imm",
  4099. (!cast<Instruction>(NAME) zprty:$Zd, PPRAny:$Pg, cpyimm:$imm), 1>;
  4100. def : Pat<(vselect predty:$Pg,
  4101. (intty (splat_vector (scalarty (cpx i32:$imm, i32:$shift)))),
  4102. ZPR:$Zd),
  4103. (!cast<Instruction>(NAME) $Zd, $Pg, $imm, $shift)>;
  4104. }
  4105. multiclass sve_int_dup_imm_pred_merge<string asm> {
  4106. defm _B : sve_int_dup_imm_pred_merge_inst<0b00, asm, ZPR8, cpy_imm8_opt_lsl_i8,
  4107. nxv16i8, nxv16i1, i32, SVECpyDupImm8Pat>;
  4108. defm _H : sve_int_dup_imm_pred_merge_inst<0b01, asm, ZPR16, cpy_imm8_opt_lsl_i16,
  4109. nxv8i16, nxv8i1, i32, SVECpyDupImm16Pat>;
  4110. defm _S : sve_int_dup_imm_pred_merge_inst<0b10, asm, ZPR32, cpy_imm8_opt_lsl_i32,
  4111. nxv4i32, nxv4i1, i32, SVECpyDupImm32Pat>;
  4112. defm _D : sve_int_dup_imm_pred_merge_inst<0b11, asm, ZPR64, cpy_imm8_opt_lsl_i64,
  4113. nxv2i64, nxv2i1, i64, SVECpyDupImm64Pat>;
  4114. def : InstAlias<"fmov $Zd, $Pg/m, #0.0",
  4115. (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, 0, 0), 0>;
  4116. def : InstAlias<"fmov $Zd, $Pg/m, #0.0",
  4117. (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, 0, 0), 0>;
  4118. def : InstAlias<"fmov $Zd, $Pg/m, #0.0",
  4119. (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, 0, 0), 0>;
  4120. def : Pat<(vselect PPRAny:$Pg, (SVEDup0), (nxv8f16 ZPR:$Zd)),
  4121. (!cast<Instruction>(NAME # _H) $Zd, $Pg, 0, 0)>;
  4122. def : Pat<(vselect PPRAny:$Pg, (SVEDup0), (nxv4f16 ZPR:$Zd)),
  4123. (!cast<Instruction>(NAME # _S) $Zd, $Pg, 0, 0)>;
  4124. def : Pat<(vselect PPRAny:$Pg, (SVEDup0), (nxv2f16 ZPR:$Zd)),
  4125. (!cast<Instruction>(NAME # _D) $Zd, $Pg, 0, 0)>;
  4126. def : Pat<(vselect PPRAny:$Pg, (SVEDup0), (nxv4f32 ZPR:$Zd)),
  4127. (!cast<Instruction>(NAME # _S) $Zd, $Pg, 0, 0)>;
  4128. def : Pat<(vselect PPRAny:$Pg, (SVEDup0), (nxv2f32 ZPR:$Zd)),
  4129. (!cast<Instruction>(NAME # _D) $Zd, $Pg, 0, 0)>;
  4130. def : Pat<(vselect PPRAny:$Pg, (SVEDup0), (nxv2f64 ZPR:$Zd)),
  4131. (!cast<Instruction>(NAME # _D) $Zd, $Pg, 0, 0)>;
  4132. }
  4133. multiclass sve_int_dup_imm_pred_zero_inst<
  4134. bits<2> sz8_64, string asm, ZPRRegOp zprty, imm8_opt_lsl cpyimm,
  4135. ValueType intty, ValueType predty, ValueType scalarty, ComplexPattern cpx> {
  4136. def NAME : sve_int_dup_imm_pred<sz8_64, 0, asm, zprty, "/z",
  4137. (ins PPRAny:$Pg, cpyimm:$imm)>;
  4138. def : InstAlias<"mov $Zd, $Pg/z, $imm",
  4139. (!cast<Instruction>(NAME) zprty:$Zd, PPRAny:$Pg, cpyimm:$imm), 1>;
  4140. def : Pat<(intty (zext (predty PPRAny:$Ps1))),
  4141. (!cast<Instruction>(NAME) PPRAny:$Ps1, 1, 0)>;
  4142. def : Pat<(intty (sext (predty PPRAny:$Ps1))),
  4143. (!cast<Instruction>(NAME) PPRAny:$Ps1, -1, 0)>;
  4144. def : Pat<(intty (anyext (predty PPRAny:$Ps1))),
  4145. (!cast<Instruction>(NAME) PPRAny:$Ps1, 1, 0)>;
  4146. def : Pat<(vselect predty:$Pg,
  4147. (intty (splat_vector (scalarty (cpx i32:$imm, i32:$shift)))),
  4148. (intty (splat_vector (scalarty 0)))),
  4149. (!cast<Instruction>(NAME) $Pg, $imm, $shift)>;
  4150. }
  4151. multiclass sve_int_dup_imm_pred_zero<string asm> {
  4152. defm _B : sve_int_dup_imm_pred_zero_inst<0b00, asm, ZPR8, cpy_imm8_opt_lsl_i8,
  4153. nxv16i8, nxv16i1, i32, SVECpyDupImm8Pat>;
  4154. defm _H : sve_int_dup_imm_pred_zero_inst<0b01, asm, ZPR16, cpy_imm8_opt_lsl_i16,
  4155. nxv8i16, nxv8i1, i32, SVECpyDupImm16Pat>;
  4156. defm _S : sve_int_dup_imm_pred_zero_inst<0b10, asm, ZPR32, cpy_imm8_opt_lsl_i32,
  4157. nxv4i32, nxv4i1, i32, SVECpyDupImm32Pat>;
  4158. defm _D : sve_int_dup_imm_pred_zero_inst<0b11, asm, ZPR64, cpy_imm8_opt_lsl_i64,
  4159. nxv2i64, nxv2i1, i64, SVECpyDupImm64Pat>;
  4160. }
  4161. //===----------------------------------------------------------------------===//
  4162. // SVE Integer Compare - Vectors Group
  4163. //===----------------------------------------------------------------------===//
  4164. class sve_int_cmp<bit cmp_1, bits<2> sz8_64, bits<3> opc, string asm,
  4165. PPRRegOp pprty, ZPRRegOp zprty1, ZPRRegOp zprty2>
  4166. : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty1:$Zn, zprty2:$Zm),
  4167. asm, "\t$Pd, $Pg/z, $Zn, $Zm",
  4168. "",
  4169. []>, Sched<[]> {
  4170. bits<4> Pd;
  4171. bits<3> Pg;
  4172. bits<5> Zm;
  4173. bits<5> Zn;
  4174. let Inst{31-24} = 0b00100100;
  4175. let Inst{23-22} = sz8_64;
  4176. let Inst{21} = 0b0;
  4177. let Inst{20-16} = Zm;
  4178. let Inst{15} = opc{2};
  4179. let Inst{14} = cmp_1;
  4180. let Inst{13} = opc{1};
  4181. let Inst{12-10} = Pg;
  4182. let Inst{9-5} = Zn;
  4183. let Inst{4} = opc{0};
  4184. let Inst{3-0} = Pd;
  4185. let Defs = [NZCV];
  4186. let ElementSize = pprty.ElementSize;
  4187. let isPTestLike = 1;
  4188. }
  4189. multiclass SVE_SETCC_Pat<CondCode cc, CondCode invcc, ValueType predvt,
  4190. ValueType intvt, Instruction cmp> {
  4191. def : Pat<(predvt (AArch64setcc_z predvt:$Op1, intvt:$Op2, intvt:$Op3, cc)),
  4192. (cmp $Op1, $Op2, $Op3)>;
  4193. def : Pat<(predvt (AArch64setcc_z predvt:$Op1, intvt:$Op2, intvt:$Op3, invcc)),
  4194. (cmp $Op1, $Op3, $Op2)>;
  4195. def : Pat<(predvt (and predvt:$Pg, (AArch64setcc_z (predvt (AArch64ptrue 31)), intvt:$Op2, intvt:$Op3, cc))),
  4196. (cmp $Pg, $Op2, $Op3)>;
  4197. def : Pat<(predvt (and predvt:$Pg, (AArch64setcc_z (predvt (AArch64ptrue 31)), intvt:$Op2, intvt:$Op3, invcc))),
  4198. (cmp $Pg, $Op3, $Op2)>;
  4199. }
  4200. multiclass SVE_SETCC_Pat_With_Zero<CondCode cc, CondCode invcc, ValueType predvt,
  4201. ValueType intvt, Instruction cmp> {
  4202. def : Pat<(predvt (AArch64setcc_z predvt:$Op1, intvt:$Op2, (SVEDup0), cc)),
  4203. (cmp $Op1, $Op2)>;
  4204. def : Pat<(predvt (AArch64setcc_z predvt:$Op1, (SVEDup0), intvt:$Op2, invcc)),
  4205. (cmp $Op1, $Op2)>;
  4206. def : Pat<(predvt (and predvt:$Pg, (AArch64setcc_z (predvt (AArch64ptrue 31)), intvt:$Op1, (SVEDup0), cc))),
  4207. (cmp $Pg, $Op1)>;
  4208. def : Pat<(predvt (and predvt:$Pg, (AArch64setcc_z (predvt (AArch64ptrue 31)), (SVEDup0), intvt:$Op1, invcc))),
  4209. (cmp $Pg, $Op1)>;
  4210. }
  4211. multiclass sve_int_cmp_0<bits<3> opc, string asm, CondCode cc, CondCode invcc> {
  4212. def _B : sve_int_cmp<0b0, 0b00, opc, asm, PPR8, ZPR8, ZPR8>;
  4213. def _H : sve_int_cmp<0b0, 0b01, opc, asm, PPR16, ZPR16, ZPR16>;
  4214. def _S : sve_int_cmp<0b0, 0b10, opc, asm, PPR32, ZPR32, ZPR32>;
  4215. def _D : sve_int_cmp<0b0, 0b11, opc, asm, PPR64, ZPR64, ZPR64>;
  4216. defm : SVE_SETCC_Pat<cc, invcc, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
  4217. defm : SVE_SETCC_Pat<cc, invcc, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
  4218. defm : SVE_SETCC_Pat<cc, invcc, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  4219. defm : SVE_SETCC_Pat<cc, invcc, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  4220. }
  4221. multiclass sve_int_cmp_0_wide<bits<3> opc, string asm, SDPatternOperator op> {
  4222. def _B : sve_int_cmp<0b0, 0b00, opc, asm, PPR8, ZPR8, ZPR64>;
  4223. def _H : sve_int_cmp<0b0, 0b01, opc, asm, PPR16, ZPR16, ZPR64>;
  4224. def _S : sve_int_cmp<0b0, 0b10, opc, asm, PPR32, ZPR32, ZPR64>;
  4225. def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i8, nxv2i64, !cast<Instruction>(NAME # _B)>;
  4226. def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8i16, nxv2i64, !cast<Instruction>(NAME # _H)>;
  4227. def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
  4228. }
  4229. multiclass sve_int_cmp_1_wide<bits<3> opc, string asm, SDPatternOperator op> {
  4230. def _B : sve_int_cmp<0b1, 0b00, opc, asm, PPR8, ZPR8, ZPR64>;
  4231. def _H : sve_int_cmp<0b1, 0b01, opc, asm, PPR16, ZPR16, ZPR64>;
  4232. def _S : sve_int_cmp<0b1, 0b10, opc, asm, PPR32, ZPR32, ZPR64>;
  4233. def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i8, nxv2i64, !cast<Instruction>(NAME # _B)>;
  4234. def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8i16, nxv2i64, !cast<Instruction>(NAME # _H)>;
  4235. def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
  4236. }
  4237. //===----------------------------------------------------------------------===//
  4238. // SVE Integer Compare - Signed Immediate Group
  4239. //===----------------------------------------------------------------------===//
  4240. class sve_int_scmp_vi<bits<2> sz8_64, bits<3> opc, string asm, PPRRegOp pprty,
  4241. ZPRRegOp zprty,
  4242. Operand immtype>
  4243. : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, immtype:$imm5),
  4244. asm, "\t$Pd, $Pg/z, $Zn, $imm5",
  4245. "",
  4246. []>, Sched<[]> {
  4247. bits<4> Pd;
  4248. bits<3> Pg;
  4249. bits<5> Zn;
  4250. bits<5> imm5;
  4251. let Inst{31-24} = 0b00100101;
  4252. let Inst{23-22} = sz8_64;
  4253. let Inst{21} = 0b0;
  4254. let Inst{20-16} = imm5;
  4255. let Inst{15} = opc{2};
  4256. let Inst{14} = 0b0;
  4257. let Inst{13} = opc{1};
  4258. let Inst{12-10} = Pg;
  4259. let Inst{9-5} = Zn;
  4260. let Inst{4} = opc{0};
  4261. let Inst{3-0} = Pd;
  4262. let Defs = [NZCV];
  4263. let ElementSize = pprty.ElementSize;
  4264. let isPTestLike = 1;
  4265. }
  4266. multiclass SVE_SETCC_Imm_Pat<CondCode cc, CondCode commuted_cc,
  4267. ValueType predvt, ValueType intvt,
  4268. Operand immtype, Instruction cmp> {
  4269. def : Pat<(predvt (AArch64setcc_z (predvt PPR_3b:$Pg),
  4270. (intvt ZPR:$Zs1),
  4271. (intvt (splat_vector (immtype:$imm))),
  4272. cc)),
  4273. (cmp $Pg, $Zs1, immtype:$imm)>;
  4274. def : Pat<(predvt (AArch64setcc_z (predvt PPR_3b:$Pg),
  4275. (intvt (splat_vector (immtype:$imm))),
  4276. (intvt ZPR:$Zs1),
  4277. commuted_cc)),
  4278. (cmp $Pg, $Zs1, immtype:$imm)>;
  4279. def : Pat<(predvt (and predvt:$Pg,
  4280. (AArch64setcc_z (predvt (AArch64ptrue 31)),
  4281. (intvt ZPR:$Zs1),
  4282. (intvt (splat_vector (immtype:$imm))),
  4283. cc))),
  4284. (cmp $Pg, $Zs1, immtype:$imm)>;
  4285. def : Pat<(predvt (and predvt:$Pg,
  4286. (AArch64setcc_z (predvt (AArch64ptrue 31)),
  4287. (intvt (splat_vector (immtype:$imm))),
  4288. (intvt ZPR:$Zs1),
  4289. commuted_cc))),
  4290. (cmp $Pg, $Zs1, immtype:$imm)>;
  4291. }
  4292. multiclass sve_int_scmp_vi<bits<3> opc, string asm, CondCode cc, CondCode commuted_cc> {
  4293. def _B : sve_int_scmp_vi<0b00, opc, asm, PPR8, ZPR8, simm5_32b>;
  4294. def _H : sve_int_scmp_vi<0b01, opc, asm, PPR16, ZPR16, simm5_32b>;
  4295. def _S : sve_int_scmp_vi<0b10, opc, asm, PPR32, ZPR32, simm5_32b>;
  4296. def _D : sve_int_scmp_vi<0b11, opc, asm, PPR64, ZPR64, simm5_64b>;
  4297. defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv16i1, nxv16i8, simm5_32b,
  4298. !cast<Instruction>(NAME # _B)>;
  4299. defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv8i1, nxv8i16, simm5_32b,
  4300. !cast<Instruction>(NAME # _H)>;
  4301. defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv4i1, nxv4i32, simm5_32b,
  4302. !cast<Instruction>(NAME # _S)>;
  4303. defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv2i1, nxv2i64, simm5_64b,
  4304. !cast<Instruction>(NAME # _D)>;
  4305. }
  4306. //===----------------------------------------------------------------------===//
  4307. // SVE Integer Compare - Unsigned Immediate Group
  4308. //===----------------------------------------------------------------------===//
  4309. class sve_int_ucmp_vi<bits<2> sz8_64, bits<2> opc, string asm, PPRRegOp pprty,
  4310. ZPRRegOp zprty, Operand immtype>
  4311. : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, immtype:$imm7),
  4312. asm, "\t$Pd, $Pg/z, $Zn, $imm7",
  4313. "",
  4314. []>, Sched<[]> {
  4315. bits<4> Pd;
  4316. bits<3> Pg;
  4317. bits<5> Zn;
  4318. bits<7> imm7;
  4319. let Inst{31-24} = 0b00100100;
  4320. let Inst{23-22} = sz8_64;
  4321. let Inst{21} = 1;
  4322. let Inst{20-14} = imm7;
  4323. let Inst{13} = opc{1};
  4324. let Inst{12-10} = Pg;
  4325. let Inst{9-5} = Zn;
  4326. let Inst{4} = opc{0};
  4327. let Inst{3-0} = Pd;
  4328. let Defs = [NZCV];
  4329. let ElementSize = pprty.ElementSize;
  4330. let isPTestLike = 1;
  4331. }
  4332. multiclass sve_int_ucmp_vi<bits<2> opc, string asm, CondCode cc,
  4333. CondCode commuted_cc> {
  4334. def _B : sve_int_ucmp_vi<0b00, opc, asm, PPR8, ZPR8, imm0_127>;
  4335. def _H : sve_int_ucmp_vi<0b01, opc, asm, PPR16, ZPR16, imm0_127>;
  4336. def _S : sve_int_ucmp_vi<0b10, opc, asm, PPR32, ZPR32, imm0_127>;
  4337. def _D : sve_int_ucmp_vi<0b11, opc, asm, PPR64, ZPR64, imm0_127_64b>;
  4338. defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv16i1, nxv16i8, imm0_127,
  4339. !cast<Instruction>(NAME # _B)>;
  4340. defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv8i1, nxv8i16, imm0_127,
  4341. !cast<Instruction>(NAME # _H)>;
  4342. defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv4i1, nxv4i32, imm0_127,
  4343. !cast<Instruction>(NAME # _S)>;
  4344. defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv2i1, nxv2i64, imm0_127_64b,
  4345. !cast<Instruction>(NAME # _D)>;
  4346. }
  4347. //===----------------------------------------------------------------------===//
  4348. // SVE Integer Compare - Scalars Group
  4349. //===----------------------------------------------------------------------===//
  4350. class sve_int_cterm<bit sz, bit opc, string asm, RegisterClass rt>
  4351. : I<(outs), (ins rt:$Rn, rt:$Rm),
  4352. asm, "\t$Rn, $Rm",
  4353. "",
  4354. []>, Sched<[]> {
  4355. bits<5> Rm;
  4356. bits<5> Rn;
  4357. let Inst{31-23} = 0b001001011;
  4358. let Inst{22} = sz;
  4359. let Inst{21} = 0b1;
  4360. let Inst{20-16} = Rm;
  4361. let Inst{15-10} = 0b001000;
  4362. let Inst{9-5} = Rn;
  4363. let Inst{4} = opc;
  4364. let Inst{3-0} = 0b0000;
  4365. let Defs = [NZCV];
  4366. }
  4367. class sve_int_while_rr<bits<2> sz8_64, bits<4> opc, string asm,
  4368. RegisterClass gprty, PPRRegOp pprty>
  4369. : I<(outs pprty:$Pd), (ins gprty:$Rn, gprty:$Rm),
  4370. asm, "\t$Pd, $Rn, $Rm",
  4371. "", []>, Sched<[]> {
  4372. bits<4> Pd;
  4373. bits<5> Rm;
  4374. bits<5> Rn;
  4375. let Inst{31-24} = 0b00100101;
  4376. let Inst{23-22} = sz8_64;
  4377. let Inst{21} = 0b1;
  4378. let Inst{20-16} = Rm;
  4379. let Inst{15-13} = 0b000;
  4380. let Inst{12-10} = opc{3-1};
  4381. let Inst{9-5} = Rn;
  4382. let Inst{4} = opc{0};
  4383. let Inst{3-0} = Pd;
  4384. let Defs = [NZCV];
  4385. let ElementSize = pprty.ElementSize;
  4386. let isWhile = 1;
  4387. }
  4388. multiclass sve_int_while4_rr<bits<3> opc, string asm, SDPatternOperator op> {
  4389. def _B : sve_int_while_rr<0b00, { 0, opc }, asm, GPR32, PPR8>;
  4390. def _H : sve_int_while_rr<0b01, { 0, opc }, asm, GPR32, PPR16>;
  4391. def _S : sve_int_while_rr<0b10, { 0, opc }, asm, GPR32, PPR32>;
  4392. def _D : sve_int_while_rr<0b11, { 0, opc }, asm, GPR32, PPR64>;
  4393. def : SVE_2_Op_Pat<nxv16i1, op, i32, i32, !cast<Instruction>(NAME # _B)>;
  4394. def : SVE_2_Op_Pat<nxv8i1, op, i32, i32, !cast<Instruction>(NAME # _H)>;
  4395. def : SVE_2_Op_Pat<nxv4i1, op, i32, i32, !cast<Instruction>(NAME # _S)>;
  4396. def : SVE_2_Op_Pat<nxv2i1, op, i32, i32, !cast<Instruction>(NAME # _D)>;
  4397. }
  4398. multiclass sve_int_while8_rr<bits<3> opc, string asm, SDPatternOperator op> {
  4399. def _B : sve_int_while_rr<0b00, { 1, opc }, asm, GPR64, PPR8>;
  4400. def _H : sve_int_while_rr<0b01, { 1, opc }, asm, GPR64, PPR16>;
  4401. def _S : sve_int_while_rr<0b10, { 1, opc }, asm, GPR64, PPR32>;
  4402. def _D : sve_int_while_rr<0b11, { 1, opc }, asm, GPR64, PPR64>;
  4403. def : SVE_2_Op_Pat<nxv16i1, op, i64, i64, !cast<Instruction>(NAME # _B)>;
  4404. def : SVE_2_Op_Pat<nxv8i1, op, i64, i64, !cast<Instruction>(NAME # _H)>;
  4405. def : SVE_2_Op_Pat<nxv4i1, op, i64, i64, !cast<Instruction>(NAME # _S)>;
  4406. def : SVE_2_Op_Pat<nxv2i1, op, i64, i64, !cast<Instruction>(NAME # _D)>;
  4407. }
  4408. class sve2_int_while_rr<bits<2> sz8_64, bits<1> rw, string asm,
  4409. PPRRegOp pprty>
  4410. : I<(outs pprty:$Pd), (ins GPR64:$Rn, GPR64:$Rm),
  4411. asm, "\t$Pd, $Rn, $Rm",
  4412. "", []>, Sched<[]> {
  4413. bits<4> Pd;
  4414. bits<5> Rm;
  4415. bits<5> Rn;
  4416. let Inst{31-24} = 0b00100101;
  4417. let Inst{23-22} = sz8_64;
  4418. let Inst{21} = 0b1;
  4419. let Inst{20-16} = Rm;
  4420. let Inst{15-10} = 0b001100;
  4421. let Inst{9-5} = Rn;
  4422. let Inst{4} = rw;
  4423. let Inst{3-0} = Pd;
  4424. let Defs = [NZCV];
  4425. let ElementSize = pprty.ElementSize;
  4426. let isWhile = 1;
  4427. }
  4428. multiclass sve2_int_while_rr<bits<1> rw, string asm, string op> {
  4429. def _B : sve2_int_while_rr<0b00, rw, asm, PPR8>;
  4430. def _H : sve2_int_while_rr<0b01, rw, asm, PPR16>;
  4431. def _S : sve2_int_while_rr<0b10, rw, asm, PPR32>;
  4432. def _D : sve2_int_while_rr<0b11, rw, asm, PPR64>;
  4433. def : SVE_2_Op_Pat<nxv16i1, !cast<SDPatternOperator>(op # _b), i64, i64, !cast<Instruction>(NAME # _B)>;
  4434. def : SVE_2_Op_Pat<nxv8i1, !cast<SDPatternOperator>(op # _h), i64, i64, !cast<Instruction>(NAME # _H)>;
  4435. def : SVE_2_Op_Pat<nxv4i1, !cast<SDPatternOperator>(op # _s), i64, i64, !cast<Instruction>(NAME # _S)>;
  4436. def : SVE_2_Op_Pat<nxv2i1, !cast<SDPatternOperator>(op # _d), i64, i64, !cast<Instruction>(NAME # _D)>;
  4437. }
  4438. //===----------------------------------------------------------------------===//
  4439. // SVE Floating Point Fast Reduction Group
  4440. //===----------------------------------------------------------------------===//
  4441. class sve_fp_fast_red<bits<2> sz, bits<3> opc, string asm,
  4442. ZPRRegOp zprty, FPRasZPROperand dstOpType>
  4443. : I<(outs dstOpType:$Vd), (ins PPR3bAny:$Pg, zprty:$Zn),
  4444. asm, "\t$Vd, $Pg, $Zn",
  4445. "",
  4446. []>, Sched<[]> {
  4447. bits<5> Zn;
  4448. bits<5> Vd;
  4449. bits<3> Pg;
  4450. let Inst{31-24} = 0b01100101;
  4451. let Inst{23-22} = sz;
  4452. let Inst{21-19} = 0b000;
  4453. let Inst{18-16} = opc;
  4454. let Inst{15-13} = 0b001;
  4455. let Inst{12-10} = Pg;
  4456. let Inst{9-5} = Zn;
  4457. let Inst{4-0} = Vd;
  4458. }
  4459. multiclass sve_fp_fast_red<bits<3> opc, string asm, SDPatternOperator op> {
  4460. def _H : sve_fp_fast_red<0b01, opc, asm, ZPR16, FPR16asZPR>;
  4461. def _S : sve_fp_fast_red<0b10, opc, asm, ZPR32, FPR32asZPR>;
  4462. def _D : sve_fp_fast_red<0b11, opc, asm, ZPR64, FPR64asZPR>;
  4463. def : SVE_2_Op_Pat<nxv2f16, op, nxv2i1, nxv2f16, !cast<Instruction>(NAME # _H)>;
  4464. def : SVE_2_Op_Pat<nxv4f16, op, nxv4i1, nxv4f16, !cast<Instruction>(NAME # _H)>;
  4465. def : SVE_2_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
  4466. def : SVE_2_Op_Pat<nxv2f32, op, nxv2i1, nxv2f32, !cast<Instruction>(NAME # _S)>;
  4467. def : SVE_2_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
  4468. def : SVE_2_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
  4469. }
  4470. //===----------------------------------------------------------------------===//
  4471. // SVE Floating Point Accumulating Reduction Group
  4472. //===----------------------------------------------------------------------===//
  4473. class sve_fp_2op_p_vd<bits<2> sz, bits<3> opc, string asm,
  4474. ZPRRegOp zprty, FPRasZPROperand dstOpType>
  4475. : I<(outs dstOpType:$Vdn), (ins PPR3bAny:$Pg, dstOpType:$_Vdn, zprty:$Zm),
  4476. asm, "\t$Vdn, $Pg, $_Vdn, $Zm",
  4477. "",
  4478. []>,
  4479. Sched<[]> {
  4480. bits<3> Pg;
  4481. bits<5> Vdn;
  4482. bits<5> Zm;
  4483. let Inst{31-24} = 0b01100101;
  4484. let Inst{23-22} = sz;
  4485. let Inst{21-19} = 0b011;
  4486. let Inst{18-16} = opc;
  4487. let Inst{15-13} = 0b001;
  4488. let Inst{12-10} = Pg;
  4489. let Inst{9-5} = Zm;
  4490. let Inst{4-0} = Vdn;
  4491. let Constraints = "$Vdn = $_Vdn";
  4492. }
  4493. multiclass sve_fp_2op_p_vd<bits<3> opc, string asm, SDPatternOperator op> {
  4494. def _H : sve_fp_2op_p_vd<0b01, opc, asm, ZPR16, FPR16asZPR>;
  4495. def _S : sve_fp_2op_p_vd<0b10, opc, asm, ZPR32, FPR32asZPR>;
  4496. def _D : sve_fp_2op_p_vd<0b11, opc, asm, ZPR64, FPR64asZPR>;
  4497. def : SVE_3_Op_Pat<nxv2f16, op, nxv2i1, nxv2f16, nxv2f16, !cast<Instruction>(NAME # _H)>;
  4498. def : SVE_3_Op_Pat<nxv4f16, op, nxv4i1, nxv4f16, nxv4f16, !cast<Instruction>(NAME # _H)>;
  4499. def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  4500. def : SVE_3_Op_Pat<nxv2f32, op, nxv2i1, nxv2f32, nxv2f32, !cast<Instruction>(NAME # _S)>;
  4501. def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  4502. def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  4503. }
  4504. //===----------------------------------------------------------------------===//
  4505. // SVE Floating Point Compare - Vectors Group
  4506. //===----------------------------------------------------------------------===//
  4507. class sve_fp_3op_p_pd<bits<2> sz, bits<3> opc, string asm, PPRRegOp pprty,
  4508. ZPRRegOp zprty>
  4509. : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, zprty:$Zm),
  4510. asm, "\t$Pd, $Pg/z, $Zn, $Zm",
  4511. "",
  4512. []>, Sched<[]> {
  4513. bits<4> Pd;
  4514. bits<3> Pg;
  4515. bits<5> Zm;
  4516. bits<5> Zn;
  4517. let Inst{31-24} = 0b01100101;
  4518. let Inst{23-22} = sz;
  4519. let Inst{21} = 0b0;
  4520. let Inst{20-16} = Zm;
  4521. let Inst{15} = opc{2};
  4522. let Inst{14} = 0b1;
  4523. let Inst{13} = opc{1};
  4524. let Inst{12-10} = Pg;
  4525. let Inst{9-5} = Zn;
  4526. let Inst{4} = opc{0};
  4527. let Inst{3-0} = Pd;
  4528. }
  4529. multiclass sve_fp_3op_p_pd<bits<3> opc, string asm, SDPatternOperator op> {
  4530. def _H : sve_fp_3op_p_pd<0b01, opc, asm, PPR16, ZPR16>;
  4531. def _S : sve_fp_3op_p_pd<0b10, opc, asm, PPR32, ZPR32>;
  4532. def _D : sve_fp_3op_p_pd<0b11, opc, asm, PPR64, ZPR64>;
  4533. def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  4534. def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  4535. def : SVE_3_Op_Pat<nxv2i1, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  4536. }
  4537. multiclass sve_fp_3op_p_pd_cc<bits<3> opc, string asm,
  4538. CondCode cc1, CondCode cc2,
  4539. CondCode invcc1, CondCode invcc2> {
  4540. def _H : sve_fp_3op_p_pd<0b01, opc, asm, PPR16, ZPR16>;
  4541. def _S : sve_fp_3op_p_pd<0b10, opc, asm, PPR32, ZPR32>;
  4542. def _D : sve_fp_3op_p_pd<0b11, opc, asm, PPR64, ZPR64>;
  4543. defm : SVE_SETCC_Pat<cc1, invcc1, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
  4544. defm : SVE_SETCC_Pat<cc1, invcc1, nxv4i1, nxv4f16, !cast<Instruction>(NAME # _H)>;
  4545. defm : SVE_SETCC_Pat<cc1, invcc1, nxv2i1, nxv2f16, !cast<Instruction>(NAME # _H)>;
  4546. defm : SVE_SETCC_Pat<cc1, invcc1, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
  4547. defm : SVE_SETCC_Pat<cc1, invcc1, nxv2i1, nxv2f32, !cast<Instruction>(NAME # _S)>;
  4548. defm : SVE_SETCC_Pat<cc1, invcc1, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
  4549. defm : SVE_SETCC_Pat<cc2, invcc2, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
  4550. defm : SVE_SETCC_Pat<cc2, invcc2, nxv4i1, nxv4f16, !cast<Instruction>(NAME # _H)>;
  4551. defm : SVE_SETCC_Pat<cc2, invcc2, nxv2i1, nxv2f16, !cast<Instruction>(NAME # _H)>;
  4552. defm : SVE_SETCC_Pat<cc2, invcc2, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
  4553. defm : SVE_SETCC_Pat<cc2, invcc2, nxv2i1, nxv2f32, !cast<Instruction>(NAME # _S)>;
  4554. defm : SVE_SETCC_Pat<cc2, invcc2, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
  4555. }
  4556. //===----------------------------------------------------------------------===//
  4557. // SVE Floating Point Compare - with Zero Group
  4558. //===----------------------------------------------------------------------===//
  4559. class sve_fp_2op_p_pd<bits<2> sz, bits<3> opc, string asm, PPRRegOp pprty,
  4560. ZPRRegOp zprty>
  4561. : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn),
  4562. asm, "\t$Pd, $Pg/z, $Zn, #0.0",
  4563. "",
  4564. []>, Sched<[]> {
  4565. bits<4> Pd;
  4566. bits<3> Pg;
  4567. bits<5> Zn;
  4568. let Inst{31-24} = 0b01100101;
  4569. let Inst{23-22} = sz;
  4570. let Inst{21-18} = 0b0100;
  4571. let Inst{17-16} = opc{2-1};
  4572. let Inst{15-13} = 0b001;
  4573. let Inst{12-10} = Pg;
  4574. let Inst{9-5} = Zn;
  4575. let Inst{4} = opc{0};
  4576. let Inst{3-0} = Pd;
  4577. }
  4578. multiclass sve_fp_2op_p_pd<bits<3> opc, string asm,
  4579. CondCode cc1, CondCode cc2,
  4580. CondCode invcc1, CondCode invcc2> {
  4581. def _H : sve_fp_2op_p_pd<0b01, opc, asm, PPR16, ZPR16>;
  4582. def _S : sve_fp_2op_p_pd<0b10, opc, asm, PPR32, ZPR32>;
  4583. def _D : sve_fp_2op_p_pd<0b11, opc, asm, PPR64, ZPR64>;
  4584. defm : SVE_SETCC_Pat_With_Zero<cc1, invcc1, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
  4585. defm : SVE_SETCC_Pat_With_Zero<cc1, invcc1, nxv4i1, nxv4f16, !cast<Instruction>(NAME # _H)>;
  4586. defm : SVE_SETCC_Pat_With_Zero<cc1, invcc1, nxv2i1, nxv2f16, !cast<Instruction>(NAME # _H)>;
  4587. defm : SVE_SETCC_Pat_With_Zero<cc1, invcc1, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
  4588. defm : SVE_SETCC_Pat_With_Zero<cc1, invcc1, nxv2i1, nxv2f32, !cast<Instruction>(NAME # _S)>;
  4589. defm : SVE_SETCC_Pat_With_Zero<cc1, invcc1, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
  4590. defm : SVE_SETCC_Pat_With_Zero<cc2, invcc2, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
  4591. defm : SVE_SETCC_Pat_With_Zero<cc2, invcc2, nxv4i1, nxv4f16, !cast<Instruction>(NAME # _H)>;
  4592. defm : SVE_SETCC_Pat_With_Zero<cc2, invcc2, nxv2i1, nxv2f16, !cast<Instruction>(NAME # _H)>;
  4593. defm : SVE_SETCC_Pat_With_Zero<cc2, invcc2, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
  4594. defm : SVE_SETCC_Pat_With_Zero<cc2, invcc2, nxv2i1, nxv2f32, !cast<Instruction>(NAME # _S)>;
  4595. defm : SVE_SETCC_Pat_With_Zero<cc2, invcc2, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
  4596. }
  4597. //===----------------------------------------------------------------------===//
  4598. //SVE Index Generation Group
  4599. //===----------------------------------------------------------------------===//
  4600. def simm5_8b_tgt : TImmLeaf<i8, [{ return (int8_t)Imm >= -16 && (int8_t)Imm < 16; }]>;
  4601. def simm5_16b_tgt : TImmLeaf<i16, [{ return (int16_t)Imm >= -16 && (int16_t)Imm < 16; }]>;
  4602. def simm5_32b_tgt : TImmLeaf<i32, [{ return (int32_t)Imm >= -16 && (int32_t)Imm < 16; }]>;
  4603. def simm5_64b_tgt : TImmLeaf<i64, [{ return (int64_t)Imm >= -16 && (int64_t)Imm < 16; }]>;
  4604. def i64imm_32bit_tgt : TImmLeaf<i64, [{
  4605. return (Imm & 0xffffffffULL) == static_cast<uint64_t>(Imm);
  4606. }]>;
  4607. class sve_int_index_ii<bits<2> sz8_64, string asm, ZPRRegOp zprty,
  4608. Operand imm_ty>
  4609. : I<(outs zprty:$Zd), (ins imm_ty:$imm5, imm_ty:$imm5b),
  4610. asm, "\t$Zd, $imm5, $imm5b",
  4611. "", []>, Sched<[]> {
  4612. bits<5> Zd;
  4613. bits<5> imm5;
  4614. bits<5> imm5b;
  4615. let Inst{31-24} = 0b00000100;
  4616. let Inst{23-22} = sz8_64;
  4617. let Inst{21} = 0b1;
  4618. let Inst{20-16} = imm5b;
  4619. let Inst{15-10} = 0b010000;
  4620. let Inst{9-5} = imm5;
  4621. let Inst{4-0} = Zd;
  4622. let isReMaterializable = 1;
  4623. }
  4624. multiclass sve_int_index_ii<string asm> {
  4625. def _B : sve_int_index_ii<0b00, asm, ZPR8, simm5_8b>;
  4626. def _H : sve_int_index_ii<0b01, asm, ZPR16, simm5_16b>;
  4627. def _S : sve_int_index_ii<0b10, asm, ZPR32, simm5_32b>;
  4628. def _D : sve_int_index_ii<0b11, asm, ZPR64, simm5_64b>;
  4629. def : Pat<(nxv16i8 (step_vector simm5_8b_tgt:$imm5b)),
  4630. (!cast<Instruction>(NAME # "_B") (i32 0), (!cast<SDNodeXForm>("trunc_imm") $imm5b))>;
  4631. def : Pat<(nxv8i16 (step_vector simm5_16b_tgt:$imm5b)),
  4632. (!cast<Instruction>(NAME # "_H") (i32 0), (!cast<SDNodeXForm>("trunc_imm") $imm5b))>;
  4633. def : Pat<(nxv4i32 (step_vector simm5_32b_tgt:$imm5b)),
  4634. (!cast<Instruction>(NAME # "_S") (i32 0), simm5_32b:$imm5b)>;
  4635. def : Pat<(nxv2i64 (step_vector simm5_64b_tgt:$imm5b)),
  4636. (!cast<Instruction>(NAME # "_D") (i64 0), simm5_64b:$imm5b)>;
  4637. // add(step_vector(step), dup(X)) -> index(X, step).
  4638. def : Pat<(add (nxv16i8 (step_vector_oneuse simm5_8b_tgt:$imm5b)), (nxv16i8 (splat_vector(simm5_8b:$imm5)))),
  4639. (!cast<Instruction>(NAME # "_B") simm5_8b:$imm5, (!cast<SDNodeXForm>("trunc_imm") $imm5b))>;
  4640. def : Pat<(add (nxv8i16 (step_vector_oneuse simm5_16b_tgt:$imm5b)), (nxv8i16 (splat_vector(simm5_16b:$imm5)))),
  4641. (!cast<Instruction>(NAME # "_H") simm5_16b:$imm5, (!cast<SDNodeXForm>("trunc_imm") $imm5b))>;
  4642. def : Pat<(add (nxv4i32 (step_vector_oneuse simm5_32b_tgt:$imm5b)), (nxv4i32 (splat_vector(simm5_32b:$imm5)))),
  4643. (!cast<Instruction>(NAME # "_S") simm5_32b:$imm5, simm5_32b:$imm5b)>;
  4644. def : Pat<(add (nxv2i64 (step_vector_oneuse simm5_64b_tgt:$imm5b)), (nxv2i64 (splat_vector(simm5_64b:$imm5)))),
  4645. (!cast<Instruction>(NAME # "_D") simm5_64b:$imm5, simm5_64b:$imm5b)>;
  4646. }
  4647. class sve_int_index_ir<bits<2> sz8_64, string asm, ZPRRegOp zprty,
  4648. RegisterClass srcRegType, Operand imm_ty>
  4649. : I<(outs zprty:$Zd), (ins imm_ty:$imm5, srcRegType:$Rm),
  4650. asm, "\t$Zd, $imm5, $Rm",
  4651. "", []>, Sched<[]> {
  4652. bits<5> Rm;
  4653. bits<5> Zd;
  4654. bits<5> imm5;
  4655. let Inst{31-24} = 0b00000100;
  4656. let Inst{23-22} = sz8_64;
  4657. let Inst{21} = 0b1;
  4658. let Inst{20-16} = Rm;
  4659. let Inst{15-10} = 0b010010;
  4660. let Inst{9-5} = imm5;
  4661. let Inst{4-0} = Zd;
  4662. }
  4663. multiclass sve_int_index_ir<string asm, SDPatternOperator mulop, SDPatternOperator muloneuseop> {
  4664. def _B : sve_int_index_ir<0b00, asm, ZPR8, GPR32, simm5_8b>;
  4665. def _H : sve_int_index_ir<0b01, asm, ZPR16, GPR32, simm5_16b>;
  4666. def _S : sve_int_index_ir<0b10, asm, ZPR32, GPR32, simm5_32b>;
  4667. def _D : sve_int_index_ir<0b11, asm, ZPR64, GPR64, simm5_64b>;
  4668. def : Pat<(nxv16i8 (step_vector i8:$imm)),
  4669. (!cast<Instruction>(NAME # "_B") (i32 0), (!cast<Instruction>("MOVi32imm") (!cast<SDNodeXForm>("trunc_imm") $imm)))>;
  4670. def : Pat<(nxv8i16 (step_vector i16:$imm)),
  4671. (!cast<Instruction>(NAME # "_H") (i32 0), (!cast<Instruction>("MOVi32imm") (!cast<SDNodeXForm>("trunc_imm") $imm)))>;
  4672. def : Pat<(nxv4i32 (step_vector i32:$imm)),
  4673. (!cast<Instruction>(NAME # "_S") (i32 0), (!cast<Instruction>("MOVi32imm") $imm))>;
  4674. def : Pat<(nxv2i64 (step_vector i64:$imm)),
  4675. (!cast<Instruction>(NAME # "_D") (i64 0), (!cast<Instruction>("MOVi64imm") $imm))>;
  4676. def : Pat<(nxv2i64 (step_vector i64imm_32bit_tgt:$imm)),
  4677. (!cast<Instruction>(NAME # "_D") (i64 0), (SUBREG_TO_REG (i64 0), (!cast<Instruction>("MOVi32imm") (!cast<SDNodeXForm>("trunc_imm") $imm)), sub_32))>;
  4678. // add(step_vector(step), dup(X)) -> index(X, step).
  4679. def : Pat<(add (nxv16i8 (step_vector_oneuse i8:$imm)), (nxv16i8 (splat_vector(simm5_8b:$imm5)))),
  4680. (!cast<Instruction>(NAME # "_B") simm5_8b:$imm5, (!cast<Instruction>("MOVi32imm") (!cast<SDNodeXForm>("trunc_imm") $imm)))>;
  4681. def : Pat<(add (nxv8i16 (step_vector_oneuse i16:$imm)), (nxv8i16 (splat_vector(simm5_16b:$imm5)))),
  4682. (!cast<Instruction>(NAME # "_H") simm5_16b:$imm5, (!cast<Instruction>("MOVi32imm") (!cast<SDNodeXForm>("trunc_imm") $imm)))>;
  4683. def : Pat<(add (nxv4i32 (step_vector_oneuse i32:$imm)), (nxv4i32 (splat_vector(simm5_32b:$imm5)))),
  4684. (!cast<Instruction>(NAME # "_S") simm5_32b:$imm5, (!cast<Instruction>("MOVi32imm") $imm))>;
  4685. def : Pat<(add (nxv2i64 (step_vector_oneuse i64:$imm)), (nxv2i64 (splat_vector(simm5_64b:$imm5)))),
  4686. (!cast<Instruction>(NAME # "_D") simm5_64b:$imm5, (!cast<Instruction>("MOVi64imm") $imm))>;
  4687. def : Pat<(add (nxv2i64 (step_vector_oneuse i64imm_32bit_tgt:$imm)), (nxv2i64 (splat_vector(simm5_64b:$imm5)))),
  4688. (!cast<Instruction>(NAME # "_D") simm5_64b:$imm5, (SUBREG_TO_REG (i64 0), (!cast<Instruction>("MOVi32imm") (!cast<SDNodeXForm>("trunc_imm") $imm)), sub_32))>;
  4689. // mul(step_vector(1), dup(Y)) -> index(0, Y).
  4690. def : Pat<(mulop (nxv16i1 (AArch64ptrue 31)), (nxv16i8 (step_vector_oneuse (i8 1))), (nxv16i8 (splat_vector(i32 GPR32:$Rm)))),
  4691. (!cast<Instruction>(NAME # "_B") (i32 0), GPR32:$Rm)>;
  4692. def : Pat<(mulop (nxv8i1 (AArch64ptrue 31)), (nxv8i16 (step_vector_oneuse (i16 1))), (nxv8i16 (splat_vector(i32 GPR32:$Rm)))),
  4693. (!cast<Instruction>(NAME # "_H") (i32 0), GPR32:$Rm)>;
  4694. def : Pat<(mulop (nxv4i1 (AArch64ptrue 31)), (nxv4i32 (step_vector_oneuse (i32 1))), (nxv4i32 (splat_vector(i32 GPR32:$Rm)))),
  4695. (!cast<Instruction>(NAME # "_S") (i32 0), GPR32:$Rm)>;
  4696. def : Pat<(mulop (nxv2i1 (AArch64ptrue 31)), (nxv2i64 (step_vector_oneuse (i64 1))), (nxv2i64 (splat_vector(i64 GPR64:$Rm)))),
  4697. (!cast<Instruction>(NAME # "_D") (i64 0), GPR64:$Rm)>;
  4698. // add(mul(step_vector(1), dup(Y)), dup(X)) -> index(X, Y).
  4699. def : Pat<(add (muloneuseop (nxv16i1 (AArch64ptrue 31)), (nxv16i8 (step_vector_oneuse (i8 1))), (nxv16i8 (splat_vector(i32 GPR32:$Rm)))), (nxv16i8 (splat_vector(simm5_8b:$imm5)))),
  4700. (!cast<Instruction>(NAME # "_B") simm5_8b:$imm5, GPR32:$Rm)>;
  4701. def : Pat<(add (muloneuseop (nxv8i1 (AArch64ptrue 31)), (nxv8i16 (step_vector_oneuse (i16 1))), (nxv8i16 (splat_vector(i32 GPR32:$Rm)))), (nxv8i16 (splat_vector(simm5_16b:$imm5)))),
  4702. (!cast<Instruction>(NAME # "_H") simm5_16b:$imm5, GPR32:$Rm)>;
  4703. def : Pat<(add (muloneuseop (nxv4i1 (AArch64ptrue 31)), (nxv4i32 (step_vector_oneuse (i32 1))), (nxv4i32 (splat_vector(i32 GPR32:$Rm)))), (nxv4i32 (splat_vector(simm5_32b:$imm5)))),
  4704. (!cast<Instruction>(NAME # "_S") simm5_32b:$imm5, GPR32:$Rm)>;
  4705. def : Pat<(add (muloneuseop (nxv2i1 (AArch64ptrue 31)), (nxv2i64 (step_vector_oneuse (i64 1))), (nxv2i64 (splat_vector(i64 GPR64:$Rm)))), (nxv2i64 (splat_vector(simm5_64b:$imm5)))),
  4706. (!cast<Instruction>(NAME # "_D") simm5_64b:$imm5, GPR64:$Rm)>;
  4707. }
  4708. class sve_int_index_ri<bits<2> sz8_64, string asm, ZPRRegOp zprty,
  4709. RegisterClass srcRegType, Operand imm_ty>
  4710. : I<(outs zprty:$Zd), (ins srcRegType:$Rn, imm_ty:$imm5),
  4711. asm, "\t$Zd, $Rn, $imm5",
  4712. "", []>, Sched<[]> {
  4713. bits<5> Rn;
  4714. bits<5> Zd;
  4715. bits<5> imm5;
  4716. let Inst{31-24} = 0b00000100;
  4717. let Inst{23-22} = sz8_64;
  4718. let Inst{21} = 0b1;
  4719. let Inst{20-16} = imm5;
  4720. let Inst{15-10} = 0b010001;
  4721. let Inst{9-5} = Rn;
  4722. let Inst{4-0} = Zd;
  4723. }
  4724. multiclass sve_int_index_ri<string asm> {
  4725. def _B : sve_int_index_ri<0b00, asm, ZPR8, GPR32, simm5_8b>;
  4726. def _H : sve_int_index_ri<0b01, asm, ZPR16, GPR32, simm5_16b>;
  4727. def _S : sve_int_index_ri<0b10, asm, ZPR32, GPR32, simm5_32b>;
  4728. def _D : sve_int_index_ri<0b11, asm, ZPR64, GPR64, simm5_64b>;
  4729. // add(step_vector(step), dup(X)) -> index(X, step).
  4730. def : Pat<(add (nxv16i8 (step_vector_oneuse simm5_8b_tgt:$imm5)), (nxv16i8 (splat_vector(i32 GPR32:$Rm)))),
  4731. (!cast<Instruction>(NAME # "_B") GPR32:$Rm, (!cast<SDNodeXForm>("trunc_imm") $imm5))>;
  4732. def : Pat<(add (nxv8i16 (step_vector_oneuse simm5_16b_tgt:$imm5)), (nxv8i16 (splat_vector(i32 GPR32:$Rm)))),
  4733. (!cast<Instruction>(NAME # "_H") GPR32:$Rm, (!cast<SDNodeXForm>("trunc_imm") $imm5))>;
  4734. def : Pat<(add (nxv4i32 (step_vector_oneuse simm5_32b_tgt:$imm5)), (nxv4i32 (splat_vector(i32 GPR32:$Rm)))),
  4735. (!cast<Instruction>(NAME # "_S") GPR32:$Rm, simm5_32b:$imm5)>;
  4736. def : Pat<(add (nxv2i64 (step_vector_oneuse simm5_64b_tgt:$imm5)), (nxv2i64 (splat_vector(i64 GPR64:$Rm)))),
  4737. (!cast<Instruction>(NAME # "_D") GPR64:$Rm, simm5_64b:$imm5)>;
  4738. }
  4739. class sve_int_index_rr<bits<2> sz8_64, string asm, ZPRRegOp zprty,
  4740. RegisterClass srcRegType>
  4741. : I<(outs zprty:$Zd), (ins srcRegType:$Rn, srcRegType:$Rm),
  4742. asm, "\t$Zd, $Rn, $Rm",
  4743. "", []>, Sched<[]> {
  4744. bits<5> Zd;
  4745. bits<5> Rm;
  4746. bits<5> Rn;
  4747. let Inst{31-24} = 0b00000100;
  4748. let Inst{23-22} = sz8_64;
  4749. let Inst{21} = 0b1;
  4750. let Inst{20-16} = Rm;
  4751. let Inst{15-10} = 0b010011;
  4752. let Inst{9-5} = Rn;
  4753. let Inst{4-0} = Zd;
  4754. }
  4755. multiclass sve_int_index_rr<string asm, SDPatternOperator mulop> {
  4756. def _B : sve_int_index_rr<0b00, asm, ZPR8, GPR32>;
  4757. def _H : sve_int_index_rr<0b01, asm, ZPR16, GPR32>;
  4758. def _S : sve_int_index_rr<0b10, asm, ZPR32, GPR32>;
  4759. def _D : sve_int_index_rr<0b11, asm, ZPR64, GPR64>;
  4760. // add(step_vector(step), dup(X)) -> index(X, step).
  4761. def : Pat<(add (nxv16i8 (step_vector_oneuse i8:$imm)), (nxv16i8 (splat_vector(i32 GPR32:$Rn)))),
  4762. (!cast<Instruction>(NAME # "_B") GPR32:$Rn, (!cast<Instruction>("MOVi32imm") (!cast<SDNodeXForm>("trunc_imm") $imm)))>;
  4763. def : Pat<(add (nxv8i16 (step_vector_oneuse i16:$imm)), (nxv8i16 (splat_vector(i32 GPR32:$Rn)))),
  4764. (!cast<Instruction>(NAME # "_H") GPR32:$Rn, (!cast<Instruction>("MOVi32imm") (!cast<SDNodeXForm>("trunc_imm") $imm)))>;
  4765. def : Pat<(add (nxv4i32 (step_vector_oneuse i32:$imm)), (nxv4i32 (splat_vector(i32 GPR32:$Rn)))),
  4766. (!cast<Instruction>(NAME # "_S") GPR32:$Rn, (!cast<Instruction>("MOVi32imm") $imm))>;
  4767. def : Pat<(add (nxv2i64 (step_vector_oneuse i64:$imm)), (nxv2i64 (splat_vector(i64 GPR64:$Rn)))),
  4768. (!cast<Instruction>(NAME # "_D") GPR64:$Rn, (!cast<Instruction>("MOVi64imm") $imm))>;
  4769. def : Pat<(add (nxv2i64 (step_vector_oneuse i64imm_32bit_tgt:$imm)), (nxv2i64 (splat_vector(i64 GPR64:$Rn)))),
  4770. (!cast<Instruction>(NAME # "_D") GPR64:$Rn, (SUBREG_TO_REG (i64 0), (!cast<Instruction>("MOVi32imm") (!cast<SDNodeXForm>("trunc_imm") $imm)), sub_32))>;
  4771. // add(mul(step_vector(1), dup(Y)), dup(X)) -> index(X, Y).
  4772. def : Pat<(add (mulop (nxv16i1 (AArch64ptrue 31)), (nxv16i8 (step_vector_oneuse (i8 1))), (nxv16i8 (splat_vector(i32 GPR32:$Rm)))), (nxv16i8 (splat_vector(i32 GPR32:$Rn)))),
  4773. (!cast<Instruction>(NAME # "_B") GPR32:$Rn, GPR32:$Rm)>;
  4774. def : Pat<(add (mulop (nxv8i1 (AArch64ptrue 31)), (nxv8i16 (step_vector_oneuse (i16 1))), (nxv8i16 (splat_vector(i32 GPR32:$Rm)))),(nxv8i16 (splat_vector(i32 GPR32:$Rn)))),
  4775. (!cast<Instruction>(NAME # "_H") GPR32:$Rn, GPR32:$Rm)>;
  4776. def : Pat<(add (mulop (nxv4i1 (AArch64ptrue 31)), (nxv4i32 (step_vector_oneuse (i32 1))), (nxv4i32 (splat_vector(i32 GPR32:$Rm)))),(nxv4i32 (splat_vector(i32 GPR32:$Rn)))),
  4777. (!cast<Instruction>(NAME # "_S") GPR32:$Rn, GPR32:$Rm)>;
  4778. def : Pat<(add (mulop (nxv2i1 (AArch64ptrue 31)), (nxv2i64 (step_vector_oneuse (i64 1))), (nxv2i64 (splat_vector(i64 GPR64:$Rm)))),(nxv2i64 (splat_vector(i64 GPR64:$Rn)))),
  4779. (!cast<Instruction>(NAME # "_D") GPR64:$Rn, GPR64:$Rm)>;
  4780. }
  4781. //===----------------------------------------------------------------------===//
  4782. // SVE Bitwise Shift - Predicated Group
  4783. //===----------------------------------------------------------------------===//
  4784. class sve_int_bin_pred_shift_imm<bits<4> tsz8_64, bits<4> opc, string asm,
  4785. ZPRRegOp zprty, Operand immtype>
  4786. : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, immtype:$imm),
  4787. asm, "\t$Zdn, $Pg/m, $_Zdn, $imm",
  4788. "",
  4789. []>, Sched<[]> {
  4790. bits<3> Pg;
  4791. bits<5> Zdn;
  4792. bits<6> imm;
  4793. let Inst{31-24} = 0b00000100;
  4794. let Inst{23-22} = tsz8_64{3-2};
  4795. let Inst{21-20} = 0b00;
  4796. let Inst{19-16} = opc;
  4797. let Inst{15-13} = 0b100;
  4798. let Inst{12-10} = Pg;
  4799. let Inst{9-8} = tsz8_64{1-0};
  4800. let Inst{7-5} = imm{2-0}; // imm3
  4801. let Inst{4-0} = Zdn;
  4802. let Constraints = "$Zdn = $_Zdn";
  4803. let DestructiveInstType = DestructiveBinaryImm;
  4804. let ElementSize = zprty.ElementSize;
  4805. }
  4806. multiclass sve_int_bin_pred_shift_imm_left<bits<4> opc, string asm, string Ps,
  4807. SDPatternOperator op = null_frag> {
  4808. def _B : SVEPseudo2Instr<Ps # _B, 1>,
  4809. sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
  4810. def _H : SVEPseudo2Instr<Ps # _H, 1>,
  4811. sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
  4812. let Inst{8} = imm{3};
  4813. }
  4814. def _S : SVEPseudo2Instr<Ps # _S, 1>,
  4815. sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> {
  4816. let Inst{9-8} = imm{4-3};
  4817. }
  4818. def _D : SVEPseudo2Instr<Ps # _D, 1>,
  4819. sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> {
  4820. let Inst{22} = imm{5};
  4821. let Inst{9-8} = imm{4-3};
  4822. }
  4823. def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i1, nxv16i8, i32, tvecshiftL8, !cast<Instruction>(NAME # _B)>;
  4824. def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i1, nxv8i16, i32, tvecshiftL16, !cast<Instruction>(NAME # _H)>;
  4825. def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i1, nxv4i32, i32, tvecshiftL32, !cast<Instruction>(NAME # _S)>;
  4826. def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i1, nxv2i64, i32, tvecshiftL64, !cast<Instruction>(NAME # _D)>;
  4827. }
  4828. // As above but shift amount takes the form of a "vector immediate".
  4829. multiclass sve_int_bin_pred_shift_imm_left_dup<bits<4> opc, string asm,
  4830. string Ps, SDPatternOperator op>
  4831. : sve_int_bin_pred_shift_imm_left<opc, asm, Ps, null_frag> {
  4832. def : SVE_Shift_DupImm_Pred_Pat<nxv16i8, op, nxv16i1, i32, SVEShiftImmL8, !cast<Instruction>(NAME # _B)>;
  4833. def : SVE_Shift_DupImm_Pred_Pat<nxv8i16, op, nxv8i1, i32, SVEShiftImmL16, !cast<Instruction>(NAME # _H)>;
  4834. def : SVE_Shift_DupImm_Pred_Pat<nxv4i32, op, nxv4i1, i32, SVEShiftImmL32, !cast<Instruction>(NAME # _S)>;
  4835. def : SVE_Shift_DupImm_Pred_Pat<nxv2i64, op, nxv2i1, i64, SVEShiftImmL64, !cast<Instruction>(NAME # _D)>;
  4836. }
  4837. multiclass sve_int_bin_pred_shift_imm_left_zeroing_bhsd<SDPatternOperator op> {
  4838. def _ZERO_B : PredTwoOpImmPseudo<NAME # _B, ZPR8, tvecshiftL8, FalseLanesZero>;
  4839. def _ZERO_H : PredTwoOpImmPseudo<NAME # _H, ZPR16, tvecshiftL16, FalseLanesZero>;
  4840. def _ZERO_S : PredTwoOpImmPseudo<NAME # _S, ZPR32, tvecshiftL32, FalseLanesZero>;
  4841. def _ZERO_D : PredTwoOpImmPseudo<NAME # _D, ZPR64, tvecshiftL64, FalseLanesZero>;
  4842. def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv16i8, op, nxv16i1, nxv16i8, tvecshiftL8, !cast<Pseudo>(NAME # _ZERO_B)>;
  4843. def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv8i16, op, nxv8i1, nxv8i16, tvecshiftL16, !cast<Pseudo>(NAME # _ZERO_H)>;
  4844. def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv4i32, op, nxv4i1, nxv4i32, tvecshiftL32, !cast<Pseudo>(NAME # _ZERO_S)>;
  4845. def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv2i64, op, nxv2i1, nxv2i64, tvecshiftL64, !cast<Pseudo>(NAME # _ZERO_D)>;
  4846. }
  4847. multiclass sve_int_bin_pred_shift_imm_right<bits<4> opc, string asm, string Ps,
  4848. SDPatternOperator op = null_frag> {
  4849. def _B : SVEPseudo2Instr<Ps # _B, 1>,
  4850. sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
  4851. def _H : SVEPseudo2Instr<Ps # _H, 1>,
  4852. sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
  4853. let Inst{8} = imm{3};
  4854. }
  4855. def _S : SVEPseudo2Instr<Ps # _S, 1>,
  4856. sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
  4857. let Inst{9-8} = imm{4-3};
  4858. }
  4859. def _D : SVEPseudo2Instr<Ps # _D, 1>,
  4860. sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
  4861. let Inst{22} = imm{5};
  4862. let Inst{9-8} = imm{4-3};
  4863. }
  4864. def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i1, nxv16i8, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
  4865. def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i1, nxv8i16, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
  4866. def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i1, nxv4i32, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
  4867. def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i1, nxv2i64, i32, tvecshiftR64, !cast<Instruction>(NAME # _D)>;
  4868. }
  4869. // As above but shift amount takes the form of a "vector immediate".
  4870. multiclass sve_int_bin_pred_shift_imm_right_dup<bits<4> opc, string asm,
  4871. string Ps, SDPatternOperator op>
  4872. : sve_int_bin_pred_shift_imm_right<opc, asm, Ps, null_frag> {
  4873. def : SVE_Shift_DupImm_Pred_Pat<nxv16i8, op, nxv16i1, i32, SVEShiftImmR8, !cast<Instruction>(NAME # _B)>;
  4874. def : SVE_Shift_DupImm_Pred_Pat<nxv8i16, op, nxv8i1, i32, SVEShiftImmR16, !cast<Instruction>(NAME # _H)>;
  4875. def : SVE_Shift_DupImm_Pred_Pat<nxv4i32, op, nxv4i1, i32, SVEShiftImmR32, !cast<Instruction>(NAME # _S)>;
  4876. def : SVE_Shift_DupImm_Pred_Pat<nxv2i64, op, nxv2i1, i64, SVEShiftImmR64, !cast<Instruction>(NAME # _D)>;
  4877. }
  4878. multiclass sve_int_bin_pred_shift_imm_right_zeroing_bhsd<SDPatternOperator op = null_frag> {
  4879. def _ZERO_B : PredTwoOpImmPseudo<NAME # _B, ZPR8, vecshiftR8, FalseLanesZero>;
  4880. def _ZERO_H : PredTwoOpImmPseudo<NAME # _H, ZPR16, vecshiftR16, FalseLanesZero>;
  4881. def _ZERO_S : PredTwoOpImmPseudo<NAME # _S, ZPR32, vecshiftR32, FalseLanesZero>;
  4882. def _ZERO_D : PredTwoOpImmPseudo<NAME # _D, ZPR64, vecshiftR64, FalseLanesZero>;
  4883. def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv16i8, op, nxv16i1, nxv16i8, tvecshiftR8, !cast<Pseudo>(NAME # _ZERO_B)>;
  4884. def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv8i16, op, nxv8i1, nxv8i16, tvecshiftR16, !cast<Pseudo>(NAME # _ZERO_H)>;
  4885. def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv4i32, op, nxv4i1, nxv4i32, tvecshiftR32, !cast<Pseudo>(NAME # _ZERO_S)>;
  4886. def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv2i64, op, nxv2i1, nxv2i64, tvecshiftR64, !cast<Pseudo>(NAME # _ZERO_D)>;
  4887. }
  4888. class sve_int_bin_pred_shift<bits<2> sz8_64, bit wide, bits<3> opc,
  4889. string asm, ZPRRegOp zprty, ZPRRegOp zprty2>
  4890. : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty2:$Zm),
  4891. asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm",
  4892. "",
  4893. []>, Sched<[]> {
  4894. bits<3> Pg;
  4895. bits<5> Zdn;
  4896. bits<5> Zm;
  4897. let Inst{31-24} = 0b00000100;
  4898. let Inst{23-22} = sz8_64;
  4899. let Inst{21-20} = 0b01;
  4900. let Inst{19} = wide;
  4901. let Inst{18-16} = opc;
  4902. let Inst{15-13} = 0b100;
  4903. let Inst{12-10} = Pg;
  4904. let Inst{9-5} = Zm;
  4905. let Inst{4-0} = Zdn;
  4906. let Constraints = "$Zdn = $_Zdn";
  4907. let DestructiveInstType = DestructiveOther;
  4908. let ElementSize = zprty.ElementSize;
  4909. }
  4910. multiclass sve_int_bin_pred_shift<bits<3> opc, string asm, string Ps,
  4911. SDPatternOperator op, string revname, bit isReverseInstr = 0> {
  4912. let DestructiveInstType = DestructiveBinaryCommWithRev in {
  4913. def _B : sve_int_bin_pred_shift<0b00, 0b0, opc, asm, ZPR8, ZPR8>,
  4914. SVEPseudo2Instr<Ps # _B, 1>, SVEInstr2Rev<NAME # _B, revname # _B, isReverseInstr>;
  4915. def _H : sve_int_bin_pred_shift<0b01, 0b0, opc, asm, ZPR16, ZPR16>,
  4916. SVEPseudo2Instr<Ps # _H, 1>, SVEInstr2Rev<NAME # _H, revname # _H, isReverseInstr>;
  4917. def _S : sve_int_bin_pred_shift<0b10, 0b0, opc, asm, ZPR32, ZPR32>,
  4918. SVEPseudo2Instr<Ps # _S, 1>, SVEInstr2Rev<NAME # _S, revname # _S, isReverseInstr>;
  4919. def _D : sve_int_bin_pred_shift<0b11, 0b0, opc, asm, ZPR64, ZPR64>,
  4920. SVEPseudo2Instr<Ps # _D, 1>, SVEInstr2Rev<NAME # _D, revname # _D, isReverseInstr>;
  4921. }
  4922. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  4923. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  4924. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  4925. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  4926. }
  4927. multiclass sve_int_bin_pred_zeroing_bhsd<SDPatternOperator op> {
  4928. def _ZERO_B : PredTwoOpPseudo<NAME # _B, ZPR8, FalseLanesZero>;
  4929. def _ZERO_H : PredTwoOpPseudo<NAME # _H, ZPR16, FalseLanesZero>;
  4930. def _ZERO_S : PredTwoOpPseudo<NAME # _S, ZPR32, FalseLanesZero>;
  4931. def _ZERO_D : PredTwoOpPseudo<NAME # _D, ZPR64, FalseLanesZero>;
  4932. def : SVE_3_Op_Pat_SelZero<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Pseudo>(NAME # _ZERO_B)>;
  4933. def : SVE_3_Op_Pat_SelZero<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Pseudo>(NAME # _ZERO_H)>;
  4934. def : SVE_3_Op_Pat_SelZero<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Pseudo>(NAME # _ZERO_S)>;
  4935. def : SVE_3_Op_Pat_SelZero<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Pseudo>(NAME # _ZERO_D)>;
  4936. }
  4937. multiclass sve_int_bin_pred_shift_wide<bits<3> opc, string asm,
  4938. SDPatternOperator op> {
  4939. def _B : sve_int_bin_pred_shift<0b00, 0b1, opc, asm, ZPR8, ZPR64>;
  4940. def _H : sve_int_bin_pred_shift<0b01, 0b1, opc, asm, ZPR16, ZPR64>;
  4941. def _S : sve_int_bin_pred_shift<0b10, 0b1, opc, asm, ZPR32, ZPR64>;
  4942. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv2i64, !cast<Instruction>(NAME # _B)>;
  4943. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv2i64, !cast<Instruction>(NAME # _H)>;
  4944. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
  4945. }
  4946. //===----------------------------------------------------------------------===//
  4947. // SVE Shift - Unpredicated Group
  4948. //===----------------------------------------------------------------------===//
  4949. class sve_int_bin_cons_shift_wide<bits<2> sz8_64, bits<2> opc, string asm,
  4950. ZPRRegOp zprty>
  4951. : I<(outs zprty:$Zd), (ins zprty:$Zn, ZPR64:$Zm),
  4952. asm, "\t$Zd, $Zn, $Zm",
  4953. "",
  4954. []>, Sched<[]> {
  4955. bits<5> Zd;
  4956. bits<5> Zm;
  4957. bits<5> Zn;
  4958. let Inst{31-24} = 0b00000100;
  4959. let Inst{23-22} = sz8_64;
  4960. let Inst{21} = 0b1;
  4961. let Inst{20-16} = Zm;
  4962. let Inst{15-12} = 0b1000;
  4963. let Inst{11-10} = opc;
  4964. let Inst{9-5} = Zn;
  4965. let Inst{4-0} = Zd;
  4966. }
  4967. multiclass sve_int_bin_cons_shift_wide<bits<2> opc, string asm, SDPatternOperator op> {
  4968. def _B : sve_int_bin_cons_shift_wide<0b00, opc, asm, ZPR8>;
  4969. def _H : sve_int_bin_cons_shift_wide<0b01, opc, asm, ZPR16>;
  4970. def _S : sve_int_bin_cons_shift_wide<0b10, opc, asm, ZPR32>;
  4971. def : SVE_2_Op_Pred_All_Active<nxv16i8, op, nxv16i1, nxv16i8, nxv2i64, !cast<Instruction>(NAME # _B)>;
  4972. def : SVE_2_Op_Pred_All_Active<nxv8i16, op, nxv8i1, nxv8i16, nxv2i64, !cast<Instruction>(NAME # _H)>;
  4973. def : SVE_2_Op_Pred_All_Active<nxv4i32, op, nxv4i1, nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
  4974. }
  4975. class sve_int_bin_cons_shift_imm<bits<4> tsz8_64, bits<2> opc, string asm,
  4976. ZPRRegOp zprty, Operand immtype>
  4977. : I<(outs zprty:$Zd), (ins zprty:$Zn, immtype:$imm),
  4978. asm, "\t$Zd, $Zn, $imm",
  4979. "",
  4980. []>, Sched<[]> {
  4981. bits<5> Zd;
  4982. bits<5> Zn;
  4983. bits<6> imm;
  4984. let Inst{31-24} = 0b00000100;
  4985. let Inst{23-22} = tsz8_64{3-2};
  4986. let Inst{21} = 0b1;
  4987. let Inst{20-19} = tsz8_64{1-0};
  4988. let Inst{18-16} = imm{2-0}; // imm3
  4989. let Inst{15-12} = 0b1001;
  4990. let Inst{11-10} = opc;
  4991. let Inst{9-5} = Zn;
  4992. let Inst{4-0} = Zd;
  4993. }
  4994. multiclass sve_int_bin_cons_shift_imm_left<bits<2> opc, string asm,
  4995. SDPatternOperator op> {
  4996. def _B : sve_int_bin_cons_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
  4997. def _H : sve_int_bin_cons_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
  4998. let Inst{19} = imm{3};
  4999. }
  5000. def _S : sve_int_bin_cons_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> {
  5001. let Inst{20-19} = imm{4-3};
  5002. }
  5003. def _D : sve_int_bin_cons_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> {
  5004. let Inst{22} = imm{5};
  5005. let Inst{20-19} = imm{4-3};
  5006. }
  5007. def : SVE_Shift_DupImm_All_Active_Pat<nxv16i8, op, nxv16i1, i32, SVEShiftImmL8, !cast<Instruction>(NAME # _B)>;
  5008. def : SVE_Shift_DupImm_All_Active_Pat<nxv8i16, op, nxv8i1, i32, SVEShiftImmL16, !cast<Instruction>(NAME # _H)>;
  5009. def : SVE_Shift_DupImm_All_Active_Pat<nxv4i32, op, nxv4i1, i32, SVEShiftImmL32, !cast<Instruction>(NAME # _S)>;
  5010. def : SVE_Shift_DupImm_All_Active_Pat<nxv2i64, op, nxv2i1, i64, SVEShiftImmL64, !cast<Instruction>(NAME # _D)>;
  5011. }
  5012. multiclass sve_int_bin_cons_shift_imm_right<bits<2> opc, string asm,
  5013. SDPatternOperator op> {
  5014. def _B : sve_int_bin_cons_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
  5015. def _H : sve_int_bin_cons_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
  5016. let Inst{19} = imm{3};
  5017. }
  5018. def _S : sve_int_bin_cons_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
  5019. let Inst{20-19} = imm{4-3};
  5020. }
  5021. def _D : sve_int_bin_cons_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
  5022. let Inst{22} = imm{5};
  5023. let Inst{20-19} = imm{4-3};
  5024. }
  5025. def : SVE_Shift_DupImm_All_Active_Pat<nxv16i8, op, nxv16i1, i32, SVEShiftImmR8, !cast<Instruction>(NAME # _B)>;
  5026. def : SVE_Shift_DupImm_All_Active_Pat<nxv8i16, op, nxv8i1, i32, SVEShiftImmR16, !cast<Instruction>(NAME # _H)>;
  5027. def : SVE_Shift_DupImm_All_Active_Pat<nxv4i32, op, nxv4i1, i32, SVEShiftImmR32, !cast<Instruction>(NAME # _S)>;
  5028. def : SVE_Shift_DupImm_All_Active_Pat<nxv2i64, op, nxv2i1, i64, SVEShiftImmR64, !cast<Instruction>(NAME # _D)>;
  5029. }
  5030. //===----------------------------------------------------------------------===//
  5031. // SVE Memory - Store Group
  5032. //===----------------------------------------------------------------------===//
  5033. class sve_mem_cst_si<bits<2> msz, bits<2> esz, string asm,
  5034. RegisterOperand VecList>
  5035. : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
  5036. asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
  5037. "",
  5038. []>, Sched<[]> {
  5039. bits<3> Pg;
  5040. bits<5> Rn;
  5041. bits<5> Zt;
  5042. bits<4> imm4;
  5043. let Inst{31-25} = 0b1110010;
  5044. let Inst{24-23} = msz;
  5045. let Inst{22-21} = esz;
  5046. let Inst{20} = 0;
  5047. let Inst{19-16} = imm4;
  5048. let Inst{15-13} = 0b111;
  5049. let Inst{12-10} = Pg;
  5050. let Inst{9-5} = Rn;
  5051. let Inst{4-0} = Zt;
  5052. let mayStore = 1;
  5053. }
  5054. multiclass sve_mem_cst_si<bits<2> msz, bits<2> esz, string asm,
  5055. RegisterOperand listty, ZPRRegOp zprty>
  5056. {
  5057. def NAME : sve_mem_cst_si<msz, esz, asm, listty>;
  5058. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
  5059. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
  5060. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
  5061. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
  5062. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
  5063. (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
  5064. }
  5065. class sve_mem_est_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
  5066. string asm, Operand immtype>
  5067. : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm4),
  5068. asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
  5069. "",
  5070. []>, Sched<[]> {
  5071. bits<3> Pg;
  5072. bits<5> Rn;
  5073. bits<5> Zt;
  5074. bits<4> imm4;
  5075. let Inst{31-25} = 0b1110010;
  5076. let Inst{24-23} = sz;
  5077. let Inst{22-21} = nregs;
  5078. let Inst{20} = 1;
  5079. let Inst{19-16} = imm4;
  5080. let Inst{15-13} = 0b111;
  5081. let Inst{12-10} = Pg;
  5082. let Inst{9-5} = Rn;
  5083. let Inst{4-0} = Zt;
  5084. let mayStore = 1;
  5085. }
  5086. multiclass sve_mem_est_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
  5087. string asm, Operand immtype> {
  5088. def NAME : sve_mem_est_si<sz, nregs, VecList, asm, immtype>;
  5089. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
  5090. (!cast<Instruction>(NAME) VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
  5091. }
  5092. // SVE store multiple structures (quadwords, scalar plus immediate)
  5093. class sve_mem_128b_est_si<bits<2> nregs, RegisterOperand VecList,
  5094. string asm, Operand immtype>
  5095. : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm4),
  5096. asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
  5097. "", []>, Sched<[]> {
  5098. bits<5> Zt;
  5099. bits<5> Rn;
  5100. bits<3> Pg;
  5101. bits<4> imm4;
  5102. let Inst{31-24} = 0b11100100;
  5103. let Inst{23-22} = nregs;
  5104. let Inst{21-20} = 0b00;
  5105. let Inst{19-16} = imm4;
  5106. let Inst{15-13} = 0b000;
  5107. let Inst{12-10} = Pg;
  5108. let Inst{9-5} = Rn;
  5109. let Inst{4-0} = Zt;
  5110. let mayStore = 1;
  5111. }
  5112. multiclass sve_mem_128b_est_si<bits<2> nregs, RegisterOperand VecList,
  5113. string asm, Operand immtype> {
  5114. def NAME : sve_mem_128b_est_si<nregs, VecList, asm, immtype>;
  5115. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
  5116. (!cast<Instruction>(NAME) VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
  5117. }
  5118. class sve_mem_est_ss<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
  5119. string asm, RegisterOperand gprty>
  5120. : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
  5121. asm, "\t$Zt, $Pg, [$Rn, $Rm]",
  5122. "",
  5123. []>, Sched<[]> {
  5124. bits<3> Pg;
  5125. bits<5> Rm;
  5126. bits<5> Rn;
  5127. bits<5> Zt;
  5128. let Inst{31-25} = 0b1110010;
  5129. let Inst{24-23} = sz;
  5130. let Inst{22-21} = nregs;
  5131. let Inst{20-16} = Rm;
  5132. let Inst{15-13} = 0b011;
  5133. let Inst{12-10} = Pg;
  5134. let Inst{9-5} = Rn;
  5135. let Inst{4-0} = Zt;
  5136. let mayStore = 1;
  5137. }
  5138. // SVE store multiple structures (quadwords, scalar plus scalar)
  5139. class sve_mem_128b_est_ss<bits<2> nregs, RegisterOperand VecList,
  5140. string asm, RegisterOperand gprty>
  5141. : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
  5142. asm, "\t$Zt, $Pg, [$Rn, $Rm]",
  5143. "", []>, Sched<[]> {
  5144. bits<5> Zt;
  5145. bits<5> Rn;
  5146. bits<3> Pg;
  5147. bits<5> Rm;
  5148. let Inst{31-24} = 0b11100100;
  5149. let Inst{23-22} = nregs;
  5150. let Inst{21} = 0b1;
  5151. let Inst{20-16} = Rm;
  5152. let Inst{15-13} = 0b000;
  5153. let Inst{12-10} = Pg;
  5154. let Inst{9-5} = Rn;
  5155. let Inst{4-0} = Zt;
  5156. let mayStore = 1;
  5157. }
  5158. class sve_mem_cst_ss_base<bits<4> dtype, string asm,
  5159. RegisterOperand listty, RegisterOperand gprty>
  5160. : I<(outs), (ins listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
  5161. asm, "\t$Zt, $Pg, [$Rn, $Rm]",
  5162. "",
  5163. []>, Sched<[]> {
  5164. bits<3> Pg;
  5165. bits<5> Rm;
  5166. bits<5> Rn;
  5167. bits<5> Zt;
  5168. let Inst{31-25} = 0b1110010;
  5169. let Inst{24-21} = dtype;
  5170. let Inst{20-16} = Rm;
  5171. let Inst{15-13} = 0b010;
  5172. let Inst{12-10} = Pg;
  5173. let Inst{9-5} = Rn;
  5174. let Inst{4-0} = Zt;
  5175. let mayStore = 1;
  5176. }
  5177. multiclass sve_mem_cst_ss<bits<4> dtype, string asm,
  5178. RegisterOperand listty, ZPRRegOp zprty,
  5179. RegisterOperand gprty> {
  5180. def NAME : sve_mem_cst_ss_base<dtype, asm, listty, gprty>;
  5181. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Rm]",
  5182. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
  5183. }
  5184. class sve_mem_cstnt_si<bits<2> msz, string asm, RegisterOperand VecList>
  5185. : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
  5186. asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
  5187. "",
  5188. []>, Sched<[]> {
  5189. bits<3> Pg;
  5190. bits<5> Rn;
  5191. bits<5> Zt;
  5192. bits<4> imm4;
  5193. let Inst{31-25} = 0b1110010;
  5194. let Inst{24-23} = msz;
  5195. let Inst{22-20} = 0b001;
  5196. let Inst{19-16} = imm4;
  5197. let Inst{15-13} = 0b111;
  5198. let Inst{12-10} = Pg;
  5199. let Inst{9-5} = Rn;
  5200. let Inst{4-0} = Zt;
  5201. let mayStore = 1;
  5202. }
  5203. multiclass sve_mem_cstnt_si<bits<2> msz, string asm, RegisterOperand listty,
  5204. ZPRRegOp zprty> {
  5205. def NAME : sve_mem_cstnt_si<msz, asm, listty>;
  5206. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
  5207. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
  5208. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
  5209. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
  5210. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
  5211. (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
  5212. }
  5213. class sve_mem_cstnt_ss_base<bits<2> msz, string asm, RegisterOperand listty,
  5214. RegisterOperand gprty>
  5215. : I<(outs), (ins listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
  5216. asm, "\t$Zt, $Pg, [$Rn, $Rm]",
  5217. "",
  5218. []>, Sched<[]> {
  5219. bits<3> Pg;
  5220. bits<5> Rm;
  5221. bits<5> Rn;
  5222. bits<5> Zt;
  5223. let Inst{31-25} = 0b1110010;
  5224. let Inst{24-23} = msz;
  5225. let Inst{22-21} = 0b00;
  5226. let Inst{20-16} = Rm;
  5227. let Inst{15-13} = 0b011;
  5228. let Inst{12-10} = Pg;
  5229. let Inst{9-5} = Rn;
  5230. let Inst{4-0} = Zt;
  5231. let mayStore = 1;
  5232. }
  5233. multiclass sve_mem_cstnt_ss<bits<2> msz, string asm, RegisterOperand listty,
  5234. ZPRRegOp zprty, RegisterOperand gprty> {
  5235. def NAME : sve_mem_cstnt_ss_base<msz, asm, listty, gprty>;
  5236. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Rm]",
  5237. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
  5238. }
  5239. class sve2_mem_sstnt_vs_base<bits<3> opc, string asm,
  5240. RegisterOperand listty, ZPRRegOp zprty>
  5241. : I<(outs), (ins listty:$Zt, PPR3bAny:$Pg, zprty:$Zn, GPR64:$Rm),
  5242. asm, "\t$Zt, $Pg, [$Zn, $Rm]",
  5243. "",
  5244. []>, Sched<[]> {
  5245. bits<3> Pg;
  5246. bits<5> Rm;
  5247. bits<5> Zn;
  5248. bits<5> Zt;
  5249. let Inst{31-25} = 0b1110010;
  5250. let Inst{24-22} = opc;
  5251. let Inst{21} = 0b0;
  5252. let Inst{20-16} = Rm;
  5253. let Inst{15-13} = 0b001;
  5254. let Inst{12-10} = Pg;
  5255. let Inst{9-5} = Zn;
  5256. let Inst{4-0} = Zt;
  5257. let mayStore = 1;
  5258. }
  5259. multiclass sve2_mem_sstnt_vs_32_ptrs<bits<3> opc, string asm,
  5260. SDPatternOperator op,
  5261. ValueType vt> {
  5262. def _REAL : sve2_mem_sstnt_vs_base<opc, asm, Z_s, ZPR32>;
  5263. def : InstAlias<asm # "\t$Zt, $Pg, [$Zn, $Rm]",
  5264. (!cast<Instruction>(NAME # _REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, GPR64:$Rm), 0>;
  5265. def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
  5266. (!cast<Instruction>(NAME # _REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, XZR), 0>;
  5267. def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
  5268. (!cast<Instruction>(NAME # _REAL) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, XZR), 1>;
  5269. def : Pat <(op (nxv4i32 ZPR32:$Zt), (nxv4i1 PPR3bAny:$Pg), (nxv4i32 ZPR32:$Zn), (i64 GPR64:$Rm), vt),
  5270. (!cast<Instruction>(NAME # _REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, GPR64:$Rm)>;
  5271. }
  5272. multiclass sve2_mem_sstnt_vs_64_ptrs<bits<3> opc, string asm,
  5273. SDPatternOperator op,
  5274. ValueType vt> {
  5275. def _REAL : sve2_mem_sstnt_vs_base<opc, asm, Z_d, ZPR64>;
  5276. def : InstAlias<asm # "\t$Zt, $Pg, [$Zn, $Rm]",
  5277. (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, GPR64:$Rm), 0>;
  5278. def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
  5279. (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, XZR), 0>;
  5280. def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
  5281. (!cast<Instruction>(NAME # _REAL) Z_d:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, XZR), 1>;
  5282. def : Pat <(op (nxv2i64 ZPR64:$Zt), (nxv2i1 PPR3bAny:$Pg), (nxv2i64 ZPR64:$Zn), (i64 GPR64:$Rm), vt),
  5283. (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, GPR64:$Rm)>;
  5284. }
  5285. class sve_mem_sst_sv<bits<3> opc, bit xs, bit scaled, string asm,
  5286. RegisterOperand VecList, RegisterOperand zprext>
  5287. : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
  5288. asm, "\t$Zt, $Pg, [$Rn, $Zm]",
  5289. "",
  5290. []>, Sched<[]> {
  5291. bits<3> Pg;
  5292. bits<5> Rn;
  5293. bits<5> Zm;
  5294. bits<5> Zt;
  5295. let Inst{31-25} = 0b1110010;
  5296. let Inst{24-22} = opc;
  5297. let Inst{21} = scaled;
  5298. let Inst{20-16} = Zm;
  5299. let Inst{15} = 0b1;
  5300. let Inst{14} = xs;
  5301. let Inst{13} = 0;
  5302. let Inst{12-10} = Pg;
  5303. let Inst{9-5} = Rn;
  5304. let Inst{4-0} = Zt;
  5305. let mayStore = 1;
  5306. }
  5307. multiclass sve_mem_32b_sst_sv_32_scaled<bits<3> opc, string asm,
  5308. SDPatternOperator sxtw_op,
  5309. SDPatternOperator uxtw_op,
  5310. RegisterOperand sxtw_opnd,
  5311. RegisterOperand uxtw_opnd,
  5312. ValueType vt > {
  5313. def _UXTW_SCALED : sve_mem_sst_sv<opc, 0, 1, asm, Z_s, uxtw_opnd>;
  5314. def _SXTW_SCALED : sve_mem_sst_sv<opc, 1, 1, asm, Z_s, sxtw_opnd>;
  5315. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
  5316. (!cast<Instruction>(NAME # _UXTW_SCALED) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
  5317. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
  5318. (!cast<Instruction>(NAME # _SXTW_SCALED) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
  5319. def : Pat<(uxtw_op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt),
  5320. (!cast<Instruction>(NAME # _UXTW_SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  5321. def : Pat<(sxtw_op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt),
  5322. (!cast<Instruction>(NAME # _SXTW_SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  5323. }
  5324. multiclass sve_mem_64b_sst_sv_32_scaled<bits<3> opc, string asm,
  5325. SDPatternOperator sxtw_op,
  5326. SDPatternOperator uxtw_op,
  5327. RegisterOperand sxtw_opnd,
  5328. RegisterOperand uxtw_opnd,
  5329. ValueType vt > {
  5330. def _UXTW_SCALED : sve_mem_sst_sv<opc, 0, 1, asm, Z_d, uxtw_opnd>;
  5331. def _SXTW_SCALED : sve_mem_sst_sv<opc, 1, 1, asm, Z_d, sxtw_opnd>;
  5332. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
  5333. (!cast<Instruction>(NAME # _UXTW_SCALED) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
  5334. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
  5335. (!cast<Instruction>(NAME # _SXTW_SCALED) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
  5336. def : Pat<(uxtw_op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
  5337. (!cast<Instruction>(NAME # _UXTW_SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  5338. def : Pat<(sxtw_op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
  5339. (!cast<Instruction>(NAME # _SXTW_SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  5340. }
  5341. multiclass sve_mem_64b_sst_sv_32_unscaled<bits<3> opc, string asm,
  5342. SDPatternOperator sxtw_op,
  5343. SDPatternOperator uxtw_op,
  5344. RegisterOperand sxtw_opnd,
  5345. RegisterOperand uxtw_opnd,
  5346. ValueType vt> {
  5347. def _UXTW : sve_mem_sst_sv<opc, 0, 0, asm, Z_d, uxtw_opnd>;
  5348. def _SXTW : sve_mem_sst_sv<opc, 1, 0, asm, Z_d, sxtw_opnd>;
  5349. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
  5350. (!cast<Instruction>(NAME # _UXTW) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
  5351. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
  5352. (!cast<Instruction>(NAME # _SXTW) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
  5353. def : Pat<(uxtw_op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
  5354. (!cast<Instruction>(NAME # _UXTW) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  5355. def : Pat<(sxtw_op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
  5356. (!cast<Instruction>(NAME # _SXTW) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  5357. }
  5358. multiclass sve_mem_32b_sst_sv_32_unscaled<bits<3> opc, string asm,
  5359. SDPatternOperator sxtw_op,
  5360. SDPatternOperator uxtw_op,
  5361. RegisterOperand sxtw_opnd,
  5362. RegisterOperand uxtw_opnd,
  5363. ValueType vt> {
  5364. def _UXTW : sve_mem_sst_sv<opc, 0, 0, asm, Z_s, uxtw_opnd>;
  5365. def _SXTW : sve_mem_sst_sv<opc, 1, 0, asm, Z_s, sxtw_opnd>;
  5366. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
  5367. (!cast<Instruction>(NAME # _UXTW) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
  5368. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
  5369. (!cast<Instruction>(NAME # _SXTW) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
  5370. def : Pat<(uxtw_op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt),
  5371. (!cast<Instruction>(NAME # _UXTW) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  5372. def : Pat<(sxtw_op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt),
  5373. (!cast<Instruction>(NAME # _SXTW) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  5374. }
  5375. class sve_mem_sst_sv2<bits<2> msz, bit scaled, string asm,
  5376. RegisterOperand zprext>
  5377. : I<(outs), (ins Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
  5378. asm, "\t$Zt, $Pg, [$Rn, $Zm]",
  5379. "",
  5380. []>, Sched<[]> {
  5381. bits<3> Pg;
  5382. bits<5> Rn;
  5383. bits<5> Zm;
  5384. bits<5> Zt;
  5385. let Inst{31-25} = 0b1110010;
  5386. let Inst{24-23} = msz;
  5387. let Inst{22} = 0b0;
  5388. let Inst{21} = scaled;
  5389. let Inst{20-16} = Zm;
  5390. let Inst{15-13} = 0b101;
  5391. let Inst{12-10} = Pg;
  5392. let Inst{9-5} = Rn;
  5393. let Inst{4-0} = Zt;
  5394. let mayStore = 1;
  5395. }
  5396. multiclass sve_mem_sst_sv_64_scaled<bits<2> msz, string asm,
  5397. SDPatternOperator op,
  5398. RegisterOperand zprext,
  5399. ValueType vt> {
  5400. def _SCALED : sve_mem_sst_sv2<msz, 1, asm, zprext>;
  5401. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
  5402. (!cast<Instruction>(NAME # _SCALED) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm), 0>;
  5403. def : Pat<(op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$indices), vt),
  5404. (!cast<Instruction>(NAME # _SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
  5405. }
  5406. multiclass sve_mem_sst_sv_64_unscaled<bits<2> msz, string asm,
  5407. SDPatternOperator op,
  5408. ValueType vt> {
  5409. def NAME : sve_mem_sst_sv2<msz, 0, asm, ZPR64ExtLSL8>;
  5410. def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
  5411. (!cast<Instruction>(NAME) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, ZPR64ExtLSL8:$Zm), 0>;
  5412. def : Pat<(op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
  5413. (!cast<Instruction>(NAME) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  5414. }
  5415. class sve_mem_sst_vi<bits<3> opc, string asm, ZPRRegOp zprty,
  5416. RegisterOperand VecList, Operand imm_ty>
  5417. : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, zprty:$Zn, imm_ty:$imm5),
  5418. asm, "\t$Zt, $Pg, [$Zn, $imm5]",
  5419. "",
  5420. []>, Sched<[]> {
  5421. bits<3> Pg;
  5422. bits<5> imm5;
  5423. bits<5> Zn;
  5424. bits<5> Zt;
  5425. let Inst{31-25} = 0b1110010;
  5426. let Inst{24-23} = opc{2-1};
  5427. let Inst{22} = 0b1;
  5428. let Inst{21} = opc{0};
  5429. let Inst{20-16} = imm5;
  5430. let Inst{15-13} = 0b101;
  5431. let Inst{12-10} = Pg;
  5432. let Inst{9-5} = Zn;
  5433. let Inst{4-0} = Zt;
  5434. let mayStore = 1;
  5435. }
  5436. multiclass sve_mem_32b_sst_vi_ptrs<bits<3> opc, string asm,
  5437. Operand imm_ty,
  5438. SDPatternOperator op,
  5439. ValueType vt> {
  5440. def _IMM : sve_mem_sst_vi<opc, asm, ZPR32, Z_s, imm_ty>;
  5441. def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
  5442. (!cast<Instruction>(NAME # _IMM) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 0>;
  5443. def : InstAlias<asm # "\t$Zt, $Pg, [$Zn, $imm5]",
  5444. (!cast<Instruction>(NAME # _IMM) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5), 0>;
  5445. def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
  5446. (!cast<Instruction>(NAME # _IMM) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 1>;
  5447. def : Pat<(op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), (nxv4i32 ZPR:$ptrs), imm_ty:$index, vt),
  5448. (!cast<Instruction>(NAME # _IMM) ZPR:$data, PPR:$gp, ZPR:$ptrs, imm_ty:$index)>;
  5449. }
  5450. multiclass sve_mem_64b_sst_vi_ptrs<bits<3> opc, string asm,
  5451. Operand imm_ty,
  5452. SDPatternOperator op,
  5453. ValueType vt> {
  5454. def _IMM : sve_mem_sst_vi<opc, asm, ZPR64, Z_d, imm_ty>;
  5455. def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
  5456. (!cast<Instruction>(NAME # _IMM) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 0>;
  5457. def : InstAlias<asm # "\t$Zt, $Pg, [$Zn, $imm5]",
  5458. (!cast<Instruction>(NAME # _IMM) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5), 0>;
  5459. def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
  5460. (!cast<Instruction>(NAME # _IMM) Z_d:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 1>;
  5461. def : Pat<(op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), (nxv2i64 ZPR:$ptrs), imm_ty:$index, vt),
  5462. (!cast<Instruction>(NAME # _IMM) ZPR:$data, PPR:$gp, ZPR:$ptrs, imm_ty:$index)>;
  5463. }
  5464. class sve_mem_z_spill<string asm>
  5465. : I<(outs), (ins ZPRAny:$Zt, GPR64sp:$Rn, simm9:$imm9),
  5466. asm, "\t$Zt, [$Rn, $imm9, mul vl]",
  5467. "",
  5468. []>, Sched<[]> {
  5469. bits<5> Rn;
  5470. bits<5> Zt;
  5471. bits<9> imm9;
  5472. let Inst{31-22} = 0b1110010110;
  5473. let Inst{21-16} = imm9{8-3};
  5474. let Inst{15-13} = 0b010;
  5475. let Inst{12-10} = imm9{2-0};
  5476. let Inst{9-5} = Rn;
  5477. let Inst{4-0} = Zt;
  5478. let mayStore = 1;
  5479. }
  5480. multiclass sve_mem_z_spill<string asm> {
  5481. def NAME : sve_mem_z_spill<asm>;
  5482. def : InstAlias<asm # "\t$Zt, [$Rn]",
  5483. (!cast<Instruction>(NAME) ZPRAny:$Zt, GPR64sp:$Rn, 0), 1>;
  5484. }
  5485. class sve_mem_p_spill<string asm>
  5486. : I<(outs), (ins PPRAny:$Pt, GPR64sp:$Rn, simm9:$imm9),
  5487. asm, "\t$Pt, [$Rn, $imm9, mul vl]",
  5488. "",
  5489. []>, Sched<[]> {
  5490. bits<4> Pt;
  5491. bits<5> Rn;
  5492. bits<9> imm9;
  5493. let Inst{31-22} = 0b1110010110;
  5494. let Inst{21-16} = imm9{8-3};
  5495. let Inst{15-13} = 0b000;
  5496. let Inst{12-10} = imm9{2-0};
  5497. let Inst{9-5} = Rn;
  5498. let Inst{4} = 0b0;
  5499. let Inst{3-0} = Pt;
  5500. let mayStore = 1;
  5501. }
  5502. multiclass sve_mem_p_spill<string asm> {
  5503. def NAME : sve_mem_p_spill<asm>;
  5504. def : InstAlias<asm # "\t$Pt, [$Rn]",
  5505. (!cast<Instruction>(NAME) PPRAny:$Pt, GPR64sp:$Rn, 0), 1>;
  5506. }
  5507. //===----------------------------------------------------------------------===//
  5508. // SVE Permute - Predicates Group
  5509. //===----------------------------------------------------------------------===//
  5510. class sve_int_perm_bin_perm_pp<bits<3> opc, bits<2> sz8_64, string asm,
  5511. PPRRegOp pprty, SDPatternOperator op>
  5512. : I<(outs pprty:$Pd), (ins pprty:$Pn, pprty:$Pm),
  5513. asm, "\t$Pd, $Pn, $Pm",
  5514. "",
  5515. [(set nxv16i1:$Pd, (op nxv16i1:$Pn, nxv16i1:$Pm))]>, Sched<[]> {
  5516. bits<4> Pd;
  5517. bits<4> Pm;
  5518. bits<4> Pn;
  5519. let Inst{31-24} = 0b00000101;
  5520. let Inst{23-22} = sz8_64;
  5521. let Inst{21-20} = 0b10;
  5522. let Inst{19-16} = Pm;
  5523. let Inst{15-13} = 0b010;
  5524. let Inst{12-10} = opc;
  5525. let Inst{9} = 0b0;
  5526. let Inst{8-5} = Pn;
  5527. let Inst{4} = 0b0;
  5528. let Inst{3-0} = Pd;
  5529. }
  5530. multiclass sve_int_perm_bin_perm_pp<bits<3> opc, string asm,
  5531. SDPatternOperator ir_op,
  5532. SDPatternOperator op_b16,
  5533. SDPatternOperator op_b32,
  5534. SDPatternOperator op_b64> {
  5535. def _B : sve_int_perm_bin_perm_pp<opc, 0b00, asm, PPR8, ir_op>;
  5536. def _H : sve_int_perm_bin_perm_pp<opc, 0b01, asm, PPR16, op_b16>;
  5537. def _S : sve_int_perm_bin_perm_pp<opc, 0b10, asm, PPR32, op_b32>;
  5538. def _D : sve_int_perm_bin_perm_pp<opc, 0b11, asm, PPR64, op_b64>;
  5539. def : SVE_2_Op_Pat<nxv8i1, ir_op, nxv8i1, nxv8i1, !cast<Instruction>(NAME # _H)>;
  5540. def : SVE_2_Op_Pat<nxv4i1, ir_op, nxv4i1, nxv4i1, !cast<Instruction>(NAME # _S)>;
  5541. def : SVE_2_Op_Pat<nxv2i1, ir_op, nxv2i1, nxv2i1, !cast<Instruction>(NAME # _D)>;
  5542. }
  5543. class sve_int_perm_punpk<bit opc, string asm>
  5544. : I<(outs PPR16:$Pd), (ins PPR8:$Pn),
  5545. asm, "\t$Pd, $Pn",
  5546. "",
  5547. []>, Sched<[]> {
  5548. bits<4> Pd;
  5549. bits<4> Pn;
  5550. let Inst{31-17} = 0b000001010011000;
  5551. let Inst{16} = opc;
  5552. let Inst{15-9} = 0b0100000;
  5553. let Inst{8-5} = Pn;
  5554. let Inst{4} = 0b0;
  5555. let Inst{3-0} = Pd;
  5556. }
  5557. multiclass sve_int_perm_punpk<bit opc, string asm, SDPatternOperator op> {
  5558. def NAME : sve_int_perm_punpk<opc, asm>;
  5559. def : SVE_1_Op_Pat<nxv8i1, op, nxv16i1, !cast<Instruction>(NAME)>;
  5560. def : SVE_1_Op_Pat<nxv4i1, op, nxv8i1, !cast<Instruction>(NAME)>;
  5561. def : SVE_1_Op_Pat<nxv2i1, op, nxv4i1, !cast<Instruction>(NAME)>;
  5562. }
  5563. class sve_int_rdffr_pred<bit s, string asm>
  5564. : I<(outs PPR8:$Pd), (ins PPRAny:$Pg),
  5565. asm, "\t$Pd, $Pg/z",
  5566. "",
  5567. []>, Sched<[]> {
  5568. bits<4> Pd;
  5569. bits<4> Pg;
  5570. let Inst{31-23} = 0b001001010;
  5571. let Inst{22} = s;
  5572. let Inst{21-9} = 0b0110001111000;
  5573. let Inst{8-5} = Pg;
  5574. let Inst{4} = 0;
  5575. let Inst{3-0} = Pd;
  5576. let Defs = !if(s, [NZCV], []);
  5577. let Uses = [FFR];
  5578. }
  5579. multiclass sve_int_rdffr_pred<bit s, string asm, SDPatternOperator op> {
  5580. def _REAL : sve_int_rdffr_pred<s, asm>;
  5581. // We need a layer of indirection because early machine code passes balk at
  5582. // physical register (i.e. FFR) uses that have no previous definition.
  5583. let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
  5584. def "" : Pseudo<(outs PPR8:$Pd), (ins PPRAny:$Pg), [(set (nxv16i1 PPR8:$Pd), (op (nxv16i1 PPRAny:$Pg)))]>,
  5585. PseudoInstExpansion<(!cast<Instruction>(NAME # _REAL) PPR8:$Pd, PPRAny:$Pg)>;
  5586. }
  5587. }
  5588. class sve_int_rdffr_unpred<string asm> : I<
  5589. (outs PPR8:$Pd), (ins),
  5590. asm, "\t$Pd",
  5591. "",
  5592. []>, Sched<[]> {
  5593. bits<4> Pd;
  5594. let Inst{31-4} = 0b0010010100011001111100000000;
  5595. let Inst{3-0} = Pd;
  5596. let Uses = [FFR];
  5597. }
  5598. multiclass sve_int_rdffr_unpred<string asm, SDPatternOperator op> {
  5599. def _REAL : sve_int_rdffr_unpred<asm>;
  5600. // We need a layer of indirection because early machine code passes balk at
  5601. // physical register (i.e. FFR) uses that have no previous definition.
  5602. let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
  5603. def "" : Pseudo<(outs PPR8:$Pd), (ins), [(set (nxv16i1 PPR8:$Pd), (op))]>,
  5604. PseudoInstExpansion<(!cast<Instruction>(NAME # _REAL) PPR8:$Pd)>;
  5605. }
  5606. }
  5607. class sve_int_wrffr<string asm, SDPatternOperator op>
  5608. : I<(outs), (ins PPR8:$Pn),
  5609. asm, "\t$Pn",
  5610. "",
  5611. [(op (nxv16i1 PPR8:$Pn))]>, Sched<[]> {
  5612. bits<4> Pn;
  5613. let Inst{31-9} = 0b00100101001010001001000;
  5614. let Inst{8-5} = Pn;
  5615. let Inst{4-0} = 0b00000;
  5616. let hasSideEffects = 1;
  5617. let Defs = [FFR];
  5618. }
  5619. class sve_int_setffr<string asm, SDPatternOperator op>
  5620. : I<(outs), (ins),
  5621. asm, "",
  5622. "",
  5623. [(op)]>, Sched<[]> {
  5624. let Inst{31-0} = 0b00100101001011001001000000000000;
  5625. let hasSideEffects = 1;
  5626. let Defs = [FFR];
  5627. }
  5628. //===----------------------------------------------------------------------===//
  5629. // SVE Permute Vector - Predicated Group
  5630. //===----------------------------------------------------------------------===//
  5631. class sve_int_perm_clast_rz<bits<2> sz8_64, bit ab, string asm,
  5632. ZPRRegOp zprty, RegisterClass rt>
  5633. : I<(outs rt:$Rdn), (ins PPR3bAny:$Pg, rt:$_Rdn, zprty:$Zm),
  5634. asm, "\t$Rdn, $Pg, $_Rdn, $Zm",
  5635. "",
  5636. []>, Sched<[]> {
  5637. bits<3> Pg;
  5638. bits<5> Rdn;
  5639. bits<5> Zm;
  5640. let Inst{31-24} = 0b00000101;
  5641. let Inst{23-22} = sz8_64;
  5642. let Inst{21-17} = 0b11000;
  5643. let Inst{16} = ab;
  5644. let Inst{15-13} = 0b101;
  5645. let Inst{12-10} = Pg;
  5646. let Inst{9-5} = Zm;
  5647. let Inst{4-0} = Rdn;
  5648. let Constraints = "$Rdn = $_Rdn";
  5649. }
  5650. multiclass sve_int_perm_clast_rz<bit ab, string asm, SDPatternOperator op> {
  5651. def _B : sve_int_perm_clast_rz<0b00, ab, asm, ZPR8, GPR32>;
  5652. def _H : sve_int_perm_clast_rz<0b01, ab, asm, ZPR16, GPR32>;
  5653. def _S : sve_int_perm_clast_rz<0b10, ab, asm, ZPR32, GPR32>;
  5654. def _D : sve_int_perm_clast_rz<0b11, ab, asm, ZPR64, GPR64>;
  5655. def : SVE_3_Op_Pat<i32, op, nxv16i1, i32, nxv16i8, !cast<Instruction>(NAME # _B)>;
  5656. def : SVE_3_Op_Pat<i32, op, nxv8i1, i32, nxv8i16, !cast<Instruction>(NAME # _H)>;
  5657. def : SVE_3_Op_Pat<i32, op, nxv4i1, i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  5658. def : SVE_3_Op_Pat<i64, op, nxv2i1, i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  5659. }
  5660. class sve_int_perm_clast_vz<bits<2> sz8_64, bit ab, string asm,
  5661. ZPRRegOp zprty, RegisterClass rt>
  5662. : I<(outs rt:$Vdn), (ins PPR3bAny:$Pg, rt:$_Vdn, zprty:$Zm),
  5663. asm, "\t$Vdn, $Pg, $_Vdn, $Zm",
  5664. "",
  5665. []>, Sched<[]> {
  5666. bits<3> Pg;
  5667. bits<5> Vdn;
  5668. bits<5> Zm;
  5669. let Inst{31-24} = 0b00000101;
  5670. let Inst{23-22} = sz8_64;
  5671. let Inst{21-17} = 0b10101;
  5672. let Inst{16} = ab;
  5673. let Inst{15-13} = 0b100;
  5674. let Inst{12-10} = Pg;
  5675. let Inst{9-5} = Zm;
  5676. let Inst{4-0} = Vdn;
  5677. let Constraints = "$Vdn = $_Vdn";
  5678. }
  5679. multiclass sve_int_perm_clast_vz<bit ab, string asm, SDPatternOperator op> {
  5680. def _B : sve_int_perm_clast_vz<0b00, ab, asm, ZPR8, FPR8>;
  5681. def _H : sve_int_perm_clast_vz<0b01, ab, asm, ZPR16, FPR16>;
  5682. def _S : sve_int_perm_clast_vz<0b10, ab, asm, ZPR32, FPR32>;
  5683. def _D : sve_int_perm_clast_vz<0b11, ab, asm, ZPR64, FPR64>;
  5684. def : SVE_3_Op_Pat<f16, op, nxv8i1, f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  5685. def : SVE_3_Op_Pat<f32, op, nxv4i1, f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  5686. def : SVE_3_Op_Pat<f64, op, nxv2i1, f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  5687. def : SVE_3_Op_Pat<bf16, op, nxv8i1, bf16, nxv8bf16, !cast<Instruction>(NAME # _H)>;
  5688. }
  5689. class sve_int_perm_clast_zz<bits<2> sz8_64, bit ab, string asm,
  5690. ZPRRegOp zprty>
  5691. : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
  5692. asm, "\t$Zdn, $Pg, $_Zdn, $Zm",
  5693. "",
  5694. []>, Sched<[]> {
  5695. bits<3> Pg;
  5696. bits<5> Zdn;
  5697. bits<5> Zm;
  5698. let Inst{31-24} = 0b00000101;
  5699. let Inst{23-22} = sz8_64;
  5700. let Inst{21-17} = 0b10100;
  5701. let Inst{16} = ab;
  5702. let Inst{15-13} = 0b100;
  5703. let Inst{12-10} = Pg;
  5704. let Inst{9-5} = Zm;
  5705. let Inst{4-0} = Zdn;
  5706. let Constraints = "$Zdn = $_Zdn";
  5707. let DestructiveInstType = DestructiveOther;
  5708. let ElementSize = ElementSizeNone;
  5709. }
  5710. multiclass sve_int_perm_clast_zz<bit ab, string asm, SDPatternOperator op> {
  5711. def _B : sve_int_perm_clast_zz<0b00, ab, asm, ZPR8>;
  5712. def _H : sve_int_perm_clast_zz<0b01, ab, asm, ZPR16>;
  5713. def _S : sve_int_perm_clast_zz<0b10, ab, asm, ZPR32>;
  5714. def _D : sve_int_perm_clast_zz<0b11, ab, asm, ZPR64>;
  5715. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  5716. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  5717. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  5718. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  5719. def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  5720. def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  5721. def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  5722. def : SVE_3_Op_Pat<nxv8bf16, op, nxv8i1, nxv8bf16, nxv8bf16, !cast<Instruction>(NAME # _H)>;
  5723. }
  5724. class sve_int_perm_last_r<bits<2> sz8_64, bit ab, string asm,
  5725. ZPRRegOp zprty, RegisterClass resultRegType>
  5726. : I<(outs resultRegType:$Rd), (ins PPR3bAny:$Pg, zprty:$Zn),
  5727. asm, "\t$Rd, $Pg, $Zn",
  5728. "",
  5729. []>, Sched<[]> {
  5730. bits<3> Pg;
  5731. bits<5> Rd;
  5732. bits<5> Zn;
  5733. let Inst{31-24} = 0b00000101;
  5734. let Inst{23-22} = sz8_64;
  5735. let Inst{21-17} = 0b10000;
  5736. let Inst{16} = ab;
  5737. let Inst{15-13} = 0b101;
  5738. let Inst{12-10} = Pg;
  5739. let Inst{9-5} = Zn;
  5740. let Inst{4-0} = Rd;
  5741. }
  5742. multiclass sve_int_perm_last_r<bit ab, string asm, SDPatternOperator op> {
  5743. def _B : sve_int_perm_last_r<0b00, ab, asm, ZPR8, GPR32>;
  5744. def _H : sve_int_perm_last_r<0b01, ab, asm, ZPR16, GPR32>;
  5745. def _S : sve_int_perm_last_r<0b10, ab, asm, ZPR32, GPR32>;
  5746. def _D : sve_int_perm_last_r<0b11, ab, asm, ZPR64, GPR64>;
  5747. def : SVE_2_Op_Pat<i32, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
  5748. def : SVE_2_Op_Pat<i32, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
  5749. def : SVE_2_Op_Pat<i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  5750. def : SVE_2_Op_Pat<i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  5751. }
  5752. class sve_int_perm_last_v<bits<2> sz8_64, bit ab, string asm,
  5753. ZPRRegOp zprty, RegisterClass dstRegtype>
  5754. : I<(outs dstRegtype:$Vd), (ins PPR3bAny:$Pg, zprty:$Zn),
  5755. asm, "\t$Vd, $Pg, $Zn",
  5756. "",
  5757. []>, Sched<[]> {
  5758. bits<3> Pg;
  5759. bits<5> Vd;
  5760. bits<5> Zn;
  5761. let Inst{31-24} = 0b00000101;
  5762. let Inst{23-22} = sz8_64;
  5763. let Inst{21-17} = 0b10001;
  5764. let Inst{16} = ab;
  5765. let Inst{15-13} = 0b100;
  5766. let Inst{12-10} = Pg;
  5767. let Inst{9-5} = Zn;
  5768. let Inst{4-0} = Vd;
  5769. }
  5770. multiclass sve_int_perm_last_v<bit ab, string asm, SDPatternOperator op> {
  5771. def _B : sve_int_perm_last_v<0b00, ab, asm, ZPR8, FPR8>;
  5772. def _H : sve_int_perm_last_v<0b01, ab, asm, ZPR16, FPR16>;
  5773. def _S : sve_int_perm_last_v<0b10, ab, asm, ZPR32, FPR32>;
  5774. def _D : sve_int_perm_last_v<0b11, ab, asm, ZPR64, FPR64>;
  5775. def : SVE_2_Op_Pat<f16, op, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
  5776. def : SVE_2_Op_Pat<f32, op, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
  5777. def : SVE_2_Op_Pat<f32, op, nxv2i1, nxv2f32, !cast<Instruction>(NAME # _S)>;
  5778. def : SVE_2_Op_Pat<f64, op, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
  5779. def : SVE_2_Op_Pat<bf16, op, nxv8i1, nxv8bf16, !cast<Instruction>(NAME # _H)>;
  5780. }
  5781. class sve_int_perm_splice<bits<2> sz8_64, string asm, ZPRRegOp zprty>
  5782. : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
  5783. asm, "\t$Zdn, $Pg, $_Zdn, $Zm",
  5784. "",
  5785. []>, Sched<[]> {
  5786. bits<3> Pg;
  5787. bits<5> Zdn;
  5788. bits<5> Zm;
  5789. let Inst{31-24} = 0b00000101;
  5790. let Inst{23-22} = sz8_64;
  5791. let Inst{21-13} = 0b101100100;
  5792. let Inst{12-10} = Pg;
  5793. let Inst{9-5} = Zm;
  5794. let Inst{4-0} = Zdn;
  5795. let Constraints = "$Zdn = $_Zdn";
  5796. let DestructiveInstType = DestructiveOther;
  5797. let ElementSize = ElementSizeNone;
  5798. }
  5799. multiclass sve_int_perm_splice<string asm, SDPatternOperator op> {
  5800. def _B : sve_int_perm_splice<0b00, asm, ZPR8>;
  5801. def _H : sve_int_perm_splice<0b01, asm, ZPR16>;
  5802. def _S : sve_int_perm_splice<0b10, asm, ZPR32>;
  5803. def _D : sve_int_perm_splice<0b11, asm, ZPR64>;
  5804. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  5805. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  5806. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  5807. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  5808. def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  5809. def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  5810. def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  5811. def : SVE_3_Op_Pat<nxv8bf16, op, nxv8i1, nxv8bf16, nxv8bf16, !cast<Instruction>(NAME # _H)>;
  5812. }
  5813. class sve2_int_perm_splice_cons<bits<2> sz8_64, string asm,
  5814. ZPRRegOp zprty, RegisterOperand VecList>
  5815. : I<(outs zprty:$Zd), (ins PPR3bAny:$Pg, VecList:$Zn),
  5816. asm, "\t$Zd, $Pg, $Zn",
  5817. "",
  5818. []>, Sched<[]> {
  5819. bits<3> Pg;
  5820. bits<5> Zn;
  5821. bits<5> Zd;
  5822. let Inst{31-24} = 0b00000101;
  5823. let Inst{23-22} = sz8_64;
  5824. let Inst{21-13} = 0b101101100;
  5825. let Inst{12-10} = Pg;
  5826. let Inst{9-5} = Zn;
  5827. let Inst{4-0} = Zd;
  5828. }
  5829. multiclass sve2_int_perm_splice_cons<string asm> {
  5830. def _B : sve2_int_perm_splice_cons<0b00, asm, ZPR8, ZZ_b>;
  5831. def _H : sve2_int_perm_splice_cons<0b01, asm, ZPR16, ZZ_h>;
  5832. def _S : sve2_int_perm_splice_cons<0b10, asm, ZPR32, ZZ_s>;
  5833. def _D : sve2_int_perm_splice_cons<0b11, asm, ZPR64, ZZ_d>;
  5834. }
  5835. class sve_int_perm_rev<bits<2> sz8_64, bits<2> opc, string asm,
  5836. ZPRRegOp zprty>
  5837. : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, zprty:$Zn),
  5838. asm, "\t$Zd, $Pg/m, $Zn",
  5839. "",
  5840. []>, Sched<[]> {
  5841. bits<5> Zd;
  5842. bits<3> Pg;
  5843. bits<5> Zn;
  5844. let Inst{31-24} = 0b00000101;
  5845. let Inst{23-22} = sz8_64;
  5846. let Inst{21-18} = 0b1001;
  5847. let Inst{17-16} = opc;
  5848. let Inst{15-13} = 0b100;
  5849. let Inst{12-10} = Pg;
  5850. let Inst{9-5} = Zn;
  5851. let Inst{4-0} = Zd;
  5852. let Constraints = "$Zd = $_Zd";
  5853. let DestructiveInstType = DestructiveOther;
  5854. let ElementSize = zprty.ElementSize;
  5855. }
  5856. multiclass sve_int_perm_rev_rbit<string asm, SDPatternOperator op> {
  5857. def _B : sve_int_perm_rev<0b00, 0b11, asm, ZPR8>;
  5858. def _H : sve_int_perm_rev<0b01, 0b11, asm, ZPR16>;
  5859. def _S : sve_int_perm_rev<0b10, 0b11, asm, ZPR32>;
  5860. def _D : sve_int_perm_rev<0b11, 0b11, asm, ZPR64>;
  5861. def : SVE_1_Op_Passthru_Pat<nxv16i8, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
  5862. def : SVE_1_Op_Passthru_Pat<nxv8i16, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
  5863. def : SVE_1_Op_Passthru_Pat<nxv4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  5864. def : SVE_1_Op_Passthru_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  5865. }
  5866. multiclass sve_int_perm_rev_revb<string asm, SDPatternOperator op> {
  5867. def _H : sve_int_perm_rev<0b01, 0b00, asm, ZPR16>;
  5868. def _S : sve_int_perm_rev<0b10, 0b00, asm, ZPR32>;
  5869. def _D : sve_int_perm_rev<0b11, 0b00, asm, ZPR64>;
  5870. def : SVE_1_Op_Passthru_Pat<nxv8i16, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
  5871. def : SVE_1_Op_Passthru_Pat<nxv4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  5872. def : SVE_1_Op_Passthru_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  5873. }
  5874. multiclass sve_int_perm_rev_revh<string asm, SDPatternOperator op> {
  5875. def _S : sve_int_perm_rev<0b10, 0b01, asm, ZPR32>;
  5876. def _D : sve_int_perm_rev<0b11, 0b01, asm, ZPR64>;
  5877. def : SVE_1_Op_Passthru_Pat<nxv4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  5878. def : SVE_1_Op_Passthru_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  5879. }
  5880. multiclass sve_int_perm_rev_revw<string asm, SDPatternOperator op> {
  5881. def _D : sve_int_perm_rev<0b11, 0b10, asm, ZPR64>;
  5882. def : SVE_1_Op_Passthru_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  5883. }
  5884. class sve_int_perm_cpy_r<bits<2> sz8_64, string asm, ZPRRegOp zprty,
  5885. RegisterClass srcRegType>
  5886. : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, srcRegType:$Rn),
  5887. asm, "\t$Zd, $Pg/m, $Rn",
  5888. "",
  5889. []>, Sched<[]> {
  5890. bits<3> Pg;
  5891. bits<5> Rn;
  5892. bits<5> Zd;
  5893. let Inst{31-24} = 0b00000101;
  5894. let Inst{23-22} = sz8_64;
  5895. let Inst{21-13} = 0b101000101;
  5896. let Inst{12-10} = Pg;
  5897. let Inst{9-5} = Rn;
  5898. let Inst{4-0} = Zd;
  5899. let Constraints = "$Zd = $_Zd";
  5900. let DestructiveInstType = DestructiveOther;
  5901. let ElementSize = zprty.ElementSize;
  5902. }
  5903. multiclass sve_int_perm_cpy_r<string asm, SDPatternOperator op> {
  5904. def _B : sve_int_perm_cpy_r<0b00, asm, ZPR8, GPR32sp>;
  5905. def _H : sve_int_perm_cpy_r<0b01, asm, ZPR16, GPR32sp>;
  5906. def _S : sve_int_perm_cpy_r<0b10, asm, ZPR32, GPR32sp>;
  5907. def _D : sve_int_perm_cpy_r<0b11, asm, ZPR64, GPR64sp>;
  5908. def : InstAlias<"mov $Zd, $Pg/m, $Rn",
  5909. (!cast<Instruction>(NAME # _B) ZPR8:$Zd, PPR3bAny:$Pg, GPR32sp:$Rn), 1>;
  5910. def : InstAlias<"mov $Zd, $Pg/m, $Rn",
  5911. (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPR3bAny:$Pg, GPR32sp:$Rn), 1>;
  5912. def : InstAlias<"mov $Zd, $Pg/m, $Rn",
  5913. (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPR3bAny:$Pg, GPR32sp:$Rn), 1>;
  5914. def : InstAlias<"mov $Zd, $Pg/m, $Rn",
  5915. (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPR3bAny:$Pg, GPR64sp:$Rn), 1>;
  5916. def : Pat<(nxv16i8 (op nxv16i1:$pg, i32:$splat, nxv16i8:$passthru)),
  5917. (!cast<Instruction>(NAME # _B) $passthru, $pg, $splat)>;
  5918. def : Pat<(nxv8i16 (op nxv8i1:$pg, i32:$splat, nxv8i16:$passthru)),
  5919. (!cast<Instruction>(NAME # _H) $passthru, $pg, $splat)>;
  5920. def : Pat<(nxv4i32 (op nxv4i1:$pg, i32:$splat, nxv4i32:$passthru)),
  5921. (!cast<Instruction>(NAME # _S) $passthru, $pg, $splat)>;
  5922. def : Pat<(nxv2i64 (op nxv2i1:$pg, i64:$splat, nxv2i64:$passthru)),
  5923. (!cast<Instruction>(NAME # _D) $passthru, $pg, $splat)>;
  5924. }
  5925. class sve_int_perm_cpy_v<bits<2> sz8_64, string asm, ZPRRegOp zprty,
  5926. RegisterClass srcRegtype>
  5927. : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, srcRegtype:$Vn),
  5928. asm, "\t$Zd, $Pg/m, $Vn",
  5929. "",
  5930. []>, Sched<[]> {
  5931. bits<3> Pg;
  5932. bits<5> Vn;
  5933. bits<5> Zd;
  5934. let Inst{31-24} = 0b00000101;
  5935. let Inst{23-22} = sz8_64;
  5936. let Inst{21-13} = 0b100000100;
  5937. let Inst{12-10} = Pg;
  5938. let Inst{9-5} = Vn;
  5939. let Inst{4-0} = Zd;
  5940. let Constraints = "$Zd = $_Zd";
  5941. let DestructiveInstType = DestructiveOther;
  5942. let ElementSize = zprty.ElementSize;
  5943. }
  5944. multiclass sve_int_perm_cpy_v<string asm, SDPatternOperator op> {
  5945. def _B : sve_int_perm_cpy_v<0b00, asm, ZPR8, FPR8>;
  5946. def _H : sve_int_perm_cpy_v<0b01, asm, ZPR16, FPR16>;
  5947. def _S : sve_int_perm_cpy_v<0b10, asm, ZPR32, FPR32>;
  5948. def _D : sve_int_perm_cpy_v<0b11, asm, ZPR64, FPR64>;
  5949. def : InstAlias<"mov $Zd, $Pg/m, $Vn",
  5950. (!cast<Instruction>(NAME # _B) ZPR8:$Zd, PPR3bAny:$Pg, FPR8:$Vn), 1>;
  5951. def : InstAlias<"mov $Zd, $Pg/m, $Vn",
  5952. (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPR3bAny:$Pg, FPR16:$Vn), 1>;
  5953. def : InstAlias<"mov $Zd, $Pg/m, $Vn",
  5954. (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPR3bAny:$Pg, FPR32:$Vn), 1>;
  5955. def : InstAlias<"mov $Zd, $Pg/m, $Vn",
  5956. (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPR3bAny:$Pg, FPR64:$Vn), 1>;
  5957. def : Pat<(nxv8f16 (op nxv8i1:$pg, f16:$splat, nxv8f16:$passthru)),
  5958. (!cast<Instruction>(NAME # _H) $passthru, $pg, $splat)>;
  5959. def : Pat<(nxv2f32 (op nxv2i1:$pg, f32:$splat, nxv2f32:$passthru)),
  5960. (!cast<Instruction>(NAME # _S) $passthru, $pg, $splat)>;
  5961. def : Pat<(nxv4f32 (op nxv4i1:$pg, f32:$splat, nxv4f32:$passthru)),
  5962. (!cast<Instruction>(NAME # _S) $passthru, $pg, $splat)>;
  5963. def : Pat<(nxv2f64 (op nxv2i1:$pg, f64:$splat, nxv2f64:$passthru)),
  5964. (!cast<Instruction>(NAME # _D) $passthru, $pg, $splat)>;
  5965. def : Pat<(nxv8bf16 (op nxv8i1:$pg, bf16:$splat, nxv8bf16:$passthru)),
  5966. (!cast<Instruction>(NAME # _H) $passthru, $pg, $splat)>;
  5967. }
  5968. class sve_int_perm_compact<bit sz, string asm, ZPRRegOp zprty>
  5969. : I<(outs zprty:$Zd), (ins PPR3bAny:$Pg, zprty:$Zn),
  5970. asm, "\t$Zd, $Pg, $Zn",
  5971. "",
  5972. []>, Sched<[]> {
  5973. bits<3> Pg;
  5974. bits<5> Zd;
  5975. bits<5> Zn;
  5976. let Inst{31-23} = 0b000001011;
  5977. let Inst{22} = sz;
  5978. let Inst{21-13} = 0b100001100;
  5979. let Inst{12-10} = Pg;
  5980. let Inst{9-5} = Zn;
  5981. let Inst{4-0} = Zd;
  5982. }
  5983. multiclass sve_int_perm_compact<string asm, SDPatternOperator op> {
  5984. def _S : sve_int_perm_compact<0b0, asm, ZPR32>;
  5985. def _D : sve_int_perm_compact<0b1, asm, ZPR64>;
  5986. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  5987. def : SVE_2_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
  5988. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  5989. def : SVE_2_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
  5990. }
  5991. //===----------------------------------------------------------------------===//
  5992. // SVE Memory - Contiguous Load Group
  5993. //===----------------------------------------------------------------------===//
  5994. class sve_mem_cld_si_base<bits<4> dtype, bit nf, string asm,
  5995. RegisterOperand VecList>
  5996. : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
  5997. asm, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
  5998. "",
  5999. []>, Sched<[]> {
  6000. bits<3> Pg;
  6001. bits<5> Rn;
  6002. bits<5> Zt;
  6003. bits<4> imm4;
  6004. let Inst{31-25} = 0b1010010;
  6005. let Inst{24-21} = dtype;
  6006. let Inst{20} = nf;
  6007. let Inst{19-16} = imm4;
  6008. let Inst{15-13} = 0b101;
  6009. let Inst{12-10} = Pg;
  6010. let Inst{9-5} = Rn;
  6011. let Inst{4-0} = Zt;
  6012. let mayLoad = 1;
  6013. let Uses = !if(nf, [FFR], []);
  6014. let Defs = !if(nf, [FFR], []);
  6015. }
  6016. multiclass sve_mem_cld_si_base<bits<4> dtype, bit nf, string asm,
  6017. RegisterOperand listty, ZPRRegOp zprty> {
  6018. def _REAL : sve_mem_cld_si_base<dtype, nf, asm, listty>;
  6019. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  6020. (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
  6021. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
  6022. (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
  6023. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  6024. (!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
  6025. // We need a layer of indirection because early machine code passes balk at
  6026. // physical register (i.e. FFR) uses that have no previous definition.
  6027. let hasSideEffects = 1, hasNoSchedulingInfo = 1, mayLoad = 1 in {
  6028. def "" : Pseudo<(outs listty:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), []>,
  6029. PseudoInstExpansion<(!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4)>;
  6030. }
  6031. }
  6032. multiclass sve_mem_cld_si<bits<4> dtype, string asm, RegisterOperand listty,
  6033. ZPRRegOp zprty>
  6034. : sve_mem_cld_si_base<dtype, 0, asm, listty, zprty>;
  6035. class sve_mem_cldnt_si_base<bits<2> msz, string asm, RegisterOperand VecList>
  6036. : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
  6037. asm, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
  6038. "",
  6039. []>, Sched<[]> {
  6040. bits<5> Zt;
  6041. bits<3> Pg;
  6042. bits<5> Rn;
  6043. bits<4> imm4;
  6044. let Inst{31-25} = 0b1010010;
  6045. let Inst{24-23} = msz;
  6046. let Inst{22-20} = 0b000;
  6047. let Inst{19-16} = imm4;
  6048. let Inst{15-13} = 0b111;
  6049. let Inst{12-10} = Pg;
  6050. let Inst{9-5} = Rn;
  6051. let Inst{4-0} = Zt;
  6052. let mayLoad = 1;
  6053. }
  6054. multiclass sve_mem_cldnt_si<bits<2> msz, string asm, RegisterOperand listty,
  6055. ZPRRegOp zprty> {
  6056. def NAME : sve_mem_cldnt_si_base<msz, asm, listty>;
  6057. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  6058. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
  6059. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
  6060. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
  6061. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  6062. (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
  6063. }
  6064. class sve_mem_cldnt_ss_base<bits<2> msz, string asm, RegisterOperand VecList,
  6065. RegisterOperand gprty>
  6066. : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
  6067. asm, "\t$Zt, $Pg/z, [$Rn, $Rm]",
  6068. "",
  6069. []>, Sched<[]> {
  6070. bits<3> Pg;
  6071. bits<5> Rm;
  6072. bits<5> Rn;
  6073. bits<5> Zt;
  6074. let Inst{31-25} = 0b1010010;
  6075. let Inst{24-23} = msz;
  6076. let Inst{22-21} = 0b00;
  6077. let Inst{20-16} = Rm;
  6078. let Inst{15-13} = 0b110;
  6079. let Inst{12-10} = Pg;
  6080. let Inst{9-5} = Rn;
  6081. let Inst{4-0} = Zt;
  6082. let mayLoad = 1;
  6083. }
  6084. multiclass sve_mem_cldnt_ss<bits<2> msz, string asm, RegisterOperand listty,
  6085. ZPRRegOp zprty, RegisterOperand gprty> {
  6086. def NAME : sve_mem_cldnt_ss_base<msz, asm, listty, gprty>;
  6087. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
  6088. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
  6089. }
  6090. class sve_mem_ldqr_si<bits<2> sz, string asm, RegisterOperand VecList>
  6091. : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s16:$imm4),
  6092. asm, "\t$Zt, $Pg/z, [$Rn, $imm4]", "", []>, Sched<[]> {
  6093. bits<5> Zt;
  6094. bits<5> Rn;
  6095. bits<3> Pg;
  6096. bits<4> imm4;
  6097. let Inst{31-25} = 0b1010010;
  6098. let Inst{24-23} = sz;
  6099. let Inst{22-20} = 0;
  6100. let Inst{19-16} = imm4;
  6101. let Inst{15-13} = 0b001;
  6102. let Inst{12-10} = Pg;
  6103. let Inst{9-5} = Rn;
  6104. let Inst{4-0} = Zt;
  6105. let mayLoad = 1;
  6106. }
  6107. multiclass sve_mem_ldqr_si<bits<2> sz, string asm, RegisterOperand listty,
  6108. ZPRRegOp zprty> {
  6109. def NAME : sve_mem_ldqr_si<sz, asm, listty>;
  6110. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  6111. (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
  6112. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  6113. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
  6114. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4]",
  6115. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s16:$imm4), 0>;
  6116. }
  6117. class sve_mem_ldqr_ss<bits<2> sz, string asm, RegisterOperand VecList,
  6118. RegisterOperand gprty>
  6119. : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
  6120. asm, "\t$Zt, $Pg/z, [$Rn, $Rm]", "", []>, Sched<[]> {
  6121. bits<5> Zt;
  6122. bits<3> Pg;
  6123. bits<5> Rn;
  6124. bits<5> Rm;
  6125. let Inst{31-25} = 0b1010010;
  6126. let Inst{24-23} = sz;
  6127. let Inst{22-21} = 0;
  6128. let Inst{20-16} = Rm;
  6129. let Inst{15-13} = 0;
  6130. let Inst{12-10} = Pg;
  6131. let Inst{9-5} = Rn;
  6132. let Inst{4-0} = Zt;
  6133. let mayLoad = 1;
  6134. }
  6135. multiclass sve_mem_ldqr_ss<bits<2> sz, string asm, RegisterOperand listty,
  6136. ZPRRegOp zprty, RegisterOperand gprty> {
  6137. def NAME : sve_mem_ldqr_ss<sz, asm, listty, gprty>;
  6138. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
  6139. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
  6140. }
  6141. class sve_mem_ld_dup<bits<2> dtypeh, bits<2> dtypel, string asm,
  6142. RegisterOperand VecList, Operand immtype>
  6143. : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm6),
  6144. asm, "\t$Zt, $Pg/z, [$Rn, $imm6]",
  6145. "",
  6146. []>, Sched<[]> {
  6147. bits<3> Pg;
  6148. bits<5> Rn;
  6149. bits<5> Zt;
  6150. bits<6> imm6;
  6151. let Inst{31-25} = 0b1000010;
  6152. let Inst{24-23} = dtypeh;
  6153. let Inst{22} = 1;
  6154. let Inst{21-16} = imm6;
  6155. let Inst{15} = 0b1;
  6156. let Inst{14-13} = dtypel;
  6157. let Inst{12-10} = Pg;
  6158. let Inst{9-5} = Rn;
  6159. let Inst{4-0} = Zt;
  6160. let mayLoad = 1;
  6161. }
  6162. multiclass sve_mem_ld_dup<bits<2> dtypeh, bits<2> dtypel, string asm,
  6163. RegisterOperand zlistty, ZPRRegOp zprty, Operand immtype> {
  6164. def NAME : sve_mem_ld_dup<dtypeh, dtypel, asm, zlistty, immtype>;
  6165. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  6166. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
  6167. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm6]",
  6168. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm6), 0>;
  6169. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  6170. (!cast<Instruction>(NAME) zlistty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
  6171. }
  6172. class sve_mem_cld_ss_base<bits<4> dtype, bit ff, dag iops, string asm,
  6173. RegisterOperand VecList>
  6174. : I<(outs VecList:$Zt), iops,
  6175. asm, "\t$Zt, $Pg/z, [$Rn, $Rm]",
  6176. "",
  6177. []>, Sched<[]> {
  6178. bits<5> Zt;
  6179. bits<3> Pg;
  6180. bits<5> Rm;
  6181. bits<5> Rn;
  6182. let Inst{31-25} = 0b1010010;
  6183. let Inst{24-21} = dtype;
  6184. let Inst{20-16} = Rm;
  6185. let Inst{15-14} = 0b01;
  6186. let Inst{13} = ff;
  6187. let Inst{12-10} = Pg;
  6188. let Inst{9-5} = Rn;
  6189. let Inst{4-0} = Zt;
  6190. let mayLoad = 1;
  6191. let Uses = !if(ff, [FFR], []);
  6192. let Defs = !if(ff, [FFR], []);
  6193. }
  6194. multiclass sve_mem_cld_ss<bits<4> dtype, string asm, RegisterOperand listty,
  6195. ZPRRegOp zprty, RegisterOperand gprty> {
  6196. def "" : sve_mem_cld_ss_base<dtype, 0, (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
  6197. asm, listty>;
  6198. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
  6199. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
  6200. }
  6201. multiclass sve_mem_cldff_ss<bits<4> dtype, string asm, RegisterOperand listty,
  6202. ZPRRegOp zprty, RegisterOperand gprty> {
  6203. def _REAL : sve_mem_cld_ss_base<dtype, 1, (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
  6204. asm, listty>;
  6205. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
  6206. (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
  6207. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  6208. (!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, XZR), 1>;
  6209. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  6210. (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, XZR), 0>;
  6211. // We need a layer of indirection because early machine code passes balk at
  6212. // physical register (i.e. FFR) uses that have no previous definition.
  6213. let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
  6214. def "" : Pseudo<(outs listty:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), []>,
  6215. PseudoInstExpansion<(!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm)>;
  6216. }
  6217. }
  6218. multiclass sve_mem_cldnf_si<bits<4> dtype, string asm, RegisterOperand listty,
  6219. ZPRRegOp zprty>
  6220. : sve_mem_cld_si_base<dtype, 1, asm, listty, zprty>;
  6221. class sve_mem_eld_si<bits<2> sz, bits<3> nregs, RegisterOperand VecList,
  6222. string asm, Operand immtype>
  6223. : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm4),
  6224. asm, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
  6225. "",
  6226. []>, Sched<[]> {
  6227. bits<5> Zt;
  6228. bits<3> Pg;
  6229. bits<5> Rn;
  6230. bits<4> imm4;
  6231. let Inst{31-25} = 0b1010010;
  6232. let Inst{24-23} = sz;
  6233. let Inst{22-21} = nregs{1-0};
  6234. let Inst{20} = nregs{2};
  6235. let Inst{19-16} = imm4;
  6236. let Inst{15-13} = 0b111;
  6237. let Inst{12-10} = Pg;
  6238. let Inst{9-5} = Rn;
  6239. let Inst{4-0} = Zt;
  6240. let mayLoad = 1;
  6241. }
  6242. multiclass sve_mem_eld_si<bits<2> sz, bits<3> nregs, RegisterOperand VecList,
  6243. string asm, Operand immtype> {
  6244. def NAME : sve_mem_eld_si<sz, nregs, VecList, asm, immtype>;
  6245. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  6246. (!cast<Instruction>(NAME) VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
  6247. }
  6248. class sve_mem_eld_ss<bits<2> sz, bits<3> nregs, RegisterOperand VecList,
  6249. string asm, RegisterOperand gprty>
  6250. : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
  6251. asm, "\t$Zt, $Pg/z, [$Rn, $Rm]",
  6252. "",
  6253. []>, Sched<[]> {
  6254. bits<3> Pg;
  6255. bits<5> Rm;
  6256. bits<5> Rn;
  6257. bits<5> Zt;
  6258. let Inst{31-25} = 0b1010010;
  6259. let Inst{24-23} = sz;
  6260. let Inst{22-21} = nregs{1-0};
  6261. let Inst{20-16} = Rm;
  6262. let Inst{15} = 0b1;
  6263. let Inst{14} = nregs{2};
  6264. let Inst{13} = 0b0;
  6265. let Inst{12-10} = Pg;
  6266. let Inst{9-5} = Rn;
  6267. let Inst{4-0} = Zt;
  6268. let mayLoad = 1;
  6269. }
  6270. //===----------------------------------------------------------------------===//
  6271. // SVE Memory - 32-bit Gather and Unsized Contiguous Group
  6272. //===----------------------------------------------------------------------===//
  6273. // bit xs is '1' if offsets are signed
  6274. // bit scaled is '1' if the offsets are scaled
  6275. class sve_mem_32b_gld_sv<bits<4> opc, bit xs, bit scaled, string asm,
  6276. RegisterOperand zprext>
  6277. : I<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
  6278. asm, "\t$Zt, $Pg/z, [$Rn, $Zm]",
  6279. "",
  6280. []>, Sched<[]> {
  6281. bits<3> Pg;
  6282. bits<5> Rn;
  6283. bits<5> Zm;
  6284. bits<5> Zt;
  6285. let Inst{31-25} = 0b1000010;
  6286. let Inst{24-23} = opc{3-2};
  6287. let Inst{22} = xs;
  6288. let Inst{21} = scaled;
  6289. let Inst{20-16} = Zm;
  6290. let Inst{15} = 0b0;
  6291. let Inst{14-13} = opc{1-0};
  6292. let Inst{12-10} = Pg;
  6293. let Inst{9-5} = Rn;
  6294. let Inst{4-0} = Zt;
  6295. let mayLoad = 1;
  6296. let Defs = !if(!eq(opc{0}, 1), [FFR], []);
  6297. let Uses = !if(!eq(opc{0}, 1), [FFR], []);
  6298. }
  6299. multiclass sve_mem_32b_gld_sv_32_scaled<bits<4> opc, string asm,
  6300. SDPatternOperator sxtw_op,
  6301. SDPatternOperator uxtw_op,
  6302. RegisterOperand sxtw_opnd,
  6303. RegisterOperand uxtw_opnd,
  6304. ValueType vt> {
  6305. def _UXTW_SCALED_REAL : sve_mem_32b_gld_sv<opc, 0, 1, asm, uxtw_opnd>;
  6306. def _SXTW_SCALED_REAL : sve_mem_32b_gld_sv<opc, 1, 1, asm, sxtw_opnd>;
  6307. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
  6308. (!cast<Instruction>(NAME # _UXTW_SCALED_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
  6309. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
  6310. (!cast<Instruction>(NAME # _SXTW_SCALED_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
  6311. // We need a layer of indirection because early machine code passes balk at
  6312. // physical register (i.e. FFR) uses that have no previous definition.
  6313. let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
  6314. def _UXTW_SCALED : Pseudo<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), []>,
  6315. PseudoInstExpansion<(!cast<Instruction>(NAME # _UXTW_SCALED_REAL) Z_s:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm)>;
  6316. def _SXTW_SCALED : Pseudo<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), []>,
  6317. PseudoInstExpansion<(!cast<Instruction>(NAME # _SXTW_SCALED_REAL) Z_s:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm)>;
  6318. }
  6319. def : Pat<(nxv4i32 (uxtw_op (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$indices), vt)),
  6320. (!cast<Instruction>(NAME # _UXTW_SCALED) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
  6321. def : Pat<(nxv4i32 (sxtw_op (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$indices), vt)),
  6322. (!cast<Instruction>(NAME # _SXTW_SCALED) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
  6323. }
  6324. multiclass sve_mem_32b_gld_vs_32_unscaled<bits<4> opc, string asm,
  6325. SDPatternOperator sxtw_op,
  6326. SDPatternOperator uxtw_op,
  6327. RegisterOperand sxtw_opnd,
  6328. RegisterOperand uxtw_opnd,
  6329. ValueType vt> {
  6330. def _UXTW_REAL : sve_mem_32b_gld_sv<opc, 0, 0, asm, uxtw_opnd>;
  6331. def _SXTW_REAL : sve_mem_32b_gld_sv<opc, 1, 0, asm, sxtw_opnd>;
  6332. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
  6333. (!cast<Instruction>(NAME # _UXTW_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
  6334. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
  6335. (!cast<Instruction>(NAME # _SXTW_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
  6336. // We need a layer of indirection because early machine code passes balk at
  6337. // physical register (i.e. FFR) uses that have no previous definition.
  6338. let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
  6339. def _UXTW : Pseudo<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), []>,
  6340. PseudoInstExpansion<(!cast<Instruction>(NAME # _UXTW_REAL) Z_s:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm)>;
  6341. def _SXTW : Pseudo<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), []>,
  6342. PseudoInstExpansion<(!cast<Instruction>(NAME # _SXTW_REAL) Z_s:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm)>;
  6343. }
  6344. def : Pat<(nxv4i32 (uxtw_op (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt)),
  6345. (!cast<Instruction>(NAME # _UXTW) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  6346. def : Pat<(nxv4i32 (sxtw_op (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt)),
  6347. (!cast<Instruction>(NAME # _SXTW) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  6348. }
  6349. class sve_mem_32b_gld_vi<bits<4> opc, string asm, Operand imm_ty>
  6350. : I<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5),
  6351. asm, "\t$Zt, $Pg/z, [$Zn, $imm5]",
  6352. "",
  6353. []>, Sched<[]> {
  6354. bits<3> Pg;
  6355. bits<5> Zn;
  6356. bits<5> Zt;
  6357. bits<5> imm5;
  6358. let Inst{31-25} = 0b1000010;
  6359. let Inst{24-23} = opc{3-2};
  6360. let Inst{22-21} = 0b01;
  6361. let Inst{20-16} = imm5;
  6362. let Inst{15} = 0b1;
  6363. let Inst{14-13} = opc{1-0};
  6364. let Inst{12-10} = Pg;
  6365. let Inst{9-5} = Zn;
  6366. let Inst{4-0} = Zt;
  6367. let mayLoad = 1;
  6368. let Defs = !if(!eq(opc{0}, 1), [FFR], []);
  6369. let Uses = !if(!eq(opc{0}, 1), [FFR], []);
  6370. }
  6371. multiclass sve_mem_32b_gld_vi_32_ptrs<bits<4> opc, string asm, Operand imm_ty,
  6372. SDPatternOperator op, ValueType vt> {
  6373. def _IMM_REAL : sve_mem_32b_gld_vi<opc, asm, imm_ty>;
  6374. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
  6375. (!cast<Instruction>(NAME # _IMM_REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 0>;
  6376. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $imm5]",
  6377. (!cast<Instruction>(NAME # _IMM_REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5), 0>;
  6378. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
  6379. (!cast<Instruction>(NAME # _IMM_REAL) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 1>;
  6380. // We need a layer of indirection because early machine code passes balk at
  6381. // physical register (i.e. FFR) uses that have no previous definition.
  6382. let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
  6383. def _IMM : Pseudo<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5), []>,
  6384. PseudoInstExpansion<(!cast<Instruction>(NAME # _IMM_REAL) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5)>;
  6385. }
  6386. def : Pat<(nxv4i32 (op (nxv4i1 PPR:$gp), (nxv4i32 ZPR:$ptrs), imm_ty:$index, vt)),
  6387. (!cast<Instruction>(NAME # _IMM) PPR:$gp, ZPR:$ptrs, imm_ty:$index)>;
  6388. }
  6389. class sve_mem_prfm_si<bits<2> msz, string asm>
  6390. : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, simm6s1:$imm6),
  6391. asm, "\t$prfop, $Pg, [$Rn, $imm6, mul vl]",
  6392. "",
  6393. []>, Sched<[]> {
  6394. bits<5> Rn;
  6395. bits<3> Pg;
  6396. bits<6> imm6;
  6397. bits<4> prfop;
  6398. let Inst{31-22} = 0b1000010111;
  6399. let Inst{21-16} = imm6;
  6400. let Inst{15} = 0b0;
  6401. let Inst{14-13} = msz;
  6402. let Inst{12-10} = Pg;
  6403. let Inst{9-5} = Rn;
  6404. let Inst{4} = 0b0;
  6405. let Inst{3-0} = prfop;
  6406. let hasSideEffects = 1;
  6407. }
  6408. multiclass sve_mem_prfm_si<bits<2> msz, string asm> {
  6409. def NAME : sve_mem_prfm_si<msz, asm>;
  6410. def : InstAlias<asm # "\t$prfop, $Pg, [$Rn]",
  6411. (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
  6412. }
  6413. class sve_mem_prfm_ss<bits<3> opc, string asm, RegisterOperand gprty>
  6414. : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
  6415. asm, "\t$prfop, $Pg, [$Rn, $Rm]",
  6416. "",
  6417. []>, Sched<[]> {
  6418. bits<5> Rm;
  6419. bits<5> Rn;
  6420. bits<3> Pg;
  6421. bits<4> prfop;
  6422. let Inst{31-25} = 0b1000010;
  6423. let Inst{24-23} = opc{2-1};
  6424. let Inst{22-21} = 0b00;
  6425. let Inst{20-16} = Rm;
  6426. let Inst{15} = 0b1;
  6427. let Inst{14} = opc{0};
  6428. let Inst{13} = 0b0;
  6429. let Inst{12-10} = Pg;
  6430. let Inst{9-5} = Rn;
  6431. let Inst{4} = 0b0;
  6432. let Inst{3-0} = prfop;
  6433. let hasSideEffects = 1;
  6434. }
  6435. class sve_mem_32b_prfm_sv<bits<2> msz, bit xs, string asm,
  6436. RegisterOperand zprext>
  6437. : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
  6438. asm, "\t$prfop, $Pg, [$Rn, $Zm]",
  6439. "",
  6440. []>, Sched<[]> {
  6441. bits<3> Pg;
  6442. bits<5> Rn;
  6443. bits<5> Zm;
  6444. bits<4> prfop;
  6445. let Inst{31-23} = 0b100001000;
  6446. let Inst{22} = xs;
  6447. let Inst{21} = 0b1;
  6448. let Inst{20-16} = Zm;
  6449. let Inst{15} = 0b0;
  6450. let Inst{14-13} = msz;
  6451. let Inst{12-10} = Pg;
  6452. let Inst{9-5} = Rn;
  6453. let Inst{4} = 0b0;
  6454. let Inst{3-0} = prfop;
  6455. let hasSideEffects = 1;
  6456. }
  6457. multiclass sve_mem_32b_prfm_sv_scaled<bits<2> msz, string asm,
  6458. RegisterOperand sxtw_opnd,
  6459. RegisterOperand uxtw_opnd,
  6460. SDPatternOperator op_sxtw,
  6461. SDPatternOperator op_uxtw> {
  6462. def _UXTW_SCALED : sve_mem_32b_prfm_sv<msz, 0, asm, uxtw_opnd>;
  6463. def _SXTW_SCALED : sve_mem_32b_prfm_sv<msz, 1, asm, sxtw_opnd>;
  6464. def : Pat<(op_uxtw (nxv4i1 PPR3bAny:$Pg), (i64 GPR64sp:$Rn), (nxv4i32 uxtw_opnd:$Zm), (i32 sve_prfop:$prfop)),
  6465. (!cast<Instruction>(NAME # _UXTW_SCALED) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm)>;
  6466. def : Pat<(op_sxtw (nxv4i1 PPR3bAny:$Pg), (i64 GPR64sp:$Rn), (nxv4i32 sxtw_opnd:$Zm), (i32 sve_prfop:$prfop)),
  6467. (!cast<Instruction>(NAME # _SXTW_SCALED) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm)>;
  6468. }
  6469. class sve_mem_32b_prfm_vi<bits<2> msz, string asm, Operand imm_ty>
  6470. : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5),
  6471. asm, "\t$prfop, $Pg, [$Zn, $imm5]",
  6472. "",
  6473. []>, Sched<[]> {
  6474. bits<3> Pg;
  6475. bits<5> Zn;
  6476. bits<5> imm5;
  6477. bits<4> prfop;
  6478. let Inst{31-25} = 0b1000010;
  6479. let Inst{24-23} = msz;
  6480. let Inst{22-21} = 0b00;
  6481. let Inst{20-16} = imm5;
  6482. let Inst{15-13} = 0b111;
  6483. let Inst{12-10} = Pg;
  6484. let Inst{9-5} = Zn;
  6485. let Inst{4} = 0b0;
  6486. let Inst{3-0} = prfop;
  6487. }
  6488. multiclass sve_mem_32b_prfm_vi<bits<2> msz, string asm, Operand imm_ty, SDPatternOperator op> {
  6489. def NAME : sve_mem_32b_prfm_vi<msz, asm, imm_ty>;
  6490. def : InstAlias<asm # "\t$prfop, $Pg, [$Zn]",
  6491. (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, ZPR32:$Zn, 0), 1>;
  6492. def : Pat<(op (nxv4i1 PPR_3b:$Pg), (nxv4i32 ZPR32:$Zn), (i64 imm_ty:$imm), (i32 sve_prfop:$prfop)),
  6493. (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR_3b:$Pg, ZPR32:$Zn, imm_ty:$imm)>;
  6494. }
  6495. class sve_mem_z_fill<string asm>
  6496. : I<(outs ZPRAny:$Zt), (ins GPR64sp:$Rn, simm9:$imm9),
  6497. asm, "\t$Zt, [$Rn, $imm9, mul vl]",
  6498. "",
  6499. []>, Sched<[]> {
  6500. bits<5> Rn;
  6501. bits<5> Zt;
  6502. bits<9> imm9;
  6503. let Inst{31-22} = 0b1000010110;
  6504. let Inst{21-16} = imm9{8-3};
  6505. let Inst{15-13} = 0b010;
  6506. let Inst{12-10} = imm9{2-0};
  6507. let Inst{9-5} = Rn;
  6508. let Inst{4-0} = Zt;
  6509. let mayLoad = 1;
  6510. }
  6511. multiclass sve_mem_z_fill<string asm> {
  6512. def NAME : sve_mem_z_fill<asm>;
  6513. def : InstAlias<asm # "\t$Zt, [$Rn]",
  6514. (!cast<Instruction>(NAME) ZPRAny:$Zt, GPR64sp:$Rn, 0), 1>;
  6515. }
  6516. class sve_mem_p_fill<string asm>
  6517. : I<(outs PPRAny:$Pt), (ins GPR64sp:$Rn, simm9:$imm9),
  6518. asm, "\t$Pt, [$Rn, $imm9, mul vl]",
  6519. "",
  6520. []>, Sched<[]> {
  6521. bits<4> Pt;
  6522. bits<5> Rn;
  6523. bits<9> imm9;
  6524. let Inst{31-22} = 0b1000010110;
  6525. let Inst{21-16} = imm9{8-3};
  6526. let Inst{15-13} = 0b000;
  6527. let Inst{12-10} = imm9{2-0};
  6528. let Inst{9-5} = Rn;
  6529. let Inst{4} = 0b0;
  6530. let Inst{3-0} = Pt;
  6531. let mayLoad = 1;
  6532. }
  6533. multiclass sve_mem_p_fill<string asm> {
  6534. def NAME : sve_mem_p_fill<asm>;
  6535. def : InstAlias<asm # "\t$Pt, [$Rn]",
  6536. (!cast<Instruction>(NAME) PPRAny:$Pt, GPR64sp:$Rn, 0), 1>;
  6537. }
  6538. class sve2_mem_gldnt_vs_base<bits<5> opc, dag iops, string asm,
  6539. RegisterOperand VecList>
  6540. : I<(outs VecList:$Zt), iops,
  6541. asm, "\t$Zt, $Pg/z, [$Zn, $Rm]",
  6542. "",
  6543. []>, Sched<[]> {
  6544. bits<3> Pg;
  6545. bits<5> Rm;
  6546. bits<5> Zn;
  6547. bits<5> Zt;
  6548. let Inst{31} = 0b1;
  6549. let Inst{30} = opc{4};
  6550. let Inst{29-25} = 0b00010;
  6551. let Inst{24-23} = opc{3-2};
  6552. let Inst{22-21} = 0b00;
  6553. let Inst{20-16} = Rm;
  6554. let Inst{15} = 0b1;
  6555. let Inst{14-13} = opc{1-0};
  6556. let Inst{12-10} = Pg;
  6557. let Inst{9-5} = Zn;
  6558. let Inst{4-0} = Zt;
  6559. let mayLoad = 1;
  6560. }
  6561. multiclass sve2_mem_gldnt_vs_32_ptrs<bits<5> opc, string asm,
  6562. SDPatternOperator op,
  6563. ValueType vt> {
  6564. def _REAL : sve2_mem_gldnt_vs_base<opc, (ins PPR3bAny:$Pg, ZPR32:$Zn, GPR64:$Rm),
  6565. asm, Z_s>;
  6566. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $Rm]",
  6567. (!cast<Instruction>(NAME # _REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, GPR64:$Rm), 0>;
  6568. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
  6569. (!cast<Instruction>(NAME # _REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, XZR), 0>;
  6570. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
  6571. (!cast<Instruction>(NAME # _REAL) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, XZR), 1>;
  6572. def : Pat <(nxv4i32 (op (nxv4i1 PPR3bAny:$Pg), (nxv4i32 ZPR32:$Zd), (i64 GPR64:$Rm), vt)),
  6573. (!cast<Instruction>(NAME # _REAL) PPR3bAny:$Pg, ZPR32:$Zd, GPR64:$Rm)>;
  6574. }
  6575. multiclass sve2_mem_gldnt_vs_64_ptrs<bits<5> opc, string asm,
  6576. SDPatternOperator op,
  6577. ValueType vt> {
  6578. def _REAL : sve2_mem_gldnt_vs_base<opc, (ins PPR3bAny:$Pg, ZPR64:$Zn, GPR64:$Rm),
  6579. asm, Z_d>;
  6580. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $Rm]",
  6581. (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, GPR64:$Rm), 0>;
  6582. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
  6583. (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, XZR), 0>;
  6584. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
  6585. (!cast<Instruction>(NAME # _REAL) Z_d:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, XZR), 1>;
  6586. def : Pat <(nxv2i64 (op (nxv2i1 PPR3bAny:$Pg), (nxv2i64 ZPR64:$Zd), (i64 GPR64:$Rm), vt)),
  6587. (!cast<Instruction>(NAME # _REAL) PPR3bAny:$Pg, ZPR64:$Zd, GPR64:$Rm)>;
  6588. }
  6589. //===----------------------------------------------------------------------===//
  6590. // SVE Memory - 64-bit Gather Group
  6591. //===----------------------------------------------------------------------===//
  6592. // bit xs is '1' if offsets are signed
  6593. // bit scaled is '1' if the offsets are scaled
  6594. // bit lsl is '0' if the offsets are extended (uxtw/sxtw), '1' if shifted (lsl)
  6595. class sve_mem_64b_gld_sv<bits<4> opc, bit xs, bit scaled, bit lsl, string asm,
  6596. RegisterOperand zprext>
  6597. : I<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
  6598. asm, "\t$Zt, $Pg/z, [$Rn, $Zm]",
  6599. "",
  6600. []>, Sched<[]> {
  6601. bits<3> Pg;
  6602. bits<5> Rn;
  6603. bits<5> Zm;
  6604. bits<5> Zt;
  6605. let Inst{31-25} = 0b1100010;
  6606. let Inst{24-23} = opc{3-2};
  6607. let Inst{22} = xs;
  6608. let Inst{21} = scaled;
  6609. let Inst{20-16} = Zm;
  6610. let Inst{15} = lsl;
  6611. let Inst{14-13} = opc{1-0};
  6612. let Inst{12-10} = Pg;
  6613. let Inst{9-5} = Rn;
  6614. let Inst{4-0} = Zt;
  6615. let mayLoad = 1;
  6616. let Defs = !if(!eq(opc{0}, 1), [FFR], []);
  6617. let Uses = !if(!eq(opc{0}, 1), [FFR], []);
  6618. }
  6619. multiclass sve_mem_64b_gld_sv_32_scaled<bits<4> opc, string asm,
  6620. SDPatternOperator sxtw_op,
  6621. SDPatternOperator uxtw_op,
  6622. RegisterOperand sxtw_opnd,
  6623. RegisterOperand uxtw_opnd,
  6624. ValueType vt> {
  6625. def _UXTW_SCALED_REAL : sve_mem_64b_gld_sv<opc, 0, 1, 0, asm, uxtw_opnd>;
  6626. def _SXTW_SCALED_REAL : sve_mem_64b_gld_sv<opc, 1, 1, 0, asm, sxtw_opnd>;
  6627. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
  6628. (!cast<Instruction>(NAME # _UXTW_SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
  6629. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
  6630. (!cast<Instruction>(NAME # _SXTW_SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
  6631. // We need a layer of indirection because early machine code passes balk at
  6632. // physical register (i.e. FFR) uses that have no previous definition.
  6633. let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
  6634. def _UXTW_SCALED : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), []>,
  6635. PseudoInstExpansion<(!cast<Instruction>(NAME # _UXTW_SCALED_REAL) Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm)>;
  6636. def _SXTW_SCALED : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), []>,
  6637. PseudoInstExpansion<(!cast<Instruction>(NAME # _SXTW_SCALED_REAL) Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm)>;
  6638. }
  6639. def : Pat<(nxv2i64 (uxtw_op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$indices), vt)),
  6640. (!cast<Instruction>(NAME # _UXTW_SCALED) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
  6641. def : Pat<(nxv2i64 (sxtw_op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$indices), vt)),
  6642. (!cast<Instruction>(NAME # _SXTW_SCALED) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
  6643. }
  6644. multiclass sve_mem_64b_gld_vs_32_unscaled<bits<4> opc, string asm,
  6645. SDPatternOperator sxtw_op,
  6646. SDPatternOperator uxtw_op,
  6647. RegisterOperand sxtw_opnd,
  6648. RegisterOperand uxtw_opnd,
  6649. ValueType vt> {
  6650. def _UXTW_REAL : sve_mem_64b_gld_sv<opc, 0, 0, 0, asm, uxtw_opnd>;
  6651. def _SXTW_REAL : sve_mem_64b_gld_sv<opc, 1, 0, 0, asm, sxtw_opnd>;
  6652. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
  6653. (!cast<Instruction>(NAME # _UXTW_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
  6654. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
  6655. (!cast<Instruction>(NAME # _SXTW_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
  6656. // We need a layer of indirection because early machine code passes balk at
  6657. // physical register (i.e. FFR) uses that have no previous definition.
  6658. let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
  6659. def _UXTW : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), []>,
  6660. PseudoInstExpansion<(!cast<Instruction>(NAME # _UXTW_REAL) Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm)>;
  6661. def _SXTW : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), []>,
  6662. PseudoInstExpansion<(!cast<Instruction>(NAME # _SXTW_REAL) Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm)>;
  6663. }
  6664. def : Pat<(nxv2i64 (uxtw_op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt)),
  6665. (!cast<Instruction>(NAME # _UXTW) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  6666. def : Pat<(nxv2i64 (sxtw_op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt)),
  6667. (!cast<Instruction>(NAME # _SXTW) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  6668. }
  6669. multiclass sve_mem_64b_gld_sv2_64_scaled<bits<4> opc, string asm,
  6670. SDPatternOperator op,
  6671. RegisterOperand zprext, ValueType vt> {
  6672. def _SCALED_REAL : sve_mem_64b_gld_sv<opc, 1, 1, 1, asm, zprext>;
  6673. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
  6674. (!cast<Instruction>(NAME # _SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm), 0>;
  6675. // We need a layer of indirection because early machine code passes balk at
  6676. // physical register (i.e. FFR) uses that have no previous definition.
  6677. let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
  6678. def _SCALED : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm), []>,
  6679. PseudoInstExpansion<(!cast<Instruction>(NAME # _SCALED_REAL) Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm)>;
  6680. }
  6681. def : Pat<(nxv2i64 (op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$indices), vt)),
  6682. (!cast<Instruction>(NAME # _SCALED) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
  6683. }
  6684. multiclass sve_mem_64b_gld_vs2_64_unscaled<bits<4> opc, string asm,
  6685. SDPatternOperator op, ValueType vt> {
  6686. def _REAL : sve_mem_64b_gld_sv<opc, 1, 0, 1, asm, ZPR64ExtLSL8>;
  6687. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
  6688. (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, ZPR64ExtLSL8:$Zm), 0>;
  6689. // We need a layer of indirection because early machine code passes balk at
  6690. // physical register (i.e. FFR) uses that have no previous definition.
  6691. let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
  6692. def "" : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, ZPR64ExtLSL8:$Zm), []>,
  6693. PseudoInstExpansion<(!cast<Instruction>(NAME # _REAL) Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, ZPR64ExtLSL8:$Zm)>;
  6694. }
  6695. def : Pat<(nxv2i64 (op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt)),
  6696. (!cast<Instruction>(NAME) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
  6697. }
  6698. class sve_mem_64b_gld_vi<bits<4> opc, string asm, Operand imm_ty>
  6699. : I<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5),
  6700. asm, "\t$Zt, $Pg/z, [$Zn, $imm5]",
  6701. "",
  6702. []>, Sched<[]> {
  6703. bits<3> Pg;
  6704. bits<5> Zn;
  6705. bits<5> Zt;
  6706. bits<5> imm5;
  6707. let Inst{31-25} = 0b1100010;
  6708. let Inst{24-23} = opc{3-2};
  6709. let Inst{22-21} = 0b01;
  6710. let Inst{20-16} = imm5;
  6711. let Inst{15} = 0b1;
  6712. let Inst{14-13} = opc{1-0};
  6713. let Inst{12-10} = Pg;
  6714. let Inst{9-5} = Zn;
  6715. let Inst{4-0} = Zt;
  6716. let mayLoad = 1;
  6717. let Defs = !if(!eq(opc{0}, 1), [FFR], []);
  6718. let Uses = !if(!eq(opc{0}, 1), [FFR], []);
  6719. }
  6720. multiclass sve_mem_64b_gld_vi_64_ptrs<bits<4> opc, string asm, Operand imm_ty,
  6721. SDPatternOperator op, ValueType vt> {
  6722. def _IMM_REAL : sve_mem_64b_gld_vi<opc, asm, imm_ty>;
  6723. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
  6724. (!cast<Instruction>(NAME # _IMM_REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 0>;
  6725. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $imm5]",
  6726. (!cast<Instruction>(NAME # _IMM_REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5), 0>;
  6727. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
  6728. (!cast<Instruction>(NAME # _IMM_REAL) Z_d:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 1>;
  6729. // We need a layer of indirection because early machine code passes balk at
  6730. // physical register (i.e. FFR) uses that have no previous definition.
  6731. let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
  6732. def _IMM : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5), []>,
  6733. PseudoInstExpansion<(!cast<Instruction>(NAME # _IMM_REAL) Z_d:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5)>;
  6734. }
  6735. def : Pat<(nxv2i64 (op (nxv2i1 PPR:$gp), (nxv2i64 ZPR:$ptrs), imm_ty:$index, vt)),
  6736. (!cast<Instruction>(NAME # _IMM) PPR:$gp, ZPR:$ptrs, imm_ty:$index)>;
  6737. }
  6738. // bit lsl is '0' if the offsets are extended (uxtw/sxtw), '1' if shifted (lsl)
  6739. class sve_mem_64b_prfm_sv<bits<2> msz, bit xs, bit lsl, string asm,
  6740. RegisterOperand zprext>
  6741. : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
  6742. asm, "\t$prfop, $Pg, [$Rn, $Zm]",
  6743. "",
  6744. []>, Sched<[]> {
  6745. bits<3> Pg;
  6746. bits<5> Rn;
  6747. bits<5> Zm;
  6748. bits<4> prfop;
  6749. let Inst{31-23} = 0b110001000;
  6750. let Inst{22} = xs;
  6751. let Inst{21} = 0b1;
  6752. let Inst{20-16} = Zm;
  6753. let Inst{15} = lsl;
  6754. let Inst{14-13} = msz;
  6755. let Inst{12-10} = Pg;
  6756. let Inst{9-5} = Rn;
  6757. let Inst{4} = 0b0;
  6758. let Inst{3-0} = prfop;
  6759. let hasSideEffects = 1;
  6760. }
  6761. multiclass sve_mem_64b_prfm_sv_ext_scaled<bits<2> msz, string asm,
  6762. RegisterOperand sxtw_opnd,
  6763. RegisterOperand uxtw_opnd,
  6764. SDPatternOperator op_sxtw,
  6765. SDPatternOperator op_uxtw> {
  6766. def _UXTW_SCALED : sve_mem_64b_prfm_sv<msz, 0, 0, asm, uxtw_opnd>;
  6767. def _SXTW_SCALED : sve_mem_64b_prfm_sv<msz, 1, 0, asm, sxtw_opnd>;
  6768. def : Pat<(op_uxtw (nxv2i1 PPR3bAny:$Pg), (i64 GPR64sp:$Rn), (nxv2i64 uxtw_opnd:$Zm), (i32 sve_prfop:$prfop)),
  6769. (!cast<Instruction>(NAME # _UXTW_SCALED) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm)>;
  6770. def : Pat<(op_sxtw (nxv2i1 PPR3bAny:$Pg), (i64 GPR64sp:$Rn), (nxv2i64 sxtw_opnd:$Zm), (i32 sve_prfop:$prfop)),
  6771. (!cast<Instruction>(NAME # _SXTW_SCALED) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm)>;
  6772. }
  6773. multiclass sve_mem_64b_prfm_sv_lsl_scaled<bits<2> msz, string asm,
  6774. RegisterOperand zprext, SDPatternOperator frag> {
  6775. def NAME : sve_mem_64b_prfm_sv<msz, 1, 1, asm, zprext>;
  6776. def : Pat<(frag (nxv2i1 PPR3bAny:$Pg), (i64 GPR64sp:$Rn), (nxv2i64 zprext:$Zm), (i32 sve_prfop:$prfop)),
  6777. (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm)>;
  6778. }
  6779. class sve_mem_64b_prfm_vi<bits<2> msz, string asm, Operand imm_ty>
  6780. : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5),
  6781. asm, "\t$prfop, $Pg, [$Zn, $imm5]",
  6782. "",
  6783. []>, Sched<[]> {
  6784. bits<3> Pg;
  6785. bits<5> Zn;
  6786. bits<5> imm5;
  6787. bits<4> prfop;
  6788. let Inst{31-25} = 0b1100010;
  6789. let Inst{24-23} = msz;
  6790. let Inst{22-21} = 0b00;
  6791. let Inst{20-16} = imm5;
  6792. let Inst{15-13} = 0b111;
  6793. let Inst{12-10} = Pg;
  6794. let Inst{9-5} = Zn;
  6795. let Inst{4} = 0b0;
  6796. let Inst{3-0} = prfop;
  6797. let hasSideEffects = 1;
  6798. }
  6799. multiclass sve_mem_64b_prfm_vi<bits<2> msz, string asm, Operand imm_ty, SDPatternOperator op> {
  6800. def NAME : sve_mem_64b_prfm_vi<msz, asm, imm_ty>;
  6801. def : InstAlias<asm # "\t$prfop, $Pg, [$Zn]",
  6802. (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, ZPR64:$Zn, 0), 1>;
  6803. def : Pat<(op (nxv2i1 PPR_3b:$Pg), (nxv2i64 ZPR32:$Zn), (i64 imm_ty:$imm), (i32 sve_prfop:$prfop)),
  6804. (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR_3b:$Pg, ZPR32:$Zn, imm_ty:$imm)>;
  6805. }
  6806. //===----------------------------------------------------------------------===//
  6807. // SVE Compute Vector Address Group
  6808. //===----------------------------------------------------------------------===//
  6809. class sve_int_bin_cons_misc_0_a<bits<2> opc, bits<2> msz, string asm,
  6810. ZPRRegOp zprty, RegisterOperand zprext>
  6811. : I<(outs zprty:$Zd), (ins zprty:$Zn, zprext:$Zm),
  6812. asm, "\t$Zd, [$Zn, $Zm]",
  6813. "",
  6814. []>, Sched<[]> {
  6815. bits<5> Zd;
  6816. bits<5> Zn;
  6817. bits<5> Zm;
  6818. let Inst{31-24} = 0b00000100;
  6819. let Inst{23-22} = opc;
  6820. let Inst{21} = 0b1;
  6821. let Inst{20-16} = Zm;
  6822. let Inst{15-12} = 0b1010;
  6823. let Inst{11-10} = msz;
  6824. let Inst{9-5} = Zn;
  6825. let Inst{4-0} = Zd;
  6826. }
  6827. multiclass sve_int_bin_cons_misc_0_a_uxtw<bits<2> opc, string asm> {
  6828. def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR64, ZPR64ExtUXTW8>;
  6829. def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR64, ZPR64ExtUXTW16>;
  6830. def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR64, ZPR64ExtUXTW32>;
  6831. def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR64, ZPR64ExtUXTW64>;
  6832. }
  6833. multiclass sve_int_bin_cons_misc_0_a_sxtw<bits<2> opc, string asm> {
  6834. def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR64, ZPR64ExtSXTW8>;
  6835. def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR64, ZPR64ExtSXTW16>;
  6836. def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR64, ZPR64ExtSXTW32>;
  6837. def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR64, ZPR64ExtSXTW64>;
  6838. }
  6839. multiclass sve_int_bin_cons_misc_0_a_32_lsl<bits<2> opc, string asm> {
  6840. def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR32, ZPR32ExtLSL8>;
  6841. def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR32, ZPR32ExtLSL16>;
  6842. def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR32, ZPR32ExtLSL32>;
  6843. def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR32, ZPR32ExtLSL64>;
  6844. }
  6845. multiclass sve_int_bin_cons_misc_0_a_64_lsl<bits<2> opc, string asm> {
  6846. def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR64, ZPR64ExtLSL8>;
  6847. def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR64, ZPR64ExtLSL16>;
  6848. def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR64, ZPR64ExtLSL32>;
  6849. def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR64, ZPR64ExtLSL64>;
  6850. }
  6851. //===----------------------------------------------------------------------===//
  6852. // SVE Integer Misc - Unpredicated Group
  6853. //===----------------------------------------------------------------------===//
  6854. class sve_int_bin_cons_misc_0_b<bits<2> sz, string asm, ZPRRegOp zprty>
  6855. : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
  6856. asm, "\t$Zd, $Zn, $Zm",
  6857. "",
  6858. []>, Sched<[]> {
  6859. bits<5> Zd;
  6860. bits<5> Zm;
  6861. bits<5> Zn;
  6862. let Inst{31-24} = 0b00000100;
  6863. let Inst{23-22} = sz;
  6864. let Inst{21} = 0b1;
  6865. let Inst{20-16} = Zm;
  6866. let Inst{15-10} = 0b101100;
  6867. let Inst{9-5} = Zn;
  6868. let Inst{4-0} = Zd;
  6869. }
  6870. multiclass sve_int_bin_cons_misc_0_b<string asm, SDPatternOperator op> {
  6871. def _H : sve_int_bin_cons_misc_0_b<0b01, asm, ZPR16>;
  6872. def _S : sve_int_bin_cons_misc_0_b<0b10, asm, ZPR32>;
  6873. def _D : sve_int_bin_cons_misc_0_b<0b11, asm, ZPR64>;
  6874. def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  6875. def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  6876. def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  6877. }
  6878. class sve_int_bin_cons_misc_0_c<bits<8> opc, string asm, ZPRRegOp zprty>
  6879. : I<(outs zprty:$Zd), (ins zprty:$Zn),
  6880. asm, "\t$Zd, $Zn",
  6881. "",
  6882. []>, Sched<[]> {
  6883. bits<5> Zd;
  6884. bits<5> Zn;
  6885. let Inst{31-24} = 0b00000100;
  6886. let Inst{23-22} = opc{7-6};
  6887. let Inst{21} = 0b1;
  6888. let Inst{20-16} = opc{5-1};
  6889. let Inst{15-11} = 0b10111;
  6890. let Inst{10} = opc{0};
  6891. let Inst{9-5} = Zn;
  6892. let Inst{4-0} = Zd;
  6893. let hasSideEffects = 0;
  6894. }
  6895. multiclass sve_int_bin_cons_misc_0_c_fexpa<string asm, SDPatternOperator op> {
  6896. def _H : sve_int_bin_cons_misc_0_c<0b01000000, asm, ZPR16>;
  6897. def _S : sve_int_bin_cons_misc_0_c<0b10000000, asm, ZPR32>;
  6898. def _D : sve_int_bin_cons_misc_0_c<0b11000000, asm, ZPR64>;
  6899. def : SVE_1_Op_Pat<nxv8f16, op, nxv8i16, !cast<Instruction>(NAME # _H)>;
  6900. def : SVE_1_Op_Pat<nxv4f32, op, nxv4i32, !cast<Instruction>(NAME # _S)>;
  6901. def : SVE_1_Op_Pat<nxv2f64, op, nxv2i64, !cast<Instruction>(NAME # _D)>;
  6902. }
  6903. //===----------------------------------------------------------------------===//
  6904. // SVE Integer Reduction Group
  6905. //===----------------------------------------------------------------------===//
  6906. class sve_int_reduce<bits<2> sz8_32, bits<2> fmt, bits<3> opc, string asm,
  6907. ZPRRegOp zprty, FPRasZPROperand dstOpType>
  6908. : I<(outs dstOpType:$Vd), (ins PPR3bAny:$Pg, zprty:$Zn),
  6909. asm, "\t$Vd, $Pg, $Zn",
  6910. "",
  6911. []>, Sched<[]> {
  6912. bits<3> Pg;
  6913. bits<5> Vd;
  6914. bits<5> Zn;
  6915. let Inst{31-24} = 0b00000100;
  6916. let Inst{23-22} = sz8_32;
  6917. let Inst{21} = 0b0;
  6918. let Inst{20-19} = fmt;
  6919. let Inst{18-16} = opc;
  6920. let Inst{15-13} = 0b001;
  6921. let Inst{12-10} = Pg;
  6922. let Inst{9-5} = Zn;
  6923. let Inst{4-0} = Vd;
  6924. }
  6925. multiclass sve_int_reduce_0_saddv<bits<3> opc, string asm,
  6926. SDPatternOperator op> {
  6927. def _B : sve_int_reduce<0b00, 0b00, opc, asm, ZPR8, FPR64asZPR>;
  6928. def _H : sve_int_reduce<0b01, 0b00, opc, asm, ZPR16, FPR64asZPR>;
  6929. def _S : sve_int_reduce<0b10, 0b00, opc, asm, ZPR32, FPR64asZPR>;
  6930. def : SVE_2_Op_Pat<nxv2i64, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
  6931. def : SVE_2_Op_Pat<nxv2i64, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
  6932. def : SVE_2_Op_Pat<nxv2i64, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  6933. }
  6934. multiclass sve_int_reduce_0_uaddv<bits<3> opc, string asm,
  6935. SDPatternOperator op> {
  6936. def _B : sve_int_reduce<0b00, 0b00, opc, asm, ZPR8, FPR64asZPR>;
  6937. def _H : sve_int_reduce<0b01, 0b00, opc, asm, ZPR16, FPR64asZPR>;
  6938. def _S : sve_int_reduce<0b10, 0b00, opc, asm, ZPR32, FPR64asZPR>;
  6939. def _D : sve_int_reduce<0b11, 0b00, opc, asm, ZPR64, FPR64asZPR>;
  6940. def : SVE_2_Op_Pat<nxv2i64, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
  6941. def : SVE_2_Op_Pat<nxv2i64, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
  6942. def : SVE_2_Op_Pat<nxv2i64, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  6943. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  6944. }
  6945. multiclass sve_int_reduce_1<bits<3> opc, string asm,
  6946. SDPatternOperator op> {
  6947. def _B : sve_int_reduce<0b00, 0b01, opc, asm, ZPR8, FPR8asZPR>;
  6948. def _H : sve_int_reduce<0b01, 0b01, opc, asm, ZPR16, FPR16asZPR>;
  6949. def _S : sve_int_reduce<0b10, 0b01, opc, asm, ZPR32, FPR32asZPR>;
  6950. def _D : sve_int_reduce<0b11, 0b01, opc, asm, ZPR64, FPR64asZPR>;
  6951. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
  6952. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
  6953. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  6954. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  6955. }
  6956. multiclass sve_int_reduce_2<bits<3> opc, string asm,
  6957. SDPatternOperator op> {
  6958. def _B : sve_int_reduce<0b00, 0b11, opc, asm, ZPR8, FPR8asZPR>;
  6959. def _H : sve_int_reduce<0b01, 0b11, opc, asm, ZPR16, FPR16asZPR>;
  6960. def _S : sve_int_reduce<0b10, 0b11, opc, asm, ZPR32, FPR32asZPR>;
  6961. def _D : sve_int_reduce<0b11, 0b11, opc, asm, ZPR64, FPR64asZPR>;
  6962. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
  6963. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
  6964. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
  6965. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
  6966. }
  6967. class sve_int_movprfx_pred<bits<2> sz8_32, bits<3> opc, string asm,
  6968. ZPRRegOp zprty, string pg_suffix, dag iops>
  6969. : I<(outs zprty:$Zd), iops,
  6970. asm, "\t$Zd, $Pg"#pg_suffix#", $Zn",
  6971. "",
  6972. []>, Sched<[]> {
  6973. bits<3> Pg;
  6974. bits<5> Zd;
  6975. bits<5> Zn;
  6976. let Inst{31-24} = 0b00000100;
  6977. let Inst{23-22} = sz8_32;
  6978. let Inst{21-19} = 0b010;
  6979. let Inst{18-16} = opc;
  6980. let Inst{15-13} = 0b001;
  6981. let Inst{12-10} = Pg;
  6982. let Inst{9-5} = Zn;
  6983. let Inst{4-0} = Zd;
  6984. let ElementSize = zprty.ElementSize;
  6985. }
  6986. multiclass sve_int_movprfx_pred_merge<bits<3> opc, string asm> {
  6987. let Constraints = "$Zd = $_Zd" in {
  6988. def _B : sve_int_movprfx_pred<0b00, opc, asm, ZPR8, "/m",
  6989. (ins ZPR8:$_Zd, PPR3bAny:$Pg, ZPR8:$Zn)>;
  6990. def _H : sve_int_movprfx_pred<0b01, opc, asm, ZPR16, "/m",
  6991. (ins ZPR16:$_Zd, PPR3bAny:$Pg, ZPR16:$Zn)>;
  6992. def _S : sve_int_movprfx_pred<0b10, opc, asm, ZPR32, "/m",
  6993. (ins ZPR32:$_Zd, PPR3bAny:$Pg, ZPR32:$Zn)>;
  6994. def _D : sve_int_movprfx_pred<0b11, opc, asm, ZPR64, "/m",
  6995. (ins ZPR64:$_Zd, PPR3bAny:$Pg, ZPR64:$Zn)>;
  6996. }
  6997. }
  6998. multiclass sve_int_movprfx_pred_zero<bits<3> opc, string asm> {
  6999. def _B : sve_int_movprfx_pred<0b00, opc, asm, ZPR8, "/z",
  7000. (ins PPR3bAny:$Pg, ZPR8:$Zn)>;
  7001. def _H : sve_int_movprfx_pred<0b01, opc, asm, ZPR16, "/z",
  7002. (ins PPR3bAny:$Pg, ZPR16:$Zn)>;
  7003. def _S : sve_int_movprfx_pred<0b10, opc, asm, ZPR32, "/z",
  7004. (ins PPR3bAny:$Pg, ZPR32:$Zn)>;
  7005. def _D : sve_int_movprfx_pred<0b11, opc, asm, ZPR64, "/z",
  7006. (ins PPR3bAny:$Pg, ZPR64:$Zn)>;
  7007. }
  7008. //===----------------------------------------------------------------------===//
  7009. // SVE Propagate Break Group
  7010. //===----------------------------------------------------------------------===//
  7011. class sve_int_brkp<bits<2> opc, string asm>
  7012. : I<(outs PPR8:$Pd), (ins PPRAny:$Pg, PPR8:$Pn, PPR8:$Pm),
  7013. asm, "\t$Pd, $Pg/z, $Pn, $Pm",
  7014. "",
  7015. []>, Sched<[]> {
  7016. bits<4> Pd;
  7017. bits<4> Pg;
  7018. bits<4> Pm;
  7019. bits<4> Pn;
  7020. let Inst{31-24} = 0b00100101;
  7021. let Inst{23} = 0b0;
  7022. let Inst{22} = opc{1};
  7023. let Inst{21-20} = 0b00;
  7024. let Inst{19-16} = Pm;
  7025. let Inst{15-14} = 0b11;
  7026. let Inst{13-10} = Pg;
  7027. let Inst{9} = 0b0;
  7028. let Inst{8-5} = Pn;
  7029. let Inst{4} = opc{0};
  7030. let Inst{3-0} = Pd;
  7031. let Defs = !if(!eq (opc{1}, 1), [NZCV], []);
  7032. }
  7033. multiclass sve_int_brkp<bits<2> opc, string asm, SDPatternOperator op> {
  7034. def NAME : sve_int_brkp<opc, asm>;
  7035. def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, nxv16i1, !cast<Instruction>(NAME)>;
  7036. }
  7037. //===----------------------------------------------------------------------===//
  7038. // SVE Partition Break Group
  7039. //===----------------------------------------------------------------------===//
  7040. class sve_int_brkn<bit S, string asm>
  7041. : I<(outs PPR8:$Pdm), (ins PPRAny:$Pg, PPR8:$Pn, PPR8:$_Pdm),
  7042. asm, "\t$Pdm, $Pg/z, $Pn, $_Pdm",
  7043. "",
  7044. []>, Sched<[]> {
  7045. bits<4> Pdm;
  7046. bits<4> Pg;
  7047. bits<4> Pn;
  7048. let Inst{31-23} = 0b001001010;
  7049. let Inst{22} = S;
  7050. let Inst{21-14} = 0b01100001;
  7051. let Inst{13-10} = Pg;
  7052. let Inst{9} = 0b0;
  7053. let Inst{8-5} = Pn;
  7054. let Inst{4} = 0b0;
  7055. let Inst{3-0} = Pdm;
  7056. let Constraints = "$Pdm = $_Pdm";
  7057. let Defs = !if(S, [NZCV], []);
  7058. let ElementSize = ElementSizeB;
  7059. }
  7060. multiclass sve_int_brkn<bits<1> opc, string asm, SDPatternOperator op> {
  7061. def NAME : sve_int_brkn<opc, asm>;
  7062. def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, nxv16i1, !cast<Instruction>(NAME)>;
  7063. }
  7064. class sve_int_break<bits<3> opc, string asm, string suffix, dag iops>
  7065. : I<(outs PPR8:$Pd), iops,
  7066. asm, "\t$Pd, $Pg"#suffix#", $Pn",
  7067. "",
  7068. []>, Sched<[]> {
  7069. bits<4> Pd;
  7070. bits<4> Pg;
  7071. bits<4> Pn;
  7072. let Inst{31-24} = 0b00100101;
  7073. let Inst{23-22} = opc{2-1};
  7074. let Inst{21-14} = 0b01000001;
  7075. let Inst{13-10} = Pg;
  7076. let Inst{9} = 0b0;
  7077. let Inst{8-5} = Pn;
  7078. let Inst{4} = opc{0};
  7079. let Inst{3-0} = Pd;
  7080. let Constraints = !if(!eq (opc{0}, 1), "$Pd = $_Pd", "");
  7081. let Defs = !if(!eq (opc{1}, 1), [NZCV], []);
  7082. }
  7083. multiclass sve_int_break_m<bits<3> opc, string asm, SDPatternOperator op> {
  7084. def NAME : sve_int_break<opc, asm, "/m", (ins PPR8:$_Pd, PPRAny:$Pg, PPR8:$Pn)>;
  7085. def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, nxv16i1, !cast<Instruction>(NAME)>;
  7086. }
  7087. multiclass sve_int_break_z<bits<3> opc, string asm, SDPatternOperator op> {
  7088. def NAME : sve_int_break<opc, asm, "/z", (ins PPRAny:$Pg, PPR8:$Pn)>;
  7089. def : SVE_2_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, !cast<Instruction>(NAME)>;
  7090. }
  7091. //===----------------------------------------------------------------------===//
  7092. // SVE2 String Processing Group
  7093. //===----------------------------------------------------------------------===//
  7094. class sve2_char_match<bit sz, bit opc, string asm,
  7095. PPRRegOp pprty, ZPRRegOp zprty>
  7096. : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, zprty:$Zm),
  7097. asm, "\t$Pd, $Pg/z, $Zn, $Zm",
  7098. "",
  7099. []>, Sched<[]> {
  7100. bits<4> Pd;
  7101. bits<3> Pg;
  7102. bits<5> Zm;
  7103. bits<5> Zn;
  7104. let Inst{31-23} = 0b010001010;
  7105. let Inst{22} = sz;
  7106. let Inst{21} = 0b1;
  7107. let Inst{20-16} = Zm;
  7108. let Inst{15-13} = 0b100;
  7109. let Inst{12-10} = Pg;
  7110. let Inst{9-5} = Zn;
  7111. let Inst{4} = opc;
  7112. let Inst{3-0} = Pd;
  7113. let Defs = [NZCV];
  7114. let ElementSize = pprty.ElementSize;
  7115. let isPTestLike = 1;
  7116. }
  7117. multiclass sve2_char_match<bit opc, string asm, SDPatternOperator op> {
  7118. def _B : sve2_char_match<0b0, opc, asm, PPR8, ZPR8>;
  7119. def _H : sve2_char_match<0b1, opc, asm, PPR16, ZPR16>;
  7120. def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
  7121. def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
  7122. }
  7123. //===----------------------------------------------------------------------===//
  7124. // SVE2 Histogram Computation - Segment Group
  7125. //===----------------------------------------------------------------------===//
  7126. class sve2_hist_gen_segment<string asm, SDPatternOperator op>
  7127. : I<(outs ZPR8:$Zd), (ins ZPR8:$Zn, ZPR8:$Zm),
  7128. asm, "\t$Zd, $Zn, $Zm",
  7129. "",
  7130. [(set nxv16i8:$Zd, (op nxv16i8:$Zn, nxv16i8:$Zm))]>, Sched<[]> {
  7131. bits<5> Zd;
  7132. bits<5> Zn;
  7133. bits<5> Zm;
  7134. let Inst{31-21} = 0b01000101001;
  7135. let Inst{20-16} = Zm;
  7136. let Inst{15-10} = 0b101000;
  7137. let Inst{9-5} = Zn;
  7138. let Inst{4-0} = Zd;
  7139. }
  7140. //===----------------------------------------------------------------------===//
  7141. // SVE2 Histogram Computation - Vector Group
  7142. //===----------------------------------------------------------------------===//
  7143. class sve2_hist_gen_vector<bit sz, string asm, ZPRRegOp zprty>
  7144. : I<(outs zprty:$Zd), (ins PPR3bAny:$Pg, zprty:$Zn, zprty:$Zm),
  7145. asm, "\t$Zd, $Pg/z, $Zn, $Zm",
  7146. "",
  7147. []>, Sched<[]> {
  7148. bits<5> Zd;
  7149. bits<5> Zn;
  7150. bits<3> Pg;
  7151. bits<5> Zm;
  7152. let Inst{31-23} = 0b010001011;
  7153. let Inst{22} = sz;
  7154. let Inst{21} = 0b1;
  7155. let Inst{20-16} = Zm;
  7156. let Inst{15-13} = 0b110;
  7157. let Inst{12-10} = Pg;
  7158. let Inst{9-5} = Zn;
  7159. let Inst{4-0} = Zd;
  7160. }
  7161. multiclass sve2_hist_gen_vector<string asm, SDPatternOperator op> {
  7162. def _S : sve2_hist_gen_vector<0b0, asm, ZPR32>;
  7163. def _D : sve2_hist_gen_vector<0b1, asm, ZPR64>;
  7164. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
  7165. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
  7166. }
  7167. //===----------------------------------------------------------------------===//
  7168. // SVE2 Crypto Extensions Group
  7169. //===----------------------------------------------------------------------===//
  7170. class sve2_crypto_cons_bin_op<bit opc, string asm, ZPRRegOp zprty>
  7171. : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
  7172. asm, "\t$Zd, $Zn, $Zm",
  7173. "",
  7174. []>, Sched<[]> {
  7175. bits<5> Zd;
  7176. bits<5> Zn;
  7177. bits<5> Zm;
  7178. let Inst{31-21} = 0b01000101001;
  7179. let Inst{20-16} = Zm;
  7180. let Inst{15-11} = 0b11110;
  7181. let Inst{10} = opc;
  7182. let Inst{9-5} = Zn;
  7183. let Inst{4-0} = Zd;
  7184. }
  7185. multiclass sve2_crypto_cons_bin_op<bit opc, string asm, ZPRRegOp zprty,
  7186. SDPatternOperator op, ValueType vt> {
  7187. def NAME : sve2_crypto_cons_bin_op<opc, asm, zprty>;
  7188. def : SVE_2_Op_Pat<vt, op, vt, vt, !cast<Instruction>(NAME)>;
  7189. }
  7190. class sve2_crypto_des_bin_op<bits<2> opc, string asm, ZPRRegOp zprty>
  7191. : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm),
  7192. asm, "\t$Zdn, $_Zdn, $Zm",
  7193. "",
  7194. []>, Sched<[]> {
  7195. bits<5> Zdn;
  7196. bits<5> Zm;
  7197. let Inst{31-17} = 0b010001010010001;
  7198. let Inst{16} = opc{1};
  7199. let Inst{15-11} = 0b11100;
  7200. let Inst{10} = opc{0};
  7201. let Inst{9-5} = Zm;
  7202. let Inst{4-0} = Zdn;
  7203. let Constraints = "$Zdn = $_Zdn";
  7204. }
  7205. multiclass sve2_crypto_des_bin_op<bits<2> opc, string asm, ZPRRegOp zprty,
  7206. SDPatternOperator op, ValueType vt> {
  7207. def NAME : sve2_crypto_des_bin_op<opc, asm, zprty>;
  7208. def : SVE_2_Op_Pat<vt, op, vt, vt, !cast<Instruction>(NAME)>;
  7209. }
  7210. class sve2_crypto_unary_op<bit opc, string asm, ZPRRegOp zprty>
  7211. : I<(outs zprty:$Zdn), (ins zprty:$_Zdn),
  7212. asm, "\t$Zdn, $_Zdn",
  7213. "",
  7214. []>, Sched<[]> {
  7215. bits<5> Zdn;
  7216. let Inst{31-11} = 0b010001010010000011100;
  7217. let Inst{10} = opc;
  7218. let Inst{9-5} = 0b00000;
  7219. let Inst{4-0} = Zdn;
  7220. let Constraints = "$Zdn = $_Zdn";
  7221. }
  7222. multiclass sve2_crypto_unary_op<bit opc, string asm, SDPatternOperator op> {
  7223. def NAME : sve2_crypto_unary_op<opc, asm, ZPR8>;
  7224. def : SVE_1_Op_Pat<nxv16i8, op, nxv16i8, !cast<Instruction>(NAME)>;
  7225. }
  7226. //===----------------------------------------------------------------------===//
  7227. // SVE BFloat16 Group
  7228. //===----------------------------------------------------------------------===//
  7229. class sve_float_dot<bit bf, string asm>
  7230. : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR16:$Zm),
  7231. asm, "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
  7232. bits<5> Zda;
  7233. bits<5> Zn;
  7234. bits<5> Zm;
  7235. let Inst{31-23} = 0b011001000;
  7236. let Inst{22} = bf;
  7237. let Inst{21} = 0b1;
  7238. let Inst{20-16} = Zm;
  7239. let Inst{15-10} = 0b100000;
  7240. let Inst{9-5} = Zn;
  7241. let Inst{4-0} = Zda;
  7242. let Constraints = "$Zda = $_Zda";
  7243. let DestructiveInstType = DestructiveOther;
  7244. }
  7245. multiclass sve_float_dot<bit bf, string asm, ValueType InVT, SDPatternOperator op> {
  7246. def NAME : sve_float_dot<bf, asm>;
  7247. def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, InVT, InVT, !cast<Instruction>(NAME)>;
  7248. }
  7249. class sve_float_dot_indexed<bit bf, string asm>
  7250. : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR3b16:$Zm, VectorIndexS32b:$iop),
  7251. asm, "\t$Zda, $Zn, $Zm$iop", "", []>, Sched<[]> {
  7252. bits<5> Zda;
  7253. bits<5> Zn;
  7254. bits<3> Zm;
  7255. bits<2> iop;
  7256. let Inst{31-23} = 0b011001000;
  7257. let Inst{22} = bf;
  7258. let Inst{21} = 0b1;
  7259. let Inst{20-19} = iop;
  7260. let Inst{18-16} = Zm;
  7261. let Inst{15-10} = 0b010000;
  7262. let Inst{9-5} = Zn;
  7263. let Inst{4-0} = Zda;
  7264. let Constraints = "$Zda = $_Zda";
  7265. let DestructiveInstType = DestructiveOther;
  7266. }
  7267. multiclass sve_float_dot_indexed<bit bf, string asm, ValueType InVT, SDPatternOperator op> {
  7268. def NAME : sve_float_dot_indexed<bf, asm>;
  7269. def : SVE_4_Op_Imm_Pat<nxv4f32, op, nxv4f32, InVT, InVT, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME)>;
  7270. }
  7271. class sve_bfloat_matmul<string asm>
  7272. : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR16:$Zm),
  7273. asm, "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
  7274. bits<5> Zm;
  7275. bits<5> Zda;
  7276. bits<5> Zn;
  7277. let Inst{31-21} = 0b01100100011;
  7278. let Inst{20-16} = Zm;
  7279. let Inst{15-10} = 0b111001;
  7280. let Inst{9-5} = Zn;
  7281. let Inst{4-0} = Zda;
  7282. let Constraints = "$Zda = $_Zda";
  7283. let DestructiveInstType = DestructiveOther;
  7284. let ElementSize = ElementSizeH;
  7285. }
  7286. multiclass sve_bfloat_matmul<string asm, SDPatternOperator op> {
  7287. def NAME : sve_bfloat_matmul<asm>;
  7288. def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv8bf16, nxv8bf16 ,!cast<Instruction>(NAME)>;
  7289. }
  7290. class sve_bfloat_convert<bit N, string asm>
  7291. : I<(outs ZPR16:$Zd), (ins ZPR16:$_Zd, PPR3bAny:$Pg, ZPR32:$Zn),
  7292. asm, "\t$Zd, $Pg/m, $Zn", "", []>, Sched<[]> {
  7293. bits<5> Zd;
  7294. bits<3> Pg;
  7295. bits<5> Zn;
  7296. let Inst{31-25} = 0b0110010;
  7297. let Inst{24} = N;
  7298. let Inst{23-13} = 0b10001010101;
  7299. let Inst{12-10} = Pg;
  7300. let Inst{9-5} = Zn;
  7301. let Inst{4-0} = Zd;
  7302. let Constraints = "$Zd = $_Zd";
  7303. let DestructiveInstType = DestructiveOther;
  7304. let hasSideEffects = 1;
  7305. let ElementSize = ElementSizeS;
  7306. }
  7307. multiclass sve_bfloat_convert<bit N, string asm, SDPatternOperator op> {
  7308. def NAME : sve_bfloat_convert<N, asm>;
  7309. def : SVE_3_Op_Pat<nxv8bf16, op, nxv8bf16, nxv8i1, nxv4f32, !cast<Instruction>(NAME)>;
  7310. }
  7311. //===----------------------------------------------------------------------===//
  7312. // SVE Integer Matrix Multiply Group
  7313. //===----------------------------------------------------------------------===//
  7314. class sve_int_matmul<bits<2> uns, string asm>
  7315. : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR8:$Zn, ZPR8:$Zm), asm,
  7316. "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
  7317. bits<5> Zda;
  7318. bits<5> Zn;
  7319. bits<5> Zm;
  7320. let Inst{31-24} = 0b01000101;
  7321. let Inst{23-22} = uns;
  7322. let Inst{21} = 0;
  7323. let Inst{20-16} = Zm;
  7324. let Inst{15-10} = 0b100110;
  7325. let Inst{9-5} = Zn;
  7326. let Inst{4-0} = Zda;
  7327. let Constraints = "$Zda = $_Zda";
  7328. let DestructiveInstType = DestructiveOther;
  7329. let ElementSize = ZPR32.ElementSize;
  7330. }
  7331. multiclass sve_int_matmul<bits<2> uns, string asm, SDPatternOperator op> {
  7332. def NAME : sve_int_matmul<uns, asm>;
  7333. def : SVE_3_Op_Pat<nxv4i32, op , nxv4i32, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
  7334. }
  7335. //===----------------------------------------------------------------------===//
  7336. // SVE Integer Dot Product Mixed Sign Group
  7337. //===----------------------------------------------------------------------===//
  7338. class sve_int_dot_mixed<string asm>
  7339. : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR8:$Zn, ZPR8:$Zm), asm,
  7340. "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
  7341. bits<5> Zda;
  7342. bits<5> Zn;
  7343. bits<5> Zm;
  7344. let Inst{31-21} = 0b01000100100;
  7345. let Inst{20-16} = Zm;
  7346. let Inst{15-10} = 0b011110;
  7347. let Inst{9-5} = Zn;
  7348. let Inst{4-0} = Zda;
  7349. let Constraints = "$Zda = $_Zda";
  7350. let DestructiveInstType = DestructiveOther;
  7351. let ElementSize = ZPR32.ElementSize;
  7352. }
  7353. multiclass sve_int_dot_mixed<string asm, SDPatternOperator op> {
  7354. def NAME : sve_int_dot_mixed<asm>;
  7355. def : SVE_3_Op_Pat<nxv4i32, op , nxv4i32, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
  7356. }
  7357. //===----------------------------------------------------------------------===//
  7358. // SVE Integer Dot Product Mixed Sign - Indexed Group
  7359. //===----------------------------------------------------------------------===//
  7360. class sve_int_dot_mixed_indexed<bit U, string asm>
  7361. : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR8:$Zn, ZPR3b8:$Zm, VectorIndexS32b:$idx),
  7362. asm, "\t$Zda, $Zn, $Zm$idx", "", []>, Sched<[]> {
  7363. bits<5> Zda;
  7364. bits<5> Zn;
  7365. bits<3> Zm;
  7366. bits<2> idx;
  7367. let Inst{31-21} = 0b01000100101;
  7368. let Inst{20-19} = idx;
  7369. let Inst{18-16} = Zm;
  7370. let Inst{15-11} = 0b00011;
  7371. let Inst{10} = U;
  7372. let Inst{9-5} = Zn;
  7373. let Inst{4-0} = Zda;
  7374. let Constraints = "$Zda = $_Zda";
  7375. let DestructiveInstType = DestructiveOther;
  7376. let ElementSize = ZPR32.ElementSize;
  7377. }
  7378. multiclass sve_int_dot_mixed_indexed<bit U, string asm, SDPatternOperator op> {
  7379. def NAME : sve_int_dot_mixed_indexed<U, asm>;
  7380. def : SVE_4_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv16i8, nxv16i8, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME)>;
  7381. }
  7382. //===----------------------------------------------------------------------===//
  7383. // SVE Floating Point Matrix Multiply Accumulate Group
  7384. //===----------------------------------------------------------------------===//
  7385. class sve_fp_matrix_mla<bit sz, string asm, ZPRRegOp zprty>
  7386. : I<(outs zprty:$Zda), (ins zprty:$_Zda, zprty:$Zn, zprty:$Zm),
  7387. asm, "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
  7388. bits<5> Zda;
  7389. bits<5> Zn;
  7390. bits<5> Zm;
  7391. let Inst{31-23} = 0b011001001;
  7392. let Inst{22} = sz;
  7393. let Inst{21} = 1;
  7394. let Inst{20-16} = Zm;
  7395. let Inst{15-10} = 0b111001;
  7396. let Inst{9-5} = Zn;
  7397. let Inst{4-0} = Zda;
  7398. let Constraints = "$Zda = $_Zda";
  7399. let DestructiveInstType = DestructiveOther;
  7400. let ElementSize = zprty.ElementSize;
  7401. }
  7402. multiclass sve_fp_matrix_mla<bit sz, string asm, ZPRRegOp zprty, SDPatternOperator op, ValueType vt> {
  7403. def NAME : sve_fp_matrix_mla<sz, asm, zprty>;
  7404. def : SVE_3_Op_Pat<vt, op , vt, vt, vt, !cast<Instruction>(NAME)>;
  7405. }
  7406. //===----------------------------------------------------------------------===//
  7407. // SVE Memory - Contiguous Load And Replicate 256-bit Group
  7408. //===----------------------------------------------------------------------===//
  7409. class sve_mem_ldor_si<bits<2> sz, string asm, RegisterOperand VecList>
  7410. : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s32:$imm4),
  7411. asm, "\t$Zt, $Pg/z, [$Rn, $imm4]", "", []>, Sched<[]> {
  7412. bits<5> Zt;
  7413. bits<5> Rn;
  7414. bits<3> Pg;
  7415. bits<4> imm4;
  7416. let Inst{31-25} = 0b1010010;
  7417. let Inst{24-23} = sz;
  7418. let Inst{22-20} = 0b010;
  7419. let Inst{19-16} = imm4;
  7420. let Inst{15-13} = 0b001;
  7421. let Inst{12-10} = Pg;
  7422. let Inst{9-5} = Rn;
  7423. let Inst{4-0} = Zt;
  7424. let mayLoad = 1;
  7425. }
  7426. multiclass sve_mem_ldor_si<bits<2> sz, string asm, RegisterOperand listty,
  7427. ZPRRegOp zprty, ValueType Ty, ValueType PredTy, SDNode Ld1ro> {
  7428. def NAME : sve_mem_ldor_si<sz, asm, listty>;
  7429. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  7430. (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
  7431. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
  7432. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
  7433. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4]",
  7434. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s32:$imm4), 0>;
  7435. // Base addressing mode
  7436. def : Pat<(Ty (Ld1ro (PredTy PPR3bAny:$Pg), GPR64sp:$base)),
  7437. (!cast<Instruction>(NAME) PPR3bAny:$Pg, GPR64sp:$base, (i64 0))>;
  7438. let AddedComplexity = 2 in {
  7439. // Reg + Imm addressing mode
  7440. def : Pat<(Ty (Ld1ro (PredTy PPR3bAny:$Pg), (add GPR64:$base, (i64 simm4s32:$imm)))),
  7441. (!cast<Instruction>(NAME) $Pg, $base, simm4s32:$imm)>;
  7442. }
  7443. }
  7444. class sve_mem_ldor_ss<bits<2> sz, string asm, RegisterOperand VecList,
  7445. RegisterOperand gprty>
  7446. : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
  7447. asm, "\t$Zt, $Pg/z, [$Rn, $Rm]", "", []>, Sched<[]> {
  7448. bits<5> Zt;
  7449. bits<3> Pg;
  7450. bits<5> Rn;
  7451. bits<5> Rm;
  7452. let Inst{31-25} = 0b1010010;
  7453. let Inst{24-23} = sz;
  7454. let Inst{22-21} = 0b01;
  7455. let Inst{20-16} = Rm;
  7456. let Inst{15-13} = 0;
  7457. let Inst{12-10} = Pg;
  7458. let Inst{9-5} = Rn;
  7459. let Inst{4-0} = Zt;
  7460. let mayLoad = 1;
  7461. }
  7462. multiclass sve_mem_ldor_ss<bits<2> sz, string asm, RegisterOperand listty,
  7463. ZPRRegOp zprty, RegisterOperand gprty, ValueType Ty,
  7464. ValueType PredTy, SDNode Ld1ro, ComplexPattern AddrCP> {
  7465. def NAME : sve_mem_ldor_ss<sz, asm, listty, gprty>;
  7466. def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
  7467. (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
  7468. def : Pat<(Ty (Ld1ro (PredTy PPR3bAny:$gp), (AddrCP GPR64sp:$base, gprty:$offset))),
  7469. (!cast<Instruction>(NAME) PPR3bAny:$gp, GPR64sp:$base, gprty:$offset)>;
  7470. }
  7471. //===----------------------------------------------------------------------===//
  7472. // SVE Interleave 128-bit Elements Group
  7473. //===----------------------------------------------------------------------===//
  7474. class sve_int_perm_bin_perm_128_zz<bits<2> opc, bit P, string asm>
  7475. : I<(outs ZPR128:$Zd), (ins ZPR128:$Zn, ZPR128:$Zm),
  7476. asm, "\t$Zd, $Zn, $Zm",
  7477. "",
  7478. []>, Sched<[]> {
  7479. bits<5> Zd;
  7480. bits<5> Zm;
  7481. bits<5> Zn;
  7482. let Inst{31-21} = 0b00000101101;
  7483. let Inst{20-16} = Zm;
  7484. let Inst{15-13} = 0b000;
  7485. let Inst{12-11} = opc;
  7486. let Inst{10} = P;
  7487. let Inst{9-5} = Zn;
  7488. let Inst{4-0} = Zd;
  7489. }
  7490. multiclass sve_int_perm_bin_perm_128_zz<bits<2> opc, bit P, string asm, SDPatternOperator op> {
  7491. def NAME : sve_int_perm_bin_perm_128_zz<opc, P, asm>;
  7492. def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
  7493. def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME)>;
  7494. def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8f16, !cast<Instruction>(NAME)>;
  7495. def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME)>;
  7496. def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4f32, !cast<Instruction>(NAME)>;
  7497. def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME)>;
  7498. def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2f64, !cast<Instruction>(NAME)>;
  7499. def : SVE_2_Op_Pat<nxv8bf16, op, nxv8bf16, nxv8bf16, !cast<Instruction>(NAME)>;
  7500. }
  7501. /// Addressing modes
  7502. def am_sve_indexed_s4 :ComplexPattern<iPTR, 2, "SelectAddrModeIndexedSVE<-8,7>", [], [SDNPWantRoot]>;
  7503. def am_sve_indexed_s6 :ComplexPattern<iPTR, 2, "SelectAddrModeIndexedSVE<-32,31>", [], [SDNPWantRoot]>;
  7504. def am_sve_regreg_lsl0 : ComplexPattern<iPTR, 2, "SelectSVERegRegAddrMode<0>", []>;
  7505. def am_sve_regreg_lsl1 : ComplexPattern<iPTR, 2, "SelectSVERegRegAddrMode<1>", []>;
  7506. def am_sve_regreg_lsl2 : ComplexPattern<iPTR, 2, "SelectSVERegRegAddrMode<2>", []>;
  7507. def am_sve_regreg_lsl3 : ComplexPattern<iPTR, 2, "SelectSVERegRegAddrMode<3>", []>;
  7508. def am_sve_regreg_lsl4 : ComplexPattern<iPTR, 2, "SelectSVERegRegAddrMode<4>", []>;
  7509. // Predicated pseudo floating point two operand instructions.
  7510. multiclass sve_fp_bin_pred_hfd<SDPatternOperator op> {
  7511. def _UNDEF_H : PredTwoOpPseudo<NAME # _H, ZPR16, FalseLanesUndef>;
  7512. def _UNDEF_S : PredTwoOpPseudo<NAME # _S, ZPR32, FalseLanesUndef>;
  7513. def _UNDEF_D : PredTwoOpPseudo<NAME # _D, ZPR64, FalseLanesUndef>;
  7514. def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Pseudo>(NAME # _UNDEF_H)>;
  7515. def : SVE_3_Op_Pat<nxv4f16, op, nxv4i1, nxv4f16, nxv4f16, !cast<Pseudo>(NAME # _UNDEF_H)>;
  7516. def : SVE_3_Op_Pat<nxv2f16, op, nxv2i1, nxv2f16, nxv2f16, !cast<Pseudo>(NAME # _UNDEF_H)>;
  7517. def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Pseudo>(NAME # _UNDEF_S)>;
  7518. def : SVE_3_Op_Pat<nxv2f32, op, nxv2i1, nxv2f32, nxv2f32, !cast<Pseudo>(NAME # _UNDEF_S)>;
  7519. def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Pseudo>(NAME # _UNDEF_D)>;
  7520. }
  7521. // Predicated pseudo integer two operand instructions.
  7522. multiclass sve_int_bin_pred_bhsd<SDPatternOperator op> {
  7523. def _UNDEF_B : PredTwoOpPseudo<NAME # _B, ZPR8, FalseLanesUndef>;
  7524. def _UNDEF_H : PredTwoOpPseudo<NAME # _H, ZPR16, FalseLanesUndef>;
  7525. def _UNDEF_S : PredTwoOpPseudo<NAME # _S, ZPR32, FalseLanesUndef>;
  7526. def _UNDEF_D : PredTwoOpPseudo<NAME # _D, ZPR64, FalseLanesUndef>;
  7527. def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Pseudo>(NAME # _UNDEF_B)>;
  7528. def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Pseudo>(NAME # _UNDEF_H)>;
  7529. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Pseudo>(NAME # _UNDEF_S)>;
  7530. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Pseudo>(NAME # _UNDEF_D)>;
  7531. }
  7532. // As sve_int_bin_pred but when only i32 and i64 vector types are required.
  7533. multiclass sve_int_bin_pred_sd<SDPatternOperator op> {
  7534. def _UNDEF_S : PredTwoOpPseudo<NAME # _S, ZPR32, FalseLanesUndef>;
  7535. def _UNDEF_D : PredTwoOpPseudo<NAME # _D, ZPR64, FalseLanesUndef>;
  7536. def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Pseudo>(NAME # _UNDEF_S)>;
  7537. def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Pseudo>(NAME # _UNDEF_D)>;
  7538. }
  7539. // Predicated pseudo integer two operand instructions. Second operand is an
  7540. // immediate specified by imm_[bhsd].
  7541. multiclass sve_int_shift_pred_bhsd<SDPatternOperator op,
  7542. ComplexPattern imm_b, ComplexPattern imm_h,
  7543. ComplexPattern imm_s, ComplexPattern imm_d> {
  7544. def _UNDEF_B : PredTwoOpImmPseudo<NAME # _B, ZPR8, Operand<i32>, FalseLanesUndef>;
  7545. def _UNDEF_H : PredTwoOpImmPseudo<NAME # _H, ZPR16, Operand<i32>, FalseLanesUndef>;
  7546. def _UNDEF_S : PredTwoOpImmPseudo<NAME # _S, ZPR32, Operand<i32>, FalseLanesUndef>;
  7547. def _UNDEF_D : PredTwoOpImmPseudo<NAME # _D, ZPR64, Operand<i32>, FalseLanesUndef>;
  7548. def : SVE_Shift_DupImm_Pred_Pat<nxv16i8, op, nxv16i1, i32, imm_b, !cast<Instruction>(NAME # _UNDEF_B)>;
  7549. def : SVE_Shift_DupImm_Pred_Pat<nxv8i16, op, nxv8i1, i32, imm_h, !cast<Instruction>(NAME # _UNDEF_H)>;
  7550. def : SVE_Shift_DupImm_Pred_Pat<nxv4i32, op, nxv4i1, i32, imm_s, !cast<Instruction>(NAME # _UNDEF_S)>;
  7551. def : SVE_Shift_DupImm_Pred_Pat<nxv2i64, op, nxv2i1, i64, imm_d, !cast<Instruction>(NAME # _UNDEF_D)>;
  7552. }
  7553. multiclass sve_int_bin_pred_all_active_bhsd<SDPatternOperator op> {
  7554. def _UNDEF_B : PredTwoOpPseudo<NAME # _B, ZPR8, FalseLanesUndef>;
  7555. def _UNDEF_H : PredTwoOpPseudo<NAME # _H, ZPR16, FalseLanesUndef>;
  7556. def _UNDEF_S : PredTwoOpPseudo<NAME # _S, ZPR32, FalseLanesUndef>;
  7557. def _UNDEF_D : PredTwoOpPseudo<NAME # _D, ZPR64, FalseLanesUndef>;
  7558. def : SVE_2_Op_Pred_All_Active_Pt<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Pseudo>(NAME # _UNDEF_B)>;
  7559. def : SVE_2_Op_Pred_All_Active_Pt<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Pseudo>(NAME # _UNDEF_H)>;
  7560. def : SVE_2_Op_Pred_All_Active_Pt<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Pseudo>(NAME # _UNDEF_S)>;
  7561. def : SVE_2_Op_Pred_All_Active_Pt<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Pseudo>(NAME # _UNDEF_D)>;
  7562. }
  7563. //===----------------------------------------------------------------------===//
  7564. // SME2 or SVE2.1 Instructions
  7565. //===----------------------------------------------------------------------===//
  7566. class sve2p1_fclamp<string asm, bits<2> sz, ZPRRegOp zpr_ty>
  7567. : I<(outs zpr_ty:$Zd), (ins zpr_ty:$_Zd, zpr_ty:$Zn, zpr_ty:$Zm),
  7568. asm, "\t$Zd, $Zn, $Zm", "", []>,
  7569. Sched<[]> {
  7570. bits<5> Zm;
  7571. bits<5> Zn;
  7572. bits<5> Zd;
  7573. let Inst{31-24} = 0b01100100;
  7574. let Inst{23-22} = sz;
  7575. let Inst{21} = 0b1;
  7576. let Inst{20-16} = Zm;
  7577. let Inst{15-10} = 0b001001;
  7578. let Inst{9-5} = Zn;
  7579. let Inst{4-0} = Zd;
  7580. let Constraints = "$Zd = $_Zd";
  7581. let DestructiveInstType = DestructiveOther;
  7582. let ElementSize = zpr_ty.ElementSize;
  7583. }
  7584. multiclass sve2p1_fclamp<string asm, SDPatternOperator op> {
  7585. def _H : sve2p1_fclamp<asm, 0b01, ZPR16>;
  7586. def _S : sve2p1_fclamp<asm, 0b10, ZPR32>;
  7587. def _D : sve2p1_fclamp<asm, 0b11, ZPR64>;
  7588. def : SVE_3_Op_Pat<nxv8f16, op, nxv8f16, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
  7589. def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
  7590. def : SVE_3_Op_Pat<nxv2f64, op, nxv2f64, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
  7591. }
  7592. // SVE two-way dot product
  7593. class sve2p1_two_way_dot_vv<string mnemonic, bit u>
  7594. : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR16:$Zm),
  7595. mnemonic, "\t$Zda, $Zn, $Zm",
  7596. "", []>, Sched<[]> {
  7597. bits<5> Zda;
  7598. bits<5> Zn;
  7599. bits<5> Zm;
  7600. let Inst{31-21} = 0b01000100000;
  7601. let Inst{20-16} = Zm;
  7602. let Inst{15-11} = 0b11001;
  7603. let Inst{10} = u;
  7604. let Inst{9-5} = Zn;
  7605. let Inst{4-0} = Zda;
  7606. let Constraints = "$Zda = $_Zda";
  7607. let DestructiveInstType = DestructiveOther;
  7608. }
  7609. // SVE two-way dot product (indexed)
  7610. class sve2p1_two_way_dot_vvi<string mnemonic, bit u>
  7611. : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR3b16:$Zm, VectorIndexS32b:$i2),
  7612. mnemonic, "\t$Zda, $Zn, $Zm$i2",
  7613. "", []>, Sched<[]> {
  7614. bits<5> Zda;
  7615. bits<5> Zn;
  7616. bits<3> Zm;
  7617. bits<2> i2;
  7618. let Inst{31-21} = 0b01000100100;
  7619. let Inst{20-19} = i2;
  7620. let Inst{18-16} = Zm;
  7621. let Inst{15-11} = 0b11001;
  7622. let Inst{10} = u;
  7623. let Inst{9-5} = Zn;
  7624. let Inst{4-0} = Zda;
  7625. let Constraints = "$Zda = $_Zda";
  7626. let DestructiveInstType = DestructiveOther;
  7627. }
  7628. class sve2p1_ptrue_pn<string mnemonic, bits<2> sz, PNRP8to15RegOp pnrty>
  7629. : I<(outs pnrty:$PNd), (ins ), mnemonic, "\t$PNd",
  7630. "", []>, Sched<[]> {
  7631. bits<3> PNd;
  7632. let Inst{31-24} = 0b00100101;
  7633. let Inst{23-22} = sz;
  7634. let Inst{21-3} = 0b1000000111100000010;
  7635. let Inst{2-0} = PNd;
  7636. }
  7637. multiclass sve2p1_ptrue_pn<string mnemonic> {
  7638. def _B : sve2p1_ptrue_pn<mnemonic, 0b00, PNR8_p8to15>;
  7639. def _H : sve2p1_ptrue_pn<mnemonic, 0b01, PNR16_p8to15>;
  7640. def _S : sve2p1_ptrue_pn<mnemonic, 0b10, PNR32_p8to15>;
  7641. def _D : sve2p1_ptrue_pn<mnemonic, 0b11, PNR64_p8to15>;
  7642. }
  7643. // SVE extract mask predicate from predicate-as-counter
  7644. class sve2p1_pred_as_ctr_to_mask_base<string mnemonic, bits<2> sz, bits<3> opc,
  7645. RegisterOperand pprty, Operand idxty>
  7646. : I<(outs pprty:$Pd), (ins PNRAny_p8to15:$PNn, idxty:$index),
  7647. mnemonic, "\t$Pd, $PNn$index",
  7648. "", []>, Sched<[]> {
  7649. bits<4> Pd;
  7650. bits<3> PNn;
  7651. bits<2> imm2;
  7652. let Inst{31-24} = 0b00100101;
  7653. let Inst{23-22} = sz;
  7654. let Inst{21-11} = 0b10000001110;
  7655. let Inst{10-8} = opc;
  7656. let Inst{7-5} = PNn;
  7657. let Inst{4} = 0b1;
  7658. let Inst{3-0} = Pd;
  7659. }
  7660. class sve2p1_pred_as_ctr_to_mask<string mnemonic, bits<2> sz, PPRRegOp pprty>
  7661. : sve2p1_pred_as_ctr_to_mask_base<mnemonic, sz, {0, ?, ?}, pprty, VectorIndexS> {
  7662. bits<2> index;
  7663. let Inst{9-8} = index;
  7664. }
  7665. multiclass sve2p1_pred_as_ctr_to_mask<string mnemonic> {
  7666. def _B : sve2p1_pred_as_ctr_to_mask<mnemonic, 0b00, PPR8>;
  7667. def _H : sve2p1_pred_as_ctr_to_mask<mnemonic, 0b01, PPR16>;
  7668. def _S : sve2p1_pred_as_ctr_to_mask<mnemonic, 0b10, PPR32>;
  7669. def _D : sve2p1_pred_as_ctr_to_mask<mnemonic, 0b11, PPR64>;
  7670. }
  7671. class sve2p1_pred_as_ctr_to_mask_pair<string mnemonic, bits<2> sz, RegisterOperand pprty>
  7672. : sve2p1_pred_as_ctr_to_mask_base<mnemonic, sz, {1, 0, ?}, pprty, VectorIndexD> {
  7673. bit index;
  7674. let Inst{8} = index;
  7675. }
  7676. multiclass sve2p1_pred_as_ctr_to_mask_pair<string mnemonic> {
  7677. def _B : sve2p1_pred_as_ctr_to_mask_pair<mnemonic, 0b00, PP_b>;
  7678. def _H : sve2p1_pred_as_ctr_to_mask_pair<mnemonic, 0b01, PP_h>;
  7679. def _S : sve2p1_pred_as_ctr_to_mask_pair<mnemonic, 0b10, PP_s>;
  7680. def _D : sve2p1_pred_as_ctr_to_mask_pair<mnemonic, 0b11, PP_d>;
  7681. }
  7682. // SME2 multi-vec extract narrow
  7683. class sve2p1_multi_vec_extract_narrow<string mnemonic, bits<2> opc, bits<3> tsz>
  7684. : I<(outs ZPR16:$Zd), (ins ZZ_s_mul_r:$Zn),
  7685. mnemonic, "\t$Zd, $Zn",
  7686. "", []>, Sched<[]> {
  7687. bits<5> Zd;
  7688. bits<4> Zn;
  7689. let Inst{31-23} = 0b010001010;
  7690. let Inst{22} = tsz{2};
  7691. let Inst{21} = 0b1;
  7692. let Inst{20-19} = tsz{1-0};
  7693. let Inst{18-13} = 0b001010;
  7694. let Inst{12-11} = opc;
  7695. let Inst{10} = 0b0;
  7696. let Inst{9-6} = Zn;
  7697. let Inst{5} = 0b0;
  7698. let Inst{4-0} = Zd;
  7699. }
  7700. multiclass sve2p1_multi_vec_extract_narrow<string mnemonic, bits<2> opc, SDPatternOperator intrinsic> {
  7701. def NAME : sve2p1_multi_vec_extract_narrow<mnemonic, opc, 0b010>;
  7702. def : SVE2p1_Cvt_VG2_Pat<NAME, intrinsic, nxv8i16, nxv4i32>;
  7703. }
  7704. // SVE2 multi-vec shift narrow
  7705. class sve2p1_multi_vec_shift_narrow<string mnemonic, bits<3> opc, bits<2> tsz>
  7706. : I<(outs ZPR16:$Zd), (ins ZZ_s_mul_r:$Zn, vecshiftR16:$imm4),
  7707. mnemonic, "\t$Zd, $Zn, $imm4",
  7708. "", []>, Sched<[]> {
  7709. bits<5> Zd;
  7710. bits<4> Zn;
  7711. bits<4> imm4;
  7712. let Inst{31-23} = 0b010001011;
  7713. let Inst{22} = tsz{1};
  7714. let Inst{21} = 0b1;
  7715. let Inst{20} = tsz{0};
  7716. let Inst{19-16} = imm4;
  7717. let Inst{15-14} = 0b00;
  7718. let Inst{13-11} = opc;
  7719. let Inst{10} = 0b0;
  7720. let Inst{9-6} = Zn;
  7721. let Inst{5} = 0b0;
  7722. let Inst{4-0} = Zd;
  7723. }
  7724. multiclass sve2p1_multi_vec_shift_narrow<string mnemonic, bits<3> opc> {
  7725. def : sve2p1_multi_vec_shift_narrow<mnemonic, opc, 0b01>;
  7726. }
  7727. // SME2 multi-vec contiguous load (scalar plus scalar, two registers)
  7728. class sve2p1_mem_cld_ss_2z<string mnemonic, bits<2> msz, bit n,
  7729. RegisterOperand vector_ty, RegisterOperand gpr_ty>
  7730. : I<(outs vector_ty:$Zt),
  7731. (ins PNRAny_p8to15:$PNg, GPR64sp:$Rn, gpr_ty:$Rm),
  7732. mnemonic, "\t$Zt, $PNg/z, [$Rn, $Rm]",
  7733. "", []>, Sched<[]> {
  7734. bits<4> Zt;
  7735. bits<5> Rm;
  7736. bits<5> Rn;
  7737. bits<3> PNg;
  7738. let Inst{31-21} = 0b10100000000;
  7739. let Inst{20-16} = Rm;
  7740. let Inst{15} = 0b0;
  7741. let Inst{14-13} = msz;
  7742. let Inst{12-10} = PNg;
  7743. let Inst{9-5} = Rn;
  7744. let Inst{4-1} = Zt;
  7745. let Inst{0} = n;
  7746. let mayLoad = 1;
  7747. }
  7748. // SME2 multi-vec contiguous load (scalar plus immediate, two registers)
  7749. class sve2p1_mem_cld_si_2z<string mnemonic, bits<2> msz, bit n,
  7750. RegisterOperand vector_ty>
  7751. : I<(outs vector_ty:$Zt),
  7752. (ins PNRAny_p8to15:$PNg, GPR64sp:$Rn, simm4s2:$imm4),
  7753. mnemonic, "\t$Zt, $PNg/z, [$Rn, $imm4, mul vl]",
  7754. "", []>, Sched<[]> {
  7755. bits<4> Zt;
  7756. bits<5> Rn;
  7757. bits<3> PNg;
  7758. bits<4> imm4;
  7759. let Inst{31-20} = 0b101000000100;
  7760. let Inst{19-16} = imm4;
  7761. let Inst{15} = 0b0;
  7762. let Inst{14-13} = msz;
  7763. let Inst{12-10} = PNg;
  7764. let Inst{9-5} = Rn;
  7765. let Inst{4-1} = Zt;
  7766. let Inst{0} = n;
  7767. let mayLoad = 1;
  7768. }
  7769. multiclass sve2p1_mem_cld_si_2z<string mnemonic, bits<2> msz, bit n,
  7770. RegisterOperand vector_ty> {
  7771. def NAME : sve2p1_mem_cld_si_2z<mnemonic, msz, n, vector_ty>;
  7772. def : InstAlias<mnemonic # " $Zt, $PNg/z, [$Rn]",
  7773. (!cast<Instruction>(NAME) vector_ty:$Zt, PNRAny_p8to15:$PNg, GPR64sp:$Rn, 0), 1>;
  7774. }
  7775. // SME2 multi-vec contiguous load (scalar plus scalar, four registers)
  7776. class sve2p1_mem_cld_ss_4z<string mnemonic, bits<2> msz, bit n,
  7777. RegisterOperand vector_ty, RegisterOperand gpr_ty>
  7778. : I<(outs vector_ty:$Zt),
  7779. (ins PNRAny_p8to15:$PNg, GPR64sp:$Rn, gpr_ty:$Rm),
  7780. mnemonic, "\t$Zt, $PNg/z, [$Rn, $Rm]",
  7781. "", []>, Sched<[]> {
  7782. bits<3> Zt;
  7783. bits<5> Rm;
  7784. bits<5> Rn;
  7785. bits<3> PNg;
  7786. let Inst{31-21} = 0b10100000000;
  7787. let Inst{20-16} = Rm;
  7788. let Inst{15} = 0b1;
  7789. let Inst{14-13} = msz;
  7790. let Inst{12-10} = PNg;
  7791. let Inst{9-5} = Rn;
  7792. let Inst{4-2} = Zt;
  7793. let Inst{1} = 0b0;
  7794. let Inst{0} = n;
  7795. let mayLoad = 1;
  7796. }
  7797. // SME2 multi-vec contiguous load (scalar plus immediate, four registers)
  7798. class sve2p1_mem_cld_si_4z<string mnemonic, bits<2> msz, bit n,
  7799. RegisterOperand vector_ty>
  7800. : I<(outs vector_ty:$Zt),
  7801. (ins PNRAny_p8to15:$PNg, GPR64sp:$Rn, simm4s4:$imm4),
  7802. mnemonic, "\t$Zt, $PNg/z, [$Rn, $imm4, mul vl]",
  7803. "", []>, Sched<[]> {
  7804. bits<3> Zt;
  7805. bits<5> Rn;
  7806. bits<3> PNg;
  7807. bits<4> imm4;
  7808. let Inst{31-20} = 0b101000000100;
  7809. let Inst{19-16} = imm4;
  7810. let Inst{15} = 0b1;
  7811. let Inst{14-13} = msz;
  7812. let Inst{12-10} = PNg;
  7813. let Inst{9-5} = Rn;
  7814. let Inst{4-2} = Zt;
  7815. let Inst{1} = 0b0;
  7816. let Inst{0} = n;
  7817. let mayLoad = 1;
  7818. }
  7819. multiclass sve2p1_mem_cld_si_4z<string mnemonic, bits<2> msz, bit n,
  7820. RegisterOperand vector_ty> {
  7821. def NAME : sve2p1_mem_cld_si_4z<mnemonic, msz, n, vector_ty>;
  7822. def : InstAlias<mnemonic # " $Zt, $PNg/z, [$Rn]",
  7823. (!cast<Instruction>(NAME) vector_ty:$Zt, PNRAny_p8to15:$PNg, GPR64sp:$Rn, 0), 1>;
  7824. }
  7825. // SME2 multi-vec contiguous store (scalar plus scalar, two registers)
  7826. class sve2p1_mem_cst_ss_2z<string mnemonic, bits<2> msz, bit n,
  7827. RegisterOperand vector_ty, RegisterOperand gpr_ty>
  7828. : I<(outs ),
  7829. (ins vector_ty:$Zt, PNRAny_p8to15:$PNg, GPR64sp:$Rn, gpr_ty:$Rm),
  7830. mnemonic, "\t$Zt, $PNg, [$Rn, $Rm]",
  7831. "", []>, Sched<[]> {
  7832. bits<4> Zt;
  7833. bits<5> Rm;
  7834. bits<5> Rn;
  7835. bits<3> PNg;
  7836. let Inst{31-21} = 0b10100000001;
  7837. let Inst{20-16} = Rm;
  7838. let Inst{15} = 0b0;
  7839. let Inst{14-13} = msz;
  7840. let Inst{12-10} = PNg;
  7841. let Inst{9-5} = Rn;
  7842. let Inst{4-1} = Zt;
  7843. let Inst{0} = n;
  7844. let mayStore = 1;
  7845. }
  7846. // SME2 multi-vec contiguous store (scalar plus immediate, two registers)
  7847. class sve2p1_mem_cst_si_2z<string mnemonic, bits<2> msz, bit n,
  7848. RegisterOperand vector_ty>
  7849. : I<(outs ),
  7850. (ins vector_ty:$Zt, PNRAny_p8to15:$PNg, GPR64sp:$Rn, simm4s2:$imm4),
  7851. mnemonic, "\t$Zt, $PNg, [$Rn, $imm4, mul vl]",
  7852. "", []>, Sched<[]> {
  7853. bits<4> Zt;
  7854. bits<5> Rn;
  7855. bits<3> PNg;
  7856. bits<4> imm4;
  7857. let Inst{31-20} = 0b101000000110;
  7858. let Inst{19-16} = imm4;
  7859. let Inst{15} = 0b0;
  7860. let Inst{14-13} = msz;
  7861. let Inst{12-10} = PNg;
  7862. let Inst{9-5} = Rn;
  7863. let Inst{4-1} = Zt;
  7864. let Inst{0} = n;
  7865. let mayStore = 1;
  7866. }
  7867. multiclass sve2p1_mem_cst_si_2z<string mnemonic, bits<2> msz, bit n,
  7868. RegisterOperand vector_ty> {
  7869. def NAME : sve2p1_mem_cst_si_2z<mnemonic, msz, n, vector_ty>;
  7870. def : InstAlias<mnemonic # " $Zt, $PNg, [$Rn]",
  7871. (!cast<Instruction>(NAME) vector_ty:$Zt, PNRAny_p8to15:$PNg, GPR64sp:$Rn, 0), 1>;
  7872. }
  7873. // SME2 multi-vec contiguous store (scalar plus scalar, four registers)
  7874. class sve2p1_mem_cst_ss_4z<string mnemonic, bits<2> msz, bit n,
  7875. RegisterOperand vector_ty, RegisterOperand gpr_ty>
  7876. : I<(outs ),
  7877. (ins vector_ty:$Zt, PNRAny_p8to15:$PNg, GPR64sp:$Rn, gpr_ty:$Rm),
  7878. mnemonic, "\t$Zt, $PNg, [$Rn, $Rm]",
  7879. "", []>, Sched<[]> {
  7880. bits<3> Zt;
  7881. bits<5> Rm;
  7882. bits<5> Rn;
  7883. bits<3> PNg;
  7884. let Inst{31-21} = 0b10100000001;
  7885. let Inst{20-16} = Rm;
  7886. let Inst{15} = 0b1;
  7887. let Inst{14-13} = msz;
  7888. let Inst{12-10} = PNg;
  7889. let Inst{9-5} = Rn;
  7890. let Inst{4-2} = Zt;
  7891. let Inst{1} = 0b0;
  7892. let Inst{0} = n;
  7893. let mayStore = 1;
  7894. }
  7895. // SME2 multi-vec contiguous store (scalar plus immediate, four registers)
  7896. class sve2p1_mem_cst_si_4z<string mnemonic, bits<2> msz, bit n,
  7897. RegisterOperand vector_ty>
  7898. : I<(outs ),
  7899. (ins vector_ty:$Zt, PNRAny_p8to15:$PNg, GPR64sp:$Rn, simm4s4:$imm4),
  7900. mnemonic, "\t$Zt, $PNg, [$Rn, $imm4, mul vl]",
  7901. "", []>, Sched<[]> {
  7902. bits<3> Zt;
  7903. bits<5> Rn;
  7904. bits<3> PNg;
  7905. bits<4> imm4;
  7906. let Inst{31-20} = 0b101000000110;
  7907. let Inst{19-16} = imm4;
  7908. let Inst{15} = 0b1;
  7909. let Inst{14-13} = msz;
  7910. let Inst{12-10} = PNg;
  7911. let Inst{9-5} = Rn;
  7912. let Inst{4-2} = Zt;
  7913. let Inst{1} = 0b0;
  7914. let Inst{0} = n;
  7915. let mayStore = 1;
  7916. }
  7917. multiclass sve2p1_mem_cst_si_4z<string mnemonic, bits<2> msz, bit n,
  7918. RegisterOperand vector_ty> {
  7919. def NAME : sve2p1_mem_cst_si_4z<mnemonic, msz, n, vector_ty>;
  7920. def : InstAlias<mnemonic # " $Zt, $PNg, [$Rn]",
  7921. (!cast<Instruction>(NAME) vector_ty:$Zt, PNRAny_p8to15:$PNg, GPR64sp:$Rn,0), 1>;
  7922. }
  7923. // SVE predicate count (predicate-as-counter)
  7924. class sve2p1_pcount_pn<string mnemonic, bits<3> opc, bits<2> sz, PNRRegOp pnrty>
  7925. : I<(outs GPR64:$Rd),
  7926. (ins pnrty:$PNn, sve_vec_len_specifier_enum:$vl),
  7927. mnemonic, "\t$Rd, $PNn, $vl",
  7928. "", []>, Sched<[]> {
  7929. bits<5> Rd;
  7930. bits<4> PNn;
  7931. bits<1> vl;
  7932. let Inst{31-24} = 0b00100101;
  7933. let Inst{23-22} = sz;
  7934. let Inst{21-19} = 0b100;
  7935. let Inst{18-16} = opc;
  7936. let Inst{15-11} = 0b10000;
  7937. let Inst{10} = vl;
  7938. let Inst{9} = 0b1;
  7939. let Inst{8-5} = PNn;
  7940. let Inst{4-0} = Rd;
  7941. }
  7942. multiclass sve2p1_pcount_pn<string mnemonic, bits<3> opc> {
  7943. def _B : sve2p1_pcount_pn<mnemonic, opc, 0b00, PNR8>;
  7944. def _H : sve2p1_pcount_pn<mnemonic, opc, 0b01, PNR16>;
  7945. def _S : sve2p1_pcount_pn<mnemonic, opc, 0b10, PNR32>;
  7946. def _D : sve2p1_pcount_pn<mnemonic, opc, 0b11, PNR64>;
  7947. }
  7948. // SVE integer compare scalar count and limit (predicate-as-counter)
  7949. class sve2p1_int_while_rr_pn<string mnemonic, bits<2> sz, bits<3> opc,
  7950. PNRP8to15RegOp pnrty>
  7951. : I<(outs pnrty:$PNd), (ins GPR64:$Rn, GPR64:$Rm, sve_vec_len_specifier_enum:$vl),
  7952. mnemonic, "\t$PNd, $Rn, $Rm, $vl",
  7953. "", []>, Sched<[]> {
  7954. bits<3> PNd;
  7955. bits<5> Rn;
  7956. bits<1> vl;
  7957. bits<5> Rm;
  7958. let Inst{31-24} = 0b00100101;
  7959. let Inst{23-22} = sz;
  7960. let Inst{21} = 0b1;
  7961. let Inst{20-16} = Rm;
  7962. let Inst{15-14} = 0b01;
  7963. let Inst{13} = vl;
  7964. let Inst{12} = 0b0;
  7965. let Inst{11-10} = opc{2-1};
  7966. let Inst{9-5} = Rn;
  7967. let Inst{4} = 0b1;
  7968. let Inst{3} = opc{0};
  7969. let Inst{2-0} = PNd;
  7970. let Defs = [NZCV];
  7971. }
  7972. multiclass sve2p1_int_while_rr_pn<string mnemonic, bits<3> opc> {
  7973. def _B : sve2p1_int_while_rr_pn<mnemonic, 0b00, opc, PNR8_p8to15>;
  7974. def _H : sve2p1_int_while_rr_pn<mnemonic, 0b01, opc, PNR16_p8to15>;
  7975. def _S : sve2p1_int_while_rr_pn<mnemonic, 0b10, opc, PNR32_p8to15>;
  7976. def _D : sve2p1_int_while_rr_pn<mnemonic, 0b11, opc, PNR64_p8to15>;
  7977. }
  7978. // SVE integer compare scalar count and limit (predicate pair)
  7979. class sve2p1_int_while_rr_pair<string mnemonic, bits<2> sz, bits<3> opc,
  7980. RegisterOperand ppr_ty>
  7981. : I<(outs ppr_ty:$Pd), (ins GPR64:$Rn, GPR64:$Rm),
  7982. mnemonic, "\t$Pd, $Rn, $Rm",
  7983. "", []>, Sched<[]> {
  7984. bits<3> Pd;
  7985. bits<5> Rn;
  7986. bits<5> Rm;
  7987. let Inst{31-24} = 0b00100101;
  7988. let Inst{23-22} = sz;
  7989. let Inst{21} = 0b1;
  7990. let Inst{20-16} = Rm;
  7991. let Inst{15-12} = 0b0101;
  7992. let Inst{11-10} = opc{2-1};
  7993. let Inst{9-5} = Rn;
  7994. let Inst{4} = 0b1;
  7995. let Inst{3-1} = Pd;
  7996. let Inst{0} = opc{0};
  7997. let Defs = [NZCV];
  7998. }
  7999. multiclass sve2p1_int_while_rr_pair<string mnemonic, bits<3> opc> {
  8000. def _B : sve2p1_int_while_rr_pair<mnemonic, 0b00, opc, PP_b_mul_r>;
  8001. def _H : sve2p1_int_while_rr_pair<mnemonic, 0b01, opc, PP_h_mul_r>;
  8002. def _S : sve2p1_int_while_rr_pair<mnemonic, 0b10, opc, PP_s_mul_r>;
  8003. def _D : sve2p1_int_while_rr_pair<mnemonic, 0b11, opc, PP_d_mul_r>;
  8004. }
  8005. class sve_mem_128b_gld_64_unscaled<string mnemonic>
  8006. : I<(outs Z_q:$Zt), (ins PPR3bAny:$Pg, ZPR64:$Zn, GPR64:$Rm),
  8007. mnemonic, "\t$Zt, $Pg/z, [$Zn, $Rm]",
  8008. "", []>, Sched<[]> {
  8009. bits<5> Zt;
  8010. bits<5> Zn;
  8011. bits<3> Pg;
  8012. bits<5> Rm;
  8013. let Inst{31-21} = 0b11000100000;
  8014. let Inst{20-16} = Rm;
  8015. let Inst{15-13} = 0b101;
  8016. let Inst{12-10} = Pg;
  8017. let Inst{9-5} = Zn;
  8018. let Inst{4-0} = Zt;
  8019. let mayLoad = 1;
  8020. }
  8021. multiclass sve_mem_128b_gld_64_unscaled<string mnemonic> {
  8022. def NAME : sve_mem_128b_gld_64_unscaled<mnemonic>;
  8023. def : InstAlias<mnemonic # " $Zt, $Pg/z, [$Zn]",
  8024. (!cast<Instruction>(NAME) Z_q:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, XZR), 1>;
  8025. }
  8026. class sve_mem_sst_128b_64_unscaled<string mnemonic>
  8027. : I<(outs ), (ins Z_q:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, GPR64:$Rm),
  8028. mnemonic, "\t$Zt, $Pg, [$Zn, $Rm]",
  8029. "", []>, Sched<[]> {
  8030. bits<5> Zt;
  8031. bits<5> Zn;
  8032. bits<3> Pg;
  8033. bits<5> Rm;
  8034. let Inst{31-21} = 0b11100100001;
  8035. let Inst{20-16} = Rm;
  8036. let Inst{15-13} = 0b001;
  8037. let Inst{12-10} = Pg;
  8038. let Inst{9-5} = Zn;
  8039. let Inst{4-0} = Zt;
  8040. let mayStore = 1;
  8041. }
  8042. multiclass sve_mem_sst_128b_64_unscaled<string mnemonic> {
  8043. def NAME : sve_mem_sst_128b_64_unscaled<mnemonic>;
  8044. def : InstAlias<mnemonic # " $Zt, $Pg, [$Zn]",
  8045. (!cast<Instruction>(NAME) Z_q:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, XZR), 1>;
  8046. }
  8047. // SVE contiguous load (quadwords, scalar plus immediate)
  8048. class sve_mem_128b_cld_si<bits<2> dtype, string mnemonic>
  8049. : I<(outs Z_q:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
  8050. mnemonic, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
  8051. "", []>, Sched<[]> {
  8052. bits<5> Zt;
  8053. bits<5> Rn;
  8054. bits<3> Pg;
  8055. bits<4> imm4;
  8056. let Inst{31-25} = 0b1010010;
  8057. let Inst{24-23} = dtype;
  8058. let Inst{22-20} = 0b001;
  8059. let Inst{19-16} = imm4;
  8060. let Inst{15-13} = 0b001;
  8061. let Inst{12-10} = Pg;
  8062. let Inst{9-5} = Rn;
  8063. let Inst{4-0} = Zt;
  8064. let mayLoad = 1;
  8065. }
  8066. multiclass sve_mem_128b_cld_si<bits<2> dtype, string mnemonic> {
  8067. def NAME : sve_mem_128b_cld_si<dtype, mnemonic>;
  8068. def : InstAlias<mnemonic # " $Zt, $Pg/z, [$Rn]",
  8069. (!cast<Instruction>(NAME) Z_q:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
  8070. def : InstAlias<mnemonic # " $Zt, $Pg/z, [$Rn]",
  8071. (!cast<Instruction>(NAME) ZPR128:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
  8072. def : InstAlias<mnemonic # " $Zt, $Pg/z, [$Rn, $imm4, mul vl]",
  8073. (!cast<Instruction>(NAME) ZPR128:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
  8074. }
  8075. // SVE contiguous load (quadwords, scalar plus scalar)
  8076. class sve_mem_128b_cld_ss<bits<2> dtype, string mnemonic, RegisterOperand gprsh_ty>
  8077. : I<(outs Z_q:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprsh_ty:$Rm),
  8078. mnemonic, "\t$Zt, $Pg/z, [$Rn, $Rm]", "",
  8079. []>, Sched<[]> {
  8080. bits<5> Zt;
  8081. bits<5> Rn;
  8082. bits<3> Pg;
  8083. bits<5> Rm;
  8084. let Inst{31-25} = 0b1010010;
  8085. let Inst{24-23} = dtype;
  8086. let Inst{22-21} = 0b00;
  8087. let Inst{20-16} = Rm;
  8088. let Inst{15-13} = 0b100;
  8089. let Inst{12-10} = Pg;
  8090. let Inst{9-5} = Rn;
  8091. let Inst{4-0} = Zt;
  8092. let mayLoad = 1;
  8093. }
  8094. multiclass sve_mem_128b_cld_ss<bits<2> dtype, string mnemonic, RegisterOperand gprsh_ty> {
  8095. def NAME : sve_mem_128b_cld_ss<dtype, mnemonic, gprsh_ty>;
  8096. def : InstAlias<mnemonic # " $Zt, $Pg/z, [$Rn, $Rm]",
  8097. (!cast<Instruction>(NAME) ZPR128:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprsh_ty:$Rm), 0>;
  8098. }
  8099. // SVE floating-point recursive reduction (quadwords)
  8100. class sve2p1_fp_reduction_q<bits<2> sz, bits<3> opc, string mnemonic,
  8101. RegisterOperand zpr_ty, string vec_sfx>
  8102. : I<(outs V128:$Vd), (ins PPR3bAny:$Pg, zpr_ty:$Zn),
  8103. mnemonic, "\t$Vd." # vec_sfx # ", $Pg, $Zn",
  8104. "", []>, Sched<[]> {
  8105. bits<5> Vd;
  8106. bits<5> Zn;
  8107. bits<3> Pg;
  8108. let Inst{31-24} = 0b01100100;
  8109. let Inst{23-22} = sz;
  8110. let Inst{21-19} = 0b010;
  8111. let Inst{18-16} = opc;
  8112. let Inst{15-13} = 0b101;
  8113. let Inst{12-10} = Pg;
  8114. let Inst{9-5} = Zn;
  8115. let Inst{4-0} = Vd;
  8116. }
  8117. multiclass sve2p1_fp_reduction_q<bits<3> opc, string mnemonic> {
  8118. def _H : sve2p1_fp_reduction_q<0b01, opc, mnemonic, ZPR16, "8h">;
  8119. def _S : sve2p1_fp_reduction_q<0b10, opc, mnemonic, ZPR32, "4s">;
  8120. def _D : sve2p1_fp_reduction_q<0b11, opc, mnemonic, ZPR64, "2d">;
  8121. }
  8122. // SVE Permute Vector - Quadwords (DUPQ)
  8123. class sve2p1_dupq<bits<5> ind_tsz, string mnemonic, ZPRRegOp zprty, Operand itype>
  8124. : I<(outs zprty:$Zd), (ins zprty:$Zn, itype:$index),
  8125. mnemonic, "\t$Zd, $Zn$index",
  8126. "", []>, Sched<[]> {
  8127. bits<5> Zd;
  8128. bits<5> Zn;
  8129. let Inst{31-21} = 0b00000101001;
  8130. let Inst{20-16} = ind_tsz;
  8131. let Inst{15-10} = 0b001001;
  8132. let Inst{9-5} = Zn;
  8133. let Inst{4-0} = Zd;
  8134. }
  8135. multiclass sve2p1_dupq<string mnemonic> {
  8136. def _B : sve2p1_dupq<{?, ?, ?, ?, 1}, mnemonic, ZPR8, VectorIndexB32b> {
  8137. bits<4> index;
  8138. let Inst{20-17} = index;
  8139. }
  8140. def _H : sve2p1_dupq<{?, ?, ?, 1, 0}, mnemonic, ZPR16, VectorIndexH32b> {
  8141. bits<3> index;
  8142. let Inst{20-18} = index;
  8143. }
  8144. def _S : sve2p1_dupq<{?, ?, 1, 0, 0}, mnemonic, ZPR32, VectorIndexS32b> {
  8145. bits<2> index;
  8146. let Inst{20-19} = index;
  8147. }
  8148. def _D : sve2p1_dupq<{?, 1, 0, 0, 0}, mnemonic, ZPR64, VectorIndexD32b> {
  8149. bits<1> index;
  8150. let Inst{20} = index;
  8151. }
  8152. }
  8153. // SVE Permute Vector - Quadwords (EXTQ)
  8154. class sve2p1_extq<string mnemonic>
  8155. : I<(outs ZPR8:$Zdn), (ins ZPR8:$_Zdn, ZPR8:$Zm, imm0_15:$imm4),
  8156. mnemonic, "\t$Zdn, $_Zdn, $Zm, $imm4",
  8157. "", []>, Sched<[]> {
  8158. bits<5> Zdn;
  8159. bits<5> Zm;
  8160. bits<4> imm4;
  8161. let Inst{31-20} = 0b000001010110;
  8162. let Inst{19-16} = imm4;
  8163. let Inst{15-10} = 0b001001;
  8164. let Inst{9-5} = Zm;
  8165. let Inst{4-0} = Zdn;
  8166. let Constraints = "$Zdn = $_Zdn";
  8167. let DestructiveInstType = DestructiveOther;
  8168. let ElementSize = ZPR8.ElementSize;
  8169. }
  8170. // SVE move predicate from vector
  8171. class sve2p1_vector_to_pred<bits<4> opc, string mnemonic,
  8172. PPRRegOp ppr_ty, Operand itype>
  8173. : I<(outs ppr_ty:$Pd), (ins ZPRAny:$Zn, itype:$index),
  8174. mnemonic, "\t$Pd, $Zn$index",
  8175. "", []>, Sched<[]> {
  8176. bits<4> Pd;
  8177. bits<5> Zn;
  8178. let Inst{31-24} = 0b00000101;
  8179. let Inst{23-22} = opc{3-2};
  8180. let Inst{21-19} = 0b101;
  8181. let Inst{18-17} = opc{1-0};
  8182. let Inst{16-10} = 0b0001110;
  8183. let Inst{9-5} = Zn;
  8184. let Inst{4} = 0b0;
  8185. let Inst{3-0} = Pd;
  8186. }
  8187. multiclass sve2p1_vector_to_pred<string mnemonic> {
  8188. def _B : sve2p1_vector_to_pred<{0, 0, 0, 1}, mnemonic, PPR8, VectorIndex0>;
  8189. def _H : sve2p1_vector_to_pred<{0, 0, 1, ?}, mnemonic, PPR16, VectorIndexD32b> {
  8190. bits<1> index;
  8191. let Inst{17} = index;
  8192. }
  8193. def _S : sve2p1_vector_to_pred<{0, 1, ?, ?}, mnemonic, PPR32, VectorIndexS32b> {
  8194. bits<2> index;
  8195. let Inst{18-17} = index;
  8196. }
  8197. def _D : sve2p1_vector_to_pred<{1, ?, ?, ?}, mnemonic, PPR64, VectorIndexH32b> {
  8198. bits<3> index;
  8199. let Inst{22} = index{2};
  8200. let Inst{18-17} = index{1-0};
  8201. }
  8202. def : InstAlias<mnemonic # "\t$Pd, $Zn",
  8203. (!cast<Instruction>(NAME # _B) PPR8:$Pd, ZPRAny:$Zn, 0), 1>;
  8204. }
  8205. // SVE move predicate into vector
  8206. class sve2p1_pred_to_vector<bits<4> opc, string mnemonic,
  8207. PPRRegOp ppr_ty, Operand itype>
  8208. : I<(outs ZPRAny:$Zd), (ins ZPRAny:$_Zd, itype:$index, ppr_ty:$Pn),
  8209. mnemonic, "\t$Zd$index, $Pn",
  8210. "", []>, Sched<[]> {
  8211. bits<5> Zd;
  8212. bits<4> Pn;
  8213. let Inst{31-24} = 0b00000101;
  8214. let Inst{23-22} = opc{3-2};
  8215. let Inst{21-19} = 0b101;
  8216. let Inst{18-17} = opc{1-0};
  8217. let Inst{16-9} = 0b10011100;
  8218. let Inst{8-5} = Pn;
  8219. let Inst{4-0} = Zd;
  8220. let Constraints = "$Zd = $_Zd";
  8221. }
  8222. multiclass sve2p1_pred_to_vector<string mnemonic> {
  8223. def _B : sve2p1_pred_to_vector<{0, 0, 0, 1}, mnemonic, PPR8, VectorIndex0>;
  8224. def _H : sve2p1_pred_to_vector<{0, 0, 1, ?}, mnemonic, PPR16, VectorIndexD32b> {
  8225. bits<1> index;
  8226. let Inst{17} = index;
  8227. }
  8228. def _S : sve2p1_pred_to_vector<{0, 1, ?, ?}, mnemonic, PPR32, VectorIndexS32b> {
  8229. bits<2> index;
  8230. let Inst{18-17} = index;
  8231. }
  8232. def _D : sve2p1_pred_to_vector<{1, ?, ?, ?}, mnemonic, PPR64, VectorIndexH32b> {
  8233. bits<3> index;
  8234. let Inst{22} = index{2};
  8235. let Inst{18-17} = index{1-0};
  8236. }
  8237. def : InstAlias<mnemonic # "\t$Zd, $Pn",
  8238. (!cast<Instruction>(NAME # _B) ZPRAny:$Zd, 0, PPR8:$Pn), 1>;
  8239. }
  8240. // SVE bitwise logical/add/min/max reductions (quadwords)
  8241. class sve2p1_int_reduce_q<bits<2> sz, bits<4> opc, string mnemonic,
  8242. RegisterOperand zpr_ty, string vec_sfx>
  8243. : I<(outs V128:$Vd), (ins PPR3bAny:$Pg, zpr_ty:$Zn),
  8244. mnemonic, "\t$Vd." # vec_sfx # ", $Pg, $Zn",
  8245. "", []>, Sched<[]> {
  8246. bits<5> Vd;
  8247. bits<5> Zn;
  8248. bits<3> Pg;
  8249. let Inst{31-24} = 0b00000100;
  8250. let Inst{23-22} = sz;
  8251. let Inst{21} = 0b0;
  8252. let Inst{20-19} = opc{3-2};
  8253. let Inst{18} = 0b1;
  8254. let Inst{17-16} = opc{1-0};
  8255. let Inst{15-13} = 0b001;
  8256. let Inst{12-10} = Pg;
  8257. let Inst{9-5} = Zn;
  8258. let Inst{4-0} = Vd;
  8259. }
  8260. multiclass sve2p1_int_reduce_q<bits<4> opc, string mnemonic> {
  8261. def _B : sve2p1_int_reduce_q<0b00, opc, mnemonic, ZPR8, "16b">;
  8262. def _H : sve2p1_int_reduce_q<0b01, opc, mnemonic, ZPR16, "8h">;
  8263. def _S : sve2p1_int_reduce_q<0b10, opc, mnemonic, ZPR32, "4s">;
  8264. def _D : sve2p1_int_reduce_q<0b11, opc, mnemonic, ZPR64, "2d">;
  8265. }
  8266. // SVE permute vector elements (quadwords)
  8267. class sve2p1_permute_vec_elems_q<bits<2> sz, bits<3> opc, string mnemonic,
  8268. ZPRRegOp zpr_ty, RegisterOperand src1_ty>
  8269. : I<(outs zpr_ty:$Zd), (ins src1_ty:$Zn, zpr_ty:$Zm),
  8270. mnemonic, "\t$Zd, $Zn, $Zm",
  8271. "", []>, Sched<[]> {
  8272. bits<5> Zd;
  8273. bits<5> Zn;
  8274. bits<5> Zm;
  8275. let Inst{31-24} = 0b01000100;
  8276. let Inst{23-22} = sz;
  8277. let Inst{21} = 0b0;
  8278. let Inst{20-16} = Zm;
  8279. let Inst{15-13} = 0b111;
  8280. let Inst{12-10} = opc;
  8281. let Inst{9-5} = Zn;
  8282. let Inst{4-0} = Zd;
  8283. }
  8284. multiclass sve2p1_permute_vec_elems_q<bits<3> opc, string mnemonic> {
  8285. def _B : sve2p1_permute_vec_elems_q<0b00, opc, mnemonic, ZPR8, ZPR8>;
  8286. def _H : sve2p1_permute_vec_elems_q<0b01, opc, mnemonic, ZPR16, ZPR16>;
  8287. def _S : sve2p1_permute_vec_elems_q<0b10, opc, mnemonic, ZPR32, ZPR32>;
  8288. def _D : sve2p1_permute_vec_elems_q<0b11, opc, mnemonic, ZPR64, ZPR64>;
  8289. }
  8290. multiclass sve2p1_tblq<string mnemonic> {
  8291. def _B : sve2p1_permute_vec_elems_q<0b00, 0b110, mnemonic, ZPR8, Z_b>;
  8292. def _H : sve2p1_permute_vec_elems_q<0b01, 0b110, mnemonic, ZPR16, Z_h>;
  8293. def _S : sve2p1_permute_vec_elems_q<0b10, 0b110, mnemonic, ZPR32, Z_s>;
  8294. def _D : sve2p1_permute_vec_elems_q<0b11, 0b110, mnemonic, ZPR64, Z_d>;
  8295. }