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.

sgemm_macros_power9.S 139 kB

6 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575
  1. /***************************************************************************
  2. Copyright (c) 2013-2019, 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 unit_size 4
  28. #define DISP64(ind,disp) (ind*unit_size*64+disp)
  29. #define DISP32(ind,disp) (ind*unit_size*32+disp)
  30. #define DISP16(ind,disp) (ind*unit_size*16+disp)
  31. #define DISP8(ind,disp) (ind*unit_size*8+disp)
  32. #define DISP4(ind,disp) (ind*unit_size*4+disp)
  33. #define DISP2(ind,disp) (ind*unit_size*2+disp)
  34. #define DISP1(ind,disp) (ind*unit_size+disp)
  35. /**********************************************************************************************
  36. * Macros for N=8 and M=16
  37. **********************************************************************************************/
  38. .macro KERNEL8x16_L1_L4 Index,IsLast
  39. KERNEL8x16_L1_L4_I AO,BO, 0,0, \Index,\IsLast,0
  40. .endm
  41. .macro KERNEL8x16_I1_L4 OffsetA,OffsetB, Index,IsLast
  42. KERNEL8x16_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,0
  43. .endm
  44. .macro KERNEL8x16_I1_L4_2 OffsetA,OffsetB, Index,IsLast
  45. KERNEL8x16_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,0
  46. .endm
  47. .macro KERNEL8x16_I1_L4_3 OffsetA,OffsetB, Index,IsLast
  48. KERNEL8x16_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,1
  49. .endm
  50. .macro KERNEL8x16_I2_L4_2 AREG,BREG,OffsetA,OffsetB, Index,IsLast
  51. KERNEL8x16_L1_L4_I \AREG,\BREG, \OffsetA,\OffsetB,\Index,\IsLast,0
  52. .endm
  53. .macro KERNEL8x16_I2_L4_3 AREG,BREG,OffsetA,OffsetB, Index,IsLast
  54. KERNEL8x16_L1_L4_I \AREG,\BREG, \OffsetA,\OffsetB,\Index,\IsLast,1
  55. .endm
  56. .macro Zero8X16
  57. xxlxor vs32, vs32, vs32
  58. xxlxor vs33, vs33, vs33
  59. xxlxor vs34, vs34, vs34
  60. xxlxor vs35, vs35, vs35
  61. xxlxor vs36, vs36, vs36
  62. xxlxor vs37, vs37, vs37
  63. xxlxor vs38, vs38, vs38
  64. xxlxor vs39, vs39, vs39
  65. xxlxor vs40, vs40, vs40
  66. xxlxor vs41, vs41, vs41
  67. xxlxor vs42, vs42, vs42
  68. xxlxor vs43, vs43, vs43
  69. xxlxor vs44, vs44, vs44
  70. xxlxor vs45, vs45, vs45
  71. xxlxor vs46, vs46, vs46
  72. xxlxor vs47, vs47, vs47
  73. xxlxor vs48, vs48, vs48
  74. xxlxor vs49, vs49, vs49
  75. xxlxor vs50, vs50, vs50
  76. xxlxor vs51, vs51, vs51
  77. xxlxor vs52, vs52, vs52
  78. xxlxor vs53, vs53, vs53
  79. xxlxor vs54, vs54, vs54
  80. xxlxor vs55, vs55, vs55
  81. xxlxor vs56, vs56, vs56
  82. xxlxor vs57, vs57, vs57
  83. xxlxor vs58, vs58, vs58
  84. xxlxor vs59, vs59, vs59
  85. xxlxor vs60, vs60, vs60
  86. xxlxor vs61, vs61, vs61
  87. xxlxor vs62, vs62, vs62
  88. xxlxor vs63, vs63, vs63
  89. .endm
  90. .macro LOAD8x16 OffsetA,OffsetB
  91. lxv vs24, (\OffsetB+0)(BO)
  92. lxv vs28, (\OffsetB+16)(BO)
  93. xxperm vs26, vs24, permute_mask
  94. xxperm vs30, vs28, permute_mask
  95. lxv vs0, (\OffsetA+0)(AO)
  96. lxv vs1, (\OffsetA+16)(AO)
  97. xxpermdi vs25, vs24, vs24,2
  98. xxpermdi vs29, vs28, vs28,2
  99. lxv vs2, (\OffsetA+32)(AO)
  100. lxv vs3, (\OffsetA+48)(AO)
  101. xxpermdi vs27, vs26, vs26,2
  102. xxpermdi vs31, vs30, vs30,2
  103. .endm
  104. .macro END8x16_NORMAL
  105. END8x16 0, AO, BO, 64,32
  106. .endm
  107. .macro END8x16_WITHOUT_ADD
  108. END8x16 0, AO,BO,0,0
  109. .endm
  110. .macro END8x16 First, AREG, BREG, OffsetA, OffsetB
  111. .if \OffsetB != 0
  112. addi \BREG, \BREG, \OffsetB
  113. .endif
  114. .if \OffsetA != 0
  115. addi \AREG, \AREG, \OffsetA
  116. .endif
  117. .if \First==1
  118. xvmulsp vs32, vs0,vs24
  119. xvmulsp vs33, vs1,vs24
  120. xvmulsp vs34, vs2,vs24
  121. xvmulsp vs35, vs3,vs24
  122. xvmulsp vs36, vs0,vs25
  123. xvmulsp vs37, vs1,vs25
  124. xvmulsp vs38, vs2,vs25
  125. xvmulsp vs39, vs3,vs25
  126. xvmulsp vs40, vs0,vs26
  127. xvmulsp vs41, vs1,vs26
  128. xvmulsp vs42, vs2,vs26
  129. xvmulsp vs43, vs3,vs26
  130. xvmulsp vs44, vs0,vs27
  131. xvmulsp vs45, vs1,vs27
  132. xvmulsp vs46, vs2,vs27
  133. xvmulsp vs47, vs3,vs27
  134. xvmulsp vs48, vs0,vs28
  135. xvmulsp vs49, vs1,vs28
  136. xvmulsp vs50, vs2,vs28
  137. xvmulsp vs51, vs3,vs28
  138. xvmulsp vs52, vs0,vs29
  139. xvmulsp vs53, vs1,vs29
  140. xvmulsp vs54, vs2,vs29
  141. xvmulsp vs55, vs3,vs29
  142. xvmulsp vs56, vs0,vs30
  143. xvmulsp vs57, vs1,vs30
  144. xvmulsp vs58, vs2,vs30
  145. xvmulsp vs59, vs3,vs30
  146. xvmulsp vs60, vs0,vs31
  147. xvmulsp vs61, vs1,vs31
  148. xvmulsp vs62, vs2,vs31
  149. xvmulsp vs63, vs3,vs31
  150. .else
  151. xvmaddasp vs32, vs0,vs24
  152. xvmaddasp vs33, vs1,vs24
  153. xvmaddasp vs34, vs2,vs24
  154. xvmaddasp vs35, vs3,vs24
  155. xvmaddasp vs36, vs0,vs25
  156. xvmaddasp vs37, vs1,vs25
  157. xvmaddasp vs38, vs2,vs25
  158. xvmaddasp vs39, vs3,vs25
  159. xvmaddasp vs40, vs0,vs26
  160. xvmaddasp vs41, vs1,vs26
  161. xvmaddasp vs42, vs2,vs26
  162. xvmaddasp vs43, vs3,vs26
  163. xvmaddasp vs44, vs0,vs27
  164. xvmaddasp vs45, vs1,vs27
  165. xvmaddasp vs46, vs2,vs27
  166. xvmaddasp vs47, vs3,vs27
  167. xvmaddasp vs48, vs0,vs28
  168. xvmaddasp vs49, vs1,vs28
  169. xvmaddasp vs50, vs2,vs28
  170. xvmaddasp vs51, vs3,vs28
  171. xvmaddasp vs52, vs0,vs29
  172. xvmaddasp vs53, vs1,vs29
  173. xvmaddasp vs54, vs2,vs29
  174. xvmaddasp vs55, vs3,vs29
  175. xvmaddasp vs56, vs0,vs30
  176. xvmaddasp vs57, vs1,vs30
  177. xvmaddasp vs58, vs2,vs30
  178. xvmaddasp vs59, vs3,vs30
  179. xvmaddasp vs60, vs0,vs31
  180. xvmaddasp vs61, vs1,vs31
  181. xvmaddasp vs62, vs2,vs31
  182. xvmaddasp vs63, vs3,vs31
  183. .endif
  184. .endm
  185. .macro KERNEL8x16_L1_L4_I AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  186. KERNEL8x16_2 \AREG,\BREG, \OffsetA,\OffsetB, (\Index*2),0 ,0
  187. KERNEL8x16_2 \AREG,\BREG,\OffsetA,\OffsetB, (\Index*2+1),\IsLast ,\Complete
  188. .endm
  189. .macro KERNEL8x16 First
  190. LOAD8x16 0,0
  191. END8x16 \First, AO, BO, 64,32
  192. .endm
  193. .macro LOAD8x16_2
  194. LOAD8x16_2O AO,BO, 0,0
  195. .endm
  196. .macro LOAD8x16_2O AREG,BREG, OffsetA,OffsetB
  197. lxv vs8, (\OffsetB)(\BREG)
  198. lxv vs12, (16+\OffsetB)(\BREG)
  199. lxv vs24, (32+\OffsetB)(\BREG)
  200. lxv vs28, (32+16+\OffsetB)(\BREG)
  201. lxv vs4, (0+\OffsetA)(\AREG)
  202. lxv vs5, (16+\OffsetA)(\AREG)
  203. xxperm vs10, vs8, permute_mask
  204. xxperm vs14, vs12, permute_mask
  205. lxv vs6, (32+\OffsetA)(\AREG)
  206. lxv vs7, (48+\OffsetA)(\AREG)
  207. xxpermdi vs9, vs8, vs8,2
  208. xxpermdi vs13, vs12, vs12,2
  209. lxv vs0, (64+\OffsetA)(\AREG)
  210. lxv vs1, (64+16+\OffsetA)(\AREG)
  211. xxpermdi vs11, vs10, vs10,2
  212. xxpermdi vs15, vs14, vs14,2
  213. lxv vs2, (64+32+\OffsetA)(\AREG)
  214. lxv vs3, (64+48+\OffsetA)(\AREG)
  215. xxperm vs26, vs24, permute_mask
  216. xxperm vs30, vs28, permute_mask
  217. xxpermdi vs25, vs24, vs24,2
  218. xxpermdi vs29, vs28, vs28,2
  219. xxpermdi vs27, vs26, vs26,2
  220. xxpermdi vs31, vs30, vs30,2
  221. .endm
  222. .macro END8x16_2
  223. /*for load2 offset will be 128 and 64*/
  224. KERNEL8x16_2 AO,BO, 128,64,0 ,1,1
  225. .endm
  226. .macro KERNEL8x16_E2 OffsetA,OffsetB, Index,IsLast
  227. KERNEL8x16_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  228. .endm
  229. .macro KERNEL8x16_L2 OffsetA,OffsetB, Index,IsLast
  230. KERNEL8x16_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  231. .endm
  232. .macro KERNEL8x16_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  233. xvmaddasp vs32, vs4,vs8
  234. xvmaddasp vs33, vs5,vs8
  235. xvmaddasp vs48, vs4,vs12
  236. xvmaddasp vs49, vs5,vs12
  237. xvmaddasp vs40, vs4,vs10
  238. xvmaddasp vs41, vs5,vs10
  239. xvmaddasp vs56, vs4,vs14
  240. xvmaddasp vs57, vs5,vs14
  241. xvmaddasp vs36, vs4,vs9
  242. xvmaddasp vs37, vs5,vs9
  243. xvmaddasp vs52, vs4,vs13
  244. xvmaddasp vs53, vs5,vs13
  245. xvmaddasp vs44, vs4,vs11
  246. xvmaddasp vs45, vs5,vs11
  247. xvmaddasp vs60, vs4,vs15
  248. xvmaddasp vs61, vs5,vs15
  249. .if \Complete==0
  250. lxv vs4, DISP32(\Index,0+\OffsetA)(\AREG)
  251. lxv vs5, DISP32(\Index,16+\OffsetA)(\AREG)
  252. .endif
  253. xvmaddasp vs34, vs6,vs8
  254. xvmaddasp vs35, vs7,vs8
  255. xvmaddasp vs50, vs6,vs12
  256. xvmaddasp vs51, vs7,vs12
  257. .if \Complete==0
  258. lxv vs8, DISP16(\Index,\OffsetB)(\BREG)
  259. lxv vs12, DISP16(\Index,16+\OffsetB)(\BREG)
  260. .endif
  261. xvmaddasp vs42, vs6,vs10
  262. xvmaddasp vs43, vs7,vs10
  263. xvmaddasp vs58, vs6,vs14
  264. xvmaddasp vs59, vs7,vs14
  265. .if \Complete==0
  266. xxperm vs10, vs8, permute_mask
  267. xxperm vs14, vs12, permute_mask
  268. .endif
  269. xvmaddasp vs38, vs6,vs9
  270. xvmaddasp vs39, vs7,vs9
  271. xvmaddasp vs54, vs6,vs13
  272. xvmaddasp vs55, vs7,vs13
  273. .if \Complete==0
  274. xxpermdi vs9, vs8, vs8,2
  275. xxpermdi vs13, vs12, vs12,2
  276. .endif
  277. xvmaddasp vs46, vs6,vs11
  278. xvmaddasp vs47, vs7,vs11
  279. xvmaddasp vs62, vs6,vs15
  280. xvmaddasp vs63, vs7,vs15
  281. .if \Complete==0
  282. xxpermdi vs11, vs10, vs10,2
  283. xxpermdi vs15, vs14, vs14,2
  284. .endif
  285. .if \Complete==0
  286. lxv vs6, DISP32(\Index,32+\OffsetA)(\AREG)
  287. lxv vs7, DISP32(\Index,48+\OffsetA)(\AREG)
  288. .endif
  289. xvmaddasp vs32, vs0,vs24
  290. xvmaddasp vs33, vs1,vs24
  291. xvmaddasp vs48, vs0,vs28
  292. xvmaddasp vs49, vs1,vs28
  293. xvmaddasp vs40, vs0,vs26
  294. xvmaddasp vs41, vs1,vs26
  295. xvmaddasp vs56, vs0,vs30
  296. xvmaddasp vs57, vs1,vs30
  297. xvmaddasp vs36, vs0,vs25
  298. xvmaddasp vs37, vs1,vs25
  299. xvmaddasp vs52, vs0,vs29
  300. xvmaddasp vs53, vs1,vs29
  301. xvmaddasp vs44, vs0,vs27
  302. xvmaddasp vs45, vs1,vs27
  303. xvmaddasp vs60, vs0,vs31
  304. xvmaddasp vs61, vs1,vs31
  305. .if \Complete==0
  306. lxv vs0, DISP32(\Index,64+\OffsetA)(\AREG)
  307. lxv vs1, DISP32(\Index,64+16+\OffsetA)(\AREG)
  308. .endif
  309. xvmaddasp vs34, vs2,vs24
  310. xvmaddasp vs35, vs3,vs24
  311. xvmaddasp vs50, vs2,vs28
  312. xvmaddasp vs51, vs3,vs28
  313. .if \Complete==0
  314. lxv vs24, DISP16(\Index,32+\OffsetB)(\BREG)
  315. lxv vs28, DISP16(\Index,32+16+\OffsetB)(\BREG)
  316. .endif
  317. xvmaddasp vs42, vs2,vs26
  318. xvmaddasp vs43, vs3,vs26
  319. xvmaddasp vs58, vs2,vs30
  320. xvmaddasp vs59, vs3,vs30
  321. .if \Complete==0
  322. xxperm vs26, vs24, permute_mask
  323. xxperm vs30, vs28, permute_mask
  324. .endif
  325. xvmaddasp vs38, vs2,vs25
  326. xvmaddasp vs39, vs3,vs25
  327. xvmaddasp vs54, vs2,vs29
  328. xvmaddasp vs55, vs3,vs29
  329. .if \Complete==0
  330. xxpermdi vs25, vs24, vs24,2
  331. xxpermdi vs29, vs28, vs28,2
  332. .endif
  333. xvmaddasp vs46, vs2,vs27
  334. xvmaddasp vs47, vs3,vs27
  335. xvmaddasp vs62, vs2,vs31
  336. xvmaddasp vs63, vs3,vs31
  337. .if \Complete==0
  338. xxpermdi vs27, vs26, vs26,2
  339. xxpermdi vs31, vs30, vs30,2
  340. .endif
  341. .if \Complete==0
  342. lxv vs2, DISP32(\Index,64+32+\OffsetA)(\AREG)
  343. lxv vs3, DISP32(\Index,64+48+\OffsetA)(\AREG)
  344. .endif
  345. .if \IsLast==1
  346. .if \Complete==1
  347. addi \BREG, \BREG, DISP16(\Index,\OffsetB)
  348. addi \AREG, \AREG, DISP32(\Index,\OffsetA)
  349. .else
  350. addi \BREG, \BREG, DISP16(\Index,64)
  351. addi \AREG, \AREG, DISP32(\Index,128)
  352. .endif
  353. .endif
  354. .endm
  355. .macro SAVE8x16
  356. slwi T10, LDC , 1
  357. add T1, CO, LDC
  358. add T2, CO, T10
  359. add T3, T1, T10
  360. add T4, T2, T10
  361. add T5, T3, T10
  362. add T6, T4, T10
  363. add T7, T5, T10
  364. /* permute to restore butterfly rank 1 updateto normal promoted one */
  365. /* permute 16 vs8 MEM(CO) vs9 MEM(CO+LDC) vs10 MEM(CO+2*LDC) vs11 MEM(CO+3*LDC) */
  366. /* permute 16 vs12 MEM(16+CO) vs13 MEM(16+CO+LDC) vs14 MEM(16+CO+2*LDC) vs15 MEM(16+CO+3*LDC) */
  367. /* permute 16 vs16 MEM(32+CO) vs17 MEM(32+CO+LDC) vs18 MEM(32+CO+2*LDC) vs19 MEM(32+CO+3*LDC) */
  368. /* permute 16 vs24 MEM(32+CO) vs25 MEM(32+CO+LDC) vs26 MEM(32+CO+2*LDC) vs27 MEM(32+CO+3*LDC) */
  369. xxmrglw vs8, vs32, vs44
  370. xxmrglw vs10, vs36, vs40
  371. xxmrghw vs1, vs32, vs44
  372. xxmrghw vs0, vs36, vs40
  373. xxmrglw vs12, vs33, vs45
  374. xxmrglw vs14, vs37, vs41
  375. xxmrghw vs2, vs37, vs41
  376. xxmrghw vs3, vs33, vs45
  377. #ifndef TRMMKERNEL
  378. lxv vs32, 0(CO)
  379. lxv vs33, 16(CO)
  380. #endif
  381. xxmrglw vs16, vs34, vs46
  382. xxmrglw vs18, vs38, vs42
  383. xxlor vs9, vs8, vs8
  384. xxlor vs11, vs10, vs10
  385. xxmrghw vs4, vs38, vs42
  386. xxmrghw vs5, vs34, vs46
  387. xxlor vs13, vs12, vs12
  388. xxlor vs15, vs14, vs14
  389. xxmrglw vs24, vs35, vs47
  390. xxmrglw vs26, vs39, vs43
  391. xxlor vs17, vs16, vs16
  392. xxlor vs19, vs18, vs18
  393. xxmrghw vs30, vs39, vs43
  394. xxmrghw vs31, vs35, vs47
  395. #ifndef TRMMKERNEL
  396. lxv vs34, 32(CO)
  397. lxv vs35, 48(CO)
  398. #endif
  399. xxperm vs8, vs0, save_permute_1
  400. xxperm vs10, vs1, save_permute_1
  401. #ifndef TRMMKERNEL
  402. lxv vs36, 0(T1)
  403. lxv vs37, 16(T1)
  404. #endif
  405. xxperm vs9, vs0, save_permute_2
  406. xxperm vs11, vs1, save_permute_2
  407. #ifndef TRMMKERNEL
  408. lxv vs38, 32(T1)
  409. lxv vs39, 48(T1)
  410. #endif
  411. xxlor vs25, vs24, vs24
  412. xxlor vs27, vs26, vs26
  413. #ifndef TRMMKERNEL
  414. lxv vs40, 0(T2)
  415. lxv vs41, 16(T2)
  416. #endif
  417. xxperm vs12, vs2, save_permute_1
  418. xxperm vs14, vs3, save_permute_1
  419. #ifndef TRMMKERNEL
  420. lxv vs42, 32(T2)
  421. lxv vs43, 48(T2)
  422. #endif
  423. xxperm vs13, vs2, save_permute_2
  424. xxperm vs15, vs3, save_permute_2
  425. #ifndef TRMMKERNEL
  426. lxv vs44, 0(T3)
  427. lxv vs45, 16(T3)
  428. #endif
  429. xxperm vs16, vs4, save_permute_1
  430. xxperm vs18, vs5, save_permute_1
  431. #ifndef TRMMKERNEL
  432. lxv vs46, 32(T3)
  433. lxv vs47, 48(T3)
  434. #endif
  435. xxperm vs17, vs4, save_permute_2
  436. xxperm vs19, vs5, save_permute_2
  437. #ifdef TRMMKERNEL
  438. xvmulsp vs32, vs8, alpha_r
  439. xvmulsp vs33, vs12, alpha_r
  440. #else
  441. xvmaddasp vs32, vs8, alpha_r
  442. xvmaddasp vs33, vs12, alpha_r
  443. #endif
  444. xxperm vs24, vs30, save_permute_1
  445. xxperm vs26, vs31, save_permute_1
  446. stxv vs32, 0(CO)
  447. stxv vs33, 16(CO)
  448. #ifdef TRMMKERNEL
  449. xvmulsp vs34, vs16, alpha_r
  450. xvmulsp vs35, vs24, alpha_r
  451. #else
  452. xvmaddasp vs34, vs16, alpha_r
  453. xvmaddasp vs35, vs24, alpha_r
  454. #endif
  455. xxperm vs25, vs30, save_permute_2
  456. xxperm vs27, vs31, save_permute_2
  457. stxv vs34, 32(CO)
  458. stxv vs35, 48(CO)
  459. #ifdef TRMMKERNEL
  460. xvmulsp vs36, vs9, alpha_r
  461. xvmulsp vs37, vs13, alpha_r
  462. #else
  463. xvmaddasp vs36, vs9, alpha_r
  464. xvmaddasp vs37, vs13, alpha_r
  465. #endif
  466. stxv vs36, 0(T1)
  467. stxv vs37, 16(T1)
  468. #ifdef TRMMKERNEL
  469. xvmulsp vs38, vs17, alpha_r
  470. xvmulsp vs39, vs25, alpha_r
  471. #else
  472. xvmaddasp vs38, vs17, alpha_r
  473. xvmaddasp vs39, vs25, alpha_r
  474. #endif
  475. stxv vs38, 32(T1)
  476. stxv vs39, 48(T1)
  477. #ifdef TRMMKERNEL
  478. xvmulsp vs40, vs10, alpha_r
  479. xvmulsp vs41, vs14, alpha_r
  480. #else
  481. xvmaddasp vs40, vs10, alpha_r
  482. xvmaddasp vs41, vs14, alpha_r
  483. #endif
  484. stxv vs40, 0(T2)
  485. stxv vs41, 16(T2)
  486. #ifdef TRMMKERNEL
  487. xvmulsp vs42, vs18, alpha_r
  488. xvmulsp vs43, vs26, alpha_r
  489. #else
  490. xvmaddasp vs42, vs18, alpha_r
  491. xvmaddasp vs43, vs26, alpha_r
  492. #endif
  493. stxv vs42, 32(T2)
  494. stxv vs43, 48(T2)
  495. #ifdef TRMMKERNEL
  496. xvmulsp vs44, vs11, alpha_r
  497. xvmulsp vs45, vs15, alpha_r
  498. #else
  499. xvmaddasp vs44, vs11, alpha_r
  500. xvmaddasp vs45, vs15, alpha_r
  501. #endif
  502. stxv vs44, 0(T3)
  503. stxv vs45, 16(T3)
  504. #ifdef TRMMKERNEL
  505. xvmulsp vs46, vs19, alpha_r
  506. xvmulsp vs47, vs27, alpha_r
  507. #else
  508. xvmaddasp vs46, vs19, alpha_r
  509. xvmaddasp vs47, vs27, alpha_r
  510. #endif
  511. stxv vs46, 32(T3)
  512. stxv vs47, 48(T3)
  513. /*****the same with the second 8X8 ****/
  514. #ifndef TRMMKERNEL
  515. lxv vs32, 0(T4)
  516. lxv vs33, 16(T4)
  517. #endif
  518. xxmrglw vs8, vs48, vs60
  519. xxmrglw vs10, vs52, vs56
  520. #ifndef TRMMKERNEL
  521. lxv vs34, 32(T4)
  522. lxv vs35, 48(T4)
  523. #endif
  524. xxmrghw vs1, vs48, vs60
  525. xxmrghw vs0, vs52, vs56
  526. #ifndef TRMMKERNEL
  527. lxv vs36, 0(T5)
  528. lxv vs37, 16(T5)
  529. #endif
  530. xxmrglw vs12, vs49, vs61
  531. xxmrglw vs14, vs53, vs57
  532. #ifndef TRMMKERNEL
  533. lxv vs38,32(T5)
  534. lxv vs39, 48(T5)
  535. #endif
  536. xxmrghw vs2, vs53, vs57
  537. xxmrghw vs3, vs49, vs61
  538. #ifndef TRMMKERNEL
  539. lxv vs40, 0(T6)
  540. lxv vs41, 16(T6)
  541. #endif
  542. xxmrglw vs16, vs50, vs62
  543. xxmrglw vs18, vs54, vs58
  544. #ifndef TRMMKERNEL
  545. lxv vs42, 32(T6)
  546. lxv vs43, 48(T6)
  547. #endif
  548. xxlor vs9, vs8, vs8
  549. xxlor vs11, vs10, vs10
  550. xxmrghw vs4, vs54, vs58
  551. xxmrghw vs5, vs50, vs62
  552. #ifndef TRMMKERNEL
  553. lxv vs44, 0(T7)
  554. lxv vs45, 16(T7)
  555. #endif
  556. xxlor vs13, vs12, vs12
  557. xxlor vs15, vs14, vs14
  558. xxmrglw vs24, vs51, vs63
  559. xxmrglw vs26, vs55, vs59
  560. #ifndef TRMMKERNEL
  561. lxv vs46, 32(T7)
  562. lxv vs47, 48(T7)
  563. #endif
  564. xxlor vs17, vs16, vs16
  565. xxlor vs19, vs18, vs18
  566. xxmrghw vs30, vs55, vs59
  567. xxmrghw vs31, vs51, vs63
  568. xxperm vs8, vs0, save_permute_1
  569. xxperm vs10, vs1, save_permute_1
  570. xxperm vs9, vs0, save_permute_2
  571. xxperm vs11, vs1, save_permute_2
  572. xxlor vs25, vs24, vs24
  573. xxlor vs27, vs26, vs26
  574. xxperm vs12, vs2, save_permute_1
  575. xxperm vs14, vs3, save_permute_1
  576. xxperm vs13, vs2, save_permute_2
  577. xxperm vs15, vs3, save_permute_2
  578. #ifdef TRMMKERNEL
  579. xvmulsp vs32, vs8, alpha_r
  580. xvmulsp vs33, vs12, alpha_r
  581. #else
  582. xvmaddasp vs32, vs8, alpha_r
  583. xvmaddasp vs33, vs12, alpha_r
  584. #endif
  585. xxperm vs16, vs4, save_permute_1
  586. xxperm vs18, vs5, save_permute_1
  587. stxv vs32, 0(T4)
  588. stxv vs33, 16(T4)
  589. xxperm vs17, vs4, save_permute_2
  590. xxperm vs19, vs5, save_permute_2
  591. xxperm vs24, vs30, save_permute_1
  592. xxperm vs26, vs31, save_permute_1
  593. xxperm vs25, vs30, save_permute_2
  594. xxperm vs27, vs31, save_permute_2
  595. #ifdef TRMMKERNEL
  596. xvmulsp vs34, vs16, alpha_r
  597. xvmulsp vs35, vs24, alpha_r
  598. #else
  599. xvmaddasp vs34, vs16, alpha_r
  600. xvmaddasp vs35, vs24, alpha_r
  601. #endif
  602. stxv vs34, 32(T4)
  603. stxv vs35, 48(T4)
  604. #ifdef TRMMKERNEL
  605. xvmulsp vs36, vs9, alpha_r
  606. xvmulsp vs37, vs13, alpha_r
  607. #else
  608. xvmaddasp vs36, vs9, alpha_r
  609. xvmaddasp vs37, vs13, alpha_r
  610. #endif
  611. stxv vs36, 0(T5)
  612. stxv vs37, 16(T5)
  613. #ifdef TRMMKERNEL
  614. xvmulsp vs38, vs17, alpha_r
  615. xvmulsp vs39, vs25, alpha_r
  616. #else
  617. xvmaddasp vs38, vs17, alpha_r
  618. xvmaddasp vs39, vs25, alpha_r
  619. #endif
  620. stxv vs38, 32(T5)
  621. stxv vs39, 48(T5)
  622. #ifdef TRMMKERNEL
  623. xvmulsp vs40, vs10, alpha_r
  624. xvmulsp vs41, vs14, alpha_r
  625. #else
  626. xvmaddasp vs40, vs10, alpha_r
  627. xvmaddasp vs41, vs14, alpha_r
  628. #endif
  629. stxv vs40, 0(T6)
  630. stxv vs41, 16(T6)
  631. #ifdef TRMMKERNEL
  632. xvmulsp vs42, vs18, alpha_r
  633. xvmulsp vs43, vs26, alpha_r
  634. #else
  635. xvmaddasp vs42, vs18, alpha_r
  636. xvmaddasp vs43, vs26, alpha_r
  637. #endif
  638. stxv vs42, 32(T6)
  639. stxv vs43, 48(T6)
  640. #ifdef TRMMKERNEL
  641. xvmulsp vs44, vs11, alpha_r
  642. xvmulsp vs45, vs15, alpha_r
  643. #else
  644. xvmaddasp vs44, vs11, alpha_r
  645. xvmaddasp vs45, vs15, alpha_r
  646. #endif
  647. stxv vs44, 0(T7)
  648. stxv vs45, 16(T7)
  649. #ifdef TRMMKERNEL
  650. xvmulsp vs46, vs19, alpha_r
  651. xvmulsp vs47, vs27, alpha_r
  652. #else
  653. xvmaddasp vs46, vs19, alpha_r
  654. xvmaddasp vs47, vs27, alpha_r
  655. #endif
  656. stxv vs46, 32(T7)
  657. stxv vs47, 48(T7)
  658. addi CO,CO,64
  659. .endm
  660. /**********************************************************************************************
  661. * Macros for N=8 and M=8
  662. **********************************************************************************************/
  663. .macro LOAD8x8_1
  664. LOAD8x8 1
  665. .endm
  666. .macro LOAD8x8_0
  667. LOAD8x8 0
  668. .endm
  669. .macro KERNEL8x8_L1_L4 Index,IsLast
  670. KERNEL8x8_L1_L4_I AO,BO, 0,0, \Index,\IsLast,0
  671. .endm
  672. .macro KERNEL8x8_I1_L4 OffsetA,OffsetB, Index,IsLast
  673. KERNEL8x8_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,0
  674. .endm
  675. .macro KERNEL8x8_I1_L4_2 OffsetA,OffsetB, Index,IsLast
  676. KERNEL8x8_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,0
  677. .endm
  678. .macro KERNEL8x8_I1_L4_3 OffsetA,OffsetB, Index,IsLast
  679. KERNEL8x8_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,1
  680. .endm
  681. .macro KERNEL8x8_I1_L2_3 OffsetA,OffsetB, Index,IsLast
  682. KERNEL8x8_L1_L2_I AO,BO,0, \OffsetA,\OffsetB,\Index,\IsLast,1
  683. .endm
  684. .macro KERNEL8x8_I2_L4_2 AREG,BREG,OffsetA,OffsetB, Index,IsLast
  685. KERNEL8x8_L1_L4_I \AREG,\BREG, \OffsetA,\OffsetB,\Index,\IsLast,0
  686. .endm
  687. .macro KERNEL8x8_I2_L4_3 AREG,BREG,OffsetA,OffsetB, Index,IsLast
  688. KERNEL8x8_L1_L4_I \AREG,\BREG, \OffsetA,\OffsetB,\Index,\IsLast,1
  689. .endm
  690. .macro END8x8_NORMAL
  691. END8x8 0, AO, BO, 32,32
  692. .endm
  693. .macro Zero8X8
  694. xxlxor vs32, vs32, vs32
  695. xxlxor vs33, vs33, vs33
  696. xxlxor vs36, vs36, vs36
  697. xxlxor vs37, vs37, vs37
  698. xxlxor vs40, vs40, vs40
  699. xxlxor vs41, vs41, vs41
  700. xxlxor vs44, vs44, vs44
  701. xxlxor vs45, vs45, vs45
  702. xxlxor vs48, vs48, vs48
  703. xxlxor vs49, vs49, vs49
  704. xxlxor vs52, vs52, vs52
  705. xxlxor vs53, vs53, vs53
  706. xxlxor vs56, vs56, vs56
  707. xxlxor vs57, vs57, vs57
  708. xxlxor vs60, vs60, vs60
  709. xxlxor vs61, vs61, vs61
  710. .endm
  711. .macro LOAD8x8 Zero
  712. lxv vs24, 0(BO)
  713. lxv vs28, 16(BO)
  714. lxv vs0, 0(AO)
  715. lxv vs1, 16(AO)
  716. xxperm vs26, vs24, permute_mask
  717. xxperm vs30, vs28, permute_mask
  718. xxpermdi vs25, vs24, vs24,2
  719. xxpermdi vs29, vs28, vs28,2
  720. xxpermdi vs27, vs26, vs26,2
  721. xxpermdi vs31, vs30, vs30,2
  722. .if \Zero==1
  723. xxlxor vs32, vs32, vs32
  724. xxlxor vs33, vs33, vs33
  725. xxlxor vs36, vs36, vs36
  726. xxlxor vs37, vs37, vs37
  727. xxlxor vs40, vs40, vs40
  728. xxlxor vs41, vs41, vs41
  729. xxlxor vs44, vs44, vs44
  730. xxlxor vs45, vs45, vs45
  731. xxlxor vs48, vs48, vs48
  732. xxlxor vs49, vs49, vs49
  733. xxlxor vs52, vs52, vs52
  734. xxlxor vs53, vs53, vs53
  735. xxlxor vs56, vs56, vs56
  736. xxlxor vs57, vs57, vs57
  737. xxlxor vs60, vs60, vs60
  738. xxlxor vs61, vs61, vs61
  739. .endif
  740. .endm
  741. .macro END8x8 First, AREG, BREG, OffsetA, OffsetB
  742. .if \OffsetB != 0
  743. addi \BREG, \BREG, \OffsetB
  744. .endif
  745. .if \OffsetA != 0
  746. addi \AREG, \AREG, \OffsetA
  747. .endif
  748. .if \First==1
  749. xvmulsp vs32, vs0,vs24
  750. xvmulsp vs33, vs1,vs24
  751. xvmulsp vs36, vs0,vs25
  752. xvmulsp vs37, vs1,vs25
  753. xvmulsp vs40, vs0,vs26
  754. xvmulsp vs41, vs1,vs26
  755. xvmulsp vs44, vs0,vs27
  756. xvmulsp vs45, vs1,vs27
  757. xvmulsp vs48, vs0,vs28
  758. xvmulsp vs49, vs1,vs28
  759. xvmulsp vs52, vs0,vs29
  760. xvmulsp vs53, vs1,vs29
  761. xvmulsp vs56, vs0,vs30
  762. xvmulsp vs57, vs1,vs30
  763. xvmulsp vs60, vs0,vs31
  764. xvmulsp vs61, vs1,vs31
  765. .else
  766. xvmaddasp vs32, vs0,vs24
  767. xvmaddasp vs33, vs1,vs24
  768. xvmaddasp vs36, vs0,vs25
  769. xvmaddasp vs37, vs1,vs25
  770. xvmaddasp vs40, vs0,vs26
  771. xvmaddasp vs41, vs1,vs26
  772. xvmaddasp vs44, vs0,vs27
  773. xvmaddasp vs45, vs1,vs27
  774. xvmaddasp vs48, vs0,vs28
  775. xvmaddasp vs49, vs1,vs28
  776. xvmaddasp vs52, vs0,vs29
  777. xvmaddasp vs53, vs1,vs29
  778. xvmaddasp vs56, vs0,vs30
  779. xvmaddasp vs57, vs1,vs30
  780. xvmaddasp vs60, vs0,vs31
  781. xvmaddasp vs61, vs1,vs31
  782. .endif
  783. .endm
  784. .macro KERNEL8x8_L1_L4_I AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  785. lxv vs8, DISP32(\Index, 0+\OffsetB)(\BREG)
  786. lxv vs12, DISP32(\Index,16+\OffsetB)(\BREG)
  787. lxv vs4, DISP32(\Index, 0+\OffsetA)(\AREG)
  788. lxv vs5, DISP32(\Index,16+\OffsetA)(\AREG)
  789. xxperm vs10, vs8, permute_mask
  790. xxperm vs14, vs12, permute_mask
  791. xvmaddasp vs32, vs0,vs24
  792. xvmaddasp vs33, vs1,vs24
  793. xxpermdi vs9, vs8, vs8,2
  794. xxpermdi vs13, vs12, vs12,2
  795. xvmaddasp vs36, vs0,vs25
  796. xvmaddasp vs37, vs1,vs25
  797. xxpermdi vs11, vs10, vs10,2
  798. xxpermdi vs15, vs14, vs14,2
  799. xvmaddasp vs40, vs0,vs26
  800. xvmaddasp vs41, vs1,vs26
  801. xvmaddasp vs44, vs0,vs27
  802. xvmaddasp vs45, vs1,vs27
  803. xvmaddasp vs48, vs0,vs28
  804. xvmaddasp vs49, vs1,vs28
  805. xvmaddasp vs52, vs0,vs29
  806. xvmaddasp vs53, vs1,vs29
  807. lxv vs24, DISP32(\Index,32+\OffsetB)(\BREG)
  808. lxv vs28, DISP32(\Index,32+16+\OffsetB)(\BREG)
  809. xvmaddasp vs56, vs0,vs30
  810. xvmaddasp vs57, vs1,vs30
  811. xvmaddasp vs60, vs0,vs31
  812. xvmaddasp vs61, vs1,vs31
  813. xxperm vs26, vs24, permute_mask
  814. xxperm vs30, vs28, permute_mask
  815. lxv vs0, DISP32(\Index,32+\OffsetA)(\AREG)
  816. lxv vs1, DISP32(\Index,32+16+\OffsetA)(\AREG)
  817. xxpermdi vs25, vs24, vs24,2
  818. xxpermdi vs29, vs28, vs28,2
  819. xvmaddasp vs32, vs4,vs8
  820. xvmaddasp vs33, vs5,vs8
  821. xvmaddasp vs36, vs4,vs9
  822. xvmaddasp vs37, vs5,vs9
  823. xxpermdi vs27, vs26, vs26,2
  824. xxpermdi vs31, vs30, vs30,2
  825. xvmaddasp vs40, vs4,vs10
  826. xvmaddasp vs41, vs5,vs10
  827. xvmaddasp vs44, vs4,vs11
  828. xvmaddasp vs45, vs5,vs11
  829. xvmaddasp vs48, vs4,vs12
  830. xvmaddasp vs49, vs5,vs12
  831. xvmaddasp vs52, vs4,vs13
  832. xvmaddasp vs53, vs5,vs13
  833. lxv vs8, DISP32(\Index,64+\OffsetB)(\BREG)
  834. lxv vs12, DISP32(\Index,64+16+\OffsetB)(\BREG)
  835. xvmaddasp vs56, vs4,vs14
  836. xvmaddasp vs57, vs5,vs14
  837. xvmaddasp vs60, vs4,vs15
  838. xvmaddasp vs61, vs5,vs15
  839. xxperm vs10, vs8, permute_mask
  840. xxperm vs14, vs12, permute_mask
  841. lxv vs4, DISP32(\Index,64+0+\OffsetA)(\AREG)
  842. lxv vs5, DISP32(\Index,64+16+\OffsetA)(\AREG)
  843. xxpermdi vs9, vs8, vs8,2
  844. xxpermdi vs13, vs12, vs12,2
  845. xvmaddasp vs32, vs0,vs24
  846. xvmaddasp vs33, vs1,vs24
  847. xvmaddasp vs36, vs0,vs25
  848. xvmaddasp vs37, vs1,vs25
  849. xxpermdi vs11, vs10, vs10,2
  850. xxpermdi vs15, vs14, vs14,2
  851. xvmaddasp vs40, vs0,vs26
  852. xvmaddasp vs41, vs1,vs26
  853. xvmaddasp vs44, vs0,vs27
  854. xvmaddasp vs45, vs1,vs27
  855. xvmaddasp vs48, vs0,vs28
  856. xvmaddasp vs49, vs1,vs28
  857. xvmaddasp vs52, vs0,vs29
  858. xvmaddasp vs53, vs1,vs29
  859. .if \Complete==0
  860. lxv vs24, DISP32(\Index,96+\OffsetB)(\BREG)
  861. lxv vs28, DISP32(\Index,96+16+\OffsetB)(\BREG)
  862. .endif
  863. xvmaddasp vs56, vs0,vs30
  864. xvmaddasp vs57, vs1,vs30
  865. .if \Complete==0
  866. xxperm vs26, vs24, permute_mask
  867. xxperm vs30, vs28, permute_mask
  868. .endif
  869. xvmaddasp vs60, vs0,vs31
  870. xvmaddasp vs61, vs1,vs31
  871. .if \Complete==0
  872. lxv vs0, DISP32(\Index,96+\OffsetA)(\AREG)
  873. lxv vs1, DISP32(\Index,96+16+\OffsetA)(\AREG)
  874. .endif
  875. .if \Complete==0
  876. xxpermdi vs25, vs24, vs24,2
  877. xxpermdi vs29, vs28, vs28,2
  878. .endif
  879. .if \IsLast==1
  880. .if \Complete==1
  881. addi \BREG, \BREG, DISP32(\Index,32*3+\OffsetB)
  882. addi \AREG, \AREG, DISP32(\Index,32*3+\OffsetA)
  883. .else
  884. addi \BREG, \BREG, DISP32(\Index,128)
  885. addi \AREG, \AREG, DISP32(\Index,128)
  886. .endif
  887. .endif
  888. xvmaddasp vs32, vs4,vs8
  889. xvmaddasp vs33, vs5,vs8
  890. xvmaddasp vs36, vs4,vs9
  891. xvmaddasp vs37, vs5,vs9
  892. .if \Complete==0
  893. xxpermdi vs27, vs26, vs26,2
  894. xxpermdi vs31, vs30, vs30,2
  895. .endif
  896. xvmaddasp vs40, vs4,vs10
  897. xvmaddasp vs41, vs5,vs10
  898. xvmaddasp vs44, vs4,vs11
  899. xvmaddasp vs45, vs5,vs11
  900. xvmaddasp vs48, vs4,vs12
  901. xvmaddasp vs49, vs5,vs12
  902. xvmaddasp vs52, vs4,vs13
  903. xvmaddasp vs53, vs5,vs13
  904. xvmaddasp vs56, vs4,vs14
  905. xvmaddasp vs57, vs5,vs14
  906. xvmaddasp vs60, vs4,vs15
  907. xvmaddasp vs61, vs5,vs15
  908. .endm
  909. .macro KERNEL8x8 First
  910. LOAD8x8 0
  911. END8x8 \First, AO, BO, 32,32
  912. .endm
  913. .macro KERNEL8x8_L1_L2_I AREG,BREG,First,OffsetA,OffsetB, Index,IsLast ,Complete
  914. lxv vs8, DISP16(\Index, 0+\OffsetB)(\BREG)
  915. lxv vs12, DISP16(\Index,16+\OffsetB)(\BREG)
  916. lxv vs4, DISP16(\Index, 0+\OffsetA)(\AREG)
  917. lxv vs5, DISP16(\Index,16+\OffsetA)(\AREG)
  918. xxperm vs10, vs8, permute_mask
  919. xxperm vs14, vs12, permute_mask
  920. xxpermdi vs9, vs8, vs8,2
  921. xxpermdi vs13, vs12, vs12,2
  922. .if \First==1
  923. xvmulsp vs32, vs0,vs24
  924. xvmulsp vs33, vs1,vs24
  925. xvmulsp vs36, vs0,vs25
  926. xvmulsp vs37, vs1,vs25
  927. .else
  928. xvmaddasp vs32, vs0,vs24
  929. xvmaddasp vs33, vs1,vs24
  930. xvmaddasp vs36, vs0,vs25
  931. xvmaddasp vs37, vs1,vs25
  932. .endif
  933. xxpermdi vs11, vs10, vs10,2
  934. xxpermdi vs15, vs14, vs14,2
  935. .if \First==1
  936. xvmulsp vs40, vs0,vs26
  937. xvmulsp vs41, vs1,vs26
  938. xvmulsp vs44, vs0,vs27
  939. xvmulsp vs45, vs1,vs27
  940. xvmulsp vs48, vs0,vs28
  941. xvmulsp vs49, vs1,vs28
  942. xvmulsp vs52, vs0,vs29
  943. xvmulsp vs53, vs1,vs29
  944. xvmulsp vs56, vs0,vs30
  945. xvmulsp vs57, vs1,vs30
  946. xvmulsp vs60, vs0,vs31
  947. xvmulsp vs61, vs1,vs31
  948. .else
  949. xvmaddasp vs40, vs0,vs26
  950. xvmaddasp vs41, vs1,vs26
  951. xvmaddasp vs44, vs0,vs27
  952. xvmaddasp vs45, vs1,vs27
  953. xvmaddasp vs48, vs0,vs28
  954. xvmaddasp vs49, vs1,vs28
  955. xvmaddasp vs52, vs0,vs29
  956. xvmaddasp vs53, vs1,vs29
  957. xvmaddasp vs56, vs0,vs30
  958. xvmaddasp vs57, vs1,vs30
  959. xvmaddasp vs60, vs0,vs31
  960. xvmaddasp vs61, vs1,vs31
  961. .endif
  962. .if \Complete==0
  963. lxv vs24, DISP16(\Index,32+\OffsetB)(\BREG)
  964. lxv vs28, DISP16(\Index,32+16+\OffsetB)(\BREG)
  965. lxv vs0, DISP16(\Index,32+\OffsetA)(\AREG)
  966. lxv vs1, DISP16(\Index,32+16+\OffsetA)(\AREG)
  967. xxperm vs26, vs24, permute_mask
  968. xxperm vs30, vs28, permute_mask
  969. xxpermdi vs25, vs24, vs24,2
  970. xxpermdi vs29, vs28, vs28,2
  971. .endif
  972. .if \IsLast==1
  973. .if \Complete==1
  974. addi \BREG, \BREG, DISP16(\Index,32+\OffsetB)
  975. addi \AREG, \AREG, DISP16(\Index,32+\OffsetA)
  976. .else
  977. addi \BREG, \BREG, DISP16(\Index,64)
  978. addi \AREG, \AREG, DISP16(\Index,64)
  979. .endif
  980. .endif
  981. .if \First==1
  982. xvmulsp vs32, vs4,vs8
  983. xvmulsp vs33, vs5,vs8
  984. xvmulsp vs36, vs4,vs9
  985. xvmulsp vs37, vs5,vs9
  986. .else
  987. xvmaddasp vs32, vs4,vs8
  988. xvmaddasp vs33, vs5,vs8
  989. xvmaddasp vs36, vs4,vs9
  990. xvmaddasp vs37, vs5,vs9
  991. .endif
  992. .if \Complete==0
  993. xxpermdi vs27, vs26, vs26,2
  994. xxpermdi vs31, vs30, vs30,2
  995. .endif
  996. .if \First==1
  997. xvmulsp vs40, vs4,vs10
  998. xvmulsp vs41, vs5,vs10
  999. xvmulsp vs44, vs4,vs11
  1000. xvmulsp vs45, vs5,vs11
  1001. xvmulsp vs48, vs4,vs12
  1002. xvmulsp vs49, vs5,vs12
  1003. xvmulsp vs52, vs4,vs13
  1004. xvmulsp vs53, vs5,vs13
  1005. xvmulsp vs56, vs4,vs14
  1006. xvmulsp vs57, vs5,vs14
  1007. xvmulsp vs60, vs4,vs15
  1008. xvmulsp vs61, vs5,vs15
  1009. .else
  1010. xvmaddasp vs40, vs4,vs10
  1011. xvmaddasp vs41, vs5,vs10
  1012. xvmaddasp vs44, vs4,vs11
  1013. xvmaddasp vs45, vs5,vs11
  1014. xvmaddasp vs48, vs4,vs12
  1015. xvmaddasp vs49, vs5,vs12
  1016. xvmaddasp vs52, vs4,vs13
  1017. xvmaddasp vs53, vs5,vs13
  1018. xvmaddasp vs56, vs4,vs14
  1019. xvmaddasp vs57, vs5,vs14
  1020. xvmaddasp vs60, vs4,vs15
  1021. xvmaddasp vs61, vs5,vs15
  1022. .endif
  1023. .endm
  1024. .macro SAVE8x8
  1025. slwi T10, LDC , 1
  1026. add T1, CO, LDC
  1027. add T2, CO, T10
  1028. add T3, T1, T10
  1029. add T4, T2, T10
  1030. add T5, T3, T10
  1031. add T6, T4, T10
  1032. add T7, T5, T10
  1033. #ifndef TRMMKERNEL
  1034. lxv vs34, 0(CO)
  1035. lxv vs35, 16(CO)
  1036. lxv vs38, 0(T1)
  1037. lxv vs39, 16(T1)
  1038. lxv vs42, 0(T2)
  1039. lxv vs43, 16(T2)
  1040. lxv vs46, 0(T3)
  1041. lxv vs47, 16(T3)
  1042. lxv vs50, 0(T4)
  1043. lxv vs51, 16(T4)
  1044. lxv vs54, 0(T5)
  1045. lxv vs55, 16(T5)
  1046. lxv vs58, 0(T6)
  1047. lxv vs59, 16(T6)
  1048. lxv vs62, 0(T7)
  1049. lxv vs63, 16(T7)
  1050. #endif
  1051. xxmrglw vs8, vs32, vs44
  1052. xxmrglw vs10, vs36, vs40
  1053. xxmrghw vs1, vs32, vs44
  1054. xxmrghw vs0, vs36, vs40
  1055. xxmrglw vs12, vs33, vs45
  1056. xxmrglw vs14, vs37, vs41
  1057. xxmrghw vs2, vs37, vs41
  1058. xxmrghw vs3, vs33, vs45
  1059. xxlor vs9, vs8, vs8
  1060. xxlor vs11, vs10, vs10
  1061. xxlor vs13, vs12, vs12
  1062. xxlor vs15, vs14, vs14
  1063. xxperm vs8, vs0, save_permute_1
  1064. xxperm vs10, vs1, save_permute_1
  1065. xxperm vs9, vs0, save_permute_2
  1066. xxperm vs11, vs1, save_permute_2
  1067. xxperm vs12, vs2, save_permute_1
  1068. xxperm vs14, vs3, save_permute_1
  1069. xxperm vs13, vs2, save_permute_2
  1070. xxperm vs15, vs3, save_permute_2
  1071. /* multiply add normal way */
  1072. #ifdef TRMMKERNEL
  1073. xvmulsp vs34, vs8, alpha_r
  1074. xvmulsp vs35, vs12, alpha_r
  1075. xvmulsp vs38, vs9, alpha_r
  1076. xvmulsp vs39, vs13, alpha_r
  1077. xvmulsp vs42, vs10, alpha_r
  1078. xvmulsp vs43, vs14, alpha_r
  1079. xvmulsp vs46, vs11, alpha_r
  1080. xvmulsp vs47, vs15, alpha_r
  1081. #else
  1082. xvmaddasp vs34, vs8, alpha_r
  1083. xvmaddasp vs35, vs12, alpha_r
  1084. xvmaddasp vs38, vs9, alpha_r
  1085. xvmaddasp vs39, vs13, alpha_r
  1086. xvmaddasp vs42, vs10, alpha_r
  1087. xvmaddasp vs43, vs14, alpha_r
  1088. xvmaddasp vs46, vs11, alpha_r
  1089. xvmaddasp vs47, vs15, alpha_r
  1090. #endif
  1091. xxmrglw vs8, vs48, vs60
  1092. xxmrglw vs10, vs52, vs56
  1093. xxmrghw vs1, vs48, vs60
  1094. xxmrghw vs0, vs52, vs56
  1095. stxv vs34, 0(CO)
  1096. stxv vs35, 16(CO)
  1097. xxmrglw vs12, vs49, vs61
  1098. xxmrglw vs14, vs53, vs57
  1099. stxv vs38, 0(T1)
  1100. stxv vs39, 16(T1)
  1101. xxmrghw vs2, vs53, vs57
  1102. xxmrghw vs3, vs49, vs61
  1103. stxv vs42, 0(T2)
  1104. stxv vs43, 16(T2)
  1105. xxlor vs9, vs8, vs8
  1106. xxlor vs11, vs10, vs10
  1107. stxv vs46, 0(T3)
  1108. stxv vs47, 16(T3)
  1109. xxlor vs13, vs12, vs12
  1110. xxlor vs15, vs14, vs14
  1111. xxperm vs8, vs0, save_permute_1
  1112. xxperm vs10, vs1, save_permute_1
  1113. xxperm vs9, vs0, save_permute_2
  1114. xxperm vs11, vs1, save_permute_2
  1115. xxperm vs12, vs2, save_permute_1
  1116. xxperm vs14, vs3, save_permute_1
  1117. xxperm vs13, vs2, save_permute_2
  1118. xxperm vs15, vs3, save_permute_2
  1119. #ifdef TRMMKERNEL
  1120. xvmulsp vs50, vs8, alpha_r
  1121. xvmulsp vs51, vs12, alpha_r
  1122. xvmulsp vs54, vs9, alpha_r
  1123. xvmulsp vs55, vs13, alpha_r
  1124. xvmulsp vs58, vs10, alpha_r
  1125. xvmulsp vs59, vs14, alpha_r
  1126. xvmulsp vs62, vs11, alpha_r
  1127. xvmulsp vs63, vs15, alpha_r
  1128. #else
  1129. xvmaddasp vs50, vs8, alpha_r
  1130. xvmaddasp vs51, vs12, alpha_r
  1131. xvmaddasp vs54, vs9, alpha_r
  1132. xvmaddasp vs55, vs13, alpha_r
  1133. xvmaddasp vs58, vs10, alpha_r
  1134. xvmaddasp vs59, vs14, alpha_r
  1135. xvmaddasp vs62, vs11, alpha_r
  1136. xvmaddasp vs63, vs15, alpha_r
  1137. #endif
  1138. stxv vs50, 0(T4)
  1139. stxv vs51, 16(T4)
  1140. stxv vs54, 0(T5)
  1141. stxv vs55, 16(T5)
  1142. stxv vs58, 0(T6)
  1143. stxv vs59, 16(T6)
  1144. stxv vs62, 0(T7)
  1145. stxv vs63, 16(T7)
  1146. addi CO,CO,32
  1147. .endm
  1148. /**********************************************************************************************
  1149. * Macros for N=8 and M=4
  1150. **********************************************************************************************/
  1151. .macro LOAD8x4_1
  1152. LOAD8x4 1
  1153. .endm
  1154. .macro LOAD8x4_0
  1155. LOAD8x4 0
  1156. .endm
  1157. .macro KERNEL8x4_L1_L4 Index,IsLast
  1158. KERNEL8x4_L1_L4_I AO,BO, 0,0, \Index,\IsLast,0
  1159. .endm
  1160. .macro KERNEL8x4_I1_L4 OffsetA,OffsetB, Index,IsLast
  1161. KERNEL8x4_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,0
  1162. .endm
  1163. .macro KERNEL8x4_I1_L4_2 OffsetA,OffsetB, Index,IsLast
  1164. KERNEL8x4_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,0
  1165. .endm
  1166. .macro KERNEL8x4_I1_L4_3 OffsetA,OffsetB, Index,IsLast
  1167. KERNEL8x4_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,1
  1168. .endm
  1169. .macro KERNEL8x4_I1_L2_3 OffsetA,OffsetB, Index,IsLast
  1170. KERNEL8x4_L1_L2_I AO,BO,0, \OffsetA,\OffsetB,\Index,\IsLast,1
  1171. .endm
  1172. .macro KERNEL8x4_I2_L4_2 AREG,BREG,OffsetA,OffsetB, Index,IsLast
  1173. KERNEL8x4_L1_L4_I \AREG,\BREG, \OffsetA,\OffsetB,\Index,\IsLast,0
  1174. .endm
  1175. .macro KERNEL8x4_I2_L4_3 AREG,BREG,OffsetA,OffsetB, Index,IsLast
  1176. KERNEL8x4_L1_L4_I \AREG,\BREG, \OffsetA,\OffsetB,\Index,\IsLast,1
  1177. .endm
  1178. .macro Zero8X4
  1179. xxlxor vs32, vs32, vs32
  1180. xxlxor vs33, vs33, vs33
  1181. xxlxor vs34, vs34, vs34
  1182. xxlxor vs35, vs35, vs35
  1183. xxlxor vs48, vs48, vs48
  1184. xxlxor vs49, vs49, vs49
  1185. xxlxor vs50, vs50, vs50
  1186. xxlxor vs51, vs51, vs51
  1187. .endm
  1188. .macro LOAD8x4 Zero
  1189. lxv vs0, 0(AO)
  1190. lxv vs24, 0(BO)
  1191. lxv vs25, 16(BO)
  1192. xxperm vs2, vs0, permute_mask
  1193. xxpermdi vs1, vs0, vs0,2
  1194. xxpermdi vs3, vs2, vs2,2
  1195. .if \Zero==1
  1196. xxlxor vs32, vs32, vs32
  1197. xxlxor vs33, vs33, vs33
  1198. xxlxor vs34, vs34, vs34
  1199. xxlxor vs35, vs35, vs35
  1200. xxlxor vs48, vs48, vs48
  1201. xxlxor vs49, vs49, vs49
  1202. xxlxor vs50, vs50, vs50
  1203. xxlxor vs51, vs51, vs51
  1204. .endif
  1205. .endm
  1206. .macro END8x4_NORMAL
  1207. END8x4 0, AO, BO, 16,32
  1208. .endm
  1209. .macro END8x4 First, AREG, BREG, OffsetA, OffsetB
  1210. .if \OffsetB != 0
  1211. addi \BREG, \BREG, \OffsetB
  1212. .endif
  1213. .if \OffsetA != 0
  1214. addi \AREG, \AREG, \OffsetA
  1215. .endif
  1216. .if \First==1
  1217. xvmulsp vs32, vs24, vs0
  1218. xvmulsp vs33, vs24, vs1
  1219. xvmulsp vs34, vs24, vs2
  1220. xvmulsp vs35, vs24, vs3
  1221. xvmulsp vs48, vs25, vs0
  1222. xvmulsp vs49, vs25, vs1
  1223. xvmulsp vs50, vs25, vs2
  1224. xvmulsp vs51, vs25, vs3
  1225. .else
  1226. xvmaddasp vs32, vs24, vs0
  1227. xvmaddasp vs33, vs24, vs1
  1228. xvmaddasp vs34, vs24, vs2
  1229. xvmaddasp vs35, vs24, vs3
  1230. xvmaddasp vs48, vs25, vs0
  1231. xvmaddasp vs49, vs25, vs1
  1232. xvmaddasp vs50, vs25, vs2
  1233. xvmaddasp vs51, vs25, vs3
  1234. .endif
  1235. .endm
  1236. .macro KERNEL8x4_L1_L4_I AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  1237. lxv vs4, DISP16(\Index, 0+\OffsetA)(\AREG)
  1238. lxv vs26, DISP32(\Index, 0+\OffsetB)(\BREG)
  1239. lxv vs27, DISP32(\Index,16+\OffsetB)(\BREG)
  1240. xxperm vs6, vs4, permute_mask
  1241. xxpermdi vs5, vs4, vs4,2
  1242. xxpermdi vs7, vs6, vs6,2
  1243. xvmaddasp vs32, vs24, vs0
  1244. xvmaddasp vs33, vs24, vs1
  1245. xvmaddasp vs34, vs24, vs2
  1246. xvmaddasp vs35, vs24, vs3
  1247. xvmaddasp vs48, vs25, vs0
  1248. xvmaddasp vs49, vs25, vs1
  1249. xvmaddasp vs50, vs25, vs2
  1250. xvmaddasp vs51, vs25, vs3
  1251. lxv vs0, DISP16(\Index, 16+\OffsetA)(\AREG)
  1252. lxv vs24, DISP32(\Index, 32+\OffsetB)(\BREG)
  1253. lxv vs25, DISP32(\Index, 48+\OffsetB)(\BREG)
  1254. xxperm vs2, vs0, permute_mask
  1255. xxpermdi vs1, vs0, vs0,2
  1256. xxpermdi vs3, vs2, vs2,2
  1257. xvmaddasp vs32, vs26, vs4
  1258. xvmaddasp vs33, vs26, vs5
  1259. xvmaddasp vs34, vs26, vs6
  1260. xvmaddasp vs35, vs26, vs7
  1261. xvmaddasp vs48, vs27, vs4
  1262. xvmaddasp vs49, vs27, vs5
  1263. xvmaddasp vs50, vs27, vs6
  1264. xvmaddasp vs51, vs27, vs7
  1265. lxv vs4, DISP16(\Index, 32+\OffsetA)(\AREG)
  1266. lxv vs26, DISP32(\Index, 64+\OffsetB)(\BREG)
  1267. lxv vs27, DISP32(\Index, 80+\OffsetB)(\BREG)
  1268. xxperm vs6, vs4, permute_mask
  1269. xxpermdi vs5, vs4, vs4,2
  1270. xxpermdi vs7, vs6, vs6,2
  1271. xvmaddasp vs32, vs24, vs0
  1272. xvmaddasp vs33, vs24, vs1
  1273. xvmaddasp vs34, vs24, vs2
  1274. xvmaddasp vs35, vs24, vs3
  1275. xvmaddasp vs48, vs25, vs0
  1276. xvmaddasp vs49, vs25, vs1
  1277. xvmaddasp vs50, vs25, vs2
  1278. xvmaddasp vs51, vs25, vs3
  1279. .if \Complete==0
  1280. lxv vs0, DISP16(\Index, 48+\OffsetA)(\AREG)
  1281. lxv vs24, DISP32(\Index, 96+\OffsetB)(\BREG)
  1282. lxv vs25, DISP32(\Index, 96+16+\OffsetB)(\BREG)
  1283. xxperm vs2, vs0, permute_mask
  1284. xxpermdi vs1, vs0, vs0,2
  1285. xxpermdi vs3, vs2, vs2,2
  1286. .endif
  1287. xvmaddasp vs32, vs26, vs4
  1288. xvmaddasp vs33, vs26, vs5
  1289. xvmaddasp vs34, vs26, vs6
  1290. xvmaddasp vs35, vs26, vs7
  1291. xvmaddasp vs48, vs27, vs4
  1292. xvmaddasp vs49, vs27, vs5
  1293. xvmaddasp vs50, vs27, vs6
  1294. xvmaddasp vs51, vs27, vs7
  1295. .if \IsLast==1
  1296. .if \Complete==1
  1297. addi \AREG, \AREG, DISP16(\Index,16*3+\OffsetA)
  1298. addi \BREG, \BREG, DISP32(\Index,32*3+\OffsetB)
  1299. .else
  1300. addi \AREG, \AREG, DISP16(\Index,64)
  1301. addi \BREG, \BREG, DISP32(\Index,128)
  1302. .endif
  1303. .endif
  1304. .endm
  1305. .macro KERNEL8x4 First
  1306. LOAD8x4 0
  1307. END8x4 \First, AO, BO, 16,32
  1308. .endm
  1309. .macro KERNEL8x4_L1_L2_I AREG,BREG,First,OffsetA,OffsetB, Index,IsLast ,Complete
  1310. lxv vs4, DISP8(\Index, 0+\OffsetA)(\AREG)
  1311. lxv vs26, DISP16(\Index, 0+\OffsetB)(\BREG)
  1312. lxv vs27, DISP16(\Index,16+\OffsetB)(\BREG)
  1313. xxperm vs6, vs4, permute_mask
  1314. xxpermdi vs5, vs4, vs4,2
  1315. xxpermdi vs7, vs6, vs6,2
  1316. .if \First==1
  1317. xvmulsp vs32, vs24, vs0
  1318. xvmulsp vs33, vs24, vs1
  1319. xvmulsp vs34, vs24, vs2
  1320. xvmulsp vs35, vs24, vs3
  1321. xvmulsp vs48, vs25, vs0
  1322. xvmulsp vs49, vs25, vs1
  1323. xvmulsp vs50, vs25, vs2
  1324. xvmulsp vs51, vs25, vs3
  1325. .else
  1326. xvmaddasp vs32, vs24, vs0
  1327. xvmaddasp vs33, vs24, vs1
  1328. xvmaddasp vs34, vs24, vs2
  1329. xvmaddasp vs35, vs24, vs3
  1330. xvmaddasp vs48, vs25, vs0
  1331. xvmaddasp vs49, vs25, vs1
  1332. xvmaddasp vs50, vs25, vs2
  1333. xvmaddasp vs51, vs25, vs3
  1334. .endif
  1335. .if \Complete==0
  1336. lxv vs0, DISP8(\Index, 16+\OffsetA)(\AREG)
  1337. lxv vs24, DISP16(\Index, 32+\OffsetB)(\BREG)
  1338. lxv vs25, DISP16(\Index, 48+\OffsetB)(\BREG)
  1339. xxperm vs2, vs0, permute_mask
  1340. xxpermdi vs1, vs0, vs0,2
  1341. xxpermdi vs3, vs2, vs2,2
  1342. .endif
  1343. .if \First==1
  1344. xvmulsp vs32, vs26, vs4
  1345. xvmulsp vs33, vs26, vs5
  1346. xvmulsp vs34, vs26, vs6
  1347. xvmulsp vs35, vs26, vs7
  1348. xvmulsp vs48, vs27, vs4
  1349. xvmulsp vs49, vs27, vs5
  1350. xvmulsp vs50, vs27, vs6
  1351. xvmulsp vs51, vs27, vs7
  1352. .else
  1353. xvmaddasp vs32, vs26, vs4
  1354. xvmaddasp vs33, vs26, vs5
  1355. xvmaddasp vs34, vs26, vs6
  1356. xvmaddasp vs35, vs26, vs7
  1357. xvmaddasp vs48, vs27, vs4
  1358. xvmaddasp vs49, vs27, vs5
  1359. xvmaddasp vs50, vs27, vs6
  1360. xvmaddasp vs51, vs27, vs7
  1361. .endif
  1362. .if \IsLast==1
  1363. .if \Complete==1
  1364. addi \AREG, \AREG, DISP8(\Index,16+\OffsetA)
  1365. addi \BREG, \BREG, DISP16(\Index,32+\OffsetB)
  1366. .else
  1367. addi \AREG, \AREG, DISP8(\Index,32)
  1368. addi \BREG, \BREG, DISP16(\Index,64)
  1369. .endif
  1370. .endif
  1371. .endm
  1372. .macro SAVE8x4
  1373. slwi T10, LDC , 1
  1374. add T1, CO, LDC
  1375. #if !defined(TRMMKERNEL)
  1376. lxv vs36, 0(CO)
  1377. lxv vs37, 0(T1)
  1378. #endif
  1379. add T2, CO, T10
  1380. add T3, T1, T10
  1381. #if !defined(TRMMKERNEL)
  1382. lxv vs38, 0(T2)
  1383. lxv vs39, 0(T3)
  1384. #endif
  1385. add T4, T2, T10
  1386. add T5, T3, T10
  1387. #if !defined(TRMMKERNEL)
  1388. lxv vs40, 0(T4)
  1389. lxv vs41, 0(T5)
  1390. #endif
  1391. add T6, T4, T10
  1392. add T7, T5, T10
  1393. #if !defined(TRMMKERNEL)
  1394. lxv vs42, 0(T6)
  1395. lxv vs43, 0(T7)
  1396. #endif
  1397. xxmrglw vs0, vs35,vs32
  1398. xxmrglw vs1, vs34,vs33
  1399. xxmrglw vs4, vs32,vs35
  1400. xxmrglw vs5, vs33,vs34
  1401. xxmrghw vs2, vs35,vs32
  1402. xxmrghw vs3, vs34,vs33
  1403. xxmrghw vs6, vs32,vs35
  1404. xxmrghw vs7, vs33,vs34
  1405. xxmrgld vs24, vs1, vs0
  1406. xxmrghd vs25,vs5,vs4
  1407. xxmrgld vs26, vs2, vs3
  1408. xxmrghd vs27,vs6,vs7
  1409. xxmrglw vs0, vs51,vs48
  1410. xxmrglw vs1, vs50,vs49
  1411. xxmrglw vs4, vs48,vs51
  1412. xxmrglw vs5, vs49,vs50
  1413. xxmrghw vs2, vs51,vs48
  1414. xxmrghw vs3, vs50,vs49
  1415. xxmrghw vs6, vs48,vs51
  1416. xxmrghw vs7, vs49,vs50
  1417. xxmrgld vs28, vs1, vs0
  1418. xxmrghd vs29,vs5,vs4
  1419. xxmrgld vs30, vs2, vs3
  1420. xxmrghd vs31,vs6,vs7
  1421. #if defined(TRMMKERNEL)
  1422. xvmulsp vs36, vs24, alpha_r
  1423. xvmulsp vs37, vs25, alpha_r
  1424. xvmulsp vs38, vs26, alpha_r
  1425. xvmulsp vs39, vs27, alpha_r
  1426. xvmulsp vs40, vs28, alpha_r
  1427. xvmulsp vs41, vs29, alpha_r
  1428. xvmulsp vs42, vs30, alpha_r
  1429. xvmulsp vs43, vs31, alpha_r
  1430. #else
  1431. xvmaddasp vs36, vs24, alpha_r
  1432. xvmaddasp vs37, vs25, alpha_r
  1433. xvmaddasp vs38, vs26, alpha_r
  1434. xvmaddasp vs39, vs27, alpha_r
  1435. xvmaddasp vs40, vs28, alpha_r
  1436. xvmaddasp vs41, vs29, alpha_r
  1437. xvmaddasp vs42, vs30, alpha_r
  1438. xvmaddasp vs43, vs31, alpha_r
  1439. #endif
  1440. stxv vs36, 0(CO)
  1441. stxv vs37, 0(T1)
  1442. stxv vs38, 0(T2)
  1443. stxv vs39, 0(T3)
  1444. stxv vs40, 0(T4)
  1445. stxv vs41, 0(T5)
  1446. stxv vs42, 0(T6)
  1447. stxv vs43, 0(T7)
  1448. addi CO,CO,16
  1449. .endm
  1450. /**********************************************************************************************
  1451. * Macros for N=8 and M=2
  1452. **********************************************************************************************/
  1453. .macro KERNEL8x2_2 OffsetA,OffsetB, Index,IsLast
  1454. KERNEL8x2_I_2 AO,BO, 0, \OffsetA,\OffsetB,\Index,\IsLast
  1455. .endm
  1456. .macro Zero8x2
  1457. xxlxor vs0, vs0, vs0
  1458. xxlxor vs1, vs1, vs1
  1459. xxlxor vs2, vs2, vs2
  1460. xxlxor vs3, vs3, vs3
  1461. .endm
  1462. .macro KERNEL8x2
  1463. KERNEL8x2_1 AO,BO, 0, 0,0,0
  1464. .endm
  1465. .macro KERNEL8x2_1 AREG,BREG,First,OffsetA,OffsetB,Index
  1466. lxsd v4, DISP2(\Index, 0+\OffsetA)(\AREG)
  1467. lxv vs26, DISP8(\Index, 0+\OffsetB)(\BREG)
  1468. lxv vs27, DISP8(\Index,16+\OffsetB)(\BREG)
  1469. xxspltw vs8, vs36, 0
  1470. xxspltw vs9, vs36, 1
  1471. .if \First==1
  1472. xvmulsp vs0, vs26, vs8
  1473. xvmulsp vs1, vs27, vs8
  1474. xvmulsp vs2, vs26, vs9
  1475. xvmulsp vs3, vs27, vs9
  1476. .else
  1477. xvmaddasp vs0, vs26, vs8
  1478. xvmaddasp vs1, vs27, vs8
  1479. xvmaddasp vs2, vs26, vs9
  1480. xvmaddasp vs3, vs27, vs9
  1481. .endif
  1482. addi \AREG, \AREG, DISP2(\Index,8)
  1483. addi \BREG, \BREG, DISP8(\Index,32)
  1484. .endm
  1485. .macro KERNEL8x2_I_2 AREG,BREG,First,OffsetA,OffsetB, Index,IsLast
  1486. lxv vs4, DISP4(\Index, 0+\OffsetA)(\AREG)
  1487. lxv vs26, DISP16(\Index, 0+\OffsetB)(\BREG)
  1488. lxv vs27, DISP16(\Index,16+\OffsetB)(\BREG)
  1489. lxv vs28, DISP16(\Index,32+\OffsetB)(\BREG)
  1490. lxv vs29, DISP16(\Index,48+\OffsetB)(\BREG)
  1491. xxspltw vs8, vs4, 2
  1492. xxspltw vs9, vs4, 3
  1493. xxspltw vs10, vs4, 0
  1494. xxspltw vs11, vs4, 1
  1495. .if \First==1
  1496. xvmulsp vs0, vs26, vs8
  1497. xvmulsp vs1, vs27, vs8
  1498. xvmulsp vs2, vs26, vs9
  1499. xvmulsp vs3, vs27, vs9
  1500. xvmulsp vs0, vs28, vs10
  1501. xvmulsp vs1, vs29, vs10
  1502. xvmulsp vs2, vs28, vs11
  1503. xvmulsp vs3, vs29, vs11
  1504. .else
  1505. xvmaddasp vs0, vs26, vs8
  1506. xvmaddasp vs1, vs27, vs8
  1507. xvmaddasp vs2, vs26, vs9
  1508. xvmaddasp vs3, vs27, vs9
  1509. xvmaddasp vs0, vs28, vs10
  1510. xvmaddasp vs1, vs29, vs10
  1511. xvmaddasp vs2, vs28, vs11
  1512. xvmaddasp vs3, vs29, vs11
  1513. .endif
  1514. .if \IsLast==1
  1515. addi \AREG, \AREG, DISP4(\Index,16)
  1516. addi \BREG, \BREG, DISP16(\Index,64)
  1517. .endif
  1518. .endm
  1519. .macro SAVE8x2
  1520. slwi T10, LDC , 1
  1521. add T1, CO, LDC
  1522. add T2, CO, T10
  1523. add T3, T1, T10
  1524. add T4, T2, T10
  1525. add T5, T3, T10
  1526. add T6, T4, T10
  1527. add T7, T5, T10
  1528. /*convert alpha_r for multiply*/
  1529. xscvspdp vs4,alpha_r
  1530. /* v0 corresponds to vs32, do not forget*/
  1531. #if !defined(TRMMKERNEL)
  1532. lxssp v0,0(CO)
  1533. lxssp v1,4(CO)
  1534. lxssp v2,0(T1)
  1535. lxssp v3,4(T1)
  1536. lxssp v4,0(T2)
  1537. lxssp v5,4(T2)
  1538. lxssp v6,0(T3)
  1539. lxssp v7,4(T3)
  1540. lxssp v8,0(T4)
  1541. lxssp v9,4(T4)
  1542. lxssp v10,0(T5)
  1543. lxssp v11,4(T5)
  1544. lxssp v12,0(T6)
  1545. lxssp v13,4(T6)
  1546. lxssp v14,0(T7)
  1547. lxssp v15,4(T7)
  1548. #endif
  1549. xscvspdp vs5, vs2
  1550. xxspltw vs6, vs2, 1
  1551. xxspltw vs7, vs2, 2
  1552. xxspltw vs8, vs2, 3
  1553. xscvspdp vs6,vs6
  1554. xscvspdp vs7,vs7
  1555. xscvspdp vs8,vs8
  1556. xscvspdp vs24, vs0
  1557. xxspltw vs25, vs0, 1
  1558. xxspltw vs26, vs0, 2
  1559. xxspltw vs27, vs0, 3
  1560. xscvspdp vs25,vs25
  1561. xscvspdp vs26,vs26
  1562. xscvspdp vs27,vs27
  1563. xscvspdp vs9, vs3
  1564. xxspltw vs10, vs3, 1
  1565. xxspltw vs11, vs3, 2
  1566. xxspltw vs12, vs3, 3
  1567. xscvspdp vs10,vs10
  1568. xscvspdp vs11,vs11
  1569. xscvspdp vs12,vs12
  1570. xscvspdp vs28, vs1
  1571. xxspltw vs29, vs1, 1
  1572. xxspltw vs30, vs1, 2
  1573. xxspltw vs31, vs1, 3
  1574. xscvspdp vs29,vs29
  1575. xscvspdp vs30,vs30
  1576. xscvspdp vs31,vs31
  1577. #if defined(TRMMKERNEL)
  1578. xsmuldp vs32,vs8, vs4
  1579. xsmuldp vs33,vs27, vs4
  1580. xsmuldp vs34,vs7, vs4
  1581. xsmuldp vs35,vs26, vs4
  1582. xsmuldp vs36,vs6, vs4
  1583. xsmuldp vs37,vs25, vs4
  1584. xsmuldp vs38,vs5, vs4
  1585. xsmuldp vs39,vs24, vs4
  1586. xsmuldp vs40,vs12, vs4
  1587. xsmuldp vs41,vs31, vs4
  1588. xsmuldp vs42,vs11, vs4
  1589. xsmuldp vs43,vs30, vs4
  1590. xsmuldp vs44,vs10, vs4
  1591. xsmuldp vs45,vs29, vs4
  1592. xsmuldp vs46,vs9, vs4
  1593. xsmuldp vs47,vs28, vs4
  1594. #else
  1595. xsmaddadp vs32,vs8, vs4
  1596. xsmaddadp vs33,vs27, vs4
  1597. xsmaddadp vs34,vs7, vs4
  1598. xsmaddadp vs35,vs26, vs4
  1599. xsmaddadp vs36,vs6, vs4
  1600. xsmaddadp vs37,vs25, vs4
  1601. xsmaddadp vs38,vs5, vs4
  1602. xsmaddadp vs39,vs24, vs4
  1603. xsmaddadp vs40,vs12, vs4
  1604. xsmaddadp vs41,vs31, vs4
  1605. xsmaddadp vs42,vs11, vs4
  1606. xsmaddadp vs43,vs30, vs4
  1607. xsmaddadp vs44,vs10, vs4
  1608. xsmaddadp vs45,vs29, vs4
  1609. xsmaddadp vs46,vs9, vs4
  1610. xsmaddadp vs47,vs28, vs4
  1611. #endif
  1612. stxssp v0,0(CO)
  1613. stxssp v1,4(CO)
  1614. stxssp v2,0(T1)
  1615. stxssp v3,4(T1)
  1616. stxssp v4,0(T2)
  1617. stxssp v5,4(T2)
  1618. stxssp v6,0(T3)
  1619. stxssp v7,4(T3)
  1620. stxssp v8,0(T4)
  1621. stxssp v9,4(T4)
  1622. stxssp v10,0(T5)
  1623. stxssp v11,4(T5)
  1624. stxssp v12,0(T6)
  1625. stxssp v13,4(T6)
  1626. stxssp v14,0(T7)
  1627. stxssp v15,4(T7)
  1628. addi CO,CO,8
  1629. .endm
  1630. /**********************************************************************************************
  1631. * Macros for N=8 and M=1
  1632. **********************************************************************************************/
  1633. .macro KERNEL8x1_4 OffsetA,OffsetB, Index,IsLast
  1634. KERNEL8x1_I_4 AO,BO, 0, \OffsetA,\OffsetB,\Index,\IsLast
  1635. .endm
  1636. .macro Zero8x1
  1637. xxlxor vs0, vs0, vs0
  1638. xxlxor vs1, vs1, vs1
  1639. .endm
  1640. .macro KERNEL8x1
  1641. KERNEL8x1_1 AO,BO, 0
  1642. .endm
  1643. .macro KERNEL8x1_2
  1644. KERNEL8x1_2_1 AO,BO, 0
  1645. .endm
  1646. .macro KERNEL8x1_1 AREG,BREG,First
  1647. lxvwsx vs8, 0, \AREG
  1648. lxv vs26, 0(\BREG)
  1649. lxv vs27, 16(\BREG)
  1650. .if \First==1
  1651. xvmulsp vs0, vs26, vs8
  1652. xvmulsp vs1, vs27, vs8
  1653. .else
  1654. xvmaddasp vs0, vs26, vs8
  1655. xvmaddasp vs1, vs27, vs8
  1656. .endif
  1657. addi \AREG, \AREG, 4
  1658. addi \BREG, \BREG, 32
  1659. .endm
  1660. .macro KERNEL8x1_2_1 AREG,BREG,First
  1661. lxsd v4, 0(\AREG)
  1662. lxv vs26, 0(\BREG)
  1663. lxv vs27, 16(\BREG)
  1664. lxv vs28, 32(\BREG)
  1665. lxv vs29, 48(\BREG)
  1666. xxspltw vs8, vs36, 1
  1667. xxspltw vs9, vs36, 0
  1668. .if \First==1
  1669. xvmulsp vs0, vs26, vs8
  1670. xvmulsp vs1, vs27, vs8
  1671. xvmulsp vs0, vs28, vs9
  1672. xvmulsp vs1, vs29, vs9
  1673. .else
  1674. xvmaddasp vs0, vs26, vs8
  1675. xvmaddasp vs1, vs27, vs8
  1676. xvmaddasp vs0, vs28, vs9
  1677. xvmaddasp vs1, vs29, vs9
  1678. .endif
  1679. addi \AREG, \AREG, 8
  1680. addi \BREG, \BREG, 64
  1681. .endm
  1682. .macro KERNEL8x1_I_4 AREG,BREG,First,OffsetA,OffsetB, Index,IsLast
  1683. lxv vs4, DISP4(\Index, 0+\OffsetA)(\AREG)
  1684. xxspltw vs8, vs4, 3
  1685. xxspltw vs9, vs4, 2
  1686. xxspltw vs10, vs4, 1
  1687. xxspltw vs11, vs4, 0
  1688. lxv vs26, DISP32(\Index, 0+\OffsetB)(\BREG)
  1689. lxv vs27, DISP32(\Index,16+\OffsetB)(\BREG)
  1690. lxv vs28, DISP32(\Index,32+\OffsetB)(\BREG)
  1691. lxv vs29, DISP32(\Index,48+\OffsetB)(\BREG)
  1692. lxv vs30, DISP32(\Index,64+ 0+\OffsetB)(\BREG)
  1693. lxv vs31, DISP32(\Index,64+16+\OffsetB)(\BREG)
  1694. lxv vs32, DISP32(\Index,64+32+\OffsetB)(\BREG)
  1695. lxv vs33, DISP32(\Index,64+48+\OffsetB)(\BREG)
  1696. .if \First==1
  1697. xvmulsp vs0, vs26, vs8
  1698. xvmulsp vs1, vs27, vs8
  1699. xvmulsp vs0, vs28, vs9
  1700. xvmulsp vs1, vs29, vs9
  1701. xvmulsp vs0, vs30, vs10
  1702. xvmulsp vs1, vs31, vs10
  1703. xvmulsp vs0, vs32, vs11
  1704. xvmulsp vs1, vs33, vs11
  1705. .else
  1706. xvmaddasp vs0, vs26, vs8
  1707. xvmaddasp vs1, vs27, vs8
  1708. xvmaddasp vs0, vs28, vs9
  1709. xvmaddasp vs1, vs29, vs9
  1710. xvmaddasp vs0, vs30, vs10
  1711. xvmaddasp vs1, vs31, vs10
  1712. xvmaddasp vs0, vs32, vs11
  1713. xvmaddasp vs1, vs33, vs11
  1714. .endif
  1715. .if \IsLast==1
  1716. addi \AREG, \AREG, DISP4(\Index,16)
  1717. addi \BREG, \BREG, DISP32(\Index,128)
  1718. .endif
  1719. .endm
  1720. .macro SAVE8x1
  1721. slwi T10, LDC , 1
  1722. add T1, CO, LDC
  1723. add T2, CO, T10
  1724. add T3, T1, T10
  1725. add T4, T2, T10
  1726. add T5, T3, T10
  1727. add T6, T4, T10
  1728. add T7, T5, T10
  1729. /*convert alpha_r for multiply*/
  1730. xscvspdp vs4,alpha_r
  1731. /* v0 corresponds to vs32, do not forget*/
  1732. #if !defined(TRMMKERNEL)
  1733. lxssp v0,0(CO)
  1734. lxssp v2,0(T1)
  1735. lxssp v4,0(T2)
  1736. lxssp v6,0(T3)
  1737. lxssp v8,0(T4)
  1738. lxssp v10,0(T5)
  1739. lxssp v12,0(T6)
  1740. lxssp v14,0(T7)
  1741. #endif
  1742. xscvspdp vs24, vs0
  1743. xxspltw vs25, vs0, 1
  1744. xxspltw vs26, vs0, 2
  1745. xxspltw vs27, vs0, 3
  1746. xscvspdp vs25,vs25
  1747. xscvspdp vs26,vs26
  1748. xscvspdp vs27,vs27
  1749. xscvspdp vs28, vs1
  1750. xxspltw vs29, vs1, 1
  1751. xxspltw vs30, vs1, 2
  1752. xxspltw vs31, vs1, 3
  1753. xscvspdp vs29,vs29
  1754. xscvspdp vs30,vs30
  1755. xscvspdp vs31,vs31
  1756. #if defined(TRMMKERNEL)
  1757. xsmuldp vs32,vs27, vs4
  1758. xsmuldp vs34,vs26, vs4
  1759. xsmuldp vs36,vs25, vs4
  1760. xsmuldp vs38,vs24, vs4
  1761. xsmuldp vs40,vs31, vs4
  1762. xsmuldp vs42,vs30, vs4
  1763. xsmuldp vs44,vs29, vs4
  1764. xsmuldp vs46,vs28, vs4
  1765. #else
  1766. xsmaddadp vs32,vs27, vs4
  1767. xsmaddadp vs34,vs26, vs4
  1768. xsmaddadp vs36,vs25, vs4
  1769. xsmaddadp vs38,vs24, vs4
  1770. xsmaddadp vs40,vs31, vs4
  1771. xsmaddadp vs42,vs30, vs4
  1772. xsmaddadp vs44,vs29, vs4
  1773. xsmaddadp vs46,vs28, vs4
  1774. #endif
  1775. stxssp v0,0(CO)
  1776. stxssp v2,0(T1)
  1777. stxssp v4,0(T2)
  1778. stxssp v6,0(T3)
  1779. stxssp v8,0(T4)
  1780. stxssp v10,0(T5)
  1781. stxssp v12,0(T6)
  1782. stxssp v14,0(T7)
  1783. addi CO,CO,4
  1784. .endm
  1785. /**********************************************************************************************
  1786. * Macros for N=4 and M=16
  1787. **********************************************************************************************/
  1788. .macro LOAD4x16_1
  1789. LOAD4x16 1
  1790. .endm
  1791. .macro LOAD4x16_0
  1792. LOAD4x16 0
  1793. .endm
  1794. .macro KERNEL4x16_L1_L4 Index,IsLast
  1795. KERNEL4x16_L1_L4_I AO,BO, 0,0, \Index,\IsLast,0
  1796. .endm
  1797. .macro KERNEL4x16_I1_L4 OffsetA,OffsetB, Index,IsLast
  1798. KERNEL4x16_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,0
  1799. .endm
  1800. .macro KERNEL4x16_I1_L4_2 OffsetA,OffsetB, Index,IsLast
  1801. KERNEL4x16_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,0
  1802. .endm
  1803. .macro KERNEL4x16_I1_L4_3 OffsetA,OffsetB, Index,IsLast
  1804. KERNEL4x16_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,1
  1805. .endm
  1806. .macro KERNEL4x16_I1_L2_3 OffsetA,OffsetB, Index,IsLast
  1807. KERNEL4x16_L1_L2_I AO,BO,0, \OffsetA,\OffsetB,\Index,\IsLast,1
  1808. .endm
  1809. .macro KERNEL4x16_I2_L4_2 AREG,BREG,OffsetA,OffsetB, Index,IsLast
  1810. KERNEL4x16_L1_L4_I \AREG,\BREG, \OffsetA,\OffsetB,\Index,\IsLast,0
  1811. .endm
  1812. .macro KERNEL4x16_I2_L4_3 AREG,BREG,OffsetA,OffsetB, Index,IsLast
  1813. KERNEL4x16_L1_L4_I \AREG,\BREG, \OffsetA,\OffsetB,\Index,\IsLast,1
  1814. .endm
  1815. .macro Zero4X16
  1816. xxlxor vs32, vs32, vs32
  1817. xxlxor vs33, vs33, vs33
  1818. xxlxor vs34, vs34, vs34
  1819. xxlxor vs35, vs35, vs35
  1820. xxlxor vs36, vs36, vs36
  1821. xxlxor vs37, vs37, vs37
  1822. xxlxor vs38, vs38, vs38
  1823. xxlxor vs39, vs39, vs39
  1824. xxlxor vs40, vs40, vs40
  1825. xxlxor vs41, vs41, vs41
  1826. xxlxor vs42, vs42, vs42
  1827. xxlxor vs43, vs43, vs43
  1828. xxlxor vs44, vs44, vs44
  1829. xxlxor vs45, vs45, vs45
  1830. xxlxor vs46, vs46, vs46
  1831. xxlxor vs47, vs47, vs47
  1832. .endm
  1833. .macro LOAD4x16 Zero
  1834. lxv vs24, 0(BO)
  1835. lxv vs0, 0(AO)
  1836. lxv vs1, 16(AO)
  1837. lxv vs2, 32(AO)
  1838. lxv vs3, 48(AO)
  1839. xxperm vs26, vs24, permute_mask
  1840. xxpermdi vs25, vs24, vs24,2
  1841. xxpermdi vs27, vs26, vs26,2
  1842. .if \Zero==1
  1843. xxlxor vs32, vs32, vs32
  1844. xxlxor vs33, vs33, vs33
  1845. xxlxor vs34, vs34, vs34
  1846. xxlxor vs35, vs35, vs35
  1847. xxlxor vs36, vs36, vs36
  1848. xxlxor vs37, vs37, vs37
  1849. xxlxor vs38, vs38, vs38
  1850. xxlxor vs39, vs39, vs39
  1851. xxlxor vs40, vs40, vs40
  1852. xxlxor vs41, vs41, vs41
  1853. xxlxor vs42, vs42, vs42
  1854. xxlxor vs43, vs43, vs43
  1855. xxlxor vs44, vs44, vs44
  1856. xxlxor vs45, vs45, vs45
  1857. xxlxor vs46, vs46, vs46
  1858. xxlxor vs47, vs47, vs47
  1859. .endif
  1860. .endm
  1861. .macro END4x16_NORMAL
  1862. END4x16 0, AO, BO, 64,16
  1863. .endm
  1864. .macro END4x16 First, AREG, BREG, OffsetA, OffsetB
  1865. .if \OffsetB != 0
  1866. addi \BREG, \BREG, \OffsetB
  1867. .endif
  1868. .if \OffsetA != 0
  1869. addi \AREG, \AREG, \OffsetA
  1870. .endif
  1871. .if \First==1
  1872. xvmulsp vs32, vs0,vs24
  1873. xvmulsp vs33, vs1,vs24
  1874. xvmulsp vs34, vs2,vs24
  1875. xvmulsp vs35, vs3,vs24
  1876. xvmulsp vs36, vs0,vs25
  1877. xvmulsp vs37, vs1,vs25
  1878. xvmulsp vs38, vs2,vs25
  1879. xvmulsp vs39, vs3,vs25
  1880. xvmulsp vs40, vs0,vs26
  1881. xvmulsp vs41, vs1,vs26
  1882. xvmulsp vs42, vs2,vs26
  1883. xvmulsp vs43, vs3,vs26
  1884. xvmulsp vs44, vs0,vs27
  1885. xvmulsp vs45, vs1,vs27
  1886. xvmulsp vs46, vs2,vs27
  1887. xvmulsp vs47, vs3,vs27
  1888. .else
  1889. xvmaddasp vs32, vs0,vs24
  1890. xvmaddasp vs33, vs1,vs24
  1891. xvmaddasp vs34, vs2,vs24
  1892. xvmaddasp vs35, vs3,vs24
  1893. xvmaddasp vs36, vs0,vs25
  1894. xvmaddasp vs37, vs1,vs25
  1895. xvmaddasp vs38, vs2,vs25
  1896. xvmaddasp vs39, vs3,vs25
  1897. xvmaddasp vs40, vs0,vs26
  1898. xvmaddasp vs41, vs1,vs26
  1899. xvmaddasp vs42, vs2,vs26
  1900. xvmaddasp vs43, vs3,vs26
  1901. xvmaddasp vs44, vs0,vs27
  1902. xvmaddasp vs45, vs1,vs27
  1903. xvmaddasp vs46, vs2,vs27
  1904. xvmaddasp vs47, vs3,vs27
  1905. .endif
  1906. .endm
  1907. .macro KERNEL4x16_L1_L4_I AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  1908. lxv vs8, DISP16(\Index, 0+\OffsetB)(\BREG)
  1909. lxv vs4, DISP64(\Index, 0+\OffsetA)(\AREG)
  1910. lxv vs5, DISP64(\Index,16+\OffsetA)(\AREG)
  1911. lxv vs6, DISP64(\Index,32+\OffsetA)(\AREG)
  1912. lxv vs7, DISP64(\Index,48+\OffsetA)(\AREG)
  1913. xxperm vs10, vs8, permute_mask
  1914. xxpermdi vs9, vs8, vs8,2
  1915. xvmaddasp vs32, vs0,vs24
  1916. xvmaddasp vs33, vs1,vs24
  1917. xvmaddasp vs34, vs2,vs24
  1918. xvmaddasp vs35, vs3,vs24
  1919. xvmaddasp vs36, vs0,vs25
  1920. xvmaddasp vs37, vs1,vs25
  1921. xvmaddasp vs38, vs2,vs25
  1922. xvmaddasp vs39, vs3,vs25
  1923. xxpermdi vs11, vs10, vs10,2
  1924. xvmaddasp vs40, vs0,vs26
  1925. xvmaddasp vs41, vs1,vs26
  1926. xvmaddasp vs42, vs2,vs26
  1927. xvmaddasp vs43, vs3,vs26
  1928. xvmaddasp vs44, vs0,vs27
  1929. xvmaddasp vs45, vs1,vs27
  1930. xvmaddasp vs46, vs2,vs27
  1931. xvmaddasp vs47, vs3,vs27
  1932. lxv vs24, DISP16(\Index,16+\OffsetB)(\BREG)
  1933. lxv vs0, DISP64(\Index,64+\OffsetA)(\AREG)
  1934. lxv vs1, DISP64(\Index,64+16+\OffsetA)(\AREG)
  1935. lxv vs2, DISP64(\Index,64+32+\OffsetA)(\AREG)
  1936. lxv vs3, DISP64(\Index,64+48+\OffsetA)(\AREG)
  1937. xxperm vs26, vs24, permute_mask
  1938. xxpermdi vs25, vs24, vs24,2
  1939. xvmaddasp vs32, vs4,vs8
  1940. xvmaddasp vs33, vs5,vs8
  1941. xvmaddasp vs34, vs6,vs8
  1942. xvmaddasp vs35, vs7,vs8
  1943. xvmaddasp vs36, vs4,vs9
  1944. xvmaddasp vs37, vs5,vs9
  1945. xvmaddasp vs38, vs6,vs9
  1946. xvmaddasp vs39, vs7,vs9
  1947. xxpermdi vs27, vs26, vs26,2
  1948. xvmaddasp vs40, vs4,vs10
  1949. xvmaddasp vs41, vs5,vs10
  1950. xvmaddasp vs42, vs6,vs10
  1951. xvmaddasp vs43, vs7,vs10
  1952. xvmaddasp vs44, vs4,vs11
  1953. xvmaddasp vs45, vs5,vs11
  1954. xvmaddasp vs46, vs6,vs11
  1955. xvmaddasp vs47, vs7,vs11
  1956. lxv vs8, DISP16(\Index,32+\OffsetB)(\BREG)
  1957. lxv vs4, DISP64(\Index,128+0+\OffsetA)(\AREG)
  1958. lxv vs5, DISP64(\Index,128+16+\OffsetA)(\AREG)
  1959. lxv vs6, DISP64(\Index,128+32+\OffsetA)(\AREG)
  1960. lxv vs7, DISP64(\Index,128+48+\OffsetA)(\AREG)
  1961. xxperm vs10, vs8, permute_mask
  1962. xxpermdi vs9, vs8, vs8,2
  1963. xvmaddasp vs32, vs0,vs24
  1964. xvmaddasp vs33, vs1,vs24
  1965. xvmaddasp vs34, vs2,vs24
  1966. xvmaddasp vs35, vs3,vs24
  1967. xvmaddasp vs36, vs0,vs25
  1968. xvmaddasp vs37, vs1,vs25
  1969. xvmaddasp vs38, vs2,vs25
  1970. xvmaddasp vs39, vs3,vs25
  1971. xxpermdi vs11, vs10, vs10,2
  1972. xvmaddasp vs40, vs0,vs26
  1973. xvmaddasp vs41, vs1,vs26
  1974. xvmaddasp vs42, vs2,vs26
  1975. xvmaddasp vs43, vs3,vs26
  1976. xvmaddasp vs44, vs0,vs27
  1977. xvmaddasp vs45, vs1,vs27
  1978. xvmaddasp vs46, vs2,vs27
  1979. xvmaddasp vs47, vs3,vs27
  1980. .if \Complete==0
  1981. lxv vs24, DISP16(\Index,48+\OffsetB)(\BREG)
  1982. lxv vs0, DISP64(\Index,192+\OffsetA)(\AREG)
  1983. lxv vs1, DISP64(\Index,192+16+\OffsetA)(\AREG)
  1984. lxv vs2, DISP64(\Index,192+32+\OffsetA)(\AREG)
  1985. lxv vs3, DISP64(\Index,192+48+\OffsetA)(\AREG)
  1986. xxperm vs26, vs24, permute_mask
  1987. xxpermdi vs25, vs24, vs24,2
  1988. .endif
  1989. .if \IsLast==1
  1990. .if \Complete==1
  1991. addi \BREG, \BREG, DISP16(\Index,16*3+\OffsetB)
  1992. addi \AREG, \AREG, DISP64(\Index,64*3+\OffsetA)
  1993. .else
  1994. addi \BREG, \BREG, DISP16(\Index,64)
  1995. addi \AREG, \AREG, DISP64(\Index,256)
  1996. .endif
  1997. .endif
  1998. xvmaddasp vs32, vs4,vs8
  1999. xvmaddasp vs33, vs5,vs8
  2000. xvmaddasp vs34, vs6,vs8
  2001. xvmaddasp vs35, vs7,vs8
  2002. xvmaddasp vs36, vs4,vs9
  2003. xvmaddasp vs37, vs5,vs9
  2004. xvmaddasp vs38, vs6,vs9
  2005. xvmaddasp vs39, vs7,vs9
  2006. .if \Complete==0
  2007. xxpermdi vs27, vs26, vs26,2
  2008. .endif
  2009. xvmaddasp vs40, vs4,vs10
  2010. xvmaddasp vs41, vs5,vs10
  2011. xvmaddasp vs42, vs6,vs10
  2012. xvmaddasp vs43, vs7,vs10
  2013. xvmaddasp vs44, vs4,vs11
  2014. xvmaddasp vs45, vs5,vs11
  2015. xvmaddasp vs46, vs6,vs11
  2016. xvmaddasp vs47, vs7,vs11
  2017. .endm
  2018. .macro KERNEL4x16 First
  2019. LOAD4x16 0
  2020. END4x16 \First, AO, BO, 64,16
  2021. .endm
  2022. .macro KERNEL4x16_L1_L2_I AREG,BREG,First,OffsetA,OffsetB, Index,IsLast ,Complete
  2023. lxv vs8, DISP8(\Index, 0+\OffsetB)(\BREG)
  2024. lxv vs4, DISP32(\Index, 0+\OffsetA)(\AREG)
  2025. lxv vs5, DISP32(\Index,16+\OffsetA)(\AREG)
  2026. lxv vs6, DISP32(\Index,32+\OffsetA)(\AREG)
  2027. lxv vs7, DISP32(\Index,48+\OffsetA)(\AREG)
  2028. xxperm vs10, vs8, permute_mask
  2029. xxpermdi vs9, vs8, vs8,2
  2030. .if \First==1
  2031. xvmulsp vs32, vs0,vs24
  2032. xvmulsp vs33, vs1,vs24
  2033. xvmulsp vs34, vs2,vs24
  2034. xvmulsp vs35, vs3,vs24
  2035. xvmulsp vs36, vs0,vs25
  2036. xvmulsp vs37, vs1,vs25
  2037. xvmulsp vs38, vs2,vs25
  2038. xvmulsp vs39, vs3,vs25
  2039. .else
  2040. xvmaddasp vs32, vs0,vs24
  2041. xvmaddasp vs33, vs1,vs24
  2042. xvmaddasp vs34, vs2,vs24
  2043. xvmaddasp vs35, vs3,vs24
  2044. xvmaddasp vs36, vs0,vs25
  2045. xvmaddasp vs37, vs1,vs25
  2046. xvmaddasp vs38, vs2,vs25
  2047. xvmaddasp vs39, vs3,vs25
  2048. .endif
  2049. xxpermdi vs11, vs10, vs10,2
  2050. .if \First==1
  2051. xvmulsp vs40, vs0,vs26
  2052. xvmulsp vs41, vs1,vs26
  2053. xvmulsp vs42, vs2,vs26
  2054. xvmulsp vs43, vs3,vs26
  2055. xvmulsp vs44, vs0,vs27
  2056. xvmulsp vs45, vs1,vs27
  2057. xvmulsp vs46, vs2,vs27
  2058. xvmulsp vs47, vs3,vs27
  2059. .else
  2060. xvmaddasp vs40, vs0,vs26
  2061. xvmaddasp vs41, vs1,vs26
  2062. xvmaddasp vs42, vs2,vs26
  2063. xvmaddasp vs43, vs3,vs26
  2064. xvmaddasp vs44, vs0,vs27
  2065. xvmaddasp vs45, vs1,vs27
  2066. xvmaddasp vs46, vs2,vs27
  2067. xvmaddasp vs47, vs3,vs27
  2068. .endif
  2069. .if \Complete==0
  2070. lxv vs24, DISP8(\Index,16+\OffsetB)(\BREG)
  2071. lxv vs0, DISP32(\Index,64+\OffsetA)(\AREG)
  2072. lxv vs1, DISP32(\Index,64+16+\OffsetA)(\AREG)
  2073. lxv vs2, DISP32(\Index,64+32+\OffsetA)(\AREG)
  2074. lxv vs3, DISP32(\Index,64+48+\OffsetA)(\AREG)
  2075. xxperm vs26, vs24, permute_mask
  2076. xxpermdi vs25, vs24, vs24,2
  2077. .endif
  2078. .if \IsLast==1
  2079. .if \Complete==1
  2080. addi \BREG, \BREG, DISP8(\Index,16+\OffsetB)
  2081. addi \AREG, \AREG, DISP32(\Index,64+\OffsetA)
  2082. .else
  2083. addi \BREG, \BREG, DISP8(\Index,32)
  2084. addi \AREG, \AREG, DISP32(\Index,128)
  2085. .endif
  2086. .endif
  2087. .if \First==1
  2088. xvmulsp vs32, vs4,vs8
  2089. xvmulsp vs33, vs5,vs8
  2090. xvmulsp vs34, vs6,vs8
  2091. xvmulsp vs35, vs7,vs8
  2092. xvmulsp vs36, vs4,vs9
  2093. xvmulsp vs37, vs5,vs9
  2094. xvmulsp vs38, vs6,vs9
  2095. xvmulsp vs39, vs7,vs9
  2096. .else
  2097. xvmaddasp vs32, vs4,vs8
  2098. xvmaddasp vs33, vs5,vs8
  2099. xvmaddasp vs34, vs6,vs8
  2100. xvmaddasp vs35, vs7,vs8
  2101. xvmaddasp vs36, vs4,vs9
  2102. xvmaddasp vs37, vs5,vs9
  2103. xvmaddasp vs38, vs6,vs9
  2104. xvmaddasp vs39, vs7,vs9
  2105. .endif
  2106. .if \Complete==0
  2107. xxpermdi vs27, vs26, vs26,2
  2108. .endif
  2109. .if \First==1
  2110. xvmulsp vs40, vs4,vs10
  2111. xvmulsp vs41, vs5,vs10
  2112. xvmulsp vs42, vs6,vs10
  2113. xvmulsp vs43, vs7,vs10
  2114. xvmulsp vs44, vs4,vs11
  2115. xvmulsp vs45, vs5,vs11
  2116. xvmulsp vs46, vs6,vs11
  2117. xvmulsp vs47, vs7,vs11
  2118. .else
  2119. xvmaddasp vs40, vs4,vs10
  2120. xvmaddasp vs41, vs5,vs10
  2121. xvmaddasp vs42, vs6,vs10
  2122. xvmaddasp vs43, vs7,vs10
  2123. xvmaddasp vs44, vs4,vs11
  2124. xvmaddasp vs45, vs5,vs11
  2125. xvmaddasp vs46, vs6,vs11
  2126. xvmaddasp vs47, vs7,vs11
  2127. .endif
  2128. .endm
  2129. .macro SAVE4x16
  2130. slwi T10, LDC , 1
  2131. add T1, CO, LDC
  2132. add T2, CO, T10
  2133. add T3, T1, T10
  2134. xxmrglw vs8, vs32, vs44
  2135. xxmrglw vs10, vs36, vs40
  2136. xxmrghw vs1, vs32, vs44
  2137. xxmrghw vs0, vs36, vs40
  2138. xxmrglw vs12, vs33, vs45
  2139. xxmrglw vs14, vs37, vs41
  2140. xxmrghw vs2, vs37, vs41
  2141. xxmrghw vs3, vs33, vs45
  2142. xxmrglw vs16, vs34, vs46
  2143. xxmrglw vs18, vs38, vs42
  2144. xxlor vs9, vs8, vs8
  2145. xxlor vs11, vs10, vs10
  2146. xxmrghw vs4, vs38, vs42
  2147. xxmrghw vs5, vs34, vs46
  2148. xxlor vs13, vs12, vs12
  2149. xxlor vs15, vs14, vs14
  2150. xxmrglw vs24, vs35, vs47
  2151. xxmrglw vs26, vs39, vs43
  2152. xxlor vs17, vs16, vs16
  2153. xxlor vs19, vs18, vs18
  2154. xxmrghw vs30, vs39, vs43
  2155. xxmrghw vs31, vs35, vs47
  2156. xxperm vs8, vs0, save_permute_1
  2157. xxperm vs10, vs1, save_permute_1
  2158. xxperm vs9, vs0, save_permute_2
  2159. xxperm vs11, vs1, save_permute_2
  2160. #ifndef TRMMKERNEL
  2161. lxv vs32, 0(CO)
  2162. lxv vs33, 16(CO)
  2163. lxv vs34, 32(CO)
  2164. lxv vs35, 48(CO)
  2165. #endif
  2166. xxlor vs25, vs24, vs24
  2167. xxlor vs27, vs26, vs26
  2168. #ifndef TRMMKERNEL
  2169. lxv vs36, 0(T1)
  2170. lxv vs37, 16(T1)
  2171. lxv vs38, 32(T1)
  2172. lxv vs39, 48(T1)
  2173. #endif
  2174. #ifndef TRMMKERNEL
  2175. lxv vs40, 0(T2)
  2176. lxv vs41, 16(T2)
  2177. lxv vs42, 32(T2)
  2178. lxv vs43, 48(T2)
  2179. #endif
  2180. #ifndef TRMMKERNEL
  2181. lxv vs44, 0(T3)
  2182. lxv vs45, 16(T3)
  2183. lxv vs46, 32(T3)
  2184. lxv vs47, 48(T3)
  2185. #endif
  2186. xxperm vs12, vs2, save_permute_1
  2187. xxperm vs14, vs3, save_permute_1
  2188. xxperm vs13, vs2, save_permute_2
  2189. xxperm vs15, vs3, save_permute_2
  2190. xxperm vs16, vs4, save_permute_1
  2191. xxperm vs18, vs5, save_permute_1
  2192. xxperm vs17, vs4, save_permute_2
  2193. xxperm vs19, vs5, save_permute_2
  2194. xxperm vs24, vs30, save_permute_1
  2195. xxperm vs26, vs31, save_permute_1
  2196. xxperm vs25, vs30, save_permute_2
  2197. xxperm vs27, vs31, save_permute_2
  2198. /* multiply add normal way */
  2199. #ifdef TRMMKERNEL
  2200. xvmulsp vs32, vs8, alpha_r
  2201. xvmulsp vs33, vs12, alpha_r
  2202. xvmulsp vs34, vs16, alpha_r
  2203. xvmulsp vs35, vs24, alpha_r
  2204. xvmulsp vs36, vs9, alpha_r
  2205. xvmulsp vs37, vs13, alpha_r
  2206. xvmulsp vs38, vs17, alpha_r
  2207. xvmulsp vs39, vs25, alpha_r
  2208. #else
  2209. xvmaddasp vs32, vs8, alpha_r
  2210. xvmaddasp vs33, vs12, alpha_r
  2211. xvmaddasp vs34, vs16, alpha_r
  2212. xvmaddasp vs35, vs24, alpha_r
  2213. xvmaddasp vs36, vs9, alpha_r
  2214. xvmaddasp vs37, vs13, alpha_r
  2215. xvmaddasp vs38, vs17, alpha_r
  2216. xvmaddasp vs39, vs25, alpha_r
  2217. #endif
  2218. #ifdef TRMMKERNEL
  2219. xvmulsp vs40, vs10, alpha_r
  2220. xvmulsp vs41, vs14, alpha_r
  2221. xvmulsp vs42, vs18, alpha_r
  2222. xvmulsp vs43, vs26, alpha_r
  2223. xvmulsp vs44, vs11, alpha_r
  2224. xvmulsp vs45, vs15, alpha_r
  2225. xvmulsp vs46, vs19, alpha_r
  2226. xvmulsp vs47, vs27, alpha_r
  2227. #else
  2228. xvmaddasp vs40, vs10, alpha_r
  2229. xvmaddasp vs41, vs14, alpha_r
  2230. xvmaddasp vs42, vs18, alpha_r
  2231. xvmaddasp vs43, vs26, alpha_r
  2232. xvmaddasp vs44, vs11, alpha_r
  2233. xvmaddasp vs45, vs15, alpha_r
  2234. xvmaddasp vs46, vs19, alpha_r
  2235. xvmaddasp vs47, vs27, alpha_r
  2236. #endif
  2237. stxv vs32, 0(CO)
  2238. stxv vs33, 16(CO)
  2239. stxv vs34, 32(CO)
  2240. stxv vs35, 48(CO)
  2241. stxv vs36, 0(T1)
  2242. stxv vs37, 16(T1)
  2243. stxv vs38, 32(T1)
  2244. stxv vs39, 48(T1)
  2245. stxv vs40, 0(T2)
  2246. stxv vs41, 16(T2)
  2247. stxv vs42, 32(T2)
  2248. stxv vs43, 48(T2)
  2249. stxv vs44, 0(T3)
  2250. stxv vs45, 16(T3)
  2251. stxv vs46, 32(T3)
  2252. stxv vs47, 48(T3)
  2253. addi CO,CO,64
  2254. .endm
  2255. /**********************************************************************************************
  2256. * Macros for N=4 and M=8
  2257. **********************************************************************************************/
  2258. .macro LOAD4x8_1
  2259. LOAD4x8 1
  2260. .endm
  2261. .macro LOAD4x8_0
  2262. LOAD4x8 0
  2263. .endm
  2264. .macro KERNEL4x8_L1_L4 Index,IsLast
  2265. KERNEL4x8_L1_L4_I AO,BO, 0,0, \Index,\IsLast,0
  2266. .endm
  2267. .macro KERNEL4x8_I1_L4 OffsetA,OffsetB, Index,IsLast
  2268. KERNEL4x8_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,0
  2269. .endm
  2270. .macro KERNEL4x8_I1_L4_2 OffsetA,OffsetB, Index,IsLast
  2271. KERNEL4x8_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,0
  2272. .endm
  2273. .macro KERNEL4x8_I1_L4_3 OffsetA,OffsetB, Index,IsLast
  2274. KERNEL4x8_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,1
  2275. .endm
  2276. .macro KERNEL4x8_I1_L2_3 OffsetA,OffsetB, Index,IsLast
  2277. KERNEL4x8_L1_L2_I AO,BO,0, \OffsetA,\OffsetB,\Index,\IsLast,1
  2278. .endm
  2279. .macro KERNEL4x8_I2_L4_2 AREG,BREG,OffsetA,OffsetB, Index,IsLast
  2280. KERNEL4x8_L1_L4_I \AREG,\BREG, \OffsetA,\OffsetB,\Index,\IsLast,0
  2281. .endm
  2282. .macro KERNEL4x8_I2_L4_3 AREG,BREG,OffsetA,OffsetB, Index,IsLast
  2283. KERNEL4x8_L1_L4_I \AREG,\BREG, \OffsetA,\OffsetB,\Index,\IsLast,1
  2284. .endm
  2285. .macro END4x8_NORMAL
  2286. END4x8 0, AO, BO, 32,16
  2287. .endm
  2288. .macro Zero4X8
  2289. xxlxor vs32, vs32, vs32
  2290. xxlxor vs33, vs33, vs33
  2291. xxlxor vs36, vs36, vs36
  2292. xxlxor vs37, vs37, vs37
  2293. xxlxor vs40, vs40, vs40
  2294. xxlxor vs41, vs41, vs41
  2295. xxlxor vs44, vs44, vs44
  2296. xxlxor vs45, vs45, vs45
  2297. .endm
  2298. .macro LOAD4x8 Zero
  2299. lxv vs24, 0(BO)
  2300. lxv vs0, 0(AO)
  2301. lxv vs1, 16(AO)
  2302. xxperm vs26, vs24, permute_mask
  2303. xxpermdi vs25, vs24, vs24,2
  2304. xxpermdi vs27, vs26, vs26,2
  2305. .if \Zero==1
  2306. xxlxor vs32, vs32, vs32
  2307. xxlxor vs33, vs33, vs33
  2308. xxlxor vs36, vs36, vs36
  2309. xxlxor vs37, vs37, vs37
  2310. xxlxor vs40, vs40, vs40
  2311. xxlxor vs41, vs41, vs41
  2312. xxlxor vs44, vs44, vs44
  2313. xxlxor vs45, vs45, vs45
  2314. .endif
  2315. .endm
  2316. .macro END4x8 First, AREG, BREG, OffsetA, OffsetB
  2317. .if \OffsetB != 0
  2318. addi \BREG, \BREG, \OffsetB
  2319. .endif
  2320. .if \OffsetA != 0
  2321. addi \AREG, \AREG, \OffsetA
  2322. .endif
  2323. .if \First==1
  2324. xvmulsp vs32, vs0,vs24
  2325. xvmulsp vs33, vs1,vs24
  2326. xvmulsp vs36, vs0,vs25
  2327. xvmulsp vs37, vs1,vs25
  2328. xvmulsp vs40, vs0,vs26
  2329. xvmulsp vs41, vs1,vs26
  2330. xvmulsp vs44, vs0,vs27
  2331. xvmulsp vs45, vs1,vs27
  2332. .else
  2333. xvmaddasp vs32, vs0,vs24
  2334. xvmaddasp vs33, vs1,vs24
  2335. xvmaddasp vs36, vs0,vs25
  2336. xvmaddasp vs37, vs1,vs25
  2337. xvmaddasp vs40, vs0,vs26
  2338. xvmaddasp vs41, vs1,vs26
  2339. xvmaddasp vs44, vs0,vs27
  2340. xvmaddasp vs45, vs1,vs27
  2341. .endif
  2342. .endm
  2343. .macro KERNEL4x8_L1_L4_I AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  2344. lxv vs8, DISP16(\Index, 0+\OffsetB)(\BREG)
  2345. lxv vs4, DISP32(\Index, 0+\OffsetA)(\AREG)
  2346. lxv vs5, DISP32(\Index,16+\OffsetA)(\AREG)
  2347. xxperm vs10, vs8, permute_mask
  2348. xxpermdi vs9, vs8, vs8,2
  2349. xvmaddasp vs32, vs0,vs24
  2350. xvmaddasp vs33, vs1,vs24
  2351. xvmaddasp vs36, vs0,vs25
  2352. xvmaddasp vs37, vs1,vs25
  2353. xxpermdi vs11, vs10, vs10,2
  2354. xvmaddasp vs40, vs0,vs26
  2355. xvmaddasp vs41, vs1,vs26
  2356. xvmaddasp vs44, vs0,vs27
  2357. xvmaddasp vs45, vs1,vs27
  2358. lxv vs24, DISP16(\Index,16+\OffsetB)(\BREG)
  2359. lxv vs0, DISP32(\Index,32+\OffsetA)(\AREG)
  2360. lxv vs1, DISP32(\Index,32+16+\OffsetA)(\AREG)
  2361. xxperm vs26, vs24, permute_mask
  2362. xxpermdi vs25, vs24, vs24,2
  2363. xvmaddasp vs32, vs4,vs8
  2364. xvmaddasp vs33, vs5,vs8
  2365. xvmaddasp vs36, vs4,vs9
  2366. xvmaddasp vs37, vs5,vs9
  2367. xxpermdi vs27, vs26, vs26,2
  2368. xvmaddasp vs40, vs4,vs10
  2369. xvmaddasp vs41, vs5,vs10
  2370. xvmaddasp vs44, vs4,vs11
  2371. xvmaddasp vs45, vs5,vs11
  2372. lxv vs8, DISP16(\Index,32+\OffsetB)(\BREG)
  2373. lxv vs4, DISP32(\Index,64+0+\OffsetA)(\AREG)
  2374. lxv vs5, DISP32(\Index,64+16+\OffsetA)(\AREG)
  2375. xxperm vs10, vs8, permute_mask
  2376. xxpermdi vs9, vs8, vs8,2
  2377. xvmaddasp vs32, vs0,vs24
  2378. xvmaddasp vs33, vs1,vs24
  2379. xvmaddasp vs36, vs0,vs25
  2380. xvmaddasp vs37, vs1,vs25
  2381. xxpermdi vs11, vs10, vs10,2
  2382. xvmaddasp vs40, vs0,vs26
  2383. xvmaddasp vs41, vs1,vs26
  2384. xvmaddasp vs44, vs0,vs27
  2385. xvmaddasp vs45, vs1,vs27
  2386. .if \Complete==0
  2387. lxv vs24, DISP16(\Index,48+\OffsetB)(\BREG)
  2388. lxv vs0, DISP32(\Index,96+\OffsetA)(\AREG)
  2389. lxv vs1, DISP32(\Index,96+16+\OffsetA)(\AREG)
  2390. xxperm vs26, vs24, permute_mask
  2391. xxpermdi vs25, vs24, vs24,2
  2392. .endif
  2393. .if \IsLast==1
  2394. .if \Complete==1
  2395. addi \BREG, \BREG, DISP16(\Index,16*3+\OffsetB)
  2396. addi \AREG, \AREG, DISP32(\Index,32*3+\OffsetA)
  2397. .else
  2398. addi \BREG, \BREG, DISP16(\Index,64)
  2399. addi \AREG, \AREG, DISP32(\Index,128)
  2400. .endif
  2401. .endif
  2402. xvmaddasp vs32, vs4,vs8
  2403. xvmaddasp vs33, vs5,vs8
  2404. xvmaddasp vs36, vs4,vs9
  2405. xvmaddasp vs37, vs5,vs9
  2406. .if \Complete==0
  2407. xxpermdi vs27, vs26, vs26,2
  2408. .endif
  2409. xvmaddasp vs40, vs4,vs10
  2410. xvmaddasp vs41, vs5,vs10
  2411. xvmaddasp vs44, vs4,vs11
  2412. xvmaddasp vs45, vs5,vs11
  2413. .endm
  2414. .macro KERNEL4x8 First
  2415. LOAD4x8 0
  2416. END4x8 \First, AO, BO, 32,16
  2417. .endm
  2418. .macro KERNEL4x8_L1_L2_I AREG,BREG,First,OffsetA,OffsetB, Index,IsLast ,Complete
  2419. lxv vs8, DISP8(\Index, 0+\OffsetB)(\BREG)
  2420. lxv vs4, DISP16(\Index, 0+\OffsetA)(\AREG)
  2421. lxv vs5, DISP16(\Index,16+\OffsetA)(\AREG)
  2422. xxperm vs10, vs8, permute_mask
  2423. xxpermdi vs9, vs8, vs8,2
  2424. .if \First==1
  2425. xvmulsp vs32, vs0,vs24
  2426. xvmulsp vs33, vs1,vs24
  2427. xvmulsp vs36, vs0,vs25
  2428. xvmulsp vs37, vs1,vs25
  2429. .else
  2430. xvmaddasp vs32, vs0,vs24
  2431. xvmaddasp vs33, vs1,vs24
  2432. xvmaddasp vs36, vs0,vs25
  2433. xvmaddasp vs37, vs1,vs25
  2434. .endif
  2435. xxpermdi vs11, vs10, vs10,2
  2436. .if \First==1
  2437. xvmulsp vs40, vs0,vs26
  2438. xvmulsp vs41, vs1,vs26
  2439. xvmulsp vs44, vs0,vs27
  2440. xvmulsp vs45, vs1,vs27
  2441. .else
  2442. xvmaddasp vs40, vs0,vs26
  2443. xvmaddasp vs41, vs1,vs26
  2444. xvmaddasp vs44, vs0,vs27
  2445. xvmaddasp vs45, vs1,vs27
  2446. .endif
  2447. .if \Complete==0
  2448. lxv vs24, DISP8(\Index,16+\OffsetB)(\BREG)
  2449. lxv vs0, DISP16(\Index,32+\OffsetA)(\AREG)
  2450. lxv vs1, DISP16(\Index,32+16+\OffsetA)(\AREG)
  2451. xxperm vs26, vs24, permute_mask
  2452. xxpermdi vs25, vs24, vs24,2
  2453. .endif
  2454. .if \IsLast==1
  2455. .if \Complete==1
  2456. addi \BREG, \BREG, DISP8(\Index,16+\OffsetB)
  2457. addi \AREG, \AREG, DISP16(\Index,32+\OffsetA)
  2458. .else
  2459. addi \BREG, \BREG, DISP8(\Index,32)
  2460. addi \AREG, \AREG, DISP16(\Index,64)
  2461. .endif
  2462. .endif
  2463. .if \First==1
  2464. xvmulsp vs32, vs4,vs8
  2465. xvmulsp vs33, vs5,vs8
  2466. xvmulsp vs36, vs4,vs9
  2467. xvmulsp vs37, vs5,vs9
  2468. .else
  2469. xvmaddasp vs32, vs4,vs8
  2470. xvmaddasp vs33, vs5,vs8
  2471. xvmaddasp vs36, vs4,vs9
  2472. xvmaddasp vs37, vs5,vs9
  2473. .endif
  2474. .if \Complete==0
  2475. xxpermdi vs27, vs26, vs26,2
  2476. .endif
  2477. .if \First==1
  2478. xvmulsp vs40, vs4,vs10
  2479. xvmulsp vs41, vs5,vs10
  2480. xvmulsp vs44, vs4,vs11
  2481. xvmulsp vs45, vs5,vs11
  2482. .else
  2483. xvmaddasp vs40, vs4,vs10
  2484. xvmaddasp vs41, vs5,vs10
  2485. xvmaddasp vs44, vs4,vs11
  2486. xvmaddasp vs45, vs5,vs11
  2487. .endif
  2488. .endm
  2489. .macro SAVE4x8
  2490. slwi T10, LDC , 1
  2491. add T1, CO, LDC
  2492. add T2, CO, T10
  2493. add T3, T1, T10
  2494. #ifndef TRMMKERNEL
  2495. lxv vs34, 0(CO)
  2496. lxv vs35, 16(CO)
  2497. lxv vs38, 0(T1)
  2498. lxv vs39, 16(T1)
  2499. lxv vs42, 0(T2)
  2500. lxv vs43, 16(T2)
  2501. lxv vs46, 0(T3)
  2502. lxv vs47, 16(T3)
  2503. #endif
  2504. xxmrglw vs8, vs32, vs44
  2505. xxmrglw vs10, vs36, vs40
  2506. xxmrghw vs1, vs32, vs44
  2507. xxmrghw vs0, vs36, vs40
  2508. xxmrglw vs12, vs33, vs45
  2509. xxmrglw vs14, vs37, vs41
  2510. xxmrghw vs2, vs37, vs41
  2511. xxmrghw vs3, vs33, vs45
  2512. xxlor vs9, vs8, vs8
  2513. xxlor vs11, vs10, vs10
  2514. xxlor vs13, vs12, vs12
  2515. xxlor vs15, vs14, vs14
  2516. xxperm vs8, vs0, save_permute_1
  2517. xxperm vs10, vs1, save_permute_1
  2518. xxperm vs9, vs0, save_permute_2
  2519. xxperm vs11, vs1, save_permute_2
  2520. xxperm vs12, vs2, save_permute_1
  2521. xxperm vs14, vs3, save_permute_1
  2522. xxperm vs13, vs2, save_permute_2
  2523. xxperm vs15, vs3, save_permute_2
  2524. /* multiply add normal way */
  2525. #ifdef TRMMKERNEL
  2526. xvmulsp vs34, vs8, alpha_r
  2527. xvmulsp vs35, vs12, alpha_r
  2528. xvmulsp vs38, vs9, alpha_r
  2529. xvmulsp vs39, vs13, alpha_r
  2530. xvmulsp vs42, vs10, alpha_r
  2531. xvmulsp vs43, vs14, alpha_r
  2532. xvmulsp vs46, vs11, alpha_r
  2533. xvmulsp vs47, vs15, alpha_r
  2534. #else
  2535. xvmaddasp vs34, vs8, alpha_r
  2536. xvmaddasp vs35, vs12, alpha_r
  2537. xvmaddasp vs38, vs9, alpha_r
  2538. xvmaddasp vs39, vs13, alpha_r
  2539. xvmaddasp vs42, vs10, alpha_r
  2540. xvmaddasp vs43, vs14, alpha_r
  2541. xvmaddasp vs46, vs11, alpha_r
  2542. xvmaddasp vs47, vs15, alpha_r
  2543. #endif
  2544. stxv vs34, 0(CO)
  2545. stxv vs35, 16(CO)
  2546. stxv vs38, 0(T1)
  2547. stxv vs39, 16(T1)
  2548. stxv vs42, 0(T2)
  2549. stxv vs43, 16(T2)
  2550. stxv vs46, 0(T3)
  2551. stxv vs47, 16(T3)
  2552. addi CO,CO,32
  2553. .endm
  2554. /**********************************************************************************************
  2555. * Macros for N=4 and M=4
  2556. **********************************************************************************************/
  2557. .macro LOAD4x4_1
  2558. LOAD4x4 1
  2559. .endm
  2560. .macro LOAD4x4_0
  2561. LOAD4x4 0
  2562. .endm
  2563. .macro KERNEL4x4_L1_L4 Index,IsLast
  2564. KERNEL4x4_L1_L4_I AO,BO, 0,0, \Index,\IsLast,0
  2565. .endm
  2566. .macro KERNEL4x4_I1_L4 OffsetA,OffsetB, Index,IsLast
  2567. KERNEL4x4_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,0
  2568. .endm
  2569. .macro KERNEL4x4_I1_L4_2 OffsetA,OffsetB, Index,IsLast
  2570. KERNEL4x4_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,0
  2571. .endm
  2572. .macro KERNEL4x4_I1_L4_3 OffsetA,OffsetB, Index,IsLast
  2573. KERNEL4x4_L1_L4_I AO,BO, \OffsetA,\OffsetB,\Index,\IsLast,1
  2574. .endm
  2575. .macro KERNEL4x4_I1_L2_3 OffsetA,OffsetB, Index,IsLast
  2576. KERNEL4x4_L1_L2_I AO,BO,0, \OffsetA,\OffsetB,\Index,\IsLast,1
  2577. .endm
  2578. .macro KERNEL4x4_I2_L4_2 AREG,BREG,OffsetA,OffsetB, Index,IsLast
  2579. KERNEL4x4_L1_L4_I \AREG,\BREG, \OffsetA,\OffsetB,\Index,\IsLast,0
  2580. .endm
  2581. .macro KERNEL4x4_I2_L4_3 AREG,BREG,OffsetA,OffsetB, Index,IsLast
  2582. KERNEL4x4_L1_L4_I \AREG,\BREG, \OffsetA,\OffsetB,\Index,\IsLast,1
  2583. .endm
  2584. .macro Zero4X4
  2585. xxlxor vs32, vs32, vs32
  2586. xxlxor vs33, vs33, vs33
  2587. xxlxor vs34, vs34, vs34
  2588. xxlxor vs35, vs35, vs35
  2589. .endm
  2590. .macro LOAD4x4 Zero
  2591. lxv vs0, 0(AO)
  2592. lxv vs24, 0(BO)
  2593. xxperm vs2, vs0, permute_mask
  2594. xxpermdi vs1, vs0, vs0,2
  2595. xxpermdi vs3, vs2, vs2,2
  2596. .if \Zero==1
  2597. xxlxor vs32, vs32, vs32
  2598. xxlxor vs33, vs33, vs33
  2599. xxlxor vs34, vs34, vs34
  2600. xxlxor vs35, vs35, vs35
  2601. .endif
  2602. .endm
  2603. .macro END4x4_NORMAL
  2604. END4x4 0, AO, BO, 16,16
  2605. .endm
  2606. .macro END4x4 First, AREG, BREG, OffsetA, OffsetB
  2607. .if \OffsetB != 0
  2608. addi \BREG, \BREG, \OffsetB
  2609. .endif
  2610. .if \OffsetA != 0
  2611. addi \AREG, \AREG, \OffsetA
  2612. .endif
  2613. .if \First==1
  2614. xvmulsp vs32, vs24, vs0
  2615. xvmulsp vs33, vs24, vs1
  2616. xvmulsp vs34, vs24, vs2
  2617. xvmulsp vs35, vs24, vs3
  2618. .else
  2619. xvmaddasp vs32, vs24, vs0
  2620. xvmaddasp vs33, vs24, vs1
  2621. xvmaddasp vs34, vs24, vs2
  2622. xvmaddasp vs35, vs24, vs3
  2623. .endif
  2624. .endm
  2625. .macro KERNEL4x4_L1_L4_I AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  2626. lxv vs4, DISP16(\Index, 0+\OffsetA)(\AREG)
  2627. lxv vs26, DISP16(\Index, 0+\OffsetB)(\BREG)
  2628. xxperm vs6, vs4, permute_mask
  2629. xxpermdi vs5, vs4, vs4,2
  2630. xxpermdi vs7, vs6, vs6,2
  2631. xvmaddasp vs32, vs24, vs0
  2632. xvmaddasp vs33, vs24, vs1
  2633. xvmaddasp vs34, vs24, vs2
  2634. xvmaddasp vs35, vs24, vs3
  2635. lxv vs0, DISP16(\Index, 16+\OffsetA)(\AREG)
  2636. lxv vs24, DISP16(\Index, 16+\OffsetB)(\BREG)
  2637. xxperm vs2, vs0, permute_mask
  2638. xxpermdi vs1, vs0, vs0,2
  2639. xxpermdi vs3, vs2, vs2,2
  2640. xvmaddasp vs32, vs26, vs4
  2641. xvmaddasp vs33, vs26, vs5
  2642. xvmaddasp vs34, vs26, vs6
  2643. xvmaddasp vs35, vs26, vs7
  2644. lxv vs4, DISP16(\Index, 32+\OffsetA)(\AREG)
  2645. lxv vs26, DISP16(\Index, 32+\OffsetB)(\BREG)
  2646. xxperm vs6, vs4, permute_mask
  2647. xxpermdi vs5, vs4, vs4,2
  2648. xxpermdi vs7, vs6, vs6,2
  2649. xvmaddasp vs32, vs24, vs0
  2650. xvmaddasp vs33, vs24, vs1
  2651. xvmaddasp vs34, vs24, vs2
  2652. xvmaddasp vs35, vs24, vs3
  2653. .if \Complete==0
  2654. lxv vs0, DISP16(\Index, 48+\OffsetA)(\AREG)
  2655. lxv vs24, DISP16(\Index, 48+\OffsetB)(\BREG)
  2656. xxperm vs2, vs0, permute_mask
  2657. xxpermdi vs1, vs0, vs0,2
  2658. xxpermdi vs3, vs2, vs2,2
  2659. .endif
  2660. xvmaddasp vs32, vs26, vs4
  2661. xvmaddasp vs33, vs26, vs5
  2662. xvmaddasp vs34, vs26, vs6
  2663. xvmaddasp vs35, vs26, vs7
  2664. .if \IsLast==1
  2665. .if \Complete==1
  2666. addi \AREG, \AREG, DISP16(\Index,16*3+\OffsetA)
  2667. addi \BREG, \BREG, DISP16(\Index,16*3+\OffsetB)
  2668. .else
  2669. addi \AREG, \AREG, DISP16(\Index,64)
  2670. addi \BREG, \BREG, DISP16(\Index,64)
  2671. .endif
  2672. .endif
  2673. .endm
  2674. .macro KERNEL4x4 First
  2675. LOAD4x4 0
  2676. END4x4 \First, AO, BO, 16,16
  2677. .endm
  2678. .macro KERNEL4x4_L1_L2_I AREG,BREG,First,OffsetA,OffsetB, Index,IsLast ,Complete
  2679. lxv vs4, DISP8(\Index, 0+\OffsetA)(\AREG)
  2680. lxv vs26, DISP8(\Index, 0+\OffsetB)(\BREG)
  2681. xxperm vs6, vs4, permute_mask
  2682. xxpermdi vs5, vs4, vs4,2
  2683. xxpermdi vs7, vs6, vs6,2
  2684. .if \First==1
  2685. xvmulsp vs32, vs24, vs0
  2686. xvmulsp vs33, vs24, vs1
  2687. xvmulsp vs34, vs24, vs2
  2688. xvmulsp vs35, vs24, vs3
  2689. .else
  2690. xvmaddasp vs32, vs24, vs0
  2691. xvmaddasp vs33, vs24, vs1
  2692. xvmaddasp vs34, vs24, vs2
  2693. xvmaddasp vs35, vs24, vs3
  2694. .endif
  2695. .if \Complete==0
  2696. lxv vs0, DISP8(\Index, 16+\OffsetA)(\AREG)
  2697. lxv vs24, DISP8(\Index, 16+\OffsetB)(\BREG)
  2698. xxperm vs2, vs0, permute_mask
  2699. xxpermdi vs1, vs0, vs0,2
  2700. xxpermdi vs3, vs2, vs2,2
  2701. .endif
  2702. .if \First==1
  2703. xvmulsp vs32, vs26, vs4
  2704. xvmulsp vs33, vs26, vs5
  2705. xvmulsp vs34, vs26, vs6
  2706. xvmulsp vs35, vs26, vs7
  2707. .else
  2708. xvmaddasp vs32, vs26, vs4
  2709. xvmaddasp vs33, vs26, vs5
  2710. xvmaddasp vs34, vs26, vs6
  2711. xvmaddasp vs35, vs26, vs7
  2712. .endif
  2713. .if \IsLast==1
  2714. .if \Complete==1
  2715. addi \AREG, \AREG, DISP8(\Index,16+\OffsetA)
  2716. addi \BREG, \BREG, DISP8(\Index,16+\OffsetB)
  2717. .else
  2718. addi \AREG, \AREG, DISP8(\Index,32)
  2719. addi \BREG, \BREG, DISP8(\Index,32)
  2720. .endif
  2721. .endif
  2722. .endm
  2723. .macro SAVE4x4
  2724. slwi T10, LDC , 1
  2725. add T1, CO, LDC
  2726. #if !defined(TRMMKERNEL)
  2727. lxv vs36, 0(CO)
  2728. lxv vs37, 0(T1)
  2729. #endif
  2730. add T2, CO, T10
  2731. add T3, T1, T10
  2732. #if !defined(TRMMKERNEL)
  2733. lxv vs38, 0(T2)
  2734. lxv vs39, 0(T3)
  2735. #endif
  2736. xxmrglw vs0, vs35,vs32
  2737. xxmrglw vs1, vs34,vs33
  2738. xxmrglw vs4, vs32,vs35
  2739. xxmrglw vs5, vs33,vs34
  2740. xxmrghw vs2, vs35,vs32
  2741. xxmrghw vs3, vs34,vs33
  2742. xxmrghw vs6, vs32,vs35
  2743. xxmrghw vs7, vs33,vs34
  2744. xxmrgld vs24, vs1, vs0
  2745. xxmrghd vs25,vs5,vs4
  2746. xxmrgld vs26, vs2, vs3
  2747. xxmrghd vs27,vs6,vs7
  2748. #if defined(TRMMKERNEL)
  2749. xvmulsp vs36, vs24, alpha_r
  2750. xvmulsp vs37, vs25, alpha_r
  2751. xvmulsp vs38, vs26, alpha_r
  2752. xvmulsp vs39, vs27, alpha_r
  2753. #else
  2754. xvmaddasp vs36, vs24, alpha_r
  2755. xvmaddasp vs37, vs25, alpha_r
  2756. xvmaddasp vs38, vs26, alpha_r
  2757. xvmaddasp vs39, vs27, alpha_r
  2758. #endif
  2759. stxv vs36, 0(CO)
  2760. stxv vs37, 0(T1)
  2761. stxv vs38, 0(T2)
  2762. stxv vs39, 0(T3)
  2763. addi CO,CO,16
  2764. .endm
  2765. /**********************************************************************************************
  2766. * Macros for N=4 and M=2
  2767. **********************************************************************************************/
  2768. .macro KERNEL4x2_2 OffsetA,OffsetB, Index,IsLast
  2769. KERNEL4x2_I_2 AO,BO, 0, \OffsetA,\OffsetB,\Index,\IsLast
  2770. .endm
  2771. .macro Zero4x2
  2772. xxlxor vs0, vs0, vs0
  2773. xxlxor vs2, vs2, vs2
  2774. .endm
  2775. .macro KERNEL4x2
  2776. KERNEL4x2_1 AO,BO, 0, 0,0,0
  2777. .endm
  2778. .macro KERNEL4x2_1 AREG,BREG,First,OffsetA,OffsetB,Index
  2779. lxsd v4, DISP2(\Index, 0+\OffsetA)(\AREG)
  2780. lxv vs26, DISP8(\Index, 0+\OffsetB)(\BREG)
  2781. xxspltw vs8, vs36, 0
  2782. xxspltw vs9, vs36, 1
  2783. .if \First==1
  2784. xvmulsp vs0, vs26, vs8
  2785. xvmulsp vs2, vs26, vs9
  2786. .else
  2787. xvmaddasp vs0, vs26, vs8
  2788. xvmaddasp vs2, vs26, vs9
  2789. .endif
  2790. addi \AREG, \AREG, DISP2(\Index,8)
  2791. addi \BREG, \BREG, DISP4(\Index,16)
  2792. .endm
  2793. .macro KERNEL4x2_I_2 AREG,BREG,First,OffsetA,OffsetB, Index,IsLast
  2794. lxv vs4, DISP4(\Index, 0+\OffsetA)(\AREG)
  2795. lxv vs26, DISP8(\Index, 0+\OffsetB)(\BREG)
  2796. lxv vs28, DISP8(\Index,16+\OffsetB)(\BREG)
  2797. xxspltw vs8, vs4, 2
  2798. xxspltw vs9, vs4, 3
  2799. xxspltw vs10, vs4, 0
  2800. xxspltw vs11, vs4, 1
  2801. .if \First==1
  2802. xvmulsp vs0, vs26, vs8
  2803. xvmulsp vs2, vs26, vs9
  2804. xvmulsp vs0, vs28, vs10
  2805. xvmulsp vs2, vs28, vs11
  2806. .else
  2807. xvmaddasp vs0, vs26, vs8
  2808. xvmaddasp vs2, vs26, vs9
  2809. xvmaddasp vs0, vs28, vs10
  2810. xvmaddasp vs2, vs28, vs11
  2811. .endif
  2812. .if \IsLast==1
  2813. addi \AREG, \AREG, DISP4(\Index,16)
  2814. addi \BREG, \BREG, DISP8(\Index,32)
  2815. .endif
  2816. .endm
  2817. .macro SAVE4x2
  2818. slwi T10, LDC , 1
  2819. add T1, CO, LDC
  2820. add T2, CO, T10
  2821. add T3, T1, T10
  2822. /*convert alpha_r for multiply*/
  2823. xscvspdp vs4,alpha_r
  2824. /* v0 corresponds to vs32, do not forget*/
  2825. #if !defined(TRMMKERNEL)
  2826. lxssp v0,0(CO)
  2827. lxssp v1,4(CO)
  2828. lxssp v2,0(T1)
  2829. lxssp v3,4(T1)
  2830. lxssp v4,0(T2)
  2831. lxssp v5,4(T2)
  2832. lxssp v6,0(T3)
  2833. lxssp v7,4(T3)
  2834. #endif
  2835. xscvspdp vs5, vs2
  2836. xxspltw vs6, vs2, 1
  2837. xxspltw vs7, vs2, 2
  2838. xxspltw vs8, vs2, 3
  2839. xscvspdp vs6,vs6
  2840. xscvspdp vs7,vs7
  2841. xscvspdp vs8,vs8
  2842. xscvspdp vs24, vs0
  2843. xxspltw vs25, vs0, 1
  2844. xxspltw vs26, vs0, 2
  2845. xxspltw vs27, vs0, 3
  2846. xscvspdp vs25,vs25
  2847. xscvspdp vs26,vs26
  2848. xscvspdp vs27,vs27
  2849. #if defined(TRMMKERNEL)
  2850. xsmuldp vs32,vs8, vs4
  2851. xsmuldp vs33,vs27, vs4
  2852. xsmuldp vs34,vs7, vs4
  2853. xsmuldp vs35,vs26, vs4
  2854. xsmuldp vs36,vs6, vs4
  2855. xsmuldp vs37,vs25, vs4
  2856. xsmuldp vs38,vs5, vs4
  2857. xsmuldp vs39,vs24, vs4
  2858. #else
  2859. xsmaddadp vs32,vs8, vs4
  2860. xsmaddadp vs33,vs27, vs4
  2861. xsmaddadp vs34,vs7, vs4
  2862. xsmaddadp vs35,vs26, vs4
  2863. xsmaddadp vs36,vs6, vs4
  2864. xsmaddadp vs37,vs25, vs4
  2865. xsmaddadp vs38,vs5, vs4
  2866. xsmaddadp vs39,vs24, vs4
  2867. #endif
  2868. stxssp v0,0(CO)
  2869. stxssp v1,4(CO)
  2870. stxssp v2,0(T1)
  2871. stxssp v3,4(T1)
  2872. stxssp v4,0(T2)
  2873. stxssp v5,4(T2)
  2874. stxssp v6,0(T3)
  2875. stxssp v7,4(T3)
  2876. addi CO,CO,8
  2877. .endm
  2878. /**********************************************************************************************
  2879. * Macros for N=4 and M=1
  2880. **********************************************************************************************/
  2881. .macro KERNEL4x1_4 OffsetA,OffsetB, Index,IsLast
  2882. KERNEL4x1_I_4 AO,BO, 0, \OffsetA,\OffsetB,\Index,\IsLast
  2883. .endm
  2884. .macro Zero4x1
  2885. xxlxor vs0, vs0, vs0
  2886. .endm
  2887. .macro KERNEL4x1
  2888. KERNEL4x1_1 AO,BO, 0
  2889. .endm
  2890. .macro KERNEL4x1_2
  2891. KERNEL4x1_2_1 AO,BO, 0
  2892. .endm
  2893. .macro KERNEL4x1_1 AREG,BREG,First
  2894. lxvwsx vs8, 0, \AREG
  2895. lxv vs26, 0(\BREG)
  2896. .if \First==1
  2897. xvmulsp vs0, vs26, vs8
  2898. .else
  2899. xvmaddasp vs0, vs26, vs8
  2900. .endif
  2901. addi \AREG, \AREG, 4
  2902. addi \BREG, \BREG, 16
  2903. .endm
  2904. .macro KERNEL4x1_2_1 AREG,BREG,First
  2905. lxsd v4, 0(\AREG)
  2906. lxv vs26, 0(\BREG)
  2907. lxv vs28, 16(\BREG)
  2908. xxspltw vs8, vs36, 1
  2909. xxspltw vs9, vs36, 0
  2910. .if \First==1
  2911. xvmulsp vs0, vs26, vs8
  2912. xvmulsp vs0, vs28, vs9
  2913. .else
  2914. xvmaddasp vs0, vs26, vs8
  2915. xvmaddasp vs0, vs28, vs9
  2916. .endif
  2917. addi \AREG, \AREG, 8
  2918. addi \BREG, \BREG, 32
  2919. .endm
  2920. .macro KERNEL4x1_I_4 AREG,BREG,First,OffsetA,OffsetB, Index,IsLast
  2921. lxv vs4, DISP4(\Index, 0+\OffsetA)(\AREG)
  2922. xxspltw vs8, vs4, 3
  2923. xxspltw vs9, vs4, 2
  2924. xxspltw vs10, vs4, 1
  2925. xxspltw vs11, vs4, 0
  2926. lxv vs26, DISP16(\Index, 0+\OffsetB)(\BREG)
  2927. lxv vs28, DISP16(\Index,16+\OffsetB)(\BREG)
  2928. lxv vs30, DISP16(\Index,32+\OffsetB)(\BREG)
  2929. lxv vs32, DISP16(\Index,48+\OffsetB)(\BREG)
  2930. .if \First==1
  2931. xvmulsp vs0, vs26, vs8
  2932. xvmulsp vs0, vs28, vs9
  2933. xvmulsp vs0, vs30, vs10
  2934. xvmulsp vs0, vs32, vs11
  2935. .else
  2936. xvmaddasp vs0, vs26, vs8
  2937. xvmaddasp vs0, vs28, vs9
  2938. xvmaddasp vs0, vs30, vs10
  2939. xvmaddasp vs0, vs32, vs11
  2940. .endif
  2941. .if \IsLast==1
  2942. addi \AREG, \AREG, DISP4(\Index,16)
  2943. addi \BREG, \BREG, DISP16(\Index,64)
  2944. .endif
  2945. .endm
  2946. .macro SAVE4x1
  2947. slwi T10, LDC , 1
  2948. add T1, CO, LDC
  2949. add T2, CO, T10
  2950. add T3, T1, T10
  2951. /*convert alpha_r for multiply*/
  2952. xscvspdp vs4,alpha_r
  2953. /* v0 corresponds to vs32, do not forget*/
  2954. #if !defined(TRMMKERNEL)
  2955. lxssp v0,0(CO)
  2956. lxssp v2,0(T1)
  2957. lxssp v4,0(T2)
  2958. lxssp v6,0(T3)
  2959. #endif
  2960. xscvspdp vs24, vs0
  2961. xxspltw vs25, vs0, 1
  2962. xxspltw vs26, vs0, 2
  2963. xxspltw vs27, vs0, 3
  2964. xscvspdp vs25,vs25
  2965. xscvspdp vs26,vs26
  2966. xscvspdp vs27,vs27
  2967. #if defined(TRMMKERNEL)
  2968. xsmuldp vs32,vs27, vs4
  2969. xsmuldp vs34,vs26, vs4
  2970. xsmuldp vs36,vs25, vs4
  2971. xsmuldp vs38,vs24, vs4
  2972. #else
  2973. xsmaddadp vs32,vs27, vs4
  2974. xsmaddadp vs34,vs26, vs4
  2975. xsmaddadp vs36,vs25, vs4
  2976. xsmaddadp vs38,vs24, vs4
  2977. #endif
  2978. stxssp v0,0(CO)
  2979. stxssp v2,0(T1)
  2980. stxssp v4,0(T2)
  2981. stxssp v6,0(T3)
  2982. addi CO,CO,4
  2983. .endm
  2984. /****************************N=2 section*****************/
  2985. .macro KERNEL2x16_2 OffsetA,OffsetB, Index,IsLast
  2986. KERNEL2x16_I_2 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  2987. .endm
  2988. .macro Zero2x16
  2989. xxlxor vs0, vs0, vs0
  2990. xxlxor vs1, vs1, vs1
  2991. xxlxor vs2, vs2, vs2
  2992. xxlxor vs3, vs3, vs3
  2993. xxlxor vs4, vs4, vs4
  2994. xxlxor vs5, vs5, vs5
  2995. xxlxor vs6, vs6, vs6
  2996. xxlxor vs7, vs7, vs7
  2997. .endm
  2998. .macro KERNEL2x16
  2999. KERNEL2x16_1 AO,BO, 0, 0,0,0
  3000. .endm
  3001. .macro KERNEL2x16_4 OffsetA,OffsetB, Index,IsLast
  3002. KERNEL2x16_I_4 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3003. .endm
  3004. .macro KERNEL2x16_1 AREG,BREG,First,OffsetA,OffsetB,Index
  3005. lxsd v4, DISP2(\Index, 0+\OffsetB)(\BREG)
  3006. xxspltw vs8, vs36, 1
  3007. xxspltw vs9, vs36, 0
  3008. lxv vs26, DISP16(\Index, 0+\OffsetA)(\AREG)
  3009. lxv vs27, DISP16(\Index,16+\OffsetA)(\AREG)
  3010. lxv vs28, DISP16(\Index, 32+\OffsetA)(\AREG)
  3011. lxv vs29, DISP16(\Index,48+\OffsetA)(\AREG)
  3012. .if \First==1
  3013. xvmulsp vs0, vs26, vs8
  3014. xvmulsp vs1, vs27, vs8
  3015. xvmulsp vs2, vs28, vs8
  3016. xvmulsp vs3, vs29, vs8
  3017. xvmulsp vs4, vs26, vs9
  3018. xvmulsp vs5, vs27, vs9
  3019. xvmulsp vs6, vs28, vs9
  3020. xvmulsp vs7, vs29, vs9
  3021. .else
  3022. xvmaddasp vs0, vs26, vs8
  3023. xvmaddasp vs1, vs27, vs8
  3024. xvmaddasp vs2, vs28, vs8
  3025. xvmaddasp vs3, vs29, vs8
  3026. xvmaddasp vs4, vs26, vs9
  3027. xvmaddasp vs5, vs27, vs9
  3028. xvmaddasp vs6, vs28, vs9
  3029. xvmaddasp vs7, vs29, vs9
  3030. .endif
  3031. addi \BREG, \BREG, DISP2(\Index,8)
  3032. addi \AREG, \AREG, DISP16(\Index,64)
  3033. .endm
  3034. .macro KERNEL2x16_I_4 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3035. lxv vs38, DISP8(\Index, 0+\OffsetB)(\BREG)
  3036. lxv vs39, DISP8(\Index, 16+\OffsetB)(\BREG)
  3037. lxv vs26, DISP64(\Index, 0+\OffsetA)(\AREG)
  3038. lxv vs27, DISP64(\Index,16+\OffsetA)(\AREG)
  3039. lxv vs28, DISP64(\Index,32+\OffsetA)(\AREG)
  3040. lxv vs29, DISP64(\Index,48+\OffsetA)(\AREG)
  3041. lxv vs16, DISP64(\Index,64+ 0+\OffsetA)(\AREG)
  3042. lxv vs17, DISP64(\Index,64+ 16+\OffsetA)(\AREG)
  3043. lxv vs18, DISP64(\Index,64+ 32+\OffsetA)(\AREG)
  3044. lxv vs19, DISP64(\Index,64+ 48+\OffsetA)(\AREG)
  3045. lxv vs30, DISP64(\Index,128+ 0+\OffsetA)(\AREG)
  3046. lxv vs31, DISP64(\Index,128+ 16+\OffsetA)(\AREG)
  3047. lxv vs32, DISP64(\Index,128+ 32+\OffsetA)(\AREG)
  3048. lxv vs33, DISP64(\Index,128+ 48+\OffsetA)(\AREG)
  3049. lxv vs34, DISP64(\Index,128+ 64+ 0+\OffsetA)(\AREG)
  3050. lxv vs35, DISP64(\Index,128+ 64+ 16+\OffsetA)(\AREG)
  3051. lxv vs36, DISP64(\Index,128+ 64+ 32+\OffsetA)(\AREG)
  3052. lxv vs37, DISP64(\Index,128+ 64+ 48+\OffsetA)(\AREG)
  3053. xxspltw vs8, vs38, 3
  3054. xxspltw vs9, vs38, 2
  3055. xxspltw vs10, vs38, 1
  3056. xxspltw vs11, vs38, 0
  3057. xxspltw vs12, vs39, 3
  3058. xxspltw vs13, vs39, 2
  3059. xxspltw vs14, vs39, 1
  3060. xxspltw vs15, vs39, 0
  3061. xvmaddasp vs0, vs26, vs8
  3062. xvmaddasp vs1, vs27, vs8
  3063. xvmaddasp vs2, vs28, vs8
  3064. xvmaddasp vs3, vs29, vs8
  3065. xvmaddasp vs4, vs26, vs9
  3066. xvmaddasp vs5, vs27, vs9
  3067. xvmaddasp vs6, vs28, vs9
  3068. xvmaddasp vs7, vs29, vs9
  3069. xvmaddasp vs0, vs16, vs10
  3070. xvmaddasp vs1, vs17, vs10
  3071. xvmaddasp vs2, vs18, vs10
  3072. xvmaddasp vs3, vs19, vs10
  3073. xvmaddasp vs4, vs16, vs11
  3074. xvmaddasp vs5, vs17, vs11
  3075. xvmaddasp vs6, vs18, vs11
  3076. xvmaddasp vs7, vs19, vs11
  3077. xvmaddasp vs0, vs30, vs12
  3078. xvmaddasp vs1, vs31, vs12
  3079. xvmaddasp vs2, vs32, vs12
  3080. xvmaddasp vs3, vs33, vs12
  3081. xvmaddasp vs4, vs30, vs13
  3082. xvmaddasp vs5, vs31, vs13
  3083. xvmaddasp vs6, vs32, vs13
  3084. xvmaddasp vs7, vs33, vs13
  3085. xvmaddasp vs0, vs34, vs14
  3086. xvmaddasp vs1, vs35, vs14
  3087. xvmaddasp vs2, vs36, vs14
  3088. xvmaddasp vs3, vs37, vs14
  3089. xvmaddasp vs4, vs34, vs15
  3090. xvmaddasp vs5, vs35, vs15
  3091. xvmaddasp vs6, vs36, vs15
  3092. xvmaddasp vs7, vs37, vs15
  3093. .if \IsLast==1
  3094. addi \BREG, \BREG, DISP8(\Index,32)
  3095. addi \AREG, \AREG, DISP64(\Index,256)
  3096. .endif
  3097. .endm
  3098. .macro KERNEL2x16_I_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3099. lxv vs36, DISP4(\Index, 0+\OffsetB)(\BREG)
  3100. xxspltw vs8, vs36, 3
  3101. xxspltw vs9, vs36, 2
  3102. xxspltw vs10, vs36, 1
  3103. xxspltw vs11, vs36, 0
  3104. lxv vs26, DISP32(\Index, 0+\OffsetA)(\AREG)
  3105. lxv vs27, DISP32(\Index,16+\OffsetA)(\AREG)
  3106. lxv vs28, DISP32(\Index,32+\OffsetA)(\AREG)
  3107. lxv vs29, DISP32(\Index,48+\OffsetA)(\AREG)
  3108. lxv vs16, DISP32(\Index,64+ 0+\OffsetA)(\AREG)
  3109. lxv vs17, DISP32(\Index,64+ 16+\OffsetA)(\AREG)
  3110. lxv vs18, DISP32(\Index,64+ 32+\OffsetA)(\AREG)
  3111. lxv vs19, DISP32(\Index,64+ 48+\OffsetA)(\AREG)
  3112. xvmaddasp vs0, vs26, vs8
  3113. xvmaddasp vs1, vs27, vs8
  3114. xvmaddasp vs2, vs28, vs8
  3115. xvmaddasp vs3, vs29, vs8
  3116. xvmaddasp vs4, vs26, vs9
  3117. xvmaddasp vs5, vs27, vs9
  3118. xvmaddasp vs6, vs28, vs9
  3119. xvmaddasp vs7, vs29, vs9
  3120. xvmaddasp vs0, vs16, vs10
  3121. xvmaddasp vs1, vs17, vs10
  3122. xvmaddasp vs2, vs18, vs10
  3123. xvmaddasp vs3, vs19, vs10
  3124. xvmaddasp vs4, vs16, vs11
  3125. xvmaddasp vs5, vs17, vs11
  3126. xvmaddasp vs6, vs18, vs11
  3127. xvmaddasp vs7, vs19, vs11
  3128. .if \IsLast==1
  3129. addi \BREG, \BREG, DISP4(\Index,16)
  3130. addi \AREG, \AREG, DISP32(\Index,128)
  3131. .endif
  3132. .endm
  3133. .macro SAVE2x16
  3134. #ifndef TRMMKERNEL
  3135. lxv vs16, 0(CO)
  3136. lxv vs17, 16(CO)
  3137. lxv vs18, 32(CO)
  3138. lxv vs19, 48(CO)
  3139. #endif
  3140. add T1, CO, LDC
  3141. #ifndef TRMMKERNEL
  3142. lxv vs26, 0(T1)
  3143. lxv vs27, 16(T1)
  3144. lxv vs28, 32(T1)
  3145. lxv vs29, 48(T1)
  3146. #endif
  3147. #if defined(TRMMKERNEL)
  3148. xvmulsp vs16, vs0, alpha_r
  3149. xvmulsp vs17, vs1, alpha_r
  3150. xvmulsp vs18, vs2, alpha_r
  3151. xvmulsp vs19, vs3, alpha_r
  3152. xvmulsp vs26, vs4, alpha_r
  3153. xvmulsp vs27, vs5, alpha_r
  3154. xvmulsp vs28, vs6, alpha_r
  3155. xvmulsp vs29, vs7, alpha_r
  3156. #else
  3157. xvmaddasp vs16, vs0, alpha_r
  3158. xvmaddasp vs17, vs1, alpha_r
  3159. xvmaddasp vs18, vs2, alpha_r
  3160. xvmaddasp vs19, vs3, alpha_r
  3161. xvmaddasp vs26, vs4, alpha_r
  3162. xvmaddasp vs27, vs5, alpha_r
  3163. xvmaddasp vs28, vs6, alpha_r
  3164. xvmaddasp vs29, vs7, alpha_r
  3165. #endif
  3166. stxv vs16, 0(CO)
  3167. stxv vs17, 16(CO)
  3168. stxv vs18, 32(CO)
  3169. stxv vs19, 48(CO)
  3170. stxv vs26, 0(T1)
  3171. stxv vs27, 16(T1)
  3172. stxv vs28, 32(T1)
  3173. stxv vs29, 48(T1)
  3174. addi CO,CO,64
  3175. .endm
  3176. /* M=8 N=2 */
  3177. .macro KERNEL2x8_2 OffsetA,OffsetB, Index,IsLast
  3178. KERNEL2x8_I_2 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3179. .endm
  3180. .macro Zero2x8
  3181. xxlxor vs0, vs0, vs0
  3182. xxlxor vs1, vs1, vs1
  3183. xxlxor vs4, vs4, vs4
  3184. xxlxor vs5, vs5, vs5
  3185. .endm
  3186. .macro KERNEL2x8
  3187. KERNEL2x8_1 AO,BO, 0, 0,0,0
  3188. .endm
  3189. .macro KERNEL2x8_4 OffsetA,OffsetB, Index,IsLast
  3190. KERNEL2x8_I_4 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3191. .endm
  3192. .macro KERNEL2x8_1 AREG,BREG,First,OffsetA,OffsetB,Index
  3193. lxsd v4, DISP2(\Index, 0+\OffsetB)(\BREG)
  3194. xxspltw vs8, vs36, 1
  3195. xxspltw vs9, vs36, 0
  3196. lxv vs26, DISP8(\Index, 0+\OffsetA)(\AREG)
  3197. lxv vs27, DISP8(\Index,16+\OffsetA)(\AREG)
  3198. .if \First==1
  3199. xvmulsp vs0, vs26, vs8
  3200. xvmulsp vs1, vs27, vs8
  3201. xvmulsp vs4, vs26, vs9
  3202. xvmulsp vs5, vs27, vs9
  3203. .else
  3204. xvmaddasp vs0, vs26, vs8
  3205. xvmaddasp vs1, vs27, vs8
  3206. xvmaddasp vs4, vs26, vs9
  3207. xvmaddasp vs5, vs27, vs9
  3208. .endif
  3209. addi \BREG, \BREG, DISP2(\Index,8)
  3210. addi \AREG, \AREG, DISP8(\Index,32)
  3211. .endm
  3212. .macro KERNEL2x8_I_4 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3213. lxv vs38, DISP8(\Index, 0+\OffsetB)(\BREG)
  3214. lxv vs39, DISP8(\Index, 16+\OffsetB)(\BREG)
  3215. lxv vs26, DISP32(\Index, 0+\OffsetA)(\AREG)
  3216. lxv vs27, DISP32(\Index,16+\OffsetA)(\AREG)
  3217. lxv vs16, DISP32(\Index,32+ 0+\OffsetA)(\AREG)
  3218. lxv vs17, DISP32(\Index,32+ 16+\OffsetA)(\AREG)
  3219. lxv vs30, DISP32(\Index,64+ 0+\OffsetA)(\AREG)
  3220. lxv vs31, DISP32(\Index,64+ 16+\OffsetA)(\AREG)
  3221. lxv vs34, DISP32(\Index, 96+ 0+\OffsetA)(\AREG)
  3222. lxv vs35, DISP32(\Index, 96+ 16+\OffsetA)(\AREG)
  3223. xxspltw vs8, vs38, 3
  3224. xxspltw vs9, vs38, 2
  3225. xxspltw vs10, vs38, 1
  3226. xxspltw vs11, vs38, 0
  3227. xxspltw vs12, vs39, 3
  3228. xxspltw vs13, vs39, 2
  3229. xxspltw vs14, vs39, 1
  3230. xxspltw vs15, vs39, 0
  3231. xvmaddasp vs0, vs26, vs8
  3232. xvmaddasp vs1, vs27, vs8
  3233. xvmaddasp vs4, vs26, vs9
  3234. xvmaddasp vs5, vs27, vs9
  3235. xvmaddasp vs0, vs16, vs10
  3236. xvmaddasp vs1, vs17, vs10
  3237. xvmaddasp vs4, vs16, vs11
  3238. xvmaddasp vs5, vs17, vs11
  3239. xvmaddasp vs0, vs30, vs12
  3240. xvmaddasp vs1, vs31, vs12
  3241. xvmaddasp vs4, vs30, vs13
  3242. xvmaddasp vs5, vs31, vs13
  3243. xvmaddasp vs0, vs34, vs14
  3244. xvmaddasp vs1, vs35, vs14
  3245. xvmaddasp vs4, vs34, vs15
  3246. xvmaddasp vs5, vs35, vs15
  3247. .if \IsLast==1
  3248. addi \BREG, \BREG, DISP8(\Index,32)
  3249. addi \AREG, \AREG, DISP32(\Index,128)
  3250. .endif
  3251. .endm
  3252. .macro KERNEL2x8_I_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3253. lxv vs36, DISP4(\Index, 0+\OffsetB)(\BREG)
  3254. xxspltw vs8, vs36, 3
  3255. xxspltw vs9, vs36, 2
  3256. xxspltw vs10, vs36, 1
  3257. xxspltw vs11, vs36, 0
  3258. lxv vs26, DISP16(\Index, 0+\OffsetA)(\AREG)
  3259. lxv vs27, DISP16(\Index,16+\OffsetA)(\AREG)
  3260. lxv vs16, DISP16(\Index,32+\OffsetA)(\AREG)
  3261. lxv vs17, DISP16(\Index,48+\OffsetA)(\AREG)
  3262. xvmaddasp vs0, vs26, vs8
  3263. xvmaddasp vs1, vs27, vs8
  3264. xvmaddasp vs4, vs26, vs9
  3265. xvmaddasp vs5, vs27, vs9
  3266. xvmaddasp vs0, vs16, vs10
  3267. xvmaddasp vs1, vs17, vs10
  3268. xvmaddasp vs4, vs16, vs11
  3269. xvmaddasp vs5, vs17, vs11
  3270. .if \IsLast==1
  3271. addi \BREG, \BREG, DISP4(\Index,16)
  3272. addi \AREG, \AREG, DISP16(\Index,64)
  3273. .endif
  3274. .endm
  3275. .macro SAVE2x8
  3276. #ifndef TRMMKERNEL
  3277. lxv vs16, 0(CO)
  3278. lxv vs17, 16(CO)
  3279. #endif
  3280. add T1, CO, LDC
  3281. #ifndef TRMMKERNEL
  3282. lxv vs26, 0(T1)
  3283. lxv vs27, 16(T1)
  3284. #endif
  3285. #if defined(TRMMKERNEL)
  3286. xvmulsp vs16, vs0, alpha_r
  3287. xvmulsp vs17, vs1, alpha_r
  3288. xvmulsp vs26, vs4, alpha_r
  3289. xvmulsp vs27, vs5, alpha_r
  3290. #else
  3291. xvmaddasp vs16, vs0, alpha_r
  3292. xvmaddasp vs17, vs1, alpha_r
  3293. xvmaddasp vs26, vs4, alpha_r
  3294. xvmaddasp vs27, vs5, alpha_r
  3295. #endif
  3296. stxv vs16, 0(CO)
  3297. stxv vs17, 16(CO)
  3298. stxv vs26, 0(T1)
  3299. stxv vs27, 16(T1)
  3300. addi CO,CO,32
  3301. .endm
  3302. /*M=4*/
  3303. .macro KERNEL2x4_2 OffsetA,OffsetB, Index,IsLast
  3304. KERNEL2x4_I_2 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3305. .endm
  3306. /* we will aggregate on save vs0 +vs4 vs11+vs5 */
  3307. .macro Zero2x4
  3308. xxlxor vs0, vs0, vs0
  3309. xxlxor vs1, vs1, vs1
  3310. xxlxor vs4, vs4, vs4
  3311. xxlxor vs5, vs5, vs5
  3312. .endm
  3313. .macro KERNEL2x4
  3314. KERNEL2x4_1 AO,BO, 0, 0,0,0
  3315. .endm
  3316. .macro KERNEL2x4_4 OffsetA,OffsetB, Index,IsLast
  3317. KERNEL2x4_I_4 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3318. .endm
  3319. .macro KERNEL2x4_1 AREG,BREG,First,OffsetA,OffsetB,Index
  3320. lxsd v4, DISP2(\Index, 0+\OffsetB)(\BREG)
  3321. xxspltw vs8, vs36, 1
  3322. xxspltw vs9, vs36, 0
  3323. lxv vs26, DISP4(\Index, 0+\OffsetA)(\AREG)
  3324. .if \First==1
  3325. xvmulsp vs0, vs26, vs8
  3326. xvmulsp vs1, vs26, vs9
  3327. .else
  3328. xvmaddasp vs0, vs26, vs8
  3329. xvmaddasp vs1, vs26, vs9
  3330. .endif
  3331. addi \BREG, \BREG, DISP2(\Index,8)
  3332. addi \AREG, \AREG, DISP4(\Index,16)
  3333. .endm
  3334. .macro KERNEL2x4_I_4 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3335. lxv vs38, DISP8(\Index, 0+\OffsetB)(\BREG)
  3336. lxv vs39, DISP8(\Index, 16+\OffsetB)(\BREG)
  3337. lxv vs26, DISP16(\Index, 0+\OffsetA)(\AREG)
  3338. lxv vs16, DISP16(\Index,16+\OffsetA)(\AREG)
  3339. lxv vs30, DISP16(\Index,32+ 0+\OffsetA)(\AREG)
  3340. lxv vs34, DISP16(\Index,32+ 16+\OffsetA)(\AREG)
  3341. xxspltw vs8, vs38, 3
  3342. xxspltw vs9, vs38, 2
  3343. xxspltw vs10, vs38, 1
  3344. xxspltw vs11, vs38, 0
  3345. xxspltw vs12, vs39, 3
  3346. xxspltw vs13, vs39, 2
  3347. xxspltw vs14, vs39, 1
  3348. xxspltw vs15, vs39, 0
  3349. xvmaddasp vs0, vs26, vs8
  3350. xvmaddasp vs1, vs26, vs9
  3351. xvmaddasp vs4, vs16, vs10
  3352. xvmaddasp vs5, vs16, vs11
  3353. xvmaddasp vs0, vs30, vs12
  3354. xvmaddasp vs1, vs30, vs13
  3355. xvmaddasp vs4, vs34, vs14
  3356. xvmaddasp vs5, vs34, vs15
  3357. .if \IsLast==1
  3358. addi \BREG, \BREG, DISP8(\Index,32)
  3359. addi \AREG, \AREG, DISP16(\Index,64)
  3360. .endif
  3361. .endm
  3362. .macro KERNEL2x4_I_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3363. lxv vs36, DISP4(\Index, 0+\OffsetB)(\BREG)
  3364. xxspltw vs8, vs36, 3
  3365. xxspltw vs9, vs36, 2
  3366. xxspltw vs10, vs36, 1
  3367. xxspltw vs11, vs36, 0
  3368. lxv vs26, DISP8(\Index, 0+\OffsetA)(\AREG)
  3369. lxv vs16, DISP8(\Index, 16+\OffsetA)(\AREG)
  3370. xvmaddasp vs0, vs26, vs8
  3371. xvmaddasp vs1, vs26, vs9
  3372. xvmaddasp vs4, vs16, vs10
  3373. xvmaddasp vs5, vs16, vs11
  3374. .if \IsLast==1
  3375. addi \BREG, \BREG, DISP4(\Index,16)
  3376. addi \AREG, \AREG, DISP8(\Index,32)
  3377. .endif
  3378. .endm
  3379. .macro SAVE2x4
  3380. #ifndef TRMMKERNEL
  3381. lxv vs16, 0(CO)
  3382. #endif
  3383. add T1, CO, LDC
  3384. #ifndef TRMMKERNEL
  3385. lxv vs26, 0(T1)
  3386. #endif
  3387. /*aggregate vectors*/
  3388. xvaddsp vs0,vs0,vs4
  3389. xvaddsp vs1,vs1,vs5
  3390. #if defined(TRMMKERNEL)
  3391. xvmulsp vs16, vs0, alpha_r
  3392. xvmulsp vs26, vs1, alpha_r
  3393. #else
  3394. xvmaddasp vs16, vs0, alpha_r
  3395. xvmaddasp vs26, vs1, alpha_r
  3396. #endif
  3397. stxv vs16, 0(CO)
  3398. stxv vs26, 0(T1)
  3399. addi CO,CO,16
  3400. .endm
  3401. /* M=2 N=2 we will have inner pemrute action before permute was revrsing 3,2,1,0 not iw 2ill inner reverse 1,0,3,2 */
  3402. .macro SWITCH_PERMUTE_INNER
  3403. xxpermdi permute_mask, permute_mask, permute_mask,2
  3404. .endm
  3405. .macro Zero2x2
  3406. xxlxor vs0, vs0, vs0
  3407. xxlxor vs1, vs1, vs1
  3408. SWITCH_PERMUTE_INNER
  3409. .endm
  3410. .macro KERNEL2x2
  3411. KERNEL2x2_1 AO,BO, 0, 0,0,0
  3412. .endm
  3413. .macro KERNEL2x2_4 OffsetA,OffsetB, Index,IsLast
  3414. KERNEL2x2_I_4 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3415. .endm
  3416. .macro KERNEL2x2_2 OffsetA,OffsetB, Index,IsLast
  3417. KERNEL2x2_I_2 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3418. .endm
  3419. .macro KERNEL2x2_1 AREG,BREG,First,OffsetA,OffsetB,Index
  3420. lxsd v4, DISP2(\Index, 0+\OffsetB)(\BREG)
  3421. xxperm vs9, vs36, permute_mask
  3422. lxsd v5, DISP2(\Index, 0+\OffsetA)(\AREG)
  3423. .if \First==1
  3424. xvmulsp vs0, vs37, vs36
  3425. xvmulsp vs1, vs37, vs9
  3426. .else
  3427. xvmaddasp vs0, vs37, vs36
  3428. xvmaddasp vs1, vs37, vs9
  3429. .endif
  3430. addi \BREG, \BREG, DISP2(\Index,8)
  3431. addi \AREG, \AREG, DISP2(\Index,8)
  3432. .endm
  3433. .macro KERNEL2x2_I_4 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3434. lxv vs8, DISP8(\Index, 0+\OffsetB)(\BREG)
  3435. lxv vs10, DISP8(\Index, 16+\OffsetB)(\BREG)
  3436. lxv vs26, DISP8(\Index, 0+\OffsetA)(\AREG)
  3437. lxv vs16, DISP8(\Index,16+\OffsetA)(\AREG)
  3438. xxperm vs9, vs8, permute_mask
  3439. xxperm vs11, vs10, permute_mask
  3440. xvmaddasp vs0, vs26, vs8
  3441. xvmaddasp vs1, vs26, vs9
  3442. xvmaddasp vs0, vs16, vs10
  3443. xvmaddasp vs1, vs16, vs11
  3444. .if \IsLast==1
  3445. addi \BREG, \BREG, DISP8(\Index,32)
  3446. addi \AREG, \AREG, DISP8(\Index,32)
  3447. .endif
  3448. .endm
  3449. .macro KERNEL2x2_I_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3450. lxv vs8, DISP4(\Index, 0+\OffsetB)(\BREG)
  3451. lxv vs26, DISP4(\Index, 0+\OffsetA)(\AREG)
  3452. xxperm vs9, vs8, permute_mask
  3453. xvmaddasp vs0, vs26, vs8
  3454. xvmaddasp vs1, vs26, vs9
  3455. .if \IsLast==1
  3456. addi \BREG, \BREG, DISP4(\Index,16)
  3457. addi \AREG, \AREG, DISP4(\Index,16)
  3458. .endif
  3459. .endm
  3460. .macro SAVE2x2
  3461. #ifndef TRMMKERNEL
  3462. lxsd v4 , 0(CO)
  3463. #endif
  3464. add T1, CO, LDC
  3465. #ifndef TRMMKERNEL
  3466. lxsd v5 , 0(T1)
  3467. #endif
  3468. /*aggregate vectors*/
  3469. xxpermdi vs4,vs0,vs0,2
  3470. xxpermdi vs5,vs1,vs1,2
  3471. xvaddsp vs0,vs0,vs4
  3472. xvaddsp vs1,vs1,vs5
  3473. /* */
  3474. /* lets correct the order to 00 10 and 10 ,11 from {00,11} {01,10} */
  3475. xxperm vs1,vs1, permute_mask
  3476. xxmrghw vs2 ,vs1,vs0
  3477. xxpermdi vs2,vs2,vs2,2
  3478. xxmrghw vs3 ,vs0,vs1
  3479. #if defined(TRMMKERNEL)
  3480. xvmulsp vs36, vs2, alpha_r
  3481. xvmulsp vs37, vs3, alpha_r
  3482. #else
  3483. xvmaddasp vs36, vs2, alpha_r
  3484. xvmaddasp vs37, vs3, alpha_r
  3485. #endif
  3486. /**** store last two words*/
  3487. stxsd v4, 0(CO)
  3488. stxsd v5, 0(T1)
  3489. addi CO,CO,8
  3490. .endm
  3491. /*--------------------------- M=1 N=2 */
  3492. .macro Zero2x1
  3493. xxlxor vs0, vs0, vs0
  3494. xxlxor vs1, vs1, vs1
  3495. xxlxor vs2,vs2,vs2
  3496. xxlxor vs3,vs3,vs3
  3497. .endm
  3498. .macro KERNEL2x1
  3499. KERNEL2x1_1 AO,BO, 0, 0,0,0
  3500. .endm
  3501. .macro KERNEL2x1_4 OffsetA,OffsetB, Index,IsLast
  3502. KERNEL2x1_I_4 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3503. .endm
  3504. .macro KERNEL2x1_2 OffsetA,OffsetB, Index,IsLast
  3505. KERNEL2x1_I_2 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3506. .endm
  3507. /*
  3508. we will calculate 1 alone then will add it to batched ones
  3509. */
  3510. .macro KERNEL2x1_1 AREG,BREG,First,OffsetA,OffsetB,Index
  3511. lxssp v3, DISP2(\Index, 0+\OffsetB)(\BREG)
  3512. lxssp v4, DISP2(\Index, 4+\OffsetB)(\BREG)
  3513. lxssp v5, DISP1(\Index, 0+\OffsetA)(\AREG)
  3514. .if \First==1
  3515. xvmulsp vs2, vs37, vs35
  3516. xvmulsp vs3, vs37, vs36
  3517. .else
  3518. xsmaddadp vs2, vs37, vs35
  3519. xsmaddadp vs3, vs37, vs36
  3520. .endif
  3521. addi \BREG, \BREG, DISP2(\Index,8)
  3522. addi \AREG, \AREG, DISP1(\Index,4)
  3523. .endm
  3524. .macro KERNEL2x1_I_4 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3525. lxv vs8, DISP8(\Index, 0+\OffsetB)(\BREG)
  3526. lxv vs10, DISP8(\Index, 16+\OffsetB)(\BREG)
  3527. lxv vs26, DISP4(\Index, 0+\OffsetA)(\AREG)
  3528. xxmrglw vs5, vs26,vs26
  3529. xxmrghw vs6, vs26,vs26
  3530. xvmaddasp vs0, vs8, vs5
  3531. xvmaddasp vs1, vs10, vs6
  3532. .if \IsLast==1
  3533. addi \BREG, \BREG, DISP8(\Index,32)
  3534. addi \AREG, \AREG, DISP4(\Index,16)
  3535. .endif
  3536. .endm
  3537. .macro KERNEL2x1_I_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3538. lxssp v3, DISP4(\Index, 0+\OffsetB)(\BREG)
  3539. lxssp v4, DISP4(\Index, 4+\OffsetB)(\BREG)
  3540. lxssp v7, DISP4(\Index, 8+\OffsetB)(\BREG)
  3541. lxssp v8, DISP4(\Index, 12+\OffsetB)(\BREG)
  3542. lxssp v5, DISP2(\Index, 0+\OffsetA)(\AREG)
  3543. lxssp v6, DISP2(\Index, 4+\OffsetA)(\AREG)
  3544. xsmaddadp vs2, vs37, vs35
  3545. xsmaddadp vs3, vs37, vs36
  3546. xsmaddadp vs2, vs38, vs39
  3547. xsmaddadp vs3, vs38, vs40
  3548. addi \BREG, \BREG, DISP4(\Index,16)
  3549. addi \AREG, \AREG, DISP2(\Index,8)
  3550. .endm
  3551. .macro SAVE2x1
  3552. #ifndef TRMMKERNEL
  3553. lxssp v4 , 0(CO)
  3554. #endif
  3555. add T1, CO, LDC
  3556. #ifndef TRMMKERNEL
  3557. lxssp v5 , 0(T1)
  3558. #endif
  3559. /*convert alpha_r for multiply*/
  3560. xscvspdp vs16,alpha_r
  3561. /*aggregate vectors 2x2_4 */
  3562. xxpermdi vs4,vs0,vs0,2
  3563. xxpermdi vs5,vs1,vs1,2
  3564. xvaddsp vs0,vs0,vs4
  3565. xvaddsp vs1,vs1,vs5
  3566. xvaddsp vs0,vs0,vs1
  3567. /*aggregate vectors 2x1_2 and 2x1_1 into 2x2_4*/
  3568. xscvspdp vs5, vs0
  3569. xxspltw vs6, vs0, 1
  3570. xscvspdp vs6,vs6
  3571. xsadddp vs2,vs2,vs6
  3572. xsadddp vs3,vs3,vs5
  3573. /**** store last two words*/
  3574. #if defined(TRMMKERNEL)
  3575. xsmuldp vs36,vs2, vs16
  3576. xsmuldp vs37,vs3, vs16
  3577. #else
  3578. xsmaddadp vs36,vs2, vs16
  3579. xsmaddadp vs37,vs3, vs16
  3580. #endif
  3581. stxssp v4, 0(CO)
  3582. stxssp v5, 0(T1)
  3583. addi CO,CO,4
  3584. .endm
  3585. /****************************N=1 section*****************/
  3586. .macro KERNEL1x16_2 OffsetA,OffsetB, Index,IsLast
  3587. KERNEL1x16_I_2 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3588. .endm
  3589. .macro Zero1x16
  3590. xxlxor vs0, vs0, vs0
  3591. xxlxor vs1, vs1, vs1
  3592. xxlxor vs2, vs2, vs2
  3593. xxlxor vs3, vs3, vs3
  3594. .endm
  3595. .macro KERNEL1x16
  3596. KERNEL1x16_1 AO,BO, 0, 0,0,0
  3597. .endm
  3598. .macro KERNEL1x16_4 OffsetA,OffsetB, Index,IsLast
  3599. KERNEL1x16_I_4 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3600. .endm
  3601. .macro KERNEL1x16_1 AREG,BREG,First,OffsetA,OffsetB,Index
  3602. lxssp v4, DISP1(\Index, 0+\OffsetB)(\BREG)
  3603. xscvdpspn vs36,vs36
  3604. xxspltw vs8, vs36, 0
  3605. lxv vs26, DISP16(\Index, 0+\OffsetA)(\AREG)
  3606. lxv vs27, DISP16(\Index,16+\OffsetA)(\AREG)
  3607. lxv vs28, DISP16(\Index, 32+\OffsetA)(\AREG)
  3608. lxv vs29, DISP16(\Index,48+\OffsetA)(\AREG)
  3609. .if \First==1
  3610. xvmulsp vs0, vs26, vs8
  3611. xvmulsp vs1, vs27, vs8
  3612. xvmulsp vs2, vs28, vs8
  3613. xvmulsp vs3, vs29, vs8
  3614. .else
  3615. xvmaddasp vs0, vs26, vs8
  3616. xvmaddasp vs1, vs27, vs8
  3617. xvmaddasp vs2, vs28, vs8
  3618. xvmaddasp vs3, vs29, vs8
  3619. .endif
  3620. addi \BREG, \BREG, DISP1(\Index,4)
  3621. addi \AREG, \AREG, DISP16(\Index,64)
  3622. .endm
  3623. .macro KERNEL1x16_I_4 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3624. lxv vs38, DISP4(\Index, 0+\OffsetB)(\BREG)
  3625. lxv vs26, DISP64(\Index, 0+\OffsetA)(\AREG)
  3626. lxv vs27, DISP64(\Index,16+\OffsetA)(\AREG)
  3627. lxv vs28, DISP64(\Index,32+\OffsetA)(\AREG)
  3628. lxv vs29, DISP64(\Index,48+\OffsetA)(\AREG)
  3629. lxv vs16, DISP64(\Index,64+ 0+\OffsetA)(\AREG)
  3630. lxv vs17, DISP64(\Index,64+ 16+\OffsetA)(\AREG)
  3631. lxv vs18, DISP64(\Index,64+ 32+\OffsetA)(\AREG)
  3632. lxv vs19, DISP64(\Index,64+ 48+\OffsetA)(\AREG)
  3633. xxspltw vs8, vs38, 3
  3634. xxspltw vs9, vs38, 2
  3635. lxv vs30, DISP64(\Index,128+ 0+\OffsetA)(\AREG)
  3636. lxv vs31, DISP64(\Index,128+ 16+\OffsetA)(\AREG)
  3637. lxv vs32, DISP64(\Index,128+ 32+\OffsetA)(\AREG)
  3638. lxv vs33, DISP64(\Index,128+ 48+\OffsetA)(\AREG)
  3639. lxv vs34, DISP64(\Index,128+ 64+ 0+\OffsetA)(\AREG)
  3640. lxv vs35, DISP64(\Index,128+ 64+ 16+\OffsetA)(\AREG)
  3641. lxv vs36, DISP64(\Index,128+ 64+ 32+\OffsetA)(\AREG)
  3642. lxv vs37, DISP64(\Index,128+ 64+ 48+\OffsetA)(\AREG)
  3643. xxspltw vs10, vs38, 1
  3644. xxspltw vs11, vs38, 0
  3645. xvmaddasp vs0, vs26, vs8
  3646. xvmaddasp vs1, vs27, vs8
  3647. xvmaddasp vs2, vs28, vs8
  3648. xvmaddasp vs3, vs29, vs8
  3649. xvmaddasp vs0, vs16, vs9
  3650. xvmaddasp vs1, vs17, vs9
  3651. xvmaddasp vs2, vs18, vs9
  3652. xvmaddasp vs3, vs19, vs9
  3653. xvmaddasp vs0, vs30, vs10
  3654. xvmaddasp vs1, vs31, vs10
  3655. xvmaddasp vs2, vs32, vs10
  3656. xvmaddasp vs3, vs33, vs10
  3657. xvmaddasp vs0, vs34, vs11
  3658. xvmaddasp vs1, vs35, vs11
  3659. xvmaddasp vs2, vs36, vs11
  3660. xvmaddasp vs3, vs37, vs11
  3661. .if \IsLast==1
  3662. addi \BREG, \BREG, DISP4(\Index,16)
  3663. addi \AREG, \AREG, DISP64(\Index,256)
  3664. .endif
  3665. .endm
  3666. .macro KERNEL1x16_I_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3667. lxsd v4, DISP2(\Index, 0+\OffsetB)(\BREG)
  3668. xxspltw vs8, vs36, 1
  3669. xxspltw vs9, vs36, 0
  3670. lxv vs26, DISP32(\Index, 0+\OffsetA)(\AREG)
  3671. lxv vs27, DISP32(\Index,16+\OffsetA)(\AREG)
  3672. lxv vs28, DISP32(\Index,32+\OffsetA)(\AREG)
  3673. lxv vs29, DISP32(\Index,48+\OffsetA)(\AREG)
  3674. lxv vs16, DISP32(\Index,64+ 0+\OffsetA)(\AREG)
  3675. lxv vs17, DISP32(\Index,64+ 16+\OffsetA)(\AREG)
  3676. lxv vs18, DISP32(\Index,64+ 32+\OffsetA)(\AREG)
  3677. lxv vs19, DISP32(\Index,64+ 48+\OffsetA)(\AREG)
  3678. xvmaddasp vs0, vs26, vs8
  3679. xvmaddasp vs1, vs27, vs8
  3680. xvmaddasp vs2, vs28, vs8
  3681. xvmaddasp vs3, vs29, vs8
  3682. xvmaddasp vs0, vs16, vs9
  3683. xvmaddasp vs1, vs17, vs9
  3684. xvmaddasp vs2, vs18, vs9
  3685. xvmaddasp vs3, vs19, vs9
  3686. .if \IsLast==1
  3687. addi \BREG, \BREG, DISP2(\Index,8)
  3688. addi \AREG, \AREG, DISP32(\Index,128)
  3689. .endif
  3690. .endm
  3691. .macro SAVE1x16
  3692. #ifndef TRMMKERNEL
  3693. lxv vs16, 0(CO)
  3694. lxv vs17, 16(CO)
  3695. lxv vs18, 32(CO)
  3696. lxv vs19, 48(CO)
  3697. #endif
  3698. #if defined(TRMMKERNEL)
  3699. xvmulsp vs16, vs0, alpha_r
  3700. xvmulsp vs17, vs1, alpha_r
  3701. xvmulsp vs18, vs2, alpha_r
  3702. xvmulsp vs19, vs3, alpha_r
  3703. #else
  3704. xvmaddasp vs16, vs0, alpha_r
  3705. xvmaddasp vs17, vs1, alpha_r
  3706. xvmaddasp vs18, vs2, alpha_r
  3707. xvmaddasp vs19, vs3, alpha_r
  3708. #endif
  3709. stxv vs16, 0(CO)
  3710. stxv vs17, 16(CO)
  3711. stxv vs18, 32(CO)
  3712. stxv vs19, 48(CO)
  3713. addi CO,CO,64
  3714. .endm
  3715. /* M=8 N=1 */
  3716. .macro KERNEL1x8_2 OffsetA,OffsetB, Index,IsLast
  3717. KERNEL1x8_I_2 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3718. .endm
  3719. .macro Zero1x8
  3720. xxlxor vs0, vs0, vs0
  3721. xxlxor vs1, vs1, vs1
  3722. xxlxor vs2, vs2, vs2
  3723. xxlxor vs3, vs3, vs3
  3724. .endm
  3725. .macro KERNEL1x8
  3726. KERNEL1x8_1 AO,BO, 0, 0,0,0
  3727. .endm
  3728. .macro KERNEL1x8_4 OffsetA,OffsetB, Index,IsLast
  3729. KERNEL1x8_I_4 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3730. .endm
  3731. .macro KERNEL1x8_1 AREG,BREG,First,OffsetA,OffsetB,Index
  3732. lxssp v4, DISP1(\Index, 0+\OffsetB)(\BREG)
  3733. xscvdpspn vs36,vs36
  3734. xxspltw vs8, vs36, 0
  3735. lxv vs26, DISP8(\Index, 0+\OffsetA)(\AREG)
  3736. lxv vs27, DISP8(\Index,16+\OffsetA)(\AREG)
  3737. .if \First==1
  3738. xvmulsp vs0, vs26, vs8
  3739. xvmulsp vs1, vs27, vs8
  3740. .else
  3741. xvmaddasp vs0, vs26, vs8
  3742. xvmaddasp vs1, vs27, vs8
  3743. .endif
  3744. addi \BREG, \BREG, DISP1(\Index,4)
  3745. addi \AREG, \AREG, DISP8(\Index,32)
  3746. .endm
  3747. .macro KERNEL1x8_I_4 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3748. lxv vs38, DISP4(\Index, 0+\OffsetB)(\BREG)
  3749. lxv vs26, DISP32(\Index, 0+\OffsetA)(\AREG)
  3750. lxv vs27, DISP32(\Index,16+\OffsetA)(\AREG)
  3751. lxv vs16, DISP32(\Index,32+ 0+\OffsetA)(\AREG)
  3752. lxv vs17, DISP32(\Index,32+ 16+\OffsetA)(\AREG)
  3753. xxspltw vs8, vs38, 3
  3754. xxspltw vs9, vs38, 2
  3755. lxv vs30, DISP32(\Index,64+ 0+\OffsetA)(\AREG)
  3756. lxv vs31, DISP32(\Index,64+ 16+\OffsetA)(\AREG)
  3757. lxv vs34, DISP32(\Index,64+ 32+ 0+\OffsetA)(\AREG)
  3758. lxv vs35, DISP32(\Index,64+ 32+ 16+\OffsetA)(\AREG)
  3759. xxspltw vs10, vs38, 1
  3760. xxspltw vs11, vs38, 0
  3761. xvmaddasp vs0, vs26, vs8
  3762. xvmaddasp vs1, vs27, vs8
  3763. xvmaddasp vs2, vs16, vs9
  3764. xvmaddasp vs3, vs17, vs9
  3765. xvmaddasp vs0, vs30, vs10
  3766. xvmaddasp vs1, vs31, vs10
  3767. xvmaddasp vs2, vs34, vs11
  3768. xvmaddasp vs3, vs35, vs11
  3769. .if \IsLast==1
  3770. addi \BREG, \BREG, DISP4(\Index,16)
  3771. addi \AREG, \AREG, DISP32(\Index,128)
  3772. .endif
  3773. .endm
  3774. .macro KERNEL1x8_I_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3775. lxsd v4, DISP2(\Index, 0+\OffsetB)(\BREG)
  3776. xxspltw vs8, vs36, 1
  3777. xxspltw vs9, vs36, 0
  3778. lxv vs26, DISP16(\Index, 0+\OffsetA)(\AREG)
  3779. lxv vs27, DISP16(\Index,16+\OffsetA)(\AREG)
  3780. lxv vs16, DISP16(\Index,32+ 0+\OffsetA)(\AREG)
  3781. lxv vs17, DISP16(\Index,32+ 16+\OffsetA)(\AREG)
  3782. xvmaddasp vs0, vs26, vs8
  3783. xvmaddasp vs1, vs27, vs8
  3784. xvmaddasp vs2, vs16, vs9
  3785. xvmaddasp vs3, vs17, vs9
  3786. .if \IsLast==1
  3787. addi \BREG, \BREG, DISP2(\Index,8)
  3788. addi \AREG, \AREG, DISP16(\Index,64)
  3789. .endif
  3790. .endm
  3791. .macro SAVE1x8
  3792. #ifndef TRMMKERNEL
  3793. lxv vs16, 0(CO)
  3794. lxv vs17, 16(CO)
  3795. #endif
  3796. /* aggregate vs0 vs2 and vs1 vs3*/
  3797. xvaddsp vs0,vs0,vs2
  3798. xvaddsp vs1,vs1,vs3
  3799. #if defined(TRMMKERNEL)
  3800. xvmulsp vs16, vs0, alpha_r
  3801. xvmulsp vs17, vs1, alpha_r
  3802. #else
  3803. xvmaddasp vs16, vs0, alpha_r
  3804. xvmaddasp vs17, vs1, alpha_r
  3805. #endif
  3806. stxv vs16, 0(CO)
  3807. stxv vs17, 16(CO)
  3808. addi CO,CO,32
  3809. .endm
  3810. /*M=4*/
  3811. .macro KERNEL1x4_2 OffsetA,OffsetB, Index,IsLast
  3812. KERNEL1x4_I_2 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3813. .endm
  3814. .macro Zero1x4
  3815. xxlxor vs0, vs0, vs0
  3816. xxlxor vs1, vs1, vs1
  3817. xxlxor vs2, vs2, vs2
  3818. xxlxor vs3, vs3, vs3
  3819. .endm
  3820. .macro KERNEL1x4
  3821. KERNEL1x4_1 AO,BO, 0, 0,0,0
  3822. .endm
  3823. .macro KERNEL1x4_4 OffsetA,OffsetB, Index,IsLast
  3824. KERNEL1x4_I_4 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3825. .endm
  3826. .macro KERNEL1x4_1 AREG,BREG,First,OffsetA,OffsetB,Index
  3827. lxssp v4, DISP1(\Index, 0+\OffsetB)(\BREG)
  3828. xscvdpspn vs36,vs36
  3829. xxspltw vs8, vs36, 0
  3830. lxv vs26, DISP4(\Index, 0+\OffsetA)(\AREG)
  3831. .if \First==1
  3832. xvmulsp vs0, vs26, vs8
  3833. .else
  3834. xvmaddasp vs0, vs26, vs8
  3835. .endif
  3836. addi \BREG, \BREG, DISP1(\Index,4)
  3837. addi \AREG, \AREG, DISP4(\Index,16)
  3838. .endm
  3839. .macro KERNEL1x4_I_4 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3840. lxv vs38, DISP4(\Index, 0+\OffsetB)(\BREG)
  3841. lxv vs26, DISP16(\Index, 0+\OffsetA)(\AREG)
  3842. lxv vs27, DISP16(\Index,16+\OffsetA)(\AREG)
  3843. xxspltw vs8, vs38, 3
  3844. xxspltw vs9, vs38, 2
  3845. lxv vs30, DISP16(\Index,32+ 0+\OffsetA)(\AREG)
  3846. lxv vs31, DISP16(\Index,32+ 16+\OffsetA)(\AREG)
  3847. xxspltw vs10, vs38, 1
  3848. xxspltw vs11, vs38, 0
  3849. xvmaddasp vs0, vs26, vs8
  3850. xvmaddasp vs1, vs27, vs9
  3851. xvmaddasp vs2, vs30, vs10
  3852. xvmaddasp vs3, vs31, vs11
  3853. .if \IsLast==1
  3854. addi \BREG, \BREG, DISP4(\Index,16)
  3855. addi \AREG, \AREG, DISP16(\Index,64)
  3856. .endif
  3857. .endm
  3858. .macro KERNEL1x4_I_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3859. lxsd v4, DISP2(\Index, 0+\OffsetB)(\BREG)
  3860. xxspltw vs8, vs36, 1
  3861. xxspltw vs9, vs36, 0
  3862. lxv vs26, DISP8(\Index, 0+\OffsetA)(\AREG)
  3863. lxv vs27, DISP8(\Index,16+\OffsetA)(\AREG)
  3864. xvmaddasp vs0, vs26, vs8
  3865. xvmaddasp vs1, vs27, vs9
  3866. .if \IsLast==1
  3867. addi \BREG, \BREG, DISP2(\Index,8)
  3868. addi \AREG, \AREG, DISP8(\Index,32)
  3869. .endif
  3870. .endm
  3871. .macro SAVE1x4
  3872. #ifndef TRMMKERNEL
  3873. lxv vs16, 0(CO)
  3874. #endif
  3875. /* aggregate */
  3876. xvaddsp vs0,vs0,vs2
  3877. xvaddsp vs1,vs1,vs3
  3878. xvaddsp vs0,vs1,vs0
  3879. #if defined(TRMMKERNEL)
  3880. xvmulsp vs16, vs0, alpha_r
  3881. #else
  3882. xvmaddasp vs16, vs0, alpha_r
  3883. #endif
  3884. stxv vs16, 0(CO)
  3885. addi CO,CO,16
  3886. .endm
  3887. /* M=2 N=1*/
  3888. .macro Zero1x2
  3889. xxlxor vs0, vs0, vs0
  3890. xxlxor vs1, vs1, vs1
  3891. xxlxor vs2,vs2,vs2
  3892. xxlxor vs3,vs3,vs3
  3893. .endm
  3894. .macro KERNEL1x2
  3895. KERNEL1x2_1 AO,BO, 0, 0,0,0
  3896. .endm
  3897. .macro KERNEL1x2_4 OffsetA,OffsetB, Index,IsLast
  3898. KERNEL1x2_I_4 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3899. .endm
  3900. .macro KERNEL1x2_2 OffsetA,OffsetB, Index,IsLast
  3901. KERNEL1x2_I_2 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3902. .endm
  3903. /*
  3904. we will calculate 1 alone then will add it to batched ones
  3905. */
  3906. .macro KERNEL1x2_1 AREG,BREG,First,OffsetA,OffsetB,Index
  3907. lxssp v3, DISP2(\Index, 0+\OffsetB)(\AREG)
  3908. lxssp v4, DISP2(\Index, 4+\OffsetB)(\AREG)
  3909. lxssp v5, DISP1(\Index, 0+\OffsetA)(\BREG)
  3910. .if \First==1
  3911. xvmuldp vs2, vs37, vs35
  3912. xvmuldp vs3, vs37, vs36
  3913. .else
  3914. xsmaddadp vs2, vs37, vs35
  3915. xsmaddadp vs3, vs37, vs36
  3916. .endif
  3917. addi \AREG, \AREG, DISP2(\Index,8)
  3918. addi \BREG, \BREG, DISP1(\Index,4)
  3919. .endm
  3920. .macro KERNEL1x2_I_4 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3921. lxv vs8, DISP8(\Index, 0+\OffsetB)(\AREG)
  3922. lxv vs10, DISP8(\Index, 16+\OffsetB)(\AREG)
  3923. lxv vs26, DISP4(\Index, 0+\OffsetA)(\BREG)
  3924. xxmrglw vs5, vs26,vs26
  3925. xxmrghw vs6, vs26,vs26
  3926. xvmaddasp vs0, vs8, vs5
  3927. xvmaddasp vs1, vs10, vs6
  3928. .if \IsLast==1
  3929. addi \AREG, \AREG, DISP8(\Index,32)
  3930. addi \BREG, \BREG, DISP4(\Index,16)
  3931. .endif
  3932. .endm
  3933. .macro KERNEL1x2_I_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  3934. lxssp v3, DISP4(\Index, 0+\OffsetB)(\AREG)
  3935. lxssp v4, DISP4(\Index, 4+\OffsetB)(\AREG)
  3936. lxssp v7, DISP4(\Index, 8+\OffsetB)(\AREG)
  3937. lxssp v8, DISP4(\Index, 12+\OffsetB)(\AREG)
  3938. lxssp v5, DISP2(\Index, 0+\OffsetA)(\BREG)
  3939. lxssp v6, DISP2(\Index, 4+\OffsetA)(\BREG)
  3940. xsmaddadp vs2, vs37, vs35
  3941. xsmaddadp vs3, vs37, vs36
  3942. xsmaddadp vs2, vs38, vs39
  3943. xsmaddadp vs3, vs38, vs40
  3944. addi \AREG, \AREG, DISP4(\Index,16)
  3945. addi \BREG, \BREG, DISP2(\Index,8)
  3946. .endm
  3947. .macro SAVE1x2
  3948. #ifndef TRMMKERNEL
  3949. lxssp v4 , 0(CO)
  3950. lxssp v5 , 4(CO)
  3951. #endif
  3952. /*convert alpha_r for multiply*/
  3953. xscvspdp vs16,alpha_r
  3954. /*aggregate vectors 1x2_4 */
  3955. xxpermdi vs4,vs0,vs0,2
  3956. xxpermdi vs5,vs1,vs1,2
  3957. xvaddsp vs0,vs0,vs4
  3958. xvaddsp vs1,vs1,vs5
  3959. xvaddsp vs0,vs0,vs1
  3960. /*aggregate vectors 1x1_2 and 1x1_1 into 1x2_4*/
  3961. xscvspdp vs5, vs0
  3962. xxspltw vs6, vs0, 1
  3963. xscvspdp vs6,vs6
  3964. xsadddp vs2,vs2,vs6
  3965. xsadddp vs3,vs3,vs5
  3966. /**** store last two words*/
  3967. #if defined(TRMMKERNEL)
  3968. xsmuldp vs36,vs2, vs16
  3969. xsmuldp vs37,vs3, vs16
  3970. #else
  3971. xsmaddadp vs36,vs2, vs16
  3972. xsmaddadp vs37,vs3, vs16
  3973. #endif
  3974. stxssp v4, 0(CO)
  3975. stxssp v5, 4(CO)
  3976. addi CO,CO,8
  3977. .endm
  3978. /*///////////////// N=1 M=1 //////////////////*/
  3979. .macro Zero1x1
  3980. xxlxor vs0, vs0, vs0
  3981. xxlxor vs1, vs1, vs1
  3982. xxlxor vs2, vs2,vs2
  3983. xxlxor vs3,vs3,vs3
  3984. xxlxor vs4,vs4,vs4
  3985. .endm
  3986. .macro KERNEL1x1
  3987. KERNEL1x1_1 AO,BO, 1, 0,0,0
  3988. .endm
  3989. .macro KERNEL1x1_16 OffsetA,OffsetB, Index,IsLast
  3990. KERNEL1x1_I_16 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3991. .endm
  3992. .macro KERNEL1x1_8 OffsetA,OffsetB, Index,IsLast
  3993. KERNEL1x1_I_8 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3994. .endm
  3995. .macro KERNEL1x1_4 OffsetA,OffsetB, Index,IsLast
  3996. KERNEL1x1_I_4 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  3997. .endm
  3998. .macro KERNEL1x1_2 OffsetA,OffsetB, Index,IsLast
  3999. KERNEL1x1_I_2 AO,BO, \OffsetA,\OffsetB,\Index,\IsLast
  4000. .endm
  4001. /*
  4002. we will calculate 1 alone ( FIRST==1 to zero vs4)
  4003. */
  4004. .macro KERNEL1x1_1 AREG,BREG,First,OffsetA,OffsetB,Index
  4005. lxssp v3, DISP1(\Index, 0+\OffsetB)(\AREG)
  4006. lxssp v5, DISP1(\Index, 0+\OffsetA)(\BREG)
  4007. .if \First==1
  4008. xvmuldp vs4, vs37, vs35
  4009. .else
  4010. xsmaddadp vs4, vs37, vs35
  4011. .endif
  4012. addi \AREG, \AREG, DISP1(\Index,4)
  4013. addi \BREG, \BREG, DISP1(\Index,4)
  4014. .endm
  4015. .macro KERNEL1x1_I_16 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  4016. lxv vs8, DISP16(\Index, 0+\OffsetB)(\AREG)
  4017. lxv vs9, DISP16(\Index, 16+\OffsetB)(\AREG)
  4018. lxv vs10, DISP16(\Index, 32+0+\OffsetB)(\AREG)
  4019. lxv vs11, DISP16(\Index, 32+ 16+\OffsetB)(\AREG)
  4020. lxv vs26, DISP16(\Index, 0+\OffsetA)(\BREG)
  4021. lxv vs16, DISP16(\Index, 16+\OffsetA)(\BREG)
  4022. lxv vs17, DISP16(\Index, 32+0+\OffsetA)(\BREG)
  4023. lxv vs18, DISP16(\Index, 32+16+\OffsetA)(\BREG)
  4024. xvmaddasp vs0, vs8, vs26
  4025. xvmaddasp vs1, vs9, vs16
  4026. xvmaddasp vs2, vs10, vs17
  4027. xvmaddasp vs3, vs11, vs18
  4028. .if \IsLast==1
  4029. addi \AREG, \AREG, DISP16(\Index,64)
  4030. addi \BREG, \BREG, DISP16(\Index,64)
  4031. .endif
  4032. .endm
  4033. .macro KERNEL1x1_I_8 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  4034. lxv vs8, DISP8(\Index, 0+\OffsetB)(\AREG)
  4035. lxv vs9, DISP8(\Index, 16+\OffsetB)(\AREG)
  4036. lxv vs26, DISP8(\Index, 0+\OffsetA)(\BREG)
  4037. lxv vs16, DISP8(\Index, 16+\OffsetA)(\BREG)
  4038. xvmaddasp vs0, vs8, vs26
  4039. xvmaddasp vs1, vs9, vs16
  4040. .if \IsLast==1
  4041. addi \AREG, \AREG, DISP8(\Index,32)
  4042. addi \BREG, \BREG, DISP8(\Index,32)
  4043. .endif
  4044. .endm
  4045. .macro KERNEL1x1_I_4 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  4046. lxv vs8, DISP4(\Index, 0+\OffsetB)(\AREG)
  4047. lxv vs26, DISP4(\Index, 0+\OffsetA)(\BREG)
  4048. xvmaddasp vs0, vs8, vs26
  4049. .if \IsLast==1
  4050. addi \AREG, \AREG, DISP4(\Index,16)
  4051. addi \BREG, \BREG, DISP4(\Index,16)
  4052. .endif
  4053. .endm
  4054. .macro KERNEL1x1_I_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast
  4055. lxsd v4, DISP2(\Index, 0+\OffsetB)(\AREG)
  4056. lxsd v5, DISP2(\Index, 0+\OffsetA)(\BREG)
  4057. xvmaddasp vs0, vs36, vs37
  4058. addi \AREG, \AREG, DISP2(\Index,8)
  4059. addi \BREG, \BREG, DISP2(\Index,8)
  4060. .endm
  4061. .macro SAVE1x1
  4062. #ifndef TRMMKERNEL
  4063. lxssp v4 , 0(CO)
  4064. #endif
  4065. /*convert alpha_r for multiply*/
  4066. xscvspdp vs16,alpha_r
  4067. /*aggregate vectors */
  4068. xvaddsp vs0,vs0,vs1
  4069. xvaddsp vs2,vs2,vs3
  4070. xvaddsp vs0,vs0,vs2
  4071. xxpermdi vs7,vs0,vs0,2
  4072. xvaddsp vs0,vs0,vs7
  4073. /*aggregate vectors 1x1_2 and 1x1_1 into 1x1_4*/
  4074. xscvspdp vs5, vs0
  4075. xxspltw vs6, vs0, 1
  4076. xscvspdp vs6,vs6
  4077. xsadddp vs7,vs5,vs6
  4078. xsadddp vs4,vs4,vs7
  4079. /**** store last two words*/
  4080. #if defined(TRMMKERNEL)
  4081. xsmuldp vs36,vs4, vs16
  4082. #else
  4083. xsmaddadp vs36,vs4, vs16
  4084. #endif
  4085. stxssp v4, 0(CO)
  4086. addi CO,CO,4
  4087. .endm
  4088. /****************************TRMM POINTER REFRESH MACROSES*************************/
  4089. .macro SHIFT_REG REG1,REG2,SHIFT_VAL
  4090. .if \SHIFT_VAL==16
  4091. slwi \REG1, \REG2, 6
  4092. .elseif \SHIFT_VAL==8
  4093. slwi \REG1, \REG2, 5
  4094. .elseif \SHIFT_VAL==4
  4095. slwi \REG1, \REG2, 4
  4096. .elseif \SHIFT_VAL==2
  4097. slwi \REG1, \REG2, 3
  4098. .elseif \SHIFT_VAL==1
  4099. slwi \REG1, \REG2, 2
  4100. .endif
  4101. .endm
  4102. /*
  4103. //#if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4104. // ptrbb = bb;
  4105. // #else
  4106. // ptrba += off*16;
  4107. // ptrbb = bb + off*2;
  4108. // #endif
  4109. */
  4110. .macro REFRESH_POINTERS PTR_A,PTR_B,OFF_VAL,B_VAL,C_A,C_B
  4111. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4112. /* ptrbb = bb;*/
  4113. mr \PTR_B,\B_VAL /* refresh BPOINT */
  4114. #else
  4115. /*
  4116. // ptrba =ptrba+ off*C_A;
  4117. // ptrbb = bb + off*C_B;
  4118. */
  4119. SHIFT_REG T4,\OFF_VAL,\C_B /* Number of values in B shifted */
  4120. SHIFT_REG T2,\OFF_VAL,\C_A /* Number of values in A shifted */
  4121. add \PTR_B, \B_VAL , T4 /* Add values to BO */
  4122. add \PTR_A, \PTR_A, T2 /* Add values to AO */
  4123. #endif
  4124. .endm
  4125. /*
  4126. // #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  4127. // temp = bk-off;
  4128. // #elif defined(LEFT)
  4129. // temp = off+16; // number of values in A
  4130. // #else
  4131. // temp = off+2; // number of values in B
  4132. // #endif
  4133. */
  4134. .macro REFRESH_TEMP_BK TEMP_BK,BK_VAL,OFF_VAL,INCR_A,INCR_B
  4135. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  4136. /* temp = bk-off;*/
  4137. sub \TEMP_BK,\BK_VAL,\OFF_VAL
  4138. #elif defined(LEFT)
  4139. /* temp = off+INCR_A; // number of values in A */
  4140. addi \TEMP_BK, \OFF_VAL, \INCR_A
  4141. #else
  4142. /* temp = off+INCR_B // number of values in B*/
  4143. addi \TEMP_BK,\OFF_VAL, \INCR_B
  4144. #endif
  4145. .endm
  4146. /*
  4147. // #if ( defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4148. // temp = bk - off;
  4149. // #ifdef LEFT
  4150. // temp -= 16; // number of values in A
  4151. // #else
  4152. // temp -= 2; // number of values in B
  4153. // #endif
  4154. // ptrba += temp*16;
  4155. // ptrbb += temp*2;
  4156. // #endif
  4157. // #ifdef LEFT
  4158. // off += 16; // number of values in A
  4159. // #endif
  4160. */
  4161. .macro REFRESH_AFTER_SAVE TEMP_BK,BK_VAL,OFF_VAL,PTR_B,PTR_A,C_A,C_B
  4162. #if ( defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  4163. /*temp = bk - off;*/
  4164. sub \TEMP_BK,\BK_VAL,\OFF_VAL
  4165. #ifdef LEFT
  4166. /*temp -= 8; // number of values in A*/
  4167. addi \TEMP_BK,\TEMP_BK,-\C_A
  4168. #else
  4169. /*temp -= 4; // number of values in B*/
  4170. addi \TEMP_BK,\TEMP_BK,-\C_B
  4171. #endif
  4172. /*ptrba += temp*C_A;
  4173. ptrbb += temp*C_B;*/
  4174. SHIFT_REG T4,\TEMP_BK,\C_A
  4175. SHIFT_REG T2,\TEMP_BK,\C_B
  4176. add \PTR_A, \PTR_A,T4/*ptrba+temp*C_A*/
  4177. add \PTR_B, \PTR_B,T2
  4178. #endif
  4179. #ifdef LEFT
  4180. /*off += 8; // number of values in A*/
  4181. addi \OFF_VAL,\OFF_VAL,\C_A
  4182. #endif
  4183. .endm