1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508 |
- //===- NVPTXIntrinsics.td - PTX Intrinsics Instructions -------*- tblgen -*-==//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- def immFloat0 : PatLeaf<(fpimm), [{
- float f = (float)N->getValueAPF().convertToFloat();
- return (f==0.0f);
- }]>;
- def immFloat1 : PatLeaf<(fpimm), [{
- float f = (float)N->getValueAPF().convertToFloat();
- return (f==1.0f);
- }]>;
- def immDouble0 : PatLeaf<(fpimm), [{
- double d = (double)N->getValueAPF().convertToDouble();
- return (d==0.0);
- }]>;
- def immDouble1 : PatLeaf<(fpimm), [{
- double d = (double)N->getValueAPF().convertToDouble();
- return (d==1.0);
- }]>;
- def AS_match {
- code generic = [{
- return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_GENERIC);
- }];
- code shared = [{
- return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_SHARED);
- }];
- code global = [{
- return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_GLOBAL);
- }];
- }
- // A node that will be replaced with the current PTX version.
- class PTX {
- SDNodeXForm PTXVerXform = SDNodeXForm<imm, [{
- return getI32Imm(Subtarget->getPTXVersion(), SDLoc(N));
- }]>;
- // (i32 0) will be XForm'ed to the currently used PTX version.
- dag version = (PTXVerXform (i32 0));
- }
- def ptx : PTX;
- // Generates list of n sequential register names.
- // E.g. RegNames<3,"r">.ret -> ["r0", "r1", "r2" ]
- class RegSeq<int n, string prefix> {
- list<string> ret = !if(n, !listconcat(RegSeq<!sub(n, 1), prefix>.ret,
- [prefix # !sub(n, 1)]),
- []);
- }
- class THREADMASK_INFO<bit sync> {
- list<bit> ret = !if(sync, [0, 1], [0]);
- }
- //-----------------------------------
- // Synchronization and shuffle functions
- //-----------------------------------
- let isConvergent = true in {
- def INT_BARRIER0 : NVPTXInst<(outs), (ins),
- "bar.sync \t0;",
- [(int_nvvm_barrier0)]>;
- def INT_BARRIERN : NVPTXInst<(outs), (ins Int32Regs:$src1),
- "bar.sync \t$src1;",
- [(int_nvvm_barrier_n Int32Regs:$src1)]>;
- def INT_BARRIER : NVPTXInst<(outs), (ins Int32Regs:$src1, Int32Regs:$src2),
- "bar.sync \t$src1, $src2;",
- [(int_nvvm_barrier Int32Regs:$src1, Int32Regs:$src2)]>;
- def INT_BARRIER0_POPC : NVPTXInst<(outs Int32Regs:$dst), (ins Int32Regs:$pred),
- !strconcat("{{ \n\t",
- ".reg .pred \t%p1; \n\t",
- "setp.ne.u32 \t%p1, $pred, 0; \n\t",
- "bar.red.popc.u32 \t$dst, 0, %p1; \n\t",
- "}}"),
- [(set Int32Regs:$dst, (int_nvvm_barrier0_popc Int32Regs:$pred))]>;
- def INT_BARRIER0_AND : NVPTXInst<(outs Int32Regs:$dst), (ins Int32Regs:$pred),
- !strconcat("{{ \n\t",
- ".reg .pred \t%p1; \n\t",
- ".reg .pred \t%p2; \n\t",
- "setp.ne.u32 \t%p1, $pred, 0; \n\t",
- "bar.red.and.pred \t%p2, 0, %p1; \n\t",
- "selp.u32 \t$dst, 1, 0, %p2; \n\t",
- "}}"),
- [(set Int32Regs:$dst, (int_nvvm_barrier0_and Int32Regs:$pred))]>;
- def INT_BARRIER0_OR : NVPTXInst<(outs Int32Regs:$dst), (ins Int32Regs:$pred),
- !strconcat("{{ \n\t",
- ".reg .pred \t%p1; \n\t",
- ".reg .pred \t%p2; \n\t",
- "setp.ne.u32 \t%p1, $pred, 0; \n\t",
- "bar.red.or.pred \t%p2, 0, %p1; \n\t",
- "selp.u32 \t$dst, 1, 0, %p2; \n\t",
- "}}"),
- [(set Int32Regs:$dst, (int_nvvm_barrier0_or Int32Regs:$pred))]>;
- def INT_BAR_SYNC : NVPTXInst<(outs), (ins i32imm:$i), "bar.sync \t$i;",
- [(int_nvvm_bar_sync imm:$i)]>;
- def INT_BAR_WARP_SYNC_I : NVPTXInst<(outs), (ins i32imm:$i), "bar.warp.sync \t$i;",
- [(int_nvvm_bar_warp_sync imm:$i)]>,
- Requires<[hasPTX60, hasSM30]>;
- def INT_BAR_WARP_SYNC_R : NVPTXInst<(outs), (ins Int32Regs:$i), "bar.warp.sync \t$i;",
- [(int_nvvm_bar_warp_sync Int32Regs:$i)]>,
- Requires<[hasPTX60, hasSM30]>;
- def INT_BARRIER_SYNC_I : NVPTXInst<(outs), (ins i32imm:$i), "barrier.sync \t$i;",
- [(int_nvvm_barrier_sync imm:$i)]>,
- Requires<[hasPTX60, hasSM30]>;
- def INT_BARRIER_SYNC_R : NVPTXInst<(outs), (ins Int32Regs:$i), "barrier.sync \t$i;",
- [(int_nvvm_barrier_sync Int32Regs:$i)]>,
- Requires<[hasPTX60, hasSM30]>;
- def INT_BARRIER_SYNC_CNT_RR : NVPTXInst<(outs), (ins Int32Regs:$id, Int32Regs:$cnt),
- "barrier.sync \t$id, $cnt;",
- [(int_nvvm_barrier_sync_cnt Int32Regs:$id, Int32Regs:$cnt)]>,
- Requires<[hasPTX60, hasSM30]>;
- def INT_BARRIER_SYNC_CNT_RI : NVPTXInst<(outs), (ins Int32Regs:$id, i32imm:$cnt),
- "barrier.sync \t$id, $cnt;",
- [(int_nvvm_barrier_sync_cnt Int32Regs:$id, imm:$cnt)]>,
- Requires<[hasPTX60, hasSM30]>;
- def INT_BARRIER_SYNC_CNT_IR : NVPTXInst<(outs), (ins i32imm:$id, Int32Regs:$cnt),
- "barrier.sync \t$id, $cnt;",
- [(int_nvvm_barrier_sync_cnt imm:$id, Int32Regs:$cnt)]>,
- Requires<[hasPTX60, hasSM30]>;
- def INT_BARRIER_SYNC_CNT_II : NVPTXInst<(outs), (ins i32imm:$id, i32imm:$cnt),
- "barrier.sync \t$id, $cnt;",
- [(int_nvvm_barrier_sync_cnt imm:$id, imm:$cnt)]>,
- Requires<[hasPTX60, hasSM30]>;
- class SHFL_INSTR<bit sync, string mode, string reg, bit return_pred,
- bit offset_imm, bit mask_imm, bit threadmask_imm>
- : NVPTXInst<(outs), (ins), "?", []> {
- NVPTXRegClass rc = !cond(
- !eq(reg, "i32"): Int32Regs,
- !eq(reg, "f32"): Float32Regs);
- string IntrName = "int_nvvm_shfl_"
- # !if(sync, "sync_", "")
- # mode
- # "_" # reg
- # !if(return_pred, "p", "");
- Intrinsic Intr = !cast<Intrinsic>(IntrName);
- let InOperandList = !con(
- !if(sync,
- !dag(ins, !if(threadmask_imm, [i32imm], [Int32Regs]), ["threadmask"]),
- (ins)),
- (ins rc:$src),
- !dag(ins, !if(offset_imm, [i32imm], [Int32Regs]), ["offset"]),
- !dag(ins, !if(mask_imm, [i32imm], [Int32Regs]), ["mask"])
- );
- let OutOperandList = !if(return_pred, (outs rc:$dst, Int1Regs:$pred), (outs rc:$dst));
- let AsmString = "shfl."
- # !if(sync, "sync.", "")
- # mode # ".b32\t"
- # "$dst"
- # !if(return_pred, "|$pred", "") # ", "
- # "$src, $offset, $mask"
- # !if(sync, ", $threadmask", "")
- # ";"
- ;
- let Pattern = [!con(
- !foreach(tmp, OutOperandList,
- !subst(outs, set,
- !subst(i32imm, imm, tmp))),
- (set !foreach(tmp, InOperandList,
- !subst(ins, Intr,
- !subst(i32imm, imm, tmp))))
- )];
- }
- foreach sync = [false, true] in {
- foreach mode = ["up", "down", "bfly", "idx"] in {
- foreach regclass = ["i32", "f32"] in {
- foreach return_pred = [false, true] in {
- foreach offset_imm = [false, true] in {
- foreach mask_imm = [false, true] in {
- foreach threadmask_imm = THREADMASK_INFO<sync>.ret in {
- def : SHFL_INSTR<sync, mode, regclass, return_pred,
- offset_imm, mask_imm, threadmask_imm>,
- Requires<!if(sync, [hasSM30], [hasSM30, hasSHFL])>;
- }
- }
- }
- }
- }
- }
- }
- // vote.{all,any,uni,ballot}
- multiclass VOTE<NVPTXRegClass regclass, string mode, Intrinsic IntOp> {
- def : NVPTXInst<(outs regclass:$dest), (ins Int1Regs:$pred),
- "vote." # mode # " \t$dest, $pred;",
- [(set regclass:$dest, (IntOp Int1Regs:$pred))]>,
- Requires<[hasPTX60, hasSM30]>;
- }
- defm VOTE_ALL : VOTE<Int1Regs, "all.pred", int_nvvm_vote_all>;
- defm VOTE_ANY : VOTE<Int1Regs, "any.pred", int_nvvm_vote_any>;
- defm VOTE_UNI : VOTE<Int1Regs, "uni.pred", int_nvvm_vote_uni>;
- defm VOTE_BALLOT : VOTE<Int32Regs, "ballot.b32", int_nvvm_vote_ballot>;
- // vote.sync.{all,any,uni,ballot}
- multiclass VOTE_SYNC<NVPTXRegClass regclass, string mode, Intrinsic IntOp> {
- def i : NVPTXInst<(outs regclass:$dest), (ins i32imm:$mask, Int1Regs:$pred),
- "vote.sync." # mode # " \t$dest, $pred, $mask;",
- [(set regclass:$dest, (IntOp imm:$mask, Int1Regs:$pred))]>,
- Requires<[hasPTX60, hasSM30]>;
- def r : NVPTXInst<(outs regclass:$dest), (ins Int32Regs:$mask, Int1Regs:$pred),
- "vote.sync." # mode #" \t$dest, $pred, $mask;",
- [(set regclass:$dest, (IntOp Int32Regs:$mask, Int1Regs:$pred))]>,
- Requires<[hasPTX60, hasSM30]>;
- }
- defm VOTE_SYNC_ALL : VOTE_SYNC<Int1Regs, "all.pred", int_nvvm_vote_all_sync>;
- defm VOTE_SYNC_ANY : VOTE_SYNC<Int1Regs, "any.pred", int_nvvm_vote_any_sync>;
- defm VOTE_SYNC_UNI : VOTE_SYNC<Int1Regs, "uni.pred", int_nvvm_vote_uni_sync>;
- defm VOTE_SYNC_BALLOT : VOTE_SYNC<Int32Regs, "ballot.b32", int_nvvm_vote_ballot_sync>;
- multiclass MATCH_ANY_SYNC<NVPTXRegClass regclass, string ptxtype, Intrinsic IntOp,
- Operand ImmOp> {
- def ii : NVPTXInst<(outs regclass:$dest), (ins i32imm:$mask, ImmOp:$value),
- "match.any.sync." # ptxtype # " \t$dest, $value, $mask;",
- [(set regclass:$dest, (IntOp imm:$mask, imm:$value))]>,
- Requires<[hasPTX60, hasSM70]>;
- def ir : NVPTXInst<(outs regclass:$dest), (ins Int32Regs:$mask, ImmOp:$value),
- "match.any.sync." # ptxtype # " \t$dest, $value, $mask;",
- [(set regclass:$dest, (IntOp Int32Regs:$mask, imm:$value))]>,
- Requires<[hasPTX60, hasSM70]>;
- def ri : NVPTXInst<(outs regclass:$dest), (ins i32imm:$mask, regclass:$value),
- "match.any.sync." # ptxtype # " \t$dest, $value, $mask;",
- [(set regclass:$dest, (IntOp imm:$mask, regclass:$value))]>,
- Requires<[hasPTX60, hasSM70]>;
- def rr : NVPTXInst<(outs regclass:$dest), (ins Int32Regs:$mask, regclass:$value),
- "match.any.sync." # ptxtype # " \t$dest, $value, $mask;",
- [(set regclass:$dest, (IntOp Int32Regs:$mask, regclass:$value))]>,
- Requires<[hasPTX60, hasSM70]>;
- }
- defm MATCH_ANY_SYNC_32 : MATCH_ANY_SYNC<Int32Regs, "b32", int_nvvm_match_any_sync_i32,
- i32imm>;
- defm MATCH_ANY_SYNC_64 : MATCH_ANY_SYNC<Int64Regs, "b64", int_nvvm_match_any_sync_i64,
- i64imm>;
- multiclass MATCH_ALLP_SYNC<NVPTXRegClass regclass, string ptxtype, Intrinsic IntOp,
- Operand ImmOp> {
- def ii : NVPTXInst<(outs regclass:$dest, Int1Regs:$pred),
- (ins i32imm:$mask, ImmOp:$value),
- "match.all.sync." # ptxtype # " \t$dest|$pred, $value, $mask;",
- [(set regclass:$dest, Int1Regs:$pred, (IntOp imm:$mask, imm:$value))]>,
- Requires<[hasPTX60, hasSM70]>;
- def ir : NVPTXInst<(outs regclass:$dest, Int1Regs:$pred),
- (ins Int32Regs:$mask, ImmOp:$value),
- "match.all.sync." # ptxtype # " \t$dest|$pred, $value, $mask;",
- [(set regclass:$dest, Int1Regs:$pred, (IntOp Int32Regs:$mask, imm:$value))]>,
- Requires<[hasPTX60, hasSM70]>;
- def ri : NVPTXInst<(outs regclass:$dest, Int1Regs:$pred),
- (ins i32imm:$mask, regclass:$value),
- "match.all.sync." # ptxtype # " \t$dest|$pred, $value, $mask;",
- [(set regclass:$dest, Int1Regs:$pred, (IntOp imm:$mask, regclass:$value))]>,
- Requires<[hasPTX60, hasSM70]>;
- def rr : NVPTXInst<(outs regclass:$dest, Int1Regs:$pred),
- (ins Int32Regs:$mask, regclass:$value),
- "match.all.sync." # ptxtype # " \t$dest|$pred, $value, $mask;",
- [(set regclass:$dest, Int1Regs:$pred, (IntOp Int32Regs:$mask, regclass:$value))]>,
- Requires<[hasPTX60, hasSM70]>;
- }
- defm MATCH_ALLP_SYNC_32 : MATCH_ALLP_SYNC<Int32Regs, "b32", int_nvvm_match_all_sync_i32p,
- i32imm>;
- defm MATCH_ALLP_SYNC_64 : MATCH_ALLP_SYNC<Int64Regs, "b64", int_nvvm_match_all_sync_i64p,
- i64imm>;
- multiclass REDUX_SYNC<string BinOp, string PTXType, Intrinsic Intrin> {
- def : NVPTXInst<(outs Int32Regs:$dst), (ins Int32Regs:$src, Int32Regs:$mask),
- "redux.sync." # BinOp # "." # PTXType # " $dst, $src, $mask;",
- [(set Int32Regs:$dst, (Intrin Int32Regs:$src, Int32Regs:$mask))]>,
- Requires<[hasPTX70, hasSM80]>;
- }
- defm REDUX_SYNC_UMIN : REDUX_SYNC<"min", "u32", int_nvvm_redux_sync_umin>;
- defm REDUX_SYNC_UMAX : REDUX_SYNC<"max", "u32", int_nvvm_redux_sync_umax>;
- defm REDUX_SYNC_ADD : REDUX_SYNC<"add", "s32", int_nvvm_redux_sync_add>;
- defm REDUX_SYNC_MIN : REDUX_SYNC<"min", "s32", int_nvvm_redux_sync_min>;
- defm REDUX_SYNC_MAX : REDUX_SYNC<"max", "s32", int_nvvm_redux_sync_max>;
- defm REDUX_SYNC_AND : REDUX_SYNC<"and", "b32", int_nvvm_redux_sync_and>;
- defm REDUX_SYNC_XOR : REDUX_SYNC<"xor", "b32", int_nvvm_redux_sync_xor>;
- defm REDUX_SYNC_OR : REDUX_SYNC<"or", "b32", int_nvvm_redux_sync_or>;
- } // isConvergent = true
- //-----------------------------------
- // Explicit Memory Fence Functions
- //-----------------------------------
- class MEMBAR<string StrOp, Intrinsic IntOP> :
- NVPTXInst<(outs), (ins),
- StrOp, [(IntOP)]>;
- def INT_MEMBAR_CTA : MEMBAR<"membar.cta;", int_nvvm_membar_cta>;
- def INT_MEMBAR_GL : MEMBAR<"membar.gl;", int_nvvm_membar_gl>;
- def INT_MEMBAR_SYS : MEMBAR<"membar.sys;", int_nvvm_membar_sys>;
- //-----------------------------------
- // Async Copy Functions
- //-----------------------------------
- multiclass CP_ASYNC_MBARRIER_ARRIVE<string NoInc, string AddrSpace, Intrinsic Intrin> {
- def _32 : NVPTXInst<(outs), (ins Int32Regs:$addr),
- !strconcat("cp.async.mbarrier.arrive", NoInc, AddrSpace, ".b64 [$addr];"),
- [(Intrin Int32Regs:$addr)]>,
- Requires<[hasPTX70, hasSM80]>;
- def _64 : NVPTXInst<(outs), (ins Int64Regs:$addr),
- !strconcat("cp.async.mbarrier.arrive", NoInc, AddrSpace, ".b64 [$addr];"),
- [(Intrin Int64Regs:$addr)]>,
- Requires<[hasPTX70, hasSM80]>;
- }
- defm CP_ASYNC_MBARRIER_ARRIVE :
- CP_ASYNC_MBARRIER_ARRIVE<"", "", int_nvvm_cp_async_mbarrier_arrive>;
- defm CP_ASYNC_MBARRIER_ARRIVE_SHARED :
- CP_ASYNC_MBARRIER_ARRIVE<"", ".shared", int_nvvm_cp_async_mbarrier_arrive_shared>;
- defm CP_ASYNC_MBARRIER_ARRIVE_NOINC :
- CP_ASYNC_MBARRIER_ARRIVE<".noinc", "", int_nvvm_cp_async_mbarrier_arrive_noinc>;
- defm CP_ASYNC_MBARRIER_ARRIVE_NOINC_SHARED :
- CP_ASYNC_MBARRIER_ARRIVE<".noinc", ".shared", int_nvvm_cp_async_mbarrier_arrive_noinc_shared>;
- multiclass CP_ASYNC_CA_SHARED_GLOBAL_I<string cpsize, Intrinsic Intrin> {
- def _32 : NVPTXInst<(outs), (ins Int32Regs:$dst, Int32Regs:$src),
- !strconcat("cp.async.ca.shared.global [$dst], [$src], ", cpsize, ";"),
- [(Intrin Int32Regs:$dst, Int32Regs:$src)]>,
- Requires<[hasPTX70, hasSM80]>;
- def _64 : NVPTXInst<(outs), (ins Int64Regs:$dst, Int64Regs:$src),
- !strconcat("cp.async.ca.shared.global [$dst], [$src], ", cpsize, ";"),
- [(Intrin Int64Regs:$dst, Int64Regs:$src)]>,
- Requires<[hasPTX70, hasSM80]>;
- }
- defm CP_ASYNC_CA_SHARED_GLOBAL_4 :
- CP_ASYNC_CA_SHARED_GLOBAL_I<"4", int_nvvm_cp_async_ca_shared_global_4>;
- defm CP_ASYNC_CA_SHARED_GLOBAL_8 :
- CP_ASYNC_CA_SHARED_GLOBAL_I<"8", int_nvvm_cp_async_ca_shared_global_8>;
- defm CP_ASYNC_CA_SHARED_GLOBAL_16 :
- CP_ASYNC_CA_SHARED_GLOBAL_I<"16", int_nvvm_cp_async_ca_shared_global_16>;
- multiclass CP_ASYNC_CG_SHARED_GLOBAL<string cpsize, Intrinsic Intrin> {
- def _32 : NVPTXInst<(outs), (ins Int32Regs:$dst, Int32Regs:$src),
- !strconcat("cp.async.cg.shared.global [$dst], [$src], ", cpsize, ";"),
- [(Intrin Int32Regs:$dst, Int32Regs:$src)]>,
- Requires<[hasPTX70, hasSM80]>;
- def _64 : NVPTXInst<(outs), (ins Int64Regs:$dst, Int64Regs:$src),
- !strconcat("cp.async.cg.shared.global [$dst], [$src], ", cpsize, ";"),
- [(Intrin Int64Regs:$dst, Int64Regs:$src)]>,
- Requires<[hasPTX70, hasSM80]>;
- }
- defm CP_ASYNC_CG_SHARED_GLOBAL_16 :
- CP_ASYNC_CG_SHARED_GLOBAL<"16", int_nvvm_cp_async_cg_shared_global_16>;
- def CP_ASYNC_COMMIT_GROUP :
- NVPTXInst<(outs), (ins), "cp.async.commit_group;", [(int_nvvm_cp_async_commit_group)]>,
- Requires<[hasPTX70, hasSM80]>;
- def CP_ASYNC_WAIT_GROUP :
- NVPTXInst<(outs), (ins i32imm:$n), "cp.async.wait_group $n;",
- [(int_nvvm_cp_async_wait_group (i32 timm:$n))]>,
- Requires<[hasPTX70, hasSM80]>;
- def CP_ASYNC_WAIT_ALL :
- NVPTXInst<(outs), (ins), "cp.async.wait_all;",
- [(int_nvvm_cp_async_wait_all)]>,
- Requires<[hasPTX70, hasSM80]>;
- //-----------------------------------
- // MBarrier Functions
- //-----------------------------------
- multiclass MBARRIER_INIT<string AddrSpace, Intrinsic Intrin> {
- def _32 : NVPTXInst<(outs), (ins Int32Regs:$addr, Int32Regs:$count),
- !strconcat("mbarrier.init", AddrSpace, ".b64 [$addr], $count;"),
- [(Intrin Int32Regs:$addr, Int32Regs:$count)]>,
- Requires<[hasPTX70, hasSM80]>;
- def _64 : NVPTXInst<(outs), (ins Int64Regs:$addr, Int32Regs:$count),
- !strconcat("mbarrier.init", AddrSpace, ".b64 [$addr], $count;"),
- [(Intrin Int64Regs:$addr, Int32Regs:$count)]>,
- Requires<[hasPTX70, hasSM80]>;
- }
- defm MBARRIER_INIT : MBARRIER_INIT<"", int_nvvm_mbarrier_init>;
- defm MBARRIER_INIT_SHARED : MBARRIER_INIT<".shared",
- int_nvvm_mbarrier_init_shared>;
- multiclass MBARRIER_INVAL<string AddrSpace, Intrinsic Intrin> {
- def _32 : NVPTXInst<(outs), (ins Int32Regs:$addr),
- !strconcat("mbarrier.inval", AddrSpace, ".b64 [$addr];"),
- [(Intrin Int32Regs:$addr)]>,
- Requires<[hasPTX70, hasSM80]>;
- def _64 : NVPTXInst<(outs), (ins Int64Regs:$addr),
- !strconcat("mbarrier.inval", AddrSpace, ".b64 [$addr];"),
- [(Intrin Int64Regs:$addr)]>,
- Requires<[hasPTX70, hasSM80]>;
- }
- defm MBARRIER_INVAL : MBARRIER_INVAL<"", int_nvvm_mbarrier_inval>;
- defm MBARRIER_INVAL_SHARED : MBARRIER_INVAL<".shared",
- int_nvvm_mbarrier_inval_shared>;
- multiclass MBARRIER_ARRIVE<string AddrSpace, Intrinsic Intrin> {
- def _32 : NVPTXInst<(outs Int64Regs:$state), (ins Int32Regs:$addr),
- !strconcat("mbarrier.arrive", AddrSpace, ".b64 $state, [$addr];"),
- [(set Int64Regs:$state, (Intrin Int32Regs:$addr))]>,
- Requires<[hasPTX70, hasSM80]>;
- def _64 : NVPTXInst<(outs Int64Regs:$state), (ins Int64Regs:$addr),
- !strconcat("mbarrier.arrive", AddrSpace, ".b64 $state, [$addr];"),
- [(set Int64Regs:$state, (Intrin Int64Regs:$addr))]>,
- Requires<[hasPTX70, hasSM80]>;
- }
- defm MBARRIER_ARRIVE : MBARRIER_ARRIVE<"", int_nvvm_mbarrier_arrive>;
- defm MBARRIER_ARRIVE_SHARED :
- MBARRIER_ARRIVE<".shared", int_nvvm_mbarrier_arrive_shared>;
- multiclass MBARRIER_ARRIVE_NOCOMPLETE<string AddrSpace, Intrinsic Intrin> {
- def _32 : NVPTXInst<(outs Int64Regs:$state),
- (ins Int32Regs:$addr, Int32Regs:$count),
- !strconcat("mbarrier.arrive.noComplete", AddrSpace,
- ".b64 $state, [$addr], $count;"),
- [(set Int64Regs:$state, (Intrin Int32Regs:$addr, Int32Regs:$count))]>,
- Requires<[hasPTX70, hasSM80]>;
- def _64 : NVPTXInst<(outs Int64Regs:$state),
- (ins Int64Regs:$addr, Int32Regs:$count),
- !strconcat("mbarrier.arrive.noComplete", AddrSpace,
- ".b64 $state, [$addr], $count;"),
- [(set Int64Regs:$state, (Intrin Int64Regs:$addr, Int32Regs:$count))]>,
- Requires<[hasPTX70, hasSM80]>;
- }
- defm MBARRIER_ARRIVE_NOCOMPLETE :
- MBARRIER_ARRIVE_NOCOMPLETE<"", int_nvvm_mbarrier_arrive_noComplete>;
- defm MBARRIER_ARRIVE_NOCOMPLETE_SHARED :
- MBARRIER_ARRIVE_NOCOMPLETE<".shared", int_nvvm_mbarrier_arrive_noComplete_shared>;
- multiclass MBARRIER_ARRIVE_DROP<string AddrSpace, Intrinsic Intrin> {
- def _32 : NVPTXInst<(outs Int64Regs:$state), (ins Int32Regs:$addr),
- !strconcat("mbarrier.arrive_drop", AddrSpace,
- ".b64 $state, [$addr];"),
- [(set Int64Regs:$state, (Intrin Int32Regs:$addr))]>,
- Requires<[hasPTX70, hasSM80]>;
- def _64 : NVPTXInst<(outs Int64Regs:$state), (ins Int64Regs:$addr),
- !strconcat("mbarrier.arrive_drop", AddrSpace,
- ".b64 $state, [$addr];"),
- [(set Int64Regs:$state, (Intrin Int64Regs:$addr))]>,
- Requires<[hasPTX70, hasSM80]>;
- }
- defm MBARRIER_ARRIVE_DROP :
- MBARRIER_ARRIVE_DROP<"", int_nvvm_mbarrier_arrive_drop>;
- defm MBARRIER_ARRIVE_DROP_SHARED :
- MBARRIER_ARRIVE_DROP<".shared", int_nvvm_mbarrier_arrive_drop_shared>;
- multiclass MBARRIER_ARRIVE_DROP_NOCOMPLETE<string AddrSpace, Intrinsic Intrin> {
- def _32 : NVPTXInst<(outs Int64Regs:$state),
- (ins Int32Regs:$addr, Int32Regs:$count),
- !strconcat("mbarrier.arrive_drop.noComplete", AddrSpace,
- ".b64 $state, [$addr], $count;"),
- [(set Int64Regs:$state, (Intrin Int32Regs:$addr, Int32Regs:$count))]>,
- Requires<[hasPTX70, hasSM80]>;
- def _64 : NVPTXInst<(outs Int64Regs:$state),
- (ins Int64Regs:$addr, Int32Regs:$count),
- !strconcat("mbarrier.arrive_drop.noComplete", AddrSpace,
- ".b64 $state, [$addr], $count;"),
- [(set Int64Regs:$state, (Intrin Int64Regs:$addr, Int32Regs:$count))]>,
- Requires<[hasPTX70, hasSM80]>;
- }
- defm MBARRIER_ARRIVE_DROP_NOCOMPLETE :
- MBARRIER_ARRIVE_DROP_NOCOMPLETE<"", int_nvvm_mbarrier_arrive_drop_noComplete>;
- defm MBARRIER_ARRIVE_DROP_NOCOMPLETE_SHARED :
- MBARRIER_ARRIVE_DROP_NOCOMPLETE<".shared",
- int_nvvm_mbarrier_arrive_drop_noComplete_shared>;
- multiclass MBARRIER_TEST_WAIT<string AddrSpace, Intrinsic Intrin> {
- def _32 : NVPTXInst<(outs Int1Regs:$res), (ins Int32Regs:$addr, Int64Regs:$state),
- !strconcat("mbarrier.test_wait", AddrSpace, ".b64 $res, [$addr], $state;"),
- [(set Int1Regs:$res, (Intrin Int32Regs:$addr, Int64Regs:$state))]>,
- Requires<[hasPTX70, hasSM80]>;
- def _64 : NVPTXInst<(outs Int1Regs:$res), (ins Int64Regs:$addr, Int64Regs:$state),
- !strconcat("mbarrier.test_wait", AddrSpace, ".b64 $res, [$addr], $state;"),
- [(set Int1Regs:$res, (Intrin Int64Regs:$addr, Int64Regs:$state))]>,
- Requires<[hasPTX70, hasSM80]>;
- }
- defm MBARRIER_TEST_WAIT :
- MBARRIER_TEST_WAIT<"", int_nvvm_mbarrier_test_wait>;
- defm MBARRIER_TEST_WAIT_SHARED :
- MBARRIER_TEST_WAIT<".shared", int_nvvm_mbarrier_test_wait_shared>;
- class MBARRIER_PENDING_COUNT<Intrinsic Intrin> :
- NVPTXInst<(outs Int32Regs:$res), (ins Int64Regs:$state),
- "mbarrier.pending_count.b64 $res, $state;",
- [(set Int32Regs:$res, (Intrin Int64Regs:$state))]>,
- Requires<[hasPTX70, hasSM80]>;
- def MBARRIER_PENDING_COUNT :
- MBARRIER_PENDING_COUNT<int_nvvm_mbarrier_pending_count>;
- //-----------------------------------
- // Math Functions
- //-----------------------------------
- // Map min(1.0, max(0.0, x)) to sat(x)
- // Note that max(0.0, min(x, 1.0)) cannot be mapped to sat(x) because when x is
- // NaN
- // max(0.0, min(x, 1.0)) is 1.0 while sat(x) is 0.
- // Same story for fmax, fmin.
- def : Pat<(int_nvvm_fmin_f immFloat1,
- (int_nvvm_fmax_f immFloat0, Float32Regs:$a)),
- (CVT_f32_f32 Float32Regs:$a, CvtSAT)>;
- def : Pat<(int_nvvm_fmin_f immFloat1,
- (int_nvvm_fmax_f Float32Regs:$a, immFloat0)),
- (CVT_f32_f32 Float32Regs:$a, CvtSAT)>;
- def : Pat<(int_nvvm_fmin_f
- (int_nvvm_fmax_f immFloat0, Float32Regs:$a), immFloat1),
- (CVT_f32_f32 Float32Regs:$a, CvtSAT)>;
- def : Pat<(int_nvvm_fmin_f
- (int_nvvm_fmax_f Float32Regs:$a, immFloat0), immFloat1),
- (CVT_f32_f32 Float32Regs:$a, CvtSAT)>;
- def : Pat<(int_nvvm_fmin_d immDouble1,
- (int_nvvm_fmax_d immDouble0, Float64Regs:$a)),
- (CVT_f64_f64 Float64Regs:$a, CvtSAT)>;
- def : Pat<(int_nvvm_fmin_d immDouble1,
- (int_nvvm_fmax_d Float64Regs:$a, immDouble0)),
- (CVT_f64_f64 Float64Regs:$a, CvtSAT)>;
- def : Pat<(int_nvvm_fmin_d
- (int_nvvm_fmax_d immDouble0, Float64Regs:$a), immDouble1),
- (CVT_f64_f64 Float64Regs:$a, CvtSAT)>;
- def : Pat<(int_nvvm_fmin_d
- (int_nvvm_fmax_d Float64Regs:$a, immDouble0), immDouble1),
- (CVT_f64_f64 Float64Regs:$a, CvtSAT)>;
- // We need a full string for OpcStr here because we need to deal with case like
- // INT_PTX_RECIP.
- class F_MATH_1<string OpcStr, NVPTXRegClass target_regclass,
- NVPTXRegClass src_regclass, Intrinsic IntOP>
- : NVPTXInst<(outs target_regclass:$dst), (ins src_regclass:$src0),
- OpcStr,
- [(set target_regclass:$dst, (IntOP src_regclass:$src0))]>;
- // We need a full string for OpcStr here because we need to deal with the case
- // like INT_PTX_NATIVE_POWR_F.
- class F_MATH_2<string OpcStr, NVPTXRegClass t_regclass,
- NVPTXRegClass s0_regclass, NVPTXRegClass s1_regclass, Intrinsic IntOP>
- : NVPTXInst<(outs t_regclass:$dst),
- (ins s0_regclass:$src0, s1_regclass:$src1),
- OpcStr,
- [(set t_regclass:$dst, (IntOP s0_regclass:$src0, s1_regclass:$src1))]>;
- class F_MATH_3<string OpcStr, NVPTXRegClass t_regclass,
- NVPTXRegClass s0_regclass, NVPTXRegClass s1_regclass,
- NVPTXRegClass s2_regclass, Intrinsic IntOP>
- : NVPTXInst<(outs t_regclass:$dst),
- (ins s0_regclass:$src0, s1_regclass:$src1, s2_regclass:$src2),
- OpcStr,
- [(set t_regclass:$dst,
- (IntOP s0_regclass:$src0, s1_regclass:$src1, s2_regclass:$src2))]>;
- //
- // MISC
- //
- def INT_NVVM_PRMT : F_MATH_3<"prmt.b32 \t$dst, $src0, $src1, $src2;", Int32Regs,
- Int32Regs, Int32Regs, Int32Regs, int_nvvm_prmt>;
- //
- // Min Max
- //
- def INT_NVVM_FMIN_F : F_MATH_2<"min.f32 \t$dst, $src0, $src1;", Float32Regs,
- Float32Regs, Float32Regs, int_nvvm_fmin_f>;
- def INT_NVVM_FMIN_FTZ_F : F_MATH_2<"min.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_fmin_ftz_f>;
- def INT_NVVM_FMAX_F : F_MATH_2<"max.f32 \t$dst, $src0, $src1;", Float32Regs,
- Float32Regs, Float32Regs, int_nvvm_fmax_f>;
- def INT_NVVM_FMAX_FTZ_F : F_MATH_2<"max.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_fmax_ftz_f>;
- def INT_NVVM_FMIN_D : F_MATH_2<"min.f64 \t$dst, $src0, $src1;", Float64Regs,
- Float64Regs, Float64Regs, int_nvvm_fmin_d>;
- def INT_NVVM_FMAX_D : F_MATH_2<"max.f64 \t$dst, $src0, $src1;", Float64Regs,
- Float64Regs, Float64Regs, int_nvvm_fmax_d>;
- //
- // Multiplication
- //
- def INT_NVVM_MULHI_I : F_MATH_2<"mul.hi.s32 \t$dst, $src0, $src1;", Int32Regs,
- Int32Regs, Int32Regs, int_nvvm_mulhi_i>;
- def INT_NVVM_MULHI_UI : F_MATH_2<"mul.hi.u32 \t$dst, $src0, $src1;", Int32Regs,
- Int32Regs, Int32Regs, int_nvvm_mulhi_ui>;
- def INT_NVVM_MULHI_LL : F_MATH_2<"mul.hi.s64 \t$dst, $src0, $src1;", Int64Regs,
- Int64Regs, Int64Regs, int_nvvm_mulhi_ll>;
- def INT_NVVM_MULHI_ULL : F_MATH_2<"mul.hi.u64 \t$dst, $src0, $src1;", Int64Regs,
- Int64Regs, Int64Regs, int_nvvm_mulhi_ull>;
- def INT_NVVM_MUL_RN_FTZ_F : F_MATH_2<"mul.rn.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rn_ftz_f>;
- def INT_NVVM_MUL_RN_F : F_MATH_2<"mul.rn.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rn_f>;
- def INT_NVVM_MUL_RZ_FTZ_F : F_MATH_2<"mul.rz.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rz_ftz_f>;
- def INT_NVVM_MUL_RZ_F : F_MATH_2<"mul.rz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rz_f>;
- def INT_NVVM_MUL_RM_FTZ_F : F_MATH_2<"mul.rm.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rm_ftz_f>;
- def INT_NVVM_MUL_RM_F : F_MATH_2<"mul.rm.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rm_f>;
- def INT_NVVM_MUL_RP_FTZ_F : F_MATH_2<"mul.rp.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rp_ftz_f>;
- def INT_NVVM_MUL_RP_F : F_MATH_2<"mul.rp.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_mul_rp_f>;
- def INT_NVVM_MUL_RN_D : F_MATH_2<"mul.rn.f64 \t$dst, $src0, $src1;",
- Float64Regs, Float64Regs, Float64Regs, int_nvvm_mul_rn_d>;
- def INT_NVVM_MUL_RZ_D : F_MATH_2<"mul.rz.f64 \t$dst, $src0, $src1;",
- Float64Regs, Float64Regs, Float64Regs, int_nvvm_mul_rz_d>;
- def INT_NVVM_MUL_RM_D : F_MATH_2<"mul.rm.f64 \t$dst, $src0, $src1;",
- Float64Regs, Float64Regs, Float64Regs, int_nvvm_mul_rm_d>;
- def INT_NVVM_MUL_RP_D : F_MATH_2<"mul.rp.f64 \t$dst, $src0, $src1;",
- Float64Regs, Float64Regs, Float64Regs, int_nvvm_mul_rp_d>;
- def INT_NVVM_MUL24_I : F_MATH_2<"mul24.lo.s32 \t$dst, $src0, $src1;",
- Int32Regs, Int32Regs, Int32Regs, int_nvvm_mul24_i>;
- def INT_NVVM_MUL24_UI : F_MATH_2<"mul24.lo.u32 \t$dst, $src0, $src1;",
- Int32Regs, Int32Regs, Int32Regs, int_nvvm_mul24_ui>;
- //
- // Div
- //
- def INT_NVVM_DIV_APPROX_FTZ_F
- : F_MATH_2<"div.approx.ftz.f32 \t$dst, $src0, $src1;", Float32Regs,
- Float32Regs, Float32Regs, int_nvvm_div_approx_ftz_f>;
- def INT_NVVM_DIV_APPROX_F : F_MATH_2<"div.approx.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_approx_f>;
- def INT_NVVM_DIV_RN_FTZ_F : F_MATH_2<"div.rn.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rn_ftz_f>;
- def INT_NVVM_DIV_RN_F : F_MATH_2<"div.rn.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rn_f>;
- def INT_NVVM_DIV_RZ_FTZ_F : F_MATH_2<"div.rz.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rz_ftz_f>;
- def INT_NVVM_DIV_RZ_F : F_MATH_2<"div.rz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rz_f>;
- def INT_NVVM_DIV_RM_FTZ_F : F_MATH_2<"div.rm.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rm_ftz_f>;
- def INT_NVVM_DIV_RM_F : F_MATH_2<"div.rm.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rm_f>;
- def INT_NVVM_DIV_RP_FTZ_F : F_MATH_2<"div.rp.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rp_ftz_f>;
- def INT_NVVM_DIV_RP_F : F_MATH_2<"div.rp.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_div_rp_f>;
- def INT_NVVM_DIV_RN_D : F_MATH_2<"div.rn.f64 \t$dst, $src0, $src1;",
- Float64Regs, Float64Regs, Float64Regs, int_nvvm_div_rn_d>;
- def INT_NVVM_DIV_RZ_D : F_MATH_2<"div.rz.f64 \t$dst, $src0, $src1;",
- Float64Regs, Float64Regs, Float64Regs, int_nvvm_div_rz_d>;
- def INT_NVVM_DIV_RM_D : F_MATH_2<"div.rm.f64 \t$dst, $src0, $src1;",
- Float64Regs, Float64Regs, Float64Regs, int_nvvm_div_rm_d>;
- def INT_NVVM_DIV_RP_D : F_MATH_2<"div.rp.f64 \t$dst, $src0, $src1;",
- Float64Regs, Float64Regs, Float64Regs, int_nvvm_div_rp_d>;
- //
- // Sad
- //
- def INT_NVVM_SAD_I : F_MATH_3<"sad.s32 \t$dst, $src0, $src1, $src2;",
- Int32Regs, Int32Regs, Int32Regs, Int32Regs, int_nvvm_sad_i>;
- def INT_NVVM_SAD_UI : F_MATH_3<"sad.u32 \t$dst, $src0, $src1, $src2;",
- Int32Regs, Int32Regs, Int32Regs, Int32Regs, int_nvvm_sad_ui>;
- //
- // Floor Ceil
- //
- def : Pat<(int_nvvm_floor_ftz_f Float32Regs:$a),
- (CVT_f32_f32 Float32Regs:$a, CvtRMI_FTZ)>;
- def : Pat<(int_nvvm_floor_f Float32Regs:$a),
- (CVT_f32_f32 Float32Regs:$a, CvtRMI)>;
- def : Pat<(int_nvvm_floor_d Float64Regs:$a),
- (CVT_f64_f64 Float64Regs:$a, CvtRMI)>;
- def : Pat<(int_nvvm_ceil_ftz_f Float32Regs:$a),
- (CVT_f32_f32 Float32Regs:$a, CvtRPI_FTZ)>;
- def : Pat<(int_nvvm_ceil_f Float32Regs:$a),
- (CVT_f32_f32 Float32Regs:$a, CvtRPI)>;
- def : Pat<(int_nvvm_ceil_d Float64Regs:$a),
- (CVT_f64_f64 Float64Regs:$a, CvtRPI)>;
- //
- // Abs
- //
- def INT_NVVM_FABS_FTZ_F : F_MATH_1<"abs.ftz.f32 \t$dst, $src0;", Float32Regs,
- Float32Regs, int_nvvm_fabs_ftz_f>;
- def INT_NVVM_FABS_F : F_MATH_1<"abs.f32 \t$dst, $src0;", Float32Regs,
- Float32Regs, int_nvvm_fabs_f>;
- def INT_NVVM_FABS_D : F_MATH_1<"abs.f64 \t$dst, $src0;", Float64Regs,
- Float64Regs, int_nvvm_fabs_d>;
- //
- // Round
- //
- def : Pat<(int_nvvm_round_ftz_f Float32Regs:$a),
- (CVT_f32_f32 Float32Regs:$a, CvtRNI_FTZ)>;
- def : Pat<(int_nvvm_round_f Float32Regs:$a),
- (CVT_f32_f32 Float32Regs:$a, CvtRNI)>;
- def : Pat<(int_nvvm_round_d Float64Regs:$a),
- (CVT_f64_f64 Float64Regs:$a, CvtRNI)>;
- //
- // Trunc
- //
- def : Pat<(int_nvvm_trunc_ftz_f Float32Regs:$a),
- (CVT_f32_f32 Float32Regs:$a, CvtRZI_FTZ)>;
- def : Pat<(int_nvvm_trunc_f Float32Regs:$a),
- (CVT_f32_f32 Float32Regs:$a, CvtRZI)>;
- def : Pat<(int_nvvm_trunc_d Float64Regs:$a),
- (CVT_f64_f64 Float64Regs:$a, CvtRZI)>;
- //
- // Saturate
- //
- def : Pat<(int_nvvm_saturate_ftz_f Float32Regs:$a),
- (CVT_f32_f32 Float32Regs:$a, CvtSAT_FTZ)>;
- def : Pat<(int_nvvm_saturate_f Float32Regs:$a),
- (CVT_f32_f32 Float32Regs:$a, CvtSAT)>;
- def : Pat<(int_nvvm_saturate_d Float64Regs:$a),
- (CVT_f64_f64 Float64Regs:$a, CvtSAT)>;
- //
- // Exp2 Log2
- //
- def INT_NVVM_EX2_APPROX_FTZ_F : F_MATH_1<"ex2.approx.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_ex2_approx_ftz_f>;
- def INT_NVVM_EX2_APPROX_F : F_MATH_1<"ex2.approx.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_ex2_approx_f>;
- def INT_NVVM_EX2_APPROX_D : F_MATH_1<"ex2.approx.f64 \t$dst, $src0;",
- Float64Regs, Float64Regs, int_nvvm_ex2_approx_d>;
- def INT_NVVM_LG2_APPROX_FTZ_F : F_MATH_1<"lg2.approx.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_lg2_approx_ftz_f>;
- def INT_NVVM_LG2_APPROX_F : F_MATH_1<"lg2.approx.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_lg2_approx_f>;
- def INT_NVVM_LG2_APPROX_D : F_MATH_1<"lg2.approx.f64 \t$dst, $src0;",
- Float64Regs, Float64Regs, int_nvvm_lg2_approx_d>;
- //
- // Sin Cos
- //
- def INT_NVVM_SIN_APPROX_FTZ_F : F_MATH_1<"sin.approx.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_sin_approx_ftz_f>;
- def INT_NVVM_SIN_APPROX_F : F_MATH_1<"sin.approx.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_sin_approx_f>;
- def INT_NVVM_COS_APPROX_FTZ_F : F_MATH_1<"cos.approx.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_cos_approx_ftz_f>;
- def INT_NVVM_COS_APPROX_F : F_MATH_1<"cos.approx.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_cos_approx_f>;
- //
- // Fma
- //
- def INT_NVVM_FMA_RN_FTZ_F
- : F_MATH_3<"fma.rn.ftz.f32 \t$dst, $src0, $src1, $src2;", Float32Regs,
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rn_ftz_f>;
- def INT_NVVM_FMA_RN_F : F_MATH_3<"fma.rn.f32 \t$dst, $src0, $src1, $src2;",
- Float32Regs, Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rn_f>;
- def INT_NVVM_FMA_RZ_FTZ_F
- : F_MATH_3<"fma.rz.ftz.f32 \t$dst, $src0, $src1, $src2;", Float32Regs,
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rz_ftz_f>;
- def INT_NVVM_FMA_RZ_F : F_MATH_3<"fma.rz.f32 \t$dst, $src0, $src1, $src2;",
- Float32Regs, Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rz_f>;
- def INT_NVVM_FMA_RM_FTZ_F
- : F_MATH_3<"fma.rm.ftz.f32 \t$dst, $src0, $src1, $src2;", Float32Regs,
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rm_ftz_f>;
- def INT_NVVM_FMA_RM_F : F_MATH_3<"fma.rm.f32 \t$dst, $src0, $src1, $src2;",
- Float32Regs, Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rm_f>;
- def INT_NVVM_FMA_RP_FTZ_F
- : F_MATH_3<"fma.rp.ftz.f32 \t$dst, $src0, $src1, $src2;", Float32Regs,
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rp_ftz_f>;
- def INT_NVVM_FMA_RP_F : F_MATH_3<"fma.rp.f32 \t$dst, $src0, $src1, $src2;",
- Float32Regs, Float32Regs, Float32Regs, Float32Regs, int_nvvm_fma_rp_f>;
- def INT_NVVM_FMA_RN_D : F_MATH_3<"fma.rn.f64 \t$dst, $src0, $src1, $src2;",
- Float64Regs, Float64Regs, Float64Regs, Float64Regs, int_nvvm_fma_rn_d>;
- def INT_NVVM_FMA_RZ_D : F_MATH_3<"fma.rz.f64 \t$dst, $src0, $src1, $src2;",
- Float64Regs, Float64Regs, Float64Regs, Float64Regs, int_nvvm_fma_rz_d>;
- def INT_NVVM_FMA_RM_D : F_MATH_3<"fma.rm.f64 \t$dst, $src0, $src1, $src2;",
- Float64Regs, Float64Regs, Float64Regs, Float64Regs, int_nvvm_fma_rm_d>;
- def INT_NVVM_FMA_RP_D : F_MATH_3<"fma.rp.f64 \t$dst, $src0, $src1, $src2;",
- Float64Regs, Float64Regs, Float64Regs, Float64Regs, int_nvvm_fma_rp_d>;
- //
- // Rcp
- //
- def INT_NVVM_RCP_RN_FTZ_F : F_MATH_1<"rcp.rn.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_rcp_rn_ftz_f>;
- def INT_NVVM_RCP_RN_F : F_MATH_1<"rcp.rn.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_rcp_rn_f>;
- def INT_NVVM_RCP_RZ_FTZ_F : F_MATH_1<"rcp.rz.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_rcp_rz_ftz_f>;
- def INT_NVVM_RCP_RZ_F : F_MATH_1<"rcp.rz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_rcp_rz_f>;
- def INT_NVVM_RCP_RM_FTZ_F : F_MATH_1<"rcp.rm.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_rcp_rm_ftz_f>;
- def INT_NVVM_RCP_RM_F : F_MATH_1<"rcp.rm.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_rcp_rm_f>;
- def INT_NVVM_RCP_RP_FTZ_F : F_MATH_1<"rcp.rp.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_rcp_rp_ftz_f>;
- def INT_NVVM_RCP_RP_F : F_MATH_1<"rcp.rp.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_rcp_rp_f>;
- def INT_NVVM_RCP_RN_D : F_MATH_1<"rcp.rn.f64 \t$dst, $src0;", Float64Regs,
- Float64Regs, int_nvvm_rcp_rn_d>;
- def INT_NVVM_RCP_RZ_D : F_MATH_1<"rcp.rz.f64 \t$dst, $src0;", Float64Regs,
- Float64Regs, int_nvvm_rcp_rz_d>;
- def INT_NVVM_RCP_RM_D : F_MATH_1<"rcp.rm.f64 \t$dst, $src0;", Float64Regs,
- Float64Regs, int_nvvm_rcp_rm_d>;
- def INT_NVVM_RCP_RP_D : F_MATH_1<"rcp.rp.f64 \t$dst, $src0;", Float64Regs,
- Float64Regs, int_nvvm_rcp_rp_d>;
- def INT_NVVM_RCP_APPROX_FTZ_D : F_MATH_1<"rcp.approx.ftz.f64 \t$dst, $src0;",
- Float64Regs, Float64Regs, int_nvvm_rcp_approx_ftz_d>;
- //
- // Sqrt
- //
- def INT_NVVM_SQRT_RN_FTZ_F : F_MATH_1<"sqrt.rn.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_sqrt_rn_ftz_f>;
- def INT_NVVM_SQRT_RN_F : F_MATH_1<"sqrt.rn.f32 \t$dst, $src0;", Float32Regs,
- Float32Regs, int_nvvm_sqrt_rn_f>;
- def INT_NVVM_SQRT_RZ_FTZ_F : F_MATH_1<"sqrt.rz.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_sqrt_rz_ftz_f>;
- def INT_NVVM_SQRT_RZ_F : F_MATH_1<"sqrt.rz.f32 \t$dst, $src0;", Float32Regs,
- Float32Regs, int_nvvm_sqrt_rz_f>;
- def INT_NVVM_SQRT_RM_FTZ_F : F_MATH_1<"sqrt.rm.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_sqrt_rm_ftz_f>;
- def INT_NVVM_SQRT_RM_F : F_MATH_1<"sqrt.rm.f32 \t$dst, $src0;", Float32Regs,
- Float32Regs, int_nvvm_sqrt_rm_f>;
- def INT_NVVM_SQRT_RP_FTZ_F : F_MATH_1<"sqrt.rp.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_sqrt_rp_ftz_f>;
- def INT_NVVM_SQRT_RP_F : F_MATH_1<"sqrt.rp.f32 \t$dst, $src0;", Float32Regs,
- Float32Regs, int_nvvm_sqrt_rp_f>;
- def INT_NVVM_SQRT_APPROX_FTZ_F : F_MATH_1<"sqrt.approx.ftz.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_sqrt_approx_ftz_f>;
- def INT_NVVM_SQRT_APPROX_F : F_MATH_1<"sqrt.approx.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_sqrt_approx_f>;
- def INT_NVVM_SQRT_RN_D : F_MATH_1<"sqrt.rn.f64 \t$dst, $src0;", Float64Regs,
- Float64Regs, int_nvvm_sqrt_rn_d>;
- def INT_NVVM_SQRT_RZ_D : F_MATH_1<"sqrt.rz.f64 \t$dst, $src0;", Float64Regs,
- Float64Regs, int_nvvm_sqrt_rz_d>;
- def INT_NVVM_SQRT_RM_D : F_MATH_1<"sqrt.rm.f64 \t$dst, $src0;", Float64Regs,
- Float64Regs, int_nvvm_sqrt_rm_d>;
- def INT_NVVM_SQRT_RP_D : F_MATH_1<"sqrt.rp.f64 \t$dst, $src0;", Float64Regs,
- Float64Regs, int_nvvm_sqrt_rp_d>;
- // nvvm_sqrt intrinsic
- def : Pat<(int_nvvm_sqrt_f Float32Regs:$a),
- (INT_NVVM_SQRT_RN_FTZ_F Float32Regs:$a)>, Requires<[doF32FTZ, do_SQRTF32_RN]>;
- def : Pat<(int_nvvm_sqrt_f Float32Regs:$a),
- (INT_NVVM_SQRT_RN_F Float32Regs:$a)>, Requires<[do_SQRTF32_RN]>;
- def : Pat<(int_nvvm_sqrt_f Float32Regs:$a),
- (INT_NVVM_SQRT_APPROX_FTZ_F Float32Regs:$a)>, Requires<[doF32FTZ]>;
- def : Pat<(int_nvvm_sqrt_f Float32Regs:$a),
- (INT_NVVM_SQRT_APPROX_F Float32Regs:$a)>;
- //
- // Rsqrt
- //
- def INT_NVVM_RSQRT_APPROX_FTZ_F
- : F_MATH_1<"rsqrt.approx.ftz.f32 \t$dst, $src0;", Float32Regs, Float32Regs,
- int_nvvm_rsqrt_approx_ftz_f>;
- def INT_NVVM_RSQRT_APPROX_F : F_MATH_1<"rsqrt.approx.f32 \t$dst, $src0;",
- Float32Regs, Float32Regs, int_nvvm_rsqrt_approx_f>;
- def INT_NVVM_RSQRT_APPROX_D : F_MATH_1<"rsqrt.approx.f64 \t$dst, $src0;",
- Float64Regs, Float64Regs, int_nvvm_rsqrt_approx_d>;
- //
- // Add
- //
- def INT_NVVM_ADD_RN_FTZ_F : F_MATH_2<"add.rn.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rn_ftz_f>;
- def INT_NVVM_ADD_RN_F : F_MATH_2<"add.rn.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rn_f>;
- def INT_NVVM_ADD_RZ_FTZ_F : F_MATH_2<"add.rz.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rz_ftz_f>;
- def INT_NVVM_ADD_RZ_F : F_MATH_2<"add.rz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rz_f>;
- def INT_NVVM_ADD_RM_FTZ_F : F_MATH_2<"add.rm.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rm_ftz_f>;
- def INT_NVVM_ADD_RM_F : F_MATH_2<"add.rm.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rm_f>;
- def INT_NVVM_ADD_RP_FTZ_F : F_MATH_2<"add.rp.ftz.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rp_ftz_f>;
- def INT_NVVM_ADD_RP_F : F_MATH_2<"add.rp.f32 \t$dst, $src0, $src1;",
- Float32Regs, Float32Regs, Float32Regs, int_nvvm_add_rp_f>;
- def INT_NVVM_ADD_RN_D : F_MATH_2<"add.rn.f64 \t$dst, $src0, $src1;",
- Float64Regs, Float64Regs, Float64Regs, int_nvvm_add_rn_d>;
- def INT_NVVM_ADD_RZ_D : F_MATH_2<"add.rz.f64 \t$dst, $src0, $src1;",
- Float64Regs, Float64Regs, Float64Regs, int_nvvm_add_rz_d>;
- def INT_NVVM_ADD_RM_D : F_MATH_2<"add.rm.f64 \t$dst, $src0, $src1;",
- Float64Regs, Float64Regs, Float64Regs, int_nvvm_add_rm_d>;
- def INT_NVVM_ADD_RP_D : F_MATH_2<"add.rp.f64 \t$dst, $src0, $src1;",
- Float64Regs, Float64Regs, Float64Regs, int_nvvm_add_rp_d>;
- //
- // Convert
- //
- def : Pat<(int_nvvm_d2f_rn_ftz Float64Regs:$a),
- (CVT_f32_f64 Float64Regs:$a, CvtRN_FTZ)>;
- def : Pat<(int_nvvm_d2f_rn Float64Regs:$a),
- (CVT_f32_f64 Float64Regs:$a, CvtRN)>;
- def : Pat<(int_nvvm_d2f_rz_ftz Float64Regs:$a),
- (CVT_f32_f64 Float64Regs:$a, CvtRZ_FTZ)>;
- def : Pat<(int_nvvm_d2f_rz Float64Regs:$a),
- (CVT_f32_f64 Float64Regs:$a, CvtRZ)>;
- def : Pat<(int_nvvm_d2f_rm_ftz Float64Regs:$a),
- (CVT_f32_f64 Float64Regs:$a, CvtRM_FTZ)>;
- def : Pat<(int_nvvm_d2f_rm Float64Regs:$a),
- (CVT_f32_f64 Float64Regs:$a, CvtRM)>;
- def : Pat<(int_nvvm_d2f_rp_ftz Float64Regs:$a),
- (CVT_f32_f64 Float64Regs:$a, CvtRP_FTZ)>;
- def : Pat<(int_nvvm_d2f_rp Float64Regs:$a),
- (CVT_f32_f64 Float64Regs:$a, CvtRP)>;
- def : Pat<(int_nvvm_d2i_rn Float64Regs:$a),
- (CVT_s32_f64 Float64Regs:$a, CvtRNI)>;
- def : Pat<(int_nvvm_d2i_rz Float64Regs:$a),
- (CVT_s32_f64 Float64Regs:$a, CvtRZI)>;
- def : Pat<(int_nvvm_d2i_rm Float64Regs:$a),
- (CVT_s32_f64 Float64Regs:$a, CvtRMI)>;
- def : Pat<(int_nvvm_d2i_rp Float64Regs:$a),
- (CVT_s32_f64 Float64Regs:$a, CvtRPI)>;
- def : Pat<(int_nvvm_d2ui_rn Float64Regs:$a),
- (CVT_u32_f64 Float64Regs:$a, CvtRNI)>;
- def : Pat<(int_nvvm_d2ui_rz Float64Regs:$a),
- (CVT_u32_f64 Float64Regs:$a, CvtRZI)>;
- def : Pat<(int_nvvm_d2ui_rm Float64Regs:$a),
- (CVT_u32_f64 Float64Regs:$a, CvtRMI)>;
- def : Pat<(int_nvvm_d2ui_rp Float64Regs:$a),
- (CVT_u32_f64 Float64Regs:$a, CvtRPI)>;
- def : Pat<(int_nvvm_i2d_rn Int32Regs:$a),
- (CVT_f64_s32 Int32Regs:$a, CvtRN)>;
- def : Pat<(int_nvvm_i2d_rz Int32Regs:$a),
- (CVT_f64_s32 Int32Regs:$a, CvtRZ)>;
- def : Pat<(int_nvvm_i2d_rm Int32Regs:$a),
- (CVT_f64_s32 Int32Regs:$a, CvtRM)>;
- def : Pat<(int_nvvm_i2d_rp Int32Regs:$a),
- (CVT_f64_s32 Int32Regs:$a, CvtRP)>;
- def : Pat<(int_nvvm_ui2d_rn Int32Regs:$a),
- (CVT_f64_u32 Int32Regs:$a, CvtRN)>;
- def : Pat<(int_nvvm_ui2d_rz Int32Regs:$a),
- (CVT_f64_u32 Int32Regs:$a, CvtRZ)>;
- def : Pat<(int_nvvm_ui2d_rm Int32Regs:$a),
- (CVT_f64_u32 Int32Regs:$a, CvtRM)>;
- def : Pat<(int_nvvm_ui2d_rp Int32Regs:$a),
- (CVT_f64_u32 Int32Regs:$a, CvtRP)>;
- def : Pat<(int_nvvm_f2i_rn_ftz Float32Regs:$a),
- (CVT_s32_f32 Float32Regs:$a, CvtRNI_FTZ)>;
- def : Pat<(int_nvvm_f2i_rn Float32Regs:$a),
- (CVT_s32_f32 Float32Regs:$a, CvtRNI)>;
- def : Pat<(int_nvvm_f2i_rz_ftz Float32Regs:$a),
- (CVT_s32_f32 Float32Regs:$a, CvtRZI_FTZ)>;
- def : Pat<(int_nvvm_f2i_rz Float32Regs:$a),
- (CVT_s32_f32 Float32Regs:$a, CvtRZI)>;
- def : Pat<(int_nvvm_f2i_rm_ftz Float32Regs:$a),
- (CVT_s32_f32 Float32Regs:$a, CvtRMI_FTZ)>;
- def : Pat<(int_nvvm_f2i_rm Float32Regs:$a),
- (CVT_s32_f32 Float32Regs:$a, CvtRMI)>;
- def : Pat<(int_nvvm_f2i_rp_ftz Float32Regs:$a),
- (CVT_s32_f32 Float32Regs:$a, CvtRPI_FTZ)>;
- def : Pat<(int_nvvm_f2i_rp Float32Regs:$a),
- (CVT_s32_f32 Float32Regs:$a, CvtRPI)>;
- def : Pat<(int_nvvm_f2ui_rn_ftz Float32Regs:$a),
- (CVT_u32_f32 Float32Regs:$a, CvtRNI_FTZ)>;
- def : Pat<(int_nvvm_f2ui_rn Float32Regs:$a),
- (CVT_u32_f32 Float32Regs:$a, CvtRNI)>;
- def : Pat<(int_nvvm_f2ui_rz_ftz Float32Regs:$a),
- (CVT_u32_f32 Float32Regs:$a, CvtRZI_FTZ)>;
- def : Pat<(int_nvvm_f2ui_rz Float32Regs:$a),
- (CVT_u32_f32 Float32Regs:$a, CvtRZI)>;
- def : Pat<(int_nvvm_f2ui_rm_ftz Float32Regs:$a),
- (CVT_u32_f32 Float32Regs:$a, CvtRMI_FTZ)>;
- def : Pat<(int_nvvm_f2ui_rm Float32Regs:$a),
- (CVT_u32_f32 Float32Regs:$a, CvtRMI)>;
- def : Pat<(int_nvvm_f2ui_rp_ftz Float32Regs:$a),
- (CVT_u32_f32 Float32Regs:$a, CvtRPI_FTZ)>;
- def : Pat<(int_nvvm_f2ui_rp Float32Regs:$a),
- (CVT_u32_f32 Float32Regs:$a, CvtRPI)>;
- def : Pat<(int_nvvm_i2f_rn Int32Regs:$a),
- (CVT_f32_s32 Int32Regs:$a, CvtRN)>;
- def : Pat<(int_nvvm_i2f_rz Int32Regs:$a),
- (CVT_f32_s32 Int32Regs:$a, CvtRZ)>;
- def : Pat<(int_nvvm_i2f_rm Int32Regs:$a),
- (CVT_f32_s32 Int32Regs:$a, CvtRM)>;
- def : Pat<(int_nvvm_i2f_rp Int32Regs:$a),
- (CVT_f32_s32 Int32Regs:$a, CvtRP)>;
- def : Pat<(int_nvvm_ui2f_rn Int32Regs:$a),
- (CVT_f32_u32 Int32Regs:$a, CvtRN)>;
- def : Pat<(int_nvvm_ui2f_rz Int32Regs:$a),
- (CVT_f32_u32 Int32Regs:$a, CvtRZ)>;
- def : Pat<(int_nvvm_ui2f_rm Int32Regs:$a),
- (CVT_f32_u32 Int32Regs:$a, CvtRM)>;
- def : Pat<(int_nvvm_ui2f_rp Int32Regs:$a),
- (CVT_f32_u32 Int32Regs:$a, CvtRP)>;
- def : Pat<(int_nvvm_ff2bf16x2_rn Float32Regs:$a, Float32Regs:$b),
- (CVT_bf16x2_f32 Float32Regs:$a, Float32Regs:$b, CvtRN)>;
- def : Pat<(int_nvvm_ff2bf16x2_rn_relu Float32Regs:$a, Float32Regs:$b),
- (CVT_bf16x2_f32 Float32Regs:$a, Float32Regs:$b, CvtRN_RELU)>;
- def : Pat<(int_nvvm_ff2bf16x2_rz Float32Regs:$a, Float32Regs:$b),
- (CVT_bf16x2_f32 Float32Regs:$a, Float32Regs:$b, CvtRZ)>;
- def : Pat<(int_nvvm_ff2bf16x2_rz_relu Float32Regs:$a, Float32Regs:$b),
- (CVT_bf16x2_f32 Float32Regs:$a, Float32Regs:$b, CvtRZ_RELU)>;
- def : Pat<(int_nvvm_ff2f16x2_rn Float32Regs:$a, Float32Regs:$b),
- (CVT_f16x2_f32 Float32Regs:$a, Float32Regs:$b, CvtRN)>;
- def : Pat<(int_nvvm_ff2f16x2_rn_relu Float32Regs:$a, Float32Regs:$b),
- (CVT_f16x2_f32 Float32Regs:$a, Float32Regs:$b, CvtRN_RELU)>;
- def : Pat<(int_nvvm_ff2f16x2_rz Float32Regs:$a, Float32Regs:$b),
- (CVT_f16x2_f32 Float32Regs:$a, Float32Regs:$b, CvtRZ)>;
- def : Pat<(int_nvvm_ff2f16x2_rz_relu Float32Regs:$a, Float32Regs:$b),
- (CVT_f16x2_f32 Float32Regs:$a, Float32Regs:$b, CvtRZ_RELU)>;
- def : Pat<(int_nvvm_f2bf16_rn Float32Regs:$a),
- (CVT_bf16_f32 Float32Regs:$a, CvtRN)>;
- def : Pat<(int_nvvm_f2bf16_rn_relu Float32Regs:$a),
- (CVT_bf16_f32 Float32Regs:$a, CvtRN_RELU)>;
- def : Pat<(int_nvvm_f2bf16_rz Float32Regs:$a),
- (CVT_bf16_f32 Float32Regs:$a, CvtRZ)>;
- def : Pat<(int_nvvm_f2bf16_rz_relu Float32Regs:$a),
- (CVT_bf16_f32 Float32Regs:$a, CvtRZ_RELU)>;
- def CVT_tf32_f32 :
- NVPTXInst<(outs Int32Regs:$dest), (ins Float32Regs:$a),
- "cvt.rna.tf32.f32 \t$dest, $a;",
- [(set Int32Regs:$dest, (int_nvvm_f2tf32_rna Float32Regs:$a))]>;
- def INT_NVVM_LOHI_I2D : F_MATH_2<"mov.b64 \t$dst, {{$src0, $src1}};",
- Float64Regs, Int32Regs, Int32Regs, int_nvvm_lohi_i2d>;
- def INT_NVVM_D2I_LO : F_MATH_1<
- !strconcat("{{\n\t",
- ".reg .b32 %temp; \n\t",
- "mov.b64 \t{$dst, %temp}, $src0;\n\t",
- "}}"),
- Int32Regs, Float64Regs, int_nvvm_d2i_lo>;
- def INT_NVVM_D2I_HI : F_MATH_1<
- !strconcat("{{\n\t",
- ".reg .b32 %temp; \n\t",
- "mov.b64 \t{%temp, $dst}, $src0;\n\t",
- "}}"),
- Int32Regs, Float64Regs, int_nvvm_d2i_hi>;
- def : Pat<(int_nvvm_f2ll_rn_ftz Float32Regs:$a),
- (CVT_s64_f32 Float32Regs:$a, CvtRNI_FTZ)>;
- def : Pat<(int_nvvm_f2ll_rn Float32Regs:$a),
- (CVT_s64_f32 Float32Regs:$a, CvtRNI)>;
- def : Pat<(int_nvvm_f2ll_rz_ftz Float32Regs:$a),
- (CVT_s64_f32 Float32Regs:$a, CvtRZI_FTZ)>;
- def : Pat<(int_nvvm_f2ll_rz Float32Regs:$a),
- (CVT_s64_f32 Float32Regs:$a, CvtRZI)>;
- def : Pat<(int_nvvm_f2ll_rm_ftz Float32Regs:$a),
- (CVT_s64_f32 Float32Regs:$a, CvtRMI_FTZ)>;
- def : Pat<(int_nvvm_f2ll_rm Float32Regs:$a),
- (CVT_s64_f32 Float32Regs:$a, CvtRMI)>;
- def : Pat<(int_nvvm_f2ll_rp_ftz Float32Regs:$a),
- (CVT_s64_f32 Float32Regs:$a, CvtRPI_FTZ)>;
- def : Pat<(int_nvvm_f2ll_rp Float32Regs:$a),
- (CVT_s64_f32 Float32Regs:$a, CvtRPI)>;
- def : Pat<(int_nvvm_f2ull_rn_ftz Float32Regs:$a),
- (CVT_u64_f32 Float32Regs:$a, CvtRNI_FTZ)>;
- def : Pat<(int_nvvm_f2ull_rn Float32Regs:$a),
- (CVT_u64_f32 Float32Regs:$a, CvtRNI)>;
- def : Pat<(int_nvvm_f2ull_rz_ftz Float32Regs:$a),
- (CVT_u64_f32 Float32Regs:$a, CvtRZI_FTZ)>;
- def : Pat<(int_nvvm_f2ull_rz Float32Regs:$a),
- (CVT_u64_f32 Float32Regs:$a, CvtRZI)>;
- def : Pat<(int_nvvm_f2ull_rm_ftz Float32Regs:$a),
- (CVT_u64_f32 Float32Regs:$a, CvtRMI_FTZ)>;
- def : Pat<(int_nvvm_f2ull_rm Float32Regs:$a),
- (CVT_u64_f32 Float32Regs:$a, CvtRMI)>;
- def : Pat<(int_nvvm_f2ull_rp_ftz Float32Regs:$a),
- (CVT_u64_f32 Float32Regs:$a, CvtRPI_FTZ)>;
- def : Pat<(int_nvvm_f2ull_rp Float32Regs:$a),
- (CVT_u64_f32 Float32Regs:$a, CvtRPI)>;
- def : Pat<(int_nvvm_d2ll_rn Float64Regs:$a),
- (CVT_s64_f64 Float64Regs:$a, CvtRNI)>;
- def : Pat<(int_nvvm_d2ll_rz Float64Regs:$a),
- (CVT_s64_f64 Float64Regs:$a, CvtRZI)>;
- def : Pat<(int_nvvm_d2ll_rm Float64Regs:$a),
- (CVT_s64_f64 Float64Regs:$a, CvtRMI)>;
- def : Pat<(int_nvvm_d2ll_rp Float64Regs:$a),
- (CVT_s64_f64 Float64Regs:$a, CvtRPI)>;
- def : Pat<(int_nvvm_d2ull_rn Float64Regs:$a),
- (CVT_u64_f64 Float64Regs:$a, CvtRNI)>;
- def : Pat<(int_nvvm_d2ull_rz Float64Regs:$a),
- (CVT_u64_f64 Float64Regs:$a, CvtRZI)>;
- def : Pat<(int_nvvm_d2ull_rm Float64Regs:$a),
- (CVT_u64_f64 Float64Regs:$a, CvtRMI)>;
- def : Pat<(int_nvvm_d2ull_rp Float64Regs:$a),
- (CVT_u64_f64 Float64Regs:$a, CvtRPI)>;
- def : Pat<(int_nvvm_ll2f_rn Int64Regs:$a),
- (CVT_f32_s64 Int64Regs:$a, CvtRN)>;
- def : Pat<(int_nvvm_ll2f_rz Int64Regs:$a),
- (CVT_f32_s64 Int64Regs:$a, CvtRZ)>;
- def : Pat<(int_nvvm_ll2f_rm Int64Regs:$a),
- (CVT_f32_s64 Int64Regs:$a, CvtRM)>;
- def : Pat<(int_nvvm_ll2f_rp Int64Regs:$a),
- (CVT_f32_s64 Int64Regs:$a, CvtRP)>;
- def : Pat<(int_nvvm_ull2f_rn Int64Regs:$a),
- (CVT_f32_u64 Int64Regs:$a, CvtRN)>;
- def : Pat<(int_nvvm_ull2f_rz Int64Regs:$a),
- (CVT_f32_u64 Int64Regs:$a, CvtRZ)>;
- def : Pat<(int_nvvm_ull2f_rm Int64Regs:$a),
- (CVT_f32_u64 Int64Regs:$a, CvtRM)>;
- def : Pat<(int_nvvm_ull2f_rp Int64Regs:$a),
- (CVT_f32_u64 Int64Regs:$a, CvtRP)>;
- def : Pat<(int_nvvm_ll2d_rn Int64Regs:$a),
- (CVT_f64_s64 Int64Regs:$a, CvtRN)>;
- def : Pat<(int_nvvm_ll2d_rz Int64Regs:$a),
- (CVT_f64_s64 Int64Regs:$a, CvtRZ)>;
- def : Pat<(int_nvvm_ll2d_rm Int64Regs:$a),
- (CVT_f64_s64 Int64Regs:$a, CvtRM)>;
- def : Pat<(int_nvvm_ll2d_rp Int64Regs:$a),
- (CVT_f64_s64 Int64Regs:$a, CvtRP)>;
- def : Pat<(int_nvvm_ull2d_rn Int64Regs:$a),
- (CVT_f64_u64 Int64Regs:$a, CvtRN)>;
- def : Pat<(int_nvvm_ull2d_rz Int64Regs:$a),
- (CVT_f64_u64 Int64Regs:$a, CvtRZ)>;
- def : Pat<(int_nvvm_ull2d_rm Int64Regs:$a),
- (CVT_f64_u64 Int64Regs:$a, CvtRM)>;
- def : Pat<(int_nvvm_ull2d_rp Int64Regs:$a),
- (CVT_f64_u64 Int64Regs:$a, CvtRP)>;
- def : Pat<(int_nvvm_f2h_rn_ftz Float32Regs:$a),
- (BITCONVERT_16_F2I (CVT_f16_f32 Float32Regs:$a, CvtRN_FTZ))>;
- def : Pat<(int_nvvm_f2h_rn Float32Regs:$a),
- (BITCONVERT_16_F2I (CVT_f16_f32 Float32Regs:$a, CvtRN))>;
- //
- // Bitcast
- //
- def INT_NVVM_BITCAST_F2I : F_MATH_1<"mov.b32 \t$dst, $src0;", Int32Regs,
- Float32Regs, int_nvvm_bitcast_f2i>;
- def INT_NVVM_BITCAST_I2F : F_MATH_1<"mov.b32 \t$dst, $src0;", Float32Regs,
- Int32Regs, int_nvvm_bitcast_i2f>;
- def INT_NVVM_BITCAST_LL2D : F_MATH_1<"mov.b64 \t$dst, $src0;", Float64Regs,
- Int64Regs, int_nvvm_bitcast_ll2d>;
- def INT_NVVM_BITCAST_D2LL : F_MATH_1<"mov.b64 \t$dst, $src0;", Int64Regs,
- Float64Regs, int_nvvm_bitcast_d2ll>;
- //
- // FNS
- //
- class INT_FNS_MBO<dag ins, dag Operands>
- : NVPTXInst<(outs Int32Regs:$dst), ins,
- "fns.b32 \t$dst, $mask, $base, $offset;",
- [(set Int32Regs:$dst, Operands )]>,
- Requires<[hasPTX60, hasSM30]>;
- def INT_FNS_rrr : INT_FNS_MBO<(ins Int32Regs:$mask, Int32Regs:$base, Int32Regs:$offset),
- (int_nvvm_fns Int32Regs:$mask, Int32Regs:$base, Int32Regs:$offset)>;
- def INT_FNS_rri : INT_FNS_MBO<(ins Int32Regs:$mask, Int32Regs:$base, i32imm:$offset),
- (int_nvvm_fns Int32Regs:$mask, Int32Regs:$base, imm:$offset)>;
- def INT_FNS_rir : INT_FNS_MBO<(ins Int32Regs:$mask, i32imm:$base, Int32Regs:$offset),
- (int_nvvm_fns Int32Regs:$mask, imm:$base, Int32Regs:$offset)>;
- def INT_FNS_rii : INT_FNS_MBO<(ins Int32Regs:$mask, i32imm:$base, i32imm:$offset),
- (int_nvvm_fns Int32Regs:$mask, imm:$base, imm:$offset)>;
- def INT_FNS_irr : INT_FNS_MBO<(ins i32imm:$mask, Int32Regs:$base, Int32Regs:$offset),
- (int_nvvm_fns imm:$mask, Int32Regs:$base, Int32Regs:$offset)>;
- def INT_FNS_iri : INT_FNS_MBO<(ins i32imm:$mask, Int32Regs:$base, i32imm:$offset),
- (int_nvvm_fns imm:$mask, Int32Regs:$base, imm:$offset)>;
- def INT_FNS_iir : INT_FNS_MBO<(ins i32imm:$mask, i32imm:$base, Int32Regs:$offset),
- (int_nvvm_fns imm:$mask, imm:$base, Int32Regs:$offset)>;
- def INT_FNS_iii : INT_FNS_MBO<(ins i32imm:$mask, i32imm:$base, i32imm:$offset),
- (int_nvvm_fns imm:$mask, imm:$base, imm:$offset)>;
- //-----------------------------------
- // Atomic Functions
- //-----------------------------------
- class ATOMIC_GLOBAL_CHK <dag ops, dag frag>
- : PatFrag<ops, frag, AS_match.global>;
- class ATOMIC_SHARED_CHK <dag ops, dag frag>
- : PatFrag<ops, frag, AS_match.shared>;
- class ATOMIC_GENERIC_CHK <dag ops, dag frag>
- : PatFrag<ops, frag, AS_match.generic>;
- multiclass F_ATOMIC_2_imp<NVPTXRegClass ptrclass, NVPTXRegClass regclass,
- string SpaceStr, string TypeStr, string OpcStr, PatFrag IntOp,
- Operand IMMType, SDNode IMM, list<Predicate> Pred> {
- def reg : NVPTXInst<(outs regclass:$dst), (ins ptrclass:$addr, regclass:$b),
- !strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b;"),
- [(set regclass:$dst, (IntOp ptrclass:$addr, regclass:$b))]>,
- Requires<Pred>;
- def imm : NVPTXInst<(outs regclass:$dst), (ins ptrclass:$addr, IMMType:$b),
- !strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b;", ""),
- [(set regclass:$dst, (IntOp ptrclass:$addr, IMM:$b))]>,
- Requires<Pred>;
- }
- multiclass F_ATOMIC_2<NVPTXRegClass regclass, string SpaceStr, string TypeStr,
- string OpcStr, PatFrag IntOp, Operand IMMType, SDNode IMM,
- list<Predicate> Pred = []> {
- defm p32 : F_ATOMIC_2_imp<Int32Regs, regclass, SpaceStr, TypeStr, OpcStr,
- IntOp, IMMType, IMM, Pred>;
- defm p64 : F_ATOMIC_2_imp<Int64Regs, regclass, SpaceStr, TypeStr, OpcStr,
- IntOp, IMMType, IMM, Pred>;
- }
- // has 2 operands, neg the second one
- multiclass F_ATOMIC_2_NEG_imp<NVPTXRegClass ptrclass, NVPTXRegClass regclass,
- string SpaceStr, string TypeStr, string OpcStr, PatFrag IntOp,
- list<Predicate> Pred> {
- def reg : NVPTXInst<(outs regclass:$dst), (ins ptrclass:$addr, regclass:$b),
- !strconcat(
- "{{ \n\t",
- ".reg \t.s", TypeStr, " temp; \n\t",
- "neg.s", TypeStr, " \ttemp, $b; \n\t",
- "atom", SpaceStr, OpcStr, ".u", TypeStr, " \t$dst, [$addr], temp; \n\t",
- "}}"),
- [(set regclass:$dst, (IntOp ptrclass:$addr, regclass:$b))]>,
- Requires<Pred>;
- }
- multiclass F_ATOMIC_2_NEG<NVPTXRegClass regclass, string SpaceStr,
- string TypeStr, string OpcStr, PatFrag IntOp, list<Predicate> Pred = []> {
- defm p32: F_ATOMIC_2_NEG_imp<Int32Regs, regclass, SpaceStr, TypeStr, OpcStr,
- IntOp, Pred> ;
- defm p64: F_ATOMIC_2_NEG_imp<Int64Regs, regclass, SpaceStr, TypeStr, OpcStr,
- IntOp, Pred> ;
- }
- // has 3 operands
- multiclass F_ATOMIC_3_imp<NVPTXRegClass ptrclass, NVPTXRegClass regclass,
- string SpaceStr, string TypeStr, string OpcStr, PatFrag IntOp,
- Operand IMMType, list<Predicate> Pred> {
- def reg : NVPTXInst<(outs regclass:$dst),
- (ins ptrclass:$addr, regclass:$b, regclass:$c),
- !strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b, $c;"),
- [(set regclass:$dst, (IntOp ptrclass:$addr, regclass:$b, regclass:$c))]>,
- Requires<Pred>;
- def imm1 : NVPTXInst<(outs regclass:$dst),
- (ins ptrclass:$addr, IMMType:$b, regclass:$c),
- !strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b, $c;"),
- [(set regclass:$dst, (IntOp ptrclass:$addr, imm:$b, regclass:$c))]>,
- Requires<Pred>;
- def imm2 : NVPTXInst<(outs regclass:$dst),
- (ins ptrclass:$addr, regclass:$b, IMMType:$c),
- !strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b, $c;", ""),
- [(set regclass:$dst, (IntOp ptrclass:$addr, regclass:$b, imm:$c))]>,
- Requires<Pred>;
- def imm3 : NVPTXInst<(outs regclass:$dst),
- (ins ptrclass:$addr, IMMType:$b, IMMType:$c),
- !strconcat("atom", SpaceStr, OpcStr, TypeStr, " \t$dst, [$addr], $b, $c;"),
- [(set regclass:$dst, (IntOp ptrclass:$addr, imm:$b, imm:$c))]>,
- Requires<Pred>;
- }
- multiclass F_ATOMIC_3<NVPTXRegClass regclass, string SpaceStr, string TypeStr,
- string OpcStr, PatFrag IntOp, Operand IMMType, list<Predicate> Pred = []> {
- defm p32 : F_ATOMIC_3_imp<Int32Regs, regclass, SpaceStr, TypeStr, OpcStr,
- IntOp, IMMType, Pred>;
- defm p64 : F_ATOMIC_3_imp<Int64Regs, regclass, SpaceStr, TypeStr, OpcStr,
- IntOp, IMMType, Pred>;
- }
- // atom_add
- def atomic_load_add_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_add_32 node:$a, node:$b)>;
- def atomic_load_add_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_add_32 node:$a, node:$b)>;
- def atomic_load_add_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_add_32 node:$a, node:$b)>;
- def atomic_load_add_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_add_64 node:$a, node:$b)>;
- def atomic_load_add_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_add_64 node:$a, node:$b)>;
- def atomic_load_add_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_add_64 node:$a, node:$b)>;
- def atomic_load_add_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_fadd node:$a, node:$b)>;
- def atomic_load_add_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_fadd node:$a, node:$b)>;
- def atomic_load_add_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_fadd node:$a, node:$b)>;
- defm INT_PTX_ATOM_ADD_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32", ".add",
- atomic_load_add_32_g, i32imm, imm>;
- defm INT_PTX_ATOM_ADD_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".u32", ".add",
- atomic_load_add_32_s, i32imm, imm>;
- defm INT_PTX_ATOM_ADD_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".u32", ".add",
- atomic_load_add_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_ADD_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".u32",
- ".add", atomic_load_add_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_ADD_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".u64", ".add",
- atomic_load_add_64_g, i64imm, imm>;
- defm INT_PTX_ATOM_ADD_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".u64", ".add",
- atomic_load_add_64_s, i64imm, imm>;
- defm INT_PTX_ATOM_ADD_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".u64", ".add",
- atomic_load_add_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_ADD_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global", ".u64",
- ".add", atomic_load_add_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_ADD_G_F32 : F_ATOMIC_2<Float32Regs, ".global", ".f32", ".add",
- atomic_load_add_g, f32imm, fpimm>;
- defm INT_PTX_ATOM_ADD_S_F32 : F_ATOMIC_2<Float32Regs, ".shared", ".f32", ".add",
- atomic_load_add_s, f32imm, fpimm>;
- defm INT_PTX_ATOM_ADD_GEN_F32 : F_ATOMIC_2<Float32Regs, "", ".f32", ".add",
- atomic_load_add_gen, f32imm, fpimm>;
- defm INT_PTX_ATOM_ADD_G_F64 : F_ATOMIC_2<Float64Regs, ".global", ".f64", ".add",
- atomic_load_add_g, f64imm, fpimm, [hasAtomAddF64]>;
- defm INT_PTX_ATOM_ADD_S_F64 : F_ATOMIC_2<Float64Regs, ".shared", ".f64", ".add",
- atomic_load_add_s, f64imm, fpimm, [hasAtomAddF64]>;
- defm INT_PTX_ATOM_ADD_GEN_F64 : F_ATOMIC_2<Float64Regs, "", ".f64", ".add",
- atomic_load_add_gen, f64imm, fpimm, [hasAtomAddF64]>;
- // atom_sub
- def atomic_load_sub_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_sub_32 node:$a, node:$b)>;
- def atomic_load_sub_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_sub_32 node:$a, node:$b)>;
- def atomic_load_sub_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_sub_32 node:$a, node:$b)>;
- def atomic_load_sub_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_sub_64 node:$a, node:$b)>;
- def atomic_load_sub_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_sub_64 node:$a, node:$b)>;
- def atomic_load_sub_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_sub_64 node:$a, node:$b)>;
- defm INT_PTX_ATOM_SUB_G_32 : F_ATOMIC_2_NEG<Int32Regs, ".global", "32", ".add",
- atomic_load_sub_32_g>;
- defm INT_PTX_ATOM_SUB_G_64 : F_ATOMIC_2_NEG<Int64Regs, ".global", "64", ".add",
- atomic_load_sub_64_g>;
- defm INT_PTX_ATOM_SUB_GEN_32 : F_ATOMIC_2_NEG<Int32Regs, "", "32", ".add",
- atomic_load_sub_32_gen>;
- defm INT_PTX_ATOM_SUB_GEN_32_USE_G : F_ATOMIC_2_NEG<Int32Regs, ".global", "32",
- ".add", atomic_load_sub_32_gen>;
- defm INT_PTX_ATOM_SUB_S_32 : F_ATOMIC_2_NEG<Int32Regs, ".shared", "32", ".add",
- atomic_load_sub_32_s>;
- defm INT_PTX_ATOM_SUB_S_64 : F_ATOMIC_2_NEG<Int64Regs, ".shared", "64", ".add",
- atomic_load_sub_64_s>;
- defm INT_PTX_ATOM_SUB_GEN_64 : F_ATOMIC_2_NEG<Int64Regs, "", "64", ".add",
- atomic_load_sub_64_gen>;
- defm INT_PTX_ATOM_SUB_GEN_64_USE_G : F_ATOMIC_2_NEG<Int64Regs, ".global", "64",
- ".add", atomic_load_sub_64_gen>;
- // atom_swap
- def atomic_swap_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_swap_32 node:$a, node:$b)>;
- def atomic_swap_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_swap_32 node:$a, node:$b)>;
- def atomic_swap_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_swap_32 node:$a, node:$b)>;
- def atomic_swap_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_swap_64 node:$a, node:$b)>;
- def atomic_swap_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_swap_64 node:$a, node:$b)>;
- def atomic_swap_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_swap_64 node:$a, node:$b)>;
- defm INT_PTX_ATOM_SWAP_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".b32", ".exch",
- atomic_swap_32_g, i32imm, imm>;
- defm INT_PTX_ATOM_SWAP_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".b32", ".exch",
- atomic_swap_32_s, i32imm, imm>;
- defm INT_PTX_ATOM_SWAP_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".b32", ".exch",
- atomic_swap_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_SWAP_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".b32",
- ".exch", atomic_swap_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_SWAP_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".b64", ".exch",
- atomic_swap_64_g, i64imm, imm>;
- defm INT_PTX_ATOM_SWAP_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".b64", ".exch",
- atomic_swap_64_s, i64imm, imm>;
- defm INT_PTX_ATOM_SWAP_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".b64", ".exch",
- atomic_swap_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_SWAP_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global", ".b64",
- ".exch", atomic_swap_64_gen, i64imm, imm>;
- // atom_max
- def atomic_load_max_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b)
- , (atomic_load_max_32 node:$a, node:$b)>;
- def atomic_load_max_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_max_32 node:$a, node:$b)>;
- def atomic_load_max_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_max_32 node:$a, node:$b)>;
- def atomic_load_max_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b)
- , (atomic_load_max_64 node:$a, node:$b)>;
- def atomic_load_max_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_max_64 node:$a, node:$b)>;
- def atomic_load_max_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_max_64 node:$a, node:$b)>;
- def atomic_load_umax_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_umax_32 node:$a, node:$b)>;
- def atomic_load_umax_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_umax_32 node:$a, node:$b)>;
- def atomic_load_umax_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_umax_32 node:$a, node:$b)>;
- def atomic_load_umax_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_umax_64 node:$a, node:$b)>;
- def atomic_load_umax_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_umax_64 node:$a, node:$b)>;
- def atomic_load_umax_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_umax_64 node:$a, node:$b)>;
- defm INT_PTX_ATOM_LOAD_MAX_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".s32",
- ".max", atomic_load_max_32_g, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_MAX_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".s32",
- ".max", atomic_load_max_32_s, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_MAX_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".s32", ".max",
- atomic_load_max_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_MAX_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global",
- ".s32", ".max", atomic_load_max_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_MAX_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".s64",
- ".max", atomic_load_max_64_g, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_MAX_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".s64",
- ".max", atomic_load_max_64_s, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_MAX_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".s64", ".max",
- atomic_load_max_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_MAX_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global",
- ".s64", ".max", atomic_load_max_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMAX_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32",
- ".max", atomic_load_umax_32_g, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMAX_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".u32",
- ".max", atomic_load_umax_32_s, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMAX_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".u32", ".max",
- atomic_load_umax_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMAX_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global",
- ".u32", ".max", atomic_load_umax_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMAX_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".u64",
- ".max", atomic_load_umax_64_g, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMAX_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".u64",
- ".max", atomic_load_umax_64_s, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMAX_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".u64", ".max",
- atomic_load_umax_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMAX_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global",
- ".u64", ".max", atomic_load_umax_64_gen, i64imm, imm>;
- // atom_min
- def atomic_load_min_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_min_32 node:$a, node:$b)>;
- def atomic_load_min_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_min_32 node:$a, node:$b)>;
- def atomic_load_min_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_min_32 node:$a, node:$b)>;
- def atomic_load_min_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_min_64 node:$a, node:$b)>;
- def atomic_load_min_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_min_64 node:$a, node:$b)>;
- def atomic_load_min_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_min_64 node:$a, node:$b)>;
- def atomic_load_umin_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_umin_32 node:$a, node:$b)>;
- def atomic_load_umin_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_umin_32 node:$a, node:$b)>;
- def atomic_load_umin_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_umin_32 node:$a, node:$b)>;
- def atomic_load_umin_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_umin_64 node:$a, node:$b)>;
- def atomic_load_umin_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_umin_64 node:$a, node:$b)>;
- def atomic_load_umin_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_umin_64 node:$a, node:$b)>;
- defm INT_PTX_ATOM_LOAD_MIN_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".s32",
- ".min", atomic_load_min_32_g, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_MIN_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".s32",
- ".min", atomic_load_min_32_s, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_MIN_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".s32", ".min",
- atomic_load_min_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_MIN_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global",
- ".s32", ".min", atomic_load_min_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_MIN_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".s64",
- ".min", atomic_load_min_64_g, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_MIN_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".s64",
- ".min", atomic_load_min_64_s, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_MIN_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".s64", ".min",
- atomic_load_min_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_MIN_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global",
- ".s64", ".min", atomic_load_min_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMIN_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32",
- ".min", atomic_load_umin_32_g, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMIN_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".u32",
- ".min", atomic_load_umin_32_s, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMIN_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".u32", ".min",
- atomic_load_umin_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMIN_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global",
- ".u32", ".min", atomic_load_umin_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMIN_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".u64",
- ".min", atomic_load_umin_64_g, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMIN_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".u64",
- ".min", atomic_load_umin_64_s, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMIN_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".u64", ".min",
- atomic_load_umin_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_LOAD_UMIN_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global",
- ".u64", ".min", atomic_load_umin_64_gen, i64imm, imm>;
- // atom_inc atom_dec
- def atomic_load_inc_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (int_nvvm_atomic_load_inc_32 node:$a, node:$b)>;
- def atomic_load_inc_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (int_nvvm_atomic_load_inc_32 node:$a, node:$b)>;
- def atomic_load_inc_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (int_nvvm_atomic_load_inc_32 node:$a, node:$b)>;
- def atomic_load_dec_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (int_nvvm_atomic_load_dec_32 node:$a, node:$b)>;
- def atomic_load_dec_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (int_nvvm_atomic_load_dec_32 node:$a, node:$b)>;
- def atomic_load_dec_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (int_nvvm_atomic_load_dec_32 node:$a, node:$b)>;
- defm INT_PTX_ATOM_INC_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32", ".inc",
- atomic_load_inc_32_g, i32imm, imm>;
- defm INT_PTX_ATOM_INC_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".u32", ".inc",
- atomic_load_inc_32_s, i32imm, imm>;
- defm INT_PTX_ATOM_INC_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".u32", ".inc",
- atomic_load_inc_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_INC_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".u32",
- ".inc", atomic_load_inc_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_DEC_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32", ".dec",
- atomic_load_dec_32_g, i32imm, imm>;
- defm INT_PTX_ATOM_DEC_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".u32", ".dec",
- atomic_load_dec_32_s, i32imm, imm>;
- defm INT_PTX_ATOM_DEC_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".u32", ".dec",
- atomic_load_dec_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_DEC_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".u32",
- ".dec", atomic_load_dec_32_gen, i32imm, imm>;
- // atom_and
- def atomic_load_and_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_and_32 node:$a, node:$b)>;
- def atomic_load_and_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_and_32 node:$a, node:$b)>;
- def atomic_load_and_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_and_32 node:$a, node:$b)>;
- def atomic_load_and_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_and_64 node:$a, node:$b)>;
- def atomic_load_and_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_and_64 node:$a, node:$b)>;
- def atomic_load_and_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_and_64 node:$a, node:$b)>;
- defm INT_PTX_ATOM_AND_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".b32", ".and",
- atomic_load_and_32_g, i32imm, imm>;
- defm INT_PTX_ATOM_AND_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".b32", ".and",
- atomic_load_and_32_s, i32imm, imm>;
- defm INT_PTX_ATOM_AND_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".b32", ".and",
- atomic_load_and_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_AND_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".b32",
- ".and", atomic_load_and_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_AND_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".b64", ".and",
- atomic_load_and_64_g, i64imm, imm>;
- defm INT_PTX_ATOM_AND_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".b64", ".and",
- atomic_load_and_64_s, i64imm, imm>;
- defm INT_PTX_ATOM_AND_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".b64", ".and",
- atomic_load_and_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_AND_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global", ".b64",
- ".and", atomic_load_and_64_gen, i64imm, imm>;
- // atom_or
- def atomic_load_or_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_or_32 node:$a, node:$b)>;
- def atomic_load_or_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_or_32 node:$a, node:$b)>;
- def atomic_load_or_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_or_32 node:$a, node:$b)>;
- def atomic_load_or_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_or_64 node:$a, node:$b)>;
- def atomic_load_or_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_or_64 node:$a, node:$b)>;
- def atomic_load_or_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_or_64 node:$a, node:$b)>;
- defm INT_PTX_ATOM_OR_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".b32", ".or",
- atomic_load_or_32_g, i32imm, imm>;
- defm INT_PTX_ATOM_OR_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".b32", ".or",
- atomic_load_or_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_OR_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".b32",
- ".or", atomic_load_or_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_OR_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".b32", ".or",
- atomic_load_or_32_s, i32imm, imm>;
- defm INT_PTX_ATOM_OR_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".b64", ".or",
- atomic_load_or_64_g, i64imm, imm>;
- defm INT_PTX_ATOM_OR_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".b64", ".or",
- atomic_load_or_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_OR_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global", ".b64",
- ".or", atomic_load_or_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_OR_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".b64", ".or",
- atomic_load_or_64_s, i64imm, imm>;
- // atom_xor
- def atomic_load_xor_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_xor_32 node:$a, node:$b)>;
- def atomic_load_xor_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_xor_32 node:$a, node:$b)>;
- def atomic_load_xor_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_xor_32 node:$a, node:$b)>;
- def atomic_load_xor_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b),
- (atomic_load_xor_64 node:$a, node:$b)>;
- def atomic_load_xor_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b),
- (atomic_load_xor_64 node:$a, node:$b)>;
- def atomic_load_xor_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b),
- (atomic_load_xor_64 node:$a, node:$b)>;
- defm INT_PTX_ATOM_XOR_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".b32", ".xor",
- atomic_load_xor_32_g, i32imm, imm>;
- defm INT_PTX_ATOM_XOR_S_32 : F_ATOMIC_2<Int32Regs, ".shared", ".b32", ".xor",
- atomic_load_xor_32_s, i32imm, imm>;
- defm INT_PTX_ATOM_XOR_GEN_32 : F_ATOMIC_2<Int32Regs, "", ".b32", ".xor",
- atomic_load_xor_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_XOR_GEN_32_USE_G : F_ATOMIC_2<Int32Regs, ".global", ".b32",
- ".xor", atomic_load_xor_32_gen, i32imm, imm>;
- defm INT_PTX_ATOM_XOR_G_64 : F_ATOMIC_2<Int64Regs, ".global", ".b64", ".xor",
- atomic_load_xor_64_g, i64imm, imm>;
- defm INT_PTX_ATOM_XOR_S_64 : F_ATOMIC_2<Int64Regs, ".shared", ".b64", ".xor",
- atomic_load_xor_64_s, i64imm, imm>;
- defm INT_PTX_ATOM_XOR_GEN_64 : F_ATOMIC_2<Int64Regs, "", ".b64", ".xor",
- atomic_load_xor_64_gen, i64imm, imm>;
- defm INT_PTX_ATOM_XOR_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global", ".b64",
- ".xor", atomic_load_xor_64_gen, i64imm, imm>;
- // atom_cas
- def atomic_cmp_swap_32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b, node:$c),
- (atomic_cmp_swap_32 node:$a, node:$b, node:$c)>;
- def atomic_cmp_swap_32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b, node:$c),
- (atomic_cmp_swap_32 node:$a, node:$b, node:$c)>;
- def atomic_cmp_swap_32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b, node:$c),
- (atomic_cmp_swap_32 node:$a, node:$b, node:$c)>;
- def atomic_cmp_swap_64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b, node:$c),
- (atomic_cmp_swap_64 node:$a, node:$b, node:$c)>;
- def atomic_cmp_swap_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b, node:$c),
- (atomic_cmp_swap_64 node:$a, node:$b, node:$c)>;
- def atomic_cmp_swap_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b, node:$c),
- (atomic_cmp_swap_64 node:$a, node:$b, node:$c)>;
- defm INT_PTX_ATOM_CAS_G_32 : F_ATOMIC_3<Int32Regs, ".global", ".b32", ".cas",
- atomic_cmp_swap_32_g, i32imm>;
- defm INT_PTX_ATOM_CAS_S_32 : F_ATOMIC_3<Int32Regs, ".shared", ".b32", ".cas",
- atomic_cmp_swap_32_s, i32imm>;
- defm INT_PTX_ATOM_CAS_GEN_32 : F_ATOMIC_3<Int32Regs, "", ".b32", ".cas",
- atomic_cmp_swap_32_gen, i32imm>;
- defm INT_PTX_ATOM_CAS_GEN_32_USE_G : F_ATOMIC_3<Int32Regs, ".global", ".b32",
- ".cas", atomic_cmp_swap_32_gen, i32imm>;
- defm INT_PTX_ATOM_CAS_G_64 : F_ATOMIC_3<Int64Regs, ".global", ".b64", ".cas",
- atomic_cmp_swap_64_g, i64imm>;
- defm INT_PTX_ATOM_CAS_S_64 : F_ATOMIC_3<Int64Regs, ".shared", ".b64", ".cas",
- atomic_cmp_swap_64_s, i64imm>;
- defm INT_PTX_ATOM_CAS_GEN_64 : F_ATOMIC_3<Int64Regs, "", ".b64", ".cas",
- atomic_cmp_swap_64_gen, i64imm>;
- defm INT_PTX_ATOM_CAS_GEN_64_USE_G : F_ATOMIC_3<Int64Regs, ".global", ".b64",
- ".cas", atomic_cmp_swap_64_gen, i64imm>;
- // Support for scoped atomic operations. Matches
- // int_nvvm_atomic_{op}_{space}_{type}_{scope}
- // and converts it into the appropriate instruction.
- // NOTE: not all possible combinations are implemented
- // 'space' is limited to generic as it's the only one needed to support CUDA.
- // 'scope' = 'gpu' is default and is handled by regular atomic instructions.
- class ATOM23_impl<string AsmStr, NVPTXRegClass regclass, list<Predicate> Preds,
- dag ins, dag Operands>
- : NVPTXInst<(outs regclass:$result), ins,
- AsmStr,
- [(set regclass:$result, Operands)]>,
- Requires<Preds>;
- // Define instruction variants for all addressing modes.
- multiclass ATOM2P_impl<string AsmStr, Intrinsic Intr,
- NVPTXRegClass regclass, Operand ImmType,
- SDNode Imm, ValueType ImmTy,
- list<Predicate> Preds> {
- let AddedComplexity = 1 in {
- def : ATOM23_impl<AsmStr, regclass, Preds,
- (ins Int32Regs:$src, regclass:$b),
- (Intr Int32Regs:$src, regclass:$b)>;
- def : ATOM23_impl<AsmStr, regclass, Preds,
- (ins Int64Regs:$src, regclass:$b),
- (Intr Int64Regs:$src, regclass:$b)>;
- }
- // tablegen can't infer argument types from Intrinsic (though it can
- // from Instruction) so we have to enforce specific type on
- // immediates via explicit cast to ImmTy.
- def : ATOM23_impl<AsmStr, regclass, Preds,
- (ins Int32Regs:$src, ImmType:$b),
- (Intr Int32Regs:$src, (ImmTy Imm:$b))>;
- def : ATOM23_impl<AsmStr, regclass, Preds,
- (ins Int64Regs:$src, ImmType:$b),
- (Intr Int64Regs:$src, (ImmTy Imm:$b))>;
- }
- multiclass ATOM3P_impl<string AsmStr, Intrinsic Intr,
- NVPTXRegClass regclass, Operand ImmType,
- SDNode Imm, ValueType ImmTy,
- list<Predicate> Preds> {
- // Variants for register/immediate permutations of $b and $c
- let AddedComplexity = 2 in {
- def : ATOM23_impl<AsmStr, regclass, Preds,
- (ins Int32Regs:$src, regclass:$b, regclass:$c),
- (Intr Int32Regs:$src, regclass:$b, regclass:$c)>;
- def : ATOM23_impl<AsmStr, regclass, Preds,
- (ins Int64Regs:$src, regclass:$b, regclass:$c),
- (Intr Int64Regs:$src, regclass:$b, regclass:$c)>;
- }
- let AddedComplexity = 1 in {
- def : ATOM23_impl<AsmStr, regclass, Preds,
- (ins Int32Regs:$src, ImmType:$b, regclass:$c),
- (Intr Int32Regs:$src, (ImmTy Imm:$b), regclass:$c)>;
- def : ATOM23_impl<AsmStr, regclass, Preds,
- (ins Int64Regs:$src, ImmType:$b, regclass:$c),
- (Intr Int64Regs:$src, (ImmTy Imm:$b), regclass:$c)>;
- def : ATOM23_impl<AsmStr, regclass, Preds,
- (ins Int32Regs:$src, regclass:$b, ImmType:$c),
- (Intr Int32Regs:$src, regclass:$b, (ImmTy Imm:$c))>;
- def : ATOM23_impl<AsmStr, regclass, Preds,
- (ins Int64Regs:$src, regclass:$b, ImmType:$c),
- (Intr Int64Regs:$src, regclass:$b, (ImmTy Imm:$c))>;
- }
- def : ATOM23_impl<AsmStr, regclass, Preds,
- (ins Int32Regs:$src, ImmType:$b, ImmType:$c),
- (Intr Int32Regs:$src, (ImmTy Imm:$b), (ImmTy Imm:$c))>;
- def : ATOM23_impl<AsmStr, regclass, Preds,
- (ins Int64Regs:$src, ImmType:$b, ImmType:$c),
- (Intr Int64Regs:$src, (ImmTy Imm:$b), (ImmTy Imm:$c))>;
- }
- // Constructs instrinsic name and instruction asm strings.
- multiclass ATOM2N_impl<string OpStr, string IntTypeStr, string TypeStr,
- string ScopeStr, string SpaceStr,
- NVPTXRegClass regclass, Operand ImmType, SDNode Imm,
- ValueType ImmTy, list<Predicate> Preds> {
- defm : ATOM2P_impl<"atom" # !if(!eq(SpaceStr, "gen"), "", "." # SpaceStr)
- # !if(!eq(ScopeStr, "gpu"), "", "." # ScopeStr)
- # "." # OpStr # "." # TypeStr
- # " \t$result, [$src], $b;",
- !cast<Intrinsic>(
- "int_nvvm_atomic_" # OpStr
- # "_" # SpaceStr # "_" # IntTypeStr
- # !if(!empty(ScopeStr), "", "_" # ScopeStr)),
- regclass, ImmType, Imm, ImmTy, Preds>;
- }
- multiclass ATOM3N_impl<string OpStr, string IntTypeStr, string TypeStr,
- string ScopeStr, string SpaceStr,
- NVPTXRegClass regclass, Operand ImmType, SDNode Imm,
- ValueType ImmTy, list<Predicate> Preds> {
- defm : ATOM3P_impl<"atom" # !if(!eq(SpaceStr, "gen"), "", "." # SpaceStr)
- # !if(!eq(ScopeStr, "gpu"), "", "." # ScopeStr)
- # "." # OpStr # "." # TypeStr
- # " \t$result, [$src], $b, $c;",
- !cast<Intrinsic>(
- "int_nvvm_atomic_" # OpStr
- # "_" # SpaceStr # "_" # IntTypeStr
- # !if(!empty(ScopeStr), "", "_" # ScopeStr)),
- regclass, ImmType, Imm, ImmTy, Preds>;
- }
- // Constructs variants for different address spaces.
- // For now we only need variants for generic space pointers.
- multiclass ATOM2A_impl<string OpStr, string IntTypeStr, string TypeStr,
- string ScopeStr, NVPTXRegClass regclass, Operand ImmType,
- SDNode Imm, ValueType ImmTy, list<Predicate> Preds> {
- defm _gen_ : ATOM2N_impl<OpStr, IntTypeStr, TypeStr, ScopeStr, "gen",
- regclass, ImmType, Imm, ImmTy, Preds>;
- }
- multiclass ATOM3A_impl<string OpStr, string IntTypeStr, string TypeStr,
- string ScopeStr, NVPTXRegClass regclass, Operand ImmType,
- SDNode Imm, ValueType ImmTy, list<Predicate> Preds> {
- defm _gen_ : ATOM3N_impl<OpStr, IntTypeStr, TypeStr, ScopeStr, "gen",
- regclass, ImmType, Imm, ImmTy, Preds>;
- }
- // Constructs variants for different scopes of atomic op.
- multiclass ATOM2S_impl<string OpStr, string IntTypeStr, string TypeStr,
- NVPTXRegClass regclass, Operand ImmType, SDNode Imm,
- ValueType ImmTy, list<Predicate> Preds> {
- // .gpu scope is default and is currently covered by existing
- // atomics w/o explicitly specified scope.
- defm _cta : ATOM2A_impl<OpStr, IntTypeStr, TypeStr, "cta",
- regclass, ImmType, Imm, ImmTy,
- !listconcat(Preds,[hasAtomScope])>;
- defm _sys : ATOM2A_impl<OpStr, IntTypeStr, TypeStr, "sys",
- regclass, ImmType, Imm, ImmTy,
- !listconcat(Preds,[hasAtomScope])>;
- }
- multiclass ATOM3S_impl<string OpStr, string IntTypeStr, string TypeStr,
- NVPTXRegClass regclass, Operand ImmType, SDNode Imm, ValueType ImmTy,
- list<Predicate> Preds> {
- // No need to define ".gpu"-scoped atomics. They do the same thing
- // as the regular, non-scoped atomics defined elsewhere.
- defm _cta : ATOM3A_impl<OpStr, IntTypeStr, TypeStr, "cta",
- regclass, ImmType, Imm, ImmTy,
- !listconcat(Preds,[hasAtomScope])>;
- defm _sys : ATOM3A_impl<OpStr, IntTypeStr, TypeStr, "sys",
- regclass, ImmType, Imm, ImmTy,
- !listconcat(Preds,[hasAtomScope])>;
- }
- // atom.add
- multiclass ATOM2_add_impl<string OpStr> {
- defm _s32 : ATOM2S_impl<OpStr, "i", "s32", Int32Regs, i32imm, imm, i32, []>;
- defm _u32 : ATOM2S_impl<OpStr, "i", "u32", Int32Regs, i32imm, imm, i32, []>;
- defm _u64 : ATOM2S_impl<OpStr, "i", "u64", Int64Regs, i64imm, imm, i64, []>;
- defm _f32 : ATOM2S_impl<OpStr, "f", "f32", Float32Regs, f32imm, fpimm, f32,
- []>;
- defm _f64 : ATOM2S_impl<OpStr, "f", "f64", Float64Regs, f64imm, fpimm, f64,
- [hasAtomAddF64]>;
- }
- // atom.{and,or,xor}
- multiclass ATOM2_bitwise_impl<string OpStr> {
- defm _b32 : ATOM2S_impl<OpStr, "i", "b32", Int32Regs, i32imm, imm, i32, []>;
- defm _b64 : ATOM2S_impl<OpStr, "i", "b64", Int64Regs, i64imm, imm, i64,
- [hasAtomBitwise64]>;
- }
- // atom.exch
- multiclass ATOM2_exch_impl<string OpStr> {
- defm _b32 : ATOM2S_impl<OpStr, "i", "b32", Int32Regs, i32imm, imm, i32, []>;
- defm _b64 : ATOM2S_impl<OpStr, "i", "b64", Int64Regs, i64imm, imm, i64, []>;
- }
- // atom.{min,max}
- multiclass ATOM2_minmax_impl<string OpStr> {
- defm _s32 : ATOM2S_impl<OpStr, "i", "s32", Int32Regs, i32imm, imm, i32, []>;
- defm _u32 : ATOM2S_impl<OpStr, "i", "u32", Int32Regs, i32imm, imm, i32, []>;
- defm _s64 : ATOM2S_impl<OpStr, "i", "s64", Int64Regs, i64imm, imm, i64,
- [hasAtomMinMax64]>;
- defm _u64 : ATOM2S_impl<OpStr, "i", "u64", Int64Regs, i64imm, imm, i64,
- [hasAtomMinMax64]>;
- }
- // atom.{inc,dec}
- multiclass ATOM2_incdec_impl<string OpStr> {
- defm _u32 : ATOM2S_impl<OpStr, "i", "u32", Int32Regs, i32imm, imm, i32, []>;
- }
- // atom.cas
- multiclass ATOM3_cas_impl<string OpStr> {
- defm _b32 : ATOM3S_impl<OpStr, "i", "b32", Int32Regs, i32imm, imm, i32, []>;
- defm _b64 : ATOM3S_impl<OpStr, "i", "b64", Int64Regs, i64imm, imm, i64, []>;
- }
- defm INT_PTX_SATOM_ADD : ATOM2_add_impl<"add">;
- defm INT_PTX_SATOM_AND : ATOM2_bitwise_impl<"and">;
- defm INT_PTX_SATOM_CAS : ATOM3_cas_impl<"cas">;
- defm INT_PTX_SATOM_DEC : ATOM2_incdec_impl<"dec">;
- defm INT_PTX_SATOM_EXCH: ATOM2_exch_impl<"exch">;
- defm INT_PTX_SATOM_INC : ATOM2_incdec_impl<"inc">;
- defm INT_PTX_SATOM_MAX : ATOM2_minmax_impl<"max">;
- defm INT_PTX_SATOM_MIN : ATOM2_minmax_impl<"min">;
- defm INT_PTX_SATOM_OR : ATOM2_bitwise_impl<"or">;
- defm INT_PTX_SATOM_XOR : ATOM2_bitwise_impl<"xor">;
- //-----------------------------------
- // Support for ldu on sm_20 or later
- //-----------------------------------
- // Don't annotate ldu instructions as mayLoad, as they load from memory that is
- // read-only in a kernel.
- // Scalar
- multiclass LDU_G<string TyStr, NVPTXRegClass regclass> {
- def areg: NVPTXInst<(outs regclass:$result), (ins Int32Regs:$src),
- !strconcat("ldu.global.", TyStr),
- []>, Requires<[hasLDU]>;
- def areg64: NVPTXInst<(outs regclass:$result), (ins Int64Regs:$src),
- !strconcat("ldu.global.", TyStr),
- []>, Requires<[hasLDU]>;
- def avar: NVPTXInst<(outs regclass:$result), (ins imemAny:$src),
- !strconcat("ldu.global.", TyStr),
- []>, Requires<[hasLDU]>;
- def ari : NVPTXInst<(outs regclass:$result), (ins MEMri:$src),
- !strconcat("ldu.global.", TyStr),
- []>, Requires<[hasLDU]>;
- def ari64 : NVPTXInst<(outs regclass:$result), (ins MEMri64:$src),
- !strconcat("ldu.global.", TyStr),
- []>, Requires<[hasLDU]>;
- }
- defm INT_PTX_LDU_GLOBAL_i8 : LDU_G<"u8 \t$result, [$src];", Int16Regs>;
- defm INT_PTX_LDU_GLOBAL_i16 : LDU_G<"u16 \t$result, [$src];", Int16Regs>;
- defm INT_PTX_LDU_GLOBAL_i32 : LDU_G<"u32 \t$result, [$src];", Int32Regs>;
- defm INT_PTX_LDU_GLOBAL_i64 : LDU_G<"u64 \t$result, [$src];", Int64Regs>;
- defm INT_PTX_LDU_GLOBAL_f16 : LDU_G<"b16 \t$result, [$src];", Float16Regs>;
- defm INT_PTX_LDU_GLOBAL_f16x2 : LDU_G<"b32 \t$result, [$src];", Float16x2Regs>;
- defm INT_PTX_LDU_GLOBAL_f32 : LDU_G<"f32 \t$result, [$src];", Float32Regs>;
- defm INT_PTX_LDU_GLOBAL_f64 : LDU_G<"f64 \t$result, [$src];", Float64Regs>;
- defm INT_PTX_LDU_GLOBAL_p32 : LDU_G<"u32 \t$result, [$src];", Int32Regs>;
- defm INT_PTX_LDU_GLOBAL_p64 : LDU_G<"u64 \t$result, [$src];", Int64Regs>;
- // vector
- // Elementized vector ldu
- multiclass VLDU_G_ELE_V2<string TyStr, NVPTXRegClass regclass> {
- def _areg32: NVPTXInst<(outs regclass:$dst1, regclass:$dst2),
- (ins Int32Regs:$src),
- !strconcat("ldu.global.", TyStr), []>;
- def _areg64: NVPTXInst<(outs regclass:$dst1, regclass:$dst2),
- (ins Int64Regs:$src),
- !strconcat("ldu.global.", TyStr), []>;
- def _ari32: NVPTXInst<(outs regclass:$dst1, regclass:$dst2),
- (ins MEMri:$src),
- !strconcat("ldu.global.", TyStr), []>;
- def _ari64: NVPTXInst<(outs regclass:$dst1, regclass:$dst2),
- (ins MEMri64:$src),
- !strconcat("ldu.global.", TyStr), []>;
- def _avar: NVPTXInst<(outs regclass:$dst1, regclass:$dst2),
- (ins imemAny:$src),
- !strconcat("ldu.global.", TyStr), []>;
- }
- multiclass VLDU_G_ELE_V4<string TyStr, NVPTXRegClass regclass> {
- def _areg32: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, regclass:$dst3,
- regclass:$dst4), (ins Int32Regs:$src),
- !strconcat("ldu.global.", TyStr), []>;
- def _areg64: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, regclass:$dst3,
- regclass:$dst4), (ins Int64Regs:$src),
- !strconcat("ldu.global.", TyStr), []>;
- def _ari32: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, regclass:$dst3,
- regclass:$dst4), (ins MEMri:$src),
- !strconcat("ldu.global.", TyStr), []>;
- def _ari64: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, regclass:$dst3,
- regclass:$dst4), (ins MEMri64:$src),
- !strconcat("ldu.global.", TyStr), []>;
- def _avar: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, regclass:$dst3,
- regclass:$dst4), (ins imemAny:$src),
- !strconcat("ldu.global.", TyStr), []>;
- }
- defm INT_PTX_LDU_G_v2i8_ELE
- : VLDU_G_ELE_V2<"v2.u8 \t{{$dst1, $dst2}}, [$src];", Int16Regs>;
- defm INT_PTX_LDU_G_v2i16_ELE
- : VLDU_G_ELE_V2<"v2.u16 \t{{$dst1, $dst2}}, [$src];", Int16Regs>;
- defm INT_PTX_LDU_G_v2i32_ELE
- : VLDU_G_ELE_V2<"v2.u32 \t{{$dst1, $dst2}}, [$src];", Int32Regs>;
- defm INT_PTX_LDU_G_v2f16_ELE
- : VLDU_G_ELE_V2<"v2.b16 \t{{$dst1, $dst2}}, [$src];", Float16Regs>;
- defm INT_PTX_LDU_G_v2f16x2_ELE
- : VLDU_G_ELE_V2<"v2.b32 \t{{$dst1, $dst2}}, [$src];", Float16x2Regs>;
- defm INT_PTX_LDU_G_v2f32_ELE
- : VLDU_G_ELE_V2<"v2.f32 \t{{$dst1, $dst2}}, [$src];", Float32Regs>;
- defm INT_PTX_LDU_G_v2i64_ELE
- : VLDU_G_ELE_V2<"v2.u64 \t{{$dst1, $dst2}}, [$src];", Int64Regs>;
- defm INT_PTX_LDU_G_v2f64_ELE
- : VLDU_G_ELE_V2<"v2.f64 \t{{$dst1, $dst2}}, [$src];", Float64Regs>;
- defm INT_PTX_LDU_G_v4i8_ELE
- : VLDU_G_ELE_V4<"v4.u8 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Int16Regs>;
- defm INT_PTX_LDU_G_v4i16_ELE
- : VLDU_G_ELE_V4<"v4.u16 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];",
- Int16Regs>;
- defm INT_PTX_LDU_G_v4i32_ELE
- : VLDU_G_ELE_V4<"v4.u32 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];",
- Int32Regs>;
- defm INT_PTX_LDU_G_v4f16_ELE
- : VLDU_G_ELE_V4<"v4.b16 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];",
- Float16Regs>;
- defm INT_PTX_LDU_G_v4f16x2_ELE
- : VLDU_G_ELE_V4<"v4.b32 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];",
- Float16x2Regs>;
- defm INT_PTX_LDU_G_v4f32_ELE
- : VLDU_G_ELE_V4<"v4.f32 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];",
- Float32Regs>;
- //-----------------------------------
- // Support for ldg on sm_35 or later
- //-----------------------------------
- // Don't annotate ld.global.nc as mayLoad, because these loads go through the
- // non-coherent texture cache, and therefore the values read must be read-only
- // during the lifetime of the kernel.
- multiclass LDG_G<string TyStr, NVPTXRegClass regclass> {
- def areg: NVPTXInst<(outs regclass:$result), (ins Int32Regs:$src),
- !strconcat("ld.global.nc.", TyStr),
- []>, Requires<[hasLDG]>;
- def areg64: NVPTXInst<(outs regclass:$result), (ins Int64Regs:$src),
- !strconcat("ld.global.nc.", TyStr),
- []>, Requires<[hasLDG]>;
- def avar: NVPTXInst<(outs regclass:$result), (ins imemAny:$src),
- !strconcat("ld.global.nc.", TyStr),
- []>, Requires<[hasLDG]>;
- def ari : NVPTXInst<(outs regclass:$result), (ins MEMri:$src),
- !strconcat("ld.global.nc.", TyStr),
- []>, Requires<[hasLDG]>;
- def ari64 : NVPTXInst<(outs regclass:$result), (ins MEMri64:$src),
- !strconcat("ld.global.nc.", TyStr),
- []>, Requires<[hasLDG]>;
- }
- defm INT_PTX_LDG_GLOBAL_i8
- : LDG_G<"u8 \t$result, [$src];", Int16Regs>;
- defm INT_PTX_LDG_GLOBAL_i16
- : LDG_G<"u16 \t$result, [$src];", Int16Regs>;
- defm INT_PTX_LDG_GLOBAL_i32
- : LDG_G<"u32 \t$result, [$src];", Int32Regs>;
- defm INT_PTX_LDG_GLOBAL_i64
- : LDG_G<"u64 \t$result, [$src];", Int64Regs>;
- defm INT_PTX_LDG_GLOBAL_f16
- : LDG_G<"b16 \t$result, [$src];", Float16Regs>;
- defm INT_PTX_LDG_GLOBAL_f16x2
- : LDG_G<"b32 \t$result, [$src];", Float16x2Regs>;
- defm INT_PTX_LDG_GLOBAL_f32
- : LDG_G<"f32 \t$result, [$src];", Float32Regs>;
- defm INT_PTX_LDG_GLOBAL_f64
- : LDG_G<"f64 \t$result, [$src];", Float64Regs>;
- defm INT_PTX_LDG_GLOBAL_p32
- : LDG_G<"u32 \t$result, [$src];", Int32Regs>;
- defm INT_PTX_LDG_GLOBAL_p64
- : LDG_G<"u64 \t$result, [$src];", Int64Regs>;
- // vector
- // Elementized vector ldg
- multiclass VLDG_G_ELE_V2<string TyStr, NVPTXRegClass regclass> {
- def _areg32: NVPTXInst<(outs regclass:$dst1, regclass:$dst2),
- (ins Int32Regs:$src),
- !strconcat("ld.global.nc.", TyStr), []>;
- def _areg64: NVPTXInst<(outs regclass:$dst1, regclass:$dst2),
- (ins Int64Regs:$src),
- !strconcat("ld.global.nc.", TyStr), []>;
- def _ari32: NVPTXInst<(outs regclass:$dst1, regclass:$dst2),
- (ins MEMri:$src),
- !strconcat("ld.global.nc.", TyStr), []>;
- def _ari64: NVPTXInst<(outs regclass:$dst1, regclass:$dst2),
- (ins MEMri64:$src),
- !strconcat("ld.global.nc.", TyStr), []>;
- def _avar: NVPTXInst<(outs regclass:$dst1, regclass:$dst2),
- (ins imemAny:$src),
- !strconcat("ld.global.nc.", TyStr), []>;
- }
- multiclass VLDG_G_ELE_V4<string TyStr, NVPTXRegClass regclass> {
- def _areg32: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, regclass:$dst3,
- regclass:$dst4), (ins Int32Regs:$src),
- !strconcat("ld.global.nc.", TyStr), []>;
- def _areg64: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, regclass:$dst3,
- regclass:$dst4), (ins Int64Regs:$src),
- !strconcat("ld.global.nc.", TyStr), []>;
- def _ari32: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, regclass:$dst3,
- regclass:$dst4), (ins MEMri:$src),
- !strconcat("ld.global.nc.", TyStr), []>;
- def _ari64: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, regclass:$dst3,
- regclass:$dst4), (ins MEMri64:$src),
- !strconcat("ld.global.nc.", TyStr), []>;
- def _avar: NVPTXInst<(outs regclass:$dst1, regclass:$dst2, regclass:$dst3,
- regclass:$dst4), (ins imemAny:$src),
- !strconcat("ld.global.nc.", TyStr), []>;
- }
- // FIXME: 8-bit LDG should be fixed once LDG/LDU nodes are made into proper loads.
- defm INT_PTX_LDG_G_v2i8_ELE
- : VLDG_G_ELE_V2<"v2.u8 \t{{$dst1, $dst2}}, [$src];", Int16Regs>;
- defm INT_PTX_LDG_G_v2i16_ELE
- : VLDG_G_ELE_V2<"v2.u16 \t{{$dst1, $dst2}}, [$src];", Int16Regs>;
- defm INT_PTX_LDG_G_v2i32_ELE
- : VLDG_G_ELE_V2<"v2.u32 \t{{$dst1, $dst2}}, [$src];", Int32Regs>;
- defm INT_PTX_LDG_G_v2f16_ELE
- : VLDG_G_ELE_V2<"v2.b16 \t{{$dst1, $dst2}}, [$src];", Float16Regs>;
- defm INT_PTX_LDG_G_v2f16x2_ELE
- : VLDG_G_ELE_V2<"v2.b32 \t{{$dst1, $dst2}}, [$src];", Float16x2Regs>;
- defm INT_PTX_LDG_G_v2f32_ELE
- : VLDG_G_ELE_V2<"v2.f32 \t{{$dst1, $dst2}}, [$src];", Float32Regs>;
- defm INT_PTX_LDG_G_v2i64_ELE
- : VLDG_G_ELE_V2<"v2.u64 \t{{$dst1, $dst2}}, [$src];", Int64Regs>;
- defm INT_PTX_LDG_G_v2f64_ELE
- : VLDG_G_ELE_V2<"v2.f64 \t{{$dst1, $dst2}}, [$src];", Float64Regs>;
- defm INT_PTX_LDG_G_v4i8_ELE
- : VLDG_G_ELE_V4<"v4.u8 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Int16Regs>;
- defm INT_PTX_LDG_G_v4i16_ELE
- : VLDG_G_ELE_V4<"v4.u16 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Int16Regs>;
- defm INT_PTX_LDG_G_v4i32_ELE
- : VLDG_G_ELE_V4<"v4.u32 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Int32Regs>;
- defm INT_PTX_LDG_G_v4f16_ELE
- : VLDG_G_ELE_V4<"v4.b16 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Float16Regs>;
- defm INT_PTX_LDG_G_v4f16x2_ELE
- : VLDG_G_ELE_V4<"v4.b32 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Float16x2Regs>;
- defm INT_PTX_LDG_G_v4f32_ELE
- : VLDG_G_ELE_V4<"v4.f32 \t{{$dst1, $dst2, $dst3, $dst4}}, [$src];", Float32Regs>;
- multiclass NG_TO_G<string Str, Intrinsic Intrin> {
- def _yes : NVPTXInst<(outs Int32Regs:$result), (ins Int32Regs:$src),
- !strconcat("cvta.", Str, ".u32 \t$result, $src;"),
- [(set Int32Regs:$result, (Intrin Int32Regs:$src))]>;
- def _yes_64 : NVPTXInst<(outs Int64Regs:$result), (ins Int64Regs:$src),
- !strconcat("cvta.", Str, ".u64 \t$result, $src;"),
- [(set Int64Regs:$result, (Intrin Int64Regs:$src))]>;
- def _yes_6432 : NVPTXInst<(outs Int64Regs:$result), (ins Int32Regs:$src),
- "{{ .reg .b64 %tmp;\n\t"
- #" cvt.u64.u32 \t%tmp, $src;\n\t"
- #" cvta." # Str # ".u64 \t$result, %tmp; }}",
- [(set Int64Regs:$result, (Intrin Int32Regs:$src))]>,
- Requires<[useShortPtr]>;
- }
- multiclass G_TO_NG<string Str, Intrinsic Intrin> {
- def _yes : NVPTXInst<(outs Int32Regs:$result), (ins Int32Regs:$src),
- !strconcat("cvta.to.", Str, ".u32 \t$result, $src;"),
- [(set Int32Regs:$result, (Intrin Int32Regs:$src))]>;
- def _yes_64 : NVPTXInst<(outs Int64Regs:$result), (ins Int64Regs:$src),
- !strconcat("cvta.to.", Str, ".u64 \t$result, $src;"),
- [(set Int64Regs:$result, (Intrin Int64Regs:$src))]>;
- def _yes_3264 : NVPTXInst<(outs Int32Regs:$result), (ins Int64Regs:$src),
- "{{ .reg .b64 %tmp;\n\t"
- #" cvta.to." # Str # ".u64 \t%tmp, $src;\n\t"
- #" cvt.u32.u64 \t$result, %tmp; }}",
- [(set Int32Regs:$result, (Intrin Int64Regs:$src))]>,
- Requires<[useShortPtr]>;
- }
- defm cvta_local : NG_TO_G<"local", int_nvvm_ptr_local_to_gen>;
- defm cvta_shared : NG_TO_G<"shared", int_nvvm_ptr_shared_to_gen>;
- defm cvta_global : NG_TO_G<"global", int_nvvm_ptr_global_to_gen>;
- defm cvta_const : NG_TO_G<"const", int_nvvm_ptr_constant_to_gen>;
- defm cvta_to_local : G_TO_NG<"local", int_nvvm_ptr_gen_to_local>;
- defm cvta_to_shared : G_TO_NG<"shared", int_nvvm_ptr_gen_to_shared>;
- defm cvta_to_global : G_TO_NG<"global", int_nvvm_ptr_gen_to_global>;
- defm cvta_to_const : G_TO_NG<"const", int_nvvm_ptr_gen_to_constant>;
- // nvvm.ptr.gen.to.param
- def nvvm_ptr_gen_to_param : NVPTXInst<(outs Int32Regs:$result),
- (ins Int32Regs:$src),
- "mov.u32 \t$result, $src;",
- [(set Int32Regs:$result,
- (int_nvvm_ptr_gen_to_param Int32Regs:$src))]>;
- def nvvm_ptr_gen_to_param_64 : NVPTXInst<(outs Int64Regs:$result),
- (ins Int64Regs:$src),
- "mov.u64 \t$result, $src;",
- [(set Int64Regs:$result,
- (int_nvvm_ptr_gen_to_param Int64Regs:$src))]>;
- // nvvm.move intrinsicc
- def nvvm_move_i16 : NVPTXInst<(outs Int16Regs:$r), (ins Int16Regs:$s),
- "mov.b16 \t$r, $s;",
- [(set Int16Regs:$r,
- (int_nvvm_move_i16 Int16Regs:$s))]>;
- def nvvm_move_i32 : NVPTXInst<(outs Int32Regs:$r), (ins Int32Regs:$s),
- "mov.b32 \t$r, $s;",
- [(set Int32Regs:$r,
- (int_nvvm_move_i32 Int32Regs:$s))]>;
- def nvvm_move_i64 : NVPTXInst<(outs Int64Regs:$r), (ins Int64Regs:$s),
- "mov.b64 \t$r, $s;",
- [(set Int64Regs:$r,
- (int_nvvm_move_i64 Int64Regs:$s))]>;
- def nvvm_move_float : NVPTXInst<(outs Float32Regs:$r), (ins Float32Regs:$s),
- "mov.f32 \t$r, $s;",
- [(set Float32Regs:$r,
- (int_nvvm_move_float Float32Regs:$s))]>;
- def nvvm_move_double : NVPTXInst<(outs Float64Regs:$r), (ins Float64Regs:$s),
- "mov.f64 \t$r, $s;",
- [(set Float64Regs:$r,
- (int_nvvm_move_double Float64Regs:$s))]>;
- def nvvm_move_ptr32 : NVPTXInst<(outs Int32Regs:$r), (ins Int32Regs:$s),
- "mov.u32 \t$r, $s;",
- [(set Int32Regs:$r,
- (int_nvvm_move_ptr Int32Regs:$s))]>;
- def nvvm_move_ptr64 : NVPTXInst<(outs Int64Regs:$r), (ins Int64Regs:$s),
- "mov.u64 \t$r, $s;",
- [(set Int64Regs:$r,
- (int_nvvm_move_ptr Int64Regs:$s))]>;
- // @TODO: Are these actually needed, or will we always just see symbols
- // copied to registers first?
- /*def nvvm_move_sym32 : NVPTXInst<(outs Int32Regs:$r), (ins imem:$s),
- "mov.u32 \t$r, $s;",
- [(set Int32Regs:$r,
- (int_nvvm_move_ptr texternalsym:$s))]>;
- def nvvm_move_sym64 : NVPTXInst<(outs Int64Regs:$r), (ins imem:$s),
- "mov.u64 \t$r, $s;",
- [(set Int64Regs:$r,
- (int_nvvm_move_ptr texternalsym:$s))]>;*/
- // MoveParam %r1, param
- // ptr_local_to_gen %r2, %r1
- // ptr_gen_to_local %r3, %r2
- // ->
- // mov %r1, param
- // @TODO: Revisit this. There is a type
- // contradiction between iPTRAny and iPTR for the addr defs, so the move_sym
- // instructions are not currently defined. However, we can use the ptr
- // variants and the asm printer will do the right thing.
- def : Pat<(i64 (int_nvvm_ptr_gen_to_local (int_nvvm_ptr_local_to_gen
- (MoveParam texternalsym:$src)))),
- (nvvm_move_ptr64 texternalsym:$src)>;
- def : Pat<(i32 (int_nvvm_ptr_gen_to_local (int_nvvm_ptr_local_to_gen
- (MoveParam texternalsym:$src)))),
- (nvvm_move_ptr32 texternalsym:$src)>;
- def texsurf_handles
- : NVPTXInst<(outs Int64Regs:$result), (ins imem:$src),
- "mov.u64 \t$result, $src;", []>;
- //-----------------------------------
- // Compiler Error Warn
- // - Just ignore them in codegen
- //-----------------------------------
- def INT_NVVM_COMPILER_WARN_32 : NVPTXInst<(outs), (ins Int32Regs:$a),
- "// llvm.nvvm.compiler.warn()",
- [(int_nvvm_compiler_warn Int32Regs:$a)]>;
- def INT_NVVM_COMPILER_WARN_64 : NVPTXInst<(outs), (ins Int64Regs:$a),
- "// llvm.nvvm.compiler.warn()",
- [(int_nvvm_compiler_warn Int64Regs:$a)]>;
- def INT_NVVM_COMPILER_ERROR_32 : NVPTXInst<(outs), (ins Int32Regs:$a),
- "// llvm.nvvm.compiler.error()",
- [(int_nvvm_compiler_error Int32Regs:$a)]>;
- def INT_NVVM_COMPILER_ERROR_64 : NVPTXInst<(outs), (ins Int64Regs:$a),
- "// llvm.nvvm.compiler.error()",
- [(int_nvvm_compiler_error Int64Regs:$a)]>;
- // isspacep
- def ISSPACEP_CONST_32
- : NVPTXInst<(outs Int1Regs:$d), (ins Int32Regs:$a),
- "isspacep.const \t$d, $a;",
- [(set Int1Regs:$d, (int_nvvm_isspacep_const Int32Regs:$a))]>,
- Requires<[hasPTX31]>;
- def ISSPACEP_CONST_64
- : NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
- "isspacep.const \t$d, $a;",
- [(set Int1Regs:$d, (int_nvvm_isspacep_const Int64Regs:$a))]>,
- Requires<[hasPTX31]>;
- def ISSPACEP_GLOBAL_32
- : NVPTXInst<(outs Int1Regs:$d), (ins Int32Regs:$a),
- "isspacep.global \t$d, $a;",
- [(set Int1Regs:$d, (int_nvvm_isspacep_global Int32Regs:$a))]>;
- def ISSPACEP_GLOBAL_64
- : NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
- "isspacep.global \t$d, $a;",
- [(set Int1Regs:$d, (int_nvvm_isspacep_global Int64Regs:$a))]>;
- def ISSPACEP_LOCAL_32
- : NVPTXInst<(outs Int1Regs:$d), (ins Int32Regs:$a),
- "isspacep.local \t$d, $a;",
- [(set Int1Regs:$d, (int_nvvm_isspacep_local Int32Regs:$a))]>;
- def ISSPACEP_LOCAL_64
- : NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
- "isspacep.local \t$d, $a;",
- [(set Int1Regs:$d, (int_nvvm_isspacep_local Int64Regs:$a))]>;
- def ISSPACEP_SHARED_32
- : NVPTXInst<(outs Int1Regs:$d), (ins Int32Regs:$a),
- "isspacep.shared \t$d, $a;",
- [(set Int1Regs:$d, (int_nvvm_isspacep_shared Int32Regs:$a))]>;
- def ISSPACEP_SHARED_64
- : NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
- "isspacep.shared \t$d, $a;",
- [(set Int1Regs:$d, (int_nvvm_isspacep_shared Int64Regs:$a))]>;
- // Special register reads
- def MOV_SPECIAL : NVPTXInst<(outs Int32Regs:$d),
- (ins SpecialRegs:$r),
- "mov.b32 \t$d, $r;", []>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg0), (MOV_SPECIAL ENVREG0)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg1), (MOV_SPECIAL ENVREG1)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg2), (MOV_SPECIAL ENVREG2)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg3), (MOV_SPECIAL ENVREG3)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg4), (MOV_SPECIAL ENVREG4)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg5), (MOV_SPECIAL ENVREG5)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg6), (MOV_SPECIAL ENVREG6)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg7), (MOV_SPECIAL ENVREG7)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg8), (MOV_SPECIAL ENVREG8)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg9), (MOV_SPECIAL ENVREG9)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg10), (MOV_SPECIAL ENVREG10)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg11), (MOV_SPECIAL ENVREG11)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg12), (MOV_SPECIAL ENVREG12)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg13), (MOV_SPECIAL ENVREG13)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg14), (MOV_SPECIAL ENVREG14)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg15), (MOV_SPECIAL ENVREG15)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg16), (MOV_SPECIAL ENVREG16)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg17), (MOV_SPECIAL ENVREG17)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg18), (MOV_SPECIAL ENVREG18)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg19), (MOV_SPECIAL ENVREG19)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg20), (MOV_SPECIAL ENVREG20)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg21), (MOV_SPECIAL ENVREG21)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg22), (MOV_SPECIAL ENVREG22)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg23), (MOV_SPECIAL ENVREG23)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg24), (MOV_SPECIAL ENVREG24)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg25), (MOV_SPECIAL ENVREG25)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg26), (MOV_SPECIAL ENVREG26)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg27), (MOV_SPECIAL ENVREG27)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg28), (MOV_SPECIAL ENVREG28)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg29), (MOV_SPECIAL ENVREG29)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg30), (MOV_SPECIAL ENVREG30)>;
- def : Pat<(int_nvvm_read_ptx_sreg_envreg31), (MOV_SPECIAL ENVREG31)>;
- // rotate builtin support
- def ROTATE_B32_HW_IMM
- : NVPTXInst<(outs Int32Regs:$dst),
- (ins Int32Regs:$src, i32imm:$amt),
- "shf.l.wrap.b32 \t$dst, $src, $src, $amt;",
- [(set Int32Regs:$dst,
- (int_nvvm_rotate_b32 Int32Regs:$src, (i32 imm:$amt)))]>,
- Requires<[hasHWROT32]> ;
- def ROTATE_B32_HW_REG
- : NVPTXInst<(outs Int32Regs:$dst),
- (ins Int32Regs:$src, Int32Regs:$amt),
- "shf.l.wrap.b32 \t$dst, $src, $src, $amt;",
- [(set Int32Regs:$dst,
- (int_nvvm_rotate_b32 Int32Regs:$src, Int32Regs:$amt))]>,
- Requires<[hasHWROT32]> ;
- def : Pat<(int_nvvm_rotate_b32 Int32Regs:$src, (i32 imm:$amt)),
- (ROT32imm_sw Int32Regs:$src, imm:$amt, (SUB_FRM_32 node:$amt))>,
- Requires<[noHWROT32]> ;
- def : Pat<(int_nvvm_rotate_b32 Int32Regs:$src, Int32Regs:$amt),
- (ROTL32reg_sw Int32Regs:$src, Int32Regs:$amt)>,
- Requires<[noHWROT32]> ;
- let hasSideEffects = false in {
- def GET_LO_INT64 : NVPTXInst<(outs Int32Regs:$dst), (ins Int64Regs:$src),
- !strconcat("{{\n\t",
- ".reg .b32 %dummy;\n\t",
- "mov.b64 \t{$dst,%dummy}, $src;\n\t",
- "}}"),
- []> ;
- def GET_HI_INT64 : NVPTXInst<(outs Int32Regs:$dst), (ins Int64Regs:$src),
- !strconcat("{{\n\t",
- ".reg .b32 %dummy;\n\t",
- "mov.b64 \t{%dummy,$dst}, $src;\n\t",
- "}}"),
- []> ;
- }
- let hasSideEffects = false in {
- def PACK_TWO_INT32
- : NVPTXInst<(outs Int64Regs:$dst), (ins Int32Regs:$lo, Int32Regs:$hi),
- "mov.b64 \t$dst, {{$lo, $hi}};", []> ;
- }
- def : Pat<(int_nvvm_swap_lo_hi_b64 Int64Regs:$src),
- (PACK_TWO_INT32 (GET_HI_INT64 Int64Regs:$src),
- (GET_LO_INT64 Int64Regs:$src))> ;
- // Funnel shift, requires >= sm_32. Does not trap if amt is out of range, so
- // no side effects.
- let hasSideEffects = false in {
- def SHF_L_WRAP_B32_IMM
- : NVPTXInst<(outs Int32Regs:$dst),
- (ins Int32Regs:$lo, Int32Regs:$hi, i32imm:$amt),
- "shf.l.wrap.b32 \t$dst, $lo, $hi, $amt;",[]>,
- Requires<[hasHWROT32]>;
- def SHF_L_WRAP_B32_REG
- : NVPTXInst<(outs Int32Regs:$dst),
- (ins Int32Regs:$lo, Int32Regs:$hi, Int32Regs:$amt),
- "shf.l.wrap.b32 \t$dst, $lo, $hi, $amt;",[]>,
- Requires<[hasHWROT32]>;
- def SHF_R_WRAP_B32_IMM
- : NVPTXInst<(outs Int32Regs:$dst),
- (ins Int32Regs:$lo, Int32Regs:$hi, i32imm:$amt),
- "shf.r.wrap.b32 \t$dst, $lo, $hi, $amt;",[]>,
- Requires<[hasHWROT32]>;
- def SHF_R_WRAP_B32_REG
- : NVPTXInst<(outs Int32Regs:$dst),
- (ins Int32Regs:$lo, Int32Regs:$hi, Int32Regs:$amt),
- "shf.r.wrap.b32 \t$dst, $lo, $hi, $amt;",[]>,
- Requires<[hasHWROT32]>;
- }
- // HW version of rotate 64
- def : Pat<(int_nvvm_rotate_b64 Int64Regs:$src, (i32 imm:$amt)),
- (PACK_TWO_INT32
- (SHF_L_WRAP_B32_IMM (GET_HI_INT64 Int64Regs:$src),
- (GET_LO_INT64 Int64Regs:$src), imm:$amt),
- (SHF_L_WRAP_B32_IMM (GET_LO_INT64 Int64Regs:$src),
- (GET_HI_INT64 Int64Regs:$src), imm:$amt))>,
- Requires<[hasHWROT32]>;
- def : Pat<(int_nvvm_rotate_b64 Int64Regs:$src, Int32Regs:$amt),
- (PACK_TWO_INT32
- (SHF_L_WRAP_B32_REG (GET_HI_INT64 Int64Regs:$src),
- (GET_LO_INT64 Int64Regs:$src), Int32Regs:$amt),
- (SHF_L_WRAP_B32_REG (GET_LO_INT64 Int64Regs:$src),
- (GET_HI_INT64 Int64Regs:$src), Int32Regs:$amt))>,
- Requires<[hasHWROT32]>;
- def : Pat<(int_nvvm_rotate_right_b64 Int64Regs:$src, (i32 imm:$amt)),
- (PACK_TWO_INT32
- (SHF_R_WRAP_B32_IMM (GET_LO_INT64 Int64Regs:$src),
- (GET_HI_INT64 Int64Regs:$src), imm:$amt),
- (SHF_R_WRAP_B32_IMM (GET_HI_INT64 Int64Regs:$src),
- (GET_LO_INT64 Int64Regs:$src), imm:$amt))>,
- Requires<[hasHWROT32]>;
- def : Pat<(int_nvvm_rotate_right_b64 Int64Regs:$src, Int32Regs:$amt),
- (PACK_TWO_INT32
- (SHF_R_WRAP_B32_REG (GET_LO_INT64 Int64Regs:$src),
- (GET_HI_INT64 Int64Regs:$src), Int32Regs:$amt),
- (SHF_R_WRAP_B32_REG (GET_HI_INT64 Int64Regs:$src),
- (GET_LO_INT64 Int64Regs:$src), Int32Regs:$amt))>,
- Requires<[hasHWROT32]>;
- // SW version of rotate 64
- def : Pat<(int_nvvm_rotate_b64 Int64Regs:$src, (i32 imm:$amt)),
- (ROT64imm_sw Int64Regs:$src, imm:$amt, (SUB_FRM_32 node:$amt))>,
- Requires<[noHWROT32]>;
- def : Pat<(int_nvvm_rotate_b64 Int64Regs:$src, Int32Regs:$amt),
- (ROTL64reg_sw Int64Regs:$src, Int32Regs:$amt)>,
- Requires<[noHWROT32]>;
- def : Pat<(int_nvvm_rotate_right_b64 Int64Regs:$src, (i32 imm:$amt)),
- (ROT64imm_sw Int64Regs:$src, (SUB_FRM_64 node:$amt), imm:$amt)>,
- Requires<[noHWROT32]>;
- def : Pat<(int_nvvm_rotate_right_b64 Int64Regs:$src, Int32Regs:$amt),
- (ROTR64reg_sw Int64Regs:$src, Int32Regs:$amt)>,
- Requires<[noHWROT32]>;
- //-----------------------------------
- // Texture Intrinsics
- //-----------------------------------
- // NOTE: For Fermi support, any new texture/surface/sampler intrinsics must be
- // also defined in NVPTXReplaceImageHandles.cpp
- // texmode_independent
- let IsTex = true, IsTexModeUnified = false in {
- // Texture fetch instructions using handles
- class TEX_1D_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins intype:$x)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, $s, \\{$x\\}];",
- []>;
- multiclass TEX_1D<string inst, NVPTXRegClass outtype, NVPTXRegClass intype> {
- def _RR : TEX_1D_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_1D_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_1D_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_1D_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_1D_F32_S32 : TEX_1D<"tex.1d.v4.f32.s32", Float32Regs, Int32Regs>;
- defm TEX_1D_F32_F32 : TEX_1D<"tex.1d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_1D_S32_S32 : TEX_1D<"tex.1d.v4.s32.s32", Int32Regs, Int32Regs>;
- defm TEX_1D_S32_F32 : TEX_1D<"tex.1d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_1D_U32_S32 : TEX_1D<"tex.1d.v4.u32.s32", Int32Regs, Int32Regs>;
- defm TEX_1D_U32_F32 : TEX_1D<"tex.1d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_1D_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins intype:$x, intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, $s, \\{$x\\}], $lod;",
- []>;
- multiclass TEX_1D_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_1D_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_1D_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_1D_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_1D_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_1D_F32_F32_LEVEL :
- TEX_1D_LEVEL<"tex.level.1d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_1D_S32_F32_LEVEL :
- TEX_1D_LEVEL<"tex.level.1d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_1D_U32_F32_LEVEL :
- TEX_1D_LEVEL<"tex.level.1d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_1D_GRAD_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins intype:$x, intype:$gradx, intype:$grady)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, $s, \\{$x\\}],"
- " \\{$gradx\\}, \\{$grady\\};",
- []>;
- multiclass TEX_1D_GRAD<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_1D_GRAD_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_1D_GRAD_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_1D_GRAD_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_1D_GRAD_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_1D_F32_F32_GRAD
- : TEX_1D_GRAD<"tex.grad.1d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_1D_S32_F32_GRAD
- : TEX_1D_GRAD<"tex.grad.1d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_1D_U32_F32_GRAD
- : TEX_1D_GRAD<"tex.grad.1d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_1D_ARRAY_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins Int32Regs:$l, intype:$x)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, $s, \\{$l, $x\\}];",
- []>;
- multiclass TEX_1D_ARRAY<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_1D_ARRAY_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_1D_ARRAY_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_1D_ARRAY_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_1D_ARRAY_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_1D_ARRAY_F32_F32
- : TEX_1D_ARRAY<"tex.a1d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_1D_ARRAY_F32_S32
- : TEX_1D_ARRAY<"tex.a1d.v4.f32.s32", Float32Regs, Int32Regs>;
- defm TEX_1D_ARRAY_S32_S32
- : TEX_1D_ARRAY<"tex.a1d.v4.s32.s32", Int32Regs, Int32Regs>;
- defm TEX_1D_ARRAY_S32_F32
- : TEX_1D_ARRAY<"tex.a1d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_1D_ARRAY_U32_S32
- : TEX_1D_ARRAY<"tex.a1d.v4.u32.s32", Int32Regs, Int32Regs>;
- defm TEX_1D_ARRAY_U32_F32
- : TEX_1D_ARRAY<"tex.a1d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_1D_ARRAY_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins Int32Regs:$l, intype:$x, intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, $s, \\{$l, $x\\}], $lod;",
- []>;
- multiclass TEX_1D_ARRAY_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_1D_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_1D_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_1D_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_1D_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_1D_ARRAY_F32_F32_LEVEL
- : TEX_1D_ARRAY_LEVEL<"tex.level.a1d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_1D_ARRAY_S32_F32_LEVEL
- : TEX_1D_ARRAY_LEVEL<"tex.level.a1d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_1D_ARRAY_U32_F32_LEVEL
- : TEX_1D_ARRAY_LEVEL<"tex.level.a1d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_1D_ARRAY_GRAD_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins Int32Regs:$l, intype:$x,
- intype:$gradx, intype:$grady)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, $s, \\{$l, $x\\}],"
- " \\{$gradx\\}, \\{$grady\\};",
- []>;
- multiclass TEX_1D_ARRAY_GRAD<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_1D_ARRAY_GRAD_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_1D_ARRAY_GRAD_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_1D_ARRAY_GRAD_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_1D_ARRAY_GRAD_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_1D_ARRAY_F32_F32_GRAD
- : TEX_1D_ARRAY_GRAD<"tex.grad.a1d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_1D_ARRAY_S32_F32_GRAD
- : TEX_1D_ARRAY_GRAD<"tex.grad.a1d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_1D_ARRAY_U32_F32_GRAD
- : TEX_1D_ARRAY_GRAD<"tex.grad.a1d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_2D_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins intype:$x, intype:$y)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, $s, \\{$x, $y\\}];",
- []>;
- multiclass TEX_2D<string inst, NVPTXRegClass outtype, NVPTXRegClass intype> {
- def _RR : TEX_2D_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_2D_base<inst, outtype, intype, (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_2D_base<inst, outtype, intype, (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_2D_base<inst, outtype, intype, (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_2D_F32_F32 : TEX_2D<"tex.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_2D_F32_S32 : TEX_2D<"tex.2d.v4.f32.s32", Float32Regs, Int32Regs>;
- defm TEX_2D_S32_S32 : TEX_2D<"tex.2d.v4.s32.s32", Int32Regs, Int32Regs>;
- defm TEX_2D_S32_F32 : TEX_2D<"tex.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_2D_U32_S32 : TEX_2D<"tex.2d.v4.u32.s32", Int32Regs, Int32Regs>;
- defm TEX_2D_U32_F32 : TEX_2D<"tex.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_2D_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins intype:$x, intype:$y, intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, $s, \\{$x, $y\\}], $lod;",
- []>;
- multiclass TEX_2D_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_2D_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_2D_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_2D_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_2D_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_2D_F32_F32_LEVEL :
- TEX_2D_LEVEL<"tex.level.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_2D_S32_F32_LEVEL :
- TEX_2D_LEVEL<"tex.level.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_2D_U32_F32_LEVEL :
- TEX_2D_LEVEL<"tex.level.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_2D_GRAD_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins intype:$x, intype:$y,
- intype:$gradx0, intype:$gradx1,
- intype:$grady0, intype:$grady1)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, $s, \\{$x, $y\\}],"
- " \\{$gradx0, $gradx1\\}, \\{$grady0, $grady1\\};",
- []>;
- multiclass TEX_2D_GRAD<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_2D_GRAD_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_2D_GRAD_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_2D_GRAD_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_2D_GRAD_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_2D_F32_F32_GRAD :
- TEX_2D_GRAD<"tex.grad.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_2D_S32_F32_GRAD :
- TEX_2D_GRAD<"tex.grad.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_2D_U32_F32_GRAD :
- TEX_2D_GRAD<"tex.grad.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_2D_ARRAY_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins Int32Regs:$l, intype:$x, intype:$y)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, $s, \\{$l, $x, $y, $y\\}];",
- []>;
- multiclass TEX_2D_ARRAY<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_2D_ARRAY_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_2D_ARRAY_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_2D_ARRAY_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_2D_ARRAY_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_2D_ARRAY_F32_F32
- : TEX_2D_ARRAY<"tex.a2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_2D_ARRAY_F32_S32
- : TEX_2D_ARRAY<"tex.a2d.v4.f32.s32", Float32Regs, Int32Regs>;
- defm TEX_2D_ARRAY_S32_S32
- : TEX_2D_ARRAY<"tex.a2d.v4.s32.s32", Int32Regs, Int32Regs>;
- defm TEX_2D_ARRAY_S32_F32
- : TEX_2D_ARRAY<"tex.a2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_2D_ARRAY_U32_S32
- : TEX_2D_ARRAY<"tex.a2d.v4.u32.s32", Int32Regs, Int32Regs>;
- defm TEX_2D_ARRAY_U32_F32
- : TEX_2D_ARRAY<"tex.a2d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_2D_ARRAY_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins Int32Regs:$l, intype:$x, intype:$y,
- intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, $s, \\{$l, $x, $y, $y\\}], $lod;",
- []>;
- multiclass TEX_2D_ARRAY_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_2D_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_2D_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_2D_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_2D_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_2D_ARRAY_F32_F32_LEVEL
- : TEX_2D_ARRAY_LEVEL<"tex.level.a2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_2D_ARRAY_S32_F32_LEVEL
- : TEX_2D_ARRAY_LEVEL<"tex.level.a2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_2D_ARRAY_U32_F32_LEVEL
- : TEX_2D_ARRAY_LEVEL<"tex.level.a2d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_2D_ARRAY_GRAD_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins Int32Regs:$l, intype:$x, intype:$y,
- intype:$gradx0, intype:$gradx1,
- intype:$grady0, intype:$grady1)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, $s, \\{$l, $x, $y, $y\\}],"
- " \\{$gradx0, $gradx1\\}, \\{$grady0, $grady1\\};",
- []>;
- multiclass TEX_2D_ARRAY_GRAD<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_2D_ARRAY_GRAD_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_2D_ARRAY_GRAD_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_2D_ARRAY_GRAD_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_2D_ARRAY_GRAD_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_2D_ARRAY_F32_F32_GRAD
- : TEX_2D_ARRAY_GRAD<"tex.grad.a2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_2D_ARRAY_S32_F32_GRAD
- : TEX_2D_ARRAY_GRAD<"tex.grad.a2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_2D_ARRAY_U32_F32_GRAD
- : TEX_2D_ARRAY_GRAD<"tex.grad.a2d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_3D_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins intype:$x, intype:$y, intype:$z)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, $s, \\{$x, $y, $z, $z\\}];",
- []>;
- multiclass TEX_3D<string inst, NVPTXRegClass outtype, NVPTXRegClass intype> {
- def _RR : TEX_3D_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_3D_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_3D_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_3D_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_3D_F32_F32 : TEX_3D<"tex.3d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_3D_F32_S32 : TEX_3D<"tex.3d.v4.f32.s32", Float32Regs, Int32Regs>;
- defm TEX_3D_S32_S32 : TEX_3D<"tex.3d.v4.s32.s32", Int32Regs, Int32Regs>;
- defm TEX_3D_S32_F32 : TEX_3D<"tex.3d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_3D_U32_S32 : TEX_3D<"tex.3d.v4.u32.s32", Int32Regs, Int32Regs>;
- defm TEX_3D_U32_F32 : TEX_3D<"tex.3d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_3D_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins intype:$x, intype:$y, intype:$z,
- intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, $s, \\{$x, $y, $z, $z\\}], $lod;",
- []>;
- multiclass TEX_3D_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_3D_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_3D_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_3D_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_3D_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_3D_F32_F32_LEVEL
- : TEX_3D_LEVEL<"tex.level.3d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_3D_S32_F32_LEVEL
- : TEX_3D_LEVEL<"tex.level.3d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_3D_U32_F32_LEVEL
- : TEX_3D_LEVEL<"tex.level.3d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_3D_GRAD_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins intype:$x, intype:$y, intype:$z,
- intype :$gradx0, intype:$gradx1,
- intype:$gradx2, intype:$grady0,
- intype:$grady1, intype:$grady2)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, $s, \\{$x, $y, $z, $z\\}],"
- " \\{$gradx0, $gradx1, $gradx2, $gradx2\\},"
- " \\{$grady0, $grady1, $grady2, $grady2\\};",
- []>;
- multiclass TEX_3D_GRAD<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_3D_GRAD_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_3D_GRAD_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_3D_GRAD_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_3D_GRAD_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_3D_F32_F32_GRAD
- : TEX_3D_GRAD<"tex.grad.3d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_3D_S32_F32_GRAD
- : TEX_3D_GRAD<"tex.grad.3d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_3D_U32_F32_GRAD
- : TEX_3D_GRAD<"tex.grad.3d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_CUBE_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins intype:$x, intype:$y, intype:$z)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, $s, \\{$x, $y, $z, $z\\}];",
- []>;
- multiclass TEX_CUBE<string inst, NVPTXRegClass outtype, NVPTXRegClass intype> {
- def _RR : TEX_CUBE_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_CUBE_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_CUBE_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_CUBE_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_CUBE_F32_F32
- : TEX_CUBE<"tex.cube.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_CUBE_S32_F32
- : TEX_CUBE<"tex.cube.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_CUBE_U32_F32
- : TEX_CUBE<"tex.cube.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_CUBE_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins intype:$x, intype:$y, intype:$z,
- intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, $s, \\{$x, $y, $z, $z\\}], $lod;",
- []>;
- multiclass TEX_CUBE_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_CUBE_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_CUBE_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_CUBE_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_CUBE_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_CUBE_F32_F32_LEVEL
- : TEX_CUBE_LEVEL<"tex.level.cube.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_CUBE_S32_F32_LEVEL
- : TEX_CUBE_LEVEL<"tex.level.cube.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_CUBE_U32_F32_LEVEL
- : TEX_CUBE_LEVEL<"tex.level.cube.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_CUBE_ARRAY_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins Int32Regs:$l, intype:$x, intype:$y,
- intype:$z)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, $s, \\{$l, $x, $y, $z\\}];",
- []>;
- multiclass TEX_CUBE_ARRAY<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_CUBE_ARRAY_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_CUBE_ARRAY_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_CUBE_ARRAY_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_CUBE_ARRAY_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_CUBE_ARRAY_F32_F32
- : TEX_CUBE_ARRAY<"tex.acube.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_CUBE_ARRAY_S32_F32
- : TEX_CUBE_ARRAY<"tex.acube.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_CUBE_ARRAY_U32_F32
- : TEX_CUBE_ARRAY<"tex.acube.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_CUBE_ARRAY_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(texsamp, (ins Int32Regs:$l, intype:$x, intype:$y,
- intype:$z, intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, $s, \\{$l, $x, $y, $z\\}], $lod;",
- []>;
- multiclass TEX_CUBE_ARRAY_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _RR : TEX_CUBE_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TEX_CUBE_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TEX_CUBE_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TEX_CUBE_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TEX_CUBE_ARRAY_F32_F32_LEVEL
- : TEX_CUBE_ARRAY_LEVEL<"tex.level.acube.v4.f32.f32",
- Float32Regs, Float32Regs>;
- defm TEX_CUBE_ARRAY_S32_F32_LEVEL
- : TEX_CUBE_ARRAY_LEVEL<"tex.level.acube.v4.s32.f32",
- Int32Regs, Float32Regs>;
- defm TEX_CUBE_ARRAY_U32_F32_LEVEL
- : TEX_CUBE_ARRAY_LEVEL<"tex.level.acube.v4.u32.f32",
- Int32Regs, Float32Regs>;
- class TLD4_2D_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag texsamp>
- : NVPTXInst<(outs outtype:$v0, outtype:$v1,
- outtype:$v2, outtype:$v3),
- !con(texsamp, (ins intype:$x, intype:$y)),
- inst # " \t\\{$v0, $v1, $v2, $v3\\}, [$t, $s, \\{$x, $y\\}];",
- []>;
- multiclass TLD4_2D<string inst, NVPTXRegClass outtype, NVPTXRegClass intype> {
- def _RR : TLD4_2D_base<inst, outtype, intype,
- (ins Int64Regs:$t, Int64Regs:$s)>;
- def _RI : TLD4_2D_base<inst, outtype, intype,
- (ins Int64Regs:$t, i64imm:$s)>;
- def _IR : TLD4_2D_base<inst, outtype, intype,
- (ins i64imm:$t, Int64Regs:$s)>;
- def _II : TLD4_2D_base<inst, outtype, intype,
- (ins i64imm:$t, i64imm:$s)>;
- }
- defm TLD4_R_2D_F32_F32
- : TLD4_2D<"tld4.r.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TLD4_G_2D_F32_F32
- : TLD4_2D<"tld4.g.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TLD4_B_2D_F32_F32
- : TLD4_2D<"tld4.b.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TLD4_A_2D_F32_F32
- : TLD4_2D<"tld4.a.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TLD4_R_2D_S32_F32
- : TLD4_2D<"tld4.r.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TLD4_G_2D_S32_F32
- : TLD4_2D<"tld4.g.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TLD4_B_2D_S32_F32
- : TLD4_2D<"tld4.b.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TLD4_A_2D_S32_F32
- : TLD4_2D<"tld4.a.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TLD4_R_2D_U32_F32
- : TLD4_2D<"tld4.r.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- defm TLD4_G_2D_U32_F32
- : TLD4_2D<"tld4.g.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- defm TLD4_B_2D_U32_F32
- : TLD4_2D<"tld4.b.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- defm TLD4_A_2D_U32_F32
- : TLD4_2D<"tld4.a.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- }
- // texmode_unified
- let IsTex = true, IsTexModeUnified = true in {
- // Texture fetch instructions using handles
- class TEX_UNIFIED_1D_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins intype:$x)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$x\\}];",
- []>;
- multiclass TEX_UNIFIED_1D<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_1D_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_1D_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_1D_F32_S32
- : TEX_UNIFIED_1D<"tex.1d.v4.f32.s32", Float32Regs, Int32Regs>;
- defm TEX_UNIFIED_1D_F32_F32
- : TEX_UNIFIED_1D<"tex.1d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_1D_S32_S32
- : TEX_UNIFIED_1D<"tex.1d.v4.s32.s32", Int32Regs, Int32Regs>;
- defm TEX_UNIFIED_1D_S32_F32
- : TEX_UNIFIED_1D<"tex.1d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_1D_U32_S32
- : TEX_UNIFIED_1D<"tex.1d.v4.u32.s32", Int32Regs, Int32Regs>;
- defm TEX_UNIFIED_1D_U32_F32
- : TEX_UNIFIED_1D<"tex.1d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_1D_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins intype:$x, intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$x\\}], $lod;",
- []>;
- multiclass TEX_UNIFIED_1D_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_1D_LEVEL_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_1D_LEVEL_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_1D_F32_F32_LEVEL
- : TEX_UNIFIED_1D_LEVEL<"tex.level.1d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_1D_S32_F32_LEVEL
- : TEX_UNIFIED_1D_LEVEL<"tex.level.1d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_1D_U32_F32_LEVEL
- : TEX_UNIFIED_1D_LEVEL<"tex.level.1d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_1D_GRAD_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins intype:$x, intype:$gradx, intype:$grady)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, \\{$x\\}], \\{$gradx\\}, \\{$grady\\};",
- []>;
- multiclass TEX_UNIFIED_1D_GRAD<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_1D_GRAD_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_1D_GRAD_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_1D_F32_F32_GRAD
- : TEX_UNIFIED_1D_GRAD<"tex.grad.1d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_1D_S32_F32_GRAD
- : TEX_UNIFIED_1D_GRAD<"tex.grad.1d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_1D_U32_F32_GRAD
- : TEX_UNIFIED_1D_GRAD<"tex.grad.1d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_1D_ARRAY_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins Int32Regs:$l, intype:$x)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$l, $x\\}];",
- []>;
- multiclass TEX_UNIFIED_1D_ARRAY<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_1D_ARRAY_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_1D_ARRAY_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_1D_ARRAY_F32_S32
- : TEX_UNIFIED_1D_ARRAY<"tex.a1d.v4.f32.s32", Float32Regs, Int32Regs>;
- defm TEX_UNIFIED_1D_ARRAY_F32_F32
- : TEX_UNIFIED_1D_ARRAY<"tex.a1d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_1D_ARRAY_S32_S32
- : TEX_UNIFIED_1D_ARRAY<"tex.a1d.v4.s32.s32", Int32Regs, Int32Regs>;
- defm TEX_UNIFIED_1D_ARRAY_S32_F32
- : TEX_UNIFIED_1D_ARRAY<"tex.a1d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_1D_ARRAY_U32_S32
- : TEX_UNIFIED_1D_ARRAY<"tex.a1d.v4.u32.s32", Int32Regs, Int32Regs>;
- defm TEX_UNIFIED_1D_ARRAY_U32_F32
- : TEX_UNIFIED_1D_ARRAY<"tex.a1d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_1D_ARRAY_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins Int32Regs:$l, intype:$x, intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$l, $x\\}], $lod;",
- []>;
- multiclass TEX_UNIFIED_1D_ARRAY_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_1D_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_1D_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_1D_ARRAY_F32_F32_LEVEL
- : TEX_UNIFIED_1D_ARRAY_LEVEL<"tex.level.a1d.v4.f32.f32",
- Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_1D_ARRAY_S32_F32_LEVEL
- : TEX_UNIFIED_1D_ARRAY_LEVEL<"tex.level.a1d.v4.s32.f32",
- Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_1D_ARRAY_U32_F32_LEVEL
- : TEX_UNIFIED_1D_ARRAY_LEVEL<"tex.level.a1d.v4.u32.f32",
- Int32Regs, Float32Regs>;
- class TEX_UNIFIED_1D_ARRAY_GRAD_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins Int32Regs:$l, intype:$x,
- intype:$gradx, intype:$grady)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, \\{$l, $x\\}], \\{$gradx\\}, \\{$grady\\};",
- []>;
- multiclass TEX_UNIFIED_1D_ARRAY_GRAD<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_1D_ARRAY_GRAD_base<inst, outtype, intype,
- (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_1D_ARRAY_GRAD_base<inst, outtype, intype,
- (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_1D_ARRAY_F32_F32_GRAD
- : TEX_UNIFIED_1D_ARRAY_GRAD<"tex.grad.a1d.v4.f32.f32",
- Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_1D_ARRAY_S32_F32_GRAD
- : TEX_UNIFIED_1D_ARRAY_GRAD<"tex.grad.a1d.v4.s32.f32",
- Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_1D_ARRAY_U32_F32_GRAD
- : TEX_UNIFIED_1D_ARRAY_GRAD<"tex.grad.a1d.v4.u32.f32",
- Int32Regs, Float32Regs>;
- class TEX_UNIFIED_2D_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins intype:$x, intype:$y)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$x, $y\\}];",
- []>;
- multiclass TEX_UNIFIED_2D<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_2D_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_2D_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_2D_F32_S32
- : TEX_UNIFIED_2D<"tex.2d.v4.f32.s32", Float32Regs, Int32Regs>;
- defm TEX_UNIFIED_2D_F32_F32
- : TEX_UNIFIED_2D<"tex.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_2D_S32_S32
- : TEX_UNIFIED_2D<"tex.2d.v4.s32.s32", Int32Regs, Int32Regs>;
- defm TEX_UNIFIED_2D_S32_F32
- : TEX_UNIFIED_2D<"tex.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_2D_U32_S32
- : TEX_UNIFIED_2D<"tex.2d.v4.u32.s32", Int32Regs, Int32Regs>;
- defm TEX_UNIFIED_2D_U32_F32
- : TEX_UNIFIED_2D<"tex.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_2D_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins intype:$x, intype:$y, intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$x, $y\\}], $lod;",
- []>;
- multiclass TEX_UNIFIED_2D_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_2D_LEVEL_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_2D_LEVEL_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_2D_F32_F32_LEVEL
- : TEX_UNIFIED_2D_LEVEL<"tex.level.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_2D_S32_F32_LEVEL
- : TEX_UNIFIED_2D_LEVEL<"tex.level.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_2D_U32_F32_LEVEL
- : TEX_UNIFIED_2D_LEVEL<"tex.level.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_2D_GRAD_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins intype:$x, intype:$y,
- intype:$gradx0, intype:$gradx1,
- intype:$grady0, intype:$grady1)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$x, $y\\}],"
- " \\{$gradx0, $gradx1\\}, \\{$grady0, $grady1\\};",
- []>;
- multiclass TEX_UNIFIED_2D_GRAD<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_2D_GRAD_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_2D_GRAD_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_2D_F32_F32_GRAD
- : TEX_UNIFIED_2D_GRAD<"tex.grad.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_2D_S32_F32_GRAD
- : TEX_UNIFIED_2D_GRAD<"tex.grad.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_2D_U32_F32_GRAD
- : TEX_UNIFIED_2D_GRAD<"tex.grad.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_2D_ARRAY_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins Int32Regs:$l, intype:$x, intype:$y)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$l, $x, $y, $y\\}];",
- []>;
- multiclass TEX_UNIFIED_2D_ARRAY<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_2D_ARRAY_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_2D_ARRAY_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_2D_ARRAY_F32_S32
- : TEX_UNIFIED_2D_ARRAY<"tex.a2d.v4.f32.s32", Float32Regs, Int32Regs>;
- defm TEX_UNIFIED_2D_ARRAY_F32_F32
- : TEX_UNIFIED_2D_ARRAY<"tex.a2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_2D_ARRAY_S32_S32
- : TEX_UNIFIED_2D_ARRAY<"tex.a2d.v4.s32.s32", Int32Regs, Int32Regs>;
- defm TEX_UNIFIED_2D_ARRAY_S32_F32
- : TEX_UNIFIED_2D_ARRAY<"tex.a2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_2D_ARRAY_U32_S32
- : TEX_UNIFIED_2D_ARRAY<"tex.a2d.v4.u32.s32", Int32Regs, Int32Regs>;
- defm TEX_UNIFIED_2D_ARRAY_U32_F32
- : TEX_UNIFIED_2D_ARRAY<"tex.a2d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_2D_ARRAY_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins Int32Regs:$l, intype:$x, intype:$y,
- intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, \\{$l, $x, $y, $y\\}], $lod;",
- []>;
- multiclass TEX_UNIFIED_2D_ARRAY_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_2D_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_2D_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_2D_ARRAY_F32_F32_LEVEL
- : TEX_UNIFIED_2D_ARRAY_LEVEL<"tex.level.a2d.v4.f32.f32",
- Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_2D_ARRAY_S32_F32_LEVEL
- : TEX_UNIFIED_2D_ARRAY_LEVEL<"tex.level.a2d.v4.s32.f32",
- Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_2D_ARRAY_U32_F32_LEVEL
- : TEX_UNIFIED_2D_ARRAY_LEVEL<"tex.level.a2d.v4.u32.f32",
- Int32Regs, Float32Regs>;
- class TEX_UNIFIED_2D_ARRAY_GRAD_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins Int32Regs:$l, intype:$x, intype:$y,
- intype:$gradx0, intype:$gradx1,
- intype:$grady0, intype:$grady1)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$l, $x, $y, $y\\}],"
- " \\{$gradx0, $gradx1\\}, \\{$grady0, $grady1\\};",
- []>;
- multiclass TEX_UNIFIED_2D_ARRAY_GRAD<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_2D_ARRAY_GRAD_base<inst, outtype, intype,
- (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_2D_ARRAY_GRAD_base<inst, outtype, intype,
- (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_2D_ARRAY_F32_F32_GRAD
- : TEX_UNIFIED_2D_ARRAY_GRAD<"tex.grad.a2d.v4.f32.f32",
- Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_2D_ARRAY_S32_F32_GRAD
- : TEX_UNIFIED_2D_ARRAY_GRAD<"tex.grad.a2d.v4.s32.f32",
- Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_2D_ARRAY_U32_F32_GRAD
- : TEX_UNIFIED_2D_ARRAY_GRAD<"tex.grad.a2d.v4.u32.f32",
- Int32Regs, Float32Regs>;
- class TEX_UNIFIED_3D_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins intype:$x, intype:$y, intype:$z)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$x, $y, $z, $z\\}];",
- []>;
- multiclass TEX_UNIFIED_3D<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_3D_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_3D_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_3D_F32_S32
- : TEX_UNIFIED_3D<"tex.3d.v4.f32.s32", Float32Regs, Int32Regs>;
- defm TEX_UNIFIED_3D_F32_F32
- : TEX_UNIFIED_3D<"tex.3d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_3D_S32_S32
- : TEX_UNIFIED_3D<"tex.3d.v4.s32.s32", Int32Regs, Int32Regs>;
- defm TEX_UNIFIED_3D_S32_F32
- : TEX_UNIFIED_3D<"tex.3d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_3D_U32_S32
- : TEX_UNIFIED_3D<"tex.3d.v4.u32.s32", Int32Regs, Int32Regs>;
- defm TEX_UNIFIED_3D_U32_F32
- : TEX_UNIFIED_3D<"tex.3d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_3D_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins intype:$x, intype:$y, intype:$z, intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, \\{$x, $y, $z, $z\\}], $lod;",
- []>;
- multiclass TEX_UNIFIED_3D_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_3D_LEVEL_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_3D_LEVEL_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_3D_F32_F32_LEVEL
- : TEX_UNIFIED_3D_LEVEL<"tex.level.3d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_3D_S32_F32_LEVEL
- : TEX_UNIFIED_3D_LEVEL<"tex.level.3d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_3D_U32_F32_LEVEL
- : TEX_UNIFIED_3D_LEVEL<"tex.level.3d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_3D_GRAD_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins intype:$x, intype:$y, intype:$z,
- intype:$gradx0, intype:$gradx1,
- intype:$gradx2, intype:$grady0,
- intype:$grady1, intype:$grady2)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$x, $y, $z, $z\\}],"
- " \\{$gradx0, $gradx1, $gradx2, $gradx2\\},"
- " \\{$grady0, $grady1, $grady2, $grady2\\};",
- []>;
- multiclass TEX_UNIFIED_3D_GRAD<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_3D_GRAD_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_3D_GRAD_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_3D_F32_F32_GRAD
- : TEX_UNIFIED_3D_GRAD<"tex.grad.3d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_3D_S32_F32_GRAD
- : TEX_UNIFIED_3D_GRAD<"tex.grad.3d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_3D_U32_F32_GRAD
- : TEX_UNIFIED_3D_GRAD<"tex.grad.3d.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_CUBE_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins intype:$x, intype:$y, intype:$z)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$x, $y, $z, $z\\}];",
- []>;
- multiclass TEX_UNIFIED_CUBE<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_CUBE_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_CUBE_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_CUBE_F32_F32
- : TEX_UNIFIED_CUBE<"tex.cube.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_CUBE_S32_F32
- : TEX_UNIFIED_CUBE<"tex.cube.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_CUBE_U32_F32
- : TEX_UNIFIED_CUBE<"tex.cube.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_CUBE_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins intype:$x, intype:$y, intype:$z, intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, \\{$x, $y, $z, $z\\}], $lod;",
- []>;
- multiclass TEX_UNIFIED_CUBE_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_CUBE_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_CUBE_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_CUBE_F32_F32_LEVEL
- : TEX_UNIFIED_CUBE_LEVEL<"tex.level.cube.v4.f32.f32",
- Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_CUBE_S32_F32_LEVEL
- : TEX_UNIFIED_CUBE_LEVEL<"tex.level.cube.v4.s32.f32",
- Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_CUBE_U32_F32_LEVEL
- : TEX_UNIFIED_CUBE_LEVEL<"tex.level.cube.v4.u32.f32",
- Int32Regs, Float32Regs>;
- class TEX_UNIFIED_CUBE_ARRAY_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins Int32Regs:$l, intype:$x, intype:$y, intype:$z)),
- inst # " \t\\{$r, $g, $b, $a\\}, [$t, \\{$l, $x, $y, $z\\}];",
- []>;
- multiclass TEX_UNIFIED_CUBE_ARRAY<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_CUBE_ARRAY_base<inst, outtype, intype,
- (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_CUBE_ARRAY_base<inst, outtype, intype,
- (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_CUBE_ARRAY_F32_F32
- : TEX_UNIFIED_CUBE_ARRAY<"tex.acube.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_CUBE_ARRAY_S32_F32
- : TEX_UNIFIED_CUBE_ARRAY<"tex.acube.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_CUBE_ARRAY_U32_F32
- : TEX_UNIFIED_CUBE_ARRAY<"tex.acube.v4.u32.f32", Int32Regs, Float32Regs>;
- class TEX_UNIFIED_CUBE_ARRAY_LEVEL_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$r, outtype:$g,
- outtype:$b, outtype:$a),
- !con(tex, (ins Int32Regs:$l, intype:$x, intype:$y, intype:$z,
- intype:$lod)),
- inst # " \t\\{$r, $g, $b, $a\\},"
- " [$t, \\{$l, $x, $y, $z\\}], $lod;",
- []>;
- multiclass TEX_UNIFIED_CUBE_ARRAY_LEVEL<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TEX_UNIFIED_CUBE_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins Int64Regs:$t)>;
- def _I : TEX_UNIFIED_CUBE_ARRAY_LEVEL_base<inst, outtype, intype,
- (ins i64imm:$t)>;
- }
- defm TEX_UNIFIED_CUBE_ARRAY_F32_F32_LEVEL
- : TEX_UNIFIED_CUBE_ARRAY_LEVEL<"tex.level.acube.v4.f32.f32",
- Float32Regs, Float32Regs>;
- defm TEX_UNIFIED_CUBE_ARRAY_S32_F32_LEVEL
- : TEX_UNIFIED_CUBE_ARRAY_LEVEL<"tex.level.acube.v4.s32.f32",
- Int32Regs, Float32Regs>;
- defm TEX_UNIFIED_CUBE_ARRAY_U32_F32_LEVEL
- : TEX_UNIFIED_CUBE_ARRAY_LEVEL<"tex.level.acube.v4.u32.f32",
- Int32Regs, Float32Regs>;
- class TLD4_UNIFIED_2D_base<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype, dag tex>
- : NVPTXInst<(outs outtype:$v0, outtype:$v1,
- outtype:$v2, outtype:$v3),
- !con(tex, (ins intype:$x, intype:$y)),
- inst # " \t\\{$v0, $v1, $v2, $v3\\}, [$t, \\{$x, $y\\}];",
- []>;
- multiclass TLD4_UNIFIED_2D<string inst, NVPTXRegClass outtype,
- NVPTXRegClass intype> {
- def _R : TLD4_UNIFIED_2D_base<inst, outtype, intype, (ins Int64Regs:$t)>;
- def _I : TLD4_UNIFIED_2D_base<inst, outtype, intype, (ins i64imm:$t)>;
- }
- defm TLD4_UNIFIED_R_2D_F32_F32
- : TLD4_UNIFIED_2D<"tld4.r.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TLD4_UNIFIED_G_2D_F32_F32
- : TLD4_UNIFIED_2D<"tld4.g.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TLD4_UNIFIED_B_2D_F32_F32
- : TLD4_UNIFIED_2D<"tld4.b.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TLD4_UNIFIED_A_2D_F32_F32
- : TLD4_UNIFIED_2D<"tld4.a.2d.v4.f32.f32", Float32Regs, Float32Regs>;
- defm TLD4_UNIFIED_R_2D_S32_F32
- : TLD4_UNIFIED_2D<"tld4.r.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TLD4_UNIFIED_G_2D_S32_F32
- : TLD4_UNIFIED_2D<"tld4.g.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TLD4_UNIFIED_B_2D_S32_F32
- : TLD4_UNIFIED_2D<"tld4.b.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TLD4_UNIFIED_A_2D_S32_F32
- : TLD4_UNIFIED_2D<"tld4.a.2d.v4.s32.f32", Int32Regs, Float32Regs>;
- defm TLD4_UNIFIED_R_2D_U32_F32
- : TLD4_UNIFIED_2D<"tld4.r.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- defm TLD4_UNIFIED_G_2D_U32_F32
- : TLD4_UNIFIED_2D<"tld4.g.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- defm TLD4_UNIFIED_B_2D_U32_F32
- : TLD4_UNIFIED_2D<"tld4.b.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- defm TLD4_UNIFIED_A_2D_U32_F32
- : TLD4_UNIFIED_2D<"tld4.a.2d.v4.u32.f32", Int32Regs, Float32Regs>;
- }
- //=== Surface load instructions
- let IsSuld = true in {
- class SULD_1D_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r),
- !con(surf, (ins Int32Regs:$x)),
- inst # " \\{$r\\}, [$s, \\{$x\\}];",
- []>;
- multiclass SULD_1D<string inst, NVPTXRegClass outtype> {
- def _R : SULD_1D_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_1D_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_1D_I8_CLAMP : SULD_1D<"suld.b.1d.b8.clamp", Int16Regs>;
- defm SULD_1D_I16_CLAMP : SULD_1D<"suld.b.1d.b16.clamp", Int16Regs>;
- defm SULD_1D_I32_CLAMP : SULD_1D<"suld.b.1d.b32.clamp", Int32Regs>;
- defm SULD_1D_I64_CLAMP : SULD_1D<"suld.b.1d.b64.clamp", Int64Regs>;
- defm SULD_1D_I8_TRAP : SULD_1D<"suld.b.1d.b8.trap", Int16Regs>;
- defm SULD_1D_I16_TRAP : SULD_1D<"suld.b.1d.b16.trap", Int16Regs>;
- defm SULD_1D_I32_TRAP : SULD_1D<"suld.b.1d.b32.trap", Int32Regs>;
- defm SULD_1D_I64_TRAP : SULD_1D<"suld.b.1d.b64.trap", Int64Regs>;
- defm SULD_1D_I8_ZERO : SULD_1D<"suld.b.1d.b8.zero", Int16Regs>;
- defm SULD_1D_I16_ZERO : SULD_1D<"suld.b.1d.b16.zero", Int16Regs>;
- defm SULD_1D_I32_ZERO : SULD_1D<"suld.b.1d.b32.zero", Int32Regs>;
- defm SULD_1D_I64_ZERO : SULD_1D<"suld.b.1d.b64.zero", Int64Regs>;
- class SULD_1D_ARRAY_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r),
- !con(surf, (ins Int32Regs:$l, Int32Regs:$x)),
- inst # " \\{$r\\}, [$s, \\{$l, $x\\}];",
- []>;
- multiclass SULD_1D_ARRAY<string inst, NVPTXRegClass outtype> {
- def _R : SULD_1D_ARRAY_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_1D_ARRAY_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_1D_ARRAY_I8_CLAMP
- : SULD_1D_ARRAY<"suld.b.a1d.b8.clamp", Int16Regs>;
- defm SULD_1D_ARRAY_I16_CLAMP
- : SULD_1D_ARRAY<"suld.b.a1d.b16.clamp", Int16Regs>;
- defm SULD_1D_ARRAY_I32_CLAMP
- : SULD_1D_ARRAY<"suld.b.a1d.b32.clamp", Int32Regs>;
- defm SULD_1D_ARRAY_I64_CLAMP
- : SULD_1D_ARRAY<"suld.b.a1d.b64.clamp", Int64Regs>;
- defm SULD_1D_ARRAY_I8_TRAP
- : SULD_1D_ARRAY<"suld.b.a1d.b8.trap", Int16Regs>;
- defm SULD_1D_ARRAY_I16_TRAP
- : SULD_1D_ARRAY<"suld.b.a1d.b16.trap", Int16Regs>;
- defm SULD_1D_ARRAY_I32_TRAP
- : SULD_1D_ARRAY<"suld.b.a1d.b32.trap", Int32Regs>;
- defm SULD_1D_ARRAY_I64_TRAP
- : SULD_1D_ARRAY<"suld.b.a1d.b64.trap", Int64Regs>;
- defm SULD_1D_ARRAY_I8_ZERO
- : SULD_1D_ARRAY<"suld.b.a1d.b8.zero", Int16Regs>;
- defm SULD_1D_ARRAY_I16_ZERO
- : SULD_1D_ARRAY<"suld.b.a1d.b16.zero", Int16Regs>;
- defm SULD_1D_ARRAY_I32_ZERO
- : SULD_1D_ARRAY<"suld.b.a1d.b32.zero", Int32Regs>;
- defm SULD_1D_ARRAY_I64_ZERO
- : SULD_1D_ARRAY<"suld.b.a1d.b64.zero", Int64Regs>;
- class SULD_2D_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r),
- !con(surf, (ins Int32Regs:$x, Int32Regs:$y)),
- inst # " \\{$r\\}, [$s, \\{$x, $y\\}];",
- []>;
- multiclass SULD_2D<string inst, NVPTXRegClass outtype> {
- def _R : SULD_2D_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_2D_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_2D_I8_CLAMP : SULD_2D<"suld.b.2d.b8.clamp", Int16Regs>;
- defm SULD_2D_I16_CLAMP : SULD_2D<"suld.b.2d.b16.clamp", Int16Regs>;
- defm SULD_2D_I32_CLAMP : SULD_2D<"suld.b.2d.b32.clamp", Int32Regs>;
- defm SULD_2D_I64_CLAMP : SULD_2D<"suld.b.2d.b64.clamp", Int64Regs>;
- defm SULD_2D_I8_TRAP : SULD_2D<"suld.b.2d.b8.trap", Int16Regs>;
- defm SULD_2D_I16_TRAP : SULD_2D<"suld.b.2d.b16.trap", Int16Regs>;
- defm SULD_2D_I32_TRAP : SULD_2D<"suld.b.2d.b32.trap", Int32Regs>;
- defm SULD_2D_I64_TRAP : SULD_2D<"suld.b.2d.b64.trap", Int64Regs>;
- defm SULD_2D_I8_ZERO : SULD_2D<"suld.b.2d.b8.zero", Int16Regs>;
- defm SULD_2D_I16_ZERO : SULD_2D<"suld.b.2d.b16.zero", Int16Regs>;
- defm SULD_2D_I32_ZERO : SULD_2D<"suld.b.2d.b32.zero", Int32Regs>;
- defm SULD_2D_I64_ZERO : SULD_2D<"suld.b.2d.b64.zero", Int64Regs>;
- class SULD_2D_ARRAY_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r),
- !con(surf, (ins Int32Regs:$l, Int32Regs:$x, Int32Regs:$y)),
- inst # " \\{$r\\}, [$s, \\{$l, $x, $y, $y\\}];",
- []>;
- multiclass SULD_2D_ARRAY<string inst, NVPTXRegClass outtype> {
- def _R : SULD_2D_ARRAY_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_2D_ARRAY_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_2D_ARRAY_I8_CLAMP : SULD_2D_ARRAY<"suld.b.a2d.b8.clamp", Int16Regs>;
- defm SULD_2D_ARRAY_I16_CLAMP : SULD_2D_ARRAY<"suld.b.a2d.b16.clamp", Int16Regs>;
- defm SULD_2D_ARRAY_I32_CLAMP : SULD_2D_ARRAY<"suld.b.a2d.b32.clamp", Int32Regs>;
- defm SULD_2D_ARRAY_I64_CLAMP : SULD_2D_ARRAY<"suld.b.a2d.b64.clamp", Int64Regs>;
- defm SULD_2D_ARRAY_I8_TRAP : SULD_2D_ARRAY<"suld.b.a2d.b8.trap", Int16Regs>;
- defm SULD_2D_ARRAY_I16_TRAP : SULD_2D_ARRAY<"suld.b.a2d.b16.trap", Int16Regs>;
- defm SULD_2D_ARRAY_I32_TRAP : SULD_2D_ARRAY<"suld.b.a2d.b32.trap", Int32Regs>;
- defm SULD_2D_ARRAY_I64_TRAP : SULD_2D_ARRAY<"suld.b.a2d.b64.trap", Int64Regs>;
- defm SULD_2D_ARRAY_I8_ZERO : SULD_2D_ARRAY<"suld.b.a2d.b8.zero", Int16Regs>;
- defm SULD_2D_ARRAY_I16_ZERO : SULD_2D_ARRAY<"suld.b.a2d.b16.zero", Int16Regs>;
- defm SULD_2D_ARRAY_I32_ZERO : SULD_2D_ARRAY<"suld.b.a2d.b32.zero", Int32Regs>;
- defm SULD_2D_ARRAY_I64_ZERO : SULD_2D_ARRAY<"suld.b.a2d.b64.zero", Int64Regs>;
- class SULD_3D_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r),
- !con(surf, (ins Int32Regs:$x, Int32Regs:$y, Int32Regs:$z)),
- inst # " \\{$r\\}, [$s, \\{$x, $y, $z, $z\\}];",
- []>;
- multiclass SULD_3D<string inst, NVPTXRegClass outtype> {
- def _R : SULD_3D_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_3D_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_3D_I8_CLAMP : SULD_3D<"suld.b.3d.b8.clamp", Int16Regs>;
- defm SULD_3D_I16_CLAMP : SULD_3D<"suld.b.3d.b16.clamp", Int16Regs>;
- defm SULD_3D_I32_CLAMP : SULD_3D<"suld.b.3d.b32.clamp", Int32Regs>;
- defm SULD_3D_I64_CLAMP : SULD_3D<"suld.b.3d.b64.clamp", Int64Regs>;
- defm SULD_3D_I8_TRAP : SULD_3D<"suld.b.3d.b8.trap", Int16Regs>;
- defm SULD_3D_I16_TRAP : SULD_3D<"suld.b.3d.b16.trap", Int16Regs>;
- defm SULD_3D_I32_TRAP : SULD_3D<"suld.b.3d.b32.trap", Int32Regs>;
- defm SULD_3D_I64_TRAP : SULD_3D<"suld.b.3d.b64.trap", Int64Regs>;
- defm SULD_3D_I8_ZERO : SULD_3D<"suld.b.3d.b8.zero", Int16Regs>;
- defm SULD_3D_I16_ZERO : SULD_3D<"suld.b.3d.b16.zero", Int16Regs>;
- defm SULD_3D_I32_ZERO : SULD_3D<"suld.b.3d.b32.zero", Int32Regs>;
- defm SULD_3D_I64_ZERO : SULD_3D<"suld.b.3d.b64.zero", Int64Regs>;
- }
- let IsSuld = 2 in {
- class SULD_1D_V2_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r, outtype:$g),
- !con(surf, (ins Int32Regs:$x)),
- inst # " \\{$r, $g\\}, [$s, \\{$x\\}];",
- []>;
- multiclass SULD_1D_V2<string inst, NVPTXRegClass outtype> {
- def _R : SULD_1D_V2_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_1D_V2_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_1D_V2I8_CLAMP : SULD_1D_V2<"suld.b.1d.v2.b8.clamp", Int16Regs>;
- defm SULD_1D_V2I16_CLAMP : SULD_1D_V2<"suld.b.1d.v2.b16.clamp", Int16Regs>;
- defm SULD_1D_V2I32_CLAMP : SULD_1D_V2<"suld.b.1d.v2.b32.clamp", Int32Regs>;
- defm SULD_1D_V2I64_CLAMP : SULD_1D_V2<"suld.b.1d.v2.b64.clamp", Int64Regs>;
- defm SULD_1D_V2I8_TRAP : SULD_1D_V2<"suld.b.1d.v2.b8.trap", Int16Regs>;
- defm SULD_1D_V2I16_TRAP : SULD_1D_V2<"suld.b.1d.v2.b16.trap", Int16Regs>;
- defm SULD_1D_V2I32_TRAP : SULD_1D_V2<"suld.b.1d.v2.b32.trap", Int32Regs>;
- defm SULD_1D_V2I64_TRAP : SULD_1D_V2<"suld.b.1d.v2.b64.trap", Int64Regs>;
- defm SULD_1D_V2I8_ZERO : SULD_1D_V2<"suld.b.1d.v2.b8.zero", Int16Regs>;
- defm SULD_1D_V2I16_ZERO : SULD_1D_V2<"suld.b.1d.v2.b16.zero", Int16Regs>;
- defm SULD_1D_V2I32_ZERO : SULD_1D_V2<"suld.b.1d.v2.b32.zero", Int32Regs>;
- defm SULD_1D_V2I64_ZERO : SULD_1D_V2<"suld.b.1d.v2.b64.zero", Int64Regs>;
- class SULD_1D_ARRAY_V2_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r, outtype:$g),
- !con(surf, (ins Int32Regs:$l, Int32Regs:$x)),
- inst # " \\{$r, $g\\}, [$s, \\{$l, $x\\}];",
- []>;
- multiclass SULD_1D_ARRAY_V2<string inst, NVPTXRegClass outtype> {
- def _R : SULD_1D_ARRAY_V2_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_1D_ARRAY_V2_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_1D_ARRAY_V2I8_CLAMP
- : SULD_1D_ARRAY_V2<"suld.b.a1d.v2.b8.clamp", Int16Regs>;
- defm SULD_1D_ARRAY_V2I16_CLAMP
- : SULD_1D_ARRAY_V2<"suld.b.a1d.v2.b16.clamp", Int16Regs>;
- defm SULD_1D_ARRAY_V2I32_CLAMP
- : SULD_1D_ARRAY_V2<"suld.b.a1d.v2.b32.clamp", Int32Regs>;
- defm SULD_1D_ARRAY_V2I64_CLAMP
- : SULD_1D_ARRAY_V2<"suld.b.a1d.v2.b64.clamp", Int64Regs>;
- defm SULD_1D_ARRAY_V2I8_TRAP
- : SULD_1D_ARRAY_V2<"suld.b.a1d.v2.b8.trap", Int16Regs>;
- defm SULD_1D_ARRAY_V2I16_TRAP
- : SULD_1D_ARRAY_V2<"suld.b.a1d.v2.b16.trap", Int16Regs>;
- defm SULD_1D_ARRAY_V2I32_TRAP
- : SULD_1D_ARRAY_V2<"suld.b.a1d.v2.b32.trap", Int32Regs>;
- defm SULD_1D_ARRAY_V2I64_TRAP
- : SULD_1D_ARRAY_V2<"suld.b.a1d.v2.b64.trap", Int64Regs>;
- defm SULD_1D_ARRAY_V2I8_ZERO
- : SULD_1D_ARRAY_V2<"suld.b.a1d.v2.b8.zero", Int16Regs>;
- defm SULD_1D_ARRAY_V2I16_ZERO
- : SULD_1D_ARRAY_V2<"suld.b.a1d.v2.b16.zero", Int16Regs>;
- defm SULD_1D_ARRAY_V2I32_ZERO
- : SULD_1D_ARRAY_V2<"suld.b.a1d.v2.b32.zero", Int32Regs>;
- defm SULD_1D_ARRAY_V2I64_ZERO
- : SULD_1D_ARRAY_V2<"suld.b.a1d.v2.b64.zero", Int64Regs>;
- class SULD_2D_V2_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r, outtype:$g),
- !con(surf, (ins Int32Regs:$x, Int32Regs:$y)),
- inst # " \\{$r, $g\\}, [$s, \\{$x, $y\\}];",
- []>;
- multiclass SULD_2D_V2<string inst, NVPTXRegClass outtype> {
- def _R : SULD_2D_V2_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_2D_V2_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_2D_V2I8_CLAMP
- : SULD_2D_V2<"suld.b.2d.v2.b8.clamp", Int16Regs>;
- defm SULD_2D_V2I16_CLAMP
- : SULD_2D_V2<"suld.b.2d.v2.b16.clamp", Int16Regs>;
- defm SULD_2D_V2I32_CLAMP
- : SULD_2D_V2<"suld.b.2d.v2.b32.clamp", Int32Regs>;
- defm SULD_2D_V2I64_CLAMP
- : SULD_2D_V2<"suld.b.2d.v2.b64.clamp", Int64Regs>;
- defm SULD_2D_V2I8_TRAP
- : SULD_2D_V2<"suld.b.2d.v2.b8.trap", Int16Regs>;
- defm SULD_2D_V2I16_TRAP
- : SULD_2D_V2<"suld.b.2d.v2.b16.trap", Int16Regs>;
- defm SULD_2D_V2I32_TRAP
- : SULD_2D_V2<"suld.b.2d.v2.b32.trap", Int32Regs>;
- defm SULD_2D_V2I64_TRAP
- : SULD_2D_V2<"suld.b.2d.v2.b64.trap", Int64Regs>;
- defm SULD_2D_V2I8_ZERO
- : SULD_2D_V2<"suld.b.2d.v2.b8.zero", Int16Regs>;
- defm SULD_2D_V2I16_ZERO
- : SULD_2D_V2<"suld.b.2d.v2.b16.zero", Int16Regs>;
- defm SULD_2D_V2I32_ZERO
- : SULD_2D_V2<"suld.b.2d.v2.b32.zero", Int32Regs>;
- defm SULD_2D_V2I64_ZERO
- : SULD_2D_V2<"suld.b.2d.v2.b64.zero", Int64Regs>;
- class SULD_2D_ARRAY_V2_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r, outtype:$g),
- !con(surf, (ins Int32Regs:$l, Int32Regs:$x, Int32Regs:$y)),
- inst # " \\{$r, $g\\}, [$s, \\{$l, $x, $y, $y\\}];",
- []>;
- multiclass SULD_2D_ARRAY_V2<string inst, NVPTXRegClass outtype> {
- def _R : SULD_2D_ARRAY_V2_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_2D_ARRAY_V2_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_2D_ARRAY_V2I8_CLAMP
- : SULD_2D_ARRAY_V2<"suld.b.a2d.v2.b8.clamp", Int16Regs>;
- defm SULD_2D_ARRAY_V2I16_CLAMP
- : SULD_2D_ARRAY_V2<"suld.b.a2d.v2.b16.clamp", Int16Regs>;
- defm SULD_2D_ARRAY_V2I32_CLAMP
- : SULD_2D_ARRAY_V2<"suld.b.a2d.v2.b32.clamp", Int32Regs>;
- defm SULD_2D_ARRAY_V2I64_CLAMP
- : SULD_2D_ARRAY_V2<"suld.b.a2d.v2.b64.clamp", Int64Regs>;
- defm SULD_2D_ARRAY_V2I8_TRAP
- : SULD_2D_ARRAY_V2<"suld.b.a2d.v2.b8.trap", Int16Regs>;
- defm SULD_2D_ARRAY_V2I16_TRAP
- : SULD_2D_ARRAY_V2<"suld.b.a2d.v2.b16.trap", Int16Regs>;
- defm SULD_2D_ARRAY_V2I32_TRAP
- : SULD_2D_ARRAY_V2<"suld.b.a2d.v2.b32.trap", Int32Regs>;
- defm SULD_2D_ARRAY_V2I64_TRAP
- : SULD_2D_ARRAY_V2<"suld.b.a2d.v2.b64.trap", Int64Regs>;
- defm SULD_2D_ARRAY_V2I8_ZERO
- : SULD_2D_ARRAY_V2<"suld.b.a2d.v2.b8.zero", Int16Regs>;
- defm SULD_2D_ARRAY_V2I16_ZERO
- : SULD_2D_ARRAY_V2<"suld.b.a2d.v2.b16.zero", Int16Regs>;
- defm SULD_2D_ARRAY_V2I32_ZERO
- : SULD_2D_ARRAY_V2<"suld.b.a2d.v2.b32.zero", Int32Regs>;
- defm SULD_2D_ARRAY_V2I64_ZERO
- : SULD_2D_ARRAY_V2<"suld.b.a2d.v2.b64.zero", Int64Regs>;
- class SULD_3D_V2_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r, outtype:$g),
- !con(surf, (ins Int32Regs:$x, Int32Regs:$y, Int32Regs:$z)),
- inst # " \\{$r, $g\\}, [$s, \\{$x, $y, $z, $z\\}];",
- []>;
- multiclass SULD_3D_V2<string inst, NVPTXRegClass outtype> {
- def _R : SULD_3D_V2_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_3D_V2_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_3D_V2I8_CLAMP : SULD_3D_V2<"suld.b.3d.v2.b8.clamp", Int16Regs>;
- defm SULD_3D_V2I16_CLAMP : SULD_3D_V2<"suld.b.3d.v2.b16.clamp", Int16Regs>;
- defm SULD_3D_V2I32_CLAMP : SULD_3D_V2<"suld.b.3d.v2.b32.clamp", Int32Regs>;
- defm SULD_3D_V2I64_CLAMP : SULD_3D_V2<"suld.b.3d.v2.b64.clamp", Int64Regs>;
- defm SULD_3D_V2I8_TRAP : SULD_3D_V2<"suld.b.3d.v2.b8.trap", Int16Regs>;
- defm SULD_3D_V2I16_TRAP : SULD_3D_V2<"suld.b.3d.v2.b16.trap", Int16Regs>;
- defm SULD_3D_V2I32_TRAP : SULD_3D_V2<"suld.b.3d.v2.b32.trap", Int32Regs>;
- defm SULD_3D_V2I64_TRAP : SULD_3D_V2<"suld.b.3d.v2.b64.trap", Int64Regs>;
- defm SULD_3D_V2I8_ZERO : SULD_3D_V2<"suld.b.3d.v2.b8.zero", Int16Regs>;
- defm SULD_3D_V2I16_ZERO : SULD_3D_V2<"suld.b.3d.v2.b16.zero", Int16Regs>;
- defm SULD_3D_V2I32_ZERO : SULD_3D_V2<"suld.b.3d.v2.b32.zero", Int32Regs>;
- defm SULD_3D_V2I64_ZERO : SULD_3D_V2<"suld.b.3d.v2.b64.zero", Int64Regs>;
- }
- let IsSuld = 3 in {
- class SULD_1D_V4_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r, outtype:$g, outtype:$b, outtype:$a),
- !con(surf, (ins Int32Regs:$x)),
- inst # " \\{$r, $g, $b, $a\\}, [$s, \\{$x\\}];",
- []>;
- multiclass SULD_1D_V4<string inst, NVPTXRegClass outtype> {
- def _R : SULD_1D_V4_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_1D_V4_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_1D_V4I8_CLAMP : SULD_1D_V4<"suld.b.1d.v4.b8.clamp", Int16Regs>;
- defm SULD_1D_V4I16_CLAMP : SULD_1D_V4<"suld.b.1d.v4.b16.clamp", Int16Regs>;
- defm SULD_1D_V4I32_CLAMP : SULD_1D_V4<"suld.b.1d.v4.b32.clamp", Int32Regs>;
- defm SULD_1D_V4I8_TRAP : SULD_1D_V4<"suld.b.1d.v4.b8.trap", Int16Regs>;
- defm SULD_1D_V4I16_TRAP : SULD_1D_V4<"suld.b.1d.v4.b16.trap", Int16Regs>;
- defm SULD_1D_V4I32_TRAP : SULD_1D_V4<"suld.b.1d.v4.b32.trap", Int32Regs>;
- defm SULD_1D_V4I8_ZERO : SULD_1D_V4<"suld.b.1d.v4.b8.zero", Int16Regs>;
- defm SULD_1D_V4I16_ZERO : SULD_1D_V4<"suld.b.1d.v4.b16.zero", Int16Regs>;
- defm SULD_1D_V4I32_ZERO : SULD_1D_V4<"suld.b.1d.v4.b32.zero", Int32Regs>;
- class SULD_1D_ARRAY_V4_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r, outtype:$g, outtype:$b, outtype:$a),
- !con(surf, (ins Int32Regs:$l, Int32Regs:$x)),
- inst # " \\{$r, $g, $b, $a\\}, [$s, \\{$l, $x\\}];",
- []>;
- multiclass SULD_1D_ARRAY_V4<string inst, NVPTXRegClass outtype> {
- def _R : SULD_1D_ARRAY_V4_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_1D_ARRAY_V4_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_1D_ARRAY_V4I8_CLAMP
- : SULD_1D_ARRAY_V4<"suld.b.a1d.v4.b8.clamp", Int16Regs>;
- defm SULD_1D_ARRAY_V4I16_CLAMP
- : SULD_1D_ARRAY_V4<"suld.b.a1d.v4.b16.clamp", Int16Regs>;
- defm SULD_1D_ARRAY_V4I32_CLAMP
- : SULD_1D_ARRAY_V4<"suld.b.a1d.v4.b32.clamp", Int32Regs>;
- defm SULD_1D_ARRAY_V4I8_TRAP
- : SULD_1D_ARRAY_V4<"suld.b.a1d.v4.b8.trap", Int16Regs>;
- defm SULD_1D_ARRAY_V4I16_TRAP
- : SULD_1D_ARRAY_V4<"suld.b.a1d.v4.b16.trap", Int16Regs>;
- defm SULD_1D_ARRAY_V4I32_TRAP
- : SULD_1D_ARRAY_V4<"suld.b.a1d.v4.b32.trap", Int32Regs>;
- defm SULD_1D_ARRAY_V4I8_ZERO
- : SULD_1D_ARRAY_V4<"suld.b.a1d.v4.b8.zero", Int16Regs>;
- defm SULD_1D_ARRAY_V4I16_ZERO
- : SULD_1D_ARRAY_V4<"suld.b.a1d.v4.b16.zero", Int16Regs>;
- defm SULD_1D_ARRAY_V4I32_ZERO
- : SULD_1D_ARRAY_V4<"suld.b.a1d.v4.b32.zero", Int32Regs>;
- class SULD_2D_V4_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r, outtype:$g, outtype:$b, outtype:$a),
- !con(surf, (ins Int32Regs:$x, Int32Regs:$y)),
- inst # " \\{$r, $g, $b, $a\\}, [$s, \\{$x, $y\\}];",
- []>;
- multiclass SULD_2D_V4<string inst, NVPTXRegClass outtype> {
- def _R : SULD_2D_V4_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_2D_V4_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_2D_V4I8_CLAMP : SULD_2D_V4<"suld.b.2d.v4.b8.clamp", Int16Regs>;
- defm SULD_2D_V4I16_CLAMP : SULD_2D_V4<"suld.b.2d.v4.b16.clamp", Int16Regs>;
- defm SULD_2D_V4I32_CLAMP : SULD_2D_V4<"suld.b.2d.v4.b32.clamp", Int32Regs>;
- defm SULD_2D_V4I8_TRAP : SULD_2D_V4<"suld.b.2d.v4.b8.trap", Int16Regs>;
- defm SULD_2D_V4I16_TRAP : SULD_2D_V4<"suld.b.2d.v4.b16.trap", Int16Regs>;
- defm SULD_2D_V4I32_TRAP : SULD_2D_V4<"suld.b.2d.v4.b32.trap", Int32Regs>;
- defm SULD_2D_V4I8_ZERO : SULD_2D_V4<"suld.b.2d.v4.b8.zero", Int16Regs>;
- defm SULD_2D_V4I16_ZERO : SULD_2D_V4<"suld.b.2d.v4.b16.zero", Int16Regs>;
- defm SULD_2D_V4I32_ZERO : SULD_2D_V4<"suld.b.2d.v4.b32.zero", Int32Regs>;
- class SULD_2D_ARRAY_V4_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r, outtype:$g, outtype:$b, outtype:$a),
- !con(surf, (ins Int32Regs:$l, Int32Regs:$x, Int32Regs:$y)),
- inst # " \\{$r, $g, $b, $a\\}, [$s, \\{$l, $x, $y, $y\\}];",
- []>;
- multiclass SULD_2D_ARRAY_V4<string inst, NVPTXRegClass outtype> {
- def _R : SULD_2D_ARRAY_V4_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_2D_ARRAY_V4_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_2D_ARRAY_V4I8_CLAMP
- : SULD_2D_ARRAY_V4<"suld.b.a2d.v4.b8.clamp", Int16Regs>;
- defm SULD_2D_ARRAY_V4I16_CLAMP
- : SULD_2D_ARRAY_V4<"suld.b.a2d.v4.b16.clamp", Int16Regs>;
- defm SULD_2D_ARRAY_V4I32_CLAMP
- : SULD_2D_ARRAY_V4<"suld.b.a2d.v4.b32.clamp", Int32Regs>;
- defm SULD_2D_ARRAY_V4I8_TRAP
- : SULD_2D_ARRAY_V4<"suld.b.a2d.v4.b8.trap", Int16Regs>;
- defm SULD_2D_ARRAY_V4I16_TRAP
- : SULD_2D_ARRAY_V4<"suld.b.a2d.v4.b16.trap", Int16Regs>;
- defm SULD_2D_ARRAY_V4I32_TRAP
- : SULD_2D_ARRAY_V4<"suld.b.a2d.v4.b32.trap", Int32Regs>;
- defm SULD_2D_ARRAY_V4I8_ZERO
- : SULD_2D_ARRAY_V4<"suld.b.a2d.v4.b8.zero", Int16Regs>;
- defm SULD_2D_ARRAY_V4I16_ZERO
- : SULD_2D_ARRAY_V4<"suld.b.a2d.v4.b16.zero", Int16Regs>;
- defm SULD_2D_ARRAY_V4I32_ZERO
- : SULD_2D_ARRAY_V4<"suld.b.a2d.v4.b32.zero", Int32Regs>;
- class SULD_3D_V4_base<string inst, NVPTXRegClass outtype, dag surf>
- : NVPTXInst<(outs outtype:$r, outtype:$g, outtype:$b, outtype:$a),
- !con(surf, (ins Int32Regs:$x, Int32Regs:$y, Int32Regs:$z)),
- inst # " \\{$r, $g, $b, $a\\}, [$s, \\{$x, $y, $z, $z\\}];",
- []>;
- multiclass SULD_3D_V4<string inst, NVPTXRegClass outtype> {
- def _R : SULD_3D_V4_base<inst, outtype, (ins Int64Regs:$s)>;
- def _I : SULD_3D_V4_base<inst, outtype, (ins i64imm:$s)>;
- }
- defm SULD_3D_V4I8_CLAMP : SULD_3D_V4<"suld.b.3d.v4.b8.clamp", Int16Regs>;
- defm SULD_3D_V4I16_CLAMP : SULD_3D_V4<"suld.b.3d.v4.b16.clamp", Int16Regs>;
- defm SULD_3D_V4I32_CLAMP : SULD_3D_V4<"suld.b.3d.v4.b32.clamp", Int32Regs>;
- defm SULD_3D_V4I8_TRAP : SULD_3D_V4<"suld.b.3d.v4.b8.trap", Int16Regs>;
- defm SULD_3D_V4I16_TRAP : SULD_3D_V4<"suld.b.3d.v4.b16.trap", Int16Regs>;
- defm SULD_3D_V4I32_TRAP : SULD_3D_V4<"suld.b.3d.v4.b32.trap", Int32Regs>;
- defm SULD_3D_V4I8_ZERO : SULD_3D_V4<"suld.b.3d.v4.b8.zero", Int16Regs>;
- defm SULD_3D_V4I16_ZERO : SULD_3D_V4<"suld.b.3d.v4.b16.zero", Int16Regs>;
- defm SULD_3D_V4I32_ZERO : SULD_3D_V4<"suld.b.3d.v4.b32.zero", Int32Regs>;
- }
- //-----------------------------------
- // Texture Query Intrinsics
- //-----------------------------------
- let IsSurfTexQuery = true in {
- def TXQ_CHANNEL_ORDER_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "txq.channel_order.b32 \t$d, [$a];",
- []>;
- def TXQ_CHANNEL_ORDER_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "txq.channel_order.b32 \t$d, [$a];",
- []>;
- def TXQ_CHANNEL_DATA_TYPE_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "txq.channel_data_type.b32 \t$d, [$a];",
- []>;
- def TXQ_CHANNEL_DATA_TYPE_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "txq.channel_data_type.b32 \t$d, [$a];",
- []>;
- def TXQ_WIDTH_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "txq.width.b32 \t$d, [$a];",
- []>;
- def TXQ_WIDTH_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "txq.width.b32 \t$d, [$a];",
- []>;
- def TXQ_HEIGHT_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "txq.height.b32 \t$d, [$a];",
- []>;
- def TXQ_HEIGHT_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "txq.height.b32 \t$d, [$a];",
- []>;
- def TXQ_DEPTH_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "txq.depth.b32 \t$d, [$a];",
- []>;
- def TXQ_DEPTH_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "txq.depth.b32 \t$d, [$a];",
- []>;
- def TXQ_ARRAY_SIZE_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "txq.array_size.b32 \t$d, [$a];",
- []>;
- def TXQ_ARRAY_SIZE_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "txq.array_size.b32 \t$d, [$a];",
- []>;
- def TXQ_NUM_SAMPLES_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "txq.num_samples.b32 \t$d, [$a];",
- []>;
- def TXQ_NUM_SAMPLES_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "txq.num_samples.b32 \t$d, [$a];",
- []>;
- def TXQ_NUM_MIPMAP_LEVELS_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "txq.num_mipmap_levels.b32 \t$d, [$a];",
- []>;
- def TXQ_NUM_MIPMAP_LEVELS_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "txq.num_mipmap_levels.b32 \t$d, [$a];",
- []>;
- }
- def : Pat<(int_nvvm_txq_channel_order Int64Regs:$a),
- (TXQ_CHANNEL_ORDER_R Int64Regs:$a)>;
- def : Pat<(int_nvvm_txq_channel_data_type Int64Regs:$a),
- (TXQ_CHANNEL_DATA_TYPE_R Int64Regs:$a)>;
- def : Pat<(int_nvvm_txq_width Int64Regs:$a),
- (TXQ_WIDTH_R Int64Regs:$a)>;
- def : Pat<(int_nvvm_txq_height Int64Regs:$a),
- (TXQ_HEIGHT_R Int64Regs:$a)>;
- def : Pat<(int_nvvm_txq_depth Int64Regs:$a),
- (TXQ_DEPTH_R Int64Regs:$a)>;
- def : Pat<(int_nvvm_txq_array_size Int64Regs:$a),
- (TXQ_ARRAY_SIZE_R Int64Regs:$a)>;
- def : Pat<(int_nvvm_txq_num_samples Int64Regs:$a),
- (TXQ_NUM_SAMPLES_R Int64Regs:$a)>;
- def : Pat<(int_nvvm_txq_num_mipmap_levels Int64Regs:$a),
- (TXQ_NUM_MIPMAP_LEVELS_R Int64Regs:$a)>;
- //-----------------------------------
- // Surface Query Intrinsics
- //-----------------------------------
- let IsSurfTexQuery = true in {
- def SUQ_CHANNEL_ORDER_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "suq.channel_order.b32 \t$d, [$a];",
- []>;
- def SUQ_CHANNEL_ORDER_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "suq.channel_order.b32 \t$d, [$a];",
- []>;
- def SUQ_CHANNEL_DATA_TYPE_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "suq.channel_data_type.b32 \t$d, [$a];",
- []>;
- def SUQ_CHANNEL_DATA_TYPE_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "suq.channel_data_type.b32 \t$d, [$a];",
- []>;
- def SUQ_WIDTH_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "suq.width.b32 \t$d, [$a];",
- []>;
- def SUQ_WIDTH_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "suq.width.b32 \t$d, [$a];",
- []>;
- def SUQ_HEIGHT_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "suq.height.b32 \t$d, [$a];",
- []>;
- def SUQ_HEIGHT_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "suq.height.b32 \t$d, [$a];",
- []>;
- def SUQ_DEPTH_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "suq.depth.b32 \t$d, [$a];",
- []>;
- def SUQ_DEPTH_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "suq.depth.b32 \t$d, [$a];",
- []>;
- def SUQ_ARRAY_SIZE_R
- : NVPTXInst<(outs Int32Regs:$d), (ins Int64Regs:$a),
- "suq.array_size.b32 \t$d, [$a];",
- []>;
- def SUQ_ARRAY_SIZE_I
- : NVPTXInst<(outs Int32Regs:$d), (ins i64imm:$a),
- "suq.array_size.b32 \t$d, [$a];",
- []>;
- }
- def : Pat<(int_nvvm_suq_channel_order Int64Regs:$a),
- (SUQ_CHANNEL_ORDER_R Int64Regs:$a)>;
- def : Pat<(int_nvvm_suq_channel_data_type Int64Regs:$a),
- (SUQ_CHANNEL_DATA_TYPE_R Int64Regs:$a)>;
- def : Pat<(int_nvvm_suq_width Int64Regs:$a),
- (SUQ_WIDTH_R Int64Regs:$a)>;
- def : Pat<(int_nvvm_suq_height Int64Regs:$a),
- (SUQ_HEIGHT_R Int64Regs:$a)>;
- def : Pat<(int_nvvm_suq_depth Int64Regs:$a),
- (SUQ_DEPTH_R Int64Regs:$a)>;
- def : Pat<(int_nvvm_suq_array_size Int64Regs:$a),
- (SUQ_ARRAY_SIZE_R Int64Regs:$a)>;
- //===- Handle Query -------------------------------------------------------===//
- // TODO: These intrinsics are not yet finalized, pending PTX ISA design work
- def ISTYPEP_SAMPLER
- : NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
- "istypep.samplerref \t$d, $a;",
- [(set Int1Regs:$d, (int_nvvm_istypep_sampler Int64Regs:$a))]>;
- def ISTYPEP_SURFACE
- : NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
- "istypep.surfref \t$d, $a;",
- [(set Int1Regs:$d, (int_nvvm_istypep_surface Int64Regs:$a))]>;
- def ISTYPEP_TEXTURE
- : NVPTXInst<(outs Int1Regs:$d), (ins Int64Regs:$a),
- "istypep.texref \t$d, $a;",
- [(set Int1Regs:$d, (int_nvvm_istypep_texture Int64Regs:$a))]>;
- //===- Surface Stores -----------------------------------------------------===//
- let IsSust = true in {
- class SUST_1D_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$x, intype:$r)),
- inst # " \t[$s, \\{$x\\}], \\{$r\\};",
- []>;
- multiclass SUST_1D<string inst, NVPTXRegClass intype> {
- def _R : SUST_1D_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_1D_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_1D_B8_CLAMP : SUST_1D<"sust.b.1d.b8.clamp", Int16Regs>;
- defm SUST_B_1D_B16_CLAMP : SUST_1D<"sust.b.1d.b16.clamp", Int16Regs>;
- defm SUST_B_1D_B32_CLAMP : SUST_1D<"sust.b.1d.b32.clamp", Int32Regs>;
- defm SUST_B_1D_B64_CLAMP : SUST_1D<"sust.b.1d.b64.clamp", Int64Regs>;
- defm SUST_B_1D_B8_TRAP : SUST_1D<"sust.b.1d.b8.trap", Int16Regs>;
- defm SUST_B_1D_B16_TRAP : SUST_1D<"sust.b.1d.b16.trap", Int16Regs>;
- defm SUST_B_1D_B32_TRAP : SUST_1D<"sust.b.1d.b32.trap", Int32Regs>;
- defm SUST_B_1D_B64_TRAP : SUST_1D<"sust.b.1d.b64.trap", Int64Regs>;
- defm SUST_B_1D_B8_ZERO : SUST_1D<"sust.b.1d.b8.zero", Int16Regs>;
- defm SUST_B_1D_B16_ZERO : SUST_1D<"sust.b.1d.b16.zero", Int16Regs>;
- defm SUST_B_1D_B32_ZERO : SUST_1D<"sust.b.1d.b32.zero", Int32Regs>;
- defm SUST_B_1D_B64_ZERO : SUST_1D<"sust.b.1d.b64.zero", Int64Regs>;
- defm SUST_P_1D_B8_TRAP : SUST_1D<"sust.p.1d.b8.trap", Int16Regs>;
- defm SUST_P_1D_B16_TRAP : SUST_1D<"sust.p.1d.b16.trap", Int16Regs>;
- defm SUST_P_1D_B32_TRAP : SUST_1D<"sust.p.1d.b32.trap", Int32Regs>;
- class SUST_1D_V2_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$x, intype:$r, intype:$g)),
- inst # " \t[$s, \\{$x\\}], \\{$r, $g\\};",
- []>;
- multiclass SUST_1D_V2<string inst, NVPTXRegClass intype> {
- def _R : SUST_1D_V2_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_1D_V2_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_1D_V2B8_CLAMP : SUST_1D_V2<"sust.b.1d.v2.b8.clamp", Int16Regs>;
- defm SUST_B_1D_V2B16_CLAMP : SUST_1D_V2<"sust.b.1d.v2.b16.clamp", Int16Regs>;
- defm SUST_B_1D_V2B32_CLAMP : SUST_1D_V2<"sust.b.1d.v2.b32.clamp", Int32Regs>;
- defm SUST_B_1D_V2B64_CLAMP : SUST_1D_V2<"sust.b.1d.v2.b64.clamp", Int64Regs>;
- defm SUST_B_1D_V2B8_TRAP : SUST_1D_V2<"sust.b.1d.v2.b8.trap", Int16Regs>;
- defm SUST_B_1D_V2B16_TRAP : SUST_1D_V2<"sust.b.1d.v2.b16.trap", Int16Regs>;
- defm SUST_B_1D_V2B32_TRAP : SUST_1D_V2<"sust.b.1d.v2.b32.trap", Int32Regs>;
- defm SUST_B_1D_V2B64_TRAP : SUST_1D_V2<"sust.b.1d.v2.b64.trap", Int64Regs>;
- defm SUST_B_1D_V2B8_ZERO : SUST_1D_V2<"sust.b.1d.v2.b8.zero", Int16Regs>;
- defm SUST_B_1D_V2B16_ZERO : SUST_1D_V2<"sust.b.1d.v2.b16.zero", Int16Regs>;
- defm SUST_B_1D_V2B32_ZERO : SUST_1D_V2<"sust.b.1d.v2.b32.zero", Int32Regs>;
- defm SUST_B_1D_V2B64_ZERO : SUST_1D_V2<"sust.b.1d.v2.b64.zero", Int64Regs>;
- defm SUST_P_1D_V2B8_TRAP : SUST_1D_V2<"sust.p.1d.v2.b8.trap", Int16Regs>;
- defm SUST_P_1D_V2B16_TRAP : SUST_1D_V2<"sust.p.1d.v2.b16.trap", Int16Regs>;
- defm SUST_P_1D_V2B32_TRAP : SUST_1D_V2<"sust.p.1d.v2.b32.trap", Int32Regs>;
- class SUST_1D_V4_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$x, intype:$r, intype:$g,
- intype:$b, intype:$a)),
- inst # " \t[$s, \\{$x\\}], \\{$r, $g, $b, $a\\};",
- []>;
- multiclass SUST_1D_V4<string inst, NVPTXRegClass intype> {
- def _R : SUST_1D_V4_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_1D_V4_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_1D_V4B8_CLAMP : SUST_1D_V4<"sust.b.1d.v4.b8.clamp", Int16Regs>;
- defm SUST_B_1D_V4B16_CLAMP : SUST_1D_V4<"sust.b.1d.v4.b16.clamp", Int16Regs>;
- defm SUST_B_1D_V4B32_CLAMP : SUST_1D_V4<"sust.b.1d.v4.b32.clamp", Int32Regs>;
- defm SUST_B_1D_V4B8_TRAP : SUST_1D_V4<"sust.b.1d.v4.b8.trap", Int16Regs>;
- defm SUST_B_1D_V4B16_TRAP : SUST_1D_V4<"sust.b.1d.v4.b16.trap", Int16Regs>;
- defm SUST_B_1D_V4B32_TRAP : SUST_1D_V4<"sust.b.1d.v4.b32.trap", Int32Regs>;
- defm SUST_B_1D_V4B8_ZERO : SUST_1D_V4<"sust.b.1d.v4.b8.zero", Int16Regs>;
- defm SUST_B_1D_V4B16_ZERO : SUST_1D_V4<"sust.b.1d.v4.b16.zero", Int16Regs>;
- defm SUST_B_1D_V4B32_ZERO : SUST_1D_V4<"sust.b.1d.v4.b32.zero", Int32Regs>;
- defm SUST_P_1D_V4B8_TRAP : SUST_1D_V4<"sust.p.1d.v4.b8.trap", Int16Regs>;
- defm SUST_P_1D_V4B16_TRAP : SUST_1D_V4<"sust.p.1d.v4.b16.trap", Int16Regs>;
- defm SUST_P_1D_V4B32_TRAP : SUST_1D_V4<"sust.p.1d.v4.b32.trap", Int32Regs>;
- class SUST_1D_ARRAY_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$idx, Int32Regs:$x, intype:$r)),
- inst # " \t[$s, \\{$idx, $x\\}], \\{$r\\};",
- []>;
- multiclass SUST_1D_ARRAY<string inst, NVPTXRegClass intype> {
- def _R : SUST_1D_ARRAY_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_1D_ARRAY_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_1D_ARRAY_B8_CLAMP
- : SUST_1D_ARRAY<"sust.b.a1d.b8.clamp", Int16Regs>;
- defm SUST_B_1D_ARRAY_B16_CLAMP
- : SUST_1D_ARRAY<"sust.b.a1d.b16.clamp", Int16Regs>;
- defm SUST_B_1D_ARRAY_B32_CLAMP
- : SUST_1D_ARRAY<"sust.b.a1d.b32.clamp", Int32Regs>;
- defm SUST_B_1D_ARRAY_B64_CLAMP
- : SUST_1D_ARRAY<"sust.b.a1d.b64.clamp", Int64Regs>;
- defm SUST_B_1D_ARRAY_B8_TRAP
- : SUST_1D_ARRAY<"sust.b.a1d.b8.trap", Int16Regs>;
- defm SUST_B_1D_ARRAY_B16_TRAP
- : SUST_1D_ARRAY<"sust.b.a1d.b16.trap", Int16Regs>;
- defm SUST_B_1D_ARRAY_B32_TRAP
- : SUST_1D_ARRAY<"sust.b.a1d.b32.trap", Int32Regs>;
- defm SUST_B_1D_ARRAY_B64_TRAP
- : SUST_1D_ARRAY<"sust.b.a1d.b64.trap", Int64Regs>;
- defm SUST_B_1D_ARRAY_B8_ZERO
- : SUST_1D_ARRAY<"sust.b.a1d.b8.zero", Int16Regs>;
- defm SUST_B_1D_ARRAY_B16_ZERO
- : SUST_1D_ARRAY<"sust.b.a1d.b16.zero", Int16Regs>;
- defm SUST_B_1D_ARRAY_B32_ZERO
- : SUST_1D_ARRAY<"sust.b.a1d.b32.zero", Int32Regs>;
- defm SUST_B_1D_ARRAY_B64_ZERO
- : SUST_1D_ARRAY<"sust.b.a1d.b64.zero", Int64Regs>;
- defm SUST_P_1D_ARRAY_B8_TRAP
- : SUST_1D_ARRAY<"sust.p.a1d.b8.trap", Int16Regs>;
- defm SUST_P_1D_ARRAY_B16_TRAP
- : SUST_1D_ARRAY<"sust.p.a1d.b16.trap", Int16Regs>;
- defm SUST_P_1D_ARRAY_B32_TRAP
- : SUST_1D_ARRAY<"sust.p.a1d.b32.trap", Int32Regs>;
- class SUST_1D_ARRAY_V2_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$idx, Int32Regs:$x,
- intype:$r, intype:$g)),
- inst # " \t[$s, \\{$idx, $x\\}], \\{$r, $g\\};",
- []>;
- multiclass SUST_1D_ARRAY_V2<string inst, NVPTXRegClass intype> {
- def _R : SUST_1D_ARRAY_V2_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_1D_ARRAY_V2_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_1D_ARRAY_V2B8_CLAMP
- : SUST_1D_ARRAY_V2<"sust.b.a1d.v2.b8.clamp", Int16Regs>;
- defm SUST_B_1D_ARRAY_V2B16_CLAMP
- : SUST_1D_ARRAY_V2<"sust.b.a1d.v2.b16.clamp", Int16Regs>;
- defm SUST_B_1D_ARRAY_V2B32_CLAMP
- : SUST_1D_ARRAY_V2<"sust.b.a1d.v2.b32.clamp", Int32Regs>;
- defm SUST_B_1D_ARRAY_V2B64_CLAMP
- : SUST_1D_ARRAY_V2<"sust.b.a1d.v2.b64.clamp", Int64Regs>;
- defm SUST_B_1D_ARRAY_V2B8_TRAP
- : SUST_1D_ARRAY_V2<"sust.b.a1d.v2.b8.trap", Int16Regs>;
- defm SUST_B_1D_ARRAY_V2B16_TRAP
- : SUST_1D_ARRAY_V2<"sust.b.a1d.v2.b16.trap", Int16Regs>;
- defm SUST_B_1D_ARRAY_V2B32_TRAP
- : SUST_1D_ARRAY_V2<"sust.b.a1d.v2.b32.trap", Int32Regs>;
- defm SUST_B_1D_ARRAY_V2B64_TRAP
- : SUST_1D_ARRAY_V2<"sust.b.a1d.v2.b64.trap", Int64Regs>;
- defm SUST_B_1D_ARRAY_V2B8_ZERO
- : SUST_1D_ARRAY_V2<"sust.b.a1d.v2.b8.zero", Int16Regs>;
- defm SUST_B_1D_ARRAY_V2B16_ZERO
- : SUST_1D_ARRAY_V2<"sust.b.a1d.v2.b16.zero", Int16Regs>;
- defm SUST_B_1D_ARRAY_V2B32_ZERO
- : SUST_1D_ARRAY_V2<"sust.b.a1d.v2.b32.zero", Int32Regs>;
- defm SUST_B_1D_ARRAY_V2B64_ZERO
- : SUST_1D_ARRAY_V2<"sust.b.a1d.v2.b64.zero", Int64Regs>;
- defm SUST_P_1D_ARRAY_V2B8_TRAP
- : SUST_1D_ARRAY_V2<"sust.p.a1d.v2.b8.trap", Int16Regs>;
- defm SUST_P_1D_ARRAY_V2B16_TRAP
- : SUST_1D_ARRAY_V2<"sust.p.a1d.v2.b16.trap", Int16Regs>;
- defm SUST_P_1D_ARRAY_V2B32_TRAP
- : SUST_1D_ARRAY_V2<"sust.p.a1d.v2.b32.trap", Int32Regs>;
- class SUST_1D_ARRAY_V4_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$idx, Int32Regs:$x,
- intype:$r, intype:$g, intype:$b, intype:$a)),
- inst # " \t[$s, \\{$idx, $x\\}], \\{$r, $g, $b, $a\\};",
- []>;
- multiclass SUST_1D_ARRAY_V4<string inst, NVPTXRegClass intype> {
- def _R : SUST_1D_ARRAY_V4_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_1D_ARRAY_V4_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_1D_ARRAY_V4B8_CLAMP
- : SUST_1D_ARRAY_V4<"sust.b.a1d.v4.b8.clamp", Int16Regs>;
- defm SUST_B_1D_ARRAY_V4B16_CLAMP
- : SUST_1D_ARRAY_V4<"sust.b.a1d.v4.b16.clamp", Int16Regs>;
- defm SUST_B_1D_ARRAY_V4B32_CLAMP
- : SUST_1D_ARRAY_V4<"sust.b.a1d.v4.b32.clamp", Int32Regs>;
- defm SUST_B_1D_ARRAY_V4B8_TRAP
- : SUST_1D_ARRAY_V4<"sust.b.a1d.v4.b8.trap", Int16Regs>;
- defm SUST_B_1D_ARRAY_V4B16_TRAP
- : SUST_1D_ARRAY_V4<"sust.b.a1d.v4.b16.trap", Int16Regs>;
- defm SUST_B_1D_ARRAY_V4B32_TRAP
- : SUST_1D_ARRAY_V4<"sust.b.a1d.v4.b32.trap", Int32Regs>;
- defm SUST_B_1D_ARRAY_V4B8_ZERO
- : SUST_1D_ARRAY_V4<"sust.b.a1d.v4.b8.zero", Int16Regs>;
- defm SUST_B_1D_ARRAY_V4B16_ZERO
- : SUST_1D_ARRAY_V4<"sust.b.a1d.v4.b16.zero", Int16Regs>;
- defm SUST_B_1D_ARRAY_V4B32_ZERO
- : SUST_1D_ARRAY_V4<"sust.b.a1d.v4.b32.zero", Int32Regs>;
- defm SUST_P_1D_ARRAY_V4B8_TRAP
- : SUST_1D_ARRAY_V4<"sust.p.a1d.v4.b8.trap", Int16Regs>;
- defm SUST_P_1D_ARRAY_V4B16_TRAP
- : SUST_1D_ARRAY_V4<"sust.p.a1d.v4.b16.trap", Int16Regs>;
- defm SUST_P_1D_ARRAY_V4B32_TRAP
- : SUST_1D_ARRAY_V4<"sust.p.a1d.v4.b32.trap", Int32Regs>;
- class SUST_2D_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$x, Int32Regs:$y, intype:$r)),
- inst # " \t[$s, \\{$x, $y\\}], \\{$r\\};",
- []>;
- multiclass SUST_2D<string inst, NVPTXRegClass intype> {
- def _R : SUST_2D_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_2D_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_2D_B8_CLAMP : SUST_2D<"sust.b.2d.b8.clamp", Int16Regs>;
- defm SUST_B_2D_B16_CLAMP : SUST_2D<"sust.b.2d.b16.clamp", Int16Regs>;
- defm SUST_B_2D_B32_CLAMP : SUST_2D<"sust.b.2d.b32.clamp", Int32Regs>;
- defm SUST_B_2D_B64_CLAMP : SUST_2D<"sust.b.2d.b64.clamp", Int64Regs>;
- defm SUST_B_2D_B8_TRAP : SUST_2D<"sust.b.2d.b8.trap", Int16Regs>;
- defm SUST_B_2D_B16_TRAP : SUST_2D<"sust.b.2d.b16.trap", Int16Regs>;
- defm SUST_B_2D_B32_TRAP : SUST_2D<"sust.b.2d.b32.trap", Int32Regs>;
- defm SUST_B_2D_B64_TRAP : SUST_2D<"sust.b.2d.b64.trap", Int64Regs>;
- defm SUST_B_2D_B8_ZERO : SUST_2D<"sust.b.2d.b8.zero", Int16Regs>;
- defm SUST_B_2D_B16_ZERO : SUST_2D<"sust.b.2d.b16.zero", Int16Regs>;
- defm SUST_B_2D_B32_ZERO : SUST_2D<"sust.b.2d.b32.zero", Int32Regs>;
- defm SUST_B_2D_B64_ZERO : SUST_2D<"sust.b.2d.b64.zero", Int64Regs>;
- defm SUST_P_2D_B8_TRAP : SUST_2D<"sust.p.2d.b8.trap", Int16Regs>;
- defm SUST_P_2D_B16_TRAP : SUST_2D<"sust.p.2d.b16.trap", Int16Regs>;
- defm SUST_P_2D_B32_TRAP : SUST_2D<"sust.p.2d.b32.trap", Int32Regs>;
- class SUST_2D_V2_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$x, Int32Regs:$y,
- intype:$r, intype:$g)),
- inst # " \t[$s, \\{$x, $y\\}], \\{$r, $g\\};",
- []>;
- multiclass SUST_2D_V2<string inst, NVPTXRegClass intype> {
- def _R : SUST_2D_V2_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_2D_V2_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_2D_V2B8_CLAMP : SUST_2D_V2<"sust.b.2d.v2.b8.clamp", Int16Regs>;
- defm SUST_B_2D_V2B16_CLAMP : SUST_2D_V2<"sust.b.2d.v2.b16.clamp", Int16Regs>;
- defm SUST_B_2D_V2B32_CLAMP : SUST_2D_V2<"sust.b.2d.v2.b32.clamp", Int32Regs>;
- defm SUST_B_2D_V2B64_CLAMP : SUST_2D_V2<"sust.b.2d.v2.b64.clamp", Int64Regs>;
- defm SUST_B_2D_V2B8_TRAP : SUST_2D_V2<"sust.b.2d.v2.b8.trap", Int16Regs>;
- defm SUST_B_2D_V2B16_TRAP : SUST_2D_V2<"sust.b.2d.v2.b16.trap", Int16Regs>;
- defm SUST_B_2D_V2B32_TRAP : SUST_2D_V2<"sust.b.2d.v2.b32.trap", Int32Regs>;
- defm SUST_B_2D_V2B64_TRAP : SUST_2D_V2<"sust.b.2d.v2.b64.trap", Int64Regs>;
- defm SUST_B_2D_V2B8_ZERO : SUST_2D_V2<"sust.b.2d.v2.b8.zero", Int16Regs>;
- defm SUST_B_2D_V2B16_ZERO : SUST_2D_V2<"sust.b.2d.v2.b16.zero", Int16Regs>;
- defm SUST_B_2D_V2B32_ZERO : SUST_2D_V2<"sust.b.2d.v2.b32.zero", Int32Regs>;
- defm SUST_B_2D_V2B64_ZERO : SUST_2D_V2<"sust.b.2d.v2.b64.zero", Int64Regs>;
- defm SUST_P_2D_V2B8_TRAP : SUST_2D_V2<"sust.p.2d.v2.b8.trap", Int16Regs>;
- defm SUST_P_2D_V2B16_TRAP : SUST_2D_V2<"sust.p.2d.v2.b16.trap", Int16Regs>;
- defm SUST_P_2D_V2B32_TRAP : SUST_2D_V2<"sust.p.2d.v2.b32.trap", Int32Regs>;
- class SUST_2D_V4_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$x, Int32Regs:$y,
- intype:$r, intype:$g, intype:$b, intype:$a)),
- inst # " \t[$s, \\{$x, $y\\}], \\{$r, $g, $b, $a\\};",
- []>;
- multiclass SUST_2D_V4<string inst, NVPTXRegClass intype> {
- def _R : SUST_2D_V4_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_2D_V4_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_2D_V4B8_CLAMP : SUST_2D_V4<"sust.b.2d.v4.b8.clamp", Int16Regs>;
- defm SUST_B_2D_V4B16_CLAMP : SUST_2D_V4<"sust.b.2d.v4.b16.clamp", Int16Regs>;
- defm SUST_B_2D_V4B32_CLAMP : SUST_2D_V4<"sust.b.2d.v4.b32.clamp", Int32Regs>;
- defm SUST_B_2D_V4B8_TRAP : SUST_2D_V4<"sust.b.2d.v4.b8.trap", Int16Regs>;
- defm SUST_B_2D_V4B16_TRAP : SUST_2D_V4<"sust.b.2d.v4.b16.trap", Int16Regs>;
- defm SUST_B_2D_V4B32_TRAP : SUST_2D_V4<"sust.b.2d.v4.b32.trap", Int32Regs>;
- defm SUST_B_2D_V4B8_ZERO : SUST_2D_V4<"sust.b.2d.v4.b8.zero", Int16Regs>;
- defm SUST_B_2D_V4B16_ZERO : SUST_2D_V4<"sust.b.2d.v4.b16.zero", Int16Regs>;
- defm SUST_B_2D_V4B32_ZERO : SUST_2D_V4<"sust.b.2d.v4.b32.zero", Int32Regs>;
- defm SUST_P_2D_V4B8_TRAP : SUST_2D_V4<"sust.p.2d.v4.b8.trap", Int16Regs>;
- defm SUST_P_2D_V4B16_TRAP : SUST_2D_V4<"sust.p.2d.v4.b16.trap", Int16Regs>;
- defm SUST_P_2D_V4B32_TRAP : SUST_2D_V4<"sust.p.2d.v4.b32.trap", Int32Regs>;
- class SUST_2D_ARRAY_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$idx, Int32Regs:$x, Int32Regs:$y,
- intype:$r)),
- inst # " \t[$s, \\{$idx, $x, $y, $y\\}], \\{$r\\};",
- []>;
- multiclass SUST_2D_ARRAY<string inst, NVPTXRegClass intype> {
- def _R : SUST_2D_ARRAY_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_2D_ARRAY_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_2D_ARRAY_B8_CLAMP
- : SUST_2D_ARRAY<"sust.b.a2d.b8.clamp", Int16Regs>;
- defm SUST_B_2D_ARRAY_B16_CLAMP
- : SUST_2D_ARRAY<"sust.b.a2d.b16.clamp", Int16Regs>;
- defm SUST_B_2D_ARRAY_B32_CLAMP
- : SUST_2D_ARRAY<"sust.b.a2d.b32.clamp", Int32Regs>;
- defm SUST_B_2D_ARRAY_B64_CLAMP
- : SUST_2D_ARRAY<"sust.b.a2d.b64.clamp", Int64Regs>;
- defm SUST_B_2D_ARRAY_B8_TRAP
- : SUST_2D_ARRAY<"sust.b.a2d.b8.trap", Int16Regs>;
- defm SUST_B_2D_ARRAY_B16_TRAP
- : SUST_2D_ARRAY<"sust.b.a2d.b16.trap", Int16Regs>;
- defm SUST_B_2D_ARRAY_B32_TRAP
- : SUST_2D_ARRAY<"sust.b.a2d.b32.trap", Int32Regs>;
- defm SUST_B_2D_ARRAY_B64_TRAP
- : SUST_2D_ARRAY<"sust.b.a2d.b64.trap", Int64Regs>;
- defm SUST_B_2D_ARRAY_B8_ZERO
- : SUST_2D_ARRAY<"sust.b.a2d.b8.zero", Int16Regs>;
- defm SUST_B_2D_ARRAY_B16_ZERO
- : SUST_2D_ARRAY<"sust.b.a2d.b16.zero", Int16Regs>;
- defm SUST_B_2D_ARRAY_B32_ZERO
- : SUST_2D_ARRAY<"sust.b.a2d.b32.zero", Int32Regs>;
- defm SUST_B_2D_ARRAY_B64_ZERO
- : SUST_2D_ARRAY<"sust.b.a2d.b64.zero", Int64Regs>;
- defm SUST_P_2D_ARRAY_B8_TRAP
- : SUST_2D_ARRAY<"sust.p.a2d.b8.trap", Int16Regs>;
- defm SUST_P_2D_ARRAY_B16_TRAP
- : SUST_2D_ARRAY<"sust.p.a2d.b16.trap", Int16Regs>;
- defm SUST_P_2D_ARRAY_B32_TRAP
- : SUST_2D_ARRAY<"sust.p.a2d.b32.trap", Int32Regs>;
- class SUST_2D_ARRAY_V2_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$idx, Int32Regs:$x, Int32Regs:$y,
- intype:$r, intype:$g)),
- inst # " \t[$s, \\{$idx, $x, $y, $y\\}], \\{$r, $g\\};",
- []>;
- multiclass SUST_2D_ARRAY_V2<string inst, NVPTXRegClass intype> {
- def _R : SUST_2D_ARRAY_V2_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_2D_ARRAY_V2_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_2D_ARRAY_V2B8_CLAMP
- : SUST_2D_ARRAY_V2<"sust.b.a2d.v2.b8.clamp", Int16Regs>;
- defm SUST_B_2D_ARRAY_V2B16_CLAMP
- : SUST_2D_ARRAY_V2<"sust.b.a2d.v2.b16.clamp", Int16Regs>;
- defm SUST_B_2D_ARRAY_V2B32_CLAMP
- : SUST_2D_ARRAY_V2<"sust.b.a2d.v2.b32.clamp", Int32Regs>;
- defm SUST_B_2D_ARRAY_V2B64_CLAMP
- : SUST_2D_ARRAY_V2<"sust.b.a2d.v2.b64.clamp", Int64Regs>;
- defm SUST_B_2D_ARRAY_V2B8_TRAP
- : SUST_2D_ARRAY_V2<"sust.b.a2d.v2.b8.trap", Int16Regs>;
- defm SUST_B_2D_ARRAY_V2B16_TRAP
- : SUST_2D_ARRAY_V2<"sust.b.a2d.v2.b16.trap", Int16Regs>;
- defm SUST_B_2D_ARRAY_V2B32_TRAP
- : SUST_2D_ARRAY_V2<"sust.b.a2d.v2.b32.trap", Int32Regs>;
- defm SUST_B_2D_ARRAY_V2B64_TRAP
- : SUST_2D_ARRAY_V2<"sust.b.a2d.v2.b64.trap", Int64Regs>;
- defm SUST_B_2D_ARRAY_V2B8_ZERO
- : SUST_2D_ARRAY_V2<"sust.b.a2d.v2.b8.zero", Int16Regs>;
- defm SUST_B_2D_ARRAY_V2B16_ZERO
- : SUST_2D_ARRAY_V2<"sust.b.a2d.v2.b16.zero", Int16Regs>;
- defm SUST_B_2D_ARRAY_V2B32_ZERO
- : SUST_2D_ARRAY_V2<"sust.b.a2d.v2.b32.zero", Int32Regs>;
- defm SUST_B_2D_ARRAY_V2B64_ZERO
- : SUST_2D_ARRAY_V2<"sust.b.a2d.v2.b64.zero", Int64Regs>;
- defm SUST_P_2D_ARRAY_V2B8_TRAP
- : SUST_2D_ARRAY_V2<"sust.p.a2d.v2.b8.trap", Int16Regs>;
- defm SUST_P_2D_ARRAY_V2B16_TRAP
- : SUST_2D_ARRAY_V2<"sust.p.a2d.v2.b16.trap", Int16Regs>;
- defm SUST_P_2D_ARRAY_V2B32_TRAP
- : SUST_2D_ARRAY_V2<"sust.p.a2d.v2.b32.trap", Int32Regs>;
- class SUST_2D_ARRAY_V4_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$idx, Int32Regs:$x, Int32Regs:$y,
- intype:$r, intype:$g, intype:$b, intype:$a)),
- inst # " \t[$s, \\{$idx, $x, $y, $y\\}], \\{$r, $g, $b, $a\\};",
- []>;
- multiclass SUST_2D_ARRAY_V4<string inst, NVPTXRegClass intype> {
- def _R : SUST_2D_ARRAY_V4_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_2D_ARRAY_V4_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_2D_ARRAY_V4B8_CLAMP
- : SUST_2D_ARRAY_V4<"sust.b.a2d.v4.b8.clamp", Int16Regs>;
- defm SUST_B_2D_ARRAY_V4B16_CLAMP
- : SUST_2D_ARRAY_V4<"sust.b.a2d.v4.b16.clamp", Int16Regs>;
- defm SUST_B_2D_ARRAY_V4B32_CLAMP
- : SUST_2D_ARRAY_V4<"sust.b.a2d.v4.b32.clamp", Int32Regs>;
- defm SUST_B_2D_ARRAY_V4B8_TRAP
- : SUST_2D_ARRAY_V4<"sust.b.a2d.v4.b8.trap", Int16Regs>;
- defm SUST_B_2D_ARRAY_V4B16_TRAP
- : SUST_2D_ARRAY_V4<"sust.b.a2d.v4.b16.trap", Int16Regs>;
- defm SUST_B_2D_ARRAY_V4B32_TRAP
- : SUST_2D_ARRAY_V4<"sust.b.a2d.v4.b32.trap", Int32Regs>;
- defm SUST_B_2D_ARRAY_V4B8_ZERO
- : SUST_2D_ARRAY_V4<"sust.b.a2d.v4.b8.zero", Int16Regs>;
- defm SUST_B_2D_ARRAY_V4B16_ZERO
- : SUST_2D_ARRAY_V4<"sust.b.a2d.v4.b16.zero", Int16Regs>;
- defm SUST_B_2D_ARRAY_V4B32_ZERO
- : SUST_2D_ARRAY_V4<"sust.b.a2d.v4.b32.zero", Int32Regs>;
- defm SUST_P_2D_ARRAY_V4B8_TRAP
- : SUST_2D_ARRAY_V4<"sust.p.a2d.v4.b8.trap", Int16Regs>;
- defm SUST_P_2D_ARRAY_V4B16_TRAP
- : SUST_2D_ARRAY_V4<"sust.p.a2d.v4.b16.trap", Int16Regs>;
- defm SUST_P_2D_ARRAY_V4B32_TRAP
- : SUST_2D_ARRAY_V4<"sust.p.a2d.v4.b32.trap", Int32Regs>;
- class SUST_3D_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- intype:$r)),
- inst # " \t[$s, \\{$x, $y, $z, $z\\}], \\{$r\\};",
- []>;
- multiclass SUST_3D<string inst, NVPTXRegClass intype> {
- def _R : SUST_3D_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_3D_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_3D_B8_CLAMP : SUST_3D<"sust.b.3d.b8.clamp", Int16Regs>;
- defm SUST_B_3D_B16_CLAMP : SUST_3D<"sust.b.3d.b16.clamp", Int16Regs>;
- defm SUST_B_3D_B32_CLAMP : SUST_3D<"sust.b.3d.b32.clamp", Int32Regs>;
- defm SUST_B_3D_B64_CLAMP : SUST_3D<"sust.b.3d.b64.clamp", Int64Regs>;
- defm SUST_B_3D_B8_TRAP : SUST_3D<"sust.b.3d.b8.trap", Int16Regs>;
- defm SUST_B_3D_B16_TRAP : SUST_3D<"sust.b.3d.b16.trap", Int16Regs>;
- defm SUST_B_3D_B32_TRAP : SUST_3D<"sust.b.3d.b32.trap", Int32Regs>;
- defm SUST_B_3D_B64_TRAP : SUST_3D<"sust.b.3d.b64.trap", Int64Regs>;
- defm SUST_B_3D_B8_ZERO : SUST_3D<"sust.b.3d.b8.zero", Int16Regs>;
- defm SUST_B_3D_B16_ZERO : SUST_3D<"sust.b.3d.b16.zero", Int16Regs>;
- defm SUST_B_3D_B32_ZERO : SUST_3D<"sust.b.3d.b32.zero", Int32Regs>;
- defm SUST_B_3D_B64_ZERO : SUST_3D<"sust.b.3d.b64.zero", Int64Regs>;
- defm SUST_P_3D_B8_TRAP : SUST_3D<"sust.p.3d.b8.trap", Int16Regs>;
- defm SUST_P_3D_B16_TRAP : SUST_3D<"sust.p.3d.b16.trap", Int16Regs>;
- defm SUST_P_3D_B32_TRAP : SUST_3D<"sust.p.3d.b32.trap", Int32Regs>;
- class SUST_3D_V2_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- intype:$r, intype:$g)),
- inst # " \t[$s, \\{$x, $y, $z, $z\\}], \\{$r, $g\\};",
- []>;
- multiclass SUST_3D_V2<string inst, NVPTXRegClass intype> {
- def _R : SUST_3D_V2_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_3D_V2_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_3D_V2B8_CLAMP : SUST_3D_V2<"sust.b.3d.v2.b8.clamp", Int16Regs>;
- defm SUST_B_3D_V2B16_CLAMP : SUST_3D_V2<"sust.b.3d.v2.b16.clamp", Int16Regs>;
- defm SUST_B_3D_V2B32_CLAMP : SUST_3D_V2<"sust.b.3d.v2.b32.clamp", Int32Regs>;
- defm SUST_B_3D_V2B64_CLAMP : SUST_3D_V2<"sust.b.3d.v2.b64.clamp", Int64Regs>;
- defm SUST_B_3D_V2B8_TRAP : SUST_3D_V2<"sust.b.3d.v2.b8.trap", Int16Regs>;
- defm SUST_B_3D_V2B16_TRAP : SUST_3D_V2<"sust.b.3d.v2.b16.trap", Int16Regs>;
- defm SUST_B_3D_V2B32_TRAP : SUST_3D_V2<"sust.b.3d.v2.b32.trap", Int32Regs>;
- defm SUST_B_3D_V2B64_TRAP : SUST_3D_V2<"sust.b.3d.v2.b64.trap", Int64Regs>;
- defm SUST_B_3D_V2B8_ZERO : SUST_3D_V2<"sust.b.3d.v2.b8.zero", Int16Regs>;
- defm SUST_B_3D_V2B16_ZERO : SUST_3D_V2<"sust.b.3d.v2.b16.zero", Int16Regs>;
- defm SUST_B_3D_V2B32_ZERO : SUST_3D_V2<"sust.b.3d.v2.b32.zero", Int32Regs>;
- defm SUST_B_3D_V2B64_ZERO : SUST_3D_V2<"sust.b.3d.v2.b64.zero", Int64Regs>;
- defm SUST_P_3D_V2B8_TRAP : SUST_3D_V2<"sust.p.3d.v2.b8.trap", Int16Regs>;
- defm SUST_P_3D_V2B16_TRAP : SUST_3D_V2<"sust.p.3d.v2.b16.trap", Int16Regs>;
- defm SUST_P_3D_V2B32_TRAP : SUST_3D_V2<"sust.p.3d.v2.b32.trap", Int32Regs>;
- class SUST_3D_V4_base<string inst, NVPTXRegClass intype, dag surf>
- : NVPTXInst<(outs),
- !con(surf, (ins Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- intype:$r, intype:$g, intype:$b, intype:$a)),
- inst # " \t[$s, \\{$x, $y, $z, $z\\}], \\{$r, $g, $b, $a\\};",
- []>;
- multiclass SUST_3D_V4<string inst, NVPTXRegClass intype> {
- def _R : SUST_3D_V4_base<inst, intype, (ins Int64Regs:$s)>;
- def _I : SUST_3D_V4_base<inst, intype, (ins i64imm:$s)>;
- }
- defm SUST_B_3D_V4B8_CLAMP : SUST_3D_V4<"sust.b.3d.v4.b8.clamp", Int16Regs>;
- defm SUST_B_3D_V4B16_CLAMP : SUST_3D_V4<"sust.b.3d.v4.b16.clamp", Int16Regs>;
- defm SUST_B_3D_V4B32_CLAMP : SUST_3D_V4<"sust.b.3d.v4.b32.clamp", Int32Regs>;
- defm SUST_B_3D_V4B8_TRAP : SUST_3D_V4<"sust.b.3d.v4.b8.trap", Int16Regs>;
- defm SUST_B_3D_V4B16_TRAP : SUST_3D_V4<"sust.b.3d.v4.b16.trap", Int16Regs>;
- defm SUST_B_3D_V4B32_TRAP : SUST_3D_V4<"sust.b.3d.v4.b32.trap", Int32Regs>;
- defm SUST_B_3D_V4B8_ZERO : SUST_3D_V4<"sust.b.3d.v4.b8.zero", Int16Regs>;
- defm SUST_B_3D_V4B16_ZERO : SUST_3D_V4<"sust.b.3d.v4.b16.zero", Int16Regs>;
- defm SUST_B_3D_V4B32_ZERO : SUST_3D_V4<"sust.b.3d.v4.b32.zero", Int32Regs>;
- defm SUST_P_3D_V4B8_TRAP : SUST_3D_V4<"sust.p.3d.v4.b8.trap", Int16Regs>;
- defm SUST_P_3D_V4B16_TRAP : SUST_3D_V4<"sust.p.3d.v4.b16.trap", Int16Regs>;
- defm SUST_P_3D_V4B32_TRAP : SUST_3D_V4<"sust.p.3d.v4.b32.trap", Int32Regs>;
- }
- // Surface store instruction patterns
- // I'm not sure why we can't just include these in the instruction definitions,
- // but TableGen complains of type errors :(
- // .clamp variant
- def : Pat<(int_nvvm_sust_b_1d_i8_clamp
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r),
- (SUST_B_1D_B8_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_i16_clamp
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r),
- (SUST_B_1D_B16_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_i32_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$r),
- (SUST_B_1D_B32_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_i64_clamp
- Int64Regs:$s, Int32Regs:$x, Int64Regs:$r),
- (SUST_B_1D_B64_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_v2i8_clamp
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_1D_V2B8_CLAMP_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_v2i16_clamp
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_1D_V2B16_CLAMP_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_v2i32_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$r, Int32Regs:$g),
- (SUST_B_1D_V2B32_CLAMP_R Int64Regs:$s, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_v2i64_clamp
- Int64Regs:$s, Int32Regs:$x, Int64Regs:$r, Int64Regs:$g),
- (SUST_B_1D_V2B64_CLAMP_R Int64Regs:$s, Int32Regs:$x,
- Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_v4i8_clamp
- Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_1D_V4B8_CLAMP_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_v4i16_clamp
- Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_1D_V4B16_CLAMP_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_v4i32_clamp
- Int64Regs:$s, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_1D_V4B32_CLAMP_R Int64Regs:$s, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_array_i8_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r),
- (SUST_B_1D_ARRAY_B8_CLAMP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_array_i16_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r),
- (SUST_B_1D_ARRAY_B16_CLAMP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_array_i32_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$r),
- (SUST_B_1D_ARRAY_B32_CLAMP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_array_i64_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int64Regs:$r),
- (SUST_B_1D_ARRAY_B64_CLAMP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v2i8_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_1D_ARRAY_V2B8_CLAMP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v2i16_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_1D_ARRAY_V2B16_CLAMP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v2i32_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$r, Int32Regs:$g),
- (SUST_B_1D_ARRAY_V2B32_CLAMP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v2i64_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int64Regs:$r, Int64Regs:$g),
- (SUST_B_1D_ARRAY_V2B64_CLAMP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v4i8_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_1D_ARRAY_V4B8_CLAMP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v4i16_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_1D_ARRAY_V4B16_CLAMP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v4i32_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_1D_ARRAY_V4B32_CLAMP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_i8_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_B_2D_B8_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_i16_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_B_2D_B16_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_i32_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r),
- (SUST_B_2D_B32_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_i64_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int64Regs:$r),
- (SUST_B_2D_B64_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_v2i8_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_2D_V2B8_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_v2i16_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_2D_V2B16_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_v2i32_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r, Int32Regs:$g),
- (SUST_B_2D_V2B32_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_v2i64_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int64Regs:$r, Int64Regs:$g),
- (SUST_B_2D_V2B64_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_v4i8_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_2D_V4B8_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_v4i16_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_2D_V4B16_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_v4i32_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_2D_V4B32_CLAMP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_array_i8_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_B_2D_ARRAY_B8_CLAMP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_array_i16_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_B_2D_ARRAY_B16_CLAMP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_array_i32_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r),
- (SUST_B_2D_ARRAY_B32_CLAMP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_array_i64_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int64Regs:$r),
- (SUST_B_2D_ARRAY_B64_CLAMP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v2i8_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_B_2D_ARRAY_V2B8_CLAMP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v2i16_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_B_2D_ARRAY_V2B16_CLAMP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v2i32_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r,
- Int32Regs:$g),
- (SUST_B_2D_ARRAY_V2B32_CLAMP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v2i64_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int64Regs:$r,
- Int64Regs:$g),
- (SUST_B_2D_ARRAY_V2B64_CLAMP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y, Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v4i8_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_2D_ARRAY_V4B8_CLAMP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v4i16_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_2D_ARRAY_V4B16_CLAMP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v4i32_clamp
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_2D_ARRAY_V4B32_CLAMP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_3d_i8_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r),
- (SUST_B_3D_B8_CLAMP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_3d_i16_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r),
- (SUST_B_3D_B16_CLAMP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_3d_i32_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r),
- (SUST_B_3D_B32_CLAMP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_3d_i64_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int64Regs:$r),
- (SUST_B_3D_B64_CLAMP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_3d_v2i8_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_B_3D_V2B8_CLAMP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_3d_v2i16_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_B_3D_V2B16_CLAMP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_3d_v2i32_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g),
- (SUST_B_3D_V2B32_CLAMP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_3d_v2i64_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int64Regs:$r, Int64Regs:$g),
- (SUST_B_3D_V2B64_CLAMP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_3d_v4i8_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_3D_V4B8_CLAMP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_3d_v4i16_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_3D_V4B16_CLAMP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_3d_v4i32_clamp
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_3D_V4B32_CLAMP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- // .trap variant
- def : Pat<(int_nvvm_sust_b_1d_i8_trap
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r),
- (SUST_B_1D_B8_TRAP_R Int64Regs:$s, Int32Regs:$x, Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_i16_trap
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r),
- (SUST_B_1D_B16_TRAP_R Int64Regs:$s, Int32Regs:$x, Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$r),
- (SUST_B_1D_B32_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_i64_trap
- Int64Regs:$s, Int32Regs:$x, Int64Regs:$r),
- (SUST_B_1D_B64_TRAP_R Int64Regs:$s, Int32Regs:$x, Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_v2i8_trap
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_1D_V2B8_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_v2i16_trap
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_1D_V2B16_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_v2i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$r, Int32Regs:$g),
- (SUST_B_1D_V2B32_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_v2i64_trap
- Int64Regs:$s, Int32Regs:$x, Int64Regs:$r, Int64Regs:$g),
- (SUST_B_1D_V2B64_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_v4i8_trap
- Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_1D_V4B8_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_v4i16_trap
- Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_1D_V4B16_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_v4i32_trap
- Int64Regs:$s, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_1D_V4B32_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_array_i8_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r),
- (SUST_B_1D_ARRAY_B8_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_array_i16_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r),
- (SUST_B_1D_ARRAY_B16_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_array_i32_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$r),
- (SUST_B_1D_ARRAY_B32_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_array_i64_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int64Regs:$r),
- (SUST_B_1D_ARRAY_B64_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v2i8_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_1D_ARRAY_V2B8_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v2i16_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_1D_ARRAY_V2B16_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v2i32_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$r, Int32Regs:$g),
- (SUST_B_1D_ARRAY_V2B32_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v2i64_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int64Regs:$r, Int64Regs:$g),
- (SUST_B_1D_ARRAY_V2B64_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v4i8_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_1D_ARRAY_V4B8_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v4i16_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_1D_ARRAY_V4B16_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v4i32_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_1D_ARRAY_V4B32_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_i8_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_B_2D_B8_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_i16_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_B_2D_B16_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r),
- (SUST_B_2D_B32_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_i64_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int64Regs:$r),
- (SUST_B_2D_B64_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_v2i8_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_2D_V2B8_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_v2i16_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_2D_V2B16_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_v2i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r, Int32Regs:$g),
- (SUST_B_2D_V2B32_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_v2i64_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int64Regs:$r, Int64Regs:$g),
- (SUST_B_2D_V2B64_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_v4i8_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_2D_V4B8_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_v4i16_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_2D_V4B16_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_v4i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_2D_V4B32_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_array_i8_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_B_2D_ARRAY_B8_TRAP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_array_i16_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_B_2D_ARRAY_B16_TRAP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_array_i32_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r),
- (SUST_B_2D_ARRAY_B32_TRAP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_array_i64_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int64Regs:$r),
- (SUST_B_2D_ARRAY_B64_TRAP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v2i8_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_B_2D_ARRAY_V2B8_TRAP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v2i16_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_B_2D_ARRAY_V2B16_TRAP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v2i32_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r,
- Int32Regs:$g),
- (SUST_B_2D_ARRAY_V2B32_TRAP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v2i64_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int64Regs:$r,
- Int64Regs:$g),
- (SUST_B_2D_ARRAY_V2B64_TRAP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y, Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v4i8_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_2D_ARRAY_V4B8_TRAP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v4i16_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_2D_ARRAY_V4B16_TRAP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v4i32_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_2D_ARRAY_V4B32_TRAP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_3d_i8_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r),
- (SUST_B_3D_B8_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_3d_i16_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r),
- (SUST_B_3D_B16_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_3d_i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r),
- (SUST_B_3D_B32_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_3d_i64_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int64Regs:$r),
- (SUST_B_3D_B64_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_3d_v2i8_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_B_3D_V2B8_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_3d_v2i16_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_B_3D_V2B16_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_3d_v2i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g),
- (SUST_B_3D_V2B32_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_3d_v2i64_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int64Regs:$r, Int64Regs:$g),
- (SUST_B_3D_V2B64_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_3d_v4i8_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_3D_V4B8_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_3d_v4i16_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_3D_V4B16_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_3d_v4i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_3D_V4B32_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- // .zero variant
- def : Pat<(int_nvvm_sust_b_1d_i8_zero
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r),
- (SUST_B_1D_B8_ZERO_R Int64Regs:$s, Int32Regs:$x, Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_i16_zero
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r),
- (SUST_B_1D_B16_ZERO_R Int64Regs:$s, Int32Regs:$x, Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_i32_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$r),
- (SUST_B_1D_B32_ZERO_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_i64_zero
- Int64Regs:$s, Int32Regs:$x, Int64Regs:$r),
- (SUST_B_1D_B64_ZERO_R Int64Regs:$s, Int32Regs:$x, Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_v2i8_zero
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_1D_V2B8_ZERO_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_v2i16_zero
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_1D_V2B16_ZERO_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_v2i32_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$r, Int32Regs:$g),
- (SUST_B_1D_V2B32_ZERO_R Int64Regs:$s, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_v2i64_zero
- Int64Regs:$s, Int32Regs:$x, Int64Regs:$r, Int64Regs:$g),
- (SUST_B_1D_V2B64_ZERO_R Int64Regs:$s, Int32Regs:$x,
- Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_v4i8_zero
- Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_1D_V4B8_ZERO_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_v4i16_zero
- Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_1D_V4B16_ZERO_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_v4i32_zero
- Int64Regs:$s, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_1D_V4B32_ZERO_R Int64Regs:$s, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_array_i8_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r),
- (SUST_B_1D_ARRAY_B8_ZERO_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_array_i16_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r),
- (SUST_B_1D_ARRAY_B16_ZERO_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_array_i32_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$r),
- (SUST_B_1D_ARRAY_B32_ZERO_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_array_i64_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int64Regs:$r),
- (SUST_B_1D_ARRAY_B64_ZERO_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v2i8_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_1D_ARRAY_V2B8_ZERO_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v2i16_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_1D_ARRAY_V2B16_ZERO_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v2i32_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$r, Int32Regs:$g),
- (SUST_B_1D_ARRAY_V2B32_ZERO_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v2i64_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int64Regs:$r, Int64Regs:$g),
- (SUST_B_1D_ARRAY_V2B64_ZERO_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v4i8_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_1D_ARRAY_V4B8_ZERO_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v4i16_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_1D_ARRAY_V4B16_ZERO_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_1d_array_v4i32_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_1D_ARRAY_V4B32_ZERO_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_i8_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_B_2D_B8_ZERO_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_i16_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_B_2D_B16_ZERO_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_i32_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r),
- (SUST_B_2D_B32_ZERO_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_i64_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int64Regs:$r),
- (SUST_B_2D_B64_ZERO_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_v2i8_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_2D_V2B8_ZERO_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_v2i16_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r, Int16Regs:$g),
- (SUST_B_2D_V2B16_ZERO_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_v2i32_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r, Int32Regs:$g),
- (SUST_B_2D_V2B32_ZERO_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_v2i64_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int64Regs:$r, Int64Regs:$g),
- (SUST_B_2D_V2B64_ZERO_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_v4i8_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_2D_V4B8_ZERO_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_v4i16_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_2D_V4B16_ZERO_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_v4i32_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_2D_V4B32_ZERO_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_array_i8_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_B_2D_ARRAY_B8_ZERO_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_array_i16_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_B_2D_ARRAY_B16_ZERO_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_array_i32_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r),
- (SUST_B_2D_ARRAY_B32_ZERO_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_array_i64_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int64Regs:$r),
- (SUST_B_2D_ARRAY_B64_ZERO_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v2i8_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_B_2D_ARRAY_V2B8_ZERO_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v2i16_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_B_2D_ARRAY_V2B16_ZERO_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v2i32_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r,
- Int32Regs:$g),
- (SUST_B_2D_ARRAY_V2B32_ZERO_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v2i64_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int64Regs:$r,
- Int64Regs:$g),
- (SUST_B_2D_ARRAY_V2B64_ZERO_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y, Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v4i8_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_2D_ARRAY_V4B8_ZERO_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v4i16_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_2D_ARRAY_V4B16_ZERO_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_2d_array_v4i32_zero
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_2D_ARRAY_V4B32_ZERO_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_3d_i8_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r),
- (SUST_B_3D_B8_ZERO_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_3d_i16_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r),
- (SUST_B_3D_B16_ZERO_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_3d_i32_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r),
- (SUST_B_3D_B32_ZERO_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_3d_i64_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int64Regs:$r),
- (SUST_B_3D_B64_ZERO_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int64Regs:$r)>;
- def : Pat<(int_nvvm_sust_b_3d_v2i8_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_B_3D_V2B8_ZERO_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_3d_v2i16_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_B_3D_V2B16_ZERO_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_3d_v2i32_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g),
- (SUST_B_3D_V2B32_ZERO_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_3d_v2i64_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int64Regs:$r, Int64Regs:$g),
- (SUST_B_3D_V2B64_ZERO_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int64Regs:$r, Int64Regs:$g)>;
- def : Pat<(int_nvvm_sust_b_3d_v4i8_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_3D_V4B8_ZERO_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_3d_v4i16_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_B_3D_V4B16_ZERO_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_b_3d_v4i32_zero
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_B_3D_V4B32_ZERO_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_1d_i8_trap
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r),
- (SUST_P_1D_B8_TRAP_R Int64Regs:$s, Int32Regs:$x, Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_1d_i16_trap
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r),
- (SUST_P_1D_B16_TRAP_R Int64Regs:$s, Int32Regs:$x, Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_1d_i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$r),
- (SUST_P_1D_B32_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_1d_v2i8_trap
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_P_1D_V2B8_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_1d_v2i16_trap
- Int64Regs:$s, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_P_1D_V2B16_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_1d_v2i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$r, Int32Regs:$g),
- (SUST_P_1D_V2B32_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_1d_v4i8_trap
- Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_P_1D_V4B8_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_1d_v4i16_trap
- Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_P_1D_V4B16_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_1d_v4i32_trap
- Int64Regs:$s, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_P_1D_V4B32_TRAP_R Int64Regs:$s, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_1d_array_i8_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r),
- (SUST_P_1D_ARRAY_B8_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_1d_array_i16_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r),
- (SUST_P_1D_ARRAY_B16_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_1d_array_i32_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$r),
- (SUST_P_1D_ARRAY_B32_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_1d_array_v2i8_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_P_1D_ARRAY_V2B8_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_1d_array_v2i16_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int16Regs:$r, Int16Regs:$g),
- (SUST_P_1D_ARRAY_V2B16_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_1d_array_v2i32_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$r, Int32Regs:$g),
- (SUST_P_1D_ARRAY_V2B32_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_1d_array_v4i8_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_P_1D_ARRAY_V4B8_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_1d_array_v4i16_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_P_1D_ARRAY_V4B16_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_1d_array_v4i32_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_P_1D_ARRAY_V4B32_TRAP_R Int64Regs:$s, Int32Regs:$l, Int32Regs:$x,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_2d_i8_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_P_2D_B8_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_2d_i16_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_P_2D_B16_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_2d_i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r),
- (SUST_P_2D_B32_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_2d_v2i8_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r, Int16Regs:$g),
- (SUST_P_2D_V2B8_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_2d_v2i16_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r, Int16Regs:$g),
- (SUST_P_2D_V2B16_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_2d_v2i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r, Int32Regs:$g),
- (SUST_P_2D_V2B32_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_2d_v4i8_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_P_2D_V4B8_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_2d_v4i16_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_P_2D_V4B16_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_2d_v4i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_P_2D_V4B32_TRAP_R Int64Regs:$s, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_2d_array_i8_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_P_2D_ARRAY_B8_TRAP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_2d_array_i16_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int16Regs:$r),
- (SUST_P_2D_ARRAY_B16_TRAP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_2d_array_i32_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r),
- (SUST_P_2D_ARRAY_B32_TRAP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_2d_array_v2i8_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_P_2D_ARRAY_V2B8_TRAP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_2d_array_v2i16_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_P_2D_ARRAY_V2B16_TRAP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_2d_array_v2i32_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y, Int32Regs:$r,
- Int32Regs:$g),
- (SUST_P_2D_ARRAY_V2B32_TRAP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_2d_array_v4i8_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_P_2D_ARRAY_V4B8_TRAP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_2d_array_v4i16_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_P_2D_ARRAY_V4B16_TRAP_R Int64Regs:$s,
- Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_2d_array_v4i32_trap
- Int64Regs:$s, Int32Regs:$l, Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_P_2D_ARRAY_V4B32_TRAP_R Int64Regs:$s, Int32Regs:$l,
- Int32Regs:$x, Int32Regs:$y,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_3d_i8_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r),
- (SUST_P_3D_B8_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_3d_i16_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r),
- (SUST_P_3D_B16_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_3d_i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r),
- (SUST_P_3D_B32_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r)>;
- def : Pat<(int_nvvm_sust_p_3d_v2i8_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_P_3D_V2B8_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_3d_v2i16_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g),
- (SUST_P_3D_V2B16_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_3d_v2i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g),
- (SUST_P_3D_V2B32_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g)>;
- def : Pat<(int_nvvm_sust_p_3d_v4i8_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_P_3D_V4B8_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_3d_v4i16_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a),
- (SUST_P_3D_V4B16_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int16Regs:$r, Int16Regs:$g, Int16Regs:$b, Int16Regs:$a)>;
- def : Pat<(int_nvvm_sust_p_3d_v4i32_trap
- Int64Regs:$s, Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a),
- (SUST_P_3D_V4B32_TRAP_R Int64Regs:$s,
- Int32Regs:$x, Int32Regs:$y, Int32Regs:$z,
- Int32Regs:$r, Int32Regs:$g, Int32Regs:$b, Int32Regs:$a)>;
- //-----------------------------------
- // Read Special Registers
- //-----------------------------------
- class PTX_READ_SREG_R64<string regname, Intrinsic intop>
- : NVPTXInst<(outs Int64Regs:$d), (ins),
- !strconcat("mov.u64 \t$d, %", regname, ";"),
- [(set Int64Regs:$d, (intop))]>;
- class PTX_READ_SREG_R32<string regname, Intrinsic intop>
- : NVPTXInst<(outs Int32Regs:$d), (ins),
- !strconcat("mov.u32 \t$d, %", regname, ";"),
- [(set Int32Regs:$d, (intop))]>;
- // TODO Add read vector-version of special registers
- def INT_PTX_SREG_TID_X :
- PTX_READ_SREG_R32<"tid.x", int_nvvm_read_ptx_sreg_tid_x>;
- def INT_PTX_SREG_TID_Y :
- PTX_READ_SREG_R32<"tid.y", int_nvvm_read_ptx_sreg_tid_y>;
- def INT_PTX_SREG_TID_Z :
- PTX_READ_SREG_R32<"tid.z", int_nvvm_read_ptx_sreg_tid_z>;
- def INT_PTX_SREG_TID_W :
- PTX_READ_SREG_R32<"tid.w", int_nvvm_read_ptx_sreg_tid_w>;
- def INT_PTX_SREG_NTID_X :
- PTX_READ_SREG_R32<"ntid.x", int_nvvm_read_ptx_sreg_ntid_x>;
- def INT_PTX_SREG_NTID_Y :
- PTX_READ_SREG_R32<"ntid.y", int_nvvm_read_ptx_sreg_ntid_y>;
- def INT_PTX_SREG_NTID_Z :
- PTX_READ_SREG_R32<"ntid.z", int_nvvm_read_ptx_sreg_ntid_z>;
- def INT_PTX_SREG_NTID_W :
- PTX_READ_SREG_R32<"ntid.w", int_nvvm_read_ptx_sreg_ntid_w>;
- def INT_PTX_SREG_LANEID :
- PTX_READ_SREG_R32<"laneid", int_nvvm_read_ptx_sreg_laneid>;
- def INT_PTX_SREG_WARPID :
- PTX_READ_SREG_R32<"warpid", int_nvvm_read_ptx_sreg_warpid>;
- def INT_PTX_SREG_NWARPID :
- PTX_READ_SREG_R32<"nwarpid", int_nvvm_read_ptx_sreg_nwarpid>;
- def INT_PTX_SREG_CTAID_X :
- PTX_READ_SREG_R32<"ctaid.x", int_nvvm_read_ptx_sreg_ctaid_x>;
- def INT_PTX_SREG_CTAID_Y :
- PTX_READ_SREG_R32<"ctaid.y", int_nvvm_read_ptx_sreg_ctaid_y>;
- def INT_PTX_SREG_CTAID_Z :
- PTX_READ_SREG_R32<"ctaid.z", int_nvvm_read_ptx_sreg_ctaid_z>;
- def INT_PTX_SREG_CTAID_W :
- PTX_READ_SREG_R32<"ctaid.w", int_nvvm_read_ptx_sreg_ctaid_w>;
- def INT_PTX_SREG_NCTAID_X :
- PTX_READ_SREG_R32<"nctaid.x", int_nvvm_read_ptx_sreg_nctaid_x>;
- def INT_PTX_SREG_NCTAID_Y :
- PTX_READ_SREG_R32<"nctaid.y", int_nvvm_read_ptx_sreg_nctaid_y>;
- def INT_PTX_SREG_NCTAID_Z :
- PTX_READ_SREG_R32<"nctaid.z", int_nvvm_read_ptx_sreg_nctaid_z>;
- def INT_PTX_SREG_NCTAID_W :
- PTX_READ_SREG_R32<"nctaid.w", int_nvvm_read_ptx_sreg_nctaid_w>;
- def INT_PTX_SREG_SMID :
- PTX_READ_SREG_R32<"smid", int_nvvm_read_ptx_sreg_smid>;
- def INT_PTX_SREG_NSMID :
- PTX_READ_SREG_R32<"nsmid", int_nvvm_read_ptx_sreg_nsmid>;
- def INT_PTX_SREG_GRIDID :
- PTX_READ_SREG_R32<"gridid", int_nvvm_read_ptx_sreg_gridid>;
- def INT_PTX_SREG_LANEMASK_EQ :
- PTX_READ_SREG_R32<"lanemask_eq", int_nvvm_read_ptx_sreg_lanemask_eq>;
- def INT_PTX_SREG_LANEMASK_LE :
- PTX_READ_SREG_R32<"lanemask_le", int_nvvm_read_ptx_sreg_lanemask_le>;
- def INT_PTX_SREG_LANEMASK_LT :
- PTX_READ_SREG_R32<"lanemask_lt", int_nvvm_read_ptx_sreg_lanemask_lt>;
- def INT_PTX_SREG_LANEMASK_GE :
- PTX_READ_SREG_R32<"lanemask_ge", int_nvvm_read_ptx_sreg_lanemask_ge>;
- def INT_PTX_SREG_LANEMASK_GT :
- PTX_READ_SREG_R32<"lanemask_gt", int_nvvm_read_ptx_sreg_lanemask_gt>;
- def INT_PTX_SREG_CLOCK :
- PTX_READ_SREG_R32<"clock", int_nvvm_read_ptx_sreg_clock>;
- def INT_PTX_SREG_CLOCK64 :
- PTX_READ_SREG_R64<"clock64", int_nvvm_read_ptx_sreg_clock64>;
- def INT_PTX_SREG_PM0 : PTX_READ_SREG_R32<"pm0", int_nvvm_read_ptx_sreg_pm0>;
- def INT_PTX_SREG_PM1 : PTX_READ_SREG_R32<"pm1", int_nvvm_read_ptx_sreg_pm1>;
- def INT_PTX_SREG_PM2 : PTX_READ_SREG_R32<"pm2", int_nvvm_read_ptx_sreg_pm2>;
- def INT_PTX_SREG_PM3 : PTX_READ_SREG_R32<"pm3", int_nvvm_read_ptx_sreg_pm3>;
- // TODO: It would be nice to use PTX_READ_SREG here, but it doesn't
- // handle the constant.
- def INT_PTX_SREG_WARPSIZE :
- NVPTXInst<(outs Int32Regs:$dst), (ins), "mov.u32 \t$dst, WARP_SZ;",
- [(set Int32Regs:$dst, (int_nvvm_read_ptx_sreg_warpsize))]>;
- // Helper class that represents a 'fragment' of an NVPTX *MMA instruction.
- // In addition to target-independent fields provided by WMMA_REGS, it adds
- // the fields commonly used to implement specific PTX instruction -- register
- // types and names, constraints, parts of assembly, etc.
- class WMMA_REGINFO<WMMA_REGS r, string op>
- : WMMA_REGS<r.geom, r.frag, r.ptx_elt_type> {
- // NVPTX register types used to carry fragment data.
- NVPTXRegClass regclass = !cond(
- !eq(ptx_elt_type, "f16") : Float16x2Regs,
- !eq(ptx_elt_type, "f32") : Float32Regs,
- !eq(ptx_elt_type, "f64") : Float64Regs,
- !eq(ptx_elt_type, "bf16") : Int32Regs,
- !eq(ptx_elt_type, "tf32") : Int32Regs,
- !eq(ptx_elt_type, "s32") : Int32Regs,
- !eq(ptx_elt_type, "b16") : Int32Regs,
- !eq(ptx_elt_type, "s8") : Int32Regs,
- !eq(ptx_elt_type, "u8") : Int32Regs,
- !eq(ptx_elt_type, "s4") : Int32Regs,
- !eq(ptx_elt_type, "u4") : Int32Regs,
- !eq(ptx_elt_type, "b1") : Int32Regs);
- // Instruction input/output arguments for the fragment.
- list<NVPTXRegClass> ptx_regs = !listsplat(regclass, !size(regs));
- // List of register names for the fragment -- ["ra0", "ra1",...]
- list<string> reg_names = RegSeq<!size(ptx_regs), "r"#frag>.ret;
- // Generates "{{$r0, $r1,.... $rN-1}}" for use in asm string construction.
- string regstring = "{{$" # !interleave(reg_names, ", $") # "}}";
- // Predicates for particular fragment variant. Technically those are
- // per-instruction predicates, but currently all fragments that can be used in
- // a given instruction are subject to the same constraints, so an instruction
- // can use predicates from any of its fragments. If/when this is no
- // longer the case, we can concat all per-fragment predicates to enforce that
- // all fragments of the instruction are viable.
- list<Predicate> Predicates = !cond(
- // fp16 -> fp16/fp32 @ m16n16k16
- !and(!eq(geom, "m16n16k16"),
- !or(!eq(ptx_elt_type, "f16"),
- !eq(ptx_elt_type, "f32"))) : [hasSM70, hasPTX60],
- !and(!eq(geom,"m8n8k4"),
- !eq(ptx_elt_type, "f64")) : [hasSM80, hasPTX70],
- // fp16 -> fp16/fp32 @ m8n32k16/m32n8k16
- !and(!or(!eq(geom, "m8n32k16"),
- !eq(geom, "m32n8k16")),
- !or(!eq(ptx_elt_type, "f16"),
- !eq(ptx_elt_type, "f32"))) : [hasSM70, hasPTX61],
- // u8/s8 -> s32 @ m16n16k16/m8n32k16/m32n8k16
- !and(!or(!eq(geom,"m16n16k16"),
- !eq(geom,"m8n32k16"),
- !eq(geom,"m32n8k16")),
- !or(!eq(ptx_elt_type, "u8"),
- !eq(ptx_elt_type, "s8"),
- !eq(ptx_elt_type, "s32"))) : [hasSM72, hasPTX63],
- !and(!or(!eq(geom,"m16n16k16"),
- !eq(geom,"m8n32k16"),
- !eq(geom,"m32n8k16")),
- !eq(ptx_elt_type, "bf16")) : [hasSM80, hasPTX70],
- !and(!eq(geom,"m16n16k8"),
- !eq(ptx_elt_type, "tf32")) : [hasSM80, hasPTX70],
- !and(!eq(geom,"m16n16k8"),
- !eq(ptx_elt_type, "f32")) : [hasSM80, hasPTX70],
- // b1 -> s32 @ m8n8k128(b1)
- !and(!ne(op,"mma"),
- !eq(geom,"m8n8k128")) : [hasSM75, hasPTX63],
- // u4/s4 -> s32 @ m8n8k32 (u4/s4)
- !and(!ne(op,"mma"),
- !eq(geom,"m8n8k32")) : [hasSM75, hasPTX63],
- !or(!eq(geom,"m16n8k8"),
- !eq(geom,"m8n8k16")) : [hasSM75, hasPTX65],
- !and(!ne(ptx_elt_type,"f64"),
- !eq(geom, "m8n8k4")) : [hasSM70, hasPTX64],
- // mma m8n8k32 requires higher PTX version
- !and(!eq(op,"mma"),
- !eq(geom,"m8n8k32")) : [hasSM75, hasPTX65],
- !and(!eq(ptx_elt_type,"f64"),
- !eq(geom, "m8n8k4")) : [hasSM80, hasPTX70],
- !and(!eq(op,"mma"),
- !or(!eq(geom, "m16n8k16"),
- !eq(geom, "m16n8k4"),
- !eq(geom, "m16n8k32"),
- !eq(geom, "m16n8k64"),
- !eq(geom, "m8n8k128"),
- !eq(geom, "m16n8k128"),
- !eq(geom, "m16n8k256"))) : [hasSM80, hasPTX70],
- !and(!eq(op,"ldmatrix"),
- !eq(ptx_elt_type,"b16"),
- !eq(geom, "m8n8")) : [hasSM75, hasPTX65]);
- // template DAGs for instruction inputs/output.
- dag Outs = !dag(outs, ptx_regs, reg_names);
- dag Ins = !dag(ins, ptx_regs, reg_names);
- }
- // Convert dag of arguments into a dag to match given intrinsic.
- class BuildPatternI<Intrinsic Intr, dag Ins> {
- // Build a dag pattern that matches the intrinsic call.
- dag ret = !foreach(tmp, Ins,
- !subst(imem, ADDRvar,
- !subst(MEMri64, ADDRri64,
- !subst(MEMri, ADDRri,
- !subst(ins, Intr, tmp)))));
- }
- // Same as above, but uses PatFrag instead of an Intrinsic.
- class BuildPatternPF<PatFrag Intr, dag Ins> {
- // Build a dag pattern that matches the intrinsic call.
- dag ret = !foreach(tmp, Ins,
- !subst(imem, ADDRvar,
- !subst(MEMri64, ADDRri64,
- !subst(MEMri, ADDRri,
- !subst(ins, Intr, tmp)))));
- }
- // Common WMMA-related fields used for building patterns for all MMA instructions.
- class WMMA_INSTR<string _Intr, list<dag> _Args>
- : NVPTXInst<(outs), (ins), "?", []> {
- Intrinsic Intr = !cast<Intrinsic>(_Intr);
- // Concatenate all arguments into a single dag.
- dag Args = !foldl((ins), _Args, a, b, !con(a,b));
- // Pre-build the pattern to match (intrinsic arg0, arg1, ...).
- dag IntrinsicPattern = BuildPatternI<!cast<Intrinsic>(Intr), Args>.ret;
- }
- //
- // wmma.load.[a|b|c].sync.[row|col].m16n16k16[|.global|.shared].[f16|f32]
- //
- class WMMA_LOAD<WMMA_REGINFO Frag, string Layout, string Space, bit WithStride,
- DAGOperand SrcOp>
- : WMMA_INSTR<WMMA_NAME_LDST<"load", Frag, Layout, WithStride>.record,
- [!con((ins SrcOp:$src),
- !if(WithStride, (ins Int32Regs:$ldm), (ins)))]>,
- Requires<Frag.Predicates> {
- // Load/store intrinsics are overloaded on pointer's address space.
- // To match the right intrinsic, we need to build AS-constrained PatFrag.
- // Operands is a dag equivalent in shape to Args, but using (ops node:$name, .....).
- dag PFOperands = !if(WithStride, (ops node:$src, node:$ldm), (ops node:$src));
- dag PFOperandsIntr = !if(WithStride, (Intr node:$src, node:$ldm), (Intr node:$src));
- // Build PatFrag that only matches particular address space.
- PatFrag IntrFrag = PatFrag<PFOperands,
- PFOperandsIntr,
- !cond(!eq(Space, ".shared"): AS_match.shared,
- !eq(Space, ".global"): AS_match.global,
- true: AS_match.generic)>;
- // Build AS-constrained pattern.
- let IntrinsicPattern = BuildPatternPF<IntrFrag, Args>.ret;
- let OutOperandList = Frag.Outs;
- let InOperandList = !con(Args, (ins MmaCode:$ptx));
- let AsmString = "wmma.load."
- # Frag.frag
- # ".sync"
- # "${ptx:aligned}"
- # "." # Layout
- # "." # Frag.geom
- # Space
- # "." # Frag.ptx_elt_type # " \t"
- # Frag.regstring
- # ", [$src]"
- # !if(WithStride, ", $ldm", "")
- # ";";
- }
- //
- // wmma.store.d.sync.[row|col].m16n16k16[|.global|.shared].[f16|f32]
- //
- class WMMA_STORE_D<WMMA_REGINFO Frag, string Layout, string Space,
- bit WithStride, DAGOperand DstOp>
- : WMMA_INSTR<WMMA_NAME_LDST<"store", Frag, Layout, WithStride>.record,
- [!con((ins DstOp:$dst),
- Frag.Ins,
- !if(WithStride, (ins Int32Regs:$ldm), (ins)))]>,
- Requires<Frag.Predicates> {
- // Load/store intrinsics are overloaded on pointer's address space.
- // To match the right intrinsic, we need to build AS-constrained PatFrag.
- // Operands is a dag equivalent in shape to Args, but using (ops node:$name, .....).
- dag PFOperands = !con((ops node:$dst),
- !dag(ops, !listsplat(node, !size(Frag.regs)), Frag.reg_names),
- !if(WithStride, (ops node:$ldm), (ops)));
- // Build PatFrag that only matches particular address space.
- PatFrag IntrFrag = PatFrag<PFOperands,
- !foreach(tmp, PFOperands, !subst(ops, Intr, tmp)),
- !cond(!eq(Space, ".shared"): AS_match.shared,
- !eq(Space, ".global"): AS_match.global,
- true: AS_match.generic)>;
- // Build AS-constrained pattern.
- let IntrinsicPattern = BuildPatternPF<IntrFrag, Args>.ret;
- let InOperandList = !con(Args, (ins MmaCode:$ptx));
- let OutOperandList = (outs);
- let AsmString = "wmma.store.d.sync"
- # "${ptx:aligned}"
- # "." # Layout
- # "." # Frag.geom
- # Space
- # "." # Frag.ptx_elt_type
- # " \t[$dst],"
- # Frag.regstring
- # !if(WithStride, ", $ldm", "")
- # ";";
- }
- // Create all load/store variants
- defset list<WMMA_INSTR> MMA_LDSTs = {
- foreach layout = ["row", "col"] in {
- foreach stride = [false, true] in {
- foreach space = [".global", ".shared", ""] in {
- foreach addr = [imem, Int32Regs, Int64Regs, MEMri, MEMri64] in {
- foreach frag = NVVM_MMA_OPS.all_ld_ops in
- if NVVM_WMMA_LDST_SUPPORTED<frag, layout>.ret then
- def : WMMA_LOAD<WMMA_REGINFO<frag, "load">, layout, space, stride, addr>;
- foreach frag = NVVM_MMA_OPS.all_st_ops in
- if NVVM_WMMA_LDST_SUPPORTED<frag, layout>.ret then
- def : WMMA_STORE_D<WMMA_REGINFO<frag, "store">, layout, space, stride, addr>;
- } // addr
- } // space
- } // stride
- } // layout
- } // defset
- // B1 instruction variants need extra constraints.
- class MMA_OP_PREDICATES<WMMA_REGINFO FragA, string b1op> {
- string Op = b1op;
- WMMA_REGINFO Frag = FragA;
- list<Predicate> ret = !listconcat(
- FragA.Predicates,
- !if(!eq(b1op, ".and.popc"), [hasSM80,hasPTX71],[])
- );
- }
- // WMMA.MMA
- class WMMA_MMA<WMMA_REGINFO FragA, WMMA_REGINFO FragB,
- WMMA_REGINFO FragC, WMMA_REGINFO FragD,
- string ALayout, string BLayout, int Satfinite, string rnd, string b1op>
- : WMMA_INSTR<WMMA_NAME<ALayout, BLayout, Satfinite, rnd, b1op, FragA, FragB, FragC, FragD>.record,
- [FragA.Ins, FragB.Ins, FragC.Ins]>,
- // Requires does not seem to have effect on Instruction w/o Patterns.
- // We set it here anyways and propagate to the Pat<> we construct below.
- Requires<MMA_OP_PREDICATES<FragA, b1op>.ret> {
- let OutOperandList = FragD.Outs;
- let InOperandList = !con(Args, (ins MmaCode:$ptx));
- string TypeList = !cond(
- !eq(FragA.ptx_elt_type, "f16") : "." # FragD.ptx_elt_type
- # "." # FragC.ptx_elt_type,
- 1: "." # FragD.ptx_elt_type
- # "." # FragA.ptx_elt_type
- # "." # FragB.ptx_elt_type
- # "." # FragC.ptx_elt_type,
- );
- let AsmString = "wmma.mma"
- # b1op
- # ".sync"
- # "${ptx:aligned}"
- # "." # ALayout
- # "." # BLayout
- # "." # FragA.geom
- # !if(!ne(rnd, ""), !strconcat(".", rnd), "")
- # TypeList
- # !if(Satfinite, ".satfinite", "") # "\n\t\t"
- # FragD.regstring # ",\n\t\t"
- # FragA.regstring # ",\n\t\t"
- # FragB.regstring # ",\n\t\t"
- # FragC.regstring # ";";
- }
- defset list<WMMA_INSTR> WMMAs = {
- foreach layout_a = ["row", "col"] in {
- foreach layout_b = ["row", "col"] in {
- foreach satf = [0, 1] in {
- foreach rnd = ["", "rn", "rz", "rm", "rp"] in {
- foreach op = NVVM_MMA_OPS.all_wmma_ops in {
- foreach b1op = NVVM_MMA_B1OPS<op>.ret in {
- if NVVM_WMMA_SUPPORTED<op, layout_a, layout_b, satf, rnd>.ret then {
- def : WMMA_MMA<WMMA_REGINFO<op[0], "wmma.mma">,
- WMMA_REGINFO<op[1], "wmma.mma">,
- WMMA_REGINFO<op[2], "wmma.mma">,
- WMMA_REGINFO<op[3], "wmma.mma">,
- layout_a, layout_b, satf, rnd, b1op>;
- }
- } // b1op
- } // op
- } // rnd
- } // satf
- } // layout_b
- } // layout_a
- } // defset
- // MMA
- class MMA<WMMA_REGINFO FragA, WMMA_REGINFO FragB,
- WMMA_REGINFO FragC, WMMA_REGINFO FragD,
- string ALayout, string BLayout, int Satfinite, string b1op>
- : WMMA_INSTR<MMA_NAME<ALayout, BLayout, Satfinite, b1op, FragA, FragB, FragC, FragD>.record,
- [FragA.Ins, FragB.Ins, FragC.Ins]>,
- // Requires does not seem to have effect on Instruction w/o Patterns.
- // We set it here anyways and propagate to the Pat<> we construct below.
- Requires<MMA_OP_PREDICATES<FragA, b1op>.ret> {
- let OutOperandList = FragD.Outs;
- let InOperandList = !con(Args, (ins MmaCode:$ptx));
- string TypeList = "." # FragD.ptx_elt_type
- # "." # FragA.ptx_elt_type
- # "." # FragB.ptx_elt_type
- # "." # FragC.ptx_elt_type;
- let AsmString = "mma.sync.aligned."
- # FragA.geom
- # "." # ALayout
- # "." # BLayout
- # !if(Satfinite, ".satfinite", "")
- # TypeList
- # b1op # "\n\t\t"
- # FragD.regstring # ",\n\t\t"
- # FragA.regstring # ",\n\t\t"
- # FragB.regstring # ",\n\t\t"
- # FragC.regstring # ";";
- }
- defset list<WMMA_INSTR> MMAs = {
- foreach layout_a = ["row", "col"] in {
- foreach layout_b = ["row", "col"] in {
- foreach satf = [0, 1] in {
- foreach op = NVVM_MMA_OPS.all_mma_ops in {
- foreach b1op = NVVM_MMA_B1OPS<op>.ret in {
- if NVVM_MMA_SUPPORTED<op, layout_a, layout_b, satf>.ret then {
- def : MMA<WMMA_REGINFO<op[0], "mma">,
- WMMA_REGINFO<op[1], "mma">,
- WMMA_REGINFO<op[2], "mma">,
- WMMA_REGINFO<op[3], "mma">,
- layout_a, layout_b, satf, b1op>;
- }
- } // b1op
- } // op
- } // satf
- } // layout_b
- } // layout_a
- } // defset
- //
- // ldmatrix.sync.aligned.m8n8[|.trans][|.shared].b16
- //
- class LDMATRIX<WMMA_REGINFO Frag, bit Transposed, string Space,
- DAGOperand SrcOp>
- : WMMA_INSTR<LDMATRIX_NAME<Frag, Transposed>.record, [(ins SrcOp:$src)]>,
- Requires<Frag.Predicates> {
- // Build PatFrag that only matches particular address space.
- PatFrag IntrFrag = PatFrag<(ops node:$src), (Intr node:$src),
- !cond(!eq(Space, ".shared"): AS_match.shared,
- true: AS_match.generic)>;
- // Build AS-constrained pattern.
- let IntrinsicPattern = BuildPatternPF<IntrFrag, Args>.ret;
- let OutOperandList = Frag.Outs;
- let InOperandList = !con(Args, (ins MmaCode:$ptx));
- let AsmString = "ldmatrix.sync.aligned."
- # Frag.geom
- # "." # Frag.frag
- # !if(Transposed, ".trans", "")
- # Space
- # "." # Frag.ptx_elt_type
- # " " # Frag.regstring # ", [$src];";
- }
- // Create all ldmatrix variants
- defset list<WMMA_INSTR> LDMATRIXs = {
- foreach transposed = [false, true] in {
- foreach space = [".shared", ""] in {
- foreach addr = [imem, Int32Regs, Int64Regs, MEMri, MEMri64] in {
- foreach frag = NVVM_MMA_OPS.all_ldmatrix_ops in
- if NVVM_LDMATRIX_SUPPORTED<frag>.ret then
- def : LDMATRIX<WMMA_REGINFO<frag, "ldmatrix">, transposed, space,
- addr>;
- } // addr
- } // space
- } // transposed
- } // defset
- // Constructing non-flat DAGs is still a pain. I can't !subst a dag node with a
- // dag, so the ptx.version must be appended *after* foreach replaces 'ins' with
- // the instruction record.
- class MMA_PAT<WMMA_INSTR wi>
- : Pat<wi.IntrinsicPattern,
- !con(!foreach(tmp, wi.Args, !subst(ins, wi, tmp)),
- (wi ptx.version))>,
- Requires<wi.Predicates>;
- // Build intrinsic->instruction patterns for all MMA instructions.
- foreach mma = !listconcat(MMAs, WMMAs, MMA_LDSTs, LDMATRIXs) in
- def : MMA_PAT<mma>;
|