You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cgemm_kernel_4x8_sandy.S 110 kB

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