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.

dgemm_kernel_8x2_bulldozer.S 99 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413
  1. /*********************************************************************/
  2. /* Copyright 2009, 2010 The University of Texas at Austin. */
  3. /* All rights reserved. */
  4. /* */
  5. /* Redistribution and use in source and binary forms, with or */
  6. /* without modification, are permitted provided that the following */
  7. /* conditions are met: */
  8. /* */
  9. /* 1. Redistributions of source code must retain the above */
  10. /* copyright notice, this list of conditions and the following */
  11. /* disclaimer. */
  12. /* */
  13. /* 2. Redistributions in binary form must reproduce the above */
  14. /* copyright notice, this list of conditions and the following */
  15. /* disclaimer in the documentation and/or other materials */
  16. /* provided with the distribution. */
  17. /* */
  18. /* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
  19. /* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
  20. /* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
  21. /* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
  22. /* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
  23. /* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
  24. /* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
  25. /* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
  26. /* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
  27. /* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
  28. /* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
  29. /* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
  30. /* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
  31. /* POSSIBILITY OF SUCH DAMAGE. */
  32. /* */
  33. /* The views and conclusions contained in the software and */
  34. /* documentation are those of the authors and should not be */
  35. /* interpreted as representing official policies, either expressed */
  36. /* or implied, of The University of Texas at Austin. */
  37. /*********************************************************************/
  38. /*********************************************************************
  39. * 2013/06/02 Saar
  40. *
  41. * Parameter:
  42. * UNROLL_M 8
  43. * UNROLL_N 2
  44. * DGEMM_P 360
  45. * DGEMM_Q 160
  46. *
  47. * Performance at m x n without prefetch of BO:
  48. *
  49. * 5760x5760 93.4 GFLOPS with 8 threads on 4 modules (ACML: 90.8 GFLOPS)
  50. * 5760x5760 84.2 GFLOPS with 4 threads on 4 modules (ACML: 82.4 GFLOPS)
  51. * 3840x3840 50.3 GFLOPS with 2 threads on 2 modules (ACML: 49.5 GFLOPS)
  52. *
  53. * 5760x5760 56.4 GFLOPS with 4 threads on 2 modules (ACML: 58.5 GFLOPS)
  54. * 3840x3840 29.0 GFLOPS with 2 threads on 1 modules (ACML: 30.2 GFLOPS)
  55. * 3840x3840 26.1 GFLOPS with 1 threads on 1 modules (ACML: 25.9 GFLOPS)
  56. *
  57. *********************************************************************/
  58. /*********************************************************************
  59. * 2013/06/03 Saar
  60. *
  61. * Parameter:
  62. * UNROLL_M 8
  63. * UNROLL_N 2
  64. * DGEMM_P 336
  65. * DGEMM_Q 168
  66. * NO_WARMUP 1
  67. * NO_AFFINITY 1
  68. * GEMM_MULTITHREAD_THRESHOLD 4
  69. *
  70. * Performance at m x n with prefetch of BO:
  71. *
  72. * 8064x3840 93.7 GFLOPS with 8 threads on 4 modules (ACML: 93.6 GFLOPS)
  73. * 6048x2880 85.1 GFLOPS with 4 threads on 4 modules (ACML: 84.2 GFLOPS)
  74. * 6048x2880 52.0 GFLOPS with 2 threads on 2 modules (ACML: 50.0 GFLOPS)
  75. *
  76. * 6048x2880 56.3 GFLOPS with 4 threads on 2 modules (ACML: 57.6 GFLOPS)
  77. * 4032x1920 29.5 GFLOPS with 2 threads on 1 modules (ACML: 30.5 GFLOPS)
  78. * 4032x1920 26.9 GFLOPS with 1 threads on 1 modules (ACML: 26.1 GFLOPS)
  79. *
  80. *********************************************************************/
  81. /*********************************************************************
  82. * 2013/06/04 Saar
  83. *
  84. * Parameter:
  85. * UNROLL_M 8
  86. * UNROLL_N 2
  87. * DGEMM_P 384
  88. * DGEMM_Q 168
  89. * NO_WARMUP 1
  90. * NO_AFFINITY 1
  91. * GEMM_MULTITHREAD_THRESHOLD 4
  92. *
  93. * Performance at m x n with prefetch of BO:
  94. *
  95. * 6144x5376 94.6 GFLOPS with 8 threads on 4 modules (ACML: 90.5 GFLOPS)
  96. * 6144x5376 86.0 GFLOPS with 4 threads on 4 modules (ACML: 81.5 GFLOPS)
  97. * 4608x4032 52.0 GFLOPS with 2 threads on 2 modules (ACML: 47.5 GFLOPS)
  98. *
  99. * 6144x5376 57.3 GFLOPS with 4 threads on 2 modules (ACML: 56.5 GFLOPS)
  100. * 4608x4032 29.6 GFLOPS with 2 threads on 1 modules (ACML: 30.2 GFLOPS)
  101. * 4608x4032 26.9 GFLOPS with 1 threads on 1 modules (ACML: 25.6 GFLOPS)
  102. *
  103. *********************************************************************/
  104. #define ASSEMBLER
  105. #include "common.h"
  106. #define OLD_M %rdi
  107. #define OLD_N %rsi
  108. #define M %r13
  109. #define J %r14
  110. #define OLD_K %rdx
  111. #define A %rcx
  112. #define B %r8
  113. #define C %r9
  114. #define LDC %r10
  115. #define I %r11
  116. #define AO %rdi
  117. #define BO %rsi
  118. #define CO1 %r15
  119. #define K %r12
  120. #define BI %rbp
  121. #define SP %rbx
  122. #define BO1 %rdi
  123. #define BO2 %r15
  124. #ifndef WINDOWS_ABI
  125. #define STACKSIZE 96
  126. #else
  127. #define STACKSIZE 256
  128. #define OLD_A 40 + STACKSIZE(%rsp)
  129. #define OLD_B 48 + STACKSIZE(%rsp)
  130. #define OLD_C 56 + STACKSIZE(%rsp)
  131. #define OLD_LDC 64 + STACKSIZE(%rsp)
  132. #define OLD_OFFSET 72 + STACKSIZE(%rsp)
  133. #endif
  134. #define L_BUFFER_SIZE 8192
  135. #define LB2_OFFSET 4096
  136. #define Ndiv6 24(%rsp)
  137. #define Nmod6 32(%rsp)
  138. #define N 40(%rsp)
  139. #define ALPHA 48(%rsp)
  140. #define OFFSET 56(%rsp)
  141. #define KK 64(%rsp)
  142. #define KKK 72(%rsp)
  143. #define BUFFER1 128(%rsp)
  144. #define BUFFER2 LB2_OFFSET+128(%rsp)
  145. #if defined(OS_WINDOWS)
  146. #if L_BUFFER_SIZE > 16384
  147. #define STACK_TOUCH \
  148. movl $0, 4096 * 4(%rsp);\
  149. movl $0, 4096 * 3(%rsp);\
  150. movl $0, 4096 * 2(%rsp);\
  151. movl $0, 4096 * 1(%rsp);
  152. #elif L_BUFFER_SIZE > 12288
  153. #define STACK_TOUCH \
  154. movl $0, 4096 * 3(%rsp);\
  155. movl $0, 4096 * 2(%rsp);\
  156. movl $0, 4096 * 1(%rsp);
  157. #elif L_BUFFER_SIZE > 8192
  158. #define STACK_TOUCH \
  159. movl $0, 4096 * 2(%rsp);\
  160. movl $0, 4096 * 1(%rsp);
  161. #elif L_BUFFER_SIZE > 4096
  162. #define STACK_TOUCH \
  163. movl $0, 4096 * 1(%rsp);
  164. #else
  165. #define STACK_TOUCH
  166. #endif
  167. #else
  168. #define STACK_TOUCH
  169. #endif
  170. #define A_PR1 384
  171. #define B_PR1 192
  172. #define KERNEL8x3_1(xx) \
  173. prefetcht0 A_PR1(AO,%rax,8) ;\
  174. vmovddup -6 * SIZE(BO, BI, 8), %xmm1 ;\
  175. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  176. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  177. vmovddup -5 * SIZE(BO, BI, 8), %xmm2 ;\
  178. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  179. vmovddup -4 * SIZE(BO, BI, 8), %xmm3 ;\
  180. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  181. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  182. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  183. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  184. vfmaddpd %xmm9,%xmm3,%xmm0,%xmm9 ;\
  185. vmovups -12 * SIZE(AO, %rax, 8), %xmm0 ;\
  186. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  187. vfmaddpd %xmm11,%xmm2,%xmm0,%xmm11 ;\
  188. vfmaddpd %xmm12,%xmm3,%xmm0,%xmm12 ;\
  189. vmovups -10 * SIZE(AO, %rax, 8), %xmm0 ;\
  190. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  191. vfmaddpd %xmm14,%xmm2,%xmm0,%xmm14 ;\
  192. vfmaddpd %xmm15,%xmm3,%xmm0,%xmm15 ;\
  193. #define KERNEL8x3_2(xx) \
  194. prefetcht0 A_PR1+64(AO,%rax,8) ;\
  195. vmovddup -3 * SIZE(BO, BI, 8), %xmm1 ;\
  196. vmovups -8 * SIZE(AO, %rax, 8), %xmm0 ;\
  197. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  198. vmovddup -2 * SIZE(BO, BI, 8), %xmm2 ;\
  199. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  200. vmovddup -1 * SIZE(BO, BI, 8), %xmm3 ;\
  201. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  202. vmovups -6 * SIZE(AO, %rax, 8), %xmm0 ;\
  203. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  204. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  205. vfmaddpd %xmm9,%xmm3,%xmm0,%xmm9 ;\
  206. vmovups -4 * SIZE(AO, %rax, 8), %xmm0 ;\
  207. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  208. vfmaddpd %xmm11,%xmm2,%xmm0,%xmm11 ;\
  209. vfmaddpd %xmm12,%xmm3,%xmm0,%xmm12 ;\
  210. vmovups -2 * SIZE(AO, %rax, 8), %xmm0 ;\
  211. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  212. vfmaddpd %xmm14,%xmm2,%xmm0,%xmm14 ;\
  213. vfmaddpd %xmm15,%xmm3,%xmm0,%xmm15 ;\
  214. #define KERNEL8x3_3(xx) \
  215. prefetcht0 A_PR1+128(AO,%rax,8) ;\
  216. vmovddup 0 * SIZE(BO, BI, 8), %xmm1 ;\
  217. vmovups 0 * SIZE(AO, %rax, 8), %xmm0 ;\
  218. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  219. vmovddup 1 * SIZE(BO, BI, 8), %xmm2 ;\
  220. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  221. vmovddup 2 * SIZE(BO, BI, 8), %xmm3 ;\
  222. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  223. vmovups 2 * SIZE(AO, %rax, 8), %xmm0 ;\
  224. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  225. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  226. vfmaddpd %xmm9,%xmm3,%xmm0,%xmm9 ;\
  227. vmovups 4 * SIZE(AO, %rax, 8), %xmm0 ;\
  228. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  229. vfmaddpd %xmm11,%xmm2,%xmm0,%xmm11 ;\
  230. vfmaddpd %xmm12,%xmm3,%xmm0,%xmm12 ;\
  231. vmovups 6 * SIZE(AO, %rax, 8), %xmm0 ;\
  232. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  233. vfmaddpd %xmm14,%xmm2,%xmm0,%xmm14 ;\
  234. vfmaddpd %xmm15,%xmm3,%xmm0,%xmm15 ;\
  235. #define KERNEL8x3_4(xx) \
  236. prefetcht0 A_PR1+192(AO,%rax,8) ;\
  237. vmovddup 3 * SIZE(BO, BI, 8), %xmm1 ;\
  238. vmovups 8 * SIZE(AO, %rax, 8), %xmm0 ;\
  239. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  240. vmovddup 4 * SIZE(BO, BI, 8), %xmm2 ;\
  241. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  242. vmovddup 5 * SIZE(BO, BI, 8), %xmm3 ;\
  243. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  244. vmovups 10 * SIZE(AO, %rax, 8), %xmm0 ;\
  245. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  246. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  247. vfmaddpd %xmm9,%xmm3,%xmm0,%xmm9 ;\
  248. vmovups 12 * SIZE(AO, %rax, 8), %xmm0 ;\
  249. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  250. vfmaddpd %xmm11,%xmm2,%xmm0,%xmm11 ;\
  251. vfmaddpd %xmm12,%xmm3,%xmm0,%xmm12 ;\
  252. vmovups 14 * SIZE(AO, %rax, 8), %xmm0 ;\
  253. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  254. vfmaddpd %xmm14,%xmm2,%xmm0,%xmm14 ;\
  255. vfmaddpd %xmm15,%xmm3,%xmm0,%xmm15 ;\
  256. addq $12, BI ;\
  257. addq $32, %rax ;\
  258. #define KERNEL8x3_SUB(xx) \
  259. vmovddup -6 * SIZE(BO, BI, 8), %xmm1 ;\
  260. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  261. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  262. vmovddup -5 * SIZE(BO, BI, 8), %xmm2 ;\
  263. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  264. vmovddup -4 * SIZE(BO, BI, 8), %xmm3 ;\
  265. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  266. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  267. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  268. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  269. vfmaddpd %xmm9,%xmm3,%xmm0,%xmm9 ;\
  270. vmovups -12 * SIZE(AO, %rax, 8), %xmm0 ;\
  271. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  272. vfmaddpd %xmm11,%xmm2,%xmm0,%xmm11 ;\
  273. vfmaddpd %xmm12,%xmm3,%xmm0,%xmm12 ;\
  274. vmovups -10 * SIZE(AO, %rax, 8), %xmm0 ;\
  275. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  276. vfmaddpd %xmm14,%xmm2,%xmm0,%xmm14 ;\
  277. vfmaddpd %xmm15,%xmm3,%xmm0,%xmm15 ;\
  278. /*******************************************************************************************/
  279. #define KERNEL4x3_1(xx) \
  280. vmovddup -6 * SIZE(BO, BI, 8), %xmm1 ;\
  281. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  282. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  283. vmovddup -5 * SIZE(BO, BI, 8), %xmm2 ;\
  284. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  285. vmovddup -4 * SIZE(BO, BI, 8), %xmm3 ;\
  286. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  287. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  288. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  289. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  290. vfmaddpd %xmm9,%xmm3,%xmm0,%xmm9 ;\
  291. #define KERNEL4x3_2(xx) \
  292. vmovddup -3 * SIZE(BO, BI, 8), %xmm1 ;\
  293. vmovups -12 * SIZE(AO, %rax, 8), %xmm0 ;\
  294. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  295. vmovddup -2 * SIZE(BO, BI, 8), %xmm2 ;\
  296. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  297. vmovddup -1 * SIZE(BO, BI, 8), %xmm3 ;\
  298. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  299. vmovups -10 * SIZE(AO, %rax, 8), %xmm0 ;\
  300. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  301. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  302. vfmaddpd %xmm9,%xmm3,%xmm0,%xmm9 ;\
  303. #define KERNEL4x3_3(xx) \
  304. vmovddup 0 * SIZE(BO, BI, 8), %xmm1 ;\
  305. vmovups -8 * SIZE(AO, %rax, 8), %xmm0 ;\
  306. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  307. vmovddup 1 * SIZE(BO, BI, 8), %xmm2 ;\
  308. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  309. vmovddup 2 * SIZE(BO, BI, 8), %xmm3 ;\
  310. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  311. vmovups -6 * SIZE(AO, %rax, 8), %xmm0 ;\
  312. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  313. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  314. vfmaddpd %xmm9,%xmm3,%xmm0,%xmm9 ;\
  315. #define KERNEL4x3_4(xx) \
  316. vmovddup 3 * SIZE(BO, BI, 8), %xmm1 ;\
  317. vmovups -4 * SIZE(AO, %rax, 8), %xmm0 ;\
  318. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  319. vmovddup 4 * SIZE(BO, BI, 8), %xmm2 ;\
  320. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  321. vmovddup 5 * SIZE(BO, BI, 8), %xmm3 ;\
  322. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  323. vmovups -2 * SIZE(AO, %rax, 8), %xmm0 ;\
  324. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  325. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  326. vfmaddpd %xmm9,%xmm3,%xmm0,%xmm9 ;\
  327. addq $12, BI ;\
  328. addq $16, %rax ;\
  329. #define KERNEL4x3_SUB(xx) \
  330. vmovddup -6 * SIZE(BO, BI, 8), %xmm1 ;\
  331. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  332. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  333. vmovddup -5 * SIZE(BO, BI, 8), %xmm2 ;\
  334. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  335. vmovddup -4 * SIZE(BO, BI, 8), %xmm3 ;\
  336. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  337. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  338. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  339. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  340. vfmaddpd %xmm9,%xmm3,%xmm0,%xmm9 ;\
  341. /*******************************************************************************************/
  342. #define KERNEL2x3_1(xx) \
  343. vmovddup -6 * SIZE(BO, BI, 8), %xmm1 ;\
  344. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  345. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  346. vmovddup -5 * SIZE(BO, BI, 8), %xmm2 ;\
  347. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  348. vmovddup -4 * SIZE(BO, BI, 8), %xmm3 ;\
  349. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  350. #define KERNEL2x3_2(xx) \
  351. vmovddup -3 * SIZE(BO, BI, 8), %xmm1 ;\
  352. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  353. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  354. vmovddup -2 * SIZE(BO, BI, 8), %xmm2 ;\
  355. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  356. vmovddup -1 * SIZE(BO, BI, 8), %xmm3 ;\
  357. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  358. #define KERNEL2x3_3(xx) \
  359. vmovddup 0 * SIZE(BO, BI, 8), %xmm1 ;\
  360. vmovups -12 * SIZE(AO, %rax, 8), %xmm0 ;\
  361. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  362. vmovddup 1 * SIZE(BO, BI, 8), %xmm2 ;\
  363. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  364. vmovddup 2 * SIZE(BO, BI, 8), %xmm3 ;\
  365. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  366. #define KERNEL2x3_4(xx) \
  367. vmovddup 3 * SIZE(BO, BI, 8), %xmm1 ;\
  368. vmovups -10 * SIZE(AO, %rax, 8), %xmm0 ;\
  369. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  370. vmovddup 4 * SIZE(BO, BI, 8), %xmm2 ;\
  371. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  372. vmovddup 5 * SIZE(BO, BI, 8), %xmm3 ;\
  373. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  374. addq $12, BI ;\
  375. addq $8, %rax ;\
  376. #define KERNEL2x3_SUB(xx) \
  377. vmovddup -6 * SIZE(BO, BI, 8), %xmm1 ;\
  378. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  379. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  380. vmovddup -5 * SIZE(BO, BI, 8), %xmm2 ;\
  381. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  382. vmovddup -4 * SIZE(BO, BI, 8), %xmm3 ;\
  383. vfmaddpd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  384. /*******************************************************************************************/
  385. #define KERNEL1x3_1(xx) \
  386. vmovsd -6 * SIZE(BO, BI, 8), %xmm1 ;\
  387. vmovsd -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  388. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  389. vmovsd -5 * SIZE(BO, BI, 8), %xmm2 ;\
  390. vfmaddsd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  391. vmovsd -4 * SIZE(BO, BI, 8), %xmm3 ;\
  392. vfmaddsd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  393. #define KERNEL1x3_2(xx) \
  394. vmovsd -3 * SIZE(BO, BI, 8), %xmm1 ;\
  395. vmovsd -15 * SIZE(AO, %rax, 8), %xmm0 ;\
  396. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  397. vmovsd -2 * SIZE(BO, BI, 8), %xmm2 ;\
  398. vfmaddsd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  399. vmovsd -1 * SIZE(BO, BI, 8), %xmm3 ;\
  400. vfmaddsd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  401. #define KERNEL1x3_3(xx) \
  402. vmovsd 0 * SIZE(BO, BI, 8), %xmm1 ;\
  403. vmovsd -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  404. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  405. vmovsd 1 * SIZE(BO, BI, 8), %xmm2 ;\
  406. vfmaddsd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  407. vmovsd 2 * SIZE(BO, BI, 8), %xmm3 ;\
  408. vfmaddsd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  409. #define KERNEL1x3_4(xx) \
  410. vmovsd 3 * SIZE(BO, BI, 8), %xmm1 ;\
  411. vmovsd -13 * SIZE(AO, %rax, 8), %xmm0 ;\
  412. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  413. vmovsd 4 * SIZE(BO, BI, 8), %xmm2 ;\
  414. vfmaddsd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  415. vmovsd 5 * SIZE(BO, BI, 8), %xmm3 ;\
  416. vfmaddsd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  417. addq $12, BI ;\
  418. addq $4, %rax ;\
  419. #define KERNEL1x3_SUB(xx) \
  420. vmovsd -6 * SIZE(BO, BI, 8), %xmm1 ;\
  421. vmovsd -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  422. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  423. vmovsd -5 * SIZE(BO, BI, 8), %xmm2 ;\
  424. vfmaddsd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  425. vmovsd -4 * SIZE(BO, BI, 8), %xmm3 ;\
  426. vfmaddsd %xmm6,%xmm3,%xmm0,%xmm6 ;\
  427. /*******************************************************************************************
  428. * 2 lines of N
  429. *******************************************************************************************/
  430. #define KERNEL8x2_1(xx) \
  431. prefetcht0 A_PR1(AO,%rax,8) ;\
  432. vmovddup -4 * SIZE(BO, BI, 8), %xmm1 ;\
  433. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  434. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  435. vmovddup -3 * SIZE(BO, BI, 8), %xmm2 ;\
  436. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  437. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  438. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  439. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  440. vmovups -12 * SIZE(AO, %rax, 8), %xmm0 ;\
  441. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  442. vfmaddpd %xmm11,%xmm2,%xmm0,%xmm11 ;\
  443. vmovups -10 * SIZE(AO, %rax, 8), %xmm0 ;\
  444. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  445. vfmaddpd %xmm14,%xmm2,%xmm0,%xmm14 ;\
  446. #define KERNEL8x2_2(xx) \
  447. prefetcht0 A_PR1+64(AO,%rax,8) ;\
  448. vmovddup -2 * SIZE(BO, BI, 8), %xmm1 ;\
  449. vmovups -8 * SIZE(AO, %rax, 8), %xmm0 ;\
  450. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  451. vmovddup -1 * SIZE(BO, BI, 8), %xmm2 ;\
  452. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  453. vmovups -6 * SIZE(AO, %rax, 8), %xmm0 ;\
  454. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  455. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  456. vmovups -4 * SIZE(AO, %rax, 8), %xmm0 ;\
  457. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  458. vfmaddpd %xmm11,%xmm2,%xmm0,%xmm11 ;\
  459. vmovups -2 * SIZE(AO, %rax, 8), %xmm0 ;\
  460. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  461. vfmaddpd %xmm14,%xmm2,%xmm0,%xmm14 ;\
  462. #define KERNEL8x2_3(xx) \
  463. prefetcht0 A_PR1+128(AO,%rax,8) ;\
  464. vmovddup 0 * SIZE(BO, BI, 8), %xmm1 ;\
  465. vmovups 0 * SIZE(AO, %rax, 8), %xmm0 ;\
  466. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  467. vmovddup 1 * SIZE(BO, BI, 8), %xmm2 ;\
  468. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  469. vmovups 2 * SIZE(AO, %rax, 8), %xmm0 ;\
  470. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  471. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  472. vmovups 4 * SIZE(AO, %rax, 8), %xmm0 ;\
  473. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  474. vfmaddpd %xmm11,%xmm2,%xmm0,%xmm11 ;\
  475. vmovups 6 * SIZE(AO, %rax, 8), %xmm0 ;\
  476. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  477. vfmaddpd %xmm14,%xmm2,%xmm0,%xmm14 ;\
  478. #define KERNEL8x2_4(xx) \
  479. prefetcht0 A_PR1+192(AO,%rax,8) ;\
  480. vmovddup 2 * SIZE(BO, BI, 8), %xmm1 ;\
  481. vmovups 8 * SIZE(AO, %rax, 8), %xmm0 ;\
  482. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  483. vmovddup 3 * SIZE(BO, BI, 8), %xmm2 ;\
  484. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  485. vmovups 10 * SIZE(AO, %rax, 8), %xmm0 ;\
  486. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  487. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  488. vmovups 12 * SIZE(AO, %rax, 8), %xmm0 ;\
  489. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  490. vfmaddpd %xmm11,%xmm2,%xmm0,%xmm11 ;\
  491. vmovups 14 * SIZE(AO, %rax, 8), %xmm0 ;\
  492. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  493. vfmaddpd %xmm14,%xmm2,%xmm0,%xmm14 ;\
  494. addq $8, BI ;\
  495. addq $32, %rax ;\
  496. #define KERNEL8x2_SUB(xx) \
  497. vmovddup -4 * SIZE(BO, BI, 8), %xmm1 ;\
  498. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  499. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  500. vmovddup -3 * SIZE(BO, BI, 8), %xmm2 ;\
  501. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  502. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  503. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  504. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  505. vmovups -12 * SIZE(AO, %rax, 8), %xmm0 ;\
  506. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  507. vfmaddpd %xmm11,%xmm2,%xmm0,%xmm11 ;\
  508. vmovups -10 * SIZE(AO, %rax, 8), %xmm0 ;\
  509. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  510. vfmaddpd %xmm14,%xmm2,%xmm0,%xmm14 ;\
  511. /*******************************************************************************************/
  512. #define KERNEL4x2_1(xx) \
  513. vmovddup -4 * SIZE(BO, BI, 8), %xmm1 ;\
  514. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  515. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  516. vmovddup -3 * SIZE(BO, BI, 8), %xmm2 ;\
  517. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  518. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  519. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  520. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  521. #define KERNEL4x2_2(xx) \
  522. vmovddup -2 * SIZE(BO, BI, 8), %xmm1 ;\
  523. vmovups -12 * SIZE(AO, %rax, 8), %xmm0 ;\
  524. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  525. vmovddup -1 * SIZE(BO, BI, 8), %xmm2 ;\
  526. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  527. vmovups -10 * SIZE(AO, %rax, 8), %xmm0 ;\
  528. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  529. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  530. #define KERNEL4x2_3(xx) \
  531. vmovddup 0 * SIZE(BO, BI, 8), %xmm1 ;\
  532. vmovups -8 * SIZE(AO, %rax, 8), %xmm0 ;\
  533. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  534. vmovddup 1 * SIZE(BO, BI, 8), %xmm2 ;\
  535. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  536. vmovups -6 * SIZE(AO, %rax, 8), %xmm0 ;\
  537. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  538. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  539. #define KERNEL4x2_4(xx) \
  540. vmovddup 2 * SIZE(BO, BI, 8), %xmm1 ;\
  541. vmovups -4 * SIZE(AO, %rax, 8), %xmm0 ;\
  542. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  543. vmovddup 3 * SIZE(BO, BI, 8), %xmm2 ;\
  544. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  545. vmovups -2 * SIZE(AO, %rax, 8), %xmm0 ;\
  546. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  547. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  548. addq $8, BI ;\
  549. addq $16, %rax ;\
  550. #define KERNEL4x2_SUB(xx) \
  551. vmovddup -4 * SIZE(BO, BI, 8), %xmm1 ;\
  552. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  553. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  554. vmovddup -3 * SIZE(BO, BI, 8), %xmm2 ;\
  555. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  556. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  557. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  558. vfmaddpd %xmm8,%xmm2,%xmm0,%xmm8 ;\
  559. /*******************************************************************************************/
  560. #define KERNEL2x2_1(xx) \
  561. vmovddup -4 * SIZE(BO, BI, 8), %xmm1 ;\
  562. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  563. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  564. vmovddup -3 * SIZE(BO, BI, 8), %xmm2 ;\
  565. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  566. #define KERNEL2x2_2(xx) \
  567. vmovddup -2 * SIZE(BO, BI, 8), %xmm1 ;\
  568. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  569. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  570. vmovddup -1 * SIZE(BO, BI, 8), %xmm2 ;\
  571. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  572. #define KERNEL2x2_3(xx) \
  573. vmovddup 0 * SIZE(BO, BI, 8), %xmm1 ;\
  574. vmovups -12 * SIZE(AO, %rax, 8), %xmm0 ;\
  575. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  576. vmovddup 1 * SIZE(BO, BI, 8), %xmm2 ;\
  577. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  578. #define KERNEL2x2_4(xx) \
  579. vmovddup 2 * SIZE(BO, BI, 8), %xmm1 ;\
  580. vmovups -10 * SIZE(AO, %rax, 8), %xmm0 ;\
  581. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  582. vmovddup 3 * SIZE(BO, BI, 8), %xmm2 ;\
  583. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  584. addq $8, BI ;\
  585. addq $8, %rax ;\
  586. #define KERNEL2x2_SUB(xx) \
  587. vmovddup -4 * SIZE(BO, BI, 8), %xmm1 ;\
  588. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  589. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  590. vmovddup -3 * SIZE(BO, BI, 8), %xmm2 ;\
  591. vfmaddpd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  592. /*******************************************************************************************/
  593. #define KERNEL1x2_1(xx) \
  594. vmovsd -4 * SIZE(BO, BI, 8), %xmm1 ;\
  595. vmovsd -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  596. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  597. vmovsd -3 * SIZE(BO, BI, 8), %xmm2 ;\
  598. vfmaddsd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  599. #define KERNEL1x2_2(xx) \
  600. vmovsd -2 * SIZE(BO, BI, 8), %xmm1 ;\
  601. vmovsd -15 * SIZE(AO, %rax, 8), %xmm0 ;\
  602. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  603. vmovsd -1 * SIZE(BO, BI, 8), %xmm2 ;\
  604. vfmaddsd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  605. #define KERNEL1x2_3(xx) \
  606. vmovsd 0 * SIZE(BO, BI, 8), %xmm1 ;\
  607. vmovsd -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  608. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  609. vmovsd 1 * SIZE(BO, BI, 8), %xmm2 ;\
  610. vfmaddsd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  611. #define KERNEL1x2_4(xx) \
  612. vmovsd 2 * SIZE(BO, BI, 8), %xmm1 ;\
  613. vmovsd -13 * SIZE(AO, %rax, 8), %xmm0 ;\
  614. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  615. vmovsd 3 * SIZE(BO, BI, 8), %xmm2 ;\
  616. vfmaddsd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  617. addq $8, BI ;\
  618. addq $4, %rax ;\
  619. #define KERNEL1x2_SUB(xx) \
  620. vmovsd -4 * SIZE(BO, BI, 8), %xmm1 ;\
  621. vmovsd -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  622. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  623. vmovsd -3 * SIZE(BO, BI, 8), %xmm2 ;\
  624. vfmaddsd %xmm5,%xmm2,%xmm0,%xmm5 ;\
  625. /*******************************************************************************************
  626. * 1 line of N
  627. *******************************************************************************************/
  628. #define KERNEL8x1_1(xx) \
  629. prefetcht0 A_PR1(AO,%rax,8) ;\
  630. vmovddup -2 * SIZE(BO, BI, 8), %xmm1 ;\
  631. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  632. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  633. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  634. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  635. vmovups -12 * SIZE(AO, %rax, 8), %xmm0 ;\
  636. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  637. vmovups -10 * SIZE(AO, %rax, 8), %xmm0 ;\
  638. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  639. #define KERNEL8x1_2(xx) \
  640. prefetcht0 A_PR1+64(AO,%rax,8) ;\
  641. vmovddup -1 * SIZE(BO, BI, 8), %xmm1 ;\
  642. vmovups -8 * SIZE(AO, %rax, 8), %xmm0 ;\
  643. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  644. vmovups -6 * SIZE(AO, %rax, 8), %xmm0 ;\
  645. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  646. vmovups -4 * SIZE(AO, %rax, 8), %xmm0 ;\
  647. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  648. vmovups -2 * SIZE(AO, %rax, 8), %xmm0 ;\
  649. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  650. #define KERNEL8x1_3(xx) \
  651. prefetcht0 A_PR1+128(AO,%rax,8) ;\
  652. vmovddup 0 * SIZE(BO, BI, 8), %xmm1 ;\
  653. vmovups 0 * SIZE(AO, %rax, 8), %xmm0 ;\
  654. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  655. vmovups 2 * SIZE(AO, %rax, 8), %xmm0 ;\
  656. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  657. vmovups 4 * SIZE(AO, %rax, 8), %xmm0 ;\
  658. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  659. vmovups 6 * SIZE(AO, %rax, 8), %xmm0 ;\
  660. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  661. #define KERNEL8x1_4(xx) \
  662. prefetcht0 A_PR1+192(AO,%rax,8) ;\
  663. vmovddup 1 * SIZE(BO, BI, 8), %xmm1 ;\
  664. vmovups 8 * SIZE(AO, %rax, 8), %xmm0 ;\
  665. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  666. vmovups 10 * SIZE(AO, %rax, 8), %xmm0 ;\
  667. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  668. vmovups 12 * SIZE(AO, %rax, 8), %xmm0 ;\
  669. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  670. vmovups 14 * SIZE(AO, %rax, 8), %xmm0 ;\
  671. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  672. addq $4, BI ;\
  673. addq $32, %rax ;\
  674. #define KERNEL8x1_SUB(xx) \
  675. vmovddup -2 * SIZE(BO, BI, 8), %xmm1 ;\
  676. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  677. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  678. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  679. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  680. vmovups -12 * SIZE(AO, %rax, 8), %xmm0 ;\
  681. vfmaddpd %xmm10,%xmm1,%xmm0,%xmm10 ;\
  682. vmovups -10 * SIZE(AO, %rax, 8), %xmm0 ;\
  683. vfmaddpd %xmm13,%xmm1,%xmm0,%xmm13 ;\
  684. /*******************************************************************************************/
  685. #define KERNEL4x1_1(xx) \
  686. vmovddup -2 * SIZE(BO, BI, 8), %xmm1 ;\
  687. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  688. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  689. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  690. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  691. #define KERNEL4x1_2(xx) \
  692. vmovddup -1 * SIZE(BO, BI, 8), %xmm1 ;\
  693. vmovups -12 * SIZE(AO, %rax, 8), %xmm0 ;\
  694. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  695. vmovups -10 * SIZE(AO, %rax, 8), %xmm0 ;\
  696. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  697. #define KERNEL4x1_3(xx) \
  698. vmovddup 0 * SIZE(BO, BI, 8), %xmm1 ;\
  699. vmovups -8 * SIZE(AO, %rax, 8), %xmm0 ;\
  700. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  701. vmovups -6 * SIZE(AO, %rax, 8), %xmm0 ;\
  702. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  703. #define KERNEL4x1_4(xx) \
  704. vmovddup 1 * SIZE(BO, BI, 8), %xmm1 ;\
  705. vmovups -4 * SIZE(AO, %rax, 8), %xmm0 ;\
  706. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  707. vmovups -2 * SIZE(AO, %rax, 8), %xmm0 ;\
  708. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  709. addq $4, BI ;\
  710. addq $16, %rax ;\
  711. #define KERNEL4x1_SUB(xx) \
  712. vmovddup -2 * SIZE(BO, BI, 8), %xmm1 ;\
  713. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  714. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  715. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  716. vfmaddpd %xmm7,%xmm1,%xmm0,%xmm7 ;\
  717. /*******************************************************************************************/
  718. #define KERNEL2x1_1(xx) \
  719. vmovddup -2 * SIZE(BO, BI, 8), %xmm1 ;\
  720. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  721. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  722. #define KERNEL2x1_2(xx) \
  723. vmovddup -1 * SIZE(BO, BI, 8), %xmm1 ;\
  724. vmovups -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  725. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  726. #define KERNEL2x1_3(xx) \
  727. vmovddup 0 * SIZE(BO, BI, 8), %xmm1 ;\
  728. vmovups -12 * SIZE(AO, %rax, 8), %xmm0 ;\
  729. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  730. #define KERNEL2x1_4(xx) \
  731. vmovddup 1 * SIZE(BO, BI, 8), %xmm1 ;\
  732. vmovups -10 * SIZE(AO, %rax, 8), %xmm0 ;\
  733. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  734. addq $4, BI ;\
  735. addq $8, %rax ;\
  736. #define KERNEL2x1_SUB(xx) \
  737. vmovddup -2 * SIZE(BO, BI, 8), %xmm1 ;\
  738. vmovups -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  739. vfmaddpd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  740. /*******************************************************************************************/
  741. #define KERNEL1x1_1(xx) \
  742. vmovsd -2 * SIZE(BO, BI, 8), %xmm1 ;\
  743. vmovsd -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  744. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  745. #define KERNEL1x1_2(xx) \
  746. vmovsd -1 * SIZE(BO, BI, 8), %xmm1 ;\
  747. vmovsd -15 * SIZE(AO, %rax, 8), %xmm0 ;\
  748. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  749. #define KERNEL1x1_3(xx) \
  750. vmovsd 0 * SIZE(BO, BI, 8), %xmm1 ;\
  751. vmovsd -14 * SIZE(AO, %rax, 8), %xmm0 ;\
  752. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  753. #define KERNEL1x1_4(xx) \
  754. vmovsd 1 * SIZE(BO, BI, 8), %xmm1 ;\
  755. vmovsd -13 * SIZE(AO, %rax, 8), %xmm0 ;\
  756. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  757. addq $4, BI ;\
  758. addq $4, %rax ;\
  759. #define KERNEL1x1_SUB(xx) \
  760. vmovsd -2 * SIZE(BO, BI, 8), %xmm1 ;\
  761. vmovsd -16 * SIZE(AO, %rax, 8), %xmm0 ;\
  762. vfmaddsd %xmm4,%xmm1,%xmm0,%xmm4 ;\
  763. /*******************************************************************************************/
  764. #if !defined(TRMMKERNEL)
  765. PROLOGUE
  766. PROFCODE
  767. subq $STACKSIZE, %rsp
  768. movq %rbx, (%rsp)
  769. movq %rbp, 8(%rsp)
  770. movq %r12, 16(%rsp)
  771. movq %r13, 24(%rsp)
  772. movq %r14, 32(%rsp)
  773. movq %r15, 40(%rsp)
  774. vzeroupper
  775. #ifdef WINDOWS_ABI
  776. movq %rdi, 48(%rsp)
  777. movq %rsi, 56(%rsp)
  778. movups %xmm6, 64(%rsp)
  779. movups %xmm7, 80(%rsp)
  780. movups %xmm8, 96(%rsp)
  781. movups %xmm9, 112(%rsp)
  782. movups %xmm10, 128(%rsp)
  783. movups %xmm11, 144(%rsp)
  784. movups %xmm12, 160(%rsp)
  785. movups %xmm13, 176(%rsp)
  786. movups %xmm14, 192(%rsp)
  787. movups %xmm15, 208(%rsp)
  788. movq ARG1, OLD_M
  789. movq ARG2, OLD_N
  790. movq ARG3, OLD_K
  791. movq OLD_A, A
  792. movq OLD_B, B
  793. movq OLD_C, C
  794. movq OLD_LDC, LDC
  795. vmovaps %xmm3, %xmm0
  796. #else
  797. movq STACKSIZE + 8(%rsp), LDC
  798. #endif
  799. movq %rsp, SP # save old stack
  800. subq $128 + L_BUFFER_SIZE, %rsp
  801. andq $-4096, %rsp # align stack
  802. STACK_TOUCH
  803. cmpq $0, OLD_M
  804. je .L999
  805. cmpq $0, OLD_N
  806. je .L999
  807. cmpq $0, OLD_K
  808. je .L999
  809. movq OLD_M, M
  810. movq OLD_N, N
  811. movq OLD_K, K
  812. vmovsd %xmm0, ALPHA
  813. salq $BASE_SHIFT, LDC
  814. movq N, %rax
  815. xorq %rdx, %rdx
  816. movq $6, %rdi
  817. divq %rdi // N / 6
  818. movq %rax, Ndiv6 // N / 6
  819. movq %rdx, Nmod6 // N % 6
  820. movq Ndiv6, J
  821. cmpq $0, J
  822. je .L2_0
  823. ALIGN_4
  824. .L6_01:
  825. // copy to sub buffer
  826. movq K, %rax
  827. salq $1,%rax // K * 2
  828. movq B, BO1
  829. leaq (B,%rax,8), BO2 // next offset to BO2
  830. leaq BUFFER1, BO // first buffer to BO
  831. movq K, %rax
  832. sarq $2, %rax // K / 4
  833. jz .L6_02a
  834. ALIGN_4
  835. .L6_02:
  836. prefetcht0 512(BO1)
  837. prefetcht0 512(BO2)
  838. prefetchw 512(BO)
  839. vmovups (BO1), %xmm0
  840. vmovups 2*SIZE(BO1), %xmm2
  841. vmovups 4*SIZE(BO1), %xmm4
  842. vmovups 6*SIZE(BO1), %xmm6
  843. vmovsd (BO2), %xmm1
  844. vmovsd 2*SIZE(BO2), %xmm3
  845. vmovsd 4*SIZE(BO2), %xmm5
  846. vmovsd 6*SIZE(BO2), %xmm7
  847. vmovups %xmm0, (BO)
  848. vmovsd %xmm1, 2*SIZE(BO)
  849. vmovups %xmm2, 3*SIZE(BO)
  850. vmovsd %xmm3, 5*SIZE(BO)
  851. vmovups %xmm4, 6*SIZE(BO)
  852. vmovsd %xmm5, 8*SIZE(BO)
  853. vmovups %xmm6, 9*SIZE(BO)
  854. vmovsd %xmm7,11*SIZE(BO)
  855. addq $8*SIZE,BO1
  856. addq $8*SIZE,BO2
  857. addq $12*SIZE,BO
  858. decq %rax
  859. jnz .L6_02
  860. .L6_02a:
  861. movq K, %rax
  862. andq $3, %rax // K % 4
  863. jz .L6_02c
  864. ALIGN_4
  865. .L6_02b:
  866. vmovups (BO1), %xmm0
  867. vmovsd (BO2), %xmm1
  868. vmovups %xmm0, (BO)
  869. vmovsd %xmm1, 2*SIZE(BO)
  870. addq $2*SIZE,BO1
  871. addq $2*SIZE,BO2
  872. addq $3*SIZE,BO
  873. decq %rax
  874. jnz .L6_02b
  875. .L6_02c:
  876. movq K, %rax
  877. salq $1,%rax // K * 2
  878. leaq (B,%rax,8), BO1 // next offset to BO1
  879. leaq (BO1,%rax,8), BO2 // next offset to BO1
  880. leaq BUFFER2, BO // second buffer to BO
  881. movq K, %rax
  882. sarq $2, %rax // k / 4
  883. jz .L6_03a
  884. ALIGN_4
  885. .L6_03:
  886. prefetcht0 512(BO2)
  887. prefetchw 512(BO)
  888. vmovups (BO2), %xmm0
  889. vmovups 2*SIZE(BO2), %xmm2
  890. vmovups 4*SIZE(BO2), %xmm4
  891. vmovups 6*SIZE(BO2), %xmm6
  892. vmovsd 1*SIZE(BO1), %xmm1
  893. vmovsd 3*SIZE(BO1), %xmm3
  894. vmovsd 5*SIZE(BO1), %xmm5
  895. vmovsd 7*SIZE(BO1), %xmm7
  896. vmovsd %xmm1, 0*SIZE(BO)
  897. vmovups %xmm0, 1*SIZE(BO)
  898. vmovsd %xmm3, 3*SIZE(BO)
  899. vmovups %xmm2, 4*SIZE(BO)
  900. vmovsd %xmm5, 6*SIZE(BO)
  901. vmovups %xmm4, 7*SIZE(BO)
  902. vmovsd %xmm7, 9*SIZE(BO)
  903. vmovups %xmm6,10*SIZE(BO)
  904. addq $8*SIZE,BO1
  905. addq $8*SIZE,BO2
  906. addq $12*SIZE,BO
  907. decq %rax
  908. jnz .L6_03
  909. .L6_03a:
  910. movq K, %rax
  911. andq $3, %rax // K % 4
  912. jz .L6_03c
  913. ALIGN_4
  914. .L6_03b:
  915. vmovsd 1*SIZE(BO1), %xmm0
  916. vmovups (BO2), %xmm1
  917. vmovsd %xmm0, (BO)
  918. vmovups %xmm1, 1*SIZE(BO)
  919. addq $2*SIZE,BO1
  920. addq $2*SIZE,BO2
  921. addq $3*SIZE,BO
  922. decq %rax
  923. jnz .L6_03b
  924. .L6_03c:
  925. movq BO2, B // next offset of B
  926. .L6_10:
  927. movq C, CO1
  928. leaq (C, LDC, 2), C
  929. leaq (C, LDC, 1), C // c += 3 * ldc
  930. movq A, AO // aoffset = a
  931. addq $16 * SIZE, AO
  932. movq M, I
  933. sarq $3, I // i = (m >> 3)
  934. je .L6_20
  935. ALIGN_4
  936. .L6_11:
  937. leaq BUFFER1, BO // first buffer to BO
  938. addq $6 * SIZE, BO
  939. vzeroall
  940. movq K, %rax
  941. andq $-8, %rax // K = K - ( K % 8 )
  942. je .L6_16
  943. movq %rax, BI // Index for BO
  944. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  945. salq $3, %rax // rax = rax * 8 ; number of values
  946. leaq (AO, %rax, 8), AO
  947. leaq (BO, BI, 8), BO
  948. negq BI
  949. negq %rax
  950. ALIGN_4
  951. .L6_12:
  952. prefetcht0 B_PR1(BO,BI,8)
  953. KERNEL8x3_1(xxx)
  954. KERNEL8x3_2(xxx)
  955. KERNEL8x3_3(xxx)
  956. prefetcht0 B_PR1+64(BO,BI,8)
  957. KERNEL8x3_4(xxx)
  958. KERNEL8x3_1(xxx)
  959. KERNEL8x3_2(xxx)
  960. prefetcht0 B_PR1+32(BO,BI,8)
  961. KERNEL8x3_3(xxx)
  962. KERNEL8x3_4(xxx)
  963. je .L6_16
  964. prefetcht0 B_PR1(BO,BI,8)
  965. KERNEL8x3_1(xxx)
  966. KERNEL8x3_2(xxx)
  967. KERNEL8x3_3(xxx)
  968. prefetcht0 B_PR1+64(BO,BI,8)
  969. KERNEL8x3_4(xxx)
  970. KERNEL8x3_1(xxx)
  971. KERNEL8x3_2(xxx)
  972. prefetcht0 B_PR1+32(BO,BI,8)
  973. KERNEL8x3_3(xxx)
  974. KERNEL8x3_4(xxx)
  975. je .L6_16
  976. jmp .L6_12
  977. ALIGN_4
  978. .L6_16:
  979. movq K, %rax
  980. andq $7, %rax # if (k & 1)
  981. je .L6_19
  982. movq %rax, BI // Index for BO
  983. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  984. salq $3, %rax // rax = rax * 8 ; number of values
  985. leaq (AO, %rax, 8), AO
  986. leaq (BO, BI, 8), BO
  987. negq BI
  988. negq %rax
  989. ALIGN_4
  990. .L6_17:
  991. KERNEL8x3_SUB(xxx)
  992. addq $3, BI
  993. addq $8, %rax
  994. jl .L6_17
  995. ALIGN_4
  996. .L6_19:
  997. vmovddup ALPHA, %xmm0
  998. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  999. vfmaddpd 2 * SIZE(CO1),%xmm0, %xmm7,%xmm7
  1000. vfmaddpd 4 * SIZE(CO1),%xmm0, %xmm10,%xmm10
  1001. vfmaddpd 6 * SIZE(CO1),%xmm0, %xmm13,%xmm13
  1002. vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5
  1003. vfmaddpd 2 * SIZE(CO1, LDC),%xmm0, %xmm8,%xmm8
  1004. vfmaddpd 4 * SIZE(CO1, LDC),%xmm0, %xmm11,%xmm11
  1005. vfmaddpd 6 * SIZE(CO1, LDC),%xmm0, %xmm14,%xmm14
  1006. vfmaddpd (CO1, LDC, 2),%xmm0, %xmm6,%xmm6
  1007. vfmaddpd 2 * SIZE(CO1, LDC, 2),%xmm0, %xmm9,%xmm9
  1008. vfmaddpd 4 * SIZE(CO1, LDC, 2),%xmm0, %xmm12,%xmm12
  1009. vfmaddpd 6 * SIZE(CO1, LDC, 2),%xmm0, %xmm15,%xmm15
  1010. vmovups %xmm4 , (CO1)
  1011. vmovups %xmm7 , 2 * SIZE(CO1)
  1012. vmovups %xmm10, 4 * SIZE(CO1)
  1013. vmovups %xmm13, 6 * SIZE(CO1)
  1014. vmovups %xmm5 , (CO1, LDC)
  1015. vmovups %xmm8 , 2 * SIZE(CO1, LDC)
  1016. vmovups %xmm11, 4 * SIZE(CO1, LDC)
  1017. vmovups %xmm14, 6 * SIZE(CO1, LDC)
  1018. vmovups %xmm6 , (CO1, LDC, 2)
  1019. vmovups %xmm9 , 2 * SIZE(CO1, LDC, 2)
  1020. vmovups %xmm12, 4 * SIZE(CO1, LDC, 2)
  1021. vmovups %xmm15, 6 * SIZE(CO1, LDC, 2)
  1022. addq $8 * SIZE, CO1 # coffset += 8
  1023. decq I # i --
  1024. jg .L6_11
  1025. ALIGN_4
  1026. /**************************************************************************
  1027. * Rest of M
  1028. ***************************************************************************/
  1029. .L6_20:
  1030. // Test rest of M
  1031. testq $7, M
  1032. jz .L7_10 // to next 3 lines of N
  1033. testq $4, M
  1034. jz .L6_30
  1035. ALIGN_4
  1036. .L6_21:
  1037. leaq BUFFER1, BO // first buffer to BO
  1038. addq $6 * SIZE, BO
  1039. vzeroall
  1040. movq K, %rax
  1041. andq $-8, %rax
  1042. je .L6_26
  1043. movq %rax, BI // Index for BO
  1044. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1045. salq $2, %rax // rax = rax * 4 ; number of values
  1046. leaq (AO, %rax, 8), AO
  1047. leaq (BO, BI, 8), BO
  1048. negq BI
  1049. negq %rax
  1050. ALIGN_4
  1051. .L6_22:
  1052. prefetcht0 B_PR1(BO,BI,8)
  1053. KERNEL4x3_1(xxx)
  1054. KERNEL4x3_2(xxx)
  1055. KERNEL4x3_3(xxx)
  1056. prefetcht0 B_PR1+64(BO,BI,8)
  1057. KERNEL4x3_4(xxx)
  1058. KERNEL4x3_1(xxx)
  1059. KERNEL4x3_2(xxx)
  1060. prefetcht0 B_PR1+32(BO,BI,8)
  1061. KERNEL4x3_3(xxx)
  1062. KERNEL4x3_4(xxx)
  1063. je .L6_26
  1064. prefetcht0 B_PR1(BO,BI,8)
  1065. KERNEL4x3_1(xxx)
  1066. KERNEL4x3_2(xxx)
  1067. KERNEL4x3_3(xxx)
  1068. prefetcht0 B_PR1+64(BO,BI,8)
  1069. KERNEL4x3_4(xxx)
  1070. KERNEL4x3_1(xxx)
  1071. KERNEL4x3_2(xxx)
  1072. prefetcht0 B_PR1+32(BO,BI,8)
  1073. KERNEL4x3_3(xxx)
  1074. KERNEL4x3_4(xxx)
  1075. je .L6_26
  1076. jmp .L6_22
  1077. ALIGN_4
  1078. .L6_26:
  1079. movq K, %rax
  1080. andq $7, %rax # if (k & 1)
  1081. je .L6_29
  1082. movq %rax, BI // Index for BO
  1083. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1084. salq $2, %rax // rax = rax * 4 ; number of values
  1085. leaq (AO, %rax, 8), AO
  1086. leaq (BO, BI, 8), BO
  1087. negq BI
  1088. negq %rax
  1089. ALIGN_4
  1090. .L6_27:
  1091. KERNEL4x3_SUB(xxx)
  1092. addq $3, BI
  1093. addq $4, %rax
  1094. jl .L6_27
  1095. ALIGN_4
  1096. .L6_29:
  1097. vmovddup ALPHA, %xmm0
  1098. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  1099. vfmaddpd 2 * SIZE(CO1),%xmm0, %xmm7,%xmm7
  1100. vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5
  1101. vfmaddpd 2 * SIZE(CO1, LDC),%xmm0, %xmm8,%xmm8
  1102. vfmaddpd (CO1, LDC, 2),%xmm0, %xmm6,%xmm6
  1103. vfmaddpd 2 * SIZE(CO1, LDC, 2),%xmm0, %xmm9,%xmm9
  1104. vmovups %xmm4 , (CO1)
  1105. vmovups %xmm7 , 2 * SIZE(CO1)
  1106. vmovups %xmm5 , (CO1, LDC)
  1107. vmovups %xmm8 , 2 * SIZE(CO1, LDC)
  1108. vmovups %xmm6 , (CO1, LDC, 2)
  1109. vmovups %xmm9 , 2 * SIZE(CO1, LDC, 2)
  1110. addq $4 * SIZE, CO1 # coffset += 4
  1111. ALIGN_4
  1112. .L6_30:
  1113. testq $2, M
  1114. jz .L6_40
  1115. ALIGN_4
  1116. .L6_31:
  1117. leaq BUFFER1, BO // first buffer to BO
  1118. addq $6 * SIZE, BO
  1119. vzeroall
  1120. movq K, %rax
  1121. andq $-8, %rax
  1122. je .L6_36
  1123. movq %rax, BI // Index for BO
  1124. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1125. salq $1, %rax // rax = rax *2 ; number of values
  1126. leaq (AO, %rax, 8), AO
  1127. leaq (BO, BI, 8), BO
  1128. negq BI
  1129. negq %rax
  1130. ALIGN_4
  1131. .L6_32:
  1132. prefetcht0 B_PR1(BO,BI,8)
  1133. KERNEL2x3_1(xxx)
  1134. KERNEL2x3_2(xxx)
  1135. KERNEL2x3_3(xxx)
  1136. prefetcht0 B_PR1+64(BO,BI,8)
  1137. KERNEL2x3_4(xxx)
  1138. KERNEL2x3_1(xxx)
  1139. KERNEL2x3_2(xxx)
  1140. prefetcht0 B_PR1+32(BO,BI,8)
  1141. KERNEL2x3_3(xxx)
  1142. KERNEL2x3_4(xxx)
  1143. je .L6_36
  1144. prefetcht0 B_PR1(BO,BI,8)
  1145. KERNEL2x3_1(xxx)
  1146. KERNEL2x3_2(xxx)
  1147. KERNEL2x3_3(xxx)
  1148. prefetcht0 B_PR1+64(BO,BI,8)
  1149. KERNEL2x3_4(xxx)
  1150. KERNEL2x3_1(xxx)
  1151. KERNEL2x3_2(xxx)
  1152. prefetcht0 B_PR1+32(BO,BI,8)
  1153. KERNEL2x3_3(xxx)
  1154. KERNEL2x3_4(xxx)
  1155. je .L6_36
  1156. jmp .L6_32
  1157. ALIGN_4
  1158. .L6_36:
  1159. movq K, %rax
  1160. andq $7, %rax # if (k & 1)
  1161. je .L6_39
  1162. movq %rax, BI // Index for BO
  1163. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1164. salq $1, %rax // rax = rax *2 ; number of values
  1165. leaq (AO, %rax, 8), AO
  1166. leaq (BO, BI, 8), BO
  1167. negq BI
  1168. negq %rax
  1169. ALIGN_4
  1170. .L6_37:
  1171. KERNEL2x3_SUB(xxx)
  1172. addq $3, BI
  1173. addq $2, %rax
  1174. jl .L6_37
  1175. ALIGN_4
  1176. .L6_39:
  1177. vmovddup ALPHA, %xmm0
  1178. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  1179. vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5
  1180. vfmaddpd (CO1, LDC, 2),%xmm0, %xmm6,%xmm6
  1181. vmovups %xmm4 , (CO1)
  1182. vmovups %xmm5 , (CO1, LDC)
  1183. vmovups %xmm6 , (CO1, LDC, 2)
  1184. addq $2 * SIZE, CO1 # coffset += 2
  1185. ALIGN_4
  1186. .L6_40:
  1187. testq $1, M
  1188. jz .L7_10 // to next 3 lines of N
  1189. ALIGN_4
  1190. .L6_41:
  1191. leaq BUFFER1, BO // first buffer to BO
  1192. addq $6 * SIZE, BO
  1193. vzeroall
  1194. movq K, %rax
  1195. andq $-8, %rax
  1196. je .L6_46
  1197. movq %rax, BI // Index for BO
  1198. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1199. leaq (AO, %rax, 8), AO
  1200. leaq (BO, BI, 8), BO
  1201. negq BI
  1202. negq %rax
  1203. ALIGN_4
  1204. .L6_42:
  1205. prefetcht0 B_PR1(BO,BI,8)
  1206. KERNEL1x3_1(xxx)
  1207. KERNEL1x3_2(xxx)
  1208. KERNEL1x3_3(xxx)
  1209. prefetcht0 B_PR1+64(BO,BI,8)
  1210. KERNEL1x3_4(xxx)
  1211. KERNEL1x3_1(xxx)
  1212. KERNEL1x3_2(xxx)
  1213. prefetcht0 B_PR1+32(BO,BI,8)
  1214. KERNEL1x3_3(xxx)
  1215. KERNEL1x3_4(xxx)
  1216. je .L6_46
  1217. prefetcht0 B_PR1(BO,BI,8)
  1218. KERNEL1x3_1(xxx)
  1219. KERNEL1x3_2(xxx)
  1220. KERNEL1x3_3(xxx)
  1221. prefetcht0 B_PR1+64(BO,BI,8)
  1222. KERNEL1x3_4(xxx)
  1223. KERNEL1x3_1(xxx)
  1224. KERNEL1x3_2(xxx)
  1225. prefetcht0 B_PR1+32(BO,BI,8)
  1226. KERNEL1x3_3(xxx)
  1227. KERNEL1x3_4(xxx)
  1228. je .L6_46
  1229. jmp .L6_42
  1230. ALIGN_4
  1231. .L6_46:
  1232. movq K, %rax
  1233. andq $7, %rax # if (k & 1)
  1234. je .L6_49
  1235. movq %rax, BI // Index for BO
  1236. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1237. leaq (AO, %rax, 8), AO
  1238. leaq (BO, BI, 8), BO
  1239. negq BI
  1240. negq %rax
  1241. ALIGN_4
  1242. .L6_47:
  1243. KERNEL1x3_SUB(xxx)
  1244. addq $3, BI
  1245. addq $1, %rax
  1246. jl .L6_47
  1247. ALIGN_4
  1248. .L6_49:
  1249. vmovddup ALPHA, %xmm0
  1250. vfmaddsd (CO1),%xmm0, %xmm4,%xmm4
  1251. vfmaddsd (CO1, LDC),%xmm0, %xmm5,%xmm5
  1252. vfmaddsd (CO1, LDC, 2),%xmm0, %xmm6,%xmm6
  1253. vmovsd %xmm4 , (CO1)
  1254. vmovsd %xmm5 , (CO1, LDC)
  1255. vmovsd %xmm6 , (CO1, LDC, 2)
  1256. addq $1 * SIZE, CO1 # coffset += 1
  1257. ALIGN_4
  1258. /***************************************************************************************************************/
  1259. .L7_10:
  1260. movq C, CO1
  1261. leaq (C, LDC, 2), C
  1262. leaq (C, LDC, 1), C // c += 3 * ldc
  1263. movq A, AO // aoffset = a
  1264. addq $16 * SIZE, AO
  1265. movq M, I
  1266. sarq $3, I // i = (m >> 3)
  1267. je .L7_20
  1268. ALIGN_4
  1269. .L7_11:
  1270. leaq BUFFER2, BO // second buffer to BO
  1271. addq $6 * SIZE, BO
  1272. vzeroall
  1273. movq K, %rax
  1274. andq $-8, %rax
  1275. je .L7_16
  1276. movq %rax, BI // Index for BO
  1277. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1278. salq $3, %rax // rax = rax * 8 ; number of values
  1279. leaq (AO, %rax, 8), AO
  1280. leaq (BO, BI, 8), BO
  1281. negq BI
  1282. negq %rax
  1283. ALIGN_4
  1284. .L7_12:
  1285. prefetcht0 B_PR1(BO,BI,8)
  1286. KERNEL8x3_1(xxx)
  1287. KERNEL8x3_2(xxx)
  1288. KERNEL8x3_3(xxx)
  1289. prefetcht0 B_PR1+64(BO,BI,8)
  1290. KERNEL8x3_4(xxx)
  1291. KERNEL8x3_1(xxx)
  1292. KERNEL8x3_2(xxx)
  1293. prefetcht0 B_PR1+32(BO,BI,8)
  1294. KERNEL8x3_3(xxx)
  1295. KERNEL8x3_4(xxx)
  1296. je .L7_16
  1297. prefetcht0 B_PR1(BO,BI,8)
  1298. KERNEL8x3_1(xxx)
  1299. KERNEL8x3_2(xxx)
  1300. KERNEL8x3_3(xxx)
  1301. prefetcht0 B_PR1+64(BO,BI,8)
  1302. KERNEL8x3_4(xxx)
  1303. KERNEL8x3_1(xxx)
  1304. KERNEL8x3_2(xxx)
  1305. prefetcht0 B_PR1+32(BO,BI,8)
  1306. KERNEL8x3_3(xxx)
  1307. KERNEL8x3_4(xxx)
  1308. je .L7_16
  1309. jmp .L7_12
  1310. ALIGN_4
  1311. .L7_16:
  1312. movq K, %rax
  1313. andq $7, %rax # if (k & 1)
  1314. je .L7_19
  1315. movq %rax, BI // Index for BO
  1316. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1317. salq $3, %rax // rax = rax * 8 ; number of values
  1318. leaq (AO, %rax, 8), AO
  1319. leaq (BO, BI, 8), BO
  1320. negq BI
  1321. negq %rax
  1322. ALIGN_4
  1323. .L7_17:
  1324. KERNEL8x3_SUB(xxx)
  1325. addq $3, BI
  1326. addq $8, %rax
  1327. jl .L7_17
  1328. ALIGN_4
  1329. .L7_19:
  1330. vmovddup ALPHA, %xmm0
  1331. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  1332. vfmaddpd 2 * SIZE(CO1),%xmm0, %xmm7,%xmm7
  1333. vfmaddpd 4 * SIZE(CO1),%xmm0, %xmm10,%xmm10
  1334. vfmaddpd 6 * SIZE(CO1),%xmm0, %xmm13,%xmm13
  1335. vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5
  1336. vfmaddpd 2 * SIZE(CO1, LDC),%xmm0, %xmm8,%xmm8
  1337. vfmaddpd 4 * SIZE(CO1, LDC),%xmm0, %xmm11,%xmm11
  1338. vfmaddpd 6 * SIZE(CO1, LDC),%xmm0, %xmm14,%xmm14
  1339. vfmaddpd (CO1, LDC, 2),%xmm0, %xmm6,%xmm6
  1340. vfmaddpd 2 * SIZE(CO1, LDC, 2),%xmm0, %xmm9,%xmm9
  1341. vfmaddpd 4 * SIZE(CO1, LDC, 2),%xmm0, %xmm12,%xmm12
  1342. vfmaddpd 6 * SIZE(CO1, LDC, 2),%xmm0, %xmm15,%xmm15
  1343. vmovups %xmm4 , (CO1)
  1344. vmovups %xmm7 , 2 * SIZE(CO1)
  1345. vmovups %xmm10, 4 * SIZE(CO1)
  1346. vmovups %xmm13, 6 * SIZE(CO1)
  1347. vmovups %xmm5 , (CO1, LDC)
  1348. vmovups %xmm8 , 2 * SIZE(CO1, LDC)
  1349. vmovups %xmm11, 4 * SIZE(CO1, LDC)
  1350. vmovups %xmm14, 6 * SIZE(CO1, LDC)
  1351. vmovups %xmm6 , (CO1, LDC, 2)
  1352. vmovups %xmm9 , 2 * SIZE(CO1, LDC, 2)
  1353. vmovups %xmm12, 4 * SIZE(CO1, LDC, 2)
  1354. vmovups %xmm15, 6 * SIZE(CO1, LDC, 2)
  1355. addq $8 * SIZE, CO1 # coffset += 8
  1356. decq I # i --
  1357. jg .L7_11
  1358. ALIGN_4
  1359. .L7_20:
  1360. // Test rest of M
  1361. testq $7, M
  1362. jz .L7_60 // to next 6 lines of N
  1363. testq $4, M
  1364. jz .L7_30
  1365. ALIGN_4
  1366. .L7_21:
  1367. leaq BUFFER2, BO // second buffer to BO
  1368. addq $6 * SIZE, BO
  1369. vzeroall
  1370. movq K, %rax
  1371. andq $-8, %rax
  1372. je .L7_26
  1373. movq %rax, BI // Index for BO
  1374. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1375. salq $2, %rax // rax = rax * 4 ; number of values
  1376. leaq (AO, %rax, 8), AO
  1377. leaq (BO, BI, 8), BO
  1378. negq BI
  1379. negq %rax
  1380. ALIGN_4
  1381. .L7_22:
  1382. prefetcht0 B_PR1(BO,BI,8)
  1383. KERNEL4x3_1(xxx)
  1384. KERNEL4x3_2(xxx)
  1385. KERNEL4x3_3(xxx)
  1386. prefetcht0 B_PR1+64(BO,BI,8)
  1387. KERNEL4x3_4(xxx)
  1388. KERNEL4x3_1(xxx)
  1389. KERNEL4x3_2(xxx)
  1390. prefetcht0 B_PR1+32(BO,BI,8)
  1391. KERNEL4x3_3(xxx)
  1392. KERNEL4x3_4(xxx)
  1393. je .L7_26
  1394. prefetcht0 B_PR1(BO,BI,8)
  1395. KERNEL4x3_1(xxx)
  1396. KERNEL4x3_2(xxx)
  1397. KERNEL4x3_3(xxx)
  1398. prefetcht0 B_PR1+64(BO,BI,8)
  1399. KERNEL4x3_4(xxx)
  1400. KERNEL4x3_1(xxx)
  1401. KERNEL4x3_2(xxx)
  1402. prefetcht0 B_PR1+32(BO,BI,8)
  1403. KERNEL4x3_3(xxx)
  1404. KERNEL4x3_4(xxx)
  1405. je .L7_26
  1406. jmp .L7_22
  1407. ALIGN_4
  1408. .L7_26:
  1409. movq K, %rax
  1410. andq $7, %rax # if (k & 1)
  1411. je .L7_29
  1412. movq %rax, BI // Index for BO
  1413. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1414. salq $2, %rax // rax = rax * 4 ; number of values
  1415. leaq (AO, %rax, 8), AO
  1416. leaq (BO, BI, 8), BO
  1417. negq BI
  1418. negq %rax
  1419. ALIGN_4
  1420. .L7_27:
  1421. KERNEL4x3_SUB(xxx)
  1422. addq $3, BI
  1423. addq $4, %rax
  1424. jl .L7_27
  1425. ALIGN_4
  1426. .L7_29:
  1427. vmovddup ALPHA, %xmm0
  1428. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  1429. vfmaddpd 2 * SIZE(CO1),%xmm0, %xmm7,%xmm7
  1430. vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5
  1431. vfmaddpd 2 * SIZE(CO1, LDC),%xmm0, %xmm8,%xmm8
  1432. vfmaddpd (CO1, LDC, 2),%xmm0, %xmm6,%xmm6
  1433. vfmaddpd 2 * SIZE(CO1, LDC, 2),%xmm0, %xmm9,%xmm9
  1434. vmovups %xmm4 , (CO1)
  1435. vmovups %xmm7 , 2 * SIZE(CO1)
  1436. vmovups %xmm5 , (CO1, LDC)
  1437. vmovups %xmm8 , 2 * SIZE(CO1, LDC)
  1438. vmovups %xmm6 , (CO1, LDC, 2)
  1439. vmovups %xmm9 , 2 * SIZE(CO1, LDC, 2)
  1440. addq $4 * SIZE, CO1 # coffset += 4
  1441. ALIGN_4
  1442. .L7_30:
  1443. testq $2, M
  1444. jz .L7_40
  1445. ALIGN_4
  1446. .L7_31:
  1447. leaq BUFFER2, BO // second buffer to BO
  1448. addq $6 * SIZE, BO
  1449. vzeroall
  1450. movq K, %rax
  1451. andq $-8, %rax
  1452. je .L7_36
  1453. movq %rax, BI // Index for BO
  1454. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1455. salq $1, %rax // rax = rax *2 ; number of values
  1456. leaq (AO, %rax, 8), AO
  1457. leaq (BO, BI, 8), BO
  1458. negq BI
  1459. negq %rax
  1460. ALIGN_4
  1461. .L7_32:
  1462. prefetcht0 B_PR1(BO,BI,8)
  1463. KERNEL2x3_1(xxx)
  1464. KERNEL2x3_2(xxx)
  1465. KERNEL2x3_3(xxx)
  1466. prefetcht0 B_PR1+64(BO,BI,8)
  1467. KERNEL2x3_4(xxx)
  1468. KERNEL2x3_1(xxx)
  1469. KERNEL2x3_2(xxx)
  1470. prefetcht0 B_PR1+32(BO,BI,8)
  1471. KERNEL2x3_3(xxx)
  1472. KERNEL2x3_4(xxx)
  1473. je .L7_36
  1474. prefetcht0 B_PR1(BO,BI,8)
  1475. KERNEL2x3_1(xxx)
  1476. KERNEL2x3_2(xxx)
  1477. KERNEL2x3_3(xxx)
  1478. prefetcht0 B_PR1+64(BO,BI,8)
  1479. KERNEL2x3_4(xxx)
  1480. KERNEL2x3_1(xxx)
  1481. KERNEL2x3_2(xxx)
  1482. prefetcht0 B_PR1+32(BO,BI,8)
  1483. KERNEL2x3_3(xxx)
  1484. KERNEL2x3_4(xxx)
  1485. je .L7_36
  1486. jmp .L7_32
  1487. ALIGN_4
  1488. .L7_36:
  1489. movq K, %rax
  1490. andq $7, %rax # if (k & 1)
  1491. je .L7_39
  1492. movq %rax, BI // Index for BO
  1493. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1494. salq $1, %rax // rax = rax *2 ; number of values
  1495. leaq (AO, %rax, 8), AO
  1496. leaq (BO, BI, 8), BO
  1497. negq BI
  1498. negq %rax
  1499. ALIGN_4
  1500. .L7_37:
  1501. KERNEL2x3_SUB(xxx)
  1502. addq $3, BI
  1503. addq $2, %rax
  1504. jl .L7_37
  1505. ALIGN_4
  1506. .L7_39:
  1507. vmovddup ALPHA, %xmm0
  1508. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  1509. vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5
  1510. vfmaddpd (CO1, LDC, 2),%xmm0, %xmm6,%xmm6
  1511. vmovups %xmm4 , (CO1)
  1512. vmovups %xmm5 , (CO1, LDC)
  1513. vmovups %xmm6 , (CO1, LDC, 2)
  1514. addq $2 * SIZE, CO1 # coffset += 2
  1515. ALIGN_4
  1516. .L7_40:
  1517. testq $1, M
  1518. jz .L7_60 // to next 6 lines of N
  1519. ALIGN_4
  1520. .L7_41:
  1521. leaq BUFFER2, BO // second buffer to BO
  1522. addq $6 * SIZE, BO
  1523. vzeroall
  1524. movq K, %rax
  1525. andq $-8, %rax
  1526. je .L7_46
  1527. movq %rax, BI // Index for BO
  1528. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1529. leaq (AO, %rax, 8), AO
  1530. leaq (BO, BI, 8), BO
  1531. negq BI
  1532. negq %rax
  1533. ALIGN_4
  1534. .L7_42:
  1535. prefetcht0 B_PR1(BO,BI,8)
  1536. KERNEL1x3_1(xxx)
  1537. KERNEL1x3_2(xxx)
  1538. KERNEL1x3_3(xxx)
  1539. prefetcht0 B_PR1+64(BO,BI,8)
  1540. KERNEL1x3_4(xxx)
  1541. KERNEL1x3_1(xxx)
  1542. KERNEL1x3_2(xxx)
  1543. prefetcht0 B_PR1+32(BO,BI,8)
  1544. KERNEL1x3_3(xxx)
  1545. KERNEL1x3_4(xxx)
  1546. je .L7_46
  1547. prefetcht0 B_PR1(BO,BI,8)
  1548. KERNEL1x3_1(xxx)
  1549. KERNEL1x3_2(xxx)
  1550. KERNEL1x3_3(xxx)
  1551. prefetcht0 B_PR1+64(BO,BI,8)
  1552. KERNEL1x3_4(xxx)
  1553. KERNEL1x3_1(xxx)
  1554. KERNEL1x3_2(xxx)
  1555. prefetcht0 B_PR1+32(BO,BI,8)
  1556. KERNEL1x3_3(xxx)
  1557. KERNEL1x3_4(xxx)
  1558. je .L7_46
  1559. jmp .L7_42
  1560. ALIGN_4
  1561. .L7_46:
  1562. movq K, %rax
  1563. andq $7, %rax # if (k & 1)
  1564. je .L7_49
  1565. movq %rax, BI // Index for BO
  1566. leaq (BI,BI,2), BI // BI = BI * 3 ; number of values
  1567. leaq (AO, %rax, 8), AO
  1568. leaq (BO, BI, 8), BO
  1569. negq BI
  1570. negq %rax
  1571. ALIGN_4
  1572. .L7_47:
  1573. KERNEL1x3_SUB(xxx)
  1574. addq $3, BI
  1575. addq $1, %rax
  1576. jl .L7_47
  1577. ALIGN_4
  1578. .L7_49:
  1579. vmovddup ALPHA, %xmm0
  1580. vfmaddsd (CO1),%xmm0, %xmm4,%xmm4
  1581. vfmaddsd (CO1, LDC),%xmm0, %xmm5,%xmm5
  1582. vfmaddsd (CO1, LDC, 2),%xmm0, %xmm6,%xmm6
  1583. vmovsd %xmm4 , (CO1)
  1584. vmovsd %xmm5 , (CO1, LDC)
  1585. vmovsd %xmm6 , (CO1, LDC, 2)
  1586. addq $1 * SIZE, CO1 # coffset += 1
  1587. .L7_60:
  1588. decq J // j --
  1589. jg .L6_01
  1590. .L2_0:
  1591. cmpq $0, Nmod6 // N % 6 == 0
  1592. je .L999
  1593. /************************************************************************************************
  1594. * Loop for Nmod6 / 2 > 0
  1595. *************************************************************************************************/
  1596. movq Nmod6, J
  1597. sarq $1, J // j = j / 2
  1598. je .L1_0
  1599. ALIGN_4
  1600. .L2_01:
  1601. // copy to sub buffer
  1602. movq B, BO1
  1603. leaq BUFFER1, BO // first buffer to BO
  1604. movq K, %rax
  1605. ALIGN_4
  1606. .L2_02b:
  1607. vmovups (BO1), %xmm0
  1608. vmovups %xmm0, (BO)
  1609. addq $2*SIZE,BO1
  1610. addq $2*SIZE,BO
  1611. decq %rax
  1612. jnz .L2_02b
  1613. .L2_02c:
  1614. movq BO1, B // next offset of B
  1615. .L2_10:
  1616. movq C, CO1
  1617. leaq (C, LDC, 2), C // c += 2 * ldc
  1618. movq A, AO // aoffset = a
  1619. addq $16 * SIZE, AO
  1620. movq M, I
  1621. sarq $3, I // i = (m >> 3)
  1622. je .L2_20
  1623. ALIGN_4
  1624. .L2_11:
  1625. leaq BUFFER1, BO // first buffer to BO
  1626. addq $4 * SIZE, BO
  1627. vzeroall
  1628. movq K, %rax
  1629. andq $-8, %rax // K = K - ( K % 8 )
  1630. je .L2_16
  1631. movq %rax, BI // Index for BO
  1632. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  1633. salq $3, %rax // rax = rax * 8 ; number of values
  1634. leaq (AO, %rax, 8), AO
  1635. leaq (BO, BI, 8), BO
  1636. negq BI
  1637. negq %rax
  1638. ALIGN_4
  1639. .L2_12:
  1640. prefetcht0 B_PR1(BO,BI,8)
  1641. KERNEL8x2_1(xxx)
  1642. KERNEL8x2_2(xxx)
  1643. KERNEL8x2_3(xxx)
  1644. KERNEL8x2_4(xxx)
  1645. prefetcht0 B_PR1(BO,BI,8)
  1646. KERNEL8x2_1(xxx)
  1647. KERNEL8x2_2(xxx)
  1648. KERNEL8x2_3(xxx)
  1649. KERNEL8x2_4(xxx)
  1650. je .L2_16
  1651. prefetcht0 B_PR1(BO,BI,8)
  1652. KERNEL8x2_1(xxx)
  1653. KERNEL8x2_2(xxx)
  1654. KERNEL8x2_3(xxx)
  1655. KERNEL8x2_4(xxx)
  1656. prefetcht0 B_PR1(BO,BI,8)
  1657. KERNEL8x2_1(xxx)
  1658. KERNEL8x2_2(xxx)
  1659. KERNEL8x2_3(xxx)
  1660. KERNEL8x2_4(xxx)
  1661. je .L2_16
  1662. jmp .L2_12
  1663. ALIGN_4
  1664. .L2_16:
  1665. movq K, %rax
  1666. andq $7, %rax # if (k & 1)
  1667. je .L2_19
  1668. movq %rax, BI // Index for BO
  1669. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  1670. salq $3, %rax // rax = rax * 8 ; number of values
  1671. leaq (AO, %rax, 8), AO
  1672. leaq (BO, BI, 8), BO
  1673. negq BI
  1674. negq %rax
  1675. ALIGN_4
  1676. .L2_17:
  1677. KERNEL8x2_SUB(xxx)
  1678. addq $2, BI
  1679. addq $8, %rax
  1680. jl .L2_17
  1681. ALIGN_4
  1682. .L2_19:
  1683. vmovddup ALPHA, %xmm0
  1684. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  1685. vfmaddpd 2 * SIZE(CO1),%xmm0, %xmm7,%xmm7
  1686. vfmaddpd 4 * SIZE(CO1),%xmm0, %xmm10,%xmm10
  1687. vfmaddpd 6 * SIZE(CO1),%xmm0, %xmm13,%xmm13
  1688. vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5
  1689. vfmaddpd 2 * SIZE(CO1, LDC),%xmm0, %xmm8,%xmm8
  1690. vfmaddpd 4 * SIZE(CO1, LDC),%xmm0, %xmm11,%xmm11
  1691. vfmaddpd 6 * SIZE(CO1, LDC),%xmm0, %xmm14,%xmm14
  1692. vmovups %xmm4 , (CO1)
  1693. vmovups %xmm7 , 2 * SIZE(CO1)
  1694. vmovups %xmm10, 4 * SIZE(CO1)
  1695. vmovups %xmm13, 6 * SIZE(CO1)
  1696. vmovups %xmm5 , (CO1, LDC)
  1697. vmovups %xmm8 , 2 * SIZE(CO1, LDC)
  1698. vmovups %xmm11, 4 * SIZE(CO1, LDC)
  1699. vmovups %xmm14, 6 * SIZE(CO1, LDC)
  1700. addq $8 * SIZE, CO1 # coffset += 8
  1701. decq I # i --
  1702. jg .L2_11
  1703. ALIGN_4
  1704. /**************************************************************************
  1705. * Rest of M
  1706. ***************************************************************************/
  1707. .L2_20:
  1708. // Test rest of M
  1709. testq $7, M
  1710. jz .L2_60 // to next 2 lines of N
  1711. testq $4, M
  1712. jz .L2_30
  1713. ALIGN_4
  1714. .L2_21:
  1715. leaq BUFFER1, BO // first buffer to BO
  1716. addq $4 * SIZE, BO
  1717. vzeroall
  1718. movq K, %rax
  1719. andq $-8, %rax
  1720. je .L2_26
  1721. movq %rax, BI // Index for BO
  1722. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  1723. salq $2, %rax // rax = rax * 4 ; number of values
  1724. leaq (AO, %rax, 8), AO
  1725. leaq (BO, BI, 8), BO
  1726. negq BI
  1727. negq %rax
  1728. ALIGN_4
  1729. .L2_22:
  1730. prefetcht0 B_PR1(BO,BI,8)
  1731. KERNEL4x2_1(xxx)
  1732. KERNEL4x2_2(xxx)
  1733. KERNEL4x2_3(xxx)
  1734. KERNEL4x2_4(xxx)
  1735. prefetcht0 B_PR1(BO,BI,8)
  1736. KERNEL4x2_1(xxx)
  1737. KERNEL4x2_2(xxx)
  1738. KERNEL4x2_3(xxx)
  1739. KERNEL4x2_4(xxx)
  1740. je .L2_26
  1741. prefetcht0 B_PR1(BO,BI,8)
  1742. KERNEL4x2_1(xxx)
  1743. KERNEL4x2_2(xxx)
  1744. KERNEL4x2_3(xxx)
  1745. KERNEL4x2_4(xxx)
  1746. prefetcht0 B_PR1(BO,BI,8)
  1747. KERNEL4x2_1(xxx)
  1748. KERNEL4x2_2(xxx)
  1749. KERNEL4x2_3(xxx)
  1750. KERNEL4x2_4(xxx)
  1751. je .L2_26
  1752. jmp .L2_22
  1753. ALIGN_4
  1754. .L2_26:
  1755. movq K, %rax
  1756. andq $7, %rax # if (k & 1)
  1757. je .L2_29
  1758. movq %rax, BI // Index for BO
  1759. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  1760. salq $2, %rax // rax = rax * 4 ; number of values
  1761. leaq (AO, %rax, 8), AO
  1762. leaq (BO, BI, 8), BO
  1763. negq BI
  1764. negq %rax
  1765. ALIGN_4
  1766. .L2_27:
  1767. KERNEL4x2_SUB(xxx)
  1768. addq $2, BI
  1769. addq $4, %rax
  1770. jl .L2_27
  1771. ALIGN_4
  1772. .L2_29:
  1773. vmovddup ALPHA, %xmm0
  1774. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  1775. vfmaddpd 2 * SIZE(CO1),%xmm0, %xmm7,%xmm7
  1776. vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5
  1777. vfmaddpd 2 * SIZE(CO1, LDC),%xmm0, %xmm8,%xmm8
  1778. vmovups %xmm4 , (CO1)
  1779. vmovups %xmm7 , 2 * SIZE(CO1)
  1780. vmovups %xmm5 , (CO1, LDC)
  1781. vmovups %xmm8 , 2 * SIZE(CO1, LDC)
  1782. addq $4 * SIZE, CO1 # coffset += 4
  1783. ALIGN_4
  1784. .L2_30:
  1785. testq $2, M
  1786. jz .L2_40
  1787. ALIGN_4
  1788. .L2_31:
  1789. leaq BUFFER1, BO // first buffer to BO
  1790. addq $4 * SIZE, BO
  1791. vzeroall
  1792. movq K, %rax
  1793. andq $-8, %rax
  1794. je .L2_36
  1795. movq %rax, BI // Index for BO
  1796. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  1797. salq $1, %rax // rax = rax *2 ; number of values
  1798. leaq (AO, %rax, 8), AO
  1799. leaq (BO, BI, 8), BO
  1800. negq BI
  1801. negq %rax
  1802. ALIGN_4
  1803. .L2_32:
  1804. prefetcht0 B_PR1(BO,BI,8)
  1805. KERNEL2x2_1(xxx)
  1806. KERNEL2x2_2(xxx)
  1807. KERNEL2x2_3(xxx)
  1808. KERNEL2x2_4(xxx)
  1809. prefetcht0 B_PR1(BO,BI,8)
  1810. KERNEL2x2_1(xxx)
  1811. KERNEL2x2_2(xxx)
  1812. KERNEL2x2_3(xxx)
  1813. KERNEL2x2_4(xxx)
  1814. je .L2_36
  1815. prefetcht0 B_PR1(BO,BI,8)
  1816. KERNEL2x2_1(xxx)
  1817. KERNEL2x2_2(xxx)
  1818. KERNEL2x2_3(xxx)
  1819. KERNEL2x2_4(xxx)
  1820. prefetcht0 B_PR1(BO,BI,8)
  1821. KERNEL2x2_1(xxx)
  1822. KERNEL2x2_2(xxx)
  1823. KERNEL2x2_3(xxx)
  1824. KERNEL2x2_4(xxx)
  1825. je .L2_36
  1826. jmp .L2_32
  1827. ALIGN_4
  1828. .L2_36:
  1829. movq K, %rax
  1830. andq $7, %rax # if (k & 1)
  1831. je .L2_39
  1832. movq %rax, BI // Index for BO
  1833. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  1834. salq $1, %rax // rax = rax *2 ; number of values
  1835. leaq (AO, %rax, 8), AO
  1836. leaq (BO, BI, 8), BO
  1837. negq BI
  1838. negq %rax
  1839. ALIGN_4
  1840. .L2_37:
  1841. KERNEL2x2_SUB(xxx)
  1842. addq $2, BI
  1843. addq $2, %rax
  1844. jl .L2_37
  1845. ALIGN_4
  1846. .L2_39:
  1847. vmovddup ALPHA, %xmm0
  1848. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  1849. vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5
  1850. vmovups %xmm4 , (CO1)
  1851. vmovups %xmm5 , (CO1, LDC)
  1852. addq $2 * SIZE, CO1 # coffset += 2
  1853. ALIGN_4
  1854. .L2_40:
  1855. testq $1, M
  1856. jz .L2_60 // to next 2 lines of N
  1857. ALIGN_4
  1858. .L2_41:
  1859. leaq BUFFER1, BO // first buffer to BO
  1860. addq $4 * SIZE, BO
  1861. vzeroall
  1862. movq K, %rax
  1863. andq $-8, %rax
  1864. je .L2_46
  1865. movq %rax, BI // Index for BO
  1866. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  1867. leaq (AO, %rax, 8), AO
  1868. leaq (BO, BI, 8), BO
  1869. negq BI
  1870. negq %rax
  1871. ALIGN_4
  1872. .L2_42:
  1873. prefetcht0 B_PR1(BO,BI,8)
  1874. KERNEL1x2_1(xxx)
  1875. KERNEL1x2_2(xxx)
  1876. KERNEL1x2_3(xxx)
  1877. KERNEL1x2_4(xxx)
  1878. prefetcht0 B_PR1(BO,BI,8)
  1879. KERNEL1x2_1(xxx)
  1880. KERNEL1x2_2(xxx)
  1881. KERNEL1x2_3(xxx)
  1882. KERNEL1x2_4(xxx)
  1883. je .L2_46
  1884. prefetcht0 B_PR1(BO,BI,8)
  1885. KERNEL1x2_1(xxx)
  1886. KERNEL1x2_2(xxx)
  1887. KERNEL1x2_3(xxx)
  1888. KERNEL1x2_4(xxx)
  1889. prefetcht0 B_PR1(BO,BI,8)
  1890. KERNEL1x2_1(xxx)
  1891. KERNEL1x2_2(xxx)
  1892. KERNEL1x2_3(xxx)
  1893. KERNEL1x2_4(xxx)
  1894. je .L2_46
  1895. jmp .L2_42
  1896. ALIGN_4
  1897. .L2_46:
  1898. movq K, %rax
  1899. andq $7, %rax # if (k & 1)
  1900. je .L2_49
  1901. movq %rax, BI // Index for BO
  1902. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  1903. leaq (AO, %rax, 8), AO
  1904. leaq (BO, BI, 8), BO
  1905. negq BI
  1906. negq %rax
  1907. ALIGN_4
  1908. .L2_47:
  1909. KERNEL1x2_SUB(xxx)
  1910. addq $2, BI
  1911. addq $1, %rax
  1912. jl .L2_47
  1913. ALIGN_4
  1914. .L2_49:
  1915. vmovddup ALPHA, %xmm0
  1916. vfmaddsd (CO1),%xmm0, %xmm4,%xmm4
  1917. vfmaddsd (CO1, LDC),%xmm0, %xmm5,%xmm5
  1918. vmovsd %xmm4 , (CO1)
  1919. vmovsd %xmm5 , (CO1, LDC)
  1920. addq $1 * SIZE, CO1 # coffset += 1
  1921. ALIGN_4
  1922. .L2_60:
  1923. decq J // j --
  1924. jg .L2_01 // next 2 lines of N
  1925. .L1_0:
  1926. /************************************************************************************************
  1927. * Loop for Nmod6 % 2 > 0
  1928. *************************************************************************************************/
  1929. movq Nmod6, J
  1930. andq $1, J // j % 2
  1931. je .L999
  1932. ALIGN_4
  1933. .L1_01:
  1934. // copy to sub buffer
  1935. movq B, BO1
  1936. leaq BUFFER1, BO // first buffer to BO
  1937. movq K, %rax
  1938. ALIGN_4
  1939. .L1_02b:
  1940. vmovsd (BO1), %xmm0
  1941. vmovsd %xmm0, (BO)
  1942. addq $1*SIZE,BO1
  1943. addq $1*SIZE,BO
  1944. decq %rax
  1945. jnz .L1_02b
  1946. .L1_02c:
  1947. movq BO1, B // next offset of B
  1948. .L1_10:
  1949. movq C, CO1
  1950. leaq (C, LDC, 1), C // c += 1 * ldc
  1951. movq A, AO // aoffset = a
  1952. addq $16 * SIZE, AO
  1953. movq M, I
  1954. sarq $3, I // i = (m >> 3)
  1955. je .L1_20
  1956. ALIGN_4
  1957. .L1_11:
  1958. leaq BUFFER1, BO // first buffer to BO
  1959. addq $2 * SIZE, BO
  1960. vzeroall
  1961. movq K, %rax
  1962. andq $-8, %rax // K = K - ( K % 8 )
  1963. je .L1_16
  1964. movq %rax, BI // Index for BO
  1965. salq $3, %rax // rax = rax * 8 ; number of values
  1966. leaq (AO, %rax, 8), AO
  1967. leaq (BO, BI, 8), BO
  1968. negq BI
  1969. negq %rax
  1970. ALIGN_4
  1971. .L1_12:
  1972. prefetcht0 B_PR1(BO,BI,8)
  1973. KERNEL8x1_1(xxx)
  1974. KERNEL8x1_2(xxx)
  1975. KERNEL8x1_3(xxx)
  1976. KERNEL8x1_4(xxx)
  1977. KERNEL8x1_1(xxx)
  1978. KERNEL8x1_2(xxx)
  1979. KERNEL8x1_3(xxx)
  1980. KERNEL8x1_4(xxx)
  1981. je .L1_16
  1982. prefetcht0 B_PR1(BO,BI,8)
  1983. KERNEL8x1_1(xxx)
  1984. KERNEL8x1_2(xxx)
  1985. KERNEL8x1_3(xxx)
  1986. KERNEL8x1_4(xxx)
  1987. KERNEL8x1_1(xxx)
  1988. KERNEL8x1_2(xxx)
  1989. KERNEL8x1_3(xxx)
  1990. KERNEL8x1_4(xxx)
  1991. je .L1_16
  1992. jmp .L1_12
  1993. ALIGN_4
  1994. .L1_16:
  1995. movq K, %rax
  1996. andq $7, %rax # if (k & 1)
  1997. je .L1_19
  1998. movq %rax, BI // Index for BO
  1999. salq $3, %rax // rax = rax * 8 ; number of values
  2000. leaq (AO, %rax, 8), AO
  2001. leaq (BO, BI, 8), BO
  2002. negq BI
  2003. negq %rax
  2004. ALIGN_4
  2005. .L1_17:
  2006. KERNEL8x1_SUB(xxx)
  2007. addq $1, BI
  2008. addq $8, %rax
  2009. jl .L1_17
  2010. ALIGN_4
  2011. .L1_19:
  2012. vmovddup ALPHA, %xmm0
  2013. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  2014. vfmaddpd 2 * SIZE(CO1),%xmm0, %xmm7,%xmm7
  2015. vfmaddpd 4 * SIZE(CO1),%xmm0, %xmm10,%xmm10
  2016. vfmaddpd 6 * SIZE(CO1),%xmm0, %xmm13,%xmm13
  2017. vmovups %xmm4 , (CO1)
  2018. vmovups %xmm7 , 2 * SIZE(CO1)
  2019. vmovups %xmm10, 4 * SIZE(CO1)
  2020. vmovups %xmm13, 6 * SIZE(CO1)
  2021. addq $8 * SIZE, CO1 # coffset += 8
  2022. decq I # i --
  2023. jg .L1_11
  2024. ALIGN_4
  2025. /**************************************************************************
  2026. * Rest of M
  2027. ***************************************************************************/
  2028. .L1_20:
  2029. // Test rest of M
  2030. testq $7, M
  2031. jz .L999
  2032. testq $4, M
  2033. jz .L1_30
  2034. ALIGN_4
  2035. .L1_21:
  2036. leaq BUFFER1, BO // first buffer to BO
  2037. addq $2 * SIZE, BO
  2038. vzeroall
  2039. movq K, %rax
  2040. andq $-8, %rax
  2041. je .L1_26
  2042. movq %rax, BI // Index for BO
  2043. salq $2, %rax // rax = rax * 4 ; number of values
  2044. leaq (AO, %rax, 8), AO
  2045. leaq (BO, BI, 8), BO
  2046. negq BI
  2047. negq %rax
  2048. ALIGN_4
  2049. .L1_22:
  2050. prefetcht0 B_PR1(BO,BI,8)
  2051. KERNEL4x1_1(xxx)
  2052. KERNEL4x1_2(xxx)
  2053. KERNEL4x1_3(xxx)
  2054. KERNEL4x1_4(xxx)
  2055. KERNEL4x1_1(xxx)
  2056. KERNEL4x1_2(xxx)
  2057. KERNEL4x1_3(xxx)
  2058. KERNEL4x1_4(xxx)
  2059. je .L1_26
  2060. prefetcht0 B_PR1(BO,BI,8)
  2061. KERNEL4x1_1(xxx)
  2062. KERNEL4x1_2(xxx)
  2063. KERNEL4x1_3(xxx)
  2064. KERNEL4x1_4(xxx)
  2065. KERNEL4x1_1(xxx)
  2066. KERNEL4x1_2(xxx)
  2067. KERNEL4x1_3(xxx)
  2068. KERNEL4x1_4(xxx)
  2069. je .L1_26
  2070. jmp .L1_22
  2071. ALIGN_4
  2072. .L1_26:
  2073. movq K, %rax
  2074. andq $7, %rax # if (k & 1)
  2075. je .L1_29
  2076. movq %rax, BI // Index for BO
  2077. salq $2, %rax // rax = rax * 4 ; number of values
  2078. leaq (AO, %rax, 8), AO
  2079. leaq (BO, BI, 8), BO
  2080. negq BI
  2081. negq %rax
  2082. ALIGN_4
  2083. .L1_27:
  2084. KERNEL4x1_SUB(xxx)
  2085. addq $1, BI
  2086. addq $4, %rax
  2087. jl .L1_27
  2088. ALIGN_4
  2089. .L1_29:
  2090. vmovddup ALPHA, %xmm0
  2091. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  2092. vfmaddpd 2 * SIZE(CO1),%xmm0, %xmm7,%xmm7
  2093. vmovups %xmm4 , (CO1)
  2094. vmovups %xmm7 , 2 * SIZE(CO1)
  2095. addq $4 * SIZE, CO1 # coffset += 4
  2096. ALIGN_4
  2097. .L1_30:
  2098. testq $2, M
  2099. jz .L1_40
  2100. ALIGN_4
  2101. .L1_31:
  2102. leaq BUFFER1, BO // first buffer to BO
  2103. addq $2 * SIZE, BO
  2104. vzeroall
  2105. movq K, %rax
  2106. andq $-8, %rax
  2107. je .L1_36
  2108. movq %rax, BI // Index for BO
  2109. salq $1, %rax // rax = rax *2 ; number of values
  2110. leaq (AO, %rax, 8), AO
  2111. leaq (BO, BI, 8), BO
  2112. negq BI
  2113. negq %rax
  2114. ALIGN_4
  2115. .L1_32:
  2116. prefetcht0 B_PR1(BO,BI,8)
  2117. KERNEL2x1_1(xxx)
  2118. KERNEL2x1_2(xxx)
  2119. KERNEL2x1_3(xxx)
  2120. KERNEL2x1_4(xxx)
  2121. KERNEL2x1_1(xxx)
  2122. KERNEL2x1_2(xxx)
  2123. KERNEL2x1_3(xxx)
  2124. KERNEL2x1_4(xxx)
  2125. je .L1_36
  2126. KERNEL2x1_1(xxx)
  2127. KERNEL2x1_2(xxx)
  2128. KERNEL2x1_3(xxx)
  2129. KERNEL2x1_4(xxx)
  2130. KERNEL2x1_1(xxx)
  2131. KERNEL2x1_2(xxx)
  2132. KERNEL2x1_3(xxx)
  2133. KERNEL2x1_4(xxx)
  2134. je .L1_36
  2135. jmp .L1_32
  2136. ALIGN_4
  2137. .L1_36:
  2138. movq K, %rax
  2139. andq $7, %rax # if (k & 1)
  2140. je .L1_39
  2141. movq %rax, BI // Index for BO
  2142. salq $1, %rax // rax = rax *2 ; number of values
  2143. leaq (AO, %rax, 8), AO
  2144. leaq (BO, BI, 8), BO
  2145. negq BI
  2146. negq %rax
  2147. ALIGN_4
  2148. .L1_37:
  2149. KERNEL2x1_SUB(xxx)
  2150. addq $1, BI
  2151. addq $2, %rax
  2152. jl .L1_37
  2153. ALIGN_4
  2154. .L1_39:
  2155. vmovddup ALPHA, %xmm0
  2156. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  2157. vmovups %xmm4 , (CO1)
  2158. addq $2 * SIZE, CO1 # coffset += 2
  2159. ALIGN_4
  2160. .L1_40:
  2161. testq $1, M
  2162. jz .L999
  2163. ALIGN_4
  2164. .L1_41:
  2165. leaq BUFFER1, BO // first buffer to BO
  2166. addq $2 * SIZE, BO
  2167. vzeroall
  2168. movq K, %rax
  2169. andq $-8, %rax
  2170. je .L1_46
  2171. movq %rax, BI // Index for BO
  2172. leaq (AO, %rax, 8), AO
  2173. leaq (BO, BI, 8), BO
  2174. negq BI
  2175. negq %rax
  2176. ALIGN_4
  2177. .L1_42:
  2178. prefetcht0 B_PR1(BO,BI,8)
  2179. KERNEL1x1_1(xxx)
  2180. KERNEL1x1_2(xxx)
  2181. KERNEL1x1_3(xxx)
  2182. KERNEL1x1_4(xxx)
  2183. KERNEL1x1_1(xxx)
  2184. KERNEL1x1_2(xxx)
  2185. KERNEL1x1_3(xxx)
  2186. KERNEL1x1_4(xxx)
  2187. je .L1_46
  2188. prefetcht0 B_PR1(BO,BI,8)
  2189. KERNEL1x1_1(xxx)
  2190. KERNEL1x1_2(xxx)
  2191. KERNEL1x1_3(xxx)
  2192. KERNEL1x1_4(xxx)
  2193. KERNEL1x1_1(xxx)
  2194. KERNEL1x1_2(xxx)
  2195. KERNEL1x1_3(xxx)
  2196. KERNEL1x1_4(xxx)
  2197. je .L1_46
  2198. jmp .L1_42
  2199. ALIGN_4
  2200. .L1_46:
  2201. movq K, %rax
  2202. andq $7, %rax # if (k & 1)
  2203. je .L1_49
  2204. movq %rax, BI // Index for BO
  2205. leaq (AO, %rax, 8), AO
  2206. leaq (BO, BI, 8), BO
  2207. negq BI
  2208. negq %rax
  2209. ALIGN_4
  2210. .L1_47:
  2211. KERNEL1x1_SUB(xxx)
  2212. addq $1, BI
  2213. addq $1, %rax
  2214. jl .L1_47
  2215. ALIGN_4
  2216. .L1_49:
  2217. vmovddup ALPHA, %xmm0
  2218. vfmaddsd (CO1),%xmm0, %xmm4,%xmm4
  2219. vmovsd %xmm4 , (CO1)
  2220. addq $1 * SIZE, CO1 # coffset += 1
  2221. ALIGN_4
  2222. .L999:
  2223. movq SP, %rsp
  2224. movq (%rsp), %rbx
  2225. movq 8(%rsp), %rbp
  2226. movq 16(%rsp), %r12
  2227. movq 24(%rsp), %r13
  2228. movq 32(%rsp), %r14
  2229. movq 40(%rsp), %r15
  2230. #ifdef WINDOWS_ABI
  2231. movq 48(%rsp), %rdi
  2232. movq 56(%rsp), %rsi
  2233. movups 64(%rsp), %xmm6
  2234. movups 80(%rsp), %xmm7
  2235. movups 96(%rsp), %xmm8
  2236. movups 112(%rsp), %xmm9
  2237. movups 128(%rsp), %xmm10
  2238. movups 144(%rsp), %xmm11
  2239. movups 160(%rsp), %xmm12
  2240. movups 176(%rsp), %xmm13
  2241. movups 192(%rsp), %xmm14
  2242. movups 208(%rsp), %xmm15
  2243. #endif
  2244. addq $STACKSIZE, %rsp
  2245. ret
  2246. EPILOGUE
  2247. #else
  2248. /*************************************************************************************
  2249. * TRMM Kernel
  2250. *************************************************************************************/
  2251. PROLOGUE
  2252. PROFCODE
  2253. subq $STACKSIZE, %rsp
  2254. movq %rbx, (%rsp)
  2255. movq %rbp, 8(%rsp)
  2256. movq %r12, 16(%rsp)
  2257. movq %r13, 24(%rsp)
  2258. movq %r14, 32(%rsp)
  2259. movq %r15, 40(%rsp)
  2260. vzeroupper
  2261. #ifdef WINDOWS_ABI
  2262. movq %rdi, 48(%rsp)
  2263. movq %rsi, 56(%rsp)
  2264. movups %xmm6, 64(%rsp)
  2265. movups %xmm7, 80(%rsp)
  2266. movups %xmm8, 96(%rsp)
  2267. movups %xmm9, 112(%rsp)
  2268. movups %xmm10, 128(%rsp)
  2269. movups %xmm11, 144(%rsp)
  2270. movups %xmm12, 160(%rsp)
  2271. movups %xmm13, 176(%rsp)
  2272. movups %xmm14, 192(%rsp)
  2273. movups %xmm15, 208(%rsp)
  2274. movq ARG1, OLD_M
  2275. movq ARG2, OLD_N
  2276. movq ARG3, OLD_K
  2277. movq OLD_A, A
  2278. movq OLD_B, B
  2279. movq OLD_C, C
  2280. movq OLD_LDC, LDC
  2281. #ifdef TRMMKERNEL
  2282. movsd OLD_OFFSET, %xmm12
  2283. #endif
  2284. vmovaps %xmm3, %xmm0
  2285. #else
  2286. movq STACKSIZE + 8(%rsp), LDC
  2287. #ifdef TRMMKERNEL
  2288. movsd STACKSIZE + 16(%rsp), %xmm12
  2289. #endif
  2290. #endif
  2291. movq %rsp, SP # save old stack
  2292. subq $128 + L_BUFFER_SIZE, %rsp
  2293. andq $-4096, %rsp # align stack
  2294. STACK_TOUCH
  2295. cmpq $0, OLD_M
  2296. je .L999
  2297. cmpq $0, OLD_N
  2298. je .L999
  2299. cmpq $0, OLD_K
  2300. je .L999
  2301. movq OLD_M, M
  2302. movq OLD_N, N
  2303. movq OLD_K, K
  2304. vmovsd %xmm0, ALPHA
  2305. salq $BASE_SHIFT, LDC
  2306. movq N, %rax
  2307. xorq %rdx, %rdx
  2308. movq $2, %rdi
  2309. divq %rdi // N / 2
  2310. movq %rax, Ndiv6 // N / 2
  2311. movq %rdx, Nmod6 // N % 2
  2312. #ifdef TRMMKERNEL
  2313. vmovsd %xmm12, OFFSET
  2314. vmovsd %xmm12, KK
  2315. #ifndef LEFT
  2316. negq KK
  2317. #endif
  2318. #endif
  2319. movq Ndiv6, J
  2320. cmpq $0, J
  2321. je .L1_0
  2322. ALIGN_4
  2323. .L2_0:
  2324. .L2_01:
  2325. // copy to sub buffer
  2326. movq B, BO1
  2327. leaq BUFFER1, BO // first buffer to BO
  2328. movq K, %rax
  2329. ALIGN_4
  2330. .L2_02b:
  2331. vmovups (BO1), %xmm0
  2332. vmovups %xmm0, (BO)
  2333. addq $2*SIZE,BO1
  2334. addq $2*SIZE,BO
  2335. decq %rax
  2336. jnz .L2_02b
  2337. .L2_02c:
  2338. movq BO1, B // next offset of B
  2339. .L2_10:
  2340. movq C, CO1
  2341. leaq (C, LDC, 2), C // c += 2 * ldc
  2342. #if defined(TRMMKERNEL) && defined(LEFT)
  2343. movq OFFSET, %rax
  2344. movq %rax, KK
  2345. #endif
  2346. movq A, AO // aoffset = a
  2347. addq $16 * SIZE, AO
  2348. movq M, I
  2349. sarq $3, I // i = (m >> 3)
  2350. je .L2_20
  2351. ALIGN_4
  2352. .L2_11:
  2353. #if !defined(TRMMKERNEL) || \
  2354. (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  2355. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  2356. leaq BUFFER1, BO // first buffer to BO
  2357. addq $4 * SIZE, BO
  2358. #else
  2359. movq KK, %rax
  2360. leaq BUFFER1, BO // first buffer to BO
  2361. addq $4 * SIZE, BO
  2362. movq %rax, BI // Index for BO
  2363. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2364. leaq (BO, BI, 8), BO
  2365. salq $3, %rax // rax = rax * 8 ; number of values
  2366. leaq (AO, %rax, 8), AO
  2367. #endif
  2368. vzeroall
  2369. #ifndef TRMMKERNEL
  2370. movq K, %rax
  2371. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  2372. movq K, %rax
  2373. subq KK, %rax
  2374. movq %rax, KKK
  2375. #else
  2376. movq KK, %rax
  2377. #ifdef LEFT
  2378. addq $8, %rax // number of values in AO
  2379. #else
  2380. addq $2, %rax // number of values in BO
  2381. #endif
  2382. movq %rax, KKK
  2383. #endif
  2384. andq $-8, %rax // K = K - ( K % 8 )
  2385. je .L2_16
  2386. movq %rax, BI // Index for BO
  2387. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2388. salq $3, %rax // rax = rax * 8 ; number of values
  2389. leaq (AO, %rax, 8), AO
  2390. leaq (BO, BI, 8), BO
  2391. negq BI
  2392. negq %rax
  2393. ALIGN_4
  2394. .L2_12:
  2395. prefetcht0 B_PR1(BO,BI,8)
  2396. KERNEL8x2_1(xxx)
  2397. KERNEL8x2_2(xxx)
  2398. KERNEL8x2_3(xxx)
  2399. KERNEL8x2_4(xxx)
  2400. prefetcht0 B_PR1(BO,BI,8)
  2401. KERNEL8x2_1(xxx)
  2402. KERNEL8x2_2(xxx)
  2403. KERNEL8x2_3(xxx)
  2404. KERNEL8x2_4(xxx)
  2405. je .L2_16
  2406. prefetcht0 B_PR1(BO,BI,8)
  2407. KERNEL8x2_1(xxx)
  2408. KERNEL8x2_2(xxx)
  2409. KERNEL8x2_3(xxx)
  2410. KERNEL8x2_4(xxx)
  2411. prefetcht0 B_PR1(BO,BI,8)
  2412. KERNEL8x2_1(xxx)
  2413. KERNEL8x2_2(xxx)
  2414. KERNEL8x2_3(xxx)
  2415. KERNEL8x2_4(xxx)
  2416. je .L2_16
  2417. jmp .L2_12
  2418. ALIGN_4
  2419. .L2_16:
  2420. #ifndef TRMMKERNEL
  2421. movq K, %rax
  2422. #else
  2423. movq KKK, %rax
  2424. #endif
  2425. andq $7, %rax # if (k & 1)
  2426. je .L2_19
  2427. movq %rax, BI // Index for BO
  2428. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2429. salq $3, %rax // rax = rax * 8 ; number of values
  2430. leaq (AO, %rax, 8), AO
  2431. leaq (BO, BI, 8), BO
  2432. negq BI
  2433. negq %rax
  2434. ALIGN_4
  2435. .L2_17:
  2436. KERNEL8x2_SUB(xxx)
  2437. addq $2, BI
  2438. addq $8, %rax
  2439. jl .L2_17
  2440. ALIGN_4
  2441. .L2_19:
  2442. vmovddup ALPHA, %xmm0
  2443. #ifndef TRMMKERNEL
  2444. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  2445. vfmaddpd 2 * SIZE(CO1),%xmm0, %xmm7,%xmm7
  2446. vfmaddpd 4 * SIZE(CO1),%xmm0, %xmm10,%xmm10
  2447. vfmaddpd 6 * SIZE(CO1),%xmm0, %xmm13,%xmm13
  2448. vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5
  2449. vfmaddpd 2 * SIZE(CO1, LDC),%xmm0, %xmm8,%xmm8
  2450. vfmaddpd 4 * SIZE(CO1, LDC),%xmm0, %xmm11,%xmm11
  2451. vfmaddpd 6 * SIZE(CO1, LDC),%xmm0, %xmm14,%xmm14
  2452. #else
  2453. vmulpd %xmm0, %xmm4,%xmm4
  2454. vmulpd %xmm0, %xmm7,%xmm7
  2455. vmulpd %xmm0, %xmm10,%xmm10
  2456. vmulpd %xmm0, %xmm13,%xmm13
  2457. vmulpd %xmm0, %xmm5,%xmm5
  2458. vmulpd %xmm0, %xmm8,%xmm8
  2459. vmulpd %xmm0, %xmm11,%xmm11
  2460. vmulpd %xmm0, %xmm14,%xmm14
  2461. #endif
  2462. vmovups %xmm4 , (CO1)
  2463. vmovups %xmm7 , 2 * SIZE(CO1)
  2464. vmovups %xmm10, 4 * SIZE(CO1)
  2465. vmovups %xmm13, 6 * SIZE(CO1)
  2466. vmovups %xmm5 , (CO1, LDC)
  2467. vmovups %xmm8 , 2 * SIZE(CO1, LDC)
  2468. vmovups %xmm11, 4 * SIZE(CO1, LDC)
  2469. vmovups %xmm14, 6 * SIZE(CO1, LDC)
  2470. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  2471. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  2472. movq K, %rax
  2473. subq KKK, %rax
  2474. movq %rax, BI // Index for BO
  2475. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2476. leaq (BO, BI, 8), BO
  2477. salq $3, %rax // rax = rax * 8 ; number of values
  2478. leaq (AO, %rax, 8), AO
  2479. #endif
  2480. #if defined(TRMMKERNEL) && defined(LEFT)
  2481. addq $8, KK
  2482. #endif
  2483. addq $8 * SIZE, CO1 # coffset += 8
  2484. decq I # i --
  2485. jg .L2_11
  2486. ALIGN_4
  2487. /**************************************************************************
  2488. * Rest of M
  2489. ***************************************************************************/
  2490. .L2_20:
  2491. // Test rest of M
  2492. testq $7, M
  2493. jz .L2_60 // to next 2 lines of N
  2494. testq $4, M
  2495. jz .L2_30
  2496. ALIGN_4
  2497. .L2_21:
  2498. #if !defined(TRMMKERNEL) || \
  2499. (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  2500. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  2501. leaq BUFFER1, BO // first buffer to BO
  2502. addq $4 * SIZE, BO
  2503. #else
  2504. movq KK, %rax
  2505. leaq BUFFER1, BO // first buffer to BO
  2506. addq $4 * SIZE, BO
  2507. movq %rax, BI // Index for BO
  2508. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2509. leaq (BO, BI, 8), BO
  2510. salq $2, %rax // rax = rax * 4 ; number of values
  2511. leaq (AO, %rax, 8), AO
  2512. #endif
  2513. vzeroall
  2514. #ifndef TRMMKERNEL
  2515. movq K, %rax
  2516. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  2517. movq K, %rax
  2518. subq KK, %rax
  2519. movq %rax, KKK
  2520. #else
  2521. movq KK, %rax
  2522. #ifdef LEFT
  2523. addq $4, %rax // number of values in AO
  2524. #else
  2525. addq $2, %rax // number of values in BO
  2526. #endif
  2527. movq %rax, KKK
  2528. #endif
  2529. andq $-8, %rax
  2530. je .L2_26
  2531. movq %rax, BI // Index for BO
  2532. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2533. salq $2, %rax // rax = rax * 4 ; number of values
  2534. leaq (AO, %rax, 8), AO
  2535. leaq (BO, BI, 8), BO
  2536. negq BI
  2537. negq %rax
  2538. ALIGN_4
  2539. .L2_22:
  2540. prefetcht0 B_PR1(BO,BI,8)
  2541. KERNEL4x2_1(xxx)
  2542. KERNEL4x2_2(xxx)
  2543. KERNEL4x2_3(xxx)
  2544. KERNEL4x2_4(xxx)
  2545. prefetcht0 B_PR1(BO,BI,8)
  2546. KERNEL4x2_1(xxx)
  2547. KERNEL4x2_2(xxx)
  2548. KERNEL4x2_3(xxx)
  2549. KERNEL4x2_4(xxx)
  2550. je .L2_26
  2551. prefetcht0 B_PR1(BO,BI,8)
  2552. KERNEL4x2_1(xxx)
  2553. KERNEL4x2_2(xxx)
  2554. KERNEL4x2_3(xxx)
  2555. KERNEL4x2_4(xxx)
  2556. prefetcht0 B_PR1(BO,BI,8)
  2557. KERNEL4x2_1(xxx)
  2558. KERNEL4x2_2(xxx)
  2559. KERNEL4x2_3(xxx)
  2560. KERNEL4x2_4(xxx)
  2561. je .L2_26
  2562. jmp .L2_22
  2563. ALIGN_4
  2564. .L2_26:
  2565. #ifndef TRMMKERNEL
  2566. movq K, %rax
  2567. #else
  2568. movq KKK, %rax
  2569. #endif
  2570. andq $7, %rax # if (k & 1)
  2571. je .L2_29
  2572. movq %rax, BI // Index for BO
  2573. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2574. salq $2, %rax // rax = rax * 4 ; number of values
  2575. leaq (AO, %rax, 8), AO
  2576. leaq (BO, BI, 8), BO
  2577. negq BI
  2578. negq %rax
  2579. ALIGN_4
  2580. .L2_27:
  2581. KERNEL4x2_SUB(xxx)
  2582. addq $2, BI
  2583. addq $4, %rax
  2584. jl .L2_27
  2585. ALIGN_4
  2586. .L2_29:
  2587. vmovddup ALPHA, %xmm0
  2588. #ifndef TRMMKERNEL
  2589. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  2590. vfmaddpd 2 * SIZE(CO1),%xmm0, %xmm7,%xmm7
  2591. vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5
  2592. vfmaddpd 2 * SIZE(CO1, LDC),%xmm0, %xmm8,%xmm8
  2593. #else
  2594. vmulpd %xmm0, %xmm4,%xmm4
  2595. vmulpd %xmm0, %xmm7,%xmm7
  2596. vmulpd %xmm0, %xmm5,%xmm5
  2597. vmulpd %xmm0, %xmm8,%xmm8
  2598. #endif
  2599. vmovups %xmm4 , (CO1)
  2600. vmovups %xmm7 , 2 * SIZE(CO1)
  2601. vmovups %xmm5 , (CO1, LDC)
  2602. vmovups %xmm8 , 2 * SIZE(CO1, LDC)
  2603. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  2604. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  2605. movq K, %rax
  2606. subq KKK, %rax
  2607. movq %rax, BI // Index for BO
  2608. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2609. leaq (BO, BI, 8), BO
  2610. salq $2, %rax // rax = rax * 4 ; number of values
  2611. leaq (AO, %rax, 8), AO
  2612. #endif
  2613. #if defined(TRMMKERNEL) && defined(LEFT)
  2614. addq $4, KK
  2615. #endif
  2616. addq $4 * SIZE, CO1 # coffset += 4
  2617. ALIGN_4
  2618. .L2_30:
  2619. testq $2, M
  2620. jz .L2_40
  2621. ALIGN_4
  2622. .L2_31:
  2623. #if !defined(TRMMKERNEL) || \
  2624. (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  2625. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  2626. leaq BUFFER1, BO // first buffer to BO
  2627. addq $4 * SIZE, BO
  2628. #else
  2629. movq KK, %rax
  2630. leaq BUFFER1, BO // first buffer to BO
  2631. addq $4 * SIZE, BO
  2632. movq %rax, BI // Index for BO
  2633. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2634. leaq (BO, BI, 8), BO
  2635. salq $1, %rax // rax = rax * 2 ; number of values
  2636. leaq (AO, %rax, 8), AO
  2637. #endif
  2638. vzeroall
  2639. #ifndef TRMMKERNEL
  2640. movq K, %rax
  2641. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  2642. movq K, %rax
  2643. subq KK, %rax
  2644. movq %rax, KKK
  2645. #else
  2646. movq KK, %rax
  2647. #ifdef LEFT
  2648. addq $2, %rax // number of values in AO
  2649. #else
  2650. addq $2, %rax // number of values in BO
  2651. #endif
  2652. movq %rax, KKK
  2653. #endif
  2654. andq $-8, %rax
  2655. je .L2_36
  2656. movq %rax, BI // Index for BO
  2657. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2658. salq $1, %rax // rax = rax *2 ; number of values
  2659. leaq (AO, %rax, 8), AO
  2660. leaq (BO, BI, 8), BO
  2661. negq BI
  2662. negq %rax
  2663. ALIGN_4
  2664. .L2_32:
  2665. prefetcht0 B_PR1(BO,BI,8)
  2666. KERNEL2x2_1(xxx)
  2667. KERNEL2x2_2(xxx)
  2668. KERNEL2x2_3(xxx)
  2669. KERNEL2x2_4(xxx)
  2670. prefetcht0 B_PR1(BO,BI,8)
  2671. KERNEL2x2_1(xxx)
  2672. KERNEL2x2_2(xxx)
  2673. KERNEL2x2_3(xxx)
  2674. KERNEL2x2_4(xxx)
  2675. je .L2_36
  2676. prefetcht0 B_PR1(BO,BI,8)
  2677. KERNEL2x2_1(xxx)
  2678. KERNEL2x2_2(xxx)
  2679. KERNEL2x2_3(xxx)
  2680. KERNEL2x2_4(xxx)
  2681. prefetcht0 B_PR1(BO,BI,8)
  2682. KERNEL2x2_1(xxx)
  2683. KERNEL2x2_2(xxx)
  2684. KERNEL2x2_3(xxx)
  2685. KERNEL2x2_4(xxx)
  2686. je .L2_36
  2687. jmp .L2_32
  2688. ALIGN_4
  2689. .L2_36:
  2690. #ifndef TRMMKERNEL
  2691. movq K, %rax
  2692. #else
  2693. movq KKK, %rax
  2694. #endif
  2695. andq $7, %rax # if (k & 1)
  2696. je .L2_39
  2697. movq %rax, BI // Index for BO
  2698. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2699. salq $1, %rax // rax = rax *2 ; number of values
  2700. leaq (AO, %rax, 8), AO
  2701. leaq (BO, BI, 8), BO
  2702. negq BI
  2703. negq %rax
  2704. ALIGN_4
  2705. .L2_37:
  2706. KERNEL2x2_SUB(xxx)
  2707. addq $2, BI
  2708. addq $2, %rax
  2709. jl .L2_37
  2710. ALIGN_4
  2711. .L2_39:
  2712. vmovddup ALPHA, %xmm0
  2713. #ifndef TRMMKERNEL
  2714. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  2715. vfmaddpd (CO1, LDC),%xmm0, %xmm5,%xmm5
  2716. #else
  2717. vmulpd %xmm0, %xmm4,%xmm4
  2718. vmulpd %xmm0, %xmm5,%xmm5
  2719. #endif
  2720. vmovups %xmm4 , (CO1)
  2721. vmovups %xmm5 , (CO1, LDC)
  2722. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  2723. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  2724. movq K, %rax
  2725. subq KKK, %rax
  2726. movq %rax, BI // Index for BO
  2727. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2728. leaq (BO, BI, 8), BO
  2729. salq $1, %rax // rax = rax * 2 ; number of values
  2730. leaq (AO, %rax, 8), AO
  2731. #endif
  2732. #if defined(TRMMKERNEL) && defined(LEFT)
  2733. addq $2, KK
  2734. #endif
  2735. addq $2 * SIZE, CO1 # coffset += 2
  2736. ALIGN_4
  2737. .L2_40:
  2738. testq $1, M
  2739. jz .L2_60 // to next 2 lines of N
  2740. ALIGN_4
  2741. .L2_41:
  2742. #if !defined(TRMMKERNEL) || \
  2743. (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  2744. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  2745. leaq BUFFER1, BO // first buffer to BO
  2746. addq $4 * SIZE, BO
  2747. #else
  2748. movq KK, %rax
  2749. leaq BUFFER1, BO // first buffer to BO
  2750. addq $4 * SIZE, BO
  2751. movq %rax, BI // Index for BO
  2752. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2753. leaq (BO, BI, 8), BO
  2754. leaq (AO, %rax, 8), AO
  2755. #endif
  2756. vzeroall
  2757. #ifndef TRMMKERNEL
  2758. movq K, %rax
  2759. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  2760. movq K, %rax
  2761. subq KK, %rax
  2762. movq %rax, KKK
  2763. #else
  2764. movq KK, %rax
  2765. #ifdef LEFT
  2766. addq $1, %rax // number of values in AO
  2767. #else
  2768. addq $2, %rax // number of values in BO
  2769. #endif
  2770. movq %rax, KKK
  2771. #endif
  2772. andq $-8, %rax
  2773. je .L2_46
  2774. movq %rax, BI // Index for BO
  2775. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2776. leaq (AO, %rax, 8), AO
  2777. leaq (BO, BI, 8), BO
  2778. negq BI
  2779. negq %rax
  2780. ALIGN_4
  2781. .L2_42:
  2782. prefetcht0 B_PR1(BO,BI,8)
  2783. KERNEL1x2_1(xxx)
  2784. KERNEL1x2_2(xxx)
  2785. KERNEL1x2_3(xxx)
  2786. KERNEL1x2_4(xxx)
  2787. prefetcht0 B_PR1(BO,BI,8)
  2788. KERNEL1x2_1(xxx)
  2789. KERNEL1x2_2(xxx)
  2790. KERNEL1x2_3(xxx)
  2791. KERNEL1x2_4(xxx)
  2792. je .L2_46
  2793. prefetcht0 B_PR1(BO,BI,8)
  2794. KERNEL1x2_1(xxx)
  2795. KERNEL1x2_2(xxx)
  2796. KERNEL1x2_3(xxx)
  2797. KERNEL1x2_4(xxx)
  2798. prefetcht0 B_PR1(BO,BI,8)
  2799. KERNEL1x2_1(xxx)
  2800. KERNEL1x2_2(xxx)
  2801. KERNEL1x2_3(xxx)
  2802. KERNEL1x2_4(xxx)
  2803. je .L2_46
  2804. jmp .L2_42
  2805. ALIGN_4
  2806. .L2_46:
  2807. #ifndef TRMMKERNEL
  2808. movq K, %rax
  2809. #else
  2810. movq KKK, %rax
  2811. #endif
  2812. andq $7, %rax # if (k & 1)
  2813. je .L2_49
  2814. movq %rax, BI // Index for BO
  2815. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2816. leaq (AO, %rax, 8), AO
  2817. leaq (BO, BI, 8), BO
  2818. negq BI
  2819. negq %rax
  2820. ALIGN_4
  2821. .L2_47:
  2822. KERNEL1x2_SUB(xxx)
  2823. addq $2, BI
  2824. addq $1, %rax
  2825. jl .L2_47
  2826. ALIGN_4
  2827. .L2_49:
  2828. vmovddup ALPHA, %xmm0
  2829. #ifndef TRMMKERNEL
  2830. vfmaddsd (CO1),%xmm0, %xmm4,%xmm4
  2831. vfmaddsd (CO1, LDC),%xmm0, %xmm5,%xmm5
  2832. #else
  2833. vmulsd %xmm0, %xmm4,%xmm4
  2834. vmulsd %xmm0, %xmm5,%xmm5
  2835. #endif
  2836. vmovsd %xmm4 , (CO1)
  2837. vmovsd %xmm5 , (CO1, LDC)
  2838. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  2839. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  2840. movq K, %rax
  2841. subq KKK, %rax
  2842. movq %rax, BI // Index for BO
  2843. leaq (BI,BI,1), BI // BI = BI * 2 ; number of values
  2844. leaq (BO, BI, 8), BO
  2845. leaq (AO, %rax, 8), AO
  2846. #endif
  2847. #if defined(TRMMKERNEL) && defined(LEFT)
  2848. addq $1, KK
  2849. #endif
  2850. addq $1 * SIZE, CO1 # coffset += 1
  2851. ALIGN_4
  2852. .L2_60:
  2853. #if defined(TRMMKERNEL) && !defined(LEFT)
  2854. addq $2, KK
  2855. #endif
  2856. decq J // j --
  2857. jg .L2_01 // next 2 lines of N
  2858. .L1_0:
  2859. /************************************************************************************************
  2860. * Loop for Nmod6 % 2 > 0
  2861. *************************************************************************************************/
  2862. movq Nmod6, J
  2863. andq $1, J // j % 2
  2864. je .L999
  2865. ALIGN_4
  2866. .L1_01:
  2867. // copy to sub buffer
  2868. movq B, BO1
  2869. leaq BUFFER1, BO // first buffer to BO
  2870. movq K, %rax
  2871. ALIGN_4
  2872. .L1_02b:
  2873. vmovsd (BO1), %xmm0
  2874. vmovsd %xmm0, (BO)
  2875. addq $1*SIZE,BO1
  2876. addq $1*SIZE,BO
  2877. decq %rax
  2878. jnz .L1_02b
  2879. .L1_02c:
  2880. movq BO1, B // next offset of B
  2881. .L1_10:
  2882. movq C, CO1
  2883. leaq (C, LDC, 1), C // c += 1 * ldc
  2884. #if defined(TRMMKERNEL) && defined(LEFT)
  2885. movq OFFSET, %rax
  2886. movq %rax, KK
  2887. #endif
  2888. movq A, AO // aoffset = a
  2889. addq $16 * SIZE, AO
  2890. movq M, I
  2891. sarq $3, I // i = (m >> 3)
  2892. je .L1_20
  2893. ALIGN_4
  2894. .L1_11:
  2895. #if !defined(TRMMKERNEL) || \
  2896. (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  2897. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  2898. leaq BUFFER1, BO // first buffer to BO
  2899. addq $2 * SIZE, BO
  2900. #else
  2901. movq KK, %rax
  2902. leaq BUFFER1, BO // first buffer to BO
  2903. addq $2 * SIZE, BO
  2904. movq %rax, BI // Index for BO
  2905. leaq (BO, BI, 8), BO
  2906. salq $3, %rax // rax = rax * 8 ; number of values
  2907. leaq (AO, %rax, 8), AO
  2908. #endif
  2909. vzeroall
  2910. #ifndef TRMMKERNEL
  2911. movq K, %rax
  2912. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  2913. movq K, %rax
  2914. subq KK, %rax
  2915. movq %rax, KKK
  2916. #else
  2917. movq KK, %rax
  2918. #ifdef LEFT
  2919. addq $8, %rax // number of values in AO
  2920. #else
  2921. addq $1, %rax // number of values in BO
  2922. #endif
  2923. movq %rax, KKK
  2924. #endif
  2925. andq $-8, %rax // K = K - ( K % 8 )
  2926. je .L1_16
  2927. movq %rax, BI // Index for BO
  2928. salq $3, %rax // rax = rax * 8 ; number of values
  2929. leaq (AO, %rax, 8), AO
  2930. leaq (BO, BI, 8), BO
  2931. negq BI
  2932. negq %rax
  2933. ALIGN_4
  2934. .L1_12:
  2935. prefetcht0 B_PR1(BO,BI,8)
  2936. KERNEL8x1_1(xxx)
  2937. KERNEL8x1_2(xxx)
  2938. KERNEL8x1_3(xxx)
  2939. KERNEL8x1_4(xxx)
  2940. KERNEL8x1_1(xxx)
  2941. KERNEL8x1_2(xxx)
  2942. KERNEL8x1_3(xxx)
  2943. KERNEL8x1_4(xxx)
  2944. je .L1_16
  2945. prefetcht0 B_PR1(BO,BI,8)
  2946. KERNEL8x1_1(xxx)
  2947. KERNEL8x1_2(xxx)
  2948. KERNEL8x1_3(xxx)
  2949. KERNEL8x1_4(xxx)
  2950. KERNEL8x1_1(xxx)
  2951. KERNEL8x1_2(xxx)
  2952. KERNEL8x1_3(xxx)
  2953. KERNEL8x1_4(xxx)
  2954. je .L1_16
  2955. jmp .L1_12
  2956. ALIGN_4
  2957. .L1_16:
  2958. #ifndef TRMMKERNEL
  2959. movq K, %rax
  2960. #else
  2961. movq KKK, %rax
  2962. #endif
  2963. andq $7, %rax # if (k & 1)
  2964. je .L1_19
  2965. movq %rax, BI // Index for BO
  2966. salq $3, %rax // rax = rax * 8 ; number of values
  2967. leaq (AO, %rax, 8), AO
  2968. leaq (BO, BI, 8), BO
  2969. negq BI
  2970. negq %rax
  2971. ALIGN_4
  2972. .L1_17:
  2973. KERNEL8x1_SUB(xxx)
  2974. addq $1, BI
  2975. addq $8, %rax
  2976. jl .L1_17
  2977. ALIGN_4
  2978. .L1_19:
  2979. vmovddup ALPHA, %xmm0
  2980. #ifndef TRMMKERNEL
  2981. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  2982. vfmaddpd 2 * SIZE(CO1),%xmm0, %xmm7,%xmm7
  2983. vfmaddpd 4 * SIZE(CO1),%xmm0, %xmm10,%xmm10
  2984. vfmaddpd 6 * SIZE(CO1),%xmm0, %xmm13,%xmm13
  2985. #else
  2986. vmulpd %xmm0, %xmm4,%xmm4
  2987. vmulpd %xmm0, %xmm7,%xmm7
  2988. vmulpd %xmm0, %xmm10,%xmm10
  2989. vmulpd %xmm0, %xmm13,%xmm13
  2990. #endif
  2991. vmovups %xmm4 , (CO1)
  2992. vmovups %xmm7 , 2 * SIZE(CO1)
  2993. vmovups %xmm10, 4 * SIZE(CO1)
  2994. vmovups %xmm13, 6 * SIZE(CO1)
  2995. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  2996. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  2997. movq K, %rax
  2998. subq KKK, %rax
  2999. movq %rax, BI // Index for BO
  3000. leaq (BO, BI, 8), BO
  3001. salq $3, %rax // rax = rax * 8 ; number of values
  3002. leaq (AO, %rax, 8), AO
  3003. #endif
  3004. #if defined(TRMMKERNEL) && defined(LEFT)
  3005. addq $8, KK
  3006. #endif
  3007. addq $8 * SIZE, CO1 # coffset += 8
  3008. decq I # i --
  3009. jg .L1_11
  3010. ALIGN_4
  3011. /**************************************************************************
  3012. * Rest of M
  3013. ***************************************************************************/
  3014. .L1_20:
  3015. // Test rest of M
  3016. testq $7, M
  3017. jz .L999
  3018. testq $4, M
  3019. jz .L1_30
  3020. ALIGN_4
  3021. .L1_21:
  3022. #if !defined(TRMMKERNEL) || \
  3023. (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  3024. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  3025. leaq BUFFER1, BO // first buffer to BO
  3026. addq $2 * SIZE, BO
  3027. #else
  3028. movq KK, %rax
  3029. leaq BUFFER1, BO // first buffer to BO
  3030. addq $2 * SIZE, BO
  3031. movq %rax, BI // Index for BO
  3032. leaq (BO, BI, 8), BO
  3033. salq $2, %rax // rax = rax * 4 ; number of values
  3034. leaq (AO, %rax, 8), AO
  3035. #endif
  3036. vzeroall
  3037. #ifndef TRMMKERNEL
  3038. movq K, %rax
  3039. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  3040. movq K, %rax
  3041. subq KK, %rax
  3042. movq %rax, KKK
  3043. #else
  3044. movq KK, %rax
  3045. #ifdef LEFT
  3046. addq $4, %rax // number of values in AO
  3047. #else
  3048. addq $1, %rax // number of values in BO
  3049. #endif
  3050. movq %rax, KKK
  3051. #endif
  3052. andq $-8, %rax
  3053. je .L1_26
  3054. movq %rax, BI // Index for BO
  3055. salq $2, %rax // rax = rax * 4 ; number of values
  3056. leaq (AO, %rax, 8), AO
  3057. leaq (BO, BI, 8), BO
  3058. negq BI
  3059. negq %rax
  3060. ALIGN_4
  3061. .L1_22:
  3062. prefetcht0 B_PR1(BO,BI,8)
  3063. KERNEL4x1_1(xxx)
  3064. KERNEL4x1_2(xxx)
  3065. KERNEL4x1_3(xxx)
  3066. KERNEL4x1_4(xxx)
  3067. KERNEL4x1_1(xxx)
  3068. KERNEL4x1_2(xxx)
  3069. KERNEL4x1_3(xxx)
  3070. KERNEL4x1_4(xxx)
  3071. je .L1_26
  3072. prefetcht0 B_PR1(BO,BI,8)
  3073. KERNEL4x1_1(xxx)
  3074. KERNEL4x1_2(xxx)
  3075. KERNEL4x1_3(xxx)
  3076. KERNEL4x1_4(xxx)
  3077. KERNEL4x1_1(xxx)
  3078. KERNEL4x1_2(xxx)
  3079. KERNEL4x1_3(xxx)
  3080. KERNEL4x1_4(xxx)
  3081. je .L1_26
  3082. jmp .L1_22
  3083. ALIGN_4
  3084. .L1_26:
  3085. #ifndef TRMMKERNEL
  3086. movq K, %rax
  3087. #else
  3088. movq KKK, %rax
  3089. #endif
  3090. andq $7, %rax # if (k & 1)
  3091. je .L1_29
  3092. movq %rax, BI // Index for BO
  3093. salq $2, %rax // rax = rax * 4 ; number of values
  3094. leaq (AO, %rax, 8), AO
  3095. leaq (BO, BI, 8), BO
  3096. negq BI
  3097. negq %rax
  3098. ALIGN_4
  3099. .L1_27:
  3100. KERNEL4x1_SUB(xxx)
  3101. addq $1, BI
  3102. addq $4, %rax
  3103. jl .L1_27
  3104. ALIGN_4
  3105. .L1_29:
  3106. vmovddup ALPHA, %xmm0
  3107. #ifndef TRMMKERNEL
  3108. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  3109. vfmaddpd 2 * SIZE(CO1),%xmm0, %xmm7,%xmm7
  3110. #else
  3111. vmulpd %xmm0, %xmm4,%xmm4
  3112. vmulpd %xmm0, %xmm7,%xmm7
  3113. #endif
  3114. vmovups %xmm4 , (CO1)
  3115. vmovups %xmm7 , 2 * SIZE(CO1)
  3116. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  3117. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  3118. movq K, %rax
  3119. subq KKK, %rax
  3120. movq %rax, BI // Index for BO
  3121. leaq (BO, BI, 8), BO
  3122. salq $2, %rax // rax = rax * 4 ; number of values
  3123. leaq (AO, %rax, 8), AO
  3124. #endif
  3125. #if defined(TRMMKERNEL) && defined(LEFT)
  3126. addq $4, KK
  3127. #endif
  3128. addq $4 * SIZE, CO1 # coffset += 4
  3129. ALIGN_4
  3130. .L1_30:
  3131. testq $2, M
  3132. jz .L1_40
  3133. ALIGN_4
  3134. .L1_31:
  3135. #if !defined(TRMMKERNEL) || \
  3136. (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  3137. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  3138. leaq BUFFER1, BO // first buffer to BO
  3139. addq $2 * SIZE, BO
  3140. #else
  3141. movq KK, %rax
  3142. leaq BUFFER1, BO // first buffer to BO
  3143. addq $2 * SIZE, BO
  3144. movq %rax, BI // Index for BO
  3145. leaq (BO, BI, 8), BO
  3146. salq $1, %rax // rax = rax * 2 ; number of values
  3147. leaq (AO, %rax, 8), AO
  3148. #endif
  3149. vzeroall
  3150. #ifndef TRMMKERNEL
  3151. movq K, %rax
  3152. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  3153. movq K, %rax
  3154. subq KK, %rax
  3155. movq %rax, KKK
  3156. #else
  3157. movq KK, %rax
  3158. #ifdef LEFT
  3159. addq $2, %rax // number of values in AO
  3160. #else
  3161. addq $1, %rax // number of values in BO
  3162. #endif
  3163. movq %rax, KKK
  3164. #endif
  3165. andq $-8, %rax
  3166. je .L1_36
  3167. movq %rax, BI // Index for BO
  3168. salq $1, %rax // rax = rax *2 ; number of values
  3169. leaq (AO, %rax, 8), AO
  3170. leaq (BO, BI, 8), BO
  3171. negq BI
  3172. negq %rax
  3173. ALIGN_4
  3174. .L1_32:
  3175. prefetcht0 B_PR1(BO,BI,8)
  3176. KERNEL2x1_1(xxx)
  3177. KERNEL2x1_2(xxx)
  3178. KERNEL2x1_3(xxx)
  3179. KERNEL2x1_4(xxx)
  3180. KERNEL2x1_1(xxx)
  3181. KERNEL2x1_2(xxx)
  3182. KERNEL2x1_3(xxx)
  3183. KERNEL2x1_4(xxx)
  3184. je .L1_36
  3185. KERNEL2x1_1(xxx)
  3186. KERNEL2x1_2(xxx)
  3187. KERNEL2x1_3(xxx)
  3188. KERNEL2x1_4(xxx)
  3189. KERNEL2x1_1(xxx)
  3190. KERNEL2x1_2(xxx)
  3191. KERNEL2x1_3(xxx)
  3192. KERNEL2x1_4(xxx)
  3193. je .L1_36
  3194. jmp .L1_32
  3195. ALIGN_4
  3196. .L1_36:
  3197. #ifndef TRMMKERNEL
  3198. movq K, %rax
  3199. #else
  3200. movq KKK, %rax
  3201. #endif
  3202. andq $7, %rax # if (k & 1)
  3203. je .L1_39
  3204. movq %rax, BI // Index for BO
  3205. salq $1, %rax // rax = rax *2 ; number of values
  3206. leaq (AO, %rax, 8), AO
  3207. leaq (BO, BI, 8), BO
  3208. negq BI
  3209. negq %rax
  3210. ALIGN_4
  3211. .L1_37:
  3212. KERNEL2x1_SUB(xxx)
  3213. addq $1, BI
  3214. addq $2, %rax
  3215. jl .L1_37
  3216. ALIGN_4
  3217. .L1_39:
  3218. vmovddup ALPHA, %xmm0
  3219. #ifndef TRMMKERNEL
  3220. vfmaddpd (CO1),%xmm0, %xmm4,%xmm4
  3221. #else
  3222. vmulpd %xmm0, %xmm4,%xmm4
  3223. #endif
  3224. vmovups %xmm4 , (CO1)
  3225. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  3226. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  3227. movq K, %rax
  3228. subq KKK, %rax
  3229. movq %rax, BI // Index for BO
  3230. leaq (BO, BI, 8), BO
  3231. salq $1, %rax // rax = rax * 2 ; number of values
  3232. leaq (AO, %rax, 8), AO
  3233. #endif
  3234. #if defined(TRMMKERNEL) && defined(LEFT)
  3235. addq $2, KK
  3236. #endif
  3237. addq $2 * SIZE, CO1 # coffset += 2
  3238. ALIGN_4
  3239. .L1_40:
  3240. testq $1, M
  3241. jz .L999
  3242. ALIGN_4
  3243. .L1_41:
  3244. #if !defined(TRMMKERNEL) || \
  3245. (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  3246. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  3247. leaq BUFFER1, BO // first buffer to BO
  3248. addq $2 * SIZE, BO
  3249. #else
  3250. movq KK, %rax
  3251. leaq BUFFER1, BO // first buffer to BO
  3252. addq $2 * SIZE, BO
  3253. movq %rax, BI // Index for BO
  3254. leaq (BO, BI, 8), BO
  3255. leaq (AO, %rax, 8), AO
  3256. #endif
  3257. vzeroall
  3258. #ifndef TRMMKERNEL
  3259. movq K, %rax
  3260. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  3261. movq K, %rax
  3262. subq KK, %rax
  3263. movq %rax, KKK
  3264. #else
  3265. movq KK, %rax
  3266. #ifdef LEFT
  3267. addq $1, %rax // number of values in AO
  3268. #else
  3269. addq $1, %rax // number of values in BO
  3270. #endif
  3271. movq %rax, KKK
  3272. #endif
  3273. andq $-8, %rax
  3274. je .L1_46
  3275. movq %rax, BI // Index for BO
  3276. leaq (AO, %rax, 8), AO
  3277. leaq (BO, BI, 8), BO
  3278. negq BI
  3279. negq %rax
  3280. ALIGN_4
  3281. .L1_42:
  3282. prefetcht0 B_PR1(BO,BI,8)
  3283. KERNEL1x1_1(xxx)
  3284. KERNEL1x1_2(xxx)
  3285. KERNEL1x1_3(xxx)
  3286. KERNEL1x1_4(xxx)
  3287. KERNEL1x1_1(xxx)
  3288. KERNEL1x1_2(xxx)
  3289. KERNEL1x1_3(xxx)
  3290. KERNEL1x1_4(xxx)
  3291. je .L1_46
  3292. prefetcht0 B_PR1(BO,BI,8)
  3293. KERNEL1x1_1(xxx)
  3294. KERNEL1x1_2(xxx)
  3295. KERNEL1x1_3(xxx)
  3296. KERNEL1x1_4(xxx)
  3297. KERNEL1x1_1(xxx)
  3298. KERNEL1x1_2(xxx)
  3299. KERNEL1x1_3(xxx)
  3300. KERNEL1x1_4(xxx)
  3301. je .L1_46
  3302. jmp .L1_42
  3303. ALIGN_4
  3304. .L1_46:
  3305. #ifndef TRMMKERNEL
  3306. movq K, %rax
  3307. #else
  3308. movq KKK, %rax
  3309. #endif
  3310. andq $7, %rax # if (k & 1)
  3311. je .L1_49
  3312. movq %rax, BI // Index for BO
  3313. leaq (AO, %rax, 8), AO
  3314. leaq (BO, BI, 8), BO
  3315. negq BI
  3316. negq %rax
  3317. ALIGN_4
  3318. .L1_47:
  3319. KERNEL1x1_SUB(xxx)
  3320. addq $1, BI
  3321. addq $1, %rax
  3322. jl .L1_47
  3323. ALIGN_4
  3324. .L1_49:
  3325. vmovddup ALPHA, %xmm0
  3326. #ifndef TRMMKERNEL
  3327. vfmaddsd (CO1),%xmm0, %xmm4,%xmm4
  3328. #else
  3329. vmulsd %xmm0, %xmm4,%xmm4
  3330. #endif
  3331. vmovsd %xmm4 , (CO1)
  3332. #if (defined(TRMMKERNEL) && defined(LEFT) && defined(TRANSA)) || \
  3333. (defined(TRMMKERNEL) && !defined(LEFT) && !defined(TRANSA))
  3334. movq K, %rax
  3335. subq KKK, %rax
  3336. movq %rax, BI // Index for BO
  3337. leaq (BO, BI, 8), BO
  3338. leaq (AO, %rax, 8), AO
  3339. #endif
  3340. #if defined(TRMMKERNEL) && defined(LEFT)
  3341. addq $1, KK
  3342. #endif
  3343. addq $1 * SIZE, CO1 # coffset += 1
  3344. ALIGN_4
  3345. .L999:
  3346. movq SP, %rsp
  3347. movq (%rsp), %rbx
  3348. movq 8(%rsp), %rbp
  3349. movq 16(%rsp), %r12
  3350. movq 24(%rsp), %r13
  3351. movq 32(%rsp), %r14
  3352. movq 40(%rsp), %r15
  3353. #ifdef WINDOWS_ABI
  3354. movq 48(%rsp), %rdi
  3355. movq 56(%rsp), %rsi
  3356. movups 64(%rsp), %xmm6
  3357. movups 80(%rsp), %xmm7
  3358. movups 96(%rsp), %xmm8
  3359. movups 112(%rsp), %xmm9
  3360. movups 128(%rsp), %xmm10
  3361. movups 144(%rsp), %xmm11
  3362. movups 160(%rsp), %xmm12
  3363. movups 176(%rsp), %xmm13
  3364. movups 192(%rsp), %xmm14
  3365. movups 208(%rsp), %xmm15
  3366. #endif
  3367. addq $STACKSIZE, %rsp
  3368. ret
  3369. EPILOGUE
  3370. #endif