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_kernel_4x8_sandy.S 110 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458
  1. /*****************************************************************************
  2. Copyright (c) 2011,2012 Lab of Parallel Software and Computational Science,ISCAS
  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 ISCAS nor the names of its contributors may
  14. be used to endorse or promote products derived from this software
  15. 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 COPYRIGHT OWNER OR CONTRIBUTORS BE
  20. LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  22. SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  23. CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  24. OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  25. USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. **********************************************************************************/
  27. #define ASSEMBLER
  28. #include "common.h"
  29. #define old_bm %rdi
  30. #define old_bn %rsi
  31. #define old_bk %rdx
  32. #define bm %r13
  33. #define bn %r14
  34. #define bk %r15
  35. #define ALPHA %xmm0
  36. #define ba %rcx
  37. #define bb %r8
  38. #define C %r9
  39. #define ldc %r10
  40. #define i %r11
  41. #define k %rax
  42. #define ptrba %rdi
  43. #define ptrbb %rsi
  44. #define C0 %rbx
  45. #define C1 %rbp
  46. #define prebb %r12
  47. #ifndef WINDOWS_ABI
  48. #define STACKSIZE 128
  49. #define old_ldc 8+STACKSIZE(%rsp)
  50. #define old_offset 16+STACKSIZE(%rsp)
  51. #define MEMALPHA_R 48(%rsp)
  52. #define MEMALPHA_I 56(%rsp)
  53. #define j 64(%rsp)
  54. #define OFFSET 72(%rsp)
  55. #define kk 80(%rsp)
  56. #define kkk 88(%rsp)
  57. #else
  58. #define STACKSIZE 512
  59. #define OLD_ALPHA_I 40 + STACKSIZE(%rsp)
  60. #define OLD_A 48 + STACKSIZE(%rsp)
  61. #define OLD_B 56 + STACKSIZE(%rsp)
  62. #define OLD_C 64 + STACKSIZE(%rsp)
  63. #define old_ldc 72 + STACKSIZE(%rsp)
  64. #define old_offset 80 + STACKSIZE(%rsp)
  65. #define MEMALPHA_R 224(%rsp)
  66. #define MEMALPHA_I 232(%rsp)
  67. #define j 240(%rsp)
  68. #define OFFSET 248(%rsp)
  69. #define kk 256(%rsp)
  70. #define kkk 264(%rsp)
  71. #endif
  72. #define PREFETCH0 prefetcht0
  73. #define PREFETCH1 prefetcht0
  74. #define PREFETCH2 prefetcht0
  75. #define PRESIZE 64
  76. #define xvec0 %xmm0
  77. #define xvec1 %xmm1
  78. #define xvec2 %xmm2
  79. #define xvec3 %xmm3
  80. #define xvec4 %xmm4
  81. #define xvec5 %xmm5
  82. #define xvec6 %xmm6
  83. #define xvec7 %xmm7
  84. #define xvec8 %xmm8
  85. #define xvec9 %xmm9
  86. #define xvec10 %xmm10
  87. #define xvec11 %xmm11
  88. #define xvec12 %xmm12
  89. #define xvec13 %xmm13
  90. #define xvec14 %xmm14
  91. #define xvec15 %xmm15
  92. #define yvec0 %ymm0
  93. #define yvec1 %ymm1
  94. #define yvec2 %ymm2
  95. #define yvec3 %ymm3
  96. #define yvec4 %ymm4
  97. #define yvec5 %ymm5
  98. #define yvec6 %ymm6
  99. #define yvec7 %ymm7
  100. #define yvec8 %ymm8
  101. #define yvec9 %ymm9
  102. #define yvec10 %ymm10
  103. #define yvec11 %ymm11
  104. #define yvec12 %ymm12
  105. #define yvec13 %ymm13
  106. #define yvec14 %ymm14
  107. #define yvec15 %ymm15
  108. #define LEAQ leaq
  109. #define ADDQ addq
  110. #define MULQ imulq
  111. #define SARQ sarq
  112. #define SALQ salq
  113. #define ANDQ andq
  114. #define SUBQ subq
  115. #define DECQ decq
  116. #define JG jg
  117. #define JLE jle
  118. #define TEST testq
  119. #define OR orq
  120. #define JNE jne
  121. #define JMP jmp
  122. #define NOP
  123. #define XOR xorpd
  124. #undef MOVQ
  125. #define MOVQ movq
  126. #define XOR_SY vxorps
  127. #define XOR_SX vxorps
  128. #define LD_SY vmovaps
  129. #define LD_SX vmovaps
  130. #define LDL_SX vmovlps
  131. #define LDL_SY vmovlps
  132. #define LDH_SX vmovhps
  133. #define LDH_SY vmovhps
  134. #define ST_SY vmovaps
  135. #define ST_SX vmovaps
  136. #define STL_SX vmovlps
  137. #define STL_SY vmovlps
  138. #define STH_SX vmovhps
  139. #define STH_SY vmovhps
  140. #define EDUP_SY vmovsldup
  141. #define ODUP_SY vmovshdup
  142. #define EDUP_SX vmovsldup
  143. #define ODUP_SX vmovshdup
  144. #define ADD_SY vaddps
  145. #define ADD_SX vaddps
  146. #define SUB_SY vsubps
  147. #define SUB_SX vsubps
  148. #define ADDSUB_SY vaddsubps
  149. #define ADDSUB_SX vaddsubps
  150. #define MUL_SY vmulps
  151. #define MUL_SX vmulps
  152. #define SHUF_SY vperm2f128
  153. #define SHUF_SX vpshufd
  154. #define VPERMILP_SY vpermilps
  155. #define VPERMILP_SX vpermilps
  156. #define BROAD_SY vbroadcastss
  157. #define BROAD_SX vbroadcastss
  158. #define MOV_SY vmovaps
  159. #define MOV_SX vmovaps
  160. #define REVS_SY vshufps
  161. #define REVS_SX vshufps
  162. #define EXTRA_SY vextractf128
  163. #if defined(NN) || defined(NT) || defined(TN) || defined(TT)
  164. #define ADD1_SY ADD_SY
  165. #define ADD2_SY ADDSUB_SY
  166. #define ADD1_SX ADD_SX
  167. #define ADD2_SX ADDSUB_SX
  168. #elif defined(NR) || defined(NC) || defined(TR) || defined(TC)
  169. #define ADD1_SY SUB_SY
  170. #define ADD2_SY ADDSUB_SY
  171. #define ADD1_SX SUB_SX
  172. #define ADD2_SX ADDSUB_SX
  173. #elif defined(RN) || defined(RT) || defined(CN) || defined(CT)
  174. #define ADD1_SY SUB_SY
  175. #define ADD2_SY ADDSUB_SY
  176. #define ADD1_SX SUB_SX
  177. #define ADD2_SX ADDSUB_SX
  178. #else
  179. #define ADD1_SY ADD_SY
  180. #define ADD2_SY ADDSUB_SY
  181. #define ADD1_SX ADD_SX
  182. #define ADD2_SX ADDSUB_SX
  183. #endif
  184. PROLOGUE
  185. subq $STACKSIZE, %rsp;
  186. movq %rbx, 0(%rsp);
  187. movq %rbp, 8(%rsp);
  188. movq %r12, 16(%rsp);
  189. movq %r13, 24(%rsp);
  190. movq %r14, 32(%rsp);
  191. movq %r15, 40(%rsp);
  192. #ifdef WINDOWS_ABI
  193. movq %rdi, 48(%rsp)
  194. movq %rsi, 56(%rsp)
  195. movups %xmm6, 64(%rsp)
  196. movups %xmm7, 80(%rsp)
  197. movups %xmm8, 96(%rsp)
  198. movups %xmm9, 112(%rsp)
  199. movups %xmm10, 128(%rsp)
  200. movups %xmm11, 144(%rsp)
  201. movups %xmm12, 160(%rsp)
  202. movups %xmm13, 176(%rsp)
  203. movups %xmm14, 192(%rsp)
  204. movups %xmm15, 208(%rsp)
  205. movq ARG1, old_bm
  206. movq ARG2, old_bn
  207. movq ARG3, old_bk
  208. movq OLD_A, ba
  209. movq OLD_B, bb
  210. movq OLD_C, C
  211. movq old_ldc, ldc
  212. #ifdef TRMMKERNEL
  213. movq old_offset, %r11
  214. #endif
  215. movaps %xmm3, %xmm0
  216. movsd OLD_ALPHA_I, %xmm1
  217. #else
  218. movq old_ldc, ldc
  219. #ifdef TRMMKERNEL
  220. movq old_offset, %r11;
  221. #endif
  222. #endif
  223. vzeroupper
  224. vmovlps %xmm0, MEMALPHA_R
  225. vmovlps %xmm1, MEMALPHA_I
  226. movq old_bm, bm
  227. movq old_bn, bn
  228. movq old_bk, bk
  229. salq $ZBASE_SHIFT, ldc
  230. #ifdef TRMMKERNEL
  231. movq %r11, OFFSET
  232. #ifndef LEFT
  233. negq %r11;
  234. #endif
  235. movq %r11, kk;
  236. #endif
  237. MOVQ bn,j;
  238. SARQ $2,j; # Rn = 4
  239. JLE .L0_loopE;
  240. ALIGN_5;
  241. .L0_bodyB:;
  242. #if defined(TRMMKERNEL) && defined(LEFT)
  243. MOVQ OFFSET, %rax;
  244. MOVQ %rax, kk;
  245. #endif
  246. MOVQ C,C0;
  247. LEAQ (C,ldc,2),C1;
  248. MOVQ bk, k;
  249. SALQ $5, k;
  250. LEAQ (bb, k, 1), prebb; # Rn=4, SIZE=4 COMPLEX=2
  251. MOVQ ba,ptrba;
  252. MOVQ bm,i;
  253. SARQ $3,i; # Rm = 8
  254. JLE .L1_loopE;
  255. ALIGN_5;
  256. .L1_bodyB:;
  257. #if !defined(TRMMKERNEL)||(defined(TRMMKERNEL)&&defined(LEFT)&&defined(TRANSA))||(defined(TRMMKERNEL)&&!defined(LEFT)&&!defined(TRANSA))
  258. MOVQ bb,ptrbb;
  259. #else
  260. MOVQ bb, ptrbb;
  261. MOVQ kk, %rax;
  262. SALQ $ZBASE_SHIFT, %rax;
  263. LEAQ (ptrba, %rax, 8), ptrba;
  264. LEAQ (ptrbb, %rax, 4), ptrbb;
  265. #endif
  266. # Initial results register
  267. PREFETCH0 0*SIZE(prebb);
  268. XOR_SY yvec15, yvec15, yvec15;
  269. PREFETCH0 16*SIZE(prebb);
  270. ADDQ $32*SIZE, prebb;
  271. XOR_SY yvec14, yvec14, yvec14;
  272. PREFETCH2 3*SIZE(C0);
  273. XOR_SY yvec13, yvec13, yvec13;
  274. PREFETCH2 3*SIZE(C0, ldc, 1);
  275. XOR_SY yvec12, yvec12, yvec12;
  276. PREFETCH2 3*SIZE(C1);
  277. EDUP_SY 0*SIZE(ptrbb), yvec2; # Br0, Br1, Br2, Br3
  278. PREFETCH2 3*SIZE(C1, ldc, 1);
  279. XOR_SY yvec11, yvec11, yvec11;
  280. XOR_SY yvec10, yvec10, yvec10;
  281. LD_SY 0*SIZE(ptrba), yvec0; # Ar0, Ai0, Ar1, Ai1..
  282. XOR_SY yvec9, yvec9, yvec9;
  283. XOR_SY yvec8, yvec8, yvec8;
  284. VPERMILP_SY $0x4e, yvec2, yvec3; # Br2, Br3, Br0, Br1
  285. #ifndef TRMMKERNEL
  286. MOVQ bk,k;
  287. #elif (defined(LEFT)&&!defined(TRANSA))||(!defined(LEFT)&&defined(TRANSA))
  288. MOVQ bk, %rax;
  289. SUBQ kk, %rax;
  290. MOVQ %rax, kkk;
  291. #else
  292. MOVQ kk, %rax;
  293. #ifdef LEFT
  294. ADDQ $8, %rax;
  295. #else
  296. ADDQ $4, %rax;
  297. #endif
  298. MOVQ %rax, kkk;
  299. #endif
  300. SARQ $2,k; # Unroll 4 times
  301. JLE .L2_loopE;
  302. ALIGN_5;
  303. .L2_bodyB:;
  304. # Computing kernel
  305. ######### Unroll 1 ##################
  306. PREFETCH0 PRESIZE*SIZE(ptrba);
  307. LD_SY 8*SIZE(ptrba), yvec1; # Ar4, Ai4, Ar5, Ai5..
  308. MUL_SY yvec0, yvec2, yvec6;
  309. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  310. MUL_SY yvec0, yvec3, yvec7;
  311. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  312. ADD1_SY yvec6, yvec15, yvec15;
  313. ADD1_SY yvec7, yvec13, yvec13;
  314. MUL_SY yvec1, yvec2, yvec6;
  315. ODUP_SY 0*SIZE(ptrbb), yvec2; # Bi0, Bi1, Bi2, Bi3
  316. MUL_SY yvec1, yvec3, yvec7;
  317. VPERMILP_SY $0x4e, yvec2, yvec3; # Bi2, Bi3, Bi0, Bi1
  318. ADD1_SY yvec6, yvec14, yvec14;
  319. ADD1_SY yvec7, yvec12, yvec12;
  320. MUL_SY yvec0, yvec4, yvec6;
  321. MUL_SY yvec0, yvec5, yvec7;
  322. VPERMILP_SY $0xb1, yvec0, yvec0; # Ai0, Ar0, Ai1, Ar1..
  323. ADD1_SY yvec6, yvec11, yvec11;
  324. ADD1_SY yvec7, yvec9, yvec9;
  325. MUL_SY yvec1, yvec4, yvec6;
  326. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  327. MUL_SY yvec1, yvec5, yvec7;
  328. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  329. ADD1_SY yvec6, yvec10, yvec10;
  330. ADD1_SY yvec7, yvec8, yvec8;
  331. VPERMILP_SY $0xb1, yvec1, yvec1;
  332. MUL_SY yvec0, yvec2, yvec6;
  333. MUL_SY yvec0, yvec3, yvec7;
  334. ADD2_SY yvec6, yvec15, yvec15;
  335. ADD2_SY yvec7, yvec13, yvec13;
  336. MUL_SY yvec1, yvec2, yvec6;
  337. EDUP_SY 8*SIZE(ptrbb), yvec2;
  338. MUL_SY yvec1, yvec3, yvec7;
  339. VPERMILP_SY $0x4e, yvec2, yvec3;
  340. ADD2_SY yvec6, yvec14, yvec14;
  341. ADD2_SY yvec7, yvec12, yvec12;
  342. MUL_SY yvec0, yvec4, yvec6;
  343. MUL_SY yvec0, yvec5, yvec7;
  344. LD_SY 16*SIZE(ptrba), yvec0;
  345. ADD2_SY yvec6, yvec11, yvec11;
  346. ADD2_SY yvec7, yvec9, yvec9;
  347. MUL_SY yvec1, yvec4, yvec6;
  348. MUL_SY yvec1, yvec5, yvec7;
  349. ADD2_SY yvec6, yvec10, yvec10;
  350. ADD2_SY yvec7, yvec8, yvec8;
  351. ######### Unroll 2 ##################
  352. PREFETCH0 (PRESIZE+16)*SIZE(ptrba);
  353. LD_SY 24*SIZE(ptrba), yvec1; # Ar4, Ai4, Ar5, Ai5..
  354. MUL_SY yvec0, yvec2, yvec6;
  355. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  356. MUL_SY yvec0, yvec3, yvec7;
  357. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  358. ADD1_SY yvec6, yvec15, yvec15;
  359. ADD1_SY yvec7, yvec13, yvec13;
  360. MUL_SY yvec1, yvec2, yvec6;
  361. ODUP_SY 8*SIZE(ptrbb), yvec2; # Bi0, Bi1, Bi2, Bi3
  362. MUL_SY yvec1, yvec3, yvec7;
  363. VPERMILP_SY $0x4e, yvec2, yvec3; # Bi2, Bi3, Bi0, Bi1
  364. ADD1_SY yvec6, yvec14, yvec14;
  365. ADD1_SY yvec7, yvec12, yvec12;
  366. MUL_SY yvec0, yvec4, yvec6;
  367. MUL_SY yvec0, yvec5, yvec7;
  368. VPERMILP_SY $0xb1, yvec0, yvec0; # Ai0, Ar0, Ai1, Ar1..
  369. ADD1_SY yvec6, yvec11, yvec11;
  370. ADD1_SY yvec7, yvec9, yvec9;
  371. MUL_SY yvec1, yvec4, yvec6;
  372. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  373. MUL_SY yvec1, yvec5, yvec7;
  374. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  375. ADD1_SY yvec6, yvec10, yvec10;
  376. ADD1_SY yvec7, yvec8, yvec8;
  377. VPERMILP_SY $0xb1, yvec1, yvec1;
  378. MUL_SY yvec0, yvec2, yvec6;
  379. MUL_SY yvec0, yvec3, yvec7;
  380. ADD2_SY yvec6, yvec15, yvec15;
  381. ADD2_SY yvec7, yvec13, yvec13;
  382. MUL_SY yvec1, yvec2, yvec6;
  383. EDUP_SY 16*SIZE(ptrbb), yvec2;
  384. MUL_SY yvec1, yvec3, yvec7;
  385. VPERMILP_SY $0x4e, yvec2, yvec3;
  386. ADD2_SY yvec6, yvec14, yvec14;
  387. ADD2_SY yvec7, yvec12, yvec12;
  388. MUL_SY yvec0, yvec4, yvec6;
  389. MUL_SY yvec0, yvec5, yvec7;
  390. LD_SY 32*SIZE(ptrba), yvec0;
  391. ADD2_SY yvec6, yvec11, yvec11;
  392. ADD2_SY yvec7, yvec9, yvec9;
  393. MUL_SY yvec1, yvec4, yvec6;
  394. MUL_SY yvec1, yvec5, yvec7;
  395. ADD2_SY yvec6, yvec10, yvec10;
  396. ADD2_SY yvec7, yvec8, yvec8;
  397. ######### Unroll 3 ##################
  398. PREFETCH0 (PRESIZE+32)*SIZE(ptrba);
  399. LD_SY 40*SIZE(ptrba), yvec1; # Ar4, Ai4, Ar5, Ai5..
  400. MUL_SY yvec0, yvec2, yvec6;
  401. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  402. MUL_SY yvec0, yvec3, yvec7;
  403. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  404. ADD1_SY yvec6, yvec15, yvec15;
  405. ADD1_SY yvec7, yvec13, yvec13;
  406. MUL_SY yvec1, yvec2, yvec6;
  407. ODUP_SY 16*SIZE(ptrbb), yvec2; # Bi0, Bi1, Bi2, Bi3
  408. MUL_SY yvec1, yvec3, yvec7;
  409. VPERMILP_SY $0x4e, yvec2, yvec3; # Bi2, Bi3, Bi0, Bi1
  410. ADD1_SY yvec6, yvec14, yvec14;
  411. ADD1_SY yvec7, yvec12, yvec12;
  412. MUL_SY yvec0, yvec4, yvec6;
  413. MUL_SY yvec0, yvec5, yvec7;
  414. VPERMILP_SY $0xb1, yvec0, yvec0; # Ai0, Ar0, Ai1, Ar1..
  415. ADD1_SY yvec6, yvec11, yvec11;
  416. ADD1_SY yvec7, yvec9, yvec9;
  417. MUL_SY yvec1, yvec4, yvec6;
  418. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  419. MUL_SY yvec1, yvec5, yvec7;
  420. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  421. ADD1_SY yvec6, yvec10, yvec10;
  422. ADD1_SY yvec7, yvec8, yvec8;
  423. VPERMILP_SY $0xb1, yvec1, yvec1;
  424. MUL_SY yvec0, yvec2, yvec6;
  425. MUL_SY yvec0, yvec3, yvec7;
  426. ADD2_SY yvec6, yvec15, yvec15;
  427. ADD2_SY yvec7, yvec13, yvec13;
  428. MUL_SY yvec1, yvec2, yvec6;
  429. EDUP_SY 24*SIZE(ptrbb), yvec2;
  430. MUL_SY yvec1, yvec3, yvec7;
  431. VPERMILP_SY $0x4e, yvec2, yvec3;
  432. ADD2_SY yvec6, yvec14, yvec14;
  433. ADD2_SY yvec7, yvec12, yvec12;
  434. MUL_SY yvec0, yvec4, yvec6;
  435. MUL_SY yvec0, yvec5, yvec7;
  436. LD_SY 48*SIZE(ptrba), yvec0;
  437. ADD2_SY yvec6, yvec11, yvec11;
  438. ADD2_SY yvec7, yvec9, yvec9;
  439. MUL_SY yvec1, yvec4, yvec6;
  440. MUL_SY yvec1, yvec5, yvec7;
  441. ADD2_SY yvec6, yvec10, yvec10;
  442. ADD2_SY yvec7, yvec8, yvec8;
  443. ######### Unroll 4 ##################
  444. PREFETCH0 (PRESIZE+48)*SIZE(ptrba);
  445. LD_SY 56*SIZE(ptrba), yvec1; # Ar4, Ai4, Ar5, Ai5..
  446. MUL_SY yvec0, yvec2, yvec6;
  447. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  448. MUL_SY yvec0, yvec3, yvec7;
  449. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  450. ADDQ $64*SIZE, ptrba;
  451. ADD1_SY yvec6, yvec15, yvec15;
  452. ADD1_SY yvec7, yvec13, yvec13;
  453. MUL_SY yvec1, yvec2, yvec6;
  454. ODUP_SY 24*SIZE(ptrbb), yvec2; # Bi0, Bi1, Bi2, Bi3
  455. MUL_SY yvec1, yvec3, yvec7;
  456. VPERMILP_SY $0x4e, yvec2, yvec3; # Bi2, Bi3, Bi0, Bi1
  457. ADDQ $32*SIZE, ptrbb;
  458. ADD1_SY yvec6, yvec14, yvec14;
  459. ADD1_SY yvec7, yvec12, yvec12;
  460. MUL_SY yvec0, yvec4, yvec6;
  461. MUL_SY yvec0, yvec5, yvec7;
  462. VPERMILP_SY $0xb1, yvec0, yvec0; # Ai0, Ar0, Ai1, Ar1..
  463. ADD1_SY yvec6, yvec11, yvec11;
  464. ADD1_SY yvec7, yvec9, yvec9;
  465. MUL_SY yvec1, yvec4, yvec6;
  466. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  467. MUL_SY yvec1, yvec5, yvec7;
  468. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  469. ADD1_SY yvec6, yvec10, yvec10;
  470. ADD1_SY yvec7, yvec8, yvec8;
  471. VPERMILP_SY $0xb1, yvec1, yvec1;
  472. MUL_SY yvec0, yvec2, yvec6;
  473. MUL_SY yvec0, yvec3, yvec7;
  474. ADD2_SY yvec6, yvec15, yvec15;
  475. ADD2_SY yvec7, yvec13, yvec13;
  476. MUL_SY yvec1, yvec2, yvec6;
  477. EDUP_SY 0*SIZE(ptrbb), yvec2;
  478. MUL_SY yvec1, yvec3, yvec7;
  479. VPERMILP_SY $0x4e, yvec2, yvec3;
  480. ADD2_SY yvec6, yvec14, yvec14;
  481. ADD2_SY yvec7, yvec12, yvec12;
  482. MUL_SY yvec0, yvec4, yvec6;
  483. MUL_SY yvec0, yvec5, yvec7;
  484. LD_SY 0*SIZE(ptrba), yvec0;
  485. ADD2_SY yvec6, yvec11, yvec11;
  486. ADD2_SY yvec7, yvec9, yvec9;
  487. MUL_SY yvec1, yvec4, yvec6;
  488. MUL_SY yvec1, yvec5, yvec7;
  489. ADD2_SY yvec6, yvec10, yvec10;
  490. ADD2_SY yvec7, yvec8, yvec8;
  491. .L2_bodyE:;
  492. DECQ k;
  493. JG .L2_bodyB;
  494. ALIGN_5
  495. .L2_loopE:;
  496. #ifndef TRMMKERNEL
  497. TEST $2, bk;
  498. #else
  499. TEST $2, kkk;
  500. #endif
  501. JLE .L3_loopE;
  502. ALIGN_5
  503. .L3_loopB:
  504. ######### Unroll 1 ##################
  505. PREFETCH0 PRESIZE*SIZE(ptrba)
  506. LD_SY 8*SIZE(ptrba), yvec1; # Ar4, Ai4, Ar5, Ai5..
  507. MUL_SY yvec0, yvec2, yvec6;
  508. MUL_SY yvec0, yvec3, yvec7;
  509. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  510. ADD1_SY yvec6, yvec15, yvec15;
  511. ADD1_SY yvec7, yvec13, yvec13;
  512. MUL_SY yvec1, yvec2, yvec6;
  513. MUL_SY yvec1, yvec3, yvec7;
  514. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  515. ADD1_SY yvec6, yvec14, yvec14;
  516. ADD1_SY yvec7, yvec12, yvec12;
  517. ODUP_SY 0*SIZE(ptrbb), yvec2; # Bi0, Bi1, Bi2, Bi3
  518. MUL_SY yvec0, yvec4, yvec6;
  519. MUL_SY yvec0, yvec5, yvec7;
  520. VPERMILP_SY $0x4e, yvec2, yvec3; # Bi2, Bi3, Bi0, Bi1
  521. ADD1_SY yvec6, yvec11, yvec11;
  522. ADD1_SY yvec7, yvec9, yvec9;
  523. MUL_SY yvec1, yvec4, yvec6;
  524. MUL_SY yvec1, yvec5, yvec7;
  525. VPERMILP_SY $0xb1, yvec0, yvec0; # Ai0, Ar0, Ai1, Ar1..
  526. ADD1_SY yvec6, yvec10, yvec10;
  527. ADD1_SY yvec7, yvec8, yvec8;
  528. VPERMILP_SY $0xb1, yvec1, yvec1;
  529. MUL_SY yvec0, yvec2, yvec6;
  530. MUL_SY yvec0, yvec3, yvec7;
  531. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  532. ADD2_SY yvec6, yvec15, yvec15;
  533. ADD2_SY yvec7, yvec13, yvec13;
  534. MUL_SY yvec1, yvec2, yvec6;
  535. MUL_SY yvec1, yvec3, yvec7;
  536. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  537. ADD2_SY yvec6, yvec14, yvec14;
  538. ADD2_SY yvec7, yvec12, yvec12;
  539. EDUP_SY 8*SIZE(ptrbb), yvec2;
  540. MUL_SY yvec0, yvec4, yvec6;
  541. MUL_SY yvec0, yvec5, yvec7;
  542. VPERMILP_SY $0x4e, yvec2, yvec3;
  543. ADD2_SY yvec6, yvec11, yvec11;
  544. ADD2_SY yvec7, yvec9, yvec9;
  545. LD_SY 16*SIZE(ptrba), yvec0;
  546. MUL_SY yvec1, yvec4, yvec6;
  547. MUL_SY yvec1, yvec5, yvec7;
  548. ADD2_SY yvec6, yvec10, yvec10;
  549. ADD2_SY yvec7, yvec8, yvec8;
  550. ######### Unroll 2 ##################
  551. PREFETCH0 (PRESIZE+16)*SIZE(ptrba)
  552. LD_SY 24*SIZE(ptrba), yvec1; # Ar4, Ai4, Ar5, Ai5..
  553. MUL_SY yvec0, yvec2, yvec6;
  554. MUL_SY yvec0, yvec3, yvec7;
  555. ADDQ $32*SIZE, ptrba
  556. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  557. ADD1_SY yvec6, yvec15, yvec15;
  558. ADD1_SY yvec7, yvec13, yvec13;
  559. MUL_SY yvec1, yvec2, yvec6;
  560. MUL_SY yvec1, yvec3, yvec7;
  561. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  562. ADD1_SY yvec6, yvec14, yvec14;
  563. ADD1_SY yvec7, yvec12, yvec12;
  564. ODUP_SY 8*SIZE(ptrbb), yvec2; # Bi0, Bi1, Bi2, Bi3
  565. MUL_SY yvec0, yvec4, yvec6;
  566. MUL_SY yvec0, yvec5, yvec7;
  567. ADDQ $16*SIZE, ptrbb;
  568. VPERMILP_SY $0x4e, yvec2, yvec3; # Bi2, Bi3, Bi0, Bi1
  569. ADD1_SY yvec6, yvec11, yvec11;
  570. ADD1_SY yvec7, yvec9, yvec9;
  571. MUL_SY yvec1, yvec4, yvec6;
  572. MUL_SY yvec1, yvec5, yvec7;
  573. VPERMILP_SY $0xb1, yvec0, yvec0; # Ai0, Ar0, Ai1, Ar1..
  574. ADD1_SY yvec6, yvec10, yvec10;
  575. ADD1_SY yvec7, yvec8, yvec8;
  576. VPERMILP_SY $0xb1, yvec1, yvec1;
  577. MUL_SY yvec0, yvec2, yvec6;
  578. MUL_SY yvec0, yvec3, yvec7;
  579. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  580. ADD2_SY yvec6, yvec15, yvec15;
  581. ADD2_SY yvec7, yvec13, yvec13;
  582. MUL_SY yvec1, yvec2, yvec6;
  583. MUL_SY yvec1, yvec3, yvec7;
  584. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  585. ADD2_SY yvec6, yvec14, yvec14;
  586. ADD2_SY yvec7, yvec12, yvec12;
  587. EDUP_SY 0*SIZE(ptrbb), yvec2;
  588. MUL_SY yvec0, yvec4, yvec6;
  589. MUL_SY yvec0, yvec5, yvec7;
  590. VPERMILP_SY $0x4e, yvec2, yvec3;
  591. ADD2_SY yvec6, yvec11, yvec11;
  592. ADD2_SY yvec7, yvec9, yvec9;
  593. LD_SY 0*SIZE(ptrba), yvec0;
  594. MUL_SY yvec1, yvec4, yvec6;
  595. MUL_SY yvec1, yvec5, yvec7;
  596. ADD2_SY yvec6, yvec10, yvec10;
  597. ADD2_SY yvec7, yvec8, yvec8;
  598. .L3_loopE:
  599. #ifndef TRMMKERNEL
  600. TEST $1, bk;
  601. #else
  602. TEST $1, kkk;
  603. #endif
  604. JLE .L4_loopE;
  605. ALIGN_5
  606. .L4_loopB:;
  607. ######### Unroll 1 ##################
  608. PREFETCH0 PRESIZE*SIZE(ptrba)
  609. LD_SY 8*SIZE(ptrba), yvec1; # Ar4, Ai4, Ar5, Ai5..
  610. MUL_SY yvec0, yvec2, yvec6;
  611. MUL_SY yvec0, yvec3, yvec7;
  612. ADDQ $16*SIZE, ptrba;
  613. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  614. ADD1_SY yvec6, yvec15, yvec15;
  615. ADD1_SY yvec7, yvec13, yvec13;
  616. MUL_SY yvec1, yvec2, yvec6;
  617. MUL_SY yvec1, yvec3, yvec7;
  618. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  619. ADD1_SY yvec6, yvec14, yvec14;
  620. ADD1_SY yvec7, yvec12, yvec12;
  621. ODUP_SY 0*SIZE(ptrbb), yvec2; # Bi0, Bi1, Bi2, Bi3
  622. MUL_SY yvec0, yvec4, yvec6;
  623. MUL_SY yvec0, yvec5, yvec7;
  624. ADDQ $8*SIZE, ptrbb;
  625. VPERMILP_SY $0x4e, yvec2, yvec3; # Bi2, Bi3, Bi0, Bi1
  626. ADD1_SY yvec6, yvec11, yvec11;
  627. ADD1_SY yvec7, yvec9, yvec9;
  628. MUL_SY yvec1, yvec4, yvec6;
  629. MUL_SY yvec1, yvec5, yvec7;
  630. VPERMILP_SY $0xb1, yvec0, yvec0; # Ai0, Ar0, Ai1, Ar1..
  631. ADD1_SY yvec6, yvec10, yvec10;
  632. ADD1_SY yvec7, yvec8, yvec8;
  633. VPERMILP_SY $0xb1, yvec1, yvec1;
  634. MUL_SY yvec0, yvec2, yvec6;
  635. MUL_SY yvec0, yvec3, yvec7;
  636. SHUF_SY $0x03, yvec2, yvec2, yvec4; # Br1, Br0, Br3, Br2
  637. ADD2_SY yvec6, yvec15, yvec15;
  638. ADD2_SY yvec7, yvec13, yvec13;
  639. MUL_SY yvec1, yvec2, yvec6;
  640. ADD2_SY yvec6, yvec14, yvec14;
  641. SHUF_SY $0x03, yvec3, yvec3, yvec5; # Br3, Br2, Br1, Br0
  642. MUL_SY yvec1, yvec3, yvec7;
  643. ADD2_SY yvec7, yvec12, yvec12;
  644. MUL_SY yvec0, yvec4, yvec6;
  645. MUL_SY yvec0, yvec5, yvec7;
  646. VPERMILP_SY $0x4e, yvec2, yvec3;
  647. ADD2_SY yvec6, yvec11, yvec11;
  648. ADD2_SY yvec7, yvec9, yvec9;
  649. MUL_SY yvec1, yvec4, yvec6;
  650. MUL_SY yvec1, yvec5, yvec7;
  651. ADD2_SY yvec6, yvec10, yvec10;
  652. ADD2_SY yvec7, yvec8, yvec8;
  653. .L4_loopE:;
  654. #### Handle ####
  655. XOR_SY yvec7, yvec7, yvec7;
  656. #if defined(RN) || defined(RT) || defined(CN) || defined(CT)
  657. ADDSUB_SY yvec15, yvec7, yvec15;
  658. ADDSUB_SY yvec14, yvec7, yvec14;
  659. ADDSUB_SY yvec13, yvec7, yvec13;
  660. ADDSUB_SY yvec12, yvec7, yvec12;
  661. ADDSUB_SY yvec11, yvec7, yvec11;
  662. ADDSUB_SY yvec10, yvec7, yvec10;
  663. ADDSUB_SY yvec9, yvec7, yvec9;
  664. ADDSUB_SY yvec8, yvec7, yvec8;
  665. #elif defined(NR) || defined(NC) || defined(TR) || defined(TC)
  666. SUB_SY yvec15, yvec7, yvec15;
  667. SUB_SY yvec14, yvec7, yvec14;
  668. SUB_SY yvec13, yvec7, yvec13;
  669. SUB_SY yvec12, yvec7, yvec12;
  670. SUB_SY yvec11, yvec7, yvec11;
  671. SUB_SY yvec10, yvec7, yvec10;
  672. SUB_SY yvec9, yvec7, yvec9;
  673. SUB_SY yvec8, yvec7, yvec8;
  674. #elif defined(RR) || defined(RC) || defined(CR) || defined(CC)
  675. VPERMILP_SY $0xb1, yvec15, yvec15;
  676. VPERMILP_SY $0xb1, yvec14, yvec14;
  677. VPERMILP_SY $0xb1, yvec13, yvec13;
  678. VPERMILP_SY $0xb1, yvec12, yvec12;
  679. VPERMILP_SY $0xb1, yvec11, yvec11;
  680. VPERMILP_SY $0xb1, yvec10, yvec10;
  681. VPERMILP_SY $0xb1, yvec9, yvec9;
  682. VPERMILP_SY $0xb1, yvec8, yvec8;
  683. ADDSUB_SY yvec15, yvec7, yvec15;
  684. ADDSUB_SY yvec14, yvec7, yvec14;
  685. ADDSUB_SY yvec13, yvec7, yvec13;
  686. ADDSUB_SY yvec12, yvec7, yvec12;
  687. ADDSUB_SY yvec11, yvec7, yvec11;
  688. ADDSUB_SY yvec10, yvec7, yvec10;
  689. ADDSUB_SY yvec9, yvec7, yvec9;
  690. ADDSUB_SY yvec8, yvec7, yvec8;
  691. VPERMILP_SY $0xb1, yvec15, yvec15;
  692. VPERMILP_SY $0xb1, yvec14, yvec14;
  693. VPERMILP_SY $0xb1, yvec13, yvec13;
  694. VPERMILP_SY $0xb1, yvec12, yvec12;
  695. VPERMILP_SY $0xb1, yvec11, yvec11;
  696. VPERMILP_SY $0xb1, yvec10, yvec10;
  697. VPERMILP_SY $0xb1, yvec9, yvec9;
  698. VPERMILP_SY $0xb1, yvec8, yvec8;
  699. #endif
  700. ##### Load Alpha ####
  701. BROAD_SY MEMALPHA_R,yvec7;
  702. BROAD_SY MEMALPHA_I,yvec6;
  703. ##### Multiply Alpha ####
  704. VPERMILP_SY $0xb1,yvec15, yvec5;
  705. MUL_SY yvec15, yvec7, yvec15;
  706. MUL_SY yvec5, yvec6, yvec5;
  707. ADDSUB_SY yvec5, yvec15, yvec15;
  708. VPERMILP_SY $0xb1,yvec14, yvec4;
  709. MUL_SY yvec14, yvec7, yvec14;
  710. MUL_SY yvec4, yvec6, yvec4;
  711. ADDSUB_SY yvec4, yvec14, yvec14;
  712. VPERMILP_SY $0xb1,yvec13, yvec3;
  713. MUL_SY yvec13, yvec7, yvec13;
  714. MUL_SY yvec3, yvec6, yvec3;
  715. ADDSUB_SY yvec3, yvec13, yvec13;
  716. VPERMILP_SY $0xb1,yvec12, yvec2;
  717. MUL_SY yvec12, yvec7, yvec12;
  718. MUL_SY yvec2, yvec6, yvec2;
  719. ADDSUB_SY yvec2, yvec12, yvec12;
  720. VPERMILP_SY $0xb1,yvec11, yvec1;
  721. MUL_SY yvec11, yvec7, yvec11;
  722. MUL_SY yvec1, yvec6, yvec1;
  723. ADDSUB_SY yvec1, yvec11, yvec11;
  724. VPERMILP_SY $0xb1,yvec10, yvec0;
  725. MUL_SY yvec10, yvec7, yvec10;
  726. MUL_SY yvec0, yvec6, yvec0;
  727. ADDSUB_SY yvec0, yvec10, yvec10;
  728. VPERMILP_SY $0xb1,yvec9, yvec5;
  729. MUL_SY yvec9, yvec7, yvec9;
  730. MUL_SY yvec5, yvec6, yvec5;
  731. ADDSUB_SY yvec5, yvec9, yvec9;
  732. VPERMILP_SY $0xb1,yvec8, yvec4;
  733. MUL_SY yvec8, yvec7, yvec8;
  734. MUL_SY yvec4, yvec6, yvec4;
  735. ADDSUB_SY yvec4, yvec8, yvec8;
  736. #### Shuffle Results ####
  737. MOV_SY yvec15,yvec7;
  738. REVS_SY $0xe4,yvec13,yvec15,yvec15;
  739. REVS_SY $0xe4,yvec7,yvec13,yvec13;
  740. MOV_SY yvec14,yvec7;
  741. REVS_SY $0xe4,yvec12,yvec14,yvec14;
  742. REVS_SY $0xe4,yvec7,yvec12,yvec12;
  743. MOV_SY yvec11,yvec7;
  744. REVS_SY $0xe4,yvec9,yvec11,yvec11;
  745. REVS_SY $0xe4,yvec7,yvec9,yvec9;
  746. MOV_SY yvec10,yvec7;
  747. REVS_SY $0xe4,yvec8,yvec10,yvec10;
  748. REVS_SY $0xe4,yvec7,yvec8,yvec8;
  749. #### Store Back ####
  750. #### Testing alignment ####
  751. MOVQ C0, %rax;
  752. OR ldc, %rax;
  753. TEST $15, %rax;
  754. JNE .L4_loopEx;
  755. ALIGN_5
  756. EXTRA_SY $1,yvec15,xvec7;
  757. EXTRA_SY $1,yvec14,xvec6;
  758. EXTRA_SY $1,yvec13,xvec5;
  759. EXTRA_SY $1,yvec12,xvec4;
  760. EXTRA_SY $1,yvec11,xvec3;
  761. EXTRA_SY $1,yvec10,xvec2;
  762. EXTRA_SY $1,yvec9,xvec1;
  763. EXTRA_SY $1,yvec8,xvec0;
  764. #ifndef TRMMKERNEL
  765. ADD_SY 0*SIZE(C0),xvec15, xvec15;
  766. ADD_SY 4*SIZE(C1),xvec7, xvec7;
  767. ADD_SY 8*SIZE(C0),xvec14, xvec14;
  768. ADD_SY 12*SIZE(C1),xvec6, xvec6;
  769. ADD_SY 0*SIZE(C0,ldc,1),xvec13, xvec13;
  770. ADD_SY 4*SIZE(C1,ldc,1),xvec5, xvec5;
  771. ADD_SY 8*SIZE(C0,ldc,1),xvec12, xvec12;
  772. ADD_SY 12*SIZE(C1,ldc,1),xvec4, xvec4;
  773. ADD_SY 0*SIZE(C1),xvec11, xvec11;
  774. ADD_SY 4*SIZE(C0),xvec3, xvec3;
  775. ADD_SY 8*SIZE(C1),xvec10, xvec10;
  776. ADD_SY 12*SIZE(C0),xvec2, xvec2;
  777. ADD_SY 0*SIZE(C1,ldc,1),xvec9, xvec9;
  778. ADD_SY 4*SIZE(C0,ldc,1),xvec1, xvec1;
  779. ADD_SY 8*SIZE(C1,ldc,1),xvec8, xvec8;
  780. ADD_SY 12*SIZE(C0,ldc,1),xvec0, xvec0;
  781. #endif
  782. ST_SY xvec15,0*SIZE(C0);
  783. ST_SY xvec7,4*SIZE(C1);
  784. ST_SY xvec14,8*SIZE(C0);
  785. ST_SY xvec6,12*SIZE(C1);
  786. ST_SY xvec13,0*SIZE(C0,ldc,1);
  787. ST_SY xvec5,4*SIZE(C1,ldc,1);
  788. ST_SY xvec12,8*SIZE(C0,ldc,1);
  789. ST_SY xvec4,12*SIZE(C1,ldc,1);
  790. ST_SY xvec11,0*SIZE(C1);
  791. ST_SY xvec3,4*SIZE(C0);
  792. ST_SY xvec10,8*SIZE(C1);
  793. ST_SY xvec2,12*SIZE(C0);
  794. ST_SY xvec9,0*SIZE(C1,ldc,1);
  795. ST_SY xvec1,4*SIZE(C0,ldc,1);
  796. ST_SY xvec8,8*SIZE(C1,ldc,1);
  797. ST_SY xvec0,12*SIZE(C0,ldc,1);
  798. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  799. MOVQ bk, %rax;
  800. SUBQ kkk, %rax;
  801. SALQ $ZBASE_SHIFT, %rax;
  802. LEAQ (ptrba, %rax, 8), ptrba;
  803. LEAQ (ptrbb, %rax, 4), ptrbb;
  804. #endif
  805. #if defined(TRMMKERNEL) && defined(LEFT)
  806. ADDQ $8, kk;
  807. #endif
  808. ADDQ $16*SIZE,C0;
  809. ADDQ $16*SIZE,C1;
  810. .L1_bodyE:;
  811. DECQ i;
  812. JG .L1_bodyB;
  813. JMP .L1_loopE;
  814. ALIGN_5
  815. .L4_loopEx:
  816. EXTRA_SY $1, yvec15, xvec7;
  817. #ifndef TRMMKERNEL
  818. LDL_SY 0*SIZE(C0), xvec6, xvec6;
  819. LDH_SY 2*SIZE(C0), xvec6, xvec6;
  820. ADD_SY xvec6, xvec15, xvec15;
  821. #endif
  822. STL_SY xvec15, 0*SIZE(C0);
  823. STH_SY xvec15, 2*SIZE(C0);
  824. #ifndef TRMMKERNEL
  825. LDL_SY 4*SIZE(C1), xvec5, xvec5;
  826. LDH_SY 6*SIZE(C1), xvec5, xvec5;
  827. ADD_SY xvec5, xvec7, xvec7;
  828. #endif
  829. STL_SY xvec7, 4*SIZE(C1);
  830. STH_SY xvec7, 6*SIZE(C1);
  831. EXTRA_SY $1, yvec14, xvec6;
  832. #ifndef TRMMKERNEL
  833. LDL_SY 8*SIZE(C0), xvec5, xvec5;
  834. LDH_SY 10*SIZE(C0), xvec5, xvec5;
  835. ADD_SY xvec5, xvec14, xvec14;
  836. #endif
  837. STL_SY xvec14, 8*SIZE(C0);
  838. STH_SY xvec14, 10*SIZE(C0);
  839. #ifndef TRMMKERNEL
  840. LDL_SY 12*SIZE(C1), xvec4, xvec4;
  841. LDH_SY 14*SIZE(C1), xvec4, xvec4;
  842. ADD_SY xvec4, xvec6, xvec6;
  843. #endif
  844. STL_SY xvec6, 12*SIZE(C1);
  845. STH_SY xvec6, 14*SIZE(C1);
  846. EXTRA_SY $1, yvec13, xvec5;
  847. #ifndef TRMMKERNEL
  848. LDL_SY 0*SIZE(C0, ldc, 1), xvec4, xvec4;
  849. LDH_SY 2*SIZE(C0, ldc, 1), xvec4, xvec4;
  850. ADD_SY xvec4, xvec13, xvec13;
  851. #endif
  852. STL_SY xvec13, 0*SIZE(C0, ldc, 1);
  853. STH_SY xvec13, 2*SIZE(C0, ldc, 1);
  854. #ifndef TRMMKERNEL
  855. LDL_SY 4*SIZE(C1, ldc, 1), xvec3, xvec3;
  856. LDH_SY 6*SIZE(C1, ldc, 1), xvec3, xvec3;
  857. ADD_SY xvec3, xvec5, xvec5;
  858. #endif
  859. STL_SY xvec5, 4*SIZE(C1, ldc, 1);
  860. STH_SX xvec5, 6*SIZE(C1, ldc, 1);
  861. EXTRA_SY $1, yvec12, xvec4;
  862. #ifndef TRMMKERNEL
  863. LDL_SY 8*SIZE(C0, ldc, 1), xvec3, xvec3;
  864. LDH_SY 10*SIZE(C0, ldc, 1), xvec3, xvec3;
  865. ADD_SY xvec3, xvec12, xvec12;
  866. #endif
  867. STL_SY xvec12, 8*SIZE(C0, ldc, 1);
  868. STH_SY xvec12, 10*SIZE(C0, ldc, 1);
  869. #ifndef TRMMKERNEL
  870. LDL_SY 12*SIZE(C1, ldc, 1), xvec2, xvec2;
  871. LDH_SY 14*SIZE(C1, ldc, 1), xvec2, xvec2;
  872. ADD_SY xvec2, xvec4, xvec4;
  873. #endif
  874. STL_SY xvec4, 12*SIZE(C1, ldc, 1);
  875. STH_SY xvec4, 14*SIZE(C1, ldc, 1);
  876. EXTRA_SY $1, yvec11, xvec3;
  877. #ifndef TRMMKERNEL
  878. LDL_SY 0*SIZE(C1), xvec2, xvec2;
  879. LDH_SY 2*SIZE(C1), xvec2, xvec2;
  880. ADD_SY xvec2, xvec11, xvec11;
  881. #endif
  882. STL_SY xvec11, 0*SIZE(C1);
  883. STH_SY xvec11, 2*SIZE(C1);
  884. #ifndef TRMMKERNEL
  885. LDL_SY 4*SIZE(C0), xvec1, xvec1;
  886. LDH_SY 6*SIZE(C0), xvec1, xvec1;
  887. ADD_SY xvec1, xvec3, xvec3;
  888. #endif
  889. STL_SY xvec3, 4*SIZE(C0);
  890. STH_SY xvec3, 6*SIZE(C0);
  891. EXTRA_SY $1, yvec10, xvec2;
  892. #ifndef TRMMKERNEL
  893. LDL_SY 8*SIZE(C1), xvec1, xvec1;
  894. LDH_SY 10*SIZE(C1), xvec1, xvec1;
  895. ADD_SY xvec1, xvec10, xvec10;
  896. #endif
  897. STL_SY xvec10, 8*SIZE(C1);
  898. STH_SY xvec10, 10*SIZE(C1);
  899. #ifndef TRMMKERNEL
  900. LDL_SY 12*SIZE(C0), xvec0, xvec0;
  901. LDH_SY 14*SIZE(C0), xvec0, xvec0;
  902. ADD_SY xvec0, xvec2, xvec2;
  903. #endif
  904. STL_SY xvec2, 12*SIZE(C0);
  905. STH_SY xvec2, 14*SIZE(C0);
  906. EXTRA_SY $1, yvec9, xvec1;
  907. #ifndef TRMMKERNEL
  908. LDL_SY 0*SIZE(C1, ldc, 1), xvec7, xvec7;
  909. LDH_SY 2*SIZE(C1, ldc, 1), xvec7, xvec7;
  910. ADD_SY xvec7, xvec9, xvec9;
  911. #endif
  912. STL_SY xvec9, 0*SIZE(C1, ldc, 1);
  913. STH_SY xvec9, 2*SIZE(C1, ldc, 1);
  914. #ifndef TRMMKERNEL
  915. LDL_SY 4*SIZE(C0, ldc, 1), xvec6, xvec6;
  916. LDH_SY 6*SIZE(C0, ldc, 1), xvec6, xvec6;
  917. ADD_SY xvec6, xvec1, xvec1;
  918. #endif
  919. STL_SY xvec1, 4*SIZE(C0, ldc, 1);
  920. STH_SY xvec1, 6*SIZE(C0, ldc, 1);
  921. EXTRA_SY $1, yvec8, xvec0;
  922. #ifndef TRMMKERNEL
  923. LDL_SY 8*SIZE(C1, ldc, 1), xvec6, xvec6;
  924. LDH_SY 10*SIZE(C1, ldc, 1), xvec6, xvec6;
  925. ADD_SY xvec6, xvec8, xvec8;
  926. #endif
  927. STL_SY xvec8, 8*SIZE(C1, ldc, 1);
  928. STH_SY xvec8, 10*SIZE(C1, ldc, 1);
  929. #ifndef TRMMKERNEL
  930. LDL_SY 12*SIZE(C0, ldc, 1), xvec5, xvec5;
  931. LDH_SY 14*SIZE(C0, ldc, 1), xvec5, xvec5;
  932. ADD_SY xvec5, xvec0, xvec0;
  933. #endif
  934. STL_SY xvec0, 12*SIZE(C0, ldc, 1);
  935. STH_SY xvec0, 14*SIZE(C0, ldc, 1);
  936. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  937. MOVQ bk, %rax;
  938. SUBQ kkk, %rax;
  939. SALQ $ZBASE_SHIFT, %rax;
  940. LEAQ (ptrba, %rax, 8), ptrba;
  941. LEAQ (ptrbb, %rax, 4), ptrbb;
  942. #endif
  943. #if defined(TRMMKERNEL) && defined(LEFT)
  944. ADDQ $8, kk;
  945. #endif
  946. ADDQ $16*SIZE, C0;
  947. ADDQ $16*SIZE, C1;
  948. DECQ i;
  949. JG .L1_bodyB;
  950. ALIGN_5;
  951. .L1_loopE:;
  952. TEST $4, bm;
  953. JLE .L5_loopE;
  954. ALIGN_5
  955. .L5_bodyB:
  956. #if !defined(TRMMKERNEL)||(defined(TRMMKERNEL)&&defined(LEFT)&&defined(TRANSA))||(defined(TRMMKERNEL)&&!defined(LEFT)&&!defined(TRANSA))
  957. MOVQ bb,ptrbb;
  958. #else
  959. MOVQ bb, ptrbb;
  960. MOVQ kk, %rax;
  961. SALQ $ZBASE_SHIFT, %rax;
  962. LEAQ (ptrba, %rax, 4), ptrba;
  963. LEAQ (ptrbb, %rax, 4), ptrbb;
  964. #endif
  965. XOR_SY yvec15, yvec15, yvec15;
  966. XOR_SY yvec13, yvec13, yvec13;
  967. XOR_SY yvec11, yvec11, yvec11;
  968. XOR_SY yvec9, yvec9, yvec9;
  969. #ifndef TRMMKERNEL
  970. MOVQ bk,k;
  971. #elif (defined(LEFT)&&!defined(TRANSA))||(!defined(LEFT)&&defined(TRANSA))
  972. MOVQ bk, %rax;
  973. SUBQ kk, %rax;
  974. MOVQ %rax, kkk;
  975. #else
  976. MOVQ kk, %rax;
  977. #ifdef LEFT
  978. ADDQ $4, %rax;
  979. #else
  980. ADDQ $4, %rax;
  981. #endif
  982. MOVQ %rax, kkk;
  983. #endif
  984. SARQ $2, k;
  985. JLE .L8_loopE;
  986. ALIGN_5
  987. .L8_bodyB:
  988. #### Unroll times 1 ####
  989. LD_SY 0*SIZE(ptrba), yvec0;
  990. VPERMILP_SY $0xb1, yvec0, yvec1;
  991. EDUP_SY 0*SIZE(ptrbb), yvec2;
  992. VPERMILP_SY $0x4e, yvec2, yvec3;
  993. MUL_SY yvec0, yvec2, yvec6;
  994. ADD1_SY yvec6, yvec15, yvec15;
  995. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  996. MUL_SY yvec0, yvec3, yvec7;
  997. ADD1_SY yvec7, yvec13, yvec13;
  998. ODUP_SY 0*SIZE(ptrbb), yvec2;
  999. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1000. MUL_SY yvec0, yvec4, yvec6;
  1001. ADD1_SY yvec6, yvec11, yvec11;
  1002. VPERMILP_SY $0x4e, yvec2, yvec3;
  1003. MUL_SY yvec0, yvec5, yvec7;
  1004. ADD1_SY yvec7, yvec9, yvec9;
  1005. MUL_SY yvec1, yvec2, yvec6;
  1006. ADD2_SY yvec6, yvec15, yvec15;
  1007. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1008. MUL_SY yvec1, yvec3, yvec7;
  1009. ADD2_SY yvec7, yvec13, yvec13;
  1010. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1011. MUL_SY yvec1, yvec4, yvec6;
  1012. ADD2_SY yvec6, yvec11, yvec11;
  1013. MUL_SY yvec1, yvec5, yvec7;
  1014. ADD2_SY yvec7, yvec9, yvec9;
  1015. #### Unroll time 2 ####
  1016. LD_SY 8*SIZE(ptrba), yvec0;
  1017. VPERMILP_SY $0xb1, yvec0, yvec1;
  1018. EDUP_SY 8*SIZE(ptrbb), yvec2;
  1019. VPERMILP_SY $0x4e, yvec2, yvec3;
  1020. MUL_SY yvec0, yvec2, yvec6;
  1021. ADD1_SY yvec6, yvec15, yvec15;
  1022. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1023. MUL_SY yvec0, yvec3, yvec7;
  1024. ADD1_SY yvec7, yvec13, yvec13;
  1025. ODUP_SY 8*SIZE(ptrbb), yvec2;
  1026. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1027. MUL_SY yvec0, yvec4, yvec6;
  1028. ADD1_SY yvec6, yvec11, yvec11;
  1029. VPERMILP_SY $0x4e, yvec2, yvec3;
  1030. MUL_SY yvec0, yvec5, yvec7;
  1031. ADD1_SY yvec7, yvec9, yvec9;
  1032. MUL_SY yvec1, yvec2, yvec6;
  1033. ADD2_SY yvec6, yvec15, yvec15;
  1034. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1035. MUL_SY yvec1, yvec3, yvec7;
  1036. ADD2_SY yvec7, yvec13, yvec13;
  1037. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1038. MUL_SY yvec1, yvec4, yvec6;
  1039. ADD2_SY yvec6, yvec11, yvec11;
  1040. MUL_SY yvec1, yvec5, yvec7;
  1041. ADD2_SY yvec7, yvec9, yvec9;
  1042. #### Unroll time 3 ####
  1043. LD_SY 16*SIZE(ptrba), yvec0;
  1044. VPERMILP_SY $0xb1, yvec0, yvec1;
  1045. EDUP_SY 16*SIZE(ptrbb), yvec2;
  1046. VPERMILP_SY $0x4e, yvec2, yvec3;
  1047. MUL_SY yvec0, yvec2, yvec6;
  1048. ADD1_SY yvec6, yvec15, yvec15;
  1049. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1050. MUL_SY yvec0, yvec3, yvec7;
  1051. ADD1_SY yvec7, yvec13, yvec13;
  1052. ODUP_SY 16*SIZE(ptrbb), yvec2;
  1053. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1054. MUL_SY yvec0, yvec4, yvec6;
  1055. ADD1_SY yvec6, yvec11, yvec11;
  1056. VPERMILP_SY $0x4e, yvec2, yvec3;
  1057. MUL_SY yvec0, yvec5, yvec7;
  1058. ADD1_SY yvec7, yvec9, yvec9;
  1059. MUL_SY yvec1, yvec2, yvec6;
  1060. ADD2_SY yvec6, yvec15, yvec15;
  1061. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1062. MUL_SY yvec1, yvec3, yvec7;
  1063. ADD2_SY yvec7, yvec13, yvec13;
  1064. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1065. MUL_SY yvec1, yvec4, yvec6;
  1066. ADD2_SY yvec6, yvec11, yvec11;
  1067. MUL_SY yvec1, yvec5, yvec7;
  1068. ADD2_SY yvec7, yvec9, yvec9;
  1069. #### Unroll time 3 ####
  1070. LD_SY 24*SIZE(ptrba), yvec0;
  1071. VPERMILP_SY $0xb1, yvec0, yvec1;
  1072. EDUP_SY 24*SIZE(ptrbb), yvec2;
  1073. VPERMILP_SY $0x4e, yvec2, yvec3;
  1074. MUL_SY yvec0, yvec2, yvec6;
  1075. ADD1_SY yvec6, yvec15, yvec15;
  1076. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1077. MUL_SY yvec0, yvec3, yvec7;
  1078. ADD1_SY yvec7, yvec13, yvec13;
  1079. ODUP_SY 24*SIZE(ptrbb), yvec2;
  1080. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1081. MUL_SY yvec0, yvec4, yvec6;
  1082. ADD1_SY yvec6, yvec11, yvec11;
  1083. VPERMILP_SY $0x4e, yvec2, yvec3;
  1084. MUL_SY yvec0, yvec5, yvec7;
  1085. ADD1_SY yvec7, yvec9, yvec9;
  1086. MUL_SY yvec1, yvec2, yvec6;
  1087. ADD2_SY yvec6, yvec15, yvec15;
  1088. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1089. MUL_SY yvec1, yvec3, yvec7;
  1090. ADD2_SY yvec7, yvec13, yvec13;
  1091. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1092. MUL_SY yvec1, yvec4, yvec6;
  1093. ADD2_SY yvec6, yvec11, yvec11;
  1094. MUL_SY yvec1, yvec5, yvec7;
  1095. ADD2_SY yvec7, yvec9, yvec9;
  1096. ADDQ $32*SIZE, ptrba;
  1097. ADDQ $32*SIZE, ptrbb;
  1098. DECQ k;
  1099. JG .L8_bodyB;
  1100. ALIGN_5
  1101. .L8_loopE:
  1102. #ifndef TRMMKERNEL
  1103. TEST $2, bk;
  1104. #else
  1105. TEST $2, kkk;
  1106. #endif
  1107. JLE .L9_loopE;
  1108. ALIGN_5
  1109. .L9_bodyB:
  1110. #### Unroll times 1 ####
  1111. LD_SY 0*SIZE(ptrba), yvec0;
  1112. VPERMILP_SY $0xb1, yvec0, yvec1;
  1113. EDUP_SY 0*SIZE(ptrbb), yvec2;
  1114. VPERMILP_SY $0x4e, yvec2, yvec3;
  1115. MUL_SY yvec0, yvec2, yvec6;
  1116. ADD1_SY yvec6, yvec15, yvec15;
  1117. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1118. MUL_SY yvec0, yvec3, yvec7;
  1119. ADD1_SY yvec7, yvec13, yvec13;
  1120. ODUP_SY 0*SIZE(ptrbb), yvec2;
  1121. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1122. MUL_SY yvec0, yvec4, yvec6;
  1123. ADD1_SY yvec6, yvec11, yvec11;
  1124. VPERMILP_SY $0x4e, yvec2, yvec3;
  1125. MUL_SY yvec0, yvec5, yvec7;
  1126. ADD1_SY yvec7, yvec9, yvec9;
  1127. MUL_SY yvec1, yvec2, yvec6;
  1128. ADD2_SY yvec6, yvec15, yvec15;
  1129. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1130. MUL_SY yvec1, yvec3, yvec7;
  1131. ADD2_SY yvec7, yvec13, yvec13;
  1132. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1133. MUL_SY yvec1, yvec4, yvec6;
  1134. ADD2_SY yvec6, yvec11, yvec11;
  1135. MUL_SY yvec1, yvec5, yvec7;
  1136. ADD2_SY yvec7, yvec9, yvec9;
  1137. #### Unroll time 2 ####
  1138. LD_SY 8*SIZE(ptrba), yvec0;
  1139. VPERMILP_SY $0xb1, yvec0, yvec1;
  1140. EDUP_SY 8*SIZE(ptrbb), yvec2;
  1141. VPERMILP_SY $0x4e, yvec2, yvec3;
  1142. MUL_SY yvec0, yvec2, yvec6;
  1143. ADD1_SY yvec6, yvec15, yvec15;
  1144. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1145. MUL_SY yvec0, yvec3, yvec7;
  1146. ADD1_SY yvec7, yvec13, yvec13;
  1147. ODUP_SY 8*SIZE(ptrbb), yvec2;
  1148. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1149. MUL_SY yvec0, yvec4, yvec6;
  1150. ADD1_SY yvec6, yvec11, yvec11;
  1151. VPERMILP_SY $0x4e, yvec2, yvec3;
  1152. MUL_SY yvec0, yvec5, yvec7;
  1153. ADD1_SY yvec7, yvec9, yvec9;
  1154. MUL_SY yvec1, yvec2, yvec6;
  1155. ADD2_SY yvec6, yvec15, yvec15;
  1156. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1157. MUL_SY yvec1, yvec3, yvec7;
  1158. ADD2_SY yvec7, yvec13, yvec13;
  1159. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1160. MUL_SY yvec1, yvec4, yvec6;
  1161. ADD2_SY yvec6, yvec11, yvec11;
  1162. MUL_SY yvec1, yvec5, yvec7;
  1163. ADD2_SY yvec7, yvec9, yvec9;
  1164. ADDQ $16*SIZE, ptrba;
  1165. ADDQ $16*SIZE, ptrbb;
  1166. .L9_loopE:
  1167. #ifndef TRMMKERNEL
  1168. TEST $1, bk;
  1169. #else
  1170. TEST $1, kkk;
  1171. #endif
  1172. JLE .L10_loopE;
  1173. ALIGN_5
  1174. .L10_bodyB:
  1175. #### Unroll times 1 ####
  1176. LD_SY 0*SIZE(ptrba), yvec0;
  1177. VPERMILP_SY $0xb1, yvec0, yvec1;
  1178. EDUP_SY 0*SIZE(ptrbb), yvec2;
  1179. VPERMILP_SY $0x4e, yvec2, yvec3;
  1180. MUL_SY yvec0, yvec2, yvec6;
  1181. ADD1_SY yvec6, yvec15, yvec15;
  1182. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1183. MUL_SY yvec0, yvec3, yvec7;
  1184. ADD1_SY yvec7, yvec13, yvec13;
  1185. ODUP_SY 0*SIZE(ptrbb), yvec2;
  1186. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1187. MUL_SY yvec0, yvec4, yvec6;
  1188. ADD1_SY yvec6, yvec11, yvec11;
  1189. VPERMILP_SY $0x4e, yvec2, yvec3;
  1190. MUL_SY yvec0, yvec5, yvec7;
  1191. ADD1_SY yvec7, yvec9, yvec9;
  1192. MUL_SY yvec1, yvec2, yvec6;
  1193. ADD2_SY yvec6, yvec15, yvec15;
  1194. SHUF_SY $0x03, yvec2, yvec2, yvec4;
  1195. MUL_SY yvec1, yvec3, yvec7;
  1196. ADD2_SY yvec7, yvec13, yvec13;
  1197. SHUF_SY $0x03, yvec3, yvec3, yvec5;
  1198. MUL_SY yvec1, yvec4, yvec6;
  1199. ADD2_SY yvec6, yvec11, yvec11;
  1200. MUL_SY yvec1, yvec5, yvec7;
  1201. ADD2_SY yvec7, yvec9, yvec9;
  1202. ADDQ $8*SIZE, ptrba;
  1203. ADDQ $8*SIZE, ptrbb;
  1204. .L10_loopE:
  1205. #### Handle ####
  1206. XOR_SY yvec7, yvec7, yvec7;
  1207. #if defined(RN) || defined(RT) || defined(CN) || defined(CT)
  1208. ADDSUB_SY yvec15, yvec7, yvec15;
  1209. ADDSUB_SY yvec13, yvec7, yvec13;
  1210. ADDSUB_SY yvec11, yvec7, yvec11;
  1211. ADDSUB_SY yvec9, yvec7, yvec9;
  1212. #elif defined(NR) || defined(NC) || defined(TR) || defined(TC)
  1213. SUB_SY yvec15, yvec7, yvec15;
  1214. SUB_SY yvec13, yvec7, yvec13;
  1215. SUB_SY yvec11, yvec7, yvec11;
  1216. SUB_SY yvec9, yvec7, yvec9;
  1217. #elif defined(RR) || defined(RC) || defined(CR) || defined(CC)
  1218. VPERMILP_SY $0xb1, yvec15, yvec15;
  1219. VPERMILP_SY $0xb1, yvec13, yvec13;
  1220. VPERMILP_SY $0xb1, yvec11, yvec11;
  1221. VPERMILP_SY $0xb1, yvec9, yvec9;
  1222. ADDSUB_SY yvec15, yvec7, yvec15;
  1223. ADDSUB_SY yvec13, yvec7, yvec13;
  1224. ADDSUB_SY yvec11, yvec7, yvec11;
  1225. ADDSUB_SY yvec9, yvec7, yvec9;
  1226. VPERMILP_SY $0xb1, yvec15, yvec15;
  1227. VPERMILP_SY $0xb1, yvec13, yvec13;
  1228. VPERMILP_SY $0xb1, yvec11, yvec11;
  1229. VPERMILP_SY $0xb1, yvec9, yvec9;
  1230. #endif
  1231. ##### Load Alpha ####
  1232. BROAD_SY MEMALPHA_R,yvec7;
  1233. BROAD_SY MEMALPHA_I,yvec6;
  1234. ##### Multiply Alpha ####
  1235. VPERMILP_SY $0xb1,yvec15, yvec5;
  1236. MUL_SY yvec15, yvec7, yvec15;
  1237. MUL_SY yvec5, yvec6, yvec5;
  1238. ADDSUB_SY yvec5, yvec15, yvec15;
  1239. VPERMILP_SY $0xb1,yvec13, yvec3;
  1240. MUL_SY yvec13, yvec7, yvec13;
  1241. MUL_SY yvec3, yvec6, yvec3;
  1242. ADDSUB_SY yvec3, yvec13, yvec13;
  1243. VPERMILP_SY $0xb1,yvec11, yvec1;
  1244. MUL_SY yvec11, yvec7, yvec11;
  1245. MUL_SY yvec1, yvec6, yvec1;
  1246. ADDSUB_SY yvec1, yvec11, yvec11;
  1247. VPERMILP_SY $0xb1,yvec9, yvec5;
  1248. MUL_SY yvec9, yvec7, yvec9;
  1249. MUL_SY yvec5, yvec6, yvec5;
  1250. ADDSUB_SY yvec5, yvec9, yvec9;
  1251. #### Writing back ####
  1252. #### Shuffle Results ####
  1253. MOV_SY yvec15,yvec7;
  1254. REVS_SY $0xe4,yvec13,yvec15,yvec15;
  1255. REVS_SY $0xe4,yvec7,yvec13,yvec13;
  1256. MOV_SY yvec11,yvec7;
  1257. REVS_SY $0xe4,yvec9,yvec11,yvec11;
  1258. REVS_SY $0xe4,yvec7,yvec9,yvec9;
  1259. #### Writing back ####
  1260. EXTRA_SY $1, yvec15, xvec7;
  1261. #ifndef TRMMKERNEL
  1262. LDL_SX 0*SIZE(C0), xvec6, xvec6;
  1263. LDH_SX 2*SIZE(C0), xvec6, xvec6;
  1264. ADD_SX xvec6, xvec15, xvec15;
  1265. #endif
  1266. STL_SX xvec15, 0*SIZE(C0);
  1267. STH_SX xvec15, 2*SIZE(C0);
  1268. #ifndef TRMMKERNEL
  1269. LDL_SX 4*SIZE(C1), xvec4, xvec4;
  1270. LDH_SX 6*SIZE(C1), xvec4, xvec4;
  1271. ADD_SX xvec4, xvec7, xvec7;
  1272. #endif
  1273. STL_SX xvec7, 4*SIZE(C1);
  1274. STH_SX xvec7, 6*SIZE(C1);
  1275. EXTRA_SY $1, yvec13, xvec5;
  1276. #ifndef TRMMKERNEL
  1277. LDL_SX 0*SIZE(C0, ldc, 1), xvec4, xvec4;
  1278. LDH_SX 2*SIZE(C0, ldc, 1), xvec4, xvec4;
  1279. ADD_SX xvec4, xvec13, xvec13;
  1280. #endif
  1281. STL_SX xvec13, 0*SIZE(C0, ldc, 1);
  1282. STH_SX xvec13, 2*SIZE(C0, ldc, 1);
  1283. #ifndef TRMMKERNEL
  1284. LDL_SX 4*SIZE(C1, ldc, 1), xvec2, xvec2;
  1285. LDH_SX 6*SIZE(C1, ldc, 1), xvec2, xvec2;
  1286. ADD_SX xvec2, xvec5, xvec5;
  1287. #endif
  1288. STL_SX xvec5, 4*SIZE(C1, ldc, 1);
  1289. STH_SX xvec5, 6*SIZE(C1, ldc, 1);
  1290. EXTRA_SY $1, yvec11, xvec3;
  1291. #ifndef TRMMKERNEL
  1292. LDL_SX 0*SIZE(C1), xvec2, xvec2;
  1293. LDH_SX 2*SIZE(C1), xvec2, xvec2;
  1294. ADD_SX xvec2, xvec11, xvec11;
  1295. #endif
  1296. STL_SX xvec11, 0*SIZE(C1);
  1297. STH_SX xvec11, 2*SIZE(C1);
  1298. #ifndef TRMMKERNEL
  1299. LDL_SX 4*SIZE(C0), xvec0, xvec0;
  1300. LDH_SX 6*SIZE(C0), xvec0, xvec0;
  1301. ADD_SX xvec0, xvec3, xvec3;
  1302. #endif
  1303. STL_SX xvec3, 4*SIZE(C0);
  1304. STH_SX xvec3, 6*SIZE(C0);
  1305. EXTRA_SY $1, yvec9, xvec1;
  1306. #ifndef TRMMKERNEL
  1307. LDL_SX 0*SIZE(C1, ldc, 1), xvec0, xvec0;
  1308. LDH_SX 2*SIZE(C1, ldc, 1), xvec0, xvec0;
  1309. ADD_SX xvec0, xvec9, xvec9;
  1310. #endif
  1311. STL_SX xvec9, 0*SIZE(C1, ldc, 1);
  1312. STH_SX xvec9, 2*SIZE(C1, ldc, 1);
  1313. #ifndef TRMMKERNEL
  1314. LDL_SX 4*SIZE(C0, ldc, 1), xvec6, xvec6;
  1315. LDH_SX 6*SIZE(C0, ldc, 1), xvec6, xvec6;
  1316. ADD_SX xvec6, xvec1, xvec1;
  1317. #endif
  1318. STL_SX xvec1, 4*SIZE(C0, ldc, 1);
  1319. STH_SX xvec1, 6*SIZE(C0, ldc, 1);
  1320. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  1321. MOVQ bk, %rax;
  1322. SUBQ kkk, %rax;
  1323. SALQ $ZBASE_SHIFT, %rax;
  1324. LEAQ (ptrba, %rax, 4), ptrba;
  1325. LEAQ (ptrbb, %rax, 4), ptrbb;
  1326. #endif
  1327. #if defined(TRMMKERNEL) && defined(LEFT)
  1328. ADDQ $4, kk;
  1329. #endif
  1330. ADDQ $8*SIZE, C0;
  1331. ADDQ $8*SIZE, C1;
  1332. .L5_loopE:
  1333. TEST $2, bm;
  1334. JLE .L6_loopE;
  1335. ALIGN_5
  1336. .L6_bodyB:
  1337. #if !defined(TRMMKERNEL)||(defined(TRMMKERNEL)&&defined(LEFT)&&defined(TRANSA))||(defined(TRMMKERNEL)&&!defined(LEFT)&&!defined(TRANSA))
  1338. MOVQ bb,ptrbb;
  1339. #else
  1340. MOVQ bb, ptrbb;
  1341. MOVQ kk, %rax;
  1342. SALQ $ZBASE_SHIFT, %rax;
  1343. LEAQ (ptrba, %rax, 2), ptrba;
  1344. LEAQ (ptrbb, %rax, 4), ptrbb;
  1345. #endif
  1346. #### Initial Results Register ####
  1347. XOR_SY yvec15, yvec15, yvec15;
  1348. XOR_SY yvec14, yvec14, yvec14;
  1349. XOR_SY yvec13, yvec13, yvec13;
  1350. XOR_SY yvec12, yvec12, yvec12;
  1351. #ifndef TRMMKERNEL
  1352. MOVQ bk,k;
  1353. #elif (defined(LEFT)&&!defined(TRANSA))||(!defined(LEFT)&&defined(TRANSA))
  1354. MOVQ bk, %rax;
  1355. SUBQ kk, %rax;
  1356. MOVQ %rax, kkk;
  1357. #else
  1358. MOVQ kk, %rax;
  1359. #ifdef LEFT
  1360. ADDQ $2, %rax;
  1361. #else
  1362. ADDQ $4, %rax;
  1363. #endif
  1364. MOVQ %rax, kkk;
  1365. #endif
  1366. SARQ $2, k;
  1367. JLE .L11_loopE;
  1368. ALIGN_5
  1369. .L11_bodyB:
  1370. LD_SX 0*SIZE(ptrba), xvec0; # ar1, ai1, ar2, ai2
  1371. EDUP_SX 0*SIZE(ptrbb), xvec2; # br1, br1, br2, br2
  1372. SHUF_SX $0x4e, xvec2, xvec3; # br3, br3, br4, br4
  1373. MUL_SX xvec0, xvec2, xvec2;
  1374. ADD1_SX xvec2, xvec15, xvec15;
  1375. MUL_SX xvec0, xvec3, xvec3;
  1376. ADD1_SX xvec3, xvec14, xvec14;
  1377. EDUP_SX 4*SIZE(ptrbb), xvec4;
  1378. SHUF_SX $0x4e, xvec4, xvec5;
  1379. MUL_SX xvec0, xvec4, xvec4;
  1380. ADD1_SX xvec4, xvec13, xvec13;
  1381. MUL_SX xvec0, xvec5, xvec5;
  1382. ADD1_SX xvec5, xvec12, xvec12;
  1383. SHUF_SX $0xb1, xvec0, xvec1;
  1384. ODUP_SX 0*SIZE(ptrbb), xvec2;
  1385. SHUF_SX $0x4e, xvec2, xvec3;
  1386. MUL_SX xvec1, xvec2, xvec2;
  1387. ADD2_SX xvec2, xvec15, xvec15;
  1388. MUL_SX xvec1, xvec3, xvec3;
  1389. ADD2_SX xvec3, xvec14, xvec14;
  1390. ODUP_SX 4*SIZE(ptrbb), xvec4;
  1391. SHUF_SX $0x4e, xvec4, xvec5;
  1392. MUL_SX xvec1, xvec4, xvec4;
  1393. ADD2_SX xvec4, xvec13, xvec13;
  1394. MUL_SX xvec1, xvec5, xvec5;
  1395. ADD2_SX xvec5, xvec12, xvec12;
  1396. LD_SX 4*SIZE(ptrba), xvec0; # ar1, ai1, ar2, ai2
  1397. EDUP_SX 8*SIZE(ptrbb), xvec2; # br1, br1, br2, br2
  1398. SHUF_SX $0x4e, xvec2, xvec3; # br3, br3, br4, br4
  1399. MUL_SX xvec0, xvec2, xvec2;
  1400. ADD1_SX xvec2, xvec15, xvec15;
  1401. MUL_SX xvec0, xvec3, xvec3;
  1402. ADD1_SX xvec3, xvec14, xvec14;
  1403. EDUP_SX 12*SIZE(ptrbb), xvec4;
  1404. SHUF_SX $0x4e, xvec4, xvec5;
  1405. MUL_SX xvec0, xvec4, xvec4;
  1406. ADD1_SX xvec4, xvec13, xvec13;
  1407. MUL_SX xvec0, xvec5, xvec5;
  1408. ADD1_SX xvec5, xvec12, xvec12;
  1409. SHUF_SX $0xb1, xvec0, xvec1;
  1410. ODUP_SX 8*SIZE(ptrbb), xvec2;
  1411. SHUF_SX $0x4e, xvec2, xvec3;
  1412. MUL_SX xvec1, xvec2, xvec2;
  1413. ADD2_SX xvec2, xvec15, xvec15;
  1414. MUL_SX xvec1, xvec3, xvec3;
  1415. ADD2_SX xvec3, xvec14, xvec14;
  1416. ODUP_SX 12*SIZE(ptrbb), xvec4;
  1417. SHUF_SX $0x4e, xvec4, xvec5;
  1418. MUL_SX xvec1, xvec4, xvec4;
  1419. ADD2_SX xvec4, xvec13, xvec13;
  1420. MUL_SX xvec1, xvec5, xvec5;
  1421. ADD2_SX xvec5, xvec12, xvec12;
  1422. LD_SX 8*SIZE(ptrba), xvec0; # ar1, ai1, ar2, ai2
  1423. EDUP_SX 16*SIZE(ptrbb), xvec2; # br1, br1, br2, br2
  1424. SHUF_SX $0x4e, xvec2, xvec3; # br3, br3, br4, br4
  1425. MUL_SX xvec0, xvec2, xvec2;
  1426. ADD1_SX xvec2, xvec15, xvec15;
  1427. MUL_SX xvec0, xvec3, xvec3;
  1428. ADD1_SX xvec3, xvec14, xvec14;
  1429. EDUP_SX 20*SIZE(ptrbb), xvec4;
  1430. SHUF_SX $0x4e, xvec4, xvec5;
  1431. MUL_SX xvec0, xvec4, xvec4;
  1432. ADD1_SX xvec4, xvec13, xvec13;
  1433. MUL_SX xvec0, xvec5, xvec5;
  1434. ADD1_SX xvec5, xvec12, xvec12;
  1435. SHUF_SX $0xb1, xvec0, xvec1;
  1436. ODUP_SX 16*SIZE(ptrbb), xvec2;
  1437. SHUF_SX $0x4e, xvec2, xvec3;
  1438. MUL_SX xvec1, xvec2, xvec2;
  1439. ADD2_SX xvec2, xvec15, xvec15;
  1440. MUL_SX xvec1, xvec3, xvec3;
  1441. ADD2_SX xvec3, xvec14, xvec14;
  1442. ODUP_SX 20*SIZE(ptrbb), xvec4;
  1443. SHUF_SX $0x4e, xvec4, xvec5;
  1444. MUL_SX xvec1, xvec4, xvec4;
  1445. ADD2_SX xvec4, xvec13, xvec13;
  1446. MUL_SX xvec1, xvec5, xvec5;
  1447. ADD2_SX xvec5, xvec12, xvec12;
  1448. LD_SX 12*SIZE(ptrba), xvec0; # ar1, ai1, ar2, ai2
  1449. EDUP_SX 24*SIZE(ptrbb), xvec2; # br1, br1, br2, br2
  1450. SHUF_SX $0x4e, xvec2, xvec3; # br3, br3, br4, br4
  1451. MUL_SX xvec0, xvec2, xvec2;
  1452. ADD1_SX xvec2, xvec15, xvec15;
  1453. MUL_SX xvec0, xvec3, xvec3;
  1454. ADD1_SX xvec3, xvec14, xvec14;
  1455. EDUP_SX 28*SIZE(ptrbb), xvec4;
  1456. SHUF_SX $0x4e, xvec4, xvec5;
  1457. MUL_SX xvec0, xvec4, xvec4;
  1458. ADD1_SX xvec4, xvec13, xvec13;
  1459. MUL_SX xvec0, xvec5, xvec5;
  1460. ADD1_SX xvec5, xvec12, xvec12;
  1461. SHUF_SX $0xb1, xvec0, xvec1;
  1462. ODUP_SX 24*SIZE(ptrbb), xvec2;
  1463. SHUF_SX $0x4e, xvec2, xvec3;
  1464. MUL_SX xvec1, xvec2, xvec2;
  1465. ADD2_SX xvec2, xvec15, xvec15;
  1466. MUL_SX xvec1, xvec3, xvec3;
  1467. ADD2_SX xvec3, xvec14, xvec14;
  1468. ODUP_SX 28*SIZE(ptrbb), xvec4;
  1469. SHUF_SX $0x4e, xvec4, xvec5;
  1470. MUL_SX xvec1, xvec4, xvec4;
  1471. ADD2_SX xvec4, xvec13, xvec13;
  1472. MUL_SX xvec1, xvec5, xvec5;
  1473. ADD2_SX xvec5, xvec12, xvec12;
  1474. ADDQ $16*SIZE, ptrba;
  1475. ADDQ $32*SIZE, ptrbb;
  1476. DECQ k;
  1477. JG .L11_bodyB;
  1478. ALIGN_5
  1479. .L11_loopE:
  1480. #ifndef TRMMKERNEL
  1481. TEST $2, bk;
  1482. #else
  1483. TEST $2, kkk;
  1484. #endif
  1485. JLE .L12_loopE;
  1486. ALIGN_5
  1487. .L12_bodyB:
  1488. LD_SX 0*SIZE(ptrba), xvec0; # ar1, ai1, ar2, ai2
  1489. EDUP_SX 0*SIZE(ptrbb), xvec2; # br1, br1, br2, br2
  1490. SHUF_SX $0x4e, xvec2, xvec3; # br3, br3, br4, br4
  1491. MUL_SX xvec0, xvec2, xvec2;
  1492. ADD1_SX xvec2, xvec15, xvec15;
  1493. MUL_SX xvec0, xvec3, xvec3;
  1494. ADD1_SX xvec3, xvec14, xvec14;
  1495. EDUP_SX 4*SIZE(ptrbb), xvec4;
  1496. SHUF_SX $0x4e, xvec4, xvec5;
  1497. MUL_SX xvec0, xvec4, xvec4;
  1498. ADD1_SX xvec4, xvec13, xvec13;
  1499. MUL_SX xvec0, xvec5, xvec5;
  1500. ADD1_SX xvec5, xvec12, xvec12;
  1501. SHUF_SX $0xb1, xvec0, xvec1;
  1502. ODUP_SX 0*SIZE(ptrbb), xvec2;
  1503. SHUF_SX $0x4e, xvec2, xvec3;
  1504. MUL_SX xvec1, xvec2, xvec2;
  1505. ADD2_SX xvec2, xvec15, xvec15;
  1506. MUL_SX xvec1, xvec3, xvec3;
  1507. ADD2_SX xvec3, xvec14, xvec14;
  1508. ODUP_SX 4*SIZE(ptrbb), xvec4;
  1509. SHUF_SX $0x4e, xvec4, xvec5;
  1510. MUL_SX xvec1, xvec4, xvec4;
  1511. ADD2_SX xvec4, xvec13, xvec13;
  1512. MUL_SX xvec1, xvec5, xvec5;
  1513. ADD2_SX xvec5, xvec12, xvec12;
  1514. LD_SX 4*SIZE(ptrba), xvec0; # ar1, ai1, ar2, ai2
  1515. EDUP_SX 8*SIZE(ptrbb), xvec2; # br1, br1, br2, br2
  1516. SHUF_SX $0x4e, xvec2, xvec3; # br3, br3, br4, br4
  1517. MUL_SX xvec0, xvec2, xvec2;
  1518. ADD1_SX xvec2, xvec15, xvec15;
  1519. MUL_SX xvec0, xvec3, xvec3;
  1520. ADD1_SX xvec3, xvec14, xvec14;
  1521. EDUP_SX 12*SIZE(ptrbb), xvec4;
  1522. SHUF_SX $0x4e, xvec4, xvec5;
  1523. MUL_SX xvec0, xvec4, xvec4;
  1524. ADD1_SX xvec4, xvec13, xvec13;
  1525. MUL_SX xvec0, xvec5, xvec5;
  1526. ADD1_SX xvec5, xvec12, xvec12;
  1527. SHUF_SX $0xb1, xvec0, xvec1;
  1528. ODUP_SX 8*SIZE(ptrbb), xvec2;
  1529. SHUF_SX $0x4e, xvec2, xvec3;
  1530. MUL_SX xvec1, xvec2, xvec2;
  1531. ADD2_SX xvec2, xvec15, xvec15;
  1532. MUL_SX xvec1, xvec3, xvec3;
  1533. ADD2_SX xvec3, xvec14, xvec14;
  1534. ODUP_SX 12*SIZE(ptrbb), xvec4;
  1535. SHUF_SX $0x4e, xvec4, xvec5;
  1536. MUL_SX xvec1, xvec4, xvec4;
  1537. ADD2_SX xvec4, xvec13, xvec13;
  1538. MUL_SX xvec1, xvec5, xvec5;
  1539. ADD2_SX xvec5, xvec12, xvec12;
  1540. ADDQ $8*SIZE, ptrba;
  1541. ADDQ $16*SIZE, ptrbb;
  1542. .L12_loopE:
  1543. #ifndef TRMMKERNEL
  1544. TEST $1, bk;
  1545. #else
  1546. TEST $1, kkk;
  1547. #endif
  1548. JLE .L13_loopE;
  1549. ALIGN_5
  1550. .L13_bodyB:
  1551. LD_SX 0*SIZE(ptrba), xvec0; # ar1, ai1, ar2, ai2
  1552. EDUP_SX 0*SIZE(ptrbb), xvec2; # br1, br1, br2, br2
  1553. SHUF_SX $0x4e, xvec2, xvec3; # br3, br3, br4, br4
  1554. MUL_SX xvec0, xvec2, xvec2;
  1555. ADD1_SX xvec2, xvec15, xvec15;
  1556. MUL_SX xvec0, xvec3, xvec3;
  1557. ADD1_SX xvec3, xvec14, xvec14;
  1558. EDUP_SX 4*SIZE(ptrbb), xvec4;
  1559. SHUF_SX $0x4e, xvec4, xvec5;
  1560. MUL_SX xvec0, xvec4, xvec4;
  1561. ADD1_SX xvec4, xvec13, xvec13;
  1562. MUL_SX xvec0, xvec5, xvec5;
  1563. ADD1_SX xvec5, xvec12, xvec12;
  1564. SHUF_SX $0xb1, xvec0, xvec1;
  1565. ODUP_SX 0*SIZE(ptrbb), xvec2;
  1566. SHUF_SX $0x4e, xvec2, xvec3;
  1567. MUL_SX xvec1, xvec2, xvec2;
  1568. ADD2_SX xvec2, xvec15, xvec15;
  1569. MUL_SX xvec1, xvec3, xvec3;
  1570. ADD2_SX xvec3, xvec14, xvec14;
  1571. ODUP_SX 4*SIZE(ptrbb), xvec4;
  1572. SHUF_SX $0x4e, xvec4, xvec5;
  1573. MUL_SX xvec1, xvec4, xvec4;
  1574. ADD2_SX xvec4, xvec13, xvec13;
  1575. MUL_SX xvec1, xvec5, xvec5;
  1576. ADD2_SX xvec5, xvec12, xvec12;
  1577. ADDQ $4*SIZE, ptrba;
  1578. ADDQ $8*SIZE, ptrbb;
  1579. .L13_loopE:
  1580. #### Handle ####
  1581. #if defined(RN) || defined(RT) || defined(CN) || defined(CT)
  1582. XOR_SY yvec7, yvec7, yvec7;
  1583. ADDSUB_SX xvec15, xvec7, xvec7;
  1584. MOV_SX xvec7, xvec15;
  1585. XOR_SY yvec7, yvec7, yvec7;
  1586. ADDSUB_SX xvec14, xvec7, xvec7;
  1587. MOV_SX xvec7, xvec14;
  1588. XOR_SY yvec7, yvec7, yvec7;
  1589. ADDSUB_SX xvec13, xvec7, xvec7;
  1590. MOV_SX xvec7, xvec13;
  1591. XOR_SY yvec7, yvec7, yvec7;
  1592. ADDSUB_SX xvec12, xvec7, xvec7;
  1593. MOV_SX xvec7, xvec12;
  1594. #elif defined(NR) || defined(NC) || defined(TR) || defined(TC)
  1595. XOR_SY yvec7, yvec7, yvec7;
  1596. SUB_SX xvec15, xvec7, xvec7;
  1597. MOV_SX xvec7, xvec15;
  1598. XOR_SY yvec7, yvec7, yvec7;
  1599. SUB_SX xvec14, xvec7, xvec7;
  1600. MOV_SX xvec7, xvec14;
  1601. XOR_SY yvec7, yvec7, yvec7;
  1602. SUB_SX xvec13, xvec7, xvec7;
  1603. MOV_SX xvec7, xvec13;
  1604. XOR_SY yvec7, yvec7, yvec7;
  1605. SUB_SX xvec12, xvec7, xvec7;
  1606. MOV_SX xvec7, xvec12;
  1607. #elif defined(RR) || defined(RC) || defined(CR) || defined(CC)
  1608. SHUF_SX $0xb1, xvec15, xvec15;
  1609. SHUF_SX $0xb1, xvec14, xvec14;
  1610. SHUF_SX $0xb1, xvec13, xvec13;
  1611. SHUF_SX $0xb1, xvec12, xvec12;
  1612. XOR_SY yvec7, yvec7, yvec7;
  1613. ADDSUB_SX xvec15, xvec7, xvec7;
  1614. MOV_SX xvec7, xvec15;
  1615. XOR_SY yvec7, yvec7, yvec7;
  1616. ADDSUB_SX xvec14, xvec7, xvec7;
  1617. MOV_SX xvec7, xvec14;
  1618. XOR_SY yvec7, yvec7, yvec7;
  1619. ADDSUB_SX xvec13, xvec7, xvec7;
  1620. MOV_SX xvec7, xvec13;
  1621. XOR_SY yvec7, yvec7, yvec7;
  1622. ADDSUB_SX xvec12, xvec7, xvec7;
  1623. MOV_SX xvec7, xvec12;
  1624. SHUF_SX $0xb1, xvec15, xvec15;
  1625. SHUF_SX $0xb1, xvec14, xvec14;
  1626. SHUF_SX $0xb1, xvec13, xvec13;
  1627. SHUF_SX $0xb1, xvec12, xvec12;
  1628. #endif
  1629. ##### Load Alpha ####
  1630. BROAD_SX MEMALPHA_R,xvec7;
  1631. BROAD_SX MEMALPHA_I,xvec6;
  1632. ##### Multiply Alpha ####
  1633. VPERMILP_SX $0xb1,xvec15, xvec5;
  1634. MUL_SX xvec7, xvec15, xvec15;
  1635. MUL_SX xvec6, xvec5, xvec5;
  1636. ADDSUB_SX xvec5, xvec15, xvec15;
  1637. VPERMILP_SX $0xb1,xvec14, xvec4;
  1638. MUL_SX xvec7, xvec14, xvec14;
  1639. MUL_SX xvec6, xvec4, xvec4;
  1640. ADDSUB_SX xvec4, xvec14, xvec14;
  1641. VPERMILP_SX $0xb1,xvec13, xvec3;
  1642. MUL_SX xvec7, xvec13, xvec13;
  1643. MUL_SX xvec6, xvec3, xvec3;
  1644. ADDSUB_SX xvec3, xvec13, xvec13;
  1645. VPERMILP_SX $0xb1,xvec12, xvec2;
  1646. MUL_SX xvec7, xvec12, xvec12;
  1647. MUL_SX xvec6, xvec2, xvec2;
  1648. ADDSUB_SX xvec2, xvec12, xvec12;
  1649. #### Writing back ####
  1650. #ifndef TRMMKERNEL
  1651. LDL_SX 0*SIZE(C0), xvec0, xvec0;
  1652. LDH_SX 2*SIZE(C0, ldc,1), xvec0, xvec0;
  1653. LDL_SX 0*SIZE(C0, ldc,1), xvec1, xvec1;
  1654. LDH_SX 2*SIZE(C0), xvec1, xvec1;
  1655. LDL_SX 0*SIZE(C1), xvec2, xvec2;
  1656. LDH_SX 2*SIZE(C1, ldc, 1), xvec2, xvec2;
  1657. LDL_SX 0*SIZE(C1, ldc, 1), xvec3, xvec3;
  1658. LDH_SX 2*SIZE(C1), xvec3, xvec3;
  1659. ADD_SX xvec0, xvec15, xvec15;
  1660. ADD_SX xvec1, xvec14, xvec14;
  1661. ADD_SX xvec2, xvec13, xvec13;
  1662. ADD_SX xvec3, xvec12, xvec12;
  1663. #endif
  1664. STL_SX xvec15, 0*SIZE(C0);
  1665. STH_SX xvec15, 2*SIZE(C0, ldc, 1);
  1666. STL_SX xvec14, 0*SIZE(C0, ldc, 1);
  1667. STH_SX xvec14, 2*SIZE(C0);
  1668. STL_SX xvec13, 0*SIZE(C1);
  1669. STH_SX xvec13, 2*SIZE(C1, ldc, 1);
  1670. STL_SX xvec12, 0*SIZE(C1, ldc, 1);
  1671. STH_SX xvec12, 2*SIZE(C1);
  1672. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  1673. MOVQ bk, %rax;
  1674. SUBQ kkk, %rax;
  1675. SALQ $ZBASE_SHIFT, %rax;
  1676. LEAQ (ptrba, %rax, 2), ptrba;
  1677. LEAQ (ptrbb, %rax, 4), ptrbb;
  1678. #endif
  1679. #if defined(TRMMKERNEL) && defined(LEFT)
  1680. ADDQ $2, kk;
  1681. #endif
  1682. ADDQ $4*SIZE, C0;
  1683. ADDQ $4*SIZE, C1;
  1684. .L6_loopE:
  1685. TEST $1, bm;
  1686. JLE .L7_loopE;
  1687. ALIGN_5
  1688. .L7_bodyB:
  1689. #if !defined(TRMMKERNEL)||(defined(TRMMKERNEL)&&defined(LEFT)&&defined(TRANSA))||(defined(TRMMKERNEL)&&!defined(LEFT)&&!defined(TRANSA))
  1690. MOVQ bb,ptrbb;
  1691. #else
  1692. MOVQ bb, ptrbb;
  1693. MOVQ kk, %rax;
  1694. SALQ $ZBASE_SHIFT, %rax;
  1695. ADDQ %rax, ptrba;
  1696. LEAQ (ptrbb, %rax, 4), ptrbb;
  1697. #endif
  1698. XOR_SY yvec15, yvec15, yvec15;
  1699. XOR_SY yvec14, yvec14, yvec14;
  1700. #ifndef TRMMKERNEL
  1701. MOVQ bk,k;
  1702. #elif (defined(LEFT)&&!defined(TRANSA))||(!defined(LEFT)&&defined(TRANSA))
  1703. MOVQ bk, %rax;
  1704. SUBQ kk, %rax;
  1705. MOVQ %rax, kkk;
  1706. #else
  1707. MOVQ kk, %rax;
  1708. #ifdef LEFT
  1709. ADDQ $1, %rax;
  1710. #else
  1711. ADDQ $4, %rax;
  1712. #endif
  1713. MOVQ %rax, kkk;
  1714. #endif
  1715. SARQ $2, k;
  1716. JLE .L14_loopE;
  1717. ALIGN_5
  1718. .L14_bodyB:
  1719. BROAD_SX 0*SIZE(ptrba), xvec0;
  1720. LD_SX 0*SIZE(ptrbb), xvec2;
  1721. SHUF_SX $0xb1, xvec2, xvec3;
  1722. MUL_SX xvec0, xvec2, xvec2;
  1723. ADD1_SX xvec2, xvec15, xvec15;
  1724. LD_SX 4*SIZE(ptrbb), xvec4;
  1725. SHUF_SX $0xb1, xvec4, xvec5;
  1726. MUL_SX xvec0, xvec4, xvec4;
  1727. ADD1_SX xvec4, xvec14, xvec14;
  1728. BROAD_SX 1*SIZE(ptrba), xvec1;
  1729. MUL_SX xvec1, xvec3, xvec3;
  1730. ADD2_SX xvec3, xvec15, xvec15;
  1731. MUL_SX xvec1, xvec5, xvec5;
  1732. ADD2_SX xvec5, xvec14, xvec14;
  1733. BROAD_SX 2*SIZE(ptrba), xvec0;
  1734. LD_SX 8*SIZE(ptrbb), xvec2;
  1735. SHUF_SX $0xb1, xvec2, xvec3;
  1736. MUL_SX xvec0, xvec2, xvec2;
  1737. ADD1_SX xvec2, xvec15, xvec15;
  1738. LD_SX 12*SIZE(ptrbb), xvec4;
  1739. SHUF_SX $0xb1, xvec4, xvec5;
  1740. MUL_SX xvec0, xvec4, xvec4;
  1741. ADD1_SX xvec4, xvec14, xvec14;
  1742. BROAD_SX 3*SIZE(ptrba), xvec1;
  1743. MUL_SX xvec1, xvec3, xvec3;
  1744. ADD2_SX xvec3, xvec15, xvec15;
  1745. MUL_SX xvec1, xvec5, xvec5;
  1746. ADD2_SX xvec5, xvec14, xvec14;
  1747. BROAD_SX 4*SIZE(ptrba), xvec0;
  1748. LD_SX 16*SIZE(ptrbb), xvec2;
  1749. SHUF_SX $0xb1, xvec2, xvec3;
  1750. MUL_SX xvec0, xvec2, xvec2;
  1751. ADD1_SX xvec2, xvec15, xvec15;
  1752. LD_SX 20*SIZE(ptrbb), xvec4;
  1753. SHUF_SX $0xb1, xvec4, xvec5;
  1754. MUL_SX xvec0, xvec4, xvec4;
  1755. ADD1_SX xvec4, xvec14, xvec14;
  1756. BROAD_SX 5*SIZE(ptrba), xvec1;
  1757. MUL_SX xvec1, xvec3, xvec3;
  1758. ADD2_SX xvec3, xvec15, xvec15;
  1759. MUL_SX xvec1, xvec5, xvec5;
  1760. ADD2_SX xvec5, xvec14, xvec14;
  1761. BROAD_SX 6*SIZE(ptrba), xvec0;
  1762. LD_SX 24*SIZE(ptrbb), xvec2;
  1763. SHUF_SX $0xb1, xvec2, xvec3;
  1764. MUL_SX xvec0, xvec2, xvec2;
  1765. ADD1_SX xvec2, xvec15, xvec15;
  1766. LD_SX 28*SIZE(ptrbb), xvec4;
  1767. SHUF_SX $0xb1, xvec4, xvec5;
  1768. MUL_SX xvec0, xvec4, xvec4;
  1769. ADD1_SX xvec4, xvec14, xvec14;
  1770. BROAD_SX 7*SIZE(ptrba), xvec1;
  1771. MUL_SX xvec1, xvec3, xvec3;
  1772. ADD2_SX xvec3, xvec15, xvec15;
  1773. MUL_SX xvec1, xvec5, xvec5;
  1774. ADD2_SX xvec5, xvec14, xvec14;
  1775. ADDQ $8*SIZE, ptrba;
  1776. ADDQ $32*SIZE, ptrbb;
  1777. DECQ k;
  1778. JG .L14_bodyB;
  1779. ALIGN_5
  1780. .L14_loopE:
  1781. #ifndef TRMMKERNEL
  1782. TEST $2, bk;
  1783. #else
  1784. TEST $2, kkk;
  1785. #endif
  1786. JLE .L15_loopE;
  1787. ALIGN_5
  1788. .L15_bodyB:
  1789. BROAD_SX 0*SIZE(ptrba), xvec0;
  1790. LD_SX 0*SIZE(ptrbb), xvec2;
  1791. SHUF_SX $0xb1, xvec2, xvec3;
  1792. MUL_SX xvec0, xvec2, xvec2;
  1793. ADD1_SX xvec2, xvec15, xvec15;
  1794. LD_SX 4*SIZE(ptrbb), xvec4;
  1795. SHUF_SX $0xb1, xvec4, xvec5;
  1796. MUL_SX xvec0, xvec4, xvec4;
  1797. ADD1_SX xvec4, xvec14, xvec14;
  1798. BROAD_SX 1*SIZE(ptrba), xvec1;
  1799. MUL_SX xvec1, xvec3, xvec3;
  1800. ADD2_SX xvec3, xvec15, xvec15;
  1801. MUL_SX xvec1, xvec5, xvec5;
  1802. ADD2_SX xvec5, xvec14, xvec14;
  1803. BROAD_SX 2*SIZE(ptrba), xvec0;
  1804. LD_SX 8*SIZE(ptrbb), xvec2;
  1805. SHUF_SX $0xb1, xvec2, xvec3;
  1806. MUL_SX xvec0, xvec2, xvec2;
  1807. ADD1_SX xvec2, xvec15, xvec15;
  1808. LD_SX 12*SIZE(ptrbb), xvec4;
  1809. SHUF_SX $0xb1, xvec4, xvec5;
  1810. MUL_SX xvec0, xvec4, xvec4;
  1811. ADD1_SX xvec4, xvec14, xvec14;
  1812. BROAD_SX 3*SIZE(ptrba), xvec1;
  1813. MUL_SX xvec1, xvec3, xvec3;
  1814. ADD2_SX xvec3, xvec15, xvec15;
  1815. MUL_SX xvec1, xvec5, xvec5;
  1816. ADD2_SX xvec5, xvec14, xvec14;
  1817. ADDQ $4*SIZE, ptrba;
  1818. ADDQ $16*SIZE, ptrbb;
  1819. .L15_loopE:
  1820. #ifndef TRMMKERNEL
  1821. TEST $1, bk;
  1822. #else
  1823. TEST $1, kkk;
  1824. #endif
  1825. JLE .L16_loopE;
  1826. ALIGN_5
  1827. .L16_bodyB:
  1828. BROAD_SX 0*SIZE(ptrba), xvec0;
  1829. LD_SX 0*SIZE(ptrbb), xvec2;
  1830. SHUF_SX $0xb1, xvec2, xvec3;
  1831. MUL_SX xvec0, xvec2, xvec2;
  1832. ADD1_SX xvec2, xvec15, xvec15;
  1833. LD_SX 4*SIZE(ptrbb), xvec4;
  1834. SHUF_SX $0xb1, xvec4, xvec5;
  1835. MUL_SX xvec0, xvec4, xvec4;
  1836. ADD1_SX xvec4, xvec14, xvec14;
  1837. BROAD_SX 1*SIZE(ptrba), xvec1;
  1838. MUL_SX xvec1, xvec3, xvec3;
  1839. ADD2_SX xvec3, xvec15, xvec15;
  1840. MUL_SX xvec1, xvec5, xvec5;
  1841. ADD2_SX xvec5, xvec14, xvec14;
  1842. ADDQ $2*SIZE, ptrba;
  1843. ADDQ $8*SIZE, ptrbb;
  1844. .L16_loopE:
  1845. #### Handle ####
  1846. #if defined(NR) || defined(NC) || defined(TR) || defined(TC)
  1847. XOR_SY yvec7, yvec7, yvec7;
  1848. ADDSUB_SX xvec15, xvec7, xvec7;
  1849. MOV_SX xvec7, xvec15;
  1850. XOR_SY yvec7, yvec7, yvec7;
  1851. ADDSUB_SX xvec14, xvec7, xvec7;
  1852. MOV_SX xvec7, xvec14;
  1853. #elif defined(RN) || defined(RT) || defined(CN) || defined(CT)
  1854. XOR_SY yvec7, yvec7, yvec7;
  1855. SUB_SX xvec15, xvec7, xvec7;
  1856. MOV_SX xvec7, xvec15;
  1857. XOR_SY yvec7, yvec7, yvec7;
  1858. SUB_SX xvec14, xvec7, xvec7;
  1859. MOV_SX xvec7, xvec14;
  1860. #elif defined(RR) || defined(RC) || defined(CR) || defined(CC)
  1861. SHUF_SX $0xb1, xvec15, xvec15;
  1862. SHUF_SX $0xb1, xvec14, xvec14;
  1863. XOR_SY yvec7, yvec7, yvec7;
  1864. ADDSUB_SX xvec15, xvec7, xvec7;
  1865. MOV_SX xvec7, xvec15;
  1866. XOR_SY yvec7, yvec7, yvec7;
  1867. ADDSUB_SX xvec14, xvec7, xvec7;
  1868. MOV_SX xvec7, xvec14;
  1869. SHUF_SX $0xb1, xvec15, xvec15;
  1870. SHUF_SX $0xb1, xvec14, xvec14;
  1871. #endif
  1872. ##### Load Alpha ####
  1873. BROAD_SX MEMALPHA_R,xvec7;
  1874. BROAD_SX MEMALPHA_I,xvec6;
  1875. ##### Multiply Alpha ####
  1876. VPERMILP_SX $0xb1,xvec15, xvec5;
  1877. MUL_SX xvec7, xvec15, xvec15;
  1878. MUL_SX xvec6, xvec5, xvec5;
  1879. ADDSUB_SX xvec5, xvec15, xvec15;
  1880. VPERMILP_SX $0xb1,xvec14, xvec4;
  1881. MUL_SX xvec7, xvec14, xvec14;
  1882. MUL_SX xvec6, xvec4, xvec4;
  1883. ADDSUB_SX xvec4, xvec14, xvec14;
  1884. #### Writing back ####
  1885. #ifndef TRMMKERNEL
  1886. LDL_SX 0*SIZE(C0), xvec0, xvec0;
  1887. LDH_SX 0*SIZE(C0, ldc, 1), xvec0, xvec0;
  1888. LDL_SX 0*SIZE(C1), xvec1, xvec1;
  1889. LDH_SX 0*SIZE(C1, ldc, 1), xvec1, xvec1;
  1890. ADD_SX xvec0, xvec15, xvec15;
  1891. ADD_SX xvec1, xvec14, xvec14;
  1892. #endif
  1893. STL_SX xvec15, 0*SIZE(C0);
  1894. STH_SX xvec15, 0*SIZE(C0, ldc, 1);
  1895. STL_SX xvec14, 0*SIZE(C1);
  1896. STH_SX xvec14, 0*SIZE(C1, ldc, 1);
  1897. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  1898. MOVQ bk, %rax;
  1899. SUBQ kkk, %rax;
  1900. SALQ $ZBASE_SHIFT, %rax;
  1901. ADDQ %rax, ptrba;
  1902. LEAQ (ptrbb, %rax, 4), ptrbb;
  1903. #endif
  1904. #if defined(TRMMKERNEL) && defined(LEFT)
  1905. ADDQ $1, kk;
  1906. #endif
  1907. ADDQ $2*SIZE, C0;
  1908. ADDQ $2*SIZE, C1;
  1909. .L7_loopE:
  1910. #if defined(TRMMKERNEL) && !defined(LEFT)
  1911. ADDQ $4, kk;
  1912. #endif
  1913. MOVQ bk,k;
  1914. SALQ $5,k;
  1915. ADDQ k,bb;
  1916. LEAQ (C,ldc,4),C;
  1917. .L0_bodyE:;
  1918. DECQ j;
  1919. JG .L0_bodyB;
  1920. ALIGN_5;
  1921. .L0_loopE:;
  1922. TEST $2, bn;
  1923. JLE .L20_loopE;
  1924. ALIGN_5
  1925. .L20_bodyB:
  1926. #if defined(TRMMKERNEL) && defined(LEFT)
  1927. MOVQ OFFSET, %rax;
  1928. MOVQ %rax, kk;
  1929. #endif
  1930. MOVQ C, C0;
  1931. LEAQ (C, ldc, 1), C1;
  1932. MOVQ ba, ptrba;
  1933. MOVQ bm, i;
  1934. SARQ $3, i;
  1935. JLE .L21_loopE;
  1936. ALIGN_5
  1937. .L21_bodyB:
  1938. #if !defined(TRMMKERNEL)||(defined(TRMMKERNEL)&&defined(LEFT)&&defined(TRANSA))||(defined(TRMMKERNEL)&&!defined(LEFT)&&!defined(TRANSA))
  1939. MOVQ bb,ptrbb;
  1940. #else
  1941. MOVQ bb, ptrbb;
  1942. MOVQ kk, %rax;
  1943. SALQ $ZBASE_SHIFT, %rax;
  1944. LEAQ (ptrba, %rax, 8), ptrba;
  1945. LEAQ (ptrbb, %rax, 2), ptrbb;
  1946. #endif
  1947. XOR_SY yvec15, yvec15, yvec15;
  1948. XOR_SY yvec14, yvec14, yvec14;
  1949. XOR_SY yvec13, yvec13, yvec13;
  1950. XOR_SY yvec12, yvec12, yvec12;
  1951. XOR_SY yvec11, yvec11, yvec11;
  1952. XOR_SY yvec10, yvec10, yvec10;
  1953. XOR_SY yvec9, yvec9, yvec9;
  1954. XOR_SY yvec8, yvec8, yvec8;
  1955. #ifndef TRMMKERNEL
  1956. MOVQ bk,k;
  1957. #elif (defined(LEFT)&&!defined(TRANSA))||(!defined(LEFT)&&defined(TRANSA))
  1958. MOVQ bk, %rax;
  1959. SUBQ kk, %rax;
  1960. MOVQ %rax, kkk;
  1961. #else
  1962. MOVQ kk, %rax;
  1963. #ifdef LEFT
  1964. ADDQ $8, %rax;
  1965. #else
  1966. ADDQ $2, %rax;
  1967. #endif
  1968. MOVQ %rax, kkk;
  1969. #endif
  1970. SARQ $2, k;
  1971. JLE .L211_loopE;
  1972. ALIGN_5
  1973. .L211_bodyB:
  1974. EDUP_SX 0*SIZE(ptrbb), xvec4;
  1975. ODUP_SX 0*SIZE(ptrbb), xvec5;
  1976. SHUF_SX $0x4e, xvec4, xvec6;
  1977. SHUF_SX $0x4e, xvec5, xvec7;
  1978. LD_SX 0*SIZE(ptrba), xvec0;
  1979. MOV_SX xvec0, xvec1;
  1980. MUL_SX xvec4, xvec0, xvec0;
  1981. ADD1_SX xvec0, xvec15, xvec15;
  1982. SHUF_SX $0xb1, xvec1, xvec2;
  1983. MUL_SX xvec6, xvec1, xvec1;
  1984. ADD1_SX xvec1, xvec11, xvec11;
  1985. MOV_SX xvec2, xvec3;
  1986. MUL_SX xvec5, xvec2, xvec2;
  1987. ADD2_SX xvec2, xvec15, xvec15;
  1988. MUL_SX xvec7, xvec3, xvec3;
  1989. ADD2_SX xvec3, xvec11, xvec11;
  1990. LD_SX 4*SIZE(ptrba), xvec0;
  1991. MOV_SX xvec0, xvec1;
  1992. MUL_SX xvec4, xvec0, xvec0;
  1993. ADD1_SX xvec0, xvec14, xvec14;
  1994. SHUF_SX $0xb1, xvec1, xvec2;
  1995. MUL_SX xvec6, xvec1, xvec1;
  1996. ADD1_SX xvec1, xvec10, xvec10;
  1997. MOV_SX xvec2, xvec3;
  1998. MUL_SX xvec5, xvec2, xvec2;
  1999. ADD2_SX xvec2, xvec14, xvec14;
  2000. MUL_SX xvec7, xvec3, xvec3;
  2001. ADD2_SX xvec3, xvec10, xvec10;
  2002. LD_SX 8*SIZE(ptrba), xvec0;
  2003. MOV_SX xvec0, xvec1;
  2004. MUL_SX xvec4, xvec0, xvec0;
  2005. ADD1_SX xvec0, xvec13, xvec13;
  2006. SHUF_SX $0xb1, xvec1, xvec2;
  2007. MUL_SX xvec6, xvec1, xvec1;
  2008. ADD1_SX xvec1, xvec9, xvec9;
  2009. MOV_SX xvec2, xvec3;
  2010. MUL_SX xvec5, xvec2, xvec2;
  2011. ADD2_SX xvec2, xvec13, xvec13;
  2012. MUL_SX xvec7, xvec3, xvec3;
  2013. ADD2_SX xvec3, xvec9, xvec9;
  2014. LD_SX 12*SIZE(ptrba), xvec0;
  2015. MOV_SX xvec0, xvec1;
  2016. MUL_SX xvec4, xvec0, xvec0;
  2017. ADD1_SX xvec0, xvec12, xvec12;
  2018. SHUF_SX $0xb1, xvec1, xvec2;
  2019. MUL_SX xvec6, xvec1, xvec1;
  2020. ADD1_SX xvec1, xvec8, xvec8;
  2021. MOV_SX xvec2, xvec3;
  2022. MUL_SX xvec5, xvec2, xvec2;
  2023. ADD2_SX xvec2, xvec12, xvec12;
  2024. MUL_SX xvec7, xvec3, xvec3;
  2025. ADD2_SX xvec3, xvec8, xvec8;
  2026. EDUP_SX 4*SIZE(ptrbb), xvec4;
  2027. ODUP_SX 4*SIZE(ptrbb), xvec5;
  2028. SHUF_SX $0x4e, xvec4, xvec6;
  2029. SHUF_SX $0x4e, xvec5, xvec7;
  2030. LD_SX 16*SIZE(ptrba), xvec0;
  2031. MOV_SX xvec0, xvec1;
  2032. MUL_SX xvec4, xvec0, xvec0;
  2033. ADD1_SX xvec0, xvec15, xvec15;
  2034. SHUF_SX $0xb1, xvec1, xvec2;
  2035. MUL_SX xvec6, xvec1, xvec1;
  2036. ADD1_SX xvec1, xvec11, xvec11;
  2037. MOV_SX xvec2, xvec3;
  2038. MUL_SX xvec5, xvec2, xvec2;
  2039. ADD2_SX xvec2, xvec15, xvec15;
  2040. MUL_SX xvec7, xvec3, xvec3;
  2041. ADD2_SX xvec3, xvec11, xvec11;
  2042. LD_SX 20*SIZE(ptrba), xvec0;
  2043. MOV_SX xvec0, xvec1;
  2044. MUL_SX xvec4, xvec0, xvec0;
  2045. ADD1_SX xvec0, xvec14, xvec14;
  2046. SHUF_SX $0xb1, xvec1, xvec2;
  2047. MUL_SX xvec6, xvec1, xvec1;
  2048. ADD1_SX xvec1, xvec10, xvec10;
  2049. MOV_SX xvec2, xvec3;
  2050. MUL_SX xvec5, xvec2, xvec2;
  2051. ADD2_SX xvec2, xvec14, xvec14;
  2052. MUL_SX xvec7, xvec3, xvec3;
  2053. ADD2_SX xvec3, xvec10, xvec10;
  2054. LD_SX 24*SIZE(ptrba), xvec0;
  2055. MOV_SX xvec0, xvec1;
  2056. MUL_SX xvec4, xvec0, xvec0;
  2057. ADD1_SX xvec0, xvec13, xvec13;
  2058. SHUF_SX $0xb1, xvec1, xvec2;
  2059. MUL_SX xvec6, xvec1, xvec1;
  2060. ADD1_SX xvec1, xvec9, xvec9;
  2061. MOV_SX xvec2, xvec3;
  2062. MUL_SX xvec5, xvec2, xvec2;
  2063. ADD2_SX xvec2, xvec13, xvec13;
  2064. MUL_SX xvec7, xvec3, xvec3;
  2065. ADD2_SX xvec3, xvec9, xvec9;
  2066. LD_SX 28*SIZE(ptrba), xvec0;
  2067. MOV_SX xvec0, xvec1;
  2068. MUL_SX xvec4, xvec0, xvec0;
  2069. ADD1_SX xvec0, xvec12, xvec12;
  2070. SHUF_SX $0xb1, xvec1, xvec2;
  2071. MUL_SX xvec6, xvec1, xvec1;
  2072. ADD1_SX xvec1, xvec8, xvec8;
  2073. MOV_SX xvec2, xvec3;
  2074. MUL_SX xvec5, xvec2, xvec2;
  2075. ADD2_SX xvec2, xvec12, xvec12;
  2076. MUL_SX xvec7, xvec3, xvec3;
  2077. ADD2_SX xvec3, xvec8, xvec8;
  2078. EDUP_SX 8*SIZE(ptrbb), xvec4;
  2079. ODUP_SX 8*SIZE(ptrbb), xvec5;
  2080. SHUF_SX $0x4e, xvec4, xvec6;
  2081. SHUF_SX $0x4e, xvec5, xvec7;
  2082. LD_SX 32*SIZE(ptrba), xvec0;
  2083. MOV_SX xvec0, xvec1;
  2084. MUL_SX xvec4, xvec0, xvec0;
  2085. ADD1_SX xvec0, xvec15, xvec15;
  2086. SHUF_SX $0xb1, xvec1, xvec2;
  2087. MUL_SX xvec6, xvec1, xvec1;
  2088. ADD1_SX xvec1, xvec11, xvec11;
  2089. MOV_SX xvec2, xvec3;
  2090. MUL_SX xvec5, xvec2, xvec2;
  2091. ADD2_SX xvec2, xvec15, xvec15;
  2092. MUL_SX xvec7, xvec3, xvec3;
  2093. ADD2_SX xvec3, xvec11, xvec11;
  2094. LD_SX 36*SIZE(ptrba), xvec0;
  2095. MOV_SX xvec0, xvec1;
  2096. MUL_SX xvec4, xvec0, xvec0;
  2097. ADD1_SX xvec0, xvec14, xvec14;
  2098. SHUF_SX $0xb1, xvec1, xvec2;
  2099. MUL_SX xvec6, xvec1, xvec1;
  2100. ADD1_SX xvec1, xvec10, xvec10;
  2101. MOV_SX xvec2, xvec3;
  2102. MUL_SX xvec5, xvec2, xvec2;
  2103. ADD2_SX xvec2, xvec14, xvec14;
  2104. MUL_SX xvec7, xvec3, xvec3;
  2105. ADD2_SX xvec3, xvec10, xvec10;
  2106. LD_SX 40*SIZE(ptrba), xvec0;
  2107. MOV_SX xvec0, xvec1;
  2108. MUL_SX xvec4, xvec0, xvec0;
  2109. ADD1_SX xvec0, xvec13, xvec13;
  2110. SHUF_SX $0xb1, xvec1, xvec2;
  2111. MUL_SX xvec6, xvec1, xvec1;
  2112. ADD1_SX xvec1, xvec9, xvec9;
  2113. MOV_SX xvec2, xvec3;
  2114. MUL_SX xvec5, xvec2, xvec2;
  2115. ADD2_SX xvec2, xvec13, xvec13;
  2116. MUL_SX xvec7, xvec3, xvec3;
  2117. ADD2_SX xvec3, xvec9, xvec9;
  2118. LD_SX 44*SIZE(ptrba), xvec0;
  2119. MOV_SX xvec0, xvec1;
  2120. MUL_SX xvec4, xvec0, xvec0;
  2121. ADD1_SX xvec0, xvec12, xvec12;
  2122. SHUF_SX $0xb1, xvec1, xvec2;
  2123. MUL_SX xvec6, xvec1, xvec1;
  2124. ADD1_SX xvec1, xvec8, xvec8;
  2125. MOV_SX xvec2, xvec3;
  2126. MUL_SX xvec5, xvec2, xvec2;
  2127. ADD2_SX xvec2, xvec12, xvec12;
  2128. MUL_SX xvec7, xvec3, xvec3;
  2129. ADD2_SX xvec3, xvec8, xvec8;
  2130. EDUP_SX 12*SIZE(ptrbb), xvec4;
  2131. ODUP_SX 12*SIZE(ptrbb), xvec5;
  2132. SHUF_SX $0x4e, xvec4, xvec6;
  2133. SHUF_SX $0x4e, xvec5, xvec7;
  2134. LD_SX 48*SIZE(ptrba), xvec0;
  2135. MOV_SX xvec0, xvec1;
  2136. MUL_SX xvec4, xvec0, xvec0;
  2137. ADD1_SX xvec0, xvec15, xvec15;
  2138. SHUF_SX $0xb1, xvec1, xvec2;
  2139. MUL_SX xvec6, xvec1, xvec1;
  2140. ADD1_SX xvec1, xvec11, xvec11;
  2141. MOV_SX xvec2, xvec3;
  2142. MUL_SX xvec5, xvec2, xvec2;
  2143. ADD2_SX xvec2, xvec15, xvec15;
  2144. MUL_SX xvec7, xvec3, xvec3;
  2145. ADD2_SX xvec3, xvec11, xvec11;
  2146. LD_SX 52*SIZE(ptrba), xvec0;
  2147. MOV_SX xvec0, xvec1;
  2148. MUL_SX xvec4, xvec0, xvec0;
  2149. ADD1_SX xvec0, xvec14, xvec14;
  2150. SHUF_SX $0xb1, xvec1, xvec2;
  2151. MUL_SX xvec6, xvec1, xvec1;
  2152. ADD1_SX xvec1, xvec10, xvec10;
  2153. MOV_SX xvec2, xvec3;
  2154. MUL_SX xvec5, xvec2, xvec2;
  2155. ADD2_SX xvec2, xvec14, xvec14;
  2156. MUL_SX xvec7, xvec3, xvec3;
  2157. ADD2_SX xvec3, xvec10, xvec10;
  2158. LD_SX 56*SIZE(ptrba), xvec0;
  2159. MOV_SX xvec0, xvec1;
  2160. MUL_SX xvec4, xvec0, xvec0;
  2161. ADD1_SX xvec0, xvec13, xvec13;
  2162. SHUF_SX $0xb1, xvec1, xvec2;
  2163. MUL_SX xvec6, xvec1, xvec1;
  2164. ADD1_SX xvec1, xvec9, xvec9;
  2165. MOV_SX xvec2, xvec3;
  2166. MUL_SX xvec5, xvec2, xvec2;
  2167. ADD2_SX xvec2, xvec13, xvec13;
  2168. MUL_SX xvec7, xvec3, xvec3;
  2169. ADD2_SX xvec3, xvec9, xvec9;
  2170. LD_SX 60*SIZE(ptrba), xvec0;
  2171. MOV_SX xvec0, xvec1;
  2172. MUL_SX xvec4, xvec0, xvec0;
  2173. ADD1_SX xvec0, xvec12, xvec12;
  2174. SHUF_SX $0xb1, xvec1, xvec2;
  2175. MUL_SX xvec6, xvec1, xvec1;
  2176. ADD1_SX xvec1, xvec8, xvec8;
  2177. MOV_SX xvec2, xvec3;
  2178. MUL_SX xvec5, xvec2, xvec2;
  2179. ADD2_SX xvec2, xvec12, xvec12;
  2180. MUL_SX xvec7, xvec3, xvec3;
  2181. ADD2_SX xvec3, xvec8, xvec8;
  2182. ADDQ $64*SIZE, ptrba;
  2183. ADDQ $16*SIZE, ptrbb;
  2184. DECQ k;
  2185. JG .L211_bodyB;
  2186. ALIGN_5
  2187. .L211_loopE:
  2188. #ifndef TRMMKERNEL
  2189. TEST $2, bk;
  2190. #else
  2191. TEST $2, kkk;
  2192. #endif
  2193. JLE .L212_loopE;
  2194. ALIGN_5
  2195. .L212_bodyB:
  2196. EDUP_SX 0*SIZE(ptrbb), xvec4;
  2197. ODUP_SX 0*SIZE(ptrbb), xvec5;
  2198. SHUF_SX $0x4e, xvec4, xvec6;
  2199. SHUF_SX $0x4e, xvec5, xvec7;
  2200. LD_SX 0*SIZE(ptrba), xvec0;
  2201. MOV_SX xvec0, xvec1;
  2202. MUL_SX xvec4, xvec0, xvec0;
  2203. ADD1_SX xvec0, xvec15, xvec15;
  2204. SHUF_SX $0xb1, xvec1, xvec2;
  2205. MUL_SX xvec6, xvec1, xvec1;
  2206. ADD1_SX xvec1, xvec11, xvec11;
  2207. MOV_SX xvec2, xvec3;
  2208. MUL_SX xvec5, xvec2, xvec2;
  2209. ADD2_SX xvec2, xvec15, xvec15;
  2210. MUL_SX xvec7, xvec3, xvec3;
  2211. ADD2_SX xvec3, xvec11, xvec11;
  2212. LD_SX 4*SIZE(ptrba), xvec0;
  2213. MOV_SX xvec0, xvec1;
  2214. MUL_SX xvec4, xvec0, xvec0;
  2215. ADD1_SX xvec0, xvec14, xvec14;
  2216. SHUF_SX $0xb1, xvec1, xvec2;
  2217. MUL_SX xvec6, xvec1, xvec1;
  2218. ADD1_SX xvec1, xvec10, xvec10;
  2219. MOV_SX xvec2, xvec3;
  2220. MUL_SX xvec5, xvec2, xvec2;
  2221. ADD2_SX xvec2, xvec14, xvec14;
  2222. MUL_SX xvec7, xvec3, xvec3;
  2223. ADD2_SX xvec3, xvec10, xvec10;
  2224. LD_SX 8*SIZE(ptrba), xvec0;
  2225. MOV_SX xvec0, xvec1;
  2226. MUL_SX xvec4, xvec0, xvec0;
  2227. ADD1_SX xvec0, xvec13, xvec13;
  2228. SHUF_SX $0xb1, xvec1, xvec2;
  2229. MUL_SX xvec6, xvec1, xvec1;
  2230. ADD1_SX xvec1, xvec9, xvec9;
  2231. MOV_SX xvec2, xvec3;
  2232. MUL_SX xvec5, xvec2, xvec2;
  2233. ADD2_SX xvec2, xvec13, xvec13;
  2234. MUL_SX xvec7, xvec3, xvec3;
  2235. ADD2_SX xvec3, xvec9, xvec9;
  2236. LD_SX 12*SIZE(ptrba), xvec0;
  2237. MOV_SX xvec0, xvec1;
  2238. MUL_SX xvec4, xvec0, xvec0;
  2239. ADD1_SX xvec0, xvec12, xvec12;
  2240. SHUF_SX $0xb1, xvec1, xvec2;
  2241. MUL_SX xvec6, xvec1, xvec1;
  2242. ADD1_SX xvec1, xvec8, xvec8;
  2243. MOV_SX xvec2, xvec3;
  2244. MUL_SX xvec5, xvec2, xvec2;
  2245. ADD2_SX xvec2, xvec12, xvec12;
  2246. MUL_SX xvec7, xvec3, xvec3;
  2247. ADD2_SX xvec3, xvec8, xvec8;
  2248. EDUP_SX 4*SIZE(ptrbb), xvec4;
  2249. ODUP_SX 4*SIZE(ptrbb), xvec5;
  2250. SHUF_SX $0x4e, xvec4, xvec6;
  2251. SHUF_SX $0x4e, xvec5, xvec7;
  2252. LD_SX 16*SIZE(ptrba), xvec0;
  2253. MOV_SX xvec0, xvec1;
  2254. MUL_SX xvec4, xvec0, xvec0;
  2255. ADD1_SX xvec0, xvec15, xvec15;
  2256. SHUF_SX $0xb1, xvec1, xvec2;
  2257. MUL_SX xvec6, xvec1, xvec1;
  2258. ADD1_SX xvec1, xvec11, xvec11;
  2259. MOV_SX xvec2, xvec3;
  2260. MUL_SX xvec5, xvec2, xvec2;
  2261. ADD2_SX xvec2, xvec15, xvec15;
  2262. MUL_SX xvec7, xvec3, xvec3;
  2263. ADD2_SX xvec3, xvec11, xvec11;
  2264. LD_SX 20*SIZE(ptrba), xvec0;
  2265. MOV_SX xvec0, xvec1;
  2266. MUL_SX xvec4, xvec0, xvec0;
  2267. ADD1_SX xvec0, xvec14, xvec14;
  2268. SHUF_SX $0xb1, xvec1, xvec2;
  2269. MUL_SX xvec6, xvec1, xvec1;
  2270. ADD1_SX xvec1, xvec10, xvec10;
  2271. MOV_SX xvec2, xvec3;
  2272. MUL_SX xvec5, xvec2, xvec2;
  2273. ADD2_SX xvec2, xvec14, xvec14;
  2274. MUL_SX xvec7, xvec3, xvec3;
  2275. ADD2_SX xvec3, xvec10, xvec10;
  2276. LD_SX 24*SIZE(ptrba), xvec0;
  2277. MOV_SX xvec0, xvec1;
  2278. MUL_SX xvec4, xvec0, xvec0;
  2279. ADD1_SX xvec0, xvec13, xvec13;
  2280. SHUF_SX $0xb1, xvec1, xvec2;
  2281. MUL_SX xvec6, xvec1, xvec1;
  2282. ADD1_SX xvec1, xvec9, xvec9;
  2283. MOV_SX xvec2, xvec3;
  2284. MUL_SX xvec5, xvec2, xvec2;
  2285. ADD2_SX xvec2, xvec13, xvec13;
  2286. MUL_SX xvec7, xvec3, xvec3;
  2287. ADD2_SX xvec3, xvec9, xvec9;
  2288. LD_SX 28*SIZE(ptrba), xvec0;
  2289. MOV_SX xvec0, xvec1;
  2290. MUL_SX xvec4, xvec0, xvec0;
  2291. ADD1_SX xvec0, xvec12, xvec12;
  2292. SHUF_SX $0xb1, xvec1, xvec2;
  2293. MUL_SX xvec6, xvec1, xvec1;
  2294. ADD1_SX xvec1, xvec8, xvec8;
  2295. MOV_SX xvec2, xvec3;
  2296. MUL_SX xvec5, xvec2, xvec2;
  2297. ADD2_SX xvec2, xvec12, xvec12;
  2298. MUL_SX xvec7, xvec3, xvec3;
  2299. ADD2_SX xvec3, xvec8, xvec8;
  2300. ADDQ $32*SIZE, ptrba;
  2301. ADDQ $8*SIZE, ptrbb;
  2302. .L212_loopE:
  2303. #ifndef TRMMKERNEL
  2304. TEST $1, bk;
  2305. #else
  2306. TEST $1, kkk;
  2307. #endif
  2308. JLE .L213_loopE;
  2309. ALIGN_5
  2310. .L213_bodyB:
  2311. EDUP_SX 0*SIZE(ptrbb), xvec4;
  2312. ODUP_SX 0*SIZE(ptrbb), xvec5;
  2313. SHUF_SX $0x4e, xvec4, xvec6;
  2314. SHUF_SX $0x4e, xvec5, xvec7;
  2315. LD_SX 0*SIZE(ptrba), xvec0;
  2316. MOV_SX xvec0, xvec1;
  2317. MUL_SX xvec4, xvec0, xvec0;
  2318. ADD1_SX xvec0, xvec15, xvec15;
  2319. SHUF_SX $0xb1, xvec1, xvec2;
  2320. MUL_SX xvec6, xvec1, xvec1;
  2321. ADD1_SX xvec1, xvec11, xvec11;
  2322. MOV_SX xvec2, xvec3;
  2323. MUL_SX xvec5, xvec2, xvec2;
  2324. ADD2_SX xvec2, xvec15, xvec15;
  2325. MUL_SX xvec7, xvec3, xvec3;
  2326. ADD2_SX xvec3, xvec11, xvec11;
  2327. LD_SX 4*SIZE(ptrba), xvec0;
  2328. MOV_SX xvec0, xvec1;
  2329. MUL_SX xvec4, xvec0, xvec0;
  2330. ADD1_SX xvec0, xvec14, xvec14;
  2331. SHUF_SX $0xb1, xvec1, xvec2;
  2332. MUL_SX xvec6, xvec1, xvec1;
  2333. ADD1_SX xvec1, xvec10, xvec10;
  2334. MOV_SX xvec2, xvec3;
  2335. MUL_SX xvec5, xvec2, xvec2;
  2336. ADD2_SX xvec2, xvec14, xvec14;
  2337. MUL_SX xvec7, xvec3, xvec3;
  2338. ADD2_SX xvec3, xvec10, xvec10;
  2339. LD_SX 8*SIZE(ptrba), xvec0;
  2340. MOV_SX xvec0, xvec1;
  2341. MUL_SX xvec4, xvec0, xvec0;
  2342. ADD1_SX xvec0, xvec13, xvec13;
  2343. SHUF_SX $0xb1, xvec1, xvec2;
  2344. MUL_SX xvec6, xvec1, xvec1;
  2345. ADD1_SX xvec1, xvec9, xvec9;
  2346. MOV_SX xvec2, xvec3;
  2347. MUL_SX xvec5, xvec2, xvec2;
  2348. ADD2_SX xvec2, xvec13, xvec13;
  2349. MUL_SX xvec7, xvec3, xvec3;
  2350. ADD2_SX xvec3, xvec9, xvec9;
  2351. LD_SX 12*SIZE(ptrba), xvec0;
  2352. MOV_SX xvec0, xvec1;
  2353. MUL_SX xvec4, xvec0, xvec0;
  2354. ADD1_SX xvec0, xvec12, xvec12;
  2355. SHUF_SX $0xb1, xvec1, xvec2;
  2356. MUL_SX xvec6, xvec1, xvec1;
  2357. ADD1_SX xvec1, xvec8, xvec8;
  2358. MOV_SX xvec2, xvec3;
  2359. MUL_SX xvec5, xvec2, xvec2;
  2360. ADD2_SX xvec2, xvec12, xvec12;
  2361. MUL_SX xvec7, xvec3, xvec3;
  2362. ADD2_SX xvec3, xvec8, xvec8;
  2363. ADDQ $16*SIZE, ptrba;
  2364. ADDQ $4*SIZE, ptrbb
  2365. .L213_loopE:
  2366. #### Handle ####
  2367. #if defined(RN) || defined(RT) || defined(CN) || defined(CT)
  2368. XOR_SY yvec7, yvec7, yvec7;
  2369. ADDSUB_SX xvec15, xvec7, xvec7;
  2370. MOV_SX xvec7, xvec15;
  2371. XOR_SY yvec7, yvec7, yvec7;
  2372. ADDSUB_SX xvec14, xvec7, xvec7;
  2373. MOV_SX xvec7, xvec14;
  2374. XOR_SY yvec7, yvec7, yvec7;
  2375. ADDSUB_SX xvec13, xvec7, xvec7;
  2376. MOV_SX xvec7, xvec13;
  2377. XOR_SY yvec7, yvec7, yvec7;
  2378. ADDSUB_SX xvec12, xvec7, xvec7;
  2379. MOV_SX xvec7, xvec12;
  2380. XOR_SY yvec7, yvec7, yvec7;
  2381. ADDSUB_SX xvec11, xvec7, xvec7;
  2382. MOV_SX xvec7, xvec11;
  2383. XOR_SY yvec7, yvec7, yvec7;
  2384. ADDSUB_SX xvec10, xvec7, xvec7;
  2385. MOV_SX xvec7, xvec10;
  2386. XOR_SY yvec7, yvec7, yvec7;
  2387. ADDSUB_SX xvec9, xvec7, xvec7;
  2388. MOV_SX xvec7, xvec9;
  2389. XOR_SY yvec7, yvec7, yvec7;
  2390. ADDSUB_SX xvec8, xvec7, xvec7;
  2391. MOV_SX xvec7, xvec8;
  2392. #elif defined(NR) || defined(NC) || defined(TR) || defined(TC)
  2393. XOR_SY yvec7, yvec7, yvec7;
  2394. SUB_SX xvec15, xvec7, xvec7;
  2395. MOV_SX xvec7, xvec15;
  2396. XOR_SY yvec7, yvec7, yvec7;
  2397. SUB_SX xvec14, xvec7, xvec7;
  2398. MOV_SX xvec7, xvec14;
  2399. XOR_SY yvec7, yvec7, yvec7;
  2400. SUB_SX xvec13, xvec7, xvec7;
  2401. MOV_SX xvec7, xvec13;
  2402. XOR_SY yvec7, yvec7, yvec7;
  2403. SUB_SX xvec12, xvec7, xvec7;
  2404. MOV_SX xvec7, xvec12;
  2405. XOR_SY yvec7, yvec7, yvec7;
  2406. SUB_SX xvec11, xvec7, xvec7;
  2407. MOV_SX xvec7, xvec11;
  2408. XOR_SY yvec7, yvec7, yvec7;
  2409. SUB_SX xvec10, xvec7, xvec7;
  2410. MOV_SX xvec7, xvec10;
  2411. XOR_SY yvec7, yvec7, yvec7;
  2412. SUB_SX xvec9, xvec7, xvec7;
  2413. MOV_SX xvec7, xvec9;
  2414. XOR_SY yvec7, yvec7, yvec7;
  2415. SUB_SX xvec8, xvec7, xvec7;
  2416. MOV_SX xvec7, xvec8;
  2417. #elif defined(RR) || defined(RC) || defined(CR) || defined(CC)
  2418. SHUF_SX $0xb1, xvec15, xvec15;
  2419. SHUF_SX $0xb1, xvec14, xvec14;
  2420. SHUF_SX $0xb1, xvec13, xvec13;
  2421. SHUF_SX $0xb1, xvec12, xvec12;
  2422. SHUF_SX $0xb1, xvec11, xvec11;
  2423. SHUF_SX $0xb1, xvec10, xvec10;
  2424. SHUF_SX $0xb1, xvec9, xvec9;
  2425. SHUF_SX $0xb1, xvec8, xvec8;
  2426. XOR_SY yvec7, yvec7, yvec7;
  2427. ADDSUB_SX xvec15, xvec7, xvec7;
  2428. MOV_SX xvec7, xvec15;
  2429. XOR_SY yvec7, yvec7, yvec7;
  2430. ADDSUB_SX xvec14, xvec7, xvec7;
  2431. MOV_SX xvec7, xvec14;
  2432. XOR_SY yvec7, yvec7, yvec7;
  2433. ADDSUB_SX xvec13, xvec7, xvec7;
  2434. MOV_SX xvec7, xvec13;
  2435. XOR_SY yvec7, yvec7, yvec7;
  2436. ADDSUB_SX xvec12, xvec7, xvec7;
  2437. MOV_SX xvec7, xvec12;
  2438. XOR_SY yvec7, yvec7, yvec7;
  2439. ADDSUB_SX xvec11, xvec7, xvec7;
  2440. MOV_SX xvec7, xvec11;
  2441. XOR_SY yvec7, yvec7, yvec7;
  2442. ADDSUB_SX xvec10, xvec7, xvec7;
  2443. MOV_SX xvec7, xvec10;
  2444. XOR_SY yvec7, yvec7, yvec7;
  2445. ADDSUB_SX xvec9, xvec7, xvec7;
  2446. MOV_SX xvec7, xvec9;
  2447. XOR_SY yvec7, yvec7, yvec7;
  2448. ADDSUB_SX xvec8, xvec7, xvec7;
  2449. MOV_SX xvec7, xvec8;
  2450. SHUF_SX $0xb1, xvec15, xvec15;
  2451. SHUF_SX $0xb1, xvec14, xvec14;
  2452. SHUF_SX $0xb1, xvec13, xvec13;
  2453. SHUF_SX $0xb1, xvec12, xvec12;
  2454. SHUF_SX $0xb1, xvec11, xvec11;
  2455. SHUF_SX $0xb1, xvec10, xvec10;
  2456. SHUF_SX $0xb1, xvec9, xvec9;
  2457. SHUF_SX $0xb1, xvec8, xvec8;
  2458. #endif
  2459. #### Mulitply Alpha ####
  2460. BROAD_SX MEMALPHA_R, xvec7;
  2461. BROAD_SX MEMALPHA_I, xvec6;
  2462. #### Writng back ####
  2463. VPERMILP_SX $0xb1,xvec15, xvec5;
  2464. MUL_SX xvec7, xvec15, xvec15;
  2465. MUL_SX xvec6, xvec5, xvec5;
  2466. ADDSUB_SX xvec5, xvec15, xvec15;
  2467. VPERMILP_SX $0xb1,xvec14, xvec4;
  2468. MUL_SX xvec7, xvec14, xvec14;
  2469. MUL_SX xvec6, xvec4, xvec4;
  2470. ADDSUB_SX xvec4, xvec14, xvec14;
  2471. VPERMILP_SX $0xb1,xvec13, xvec3;
  2472. MUL_SX xvec7, xvec13, xvec13;
  2473. MUL_SX xvec6, xvec3, xvec3;
  2474. ADDSUB_SX xvec3, xvec13, xvec13;
  2475. VPERMILP_SX $0xb1,xvec12, xvec2;
  2476. MUL_SX xvec7, xvec12, xvec12;
  2477. MUL_SX xvec6, xvec2, xvec2;
  2478. ADDSUB_SX xvec2, xvec12, xvec12;
  2479. VPERMILP_SX $0xb1,xvec11, xvec1;
  2480. MUL_SX xvec7, xvec11, xvec11;
  2481. MUL_SX xvec6, xvec1, xvec1;
  2482. ADDSUB_SX xvec1, xvec11, xvec11;
  2483. VPERMILP_SX $0xb1,xvec10, xvec0;
  2484. MUL_SX xvec7, xvec10, xvec10;
  2485. MUL_SX xvec6, xvec0, xvec0;
  2486. ADDSUB_SX xvec0, xvec10, xvec10;
  2487. VPERMILP_SX $0xb1,xvec9, xvec5;
  2488. MUL_SX xvec7, xvec9, xvec9;
  2489. MUL_SX xvec6, xvec5, xvec5;
  2490. ADDSUB_SX xvec5, xvec9, xvec9;
  2491. VPERMILP_SX $0xb1,xvec8, xvec4;
  2492. MUL_SX xvec7, xvec8, xvec8;
  2493. MUL_SX xvec6, xvec4, xvec4;
  2494. ADDSUB_SX xvec4, xvec8, xvec8;
  2495. #ifndef TRMMKERNEL
  2496. LDL_SX 0*SIZE(C0), xvec0, xvec0;
  2497. LDH_SX 2*SIZE(C1), xvec0, xvec0;
  2498. LDL_SX 4*SIZE(C0), xvec1, xvec1;
  2499. LDH_SX 6*SIZE(C1), xvec1, xvec1;
  2500. LDL_SX 8*SIZE(C0), xvec2, xvec2;
  2501. LDH_SX 10*SIZE(C1), xvec2, xvec2;
  2502. LDL_SX 12*SIZE(C0), xvec3, xvec3;
  2503. LDH_SX 14*SIZE(C1), xvec3, xvec3;
  2504. ADD_SX xvec0, xvec15, xvec15;
  2505. ADD_SX xvec1, xvec14, xvec14;
  2506. ADD_SX xvec2, xvec13, xvec13;
  2507. ADD_SX xvec3, xvec12, xvec12;
  2508. #endif
  2509. STL_SX xvec15, 0*SIZE(C0);
  2510. STH_SX xvec15, 2*SIZE(C1);
  2511. STL_SX xvec14, 4*SIZE(C0);
  2512. STH_SX xvec14, 6*SIZE(C1);
  2513. STL_SX xvec13, 8*SIZE(C0);
  2514. STH_SX xvec13, 10*SIZE(C1);
  2515. STL_SX xvec12, 12*SIZE(C0);
  2516. STH_SX xvec12, 14*SIZE(C1);
  2517. #ifndef TRMMKERNEL
  2518. LDL_SX 0*SIZE(C1), xvec4, xvec4;
  2519. LDH_SX 2*SIZE(C0), xvec4, xvec4;
  2520. LDL_SX 4*SIZE(C1), xvec5, xvec5;
  2521. LDH_SX 6*SIZE(C0), xvec5, xvec5;
  2522. LDL_SX 8*SIZE(C1), xvec6, xvec6;
  2523. LDH_SX 10*SIZE(C0), xvec6, xvec6;
  2524. LDL_SX 12*SIZE(C1), xvec7, xvec7;
  2525. LDH_SX 14*SIZE(C0), xvec7, xvec7;
  2526. ADD_SX xvec4, xvec11, xvec11;
  2527. ADD_SX xvec5, xvec10, xvec10;
  2528. ADD_SX xvec6, xvec9, xvec9;
  2529. ADD_SX xvec7, xvec8, xvec8;
  2530. #endif
  2531. STL_SX xvec11, 0*SIZE(C1);
  2532. STH_SX xvec11, 2*SIZE(C0);
  2533. STL_SX xvec10, 4*SIZE(C1);
  2534. STH_SX xvec10, 6*SIZE(C0);
  2535. STL_SX xvec9, 8*SIZE(C1);
  2536. STH_SX xvec9, 10*SIZE(C0);
  2537. STL_SX xvec8, 12*SIZE(C1);
  2538. STH_SX xvec8, 14*SIZE(C0);
  2539. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  2540. MOVQ bk, %rax;
  2541. SUBQ kkk, %rax;
  2542. SALQ $ZBASE_SHIFT, %rax;
  2543. LEAQ (ptrba, %rax, 8), ptrba;
  2544. LEAQ (ptrbb, %rax, 2), ptrbb;
  2545. #endif
  2546. #if defined(TRMMKERNEL) && defined(LEFT)
  2547. ADDQ $8, kk;
  2548. #endif
  2549. ADDQ $16*SIZE, C0;
  2550. ADDQ $16*SIZE, C1;
  2551. DECQ i;
  2552. JG .L21_bodyB;
  2553. ALIGN_5
  2554. .L21_loopE:
  2555. TEST $4, bm;
  2556. JLE .L22_loopE;
  2557. ALIGN_5
  2558. .L22_bodyB:
  2559. #if !defined(TRMMKERNEL)||(defined(TRMMKERNEL)&&defined(LEFT)&&defined(TRANSA))||(defined(TRMMKERNEL)&&!defined(LEFT)&&!defined(TRANSA))
  2560. MOVQ bb,ptrbb;
  2561. #else
  2562. MOVQ bb, ptrbb;
  2563. MOVQ kk, %rax;
  2564. SALQ $ZBASE_SHIFT, %rax;
  2565. LEAQ (ptrba, %rax, 4), ptrba;
  2566. LEAQ (ptrbb, %rax, 2), ptrbb;
  2567. #endif
  2568. XOR_SY yvec15, yvec15, yvec15;
  2569. XOR_SY yvec14, yvec14, yvec14;
  2570. XOR_SY yvec11, yvec11, yvec11;
  2571. XOR_SY yvec10, yvec10, yvec10;
  2572. #ifndef TRMMKERNEL
  2573. MOVQ bk,k;
  2574. #elif (defined(LEFT)&&!defined(TRANSA))||(!defined(LEFT)&&defined(TRANSA))
  2575. MOVQ bk, %rax;
  2576. SUBQ kk, %rax;
  2577. MOVQ %rax, kkk;
  2578. #else
  2579. MOVQ kk, %rax;
  2580. #ifdef LEFT
  2581. ADDQ $4, %rax;
  2582. #else
  2583. ADDQ $2, %rax;
  2584. #endif
  2585. MOVQ %rax, kkk;
  2586. #endif
  2587. SARQ $2, k;
  2588. JLE .L221_loopE;
  2589. ALIGN_5
  2590. .L221_bodyB:
  2591. EDUP_SX 0*SIZE(ptrbb), xvec4;
  2592. ODUP_SX 0*SIZE(ptrbb), xvec5;
  2593. SHUF_SX $0x4e, xvec4, xvec6;
  2594. SHUF_SX $0x4e, xvec5, xvec7;
  2595. LD_SX 0*SIZE(ptrba), xvec0;
  2596. MOV_SX xvec0, xvec1;
  2597. MUL_SX xvec4, xvec0, xvec0;
  2598. ADD1_SX xvec0, xvec15, xvec15;
  2599. SHUF_SX $0xb1, xvec1, xvec2;
  2600. MUL_SX xvec6, xvec1, xvec1;
  2601. ADD1_SX xvec1, xvec11, xvec11;
  2602. MOV_SX xvec2, xvec3;
  2603. MUL_SX xvec5, xvec2, xvec2;
  2604. ADD2_SX xvec2, xvec15, xvec15;
  2605. MUL_SX xvec7, xvec3, xvec3;
  2606. ADD2_SX xvec3, xvec11, xvec11;
  2607. LD_SX 4*SIZE(ptrba), xvec0;
  2608. MOV_SX xvec0, xvec1;
  2609. MUL_SX xvec4, xvec0, xvec0;
  2610. ADD1_SX xvec0, xvec14, xvec14;
  2611. SHUF_SX $0xb1, xvec1, xvec2;
  2612. MUL_SX xvec6, xvec1, xvec1;
  2613. ADD1_SX xvec1, xvec10, xvec10;
  2614. MOV_SX xvec2, xvec3;
  2615. MUL_SX xvec5, xvec2, xvec2;
  2616. ADD2_SX xvec2, xvec14, xvec14;
  2617. MUL_SX xvec7, xvec3, xvec3;
  2618. ADD2_SX xvec3, xvec10, xvec10;
  2619. #### Unroll 2 #####
  2620. EDUP_SX 4*SIZE(ptrbb), xvec4;
  2621. ODUP_SX 4*SIZE(ptrbb), xvec5;
  2622. SHUF_SX $0x4e, xvec4, xvec6;
  2623. SHUF_SX $0x4e, xvec5, xvec7;
  2624. LD_SX 8*SIZE(ptrba), xvec0;
  2625. MOV_SX xvec0, xvec1;
  2626. MUL_SX xvec4, xvec0, xvec0;
  2627. ADD1_SX xvec0, xvec15, xvec15;
  2628. SHUF_SX $0xb1, xvec1, xvec2;
  2629. MUL_SX xvec6, xvec1, xvec1;
  2630. ADD1_SX xvec1, xvec11, xvec11;
  2631. MOV_SX xvec2, xvec3;
  2632. MUL_SX xvec5, xvec2, xvec2;
  2633. ADD2_SX xvec2, xvec15, xvec15;
  2634. MUL_SX xvec7, xvec3, xvec3;
  2635. ADD2_SX xvec3, xvec11, xvec11;
  2636. LD_SX 12*SIZE(ptrba), xvec0;
  2637. MOV_SX xvec0, xvec1;
  2638. MUL_SX xvec4, xvec0, xvec0;
  2639. ADD1_SX xvec0, xvec14, xvec14;
  2640. SHUF_SX $0xb1, xvec1, xvec2;
  2641. MUL_SX xvec6, xvec1, xvec1;
  2642. ADD1_SX xvec1, xvec10, xvec10;
  2643. MOV_SX xvec2, xvec3;
  2644. MUL_SX xvec5, xvec2, xvec2;
  2645. ADD2_SX xvec2, xvec14, xvec14;
  2646. MUL_SX xvec7, xvec3, xvec3;
  2647. ADD2_SX xvec3, xvec10, xvec10;
  2648. #### Unroll 3 ####
  2649. EDUP_SX 8*SIZE(ptrbb), xvec4;
  2650. ODUP_SX 8*SIZE(ptrbb), xvec5;
  2651. SHUF_SX $0x4e, xvec4, xvec6;
  2652. SHUF_SX $0x4e, xvec5, xvec7;
  2653. LD_SX 16*SIZE(ptrba), xvec0;
  2654. MOV_SX xvec0, xvec1;
  2655. MUL_SX xvec4, xvec0, xvec0;
  2656. ADD1_SX xvec0, xvec15, xvec15;
  2657. SHUF_SX $0xb1, xvec1, xvec2;
  2658. MUL_SX xvec6, xvec1, xvec1;
  2659. ADD1_SX xvec1, xvec11, xvec11;
  2660. MOV_SX xvec2, xvec3;
  2661. MUL_SX xvec5, xvec2, xvec2;
  2662. ADD2_SX xvec2, xvec15, xvec15;
  2663. MUL_SX xvec7, xvec3, xvec3;
  2664. ADD2_SX xvec3, xvec11, xvec11;
  2665. LD_SX 20*SIZE(ptrba), xvec0;
  2666. MOV_SX xvec0, xvec1;
  2667. MUL_SX xvec4, xvec0, xvec0;
  2668. ADD1_SX xvec0, xvec14, xvec14;
  2669. SHUF_SX $0xb1, xvec1, xvec2;
  2670. MUL_SX xvec6, xvec1, xvec1;
  2671. ADD1_SX xvec1, xvec10, xvec10;
  2672. MOV_SX xvec2, xvec3;
  2673. MUL_SX xvec5, xvec2, xvec2;
  2674. ADD2_SX xvec2, xvec14, xvec14;
  2675. MUL_SX xvec7, xvec3, xvec3;
  2676. ADD2_SX xvec3, xvec10, xvec10;
  2677. #### Unroll 4 ####
  2678. EDUP_SX 12*SIZE(ptrbb), xvec4;
  2679. ODUP_SX 12*SIZE(ptrbb), xvec5;
  2680. SHUF_SX $0x4e, xvec4, xvec6;
  2681. SHUF_SX $0x4e, xvec5, xvec7;
  2682. LD_SX 24*SIZE(ptrba), xvec0;
  2683. MOV_SX xvec0, xvec1;
  2684. MUL_SX xvec4, xvec0, xvec0;
  2685. ADD1_SX xvec0, xvec15, xvec15;
  2686. SHUF_SX $0xb1, xvec1, xvec2;
  2687. MUL_SX xvec6, xvec1, xvec1;
  2688. ADD1_SX xvec1, xvec11, xvec11;
  2689. MOV_SX xvec2, xvec3;
  2690. MUL_SX xvec5, xvec2, xvec2;
  2691. ADD2_SX xvec2, xvec15, xvec15;
  2692. MUL_SX xvec7, xvec3, xvec3;
  2693. ADD2_SX xvec3, xvec11, xvec11;
  2694. LD_SX 28*SIZE(ptrba), xvec0;
  2695. MOV_SX xvec0, xvec1;
  2696. MUL_SX xvec4, xvec0, xvec0;
  2697. ADD1_SX xvec0, xvec14, xvec14;
  2698. SHUF_SX $0xb1, xvec1, xvec2;
  2699. MUL_SX xvec6, xvec1, xvec1;
  2700. ADD1_SX xvec1, xvec10, xvec10;
  2701. MOV_SX xvec2, xvec3;
  2702. MUL_SX xvec5, xvec2, xvec2;
  2703. ADD2_SX xvec2, xvec14, xvec14;
  2704. MUL_SX xvec7, xvec3, xvec3;
  2705. ADD2_SX xvec3, xvec10, xvec10;
  2706. ADDQ $32*SIZE, ptrba;
  2707. ADDQ $16*SIZE, ptrbb;
  2708. DECQ k;
  2709. JG .L221_bodyB;
  2710. ALIGN_5
  2711. .L221_loopE:
  2712. #ifndef TRMMKERNEL
  2713. TEST $2, bk;
  2714. #else
  2715. TEST $2, kkk;
  2716. #endif
  2717. JLE .L222_loopE;
  2718. ALIGN_5
  2719. .L222_bodyB:
  2720. EDUP_SX 0*SIZE(ptrbb), xvec4;
  2721. ODUP_SX 0*SIZE(ptrbb), xvec5;
  2722. SHUF_SX $0x4e, xvec4, xvec6;
  2723. SHUF_SX $0x4e, xvec5, xvec7;
  2724. LD_SX 0*SIZE(ptrba), xvec0;
  2725. MOV_SX xvec0, xvec1;
  2726. MUL_SX xvec4, xvec0, xvec0;
  2727. ADD1_SX xvec0, xvec15, xvec15;
  2728. SHUF_SX $0xb1, xvec1, xvec2;
  2729. MUL_SX xvec6, xvec1, xvec1;
  2730. ADD1_SX xvec1, xvec11, xvec11;
  2731. MOV_SX xvec2, xvec3;
  2732. MUL_SX xvec5, xvec2, xvec2;
  2733. ADD2_SX xvec2, xvec15, xvec15;
  2734. MUL_SX xvec7, xvec3, xvec3;
  2735. ADD2_SX xvec3, xvec11, xvec11;
  2736. LD_SX 4*SIZE(ptrba), xvec0;
  2737. MOV_SX xvec0, xvec1;
  2738. MUL_SX xvec4, xvec0, xvec0;
  2739. ADD1_SX xvec0, xvec14, xvec14;
  2740. SHUF_SX $0xb1, xvec1, xvec2;
  2741. MUL_SX xvec6, xvec1, xvec1;
  2742. ADD1_SX xvec1, xvec10, xvec10;
  2743. MOV_SX xvec2, xvec3;
  2744. MUL_SX xvec5, xvec2, xvec2;
  2745. ADD2_SX xvec2, xvec14, xvec14;
  2746. MUL_SX xvec7, xvec3, xvec3;
  2747. ADD2_SX xvec3, xvec10, xvec10;
  2748. #### Unroll 2 #####
  2749. EDUP_SX 4*SIZE(ptrbb), xvec4;
  2750. ODUP_SX 4*SIZE(ptrbb), xvec5;
  2751. SHUF_SX $0x4e, xvec4, xvec6;
  2752. SHUF_SX $0x4e, xvec5, xvec7;
  2753. LD_SX 8*SIZE(ptrba), xvec0;
  2754. MOV_SX xvec0, xvec1;
  2755. MUL_SX xvec4, xvec0, xvec0;
  2756. ADD1_SX xvec0, xvec15, xvec15;
  2757. SHUF_SX $0xb1, xvec1, xvec2;
  2758. MUL_SX xvec6, xvec1, xvec1;
  2759. ADD1_SX xvec1, xvec11, xvec11;
  2760. MOV_SX xvec2, xvec3;
  2761. MUL_SX xvec5, xvec2, xvec2;
  2762. ADD2_SX xvec2, xvec15, xvec15;
  2763. MUL_SX xvec7, xvec3, xvec3;
  2764. ADD2_SX xvec3, xvec11, xvec11;
  2765. LD_SX 12*SIZE(ptrba), xvec0;
  2766. MOV_SX xvec0, xvec1;
  2767. MUL_SX xvec4, xvec0, xvec0;
  2768. ADD1_SX xvec0, xvec14, xvec14;
  2769. SHUF_SX $0xb1, xvec1, xvec2;
  2770. MUL_SX xvec6, xvec1, xvec1;
  2771. ADD1_SX xvec1, xvec10, xvec10;
  2772. MOV_SX xvec2, xvec3;
  2773. MUL_SX xvec5, xvec2, xvec2;
  2774. ADD2_SX xvec2, xvec14, xvec14;
  2775. MUL_SX xvec7, xvec3, xvec3;
  2776. ADD2_SX xvec3, xvec10, xvec10;
  2777. ADDQ $16*SIZE, ptrba;
  2778. ADDQ $8*SIZE, ptrbb;
  2779. .L222_loopE:
  2780. #ifndef TRMMKERNEL
  2781. TEST $1, bk;
  2782. #else
  2783. TEST $1, kkk;
  2784. #endif
  2785. JLE .L223_loopE;
  2786. ALIGN_5
  2787. .L223_bodyB:
  2788. EDUP_SX 0*SIZE(ptrbb), xvec4;
  2789. ODUP_SX 0*SIZE(ptrbb), xvec5;
  2790. SHUF_SX $0x4e, xvec4, xvec6;
  2791. SHUF_SX $0x4e, xvec5, xvec7;
  2792. LD_SX 0*SIZE(ptrba), xvec0;
  2793. MOV_SX xvec0, xvec1;
  2794. MUL_SX xvec4, xvec0, xvec0;
  2795. ADD1_SX xvec0, xvec15, xvec15;
  2796. SHUF_SX $0xb1, xvec1, xvec2;
  2797. MUL_SX xvec6, xvec1, xvec1;
  2798. ADD1_SX xvec1, xvec11, xvec11;
  2799. MOV_SX xvec2, xvec3;
  2800. MUL_SX xvec5, xvec2, xvec2;
  2801. ADD2_SX xvec2, xvec15, xvec15;
  2802. MUL_SX xvec7, xvec3, xvec3;
  2803. ADD2_SX xvec3, xvec11, xvec11;
  2804. LD_SX 4*SIZE(ptrba), xvec0;
  2805. MOV_SX xvec0, xvec1;
  2806. MUL_SX xvec4, xvec0, xvec0;
  2807. ADD1_SX xvec0, xvec14, xvec14;
  2808. SHUF_SX $0xb1, xvec1, xvec2;
  2809. MUL_SX xvec6, xvec1, xvec1;
  2810. ADD1_SX xvec1, xvec10, xvec10;
  2811. MOV_SX xvec2, xvec3;
  2812. MUL_SX xvec5, xvec2, xvec2;
  2813. ADD2_SX xvec2, xvec14, xvec14;
  2814. MUL_SX xvec7, xvec3, xvec3;
  2815. ADD2_SX xvec3, xvec10, xvec10;
  2816. ADDQ $8*SIZE, ptrba;
  2817. ADDQ $4*SIZE, ptrbb;
  2818. .L223_loopE:
  2819. #### Handle ####
  2820. #if defined(RN) || defined(RT) || defined(CN) || defined(CT)
  2821. XOR_SY yvec7, yvec7, yvec7;
  2822. ADDSUB_SX xvec15, xvec7, xvec7;
  2823. MOV_SX xvec7, xvec15;
  2824. XOR_SY yvec7, yvec7, yvec7;
  2825. ADDSUB_SX xvec14, xvec7, xvec7;
  2826. MOV_SX xvec7, xvec14;
  2827. XOR_SY yvec7, yvec7, yvec7;
  2828. ADDSUB_SX xvec11, xvec7, xvec7;
  2829. MOV_SX xvec7, xvec11;
  2830. XOR_SY yvec7, yvec7, yvec7;
  2831. ADDSUB_SX xvec10, xvec7, xvec7;
  2832. MOV_SX xvec7, xvec10;
  2833. #elif defined(NR) || defined(NC) || defined(TR) || defined(TC)
  2834. XOR_SY yvec7, yvec7, yvec7;
  2835. SUB_SX xvec15, xvec7, xvec7;
  2836. MOV_SX xvec7, xvec15;
  2837. XOR_SY yvec7, yvec7, yvec7;
  2838. SUB_SX xvec14, xvec7, xvec7;
  2839. MOV_SX xvec7, xvec14;
  2840. XOR_SY yvec7, yvec7, yvec7;
  2841. SUB_SX xvec11, xvec7, xvec7;
  2842. MOV_SX xvec7, xvec11;
  2843. XOR_SY yvec7, yvec7, yvec7;
  2844. SUB_SX xvec10, xvec7, xvec7;
  2845. MOV_SX xvec7, xvec10;
  2846. #elif defined(RR) || defined(RC) || defined(CR) || defined(CC)
  2847. SHUF_SX $0xb1, xvec15, xvec15;
  2848. SHUF_SX $0xb1, xvec14, xvec14;
  2849. SHUF_SX $0xb1, xvec11, xvec11;
  2850. SHUF_SX $0xb1, xvec10, xvec10;
  2851. XOR_SY yvec7, yvec7, yvec7;
  2852. ADDSUB_SX xvec15, xvec7, xvec7;
  2853. MOV_SX xvec7, xvec15;
  2854. XOR_SY yvec7, yvec7, yvec7;
  2855. ADDSUB_SX xvec14, xvec7, xvec7;
  2856. MOV_SX xvec7, xvec14;
  2857. XOR_SY yvec7, yvec7, yvec7;
  2858. ADDSUB_SX xvec11, xvec7, xvec7;
  2859. MOV_SX xvec7, xvec11;
  2860. XOR_SY yvec7, yvec7, yvec7;
  2861. ADDSUB_SX xvec10, xvec7, xvec7;
  2862. MOV_SX xvec7, xvec10;
  2863. SHUF_SX $0xb1, xvec15, xvec15;
  2864. SHUF_SX $0xb1, xvec14, xvec14;
  2865. SHUF_SX $0xb1, xvec11, xvec11;
  2866. SHUF_SX $0xb1, xvec10, xvec10;
  2867. #endif
  2868. #### Mulitply Alpha ####
  2869. BROAD_SX MEMALPHA_R, xvec7;
  2870. BROAD_SX MEMALPHA_I, xvec6;
  2871. #### Writng back ####
  2872. VPERMILP_SX $0xb1,xvec15, xvec5;
  2873. MUL_SX xvec7, xvec15, xvec15;
  2874. MUL_SX xvec6, xvec5, xvec5;
  2875. ADDSUB_SX xvec5, xvec15, xvec15;
  2876. VPERMILP_SX $0xb1,xvec14, xvec4;
  2877. MUL_SX xvec7, xvec14, xvec14;
  2878. MUL_SX xvec6, xvec4, xvec4;
  2879. ADDSUB_SX xvec4, xvec14, xvec14;
  2880. VPERMILP_SX $0xb1,xvec11, xvec1;
  2881. MUL_SX xvec7, xvec11, xvec11;
  2882. MUL_SX xvec6, xvec1, xvec1;
  2883. ADDSUB_SX xvec1, xvec11, xvec11;
  2884. VPERMILP_SX $0xb1,xvec10, xvec0;
  2885. MUL_SX xvec7, xvec10, xvec10;
  2886. MUL_SX xvec6, xvec0, xvec0;
  2887. ADDSUB_SX xvec0, xvec10, xvec10;
  2888. #ifndef TRMMKERNEL
  2889. LDL_SX 0*SIZE(C0), xvec0, xvec0;
  2890. LDH_SX 2*SIZE(C1), xvec0, xvec0;
  2891. LDL_SX 4*SIZE(C0), xvec1, xvec1;
  2892. LDH_SX 6*SIZE(C1), xvec1, xvec1;
  2893. ADD_SX xvec0, xvec15, xvec15;
  2894. ADD_SX xvec1, xvec14, xvec14;
  2895. #endif
  2896. STL_SX xvec15, 0*SIZE(C0);
  2897. STH_SX xvec15, 2*SIZE(C1);
  2898. STL_SX xvec14, 4*SIZE(C0);
  2899. STH_SX xvec14, 6*SIZE(C1);
  2900. #ifndef TRMMKERNEL
  2901. LDL_SX 0*SIZE(C1), xvec4, xvec4;
  2902. LDH_SX 2*SIZE(C0), xvec4, xvec4;
  2903. LDL_SX 4*SIZE(C1), xvec5, xvec5;
  2904. LDH_SX 6*SIZE(C0), xvec5, xvec5;
  2905. ADD_SX xvec4, xvec11, xvec11;
  2906. ADD_SX xvec5, xvec10, xvec10;
  2907. #endif
  2908. STL_SX xvec11, 0*SIZE(C1);
  2909. STH_SX xvec11, 2*SIZE(C0);
  2910. STL_SX xvec10, 4*SIZE(C1);
  2911. STH_SX xvec10, 6*SIZE(C0);
  2912. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  2913. MOVQ bk, %rax;
  2914. SUBQ kkk, %rax;
  2915. SALQ $ZBASE_SHIFT, %rax;
  2916. LEAQ (ptrba, %rax, 4), ptrba;
  2917. LEAQ (ptrbb, %rax, 2), ptrbb;
  2918. #endif
  2919. #if defined(TRMMKERNEL) && defined(LEFT)
  2920. ADDQ $4, kk;
  2921. #endif
  2922. ADDQ $8*SIZE, C0;
  2923. ADDQ $8*SIZE, C1;
  2924. .L22_loopE:
  2925. TEST $2, bm;
  2926. JLE .L23_loopE;
  2927. ALIGN_5
  2928. .L23_bodyB:
  2929. #if !defined(TRMMKERNEL)||(defined(TRMMKERNEL)&&defined(LEFT)&&defined(TRANSA))||(defined(TRMMKERNEL)&&!defined(LEFT)&&!defined(TRANSA))
  2930. MOVQ bb,ptrbb;
  2931. #else
  2932. MOVQ bb, ptrbb;
  2933. MOVQ kk, %rax;
  2934. SALQ $ZBASE_SHIFT, %rax;
  2935. LEAQ (ptrba, %rax, 2), ptrba;
  2936. LEAQ (ptrbb, %rax, 2), ptrbb;
  2937. #endif
  2938. XOR_SY yvec15, yvec15, yvec15;
  2939. XOR_SY yvec11, yvec11, yvec11;
  2940. #ifndef TRMMKERNEL
  2941. MOVQ bk,k;
  2942. #elif (defined(LEFT)&&!defined(TRANSA))||(!defined(LEFT)&&defined(TRANSA))
  2943. MOVQ bk, %rax;
  2944. SUBQ kk, %rax;
  2945. MOVQ %rax, kkk;
  2946. #else
  2947. MOVQ kk, %rax;
  2948. #ifdef LEFT
  2949. ADDQ $2, %rax;
  2950. #else
  2951. ADDQ $2, %rax;
  2952. #endif
  2953. MOVQ %rax, kkk;
  2954. #endif
  2955. SARQ $2, k;
  2956. JLE .L231_loopE;
  2957. ALIGN_5
  2958. .L231_bodyB:
  2959. EDUP_SX 0*SIZE(ptrbb), xvec4;
  2960. ODUP_SX 0*SIZE(ptrbb), xvec5;
  2961. SHUF_SX $0x4e, xvec4, xvec6;
  2962. SHUF_SX $0x4e, xvec5, xvec7;
  2963. LD_SX 0*SIZE(ptrba), xvec0;
  2964. MOV_SX xvec0, xvec1;
  2965. MUL_SX xvec4, xvec0, xvec0;
  2966. ADD1_SX xvec0, xvec15, xvec15;
  2967. SHUF_SX $0xb1, xvec1, xvec2;
  2968. MUL_SX xvec6, xvec1, xvec1;
  2969. ADD1_SX xvec1, xvec11, xvec11;
  2970. MOV_SX xvec2, xvec3;
  2971. MUL_SX xvec5, xvec2, xvec2;
  2972. ADD2_SX xvec2, xvec15, xvec15;
  2973. MUL_SX xvec7, xvec3, xvec3;
  2974. ADD2_SX xvec3, xvec11, xvec11;
  2975. #### Unroll 2 #####
  2976. EDUP_SX 4*SIZE(ptrbb), xvec4;
  2977. ODUP_SX 4*SIZE(ptrbb), xvec5;
  2978. SHUF_SX $0x4e, xvec4, xvec6;
  2979. SHUF_SX $0x4e, xvec5, xvec7;
  2980. LD_SX 4*SIZE(ptrba), xvec0;
  2981. MOV_SX xvec0, xvec1;
  2982. MUL_SX xvec4, xvec0, xvec0;
  2983. ADD1_SX xvec0, xvec15, xvec15;
  2984. SHUF_SX $0xb1, xvec1, xvec2;
  2985. MUL_SX xvec6, xvec1, xvec1;
  2986. ADD1_SX xvec1, xvec11, xvec11;
  2987. MOV_SX xvec2, xvec3;
  2988. MUL_SX xvec5, xvec2, xvec2;
  2989. ADD2_SX xvec2, xvec15, xvec15;
  2990. MUL_SX xvec7, xvec3, xvec3;
  2991. ADD2_SX xvec3, xvec11, xvec11;
  2992. #### Unroll 3 ####
  2993. EDUP_SX 8*SIZE(ptrbb), xvec4;
  2994. ODUP_SX 8*SIZE(ptrbb), xvec5;
  2995. SHUF_SX $0x4e, xvec4, xvec6;
  2996. SHUF_SX $0x4e, xvec5, xvec7;
  2997. LD_SX 8*SIZE(ptrba), xvec0;
  2998. MOV_SX xvec0, xvec1;
  2999. MUL_SX xvec4, xvec0, xvec0;
  3000. ADD1_SX xvec0, xvec15, xvec15;
  3001. SHUF_SX $0xb1, xvec1, xvec2;
  3002. MUL_SX xvec6, xvec1, xvec1;
  3003. ADD1_SX xvec1, xvec11, xvec11;
  3004. MOV_SX xvec2, xvec3;
  3005. MUL_SX xvec5, xvec2, xvec2;
  3006. ADD2_SX xvec2, xvec15, xvec15;
  3007. MUL_SX xvec7, xvec3, xvec3;
  3008. ADD2_SX xvec3, xvec11, xvec11;
  3009. #### Unroll 4 ####
  3010. EDUP_SX 12*SIZE(ptrbb), xvec4;
  3011. ODUP_SX 12*SIZE(ptrbb), xvec5;
  3012. SHUF_SX $0x4e, xvec4, xvec6;
  3013. SHUF_SX $0x4e, xvec5, xvec7;
  3014. LD_SX 12*SIZE(ptrba), xvec0;
  3015. MOV_SX xvec0, xvec1;
  3016. MUL_SX xvec4, xvec0, xvec0;
  3017. ADD1_SX xvec0, xvec15, xvec15;
  3018. SHUF_SX $0xb1, xvec1, xvec2;
  3019. MUL_SX xvec6, xvec1, xvec1;
  3020. ADD1_SX xvec1, xvec11, xvec11;
  3021. MOV_SX xvec2, xvec3;
  3022. MUL_SX xvec5, xvec2, xvec2;
  3023. ADD2_SX xvec2, xvec15, xvec15;
  3024. MUL_SX xvec7, xvec3, xvec3;
  3025. ADD2_SX xvec3, xvec11, xvec11;
  3026. ADDQ $16*SIZE, ptrba;
  3027. ADDQ $16*SIZE, ptrbb;
  3028. DECQ k;
  3029. JG .L231_bodyB;
  3030. ALIGN_5
  3031. .L231_loopE:
  3032. #ifndef TRMMKERNEL
  3033. TEST $2, bk;
  3034. #else
  3035. TEST $2, kkk;
  3036. #endif
  3037. JLE .L232_loopE;
  3038. ALIGN_5
  3039. .L232_bodyB:
  3040. EDUP_SX 0*SIZE(ptrbb), xvec4;
  3041. ODUP_SX 0*SIZE(ptrbb), xvec5;
  3042. SHUF_SX $0x4e, xvec4, xvec6;
  3043. SHUF_SX $0x4e, xvec5, xvec7;
  3044. LD_SX 0*SIZE(ptrba), xvec0;
  3045. MOV_SX xvec0, xvec1;
  3046. MUL_SX xvec4, xvec0, xvec0;
  3047. ADD1_SX xvec0, xvec15, xvec15;
  3048. SHUF_SX $0xb1, xvec1, xvec2;
  3049. MUL_SX xvec6, xvec1, xvec1;
  3050. ADD1_SX xvec1, xvec11, xvec11;
  3051. MOV_SX xvec2, xvec3;
  3052. MUL_SX xvec5, xvec2, xvec2;
  3053. ADD2_SX xvec2, xvec15, xvec15;
  3054. MUL_SX xvec7, xvec3, xvec3;
  3055. ADD2_SX xvec3, xvec11, xvec11;
  3056. #### Unroll 2 #####
  3057. EDUP_SX 4*SIZE(ptrbb), xvec4;
  3058. ODUP_SX 4*SIZE(ptrbb), xvec5;
  3059. SHUF_SX $0x4e, xvec4, xvec6;
  3060. SHUF_SX $0x4e, xvec5, xvec7;
  3061. LD_SX 4*SIZE(ptrba), xvec0;
  3062. MOV_SX xvec0, xvec1;
  3063. MUL_SX xvec4, xvec0, xvec0;
  3064. ADD1_SX xvec0, xvec15, xvec15;
  3065. SHUF_SX $0xb1, xvec1, xvec2;
  3066. MUL_SX xvec6, xvec1, xvec1;
  3067. ADD1_SX xvec1, xvec11, xvec11;
  3068. MOV_SX xvec2, xvec3;
  3069. MUL_SX xvec5, xvec2, xvec2;
  3070. ADD2_SX xvec2, xvec15, xvec15;
  3071. MUL_SX xvec7, xvec3, xvec3;
  3072. ADD2_SX xvec3, xvec11, xvec11;
  3073. ADDQ $8*SIZE, ptrba;
  3074. ADDQ $8*SIZE, ptrbb;
  3075. .L232_loopE:
  3076. #ifndef TRMMKERNEL
  3077. TEST $1, bk;
  3078. #else
  3079. TEST $1, kkk;
  3080. #endif
  3081. JLE .L233_loopE;
  3082. ALIGN_5
  3083. .L233_bodyB:
  3084. EDUP_SX 0*SIZE(ptrbb), xvec4;
  3085. ODUP_SX 0*SIZE(ptrbb), xvec5;
  3086. SHUF_SX $0x4e, xvec4, xvec6;
  3087. SHUF_SX $0x4e, xvec5, xvec7;
  3088. LD_SX 0*SIZE(ptrba), xvec0;
  3089. MOV_SX xvec0, xvec1;
  3090. MUL_SX xvec4, xvec0, xvec0;
  3091. ADD1_SX xvec0, xvec15, xvec15;
  3092. SHUF_SX $0xb1, xvec1, xvec2;
  3093. MUL_SX xvec6, xvec1, xvec1;
  3094. ADD1_SX xvec1, xvec11, xvec11;
  3095. MOV_SX xvec2, xvec3;
  3096. MUL_SX xvec5, xvec2, xvec2;
  3097. ADD2_SX xvec2, xvec15, xvec15;
  3098. MUL_SX xvec7, xvec3, xvec3;
  3099. ADD2_SX xvec3, xvec11, xvec11;
  3100. ADDQ $4*SIZE, ptrba;
  3101. ADDQ $4*SIZE, ptrbb;
  3102. .L233_loopE:
  3103. #### Handle ####
  3104. #if defined(RN) || defined(RT) || defined(CN) || defined(CT)
  3105. XOR_SY yvec7, yvec7, yvec7;
  3106. ADDSUB_SX xvec15, xvec7, xvec7;
  3107. MOV_SX xvec7, xvec15;
  3108. XOR_SY yvec7, yvec7, yvec7;
  3109. ADDSUB_SX xvec11, xvec7, xvec7;
  3110. MOV_SX xvec7, xvec11;
  3111. #elif defined(NR) || defined(NC) || defined(TR) || defined(TC)
  3112. XOR_SY yvec7, yvec7, yvec7;
  3113. SUB_SX xvec15, xvec7, xvec7;
  3114. MOV_SX xvec7, xvec15;
  3115. XOR_SY yvec7, yvec7, yvec7;
  3116. SUB_SX xvec11, xvec7, xvec7;
  3117. MOV_SX xvec7, xvec11;
  3118. #elif defined(RR) || defined(RC) || defined(CR) || defined(CC)
  3119. SHUF_SX $0xb1, xvec15, xvec15;
  3120. SHUF_SX $0xb1, xvec11, xvec11;
  3121. XOR_SY yvec7, yvec7, yvec7;
  3122. ADDSUB_SX xvec15, xvec7, xvec7;
  3123. MOV_SX xvec7, xvec15;
  3124. XOR_SY yvec7, yvec7, yvec7;
  3125. ADDSUB_SX xvec11, xvec7, xvec7;
  3126. MOV_SX xvec7, xvec11;
  3127. SHUF_SX $0xb1, xvec15, xvec15;
  3128. SHUF_SX $0xb1, xvec11, xvec11;
  3129. #endif
  3130. #### Mulitply Alpha ####
  3131. BROAD_SX MEMALPHA_R, xvec7;
  3132. BROAD_SX MEMALPHA_I, xvec6;
  3133. #### Writng back ####
  3134. VPERMILP_SX $0xb1,xvec15, xvec5;
  3135. MUL_SX xvec7, xvec15, xvec15;
  3136. MUL_SX xvec6, xvec5, xvec5;
  3137. ADDSUB_SX xvec5, xvec15, xvec15;
  3138. VPERMILP_SX $0xb1,xvec11, xvec1;
  3139. MUL_SX xvec7, xvec11, xvec11;
  3140. MUL_SX xvec6, xvec1, xvec1;
  3141. ADDSUB_SX xvec1, xvec11, xvec11;
  3142. #ifndef TRMMKERNEL
  3143. LDL_SX 0*SIZE(C0), xvec0, xvec0;
  3144. LDH_SX 2*SIZE(C1), xvec0, xvec0;
  3145. ADD_SX xvec0, xvec15, xvec15;
  3146. #endif
  3147. STL_SX xvec15, 0*SIZE(C0);
  3148. STH_SX xvec15, 2*SIZE(C1);
  3149. #ifndef TRMMKERNEL
  3150. LDL_SX 0*SIZE(C1), xvec4, xvec4;
  3151. LDH_SX 2*SIZE(C0), xvec4, xvec4;
  3152. ADD_SX xvec4, xvec11, xvec11;
  3153. #endif
  3154. STL_SX xvec11, 0*SIZE(C1);
  3155. STH_SX xvec11, 2*SIZE(C0);
  3156. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  3157. MOVQ bk, %rax;
  3158. SUBQ kkk, %rax;
  3159. SALQ $ZBASE_SHIFT, %rax;
  3160. LEAQ (ptrba, %rax, 2), ptrba;
  3161. LEAQ (ptrbb, %rax, 2), ptrbb;
  3162. #endif
  3163. #if defined(TRMMKERNEL) && defined(LEFT)
  3164. ADDQ $2, kk;
  3165. #endif
  3166. ADDQ $4*SIZE, C0;
  3167. ADDQ $4*SIZE, C1;
  3168. .L23_loopE:
  3169. TEST $1, bm;
  3170. JLE .L24_loopE;
  3171. ALIGN_5
  3172. .L24_bodyB:
  3173. #if !defined(TRMMKERNEL)||(defined(TRMMKERNEL)&&defined(LEFT)&&defined(TRANSA))||(defined(TRMMKERNEL)&&!defined(LEFT)&&!defined(TRANSA))
  3174. MOVQ bb,ptrbb;
  3175. #else
  3176. MOVQ bb, ptrbb;
  3177. MOVQ kk, %rax;
  3178. SALQ $ZBASE_SHIFT, %rax;
  3179. ADDQ %rax, ptrba;
  3180. LEAQ (ptrbb, %rax, 2), ptrbb;
  3181. #endif
  3182. XOR_SY yvec15, yvec15, yvec15;
  3183. #ifndef TRMMKERNEL
  3184. MOVQ bk,k;
  3185. #elif (defined(LEFT)&&!defined(TRANSA))||(!defined(LEFT)&&defined(TRANSA))
  3186. MOVQ bk, %rax;
  3187. SUBQ kk, %rax;
  3188. MOVQ %rax, kkk;
  3189. #else
  3190. MOVQ kk, %rax;
  3191. #ifdef LEFT
  3192. ADDQ $1, %rax;
  3193. #else
  3194. ADDQ $2, %rax;
  3195. #endif
  3196. MOVQ %rax, kkk;
  3197. #endif
  3198. SARQ $2, k;
  3199. JLE .L241_loopE;
  3200. ALIGN_5
  3201. .L241_bodyB:
  3202. BROAD_SX 0*SIZE(ptrba), xvec0;
  3203. LD_SX 0*SIZE(ptrbb), xvec2;
  3204. SHUF_SX $0xb1, xvec2, xvec3;
  3205. MUL_SX xvec0, xvec2, xvec2;
  3206. ADD1_SX xvec2, xvec15, xvec15;
  3207. BROAD_SX 1*SIZE(ptrba), xvec1;
  3208. MUL_SX xvec1, xvec3, xvec3;
  3209. ADD2_SX xvec3, xvec15, xvec15;
  3210. BROAD_SX 2*SIZE(ptrba), xvec0;
  3211. LD_SX 4*SIZE(ptrbb), xvec2;
  3212. SHUF_SX $0xb1, xvec2, xvec3;
  3213. MUL_SX xvec0, xvec2, xvec2;
  3214. ADD1_SX xvec2, xvec15, xvec15;
  3215. BROAD_SX 3*SIZE(ptrba), xvec1;
  3216. MUL_SX xvec1, xvec3, xvec3;
  3217. ADD2_SX xvec3, xvec15, xvec15;
  3218. BROAD_SX 4*SIZE(ptrba), xvec0;
  3219. LD_SX 8*SIZE(ptrbb), xvec2;
  3220. SHUF_SX $0xb1, xvec2, xvec3;
  3221. MUL_SX xvec0, xvec2, xvec2;
  3222. ADD1_SX xvec2, xvec15, xvec15;
  3223. BROAD_SX 5*SIZE(ptrba), xvec1;
  3224. MUL_SX xvec1, xvec3, xvec3;
  3225. ADD2_SX xvec3, xvec15, xvec15;
  3226. BROAD_SX 6*SIZE(ptrba), xvec0;
  3227. LD_SX 12*SIZE(ptrbb), xvec2;
  3228. SHUF_SX $0xb1, xvec2, xvec3;
  3229. MUL_SX xvec0, xvec2, xvec2;
  3230. ADD1_SX xvec2, xvec15, xvec15;
  3231. BROAD_SX 7*SIZE(ptrba), xvec1;
  3232. MUL_SX xvec1, xvec3, xvec3;
  3233. ADD2_SX xvec3, xvec15, xvec15;
  3234. ADDQ $8*SIZE, ptrba;
  3235. ADDQ $16*SIZE, ptrbb;
  3236. DECQ k;
  3237. JG .L241_bodyB;
  3238. ALIGN_5
  3239. .L241_loopE:
  3240. #ifndef TRMMKERNEL
  3241. TEST $2, bk;
  3242. #else
  3243. TEST $2, kkk;
  3244. #endif
  3245. JLE .L242_loopE;
  3246. ALIGN_5
  3247. .L242_bodyB:
  3248. BROAD_SX 0*SIZE(ptrba), xvec0;
  3249. LD_SX 0*SIZE(ptrbb), xvec2;
  3250. SHUF_SX $0xb1, xvec2, xvec3;
  3251. MUL_SX xvec0, xvec2, xvec2;
  3252. ADD1_SX xvec2, xvec15, xvec15;
  3253. BROAD_SX 1*SIZE(ptrba), xvec1;
  3254. MUL_SX xvec1, xvec3, xvec3;
  3255. ADD2_SX xvec3, xvec15, xvec15;
  3256. BROAD_SX 2*SIZE(ptrba), xvec0;
  3257. LD_SX 4*SIZE(ptrbb), xvec2;
  3258. SHUF_SX $0xb1, xvec2, xvec3;
  3259. MUL_SX xvec0, xvec2, xvec2;
  3260. ADD1_SX xvec2, xvec15, xvec15;
  3261. BROAD_SX 3*SIZE(ptrba), xvec1;
  3262. MUL_SX xvec1, xvec3, xvec3;
  3263. ADD2_SX xvec3, xvec15, xvec15;
  3264. ADDQ $4*SIZE, ptrba;
  3265. ADDQ $8*SIZE, ptrbb;
  3266. .L242_loopE:
  3267. #ifndef TRMMKERNEL
  3268. TEST $1, bk;
  3269. #else
  3270. TEST $1, kkk;
  3271. #endif
  3272. JLE .L243_loopE;
  3273. ALIGN_5
  3274. .L243_bodyB:
  3275. BROAD_SX 0*SIZE(ptrba), xvec0;
  3276. LD_SX 0*SIZE(ptrbb), xvec2;
  3277. SHUF_SX $0xb1, xvec2, xvec3;
  3278. MUL_SX xvec0, xvec2, xvec2;
  3279. ADD1_SX xvec2, xvec15, xvec15;
  3280. BROAD_SX 1*SIZE(ptrba), xvec1;
  3281. MUL_SX xvec1, xvec3, xvec3;
  3282. ADD2_SX xvec3, xvec15, xvec15;
  3283. ADDQ $2*SIZE, ptrba;
  3284. ADDQ $4*SIZE, ptrbb;
  3285. .L243_loopE:
  3286. #### Handle ####
  3287. XOR_SY yvec7, yvec7, yvec7;
  3288. #if defined(NR) || defined(NC) || defined(TR) || defined(TC)
  3289. ADDSUB_SX xvec15, xvec7, xvec7;
  3290. MOV_SX xvec7, xvec15;
  3291. #elif defined(RN) || defined(RT) || defined(CN) || defined(CT)
  3292. SUB_SX xvec15, xvec7, xvec7;
  3293. MOV_SX xvec7, xvec15;
  3294. #elif defined(RR) || defined(RC) || defined(CR) || defined(CC)
  3295. SHUF_SX $0xb1, xvec15, xvec15;
  3296. ADDSUB_SX xvec15, xvec7, xvec7;
  3297. MOV_SX xvec7, xvec15;
  3298. SHUF_SX $0xb1, xvec15, xvec15;
  3299. #endif
  3300. ##### Load Alpha ####
  3301. BROAD_SX MEMALPHA_R,xvec7;
  3302. BROAD_SX MEMALPHA_I,xvec6;
  3303. ##### Multiply Alpha ####
  3304. VPERMILP_SX $0xb1,xvec15, xvec5;
  3305. MUL_SX xvec7, xvec15, xvec15;
  3306. MUL_SX xvec6, xvec5, xvec5;
  3307. ADDSUB_SX xvec5, xvec15, xvec15;
  3308. #### Writing back ####
  3309. #ifndef TRMMKERNEL
  3310. LDL_SX 0*SIZE(C0), xvec0, xvec0;
  3311. LDH_SX 0*SIZE(C1), xvec0, xvec0;
  3312. ADD_SX xvec0, xvec15, xvec15;
  3313. #endif
  3314. STL_SX xvec15, 0*SIZE(C0);
  3315. STH_SX xvec15, 0*SIZE(C1);
  3316. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  3317. MOVQ bk, %rax;
  3318. SUBQ kkk, %rax;
  3319. SALQ $ZBASE_SHIFT, %rax;
  3320. ADDQ %rax, ptrba;
  3321. LEAQ (ptrbb, %rax, 2), ptrbb;
  3322. #endif
  3323. #if defined(TRMMKERNEL) && defined(LEFT)
  3324. ADDQ $1, kk;
  3325. #endif
  3326. ADDQ $2*SIZE, C0;
  3327. ADDQ $2*SIZE, C1;
  3328. .L24_loopE:
  3329. #if defined(TRMMKERNEL) && !defined(LEFT)
  3330. ADDQ $2, kk;
  3331. #endif
  3332. MOVQ bk, k;
  3333. SALQ $4, k;
  3334. ADDQ k, bb;
  3335. LEAQ (C, ldc, 2), C;
  3336. .L20_loopE:
  3337. TEST $1, bn;
  3338. JLE .L30_loopE;
  3339. ALIGN_5
  3340. .L30_bodyB:
  3341. #if defined(TRMMKERNEL) && defined(LEFT)
  3342. MOVQ OFFSET, %rax;
  3343. MOVQ %rax, kk;
  3344. #endif
  3345. MOVQ C, C0;
  3346. MOVQ ba, ptrba;
  3347. MOVQ bm, i;
  3348. SARQ $3, i;
  3349. JLE .L31_loopE;
  3350. ALIGN_5
  3351. .L31_bodyB:
  3352. MOVQ bb, ptrbb;
  3353. #if !defined(TRMMKERNEL)||(defined(TRMMKERNEL)&&defined(LEFT)&&defined(TRANSA))||(defined(TRMMKERNEL)&&!defined(LEFT)&&!defined(TRANSA))
  3354. MOVQ bb,ptrbb;
  3355. #else
  3356. MOVQ bb, ptrbb;
  3357. MOVQ kk, %rax;
  3358. SALQ $ZBASE_SHIFT, %rax;
  3359. LEAQ (ptrba, %rax, 8), ptrba;
  3360. ADDQ %rax, ptrbb;
  3361. #endif
  3362. XOR_SY yvec15, yvec15, yvec15;
  3363. XOR_SY yvec14, yvec14, yvec14;
  3364. MOVQ bk, k;
  3365. #ifndef TRMMKERNEL
  3366. MOVQ bk,k;
  3367. #elif (defined(LEFT)&&!defined(TRANSA))||(!defined(LEFT)&&defined(TRANSA))
  3368. MOVQ bk, %rax;
  3369. SUBQ kk, %rax;
  3370. MOVQ %rax, kkk;
  3371. #else
  3372. MOVQ kk, %rax;
  3373. #ifdef LEFT
  3374. ADDQ $8, %rax;
  3375. #else
  3376. ADDQ $1, %rax;
  3377. #endif
  3378. MOVQ %rax, kkk;
  3379. #endif
  3380. SARQ $2, k;
  3381. JLE .L311_loopE;
  3382. ALIGN_5
  3383. .L311_bodyB:
  3384. #### Unroll 1 ####
  3385. LD_SY 0*SIZE(ptrba), yvec0;
  3386. LD_SY 8*SIZE(ptrba), yvec1;
  3387. BROAD_SY 0*SIZE(ptrbb), yvec2;
  3388. MUL_SY yvec0, yvec2, yvec6;
  3389. ADD1_SY yvec6, yvec15, yvec15;
  3390. MUL_SY yvec1, yvec2, yvec7;
  3391. ADD1_SY yvec7, yvec14, yvec14;
  3392. BROAD_SY 1*SIZE(ptrbb), yvec3;
  3393. VPERMILP_SY $0xb1, yvec0, yvec4;
  3394. VPERMILP_SY $0xb1, yvec1, yvec5;
  3395. MUL_SY yvec4, yvec3, yvec6;
  3396. ADD2_SY yvec6, yvec15, yvec15;
  3397. MUL_SY yvec5, yvec3, yvec7;
  3398. ADD2_SY yvec7, yvec14, yvec14;
  3399. #### Unroll 2 ####
  3400. LD_SY 16*SIZE(ptrba), yvec0;
  3401. LD_SY 24*SIZE(ptrba), yvec1;
  3402. BROAD_SY 2*SIZE(ptrbb), yvec2;
  3403. MUL_SY yvec0, yvec2, yvec6;
  3404. ADD1_SY yvec6, yvec15, yvec15;
  3405. MUL_SY yvec1, yvec2, yvec7;
  3406. ADD1_SY yvec7, yvec14, yvec14;
  3407. BROAD_SY 3*SIZE(ptrbb), yvec3;
  3408. VPERMILP_SY $0xb1, yvec0, yvec4;
  3409. VPERMILP_SY $0xb1, yvec1, yvec5;
  3410. MUL_SY yvec4, yvec3, yvec6;
  3411. ADD2_SY yvec6, yvec15, yvec15;
  3412. MUL_SY yvec5, yvec3, yvec7;
  3413. ADD2_SY yvec7, yvec14, yvec14;
  3414. #### Unroll 3 ####
  3415. LD_SY 32*SIZE(ptrba), yvec0;
  3416. LD_SY 40*SIZE(ptrba), yvec1;
  3417. BROAD_SY 4*SIZE(ptrbb), yvec2;
  3418. MUL_SY yvec0, yvec2, yvec6;
  3419. ADD1_SY yvec6, yvec15, yvec15;
  3420. MUL_SY yvec1, yvec2, yvec7;
  3421. ADD1_SY yvec7, yvec14, yvec14;
  3422. BROAD_SY 5*SIZE(ptrbb), yvec3;
  3423. VPERMILP_SY $0xb1, yvec0, yvec4;
  3424. VPERMILP_SY $0xb1, yvec1, yvec5;
  3425. MUL_SY yvec4, yvec3, yvec6;
  3426. ADD2_SY yvec6, yvec15, yvec15;
  3427. MUL_SY yvec5, yvec3, yvec7;
  3428. ADD2_SY yvec7, yvec14, yvec14;
  3429. #### Unroll 4 ####
  3430. LD_SY 48*SIZE(ptrba), yvec0;
  3431. LD_SY 56*SIZE(ptrba), yvec1;
  3432. BROAD_SY 6*SIZE(ptrbb), yvec2;
  3433. MUL_SY yvec0, yvec2, yvec6;
  3434. ADD1_SY yvec6, yvec15, yvec15;
  3435. MUL_SY yvec1, yvec2, yvec7;
  3436. ADD1_SY yvec7, yvec14, yvec14;
  3437. BROAD_SY 7*SIZE(ptrbb), yvec3;
  3438. VPERMILP_SY $0xb1, yvec0, yvec4;
  3439. VPERMILP_SY $0xb1, yvec1, yvec5;
  3440. MUL_SY yvec4, yvec3, yvec6;
  3441. ADD2_SY yvec6, yvec15, yvec15;
  3442. MUL_SY yvec5, yvec3, yvec7;
  3443. ADD2_SY yvec7, yvec14, yvec14;
  3444. ADDQ $64*SIZE, ptrba;
  3445. ADDQ $8*SIZE, ptrbb;
  3446. DECQ k;
  3447. JG .L311_bodyB;
  3448. ALIGN_5
  3449. .L311_loopE:
  3450. #ifndef TRMMKERNEL
  3451. TEST $2, bk;
  3452. #else
  3453. TEST $2, kkk;
  3454. #endif
  3455. JLE .L312_loopE;
  3456. ALIGN_5
  3457. .L312_bodyB:
  3458. #### Unroll 1 ####
  3459. LD_SY 0*SIZE(ptrba), yvec0;
  3460. LD_SY 8*SIZE(ptrba), yvec1;
  3461. BROAD_SY 0*SIZE(ptrbb), yvec2;
  3462. MUL_SY yvec0, yvec2, yvec6;
  3463. ADD1_SY yvec6, yvec15, yvec15;
  3464. MUL_SY yvec1, yvec2, yvec7;
  3465. ADD1_SY yvec7, yvec14, yvec14;
  3466. BROAD_SY 1*SIZE(ptrbb), yvec3;
  3467. VPERMILP_SY $0xb1, yvec0, yvec4;
  3468. VPERMILP_SY $0xb1, yvec1, yvec5;
  3469. MUL_SY yvec4, yvec3, yvec6;
  3470. ADD2_SY yvec6, yvec15, yvec15;
  3471. MUL_SY yvec5, yvec3, yvec7;
  3472. ADD2_SY yvec7, yvec14, yvec14;
  3473. #### Unroll 2 ####
  3474. LD_SY 16*SIZE(ptrba), yvec0;
  3475. LD_SY 24*SIZE(ptrba), yvec1;
  3476. BROAD_SY 2*SIZE(ptrbb), yvec2;
  3477. MUL_SY yvec0, yvec2, yvec6;
  3478. ADD1_SY yvec6, yvec15, yvec15;
  3479. MUL_SY yvec1, yvec2, yvec7;
  3480. ADD1_SY yvec7, yvec14, yvec14;
  3481. BROAD_SY 3*SIZE(ptrbb), yvec3;
  3482. VPERMILP_SY $0xb1, yvec0, yvec4;
  3483. VPERMILP_SY $0xb1, yvec1, yvec5;
  3484. MUL_SY yvec4, yvec3, yvec6;
  3485. ADD2_SY yvec6, yvec15, yvec15;
  3486. MUL_SY yvec5, yvec3, yvec7;
  3487. ADD2_SY yvec7, yvec14, yvec14;
  3488. ADDQ $32*SIZE, ptrba;
  3489. ADDQ $4*SIZE, ptrbb;
  3490. .L312_loopE:
  3491. #ifndef TRMMKERNEL
  3492. TEST $1, bk;
  3493. #else
  3494. TEST $1, kkk;
  3495. #endif
  3496. JLE .L313_loopE;
  3497. ALIGN_5
  3498. .L313_bodyB:
  3499. #### Unroll 1 ####
  3500. LD_SY 0*SIZE(ptrba), yvec0;
  3501. LD_SY 8*SIZE(ptrba), yvec1;
  3502. BROAD_SY 0*SIZE(ptrbb), yvec2;
  3503. MUL_SY yvec0, yvec2, yvec6;
  3504. ADD1_SY yvec6, yvec15, yvec15;
  3505. MUL_SY yvec1, yvec2, yvec7;
  3506. ADD1_SY yvec7, yvec14, yvec14;
  3507. BROAD_SY 1*SIZE(ptrbb), yvec3;
  3508. VPERMILP_SY $0xb1, yvec0, yvec4;
  3509. VPERMILP_SY $0xb1, yvec1, yvec5;
  3510. MUL_SY yvec4, yvec3, yvec6;
  3511. ADD2_SY yvec6, yvec15, yvec15;
  3512. MUL_SY yvec5, yvec3, yvec7;
  3513. ADD2_SY yvec7, yvec14, yvec14;
  3514. ADDQ $16*SIZE, ptrba;
  3515. ADDQ $2*SIZE, ptrbb;
  3516. .L313_loopE:
  3517. #### Handle ####
  3518. XOR_SY yvec7, yvec7, yvec7;
  3519. #if defined(RN) || defined(RT) || defined(CN) || defined(CT)
  3520. ADDSUB_SY yvec15, yvec7, yvec15;
  3521. ADDSUB_SY yvec14, yvec7, yvec14;
  3522. #elif defined(NR) || defined(NC) || defined(TR) || defined(TC)
  3523. SUB_SY yvec15, yvec7, yvec15;
  3524. SUB_SY yvec14, yvec7, yvec14;
  3525. #elif defined(RR) || defined(RC) || defined(CR) || defined(CC)
  3526. VPERMILP_SY $0xb1, yvec15, yvec15;
  3527. VPERMILP_SY $0xb1, yvec14, yvec14;
  3528. ADDSUB_SY yvec15, yvec7, yvec15;
  3529. ADDSUB_SY yvec14, yvec7, yvec14;
  3530. VPERMILP_SY $0xb1, yvec15, yvec15;
  3531. VPERMILP_SY $0xb1, yvec14, yvec14;
  3532. #endif
  3533. ##### Load Alpha ####
  3534. BROAD_SY MEMALPHA_R,yvec7;
  3535. BROAD_SY MEMALPHA_I,yvec6;
  3536. ##### Multiply Alpha ####
  3537. VPERMILP_SY $0xb1,yvec15, yvec5;
  3538. MUL_SY yvec15, yvec7, yvec15;
  3539. MUL_SY yvec5, yvec6, yvec5;
  3540. ADDSUB_SY yvec5, yvec15, yvec15;
  3541. VPERMILP_SY $0xb1,yvec14, yvec4;
  3542. MUL_SY yvec14, yvec7, yvec14;
  3543. MUL_SY yvec4, yvec6, yvec4;
  3544. ADDSUB_SY yvec4, yvec14, yvec14;
  3545. #### Writing back ####
  3546. EXTRA_SY $1, yvec15, xvec7;
  3547. EXTRA_SY $1, yvec14, xvec6;
  3548. #ifndef TRMMKERNEL
  3549. LDL_SX 0*SIZE(C0), xvec0, xvec0;
  3550. LDH_SX 2*SIZE(C0), xvec0, xvec0;
  3551. LDL_SX 4*SIZE(C0), xvec1, xvec1;
  3552. LDH_SX 6*SIZE(C0), xvec1, xvec1;
  3553. LDL_SX 8*SIZE(C0), xvec2, xvec2;
  3554. LDH_SX 10*SIZE(C0), xvec2, xvec2;
  3555. LDL_SX 12*SIZE(C0), xvec3, xvec3;
  3556. LDH_SX 14*SIZE(C0), xvec3, xvec3;
  3557. ADD_SX xvec0, xvec15, xvec15;
  3558. ADD_SX xvec1, xvec7, xvec7;
  3559. ADD_SX xvec2, xvec14, xvec14;
  3560. ADD_SX xvec3, xvec6, xvec6;
  3561. #endif
  3562. STL_SX xvec15, 0*SIZE(C0);
  3563. STH_SX xvec15, 2*SIZE(C0);
  3564. STL_SX xvec7, 4*SIZE(C0);
  3565. STH_SX xvec7, 6*SIZE(C0);
  3566. STL_SX xvec14, 8*SIZE(C0);
  3567. STH_SX xvec14, 10*SIZE(C0);
  3568. STL_SX xvec6, 12*SIZE(C0);
  3569. STH_SX xvec6, 14*SIZE(C0);
  3570. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  3571. MOVQ bk, %rax;
  3572. SUBQ kkk, %rax;
  3573. SALQ $ZBASE_SHIFT, %rax;
  3574. LEAQ (ptrba, %rax, 8), ptrba;
  3575. ADDQ %rax, ptrbb;
  3576. #endif
  3577. #if defined(TRMMKERNEL) && defined(LEFT)
  3578. ADDQ $8, kk;
  3579. #endif
  3580. ADDQ $16*SIZE, C0;
  3581. DECQ i;
  3582. JG .L31_bodyB;
  3583. ALIGN_5
  3584. .L31_loopE:
  3585. TEST $4, bm;
  3586. JLE .L32_loopE;
  3587. ALIGN_5
  3588. .L32_bodyB:
  3589. #if !defined(TRMMKERNEL)||(defined(TRMMKERNEL)&&defined(LEFT)&&defined(TRANSA))||(defined(TRMMKERNEL)&&!defined(LEFT)&&!defined(TRANSA))
  3590. MOVQ bb,ptrbb;
  3591. #else
  3592. MOVQ bb, ptrbb;
  3593. MOVQ kk, %rax;
  3594. SALQ $ZBASE_SHIFT, %rax;
  3595. LEAQ (ptrba, %rax, 4), ptrba;
  3596. ADDQ %rax, ptrbb;
  3597. #endif
  3598. XOR_SY yvec15, yvec15, yvec15;
  3599. #ifndef TRMMKERNEL
  3600. MOVQ bk,k;
  3601. #elif (defined(LEFT)&&!defined(TRANSA))||(!defined(LEFT)&&defined(TRANSA))
  3602. MOVQ bk, %rax;
  3603. SUBQ kk, %rax;
  3604. MOVQ %rax, kkk;
  3605. #else
  3606. MOVQ kk, %rax;
  3607. #ifdef LEFT
  3608. ADDQ $4, %rax;
  3609. #else
  3610. ADDQ $1, %rax;
  3611. #endif
  3612. MOVQ %rax, kkk;
  3613. #endif
  3614. SARQ $2, k;
  3615. JLE .L321_loopE;
  3616. ALIGN_5
  3617. .L321_bodyB:
  3618. #### Unroll 1 ####
  3619. LD_SY 0*SIZE(ptrba), yvec0;
  3620. BROAD_SY 0*SIZE(ptrbb), yvec2;
  3621. MUL_SY yvec0, yvec2, yvec6;
  3622. ADD1_SY yvec6, yvec15, yvec15;
  3623. BROAD_SY 1*SIZE(ptrbb), yvec3;
  3624. VPERMILP_SY $0xb1, yvec0, yvec4;
  3625. MUL_SY yvec4, yvec3, yvec6;
  3626. ADD2_SY yvec6, yvec15, yvec15;
  3627. #### Unroll 2 ####
  3628. LD_SY 8*SIZE(ptrba), yvec0;
  3629. BROAD_SY 2*SIZE(ptrbb), yvec2;
  3630. MUL_SY yvec0, yvec2, yvec6;
  3631. ADD1_SY yvec6, yvec15, yvec15;
  3632. BROAD_SY 3*SIZE(ptrbb), yvec3;
  3633. VPERMILP_SY $0xb1, yvec0, yvec4;
  3634. MUL_SY yvec4, yvec3, yvec6;
  3635. ADD2_SY yvec6, yvec15, yvec15;
  3636. #### Unroll 3 ####
  3637. LD_SY 16*SIZE(ptrba), yvec0;
  3638. BROAD_SY 4*SIZE(ptrbb), yvec2;
  3639. MUL_SY yvec0, yvec2, yvec6;
  3640. ADD1_SY yvec6, yvec15, yvec15;
  3641. BROAD_SY 5*SIZE(ptrbb), yvec3;
  3642. VPERMILP_SY $0xb1, yvec0, yvec4;
  3643. MUL_SY yvec4, yvec3, yvec6;
  3644. ADD2_SY yvec6, yvec15, yvec15;
  3645. #### Unroll 4 ####
  3646. LD_SY 24*SIZE(ptrba), yvec0;
  3647. BROAD_SY 6*SIZE(ptrbb), yvec2;
  3648. MUL_SY yvec0, yvec2, yvec6;
  3649. ADD1_SY yvec6, yvec15, yvec15;
  3650. BROAD_SY 7*SIZE(ptrbb), yvec3;
  3651. VPERMILP_SY $0xb1, yvec0, yvec4;
  3652. MUL_SY yvec4, yvec3, yvec6;
  3653. ADD2_SY yvec6, yvec15, yvec15;
  3654. ADDQ $32*SIZE, ptrba;
  3655. ADDQ $8*SIZE, ptrbb;
  3656. DECQ k;
  3657. JG .L321_bodyB;
  3658. ALIGN_5
  3659. .L321_loopE:
  3660. #ifndef TRMMKERNEL
  3661. TEST $2, bk;
  3662. #else
  3663. TEST $2, kkk;
  3664. #endif
  3665. JLE .L322_loopE;
  3666. ALIGN_5
  3667. .L322_bodyB:
  3668. #### Unroll 1 ####
  3669. LD_SY 0*SIZE(ptrba), yvec0;
  3670. BROAD_SY 0*SIZE(ptrbb), yvec2;
  3671. MUL_SY yvec0, yvec2, yvec6;
  3672. ADD1_SY yvec6, yvec15, yvec15;
  3673. BROAD_SY 1*SIZE(ptrbb), yvec3;
  3674. VPERMILP_SY $0xb1, yvec0, yvec4;
  3675. MUL_SY yvec4, yvec3, yvec6;
  3676. ADD2_SY yvec6, yvec15, yvec15;
  3677. #### Unroll 2 ####
  3678. LD_SY 8*SIZE(ptrba), yvec0;
  3679. BROAD_SY 2*SIZE(ptrbb), yvec2;
  3680. MUL_SY yvec0, yvec2, yvec6;
  3681. ADD1_SY yvec6, yvec15, yvec15;
  3682. BROAD_SY 3*SIZE(ptrbb), yvec3;
  3683. VPERMILP_SY $0xb1, yvec0, yvec4;
  3684. MUL_SY yvec4, yvec3, yvec6;
  3685. ADD2_SY yvec6, yvec15, yvec15;
  3686. ADDQ $16*SIZE, ptrba;
  3687. ADDQ $4*SIZE, ptrbb;
  3688. .L322_loopE:
  3689. #ifndef TRMMKERNEL
  3690. TEST $1, bk;
  3691. #else
  3692. TEST $1, kkk;
  3693. #endif
  3694. JLE .L323_loopE;
  3695. ALIGN_5
  3696. .L323_bodyB:
  3697. #### Unroll 1 ####
  3698. LD_SY 0*SIZE(ptrba), yvec0;
  3699. BROAD_SY 0*SIZE(ptrbb), yvec2;
  3700. MUL_SY yvec0, yvec2, yvec6;
  3701. ADD1_SY yvec6, yvec15, yvec15;
  3702. BROAD_SY 1*SIZE(ptrbb), yvec3;
  3703. VPERMILP_SY $0xb1, yvec0, yvec4;
  3704. MUL_SY yvec4, yvec3, yvec6;
  3705. ADD2_SY yvec6, yvec15, yvec15;
  3706. ADDQ $8*SIZE, ptrba;
  3707. ADDQ $2*SIZE, ptrbb;
  3708. .L323_loopE:
  3709. #### Handle ####
  3710. XOR_SY yvec7, yvec7, yvec7;
  3711. #if defined(RN) || defined(RT) || defined(CN) || defined(CT)
  3712. ADDSUB_SY yvec15, yvec7, yvec15;
  3713. #elif defined(NR) || defined(NC) || defined(TR) || defined(TC)
  3714. SUB_SY yvec15, yvec7, yvec15;
  3715. #elif defined(RR) || defined(RC) || defined(CR) || defined(CC)
  3716. VPERMILP_SY $0xb1, yvec15, yvec15;
  3717. ADDSUB_SY yvec15, yvec7, yvec15;
  3718. VPERMILP_SY $0xb1, yvec15, yvec15;
  3719. #endif
  3720. ##### Load Alpha ####
  3721. BROAD_SY MEMALPHA_R,yvec7;
  3722. BROAD_SY MEMALPHA_I,yvec6;
  3723. ##### Multiply Alpha ####
  3724. VPERMILP_SY $0xb1,yvec15, yvec5;
  3725. MUL_SY yvec15, yvec7, yvec15;
  3726. MUL_SY yvec5, yvec6, yvec5;
  3727. ADDSUB_SY yvec5, yvec15, yvec15;
  3728. #### Writing back ####
  3729. EXTRA_SY $1, yvec15, xvec7;
  3730. #ifndef TRMMKERNEL
  3731. LDL_SX 0*SIZE(C0), xvec0, xvec0;
  3732. LDH_SX 2*SIZE(C0), xvec0, xvec0;
  3733. LDL_SX 4*SIZE(C0), xvec1, xvec1;
  3734. LDH_SX 6*SIZE(C0), xvec1, xvec1;
  3735. ADD_SX xvec0, xvec15, xvec15;
  3736. ADD_SX xvec1, xvec7, xvec7;
  3737. #endif
  3738. STL_SX xvec15, 0*SIZE(C0);
  3739. STH_SX xvec15, 2*SIZE(C0);
  3740. STL_SX xvec7, 4*SIZE(C0);
  3741. STH_SX xvec7, 6*SIZE(C0);
  3742. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  3743. MOVQ bk, %rax;
  3744. SUBQ kkk, %rax;
  3745. SALQ $ZBASE_SHIFT, %rax;
  3746. LEAQ (ptrba, %rax, 4), ptrba;
  3747. ADDQ %rax, ptrbb;
  3748. #endif
  3749. #if defined(TRMMKERNEL) && defined(LEFT)
  3750. ADDQ $4, kk;
  3751. #endif
  3752. ADDQ $8*SIZE, C0;
  3753. .L32_loopE:
  3754. TEST $2, bm;
  3755. JLE .L33_loopE;
  3756. ALIGN_5
  3757. .L33_bodyB:
  3758. #if !defined(TRMMKERNEL)||(defined(TRMMKERNEL)&&defined(LEFT)&&defined(TRANSA))||(defined(TRMMKERNEL)&&!defined(LEFT)&&!defined(TRANSA))
  3759. MOVQ bb,ptrbb;
  3760. #else
  3761. MOVQ bb, ptrbb;
  3762. MOVQ kk, %rax;
  3763. SALQ $ZBASE_SHIFT, %rax;
  3764. LEAQ (ptrba, %rax, 2), ptrba;
  3765. ADDQ %rax, ptrbb;
  3766. #endif
  3767. XOR_SY yvec15, yvec15, yvec15;
  3768. #ifndef TRMMKERNEL
  3769. MOVQ bk,k;
  3770. #elif (defined(LEFT)&&!defined(TRANSA))||(!defined(LEFT)&&defined(TRANSA))
  3771. MOVQ bk, %rax;
  3772. SUBQ kk, %rax;
  3773. MOVQ %rax, kkk;
  3774. #else
  3775. MOVQ kk, %rax;
  3776. #ifdef LEFT
  3777. ADDQ $2, %rax;
  3778. #else
  3779. ADDQ $1, %rax;
  3780. #endif
  3781. MOVQ %rax, kkk;
  3782. #endif
  3783. SARQ $2, k;
  3784. JLE .L331_loopE;
  3785. ALIGN_5
  3786. .L331_bodyB:
  3787. #### Unroll 1 ####
  3788. LD_SX 0*SIZE(ptrba), xvec0;
  3789. BROAD_SX 0*SIZE(ptrbb), xvec2;
  3790. MUL_SX xvec0, xvec2, xvec2;
  3791. ADD1_SX xvec2, xvec15, xvec15;
  3792. SHUF_SX $0xb1, xvec0, xvec1;
  3793. BROAD_SX 1*SIZE(ptrbb), xvec3;
  3794. MUL_SX xvec1, xvec3, xvec3;
  3795. ADD2_SX xvec3, xvec15, xvec15;
  3796. #### Unroll 2 ####
  3797. LD_SX 4*SIZE(ptrba), xvec0;
  3798. BROAD_SX 2*SIZE(ptrbb), xvec2;
  3799. MUL_SX xvec0, xvec2, xvec2;
  3800. ADD1_SX xvec2, xvec15, xvec15;
  3801. SHUF_SX $0xb1, xvec0, xvec1;
  3802. BROAD_SX 3*SIZE(ptrbb), xvec3;
  3803. MUL_SX xvec1, xvec3, xvec3;
  3804. ADD2_SX xvec3, xvec15, xvec15;
  3805. #### Unroll 3 ####
  3806. LD_SX 8*SIZE(ptrba), xvec0;
  3807. BROAD_SX 4*SIZE(ptrbb), xvec2;
  3808. MUL_SX xvec0, xvec2, xvec2;
  3809. ADD1_SX xvec2, xvec15, xvec15;
  3810. SHUF_SX $0xb1, xvec0, xvec1;
  3811. BROAD_SX 5*SIZE(ptrbb), xvec3;
  3812. MUL_SX xvec1, xvec3, xvec3;
  3813. ADD2_SX xvec3, xvec15, xvec15;
  3814. #### Unroll 4 ####
  3815. LD_SX 12*SIZE(ptrba), xvec0;
  3816. BROAD_SX 6*SIZE(ptrbb), xvec2;
  3817. MUL_SX xvec0, xvec2, xvec2;
  3818. ADD1_SX xvec2, xvec15, xvec15;
  3819. SHUF_SX $0xb1, xvec0, xvec1;
  3820. BROAD_SX 7*SIZE(ptrbb), xvec3;
  3821. MUL_SX xvec1, xvec3, xvec3;
  3822. ADD2_SX xvec3, xvec15, xvec15;
  3823. ADDQ $16*SIZE, ptrba;
  3824. ADDQ $8*SIZE, ptrbb;
  3825. DECQ k;
  3826. JG .L331_bodyB;
  3827. ALIGN_5
  3828. .L331_loopE:
  3829. #ifndef TRMMKERNEL
  3830. TEST $2, bk;
  3831. #else
  3832. TEST $2, kkk;
  3833. #endif
  3834. JLE .L332_loopE;
  3835. ALIGN_5
  3836. .L332_bodyB:
  3837. #### Unroll 1 ####
  3838. LD_SX 0*SIZE(ptrba), xvec0;
  3839. BROAD_SX 0*SIZE(ptrbb), xvec2;
  3840. MUL_SX xvec0, xvec2, xvec2;
  3841. ADD1_SX xvec2, xvec15, xvec15;
  3842. SHUF_SX $0xb1, xvec0, xvec1;
  3843. BROAD_SX 1*SIZE(ptrbb), xvec3;
  3844. MUL_SX xvec1, xvec3, xvec3;
  3845. ADD2_SX xvec3, xvec15, xvec15;
  3846. #### Unroll 2 ####
  3847. LD_SX 4*SIZE(ptrba), xvec0;
  3848. BROAD_SX 2*SIZE(ptrbb), xvec2;
  3849. MUL_SX xvec0, xvec2, xvec2;
  3850. ADD1_SX xvec2, xvec15, xvec15;
  3851. SHUF_SX $0xb1, xvec0, xvec1;
  3852. BROAD_SX 3*SIZE(ptrbb), xvec3;
  3853. MUL_SX xvec1, xvec3, xvec3;
  3854. ADD2_SX xvec3, xvec15, xvec15;
  3855. ADDQ $8*SIZE, ptrba;
  3856. ADDQ $4*SIZE, ptrbb;
  3857. .L332_loopE:
  3858. #ifndef TRMMKERNEL
  3859. TEST $1, bk;
  3860. #else
  3861. TEST $1, kkk;
  3862. #endif
  3863. JLE .L333_loopE;
  3864. ALIGN_5
  3865. .L333_bodyB:
  3866. #### Unroll 1 ####
  3867. LD_SX 0*SIZE(ptrba), xvec0;
  3868. BROAD_SX 0*SIZE(ptrbb), xvec2;
  3869. MUL_SX xvec0, xvec2, xvec2;
  3870. ADD1_SX xvec2, xvec15, xvec15;
  3871. SHUF_SX $0xb1, xvec0, xvec1;
  3872. BROAD_SX 1*SIZE(ptrbb), xvec3;
  3873. MUL_SX xvec1, xvec3, xvec3;
  3874. ADD2_SX xvec3, xvec15, xvec15;
  3875. ADDQ $4*SIZE, ptrba;
  3876. ADDQ $2*SIZE, ptrbb;
  3877. .L333_loopE:
  3878. #### Handle ####
  3879. XOR_SY yvec7, yvec7, yvec7;
  3880. #if defined(RN) || defined(RT) || defined(CN) || defined(CT)
  3881. ADDSUB_SX xvec15, xvec7, xvec7;
  3882. MOV_SX xvec7, xvec15;
  3883. #elif defined(NR) || defined(NC) || defined(TR) || defined(TC)
  3884. SUB_SX xvec15, xvec7, xvec7;
  3885. MOV_SX xvec7, xvec15;
  3886. #elif defined(RR) || defined(RC) || defined(CR) || defined(CC)
  3887. SHUF_SX $0xb1, xvec15, xvec15;
  3888. ADDSUB_SX xvec15, xvec7, xvec7;
  3889. MOV_SX xvec7, xvec15;
  3890. SHUF_SX $0xb1, xvec15, xvec15;
  3891. #endif
  3892. #### Mulitply Alpha ####
  3893. BROAD_SX MEMALPHA_R, xvec7;
  3894. BROAD_SX MEMALPHA_I, xvec6;
  3895. #### Writng back ####
  3896. VPERMILP_SX $0xb1,xvec15, xvec5;
  3897. MUL_SX xvec7, xvec15, xvec15;
  3898. MUL_SX xvec6, xvec5, xvec5;
  3899. ADDSUB_SX xvec5, xvec15, xvec15;
  3900. #ifndef TRMMKERNEL
  3901. LDL_SX 0*SIZE(C0), xvec0, xvec0;
  3902. LDH_SX 2*SIZE(C0), xvec0, xvec0;
  3903. ADD_SX xvec0, xvec15, xvec15;
  3904. #endif
  3905. STL_SX xvec15, 0*SIZE(C0);
  3906. STH_SX xvec15, 2*SIZE(C0);
  3907. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  3908. MOVQ bk, %rax;
  3909. SUBQ kkk, %rax;
  3910. SALQ $ZBASE_SHIFT, %rax;
  3911. LEAQ (ptrba, %rax, 2), ptrba;
  3912. ADDQ %rax, ptrbb;
  3913. #endif
  3914. #if defined(TRMMKERNEL) && defined(LEFT)
  3915. ADDQ $2, kk;
  3916. #endif
  3917. ADDQ $4*SIZE, C0;
  3918. .L33_loopE:
  3919. TEST $1, bm;
  3920. JLE .L34_loopE;
  3921. ALIGN_5
  3922. .L34_bodyB:
  3923. #if !defined(TRMMKERNEL)||(defined(TRMMKERNEL)&&defined(LEFT)&&defined(TRANSA))||(defined(TRMMKERNEL)&&!defined(LEFT)&&!defined(TRANSA))
  3924. MOVQ bb,ptrbb;
  3925. #else
  3926. MOVQ bb, ptrbb;
  3927. MOVQ kk, %rax;
  3928. SALQ $ZBASE_SHIFT, %rax;
  3929. ADDQ %rax, ptrba;
  3930. ADDQ %rax, ptrbb;
  3931. #endif
  3932. XOR_SY yvec15, yvec15, yvec15;
  3933. #ifndef TRMMKERNEL
  3934. MOVQ bk,k;
  3935. #elif (defined(LEFT)&&!defined(TRANSA))||(!defined(LEFT)&&defined(TRANSA))
  3936. MOVQ bk, %rax;
  3937. SUBQ kk, %rax;
  3938. MOVQ %rax, kkk;
  3939. #else
  3940. MOVQ kk, %rax;
  3941. #ifdef LEFT
  3942. ADDQ $1, %rax;
  3943. #else
  3944. ADDQ $1, %rax;
  3945. #endif
  3946. MOVQ %rax, kkk;
  3947. #endif
  3948. SARQ $2, k;
  3949. JLE .L341_loopE;
  3950. ALIGN_5
  3951. .L341_bodyB:
  3952. LD_SX 0*SIZE(ptrba), xvec0;
  3953. LD_SX 0*SIZE(ptrbb), xvec2;
  3954. SHUF_SX $0xa0, xvec2, xvec3;
  3955. MUL_SX xvec0, xvec3, xvec3;
  3956. ADD1_SX xvec3, xvec15, xvec15;
  3957. SHUF_SX $0xb1, xvec0, xvec1;
  3958. SHUF_SX $0xf5, xvec2, xvec4;
  3959. MUL_SX xvec1, xvec4, xvec4;
  3960. ADD2_SX xvec4, xvec15, xvec15;
  3961. LD_SX 4*SIZE(ptrba), xvec0;
  3962. LD_SX 4*SIZE(ptrbb), xvec2;
  3963. SHUF_SX $0xa0, xvec2, xvec3;
  3964. MUL_SX xvec0, xvec3, xvec3;
  3965. ADD1_SX xvec3, xvec15, xvec15;
  3966. SHUF_SX $0xb1, xvec0, xvec1;
  3967. SHUF_SX $0xf5, xvec2, xvec4;
  3968. MUL_SX xvec1, xvec4, xvec4;
  3969. ADD2_SX xvec4, xvec15, xvec15;
  3970. ADDQ $8*SIZE, ptrba;
  3971. ADDQ $8*SIZE, ptrbb;
  3972. DECQ k;
  3973. JG .L341_bodyB;
  3974. ALIGN_5
  3975. .L341_loopE:
  3976. #ifndef TRMMKERNEL
  3977. TEST $2, bk;
  3978. #else
  3979. TEST $2, kkk;
  3980. #endif
  3981. JLE .L342_loopE;
  3982. ALIGN_5
  3983. .L342_bodyB:
  3984. LD_SX 0*SIZE(ptrba), xvec0;
  3985. LD_SX 0*SIZE(ptrbb), xvec2;
  3986. SHUF_SX $0xa0, xvec2, xvec3;
  3987. MUL_SX xvec0, xvec3, xvec3;
  3988. ADD1_SX xvec3, xvec15, xvec15;
  3989. SHUF_SX $0xb1, xvec0, xvec1;
  3990. SHUF_SX $0xf5, xvec2, xvec4;
  3991. MUL_SX xvec1, xvec4, xvec4;
  3992. ADD2_SX xvec4, xvec15, xvec15;
  3993. ADDQ $4*SIZE, ptrba;
  3994. ADDQ $4*SIZE, ptrbb;
  3995. .L342_loopE:
  3996. #ifndef TRMMKERNEL
  3997. TEST $1, bk;
  3998. #else
  3999. TEST $1, kkk;
  4000. #endif
  4001. JLE .L343_loopE;
  4002. ALIGN_5
  4003. .L343_bodyB:
  4004. XOR_SY yvec0, yvec0, yvec0;
  4005. XOR_SY yvec2, yvec2, yvec2;
  4006. LDL_SX 0*SIZE(ptrba), xvec0, xvec0;
  4007. LDL_SX 0*SIZE(ptrbb), xvec2, xvec2;
  4008. SHUF_SX $0xe0, xvec2, xvec3;
  4009. MUL_SX xvec0, xvec3, xvec3;
  4010. ADD1_SX xvec3, xvec15, xvec15;
  4011. SHUF_SX $0xe1, xvec0, xvec1;
  4012. SHUF_SX $0xe5, xvec2, xvec4;
  4013. MUL_SX xvec1, xvec4, xvec4;
  4014. ADD2_SX xvec4, xvec15, xvec15;
  4015. ADDQ $2*SIZE, ptrba;
  4016. ADDQ $2*SIZE, ptrbb;
  4017. .L343_loopE:
  4018. #### Handle ####
  4019. XOR_SY yvec7, yvec7, yvec7;
  4020. #if defined(RN) || defined(RT) || defined(CN) || defined(CT)
  4021. ADDSUB_SX xvec15, xvec7, xvec7;
  4022. MOV_SX xvec7, xvec15;
  4023. #elif defined(NR) || defined(NC) || defined(TR) || defined(TC)
  4024. SUB_SX xvec15, xvec7, xvec7;
  4025. MOV_SX xvec7, xvec15;
  4026. #elif defined(RR) || defined(RC) || defined(CR) || defined(CC)
  4027. SHUF_SX $0xb1, xvec15, xvec15;
  4028. ADDSUB_SX xvec15, xvec7, xvec7;
  4029. MOV_SX xvec7, xvec15;
  4030. SHUF_SX $0xb1, xvec15, xvec15;
  4031. #endif
  4032. BROAD_SX MEMALPHA_R, xvec7;
  4033. BROAD_SX MEMALPHA_I, xvec6;
  4034. VPERMILP_SX $0xb1, xvec15, xvec5;
  4035. MUL_SX xvec7, xvec15, xvec15;
  4036. MUL_SX xvec6, xvec5, xvec5;
  4037. ADDSUB_SX xvec5, xvec15, xvec15;
  4038. SHUF_SX $0x44, xvec15, xvec14;
  4039. SHUF_SX $0xee, xvec15, xvec13;
  4040. ADD_SX xvec13, xvec14, xvec14;
  4041. #ifndef TRMMKERNEL
  4042. LDL_SX 0*SIZE(C0), xvec0, xvec0;
  4043. ADD_SX xvec0, xvec14, xvec14;
  4044. #endif
  4045. STL_SX xvec14, 0*SIZE(C0);
  4046. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA))||(defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  4047. MOVQ bk, %rax;
  4048. SUBQ kkk, %rax;
  4049. SALQ $ZBASE_SHIFT, %rax;
  4050. ADDQ %rax, ptrba;
  4051. ADDQ %rax, ptrbb;
  4052. #endif
  4053. #if defined(TRMMKERNEL) && defined(LEFT)
  4054. ADDQ $1, kk;
  4055. #endif
  4056. ADDQ $2*SIZE, C0;
  4057. .L34_loopE:
  4058. #if defined(TRMMKERNEL) && !defined(LEFT)
  4059. ADDQ $1, kk;
  4060. #endif
  4061. MOVQ bk, k;
  4062. SALQ $3, k;
  4063. ADDQ k, bb;
  4064. ADDQ ldc, C;
  4065. .L30_loopE:
  4066. movq 0(%rsp), %rbx;
  4067. movq 8(%rsp), %rbp;
  4068. movq 16(%rsp), %r12;
  4069. movq 24(%rsp), %r13;
  4070. movq 32(%rsp), %r14;
  4071. movq 40(%rsp), %r15;
  4072. vzeroupper
  4073. #ifdef WINDOWS_ABI
  4074. movq 48(%rsp), %rdi
  4075. movq 56(%rsp), %rsi
  4076. movups 64(%rsp), %xmm6
  4077. movups 80(%rsp), %xmm7
  4078. movups 96(%rsp), %xmm8
  4079. movups 112(%rsp), %xmm9
  4080. movups 128(%rsp), %xmm10
  4081. movups 144(%rsp), %xmm11
  4082. movups 160(%rsp), %xmm12
  4083. movups 176(%rsp), %xmm13
  4084. movups 192(%rsp), %xmm14
  4085. movups 208(%rsp), %xmm15
  4086. #endif
  4087. addq $STACKSIZE, %rsp;
  4088. ret
  4089. EPILOGUE