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 186 kB

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