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.

cgemm_macros_8x4_power8.S 184 kB

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