You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

dgemm_kernel_16x6.S 145 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256
  1. /*******************************************************************************
  2. Copyright (c) 2024, The OpenBLAS Project
  3. All rights reserved.
  4. Redistribution and use in source and binary forms, with or without
  5. modification, are permitted provided that the following conditions are
  6. met:
  7. 1. Redistributions of source code must retain the above copyright
  8. notice, this list of conditions and the following disclaimer.
  9. 2. Redistributions in binary form must reproduce the above copyright
  10. notice, this list of conditions and the following disclaimer in
  11. the documentation and/or other materials provided with the
  12. distribution.
  13. 3. Neither the name of the OpenBLAS project nor the names of
  14. its contributors may be used to endorse or promote products
  15. derived from this software without specific prior written permission.
  16. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17. AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
  20. LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  22. SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  23. CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  24. OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  25. USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. *******************************************************************************/
  27. #define ASSEMBLER
  28. #include "common.h"
  29. /* Function parameters */
  30. #define M $r4 // param 1: bm
  31. #define N $r5 // param 2: bn
  32. #define K $r6 // param 3: bk
  33. #define ALPHA $f0 // param 4: alpha
  34. #define A $r7 // param 5: ba
  35. #define B $r8 // param 6: bb
  36. #define C $r9 // param 7: bc
  37. #define LDC $r10 // param 8: ldc
  38. #ifdef TRMMKERNEL
  39. #define OFFSET $r11 // param 9: offset
  40. #endif
  41. #define OFF $r12
  42. /* Cycle control parameters */
  43. #define I $r13
  44. #define J $r14
  45. #define L $r15
  46. #define TL $r16
  47. /* Matrix address */
  48. #define A0 $r17
  49. #define B0 $r18
  50. #define C0 $r19
  51. #define C1 $r20
  52. #define C2 $r23
  53. #define C3 $r24
  54. #define C4 $r25
  55. #define C5 $r26
  56. #define T0 $r27 /* !! DO NOT USE $r21 and $r22 !! */
  57. #define T1 $r28
  58. #define T2 $r29
  59. #define I48 $r30
  60. #define ZERO $r0
  61. /* LASX vectors */
  62. #define U0 $xr0
  63. #define U1 $xr1
  64. #define U2 $xr2
  65. #define U3 $xr3
  66. #define U4 $xr4
  67. #define U5 $xr5
  68. #define U6 $xr6
  69. #define D0 $xr7
  70. #define D1 $xr8
  71. #define D2 $xr9
  72. #define D3 $xr10
  73. #define D4 $xr11
  74. #define D5 $xr12
  75. #define D6 $xr13
  76. #define D7 $xr14
  77. #define D8 $xr15
  78. #define D9 $xr16
  79. #define D10 $xr17
  80. #define D11 $xr18
  81. #define D12 $xr19
  82. #define D13 $xr20
  83. #define D14 $xr21
  84. #define D15 $xr22
  85. #define D16 $xr23
  86. #define D17 $xr24
  87. #define D18 $xr25
  88. #define D19 $xr26
  89. #define D20 $xr27
  90. #define D21 $xr28
  91. #define D22 $xr29
  92. #define D23 $xr30
  93. #define VALPHA $xr31
  94. /* Prefetch interval */
  95. #define A_PRE 0x200 /* 0x200 / 0x80 = 4 */
  96. #define B_PRE 0x100 /* 0x100 / 0x30 = 4 */
  97. .macro KERNEL_16x6
  98. /* Load 16 * 64 from A0 */
  99. xvld U0, A0, 0x00
  100. xvld U1, A0, 0x20
  101. xvld U2, A0, 0x40
  102. xvld U3, A0, 0x60
  103. /* Cumulative D0~D23 */
  104. xvldrepl.d U4, B0, 0x00
  105. xvldrepl.d U5, B0, 0x08
  106. xvldrepl.d U6, B0, 0x10
  107. xvfmadd.d D0, U0, U4, D0
  108. xvfmadd.d D1, U1, U4, D1
  109. xvfmadd.d D2, U2, U4, D2
  110. xvfmadd.d D3, U3, U4, D3
  111. preld 0, B0, B_PRE
  112. xvfmadd.d D4, U0, U5, D4
  113. xvfmadd.d D5, U1, U5, D5
  114. xvfmadd.d D6, U2, U5, D6
  115. xvfmadd.d D7, U3, U5, D7
  116. xvfmadd.d D8, U0, U6, D8
  117. xvfmadd.d D9, U1, U6, D9
  118. xvfmadd.d D10, U2, U6, D10
  119. xvfmadd.d D11, U3, U6, D11
  120. preld 0, A0, A_PRE
  121. xvldrepl.d U4, B0, 0x18
  122. xvldrepl.d U5, B0, 0x20
  123. xvldrepl.d U6, B0, 0x28
  124. xvfmadd.d D12, U0, U4, D12
  125. xvfmadd.d D13, U1, U4, D13
  126. xvfmadd.d D14, U2, U4, D14
  127. xvfmadd.d D15, U3, U4, D15
  128. xvfmadd.d D16, U0, U5, D16
  129. xvfmadd.d D17, U1, U5, D17
  130. xvfmadd.d D18, U2, U5, D18
  131. xvfmadd.d D19, U3, U5, D19
  132. preld 0, A0, A_PRE + 0x40
  133. xvfmadd.d D20, U0, U6, D20
  134. xvfmadd.d D21, U1, U6, D21
  135. xvfmadd.d D22, U2, U6, D22
  136. xvfmadd.d D23, U3, U6, D23
  137. addi.d A0, A0, 0x80
  138. addi.d B0, B0, 0x30
  139. .endm
  140. PROLOGUE
  141. addi.d $sp, $sp, -160
  142. /* Store $r23~$31 */
  143. SDARG $r23, $sp, 0
  144. SDARG $r24, $sp, 8
  145. SDARG $r25, $sp, 16
  146. SDARG $r26, $sp, 24
  147. SDARG $r27, $sp, 32
  148. SDARG $r28, $sp, 40
  149. SDARG $r29, $sp, 48
  150. SDARG $r30, $sp, 56
  151. SDARG $r31, $sp, 64
  152. fst.d $f23, $sp, 72
  153. fst.d $f24, $sp, 80
  154. fst.d $f25, $sp, 96
  155. fst.d $f26, $sp, 104
  156. fst.d $f27, $sp, 112
  157. fst.d $f28, $sp, 120
  158. fst.d $f29, $sp, 128
  159. fst.d $f30, $sp, 136
  160. fst.d $f31, $sp, 144
  161. fst.d ALPHA, $sp, 152
  162. #if defined (TRMMKERNEL) && !defined(LEFT)
  163. sub.d OFF, ZERO, OFFSET
  164. #else
  165. xor OFF, OFF, OFF
  166. #endif
  167. addi.d I48, ZERO, 48
  168. /* VALPHA = {ALPHA, ALPHA, ALPHA, ALPHA} */
  169. xvld VALPHA, $sp, 152
  170. xvreplve0.d VALPHA, VALPHA
  171. xor T0, T0, T0
  172. addi.d T0, T0, 6
  173. /* if (!(N / 6)) goto L_N5 */
  174. div.d J, N, T0 /* J = bn / 6 */
  175. mul.d T0, J, T0
  176. sub.d N, N, T0
  177. beq ZERO, J, .L_N5
  178. .L_J1: /* J-- && This loop include Condition 1 */
  179. /************************* Condition 1 if((N / 6) && (M >> 4)) START !!! *************************
  180. * dgemm_core_16x6 */
  181. move C0, C
  182. move A0, A
  183. slli.d T0, LDC, 3
  184. add.d C1, C0, T0
  185. addi.d J, J, -1 /* J-- */
  186. add.d C2, C1, T0
  187. add.d C3, C2, T0
  188. add.d C4, C3, T0
  189. add.d C5, C4, T0
  190. #if defined(TRMMKERNEL) && defined(LEFT)
  191. move OFF, OFFSET
  192. #endif
  193. /* if (!(M >> 3)) goto L_M8 */
  194. srai.d I, M, 4 /* I = bm >> 4 */
  195. beq ZERO, I, .L_M8
  196. .L_I1: /* I-- */
  197. #if defined(TRMMKERNEL)
  198. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  199. move B0, B
  200. #else
  201. slli.d T0, OFF, 0x07
  202. add.d A0, A0, T0
  203. mul.d T0, OFF, I48
  204. add.d B0, B, T0
  205. #endif
  206. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  207. sub.d L, K, OFF
  208. #elif defined(LEFT)
  209. /* number of values in A */
  210. addi.d L, OFF, 16
  211. #else
  212. /* number of values in B */
  213. addi.d L, OFF, 6
  214. #endif
  215. #else // #if !defined(TRMMKERNEL)
  216. move B0, B
  217. move L, K /* L = bk */
  218. #endif
  219. /* Calculate the first set of D0~D23,
  220. * avoidig set 0 operation
  221. * Load 16 * 64 from A0
  222. * U0 = {a3, a2, a1, a0}
  223. * U1 = {a7, a6, a5, a4}
  224. * U2 = {a11, a10, a9, a8}
  225. * U3 = {a15, a14, a13, a12}
  226. */
  227. xvld U0, A0, 0x00
  228. xvld U1, A0, 0x20
  229. xvld U2, A0, 0x40
  230. xvld U3, A0, 0x60
  231. xvldrepl.d U4, B0, 0x00
  232. xvldrepl.d U5, B0, 0x08
  233. xvldrepl.d U6, B0, 0x10
  234. preld 0, C0, 0x00
  235. /* line 1 */
  236. xvfmul.d D0, U0, U4
  237. xvfmul.d D1, U1, U4
  238. preld 0, C0, 0x40
  239. xvfmul.d D2, U2, U4
  240. xvfmul.d D3, U3, U4
  241. preld 0, C1, 0x00
  242. /* line 2 */
  243. xvfmul.d D4, U0, U5
  244. xvfmul.d D5, U1, U5
  245. preld 0, C1, 0x40
  246. xvfmul.d D6, U2, U5
  247. xvfmul.d D7, U3, U5
  248. preld 0, C2, 0x00
  249. /* line 3 */
  250. xvfmul.d D8, U0, U6
  251. xvfmul.d D9, U1, U6
  252. preld 0, C2, 0x40
  253. xvfmul.d D10, U2, U6
  254. xvfmul.d D11, U3, U6
  255. xvldrepl.d U4, B0, 0x18
  256. xvldrepl.d U5, B0, 0x20
  257. xvldrepl.d U6, B0, 0x28
  258. preld 0, C3, 0x00
  259. /* line 4 */
  260. xvfmul.d D12, U0, U4
  261. xvfmul.d D13, U1, U4
  262. preld 0, C3, 0x40
  263. xvfmul.d D14, U2, U4
  264. xvfmul.d D15, U3, U4
  265. preld 0, C4, 0x00
  266. /* line 5 */
  267. xvfmul.d D16, U0, U5
  268. xvfmul.d D17, U1, U5
  269. preld 0, C4, 0x40
  270. xvfmul.d D18, U2, U5
  271. xvfmul.d D19, U3, U5
  272. preld 0, C5, 0x00
  273. /* line 6 */
  274. xvfmul.d D20, U0, U6
  275. xvfmul.d D21, U1, U6
  276. preld 0, C5, 0x40
  277. xvfmul.d D22, U2, U6
  278. xvfmul.d D23, U3, U6
  279. /* Add stride for A0 and B0 */
  280. addi.d A0, A0, 0x80
  281. addi.d B0, B0, 0x30
  282. /* Reduce L */
  283. addi.d L, L, -1
  284. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  285. /* if (TL < 1) goto L_L7 */
  286. beq ZERO,TL, .L_L7
  287. /* Calculate 8 sets of D0~D23 */
  288. .L_TL1: /* TL-- */
  289. KERNEL_16x6
  290. KERNEL_16x6
  291. KERNEL_16x6
  292. KERNEL_16x6
  293. KERNEL_16x6
  294. KERNEL_16x6
  295. KERNEL_16x6
  296. KERNEL_16x6
  297. addi.d TL, TL, -1 /* TL-- */
  298. blt ZERO,TL, .L_TL1
  299. /* Maybe we need calculate the last
  300. * 7 sets of D0~D23?
  301. */
  302. .L_L7:
  303. /* if (!(L & 7)) goto L_L0 */
  304. andi TL, L, 7
  305. beq TL, ZERO,.L_L0
  306. .L_L71:
  307. /* Load 16 * 64 from A0 */
  308. xvld U0, A0, 0x00
  309. xvld U1, A0, 0x20
  310. xvld U2, A0, 0x40
  311. xvld U3, A0, 0x60
  312. /* Cumulative D0~D23 */
  313. xvldrepl.d U4, B0, 0x00
  314. xvfmadd.d D0, U0, U4, D0
  315. xvfmadd.d D1, U1, U4, D1
  316. xvfmadd.d D2, U2, U4, D2
  317. xvfmadd.d D3, U3, U4, D3
  318. xvldrepl.d U4, B0, 0x08
  319. xvfmadd.d D4, U0, U4, D4
  320. xvfmadd.d D5, U1, U4, D5
  321. xvfmadd.d D6, U2, U4, D6
  322. xvfmadd.d D7, U3, U4, D7
  323. xvldrepl.d U4, B0, 0x10
  324. xvfmadd.d D8, U0, U4, D8
  325. xvfmadd.d D9, U1, U4, D9
  326. xvfmadd.d D10, U2, U4, D10
  327. xvfmadd.d D11, U3, U4, D11
  328. xvldrepl.d U4, B0, 0x18
  329. xvfmadd.d D12, U0, U4, D12
  330. xvfmadd.d D13, U1, U4, D13
  331. xvfmadd.d D14, U2, U4, D14
  332. xvfmadd.d D15, U3, U4, D15
  333. xvldrepl.d U4, B0, 0x20
  334. xvfmadd.d D16, U0, U4, D16
  335. xvfmadd.d D17, U1, U4, D17
  336. xvfmadd.d D18, U2, U4, D18
  337. xvfmadd.d D19, U3, U4, D19
  338. xvldrepl.d U4, B0, 0x28
  339. xvfmadd.d D20, U0, U4, D20
  340. xvfmadd.d D21, U1, U4, D21
  341. xvfmadd.d D22, U2, U4, D22
  342. xvfmadd.d D23, U3, U4, D23
  343. /* Add stride for A0, B0 */
  344. addi.d A0, A0, 0x80
  345. addi.d B0, B0, 0x30
  346. addi.d TL, TL, -1
  347. blt ZERO,TL, .L_L71
  348. .L_L0:
  349. #if defined(TRMMKERNEL)
  350. xvfmul.d D0, D0, VALPHA
  351. xvfmul.d D1, D1, VALPHA
  352. xvfmul.d D2, D2, VALPHA
  353. xvfmul.d D3, D3, VALPHA
  354. xvfmul.d D4, D4, VALPHA
  355. xvfmul.d D5, D5, VALPHA
  356. xvfmul.d D6, D6, VALPHA
  357. xvfmul.d D7, D7, VALPHA
  358. xvfmul.d D8, D8, VALPHA
  359. xvfmul.d D9, D9, VALPHA
  360. xvfmul.d D10, D10, VALPHA
  361. xvfmul.d D11, D11, VALPHA
  362. xvfmul.d D12, D12, VALPHA
  363. xvfmul.d D13, D13, VALPHA
  364. xvfmul.d D14, D14, VALPHA
  365. xvfmul.d D15, D15, VALPHA
  366. xvfmul.d D16, D16, VALPHA
  367. xvfmul.d D17, D17, VALPHA
  368. xvfmul.d D18, D18, VALPHA
  369. xvfmul.d D19, D19, VALPHA
  370. xvfmul.d D20, D20, VALPHA
  371. xvfmul.d D21, D21, VALPHA
  372. xvfmul.d D22, D22, VALPHA
  373. xvfmul.d D23, D23, VALPHA
  374. #else
  375. /* Load C0 */
  376. xvld U0, C0, 0x00
  377. xvld U1, C0, 0x20
  378. xvld U2, C0, 0x40
  379. xvld U3, C0, 0x60
  380. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  381. xvfmadd.d D1, D1, VALPHA, U1
  382. xvfmadd.d D2, D2, VALPHA, U2
  383. xvfmadd.d D3, D3, VALPHA, U3
  384. /* Load C1 */
  385. xvld U0, C1, 0x00
  386. xvld U1, C1, 0x20
  387. xvld U2, C1, 0x40
  388. xvld U3, C1, 0x60
  389. xvfmadd.d D4, D4, VALPHA, U0
  390. xvfmadd.d D5, D5, VALPHA, U1
  391. xvfmadd.d D6, D6, VALPHA, U2
  392. xvfmadd.d D7, D7, VALPHA, U3
  393. /* Load C2 */
  394. xvld U0, C2, 0x00
  395. xvld U1, C2, 0x20
  396. xvld U2, C2, 0x40
  397. xvld U3, C2, 0x60
  398. xvfmadd.d D8, D8, VALPHA, U0
  399. xvfmadd.d D9, D9, VALPHA, U1
  400. xvfmadd.d D10, D10, VALPHA, U2
  401. xvfmadd.d D11, D11, VALPHA, U3
  402. /* Load C3 */
  403. xvld U0, C3, 0x00
  404. xvld U1, C3, 0x20
  405. xvld U2, C3, 0x40
  406. xvld U3, C3, 0x60
  407. xvfmadd.d D12, D12, VALPHA, U0
  408. xvfmadd.d D13, D13, VALPHA, U1
  409. xvfmadd.d D14, D14, VALPHA, U2
  410. xvfmadd.d D15, D15, VALPHA, U3
  411. /* Load C4 */
  412. xvld U0, C4, 0x00
  413. xvld U1, C4, 0x20
  414. xvld U2, C4, 0x40
  415. xvld U3, C4, 0x60
  416. xvfmadd.d D16, D16, VALPHA, U0
  417. xvfmadd.d D17, D17, VALPHA, U1
  418. xvfmadd.d D18, D18, VALPHA, U2
  419. xvfmadd.d D19, D19, VALPHA, U3
  420. /* Load C5 */
  421. xvld U0, C5, 0x00
  422. xvld U1, C5, 0x20
  423. xvld U2, C5, 0x40
  424. xvld U3, C5, 0x60
  425. xvfmadd.d D20, D20, VALPHA, U0
  426. xvfmadd.d D21, D21, VALPHA, U1
  427. xvfmadd.d D22, D22, VALPHA, U2
  428. xvfmadd.d D23, D23, VALPHA, U3
  429. #endif
  430. /* Store C0 */
  431. xvst D0, C0, 0x00
  432. xvst D1, C0, 0x20
  433. xvst D2, C0, 0x40
  434. xvst D3, C0, 0x60
  435. /* Store C1 */
  436. xvst D4, C1, 0x00
  437. xvst D5, C1, 0x20
  438. xvst D6, C1, 0x40
  439. xvst D7, C1, 0x60
  440. /* Store C2 */
  441. xvst D8, C2, 0x00
  442. xvst D9, C2, 0x20
  443. xvst D10, C2, 0x40
  444. xvst D11, C2, 0x60
  445. /* Store C3 */
  446. xvst D12, C3, 0x00
  447. xvst D13, C3, 0x20
  448. xvst D14, C3, 0x40
  449. xvst D15, C3, 0x60
  450. /* Store C4 */
  451. xvst D16, C4, 0x00
  452. xvst D17, C4, 0x20
  453. xvst D18, C4, 0x40
  454. xvst D19, C4, 0x60
  455. /* Store C5 */
  456. xvst D20, C5, 0x00
  457. xvst D21, C5, 0x20
  458. xvst D22, C5, 0x40
  459. xvst D23, C5, 0x60
  460. /* Add stride for C */
  461. addi.d C0, C0, 0x80
  462. addi.d C1, C1, 0x80
  463. addi.d C2, C2, 0x80
  464. addi.d C3, C3, 0x80
  465. addi.d C4, C4, 0x80
  466. addi.d C5, C5, 0x80
  467. #if defined(TRMMKERNEL)
  468. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  469. sub.d L, K, OFF
  470. #ifdef LEFT
  471. /* number of values in A */
  472. addi.d L, L, -16
  473. #else
  474. /* number of values in B */
  475. addi.d L, L, -6
  476. #endif
  477. slli.d T0, L, 0x07
  478. add.d A0, A0, T0
  479. mul.d T0, L, I48
  480. add.d B0, B0, T0
  481. #endif
  482. #ifdef LEFT
  483. addi.d OFF, OFF, 0x10
  484. #endif
  485. #endif // #if defined(TRMMKERNEL)
  486. addi.d I, I, -1 /* I-- */
  487. blt ZERO,I, .L_I1
  488. .L_M8:
  489. /* We have done M & 16, considering M=8/4/2/1 */
  490. andi I, M, 15
  491. beq ZERO,I, .L_M0
  492. andi I, M, 8
  493. beq ZERO,I, .L_M4
  494. #if defined(TRMMKERNEL)
  495. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  496. move B0, B
  497. #else
  498. slli.d T0, OFF, 0x06
  499. add.d A0, A0, T0
  500. mul.d T0, OFF, I48
  501. add.d B0, B, T0
  502. #endif
  503. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  504. sub.d L, K, OFF
  505. #elif defined(LEFT)
  506. /* number of values in A */
  507. addi.d L, OFF, 8
  508. #else
  509. /* number of values in B */
  510. addi.d L, OFF, 6
  511. #endif
  512. #else // #if !defined(TRMMKERNEL)
  513. move B0, B
  514. move L, K /* L = bk */
  515. #endif // #if defined(TRMMKERNEL)
  516. /* Load 8 * 64 from A0 */
  517. xvld U0, A0, 0x00
  518. xvld U1, A0, 0x20
  519. xvldrepl.d U4, B0, 0x00
  520. /* line 1 */
  521. xvfmul.d D0, U0, U4
  522. xvfmul.d D1, U1, U4
  523. xvldrepl.d U4, B0, 0x08
  524. /* line 2 */
  525. xvfmul.d D4, U0, U4
  526. xvfmul.d D5, U1, U4
  527. xvldrepl.d U4, B0, 0x10
  528. /* line 3 */
  529. xvfmul.d D8, U0, U4
  530. xvfmul.d D9, U1, U4
  531. xvldrepl.d U4, B0, 0x18
  532. /* line 4 */
  533. xvfmul.d D12, U0, U4
  534. xvfmul.d D13, U1, U4
  535. xvldrepl.d U4, B0, 0x20
  536. /* line 5 */
  537. xvfmul.d D16, U0, U4
  538. xvfmul.d D17, U1, U4
  539. xvldrepl.d U4, B0, 0x28
  540. /* line 6 */
  541. xvfmul.d D20, U0, U4
  542. xvfmul.d D21, U1, U4
  543. /* Add stride for A0 and B0 */
  544. addi.d A0, A0, 0x40
  545. addi.d B0, B0, 0x30
  546. /* Reduce L */
  547. addi.d L, L, -1
  548. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  549. /* if (TL < 1) goto L_M8_L7 */
  550. beq ZERO,TL, .L_M8_L7
  551. .L_M8_TL1: /* TL-- */
  552. /***8-1***/
  553. /* Load 16 * 64 from A0 */
  554. xvld U0, A0, 0x00
  555. xvld U1, A0, 0x20
  556. xvldrepl.d U4, B0, 0x00
  557. xvfmadd.d D0, U0, U4, D0
  558. xvfmadd.d D1, U1, U4, D1
  559. xvldrepl.d U4, B0, 0x08
  560. xvfmadd.d D4, U0, U4, D4
  561. xvfmadd.d D5, U1, U4, D5
  562. xvldrepl.d U4, B0, 0x10
  563. xvfmadd.d D8, U0, U4, D8
  564. xvfmadd.d D9, U1, U4, D9
  565. xvldrepl.d U4, B0, 0x18
  566. xvfmadd.d D12, U0, U4, D12
  567. xvfmadd.d D13, U1, U4, D13
  568. xvldrepl.d U4, B0, 0x20
  569. xvfmadd.d D16, U0, U4, D16
  570. xvfmadd.d D17, U1, U4, D17
  571. xvldrepl.d U4, B0, 0x28
  572. xvfmadd.d D20, U0, U4, D20
  573. xvfmadd.d D21, U1, U4, D21
  574. addi.d A0, A0, 0x40
  575. addi.d B0, B0, 0x30
  576. /***8-2***/
  577. xvld U0, A0, 0x00
  578. xvld U1, A0, 0x20
  579. xvldrepl.d U4, B0, 0x00
  580. xvfmadd.d D0, U0, U4, D0
  581. xvfmadd.d D1, U1, U4, D1
  582. xvldrepl.d U4, B0, 0x08
  583. xvfmadd.d D4, U0, U4, D4
  584. xvfmadd.d D5, U1, U4, D5
  585. xvldrepl.d U4, B0, 0x10
  586. xvfmadd.d D8, U0, U4, D8
  587. xvfmadd.d D9, U1, U4, D9
  588. xvldrepl.d U4, B0, 0x18
  589. xvfmadd.d D12, U0, U4, D12
  590. xvfmadd.d D13, U1, U4, D13
  591. xvldrepl.d U4, B0, 0x20
  592. xvfmadd.d D16, U0, U4, D16
  593. xvfmadd.d D17, U1, U4, D17
  594. xvldrepl.d U4, B0, 0x28
  595. xvfmadd.d D20, U0, U4, D20
  596. xvfmadd.d D21, U1, U4, D21
  597. addi.d A0, A0, 0x40
  598. addi.d B0, B0, 0x30
  599. /***8-3***/
  600. xvld U0, A0, 0x00
  601. xvld U1, A0, 0x20
  602. xvldrepl.d U4, B0, 0x00
  603. xvfmadd.d D0, U0, U4, D0
  604. xvfmadd.d D1, U1, U4, D1
  605. xvldrepl.d U4, B0, 0x08
  606. xvfmadd.d D4, U0, U4, D4
  607. xvfmadd.d D5, U1, U4, D5
  608. xvldrepl.d U4, B0, 0x10
  609. xvfmadd.d D8, U0, U4, D8
  610. xvfmadd.d D9, U1, U4, D9
  611. xvldrepl.d U4, B0, 0x18
  612. xvfmadd.d D12, U0, U4, D12
  613. xvfmadd.d D13, U1, U4, D13
  614. xvldrepl.d U4, B0, 0x20
  615. xvfmadd.d D16, U0, U4, D16
  616. xvfmadd.d D17, U1, U4, D17
  617. xvldrepl.d U4, B0, 0x28
  618. xvfmadd.d D20, U0, U4, D20
  619. xvfmadd.d D21, U1, U4, D21
  620. addi.d A0, A0, 0x40
  621. addi.d B0, B0, 0x30
  622. /***8-4***/
  623. xvld U0, A0, 0x00
  624. xvld U1, A0, 0x20
  625. xvldrepl.d U4, B0, 0x00
  626. xvfmadd.d D0, U0, U4, D0
  627. xvfmadd.d D1, U1, U4, D1
  628. xvldrepl.d U4, B0, 0x08
  629. xvfmadd.d D4, U0, U4, D4
  630. xvfmadd.d D5, U1, U4, D5
  631. xvldrepl.d U4, B0, 0x10
  632. xvfmadd.d D8, U0, U4, D8
  633. xvfmadd.d D9, U1, U4, D9
  634. xvldrepl.d U4, B0, 0x18
  635. xvfmadd.d D12, U0, U4, D12
  636. xvfmadd.d D13, U1, U4, D13
  637. xvldrepl.d U4, B0, 0x20
  638. xvfmadd.d D16, U0, U4, D16
  639. xvfmadd.d D17, U1, U4, D17
  640. xvldrepl.d U4, B0, 0x28
  641. xvfmadd.d D20, U0, U4, D20
  642. xvfmadd.d D21, U1, U4, D21
  643. addi.d A0, A0, 0x40
  644. addi.d B0, B0, 0x30
  645. /***8-5***/
  646. xvld U0, A0, 0x00
  647. xvld U1, A0, 0x20
  648. xvldrepl.d U4, B0, 0x00
  649. xvfmadd.d D0, U0, U4, D0
  650. xvfmadd.d D1, U1, U4, D1
  651. xvldrepl.d U4, B0, 0x08
  652. xvfmadd.d D4, U0, U4, D4
  653. xvfmadd.d D5, U1, U4, D5
  654. xvldrepl.d U4, B0, 0x10
  655. xvfmadd.d D8, U0, U4, D8
  656. xvfmadd.d D9, U1, U4, D9
  657. xvldrepl.d U4, B0, 0x18
  658. xvfmadd.d D12, U0, U4, D12
  659. xvfmadd.d D13, U1, U4, D13
  660. xvldrepl.d U4, B0, 0x20
  661. xvfmadd.d D16, U0, U4, D16
  662. xvfmadd.d D17, U1, U4, D17
  663. xvldrepl.d U4, B0, 0x28
  664. xvfmadd.d D20, U0, U4, D20
  665. xvfmadd.d D21, U1, U4, D21
  666. addi.d A0, A0, 0x40
  667. addi.d B0, B0, 0x30
  668. /***8-6***/
  669. xvld U0, A0, 0x00
  670. xvld U1, A0, 0x20
  671. xvldrepl.d U4, B0, 0x00
  672. xvfmadd.d D0, U0, U4, D0
  673. xvfmadd.d D1, U1, U4, D1
  674. xvldrepl.d U4, B0, 0x08
  675. xvfmadd.d D4, U0, U4, D4
  676. xvfmadd.d D5, U1, U4, D5
  677. xvldrepl.d U4, B0, 0x10
  678. xvfmadd.d D8, U0, U4, D8
  679. xvfmadd.d D9, U1, U4, D9
  680. xvldrepl.d U4, B0, 0x18
  681. xvfmadd.d D12, U0, U4, D12
  682. xvfmadd.d D13, U1, U4, D13
  683. xvldrepl.d U4, B0, 0x20
  684. xvfmadd.d D16, U0, U4, D16
  685. xvfmadd.d D17, U1, U4, D17
  686. xvldrepl.d U4, B0, 0x28
  687. xvfmadd.d D20, U0, U4, D20
  688. xvfmadd.d D21, U1, U4, D21
  689. addi.d A0, A0, 0x40
  690. addi.d B0, B0, 0x30
  691. /***8-7***/
  692. xvld U0, A0, 0x00
  693. xvld U1, A0, 0x20
  694. xvldrepl.d U4, B0, 0x00
  695. xvfmadd.d D0, U0, U4, D0
  696. xvfmadd.d D1, U1, U4, D1
  697. xvldrepl.d U4, B0, 0x08
  698. xvfmadd.d D4, U0, U4, D4
  699. xvfmadd.d D5, U1, U4, D5
  700. xvldrepl.d U4, B0, 0x10
  701. xvfmadd.d D8, U0, U4, D8
  702. xvfmadd.d D9, U1, U4, D9
  703. xvldrepl.d U4, B0, 0x18
  704. xvfmadd.d D12, U0, U4, D12
  705. xvfmadd.d D13, U1, U4, D13
  706. xvldrepl.d U4, B0, 0x20
  707. xvfmadd.d D16, U0, U4, D16
  708. xvfmadd.d D17, U1, U4, D17
  709. xvldrepl.d U4, B0, 0x28
  710. xvfmadd.d D20, U0, U4, D20
  711. xvfmadd.d D21, U1, U4, D21
  712. addi.d A0, A0, 0x40
  713. addi.d B0, B0, 0x30
  714. /***8-8***/
  715. xvld U0, A0, 0x00
  716. xvld U1, A0, 0x20
  717. xvldrepl.d U4, B0, 0x00
  718. xvfmadd.d D0, U0, U4, D0
  719. xvfmadd.d D1, U1, U4, D1
  720. xvldrepl.d U4, B0, 0x08
  721. xvfmadd.d D4, U0, U4, D4
  722. xvfmadd.d D5, U1, U4, D5
  723. xvldrepl.d U4, B0, 0x10
  724. xvfmadd.d D8, U0, U4, D8
  725. xvfmadd.d D9, U1, U4, D9
  726. xvldrepl.d U4, B0, 0x18
  727. xvfmadd.d D12, U0, U4, D12
  728. xvfmadd.d D13, U1, U4, D13
  729. xvldrepl.d U4, B0, 0x20
  730. xvfmadd.d D16, U0, U4, D16
  731. xvfmadd.d D17, U1, U4, D17
  732. xvldrepl.d U4, B0, 0x28
  733. xvfmadd.d D20, U0, U4, D20
  734. xvfmadd.d D21, U1, U4, D21
  735. addi.d A0, A0, 0x40
  736. addi.d B0, B0, 0x30
  737. addi.d TL, TL, -1 /* TL-- */
  738. blt ZERO,TL, .L_M8_TL1
  739. .L_M8_L7:
  740. /* if (!(L & 7)) goto L_M8_L0 */
  741. andi TL, L, 7
  742. beq TL, ZERO,.L_M8_L0
  743. .L_M8_L71:
  744. xvld U0, A0, 0x00
  745. xvld U1, A0, 0x20
  746. xvldrepl.d U4, B0, 0x00
  747. xvfmadd.d D0, U0, U4, D0
  748. xvfmadd.d D1, U1, U4, D1
  749. xvldrepl.d U4, B0, 0x08
  750. xvfmadd.d D4, U0, U4, D4
  751. xvfmadd.d D5, U1, U4, D5
  752. xvldrepl.d U4, B0, 0x10
  753. xvfmadd.d D8, U0, U4, D8
  754. xvfmadd.d D9, U1, U4, D9
  755. xvldrepl.d U4, B0, 0x18
  756. xvfmadd.d D12, U0, U4, D12
  757. xvfmadd.d D13, U1, U4, D13
  758. xvldrepl.d U4, B0, 0x20
  759. xvfmadd.d D16, U0, U4, D16
  760. xvfmadd.d D17, U1, U4, D17
  761. xvldrepl.d U4, B0, 0x28
  762. xvfmadd.d D20, U0, U4, D20
  763. xvfmadd.d D21, U1, U4, D21
  764. /* Add stride for A0, B0 */
  765. addi.d A0, A0, 0x40
  766. addi.d B0, B0, 0x30
  767. addi.d TL, TL, -1
  768. blt ZERO,TL, .L_M8_L71
  769. .L_M8_L0:
  770. #if defined(TRMMKERNEL)
  771. xvfmul.d D0, D0, VALPHA
  772. xvfmul.d D1, D1, VALPHA
  773. xvfmul.d D4, D4, VALPHA
  774. xvfmul.d D5, D5, VALPHA
  775. xvfmul.d D8, D8, VALPHA
  776. xvfmul.d D9, D9, VALPHA
  777. xvfmul.d D12, D12, VALPHA
  778. xvfmul.d D13, D13, VALPHA
  779. xvfmul.d D16, D16, VALPHA
  780. xvfmul.d D17, D17, VALPHA
  781. xvfmul.d D20, D20, VALPHA
  782. xvfmul.d D21, D21, VALPHA
  783. #else
  784. /* Load C0 */
  785. xvld U0, C0, 0x00
  786. xvld U1, C0, 0x20
  787. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  788. xvfmadd.d D1, D1, VALPHA, U1
  789. /* Load C1 */
  790. xvld U0, C1, 0x00
  791. xvld U1, C1, 0x20
  792. xvfmadd.d D4, D4, VALPHA, U0
  793. xvfmadd.d D5, D5, VALPHA, U1
  794. /* Load C2 */
  795. xvld U0, C2, 0x00
  796. xvld U1, C2, 0x20
  797. xvfmadd.d D8, D8, VALPHA, U0
  798. xvfmadd.d D9, D9, VALPHA, U1
  799. /* Load C3 */
  800. xvld U0, C3, 0x00
  801. xvld U1, C3, 0x20
  802. xvfmadd.d D12, D12, VALPHA, U0
  803. xvfmadd.d D13, D13, VALPHA, U1
  804. /* Load C4 */
  805. xvld U0, C4, 0x00
  806. xvld U1, C4, 0x20
  807. xvfmadd.d D16, D16, VALPHA, U0
  808. xvfmadd.d D17, D17, VALPHA, U1
  809. /* Load C5 */
  810. xvld U0, C5, 0x00
  811. xvld U1, C5, 0x20
  812. xvfmadd.d D20, D20, VALPHA, U0
  813. xvfmadd.d D21, D21, VALPHA, U1
  814. #endif
  815. /* Store C0 */
  816. xvst D0, C0, 0x00
  817. xvst D1, C0, 0x20
  818. /* Store C1 */
  819. xvst D4, C1, 0x00
  820. xvst D5, C1, 0x20
  821. /* Store C2 */
  822. xvst D8, C2, 0x00
  823. xvst D9, C2, 0x20
  824. /* Store C3 */
  825. xvst D12, C3, 0x00
  826. xvst D13, C3, 0x20
  827. /* Store C4 */
  828. xvst D16, C4, 0x00
  829. xvst D17, C4, 0x20
  830. /* Store C5 */
  831. xvst D20, C5, 0x00
  832. xvst D21, C5, 0x20
  833. /* Add stride for C */
  834. addi.d C0, C0, 0x40
  835. addi.d C1, C1, 0x40
  836. addi.d C2, C2, 0x40
  837. addi.d C3, C3, 0x40
  838. addi.d C4, C4, 0x40
  839. addi.d C5, C5, 0x40
  840. #if defined(TRMMKERNEL)
  841. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  842. sub.d L, K, OFF
  843. #ifdef LEFT
  844. /* number of values in A */
  845. addi.d L, L, -8
  846. #else
  847. /* number of values in B */
  848. addi.d L, L, -6
  849. #endif
  850. slli.d T0, L, 0x06
  851. add.d A0, A0, T0
  852. mul.d T0, L, I48
  853. add.d B0, B0, T0
  854. #endif
  855. #ifdef LEFT
  856. /* number of values in A */
  857. addi.d OFF, OFF, 0x08
  858. #endif
  859. #endif // #if defined(TRMMKERNEL)
  860. /********LOOP (if(N / 6 ) && (M & 8)) End************/
  861. .L_M4:
  862. andi I, M, 4
  863. beq ZERO,I, .L_M2
  864. #if defined(TRMMKERNEL)
  865. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  866. move B0, B
  867. #else
  868. slli.d T0, OFF, 0x05
  869. add.d A0, A0, T0
  870. mul.d T0, OFF, I48
  871. add.d B0, B, T0
  872. #endif
  873. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  874. sub.d L, K, OFF
  875. #elif defined(LEFT)
  876. /* number of values in A */
  877. addi.d L, OFF, 4
  878. #else
  879. /* number of values in B */
  880. addi.d L, OFF, 6
  881. #endif
  882. #else // #if !defined(TRMMKERNEL)
  883. move B0, B
  884. move L, K /* L = bk */
  885. #endif
  886. /* Load 4 * 64 from A0 */
  887. xvld U0, A0, 0x00
  888. xvldrepl.d U4, B0, 0x00
  889. /* line 1 */
  890. xvfmul.d D0, U0, U4
  891. xvldrepl.d U4, B0, 0x08
  892. /* line 2 */
  893. xvfmul.d D4, U0, U4
  894. xvldrepl.d U4, B0, 0x10
  895. /* line 3 */
  896. xvfmul.d D8, U0, U4
  897. xvldrepl.d U4, B0, 0x18
  898. /* line 4 */
  899. xvfmul.d D12, U0, U4
  900. xvldrepl.d U4, B0, 0x20
  901. /* line 5 */
  902. xvfmul.d D16, U0, U4
  903. xvldrepl.d U4, B0, 0x28
  904. /* line 6 */
  905. xvfmul.d D20, U0, U4
  906. /* Add stride for A0 and B0 */
  907. addi.d A0, A0, 0x20
  908. addi.d B0, B0, 0x30
  909. /* Reduce L */
  910. addi.d L, L, -1
  911. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  912. /* if (TL < 1) goto L_M4_L7 */
  913. beq ZERO,TL, .L_M4_L7
  914. .L_M4_TL1: /* TL-- */
  915. /***8-1***/
  916. xvld U0, A0, 0x00
  917. xvldrepl.d U4, B0, 0x00
  918. xvfmadd.d D0, U0, U4, D0
  919. xvldrepl.d U4, B0, 0x08
  920. xvfmadd.d D4, U0, U4, D4
  921. xvldrepl.d U4, B0, 0x10
  922. xvfmadd.d D8, U0, U4, D8
  923. xvldrepl.d U4, B0, 0x18
  924. xvfmadd.d D12, U0, U4, D12
  925. xvldrepl.d U4, B0, 0x20
  926. xvfmadd.d D16, U0, U4, D16
  927. xvldrepl.d U4, B0, 0x28
  928. xvfmadd.d D20, U0, U4, D20
  929. addi.d A0, A0, 0x20
  930. addi.d B0, B0, 0x30
  931. /***8-2***/
  932. xvld U0, A0, 0x00
  933. xvldrepl.d U4, B0, 0x00
  934. xvfmadd.d D0, U0, U4, D0
  935. xvldrepl.d U4, B0, 0x08
  936. xvfmadd.d D4, U0, U4, D4
  937. xvldrepl.d U4, B0, 0x10
  938. xvfmadd.d D8, U0, U4, D8
  939. xvldrepl.d U4, B0, 0x18
  940. xvfmadd.d D12, U0, U4, D12
  941. xvldrepl.d U4, B0, 0x20
  942. xvfmadd.d D16, U0, U4, D16
  943. xvldrepl.d U4, B0, 0x28
  944. xvfmadd.d D20, U0, U4, D20
  945. addi.d A0, A0, 0x20
  946. addi.d B0, B0, 0x30
  947. /***8-3***/
  948. xvld U0, A0, 0x00
  949. xvldrepl.d U4, B0, 0x00
  950. xvfmadd.d D0, U0, U4, D0
  951. xvldrepl.d U4, B0, 0x08
  952. xvfmadd.d D4, U0, U4, D4
  953. xvldrepl.d U4, B0, 0x10
  954. xvfmadd.d D8, U0, U4, D8
  955. xvldrepl.d U4, B0, 0x18
  956. xvfmadd.d D12, U0, U4, D12
  957. xvldrepl.d U4, B0, 0x20
  958. xvfmadd.d D16, U0, U4, D16
  959. xvldrepl.d U4, B0, 0x28
  960. xvfmadd.d D20, U0, U4, D20
  961. addi.d A0, A0, 0x20
  962. addi.d B0, B0, 0x30
  963. /***8-4***/
  964. xvld U0, A0, 0x00
  965. xvldrepl.d U4, B0, 0x00
  966. xvfmadd.d D0, U0, U4, D0
  967. xvldrepl.d U4, B0, 0x08
  968. xvfmadd.d D4, U0, U4, D4
  969. xvldrepl.d U4, B0, 0x10
  970. xvfmadd.d D8, U0, U4, D8
  971. xvldrepl.d U4, B0, 0x18
  972. xvfmadd.d D12, U0, U4, D12
  973. xvldrepl.d U4, B0, 0x20
  974. xvfmadd.d D16, U0, U4, D16
  975. xvldrepl.d U4, B0, 0x28
  976. xvfmadd.d D20, U0, U4, D20
  977. addi.d A0, A0, 0x20
  978. addi.d B0, B0, 0x30
  979. /***8-5***/
  980. xvld U0, A0, 0x00
  981. xvldrepl.d U4, B0, 0x00
  982. xvfmadd.d D0, U0, U4, D0
  983. xvldrepl.d U4, B0, 0x08
  984. xvfmadd.d D4, U0, U4, D4
  985. xvldrepl.d U4, B0, 0x10
  986. xvfmadd.d D8, U0, U4, D8
  987. xvldrepl.d U4, B0, 0x18
  988. xvfmadd.d D12, U0, U4, D12
  989. xvldrepl.d U4, B0, 0x20
  990. xvfmadd.d D16, U0, U4, D16
  991. xvldrepl.d U4, B0, 0x28
  992. xvfmadd.d D20, U0, U4, D20
  993. addi.d A0, A0, 0x20
  994. addi.d B0, B0, 0x30
  995. /***8-6***/
  996. xvld U0, A0, 0x00
  997. xvldrepl.d U4, B0, 0x00
  998. xvfmadd.d D0, U0, U4, D0
  999. xvldrepl.d U4, B0, 0x08
  1000. xvfmadd.d D4, U0, U4, D4
  1001. xvldrepl.d U4, B0, 0x10
  1002. xvfmadd.d D8, U0, U4, D8
  1003. xvldrepl.d U4, B0, 0x18
  1004. xvfmadd.d D12, U0, U4, D12
  1005. xvldrepl.d U4, B0, 0x20
  1006. xvfmadd.d D16, U0, U4, D16
  1007. xvldrepl.d U4, B0, 0x28
  1008. xvfmadd.d D20, U0, U4, D20
  1009. addi.d A0, A0, 0x20
  1010. addi.d B0, B0, 0x30
  1011. /***8-7***/
  1012. xvld U0, A0, 0x00
  1013. xvldrepl.d U4, B0, 0x00
  1014. xvfmadd.d D0, U0, U4, D0
  1015. xvldrepl.d U4, B0, 0x08
  1016. xvfmadd.d D4, U0, U4, D4
  1017. xvldrepl.d U4, B0, 0x10
  1018. xvfmadd.d D8, U0, U4, D8
  1019. xvldrepl.d U4, B0, 0x18
  1020. xvfmadd.d D12, U0, U4, D12
  1021. xvldrepl.d U4, B0, 0x20
  1022. xvfmadd.d D16, U0, U4, D16
  1023. xvldrepl.d U4, B0, 0x28
  1024. xvfmadd.d D20, U0, U4, D20
  1025. addi.d A0, A0, 0x20
  1026. addi.d B0, B0, 0x30
  1027. /***8-8***/
  1028. xvld U0, A0, 0x00
  1029. xvldrepl.d U4, B0, 0x00
  1030. xvfmadd.d D0, U0, U4, D0
  1031. xvldrepl.d U4, B0, 0x08
  1032. xvfmadd.d D4, U0, U4, D4
  1033. xvldrepl.d U4, B0, 0x10
  1034. xvfmadd.d D8, U0, U4, D8
  1035. xvldrepl.d U4, B0, 0x18
  1036. xvfmadd.d D12, U0, U4, D12
  1037. xvldrepl.d U4, B0, 0x20
  1038. xvfmadd.d D16, U0, U4, D16
  1039. xvldrepl.d U4, B0, 0x28
  1040. xvfmadd.d D20, U0, U4, D20
  1041. addi.d A0, A0, 0x20
  1042. addi.d B0, B0, 0x30
  1043. addi.d TL, TL, -1 /* TL-- */
  1044. blt ZERO,TL, .L_M4_TL1
  1045. .L_M4_L7:
  1046. /* if (!(L & 7)) goto L_M4_L0 */
  1047. andi TL, L, 7
  1048. beq TL, ZERO,.L_M4_L0
  1049. .L_M4_L71:
  1050. xvld U0, A0, 0x00
  1051. xvldrepl.d U4, B0, 0x00
  1052. xvfmadd.d D0, U0, U4, D0
  1053. xvldrepl.d U4, B0, 0x08
  1054. xvfmadd.d D4, U0, U4, D4
  1055. xvldrepl.d U4, B0, 0x10
  1056. xvfmadd.d D8, U0, U4, D8
  1057. xvldrepl.d U4, B0, 0x18
  1058. xvfmadd.d D12, U0, U4, D12
  1059. xvldrepl.d U4, B0, 0x20
  1060. xvfmadd.d D16, U0, U4, D16
  1061. xvldrepl.d U4, B0, 0x28
  1062. xvfmadd.d D20, U0, U4, D20
  1063. /* Add stride for A0, B0 */
  1064. addi.d A0, A0, 0x20
  1065. addi.d B0, B0, 0x30
  1066. addi.d TL, TL, -1
  1067. blt ZERO,TL, .L_M4_L71
  1068. .L_M4_L0:
  1069. #if defined(TRMMKERNEL)
  1070. xvfmul.d D0, D0, VALPHA
  1071. xvfmul.d D4, D4, VALPHA
  1072. xvfmul.d D8, D8, VALPHA
  1073. xvfmul.d D12, D12, VALPHA
  1074. xvfmul.d D16, D16, VALPHA
  1075. xvfmul.d D20, D20, VALPHA
  1076. #else
  1077. /* Load C0 */
  1078. xvld U0, C0, 0x00
  1079. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  1080. /* Load C1 */
  1081. xvld U0, C1, 0x00
  1082. xvfmadd.d D4, D4, VALPHA, U0
  1083. /* Load C2 */
  1084. xvld U0, C2, 0x00
  1085. xvfmadd.d D8, D8, VALPHA, U0
  1086. /* Load C3 */
  1087. xvld U0, C3, 0x00
  1088. xvfmadd.d D12, D12, VALPHA, U0
  1089. /* Load C4 */
  1090. xvld U0, C4, 0x00
  1091. xvfmadd.d D16, D16, VALPHA, U0
  1092. /* Load C5 */
  1093. xvld U0, C5, 0x00
  1094. xvfmadd.d D20, D20, VALPHA, U0
  1095. #endif
  1096. /* Store C0 */
  1097. xvst D0, C0, 0x00
  1098. /* Store C1 */
  1099. xvst D4, C1, 0x00
  1100. /* Store C2 */
  1101. xvst D8, C2, 0x00
  1102. /* Store C3 */
  1103. xvst D12, C3, 0x00
  1104. /* Store C4 */
  1105. xvst D16, C4, 0x00
  1106. /* Store C5 */
  1107. xvst D20, C5, 0x00
  1108. /* Add stride for C */
  1109. addi.d C0, C0, 0x20
  1110. addi.d C1, C1, 0x20
  1111. addi.d C2, C2, 0x20
  1112. addi.d C3, C3, 0x20
  1113. addi.d C4, C4, 0x20
  1114. addi.d C5, C5, 0x20
  1115. #if defined(TRMMKERNEL)
  1116. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  1117. sub.d L, K, OFF
  1118. #ifdef LEFT
  1119. /* number of values in A */
  1120. addi.d L, L, -4
  1121. #else
  1122. /* number of values in B */
  1123. addi.d L, L, -6
  1124. #endif
  1125. slli.d T0, L, 0x05
  1126. add.d A0, A0, T0
  1127. mul.d T0, L, I48
  1128. add.d B0, B0, T0
  1129. #endif
  1130. #ifdef LEFT
  1131. /* number of values in A */
  1132. addi.d OFF, OFF, 0x04
  1133. #endif
  1134. #endif // #if defined(TRMMKERNEL)
  1135. /********LOOP (if(N / 6 ) && (M & 4) ) End************/
  1136. .L_M2:
  1137. andi I, M, 2
  1138. beq ZERO,I, .L_M1
  1139. #if defined(TRMMKERNEL)
  1140. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  1141. move B0, B
  1142. #else
  1143. slli.d T0, OFF, 0x04
  1144. add.d A0, A0, T0
  1145. mul.d T0, OFF, I48
  1146. add.d B0, B, T0
  1147. #endif
  1148. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  1149. sub.d L, K, OFF
  1150. #elif defined(LEFT)
  1151. /* number of values in A */
  1152. addi.d L, OFF, 2
  1153. #else
  1154. /* number of values in B */
  1155. addi.d L, OFF, 6
  1156. #endif
  1157. #else // #if !defined(TRMMKERNEL)
  1158. move B0, B
  1159. move L, K /* L = bk */
  1160. #endif
  1161. /* Load 2 * 64 from A0 */
  1162. xvld U0, A0, 0x00
  1163. xvldrepl.d U4, B0, 0x00
  1164. /* line 1 */
  1165. xvfmul.d D0, U0, U4
  1166. xvldrepl.d U4, B0, 0x08
  1167. /* line 2 */
  1168. xvfmul.d D4, U0, U4
  1169. xvldrepl.d U4, B0, 0x10
  1170. /* line 3 */
  1171. xvfmul.d D8, U0, U4
  1172. xvldrepl.d U4, B0, 0x18
  1173. /* line 4 */
  1174. xvfmul.d D12, U0, U4
  1175. xvldrepl.d U4, B0, 0x20
  1176. /* line 5 */
  1177. xvfmul.d D16, U0, U4
  1178. xvldrepl.d U4, B0, 0x28
  1179. /* line 6 */
  1180. xvfmul.d D20, U0, U4
  1181. /* Add stride for A0 and B0 */
  1182. addi.d A0, A0, 0x10
  1183. addi.d B0, B0, 0x30
  1184. /* Reduce L */
  1185. addi.d L, L, -1
  1186. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  1187. /* if (TL < 1) goto L_M2_L7 */
  1188. beq ZERO,TL, .L_M2_L7
  1189. .L_M2_TL1: /* TL-- */
  1190. /***8-1***/
  1191. /* Load 2 * 64 from A0 */
  1192. xvld U0, A0, 0x00
  1193. xvldrepl.d U4, B0, 0x00
  1194. xvfmadd.d D0, U0, U4, D0
  1195. xvldrepl.d U4, B0, 0x08
  1196. xvfmadd.d D4, U0, U4, D4
  1197. xvldrepl.d U4, B0, 0x10
  1198. xvfmadd.d D8, U0, U4, D8
  1199. xvldrepl.d U4, B0, 0x18
  1200. xvfmadd.d D12, U0, U4, D12
  1201. xvldrepl.d U4, B0, 0x20
  1202. xvfmadd.d D16, U0, U4, D16
  1203. xvldrepl.d U4, B0, 0x28
  1204. xvfmadd.d D20, U0, U4, D20
  1205. addi.d A0, A0, 0x10
  1206. addi.d B0, B0, 0x30
  1207. /***8-2***/
  1208. xvld U0, A0, 0x00
  1209. xvldrepl.d U4, B0, 0x00
  1210. xvfmadd.d D0, U0, U4, D0
  1211. xvldrepl.d U4, B0, 0x08
  1212. xvfmadd.d D4, U0, U4, D4
  1213. xvldrepl.d U4, B0, 0x10
  1214. xvfmadd.d D8, U0, U4, D8
  1215. xvldrepl.d U4, B0, 0x18
  1216. xvfmadd.d D12, U0, U4, D12
  1217. xvldrepl.d U4, B0, 0x20
  1218. xvfmadd.d D16, U0, U4, D16
  1219. xvldrepl.d U4, B0, 0x28
  1220. xvfmadd.d D20, U0, U4, D20
  1221. addi.d A0, A0, 0x10
  1222. addi.d B0, B0, 0x30
  1223. /***8-3***/
  1224. xvld U0, A0, 0x00
  1225. xvldrepl.d U4, B0, 0x00
  1226. xvfmadd.d D0, U0, U4, D0
  1227. xvldrepl.d U4, B0, 0x08
  1228. xvfmadd.d D4, U0, U4, D4
  1229. xvldrepl.d U4, B0, 0x10
  1230. xvfmadd.d D8, U0, U4, D8
  1231. xvldrepl.d U4, B0, 0x18
  1232. xvfmadd.d D12, U0, U4, D12
  1233. xvldrepl.d U4, B0, 0x20
  1234. xvfmadd.d D16, U0, U4, D16
  1235. xvldrepl.d U4, B0, 0x28
  1236. xvfmadd.d D20, U0, U4, D20
  1237. addi.d A0, A0, 0x10
  1238. addi.d B0, B0, 0x30
  1239. /***8-4***/
  1240. xvld U0, A0, 0x00
  1241. xvldrepl.d U4, B0, 0x00
  1242. xvfmadd.d D0, U0, U4, D0
  1243. xvldrepl.d U4, B0, 0x08
  1244. xvfmadd.d D4, U0, U4, D4
  1245. xvldrepl.d U4, B0, 0x10
  1246. xvfmadd.d D8, U0, U4, D8
  1247. xvldrepl.d U4, B0, 0x18
  1248. xvfmadd.d D12, U0, U4, D12
  1249. xvldrepl.d U4, B0, 0x20
  1250. xvfmadd.d D16, U0, U4, D16
  1251. xvldrepl.d U4, B0, 0x28
  1252. xvfmadd.d D20, U0, U4, D20
  1253. addi.d A0, A0, 0x10
  1254. addi.d B0, B0, 0x30
  1255. /***8-5***/
  1256. xvld U0, A0, 0x00
  1257. xvldrepl.d U4, B0, 0x00
  1258. xvfmadd.d D0, U0, U4, D0
  1259. xvldrepl.d U4, B0, 0x08
  1260. xvfmadd.d D4, U0, U4, D4
  1261. xvldrepl.d U4, B0, 0x10
  1262. xvfmadd.d D8, U0, U4, D8
  1263. xvldrepl.d U4, B0, 0x18
  1264. xvfmadd.d D12, U0, U4, D12
  1265. xvldrepl.d U4, B0, 0x20
  1266. xvfmadd.d D16, U0, U4, D16
  1267. xvldrepl.d U4, B0, 0x28
  1268. xvfmadd.d D20, U0, U4, D20
  1269. addi.d A0, A0, 0x10
  1270. addi.d B0, B0, 0x30
  1271. /***8-6***/
  1272. xvld U0, A0, 0x00
  1273. xvldrepl.d U4, B0, 0x00
  1274. xvfmadd.d D0, U0, U4, D0
  1275. xvldrepl.d U4, B0, 0x08
  1276. xvfmadd.d D4, U0, U4, D4
  1277. xvldrepl.d U4, B0, 0x10
  1278. xvfmadd.d D8, U0, U4, D8
  1279. xvldrepl.d U4, B0, 0x18
  1280. xvfmadd.d D12, U0, U4, D12
  1281. xvldrepl.d U4, B0, 0x20
  1282. xvfmadd.d D16, U0, U4, D16
  1283. xvldrepl.d U4, B0, 0x28
  1284. xvfmadd.d D20, U0, U4, D20
  1285. addi.d A0, A0, 0x10
  1286. addi.d B0, B0, 0x30
  1287. /***8-7***/
  1288. xvld U0, A0, 0x00
  1289. xvldrepl.d U4, B0, 0x00
  1290. xvfmadd.d D0, U0, U4, D0
  1291. xvldrepl.d U4, B0, 0x08
  1292. xvfmadd.d D4, U0, U4, D4
  1293. xvldrepl.d U4, B0, 0x10
  1294. xvfmadd.d D8, U0, U4, D8
  1295. xvldrepl.d U4, B0, 0x18
  1296. xvfmadd.d D12, U0, U4, D12
  1297. xvldrepl.d U4, B0, 0x20
  1298. xvfmadd.d D16, U0, U4, D16
  1299. xvldrepl.d U4, B0, 0x28
  1300. xvfmadd.d D20, U0, U4, D20
  1301. addi.d A0, A0, 0x10
  1302. addi.d B0, B0, 0x30
  1303. /***8-8***/
  1304. xvld U0, A0, 0x00
  1305. xvldrepl.d U4, B0, 0x00
  1306. xvfmadd.d D0, U0, U4, D0
  1307. xvldrepl.d U4, B0, 0x08
  1308. xvfmadd.d D4, U0, U4, D4
  1309. xvldrepl.d U4, B0, 0x10
  1310. xvfmadd.d D8, U0, U4, D8
  1311. xvldrepl.d U4, B0, 0x18
  1312. xvfmadd.d D12, U0, U4, D12
  1313. xvldrepl.d U4, B0, 0x20
  1314. xvfmadd.d D16, U0, U4, D16
  1315. xvldrepl.d U4, B0, 0x28
  1316. xvfmadd.d D20, U0, U4, D20
  1317. addi.d A0, A0, 0x10
  1318. addi.d B0, B0, 0x30
  1319. addi.d TL, TL, -1 /* TL-- */
  1320. blt ZERO,TL, .L_M2_TL1
  1321. .L_M2_L7:
  1322. /* if (!(L & 7)) goto L_M2_L0 */
  1323. andi TL, L, 7
  1324. beq TL, ZERO,.L_M2_L0
  1325. .L_M2_L71:
  1326. xvld U0, A0, 0x00
  1327. xvldrepl.d U4, B0, 0x00
  1328. xvfmadd.d D0, U0, U4, D0
  1329. xvldrepl.d U4, B0, 0x08
  1330. xvfmadd.d D4, U0, U4, D4
  1331. xvldrepl.d U4, B0, 0x10
  1332. xvfmadd.d D8, U0, U4, D8
  1333. xvldrepl.d U4, B0, 0x18
  1334. xvfmadd.d D12, U0, U4, D12
  1335. xvldrepl.d U4, B0, 0x20
  1336. xvfmadd.d D16, U0, U4, D16
  1337. xvldrepl.d U4, B0, 0x28
  1338. xvfmadd.d D20, U0, U4, D20
  1339. /* Add stride for A0, B0 */
  1340. addi.d A0, A0, 0x10
  1341. addi.d B0, B0, 0x30
  1342. addi.d TL, TL, -1
  1343. blt ZERO,TL, .L_M2_L71
  1344. .L_M2_L0:
  1345. #if defined(TRMMKERNEL)
  1346. xvfmul.d D0, D0, VALPHA
  1347. xvfmul.d D4, D4, VALPHA
  1348. xvfmul.d D8, D8, VALPHA
  1349. xvfmul.d D12, D12, VALPHA
  1350. xvfmul.d D16, D16, VALPHA
  1351. xvfmul.d D20, D20, VALPHA
  1352. #else
  1353. /* Load C0 */
  1354. xvld U0, C0, 0x00
  1355. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  1356. /* Load C1 */
  1357. xvld U0, C1, 0x00
  1358. xvfmadd.d D4, D4, VALPHA, U0
  1359. /* Load C2 */
  1360. xvld U0, C2, 0x00
  1361. xvfmadd.d D8, D8, VALPHA, U0
  1362. /* Load C3 */
  1363. xvld U0, C3, 0x00
  1364. xvfmadd.d D12, D12, VALPHA, U0
  1365. /* Load C4 */
  1366. xvld U0, C4, 0x00
  1367. xvfmadd.d D16, D16, VALPHA, U0
  1368. /* Load C5 */
  1369. xvld U0, C5, 0x00
  1370. xvfmadd.d D20, D20, VALPHA, U0
  1371. #endif
  1372. xvstelm.d D0, C0, 0x00, 0x00
  1373. xvstelm.d D4, C1, 0x00, 0x00
  1374. xvstelm.d D8, C2, 0x00, 0x00
  1375. xvstelm.d D12, C3, 0x00, 0x00
  1376. xvstelm.d D16, C4, 0x00, 0x00
  1377. xvstelm.d D20, C5, 0x00, 0x00
  1378. xvstelm.d D0, C0, 0x08, 0x01
  1379. xvstelm.d D4, C1, 0x08, 0x01
  1380. xvstelm.d D8, C2, 0x08, 0x01
  1381. xvstelm.d D12, C3, 0x08, 0x01
  1382. xvstelm.d D16, C4, 0x08, 0x01
  1383. xvstelm.d D20, C5, 0x08, 0x01
  1384. /* Add stride for C */
  1385. addi.d C0, C0, 0x10
  1386. addi.d C1, C1, 0x10
  1387. addi.d C2, C2, 0x10
  1388. addi.d C3, C3, 0x10
  1389. addi.d C4, C4, 0x10
  1390. addi.d C5, C5, 0x10
  1391. #if defined(TRMMKERNEL)
  1392. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  1393. sub.d L, K, OFF
  1394. #ifdef LEFT
  1395. /* number of values in A */
  1396. addi.d L, L, -2
  1397. #else
  1398. /* number of values in B */
  1399. addi.d L, L, -6
  1400. #endif
  1401. slli.d T0, L, 0x04
  1402. add.d A0, A0, T0
  1403. mul.d T0, L, I48
  1404. add.d B0, B0, T0
  1405. #endif
  1406. #ifdef LEFT
  1407. /* number of values in A */
  1408. addi.d OFF, OFF, 0x02
  1409. #endif
  1410. #endif // #if defined(TRMMKERNEL)
  1411. /********LOOP (if(N / 6 ) && (M & 2) ) End************/
  1412. .L_M1:
  1413. andi I, M, 1
  1414. beq ZERO,I, .L_M0
  1415. #if defined(TRMMKERNEL)
  1416. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  1417. move B0, B
  1418. #else
  1419. slli.d T0, OFF, 0x03
  1420. add.d A0, A0, T0
  1421. mul.d T0, OFF, I48
  1422. add.d B0, B, T0
  1423. #endif
  1424. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  1425. sub.d L, K, OFF
  1426. #elif defined(LEFT)
  1427. /* number of values in A */
  1428. addi.d L, OFF, 1
  1429. #else
  1430. /* number of values in B */
  1431. addi.d L, OFF, 6
  1432. #endif
  1433. #else // #if !defined(TRMMKERNEL)
  1434. move B0, B
  1435. move L, K /* L = bk */
  1436. #endif
  1437. /* Load 1 * 64 from A0 */
  1438. xvld U0, A0, 0x00
  1439. xvldrepl.d U4, B0, 0x00
  1440. /* line 1 */
  1441. xvfmul.d D0, U0, U4
  1442. xvldrepl.d U4, B0, 0x08
  1443. /* line 2 */
  1444. xvfmul.d D4, U0, U4
  1445. xvldrepl.d U4, B0, 0x10
  1446. /* line 3 */
  1447. xvfmul.d D8, U0, U4
  1448. xvldrepl.d U4, B0, 0x18
  1449. /* line 4 */
  1450. xvfmul.d D12, U0, U4
  1451. xvldrepl.d U4, B0, 0x20
  1452. /* line 5 */
  1453. xvfmul.d D16, U0, U4
  1454. xvldrepl.d U4, B0, 0x28
  1455. /* line 6 */
  1456. xvfmul.d D20, U0, U4
  1457. /* Add stride for A0 and B0 */
  1458. addi.d A0, A0, 0x08
  1459. addi.d B0, B0, 0x30
  1460. /* Reduce L */
  1461. addi.d L, L, -1
  1462. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  1463. /* if (TL < 1) goto L_M1_L7 */
  1464. beq ZERO,TL, .L_M1_L7
  1465. .L_M1_TL1: /* TL-- */
  1466. /***8-1***/
  1467. /* Load 1 * 64 from A0 */
  1468. xvld U0, A0, 0x00
  1469. xvldrepl.d U4, B0, 0x00
  1470. xvfmadd.d D0, U0, U4, D0
  1471. xvldrepl.d U4, B0, 0x08
  1472. xvfmadd.d D4, U0, U4, D4
  1473. xvldrepl.d U4, B0, 0x10
  1474. xvfmadd.d D8, U0, U4, D8
  1475. xvldrepl.d U4, B0, 0x18
  1476. xvfmadd.d D12, U0, U4, D12
  1477. xvldrepl.d U4, B0, 0x20
  1478. xvfmadd.d D16, U0, U4, D16
  1479. xvldrepl.d U4, B0, 0x28
  1480. xvfmadd.d D20, U0, U4, D20
  1481. addi.d A0, A0, 0x08
  1482. addi.d B0, B0, 0x30
  1483. /***8-2***/
  1484. xvld U0, A0, 0x00
  1485. xvldrepl.d U4, B0, 0x00
  1486. xvfmadd.d D0, U0, U4, D0
  1487. xvldrepl.d U4, B0, 0x08
  1488. xvfmadd.d D4, U0, U4, D4
  1489. xvldrepl.d U4, B0, 0x10
  1490. xvfmadd.d D8, U0, U4, D8
  1491. xvldrepl.d U4, B0, 0x18
  1492. xvfmadd.d D12, U0, U4, D12
  1493. xvldrepl.d U4, B0, 0x20
  1494. xvfmadd.d D16, U0, U4, D16
  1495. xvldrepl.d U4, B0, 0x28
  1496. xvfmadd.d D20, U0, U4, D20
  1497. addi.d A0, A0, 0x08
  1498. addi.d B0, B0, 0x30
  1499. /***8-3***/
  1500. xvld U0, A0, 0x00
  1501. xvldrepl.d U4, B0, 0x00
  1502. xvfmadd.d D0, U0, U4, D0
  1503. xvldrepl.d U4, B0, 0x08
  1504. xvfmadd.d D4, U0, U4, D4
  1505. xvldrepl.d U4, B0, 0x10
  1506. xvfmadd.d D8, U0, U4, D8
  1507. xvldrepl.d U4, B0, 0x18
  1508. xvfmadd.d D12, U0, U4, D12
  1509. xvldrepl.d U4, B0, 0x20
  1510. xvfmadd.d D16, U0, U4, D16
  1511. xvldrepl.d U4, B0, 0x28
  1512. xvfmadd.d D20, U0, U4, D20
  1513. addi.d A0, A0, 0x08
  1514. addi.d B0, B0, 0x30
  1515. /***8-4***/
  1516. xvld U0, A0, 0x00
  1517. xvldrepl.d U4, B0, 0x00
  1518. xvfmadd.d D0, U0, U4, D0
  1519. xvldrepl.d U4, B0, 0x08
  1520. xvfmadd.d D4, U0, U4, D4
  1521. xvldrepl.d U4, B0, 0x10
  1522. xvfmadd.d D8, U0, U4, D8
  1523. xvldrepl.d U4, B0, 0x18
  1524. xvfmadd.d D12, U0, U4, D12
  1525. xvldrepl.d U4, B0, 0x20
  1526. xvfmadd.d D16, U0, U4, D16
  1527. xvldrepl.d U4, B0, 0x28
  1528. xvfmadd.d D20, U0, U4, D20
  1529. addi.d A0, A0, 0x08
  1530. addi.d B0, B0, 0x30
  1531. /***8-5***/
  1532. xvld U0, A0, 0x00
  1533. xvldrepl.d U4, B0, 0x00
  1534. xvfmadd.d D0, U0, U4, D0
  1535. xvldrepl.d U4, B0, 0x08
  1536. xvfmadd.d D4, U0, U4, D4
  1537. xvldrepl.d U4, B0, 0x10
  1538. xvfmadd.d D8, U0, U4, D8
  1539. xvldrepl.d U4, B0, 0x18
  1540. xvfmadd.d D12, U0, U4, D12
  1541. xvldrepl.d U4, B0, 0x20
  1542. xvfmadd.d D16, U0, U4, D16
  1543. xvldrepl.d U4, B0, 0x28
  1544. xvfmadd.d D20, U0, U4, D20
  1545. addi.d A0, A0, 0x08
  1546. addi.d B0, B0, 0x30
  1547. /***8-6***/
  1548. xvld U0, A0, 0x00
  1549. xvldrepl.d U4, B0, 0x00
  1550. xvfmadd.d D0, U0, U4, D0
  1551. xvldrepl.d U4, B0, 0x08
  1552. xvfmadd.d D4, U0, U4, D4
  1553. xvldrepl.d U4, B0, 0x10
  1554. xvfmadd.d D8, U0, U4, D8
  1555. xvldrepl.d U4, B0, 0x18
  1556. xvfmadd.d D12, U0, U4, D12
  1557. xvldrepl.d U4, B0, 0x20
  1558. xvfmadd.d D16, U0, U4, D16
  1559. xvldrepl.d U4, B0, 0x28
  1560. xvfmadd.d D20, U0, U4, D20
  1561. addi.d A0, A0, 0x08
  1562. addi.d B0, B0, 0x30
  1563. /***8-7***/
  1564. xvld U0, A0, 0x00
  1565. xvldrepl.d U4, B0, 0x00
  1566. xvfmadd.d D0, U0, U4, D0
  1567. xvldrepl.d U4, B0, 0x08
  1568. xvfmadd.d D4, U0, U4, D4
  1569. xvldrepl.d U4, B0, 0x10
  1570. xvfmadd.d D8, U0, U4, D8
  1571. xvldrepl.d U4, B0, 0x18
  1572. xvfmadd.d D12, U0, U4, D12
  1573. xvldrepl.d U4, B0, 0x20
  1574. xvfmadd.d D16, U0, U4, D16
  1575. xvldrepl.d U4, B0, 0x28
  1576. xvfmadd.d D20, U0, U4, D20
  1577. addi.d A0, A0, 0x08
  1578. addi.d B0, B0, 0x30
  1579. /***8-8***/
  1580. xvld U0, A0, 0x00
  1581. xvldrepl.d U4, B0, 0x00
  1582. xvfmadd.d D0, U0, U4, D0
  1583. xvldrepl.d U4, B0, 0x08
  1584. xvfmadd.d D4, U0, U4, D4
  1585. xvldrepl.d U4, B0, 0x10
  1586. xvfmadd.d D8, U0, U4, D8
  1587. xvldrepl.d U4, B0, 0x18
  1588. xvfmadd.d D12, U0, U4, D12
  1589. xvldrepl.d U4, B0, 0x20
  1590. xvfmadd.d D16, U0, U4, D16
  1591. xvldrepl.d U4, B0, 0x28
  1592. xvfmadd.d D20, U0, U4, D20
  1593. addi.d A0, A0, 0x08
  1594. addi.d B0, B0, 0x30
  1595. addi.d TL, TL, -1 /* TL-- */
  1596. blt ZERO,TL, .L_M1_TL1
  1597. .L_M1_L7:
  1598. /* if (!(L & 7)) goto L_M1_L0 */
  1599. andi TL, L, 7
  1600. beq TL, ZERO,.L_M1_L0
  1601. .L_M1_L71:
  1602. xvld U0, A0, 0x00
  1603. xvldrepl.d U4, B0, 0x00
  1604. xvfmadd.d D0, U0, U4, D0
  1605. xvldrepl.d U4, B0, 0x08
  1606. xvfmadd.d D4, U0, U4, D4
  1607. xvldrepl.d U4, B0, 0x10
  1608. xvfmadd.d D8, U0, U4, D8
  1609. xvldrepl.d U4, B0, 0x18
  1610. xvfmadd.d D12, U0, U4, D12
  1611. xvldrepl.d U4, B0, 0x20
  1612. xvfmadd.d D16, U0, U4, D16
  1613. xvldrepl.d U4, B0, 0x28
  1614. xvfmadd.d D20, U0, U4, D20
  1615. /* Add stride for A0, B0 */
  1616. addi.d A0, A0, 0x08
  1617. addi.d B0, B0, 0x30
  1618. addi.d TL, TL, -1
  1619. blt ZERO,TL, .L_M1_L71
  1620. .L_M1_L0:
  1621. #ifdef TRMMKERNEL
  1622. xvfmul.d D0, D0, VALPHA
  1623. xvfmul.d D4, D4, VALPHA
  1624. xvfmul.d D8, D8, VALPHA
  1625. xvfmul.d D12, D12, VALPHA
  1626. xvfmul.d D16, D16, VALPHA
  1627. xvfmul.d D20, D20, VALPHA
  1628. #else
  1629. /* Load C0 */
  1630. xvld U0, C0, 0x00
  1631. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  1632. /* Load C1 */
  1633. xvld U0, C1, 0x00
  1634. xvfmadd.d D4, D4, VALPHA, U0
  1635. /* Load C2 */
  1636. xvld U0, C2, 0x00
  1637. xvfmadd.d D8, D8, VALPHA, U0
  1638. /* Load C3 */
  1639. xvld U0, C3, 0x00
  1640. xvfmadd.d D12, D12, VALPHA, U0
  1641. /* Load C4 */
  1642. xvld U0, C4, 0x00
  1643. xvfmadd.d D16, D16, VALPHA, U0
  1644. /* Load C5 */
  1645. xvld U0, C5, 0x00
  1646. xvfmadd.d D20, D20, VALPHA, U0
  1647. #endif
  1648. xvstelm.d D0, C0, 0x00, 0x00
  1649. xvstelm.d D4, C1, 0x00, 0x00
  1650. xvstelm.d D8, C2, 0x00, 0x00
  1651. xvstelm.d D12, C3, 0x00, 0x00
  1652. xvstelm.d D16, C4, 0x00, 0x00
  1653. xvstelm.d D20, C5, 0x00, 0x00
  1654. /* Add stride for C */
  1655. addi.d C0, C0, 0x08
  1656. addi.d C1, C1, 0x08
  1657. addi.d C2, C2, 0x08
  1658. addi.d C3, C3, 0x08
  1659. addi.d C4, C4, 0x08
  1660. addi.d C5, C5, 0x08
  1661. #if defined(TRMMKERNEL)
  1662. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  1663. sub.d L, K, OFF
  1664. #ifdef LEFT
  1665. /* number of values in A */
  1666. addi.d L, L, -1
  1667. #else
  1668. /* number of values in B */
  1669. addi.d L, L, -6
  1670. #endif
  1671. slli.d T0, L, 0x03
  1672. add.d A0, A0, T0
  1673. mul.d T0, L, I48
  1674. add.d B0, B0, T0
  1675. #endif
  1676. #ifdef LEFT
  1677. /* number of values in A */
  1678. addi.d OFF, OFF, 0x01
  1679. #endif
  1680. #endif // #if defined(TRMMKERNEL)
  1681. /********LOOP (if(N / 6 ) && (M & 1) ) End************/
  1682. .L_M0:
  1683. /* Add stride for B and C
  1684. * B += (K * 6)
  1685. * C += (LDC * 6)
  1686. */
  1687. /* since the array type is double,
  1688. * so we must mul 48
  1689. */
  1690. addi.d T2, ZERO,48
  1691. mul.d T0, K, T2
  1692. mul.d T1, LDC, T2
  1693. add.d B, B, T0
  1694. add.d C, C, T1
  1695. #if defined(TRMMKERNEL) && !defined(LEFT)
  1696. addi.d OFF, OFF, 0x06
  1697. #endif
  1698. blt ZERO, J, .L_J1
  1699. //////////////// go back to L_J1 /////////////////
  1700. /////////////////////////////////////////////////
  1701. /************************ Condition 1 if((N >> 2) && (M >> 3)) END !!! ************************/
  1702. .L_N5:
  1703. andi J, N, 4
  1704. beq ZERO, J, .L_N3
  1705. /************************* Condition 2 if((N & 4) && (M >> 4)) START !!! *************************
  1706. * dgemm_core_16x4 */
  1707. move C0, C
  1708. move A0, A
  1709. slli.d T0, LDC, 3
  1710. add.d C1, C0, T0
  1711. add.d C2, C1, T0
  1712. add.d C3, C2, T0
  1713. #if defined(TRMMKERNEL) && defined(LEFT)
  1714. move OFF, OFFSET
  1715. #endif
  1716. /* if (!(M >> 3)) goto L_N5_M8 */
  1717. srai.d I, M, 4 /* I = bm >> 4 */
  1718. beq ZERO, I, .L_N5_M8
  1719. .L_N5_I1:
  1720. #if defined(TRMMKERNEL)
  1721. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  1722. move B0, B
  1723. #else
  1724. slli.d T0, OFF, 0x07
  1725. add.d A0, A0, T0
  1726. slli.d T0, OFF, 0x05
  1727. add.d B0, B, T0
  1728. #endif
  1729. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  1730. sub.d L, K, OFF
  1731. #elif defined(LEFT)
  1732. /* number of values in A */
  1733. addi.d L, OFF, 16
  1734. #else
  1735. /* number of values in B */
  1736. addi.d L, OFF, 4
  1737. #endif
  1738. #else // #if !defined(TRMMKERNEL)
  1739. move B0, B
  1740. move L, K /* L = bk */
  1741. #endif
  1742. /* Load 16 * 64 from A0
  1743. * U0 = {a3, a2, a1, a0}
  1744. * U1 = {a7, a6, a5, a4}
  1745. * U2 = {a11, a10, a9, a8}
  1746. * U3 = {a15, a14, a13, a12}
  1747. */
  1748. xvld U0, A0, 0x00
  1749. xvld U1, A0, 0x20
  1750. xvld U2, A0, 0x40
  1751. xvld U3, A0, 0x60
  1752. xvldrepl.d U4, B0, 0x00
  1753. /* line 1 */
  1754. xvfmul.d D0, U0, U4
  1755. xvfmul.d D1, U1, U4
  1756. xvfmul.d D2, U2, U4
  1757. xvfmul.d D3, U3, U4
  1758. xvldrepl.d U4, B0, 0x08
  1759. /* line 2 */
  1760. xvfmul.d D4, U0, U4
  1761. xvfmul.d D5, U1, U4
  1762. xvfmul.d D6, U2, U4
  1763. xvfmul.d D7, U3, U4
  1764. xvldrepl.d U4, B0, 0x10
  1765. /* line 3 */
  1766. xvfmul.d D8, U0, U4
  1767. xvfmul.d D9, U1, U4
  1768. xvfmul.d D10, U2, U4
  1769. xvfmul.d D11, U3, U4
  1770. xvldrepl.d U4, B0, 0x18
  1771. /* line 4 */
  1772. xvfmul.d D12, U0, U4
  1773. xvfmul.d D13, U1, U4
  1774. xvfmul.d D14, U2, U4
  1775. xvfmul.d D15, U3, U4
  1776. /* Add stride for A0 and B0 */
  1777. addi.d A0, A0, 0x80
  1778. addi.d B0, B0, 0x20
  1779. /* Reduce L */
  1780. addi.d L, L, -1
  1781. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  1782. /* if (TL < 1) goto L_N5_L7 */
  1783. beq ZERO,TL, .L_N5_L7
  1784. .L_N5_TL1: /* TL-- */
  1785. /***8-1***/
  1786. /* Load 16 * 64 from A0 */
  1787. xvld U0, A0, 0x00
  1788. xvld U1, A0, 0x20
  1789. xvld U2, A0, 0x40
  1790. xvld U3, A0, 0x60
  1791. xvldrepl.d U4, B0, 0x00
  1792. xvfmadd.d D0, U0, U4, D0
  1793. xvfmadd.d D1, U1, U4, D1
  1794. xvfmadd.d D2, U2, U4, D2
  1795. xvfmadd.d D3, U3, U4, D3
  1796. xvldrepl.d U4, B0, 0x08
  1797. xvfmadd.d D4, U0, U4, D4
  1798. xvfmadd.d D5, U1, U4, D5
  1799. xvfmadd.d D6, U2, U4, D6
  1800. xvfmadd.d D7, U3, U4, D7
  1801. xvldrepl.d U4, B0, 0x10
  1802. xvfmadd.d D8, U0, U4, D8
  1803. xvfmadd.d D9, U1, U4, D9
  1804. xvfmadd.d D10, U2, U4, D10
  1805. xvfmadd.d D11, U3, U4, D11
  1806. xvldrepl.d U4, B0, 0x18
  1807. xvfmadd.d D12, U0, U4, D12
  1808. xvfmadd.d D13, U1, U4, D13
  1809. xvfmadd.d D14, U2, U4, D14
  1810. xvfmadd.d D15, U3, U4, D15
  1811. addi.d A0, A0, 0x80
  1812. addi.d B0, B0, 0x20
  1813. /***8-2***/
  1814. /* Load 16 * 64 from A0 */
  1815. xvld U0, A0, 0x00
  1816. xvld U1, A0, 0x20
  1817. xvld U2, A0, 0x40
  1818. xvld U3, A0, 0x60
  1819. xvldrepl.d U4, B0, 0x00
  1820. xvfmadd.d D0, U0, U4, D0
  1821. xvfmadd.d D1, U1, U4, D1
  1822. xvfmadd.d D2, U2, U4, D2
  1823. xvfmadd.d D3, U3, U4, D3
  1824. xvldrepl.d U4, B0, 0x08
  1825. xvfmadd.d D4, U0, U4, D4
  1826. xvfmadd.d D5, U1, U4, D5
  1827. xvfmadd.d D6, U2, U4, D6
  1828. xvfmadd.d D7, U3, U4, D7
  1829. xvldrepl.d U4, B0, 0x10
  1830. xvfmadd.d D8, U0, U4, D8
  1831. xvfmadd.d D9, U1, U4, D9
  1832. xvfmadd.d D10, U2, U4, D10
  1833. xvfmadd.d D11, U3, U4, D11
  1834. xvldrepl.d U4, B0, 0x18
  1835. xvfmadd.d D12, U0, U4, D12
  1836. xvfmadd.d D13, U1, U4, D13
  1837. xvfmadd.d D14, U2, U4, D14
  1838. xvfmadd.d D15, U3, U4, D15
  1839. addi.d A0, A0, 0x80
  1840. addi.d B0, B0, 0x20
  1841. /***8-3***/
  1842. /* Load 16 * 64 from A0 */
  1843. xvld U0, A0, 0x00
  1844. xvld U1, A0, 0x20
  1845. xvld U2, A0, 0x40
  1846. xvld U3, A0, 0x60
  1847. xvldrepl.d U4, B0, 0x00
  1848. xvfmadd.d D0, U0, U4, D0
  1849. xvfmadd.d D1, U1, U4, D1
  1850. xvfmadd.d D2, U2, U4, D2
  1851. xvfmadd.d D3, U3, U4, D3
  1852. xvldrepl.d U4, B0, 0x08
  1853. xvfmadd.d D4, U0, U4, D4
  1854. xvfmadd.d D5, U1, U4, D5
  1855. xvfmadd.d D6, U2, U4, D6
  1856. xvfmadd.d D7, U3, U4, D7
  1857. xvldrepl.d U4, B0, 0x10
  1858. xvfmadd.d D8, U0, U4, D8
  1859. xvfmadd.d D9, U1, U4, D9
  1860. xvfmadd.d D10, U2, U4, D10
  1861. xvfmadd.d D11, U3, U4, D11
  1862. xvldrepl.d U4, B0, 0x18
  1863. xvfmadd.d D12, U0, U4, D12
  1864. xvfmadd.d D13, U1, U4, D13
  1865. xvfmadd.d D14, U2, U4, D14
  1866. xvfmadd.d D15, U3, U4, D15
  1867. addi.d A0, A0, 0x80
  1868. addi.d B0, B0, 0x20
  1869. /***8-4***/
  1870. /* Load 16 * 64 from A0 */
  1871. xvld U0, A0, 0x00
  1872. xvld U1, A0, 0x20
  1873. xvld U2, A0, 0x40
  1874. xvld U3, A0, 0x60
  1875. xvldrepl.d U4, B0, 0x00
  1876. xvfmadd.d D0, U0, U4, D0
  1877. xvfmadd.d D1, U1, U4, D1
  1878. xvfmadd.d D2, U2, U4, D2
  1879. xvfmadd.d D3, U3, U4, D3
  1880. xvldrepl.d U4, B0, 0x08
  1881. xvfmadd.d D4, U0, U4, D4
  1882. xvfmadd.d D5, U1, U4, D5
  1883. xvfmadd.d D6, U2, U4, D6
  1884. xvfmadd.d D7, U3, U4, D7
  1885. xvldrepl.d U4, B0, 0x10
  1886. xvfmadd.d D8, U0, U4, D8
  1887. xvfmadd.d D9, U1, U4, D9
  1888. xvfmadd.d D10, U2, U4, D10
  1889. xvfmadd.d D11, U3, U4, D11
  1890. xvldrepl.d U4, B0, 0x18
  1891. xvfmadd.d D12, U0, U4, D12
  1892. xvfmadd.d D13, U1, U4, D13
  1893. xvfmadd.d D14, U2, U4, D14
  1894. xvfmadd.d D15, U3, U4, D15
  1895. addi.d A0, A0, 0x80
  1896. addi.d B0, B0, 0x20
  1897. /***8-5***/
  1898. /* Load 16 * 64 from A0 */
  1899. xvld U0, A0, 0x00
  1900. xvld U1, A0, 0x20
  1901. xvld U2, A0, 0x40
  1902. xvld U3, A0, 0x60
  1903. xvldrepl.d U4, B0, 0x00
  1904. xvfmadd.d D0, U0, U4, D0
  1905. xvfmadd.d D1, U1, U4, D1
  1906. xvfmadd.d D2, U2, U4, D2
  1907. xvfmadd.d D3, U3, U4, D3
  1908. xvldrepl.d U4, B0, 0x08
  1909. xvfmadd.d D4, U0, U4, D4
  1910. xvfmadd.d D5, U1, U4, D5
  1911. xvfmadd.d D6, U2, U4, D6
  1912. xvfmadd.d D7, U3, U4, D7
  1913. xvldrepl.d U4, B0, 0x10
  1914. xvfmadd.d D8, U0, U4, D8
  1915. xvfmadd.d D9, U1, U4, D9
  1916. xvfmadd.d D10, U2, U4, D10
  1917. xvfmadd.d D11, U3, U4, D11
  1918. xvldrepl.d U4, B0, 0x18
  1919. xvfmadd.d D12, U0, U4, D12
  1920. xvfmadd.d D13, U1, U4, D13
  1921. xvfmadd.d D14, U2, U4, D14
  1922. xvfmadd.d D15, U3, U4, D15
  1923. addi.d A0, A0, 0x80
  1924. addi.d B0, B0, 0x20
  1925. /***8-6***/
  1926. /* Load 16 * 64 from A0 */
  1927. xvld U0, A0, 0x00
  1928. xvld U1, A0, 0x20
  1929. xvld U2, A0, 0x40
  1930. xvld U3, A0, 0x60
  1931. xvldrepl.d U4, B0, 0x00
  1932. xvfmadd.d D0, U0, U4, D0
  1933. xvfmadd.d D1, U1, U4, D1
  1934. xvfmadd.d D2, U2, U4, D2
  1935. xvfmadd.d D3, U3, U4, D3
  1936. xvldrepl.d U4, B0, 0x08
  1937. xvfmadd.d D4, U0, U4, D4
  1938. xvfmadd.d D5, U1, U4, D5
  1939. xvfmadd.d D6, U2, U4, D6
  1940. xvfmadd.d D7, U3, U4, D7
  1941. xvldrepl.d U4, B0, 0x10
  1942. xvfmadd.d D8, U0, U4, D8
  1943. xvfmadd.d D9, U1, U4, D9
  1944. xvfmadd.d D10, U2, U4, D10
  1945. xvfmadd.d D11, U3, U4, D11
  1946. xvldrepl.d U4, B0, 0x18
  1947. xvfmadd.d D12, U0, U4, D12
  1948. xvfmadd.d D13, U1, U4, D13
  1949. xvfmadd.d D14, U2, U4, D14
  1950. xvfmadd.d D15, U3, U4, D15
  1951. addi.d A0, A0, 0x80
  1952. addi.d B0, B0, 0x20
  1953. /***8-7***/
  1954. /* Load 16 * 64 from A0 */
  1955. xvld U0, A0, 0x00
  1956. xvld U1, A0, 0x20
  1957. xvld U2, A0, 0x40
  1958. xvld U3, A0, 0x60
  1959. xvldrepl.d U4, B0, 0x00
  1960. xvfmadd.d D0, U0, U4, D0
  1961. xvfmadd.d D1, U1, U4, D1
  1962. xvfmadd.d D2, U2, U4, D2
  1963. xvfmadd.d D3, U3, U4, D3
  1964. xvldrepl.d U4, B0, 0x08
  1965. xvfmadd.d D4, U0, U4, D4
  1966. xvfmadd.d D5, U1, U4, D5
  1967. xvfmadd.d D6, U2, U4, D6
  1968. xvfmadd.d D7, U3, U4, D7
  1969. xvldrepl.d U4, B0, 0x10
  1970. xvfmadd.d D8, U0, U4, D8
  1971. xvfmadd.d D9, U1, U4, D9
  1972. xvfmadd.d D10, U2, U4, D10
  1973. xvfmadd.d D11, U3, U4, D11
  1974. xvldrepl.d U4, B0, 0x18
  1975. xvfmadd.d D12, U0, U4, D12
  1976. xvfmadd.d D13, U1, U4, D13
  1977. xvfmadd.d D14, U2, U4, D14
  1978. xvfmadd.d D15, U3, U4, D15
  1979. addi.d A0, A0, 0x80
  1980. addi.d B0, B0, 0x20
  1981. /***8-8***/
  1982. /* Load 16 * 64 from A0 */
  1983. xvld U0, A0, 0x00
  1984. xvld U1, A0, 0x20
  1985. xvld U2, A0, 0x40
  1986. xvld U3, A0, 0x60
  1987. xvldrepl.d U4, B0, 0x00
  1988. xvfmadd.d D0, U0, U4, D0
  1989. xvfmadd.d D1, U1, U4, D1
  1990. xvfmadd.d D2, U2, U4, D2
  1991. xvfmadd.d D3, U3, U4, D3
  1992. xvldrepl.d U4, B0, 0x08
  1993. xvfmadd.d D4, U0, U4, D4
  1994. xvfmadd.d D5, U1, U4, D5
  1995. xvfmadd.d D6, U2, U4, D6
  1996. xvfmadd.d D7, U3, U4, D7
  1997. xvldrepl.d U4, B0, 0x10
  1998. xvfmadd.d D8, U0, U4, D8
  1999. xvfmadd.d D9, U1, U4, D9
  2000. xvfmadd.d D10, U2, U4, D10
  2001. xvfmadd.d D11, U3, U4, D11
  2002. xvldrepl.d U4, B0, 0x18
  2003. xvfmadd.d D12, U0, U4, D12
  2004. xvfmadd.d D13, U1, U4, D13
  2005. xvfmadd.d D14, U2, U4, D14
  2006. xvfmadd.d D15, U3, U4, D15
  2007. addi.d A0, A0, 0x80
  2008. addi.d B0, B0, 0x20
  2009. addi.d TL, TL, -1 /* TL-- */
  2010. blt ZERO,TL, .L_N5_TL1
  2011. .L_N5_L7:
  2012. /* if (!(L & 7)) goto L_N5_L0 */
  2013. andi TL, L, 7
  2014. beq TL, ZERO,.L_N5_L0
  2015. .L_N5_L71:
  2016. /* Load 16 * 64 from A0 */
  2017. xvld U0, A0, 0x00
  2018. xvld U1, A0, 0x20
  2019. xvld U2, A0, 0x40
  2020. xvld U3, A0, 0x60
  2021. xvldrepl.d U4, B0, 0x00
  2022. xvfmadd.d D0, U0, U4, D0
  2023. xvfmadd.d D1, U1, U4, D1
  2024. xvfmadd.d D2, U2, U4, D2
  2025. xvfmadd.d D3, U3, U4, D3
  2026. xvldrepl.d U4, B0, 0x08
  2027. xvfmadd.d D4, U0, U4, D4
  2028. xvfmadd.d D5, U1, U4, D5
  2029. xvfmadd.d D6, U2, U4, D6
  2030. xvfmadd.d D7, U3, U4, D7
  2031. xvldrepl.d U4, B0, 0x10
  2032. xvfmadd.d D8, U0, U4, D8
  2033. xvfmadd.d D9, U1, U4, D9
  2034. xvfmadd.d D10, U2, U4, D10
  2035. xvfmadd.d D11, U3, U4, D11
  2036. xvldrepl.d U4, B0, 0x18
  2037. xvfmadd.d D12, U0, U4, D12
  2038. xvfmadd.d D13, U1, U4, D13
  2039. xvfmadd.d D14, U2, U4, D14
  2040. xvfmadd.d D15, U3, U4, D15
  2041. /* Add stride for A0, B0 */
  2042. addi.d A0, A0, 0x80
  2043. addi.d B0, B0, 0x20
  2044. addi.d TL, TL, -1
  2045. blt ZERO,TL, .L_N5_L71
  2046. .L_N5_L0:
  2047. #if defined(TRMMKERNEL)
  2048. xvfmul.d D0, D0, VALPHA
  2049. xvfmul.d D1, D1, VALPHA
  2050. xvfmul.d D2, D2, VALPHA
  2051. xvfmul.d D3, D3, VALPHA
  2052. xvfmul.d D4, D4, VALPHA
  2053. xvfmul.d D5, D5, VALPHA
  2054. xvfmul.d D6, D6, VALPHA
  2055. xvfmul.d D7, D7, VALPHA
  2056. xvfmul.d D8, D8, VALPHA
  2057. xvfmul.d D9, D9, VALPHA
  2058. xvfmul.d D10, D10, VALPHA
  2059. xvfmul.d D11, D11, VALPHA
  2060. xvfmul.d D12, D12, VALPHA
  2061. xvfmul.d D13, D13, VALPHA
  2062. xvfmul.d D14, D14, VALPHA
  2063. xvfmul.d D15, D15, VALPHA
  2064. #else
  2065. /* Load C0 */
  2066. xvld U0, C0, 0x00
  2067. xvld U1, C0, 0x20
  2068. xvld U2, C0, 0x40
  2069. xvld U3, C0, 0x60
  2070. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  2071. xvfmadd.d D1, D1, VALPHA, U1
  2072. xvfmadd.d D2, D2, VALPHA, U2
  2073. xvfmadd.d D3, D3, VALPHA, U3
  2074. /* Load C1 */
  2075. xvld U0, C1, 0x00
  2076. xvld U1, C1, 0x20
  2077. xvld U2, C1, 0x40
  2078. xvld U3, C1, 0x60
  2079. xvfmadd.d D4, D4, VALPHA, U0
  2080. xvfmadd.d D5, D5, VALPHA, U1
  2081. xvfmadd.d D6, D6, VALPHA, U2
  2082. xvfmadd.d D7, D7, VALPHA, U3
  2083. /* Load C2 */
  2084. xvld U0, C2, 0x00
  2085. xvld U1, C2, 0x20
  2086. xvld U2, C2, 0x40
  2087. xvld U3, C2, 0x60
  2088. xvfmadd.d D8, D8, VALPHA, U0
  2089. xvfmadd.d D9, D9, VALPHA, U1
  2090. xvfmadd.d D10, D10, VALPHA, U2
  2091. xvfmadd.d D11, D11, VALPHA, U3
  2092. /* Load C3 */
  2093. xvld U0, C3, 0x00
  2094. xvld U1, C3, 0x20
  2095. xvld U2, C3, 0x40
  2096. xvld U3, C3, 0x60
  2097. xvfmadd.d D12, D12, VALPHA, U0
  2098. xvfmadd.d D13, D13, VALPHA, U1
  2099. xvfmadd.d D14, D14, VALPHA, U2
  2100. xvfmadd.d D15, D15, VALPHA, U3
  2101. #endif
  2102. /* Store C0 */
  2103. xvst D0, C0, 0x00
  2104. xvst D1, C0, 0x20
  2105. xvst D2, C0, 0x40
  2106. xvst D3, C0, 0x60
  2107. /* Store C1 */
  2108. xvst D4, C1, 0x00
  2109. xvst D5, C1, 0x20
  2110. xvst D6, C1, 0x40
  2111. xvst D7, C1, 0x60
  2112. /* Store C2 */
  2113. xvst D8, C2, 0x00
  2114. xvst D9, C2, 0x20
  2115. xvst D10, C2, 0x40
  2116. xvst D11, C2, 0x60
  2117. /* Store C3 */
  2118. xvst D12, C3, 0x00
  2119. xvst D13, C3, 0x20
  2120. xvst D14, C3, 0x40
  2121. xvst D15, C3, 0x60
  2122. /* Add stride for C */
  2123. addi.d C0, C0, 0x80
  2124. addi.d C1, C1, 0x80
  2125. addi.d C2, C2, 0x80
  2126. addi.d C3, C3, 0x80
  2127. #if defined(TRMMKERNEL)
  2128. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  2129. sub.d L, K, OFF
  2130. #ifdef LEFT
  2131. /* number of values in A */
  2132. addi.d L, L, -16
  2133. #else
  2134. /* number of values in B */
  2135. addi.d L, L, -4
  2136. #endif
  2137. slli.d T0, L, 0x07
  2138. add.d A0, A0, T0
  2139. slli.d T0, L, 0x05
  2140. add.d B0, B0, T0
  2141. #endif
  2142. #ifdef LEFT
  2143. addi.d OFF, OFF, 0x10
  2144. #endif
  2145. #endif // #if defined(TRMMKERNEL)
  2146. addi.d I, I, -1 /* I-- */
  2147. blt ZERO,I, .L_N5_I1
  2148. .L_N5_M8:
  2149. /* We have done M & 16, considering M=8/4/2/1 */
  2150. andi I, M, 15
  2151. beq ZERO,I, .L_N5_M0
  2152. andi I, M, 8
  2153. beq ZERO,I, .L_N5_M4
  2154. #if defined(TRMMKERNEL)
  2155. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  2156. move B0, B
  2157. #else
  2158. slli.d T0, OFF, 0x06
  2159. add.d A0, A0, T0
  2160. slli.d T0, OFF, 0x05
  2161. add.d B0, B, T0
  2162. #endif
  2163. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  2164. sub.d L, K, OFF
  2165. #elif defined(LEFT)
  2166. /* number of values in A */
  2167. addi.d L, OFF, 8
  2168. #else
  2169. /* number of values in B */
  2170. addi.d L, OFF, 4
  2171. #endif
  2172. #else // #if !defined(TRMMKERNEL)
  2173. move B0, B
  2174. move L, K /* L = bk */
  2175. #endif // #if defined(TRMMKERNEL)
  2176. /* Load 8 * 64 from A0 */
  2177. xvld U0, A0, 0x00
  2178. xvld U1, A0, 0x20
  2179. xvldrepl.d U4, B0, 0x00
  2180. /* line 1 */
  2181. xvfmul.d D0, U0, U4
  2182. xvfmul.d D1, U1, U4
  2183. xvldrepl.d U4, B0, 0x08
  2184. /* line 2 */
  2185. xvfmul.d D4, U0, U4
  2186. xvfmul.d D5, U1, U4
  2187. xvldrepl.d U4, B0, 0x10
  2188. /* line 3 */
  2189. xvfmul.d D8, U0, U4
  2190. xvfmul.d D9, U1, U4
  2191. xvldrepl.d U4, B0, 0x18
  2192. /* line 4 */
  2193. xvfmul.d D12, U0, U4
  2194. xvfmul.d D13, U1, U4
  2195. /* Add stride for A0 and B0 */
  2196. addi.d A0, A0, 0x40
  2197. addi.d B0, B0, 0x20
  2198. /* Reduce L */
  2199. addi.d L, L, -1
  2200. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  2201. /* if (TL < 1) goto L_N5_M8_L7 */
  2202. beq ZERO,TL, .L_N5_M8_L7
  2203. .L_N5_M8_TL1: /* TL-- */
  2204. /***8-1***/
  2205. /* Load 16 * 64 from A0 */
  2206. xvld U0, A0, 0x00
  2207. xvld U1, A0, 0x20
  2208. xvldrepl.d U4, B0, 0x00
  2209. xvfmadd.d D0, U0, U4, D0
  2210. xvfmadd.d D1, U1, U4, D1
  2211. xvldrepl.d U4, B0, 0x08
  2212. xvfmadd.d D4, U0, U4, D4
  2213. xvfmadd.d D5, U1, U4, D5
  2214. xvldrepl.d U4, B0, 0x10
  2215. xvfmadd.d D8, U0, U4, D8
  2216. xvfmadd.d D9, U1, U4, D9
  2217. xvldrepl.d U4, B0, 0x18
  2218. xvfmadd.d D12, U0, U4, D12
  2219. xvfmadd.d D13, U1, U4, D13
  2220. addi.d A0, A0, 0x40
  2221. addi.d B0, B0, 0x20
  2222. /***8-2***/
  2223. xvld U0, A0, 0x00
  2224. xvld U1, A0, 0x20
  2225. xvldrepl.d U4, B0, 0x00
  2226. xvfmadd.d D0, U0, U4, D0
  2227. xvfmadd.d D1, U1, U4, D1
  2228. xvldrepl.d U4, B0, 0x08
  2229. xvfmadd.d D4, U0, U4, D4
  2230. xvfmadd.d D5, U1, U4, D5
  2231. xvldrepl.d U4, B0, 0x10
  2232. xvfmadd.d D8, U0, U4, D8
  2233. xvfmadd.d D9, U1, U4, D9
  2234. xvldrepl.d U4, B0, 0x18
  2235. xvfmadd.d D12, U0, U4, D12
  2236. xvfmadd.d D13, U1, U4, D13
  2237. addi.d A0, A0, 0x40
  2238. addi.d B0, B0, 0x20
  2239. /***8-3***/
  2240. xvld U0, A0, 0x00
  2241. xvld U1, A0, 0x20
  2242. xvldrepl.d U4, B0, 0x00
  2243. xvfmadd.d D0, U0, U4, D0
  2244. xvfmadd.d D1, U1, U4, D1
  2245. xvldrepl.d U4, B0, 0x08
  2246. xvfmadd.d D4, U0, U4, D4
  2247. xvfmadd.d D5, U1, U4, D5
  2248. xvldrepl.d U4, B0, 0x10
  2249. xvfmadd.d D8, U0, U4, D8
  2250. xvfmadd.d D9, U1, U4, D9
  2251. xvldrepl.d U4, B0, 0x18
  2252. xvfmadd.d D12, U0, U4, D12
  2253. xvfmadd.d D13, U1, U4, D13
  2254. addi.d A0, A0, 0x40
  2255. addi.d B0, B0, 0x20
  2256. /***8-4***/
  2257. xvld U0, A0, 0x00
  2258. xvld U1, A0, 0x20
  2259. xvldrepl.d U4, B0, 0x00
  2260. xvfmadd.d D0, U0, U4, D0
  2261. xvfmadd.d D1, U1, U4, D1
  2262. xvldrepl.d U4, B0, 0x08
  2263. xvfmadd.d D4, U0, U4, D4
  2264. xvfmadd.d D5, U1, U4, D5
  2265. xvldrepl.d U4, B0, 0x10
  2266. xvfmadd.d D8, U0, U4, D8
  2267. xvfmadd.d D9, U1, U4, D9
  2268. xvldrepl.d U4, B0, 0x18
  2269. xvfmadd.d D12, U0, U4, D12
  2270. xvfmadd.d D13, U1, U4, D13
  2271. addi.d A0, A0, 0x40
  2272. addi.d B0, B0, 0x20
  2273. /***8-5***/
  2274. xvld U0, A0, 0x00
  2275. xvld U1, A0, 0x20
  2276. /* Cumulative D0~D23 */
  2277. xvldrepl.d U4, B0, 0x00
  2278. xvfmadd.d D0, U0, U4, D0
  2279. xvfmadd.d D1, U1, U4, D1
  2280. xvldrepl.d U4, B0, 0x08
  2281. xvfmadd.d D4, U0, U4, D4
  2282. xvfmadd.d D5, U1, U4, D5
  2283. xvldrepl.d U4, B0, 0x10
  2284. xvfmadd.d D8, U0, U4, D8
  2285. xvfmadd.d D9, U1, U4, D9
  2286. xvldrepl.d U4, B0, 0x18
  2287. xvfmadd.d D12, U0, U4, D12
  2288. xvfmadd.d D13, U1, U4, D13
  2289. addi.d A0, A0, 0x40
  2290. addi.d B0, B0, 0x20
  2291. /***8-6***/
  2292. xvld U0, A0, 0x00
  2293. xvld U1, A0, 0x20
  2294. xvldrepl.d U4, B0, 0x00
  2295. xvfmadd.d D0, U0, U4, D0
  2296. xvfmadd.d D1, U1, U4, D1
  2297. xvldrepl.d U4, B0, 0x08
  2298. xvfmadd.d D4, U0, U4, D4
  2299. xvfmadd.d D5, U1, U4, D5
  2300. xvldrepl.d U4, B0, 0x10
  2301. xvfmadd.d D8, U0, U4, D8
  2302. xvfmadd.d D9, U1, U4, D9
  2303. xvldrepl.d U4, B0, 0x18
  2304. xvfmadd.d D12, U0, U4, D12
  2305. xvfmadd.d D13, U1, U4, D13
  2306. addi.d A0, A0, 0x40
  2307. addi.d B0, B0, 0x20
  2308. /***8-7***/
  2309. xvld U0, A0, 0x00
  2310. xvld U1, A0, 0x20
  2311. xvldrepl.d U4, B0, 0x00
  2312. xvfmadd.d D0, U0, U4, D0
  2313. xvfmadd.d D1, U1, U4, D1
  2314. xvldrepl.d U4, B0, 0x08
  2315. xvfmadd.d D4, U0, U4, D4
  2316. xvfmadd.d D5, U1, U4, D5
  2317. xvldrepl.d U4, B0, 0x10
  2318. xvfmadd.d D8, U0, U4, D8
  2319. xvfmadd.d D9, U1, U4, D9
  2320. xvldrepl.d U4, B0, 0x18
  2321. xvfmadd.d D12, U0, U4, D12
  2322. xvfmadd.d D13, U1, U4, D13
  2323. addi.d A0, A0, 0x40
  2324. addi.d B0, B0, 0x20
  2325. /***8-8***/
  2326. xvld U0, A0, 0x00
  2327. xvld U1, A0, 0x20
  2328. xvldrepl.d U4, B0, 0x00
  2329. xvfmadd.d D0, U0, U4, D0
  2330. xvfmadd.d D1, U1, U4, D1
  2331. xvldrepl.d U4, B0, 0x08
  2332. xvfmadd.d D4, U0, U4, D4
  2333. xvfmadd.d D5, U1, U4, D5
  2334. xvldrepl.d U4, B0, 0x10
  2335. xvfmadd.d D8, U0, U4, D8
  2336. xvfmadd.d D9, U1, U4, D9
  2337. xvldrepl.d U4, B0, 0x18
  2338. xvfmadd.d D12, U0, U4, D12
  2339. xvfmadd.d D13, U1, U4, D13
  2340. addi.d A0, A0, 0x40
  2341. addi.d B0, B0, 0x20
  2342. addi.d TL, TL, -1 /* TL-- */
  2343. blt ZERO,TL, .L_N5_M8_TL1
  2344. .L_N5_M8_L7:
  2345. /* if (!(L & 7)) goto L_N5_M8_L0 */
  2346. andi TL, L, 7
  2347. beq TL, ZERO,.L_N5_M8_L0
  2348. .L_N5_M8_L71:
  2349. xvld U0, A0, 0x00
  2350. xvld U1, A0, 0x20
  2351. xvldrepl.d U4, B0, 0x00
  2352. xvfmadd.d D0, U0, U4, D0
  2353. xvfmadd.d D1, U1, U4, D1
  2354. xvldrepl.d U4, B0, 0x08
  2355. xvfmadd.d D4, U0, U4, D4
  2356. xvfmadd.d D5, U1, U4, D5
  2357. xvldrepl.d U4, B0, 0x10
  2358. xvfmadd.d D8, U0, U4, D8
  2359. xvfmadd.d D9, U1, U4, D9
  2360. xvldrepl.d U4, B0, 0x18
  2361. xvfmadd.d D12, U0, U4, D12
  2362. xvfmadd.d D13, U1, U4, D13
  2363. /* Add stride for A0, B0 */
  2364. addi.d A0, A0, 0x40
  2365. addi.d B0, B0, 0x20
  2366. addi.d TL, TL, -1
  2367. blt ZERO,TL, .L_N5_M8_L71
  2368. .L_N5_M8_L0:
  2369. #if defined(TRMMKERNEL)
  2370. xvfmul.d D0, D0, VALPHA
  2371. xvfmul.d D1, D1, VALPHA
  2372. xvfmul.d D4, D4, VALPHA
  2373. xvfmul.d D5, D5, VALPHA
  2374. xvfmul.d D8, D8, VALPHA
  2375. xvfmul.d D9, D9, VALPHA
  2376. xvfmul.d D12, D12, VALPHA
  2377. xvfmul.d D13, D13, VALPHA
  2378. #else
  2379. /* Load C0 */
  2380. xvld U0, C0, 0x00
  2381. xvld U1, C0, 0x20
  2382. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  2383. xvfmadd.d D1, D1, VALPHA, U1
  2384. /* Load C1 */
  2385. xvld U0, C1, 0x00
  2386. xvld U1, C1, 0x20
  2387. xvfmadd.d D4, D4, VALPHA, U0
  2388. xvfmadd.d D5, D5, VALPHA, U1
  2389. /* Load C2 */
  2390. xvld U0, C2, 0x00
  2391. xvld U1, C2, 0x20
  2392. xvfmadd.d D8, D8, VALPHA, U0
  2393. xvfmadd.d D9, D9, VALPHA, U1
  2394. /* Load C3 */
  2395. xvld U0, C3, 0x00
  2396. xvld U1, C3, 0x20
  2397. xvfmadd.d D12, D12, VALPHA, U0
  2398. xvfmadd.d D13, D13, VALPHA, U1
  2399. #endif
  2400. /* Store C0 */
  2401. xvst D0, C0, 0x00
  2402. xvst D1, C0, 0x20
  2403. /* Store C1 */
  2404. xvst D4, C1, 0x00
  2405. xvst D5, C1, 0x20
  2406. /* Store C2 */
  2407. xvst D8, C2, 0x00
  2408. xvst D9, C2, 0x20
  2409. /* Store C3 */
  2410. xvst D12, C3, 0x00
  2411. xvst D13, C3, 0x20
  2412. /* Add stride for C */
  2413. addi.d C0, C0, 0x40
  2414. addi.d C1, C1, 0x40
  2415. addi.d C2, C2, 0x40
  2416. addi.d C3, C3, 0x40
  2417. #if defined(TRMMKERNEL)
  2418. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  2419. sub.d L, K, OFF
  2420. #ifdef LEFT
  2421. /* number of values in A */
  2422. addi.d L, L, -8
  2423. #else
  2424. /* number of values in B */
  2425. addi.d L, L, -4
  2426. #endif
  2427. slli.d T0, L, 0x06
  2428. add.d A0, A0, T0
  2429. slli.d T0, L, 0x05
  2430. add.d B0, B0, T0
  2431. #endif
  2432. #ifdef LEFT
  2433. /* number of values in A */
  2434. addi.d OFF, OFF, 0x08
  2435. #endif
  2436. #endif // #if defined(TRMMKERNEL)
  2437. /********LOOP (if(N & 4 ) && (M & 8) ) End************/
  2438. .L_N5_M4:
  2439. andi I, M, 4
  2440. beq ZERO,I, .L_N5_M2
  2441. #if defined(TRMMKERNEL)
  2442. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  2443. move B0, B
  2444. #else
  2445. slli.d T0, OFF, 0x05
  2446. add.d A0, A0, T0
  2447. add.d B0, B, T0
  2448. #endif
  2449. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  2450. sub.d L, K, OFF
  2451. #elif defined(LEFT)
  2452. /* number of values in A */
  2453. addi.d L, OFF, 4
  2454. #else
  2455. /* number of values in B */
  2456. addi.d L, OFF, 4
  2457. #endif
  2458. #else // #if !defined(TRMMKERNEL)
  2459. move B0, B
  2460. move L, K /* L = bk */
  2461. #endif
  2462. /* Load 4 * 64 from A0 */
  2463. xvld U0, A0, 0x00
  2464. xvldrepl.d U4, B0, 0x00
  2465. /* line 1 */
  2466. xvfmul.d D0, U0, U4
  2467. xvldrepl.d U4, B0, 0x08
  2468. /* line 2 */
  2469. xvfmul.d D4, U0, U4
  2470. xvldrepl.d U4, B0, 0x10
  2471. /* line 3 */
  2472. xvfmul.d D8, U0, U4
  2473. xvldrepl.d U4, B0, 0x18
  2474. /* line 4 */
  2475. xvfmul.d D12, U0, U4
  2476. /* Add stride for A0 and B0 */
  2477. addi.d A0, A0, 0x20
  2478. addi.d B0, B0, 0x20
  2479. /* Reduce L */
  2480. addi.d L, L, -1
  2481. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  2482. /* if (TL < 1) goto L_N5_M4_L7 */
  2483. beq ZERO,TL, .L_N5_M4_L7
  2484. .L_N5_M4_TL1: /* TL-- */
  2485. /***8-1***/
  2486. /* Load 8 * 64 from A0 */
  2487. xvld U0, A0, 0x00
  2488. xvldrepl.d U4, B0, 0x00
  2489. xvfmadd.d D0, U0, U4, D0
  2490. xvldrepl.d U4, B0, 0x08
  2491. xvfmadd.d D4, U0, U4, D4
  2492. xvldrepl.d U4, B0, 0x10
  2493. xvfmadd.d D8, U0, U4, D8
  2494. xvldrepl.d U4, B0, 0x18
  2495. xvfmadd.d D12, U0, U4, D12
  2496. addi.d A0, A0, 0x20
  2497. addi.d B0, B0, 0x20
  2498. /***8-2***/
  2499. xvld U0, A0, 0x00
  2500. xvldrepl.d U4, B0, 0x00
  2501. xvfmadd.d D0, U0, U4, D0
  2502. xvldrepl.d U4, B0, 0x08
  2503. xvfmadd.d D4, U0, U4, D4
  2504. xvldrepl.d U4, B0, 0x10
  2505. xvfmadd.d D8, U0, U4, D8
  2506. xvldrepl.d U4, B0, 0x18
  2507. xvfmadd.d D12, U0, U4, D12
  2508. addi.d A0, A0, 0x20
  2509. addi.d B0, B0, 0x20
  2510. /***8-3***/
  2511. xvld U0, A0, 0x00
  2512. xvldrepl.d U4, B0, 0x00
  2513. xvfmadd.d D0, U0, U4, D0
  2514. xvldrepl.d U4, B0, 0x08
  2515. xvfmadd.d D4, U0, U4, D4
  2516. xvldrepl.d U4, B0, 0x10
  2517. xvfmadd.d D8, U0, U4, D8
  2518. xvldrepl.d U4, B0, 0x18
  2519. xvfmadd.d D12, U0, U4, D12
  2520. addi.d A0, A0, 0x20
  2521. addi.d B0, B0, 0x20
  2522. /***8-4***/
  2523. xvld U0, A0, 0x00
  2524. xvldrepl.d U4, B0, 0x00
  2525. xvfmadd.d D0, U0, U4, D0
  2526. xvldrepl.d U4, B0, 0x08
  2527. xvfmadd.d D4, U0, U4, D4
  2528. xvldrepl.d U4, B0, 0x10
  2529. xvfmadd.d D8, U0, U4, D8
  2530. xvldrepl.d U4, B0, 0x18
  2531. xvfmadd.d D12, U0, U4, D12
  2532. addi.d A0, A0, 0x20
  2533. addi.d B0, B0, 0x20
  2534. /***8-5***/
  2535. xvld U0, A0, 0x00
  2536. /* Cumulative D0~D23 */
  2537. xvldrepl.d U4, B0, 0x00
  2538. xvfmadd.d D0, U0, U4, D0
  2539. xvldrepl.d U4, B0, 0x08
  2540. xvfmadd.d D4, U0, U4, D4
  2541. xvldrepl.d U4, B0, 0x10
  2542. xvfmadd.d D8, U0, U4, D8
  2543. xvldrepl.d U4, B0, 0x18
  2544. xvfmadd.d D12, U0, U4, D12
  2545. addi.d A0, A0, 0x20
  2546. addi.d B0, B0, 0x20
  2547. /***8-6***/
  2548. xvld U0, A0, 0x00
  2549. xvldrepl.d U4, B0, 0x00
  2550. xvfmadd.d D0, U0, U4, D0
  2551. xvldrepl.d U4, B0, 0x08
  2552. xvfmadd.d D4, U0, U4, D4
  2553. xvldrepl.d U4, B0, 0x10
  2554. xvfmadd.d D8, U0, U4, D8
  2555. xvldrepl.d U4, B0, 0x18
  2556. xvfmadd.d D12, U0, U4, D12
  2557. addi.d A0, A0, 0x20
  2558. addi.d B0, B0, 0x20
  2559. /***8-7***/
  2560. xvld U0, A0, 0x00
  2561. xvldrepl.d U4, B0, 0x00
  2562. xvfmadd.d D0, U0, U4, D0
  2563. xvldrepl.d U4, B0, 0x08
  2564. xvfmadd.d D4, U0, U4, D4
  2565. xvldrepl.d U4, B0, 0x10
  2566. xvfmadd.d D8, U0, U4, D8
  2567. xvldrepl.d U4, B0, 0x18
  2568. xvfmadd.d D12, U0, U4, D12
  2569. addi.d A0, A0, 0x20
  2570. addi.d B0, B0, 0x20
  2571. /***8-8***/
  2572. xvld U0, A0, 0x00
  2573. xvldrepl.d U4, B0, 0x00
  2574. xvfmadd.d D0, U0, U4, D0
  2575. xvldrepl.d U4, B0, 0x08
  2576. xvfmadd.d D4, U0, U4, D4
  2577. xvldrepl.d U4, B0, 0x10
  2578. xvfmadd.d D8, U0, U4, D8
  2579. xvldrepl.d U4, B0, 0x18
  2580. xvfmadd.d D12, U0, U4, D12
  2581. addi.d A0, A0, 0x20
  2582. addi.d B0, B0, 0x20
  2583. addi.d TL, TL, -1 /* TL-- */
  2584. blt ZERO,TL, .L_N5_M4_TL1
  2585. .L_N5_M4_L7:
  2586. /* if (!(L & 7)) goto L_N5_M4_L0 */
  2587. andi TL, L, 7
  2588. beq TL, ZERO,.L_N5_M4_L0
  2589. .L_N5_M4_L71:
  2590. xvld U0, A0, 0x00
  2591. xvldrepl.d U4, B0, 0x00
  2592. xvfmadd.d D0, U0, U4, D0
  2593. xvldrepl.d U4, B0, 0x08
  2594. xvfmadd.d D4, U0, U4, D4
  2595. xvldrepl.d U4, B0, 0x10
  2596. xvfmadd.d D8, U0, U4, D8
  2597. xvldrepl.d U4, B0, 0x18
  2598. xvfmadd.d D12, U0, U4, D12
  2599. /* Add stride for A0, B0 */
  2600. addi.d A0, A0, 0x20
  2601. addi.d B0, B0, 0x20
  2602. addi.d TL, TL, -1
  2603. blt ZERO,TL, .L_N5_M4_L71
  2604. .L_N5_M4_L0:
  2605. #if defined(TRMMKERNEL)
  2606. xvfmul.d D0, D0, VALPHA
  2607. xvfmul.d D4, D4, VALPHA
  2608. xvfmul.d D8, D8, VALPHA
  2609. xvfmul.d D12, D12, VALPHA
  2610. #else
  2611. /* Load C0 */
  2612. xvld U0, C0, 0x00
  2613. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  2614. /* Load C1 */
  2615. xvld U0, C1, 0x00
  2616. xvfmadd.d D4, D4, VALPHA, U0
  2617. /* Load C2 */
  2618. xvld U0, C2, 0x00
  2619. xvfmadd.d D8, D8, VALPHA, U0
  2620. /* Load C3 */
  2621. xvld U0, C3, 0x00
  2622. xvfmadd.d D12, D12, VALPHA, U0
  2623. #endif
  2624. /* Store C0 */
  2625. xvst D0, C0, 0x00
  2626. /* Store C1 */
  2627. xvst D4, C1, 0x00
  2628. /* Store C2 */
  2629. xvst D8, C2, 0x00
  2630. /* Store C3 */
  2631. xvst D12, C3, 0x00
  2632. /* Add stride for C */
  2633. addi.d C0, C0, 0x20
  2634. addi.d C1, C1, 0x20
  2635. addi.d C2, C2, 0x20
  2636. addi.d C3, C3, 0x20
  2637. #if defined(TRMMKERNEL)
  2638. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  2639. sub.d L, K, OFF
  2640. #ifdef LEFT
  2641. /* number of values in A */
  2642. addi.d L, L, -4
  2643. #else
  2644. /* number of values in B */
  2645. addi.d L, L, -4
  2646. #endif
  2647. slli.d T0, L, 0x05
  2648. add.d A0, A0, T0
  2649. add.d B0, B0, T0
  2650. #endif
  2651. #ifdef LEFT
  2652. /* number of values in A */
  2653. addi.d OFF, OFF, 0x04
  2654. #endif
  2655. #endif // #if defined(TRMMKERNEL)
  2656. /********LOOP (if(N & 4 ) && (M & 4) ) End************/
  2657. .L_N5_M2:
  2658. andi I, M, 2
  2659. beq ZERO,I, .L_N5_M1
  2660. #if defined(TRMMKERNEL)
  2661. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  2662. move B0, B
  2663. #else
  2664. slli.d T0, OFF, 0x04
  2665. add.d A0, A0, T0
  2666. slli.d T0, OFF, 0x05
  2667. add.d B0, B, T0
  2668. #endif
  2669. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  2670. sub.d L, K, OFF
  2671. #elif defined(LEFT)
  2672. /* number of values in A */
  2673. addi.d L, OFF, 2
  2674. #else
  2675. /* number of values in B */
  2676. addi.d L, OFF, 4
  2677. #endif
  2678. #else // #if !defined(TRMMKERNEL)
  2679. move B0, B
  2680. move L, K /* L = bk */
  2681. #endif
  2682. /* Load 2 * 64 from A0 */
  2683. xvld U0, A0, 0x00
  2684. xvldrepl.d U4, B0, 0x00
  2685. /* line 1 */
  2686. xvfmul.d D0, U0, U4
  2687. xvldrepl.d U4, B0, 0x08
  2688. /* line 2 */
  2689. xvfmul.d D4, U0, U4
  2690. xvldrepl.d U4, B0, 0x10
  2691. /* line 3 */
  2692. xvfmul.d D8, U0, U4
  2693. xvldrepl.d U4, B0, 0x18
  2694. /* line 4 */
  2695. xvfmul.d D12, U0, U4
  2696. /* Add stride for A0 and B0 */
  2697. addi.d A0, A0, 0x10
  2698. addi.d B0, B0, 0x20
  2699. /* Reduce L */
  2700. addi.d L, L, -1
  2701. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  2702. /* if (TL < 1) goto L_N5_M2_L7 */
  2703. beq ZERO,TL, .L_N5_M2_L7
  2704. .L_N5_M2_TL1: /* TL-- */
  2705. /***8-1***/
  2706. /* Load 2 * 64 from A0 */
  2707. xvld U0, A0, 0x00
  2708. xvldrepl.d U4, B0, 0x00
  2709. xvfmadd.d D0, U0, U4, D0
  2710. xvldrepl.d U4, B0, 0x08
  2711. xvfmadd.d D4, U0, U4, D4
  2712. xvldrepl.d U4, B0, 0x10
  2713. xvfmadd.d D8, U0, U4, D8
  2714. xvldrepl.d U4, B0, 0x18
  2715. xvfmadd.d D12, U0, U4, D12
  2716. addi.d A0, A0, 0x10
  2717. addi.d B0, B0, 0x20
  2718. /***8-2***/
  2719. xvld U0, A0, 0x00
  2720. xvldrepl.d U4, B0, 0x00
  2721. xvfmadd.d D0, U0, U4, D0
  2722. xvldrepl.d U4, B0, 0x08
  2723. xvfmadd.d D4, U0, U4, D4
  2724. xvldrepl.d U4, B0, 0x10
  2725. xvfmadd.d D8, U0, U4, D8
  2726. xvldrepl.d U4, B0, 0x18
  2727. xvfmadd.d D12, U0, U4, D12
  2728. addi.d A0, A0, 0x10
  2729. addi.d B0, B0, 0x20
  2730. /***8-3***/
  2731. xvld U0, A0, 0x00
  2732. xvldrepl.d U4, B0, 0x00
  2733. xvfmadd.d D0, U0, U4, D0
  2734. xvldrepl.d U4, B0, 0x08
  2735. xvfmadd.d D4, U0, U4, D4
  2736. xvldrepl.d U4, B0, 0x10
  2737. xvfmadd.d D8, U0, U4, D8
  2738. xvldrepl.d U4, B0, 0x18
  2739. xvfmadd.d D12, U0, U4, D12
  2740. addi.d A0, A0, 0x10
  2741. addi.d B0, B0, 0x20
  2742. /***8-4***/
  2743. xvld U0, A0, 0x00
  2744. xvldrepl.d U4, B0, 0x00
  2745. xvfmadd.d D0, U0, U4, D0
  2746. xvldrepl.d U4, B0, 0x08
  2747. xvfmadd.d D4, U0, U4, D4
  2748. xvldrepl.d U4, B0, 0x10
  2749. xvfmadd.d D8, U0, U4, D8
  2750. xvldrepl.d U4, B0, 0x18
  2751. xvfmadd.d D12, U0, U4, D12
  2752. addi.d A0, A0, 0x10
  2753. addi.d B0, B0, 0x20
  2754. /***8-5***/
  2755. xvld U0, A0, 0x00
  2756. xvldrepl.d U4, B0, 0x00
  2757. xvfmadd.d D0, U0, U4, D0
  2758. xvldrepl.d U4, B0, 0x08
  2759. xvfmadd.d D4, U0, U4, D4
  2760. xvldrepl.d U4, B0, 0x10
  2761. xvfmadd.d D8, U0, U4, D8
  2762. xvldrepl.d U4, B0, 0x18
  2763. xvfmadd.d D12, U0, U4, D12
  2764. addi.d A0, A0, 0x10
  2765. addi.d B0, B0, 0x20
  2766. /***8-6***/
  2767. xvld U0, A0, 0x00
  2768. xvldrepl.d U4, B0, 0x00
  2769. xvfmadd.d D0, U0, U4, D0
  2770. xvldrepl.d U4, B0, 0x08
  2771. xvfmadd.d D4, U0, U4, D4
  2772. xvldrepl.d U4, B0, 0x10
  2773. xvfmadd.d D8, U0, U4, D8
  2774. xvldrepl.d U4, B0, 0x18
  2775. xvfmadd.d D12, U0, U4, D12
  2776. addi.d A0, A0, 0x10
  2777. addi.d B0, B0, 0x20
  2778. /***8-7***/
  2779. xvld U0, A0, 0x00
  2780. xvldrepl.d U4, B0, 0x00
  2781. xvfmadd.d D0, U0, U4, D0
  2782. xvldrepl.d U4, B0, 0x08
  2783. xvfmadd.d D4, U0, U4, D4
  2784. xvldrepl.d U4, B0, 0x10
  2785. xvfmadd.d D8, U0, U4, D8
  2786. xvldrepl.d U4, B0, 0x18
  2787. xvfmadd.d D12, U0, U4, D12
  2788. addi.d A0, A0, 0x10
  2789. addi.d B0, B0, 0x20
  2790. /***8-8***/
  2791. xvld U0, A0, 0x00
  2792. xvldrepl.d U4, B0, 0x00
  2793. xvfmadd.d D0, U0, U4, D0
  2794. xvldrepl.d U4, B0, 0x08
  2795. xvfmadd.d D4, U0, U4, D4
  2796. xvldrepl.d U4, B0, 0x10
  2797. xvfmadd.d D8, U0, U4, D8
  2798. xvldrepl.d U4, B0, 0x18
  2799. xvfmadd.d D12, U0, U4, D12
  2800. addi.d A0, A0, 0x10
  2801. addi.d B0, B0, 0x20
  2802. addi.d TL, TL, -1 /* TL-- */
  2803. blt ZERO,TL, .L_N5_M2_TL1
  2804. .L_N5_M2_L7:
  2805. /* if (!(L & 7)) goto L_N5_M2_L0 */
  2806. andi TL, L, 7
  2807. beq TL, ZERO,.L_N5_M2_L0
  2808. .L_N5_M2_L71:
  2809. xvld U0, A0, 0x00
  2810. xvldrepl.d U4, B0, 0x00
  2811. xvfmadd.d D0, U0, U4, D0
  2812. xvldrepl.d U4, B0, 0x08
  2813. xvfmadd.d D4, U0, U4, D4
  2814. xvldrepl.d U4, B0, 0x10
  2815. xvfmadd.d D8, U0, U4, D8
  2816. xvldrepl.d U4, B0, 0x18
  2817. xvfmadd.d D12, U0, U4, D12
  2818. /* Add stride for A0, B0 */
  2819. addi.d A0, A0, 0x10
  2820. addi.d B0, B0, 0x20
  2821. addi.d TL, TL, -1
  2822. blt ZERO,TL, .L_N5_M2_L71
  2823. .L_N5_M2_L0:
  2824. #if defined(TRMMKERNEL)
  2825. xvfmul.d D0, D0, VALPHA
  2826. xvfmul.d D4, D4, VALPHA
  2827. xvfmul.d D8, D8, VALPHA
  2828. xvfmul.d D12, D12, VALPHA
  2829. #else
  2830. /* Load C0 */
  2831. xvld U0, C0, 0x00
  2832. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  2833. /* Load C1 */
  2834. xvld U0, C1, 0x00
  2835. xvfmadd.d D4, D4, VALPHA, U0
  2836. /* Load C2 */
  2837. xvld U0, C2, 0x00
  2838. xvfmadd.d D8, D8, VALPHA, U0
  2839. /* Load C3 */
  2840. xvld U0, C3, 0x00
  2841. xvfmadd.d D12, D12, VALPHA, U0
  2842. #endif
  2843. xvstelm.d D0, C0, 0x00, 0x00
  2844. xvstelm.d D4, C1, 0x00, 0x00
  2845. xvstelm.d D8, C2, 0x00, 0x00
  2846. xvstelm.d D12, C3, 0x00, 0x00
  2847. xvstelm.d D0, C0, 0x08, 0x01
  2848. xvstelm.d D4, C1, 0x08, 0x01
  2849. xvstelm.d D8, C2, 0x08, 0x01
  2850. xvstelm.d D12, C3, 0x08, 0x01
  2851. /* Add stride for C */
  2852. addi.d C0, C0, 0x10
  2853. addi.d C1, C1, 0x10
  2854. addi.d C2, C2, 0x10
  2855. addi.d C3, C3, 0x10
  2856. #if defined(TRMMKERNEL)
  2857. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  2858. sub.d L, K, OFF
  2859. #ifdef LEFT
  2860. /* number of values in A */
  2861. addi.d L, L, -2
  2862. #else
  2863. /* number of values in B */
  2864. addi.d L, L, -4
  2865. #endif
  2866. slli.d T0, L, 0x04
  2867. add.d A0, A0, T0
  2868. slli.d T0, L, 0x05
  2869. add.d B0, B0, T0
  2870. #endif
  2871. #ifdef LEFT
  2872. /* number of values in A */
  2873. addi.d OFF, OFF, 0x02
  2874. #endif
  2875. #endif // #if defined(TRMMKERNEL)
  2876. /********LOOP (if(N & 4 ) && (M & 2) ) End************/
  2877. .L_N5_M1:
  2878. andi I, M, 1
  2879. beq ZERO,I, .L_N5_M0
  2880. #if defined(TRMMKERNEL)
  2881. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  2882. move B0, B
  2883. #else
  2884. slli.d T0, OFF, 0x03
  2885. add.d A0, A0, T0
  2886. slli.d T0, OFF, 0x05
  2887. add.d B0, B, T0
  2888. #endif
  2889. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  2890. sub.d L, K, OFF
  2891. #elif defined(LEFT)
  2892. /* number of values in A */
  2893. addi.d L, OFF, 1
  2894. #else
  2895. /* number of values in B */
  2896. addi.d L, OFF, 4
  2897. #endif
  2898. #else // #if !defined(TRMMKERNEL)
  2899. move B0, B
  2900. move L, K /* L = bk */
  2901. #endif
  2902. /* Load 1 * 64 from A0 */
  2903. xvld U0, A0, 0x00
  2904. xvldrepl.d U4, B0, 0x00
  2905. /* line 1 */
  2906. xvfmul.d D0, U0, U4
  2907. xvldrepl.d U4, B0, 0x08
  2908. /* line 2 */
  2909. xvfmul.d D4, U0, U4
  2910. xvldrepl.d U4, B0, 0x10
  2911. /* line 3 */
  2912. xvfmul.d D8, U0, U4
  2913. xvldrepl.d U4, B0, 0x18
  2914. /* line 4 */
  2915. xvfmul.d D12, U0, U4
  2916. /* Add stride for A0 and B0 */
  2917. addi.d A0, A0, 0x08
  2918. addi.d B0, B0, 0x20
  2919. /* Reduce L */
  2920. addi.d L, L, -1
  2921. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  2922. /* if (TL < 1) goto L_N5_M1_L7 */
  2923. beq ZERO,TL, .L_N5_M1_L7
  2924. .L_N5_M1_TL1: /* TL-- */
  2925. /***8-1***/
  2926. /* Load 1 * 64 from A0 */
  2927. xvld U0, A0, 0x00
  2928. xvldrepl.d U4, B0, 0x00
  2929. xvfmadd.d D0, U0, U4, D0
  2930. xvldrepl.d U4, B0, 0x08
  2931. xvfmadd.d D4, U0, U4, D4
  2932. xvldrepl.d U4, B0, 0x10
  2933. xvfmadd.d D8, U0, U4, D8
  2934. xvldrepl.d U4, B0, 0x18
  2935. xvfmadd.d D12, U0, U4, D12
  2936. addi.d A0, A0, 0x08
  2937. addi.d B0, B0, 0x20
  2938. /***8-2***/
  2939. xvld U0, A0, 0x00
  2940. xvldrepl.d U4, B0, 0x00
  2941. xvfmadd.d D0, U0, U4, D0
  2942. xvldrepl.d U4, B0, 0x08
  2943. xvfmadd.d D4, U0, U4, D4
  2944. xvldrepl.d U4, B0, 0x10
  2945. xvfmadd.d D8, U0, U4, D8
  2946. xvldrepl.d U4, B0, 0x18
  2947. xvfmadd.d D12, U0, U4, D12
  2948. addi.d A0, A0, 0x08
  2949. addi.d B0, B0, 0x20
  2950. /***8-3***/
  2951. xvld U0, A0, 0x00
  2952. xvldrepl.d U4, B0, 0x00
  2953. xvfmadd.d D0, U0, U4, D0
  2954. xvldrepl.d U4, B0, 0x08
  2955. xvfmadd.d D4, U0, U4, D4
  2956. xvldrepl.d U4, B0, 0x10
  2957. xvfmadd.d D8, U0, U4, D8
  2958. xvldrepl.d U4, B0, 0x18
  2959. xvfmadd.d D12, U0, U4, D12
  2960. addi.d A0, A0, 0x08
  2961. addi.d B0, B0, 0x20
  2962. /***8-4***/
  2963. xvld U0, A0, 0x00
  2964. xvldrepl.d U4, B0, 0x00
  2965. xvfmadd.d D0, U0, U4, D0
  2966. xvldrepl.d U4, B0, 0x08
  2967. xvfmadd.d D4, U0, U4, D4
  2968. xvldrepl.d U4, B0, 0x10
  2969. xvfmadd.d D8, U0, U4, D8
  2970. xvldrepl.d U4, B0, 0x18
  2971. xvfmadd.d D12, U0, U4, D12
  2972. addi.d A0, A0, 0x08
  2973. addi.d B0, B0, 0x20
  2974. /***8-5***/
  2975. xvld U0, A0, 0x00
  2976. xvldrepl.d U4, B0, 0x00
  2977. xvfmadd.d D0, U0, U4, D0
  2978. xvldrepl.d U4, B0, 0x08
  2979. xvfmadd.d D4, U0, U4, D4
  2980. xvldrepl.d U4, B0, 0x10
  2981. xvfmadd.d D8, U0, U4, D8
  2982. xvldrepl.d U4, B0, 0x18
  2983. xvfmadd.d D12, U0, U4, D12
  2984. addi.d A0, A0, 0x08
  2985. addi.d B0, B0, 0x20
  2986. /***8-6***/
  2987. xvld U0, A0, 0x00
  2988. xvldrepl.d U4, B0, 0x00
  2989. xvfmadd.d D0, U0, U4, D0
  2990. xvldrepl.d U4, B0, 0x08
  2991. xvfmadd.d D4, U0, U4, D4
  2992. xvldrepl.d U4, B0, 0x10
  2993. xvfmadd.d D8, U0, U4, D8
  2994. xvldrepl.d U4, B0, 0x18
  2995. xvfmadd.d D12, U0, U4, D12
  2996. addi.d A0, A0, 0x08
  2997. addi.d B0, B0, 0x20
  2998. /***8-7***/
  2999. xvld U0, A0, 0x00
  3000. xvldrepl.d U4, B0, 0x00
  3001. xvfmadd.d D0, U0, U4, D0
  3002. xvldrepl.d U4, B0, 0x08
  3003. xvfmadd.d D4, U0, U4, D4
  3004. xvldrepl.d U4, B0, 0x10
  3005. xvfmadd.d D8, U0, U4, D8
  3006. xvldrepl.d U4, B0, 0x18
  3007. xvfmadd.d D12, U0, U4, D12
  3008. addi.d A0, A0, 0x08
  3009. addi.d B0, B0, 0x20
  3010. /***8-8***/
  3011. xvld U0, A0, 0x00
  3012. xvldrepl.d U4, B0, 0x00
  3013. xvfmadd.d D0, U0, U4, D0
  3014. xvldrepl.d U4, B0, 0x08
  3015. xvfmadd.d D4, U0, U4, D4
  3016. xvldrepl.d U4, B0, 0x10
  3017. xvfmadd.d D8, U0, U4, D8
  3018. xvldrepl.d U4, B0, 0x18
  3019. xvfmadd.d D12, U0, U4, D12
  3020. addi.d A0, A0, 0x08
  3021. addi.d B0, B0, 0x20
  3022. addi.d TL, TL, -1 /* TL-- */
  3023. blt ZERO,TL, .L_N5_M1_TL1
  3024. .L_N5_M1_L7:
  3025. /* if (!(L & 7)) goto L_N5_M1_L0 */
  3026. andi TL, L, 7
  3027. beq TL, ZERO,.L_N5_M1_L0
  3028. .L_N5_M1_L71:
  3029. xvld U0, A0, 0x00
  3030. xvldrepl.d U4, B0, 0x00
  3031. xvfmadd.d D0, U0, U4, D0
  3032. xvldrepl.d U4, B0, 0x08
  3033. xvfmadd.d D4, U0, U4, D4
  3034. xvldrepl.d U4, B0, 0x10
  3035. xvfmadd.d D8, U0, U4, D8
  3036. xvldrepl.d U4, B0, 0x18
  3037. xvfmadd.d D12, U0, U4, D12
  3038. /* Add stride for A0, B0 */
  3039. addi.d A0, A0, 0x08
  3040. addi.d B0, B0, 0x20
  3041. addi.d TL, TL, -1
  3042. blt ZERO,TL, .L_N5_M1_L71
  3043. .L_N5_M1_L0:
  3044. #if defined(TRMMKERNEL)
  3045. xvfmul.d D0, D0, VALPHA
  3046. xvfmul.d D4, D4, VALPHA
  3047. xvfmul.d D8, D8, VALPHA
  3048. xvfmul.d D12, D12, VALPHA
  3049. #else
  3050. /* Load C0 */
  3051. xvld U0, C0, 0x00
  3052. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  3053. /* Load C1 */
  3054. xvld U0, C1, 0x00
  3055. xvfmadd.d D4, D4, VALPHA, U0
  3056. /* Load C2 */
  3057. xvld U0, C2, 0x00
  3058. xvfmadd.d D8, D8, VALPHA, U0
  3059. /* Load C3 */
  3060. xvld U0, C3, 0x00
  3061. xvfmadd.d D12, D12, VALPHA, U0
  3062. #endif
  3063. xvstelm.d D0, C0, 0x00, 0x00
  3064. xvstelm.d D4, C1, 0x00, 0x00
  3065. xvstelm.d D8, C2, 0x00, 0x00
  3066. xvstelm.d D12, C3, 0x00, 0x00
  3067. /* Add stride for C */
  3068. addi.d C0, C0, 0x08
  3069. addi.d C1, C1, 0x08
  3070. addi.d C2, C2, 0x08
  3071. addi.d C3, C3, 0x08
  3072. #if defined(TRMMKERNEL)
  3073. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  3074. sub.d L, K, OFF
  3075. #ifdef LEFT
  3076. /* number of values in A */
  3077. addi.d L, L, -1
  3078. #else
  3079. /* number of values in B */
  3080. addi.d L, L, -4
  3081. #endif
  3082. slli.d T0, L, 0x03
  3083. add.d A0, A0, T0
  3084. slli.d T0, L, 0x05
  3085. add.d B0, B0, T0
  3086. #endif
  3087. #ifdef LEFT
  3088. /* number of values in A */
  3089. addi.d OFF, OFF, 0x01
  3090. #endif
  3091. #endif // #if defined(TRMMKERNEL)
  3092. /********LOOP (if(N & 4 ) && (M & 1) ) End************/
  3093. .L_N5_M0:
  3094. /* Add stride for B and C
  3095. * B += (K * 32)
  3096. * C += (LDC * 32)
  3097. */
  3098. /* since the array type is double,
  3099. * so we must mul 32
  3100. */
  3101. addi.d T2, ZERO,32
  3102. mul.d T0, K, T2
  3103. mul.d T1, LDC, T2
  3104. add.d B, B, T0
  3105. add.d C, C, T1
  3106. #if defined(TRMMKERNEL) && !defined(LEFT)
  3107. addi.d OFF, OFF, 0x04
  3108. #endif
  3109. /* We must reinit I */
  3110. srai.d I, M, 4 /* I = bm >> 4 */
  3111. /************************* Condition 2 if((N & 4) && (M >> 4)) End !!! *************************
  3112. * dgemm_core_16x4 */
  3113. .L_N3:
  3114. andi J, N, 2
  3115. beq ZERO, J, .L_N1
  3116. /************************* Condition 3 if((N & 2) && (M >> 4)) START !!! *************************
  3117. * dgemm_core_16x2 */
  3118. move C0, C
  3119. move A0, A
  3120. slli.d T0, LDC, 3
  3121. add.d C1, C0, T0
  3122. #if defined(TRMMKERNEL) && defined(LEFT)
  3123. move OFF, OFFSET
  3124. #endif
  3125. /* if (!(M >> 4)) goto L_N3_M8 */
  3126. srai.d I, M, 4 /* I = bm >> 4 */
  3127. beq ZERO, I, .L_N3_M8
  3128. .L_N3_I1:
  3129. #if defined(TRMMKERNEL)
  3130. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  3131. move B0, B
  3132. #else
  3133. slli.d T0, OFF, 0x07
  3134. add.d A0, A0, T0
  3135. slli.d T0, OFF, 0x04
  3136. add.d B0, B, T0
  3137. #endif
  3138. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  3139. sub.d L, K, OFF
  3140. #elif defined(LEFT)
  3141. /* number of values in A */
  3142. addi.d L, OFF, 16
  3143. #else
  3144. /* number of values in B */
  3145. addi.d L, OFF, 2
  3146. #endif
  3147. #else // #if !defined(TRMMKERNEL)
  3148. move B0, B
  3149. move L, K /* L = bk */
  3150. #endif
  3151. /* Load 16 * 64 from A0
  3152. * U0 = {a3, a2, a1, a0}
  3153. * U1 = {a7, a6, a5, a4}
  3154. * U2 = {a11, a10, a9, a8}
  3155. * U3 = {a15, a14, a13, a12}
  3156. */
  3157. xvld U0, A0, 0x00
  3158. xvld U1, A0, 0x20
  3159. xvld U2, A0, 0x40
  3160. xvld U3, A0, 0x60
  3161. xvldrepl.d U4, B0, 0x00
  3162. /* line 1 */
  3163. xvfmul.d D0, U0, U4
  3164. xvfmul.d D1, U1, U4
  3165. xvfmul.d D2, U2, U4
  3166. xvfmul.d D3, U3, U4
  3167. xvldrepl.d U4, B0, 0x08
  3168. /* line 2 */
  3169. xvfmul.d D4, U0, U4
  3170. xvfmul.d D5, U1, U4
  3171. xvfmul.d D6, U2, U4
  3172. xvfmul.d D7, U3, U4
  3173. /* Add stride for A0 and B0 */
  3174. addi.d A0, A0, 0x80
  3175. addi.d B0, B0, 0x10
  3176. /* Reduce L */
  3177. addi.d L, L, -1
  3178. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  3179. /* if (TL < 1) goto L_N3_L7 */
  3180. beq ZERO,TL, .L_N3_L7
  3181. .L_N3_TL1: /* TL-- */
  3182. /***8-1***/
  3183. /* Load 16 * 64 from A0 */
  3184. xvld U0, A0, 0x00
  3185. xvld U1, A0, 0x20
  3186. xvld U2, A0, 0x40
  3187. xvld U3, A0, 0x60
  3188. xvldrepl.d U4, B0, 0x00
  3189. xvfmadd.d D0, U0, U4, D0
  3190. xvfmadd.d D1, U1, U4, D1
  3191. xvfmadd.d D2, U2, U4, D2
  3192. xvfmadd.d D3, U3, U4, D3
  3193. xvldrepl.d U4, B0, 0x08
  3194. xvfmadd.d D4, U0, U4, D4
  3195. xvfmadd.d D5, U1, U4, D5
  3196. xvfmadd.d D6, U2, U4, D6
  3197. xvfmadd.d D7, U3, U4, D7
  3198. addi.d A0, A0, 0x80
  3199. addi.d B0, B0, 0x10
  3200. /***8-2***/
  3201. /* Load 16 * 64 from A0 */
  3202. xvld U0, A0, 0x00
  3203. xvld U1, A0, 0x20
  3204. xvld U2, A0, 0x40
  3205. xvld U3, A0, 0x60
  3206. xvldrepl.d U4, B0, 0x00
  3207. xvfmadd.d D0, U0, U4, D0
  3208. xvfmadd.d D1, U1, U4, D1
  3209. xvfmadd.d D2, U2, U4, D2
  3210. xvfmadd.d D3, U3, U4, D3
  3211. xvldrepl.d U4, B0, 0x08
  3212. xvfmadd.d D4, U0, U4, D4
  3213. xvfmadd.d D5, U1, U4, D5
  3214. xvfmadd.d D6, U2, U4, D6
  3215. xvfmadd.d D7, U3, U4, D7
  3216. addi.d A0, A0, 0x80
  3217. addi.d B0, B0, 0x10
  3218. /***8-3***/
  3219. /* Load 16 * 64 from A0 */
  3220. xvld U0, A0, 0x00
  3221. xvld U1, A0, 0x20
  3222. xvld U2, A0, 0x40
  3223. xvld U3, A0, 0x60
  3224. xvldrepl.d U4, B0, 0x00
  3225. xvfmadd.d D0, U0, U4, D0
  3226. xvfmadd.d D1, U1, U4, D1
  3227. xvfmadd.d D2, U2, U4, D2
  3228. xvfmadd.d D3, U3, U4, D3
  3229. xvldrepl.d U4, B0, 0x08
  3230. xvfmadd.d D4, U0, U4, D4
  3231. xvfmadd.d D5, U1, U4, D5
  3232. xvfmadd.d D6, U2, U4, D6
  3233. xvfmadd.d D7, U3, U4, D7
  3234. addi.d A0, A0, 0x80
  3235. addi.d B0, B0, 0x10
  3236. /***8-4***/
  3237. /* Load 16 * 64 from A0 */
  3238. xvld U0, A0, 0x00
  3239. xvld U1, A0, 0x20
  3240. xvld U2, A0, 0x40
  3241. xvld U3, A0, 0x60
  3242. xvldrepl.d U4, B0, 0x00
  3243. xvfmadd.d D0, U0, U4, D0
  3244. xvfmadd.d D1, U1, U4, D1
  3245. xvfmadd.d D2, U2, U4, D2
  3246. xvfmadd.d D3, U3, U4, D3
  3247. xvldrepl.d U4, B0, 0x08
  3248. xvfmadd.d D4, U0, U4, D4
  3249. xvfmadd.d D5, U1, U4, D5
  3250. xvfmadd.d D6, U2, U4, D6
  3251. xvfmadd.d D7, U3, U4, D7
  3252. addi.d A0, A0, 0x80
  3253. addi.d B0, B0, 0x10
  3254. /***8-5***/
  3255. /* Load 16 * 64 from A0 */
  3256. xvld U0, A0, 0x00
  3257. xvld U1, A0, 0x20
  3258. xvld U2, A0, 0x40
  3259. xvld U3, A0, 0x60
  3260. xvldrepl.d U4, B0, 0x00
  3261. xvfmadd.d D0, U0, U4, D0
  3262. xvfmadd.d D1, U1, U4, D1
  3263. xvfmadd.d D2, U2, U4, D2
  3264. xvfmadd.d D3, U3, U4, D3
  3265. xvldrepl.d U4, B0, 0x08
  3266. xvfmadd.d D4, U0, U4, D4
  3267. xvfmadd.d D5, U1, U4, D5
  3268. xvfmadd.d D6, U2, U4, D6
  3269. xvfmadd.d D7, U3, U4, D7
  3270. addi.d A0, A0, 0x80
  3271. addi.d B0, B0, 0x10
  3272. /***8-6***/
  3273. /* Load 16 * 64 from A0 */
  3274. xvld U0, A0, 0x00
  3275. xvld U1, A0, 0x20
  3276. xvld U2, A0, 0x40
  3277. xvld U3, A0, 0x60
  3278. xvldrepl.d U4, B0, 0x00
  3279. xvfmadd.d D0, U0, U4, D0
  3280. xvfmadd.d D1, U1, U4, D1
  3281. xvfmadd.d D2, U2, U4, D2
  3282. xvfmadd.d D3, U3, U4, D3
  3283. xvldrepl.d U4, B0, 0x08
  3284. xvfmadd.d D4, U0, U4, D4
  3285. xvfmadd.d D5, U1, U4, D5
  3286. xvfmadd.d D6, U2, U4, D6
  3287. xvfmadd.d D7, U3, U4, D7
  3288. addi.d A0, A0, 0x80
  3289. addi.d B0, B0, 0x10
  3290. /***8-7***/
  3291. /* Load 16 * 64 from A0 */
  3292. xvld U0, A0, 0x00
  3293. xvld U1, A0, 0x20
  3294. xvld U2, A0, 0x40
  3295. xvld U3, A0, 0x60
  3296. xvldrepl.d U4, B0, 0x00
  3297. xvfmadd.d D0, U0, U4, D0
  3298. xvfmadd.d D1, U1, U4, D1
  3299. xvfmadd.d D2, U2, U4, D2
  3300. xvfmadd.d D3, U3, U4, D3
  3301. xvldrepl.d U4, B0, 0x08
  3302. xvfmadd.d D4, U0, U4, D4
  3303. xvfmadd.d D5, U1, U4, D5
  3304. xvfmadd.d D6, U2, U4, D6
  3305. xvfmadd.d D7, U3, U4, D7
  3306. addi.d A0, A0, 0x80
  3307. addi.d B0, B0, 0x10
  3308. /***8-8***/
  3309. /* Load 16 * 64 from A0 */
  3310. xvld U0, A0, 0x00
  3311. xvld U1, A0, 0x20
  3312. xvld U2, A0, 0x40
  3313. xvld U3, A0, 0x60
  3314. xvldrepl.d U4, B0, 0x00
  3315. xvfmadd.d D0, U0, U4, D0
  3316. xvfmadd.d D1, U1, U4, D1
  3317. xvfmadd.d D2, U2, U4, D2
  3318. xvfmadd.d D3, U3, U4, D3
  3319. xvldrepl.d U4, B0, 0x08
  3320. xvfmadd.d D4, U0, U4, D4
  3321. xvfmadd.d D5, U1, U4, D5
  3322. xvfmadd.d D6, U2, U4, D6
  3323. xvfmadd.d D7, U3, U4, D7
  3324. addi.d A0, A0, 0x80
  3325. addi.d B0, B0, 0x10
  3326. addi.d TL, TL, -1 /* TL-- */
  3327. blt ZERO,TL, .L_N3_TL1
  3328. .L_N3_L7:
  3329. /* if (!(L & 7)) goto L_N3_L0 */
  3330. andi TL, L, 7
  3331. beq TL, ZERO,.L_N3_L0
  3332. .L_N3_L71:
  3333. /* Load 16 * 64 from A0 */
  3334. xvld U0, A0, 0x00
  3335. xvld U1, A0, 0x20
  3336. xvld U2, A0, 0x40
  3337. xvld U3, A0, 0x60
  3338. xvldrepl.d U4, B0, 0x00
  3339. xvfmadd.d D0, U0, U4, D0
  3340. xvfmadd.d D1, U1, U4, D1
  3341. xvfmadd.d D2, U2, U4, D2
  3342. xvfmadd.d D3, U3, U4, D3
  3343. xvldrepl.d U4, B0, 0x08
  3344. xvfmadd.d D4, U0, U4, D4
  3345. xvfmadd.d D5, U1, U4, D5
  3346. xvfmadd.d D6, U2, U4, D6
  3347. xvfmadd.d D7, U3, U4, D7
  3348. /* Add stride for A0, B0 */
  3349. addi.d A0, A0, 0x80
  3350. addi.d B0, B0, 0x10
  3351. addi.d TL, TL, -1
  3352. blt ZERO,TL, .L_N3_L71
  3353. .L_N3_L0:
  3354. #if defined(TRMMKERNEL)
  3355. xvfmul.d D0, D0, VALPHA
  3356. xvfmul.d D1, D1, VALPHA
  3357. xvfmul.d D2, D2, VALPHA
  3358. xvfmul.d D3, D3, VALPHA
  3359. xvfmul.d D4, D4, VALPHA
  3360. xvfmul.d D5, D5, VALPHA
  3361. xvfmul.d D6, D6, VALPHA
  3362. xvfmul.d D7, D7, VALPHA
  3363. #else
  3364. /* Load C0 */
  3365. xvld U0, C0, 0x00
  3366. xvld U1, C0, 0x20
  3367. xvld U2, C0, 0x40
  3368. xvld U3, C0, 0x60
  3369. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  3370. xvfmadd.d D1, D1, VALPHA, U1
  3371. xvfmadd.d D2, D2, VALPHA, U2
  3372. xvfmadd.d D3, D3, VALPHA, U3
  3373. /* Load C1 */
  3374. xvld U0, C1, 0x00
  3375. xvld U1, C1, 0x20
  3376. xvld U2, C1, 0x40
  3377. xvld U3, C1, 0x60
  3378. xvfmadd.d D4, D4, VALPHA, U0
  3379. xvfmadd.d D5, D5, VALPHA, U1
  3380. xvfmadd.d D6, D6, VALPHA, U2
  3381. xvfmadd.d D7, D7, VALPHA, U3
  3382. #endif
  3383. /* Store C0 */
  3384. xvst D0, C0, 0x00
  3385. xvst D1, C0, 0x20
  3386. xvst D2, C0, 0x40
  3387. xvst D3, C0, 0x60
  3388. /* Store C1 */
  3389. xvst D4, C1, 0x00
  3390. xvst D5, C1, 0x20
  3391. xvst D6, C1, 0x40
  3392. xvst D7, C1, 0x60
  3393. /* Add stride for C */
  3394. addi.d C0, C0, 0x80
  3395. addi.d C1, C1, 0x80
  3396. #if defined(TRMMKERNEL)
  3397. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  3398. sub.d L, K, OFF
  3399. #ifdef LEFT
  3400. addi.d L, L, -16
  3401. #else
  3402. addi.d L, L, -2
  3403. #endif
  3404. slli.d T0, L, 0x07
  3405. add.d A0, A0, T0
  3406. slli.d T0, L, 0x04
  3407. add.d B0, B0, T0
  3408. #endif
  3409. #ifdef LEFT
  3410. addi.d OFF, OFF, 0x10
  3411. #endif
  3412. #endif // #if defined(TRMMKERNEL)
  3413. addi.d I, I, -1 /* I-- */
  3414. blt ZERO,I, .L_N3_I1
  3415. .L_N3_M8:
  3416. /* We have done M & 16, considering M=8/4/2/1 */
  3417. andi I, M, 15
  3418. beq ZERO,I, .L_N3_M0
  3419. andi I, M, 8
  3420. beq ZERO,I, .L_N3_M4
  3421. #if defined(TRMMKERNEL)
  3422. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  3423. move B0, B
  3424. #else
  3425. slli.d T0, OFF, 0x06
  3426. add.d A0, A0, T0
  3427. slli.d T0, OFF, 0x04
  3428. add.d B0, B, T0
  3429. #endif
  3430. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  3431. sub.d L, K, OFF
  3432. #elif defined(LEFT)
  3433. /* number of values in A */
  3434. addi.d L, OFF, 8
  3435. #else
  3436. /* number of values in B */
  3437. addi.d L, OFF, 2
  3438. #endif
  3439. #else // #if !defined(TRMMKERNEL)
  3440. move B0, B
  3441. move L, K /* L = bk */
  3442. #endif
  3443. /* Load 8 * 64 from A0 */
  3444. xvld U0, A0, 0x00
  3445. xvld U1, A0, 0x20
  3446. xvldrepl.d U4, B0, 0x00
  3447. /* line 1 */
  3448. xvfmul.d D0, U0, U4
  3449. xvfmul.d D1, U1, U4
  3450. xvldrepl.d U4, B0, 0x08
  3451. /* line 2 */
  3452. xvfmul.d D4, U0, U4
  3453. xvfmul.d D5, U1, U4
  3454. /* Add stride for A0 and B0 */
  3455. addi.d A0, A0, 0x40
  3456. addi.d B0, B0, 0x10
  3457. /* Reduce L */
  3458. addi.d L, L, -1
  3459. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  3460. /* if (TL < 1) goto L_N3_M8_L7 */
  3461. beq ZERO,TL, .L_N3_M8_L7
  3462. .L_N3_M8_TL1: /* TL-- */
  3463. /***8-1***/
  3464. /* Load 16 * 64 from A0 */
  3465. xvld U0, A0, 0x00
  3466. xvld U1, A0, 0x20
  3467. xvldrepl.d U4, B0, 0x00
  3468. xvfmadd.d D0, U0, U4, D0
  3469. xvfmadd.d D1, U1, U4, D1
  3470. xvldrepl.d U4, B0, 0x08
  3471. xvfmadd.d D4, U0, U4, D4
  3472. xvfmadd.d D5, U1, U4, D5
  3473. addi.d A0, A0, 0x40
  3474. addi.d B0, B0, 0x10
  3475. /***8-2***/
  3476. xvld U0, A0, 0x00
  3477. xvld U1, A0, 0x20
  3478. xvldrepl.d U4, B0, 0x00
  3479. xvfmadd.d D0, U0, U4, D0
  3480. xvfmadd.d D1, U1, U4, D1
  3481. xvldrepl.d U4, B0, 0x08
  3482. xvfmadd.d D4, U0, U4, D4
  3483. xvfmadd.d D5, U1, U4, D5
  3484. addi.d A0, A0, 0x40
  3485. addi.d B0, B0, 0x10
  3486. /***8-3***/
  3487. xvld U0, A0, 0x00
  3488. xvld U1, A0, 0x20
  3489. xvldrepl.d U4, B0, 0x00
  3490. xvfmadd.d D0, U0, U4, D0
  3491. xvfmadd.d D1, U1, U4, D1
  3492. xvldrepl.d U4, B0, 0x08
  3493. xvfmadd.d D4, U0, U4, D4
  3494. xvfmadd.d D5, U1, U4, D5
  3495. addi.d A0, A0, 0x40
  3496. addi.d B0, B0, 0x10
  3497. /***8-4***/
  3498. xvld U0, A0, 0x00
  3499. xvld U1, A0, 0x20
  3500. xvldrepl.d U4, B0, 0x00
  3501. xvfmadd.d D0, U0, U4, D0
  3502. xvfmadd.d D1, U1, U4, D1
  3503. xvldrepl.d U4, B0, 0x08
  3504. xvfmadd.d D4, U0, U4, D4
  3505. xvfmadd.d D5, U1, U4, D5
  3506. addi.d A0, A0, 0x40
  3507. addi.d B0, B0, 0x10
  3508. /***8-5***/
  3509. xvld U0, A0, 0x00
  3510. xvld U1, A0, 0x20
  3511. /* Cumulative D0~D23 */
  3512. xvldrepl.d U4, B0, 0x00
  3513. xvfmadd.d D0, U0, U4, D0
  3514. xvfmadd.d D1, U1, U4, D1
  3515. xvldrepl.d U4, B0, 0x08
  3516. xvfmadd.d D4, U0, U4, D4
  3517. xvfmadd.d D5, U1, U4, D5
  3518. addi.d A0, A0, 0x40
  3519. addi.d B0, B0, 0x10
  3520. /***8-6***/
  3521. xvld U0, A0, 0x00
  3522. xvld U1, A0, 0x20
  3523. xvldrepl.d U4, B0, 0x00
  3524. xvfmadd.d D0, U0, U4, D0
  3525. xvfmadd.d D1, U1, U4, D1
  3526. xvldrepl.d U4, B0, 0x08
  3527. xvfmadd.d D4, U0, U4, D4
  3528. xvfmadd.d D5, U1, U4, D5
  3529. addi.d A0, A0, 0x40
  3530. addi.d B0, B0, 0x10
  3531. /***8-7***/
  3532. xvld U0, A0, 0x00
  3533. xvld U1, A0, 0x20
  3534. xvldrepl.d U4, B0, 0x00
  3535. xvfmadd.d D0, U0, U4, D0
  3536. xvfmadd.d D1, U1, U4, D1
  3537. xvldrepl.d U4, B0, 0x08
  3538. xvfmadd.d D4, U0, U4, D4
  3539. xvfmadd.d D5, U1, U4, D5
  3540. addi.d A0, A0, 0x40
  3541. addi.d B0, B0, 0x10
  3542. /***8-8***/
  3543. xvld U0, A0, 0x00
  3544. xvld U1, A0, 0x20
  3545. xvldrepl.d U4, B0, 0x00
  3546. xvfmadd.d D0, U0, U4, D0
  3547. xvfmadd.d D1, U1, U4, D1
  3548. xvldrepl.d U4, B0, 0x08
  3549. xvfmadd.d D4, U0, U4, D4
  3550. xvfmadd.d D5, U1, U4, D5
  3551. addi.d A0, A0, 0x40
  3552. addi.d B0, B0, 0x10
  3553. addi.d TL, TL, -1 /* TL-- */
  3554. blt ZERO,TL, .L_N3_M8_TL1
  3555. .L_N3_M8_L7:
  3556. /* if (!(L & 7)) goto L_N3_M8_L0 */
  3557. andi TL, L, 7
  3558. beq TL, ZERO,.L_N3_M8_L0
  3559. .L_N3_M8_L71:
  3560. xvld U0, A0, 0x00
  3561. xvld U1, A0, 0x20
  3562. xvldrepl.d U4, B0, 0x00
  3563. xvfmadd.d D0, U0, U4, D0
  3564. xvfmadd.d D1, U1, U4, D1
  3565. xvldrepl.d U4, B0, 0x08
  3566. xvfmadd.d D4, U0, U4, D4
  3567. xvfmadd.d D5, U1, U4, D5
  3568. /* Add stride for A0, B0 */
  3569. addi.d A0, A0, 0x40
  3570. addi.d B0, B0, 0x10
  3571. addi.d TL, TL, -1
  3572. blt ZERO,TL, .L_N3_M8_L71
  3573. .L_N3_M8_L0:
  3574. #if defined(TRMMKERNEL)
  3575. xvfmul.d D0, D0, VALPHA
  3576. xvfmul.d D1, D1, VALPHA
  3577. xvfmul.d D4, D4, VALPHA
  3578. xvfmul.d D5, D5, VALPHA
  3579. #else
  3580. /* Load C0 */
  3581. xvld U0, C0, 0x00
  3582. xvld U1, C0, 0x20
  3583. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  3584. xvfmadd.d D1, D1, VALPHA, U1
  3585. /* Load C1 */
  3586. xvld U0, C1, 0x00
  3587. xvld U1, C1, 0x20
  3588. xvfmadd.d D4, D4, VALPHA, U0
  3589. xvfmadd.d D5, D5, VALPHA, U1
  3590. #endif
  3591. /* Store C0 */
  3592. xvst D0, C0, 0x00
  3593. xvst D1, C0, 0x20
  3594. /* Store C1 */
  3595. xvst D4, C1, 0x00
  3596. xvst D5, C1, 0x20
  3597. /* Add stride for C */
  3598. addi.d C0, C0, 0x40
  3599. addi.d C1, C1, 0x40
  3600. #if defined(TRMMKERNEL)
  3601. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  3602. sub.d L, K, OFF
  3603. #ifdef LEFT
  3604. addi.d L, L, -8
  3605. #else
  3606. addi.d L, L, -2
  3607. #endif
  3608. slli.d T0, L, 0x06
  3609. add.d A0, A0, T0
  3610. slli.d T0, L, 0x04
  3611. add.d B0, B0, T0
  3612. #endif
  3613. #ifdef LEFT
  3614. addi.d OFF, OFF, 0x08
  3615. #endif
  3616. #endif // #if defined(TRMMKERNEL)
  3617. /********LOOP (if(N & 2) && (M & 8) ) End************/
  3618. .L_N3_M4:
  3619. andi I, M, 4
  3620. beq ZERO,I, .L_N3_M2
  3621. #if defined(TRMMKERNEL)
  3622. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  3623. move B0, B
  3624. #else
  3625. slli.d T0, OFF, 0x05
  3626. add.d A0, A0, T0
  3627. slli.d T0, OFF, 0x04
  3628. add.d B0, B, T0
  3629. #endif
  3630. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  3631. sub.d L, K, OFF
  3632. #elif defined(LEFT)
  3633. /* number of values in A */
  3634. addi.d L, OFF, 4
  3635. #else
  3636. /* number of values in B */
  3637. addi.d L, OFF, 2
  3638. #endif
  3639. #else // #if !defined(TRMMKERNEL)
  3640. move B0, B
  3641. move L, K /* L = bk */
  3642. #endif
  3643. /* Load 4 * 64 from A0 */
  3644. xvld U0, A0, 0x00
  3645. xvldrepl.d U4, B0, 0x00
  3646. /* line 1 */
  3647. xvfmul.d D0, U0, U4
  3648. xvldrepl.d U4, B0, 0x08
  3649. /* line 2 */
  3650. xvfmul.d D4, U0, U4
  3651. /* Add stride for A0 and B0 */
  3652. addi.d A0, A0, 0x20
  3653. addi.d B0, B0, 0x10
  3654. /* Reduce L */
  3655. addi.d L, L, -1
  3656. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  3657. /* if (TL < 1) goto L_N3_M4_L7 */
  3658. beq ZERO,TL, .L_N3_M4_L7
  3659. .L_N3_M4_TL1: /* TL-- */
  3660. /***8-1***/
  3661. /* Load 8 * 64 from A0 */
  3662. xvld U0, A0, 0x00
  3663. xvldrepl.d U4, B0, 0x00
  3664. xvfmadd.d D0, U0, U4, D0
  3665. xvldrepl.d U4, B0, 0x08
  3666. xvfmadd.d D4, U0, U4, D4
  3667. addi.d A0, A0, 0x20
  3668. addi.d B0, B0, 0x10
  3669. /***8-2***/
  3670. xvld U0, A0, 0x00
  3671. xvldrepl.d U4, B0, 0x00
  3672. xvfmadd.d D0, U0, U4, D0
  3673. xvldrepl.d U4, B0, 0x08
  3674. xvfmadd.d D4, U0, U4, D4
  3675. addi.d A0, A0, 0x20
  3676. addi.d B0, B0, 0x10
  3677. /***8-3***/
  3678. xvld U0, A0, 0x00
  3679. xvldrepl.d U4, B0, 0x00
  3680. xvfmadd.d D0, U0, U4, D0
  3681. xvldrepl.d U4, B0, 0x08
  3682. xvfmadd.d D4, U0, U4, D4
  3683. addi.d A0, A0, 0x20
  3684. addi.d B0, B0, 0x10
  3685. /***8-4***/
  3686. xvld U0, A0, 0x00
  3687. xvldrepl.d U4, B0, 0x00
  3688. xvfmadd.d D0, U0, U4, D0
  3689. xvldrepl.d U4, B0, 0x08
  3690. xvfmadd.d D4, U0, U4, D4
  3691. addi.d A0, A0, 0x20
  3692. addi.d B0, B0, 0x10
  3693. /***8-5***/
  3694. xvld U0, A0, 0x00
  3695. /* Cumulative D0~D23 */
  3696. xvldrepl.d U4, B0, 0x00
  3697. xvfmadd.d D0, U0, U4, D0
  3698. xvldrepl.d U4, B0, 0x08
  3699. xvfmadd.d D4, U0, U4, D4
  3700. addi.d A0, A0, 0x20
  3701. addi.d B0, B0, 0x10
  3702. /***8-6***/
  3703. xvld U0, A0, 0x00
  3704. xvldrepl.d U4, B0, 0x00
  3705. xvfmadd.d D0, U0, U4, D0
  3706. xvldrepl.d U4, B0, 0x08
  3707. xvfmadd.d D4, U0, U4, D4
  3708. addi.d A0, A0, 0x20
  3709. addi.d B0, B0, 0x10
  3710. /***8-7***/
  3711. xvld U0, A0, 0x00
  3712. xvldrepl.d U4, B0, 0x00
  3713. xvfmadd.d D0, U0, U4, D0
  3714. xvldrepl.d U4, B0, 0x08
  3715. xvfmadd.d D4, U0, U4, D4
  3716. addi.d A0, A0, 0x20
  3717. addi.d B0, B0, 0x10
  3718. /***8-8***/
  3719. xvld U0, A0, 0x00
  3720. xvldrepl.d U4, B0, 0x00
  3721. xvfmadd.d D0, U0, U4, D0
  3722. xvldrepl.d U4, B0, 0x08
  3723. xvfmadd.d D4, U0, U4, D4
  3724. addi.d A0, A0, 0x20
  3725. addi.d B0, B0, 0x10
  3726. addi.d TL, TL, -1 /* TL-- */
  3727. blt ZERO,TL, .L_N3_M4_TL1
  3728. .L_N3_M4_L7:
  3729. /* if (!(L & 7)) goto L_N3_M4_L0 */
  3730. andi TL, L, 7
  3731. beq TL, ZERO,.L_N3_M4_L0
  3732. .L_N3_M4_L71:
  3733. xvld U0, A0, 0x00
  3734. xvldrepl.d U4, B0, 0x00
  3735. xvfmadd.d D0, U0, U4, D0
  3736. xvldrepl.d U4, B0, 0x08
  3737. xvfmadd.d D4, U0, U4, D4
  3738. /* Add stride for A0, B0 */
  3739. addi.d A0, A0, 0x20
  3740. addi.d B0, B0, 0x10
  3741. addi.d TL, TL, -1
  3742. blt ZERO,TL, .L_N3_M4_L71
  3743. .L_N3_M4_L0:
  3744. #if defined(TRMMKERNEL)
  3745. xvfmul.d D0, D0, VALPHA
  3746. xvfmul.d D4, D4, VALPHA
  3747. #else
  3748. /* Load C0 */
  3749. xvld U0, C0, 0x00
  3750. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  3751. /* Load C1 */
  3752. xvld U0, C1, 0x00
  3753. xvfmadd.d D4, D4, VALPHA, U0
  3754. #endif
  3755. /* Store C0 */
  3756. xvst D0, C0, 0x00
  3757. /* Store C1 */
  3758. xvst D4, C1, 0x00
  3759. /* Add stride for C */
  3760. addi.d C0, C0, 0x20
  3761. addi.d C1, C1, 0x20
  3762. #if defined(TRMMKERNEL)
  3763. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  3764. sub.d L, K, OFF
  3765. #ifdef LEFT
  3766. addi.d L, L, -4
  3767. #else
  3768. addi.d L, L, -2
  3769. #endif
  3770. slli.d T0, L, 0x05
  3771. add.d A0, A0, T0
  3772. slli.d T0, L, 0x04
  3773. add.d B0, B0, T0
  3774. #endif
  3775. #ifdef LEFT
  3776. addi.d OFF, OFF, 0x04
  3777. #endif
  3778. #endif // #if defined(TRMMKERNEL)
  3779. /********LOOP (if(N & 2 ) && (M & 4) ) End************/
  3780. .L_N3_M2:
  3781. andi I, M, 2
  3782. beq ZERO,I, .L_N3_M1
  3783. #if defined(TRMMKERNEL)
  3784. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  3785. move B0, B
  3786. #else
  3787. slli.d T0, OFF, 0x04
  3788. add.d A0, A0, T0
  3789. add.d B0, B, T0
  3790. #endif
  3791. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  3792. sub.d L, K, OFF
  3793. #elif defined(LEFT)
  3794. /* number of values in A */
  3795. addi.d L, OFF, 2
  3796. #else
  3797. /* number of values in B */
  3798. addi.d L, OFF, 2
  3799. #endif
  3800. #else // #if !defined(TRMMKERNEL)
  3801. move B0, B
  3802. move L, K /* L = bk */
  3803. #endif
  3804. /* Load 2 * 64 from A0 */
  3805. xvld U0, A0, 0x00
  3806. xvldrepl.d U4, B0, 0x00
  3807. /* line 1 */
  3808. xvfmul.d D0, U0, U4
  3809. xvldrepl.d U4, B0, 0x08
  3810. /* line 2 */
  3811. xvfmul.d D4, U0, U4
  3812. /* Add stride for A0 and B0 */
  3813. addi.d A0, A0, 0x10
  3814. addi.d B0, B0, 0x10
  3815. /* Reduce L */
  3816. addi.d L, L, -1
  3817. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  3818. /* if (TL < 1) goto L_N3_M2_L7 */
  3819. beq ZERO,TL, .L_N3_M2_L7
  3820. .L_N3_M2_TL1: /* TL-- */
  3821. /***8-1***/
  3822. /* Load 2 * 64 from A0 */
  3823. xvld U0, A0, 0x00
  3824. xvldrepl.d U4, B0, 0x00
  3825. xvfmadd.d D0, U0, U4, D0
  3826. xvldrepl.d U4, B0, 0x08
  3827. xvfmadd.d D4, U0, U4, D4
  3828. addi.d A0, A0, 0x10
  3829. addi.d B0, B0, 0x10
  3830. /***8-2***/
  3831. xvld U0, A0, 0x00
  3832. xvldrepl.d U4, B0, 0x00
  3833. xvfmadd.d D0, U0, U4, D0
  3834. xvldrepl.d U4, B0, 0x08
  3835. xvfmadd.d D4, U0, U4, D4
  3836. addi.d A0, A0, 0x10
  3837. addi.d B0, B0, 0x10
  3838. /***8-3***/
  3839. xvld U0, A0, 0x00
  3840. xvldrepl.d U4, B0, 0x00
  3841. xvfmadd.d D0, U0, U4, D0
  3842. xvldrepl.d U4, B0, 0x08
  3843. xvfmadd.d D4, U0, U4, D4
  3844. addi.d A0, A0, 0x10
  3845. addi.d B0, B0, 0x10
  3846. /***8-4***/
  3847. xvld U0, A0, 0x00
  3848. xvldrepl.d U4, B0, 0x00
  3849. xvfmadd.d D0, U0, U4, D0
  3850. xvldrepl.d U4, B0, 0x08
  3851. xvfmadd.d D4, U0, U4, D4
  3852. addi.d A0, A0, 0x10
  3853. addi.d B0, B0, 0x10
  3854. /***8-5***/
  3855. xvld U0, A0, 0x00
  3856. xvldrepl.d U4, B0, 0x00
  3857. xvfmadd.d D0, U0, U4, D0
  3858. xvldrepl.d U4, B0, 0x08
  3859. xvfmadd.d D4, U0, U4, D4
  3860. addi.d A0, A0, 0x10
  3861. addi.d B0, B0, 0x10
  3862. /***8-6***/
  3863. xvld U0, A0, 0x00
  3864. xvldrepl.d U4, B0, 0x00
  3865. xvfmadd.d D0, U0, U4, D0
  3866. xvldrepl.d U4, B0, 0x08
  3867. xvfmadd.d D4, U0, U4, D4
  3868. addi.d A0, A0, 0x10
  3869. addi.d B0, B0, 0x10
  3870. /***8-7***/
  3871. xvld U0, A0, 0x00
  3872. xvldrepl.d U4, B0, 0x00
  3873. xvfmadd.d D0, U0, U4, D0
  3874. xvldrepl.d U4, B0, 0x08
  3875. xvfmadd.d D4, U0, U4, D4
  3876. addi.d A0, A0, 0x10
  3877. addi.d B0, B0, 0x10
  3878. /***8-8***/
  3879. xvld U0, A0, 0x00
  3880. xvldrepl.d U4, B0, 0x00
  3881. xvfmadd.d D0, U0, U4, D0
  3882. xvldrepl.d U4, B0, 0x08
  3883. xvfmadd.d D4, U0, U4, D4
  3884. addi.d A0, A0, 0x10
  3885. addi.d B0, B0, 0x10
  3886. addi.d TL, TL, -1 /* TL-- */
  3887. blt ZERO,TL, .L_N3_M2_TL1
  3888. .L_N3_M2_L7:
  3889. /* if (!(L & 7)) goto L_N3_M2_L0 */
  3890. andi TL, L, 7
  3891. beq TL, ZERO,.L_N3_M2_L0
  3892. .L_N3_M2_L71:
  3893. xvld U0, A0, 0x00
  3894. xvldrepl.d U4, B0, 0x00
  3895. xvfmadd.d D0, U0, U4, D0
  3896. xvldrepl.d U4, B0, 0x08
  3897. xvfmadd.d D4, U0, U4, D4
  3898. /* Add stride for A0, B0 */
  3899. addi.d A0, A0, 0x10
  3900. addi.d B0, B0, 0x10
  3901. addi.d TL, TL, -1
  3902. blt ZERO,TL, .L_N3_M2_L71
  3903. .L_N3_M2_L0:
  3904. #if defined(TRMMKERNEL)
  3905. xvfmul.d D0, D0, VALPHA
  3906. xvfmul.d D4, D4, VALPHA
  3907. #else
  3908. /* Load C0 */
  3909. xvld U0, C0, 0x00
  3910. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  3911. /* Load C1 */
  3912. xvld U0, C1, 0x00
  3913. xvfmadd.d D4, D4, VALPHA, U0
  3914. #endif
  3915. xvstelm.d D0, C0, 0x00, 0x00
  3916. xvstelm.d D4, C1, 0x00, 0x00
  3917. xvstelm.d D0, C0, 0x08, 0x01
  3918. xvstelm.d D4, C1, 0x08, 0x01
  3919. /* Add stride for C */
  3920. addi.d C0, C0, 0x10
  3921. addi.d C1, C1, 0x10
  3922. #if defined(TRMMKERNEL)
  3923. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  3924. sub.d L, K, OFF
  3925. #ifdef LEFT
  3926. addi.d L, L, -2
  3927. #else
  3928. addi.d L, L, -2
  3929. #endif
  3930. slli.d T0, L, 0x04
  3931. add.d A0, A0, T0
  3932. add.d B0, B0, T0
  3933. #endif
  3934. #ifdef LEFT
  3935. addi.d OFF, OFF, 0x02
  3936. #endif
  3937. #endif // #if defined(TRMMKERNEL)
  3938. /********LOOP (if(N & 2 ) && (M & 2) ) End************/
  3939. .L_N3_M1:
  3940. andi I, M, 1
  3941. beq ZERO,I, .L_N3_M0
  3942. #if defined(TRMMKERNEL)
  3943. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  3944. move B0, B
  3945. #else
  3946. slli.d T0, OFF, 0x03
  3947. add.d A0, A0, T0
  3948. slli.d T0, OFF, 0x04
  3949. add.d B0, B, T0
  3950. #endif
  3951. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  3952. sub.d L, K, OFF
  3953. #elif defined(LEFT)
  3954. /* number of values in A */
  3955. addi.d L, OFF, 1
  3956. #else
  3957. /* number of values in B */
  3958. addi.d L, OFF, 2
  3959. #endif
  3960. #else // #if !defined(TRMMKERNEL)
  3961. move B0, B
  3962. move L, K /* L = bk */
  3963. #endif
  3964. /* Load 1 * 64 from A0 */
  3965. xvld U0, A0, 0x00
  3966. xvldrepl.d U4, B0, 0x00
  3967. /* line 1 */
  3968. xvfmul.d D0, U0, U4
  3969. xvldrepl.d U4, B0, 0x08
  3970. /* line 2 */
  3971. xvfmul.d D4, U0, U4
  3972. /* Add stride for A0 and B0 */
  3973. addi.d A0, A0, 0x08
  3974. addi.d B0, B0, 0x10
  3975. /* Reduce L */
  3976. addi.d L, L, -1
  3977. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  3978. /* if (TL < 1) goto L_N3_M1_L7 */
  3979. beq ZERO,TL, .L_N3_M1_L7
  3980. .L_N3_M1_TL1: /* TL-- */
  3981. /***8-1***/
  3982. /* Load 1 * 64 from A0 */
  3983. xvld U0, A0, 0x00
  3984. xvldrepl.d U4, B0, 0x00
  3985. xvfmadd.d D0, U0, U4, D0
  3986. xvldrepl.d U4, B0, 0x08
  3987. xvfmadd.d D4, U0, U4, D4
  3988. addi.d A0, A0, 0x08
  3989. addi.d B0, B0, 0x10
  3990. /***8-2***/
  3991. xvld U0, A0, 0x00
  3992. xvldrepl.d U4, B0, 0x00
  3993. xvfmadd.d D0, U0, U4, D0
  3994. xvldrepl.d U4, B0, 0x08
  3995. xvfmadd.d D4, U0, U4, D4
  3996. addi.d A0, A0, 0x08
  3997. addi.d B0, B0, 0x10
  3998. /***8-3***/
  3999. xvld U0, A0, 0x00
  4000. xvldrepl.d U4, B0, 0x00
  4001. xvfmadd.d D0, U0, U4, D0
  4002. xvldrepl.d U4, B0, 0x08
  4003. xvfmadd.d D4, U0, U4, D4
  4004. addi.d A0, A0, 0x08
  4005. addi.d B0, B0, 0x10
  4006. /***8-4***/
  4007. xvld U0, A0, 0x00
  4008. xvldrepl.d U4, B0, 0x00
  4009. xvfmadd.d D0, U0, U4, D0
  4010. xvldrepl.d U4, B0, 0x08
  4011. xvfmadd.d D4, U0, U4, D4
  4012. addi.d A0, A0, 0x08
  4013. addi.d B0, B0, 0x10
  4014. /***8-5***/
  4015. xvld U0, A0, 0x00
  4016. xvldrepl.d U4, B0, 0x00
  4017. xvfmadd.d D0, U0, U4, D0
  4018. xvldrepl.d U4, B0, 0x08
  4019. xvfmadd.d D4, U0, U4, D4
  4020. addi.d A0, A0, 0x08
  4021. addi.d B0, B0, 0x10
  4022. /***8-6***/
  4023. xvld U0, A0, 0x00
  4024. xvldrepl.d U4, B0, 0x00
  4025. xvfmadd.d D0, U0, U4, D0
  4026. xvldrepl.d U4, B0, 0x08
  4027. xvfmadd.d D4, U0, U4, D4
  4028. addi.d A0, A0, 0x08
  4029. addi.d B0, B0, 0x10
  4030. /***8-7***/
  4031. xvld U0, A0, 0x00
  4032. xvldrepl.d U4, B0, 0x00
  4033. xvfmadd.d D0, U0, U4, D0
  4034. xvldrepl.d U4, B0, 0x08
  4035. xvfmadd.d D4, U0, U4, D4
  4036. addi.d A0, A0, 0x08
  4037. addi.d B0, B0, 0x10
  4038. /***8-8***/
  4039. xvld U0, A0, 0x00
  4040. xvldrepl.d U4, B0, 0x00
  4041. xvfmadd.d D0, U0, U4, D0
  4042. xvldrepl.d U4, B0, 0x08
  4043. xvfmadd.d D4, U0, U4, D4
  4044. addi.d A0, A0, 0x08
  4045. addi.d B0, B0, 0x10
  4046. addi.d TL, TL, -1 /* TL-- */
  4047. blt ZERO,TL, .L_N3_M1_TL1
  4048. .L_N3_M1_L7:
  4049. /* if (!(L & 7)) goto L_N3_M1_L0 */
  4050. andi TL, L, 7
  4051. beq TL, ZERO,.L_N3_M1_L0
  4052. .L_N3_M1_L71:
  4053. xvld U0, A0, 0x00
  4054. xvldrepl.d U4, B0, 0x00
  4055. xvfmadd.d D0, U0, U4, D0
  4056. xvldrepl.d U4, B0, 0x08
  4057. xvfmadd.d D4, U0, U4, D4
  4058. /* Add stride for A0, B0 */
  4059. addi.d A0, A0, 0x08
  4060. addi.d B0, B0, 0x10
  4061. addi.d TL, TL, -1
  4062. blt ZERO,TL, .L_N3_M1_L71
  4063. .L_N3_M1_L0:
  4064. #if defined(TRMMKERNEL)
  4065. xvfmul.d D0, D0, VALPHA
  4066. xvfmul.d D4, D4, VALPHA
  4067. #else
  4068. /* Load C0 */
  4069. xvld U0, C0, 0x00
  4070. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  4071. /* Load C1 */
  4072. xvld U0, C1, 0x00
  4073. xvfmadd.d D4, D4, VALPHA, U0
  4074. #endif
  4075. xvstelm.d D0, C0, 0x00, 0x00
  4076. xvstelm.d D4, C1, 0x00, 0x00
  4077. /* Add stride for C */
  4078. addi.d C0, C0, 0x08
  4079. addi.d C1, C1, 0x08
  4080. #if defined(TRMMKERNEL)
  4081. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4082. sub.d L, K, OFF
  4083. #ifdef LEFT
  4084. addi.d L, L, -1
  4085. #else
  4086. addi.d L, L, -2
  4087. #endif
  4088. slli.d T0, L, 0x03
  4089. add.d A0, A0, T0
  4090. slli.d T0, L, 0x04
  4091. add.d B0, B0, T0
  4092. #endif
  4093. #ifdef LEFT
  4094. addi.d OFF, OFF, 0x01
  4095. #endif
  4096. #endif // #if defined(TRMMKERNEL)
  4097. /********LOOP (if(N & 2 ) && (M & 1) ) End************/
  4098. .L_N3_M0:
  4099. /* Add stride for B and C
  4100. * B += (K * 16)
  4101. * C += (LDC * 16)
  4102. */
  4103. /* since the array type is double,
  4104. * so we must mul 32
  4105. */
  4106. addi.d T2, ZERO,16
  4107. mul.d T0, K, T2
  4108. mul.d T1, LDC, T2
  4109. add.d B, B, T0
  4110. add.d C, C, T1
  4111. #if defined(TRMMKERNEL) && !defined(LEFT)
  4112. addi.d OFF, OFF, 0x02
  4113. #endif
  4114. /* We must reinit I */
  4115. srai.d I, M, 4 /* I = bm >> 4 */
  4116. /************************* Condition 3 if((N & 2) && (M >> 4)) End !!! *************************
  4117. * dgemm_core_16x2 */
  4118. .L_N1:
  4119. andi J, N, 1
  4120. beq ZERO, J, .L_N0
  4121. /************************* Condition 4 if((N & 1) && (M >> 4)) START !!! *************************
  4122. * dgemm_core_16x1 */
  4123. move C0, C
  4124. move A0, A
  4125. #if defined(TRMMKERNEL) && defined(LEFT)
  4126. move OFF, OFFSET
  4127. #endif
  4128. /* if (!(M >> 4)) goto L_N1_M8 */
  4129. srai.d I, M, 4 /* I = bm >> 4 */
  4130. beq ZERO, I, .L_N1_M8
  4131. .L_N1_I1:
  4132. #if defined(TRMMKERNEL)
  4133. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4134. move B0, B
  4135. #else
  4136. slli.d T0, OFF, 0x07
  4137. add.d A0, A0, T0
  4138. slli.d T0, OFF, 0x03
  4139. add.d B0, B, T0
  4140. #endif
  4141. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  4142. sub.d L, K, OFF
  4143. #elif defined(LEFT)
  4144. /* number of values in A */
  4145. addi.d L, OFF, 16
  4146. #else
  4147. /* number of values in B */
  4148. addi.d L, OFF, 1
  4149. #endif
  4150. #else // #if !defined(TRMMKERNEL)
  4151. move B0, B
  4152. move L, K /* L = bk */
  4153. #endif
  4154. /* Load 16 * 64 from A0
  4155. * U0 = {a3, a2, a1, a0}
  4156. * U1 = {a7, a6, a5, a4}
  4157. * U2 = {a11, a10, a9, a8}
  4158. * U3 = {a15, a14, a13, a12}
  4159. */
  4160. xvld U0, A0, 0x00
  4161. xvld U1, A0, 0x20
  4162. xvld U2, A0, 0x40
  4163. xvld U3, A0, 0x60
  4164. xvldrepl.d U4, B0, 0x00
  4165. /* line 1 */
  4166. xvfmul.d D0, U0, U4
  4167. xvfmul.d D1, U1, U4
  4168. xvfmul.d D2, U2, U4
  4169. xvfmul.d D3, U3, U4
  4170. /* Add stride for A0 and B0 */
  4171. addi.d A0, A0, 0x80
  4172. addi.d B0, B0, 0x08
  4173. /* Reduce L */
  4174. addi.d L, L, -1
  4175. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  4176. /* if (TL < 1) goto L_N1_L7 */
  4177. beq ZERO,TL, .L_N1_L7
  4178. .L_N1_TL1: /* TL-- */
  4179. /***8-1***/
  4180. /* Load 16 * 64 from A0 */
  4181. xvld U0, A0, 0x00
  4182. xvld U1, A0, 0x20
  4183. xvld U2, A0, 0x40
  4184. xvld U3, A0, 0x60
  4185. xvldrepl.d U4, B0, 0x00
  4186. xvfmadd.d D0, U0, U4, D0
  4187. xvfmadd.d D1, U1, U4, D1
  4188. xvfmadd.d D2, U2, U4, D2
  4189. xvfmadd.d D3, U3, U4, D3
  4190. addi.d A0, A0, 0x80
  4191. addi.d B0, B0, 0x08
  4192. /***8-2***/
  4193. /* Load 16 * 64 from A0 */
  4194. xvld U0, A0, 0x00
  4195. xvld U1, A0, 0x20
  4196. xvld U2, A0, 0x40
  4197. xvld U3, A0, 0x60
  4198. xvldrepl.d U4, B0, 0x00
  4199. xvfmadd.d D0, U0, U4, D0
  4200. xvfmadd.d D1, U1, U4, D1
  4201. xvfmadd.d D2, U2, U4, D2
  4202. xvfmadd.d D3, U3, U4, D3
  4203. addi.d A0, A0, 0x80
  4204. addi.d B0, B0, 0x08
  4205. /***8-3***/
  4206. /* Load 16 * 64 from A0 */
  4207. xvld U0, A0, 0x00
  4208. xvld U1, A0, 0x20
  4209. xvld U2, A0, 0x40
  4210. xvld U3, A0, 0x60
  4211. xvldrepl.d U4, B0, 0x00
  4212. xvfmadd.d D0, U0, U4, D0
  4213. xvfmadd.d D1, U1, U4, D1
  4214. xvfmadd.d D2, U2, U4, D2
  4215. xvfmadd.d D3, U3, U4, D3
  4216. addi.d A0, A0, 0x80
  4217. addi.d B0, B0, 0x08
  4218. /***8-4***/
  4219. /* Load 16 * 64 from A0 */
  4220. xvld U0, A0, 0x00
  4221. xvld U1, A0, 0x20
  4222. xvld U2, A0, 0x40
  4223. xvld U3, A0, 0x60
  4224. xvldrepl.d U4, B0, 0x00
  4225. xvfmadd.d D0, U0, U4, D0
  4226. xvfmadd.d D1, U1, U4, D1
  4227. xvfmadd.d D2, U2, U4, D2
  4228. xvfmadd.d D3, U3, U4, D3
  4229. addi.d A0, A0, 0x80
  4230. addi.d B0, B0, 0x08
  4231. /***8-5***/
  4232. /* Load 16 * 64 from A0 */
  4233. xvld U0, A0, 0x00
  4234. xvld U1, A0, 0x20
  4235. xvld U2, A0, 0x40
  4236. xvld U3, A0, 0x60
  4237. xvldrepl.d U4, B0, 0x00
  4238. xvfmadd.d D0, U0, U4, D0
  4239. xvfmadd.d D1, U1, U4, D1
  4240. xvfmadd.d D2, U2, U4, D2
  4241. xvfmadd.d D3, U3, U4, D3
  4242. addi.d A0, A0, 0x80
  4243. addi.d B0, B0, 0x08
  4244. /***8-6***/
  4245. /* Load 16 * 64 from A0 */
  4246. xvld U0, A0, 0x00
  4247. xvld U1, A0, 0x20
  4248. xvld U2, A0, 0x40
  4249. xvld U3, A0, 0x60
  4250. xvldrepl.d U4, B0, 0x00
  4251. xvfmadd.d D0, U0, U4, D0
  4252. xvfmadd.d D1, U1, U4, D1
  4253. xvfmadd.d D2, U2, U4, D2
  4254. xvfmadd.d D3, U3, U4, D3
  4255. addi.d A0, A0, 0x80
  4256. addi.d B0, B0, 0x08
  4257. /***8-7***/
  4258. /* Load 16 * 64 from A0 */
  4259. xvld U0, A0, 0x00
  4260. xvld U1, A0, 0x20
  4261. xvld U2, A0, 0x40
  4262. xvld U3, A0, 0x60
  4263. xvldrepl.d U4, B0, 0x00
  4264. xvfmadd.d D0, U0, U4, D0
  4265. xvfmadd.d D1, U1, U4, D1
  4266. xvfmadd.d D2, U2, U4, D2
  4267. xvfmadd.d D3, U3, U4, D3
  4268. addi.d A0, A0, 0x80
  4269. addi.d B0, B0, 0x08
  4270. /***8-8***/
  4271. /* Load 16 * 64 from A0 */
  4272. xvld U0, A0, 0x00
  4273. xvld U1, A0, 0x20
  4274. xvld U2, A0, 0x40
  4275. xvld U3, A0, 0x60
  4276. xvldrepl.d U4, B0, 0x00
  4277. xvfmadd.d D0, U0, U4, D0
  4278. xvfmadd.d D1, U1, U4, D1
  4279. xvfmadd.d D2, U2, U4, D2
  4280. xvfmadd.d D3, U3, U4, D3
  4281. addi.d A0, A0, 0x80
  4282. addi.d B0, B0, 0x08
  4283. addi.d TL, TL, -1 /* TL-- */
  4284. blt ZERO,TL, .L_N1_TL1
  4285. .L_N1_L7:
  4286. /* if (!(L & 7)) goto L_N1_L0 */
  4287. andi TL, L, 7
  4288. beq TL, ZERO,.L_N1_L0
  4289. .L_N1_L71:
  4290. /* Load 16 * 64 from A0 */
  4291. xvld U0, A0, 0x00
  4292. xvld U1, A0, 0x20
  4293. xvld U2, A0, 0x40
  4294. xvld U3, A0, 0x60
  4295. xvldrepl.d U4, B0, 0x00
  4296. xvfmadd.d D0, U0, U4, D0
  4297. xvfmadd.d D1, U1, U4, D1
  4298. xvfmadd.d D2, U2, U4, D2
  4299. xvfmadd.d D3, U3, U4, D3
  4300. /* Add stride for A0, B0 */
  4301. addi.d A0, A0, 0x80
  4302. addi.d B0, B0, 0x08
  4303. addi.d TL, TL, -1
  4304. blt ZERO,TL, .L_N1_L71
  4305. .L_N1_L0:
  4306. #if defined(TRMMKERNEL)
  4307. xvfmul.d D0, D0, VALPHA
  4308. xvfmul.d D1, D1, VALPHA
  4309. xvfmul.d D2, D2, VALPHA
  4310. xvfmul.d D3, D3, VALPHA
  4311. #else
  4312. /* Load C0 */
  4313. xvld U0, C0, 0x00
  4314. xvld U1, C0, 0x20
  4315. xvld U2, C0, 0x40
  4316. xvld U3, C0, 0x60
  4317. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  4318. xvfmadd.d D1, D1, VALPHA, U1
  4319. xvfmadd.d D2, D2, VALPHA, U2
  4320. xvfmadd.d D3, D3, VALPHA, U3
  4321. #endif
  4322. /* Store C0 */
  4323. xvst D0, C0, 0x00
  4324. xvst D1, C0, 0x20
  4325. xvst D2, C0, 0x40
  4326. xvst D3, C0, 0x60
  4327. /* Add stride for C */
  4328. addi.d C0, C0, 0x80
  4329. #if defined(TRMMKERNEL)
  4330. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4331. sub.d L, K, OFF
  4332. #ifdef LEFT
  4333. addi.d L, L, -16
  4334. #else
  4335. addi.d L, L, -1
  4336. #endif
  4337. slli.d T0, L, 0x07
  4338. add.d A0, A0, T0
  4339. slli.d T0, L, 0x03
  4340. add.d B0, B0, T0
  4341. #endif
  4342. #ifdef LEFT
  4343. addi.d OFF, OFF, 0x10
  4344. #endif
  4345. #endif // #if defined(TRMMKERNEL)
  4346. addi.d I, I, -1 /* I-- */
  4347. blt ZERO,I, .L_N1_I1
  4348. .L_N1_M8:
  4349. /* We have done M & 16, considering M=8/4/2/1 */
  4350. andi I, M, 15
  4351. beq ZERO,I, .L_N1_M0
  4352. andi I, M, 8
  4353. beq ZERO,I, .L_N1_M4
  4354. #if defined(TRMMKERNEL)
  4355. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4356. move B0, B
  4357. #else
  4358. slli.d T0, OFF, 0x06
  4359. add.d A0, A0, T0
  4360. slli.d T0, OFF, 0x03
  4361. add.d B0, B, T0
  4362. #endif
  4363. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  4364. sub.d L, K, OFF
  4365. #elif defined(LEFT)
  4366. /* number of values in A */
  4367. addi.d L, OFF, 8
  4368. #else
  4369. /* number of values in B */
  4370. addi.d L, OFF, 1
  4371. #endif
  4372. #else // #if !defined(TRMMKERNEL)
  4373. move B0, B
  4374. move L, K /* L = bk */
  4375. #endif
  4376. /* Load 8 * 64 from A0 */
  4377. xvld U0, A0, 0x00
  4378. xvld U1, A0, 0x20
  4379. xvldrepl.d U4, B0, 0x00
  4380. /* line 1 */
  4381. xvfmul.d D0, U0, U4
  4382. xvfmul.d D1, U1, U4
  4383. /* Add stride for A0 and B0 */
  4384. addi.d A0, A0, 0x40
  4385. addi.d B0, B0, 0x08
  4386. /* Reduce L */
  4387. addi.d L, L, -1
  4388. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  4389. /* if (TL < 1) goto L_N1_M8_L7 */
  4390. beq ZERO,TL, .L_N1_M8_L7
  4391. .L_N1_M8_TL1: /* TL-- */
  4392. /***8-1***/
  4393. /* Load 16 * 64 from A0 */
  4394. xvld U0, A0, 0x00
  4395. xvld U1, A0, 0x20
  4396. xvldrepl.d U4, B0, 0x00
  4397. xvfmadd.d D0, U0, U4, D0
  4398. xvfmadd.d D1, U1, U4, D1
  4399. addi.d A0, A0, 0x40
  4400. addi.d B0, B0, 0x08
  4401. /***8-2***/
  4402. xvld U0, A0, 0x00
  4403. xvld U1, A0, 0x20
  4404. xvldrepl.d U4, B0, 0x00
  4405. xvfmadd.d D0, U0, U4, D0
  4406. xvfmadd.d D1, U1, U4, D1
  4407. addi.d A0, A0, 0x40
  4408. addi.d B0, B0, 0x08
  4409. /***8-3***/
  4410. xvld U0, A0, 0x00
  4411. xvld U1, A0, 0x20
  4412. xvldrepl.d U4, B0, 0x00
  4413. xvfmadd.d D0, U0, U4, D0
  4414. xvfmadd.d D1, U1, U4, D1
  4415. addi.d A0, A0, 0x40
  4416. addi.d B0, B0, 0x08
  4417. /***8-4***/
  4418. xvld U0, A0, 0x00
  4419. xvld U1, A0, 0x20
  4420. xvldrepl.d U4, B0, 0x00
  4421. xvfmadd.d D0, U0, U4, D0
  4422. xvfmadd.d D1, U1, U4, D1
  4423. addi.d A0, A0, 0x40
  4424. addi.d B0, B0, 0x08
  4425. /***8-5***/
  4426. xvld U0, A0, 0x00
  4427. xvld U1, A0, 0x20
  4428. xvldrepl.d U4, B0, 0x00
  4429. xvfmadd.d D0, U0, U4, D0
  4430. xvfmadd.d D1, U1, U4, D1
  4431. addi.d A0, A0, 0x40
  4432. addi.d B0, B0, 0x08
  4433. /***8-6***/
  4434. xvld U0, A0, 0x00
  4435. xvld U1, A0, 0x20
  4436. xvldrepl.d U4, B0, 0x00
  4437. xvfmadd.d D0, U0, U4, D0
  4438. xvfmadd.d D1, U1, U4, D1
  4439. addi.d A0, A0, 0x40
  4440. addi.d B0, B0, 0x08
  4441. /***8-7***/
  4442. xvld U0, A0, 0x00
  4443. xvld U1, A0, 0x20
  4444. xvldrepl.d U4, B0, 0x00
  4445. xvfmadd.d D0, U0, U4, D0
  4446. xvfmadd.d D1, U1, U4, D1
  4447. addi.d A0, A0, 0x40
  4448. addi.d B0, B0, 0x08
  4449. /***8-8***/
  4450. xvld U0, A0, 0x00
  4451. xvld U1, A0, 0x20
  4452. xvldrepl.d U4, B0, 0x00
  4453. xvfmadd.d D0, U0, U4, D0
  4454. xvfmadd.d D1, U1, U4, D1
  4455. addi.d A0, A0, 0x40
  4456. addi.d B0, B0, 0x08
  4457. addi.d TL, TL, -1 /* TL-- */
  4458. blt ZERO,TL, .L_N1_M8_TL1
  4459. .L_N1_M8_L7:
  4460. /* if (!(L & 7)) goto L_N1_M8_L0 */
  4461. andi TL, L, 7
  4462. beq TL, ZERO,.L_N1_M8_L0
  4463. .L_N1_M8_L71:
  4464. xvld U0, A0, 0x00
  4465. xvld U1, A0, 0x20
  4466. xvldrepl.d U4, B0, 0x00
  4467. xvfmadd.d D0, U0, U4, D0
  4468. xvfmadd.d D1, U1, U4, D1
  4469. /* Add stride for A0, B0 */
  4470. addi.d A0, A0, 0x40
  4471. addi.d B0, B0, 0x08
  4472. addi.d TL, TL, -1
  4473. blt ZERO,TL, .L_N1_M8_L71
  4474. .L_N1_M8_L0:
  4475. #if defined(TRMMKERNEL)
  4476. xvfmul.d D0, D0, VALPHA
  4477. xvfmul.d D1, D1, VALPHA
  4478. #else
  4479. /* Load C0 */
  4480. xvld U0, C0, 0x00
  4481. xvld U1, C0, 0x20
  4482. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  4483. xvfmadd.d D1, D1, VALPHA, U1
  4484. #endif
  4485. /* Store C0 */
  4486. xvst D0, C0, 0x00
  4487. xvst D1, C0, 0x20
  4488. /* Add stride for C */
  4489. addi.d C0, C0, 0x40
  4490. #if defined(TRMMKERNEL)
  4491. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4492. sub.d L, K, OFF
  4493. #ifdef LEFT
  4494. addi.d L, L, -8
  4495. #else
  4496. addi.d L, L, -1
  4497. #endif
  4498. slli.d T0, L, 0x06
  4499. add.d A0, A0, T0
  4500. slli.d T0, L, 0x03
  4501. add.d B0, B0, T0
  4502. #endif
  4503. #ifdef LEFT
  4504. addi.d OFF, OFF, 0x08
  4505. #endif
  4506. #endif // #if defined(TRMMKERNEL)
  4507. /********LOOP (if(N & 2) && (M & 8) ) End************/
  4508. .L_N1_M4:
  4509. andi I, M, 4
  4510. beq ZERO,I, .L_N1_M2
  4511. #if defined(TRMMKERNEL)
  4512. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4513. move B0, B
  4514. #else
  4515. slli.d T0, OFF, 0x05
  4516. add.d A0, A0, T0
  4517. slli.d T0, OFF, 0x03
  4518. add.d B0, B, T0
  4519. #endif
  4520. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  4521. sub.d L, K, OFF
  4522. #elif defined(LEFT)
  4523. /* number of values in A */
  4524. addi.d L, OFF, 4
  4525. #else
  4526. /* number of values in B */
  4527. addi.d L, OFF, 1
  4528. #endif
  4529. #else // #if !defined(TRMMKERNEL)
  4530. move B0, B
  4531. move L, K /* L = bk */
  4532. #endif
  4533. /* Load 4 * 64 from A0 */
  4534. xvld U0, A0, 0x00
  4535. xvldrepl.d U4, B0, 0x00
  4536. /* line 1 */
  4537. xvfmul.d D0, U0, U4
  4538. /* Add stride for A0 and B0 */
  4539. addi.d A0, A0, 0x20
  4540. addi.d B0, B0, 0x08
  4541. /* Reduce L */
  4542. addi.d L, L, -1
  4543. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  4544. /* if (TL < 1) goto L_N1_M4_L7 */
  4545. beq ZERO,TL, .L_N1_M4_L7
  4546. .L_N1_M4_TL1: /* TL-- */
  4547. /***8-1***/
  4548. xvld U0, A0, 0x00
  4549. xvldrepl.d U4, B0, 0x00
  4550. xvfmadd.d D0, U0, U4, D0
  4551. addi.d A0, A0, 0x20
  4552. addi.d B0, B0, 0x08
  4553. /***8-2***/
  4554. xvld U0, A0, 0x00
  4555. xvldrepl.d U4, B0, 0x00
  4556. xvfmadd.d D0, U0, U4, D0
  4557. addi.d A0, A0, 0x20
  4558. addi.d B0, B0, 0x08
  4559. /***8-3***/
  4560. xvld U0, A0, 0x00
  4561. xvldrepl.d U4, B0, 0x00
  4562. xvfmadd.d D0, U0, U4, D0
  4563. addi.d A0, A0, 0x20
  4564. addi.d B0, B0, 0x08
  4565. /***8-4***/
  4566. xvld U0, A0, 0x00
  4567. xvldrepl.d U4, B0, 0x00
  4568. xvfmadd.d D0, U0, U4, D0
  4569. addi.d A0, A0, 0x20
  4570. addi.d B0, B0, 0x08
  4571. /***8-5***/
  4572. xvld U0, A0, 0x00
  4573. xvldrepl.d U4, B0, 0x00
  4574. xvfmadd.d D0, U0, U4, D0
  4575. addi.d A0, A0, 0x20
  4576. addi.d B0, B0, 0x08
  4577. /***8-6***/
  4578. xvld U0, A0, 0x00
  4579. xvldrepl.d U4, B0, 0x00
  4580. xvfmadd.d D0, U0, U4, D0
  4581. addi.d A0, A0, 0x20
  4582. addi.d B0, B0, 0x08
  4583. /***8-7***/
  4584. xvld U0, A0, 0x00
  4585. xvldrepl.d U4, B0, 0x00
  4586. xvfmadd.d D0, U0, U4, D0
  4587. addi.d A0, A0, 0x20
  4588. addi.d B0, B0, 0x08
  4589. /***8-8***/
  4590. xvld U0, A0, 0x00
  4591. xvldrepl.d U4, B0, 0x00
  4592. xvfmadd.d D0, U0, U4, D0
  4593. addi.d A0, A0, 0x20
  4594. addi.d B0, B0, 0x08
  4595. addi.d TL, TL, -1 /* TL-- */
  4596. blt ZERO,TL, .L_N1_M4_TL1
  4597. .L_N1_M4_L7:
  4598. /* if (!(L & 7)) goto L_N1_M4_L0 */
  4599. andi TL, L, 7
  4600. beq TL, ZERO,.L_N1_M4_L0
  4601. .L_N1_M4_L71:
  4602. xvld U0, A0, 0x00
  4603. xvldrepl.d U4, B0, 0x00
  4604. xvfmadd.d D0, U0, U4, D0
  4605. /* Add stride for A0, B0 */
  4606. addi.d A0, A0, 0x20
  4607. addi.d B0, B0, 0x08
  4608. addi.d TL, TL, -1
  4609. blt ZERO,TL, .L_N1_M4_L71
  4610. .L_N1_M4_L0:
  4611. #if defined(TRMMKERNEL)
  4612. xvfmul.d D0, D0, VALPHA
  4613. #else
  4614. /* Load C0 */
  4615. xvld U0, C0, 0x00
  4616. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  4617. #endif
  4618. /* Store C0 */
  4619. xvst D0, C0, 0x00
  4620. /* Add stride for C */
  4621. addi.d C0, C0, 0x20
  4622. #if defined(TRMMKERNEL)
  4623. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4624. sub.d L, K, OFF
  4625. #ifdef LEFT
  4626. addi.d L, L, -4
  4627. #else
  4628. addi.d L, L, -1
  4629. #endif
  4630. slli.d T0, L, 0x05
  4631. add.d A0, A0, T0
  4632. slli.d T0, L, 0x03
  4633. add.d B0, B0, T0
  4634. #endif
  4635. #ifdef LEFT
  4636. addi.d OFF, OFF, 0x04
  4637. #endif
  4638. #endif // #if defined(TRMMKERNEL)
  4639. /********LOOP (if(N & 2 ) && (M & 4) ) End************/
  4640. .L_N1_M2:
  4641. andi I, M, 2
  4642. beq ZERO,I, .L_N1_M1
  4643. #if defined(TRMMKERNEL)
  4644. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4645. move B0, B
  4646. #else
  4647. slli.d T0, OFF, 0x04
  4648. add.d A0, A0, T0
  4649. slli.d T0, OFF, 0x03
  4650. add.d B0, B, T0
  4651. #endif
  4652. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  4653. sub.d L, K, OFF
  4654. #elif defined(LEFT)
  4655. /* number of values in A */
  4656. addi.d L, OFF, 2
  4657. #else
  4658. /* number of values in B */
  4659. addi.d L, OFF, 1
  4660. #endif
  4661. #else // #if !defined(TRMMKERNEL)
  4662. move B0, B
  4663. move L, K /* L = bk */
  4664. #endif
  4665. /* Load 2 * 64 from A0 */
  4666. xvld U0, A0, 0x00
  4667. xvldrepl.d U4, B0, 0x00
  4668. /* line 1 */
  4669. xvfmul.d D0, U0, U4
  4670. /* Add stride for A0 and B0 */
  4671. addi.d A0, A0, 0x10
  4672. addi.d B0, B0, 0x08
  4673. /* Reduce L */
  4674. addi.d L, L, -1
  4675. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  4676. /* if (TL < 1) goto L_N1_M2_L7 */
  4677. beq ZERO,TL, .L_N1_M2_L7
  4678. .L_N1_M2_TL1: /* TL-- */
  4679. /***8-1***/
  4680. /* Load 2 * 64 from A0 */
  4681. xvld U0, A0, 0x00
  4682. xvldrepl.d U4, B0, 0x00
  4683. xvfmadd.d D0, U0, U4, D0
  4684. addi.d A0, A0, 0x10
  4685. addi.d B0, B0, 0x08
  4686. /***8-2***/
  4687. xvld U0, A0, 0x00
  4688. xvldrepl.d U4, B0, 0x00
  4689. xvfmadd.d D0, U0, U4, D0
  4690. addi.d A0, A0, 0x10
  4691. addi.d B0, B0, 0x08
  4692. /***8-3***/
  4693. xvld U0, A0, 0x00
  4694. xvldrepl.d U4, B0, 0x00
  4695. xvfmadd.d D0, U0, U4, D0
  4696. addi.d A0, A0, 0x10
  4697. addi.d B0, B0, 0x08
  4698. /***8-4***/
  4699. xvld U0, A0, 0x00
  4700. xvldrepl.d U4, B0, 0x00
  4701. xvfmadd.d D0, U0, U4, D0
  4702. addi.d A0, A0, 0x10
  4703. addi.d B0, B0, 0x08
  4704. /***8-5***/
  4705. xvld U0, A0, 0x00
  4706. xvldrepl.d U4, B0, 0x00
  4707. xvfmadd.d D0, U0, U4, D0
  4708. addi.d A0, A0, 0x10
  4709. addi.d B0, B0, 0x08
  4710. /***8-6***/
  4711. xvld U0, A0, 0x00
  4712. xvldrepl.d U4, B0, 0x00
  4713. xvfmadd.d D0, U0, U4, D0
  4714. addi.d A0, A0, 0x10
  4715. addi.d B0, B0, 0x08
  4716. /***8-7***/
  4717. xvld U0, A0, 0x00
  4718. xvldrepl.d U4, B0, 0x00
  4719. xvfmadd.d D0, U0, U4, D0
  4720. addi.d A0, A0, 0x10
  4721. addi.d B0, B0, 0x08
  4722. /***8-8***/
  4723. xvld U0, A0, 0x00
  4724. xvldrepl.d U4, B0, 0x00
  4725. xvfmadd.d D0, U0, U4, D0
  4726. addi.d A0, A0, 0x10
  4727. addi.d B0, B0, 0x08
  4728. addi.d TL, TL, -1 /* TL-- */
  4729. blt ZERO,TL, .L_N1_M2_TL1
  4730. .L_N1_M2_L7:
  4731. /* if (!(L & 7)) goto L_N1_M2_L0 */
  4732. andi TL, L, 7
  4733. beq TL, ZERO,.L_N1_M2_L0
  4734. .L_N1_M2_L71:
  4735. xvld U0, A0, 0x00
  4736. xvldrepl.d U4, B0, 0x00
  4737. xvfmadd.d D0, U0, U4, D0
  4738. /* Add stride for A0, B0 */
  4739. addi.d A0, A0, 0x10
  4740. addi.d B0, B0, 0x08
  4741. addi.d TL, TL, -1
  4742. blt ZERO,TL, .L_N1_M2_L71
  4743. .L_N1_M2_L0:
  4744. #if defined(TRMMKERNEL)
  4745. xvfmul.d D0, D0, VALPHA
  4746. #else
  4747. /* Load C0 */
  4748. xvld U0, C0, 0x00
  4749. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  4750. #endif
  4751. xvstelm.d D0, C0, 0x00, 0x00
  4752. xvstelm.d D0, C0, 0x08, 0x01
  4753. /* Add stride for C */
  4754. addi.d C0, C0, 0x10
  4755. #if defined(TRMMKERNEL)
  4756. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4757. sub.d L, K, OFF
  4758. #ifdef LEFT
  4759. addi.d L, L, -2
  4760. #else
  4761. addi.d L, L, -1
  4762. #endif
  4763. slli.d T0, L, 0x04
  4764. add.d A0, A0, T0
  4765. slli.d T0, L, 0x03
  4766. add.d B0, B0, T0
  4767. #endif
  4768. #ifdef LEFT
  4769. addi.d OFF, OFF, 0x02
  4770. #endif
  4771. #endif // #if defined(TRMMKERNEL)
  4772. /********LOOP (if(N & 2 ) && (M & 2) ) End************/
  4773. .L_N1_M1:
  4774. andi I, M, 1
  4775. beq ZERO,I, .L_N1_M0
  4776. #if defined(TRMMKERNEL)
  4777. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4778. move B0, B
  4779. #else
  4780. slli.d T0, OFF, 0x03
  4781. add.d A0, A0, T0
  4782. add.d B0, B, T0
  4783. #endif
  4784. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  4785. sub.d L, K, OFF
  4786. #elif defined(LEFT)
  4787. /* number of values in A */
  4788. addi.d L, OFF, 1
  4789. #else
  4790. /* number of values in B */
  4791. addi.d L, OFF, 1
  4792. #endif
  4793. #else // #if !defined(TRMMKERNEL)
  4794. move B0, B
  4795. move L, K /* L = bk */
  4796. #endif
  4797. /* Load 1 * 64 from A0 */
  4798. xvld U0, A0, 0x00
  4799. xvldrepl.d U4, B0, 0x00
  4800. /* line 1 */
  4801. xvfmul.d D0, U0, U4
  4802. /* Add stride for A0 and B0 */
  4803. addi.d A0, A0, 0x08
  4804. addi.d B0, B0, 0x08
  4805. /* Reduce L */
  4806. addi.d L, L, -1
  4807. srai.d TL, L, 3 /* TL = (L-1) >> 3 */
  4808. /* if (TL < 1) goto L_N1_M1_L7 */
  4809. beq ZERO,TL, .L_N1_M1_L7
  4810. .L_N1_M1_TL1: /* TL-- */
  4811. /***8-1***/
  4812. /* Load 1 * 64 from A0 */
  4813. xvld U0, A0, 0x00
  4814. xvldrepl.d U4, B0, 0x00
  4815. xvfmadd.d D0, U0, U4, D0
  4816. addi.d A0, A0, 0x08
  4817. addi.d B0, B0, 0x08
  4818. /***8-2***/
  4819. xvld U0, A0, 0x00
  4820. xvldrepl.d U4, B0, 0x00
  4821. xvfmadd.d D0, U0, U4, D0
  4822. addi.d A0, A0, 0x08
  4823. addi.d B0, B0, 0x08
  4824. /***8-3***/
  4825. xvld U0, A0, 0x00
  4826. xvldrepl.d U4, B0, 0x00
  4827. xvfmadd.d D0, U0, U4, D0
  4828. addi.d A0, A0, 0x08
  4829. addi.d B0, B0, 0x08
  4830. /***8-4***/
  4831. xvld U0, A0, 0x00
  4832. xvldrepl.d U4, B0, 0x00
  4833. xvfmadd.d D0, U0, U4, D0
  4834. addi.d A0, A0, 0x08
  4835. addi.d B0, B0, 0x08
  4836. /***8-5***/
  4837. xvld U0, A0, 0x00
  4838. xvldrepl.d U4, B0, 0x00
  4839. xvfmadd.d D0, U0, U4, D0
  4840. addi.d A0, A0, 0x08
  4841. addi.d B0, B0, 0x08
  4842. /***8-6***/
  4843. xvld U0, A0, 0x00
  4844. xvldrepl.d U4, B0, 0x00
  4845. xvfmadd.d D0, U0, U4, D0
  4846. addi.d A0, A0, 0x08
  4847. addi.d B0, B0, 0x08
  4848. /***8-7***/
  4849. xvld U0, A0, 0x00
  4850. xvldrepl.d U4, B0, 0x00
  4851. xvfmadd.d D0, U0, U4, D0
  4852. addi.d A0, A0, 0x08
  4853. addi.d B0, B0, 0x08
  4854. /***8-8***/
  4855. xvld U0, A0, 0x00
  4856. xvldrepl.d U4, B0, 0x00
  4857. xvfmadd.d D0, U0, U4, D0
  4858. addi.d A0, A0, 0x08
  4859. addi.d B0, B0, 0x08
  4860. addi.d TL, TL, -1 /* TL-- */
  4861. blt ZERO,TL, .L_N1_M1_TL1
  4862. .L_N1_M1_L7:
  4863. /* if (!(L & 7)) goto L_N1_M1_L0 */
  4864. andi TL, L, 7
  4865. beq TL, ZERO,.L_N1_M1_L0
  4866. .L_N1_M1_L71:
  4867. xvld U0, A0, 0x00
  4868. xvldrepl.d U4, B0, 0x00
  4869. xvfmadd.d D0, U0, U4, D0
  4870. /* Add stride for A0, B0 */
  4871. addi.d A0, A0, 0x08
  4872. addi.d B0, B0, 0x08
  4873. addi.d TL, TL, -1
  4874. blt ZERO,TL, .L_N1_M1_L71
  4875. .L_N1_M1_L0:
  4876. #if defined(TRMMKERNEL)
  4877. xvfmul.d D0, D0, VALPHA
  4878. #else
  4879. /* Load C0 */
  4880. xvld U0, C0, 0x00
  4881. xvfmadd.d D0, D0, VALPHA, U0 /* D0 = U0 + (D0 * VALPHA) */
  4882. #endif
  4883. xvstelm.d D0, C0, 0x00, 0x00
  4884. /* Add stride for C */
  4885. addi.d C0, C0, 0x08
  4886. #if defined(TRMMKERNEL)
  4887. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4888. sub.d L, K, OFF
  4889. #ifdef LEFT
  4890. addi.d L, L, -1
  4891. #else
  4892. addi.d L, L, -1
  4893. #endif
  4894. slli.d T0, L, 0x03
  4895. add.d A0, A0, T0
  4896. add.d B0, B0, T0
  4897. #endif
  4898. #ifdef LEFT
  4899. addi.d OFF, OFF, 0x01
  4900. #endif
  4901. #endif // #if defined(TRMMKERNEL)
  4902. /********LOOP (if(N & 2 ) && (M & 1) ) End************/
  4903. .L_N1_M0:
  4904. /************************* Condition 4 if((N & 1) && (M >> 4)) End !!! *************************
  4905. * dgemm_core_16x1 */
  4906. .L_N0:
  4907. /* Restore $r23~$31 */
  4908. LDARG $r23, $sp, 0
  4909. LDARG $r24, $sp, 8
  4910. LDARG $r25, $sp, 16
  4911. LDARG $r26, $sp, 24
  4912. LDARG $r27, $sp, 32
  4913. LDARG $r28, $sp, 40
  4914. LDARG $r29, $sp, 48
  4915. LDARG $r30, $sp, 56
  4916. LDARG $r31, $sp, 64
  4917. fld.d $f23, $sp, 72
  4918. fld.d $f24, $sp, 80
  4919. fld.d $f25, $sp, 96
  4920. fld.d $f26, $sp, 104
  4921. fld.d $f27, $sp, 112
  4922. fld.d $f28, $sp, 120
  4923. fld.d $f29, $sp, 128
  4924. fld.d $f30, $sp, 136
  4925. fld.d $f31, $sp, 144
  4926. addi.d $sp, $sp, 160
  4927. /* Back home */
  4928. jirl $r0, $r1, 0x0
  4929. EPILOGUE