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.

dtrmm_kernel_4x4_vfpv3.S 33 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953
  1. /***************************************************************************
  2. Copyright (c) 2013, 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. * 2013/11/23 Saar
  29. * BLASTEST : OK
  30. * CTEST : OK
  31. * TEST : OK
  32. *
  33. **************************************************************************************/
  34. #define ASSEMBLER
  35. #include "common.h"
  36. #define STACKSIZE 252
  37. #define OLD_M r0
  38. #define OLD_N r1
  39. #define OLD_K r2
  40. #define OLD_A r3
  41. #define OLD_ALPHA d0
  42. /******************************************************
  43. * [fp, #-128] - [fp, #-64] is reserved
  44. * for store and restore of floating point
  45. * registers
  46. *******************************************************/
  47. #define KK [fp, #-240 ]
  48. #define KKK [fp, #-244]
  49. #define C [fp, #-248 ]
  50. #define LDC [fp, #-252 ]
  51. #define M [fp, #-256 ]
  52. #define N [fp, #-260 ]
  53. #define K [fp, #-264 ]
  54. #define A [fp, #-268 ]
  55. #define ALPHA [fp, #-276 ]
  56. #define B [fp, #4 ]
  57. #define OLD_C [fp, #8 ]
  58. #define OLD_LDC [fp, #12 ]
  59. #define OFFSET [fp, #16 ]
  60. #define I r0
  61. #define J r1
  62. #define L r2
  63. #define AO r5
  64. #define BO r6
  65. #define CO1 r8
  66. #define CO2 r9
  67. #define K1 r7
  68. #define BC r12
  69. #define A_PRE 64
  70. #define B_PRE 64
  71. #define C_PRE 64
  72. /**************************************************************************************
  73. * Macro definitions
  74. **************************************************************************************/
  75. .macro INIT4x4
  76. vsub.f64 d16 , d16 , d16
  77. vmov.f64 d17, d16
  78. vmov.f64 d18, d16
  79. vmov.f64 d19, d16
  80. vmov.f64 d20, d16
  81. vmov.f64 d21, d16
  82. vmov.f64 d22, d16
  83. vmov.f64 d23, d16
  84. vmov.f64 d24, d16
  85. vmov.f64 d25, d16
  86. vmov.f64 d26, d16
  87. vmov.f64 d27, d16
  88. vmov.f64 d28, d16
  89. vmov.f64 d29, d16
  90. vmov.f64 d30, d16
  91. vmov.f64 d31, d16
  92. .endm
  93. .macro KERNEL4x4_I
  94. pld [ BO , #B_PRE ]
  95. fldd d8 , [ BO ]
  96. pld [ AO , #A_PRE ]
  97. fldmiad AO!, { d0 - d1}
  98. fmuld d16 , d0, d8
  99. fldmiad AO!, { d2 - d3}
  100. fmuld d17 , d1, d8
  101. fldd d9 , [ BO, #8 ]
  102. fmuld d18 , d2, d8
  103. fldd d10, [ BO, #16 ]
  104. fmuld d19 , d3, d8
  105. fldd d11, [ BO, #24 ]
  106. fmuld d20 , d0, d9
  107. fmuld d21 , d1, d9
  108. add BO , BO, #32
  109. fmuld d22 , d2, d9
  110. fldd d12, [ BO ]
  111. fmuld d23 , d3, d9
  112. fmuld d24 , d0, d10
  113. fldmiad AO!, { d4 - d5 }
  114. fmuld d25 , d1, d10
  115. fmuld d26 , d2, d10
  116. fldmiad AO!, { d6 - d7 }
  117. fmuld d27 , d3, d10
  118. fldd d13, [ BO, #8 ]
  119. fmuld d28 , d0, d11
  120. fldd d14, [ BO, #16 ]
  121. fmuld d29 , d1, d11
  122. fldd d15, [ BO, #24 ]
  123. fmuld d30 , d2, d11
  124. fmuld d31 , d3, d11
  125. add BO , BO, #32
  126. .endm
  127. .macro KERNEL4x4_S
  128. pld [ BO , #B_PRE ]
  129. fldd d8 , [ BO ]
  130. pld [ AO , #A_PRE ]
  131. fldmiad AO!, { d0 - d1}
  132. fmacd d16 , d0, d8
  133. fldmiad AO!, { d2 - d3}
  134. fmacd d17 , d1, d8
  135. fldd d9 , [ BO, #8 ]
  136. fmacd d18 , d2, d8
  137. fldd d10, [ BO, #16 ]
  138. fmacd d19 , d3, d8
  139. fldd d11, [ BO, #24 ]
  140. fmacd d20 , d0, d9
  141. fmacd d21 , d1, d9
  142. add BO , BO, #32
  143. fmacd d22 , d2, d9
  144. fldd d12, [ BO ]
  145. fmacd d23 , d3, d9
  146. fmacd d24 , d0, d10
  147. fldmiad AO!, { d4 - d5 }
  148. fmacd d25 , d1, d10
  149. fmacd d26 , d2, d10
  150. fldmiad AO!, { d6 - d7 }
  151. fmacd d27 , d3, d10
  152. fldd d13, [ BO, #8 ]
  153. fmacd d28 , d0, d11
  154. fldd d14, [ BO, #16 ]
  155. fmacd d29 , d1, d11
  156. fldd d15, [ BO, #24 ]
  157. fmacd d30 , d2, d11
  158. fmacd d31 , d3, d11
  159. add BO , BO, #32
  160. .endm
  161. .macro KERNEL4x4_M1
  162. fmacd d16 , d4, d12
  163. pld [ AO , #A_PRE ]
  164. fmacd d17 , d5, d12
  165. fmacd d18 , d6, d12
  166. pld [ BO , #B_PRE ]
  167. fmacd d19 , d7, d12
  168. fmacd d20 , d4, d13
  169. fldd d8 , [ BO ]
  170. fmacd d21 , d5, d13
  171. fmacd d22 , d6, d13
  172. fldmiad AO!, { d0 - d1 }
  173. fmacd d23 , d7, d13
  174. fmacd d24 , d4, d14
  175. fldmiad AO!, { d2 - d3 }
  176. fmacd d25 , d5, d14
  177. fldd d9 , [ BO, #8 ]
  178. fmacd d26 , d6, d14
  179. fldd d10, [ BO, #16 ]
  180. fmacd d27 , d7, d14
  181. fldd d11, [ BO, #24 ]
  182. fmacd d28 , d4, d15
  183. fmacd d29 , d5, d15
  184. fmacd d30 , d6, d15
  185. add BO , BO, #32
  186. fmacd d31 , d7, d15
  187. .endm
  188. .macro KERNEL4x4_M2
  189. fmacd d16 , d0, d8
  190. pld [ AO , #A_PRE ]
  191. fmacd d17 , d1, d8
  192. pld [ BO , #B_PRE ]
  193. fmacd d18 , d2, d8
  194. fldd d12, [ BO ]
  195. fmacd d19 , d3, d8
  196. fmacd d20 , d0, d9
  197. fldmiad AO!, { d4 - d5 }
  198. fmacd d21 , d1, d9
  199. fmacd d22 , d2, d9
  200. fldmiad AO!, { d6 - d7 }
  201. fmacd d23 , d3, d9
  202. fmacd d24 , d0, d10
  203. fmacd d25 , d1, d10
  204. fmacd d26 , d2, d10
  205. fmacd d27 , d3, d10
  206. fldd d13, [ BO, #8 ]
  207. fmacd d28 , d0, d11
  208. fldd d14, [ BO, #16 ]
  209. fmacd d29 , d1, d11
  210. fldd d15, [ BO, #24 ]
  211. fmacd d30 , d2, d11
  212. fmacd d31 , d3, d11
  213. add BO , BO, #32
  214. .endm
  215. .macro KERNEL4x4_E
  216. fmacd d16 , d4, d12
  217. pld [ AO , #A_PRE ]
  218. fmacd d17 , d5, d12
  219. fmacd d18 , d6, d12
  220. pld [ BO , #B_PRE ]
  221. fmacd d19 , d7, d12
  222. fmacd d20 , d4, d13
  223. fmacd d21 , d5, d13
  224. fmacd d22 , d6, d13
  225. fmacd d23 , d7, d13
  226. fmacd d24 , d4, d14
  227. fmacd d25 , d5, d14
  228. fmacd d26 , d6, d14
  229. fmacd d27 , d7, d14
  230. fmacd d28 , d4, d15
  231. fmacd d29 , d5, d15
  232. fmacd d30 , d6, d15
  233. fmacd d31 , d7, d15
  234. .endm
  235. .macro KERNEL4x4_SUB
  236. pld [ BO , #B_PRE ]
  237. pld [ AO , #A_PRE ]
  238. fldd d8 , [ BO ]
  239. fldd d0 , [ AO ]
  240. fldd d1 , [ AO, #8 ]
  241. fldd d2 , [ AO, #16 ]
  242. fldd d3 , [ AO, #24 ]
  243. fmacd d16 , d0, d8
  244. fldd d9 , [ BO, #8 ]
  245. fmacd d17 , d1, d8
  246. fldd d10, [ BO, #16 ]
  247. fmacd d18 , d2, d8
  248. fldd d11, [ BO, #24 ]
  249. fmacd d19 , d3, d8
  250. fmacd d20 , d0, d9
  251. fmacd d21 , d1, d9
  252. fmacd d22 , d2, d9
  253. fmacd d23 , d3, d9
  254. fmacd d24 , d0, d10
  255. fmacd d25 , d1, d10
  256. fmacd d26 , d2, d10
  257. fmacd d27 , d3, d10
  258. fmacd d28 , d0, d11
  259. fmacd d29 , d1, d11
  260. add AO , AO, #32
  261. fmacd d30 , d2, d11
  262. add BO , BO, #32
  263. fmacd d31 , d3, d11
  264. .endm
  265. .macro SAVE4x4
  266. ldr r3 , LDC
  267. add CO2 , CO1, r3
  268. fldd d0, ALPHA
  269. add r4 , CO2, r3
  270. fmuld d8 , d0 , d16
  271. fmuld d9 , d0 , d17
  272. fmuld d10, d0 , d18
  273. fmuld d11, d0 , d19
  274. fmuld d12, d0 , d20
  275. fstd d8 , [CO1]
  276. fmuld d13, d0 , d21
  277. fstd d9 , [CO1, #8 ]
  278. fmuld d14, d0 , d22
  279. fstd d10, [CO1, #16 ]
  280. fmuld d15, d0 , d23
  281. fstd d11, [CO1, #24 ]
  282. fmuld d8 , d0 , d24
  283. fstd d12, [CO2]
  284. fmuld d9 , d0 , d25
  285. fstd d13, [CO2, #8 ]
  286. fmuld d10, d0 , d26
  287. fstd d14, [CO2, #16 ]
  288. fmuld d11, d0 , d27
  289. fstd d15, [CO2, #24 ]
  290. add CO2, r4 , r3
  291. fstd d8 , [r4 ]
  292. fmuld d12, d0 , d28
  293. fstd d9 , [r4 , #8 ]
  294. fmuld d13, d0 , d29
  295. fstd d10, [r4 , #16 ]
  296. fmuld d14, d0 , d30
  297. fstd d11, [r4 , #24 ]
  298. fmuld d15, d0 , d31
  299. fstmiad CO2, { d12 - d15 }
  300. add CO1, CO1, #32
  301. .endm
  302. /******************************************************************************/
  303. .macro INIT2x4
  304. vsub.f64 d16 , d16 , d16
  305. vmov.f64 d17, d16
  306. vmov.f64 d20, d16
  307. vmov.f64 d21, d16
  308. vmov.f64 d24, d16
  309. vmov.f64 d25, d16
  310. vmov.f64 d28, d16
  311. vmov.f64 d29, d16
  312. .endm
  313. .macro KERNEL2x4_SUB
  314. fldd d8 , [ BO ]
  315. fldd d9 , [ BO, #8 ]
  316. fldd d10, [ BO, #16 ]
  317. fldd d11, [ BO, #24 ]
  318. fldd d0 , [ AO ]
  319. fldd d1 , [ AO, #8 ]
  320. fmacd d16 , d0, d8
  321. fmacd d17 , d1, d8
  322. fmacd d20 , d0, d9
  323. fmacd d21 , d1, d9
  324. fmacd d24 , d0, d10
  325. fmacd d25 , d1, d10
  326. fmacd d28 , d0, d11
  327. fmacd d29 , d1, d11
  328. add AO , AO, #16
  329. add BO , BO, #32
  330. .endm
  331. .macro SAVE2x4
  332. ldr r3 , LDC
  333. add CO2 , CO1, r3
  334. add r4 , CO2, r3
  335. fldd d0, ALPHA
  336. fmuld d8 , d0 , d16
  337. fmuld d9 , d0 , d17
  338. fstd d8 , [CO1]
  339. fstd d9 , [CO1, #8 ]
  340. fmuld d12, d0 , d20
  341. fmuld d13, d0 , d21
  342. fstd d12, [CO2]
  343. fstd d13, [CO2, #8 ]
  344. fmuld d8 , d0 , d24
  345. fmuld d9 , d0 , d25
  346. fstd d8 , [r4 ]
  347. fstd d9 , [r4 , #8 ]
  348. add CO2, r4 , r3
  349. fmuld d12, d0 , d28
  350. fmuld d13, d0 , d29
  351. fstd d12, [CO2]
  352. fstd d13, [CO2, #8 ]
  353. add CO1, CO1, #16
  354. .endm
  355. /******************************************************************************/
  356. .macro INIT1x4
  357. vsub.f64 d16 , d16 , d16
  358. vmov.f64 d20, d16
  359. vmov.f64 d24, d16
  360. vmov.f64 d28, d16
  361. .endm
  362. .macro KERNEL1x4_SUB
  363. fldd d8 , [ BO ]
  364. fldd d9 , [ BO, #8 ]
  365. fldd d10, [ BO, #16 ]
  366. fldd d11, [ BO, #24 ]
  367. fldd d0 , [ AO ]
  368. fmacd d16 , d0, d8
  369. fmacd d20 , d0, d9
  370. fmacd d24 , d0, d10
  371. fmacd d28 , d0, d11
  372. add AO , AO, #8
  373. add BO , BO, #32
  374. .endm
  375. .macro SAVE1x4
  376. ldr r3 , LDC
  377. add CO2 , CO1, r3
  378. add r4 , CO2, r3
  379. fldd d0, ALPHA
  380. fmuld d8 , d0 , d16
  381. fstd d8 , [CO1]
  382. fmuld d12, d0 , d20
  383. fstd d12, [CO2]
  384. fmuld d8 , d0 , d24
  385. fstd d8 , [r4 ]
  386. add CO2, r4 , r3
  387. fmuld d12, d0 , d28
  388. fstd d12, [CO2]
  389. add CO1, CO1, #8
  390. .endm
  391. /******************************************************************************/
  392. /******************************************************************************/
  393. .macro INIT4x2
  394. vsub.f64 d16 , d16 , d16
  395. vmov.f64 d17, d16
  396. vmov.f64 d18, d16
  397. vmov.f64 d19, d16
  398. vmov.f64 d20, d16
  399. vmov.f64 d21, d16
  400. vmov.f64 d22, d16
  401. vmov.f64 d23, d16
  402. .endm
  403. .macro KERNEL4x2_SUB
  404. fldd d8 , [ BO ]
  405. fldd d9 , [ BO, #8 ]
  406. fldd d0 , [ AO ]
  407. fldd d1 , [ AO, #8 ]
  408. fldd d2 , [ AO, #16 ]
  409. fldd d3 , [ AO, #24 ]
  410. fmacd d16 , d0, d8
  411. fmacd d17 , d1, d8
  412. fmacd d18 , d2, d8
  413. fmacd d19 , d3, d8
  414. fmacd d20 , d0, d9
  415. fmacd d21 , d1, d9
  416. fmacd d22 , d2, d9
  417. fmacd d23 , d3, d9
  418. add AO , AO, #32
  419. add BO , BO, #16
  420. .endm
  421. .macro SAVE4x2
  422. ldr r3 , LDC
  423. add CO2 , CO1, r3
  424. fldd d0, ALPHA
  425. fmuld d8 , d0 , d16
  426. fmuld d9 , d0 , d17
  427. fmuld d10, d0 , d18
  428. fmuld d11, d0 , d19
  429. fstd d8 , [CO1]
  430. fstd d9 , [CO1, #8 ]
  431. fstd d10, [CO1, #16 ]
  432. fstd d11, [CO1, #24 ]
  433. fmuld d12, d0 , d20
  434. fmuld d13, d0 , d21
  435. fmuld d14, d0 , d22
  436. fmuld d15, d0 , d23
  437. fstd d12, [CO2]
  438. fstd d13, [CO2, #8 ]
  439. fstd d14, [CO2, #16 ]
  440. fstd d15, [CO2, #24 ]
  441. add CO1, CO1, #32
  442. .endm
  443. /******************************************************************************/
  444. .macro INIT2x2
  445. vsub.f64 d16 , d16 , d16
  446. vmov.f64 d17, d16
  447. vmov.f64 d20, d16
  448. vmov.f64 d21, d16
  449. .endm
  450. .macro KERNEL2x2_SUB
  451. fldd d8 , [ BO ]
  452. fldd d9 , [ BO, #8 ]
  453. fldd d0 , [ AO ]
  454. fldd d1 , [ AO, #8 ]
  455. fmacd d16 , d0, d8
  456. fmacd d17 , d1, d8
  457. fmacd d20 , d0, d9
  458. fmacd d21 , d1, d9
  459. add AO , AO, #16
  460. add BO , BO, #16
  461. .endm
  462. .macro SAVE2x2
  463. ldr r3 , LDC
  464. add CO2 , CO1, r3
  465. fldd d0, ALPHA
  466. fmuld d8 , d0 , d16
  467. fmuld d9 , d0 , d17
  468. fstd d8 , [CO1]
  469. fstd d9 , [CO1, #8 ]
  470. fmuld d12, d0 , d20
  471. fmuld d13, d0 , d21
  472. fstd d12, [CO2]
  473. fstd d13, [CO2, #8 ]
  474. add CO1, CO1, #16
  475. .endm
  476. /******************************************************************************/
  477. .macro INIT1x2
  478. vsub.f64 d16 , d16 , d16
  479. vmov.f64 d20, d16
  480. .endm
  481. .macro KERNEL1x2_SUB
  482. fldd d8 , [ BO ]
  483. fldd d9 , [ BO, #8 ]
  484. fldd d0 , [ AO ]
  485. fmacd d16 , d0, d8
  486. fmacd d20 , d0, d9
  487. add AO , AO, #8
  488. add BO , BO, #16
  489. .endm
  490. .macro SAVE1x2
  491. ldr r3 , LDC
  492. add CO2 , CO1, r3
  493. fldd d0, ALPHA
  494. fmuld d8 , d0 , d16
  495. fstd d8 , [CO1]
  496. fmuld d12, d0 , d20
  497. fstd d12, [CO2]
  498. add CO1, CO1, #8
  499. .endm
  500. /******************************************************************************/
  501. /******************************************************************************/
  502. .macro INIT4x1
  503. vsub.f64 d16 , d16 , d16
  504. vmov.f64 d17, d16
  505. vmov.f64 d18, d16
  506. vmov.f64 d19, d16
  507. .endm
  508. .macro KERNEL4x1_SUB
  509. fldd d8 , [ BO ]
  510. fldd d0 , [ AO ]
  511. fldd d1 , [ AO, #8 ]
  512. fldd d2 , [ AO, #16 ]
  513. fldd d3 , [ AO, #24 ]
  514. fmacd d16 , d0, d8
  515. fmacd d17 , d1, d8
  516. fmacd d18 , d2, d8
  517. fmacd d19 , d3, d8
  518. add AO , AO, #32
  519. add BO , BO, #8
  520. .endm
  521. .macro SAVE4x1
  522. fldd d0, ALPHA
  523. fmuld d8 , d0 , d16
  524. fmuld d9 , d0 , d17
  525. fmuld d10, d0 , d18
  526. fmuld d11, d0 , d19
  527. fstd d8 , [CO1]
  528. fstd d9 , [CO1, #8 ]
  529. fstd d10, [CO1, #16 ]
  530. fstd d11, [CO1, #24 ]
  531. add CO1, CO1, #32
  532. .endm
  533. /******************************************************************************/
  534. .macro INIT2x1
  535. vsub.f64 d16 , d16 , d16
  536. vmov.f64 d17, d16
  537. .endm
  538. .macro KERNEL2x1_SUB
  539. fldd d8 , [ BO ]
  540. fldd d0 , [ AO ]
  541. fldd d1 , [ AO, #8 ]
  542. fmacd d16 , d0, d8
  543. fmacd d17 , d1, d8
  544. add AO , AO, #16
  545. add BO , BO, #8
  546. .endm
  547. .macro SAVE2x1
  548. fldd d0, ALPHA
  549. fmuld d8 , d0 , d16
  550. fmuld d9 , d0 , d17
  551. fstd d8 , [CO1]
  552. fstd d9 , [CO1, #8 ]
  553. add CO1, CO1, #16
  554. .endm
  555. /******************************************************************************/
  556. .macro INIT1x1
  557. vsub.f64 d16 , d16 , d16
  558. .endm
  559. .macro KERNEL1x1_SUB
  560. fldd d8 , [ BO ]
  561. fldd d0 , [ AO ]
  562. fmacd d16 , d0, d8
  563. add AO , AO, #8
  564. add BO , BO, #8
  565. .endm
  566. .macro SAVE1x1
  567. fldd d0, ALPHA
  568. fmuld d8 , d0 , d16
  569. fstd d8 , [CO1]
  570. add CO1, CO1, #8
  571. .endm
  572. /**************************************************************************************
  573. * End of macro definitions
  574. **************************************************************************************/
  575. PROLOGUE
  576. .align 5
  577. push {r4 - r9, fp}
  578. add fp, sp, #24
  579. sub sp, sp, #STACKSIZE // reserve stack
  580. str OLD_M, M
  581. str OLD_N, N
  582. str OLD_K, K
  583. str OLD_A, A
  584. vstr OLD_ALPHA, ALPHA
  585. sub r3, fp, #128
  586. vstm r3, { d8 - d15} // store floating point registers
  587. ldr r3, OLD_LDC
  588. lsl r3, r3, #3 // ldc = ldc * 8
  589. str r3, LDC
  590. ldr r3, OLD_C
  591. str r3, C
  592. ldr BC, B
  593. ldr r3, OFFSET
  594. #ifndef LEFT
  595. neg r3 , r3
  596. #endif
  597. str r3 , KK
  598. ldr J, N
  599. asrs J, J, #2 // J = J / 4
  600. ble _L2_BEGIN
  601. _L4_BEGIN:
  602. ldr CO1, C // CO1 = C
  603. ldr r4 , LDC
  604. lsl r4 , r4 , #2 // LDC * 4
  605. add r3 , r4, CO1
  606. str r3 , C // store C
  607. #if defined(LEFT)
  608. ldr r3 , OFFSET
  609. str r3 , KK
  610. #endif
  611. ldr AO, A // AO = A
  612. pld [AO , #A_PRE-64]
  613. pld [AO , #A_PRE-32]
  614. _L4_M4_BEGIN:
  615. ldr I, M
  616. asrs I, I, #2 // I = I / 4
  617. ble _L4_M2_BEGIN
  618. _L4_M4_20:
  619. #if (defined(LEFT) && defined(TRANSA)) || \
  620. (!defined(LEFT) && !defined(TRANSA))
  621. mov BO, BC
  622. #else
  623. mov BO, BC
  624. ldr r3 , KK
  625. lsls r4 , r3 , #5 // 4 double values
  626. add BO , BO , r4
  627. lsls r4 , r3 , #5 // 4 double values
  628. add AO , AO , r4
  629. #endif
  630. #ifndef TRMMKERNEL
  631. ldr L , K
  632. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  633. ldr L , K
  634. ldr r3, KK
  635. sub L , L, r3
  636. str L , KKK
  637. #else
  638. ldr L , KK
  639. #ifdef LEFT
  640. add L , L , #4 // number of values in AO
  641. #else
  642. add L , L , #4 // number of values in BO
  643. #endif
  644. str L , KKK
  645. #endif
  646. mov K1, L
  647. asrs L , K1, #5 // L = L / 8
  648. ble _L4_M4_40
  649. .align 5
  650. KERNEL4x4_I
  651. KERNEL4x4_M1
  652. KERNEL4x4_M2
  653. KERNEL4x4_M1
  654. KERNEL4x4_M2
  655. KERNEL4x4_M1
  656. KERNEL4x4_M2
  657. KERNEL4x4_M1
  658. KERNEL4x4_M2
  659. KERNEL4x4_M1
  660. KERNEL4x4_M2
  661. KERNEL4x4_M1
  662. KERNEL4x4_M2
  663. KERNEL4x4_M1
  664. KERNEL4x4_M2
  665. KERNEL4x4_M1
  666. KERNEL4x4_M2
  667. KERNEL4x4_M1
  668. KERNEL4x4_M2
  669. KERNEL4x4_M1
  670. KERNEL4x4_M2
  671. KERNEL4x4_M1
  672. KERNEL4x4_M2
  673. KERNEL4x4_M1
  674. KERNEL4x4_M2
  675. KERNEL4x4_M1
  676. KERNEL4x4_M2
  677. KERNEL4x4_M1
  678. KERNEL4x4_M2
  679. KERNEL4x4_M1
  680. KERNEL4x4_M2
  681. KERNEL4x4_E
  682. subs L, L, #1
  683. ble _L4_M4_41
  684. _L4_M4_22:
  685. KERNEL4x4_S
  686. KERNEL4x4_M1
  687. KERNEL4x4_M2
  688. KERNEL4x4_M1
  689. KERNEL4x4_M2
  690. KERNEL4x4_M1
  691. KERNEL4x4_M2
  692. KERNEL4x4_M1
  693. KERNEL4x4_M2
  694. KERNEL4x4_M1
  695. KERNEL4x4_M2
  696. KERNEL4x4_M1
  697. KERNEL4x4_M2
  698. KERNEL4x4_M1
  699. KERNEL4x4_M2
  700. KERNEL4x4_M1
  701. KERNEL4x4_M2
  702. KERNEL4x4_M1
  703. KERNEL4x4_M2
  704. KERNEL4x4_M1
  705. KERNEL4x4_M2
  706. KERNEL4x4_M1
  707. KERNEL4x4_M2
  708. KERNEL4x4_M1
  709. KERNEL4x4_M2
  710. KERNEL4x4_M1
  711. KERNEL4x4_M2
  712. KERNEL4x4_M1
  713. KERNEL4x4_M2
  714. KERNEL4x4_M1
  715. KERNEL4x4_M2
  716. KERNEL4x4_E
  717. subs L, L, #1
  718. ble _L4_M4_41
  719. b _L4_M4_22
  720. _L4_M4_40:
  721. INIT4x4
  722. _L4_M4_41:
  723. ands L , K1, #31 // L = L % 8
  724. ble _L4_M4_100
  725. _L4_M4_42:
  726. KERNEL4x4_SUB
  727. subs L, L, #1
  728. bgt _L4_M4_42
  729. _L4_M4_100:
  730. SAVE4x4
  731. #if (defined(LEFT) && defined(TRANSA)) || \
  732. (!defined(LEFT) && !defined(TRANSA))
  733. ldr r3 , K
  734. ldr r4 , KKK
  735. sub r3 , r3 , r4
  736. lsls r4 , r3 , #5 // 4 double values
  737. add BO , BO , r4
  738. lsls r4 , r3 , #5 // 4 double values
  739. add AO , AO , r4
  740. #endif
  741. #if defined(LEFT)
  742. ldr r3 , KK
  743. add r3 , r3 , #4 // number of values in AO
  744. str r3 , KK
  745. #endif
  746. _L4_M4_END:
  747. subs I, I, #1
  748. bgt _L4_M4_20
  749. _L4_M2_BEGIN:
  750. ldr I, M
  751. tst I , #3
  752. ble _L4_END
  753. tst I, #2 // I = I / 2
  754. ble _L4_M1_BEGIN
  755. _L4_M2_20:
  756. INIT2x4
  757. #if (defined(LEFT) && defined(TRANSA)) || \
  758. (!defined(LEFT) && !defined(TRANSA))
  759. mov BO, BC
  760. #else
  761. mov BO, BC
  762. ldr r3 , KK
  763. lsls r4 , r3 , #5 // 4 double values
  764. add BO , BO , r4
  765. lsls r4 , r3 , #4 // 2 double values
  766. add AO , AO , r4
  767. #endif
  768. #ifndef TRMMKERNEL
  769. ldr L , K
  770. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  771. ldr L , K
  772. ldr r3, KK
  773. sub L , L, r3
  774. str L , KKK
  775. #else
  776. ldr L , KK
  777. #ifdef LEFT
  778. add L , L , #2 // number of values in AO
  779. #else
  780. add L , L , #4 // number of values in BO
  781. #endif
  782. str L , KKK
  783. #endif
  784. mov K1, L
  785. asrs L , K1, #3 // L = L / 8
  786. ble _L4_M2_40
  787. _L4_M2_22:
  788. KERNEL2x4_SUB
  789. KERNEL2x4_SUB
  790. KERNEL2x4_SUB
  791. KERNEL2x4_SUB
  792. KERNEL2x4_SUB
  793. KERNEL2x4_SUB
  794. KERNEL2x4_SUB
  795. KERNEL2x4_SUB
  796. subs L, L, #1
  797. bgt _L4_M2_22
  798. _L4_M2_40:
  799. ands L , K1, #7 // L = L % 8
  800. ble _L4_M2_100
  801. _L4_M2_42:
  802. KERNEL2x4_SUB
  803. subs L, L, #1
  804. bgt _L4_M2_42
  805. _L4_M2_100:
  806. SAVE2x4
  807. #if (defined(LEFT) && defined(TRANSA)) || \
  808. (!defined(LEFT) && !defined(TRANSA))
  809. ldr r3 , K
  810. ldr r4 , KKK
  811. sub r3 , r3 , r4
  812. lsls r4 , r3 , #5 // 4 double values
  813. add BO , BO , r4
  814. lsls r4 , r3 , #4 // 2 double values
  815. add AO , AO , r4
  816. #endif
  817. #if defined(LEFT)
  818. ldr r3 , KK
  819. add r3 , r3 , #2 // number of values in AO
  820. str r3 , KK
  821. #endif
  822. _L4_M2_END:
  823. _L4_M1_BEGIN:
  824. tst I, #1 // I = I % 2
  825. ble _L4_END
  826. _L4_M1_20:
  827. INIT1x4
  828. #if (defined(LEFT) && defined(TRANSA)) || \
  829. (!defined(LEFT) && !defined(TRANSA))
  830. mov BO, BC
  831. #else
  832. mov BO, BC
  833. ldr r3 , KK
  834. lsls r4 , r3 , #5 // 4 double values
  835. add BO , BO , r4
  836. lsls r4 , r3 , #3 // 1 double value
  837. add AO , AO , r4
  838. #endif
  839. #ifndef TRMMKERNEL
  840. ldr L , K
  841. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  842. ldr L , K
  843. ldr r3, KK
  844. sub L , L, r3
  845. str L , KKK
  846. #else
  847. ldr L , KK
  848. #ifdef LEFT
  849. add L , L , #1 // number of values in AO
  850. #else
  851. add L , L , #4 // number of values in BO
  852. #endif
  853. str L , KKK
  854. #endif
  855. mov K1, L
  856. asrs L , K1, #3 // L = L / 8
  857. ble _L4_M1_40
  858. _L4_M1_22:
  859. KERNEL1x4_SUB
  860. KERNEL1x4_SUB
  861. KERNEL1x4_SUB
  862. KERNEL1x4_SUB
  863. KERNEL1x4_SUB
  864. KERNEL1x4_SUB
  865. KERNEL1x4_SUB
  866. KERNEL1x4_SUB
  867. subs L, L, #1
  868. bgt _L4_M1_22
  869. _L4_M1_40:
  870. ands L , K1, #7 // L = L % 8
  871. ble _L4_M1_100
  872. _L4_M1_42:
  873. KERNEL1x4_SUB
  874. subs L, L, #1
  875. bgt _L4_M1_42
  876. _L4_M1_100:
  877. SAVE1x4
  878. #if (defined(LEFT) && defined(TRANSA)) || \
  879. (!defined(LEFT) && !defined(TRANSA))
  880. ldr r3 , K
  881. ldr r4 , KKK
  882. sub r3 , r3 , r4
  883. lsls r4 , r3 , #5 // 4 double values
  884. add BO , BO , r4
  885. lsls r4 , r3 , #3 // 1 double value
  886. add AO , AO , r4
  887. #endif
  888. #if defined(LEFT)
  889. ldr r3 , KK
  890. add r3 , r3 , #1 // number of values in AO
  891. str r3 , KK
  892. #endif
  893. _L4_END:
  894. mov r3, BC
  895. ldr r4, K
  896. lsl r4, r4, #5 // k * 4 * 8
  897. add r3, r3, r4 // B = B + K * 4 * 8
  898. mov BC, r3
  899. #if !defined(LEFT)
  900. ldr r3 , KK
  901. add r3 , r3 , #4 // number of values in BO
  902. str r3 , KK
  903. #endif
  904. subs J , #1 // j--
  905. bgt _L4_BEGIN
  906. /*********************************************************************************************/
  907. _L2_BEGIN:
  908. ldr J , N
  909. tst J , #3
  910. ble _L999
  911. tst J , #2
  912. ble _L1_BEGIN
  913. ldr CO1, C // CO1 = C
  914. ldr r4 , LDC
  915. lsl r4 , r4 , #1 // LDC * 2
  916. add r3 , r4, CO1
  917. str r3 , C // store C
  918. #if defined(LEFT)
  919. ldr r3 , OFFSET
  920. str r3 , KK
  921. #endif
  922. ldr AO, A // AO = A
  923. //pld [AO , #A_PRE-96]
  924. //pld [AO , #A_PRE-64]
  925. //pld [AO , #A_PRE-32]
  926. _L2_M4_BEGIN:
  927. ldr I, M
  928. asrs I, I, #2 // I = I / 4
  929. ble _L2_M2_BEGIN
  930. _L2_M4_20:
  931. INIT4x2
  932. #if (defined(LEFT) && defined(TRANSA)) || \
  933. (!defined(LEFT) && !defined(TRANSA))
  934. mov BO, BC
  935. #else
  936. mov BO, BC
  937. ldr r3 , KK
  938. lsls r4 , r3 , #4 // 2 double values
  939. add BO , BO , r4
  940. lsls r4 , r3 , #5 // 4 double values
  941. add AO , AO , r4
  942. #endif
  943. #ifndef TRMMKERNEL
  944. ldr L , K
  945. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  946. ldr L , K
  947. ldr r3, KK
  948. sub L , L, r3
  949. str L , KKK
  950. #else
  951. ldr L , KK
  952. #ifdef LEFT
  953. add L , L , #4 // number of values in AO
  954. #else
  955. add L , L , #2 // number of values in BO
  956. #endif
  957. str L , KKK
  958. #endif
  959. mov K1, L
  960. asrs L , K1, #3 // L = L / 8
  961. ble _L2_M4_40
  962. .align 5
  963. _L2_M4_22:
  964. KERNEL4x2_SUB
  965. KERNEL4x2_SUB
  966. KERNEL4x2_SUB
  967. KERNEL4x2_SUB
  968. KERNEL4x2_SUB
  969. KERNEL4x2_SUB
  970. KERNEL4x2_SUB
  971. KERNEL4x2_SUB
  972. subs L, L, #1
  973. bgt _L2_M4_22
  974. _L2_M4_40:
  975. ands L , K1, #7 // L = L % 8
  976. ble _L2_M4_100
  977. _L2_M4_42:
  978. KERNEL4x2_SUB
  979. subs L, L, #1
  980. bgt _L2_M4_42
  981. _L2_M4_100:
  982. SAVE4x2
  983. #if (defined(LEFT) && defined(TRANSA)) || \
  984. (!defined(LEFT) && !defined(TRANSA))
  985. ldr r3 , K
  986. ldr r4 , KKK
  987. sub r3 , r3 , r4
  988. lsls r4 , r3 , #4 // 2 double values
  989. add BO , BO , r4
  990. lsls r4 , r3 , #5 // 4 double values
  991. add AO , AO , r4
  992. #endif
  993. #if defined(LEFT)
  994. ldr r3 , KK
  995. add r3 , r3 , #4 // number of values in AO
  996. str r3 , KK
  997. #endif
  998. _L2_M4_END:
  999. subs I, I, #1
  1000. bgt _L2_M4_20
  1001. _L2_M2_BEGIN:
  1002. ldr I, M
  1003. tst I , #3
  1004. ble _L2_END
  1005. tst I, #2 // I = I / 2
  1006. ble _L2_M1_BEGIN
  1007. _L2_M2_20:
  1008. INIT2x2
  1009. #if (defined(LEFT) && defined(TRANSA)) || \
  1010. (!defined(LEFT) && !defined(TRANSA))
  1011. mov BO, BC
  1012. #else
  1013. mov BO, BC
  1014. ldr r3 , KK
  1015. lsls r4 , r3 , #4 // 2 double values
  1016. add BO , BO , r4
  1017. lsls r4 , r3 , #4 // 2 double values
  1018. add AO , AO , r4
  1019. #endif
  1020. #ifndef TRMMKERNEL
  1021. ldr L , K
  1022. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  1023. ldr L , K
  1024. ldr r3, KK
  1025. sub L , L, r3
  1026. str L , KKK
  1027. #else
  1028. ldr L , KK
  1029. #ifdef LEFT
  1030. add L , L , #2 // number of values in AO
  1031. #else
  1032. add L , L , #2 // number of values in BO
  1033. #endif
  1034. str L , KKK
  1035. #endif
  1036. mov K1, L
  1037. asrs L , K1, #3 // L = L / 8
  1038. ble _L2_M2_40
  1039. _L2_M2_22:
  1040. KERNEL2x2_SUB
  1041. KERNEL2x2_SUB
  1042. KERNEL2x2_SUB
  1043. KERNEL2x2_SUB
  1044. KERNEL2x2_SUB
  1045. KERNEL2x2_SUB
  1046. KERNEL2x2_SUB
  1047. KERNEL2x2_SUB
  1048. subs L, L, #1
  1049. bgt _L2_M2_22
  1050. _L2_M2_40:
  1051. ands L , K1, #7 // L = L % 8
  1052. ble _L2_M2_100
  1053. _L2_M2_42:
  1054. KERNEL2x2_SUB
  1055. subs L, L, #1
  1056. bgt _L2_M2_42
  1057. _L2_M2_100:
  1058. SAVE2x2
  1059. #if (defined(LEFT) && defined(TRANSA)) || \
  1060. (!defined(LEFT) && !defined(TRANSA))
  1061. ldr r3 , K
  1062. ldr r4 , KKK
  1063. sub r3 , r3 , r4
  1064. lsls r4 , r3 , #4 // 2 double values
  1065. add BO , BO , r4
  1066. lsls r4 , r3 , #4 // 2 double values
  1067. add AO , AO , r4
  1068. #endif
  1069. #if defined(LEFT)
  1070. ldr r3 , KK
  1071. add r3 , r3 , #2 // number of values in AO
  1072. str r3 , KK
  1073. #endif
  1074. _L2_M2_END:
  1075. _L2_M1_BEGIN:
  1076. tst I, #1 // I = I % 2
  1077. ble _L2_END
  1078. _L2_M1_20:
  1079. INIT1x2
  1080. #if (defined(LEFT) && defined(TRANSA)) || \
  1081. (!defined(LEFT) && !defined(TRANSA))
  1082. mov BO, BC
  1083. #else
  1084. mov BO, BC
  1085. ldr r3 , KK
  1086. lsls r4 , r3 , #4 // 2 double values
  1087. add BO , BO , r4
  1088. lsls r4 , r3 , #3 // 1 double value
  1089. add AO , AO , r4
  1090. #endif
  1091. #ifndef TRMMKERNEL
  1092. ldr L , K
  1093. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  1094. ldr L , K
  1095. ldr r3, KK
  1096. sub L , L, r3
  1097. str L , KKK
  1098. #else
  1099. ldr L , KK
  1100. #ifdef LEFT
  1101. add L , L , #1 // number of values in AO
  1102. #else
  1103. add L , L , #2 // number of values in BO
  1104. #endif
  1105. str L , KKK
  1106. #endif
  1107. mov K1, L
  1108. asrs L , K1, #3 // L = L / 8
  1109. ble _L2_M1_40
  1110. _L2_M1_22:
  1111. KERNEL1x2_SUB
  1112. KERNEL1x2_SUB
  1113. KERNEL1x2_SUB
  1114. KERNEL1x2_SUB
  1115. KERNEL1x2_SUB
  1116. KERNEL1x2_SUB
  1117. KERNEL1x2_SUB
  1118. KERNEL1x2_SUB
  1119. subs L, L, #1
  1120. bgt _L2_M1_22
  1121. _L2_M1_40:
  1122. ands L , K1, #7 // L = L % 8
  1123. ble _L2_M1_100
  1124. _L2_M1_42:
  1125. KERNEL1x2_SUB
  1126. subs L, L, #1
  1127. bgt _L2_M1_42
  1128. _L2_M1_100:
  1129. SAVE1x2
  1130. #if (defined(LEFT) && defined(TRANSA)) || \
  1131. (!defined(LEFT) && !defined(TRANSA))
  1132. ldr r3 , K
  1133. ldr r4 , KKK
  1134. sub r3 , r3 , r4
  1135. lsls r4 , r3 , #4 // 2 double values
  1136. add BO , BO , r4
  1137. lsls r4 , r3 , #3 // 1 double value
  1138. add AO , AO , r4
  1139. #endif
  1140. #if defined(LEFT)
  1141. ldr r3 , KK
  1142. add r3 , r3 , #1 // number of values in AO
  1143. str r3 , KK
  1144. #endif
  1145. _L2_END:
  1146. mov r3, BC
  1147. ldr r4, K
  1148. lsl r4, r4, #4 // k * 2 * 8
  1149. add r3, r3, r4 // B = B + K * 2 * 8
  1150. mov BC, r3
  1151. #if !defined(LEFT)
  1152. ldr r3 , KK
  1153. add r3 , r3 , #2 // number of values in BO
  1154. str r3 , KK
  1155. #endif
  1156. /*********************************************************************************************/
  1157. _L1_BEGIN:
  1158. ldr J , N
  1159. tst J , #1
  1160. ble _L999
  1161. ldr CO1, C // CO1 = C
  1162. ldr r4 , LDC
  1163. add r3 , r4, CO1
  1164. str r3 , C // store C
  1165. #if defined(LEFT)
  1166. ldr r3 , OFFSET
  1167. str r3 , KK
  1168. #endif
  1169. ldr AO, A // AO = A
  1170. //pld [AO , #A_PRE-96]
  1171. //pld [AO , #A_PRE-64]
  1172. //pld [AO , #A_PRE-32]
  1173. _L1_M4_BEGIN:
  1174. ldr I, M
  1175. asrs I, I, #2 // I = I / 4
  1176. ble _L1_M2_BEGIN
  1177. _L1_M4_20:
  1178. INIT4x1
  1179. #if (defined(LEFT) && defined(TRANSA)) || \
  1180. (!defined(LEFT) && !defined(TRANSA))
  1181. mov BO, BC
  1182. #else
  1183. mov BO, BC
  1184. ldr r3 , KK
  1185. lsls r4 , r3 , #3 // 1 double value
  1186. add BO , BO , r4
  1187. lsls r4 , r3 , #5 // 4 double values
  1188. add AO , AO , r4
  1189. #endif
  1190. #ifndef TRMMKERNEL
  1191. ldr L , K
  1192. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  1193. ldr L , K
  1194. ldr r3, KK
  1195. sub L , L, r3
  1196. str L , KKK
  1197. #else
  1198. ldr L , KK
  1199. #ifdef LEFT
  1200. add L , L , #4 // number of values in AO
  1201. #else
  1202. add L , L , #1 // number of values in BO
  1203. #endif
  1204. str L , KKK
  1205. #endif
  1206. mov K1, L
  1207. asrs L , K1, #3 // L = L / 8
  1208. ble _L1_M4_40
  1209. .align 5
  1210. _L1_M4_22:
  1211. KERNEL4x1_SUB
  1212. KERNEL4x1_SUB
  1213. KERNEL4x1_SUB
  1214. KERNEL4x1_SUB
  1215. KERNEL4x1_SUB
  1216. KERNEL4x1_SUB
  1217. KERNEL4x1_SUB
  1218. KERNEL4x1_SUB
  1219. subs L, L, #1
  1220. bgt _L1_M4_22
  1221. _L1_M4_40:
  1222. ands L , K1, #7 // L = L % 8
  1223. ble _L1_M4_100
  1224. _L1_M4_42:
  1225. KERNEL4x1_SUB
  1226. subs L, L, #1
  1227. bgt _L1_M4_42
  1228. _L1_M4_100:
  1229. SAVE4x1
  1230. #if (defined(LEFT) && defined(TRANSA)) || \
  1231. (!defined(LEFT) && !defined(TRANSA))
  1232. ldr r3 , K
  1233. ldr r4 , KKK
  1234. sub r3 , r3 , r4
  1235. lsls r4 , r3 , #3 // 1 double value
  1236. add BO , BO , r4
  1237. lsls r4 , r3 , #5 // 4 double values
  1238. add AO , AO , r4
  1239. #endif
  1240. #if defined(LEFT)
  1241. ldr r3 , KK
  1242. add r3 , r3 , #4 // number of values in AO
  1243. str r3 , KK
  1244. #endif
  1245. _L1_M4_END:
  1246. subs I, I, #1
  1247. bgt _L1_M4_20
  1248. _L1_M2_BEGIN:
  1249. ldr I, M
  1250. tst I , #3
  1251. ble _L1_END
  1252. tst I, #2 // I = I / 2
  1253. ble _L1_M1_BEGIN
  1254. _L1_M2_20:
  1255. INIT2x1
  1256. #if (defined(LEFT) && defined(TRANSA)) || \
  1257. (!defined(LEFT) && !defined(TRANSA))
  1258. mov BO, BC
  1259. #else
  1260. mov BO, BC
  1261. ldr r3 , KK
  1262. lsls r4 , r3 , #3 // 1 double value
  1263. add BO , BO , r4
  1264. lsls r4 , r3 , #4 // 2 double values
  1265. add AO , AO , r4
  1266. #endif
  1267. #ifndef TRMMKERNEL
  1268. ldr L , K
  1269. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  1270. ldr L , K
  1271. ldr r3, KK
  1272. sub L , L, r3
  1273. str L , KKK
  1274. #else
  1275. ldr L , KK
  1276. #ifdef LEFT
  1277. add L , L , #2 // number of values in AO
  1278. #else
  1279. add L , L , #1 // number of values in BO
  1280. #endif
  1281. str L , KKK
  1282. #endif
  1283. mov K1, L
  1284. asrs L , K1, #3 // L = L / 8
  1285. ble _L1_M2_40
  1286. _L1_M2_22:
  1287. KERNEL2x1_SUB
  1288. KERNEL2x1_SUB
  1289. KERNEL2x1_SUB
  1290. KERNEL2x1_SUB
  1291. KERNEL2x1_SUB
  1292. KERNEL2x1_SUB
  1293. KERNEL2x1_SUB
  1294. KERNEL2x1_SUB
  1295. subs L, L, #1
  1296. bgt _L1_M2_22
  1297. _L1_M2_40:
  1298. ands L , K1, #7 // L = L % 8
  1299. ble _L1_M2_100
  1300. _L1_M2_42:
  1301. KERNEL2x1_SUB
  1302. subs L, L, #1
  1303. bgt _L1_M2_42
  1304. _L1_M2_100:
  1305. SAVE2x1
  1306. #if (defined(LEFT) && defined(TRANSA)) || \
  1307. (!defined(LEFT) && !defined(TRANSA))
  1308. ldr r3 , K
  1309. ldr r4 , KKK
  1310. sub r3 , r3 , r4
  1311. lsls r4 , r3 , #3 // 1 double value
  1312. add BO , BO , r4
  1313. lsls r4 , r3 , #4 // 2 double values
  1314. add AO , AO , r4
  1315. #endif
  1316. #if defined(LEFT)
  1317. ldr r3 , KK
  1318. add r3 , r3 , #2 // number of values in AO
  1319. str r3 , KK
  1320. #endif
  1321. _L1_M2_END:
  1322. _L1_M1_BEGIN:
  1323. tst I, #1 // I = I % 2
  1324. ble _L1_END
  1325. _L1_M1_20:
  1326. INIT1x1
  1327. #if (defined(LEFT) && defined(TRANSA)) || \
  1328. (!defined(LEFT) && !defined(TRANSA))
  1329. mov BO, BC
  1330. #else
  1331. mov BO, BC
  1332. ldr r3 , KK
  1333. lsls r4 , r3 , #3 // 1 double value
  1334. add BO , BO , r4
  1335. lsls r4 , r3 , #3 // 1 double value
  1336. add AO , AO , r4
  1337. #endif
  1338. #ifndef TRMMKERNEL
  1339. ldr L , K
  1340. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  1341. ldr L , K
  1342. ldr r3, KK
  1343. sub L , L, r3
  1344. str L , KKK
  1345. #else
  1346. ldr L , KK
  1347. #ifdef LEFT
  1348. add L , L , #1 // number of values in AO
  1349. #else
  1350. add L , L , #1 // number of values in BO
  1351. #endif
  1352. str L , KKK
  1353. #endif
  1354. mov K1, L
  1355. asrs L , K1, #3 // L = L / 8
  1356. ble _L1_M1_40
  1357. _L1_M1_22:
  1358. KERNEL1x1_SUB
  1359. KERNEL1x1_SUB
  1360. KERNEL1x1_SUB
  1361. KERNEL1x1_SUB
  1362. KERNEL1x1_SUB
  1363. KERNEL1x1_SUB
  1364. KERNEL1x1_SUB
  1365. KERNEL1x1_SUB
  1366. subs L, L, #1
  1367. bgt _L1_M1_22
  1368. _L1_M1_40:
  1369. ands L , K1, #7 // L = L % 8
  1370. ble _L1_M1_100
  1371. _L1_M1_42:
  1372. KERNEL1x1_SUB
  1373. subs L, L, #1
  1374. bgt _L1_M1_42
  1375. _L1_M1_100:
  1376. SAVE1x1
  1377. _L1_END:
  1378. _L999:
  1379. sub r3, fp, #128
  1380. vldm r3, { d8 - d15} // restore floating point registers
  1381. movs r0, #0 // set return value
  1382. sub sp, fp, #24
  1383. pop {r4 - r9, fp}
  1384. bx lr
  1385. EPILOGUE