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

dgemm_kernel_16x4.S 99 kB

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