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

cgemm_macros_power9.S 73 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019
  1. /***************************************************************************
  2. Copyright (c) 2013-2019, The OpenBLAS Project
  3. All rights reserved.
  4. Redistribution and use in source and binary forms, with or without
  5. modification, are permitted provided that the following conditions are
  6. met:
  7. 1. Redistributions of source code must retain the above copyright
  8. notice, this list of conditions and the following disclaimer.
  9. 2. Redistributions in binary form must reproduce the above copyright
  10. notice, this list of conditions and the following disclaimer in
  11. the documentation and/or other materials provided with the
  12. distribution.
  13. 3. Neither the name of the OpenBLAS project nor the names of
  14. its contributors may be used to endorse or promote products
  15. derived from this software without specific prior written permission.
  16. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17. AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
  20. LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  22. SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  23. CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  24. OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  25. USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. *****************************************************************************/
  27. /**************************************************************************************
  28. * Abdelrauf(quickwritereader@gmail.com)
  29. * BLASTEST : OK
  30. * CTEST : OK
  31. * TEST : OK
  32. * LAPACK-TEST : OK
  33. **************************************************************************************/
  34. #define unit_size 8
  35. #define DISP32(ind,disp) (ind*unit_size*32+disp)
  36. #define DISP16(ind,disp) (ind*unit_size*16+disp)
  37. #define DISP8(ind,disp) (ind*unit_size*8+disp)
  38. #define DISP4(ind,disp) (ind*unit_size*4+disp)
  39. #define DISP2(ind,disp) (ind*unit_size*2+disp)
  40. #define DISP1(ind,disp) (ind*unit_size+disp)
  41. #define DISPX(disp) (disp)
  42. .macro AGGREGATE_REALS_IMAGES VSINR_OUT1,VSINR,VSINI_OUT2,VSINI
  43. #if defined(NN) || defined(NT) || defined(TN) || defined(TT)
  44. xvsubsp \VSINR_OUT1,\VSINR_OUT1,\VSINR
  45. xvaddsp \VSINI_OUT2,\VSINI_OUT2,\VSINI
  46. #elif defined(CN) || defined(CT) || defined(RN) || defined(RT)
  47. xvaddsp \VSINR_OUT1,\VSINR_OUT1,\VSINR
  48. xvsubsp \VSINI_OUT2,\VSINI_OUT2,\VSINI
  49. #elif defined(NC) || defined(TC) || defined(NR) || defined(TR)
  50. xvaddsp \VSINR_OUT1,\VSINR_OUT1,\VSINR
  51. xvsubsp \VSINI_OUT2,\VSINI,\VSINI_OUT2
  52. #else // CC || CR || RC || RR
  53. /*we will assume {-alpha_r,-alpha_i} for this case */
  54. /*i1i2-r1r2 so we will negate alpha real instead to fix sign*/
  55. xvsubsp \VSINR_OUT1,\VSINR,\VSINR_OUT1
  56. /*we will negate alpha image instead to fix sign*/
  57. xvaddsp \VSINI_OUT2,\VSINI_OUT2,\VSINI
  58. #endif
  59. .endm
  60. .macro AGGREGATE_REALS_IMAGES_A_PERMUTE VSINR_OUT1,VSINR,VSINI_OUT2,VSINI
  61. #if defined(NN) || defined(NT) || defined(TN) || defined(TT)
  62. xvsubsp \VSINR_OUT1,\VSINR_OUT1,\VSINR
  63. xvaddsp \VSINI_OUT2,\VSINI_OUT2,\VSINI
  64. #elif defined(CN) || defined(CT) || defined(RN) || defined(RT)
  65. xvaddsp \VSINR_OUT1,\VSINR_OUT1,\VSINR
  66. xvsubsp \VSINI_OUT2,\VSINI,\VSINI_OUT2
  67. #elif defined(NC) || defined(TC) || defined(NR) || defined(TR)
  68. xvaddsp \VSINR_OUT1,\VSINR_OUT1,\VSINR
  69. xvsubsp \VSINI_OUT2,\VSINI_OUT2,\VSINI
  70. #else // CC || CR || RC || RR
  71. /*we will assume {-alpha_r,-alpha_i} for this case */
  72. /*i1i2-r1r2 so we will negate alpha real instead to fix sign*/
  73. xvsubsp \VSINR_OUT1,\VSINR,\VSINR_OUT1
  74. /*we will negate alpha image instead to fix sign*/
  75. xvaddsp \VSINI_OUT2,\VSINI_OUT2,\VSINI
  76. #endif
  77. .endm
  78. /* {i0,i1} * {alpha_i,alpha_i} [- VSOUT1] ;[VSOUT2 +] {r0,r1}*{alpha_i,alpha_i} */
  79. .macro MULT_APLHA_PART1 VSINRR,VSINII,VSOUT1,VSOUT2
  80. xvmulsp \VSOUT1,\VSINII, alpha_i
  81. xvmulsp \VSOUT2,\VSINRR, alpha_i
  82. .endm
  83. /* {r0,r1} * {alpha_r,alpha_r} - VSOUT1 ;VSOUT2 + {i0,i1} * {alpha_r,alpha_r} */
  84. .macro MULT_APLHA_PART2 VSINRR,VSINII,VSOUT1,VSOUT2
  85. xvmsubasp \VSOUT1,\VSINRR, alpha_r
  86. xvmaddasp \VSOUT2,\VSINII, alpha_r
  87. .endm
  88. /* macros for N=4 and M=8
  89. **********************************************************************************************/
  90. .macro Zero4x8
  91. xxlxor vs32, vs32, vs32
  92. xxlxor vs33, vs33, vs33
  93. xxlxor vs34, vs34, vs34
  94. xxlxor vs35, vs35, vs35
  95. xxlxor vs36, vs36, vs36
  96. xxlxor vs37, vs37, vs37
  97. xxlxor vs38, vs38, vs38
  98. xxlxor vs39, vs39, vs39
  99. xxlxor vs40, vs40, vs40
  100. xxlxor vs41, vs41, vs41
  101. xxlxor vs42, vs42, vs42
  102. xxlxor vs43, vs43, vs43
  103. xxlxor vs44, vs44, vs44
  104. xxlxor vs45, vs45, vs45
  105. xxlxor vs46, vs46, vs46
  106. xxlxor vs47, vs47, vs47
  107. xxlxor vs48, vs48, vs48
  108. xxlxor vs49, vs49, vs49
  109. xxlxor vs50, vs50, vs50
  110. xxlxor vs51, vs51, vs51
  111. xxlxor vs52, vs52, vs52
  112. xxlxor vs53, vs53, vs53
  113. xxlxor vs54, vs54, vs54
  114. xxlxor vs55, vs55, vs55
  115. xxlxor vs56, vs56, vs56
  116. xxlxor vs57, vs57, vs57
  117. xxlxor vs58, vs58, vs58
  118. xxlxor vs59, vs59, vs59
  119. xxlxor vs60, vs60, vs60
  120. xxlxor vs61, vs61, vs61
  121. xxlxor vs62, vs62, vs62
  122. xxlxor vs63, vs63, vs63
  123. .endm
  124. .macro LOAD4x8
  125. LOAD4x8O 0,0
  126. .endm
  127. .macro LOAD4x8O OffsetA,OffsetB
  128. lxv vs24, (\OffsetB+0)(BO)
  129. lxv vs28, (\OffsetB+16)(BO)
  130. xxperm vs26, vs24, permute_mask
  131. xxperm vs30, vs28, permute_mask
  132. lxv vs0, (\OffsetA+0)(AO)
  133. lxv vs1, (\OffsetA+16)(AO)
  134. xxpermdi vs25, vs24, vs24,2
  135. xxpermdi vs29, vs28, vs28,2
  136. lxv vs2, (\OffsetA+32)(AO)
  137. lxv vs3, (\OffsetA+48)(AO)
  138. xxpermdi vs27, vs26, vs26,2
  139. xxpermdi vs31, vs30, vs30,2
  140. .endm
  141. .macro END4x8_NORMAL
  142. END4x8 AO,BO,64,32
  143. .endm
  144. .macro END4x8_WITHOUT_ADD
  145. END4x8 AO,BO,0,0
  146. .endm
  147. .macro END4x8 AREG, BREG, OffsetA, OffsetB
  148. .if \OffsetB != 0
  149. addi \BREG, \BREG, \OffsetB
  150. .endif
  151. .if \OffsetA != 0
  152. addi \AREG, \AREG, \OffsetA
  153. .endif
  154. xvmaddasp vs32, vs0,vs24
  155. xvmaddasp vs33, vs1,vs24
  156. xvmaddasp vs34, vs2,vs24
  157. xvmaddasp vs35, vs3,vs24
  158. xvmaddasp vs36, vs0,vs25
  159. xvmaddasp vs37, vs1,vs25
  160. xvmaddasp vs38, vs2,vs25
  161. xvmaddasp vs39, vs3,vs25
  162. xvmaddasp vs40, vs0,vs26
  163. xvmaddasp vs41, vs1,vs26
  164. xvmaddasp vs42, vs2,vs26
  165. xvmaddasp vs43, vs3,vs26
  166. xvmaddasp vs44, vs0,vs27
  167. xvmaddasp vs45, vs1,vs27
  168. xvmaddasp vs46, vs2,vs27
  169. xvmaddasp vs47, vs3,vs27
  170. xvmaddasp vs48, vs0,vs28
  171. xvmaddasp vs49, vs1,vs28
  172. xvmaddasp vs50, vs2,vs28
  173. xvmaddasp vs51, vs3,vs28
  174. xvmaddasp vs52, vs0,vs29
  175. xvmaddasp vs53, vs1,vs29
  176. xvmaddasp vs54, vs2,vs29
  177. xvmaddasp vs55, vs3,vs29
  178. xvmaddasp vs56, vs0,vs30
  179. xvmaddasp vs57, vs1,vs30
  180. xvmaddasp vs58, vs2,vs30
  181. xvmaddasp vs59, vs3,vs30
  182. xvmaddasp vs60, vs0,vs31
  183. xvmaddasp vs61, vs1,vs31
  184. xvmaddasp vs62, vs2,vs31
  185. xvmaddasp vs63, vs3,vs31
  186. .endm
  187. .macro LOAD4x8_2
  188. LOAD4x8_2O 0,0
  189. .endm
  190. .macro LOAD4x8_2O OffsetA,OffsetB
  191. lxv vs8, (\OffsetB)(BO)
  192. lxv vs12, (16+\OffsetB)(BO)
  193. lxv vs24, (32+\OffsetB)(BO)
  194. lxv vs28, (32+16+\OffsetB)(BO)
  195. lxv vs4, (0+\OffsetA)(AO)
  196. lxv vs5, (16+\OffsetA)(AO)
  197. xxperm vs10, vs8, permute_mask
  198. xxperm vs14, vs12, permute_mask
  199. lxv vs6, (32+\OffsetA)(AO)
  200. lxv vs7, (48+\OffsetA)(AO)
  201. xxpermdi vs9, vs8, vs8,2
  202. xxpermdi vs13, vs12, vs12,2
  203. lxv vs0, (64+\OffsetA)(AO)
  204. lxv vs1, (64+16+\OffsetA)(AO)
  205. xxpermdi vs11, vs10, vs10,2
  206. xxpermdi vs15, vs14, vs14,2
  207. lxv vs2, (64+32+\OffsetA)(AO)
  208. lxv vs3, (64+48+\OffsetA)(AO)
  209. xxperm vs26, vs24, permute_mask
  210. xxperm vs30, vs28, permute_mask
  211. xxpermdi vs25, vs24, vs24,2
  212. xxpermdi vs29, vs28, vs28,2
  213. xxpermdi vs27, vs26, vs26,2
  214. xxpermdi vs31, vs30, vs30,2
  215. .endm
  216. .macro END4x8_2
  217. /*for load2 offset will be 128 and 64*/
  218. KERNEL4x8_2 AO,BO, 128,64,0 ,1,1
  219. .endm
  220. .macro KERNEL4x8_E2 OffsetA,OffsetB, Index,IsLast
  221. KERNEL4x8_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  222. .endm
  223. .macro KERNEL4x8_L2 OffsetA,OffsetB, Index,IsLast
  224. KERNEL4x8_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  225. .endm
  226. .macro KERNEL4x8_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  227. xvmaddasp vs32, vs4,vs8
  228. xvmaddasp vs33, vs5,vs8
  229. xvmaddasp vs48, vs4,vs12
  230. xvmaddasp vs49, vs5,vs12
  231. xvmaddasp vs40, vs4,vs10
  232. xvmaddasp vs41, vs5,vs10
  233. xvmaddasp vs56, vs4,vs14
  234. xvmaddasp vs57, vs5,vs14
  235. xvmaddasp vs36, vs4,vs9
  236. xvmaddasp vs37, vs5,vs9
  237. xvmaddasp vs52, vs4,vs13
  238. xvmaddasp vs53, vs5,vs13
  239. xvmaddasp vs44, vs4,vs11
  240. xvmaddasp vs45, vs5,vs11
  241. xvmaddasp vs60, vs4,vs15
  242. xvmaddasp vs61, vs5,vs15
  243. .if \Complete==0
  244. lxv vs4, DISP16(\Index,0+\OffsetA)(\AREG)
  245. lxv vs5, DISP16(\Index,16+\OffsetA)(\AREG)
  246. .endif
  247. xvmaddasp vs34, vs6,vs8
  248. xvmaddasp vs35, vs7,vs8
  249. xvmaddasp vs50, vs6,vs12
  250. xvmaddasp vs51, vs7,vs12
  251. .if \Complete==0
  252. lxv vs8, DISP8(\Index,\OffsetB)(\BREG)
  253. lxv vs12, DISP8(\Index,16+\OffsetB)(\BREG)
  254. .endif
  255. xvmaddasp vs42, vs6,vs10
  256. xvmaddasp vs43, vs7,vs10
  257. xvmaddasp vs58, vs6,vs14
  258. xvmaddasp vs59, vs7,vs14
  259. .if \Complete==0
  260. xxperm vs10, vs8, permute_mask
  261. xxperm vs14, vs12, permute_mask
  262. .endif
  263. xvmaddasp vs38, vs6,vs9
  264. xvmaddasp vs39, vs7,vs9
  265. xvmaddasp vs54, vs6,vs13
  266. xvmaddasp vs55, vs7,vs13
  267. .if \Complete==0
  268. xxpermdi vs9, vs8, vs8,2
  269. xxpermdi vs13, vs12, vs12,2
  270. .endif
  271. xvmaddasp vs46, vs6,vs11
  272. xvmaddasp vs47, vs7,vs11
  273. xvmaddasp vs62, vs6,vs15
  274. xvmaddasp vs63, vs7,vs15
  275. .if \Complete==0
  276. xxpermdi vs11, vs10, vs10,2
  277. xxpermdi vs15, vs14, vs14,2
  278. .endif
  279. .if \Complete==0
  280. lxv vs6, DISP16(\Index,32+\OffsetA)(\AREG)
  281. lxv vs7, DISP16(\Index,48+\OffsetA)(\AREG)
  282. .endif
  283. xvmaddasp vs32, vs0,vs24
  284. xvmaddasp vs33, vs1,vs24
  285. xvmaddasp vs48, vs0,vs28
  286. xvmaddasp vs49, vs1,vs28
  287. xvmaddasp vs40, vs0,vs26
  288. xvmaddasp vs41, vs1,vs26
  289. xvmaddasp vs56, vs0,vs30
  290. xvmaddasp vs57, vs1,vs30
  291. xvmaddasp vs36, vs0,vs25
  292. xvmaddasp vs37, vs1,vs25
  293. xvmaddasp vs52, vs0,vs29
  294. xvmaddasp vs53, vs1,vs29
  295. xvmaddasp vs44, vs0,vs27
  296. xvmaddasp vs45, vs1,vs27
  297. xvmaddasp vs60, vs0,vs31
  298. xvmaddasp vs61, vs1,vs31
  299. .if \Complete==0
  300. lxv vs0, DISP16(\Index,64+\OffsetA)(\AREG)
  301. lxv vs1, DISP16(\Index,64+16+\OffsetA)(\AREG)
  302. .endif
  303. xvmaddasp vs34, vs2,vs24
  304. xvmaddasp vs35, vs3,vs24
  305. xvmaddasp vs50, vs2,vs28
  306. xvmaddasp vs51, vs3,vs28
  307. .if \Complete==0
  308. lxv vs24, DISP8(\Index,32+\OffsetB)(\BREG)
  309. lxv vs28, DISP8(\Index,32+16+\OffsetB)(\BREG)
  310. .endif
  311. xvmaddasp vs42, vs2,vs26
  312. xvmaddasp vs43, vs3,vs26
  313. xvmaddasp vs58, vs2,vs30
  314. xvmaddasp vs59, vs3,vs30
  315. .if \Complete==0
  316. xxperm vs26, vs24, permute_mask
  317. xxperm vs30, vs28, permute_mask
  318. .endif
  319. xvmaddasp vs38, vs2,vs25
  320. xvmaddasp vs39, vs3,vs25
  321. xvmaddasp vs54, vs2,vs29
  322. xvmaddasp vs55, vs3,vs29
  323. .if \Complete==0
  324. xxpermdi vs25, vs24, vs24,2
  325. xxpermdi vs29, vs28, vs28,2
  326. .endif
  327. xvmaddasp vs46, vs2,vs27
  328. xvmaddasp vs47, vs3,vs27
  329. xvmaddasp vs62, vs2,vs31
  330. xvmaddasp vs63, vs3,vs31
  331. .if \Complete==0
  332. xxpermdi vs27, vs26, vs26,2
  333. xxpermdi vs31, vs30, vs30,2
  334. .endif
  335. .if \Complete==0
  336. lxv vs2, DISP16(\Index,64+32+\OffsetA)(\AREG)
  337. lxv vs3, DISP16(\Index,64+48+\OffsetA)(\AREG)
  338. .endif
  339. .if \IsLast==1
  340. .if \Complete==1
  341. addi \BREG, \BREG, DISP8(\Index,\OffsetB)
  342. addi \AREG, \AREG, DISP16(\Index,\OffsetA)
  343. .else
  344. addi \BREG, \BREG, DISP8(\Index,64)
  345. addi \AREG, \AREG, DISP16(\Index,128)
  346. .endif
  347. .endif
  348. .endm
  349. .macro KERNEL4x8
  350. LOAD4x8
  351. END4x8 AO, BO, 64,32
  352. .endm
  353. .macro SAVE4x8
  354. add T4, LDC,LDC
  355. add T1, CO ,LDC
  356. #ifndef TRMMKERNEL
  357. lxv vs24 , 0(CO)
  358. lxv vs25 , 16(CO)
  359. #endif
  360. xxperm vs0,vs32,permute_mask
  361. xxperm vs4,vs40,permute_mask
  362. #ifndef TRMMKERNEL
  363. lxv vs26 , 32(CO)
  364. lxv vs27 , 48(CO)
  365. #endif
  366. xxperm vs1,vs33,permute_mask
  367. xxperm vs5,vs41,permute_mask
  368. #ifndef TRMMKERNEL
  369. lxv vs28 , 0(T1)
  370. lxv vs29 , 16(T1)
  371. #endif
  372. xxperm vs2,vs34,permute_mask
  373. xxperm vs6,vs42,permute_mask
  374. #ifndef TRMMKERNEL
  375. lxv vs30 , 32(T1)
  376. lxv vs31 , 48(T1)
  377. #endif
  378. xxperm vs3,vs35,permute_mask
  379. xxperm vs7,vs43,permute_mask
  380. add T2,CO,T4
  381. add T3,T1,T4
  382. AGGREGATE_REALS_IMAGES vs32,vs0,vs40,vs4
  383. xxperm vs8,vs36,permute_mask
  384. xxperm vs12,vs44,permute_mask
  385. AGGREGATE_REALS_IMAGES vs33,vs1,vs41,vs5
  386. xxperm vs9,vs37,permute_mask
  387. xxperm vs13,vs45,permute_mask
  388. AGGREGATE_REALS_IMAGES vs34,vs2,vs42,vs6
  389. xxperm vs10,vs38,permute_mask
  390. xxperm vs14,vs46,permute_mask
  391. AGGREGATE_REALS_IMAGES vs35,vs3,vs43,vs7
  392. xxperm vs11,vs39,permute_mask
  393. xxperm vs15,vs47,permute_mask
  394. AGGREGATE_REALS_IMAGES vs36,vs8,vs44,vs12
  395. xxperm vs0,vs48,permute_mask
  396. xxperm vs4,vs56,permute_mask
  397. AGGREGATE_REALS_IMAGES vs37,vs9,vs45,vs13
  398. xxperm vs1,vs49,permute_mask
  399. xxperm vs5,vs57,permute_mask
  400. AGGREGATE_REALS_IMAGES vs38,vs10,vs46,vs14
  401. xxperm vs2,vs50,permute_mask
  402. xxperm vs6,vs58,permute_mask
  403. AGGREGATE_REALS_IMAGES vs39,vs11,vs47,vs15
  404. xxperm vs3,vs51,permute_mask
  405. xxperm vs7,vs59,permute_mask
  406. AGGREGATE_REALS_IMAGES vs48,vs0,vs56,vs4
  407. xxperm vs8,vs52,permute_mask
  408. xxperm vs12,vs60,permute_mask
  409. AGGREGATE_REALS_IMAGES vs49,vs1,vs57,vs5
  410. xxperm vs9,vs53,permute_mask
  411. xxperm vs13,vs61,permute_mask
  412. AGGREGATE_REALS_IMAGES vs50,vs2,vs58,vs6
  413. xxperm vs10,vs54,permute_mask
  414. xxperm vs14,vs62,permute_mask
  415. AGGREGATE_REALS_IMAGES vs51,vs3,vs59,vs7
  416. xxperm vs11,vs55,permute_mask
  417. xxperm vs15,vs63,permute_mask
  418. AGGREGATE_REALS_IMAGES vs52,vs8,vs60,vs12
  419. AGGREGATE_REALS_IMAGES vs53,vs9,vs61,vs13
  420. /*VSINRR,VSINII,VSOUT1,VSOUT2*/
  421. MULT_APLHA_PART1 vs32,vs40,vs0,vs1
  422. AGGREGATE_REALS_IMAGES vs54,vs10,vs62,vs14
  423. MULT_APLHA_PART1 vs33,vs41,vs2,vs3
  424. AGGREGATE_REALS_IMAGES vs55,vs11,vs63,vs15
  425. MULT_APLHA_PART1 vs34,vs42,vs4,vs5
  426. MULT_APLHA_PART1 vs35,vs43,vs6,vs7
  427. MULT_APLHA_PART2 vs32,vs40,vs0,vs1
  428. MULT_APLHA_PART2 vs33,vs41,vs2,vs3
  429. MULT_APLHA_PART2 vs34,vs42,vs4,vs5
  430. MULT_APLHA_PART2 vs35,vs43,vs6,vs7
  431. #ifndef TRMMKERNEL
  432. lxv vs32 , 0(T2)
  433. lxv vs40 , 16(T2)
  434. #endif
  435. MULT_APLHA_PART1 vs36,vs44,vs8,vs9
  436. MULT_APLHA_PART1 vs37,vs45,vs10,vs11
  437. #ifndef TRMMKERNEL
  438. lxv vs33 , 32(T2)
  439. lxv vs41 , 48(T2)
  440. #endif
  441. MULT_APLHA_PART1 vs38,vs46,vs12,vs13
  442. MULT_APLHA_PART1 vs39,vs47,vs14,vs15
  443. #ifndef TRMMKERNEL
  444. lxv vs34 , 0(T3)
  445. lxv vs42 , 16(T3)
  446. #endif
  447. MULT_APLHA_PART2 vs36,vs44,vs8,vs9
  448. MULT_APLHA_PART2 vs37,vs45,vs10,vs11
  449. #ifndef TRMMKERNEL
  450. lxv vs35 , 32(T3)
  451. lxv vs43 , 48(T3)
  452. #endif
  453. MULT_APLHA_PART2 vs38,vs46,vs12,vs13
  454. MULT_APLHA_PART2 vs39,vs47,vs14,vs15
  455. /* reconstruct r,i pairs*/
  456. xxperm vs0,vs1, save_permute_1
  457. xxperm vs2,vs3, save_permute_1
  458. xxperm vs4,vs5, save_permute_1
  459. xxperm vs6,vs7, save_permute_1
  460. xxperm vs8,vs9, save_permute_1
  461. xxperm vs10,vs11, save_permute_1
  462. xxperm vs12,vs13, save_permute_1
  463. xxperm vs14,vs15, save_permute_1
  464. #ifndef TRMMKERNEL
  465. /* add */
  466. xxpermdi vs1,vs8,vs0,2
  467. xxpermdi vs3,vs10,vs2,2
  468. xxpermdi vs5,vs12,vs4,2
  469. xxpermdi vs7,vs14,vs6,2
  470. xxpermdi vs9,vs0,vs8,2
  471. xxpermdi vs11,vs2,vs10,2
  472. xvaddsp vs24,vs24,vs1
  473. xvaddsp vs25,vs25,vs3
  474. xxpermdi vs13,vs4,vs12,2
  475. xxpermdi vs15,vs6,vs14,2
  476. xvaddsp vs26,vs26,vs5
  477. xvaddsp vs27,vs27,vs7
  478. xvaddsp vs28,vs28,vs9
  479. xvaddsp vs29,vs29,vs11
  480. xvaddsp vs30,vs30,vs13
  481. xvaddsp vs31,vs31,vs15
  482. #else
  483. xxpermdi vs24,vs8,vs0,2
  484. xxpermdi vs25,vs10,vs2,2
  485. xxpermdi vs26,vs12,vs4,2
  486. xxpermdi vs27,vs14,vs6,2
  487. xxpermdi vs28,vs0,vs8,2
  488. xxpermdi vs29,vs2,vs10,2
  489. xxpermdi vs30,vs4,vs12,2
  490. xxpermdi vs31,vs6,vs14,2
  491. #endif
  492. stxv vs24 , 0(CO)
  493. stxv vs25 , 16(CO)
  494. MULT_APLHA_PART1 vs48,vs56,vs0,vs1
  495. MULT_APLHA_PART1 vs49,vs57,vs2,vs3
  496. stxv vs26 , 32(CO)
  497. stxv vs27 , 48(CO)
  498. MULT_APLHA_PART1 vs50,vs58,vs4,vs5
  499. MULT_APLHA_PART1 vs51,vs59,vs6,vs7
  500. stxv vs28 , 0(T1)
  501. stxv vs29 , 16(T1)
  502. MULT_APLHA_PART2 vs48,vs56,vs0,vs1
  503. MULT_APLHA_PART2 vs49,vs57,vs2,vs3
  504. stxv vs30 , 32(T1)
  505. stxv vs31 , 48(T1)
  506. MULT_APLHA_PART2 vs50,vs58,vs4,vs5
  507. MULT_APLHA_PART2 vs51,vs59,vs6,vs7
  508. MULT_APLHA_PART1 vs52,vs60,vs8,vs9
  509. MULT_APLHA_PART1 vs53,vs61,vs10,vs11
  510. xxperm vs0,vs1, save_permute_1
  511. xxperm vs2,vs3, save_permute_1
  512. MULT_APLHA_PART1 vs54,vs62,vs12,vs13
  513. MULT_APLHA_PART1 vs55,vs63,vs14,vs15
  514. xxperm vs4,vs5, save_permute_1
  515. xxperm vs6,vs7, save_permute_1
  516. MULT_APLHA_PART2 vs52,vs60,vs8,vs9
  517. MULT_APLHA_PART2 vs53,vs61,vs10,vs11
  518. xxperm vs8,vs9, save_permute_1
  519. xxperm vs10,vs11, save_permute_1
  520. MULT_APLHA_PART2 vs54,vs62,vs12,vs13
  521. MULT_APLHA_PART2 vs55,vs63,vs14,vs15
  522. xxperm vs12,vs13, save_permute_1
  523. xxperm vs14,vs15, save_permute_1
  524. #ifndef TRMMKERNEL
  525. /* add */
  526. xxpermdi vs1,vs8,vs0,2
  527. xxpermdi vs3,vs10,vs2,2
  528. xxpermdi vs5,vs12,vs4,2
  529. xxpermdi vs7,vs14,vs6,2
  530. xxpermdi vs9,vs0,vs8,2
  531. xxpermdi vs11,vs2,vs10,2
  532. xvaddsp vs32,vs32,vs1
  533. xvaddsp vs40,vs40,vs3
  534. xxpermdi vs13,vs4,vs12,2
  535. xxpermdi vs15,vs6,vs14,2
  536. xvaddsp vs33,vs33,vs5
  537. xvaddsp vs41,vs41,vs7
  538. xvaddsp vs34,vs34,vs9
  539. xvaddsp vs42,vs42,vs11
  540. xvaddsp vs35,vs35,vs13
  541. xvaddsp vs43,vs43,vs15
  542. #else
  543. xxpermdi vs32,vs8,vs0,2
  544. xxpermdi vs40,vs10,vs2,2
  545. xxpermdi vs33,vs12,vs4,2
  546. xxpermdi vs41,vs14,vs6,2
  547. xxpermdi vs34,vs0,vs8,2
  548. xxpermdi vs42,vs2,vs10,2
  549. xxpermdi vs35,vs4,vs12,2
  550. xxpermdi vs43,vs6,vs14,2
  551. #endif
  552. stxv vs32 , 0(T2)
  553. stxv vs40 , 16(T2)
  554. stxv vs33 , 32(T2)
  555. stxv vs41 , 48(T2)
  556. stxv vs34 , 0(T3)
  557. stxv vs42 , 16(T3)
  558. stxv vs35 , 32(T3)
  559. stxv vs43 , 48(T3)
  560. addi CO, CO, 64
  561. .endm
  562. /* macros for N=4 and M=4
  563. **********************************************************************************************/
  564. .macro Zero4x4
  565. xxlxor vs32, vs32, vs32
  566. xxlxor vs33, vs33, vs33
  567. xxlxor vs36, vs36, vs36
  568. xxlxor vs37, vs37, vs37
  569. xxlxor vs40, vs40, vs40
  570. xxlxor vs41, vs41, vs41
  571. xxlxor vs44, vs44, vs44
  572. xxlxor vs45, vs45, vs45
  573. xxlxor vs48, vs48, vs48
  574. xxlxor vs49, vs49, vs49
  575. xxlxor vs52, vs52, vs52
  576. xxlxor vs53, vs53, vs53
  577. xxlxor vs56, vs56, vs56
  578. xxlxor vs57, vs57, vs57
  579. xxlxor vs60, vs60, vs60
  580. xxlxor vs61, vs61, vs61
  581. .endm
  582. .macro LOAD4x4
  583. LOAD4x4O 0,0
  584. .endm
  585. .macro LOAD4x4O OffsetA,OffsetB
  586. lxv vs24, (\OffsetB+0)(BO)
  587. lxv vs28, (\OffsetB+16)(BO)
  588. xxperm vs26, vs24, permute_mask
  589. xxperm vs30, vs28, permute_mask
  590. lxv vs0, (\OffsetA+0)(AO)
  591. lxv vs1, (\OffsetA+16)(AO)
  592. xxpermdi vs25, vs24, vs24,2
  593. xxpermdi vs29, vs28, vs28,2
  594. xxpermdi vs27, vs26, vs26,2
  595. xxpermdi vs31, vs30, vs30,2
  596. .endm
  597. .macro END4x4_NORMAL
  598. END4x4 AO,BO,32,32
  599. .endm
  600. .macro END4x4_WITHOUT_ADD
  601. END4x4 AO,BO,0,0
  602. .endm
  603. .macro END4x4 AREG, BREG, OffsetA, OffsetB
  604. .if \OffsetB != 0
  605. addi \BREG, \BREG, \OffsetB
  606. .endif
  607. .if \OffsetA != 0
  608. addi \AREG, \AREG, \OffsetA
  609. .endif
  610. xvmaddasp vs32, vs0,vs24
  611. xvmaddasp vs33, vs1,vs24
  612. xvmaddasp vs36, vs0,vs25
  613. xvmaddasp vs37, vs1,vs25
  614. xvmaddasp vs40, vs0,vs26
  615. xvmaddasp vs41, vs1,vs26
  616. xvmaddasp vs44, vs0,vs27
  617. xvmaddasp vs45, vs1,vs27
  618. xvmaddasp vs48, vs0,vs28
  619. xvmaddasp vs49, vs1,vs28
  620. xvmaddasp vs52, vs0,vs29
  621. xvmaddasp vs53, vs1,vs29
  622. xvmaddasp vs56, vs0,vs30
  623. xvmaddasp vs57, vs1,vs30
  624. xvmaddasp vs60, vs0,vs31
  625. xvmaddasp vs61, vs1,vs31
  626. .endm
  627. .macro LOAD4x4_2
  628. LOAD4x4_2O 0,0
  629. .endm
  630. .macro LOAD4x4_2O OffsetA,OffsetB
  631. lxv vs8, (\OffsetB)(BO)
  632. lxv vs12, (16+\OffsetB)(BO)
  633. lxv vs24, (32+\OffsetB)(BO)
  634. lxv vs28, (32+16+\OffsetB)(BO)
  635. lxv vs4, (0+\OffsetA)(AO)
  636. lxv vs5, (16+\OffsetA)(AO)
  637. xxperm vs10, vs8, permute_mask
  638. xxperm vs14, vs12, permute_mask
  639. xxpermdi vs9, vs8, vs8,2
  640. xxpermdi vs13, vs12, vs12,2
  641. lxv vs0, (32+\OffsetA)(AO)
  642. lxv vs1, (32+16+\OffsetA)(AO)
  643. xxpermdi vs11, vs10, vs10,2
  644. xxpermdi vs15, vs14, vs14,2
  645. xxperm vs26, vs24, permute_mask
  646. xxperm vs30, vs28, permute_mask
  647. xxpermdi vs25, vs24, vs24,2
  648. xxpermdi vs29, vs28, vs28,2
  649. xxpermdi vs27, vs26, vs26,2
  650. xxpermdi vs31, vs30, vs30,2
  651. .endm
  652. .macro END4x4_2
  653. /*for load2 offset will be 64 and 64*/
  654. KERNEL4x4_2 AO,BO, 64,64,0 ,1,1
  655. .endm
  656. .macro KERNEL4x4_E2 OffsetA,OffsetB, Index,IsLast
  657. KERNEL4x4_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  658. .endm
  659. .macro KERNEL4x4_L2 OffsetA,OffsetB, Index,IsLast
  660. KERNEL4x4_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  661. .endm
  662. .macro KERNEL4x4_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  663. xvmaddasp vs32, vs4,vs8
  664. xvmaddasp vs33, vs5,vs8
  665. xvmaddasp vs48, vs4,vs12
  666. xvmaddasp vs49, vs5,vs12
  667. xvmaddasp vs40, vs4,vs10
  668. xvmaddasp vs41, vs5,vs10
  669. xvmaddasp vs56, vs4,vs14
  670. xvmaddasp vs57, vs5,vs14
  671. .if \Complete==0
  672. lxv vs8, DISP8(\Index,\OffsetB)(\BREG)
  673. lxv vs12, DISP8(\Index,16+\OffsetB)(\BREG)
  674. .endif
  675. xvmaddasp vs36, vs4,vs9
  676. xvmaddasp vs37, vs5,vs9
  677. xvmaddasp vs52, vs4,vs13
  678. xvmaddasp vs53, vs5,vs13
  679. .if \Complete==0
  680. xxperm vs10, vs8, permute_mask
  681. xxperm vs14, vs12, permute_mask
  682. .endif
  683. xvmaddasp vs44, vs4,vs11
  684. xvmaddasp vs45, vs5,vs11
  685. xvmaddasp vs60, vs4,vs15
  686. xvmaddasp vs61, vs5,vs15
  687. .if \Complete==0
  688. xxpermdi vs9, vs8, vs8,2
  689. xxpermdi vs13, vs12, vs12,2
  690. .endif
  691. .if \Complete==0
  692. lxv vs4, DISP8(\Index,0+\OffsetA)(\AREG)
  693. lxv vs5, DISP8(\Index,16+\OffsetA)(\AREG)
  694. .endif
  695. .if \Complete==0
  696. xxpermdi vs11, vs10, vs10,2
  697. xxpermdi vs15, vs14, vs14,2
  698. .endif
  699. xvmaddasp vs32, vs0,vs24
  700. xvmaddasp vs33, vs1,vs24
  701. xvmaddasp vs48, vs0,vs28
  702. xvmaddasp vs49, vs1,vs28
  703. xvmaddasp vs40, vs0,vs26
  704. xvmaddasp vs41, vs1,vs26
  705. xvmaddasp vs56, vs0,vs30
  706. xvmaddasp vs57, vs1,vs30
  707. .if \Complete==0
  708. lxv vs24, DISP8(\Index,32+\OffsetB)(\BREG)
  709. lxv vs28, DISP8(\Index,32+16+\OffsetB)(\BREG)
  710. .endif
  711. xvmaddasp vs36, vs0,vs25
  712. xvmaddasp vs37, vs1,vs25
  713. xvmaddasp vs52, vs0,vs29
  714. xvmaddasp vs53, vs1,vs29
  715. .if \Complete==0
  716. xxperm vs26, vs24, permute_mask
  717. xxperm vs30, vs28, permute_mask
  718. .endif
  719. xvmaddasp vs44, vs0,vs27
  720. xvmaddasp vs45, vs1,vs27
  721. xvmaddasp vs60, vs0,vs31
  722. xvmaddasp vs61, vs1,vs31
  723. .if \Complete==0
  724. xxpermdi vs25, vs24, vs24,2
  725. xxpermdi vs29, vs28, vs28,2
  726. .endif
  727. .if \Complete==0
  728. lxv vs0, DISP8(\Index,32+\OffsetA)(\AREG)
  729. lxv vs1, DISP8(\Index,32+16+\OffsetA)(\AREG)
  730. .endif
  731. .if \Complete==0
  732. xxpermdi vs27, vs26, vs26,2
  733. xxpermdi vs31, vs30, vs30,2
  734. .endif
  735. .if \IsLast==1
  736. .if \Complete==1
  737. addi \BREG, \BREG, DISP8(\Index,\OffsetB)
  738. addi \AREG, \AREG, DISP8(\Index,\OffsetA)
  739. .else
  740. addi \BREG, \BREG, DISP8(\Index,64)
  741. addi \AREG, \AREG, DISP8(\Index,64)
  742. .endif
  743. .endif
  744. .endm
  745. .macro KERNEL4x4
  746. LOAD4x4
  747. END4x4 AO, BO, 32,32
  748. .endm
  749. .macro SAVE4x4
  750. add T4, LDC,LDC
  751. add T1, CO ,LDC
  752. #ifndef TRMMKERNEL
  753. lxv vs24 , 0(CO)
  754. lxv vs25 , 16(CO)
  755. #endif
  756. add T2,CO,T4
  757. add T3,T1,T4
  758. #ifndef TRMMKERNEL
  759. lxv vs26 , 0(T1)
  760. lxv vs27 , 16(T1)
  761. #endif
  762. #ifndef TRMMKERNEL
  763. lxv vs28 , 0(T2)
  764. lxv vs29 , 16(T2)
  765. #endif
  766. #ifndef TRMMKERNEL
  767. lxv vs30 , 0(T3)
  768. lxv vs31 , 16(T3)
  769. #endif
  770. xxperm vs0,vs32,permute_mask
  771. xxperm vs4,vs40,permute_mask
  772. xxperm vs1,vs33,permute_mask
  773. xxperm vs5,vs41,permute_mask
  774. xxperm vs8,vs36,permute_mask
  775. xxperm vs12,vs44,permute_mask
  776. xxperm vs9,vs37,permute_mask
  777. xxperm vs13,vs45,permute_mask
  778. AGGREGATE_REALS_IMAGES vs32,vs0,vs40,vs4
  779. AGGREGATE_REALS_IMAGES vs33,vs1,vs41,vs5
  780. AGGREGATE_REALS_IMAGES vs36,vs8,vs44,vs12
  781. AGGREGATE_REALS_IMAGES vs37,vs9,vs45,vs13
  782. xxperm vs0,vs48,permute_mask
  783. xxperm vs4,vs56,permute_mask
  784. xxperm vs1,vs49,permute_mask
  785. xxperm vs5,vs57,permute_mask
  786. xxperm vs8,vs52,permute_mask
  787. xxperm vs12,vs60,permute_mask
  788. xxperm vs9,vs53,permute_mask
  789. xxperm vs13,vs61,permute_mask
  790. AGGREGATE_REALS_IMAGES vs48,vs0,vs56,vs4
  791. AGGREGATE_REALS_IMAGES vs49,vs1,vs57,vs5
  792. AGGREGATE_REALS_IMAGES vs52,vs8,vs60,vs12
  793. AGGREGATE_REALS_IMAGES vs53,vs9,vs61,vs13
  794. /*VSINRR,VSINII,VSOUT1,VSOUT2*/
  795. MULT_APLHA_PART1 vs32,vs40,vs0,vs1
  796. MULT_APLHA_PART1 vs33,vs41,vs2,vs3
  797. MULT_APLHA_PART1 vs36,vs44,vs8,vs9
  798. MULT_APLHA_PART1 vs37,vs45,vs10,vs11
  799. MULT_APLHA_PART1 vs48,vs56,vs4,vs5
  800. MULT_APLHA_PART1 vs49,vs57,vs6,vs7
  801. MULT_APLHA_PART1 vs52,vs60,vs12,vs13
  802. MULT_APLHA_PART1 vs53,vs61,vs14,vs15
  803. MULT_APLHA_PART2 vs32,vs40,vs0,vs1
  804. MULT_APLHA_PART2 vs33,vs41,vs2,vs3
  805. MULT_APLHA_PART2 vs36,vs44,vs8,vs9
  806. MULT_APLHA_PART2 vs37,vs45,vs10,vs11
  807. MULT_APLHA_PART2 vs48,vs56,vs4,vs5
  808. MULT_APLHA_PART2 vs49,vs57,vs6,vs7
  809. MULT_APLHA_PART2 vs52,vs60,vs12,vs13
  810. MULT_APLHA_PART2 vs53,vs61,vs14,vs15
  811. /* reconstruct r,i pairs*/
  812. xxperm vs0,vs1, save_permute_1
  813. xxperm vs2,vs3, save_permute_1
  814. xxperm vs8,vs9, save_permute_1
  815. xxperm vs10,vs11, save_permute_1
  816. xxperm vs4,vs5, save_permute_1
  817. xxperm vs6,vs7, save_permute_1
  818. xxperm vs12,vs13, save_permute_1
  819. xxperm vs14,vs15, save_permute_1
  820. #ifndef TRMMKERNEL
  821. /* add */
  822. xxpermdi vs1,vs8,vs0,2
  823. xxpermdi vs3,vs10,vs2,2
  824. xxpermdi vs9,vs0,vs8,2
  825. xxpermdi vs11,vs2,vs10,2
  826. xxpermdi vs5,vs12,vs4,2
  827. xxpermdi vs7,vs14,vs6,2
  828. xxpermdi vs13,vs4,vs12,2
  829. xxpermdi vs15,vs6,vs14,2
  830. xvaddsp vs24,vs24,vs1
  831. xvaddsp vs25,vs25,vs3
  832. xvaddsp vs26,vs26,vs9
  833. xvaddsp vs27,vs27,vs11
  834. xvaddsp vs28,vs28,vs5
  835. xvaddsp vs29,vs29,vs7
  836. xvaddsp vs30,vs30,vs13
  837. xvaddsp vs31,vs31,vs15
  838. #else
  839. xxpermdi vs24,vs8,vs0,2
  840. xxpermdi vs25,vs10,vs2,2
  841. xxpermdi vs26,vs0,vs8,2
  842. xxpermdi vs27,vs2,vs10,2
  843. xxpermdi vs28,vs12,vs4,2
  844. xxpermdi vs29,vs14,vs6,2
  845. xxpermdi vs30,vs4,vs12,2
  846. xxpermdi vs31,vs6,vs14,2
  847. #endif
  848. stxv vs24 , 0(CO)
  849. stxv vs25 , 16(CO)
  850. stxv vs26 , 0(T1)
  851. stxv vs27 , 16(T1)
  852. stxv vs28 , 0(T2)
  853. stxv vs29 , 16(T2)
  854. stxv vs30 , 0(T3)
  855. stxv vs31 , 16(T3)
  856. addi CO, CO, 32
  857. .endm
  858. /* macros for N=4 and M=2
  859. **********************************************************************************************/
  860. .macro Zero4x2
  861. xxlxor vs32, vs32, vs32
  862. xxlxor vs33, vs33, vs33
  863. xxlxor vs36, vs36, vs36
  864. xxlxor vs37, vs37, vs37
  865. xxlxor vs40, vs40, vs40
  866. xxlxor vs41, vs41, vs41
  867. xxlxor vs44, vs44, vs44
  868. xxlxor vs45, vs45, vs45
  869. .endm
  870. .macro LOAD4x2
  871. LOAD4x2O 0,0
  872. .endm
  873. .macro LOAD4x2O OffsetA,OffsetB
  874. lxv vs24, (\OffsetA+0)(AO)
  875. lxv vs0, (\OffsetB+0)(BO)
  876. lxv vs1, (\OffsetB+16)(BO)
  877. xxperm vs26, vs24, permute_mask
  878. xxpermdi vs25, vs24, vs24,2
  879. xxpermdi vs27, vs26, vs26,2
  880. .endm
  881. .macro END4x2_NORMAL
  882. END4x2 AO,BO,16,32
  883. .endm
  884. .macro END4x2_WITHOUT_ADD
  885. END4x2 AO,BO,0,0
  886. .endm
  887. .macro END4x2 AREG, BREG, OffsetA, OffsetB
  888. .if \OffsetB != 0
  889. addi \BREG, \BREG, \OffsetB
  890. .endif
  891. .if \OffsetA != 0
  892. addi \AREG, \AREG, \OffsetA
  893. .endif
  894. xvmaddasp vs32, vs0,vs24
  895. xvmaddasp vs33, vs1,vs24
  896. xvmaddasp vs36, vs0,vs25
  897. xvmaddasp vs37, vs1,vs25
  898. xvmaddasp vs40, vs0,vs26
  899. xvmaddasp vs41, vs1,vs26
  900. xvmaddasp vs44, vs0,vs27
  901. xvmaddasp vs45, vs1,vs27
  902. .endm
  903. .macro LOAD4x2_2
  904. LOAD4x2_2O 0,0
  905. .endm
  906. .macro LOAD4x2_2O OffsetA,OffsetB
  907. lxv vs8, (\OffsetA)(AO)
  908. lxv vs24, (16+\OffsetA)(AO)
  909. lxv vs4, (0+\OffsetB)(BO)
  910. lxv vs5, (16+\OffsetB)(BO)
  911. xxperm vs10, vs8, permute_mask
  912. xxpermdi vs9, vs8, vs8,2
  913. xxperm vs26, vs24, permute_mask
  914. xxpermdi vs25, vs24, vs24,2
  915. lxv vs0, (32+\OffsetB)(BO)
  916. lxv vs1, (32+16+\OffsetB)(BO)
  917. xxpermdi vs11, vs10, vs10,2
  918. xxpermdi vs27, vs26, vs26,2
  919. .endm
  920. .macro END4x2_2
  921. /*for load2 offset will be 32 and 64*/
  922. KERNEL4x2_2 AO,BO, 32,64,0 ,1,1
  923. .endm
  924. .macro KERNEL4x2_E2 OffsetA,OffsetB, Index,IsLast
  925. KERNEL4x2_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  926. .endm
  927. .macro KERNEL4x2_L2 OffsetA,OffsetB, Index,IsLast
  928. KERNEL4x2_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  929. .endm
  930. .macro KERNEL4x2_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  931. xvmaddasp vs32, vs4,vs8
  932. xvmaddasp vs33, vs5,vs8
  933. xvmaddasp vs40, vs4,vs10
  934. xvmaddasp vs41, vs5,vs10
  935. .if \Complete==0
  936. lxv vs8, DISP4(\Index,\OffsetA)(\AREG)
  937. .endif
  938. xvmaddasp vs36, vs4,vs9
  939. xvmaddasp vs37, vs5,vs9
  940. xvmaddasp vs44, vs4,vs11
  941. xvmaddasp vs45, vs5,vs11
  942. .if \Complete==0
  943. xxperm vs10, vs8, permute_mask
  944. xxpermdi vs9, vs8, vs8,2
  945. .endif
  946. .if \Complete==0
  947. lxv vs4, DISP8(\Index,0+\OffsetB)(\BREG)
  948. lxv vs5, DISP8(\Index,16+\OffsetB)(\BREG)
  949. .endif
  950. .if \Complete==0
  951. xxpermdi vs11, vs10, vs10,2
  952. .endif
  953. xvmaddasp vs32, vs0,vs24
  954. xvmaddasp vs33, vs1,vs24
  955. xvmaddasp vs40, vs0,vs26
  956. xvmaddasp vs41, vs1,vs26
  957. .if \Complete==0
  958. lxv vs24, DISP4(\Index,16+\OffsetA)(\AREG)
  959. .endif
  960. xvmaddasp vs36, vs0,vs25
  961. xvmaddasp vs37, vs1,vs25
  962. xvmaddasp vs44, vs0,vs27
  963. xvmaddasp vs45, vs1,vs27
  964. .if \Complete==0
  965. xxperm vs26, vs24, permute_mask
  966. xxpermdi vs25, vs24, vs24,2
  967. .endif
  968. .if \Complete==0
  969. lxv vs0, DISP8(\Index,32+\OffsetB)(\BREG)
  970. lxv vs1, DISP8(\Index,32+16+\OffsetB)(\BREG)
  971. .endif
  972. .if \Complete==0
  973. xxpermdi vs27, vs26, vs26,2
  974. .endif
  975. .if \IsLast==1
  976. .if \Complete==1
  977. addi \AREG, \AREG, DISP4(\Index,\OffsetA)
  978. addi \BREG, \BREG, DISP8(\Index,\OffsetB)
  979. .else
  980. addi \AREG, \AREG, DISP4(\Index,32)
  981. addi \BREG, \BREG, DISP8(\Index,64)
  982. .endif
  983. .endif
  984. .endm
  985. .macro KERNEL4x2
  986. LOAD4x2
  987. END4x2 AO, BO, 16,32
  988. .endm
  989. .macro SAVE4x2
  990. add T4, LDC,LDC
  991. add T1, CO ,LDC
  992. add T2,CO,T4
  993. add T3,T1,T4
  994. #ifndef TRMMKERNEL
  995. lxv vs24 , 0(CO)
  996. #endif
  997. #ifndef TRMMKERNEL
  998. lxv vs25 , 0(T1)
  999. #endif
  1000. #ifndef TRMMKERNEL
  1001. lxv vs26 , 0(T2)
  1002. #endif
  1003. #ifndef TRMMKERNEL
  1004. lxv vs27 , 0(T3)
  1005. #endif
  1006. xxperm vs0,vs32,permute_mask
  1007. xxperm vs4,vs40,permute_mask
  1008. xxperm vs1,vs33,permute_mask
  1009. xxperm vs5,vs41,permute_mask
  1010. xxperm vs8,vs36,permute_mask
  1011. xxperm vs12,vs44,permute_mask
  1012. xxperm vs9,vs37,permute_mask
  1013. xxperm vs13,vs45,permute_mask
  1014. AGGREGATE_REALS_IMAGES_A_PERMUTE vs32,vs0,vs40,vs4
  1015. AGGREGATE_REALS_IMAGES_A_PERMUTE vs33,vs1,vs41,vs5
  1016. AGGREGATE_REALS_IMAGES_A_PERMUTE vs36,vs8,vs44,vs12
  1017. AGGREGATE_REALS_IMAGES_A_PERMUTE vs37,vs9,vs45,vs13
  1018. /*VSINRR,VSINII,VSOUT1,VSOUT2*/
  1019. MULT_APLHA_PART1 vs32,vs40,vs0,vs1
  1020. MULT_APLHA_PART1 vs33,vs41,vs2,vs3
  1021. MULT_APLHA_PART1 vs36,vs44,vs8,vs9
  1022. MULT_APLHA_PART1 vs37,vs45,vs10,vs11
  1023. MULT_APLHA_PART2 vs32,vs40,vs0,vs1
  1024. MULT_APLHA_PART2 vs33,vs41,vs2,vs3
  1025. MULT_APLHA_PART2 vs36,vs44,vs8,vs9
  1026. MULT_APLHA_PART2 vs37,vs45,vs10,vs11
  1027. /* reconstruct r,i pairs*/
  1028. xxperm vs0,vs1, save_permute_1
  1029. xxperm vs2,vs3, save_permute_1
  1030. xxperm vs8,vs9, save_permute_1
  1031. xxperm vs10,vs11, save_permute_1
  1032. #ifndef TRMMKERNEL
  1033. /* add */
  1034. xxpermdi vs1,vs8,vs0,0
  1035. xxpermdi vs9,vs10,vs2,0
  1036. xxpermdi vs3,vs0,vs8,3
  1037. xxpermdi vs11,vs2,vs10,3
  1038. xvaddsp vs24,vs24,vs1
  1039. xvaddsp vs26,vs26,vs9
  1040. xvaddsp vs25,vs25,vs3
  1041. xvaddsp vs27,vs27,vs11
  1042. #else
  1043. xxpermdi vs24,vs8,vs0,0
  1044. xxpermdi vs26,vs10,vs2,0
  1045. xxpermdi vs25,vs0,vs8,3
  1046. xxpermdi vs27,vs2,vs10,3
  1047. #endif
  1048. stxv vs24 , 0(CO)
  1049. stxv vs25 , 0(T1)
  1050. stxv vs26 , 0(T2)
  1051. stxv vs27 , 0(T3)
  1052. addi CO, CO, 16
  1053. .endm
  1054. /* macros for N=4 and M=2
  1055. **********************************************************************************************/
  1056. .macro Zero4x1
  1057. xxlxor vs32, vs32, vs32
  1058. xxlxor vs33, vs33, vs33
  1059. xxlxor vs40, vs40, vs40
  1060. xxlxor vs41, vs41, vs41
  1061. .endm
  1062. .macro LOAD4x1
  1063. LOAD4x1O 0,0
  1064. .endm
  1065. .macro LOAD4x1O OffsetA,OffsetB
  1066. lxsd v4, (\OffsetA+0)(AO)
  1067. lxv vs0, (\OffsetB+0)(BO)
  1068. lxv vs1, (\OffsetB+16)(BO)
  1069. xxspltd vs24,vs36,0
  1070. xxperm vs26, vs24, permute_mask
  1071. .endm
  1072. .macro END4x1_NORMAL
  1073. END4x1 AO,BO,8,32
  1074. .endm
  1075. .macro END4x1_WITHOUT_ADD
  1076. END4x1 AO,BO,0,0
  1077. .endm
  1078. .macro END4x1 AREG, BREG, OffsetA, OffsetB
  1079. .if \OffsetB != 0
  1080. addi \BREG, \BREG, \OffsetB
  1081. .endif
  1082. .if \OffsetA != 0
  1083. addi \AREG, \AREG, \OffsetA
  1084. .endif
  1085. xvmaddasp vs32, vs0,vs24
  1086. xvmaddasp vs33, vs1,vs24
  1087. xvmaddasp vs40, vs0,vs26
  1088. xvmaddasp vs41, vs1,vs26
  1089. .endm
  1090. .macro LOAD4x1_2
  1091. LOAD4x1_2O 0,0
  1092. .endm
  1093. .macro LOAD4x1_2O OffsetA,OffsetB
  1094. lxv vs27, (\OffsetA)(AO)
  1095. xxspltd vs8,vs27,1
  1096. xxspltd vs24,vs27,0
  1097. lxv vs4, (0+\OffsetB)(BO)
  1098. lxv vs5, (16+\OffsetB)(BO)
  1099. xxperm vs10, vs8, permute_mask
  1100. xxperm vs26, vs24, permute_mask
  1101. lxv vs0, (32+\OffsetB)(BO)
  1102. lxv vs1, (32+16+\OffsetB)(BO)
  1103. .endm
  1104. .macro END4x1_2
  1105. /*for load2 offset will be 16 and 64*/
  1106. KERNEL4x1_2 AO,BO, 16,64,0 ,1,1
  1107. .endm
  1108. .macro KERNEL4x1_E2 OffsetA,OffsetB, Index,IsLast
  1109. KERNEL4x1_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  1110. .endm
  1111. .macro KERNEL4x1_L2 OffsetA,OffsetB, Index,IsLast
  1112. KERNEL4x1_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  1113. .endm
  1114. .macro KERNEL4x1_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  1115. xvmaddasp vs32, vs4,vs8
  1116. xvmaddasp vs33, vs5,vs8
  1117. xvmaddasp vs40, vs4,vs10
  1118. xvmaddasp vs41, vs5,vs10
  1119. .if \Complete==0
  1120. lxv vs27, DISP2(\Index,\OffsetA)(\AREG)
  1121. xxspltd vs8,vs27,1
  1122. .endif
  1123. .if \Complete==0
  1124. lxv vs4, DISP8(\Index,0+\OffsetB)(\BREG)
  1125. lxv vs5, DISP8(\Index,16+\OffsetB)(\BREG)
  1126. .endif
  1127. .if \Complete==0
  1128. xxperm vs10, vs8, permute_mask
  1129. .endif
  1130. xvmaddasp vs32, vs0,vs24
  1131. xvmaddasp vs33, vs1,vs24
  1132. xvmaddasp vs40, vs0,vs26
  1133. xvmaddasp vs41, vs1,vs26
  1134. .if \Complete==0
  1135. xxspltd vs24,vs27,0
  1136. xxperm vs26, vs24, permute_mask
  1137. .endif
  1138. .if \Complete==0
  1139. lxv vs0, DISP8(\Index,32+\OffsetB)(\BREG)
  1140. lxv vs1, DISP8(\Index,32+16+\OffsetB)(\BREG)
  1141. .endif
  1142. .if \IsLast==1
  1143. .if \Complete==1
  1144. addi \AREG, \AREG, DISP2(\Index,\OffsetA)
  1145. addi \BREG, \BREG, DISP8(\Index,\OffsetB)
  1146. .else
  1147. addi \AREG, \AREG, DISP2(\Index,16)
  1148. addi \BREG, \BREG, DISP8(\Index,64)
  1149. .endif
  1150. .endif
  1151. .endm
  1152. .macro KERNEL4x1
  1153. LOAD4x1
  1154. END4x1 AO, BO, 8,32
  1155. .endm
  1156. .macro SAVE4x1
  1157. add T4, LDC,LDC
  1158. add T1, CO ,LDC
  1159. add T2,CO,T4
  1160. add T3,T1,T4
  1161. #ifndef TRMMKERNEL
  1162. lxsd v4 , 0(CO)
  1163. #endif
  1164. #ifndef TRMMKERNEL
  1165. lxsd v5 , 0(T1)
  1166. #endif
  1167. #ifndef TRMMKERNEL
  1168. lxsd v6 , 0(T2)
  1169. #endif
  1170. #ifndef TRMMKERNEL
  1171. lxsd v7 , 0(T3)
  1172. #endif
  1173. xxperm vs0,vs32,permute_mask
  1174. xxperm vs4,vs40,permute_mask
  1175. xxperm vs1,vs33,permute_mask
  1176. xxperm vs5,vs41,permute_mask
  1177. AGGREGATE_REALS_IMAGES_A_PERMUTE vs32,vs0,vs40,vs4
  1178. AGGREGATE_REALS_IMAGES_A_PERMUTE vs33,vs1,vs41,vs5
  1179. /*VSINRR,VSINII,VSOUT1,VSOUT2*/
  1180. MULT_APLHA_PART1 vs32,vs40,vs0,vs1
  1181. MULT_APLHA_PART1 vs33,vs41,vs2,vs3
  1182. MULT_APLHA_PART2 vs32,vs40,vs0,vs1
  1183. MULT_APLHA_PART2 vs33,vs41,vs2,vs3
  1184. /* reconstruct r,i pairs*/
  1185. xxperm vs0,vs1, save_permute_1
  1186. xxperm vs2,vs3, save_permute_1
  1187. #ifndef TRMMKERNEL
  1188. /* add */
  1189. xxspltd vs1,vs0,0
  1190. xxspltd vs3,vs0,1
  1191. xxspltd vs9,vs2,0
  1192. xxspltd vs11,vs2,1
  1193. /*--v4==vs36 v5==vs37 v6==vs38 v7==vs39---*/
  1194. xvaddsp vs36,vs36,vs1
  1195. xvaddsp vs37,vs37,vs3
  1196. xvaddsp vs38,vs38,vs9
  1197. xvaddsp vs39,vs39,vs11
  1198. #else
  1199. /*--v4==vs36 v5==vs37 v6==vs38 v7==vs39---*/
  1200. xxspltd vs36,vs0,0
  1201. xxspltd vs37,vs0,1
  1202. xxspltd vs38,vs2,0
  1203. xxspltd vs39,vs2,1
  1204. #endif
  1205. stxsd v4 , 0(CO)
  1206. stxsd v5 , 0(T1)
  1207. stxsd v6 , 0(T2)
  1208. stxsd v7 , 0(T3)
  1209. addi CO, CO, 8
  1210. .endm
  1211. /* macros for N=2 and M=8
  1212. **********************************************************************************************/
  1213. .macro Zero2x8
  1214. xxlxor vs32, vs32, vs32
  1215. xxlxor vs33, vs33, vs33
  1216. xxlxor vs34, vs34, vs34
  1217. xxlxor vs35, vs35, vs35
  1218. xxlxor vs36, vs36, vs36
  1219. xxlxor vs37, vs37, vs37
  1220. xxlxor vs38, vs38, vs38
  1221. xxlxor vs39, vs39, vs39
  1222. xxlxor vs40, vs40, vs40
  1223. xxlxor vs41, vs41, vs41
  1224. xxlxor vs42, vs42, vs42
  1225. xxlxor vs43, vs43, vs43
  1226. xxlxor vs44, vs44, vs44
  1227. xxlxor vs45, vs45, vs45
  1228. xxlxor vs46, vs46, vs46
  1229. xxlxor vs47, vs47, vs47
  1230. .endm
  1231. .macro LOAD2x8
  1232. LOAD2x8O 0,0
  1233. .endm
  1234. .macro LOAD2x8O OffsetA,OffsetB
  1235. lxv vs24, (\OffsetB+0)(BO)
  1236. xxperm vs26, vs24, permute_mask
  1237. lxv vs0, (\OffsetA+0)(AO)
  1238. lxv vs1, (\OffsetA+16)(AO)
  1239. lxv vs2, (\OffsetA+32)(AO)
  1240. lxv vs3, (\OffsetA+48)(AO)
  1241. xxpermdi vs25, vs24, vs24,2
  1242. xxpermdi vs27, vs26, vs26,2
  1243. .endm
  1244. .macro END2x8_NORMAL
  1245. END2x8 AO,BO,64,16
  1246. .endm
  1247. .macro END2x8_WITHOUT_ADD
  1248. END2x8 AO,BO,0,0
  1249. .endm
  1250. .macro END2x8 AREG, BREG, OffsetA, OffsetB
  1251. .if \OffsetB != 0
  1252. addi \BREG, \BREG, \OffsetB
  1253. .endif
  1254. .if \OffsetA != 0
  1255. addi \AREG, \AREG, \OffsetA
  1256. .endif
  1257. xvmaddasp vs32, vs0,vs24
  1258. xvmaddasp vs33, vs1,vs24
  1259. xvmaddasp vs34, vs2,vs24
  1260. xvmaddasp vs35, vs3,vs24
  1261. xvmaddasp vs36, vs0,vs25
  1262. xvmaddasp vs37, vs1,vs25
  1263. xvmaddasp vs38, vs2,vs25
  1264. xvmaddasp vs39, vs3,vs25
  1265. xvmaddasp vs40, vs0,vs26
  1266. xvmaddasp vs41, vs1,vs26
  1267. xvmaddasp vs42, vs2,vs26
  1268. xvmaddasp vs43, vs3,vs26
  1269. xvmaddasp vs44, vs0,vs27
  1270. xvmaddasp vs45, vs1,vs27
  1271. xvmaddasp vs46, vs2,vs27
  1272. xvmaddasp vs47, vs3,vs27
  1273. .endm
  1274. .macro LOAD2x8_2
  1275. LOAD2x8_2O 0,0
  1276. .endm
  1277. .macro LOAD2x8_2O OffsetA,OffsetB
  1278. lxv vs8, (\OffsetB)(BO)
  1279. lxv vs24, (16+\OffsetB)(BO)
  1280. lxv vs4, (0+\OffsetA)(AO)
  1281. lxv vs5, (16+\OffsetA)(AO)
  1282. xxperm vs10, vs8, permute_mask
  1283. xxperm vs26, vs24, permute_mask
  1284. lxv vs6, (32+\OffsetA)(AO)
  1285. lxv vs7, (48+\OffsetA)(AO)
  1286. lxv vs0, (64+\OffsetA)(AO)
  1287. lxv vs1, (64+16+\OffsetA)(AO)
  1288. xxpermdi vs9, vs8, vs8,2
  1289. xxpermdi vs25, vs24, vs24,2
  1290. lxv vs2, (64+32+\OffsetA)(AO)
  1291. lxv vs3, (64+48+\OffsetA)(AO)
  1292. xxpermdi vs11, vs10, vs10,2
  1293. xxpermdi vs27, vs26, vs26,2
  1294. .endm
  1295. .macro END2x8_2
  1296. /*for load2 offset will be 128 and 32*/
  1297. KERNEL2x8_2 AO,BO, 128,32,0 ,1,1
  1298. .endm
  1299. .macro KERNEL2x8_E2 OffsetA,OffsetB, Index,IsLast
  1300. KERNEL2x8_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  1301. .endm
  1302. .macro KERNEL2x8_L2 OffsetA,OffsetB, Index,IsLast
  1303. KERNEL2x8_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  1304. .endm
  1305. .macro KERNEL2x8_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  1306. xvmaddasp vs32, vs4,vs8
  1307. xvmaddasp vs33, vs5,vs8
  1308. xvmaddasp vs40, vs4,vs10
  1309. xvmaddasp vs41, vs5,vs10
  1310. xvmaddasp vs36, vs4,vs9
  1311. xvmaddasp vs37, vs5,vs9
  1312. xvmaddasp vs44, vs4,vs11
  1313. xvmaddasp vs45, vs5,vs11
  1314. .if \Complete==0
  1315. lxv vs4, DISP16(\Index,0+\OffsetA)(\AREG)
  1316. lxv vs5, DISP16(\Index,16+\OffsetA)(\AREG)
  1317. .endif
  1318. xvmaddasp vs34, vs6,vs8
  1319. xvmaddasp vs35, vs7,vs8
  1320. .if \Complete==0
  1321. lxv vs8, DISP4(\Index,\OffsetB)(\BREG)
  1322. .endif
  1323. xvmaddasp vs42, vs6,vs10
  1324. xvmaddasp vs43, vs7,vs10
  1325. xvmaddasp vs38, vs6,vs9
  1326. xvmaddasp vs39, vs7,vs9
  1327. .if \Complete==0
  1328. xxperm vs10, vs8, permute_mask
  1329. xxpermdi vs9, vs8, vs8,2
  1330. .endif
  1331. xvmaddasp vs46, vs6,vs11
  1332. xvmaddasp vs47, vs7,vs11
  1333. .if \Complete==0
  1334. xxpermdi vs11, vs10, vs10,2
  1335. .endif
  1336. .if \Complete==0
  1337. lxv vs6, DISP16(\Index,32+\OffsetA)(\AREG)
  1338. lxv vs7, DISP16(\Index,48+\OffsetA)(\AREG)
  1339. .endif
  1340. xvmaddasp vs32, vs0,vs24
  1341. xvmaddasp vs33, vs1,vs24
  1342. xvmaddasp vs40, vs0,vs26
  1343. xvmaddasp vs41, vs1,vs26
  1344. xvmaddasp vs36, vs0,vs25
  1345. xvmaddasp vs37, vs1,vs25
  1346. xvmaddasp vs44, vs0,vs27
  1347. xvmaddasp vs45, vs1,vs27
  1348. .if \Complete==0
  1349. lxv vs0, DISP16(\Index,64+\OffsetA)(\AREG)
  1350. lxv vs1, DISP16(\Index,64+16+\OffsetA)(\AREG)
  1351. .endif
  1352. xvmaddasp vs34, vs2,vs24
  1353. xvmaddasp vs35, vs3,vs24
  1354. .if \Complete==0
  1355. lxv vs24, DISP4(\Index,16+\OffsetB)(\BREG)
  1356. .endif
  1357. xvmaddasp vs42, vs2,vs26
  1358. xvmaddasp vs43, vs3,vs26
  1359. xvmaddasp vs38, vs2,vs25
  1360. xvmaddasp vs39, vs3,vs25
  1361. .if \Complete==0
  1362. xxperm vs26, vs24, permute_mask
  1363. xxpermdi vs25, vs24, vs24,2
  1364. .endif
  1365. xvmaddasp vs46, vs2,vs27
  1366. xvmaddasp vs47, vs3,vs27
  1367. .if \Complete==0
  1368. xxpermdi vs27, vs26, vs26,2
  1369. .endif
  1370. .if \Complete==0
  1371. lxv vs2, DISP16(\Index,64+32+\OffsetA)(\AREG)
  1372. lxv vs3, DISP16(\Index,64+48+\OffsetA)(\AREG)
  1373. .endif
  1374. .if \IsLast==1
  1375. .if \Complete==1
  1376. addi \BREG, \BREG, DISP4(\Index,\OffsetB)
  1377. addi \AREG, \AREG, DISP16(\Index,\OffsetA)
  1378. .else
  1379. addi \BREG, \BREG, DISP4(\Index,32)
  1380. addi \AREG, \AREG, DISP16(\Index,128)
  1381. .endif
  1382. .endif
  1383. .endm
  1384. .macro KERNEL2x8
  1385. LOAD2x8
  1386. END2x8 AO, BO, 64,16
  1387. .endm
  1388. .macro SAVE2x8
  1389. add T1, CO ,LDC
  1390. #ifndef TRMMKERNEL
  1391. lxv vs24 , 0(CO)
  1392. lxv vs25 , 16(CO)
  1393. #endif
  1394. xxperm vs0,vs32,permute_mask
  1395. xxperm vs4,vs40,permute_mask
  1396. #ifndef TRMMKERNEL
  1397. lxv vs26 , 32(CO)
  1398. lxv vs27 , 48(CO)
  1399. #endif
  1400. xxperm vs1,vs33,permute_mask
  1401. xxperm vs5,vs41,permute_mask
  1402. #ifndef TRMMKERNEL
  1403. lxv vs28 , 0(T1)
  1404. lxv vs29 , 16(T1)
  1405. #endif
  1406. xxperm vs2,vs34,permute_mask
  1407. xxperm vs6,vs42,permute_mask
  1408. #ifndef TRMMKERNEL
  1409. lxv vs30 , 32(T1)
  1410. lxv vs31 , 48(T1)
  1411. #endif
  1412. xxperm vs3,vs35,permute_mask
  1413. xxperm vs7,vs43,permute_mask
  1414. add T2,CO,T4
  1415. add T3,T1,T4
  1416. AGGREGATE_REALS_IMAGES vs32,vs0,vs40,vs4
  1417. xxperm vs8,vs36,permute_mask
  1418. xxperm vs12,vs44,permute_mask
  1419. AGGREGATE_REALS_IMAGES vs33,vs1,vs41,vs5
  1420. xxperm vs9,vs37,permute_mask
  1421. xxperm vs13,vs45,permute_mask
  1422. AGGREGATE_REALS_IMAGES vs34,vs2,vs42,vs6
  1423. xxperm vs10,vs38,permute_mask
  1424. xxperm vs14,vs46,permute_mask
  1425. AGGREGATE_REALS_IMAGES vs35,vs3,vs43,vs7
  1426. xxperm vs11,vs39,permute_mask
  1427. xxperm vs15,vs47,permute_mask
  1428. AGGREGATE_REALS_IMAGES vs36,vs8,vs44,vs12
  1429. AGGREGATE_REALS_IMAGES vs37,vs9,vs45,vs13
  1430. AGGREGATE_REALS_IMAGES vs38,vs10,vs46,vs14
  1431. AGGREGATE_REALS_IMAGES vs39,vs11,vs47,vs15
  1432. /*VSINRR,VSINII,VSOUT1,VSOUT2*/
  1433. MULT_APLHA_PART1 vs32,vs40,vs0,vs1
  1434. MULT_APLHA_PART1 vs33,vs41,vs2,vs3
  1435. MULT_APLHA_PART1 vs34,vs42,vs4,vs5
  1436. MULT_APLHA_PART1 vs35,vs43,vs6,vs7
  1437. MULT_APLHA_PART2 vs32,vs40,vs0,vs1
  1438. MULT_APLHA_PART2 vs33,vs41,vs2,vs3
  1439. MULT_APLHA_PART2 vs34,vs42,vs4,vs5
  1440. MULT_APLHA_PART2 vs35,vs43,vs6,vs7
  1441. MULT_APLHA_PART1 vs36,vs44,vs8,vs9
  1442. MULT_APLHA_PART1 vs37,vs45,vs10,vs11
  1443. MULT_APLHA_PART1 vs38,vs46,vs12,vs13
  1444. MULT_APLHA_PART1 vs39,vs47,vs14,vs15
  1445. MULT_APLHA_PART2 vs36,vs44,vs8,vs9
  1446. MULT_APLHA_PART2 vs37,vs45,vs10,vs11
  1447. MULT_APLHA_PART2 vs38,vs46,vs12,vs13
  1448. MULT_APLHA_PART2 vs39,vs47,vs14,vs15
  1449. /* reconstruct r,i pairs*/
  1450. xxperm vs0,vs1, save_permute_1
  1451. xxperm vs2,vs3, save_permute_1
  1452. xxperm vs4,vs5, save_permute_1
  1453. xxperm vs6,vs7, save_permute_1
  1454. xxperm vs8,vs9, save_permute_1
  1455. xxperm vs10,vs11, save_permute_1
  1456. xxperm vs12,vs13, save_permute_1
  1457. xxperm vs14,vs15, save_permute_1
  1458. #ifndef TRMMKERNEL
  1459. /* add */
  1460. xxpermdi vs1,vs8,vs0,2
  1461. xxpermdi vs3,vs10,vs2,2
  1462. xxpermdi vs5,vs12,vs4,2
  1463. xxpermdi vs7,vs14,vs6,2
  1464. xxpermdi vs9,vs0,vs8,2
  1465. xxpermdi vs11,vs2,vs10,2
  1466. xvaddsp vs24,vs24,vs1
  1467. xvaddsp vs25,vs25,vs3
  1468. xxpermdi vs13,vs4,vs12,2
  1469. xxpermdi vs15,vs6,vs14,2
  1470. xvaddsp vs26,vs26,vs5
  1471. xvaddsp vs27,vs27,vs7
  1472. xvaddsp vs28,vs28,vs9
  1473. xvaddsp vs29,vs29,vs11
  1474. xvaddsp vs30,vs30,vs13
  1475. xvaddsp vs31,vs31,vs15
  1476. #else
  1477. xxpermdi vs24,vs8,vs0,2
  1478. xxpermdi vs25,vs10,vs2,2
  1479. xxpermdi vs26,vs12,vs4,2
  1480. xxpermdi vs27,vs14,vs6,2
  1481. xxpermdi vs28,vs0,vs8,2
  1482. xxpermdi vs29,vs2,vs10,2
  1483. xxpermdi vs30,vs4,vs12,2
  1484. xxpermdi vs31,vs6,vs14,2
  1485. #endif
  1486. stxv vs24 , 0(CO)
  1487. stxv vs25 , 16(CO)
  1488. stxv vs26 , 32(CO)
  1489. stxv vs27 , 48(CO)
  1490. stxv vs28 , 0(T1)
  1491. stxv vs29 , 16(T1)
  1492. stxv vs30 , 32(T1)
  1493. stxv vs31 , 48(T1)
  1494. addi CO, CO, 64
  1495. .endm
  1496. /* macros for N=2 and M=4
  1497. **********************************************************************************************/
  1498. .macro Zero2x4
  1499. xxlxor vs32, vs32, vs32
  1500. xxlxor vs33, vs33, vs33
  1501. xxlxor vs36, vs36, vs36
  1502. xxlxor vs37, vs37, vs37
  1503. xxlxor vs40, vs40, vs40
  1504. xxlxor vs41, vs41, vs41
  1505. xxlxor vs44, vs44, vs44
  1506. xxlxor vs45, vs45, vs45
  1507. .endm
  1508. .macro LOAD2x4
  1509. LOAD2x4O 0,0
  1510. .endm
  1511. .macro LOAD2x4O OffsetA,OffsetB
  1512. lxv vs24, (\OffsetB+0)(BO)
  1513. lxv vs0, (\OffsetA+0)(AO)
  1514. lxv vs1, (\OffsetA+16)(AO)
  1515. xxperm vs26, vs24, permute_mask
  1516. xxpermdi vs25, vs24, vs24,2
  1517. xxpermdi vs27, vs26, vs26,2
  1518. .endm
  1519. .macro END2x4_NORMAL
  1520. END2x4 AO,BO,32,16
  1521. .endm
  1522. .macro END2x4_WITHOUT_ADD
  1523. END2x4 AO,BO,0,0
  1524. .endm
  1525. .macro END2x4 AREG, BREG, OffsetA, OffsetB
  1526. .if \OffsetB != 0
  1527. addi \BREG, \BREG, \OffsetB
  1528. .endif
  1529. .if \OffsetA != 0
  1530. addi \AREG, \AREG, \OffsetA
  1531. .endif
  1532. xvmaddasp vs32, vs0,vs24
  1533. xvmaddasp vs33, vs1,vs24
  1534. xvmaddasp vs36, vs0,vs25
  1535. xvmaddasp vs37, vs1,vs25
  1536. xvmaddasp vs40, vs0,vs26
  1537. xvmaddasp vs41, vs1,vs26
  1538. xvmaddasp vs44, vs0,vs27
  1539. xvmaddasp vs45, vs1,vs27
  1540. .endm
  1541. .macro LOAD2x4_2
  1542. LOAD2x4_2O 0,0
  1543. .endm
  1544. .macro LOAD2x4_2O OffsetA,OffsetB
  1545. lxv vs8, (\OffsetB)(BO)
  1546. lxv vs24, (16+\OffsetB)(BO)
  1547. lxv vs4, (0+\OffsetA)(AO)
  1548. lxv vs5, (16+\OffsetA)(AO)
  1549. xxperm vs10, vs8, permute_mask
  1550. xxperm vs26, vs24, permute_mask
  1551. xxpermdi vs9, vs8, vs8,2
  1552. xxpermdi vs25, vs24, vs24,2
  1553. lxv vs0, (32+\OffsetA)(AO)
  1554. lxv vs1, (32+16+\OffsetA)(AO)
  1555. xxpermdi vs11, vs10, vs10,2
  1556. xxpermdi vs27, vs26, vs26,2
  1557. .endm
  1558. .macro END2x4_2
  1559. /*for load2 offset will be 64 and 32*/
  1560. KERNEL2x4_2 AO,BO, 64,32,0 ,1,1
  1561. .endm
  1562. .macro KERNEL2x4_E2 OffsetA,OffsetB, Index,IsLast
  1563. KERNEL2x4_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  1564. .endm
  1565. .macro KERNEL2x4_L2 OffsetA,OffsetB, Index,IsLast
  1566. KERNEL2x4_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  1567. .endm
  1568. .macro KERNEL2x4_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  1569. xvmaddasp vs32, vs4,vs8
  1570. xvmaddasp vs33, vs5,vs8
  1571. xvmaddasp vs40, vs4,vs10
  1572. xvmaddasp vs41, vs5,vs10
  1573. .if \Complete==0
  1574. lxv vs8, DISP4(\Index,\OffsetB)(\BREG)
  1575. .endif
  1576. xvmaddasp vs36, vs4,vs9
  1577. xvmaddasp vs37, vs5,vs9
  1578. xvmaddasp vs44, vs4,vs11
  1579. xvmaddasp vs45, vs5,vs11
  1580. .if \Complete==0
  1581. xxperm vs10, vs8, permute_mask
  1582. xxpermdi vs9, vs8, vs8,2
  1583. .endif
  1584. .if \Complete==0
  1585. lxv vs4, DISP8(\Index,0+\OffsetA)(\AREG)
  1586. lxv vs5, DISP8(\Index,16+\OffsetA)(\AREG)
  1587. .endif
  1588. .if \Complete==0
  1589. xxpermdi vs11, vs10, vs10,2
  1590. .endif
  1591. xvmaddasp vs32, vs0,vs24
  1592. xvmaddasp vs33, vs1,vs24
  1593. xvmaddasp vs40, vs0,vs26
  1594. xvmaddasp vs41, vs1,vs26
  1595. .if \Complete==0
  1596. lxv vs24, DISP4(\Index,16+\OffsetB)(\BREG)
  1597. .endif
  1598. xvmaddasp vs36, vs0,vs25
  1599. xvmaddasp vs37, vs1,vs25
  1600. xvmaddasp vs44, vs0,vs27
  1601. xvmaddasp vs45, vs1,vs27
  1602. .if \Complete==0
  1603. xxperm vs26, vs24, permute_mask
  1604. xxpermdi vs25, vs24, vs24,2
  1605. .endif
  1606. .if \Complete==0
  1607. lxv vs0, DISP8(\Index,32+\OffsetA)(\AREG)
  1608. lxv vs1, DISP8(\Index,32+16+\OffsetA)(\AREG)
  1609. .endif
  1610. .if \Complete==0
  1611. xxpermdi vs27, vs26, vs26,2
  1612. .endif
  1613. .if \IsLast==1
  1614. .if \Complete==1
  1615. addi \BREG, \BREG, DISP4(\Index,\OffsetB)
  1616. addi \AREG, \AREG, DISP8(\Index,\OffsetA)
  1617. .else
  1618. addi \BREG, \BREG, DISP4(\Index,32)
  1619. addi \AREG, \AREG, DISP8(\Index,64)
  1620. .endif
  1621. .endif
  1622. .endm
  1623. .macro KERNEL2x4
  1624. LOAD2x4
  1625. END2x4 AO, BO, 32,16
  1626. .endm
  1627. .macro SAVE2x4
  1628. add T1, CO ,LDC
  1629. #ifndef TRMMKERNEL
  1630. lxv vs24 , 0(CO)
  1631. lxv vs25 , 16(CO)
  1632. #endif
  1633. #ifndef TRMMKERNEL
  1634. lxv vs26 , 0(T1)
  1635. lxv vs27 , 16(T1)
  1636. #endif
  1637. xxperm vs0,vs32,permute_mask
  1638. xxperm vs4,vs40,permute_mask
  1639. xxperm vs1,vs33,permute_mask
  1640. xxperm vs5,vs41,permute_mask
  1641. xxperm vs8,vs36,permute_mask
  1642. xxperm vs12,vs44,permute_mask
  1643. xxperm vs9,vs37,permute_mask
  1644. xxperm vs13,vs45,permute_mask
  1645. AGGREGATE_REALS_IMAGES vs32,vs0,vs40,vs4
  1646. AGGREGATE_REALS_IMAGES vs33,vs1,vs41,vs5
  1647. AGGREGATE_REALS_IMAGES vs36,vs8,vs44,vs12
  1648. AGGREGATE_REALS_IMAGES vs37,vs9,vs45,vs13
  1649. /*VSINRR,VSINII,VSOUT1,VSOUT2*/
  1650. MULT_APLHA_PART1 vs32,vs40,vs0,vs1
  1651. MULT_APLHA_PART1 vs33,vs41,vs2,vs3
  1652. MULT_APLHA_PART1 vs36,vs44,vs8,vs9
  1653. MULT_APLHA_PART1 vs37,vs45,vs10,vs11
  1654. MULT_APLHA_PART2 vs32,vs40,vs0,vs1
  1655. MULT_APLHA_PART2 vs33,vs41,vs2,vs3
  1656. MULT_APLHA_PART2 vs36,vs44,vs8,vs9
  1657. MULT_APLHA_PART2 vs37,vs45,vs10,vs11
  1658. /* reconstruct r,i pairs*/
  1659. xxperm vs0,vs1, save_permute_1
  1660. xxperm vs2,vs3, save_permute_1
  1661. xxperm vs8,vs9, save_permute_1
  1662. xxperm vs10,vs11, save_permute_1
  1663. #ifndef TRMMKERNEL
  1664. /* add */
  1665. xxpermdi vs1,vs8,vs0,2
  1666. xxpermdi vs3,vs10,vs2,2
  1667. xxpermdi vs9,vs0,vs8,2
  1668. xxpermdi vs11,vs2,vs10,2
  1669. xvaddsp vs24,vs24,vs1
  1670. xvaddsp vs25,vs25,vs3
  1671. xvaddsp vs26,vs26,vs9
  1672. xvaddsp vs27,vs27,vs11
  1673. #else
  1674. xxpermdi vs24,vs8,vs0,2
  1675. xxpermdi vs25,vs10,vs2,2
  1676. xxpermdi vs26,vs0,vs8,2
  1677. xxpermdi vs27,vs2,vs10,2
  1678. #endif
  1679. stxv vs24 , 0(CO)
  1680. stxv vs25 , 16(CO)
  1681. stxv vs26 , 0(T1)
  1682. stxv vs27 , 16(T1)
  1683. addi CO, CO, 32
  1684. .endm
  1685. /* macros for N=2 and M=2
  1686. **********************************************************************************************/
  1687. .macro Zero2x2
  1688. xxlxor vs32, vs32, vs32
  1689. xxlxor vs36, vs36, vs36
  1690. xxlxor vs40, vs40, vs40
  1691. xxlxor vs44, vs44, vs44
  1692. .endm
  1693. .macro LOAD2x2
  1694. LOAD2x2O 0,0
  1695. .endm
  1696. .macro LOAD2x2O OffsetA,OffsetB
  1697. lxv vs24, (\OffsetA+0)(AO)
  1698. lxv vs0, (\OffsetB+0)(BO)
  1699. xxperm vs26, vs24, permute_mask
  1700. xxpermdi vs25, vs24, vs24,2
  1701. xxpermdi vs27, vs26, vs26,2
  1702. .endm
  1703. .macro END2x2_NORMAL
  1704. END2x2 AO,BO,16,16
  1705. .endm
  1706. .macro END2x2_WITHOUT_ADD
  1707. END2x2 AO,BO,0,0
  1708. .endm
  1709. .macro END2x2 AREG, BREG, OffsetA, OffsetB
  1710. .if \OffsetB != 0
  1711. addi \BREG, \BREG, \OffsetB
  1712. .endif
  1713. .if \OffsetA != 0
  1714. addi \AREG, \AREG, \OffsetA
  1715. .endif
  1716. xvmaddasp vs32, vs0,vs24
  1717. xvmaddasp vs36, vs0,vs25
  1718. xvmaddasp vs40, vs0,vs26
  1719. xvmaddasp vs44, vs0,vs27
  1720. .endm
  1721. .macro LOAD2x2_2
  1722. LOAD2x2_2O 0,0
  1723. .endm
  1724. .macro LOAD2x2_2O OffsetA,OffsetB
  1725. lxv vs8, (\OffsetA)(AO)
  1726. lxv vs24, (16+\OffsetA)(AO)
  1727. lxv vs4, (0+\OffsetB)(BO)
  1728. lxv vs0, (16+\OffsetB)(BO)
  1729. xxperm vs10, vs8, permute_mask
  1730. xxpermdi vs9, vs8, vs8,2
  1731. xxperm vs26, vs24, permute_mask
  1732. xxpermdi vs25, vs24, vs24,2
  1733. xxpermdi vs11, vs10, vs10,2
  1734. xxpermdi vs27, vs26, vs26,2
  1735. .endm
  1736. .macro END2x2_2
  1737. /*for load2 offset will be 32 and 32*/
  1738. KERNEL2x2_2 AO,BO, 32,32,0 ,1,1
  1739. .endm
  1740. .macro KERNEL2x2_E2 OffsetA,OffsetB, Index,IsLast
  1741. KERNEL2x2_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  1742. .endm
  1743. .macro KERNEL2x2_L2 OffsetA,OffsetB, Index,IsLast
  1744. KERNEL2x2_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  1745. .endm
  1746. .macro KERNEL2x2_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  1747. xvmaddasp vs32, vs4,vs8
  1748. xvmaddasp vs40, vs4,vs10
  1749. .if \Complete==0
  1750. lxv vs8, DISP4(\Index,\OffsetA)(\AREG)
  1751. .endif
  1752. xvmaddasp vs36, vs4,vs9
  1753. xvmaddasp vs44, vs4,vs11
  1754. .if \Complete==0
  1755. xxperm vs10, vs8, permute_mask
  1756. xxpermdi vs9, vs8, vs8,2
  1757. .endif
  1758. .if \Complete==0
  1759. lxv vs4, DISP4(\Index,0+\OffsetB)(\BREG)
  1760. .endif
  1761. .if \Complete==0
  1762. xxpermdi vs11, vs10, vs10,2
  1763. .endif
  1764. xvmaddasp vs32, vs0,vs24
  1765. xvmaddasp vs40, vs0,vs26
  1766. .if \Complete==0
  1767. lxv vs24, DISP4(\Index,16+\OffsetA)(\AREG)
  1768. .endif
  1769. xvmaddasp vs36, vs0,vs25
  1770. xvmaddasp vs44, vs0,vs27
  1771. .if \Complete==0
  1772. xxperm vs26, vs24, permute_mask
  1773. xxpermdi vs25, vs24, vs24,2
  1774. .endif
  1775. .if \Complete==0
  1776. lxv vs0, DISP4(\Index,16+\OffsetB)(\BREG)
  1777. .endif
  1778. .if \Complete==0
  1779. xxpermdi vs27, vs26, vs26,2
  1780. .endif
  1781. .if \IsLast==1
  1782. .if \Complete==1
  1783. addi \AREG, \AREG, DISP4(\Index,\OffsetA)
  1784. addi \BREG, \BREG, DISP4(\Index,\OffsetB)
  1785. .else
  1786. addi \AREG, \AREG, DISP4(\Index,32)
  1787. addi \BREG, \BREG, DISP4(\Index,32)
  1788. .endif
  1789. .endif
  1790. .endm
  1791. .macro KERNEL2x2
  1792. LOAD2x2
  1793. END2x2 AO, BO, 16,16
  1794. .endm
  1795. .macro SAVE2x2
  1796. add T1, CO ,LDC
  1797. #ifndef TRMMKERNEL
  1798. lxv vs24 , 0(CO)
  1799. #endif
  1800. #ifndef TRMMKERNEL
  1801. lxv vs26 , 0(T1)
  1802. #endif
  1803. xxperm vs0,vs32,permute_mask
  1804. xxperm vs4,vs40,permute_mask
  1805. xxperm vs8,vs36,permute_mask
  1806. xxperm vs12,vs44,permute_mask
  1807. AGGREGATE_REALS_IMAGES_A_PERMUTE vs32,vs0,vs40,vs4
  1808. AGGREGATE_REALS_IMAGES_A_PERMUTE vs36,vs8,vs44,vs12
  1809. /*VSINRR,VSINII,VSOUT1,VSOUT2*/
  1810. MULT_APLHA_PART1 vs32,vs40,vs0,vs1
  1811. MULT_APLHA_PART1 vs36,vs44,vs8,vs9
  1812. MULT_APLHA_PART2 vs32,vs40,vs0,vs1
  1813. MULT_APLHA_PART2 vs36,vs44,vs8,vs9
  1814. /* reconstruct r,i pairs*/
  1815. xxperm vs0,vs1, save_permute_1
  1816. xxperm vs8,vs9, save_permute_1
  1817. #ifndef TRMMKERNEL
  1818. /* add */
  1819. xxpermdi vs1,vs8,vs0,0
  1820. xxpermdi vs9,vs0,vs8,3
  1821. xvaddsp vs24,vs24,vs1
  1822. xvaddsp vs26,vs26,vs9
  1823. #else
  1824. xxpermdi vs24,vs8,vs0,0
  1825. xxpermdi vs26,vs0,vs8,3
  1826. #endif
  1827. stxv vs24 , 0(CO)
  1828. stxv vs26 , 0(T1)
  1829. addi CO, CO, 16
  1830. .endm
  1831. /* macros for N=2 and M=1
  1832. **********************************************************************************************/
  1833. .macro Zero2x1
  1834. xxlxor vs32, vs32, vs32
  1835. xxlxor vs40, vs40, vs40
  1836. .endm
  1837. .macro LOAD2x1
  1838. LOAD2x1O 0,0
  1839. .endm
  1840. .macro LOAD2x1O OffsetA,OffsetB
  1841. lxsd v4, (\OffsetA+0)(AO)
  1842. lxv vs0, (\OffsetB+0)(BO)
  1843. xxspltd vs24,vs36,0
  1844. xxperm vs26, vs24, permute_mask
  1845. .endm
  1846. .macro END2x1_NORMAL
  1847. END2x1 AO,BO,8,16
  1848. .endm
  1849. .macro END2x1_WITHOUT_ADD
  1850. END2x1 AO,BO,0,0
  1851. .endm
  1852. .macro END2x1 AREG, BREG, OffsetA, OffsetB
  1853. .if \OffsetB != 0
  1854. addi \BREG, \BREG, \OffsetB
  1855. .endif
  1856. .if \OffsetA != 0
  1857. addi \AREG, \AREG, \OffsetA
  1858. .endif
  1859. xvmaddasp vs32, vs0,vs24
  1860. xvmaddasp vs40, vs0,vs26
  1861. .endm
  1862. .macro LOAD2x1_2
  1863. LOAD2x1_2O 0,0
  1864. .endm
  1865. .macro LOAD2x1_2O OffsetA,OffsetB
  1866. lxv vs27, (\OffsetA)(AO)
  1867. lxv vs4, (0+\OffsetB)(BO)
  1868. lxv vs0, (16+\OffsetB)(BO)
  1869. xxspltd vs8,vs27,1
  1870. xxspltd vs24,vs27,0
  1871. xxperm vs10, vs8, permute_mask
  1872. xxperm vs26, vs24, permute_mask
  1873. .endm
  1874. .macro END2x1_2
  1875. /*for load2 offset will be 16 and 32*/
  1876. KERNEL2x1_2 AO,BO, 16,32,0 ,1,1
  1877. .endm
  1878. .macro KERNEL2x1_E2 OffsetA,OffsetB, Index,IsLast
  1879. KERNEL2x1_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  1880. .endm
  1881. .macro KERNEL2x1_L2 OffsetA,OffsetB, Index,IsLast
  1882. KERNEL2x1_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  1883. .endm
  1884. .macro KERNEL2x1_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  1885. xvmaddasp vs32, vs4,vs8
  1886. xvmaddasp vs40, vs4,vs10
  1887. .if \Complete==0
  1888. lxv vs27, DISP2(\Index,\OffsetA)(\AREG)
  1889. xxspltd vs8,vs27,1
  1890. .endif
  1891. .if \Complete==0
  1892. lxv vs4, DISP4(\Index,0+\OffsetB)(\BREG)
  1893. .endif
  1894. .if \Complete==0
  1895. xxperm vs10, vs8, permute_mask
  1896. .endif
  1897. xvmaddasp vs32, vs0,vs24
  1898. xvmaddasp vs40, vs0,vs26
  1899. .if \Complete==0
  1900. xxspltd vs24,vs27,0
  1901. xxperm vs26, vs24, permute_mask
  1902. .endif
  1903. .if \Complete==0
  1904. lxv vs0, DISP4(\Index,16+\OffsetB)(\BREG)
  1905. .endif
  1906. .if \IsLast==1
  1907. .if \Complete==1
  1908. addi \AREG, \AREG, DISP2(\Index,\OffsetA)
  1909. addi \BREG, \BREG, DISP4(\Index,\OffsetB)
  1910. .else
  1911. addi \AREG, \AREG, DISP2(\Index,16)
  1912. addi \BREG, \BREG, DISP4(\Index,32)
  1913. .endif
  1914. .endif
  1915. .endm
  1916. .macro KERNEL2x1
  1917. LOAD2x1
  1918. END2x1 AO, BO, 8,16
  1919. .endm
  1920. .macro SAVE2x1
  1921. add T1, CO ,LDC
  1922. #ifndef TRMMKERNEL
  1923. lxsd v4 , 0(CO)
  1924. #endif
  1925. #ifndef TRMMKERNEL
  1926. lxsd v5 , 0(T1)
  1927. #endif
  1928. xxperm vs0,vs32,permute_mask
  1929. xxperm vs4,vs40,permute_mask
  1930. AGGREGATE_REALS_IMAGES_A_PERMUTE vs32,vs0,vs40,vs4
  1931. AGGREGATE_REALS_IMAGES_A_PERMUTE vs33,vs1,vs41,vs5
  1932. /*VSINRR,VSINII,VSOUT1,VSOUT2*/
  1933. MULT_APLHA_PART1 vs32,vs40,vs0,vs1
  1934. MULT_APLHA_PART2 vs32,vs40,vs0,vs1
  1935. /* reconstruct r,i pairs*/
  1936. xxperm vs0,vs1, save_permute_1
  1937. #ifndef TRMMKERNEL
  1938. /* add */
  1939. xxspltd vs1,vs0,0
  1940. xxspltd vs3,vs0,1
  1941. /*--v4==vs36 v5==vs37---*/
  1942. xvaddsp vs36,vs36,vs1
  1943. xvaddsp vs37,vs37,vs3
  1944. #else
  1945. /*--v4==vs36 v5==vs37---*/
  1946. xxspltd vs36,vs0,0
  1947. xxspltd vs37,vs0,1
  1948. #endif
  1949. stxsd v4 , 0(CO)
  1950. stxsd v5 , 0(T1)
  1951. addi CO, CO, 8
  1952. .endm
  1953. /* macros for N=1 and M=8
  1954. **********************************************************************************************/
  1955. .macro Zero1x8
  1956. xxlxor vs32, vs32, vs32
  1957. xxlxor vs33, vs33, vs33
  1958. xxlxor vs34, vs34, vs34
  1959. xxlxor vs35, vs35, vs35
  1960. xxlxor vs40, vs40, vs40
  1961. xxlxor vs41, vs41, vs41
  1962. xxlxor vs42, vs42, vs42
  1963. xxlxor vs43, vs43, vs43
  1964. .endm
  1965. .macro LOAD1x8
  1966. LOAD1x8O 0,0
  1967. .endm
  1968. .macro LOAD1x8O OffsetA,OffsetB
  1969. lxsd vs4, (\OffsetB+0)(BO)
  1970. lxv vs0, (\OffsetA+0)(AO)
  1971. lxv vs1, (\OffsetA+16)(AO)
  1972. lxv vs2, (\OffsetA+32)(AO)
  1973. lxv vs3, (\OffsetA+48)(AO)
  1974. xxspltd vs24,vs36,0
  1975. xxperm vs26, vs24, permute_mask
  1976. .endm
  1977. .macro END1x8_NORMAL
  1978. END1x8 AO,BO,64,8
  1979. .endm
  1980. .macro END1x8_WITHOUT_ADD
  1981. END1x8 AO,BO,0,0
  1982. .endm
  1983. .macro END1x8 AREG, BREG, OffsetA, OffsetB
  1984. .if \OffsetB != 0
  1985. addi \BREG, \BREG, \OffsetB
  1986. .endif
  1987. .if \OffsetA != 0
  1988. addi \AREG, \AREG, \OffsetA
  1989. .endif
  1990. xvmaddasp vs32, vs0,vs24
  1991. xvmaddasp vs33, vs1,vs24
  1992. xvmaddasp vs34, vs2,vs24
  1993. xvmaddasp vs35, vs3,vs24
  1994. xvmaddasp vs40, vs0,vs26
  1995. xvmaddasp vs41, vs1,vs26
  1996. xvmaddasp vs42, vs2,vs26
  1997. xvmaddasp vs43, vs3,vs26
  1998. .endm
  1999. .macro LOAD1x8_2
  2000. LOAD1x8_2O 0,0
  2001. .endm
  2002. .macro LOAD1x8_2O OffsetA,OffsetB
  2003. lxv vs27, (\OffsetB)(BO)
  2004. lxv vs4, (0+\OffsetA)(AO)
  2005. lxv vs5, (16+\OffsetA)(AO)
  2006. xxspltd vs8,vs27,1
  2007. xxspltd vs24,vs27,0
  2008. lxv vs6, (32+\OffsetA)(AO)
  2009. lxv vs7, (48+\OffsetA)(AO)
  2010. lxv vs0, (64+\OffsetA)(AO)
  2011. lxv vs1, (64+16+\OffsetA)(AO)
  2012. lxv vs2, (64+32+\OffsetA)(AO)
  2013. lxv vs3, (64+48+\OffsetA)(AO)
  2014. xxperm vs10, vs8, permute_mask
  2015. xxperm vs26, vs24, permute_mask
  2016. .endm
  2017. .macro END1x8_2
  2018. /*for load2 offset will be 128 and 16*/
  2019. KERNEL1x8_2 AO,BO, 128,16,0 ,1,1
  2020. .endm
  2021. .macro KERNEL1x8_E2 OffsetA,OffsetB, Index,IsLast
  2022. KERNEL1x8_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  2023. .endm
  2024. .macro KERNEL1x8_L2 OffsetA,OffsetB, Index,IsLast
  2025. KERNEL1x8_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  2026. .endm
  2027. .macro KERNEL1x8_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  2028. .if \Complete==0
  2029. lxv vs27, DISP2(\Index,\OffsetB)(\BREG)
  2030. .endif
  2031. xvmaddasp vs32, vs4,vs8
  2032. xvmaddasp vs33, vs5,vs8
  2033. xvmaddasp vs40, vs4,vs10
  2034. xvmaddasp vs41, vs5,vs10
  2035. .if \Complete==0
  2036. lxv vs4, DISP16(\Index,0+\OffsetA)(\AREG)
  2037. lxv vs5, DISP16(\Index,16+\OffsetA)(\AREG)
  2038. .endif
  2039. xvmaddasp vs34, vs6,vs8
  2040. xvmaddasp vs35, vs7,vs8
  2041. xvmaddasp vs42, vs6,vs10
  2042. xvmaddasp vs43, vs7,vs10
  2043. .if \Complete==0
  2044. lxv vs6, DISP16(\Index,32+\OffsetA)(\AREG)
  2045. lxv vs7, DISP16(\Index,48+\OffsetA)(\AREG)
  2046. .endif
  2047. .if \Complete==0
  2048. xxspltd vs8,vs27,1
  2049. xxperm vs10, vs8, permute_mask
  2050. .endif
  2051. xvmaddasp vs32, vs0,vs24
  2052. xvmaddasp vs33, vs1,vs24
  2053. xvmaddasp vs40, vs0,vs26
  2054. xvmaddasp vs41, vs1,vs26
  2055. .if \Complete==0
  2056. lxv vs0, DISP16(\Index,64+\OffsetA)(\AREG)
  2057. lxv vs1, DISP16(\Index,64+16+\OffsetA)(\AREG)
  2058. .endif
  2059. xvmaddasp vs34, vs2,vs24
  2060. xvmaddasp vs35, vs3,vs24
  2061. xvmaddasp vs42, vs2,vs26
  2062. xvmaddasp vs43, vs3,vs26
  2063. .if \Complete==0
  2064. xxspltd vs24,vs27,0
  2065. xxperm vs26, vs24, permute_mask
  2066. .endif
  2067. .if \Complete==0
  2068. lxv vs2, DISP16(\Index,64+32+\OffsetA)(\AREG)
  2069. lxv vs3, DISP16(\Index,64+48+\OffsetA)(\AREG)
  2070. .endif
  2071. .if \IsLast==1
  2072. .if \Complete==1
  2073. addi \BREG, \BREG, DISP2(\Index,\OffsetB)
  2074. addi \AREG, \AREG, DISP16(\Index,\OffsetA)
  2075. .else
  2076. addi \BREG, \BREG, DISP2(\Index,16)
  2077. addi \AREG, \AREG, DISP16(\Index,128)
  2078. .endif
  2079. .endif
  2080. .endm
  2081. .macro KERNEL1x8
  2082. LOAD1x8
  2083. END1x8 AO, BO, 64,8
  2084. .endm
  2085. .macro SAVE1x8
  2086. #ifndef TRMMKERNEL
  2087. lxv vs24 , 0(CO)
  2088. lxv vs25 , 16(CO)
  2089. #endif
  2090. xxperm vs0,vs32,permute_mask
  2091. xxperm vs4,vs40,permute_mask
  2092. #ifndef TRMMKERNEL
  2093. lxv vs26 , 32(CO)
  2094. lxv vs27 , 48(CO)
  2095. #endif
  2096. xxperm vs1,vs33,permute_mask
  2097. xxperm vs5,vs41,permute_mask
  2098. xxperm vs2,vs34,permute_mask
  2099. xxperm vs6,vs42,permute_mask
  2100. xxperm vs3,vs35,permute_mask
  2101. xxperm vs7,vs43,permute_mask
  2102. AGGREGATE_REALS_IMAGES vs32,vs0,vs40,vs4
  2103. AGGREGATE_REALS_IMAGES vs33,vs1,vs41,vs5
  2104. AGGREGATE_REALS_IMAGES vs34,vs2,vs42,vs6
  2105. AGGREGATE_REALS_IMAGES vs35,vs3,vs43,vs7
  2106. /*inner reverse save_permute and store vs28 */
  2107. xxpermdi vs28,save_permute_1,save_permute_1,2
  2108. /*VSINRR,VSINII,VSOUT1,VSOUT2*/
  2109. MULT_APLHA_PART1 vs32,vs40,vs0,vs1
  2110. MULT_APLHA_PART1 vs33,vs41,vs2,vs3
  2111. MULT_APLHA_PART1 vs34,vs42,vs4,vs5
  2112. MULT_APLHA_PART1 vs35,vs43,vs6,vs7
  2113. MULT_APLHA_PART2 vs32,vs40,vs0,vs1
  2114. MULT_APLHA_PART2 vs33,vs41,vs2,vs3
  2115. MULT_APLHA_PART2 vs34,vs42,vs4,vs5
  2116. MULT_APLHA_PART2 vs35,vs43,vs6,vs7
  2117. /* reconstruct r,i pairs*/
  2118. xxperm vs0,vs1, vs28
  2119. xxperm vs2,vs3, vs28
  2120. xxperm vs4,vs5, vs28
  2121. xxperm vs6,vs7, vs28
  2122. #ifndef TRMMKERNEL
  2123. /* add */
  2124. xvaddsp vs24,vs24,vs0
  2125. xvaddsp vs25,vs25,vs2
  2126. xvaddsp vs26,vs26,vs4
  2127. xvaddsp vs27,vs27,vs6
  2128. stxv vs24 , 0(CO)
  2129. stxv vs25 , 16(CO)
  2130. stxv vs26 , 32(CO)
  2131. stxv vs27 , 48(CO)
  2132. #else
  2133. /* reconstruct r,i pairs*/
  2134. stxv vs0 , 0(CO)
  2135. stxv vs2 , 16(CO)
  2136. stxv vs4 , 32(CO)
  2137. stxv vs6 , 48(CO)
  2138. #endif
  2139. addi CO, CO, 64
  2140. .endm
  2141. /* macros for N=1 and M=4
  2142. **********************************************************************************************/
  2143. .macro Zero1x4
  2144. xxlxor vs32, vs32, vs32
  2145. xxlxor vs33, vs33, vs33
  2146. xxlxor vs40, vs40, vs40
  2147. xxlxor vs41, vs41, vs41
  2148. .endm
  2149. .macro LOAD1x4
  2150. LOAD1x4O 0,0
  2151. .endm
  2152. .macro LOAD1x4O OffsetA,OffsetB
  2153. lxsd vs4, (\OffsetB+0)(BO)
  2154. lxv vs0, (\OffsetA+0)(AO)
  2155. lxv vs1, (\OffsetA+16)(AO)
  2156. xxspltd vs24,vs36,0
  2157. xxperm vs26, vs24, permute_mask
  2158. .endm
  2159. .macro END1x4_NORMAL
  2160. END1x4 AO,BO,32,8
  2161. .endm
  2162. .macro END1x4_WITHOUT_ADD
  2163. END1x4 AO,BO,0,0
  2164. .endm
  2165. .macro END1x4 AREG, BREG, OffsetA, OffsetB
  2166. .if \OffsetB != 0
  2167. addi \BREG, \BREG, \OffsetB
  2168. .endif
  2169. .if \OffsetA != 0
  2170. addi \AREG, \AREG, \OffsetA
  2171. .endif
  2172. xvmaddasp vs32, vs0,vs24
  2173. xvmaddasp vs33, vs1,vs24
  2174. xvmaddasp vs40, vs0,vs26
  2175. xvmaddasp vs41, vs1,vs26
  2176. .endm
  2177. .macro LOAD1x4_2
  2178. LOAD1x4_2O 0,0
  2179. .endm
  2180. .macro LOAD1x4_2O OffsetA,OffsetB
  2181. lxv vs27, (\OffsetB)(BO)
  2182. lxv vs4, (0+\OffsetA)(AO)
  2183. lxv vs5, (16+\OffsetA)(AO)
  2184. xxspltd vs8,vs27,1
  2185. xxspltd vs24,vs27,0
  2186. lxv vs0, (32+\OffsetA)(AO)
  2187. lxv vs1, (32+16+\OffsetA)(AO)
  2188. xxperm vs10, vs8, permute_mask
  2189. xxperm vs26, vs24, permute_mask
  2190. .endm
  2191. .macro END1x4_2
  2192. /*for load2 offset will be 64 and 16*/
  2193. KERNEL1x4_2 AO,BO, 64,16,0 ,1,1
  2194. .endm
  2195. .macro KERNEL1x4_E2 OffsetA,OffsetB, Index,IsLast
  2196. KERNEL1x4_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  2197. .endm
  2198. .macro KERNEL1x4_L2 OffsetA,OffsetB, Index,IsLast
  2199. KERNEL1x4_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  2200. .endm
  2201. .macro KERNEL1x4_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  2202. .if \Complete==0
  2203. lxv vs27, DISP2(\Index,\OffsetB)(\BREG)
  2204. .endif
  2205. xvmaddasp vs32, vs4,vs8
  2206. xvmaddasp vs33, vs5,vs8
  2207. xvmaddasp vs40, vs4,vs10
  2208. xvmaddasp vs41, vs5,vs10
  2209. .if \Complete==0
  2210. lxv vs4, DISP8(\Index,0+\OffsetA)(\AREG)
  2211. lxv vs5, DISP8(\Index,16+\OffsetA)(\AREG)
  2212. .endif
  2213. .if \Complete==0
  2214. xxspltd vs8,vs27,1
  2215. xxperm vs10, vs8, permute_mask
  2216. .endif
  2217. xvmaddasp vs32, vs0,vs24
  2218. xvmaddasp vs33, vs1,vs24
  2219. xvmaddasp vs40, vs0,vs26
  2220. xvmaddasp vs41, vs1,vs26
  2221. .if \Complete==0
  2222. lxv vs0, DISP8(\Index,32+\OffsetA)(\AREG)
  2223. lxv vs1, DISP8(\Index,32+16+\OffsetA)(\AREG)
  2224. .endif
  2225. .if \Complete==0
  2226. xxspltd vs24,vs27,0
  2227. xxperm vs26, vs24, permute_mask
  2228. .endif
  2229. .if \IsLast==1
  2230. .if \Complete==1
  2231. addi \BREG, \BREG, DISP2(\Index,\OffsetB)
  2232. addi \AREG, \AREG, DISP8(\Index,\OffsetA)
  2233. .else
  2234. addi \BREG, \BREG, DISP2(\Index,16)
  2235. addi \AREG, \AREG, DISP8(\Index,64)
  2236. .endif
  2237. .endif
  2238. .endm
  2239. .macro KERNEL1x4
  2240. LOAD1x4
  2241. END1x4 AO, BO, 32,8
  2242. .endm
  2243. .macro SAVE1x4
  2244. #ifndef TRMMKERNEL
  2245. lxv vs24 , 0(CO)
  2246. lxv vs25 , 16(CO)
  2247. #endif
  2248. xxperm vs0,vs32,permute_mask
  2249. xxperm vs4,vs40,permute_mask
  2250. xxperm vs1,vs33,permute_mask
  2251. xxperm vs5,vs41,permute_mask
  2252. AGGREGATE_REALS_IMAGES vs32,vs0,vs40,vs4
  2253. AGGREGATE_REALS_IMAGES vs33,vs1,vs41,vs5
  2254. /*inner reverse save_permute and store vs28 */
  2255. xxpermdi vs28,save_permute_1,save_permute_1,2
  2256. /*VSINRR,VSINII,VSOUT1,VSOUT2*/
  2257. MULT_APLHA_PART1 vs32,vs40,vs0,vs1
  2258. MULT_APLHA_PART1 vs33,vs41,vs2,vs3
  2259. MULT_APLHA_PART2 vs32,vs40,vs0,vs1
  2260. MULT_APLHA_PART2 vs33,vs41,vs2,vs3
  2261. /* reconstruct r,i pairs*/
  2262. xxperm vs0,vs1, vs28
  2263. xxperm vs2,vs3, vs28
  2264. #ifndef TRMMKERNEL
  2265. /* add */
  2266. xvaddsp vs24,vs24,vs0
  2267. xvaddsp vs25,vs25,vs2
  2268. stxv vs24 , 0(CO)
  2269. stxv vs25 , 16(CO)
  2270. #else
  2271. /* reconstruct r,i pairs*/
  2272. stxv vs0 , 0(CO)
  2273. stxv vs2 , 16(CO)
  2274. #endif
  2275. addi CO, CO, 32
  2276. .endm
  2277. /* macros for N=1 and M=2
  2278. **********************************************************************************************/
  2279. .macro Zero1x2
  2280. xxlxor vs32, vs32, vs32
  2281. xxlxor vs40, vs40, vs40
  2282. .endm
  2283. .macro LOAD1x2
  2284. LOAD1x2O 0,0
  2285. .endm
  2286. .macro LOAD1x2O OffsetA,OffsetB
  2287. lxsd vs4, (\OffsetB+0)(BO)
  2288. lxv vs0, (\OffsetA+0)(AO)
  2289. xxspltd vs24,vs36,0
  2290. xxperm vs26, vs24, permute_mask
  2291. .endm
  2292. .macro END1x2_NORMAL
  2293. END1x2 AO,BO,16,8
  2294. .endm
  2295. .macro END1x2_WITHOUT_ADD
  2296. END1x2 AO,BO,0,0
  2297. .endm
  2298. .macro END1x2 AREG, BREG, OffsetA, OffsetB
  2299. .if \OffsetB != 0
  2300. addi \BREG, \BREG, \OffsetB
  2301. .endif
  2302. .if \OffsetA != 0
  2303. addi \AREG, \AREG, \OffsetA
  2304. .endif
  2305. xvmaddasp vs32, vs0,vs24
  2306. xvmaddasp vs40, vs0,vs26
  2307. .endm
  2308. .macro LOAD1x2_2
  2309. LOAD1x2_2O 0,0
  2310. .endm
  2311. .macro LOAD1x2_2O OffsetA,OffsetB
  2312. lxv vs27, (\OffsetB)(BO)
  2313. lxv vs4, (0+\OffsetA)(AO)
  2314. lxv vs0, (16+\OffsetA)(AO)
  2315. xxspltd vs8,vs27,1
  2316. xxspltd vs24,vs27,0
  2317. xxperm vs10, vs8, permute_mask
  2318. xxperm vs26, vs24, permute_mask
  2319. .endm
  2320. .macro END1x2_2
  2321. /*for load2 offset will be 32 and 16*/
  2322. KERNEL1x2_2 AO,BO, 32,16,0 ,1,1
  2323. .endm
  2324. .macro KERNEL1x2_E2 OffsetA,OffsetB, Index,IsLast
  2325. KERNEL1x2_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  2326. .endm
  2327. .macro KERNEL1x2_L2 OffsetA,OffsetB, Index,IsLast
  2328. KERNEL1x2_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  2329. .endm
  2330. .macro KERNEL1x2_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  2331. .if \Complete==0
  2332. lxv vs27, DISP2(\Index,\OffsetB)(\BREG)
  2333. .endif
  2334. xvmaddasp vs32, vs4,vs8
  2335. xvmaddasp vs40, vs4,vs10
  2336. .if \Complete==0
  2337. lxv vs4, DISP4(\Index,0+\OffsetA)(\AREG)
  2338. .endif
  2339. .if \Complete==0
  2340. xxspltd vs8,vs27,1
  2341. xxperm vs10, vs8, permute_mask
  2342. .endif
  2343. xvmaddasp vs32, vs0,vs24
  2344. xvmaddasp vs40, vs0,vs26
  2345. .if \Complete==0
  2346. lxv vs0, DISP4(\Index,16+\OffsetA)(\AREG)
  2347. .endif
  2348. .if \Complete==0
  2349. xxspltd vs24,vs27,0
  2350. xxperm vs26, vs24, permute_mask
  2351. .endif
  2352. .if \IsLast==1
  2353. .if \Complete==1
  2354. addi \BREG, \BREG, DISP2(\Index,\OffsetB)
  2355. addi \AREG, \AREG, DISP4(\Index,\OffsetA)
  2356. .else
  2357. addi \BREG, \BREG, DISP2(\Index,16)
  2358. addi \AREG, \AREG, DISP4(\Index,32)
  2359. .endif
  2360. .endif
  2361. .endm
  2362. .macro KERNEL1x2
  2363. LOAD1x2
  2364. END1x2 AO, BO, 16,8
  2365. .endm
  2366. .macro SAVE1x2
  2367. #ifndef TRMMKERNEL
  2368. lxv vs24 , 0(CO)
  2369. #endif
  2370. xxperm vs0,vs32,permute_mask
  2371. xxperm vs4,vs40,permute_mask
  2372. AGGREGATE_REALS_IMAGES vs32,vs0,vs40,vs4
  2373. /*inner reverse save_permute and store vs28 */
  2374. xxpermdi vs28,save_permute_1,save_permute_1,2
  2375. /*VSINRR,VSINII,VSOUT1,VSOUT2*/
  2376. MULT_APLHA_PART1 vs32,vs40,vs0,vs1
  2377. MULT_APLHA_PART2 vs32,vs40,vs0,vs1
  2378. /* reconstruct r,i pairs*/
  2379. xxperm vs0,vs1, vs28
  2380. #ifndef TRMMKERNEL
  2381. /* add */
  2382. xvaddsp vs24,vs24,vs0
  2383. stxv vs24 , 0(CO)
  2384. #else
  2385. /* reconstruct r,i pairs*/
  2386. stxv vs0 , 0(CO)
  2387. #endif
  2388. addi CO, CO, 16
  2389. .endm
  2390. /* macros for N=1 and M=1
  2391. **********************************************************************************************/
  2392. .macro Zero1x1
  2393. xxlxor vs32, vs32, vs32
  2394. xxlxor vs40, vs40, vs40
  2395. .endm
  2396. .macro LOAD1x1
  2397. LOAD1x1O 0,0
  2398. .endm
  2399. .macro LOAD1x1O OffsetA,OffsetB
  2400. lxsd v4, (\OffsetB+0)(BO)
  2401. lxsd v5, (\OffsetA+0)(AO)
  2402. xxperm vs38, vs36, permute_mask
  2403. .endm
  2404. .macro END1x1_NORMAL
  2405. END1x1 AO,BO,8,8
  2406. .endm
  2407. .macro END1x1_WITHOUT_ADD
  2408. END1x1 AO,BO,0,0
  2409. .endm
  2410. .macro END1x1 AREG, BREG, OffsetA, OffsetB
  2411. .if \OffsetB != 0
  2412. addi \BREG, \BREG, \OffsetB
  2413. .endif
  2414. .if \OffsetA != 0
  2415. addi \AREG, \AREG, \OffsetA
  2416. .endif
  2417. xvmaddasp vs32, vs37,vs36
  2418. xvmaddasp vs40, vs37,vs38
  2419. .endm
  2420. .macro LOAD1x1_2
  2421. LOAD1x1_2O 0,0
  2422. .endm
  2423. .macro LOAD1x1_2O OffsetA,OffsetB
  2424. lxv vs8, (\OffsetB)(BO)
  2425. lxv vs4, (0+\OffsetA)(AO)
  2426. xxperm vs10, vs8, permute_mask
  2427. .endm
  2428. .macro END1x1_2
  2429. /*for load2 offset will be 16 and 16*/
  2430. KERNEL1x1_2 AO,BO, 16,16,0 ,1,1
  2431. .endm
  2432. .macro KERNEL1x1_E2 OffsetA,OffsetB, Index,IsLast
  2433. KERNEL1x1_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,1
  2434. .endm
  2435. .macro KERNEL1x1_L2 OffsetA,OffsetB, Index,IsLast
  2436. KERNEL1x1_2 AO,BO, \OffsetA,\OffsetB, \Index,\IsLast ,0
  2437. .endm
  2438. .macro KERNEL1x1_2 AREG,BREG, OffsetA,OffsetB, Index,IsLast ,Complete
  2439. xvmaddasp vs32, vs4,vs8
  2440. xvmaddasp vs40, vs4,vs10
  2441. .if \Complete==0
  2442. lxv vs8, DISP2(\Index,\OffsetB)(\BREG)
  2443. lxv vs4, DISP2(\Index,\OffsetB)(\AREG)
  2444. xxperm vs10, vs8, permute_mask
  2445. .endif
  2446. .if \IsLast==1
  2447. .if \Complete==1
  2448. addi \BREG, \BREG, DISP2(\Index,\OffsetB)
  2449. addi \AREG, \AREG, DISP2(\Index,\OffsetA)
  2450. .else
  2451. addi \BREG, \BREG, DISP2(\Index,16)
  2452. addi \AREG, \AREG, DISP2(\Index,16)
  2453. .endif
  2454. .endif
  2455. .endm
  2456. .macro KERNEL1x1
  2457. LOAD1x1
  2458. END1x1 AO, BO, 8,8
  2459. .endm
  2460. .macro SAVE1x1
  2461. #ifndef TRMMKERNEL
  2462. lxsd v4 , 0(CO)
  2463. #endif
  2464. /*aggregate x2*/
  2465. xxpermdi vs33,vs32,vs32,2
  2466. xxpermdi vs41,vs40,vs40,2
  2467. xvaddsp vs32,vs32,vs33
  2468. xvaddsp vs40,vs40,vs41
  2469. xxperm vs0,vs32,permute_mask
  2470. xxperm vs4,vs40,permute_mask
  2471. AGGREGATE_REALS_IMAGES vs32,vs0,vs40,vs4
  2472. /*inner reverse save_permute and store vs28 */
  2473. xxpermdi vs28,save_permute_1,save_permute_1,2
  2474. /*VSINRR,VSINII,VSOUT1,VSOUT2*/
  2475. MULT_APLHA_PART1 vs32,vs40,vs37,vs1
  2476. MULT_APLHA_PART2 vs32,vs40,vs37,vs1
  2477. /* reconstruct r,i pairs*/
  2478. xxperm vs37,vs1, vs28
  2479. #ifndef TRMMKERNEL
  2480. /* add */
  2481. xvaddsp vs36,vs36,vs37
  2482. stxsd v4 , 0(CO)
  2483. #else
  2484. /* vs37 is v5 */
  2485. stxsd v5 , 0(CO)
  2486. #endif
  2487. addi CO, CO, 8
  2488. .endm
  2489. /****************************TRMM POINTER REFRESH MACROSES*************************/
  2490. .macro SHIFT_REG REG1,REG2,SHIFT_VAL
  2491. .if \SHIFT_VAL==16
  2492. slwi \REG1, \REG2, 7
  2493. .elseif \SHIFT_VAL==8
  2494. slwi \REG1, \REG2, 6
  2495. .elseif \SHIFT_VAL==4
  2496. slwi \REG1, \REG2, 5
  2497. .elseif \SHIFT_VAL==2
  2498. slwi \REG1, \REG2, 4
  2499. .elseif \SHIFT_VAL==1
  2500. slwi \REG1, \REG2, 3
  2501. .endif
  2502. .endm
  2503. /*
  2504. //#if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  2505. // ptrbb = bb;
  2506. // #else
  2507. // ptrba += off*8;
  2508. // ptrbb = bb + off*4;
  2509. // #endif
  2510. */
  2511. .macro REFRESH_POINTERS PTR_A,PTR_B,OFF_VAL,B_VAL,C_A,C_B
  2512. #if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  2513. /* ptrbb = bb;*/
  2514. mr \PTR_B,\B_VAL /* refresh BPOINT */
  2515. #else
  2516. /*
  2517. // ptrba =ptrba+ off*C_A;
  2518. // ptrbb = bb + off*C_B;
  2519. */
  2520. SHIFT_REG T4,\OFF_VAL,\C_B /* Number of values in B shifted */
  2521. SHIFT_REG T2,\OFF_VAL,\C_A /* Number of values in A shifted */
  2522. add \PTR_B, \B_VAL , T4 /* Add values to BO */
  2523. add \PTR_A, \PTR_A, T2 /* Add values to AO */
  2524. #endif
  2525. .endm
  2526. /*
  2527. // #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  2528. // temp = bk-off;
  2529. // #elif defined(LEFT)
  2530. // temp = off+8; // number of values in A
  2531. // #else
  2532. // temp = off+4; // number of values in B
  2533. // #endif
  2534. */
  2535. .macro REFRESH_TEMP_BK TEMP_BK,BK_VAL,OFF_VAL,INCR_A,INCR_B
  2536. #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  2537. /* temp = bk-off;*/
  2538. sub \TEMP_BK,\BK_VAL,\OFF_VAL
  2539. #elif defined(LEFT)
  2540. /* temp = off+INCR_A; // number of values in A */
  2541. addi \TEMP_BK, \OFF_VAL, \INCR_A
  2542. #else
  2543. /* temp = off+INCR_B // number of values in B*/
  2544. addi \TEMP_BK,\OFF_VAL, \INCR_B
  2545. #endif
  2546. .endm
  2547. /*
  2548. // #if ( defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  2549. // temp = bk - off;
  2550. // #ifdef LEFT
  2551. // temp -= 8; // number of values in A
  2552. // #else
  2553. // temp -= 4; // number of values in B
  2554. // #endif
  2555. // ptrba += temp*8;
  2556. // ptrbb += temp*4;
  2557. // #endif
  2558. // #ifdef LEFT
  2559. // off += 8; // number of values in A
  2560. // #endif
  2561. */
  2562. .macro REFRESH_AFTER_SAVE TEMP_BK,BK_VAL,OFF_VAL,PTR_B,PTR_A,C_A,C_B
  2563. #if ( defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
  2564. /*temp = bk - off;*/
  2565. sub \TEMP_BK,\BK_VAL,\OFF_VAL
  2566. #ifdef LEFT
  2567. /*temp -= 8; // number of values in A*/
  2568. addi \TEMP_BK,\TEMP_BK,-\C_A
  2569. #else
  2570. /*temp -= 4; // number of values in B*/
  2571. addi \TEMP_BK,\TEMP_BK,-\C_B
  2572. #endif
  2573. /*ptrba += temp*C_A;
  2574. ptrbb += temp*C_B;*/
  2575. SHIFT_REG T4,\TEMP_BK,\C_A
  2576. SHIFT_REG T2,\TEMP_BK,\C_B
  2577. add \PTR_A, \PTR_A,T4/*ptrba+temp*C_A*/
  2578. add \PTR_B, \PTR_B,T2
  2579. #endif
  2580. #ifdef LEFT
  2581. /*off += 8; // number of values in A*/
  2582. addi \OFF_VAL,\OFF_VAL,\C_A
  2583. #endif
  2584. .endm