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.

ctrmm_macros_8x4_power8.S 177 kB

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