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

dgemm_kernel_4x4_vfpv3.S 23 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503
  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. * 2013/10/11 Saar
  35. * UNROLL_N 4
  36. * UNROLL_M 4
  37. * DGEMM_P 128
  38. * DGEMM_Q 96
  39. * DGEMM_R 512
  40. * A_PRE 96
  41. * B_PRE 96
  42. * C_PRE 64
  43. *
  44. * Performance on Odroid U2:
  45. *
  46. * 1 Core: 1.57 GFLOPS ATLAS: 1.59 GFLOPS
  47. * 2 Cores: 3.14 GFLOPS ATLAS: 3.16 GFLOPS
  48. * 3 Cores: 4.56 GFLOPS ATLAS: 4.60 GFLOPS
  49. * 4 Cores: 5.82 GFLOPS ATLAS: 5.41 GFLOPS
  50. **************************************************************************************/
  51. #define ASSEMBLER
  52. #include "common.h"
  53. #define STACKSIZE 256
  54. #define OLD_M r0
  55. #define OLD_N r1
  56. #define OLD_K r2
  57. #define OLD_A r3
  58. #define OLD_ALPHA d0
  59. /******************************************************
  60. * [fp, #-128] - [fp, #-64] is reserved
  61. * for store and restore of floating point
  62. * registers
  63. *******************************************************/
  64. #define LDC [fp, #-252 ]
  65. #define M [fp, #-256 ]
  66. #define N [fp, #-260 ]
  67. #define K [fp, #-264 ]
  68. #define A [fp, #-268 ]
  69. #define FP_ZERO [fp, #-240]
  70. #define FP_ZERO_0 [fp, # -240]
  71. #define FP_ZERO_1 [fp, # -236]
  72. #define ALPHA [fp, #-280]
  73. #if !defined(__ARM_PCS_VFP)
  74. #define OLD_ALPHA_SOFTFP [fp, #4]
  75. #define OLD_A_SOFTFP [fp, #12 ]
  76. #define B [fp, #16 ]
  77. #define C [fp, #20 ]
  78. #define OLD_LDC [fp, #24 ]
  79. #else
  80. #define B [fp, #4 ]
  81. #define C [fp, #8 ]
  82. #define OLD_LDC [fp, #12 ]
  83. #endif
  84. #define I r0
  85. #define J r1
  86. #define L r2
  87. #define AO r5
  88. #define BO r6
  89. #define CO1 r8
  90. #define CO2 r9
  91. #define K1 r7
  92. #define BC r12
  93. #define A_PRE 96
  94. #define B_PRE 96
  95. #define C_PRE 64
  96. /**************************************************************************************
  97. * Macro definitions
  98. **************************************************************************************/
  99. .macro INIT4x4
  100. fldd d16, FP_ZERO
  101. vmov.f64 d17, d16
  102. vmov.f64 d18, d16
  103. vmov.f64 d19, d16
  104. vmov.f64 d20, d16
  105. vmov.f64 d21, d16
  106. vmov.f64 d22, d16
  107. vmov.f64 d23, d16
  108. vmov.f64 d24, d16
  109. vmov.f64 d25, d16
  110. vmov.f64 d26, d16
  111. vmov.f64 d27, d16
  112. vmov.f64 d28, d16
  113. vmov.f64 d29, d16
  114. vmov.f64 d30, d16
  115. vmov.f64 d31, d16
  116. .endm
  117. .macro KERNEL4x4_I
  118. pld [ BO , #B_PRE ]
  119. fldd d8 , [ BO ]
  120. fldd d0 , [ AO ]
  121. pld [ AO , #A_PRE ]
  122. fldd d1 , [ AO, #8 ]
  123. fmuld d16 , d0, d8
  124. fldd d2 , [ AO, #16 ]
  125. fmuld d17 , d1, d8
  126. fldd d3 , [ AO, #24 ]
  127. fmuld d18 , d2, d8
  128. fldd d9 , [ BO, #8 ]
  129. fmuld d19 , d3, d8
  130. fldd d10, [ BO, #16 ]
  131. fmuld d20 , d0, d9
  132. fldd d11, [ BO, #24 ]
  133. fmuld d21 , d1, d9
  134. add BO , BO, #32
  135. add AO , AO, #32
  136. fmuld d22 , d2, d9
  137. pld [ BO , #B_PRE ]
  138. fldd d12, [ BO ]
  139. fmuld d23 , d3, d9
  140. pld [ AO , #A_PRE ]
  141. fldd d4 , [ AO, #0 ]
  142. fmuld d24 , d0, d10
  143. fldd d5 , [ AO, #8 ]
  144. fmuld d25 , d1, d10
  145. fldd d6 , [ AO, #16 ]
  146. fmuld d26 , d2, d10
  147. fldd d7 , [ AO, #24 ]
  148. fmuld d27 , d3, d10
  149. fldd d13, [ BO, #8 ]
  150. fmuld d28 , d0, d11
  151. fldd d14, [ BO, #16 ]
  152. fmuld d29 , d1, d11
  153. fldd d15, [ BO, #24 ]
  154. fmuld d30 , d2, d11
  155. fmuld d31 , d3, d11
  156. .endm
  157. .macro KERNEL4x4_M2
  158. fmacd d16 , d4, d12
  159. pld [ AO , #A_PRE+32 ]
  160. fmacd d17 , d5, d12
  161. fldd d0 , [ AO , #32 ]
  162. fmacd d18 , d6, d12
  163. pld [ BO , #B_PRE+32 ]
  164. fmacd d19 , d7, d12
  165. fldd d8 , [ BO , #32 ]
  166. fmacd d20 , d4, d13
  167. fldd d1 , [ AO, #40 ]
  168. fmacd d21 , d5, d13
  169. fldd d2 , [ AO, #48 ]
  170. fmacd d22 , d6, d13
  171. fldd d3 , [ AO, #56 ]
  172. fmacd d23 , d7, d13
  173. fmacd d24 , d4, d14
  174. fmacd d25 , d5, d14
  175. fldd d9 , [ BO, #40 ]
  176. fmacd d26 , d6, d14
  177. fldd d10, [ BO, #48 ]
  178. fmacd d27 , d7, d14
  179. fldd d11, [ BO, #56 ]
  180. fmacd d28 , d4, d15
  181. fmacd d29 , d5, d15
  182. add AO , AO, #64
  183. fmacd d30 , d6, d15
  184. add BO , BO, #64
  185. fmacd d31 , d7, d15
  186. .endm
  187. .macro KERNEL4x4_M1
  188. fmacd d16 , d0, d8
  189. pld [ AO , #A_PRE ]
  190. fmacd d17 , d1, d8
  191. fldd d4 , [ AO ]
  192. fmacd d18 , d2, d8
  193. pld [ BO , #B_PRE ]
  194. fmacd d19 , d3, d8
  195. fldd d12, [ BO ]
  196. fmacd d20 , d0, d9
  197. fldd d5 , [ AO, #8 ]
  198. fmacd d21 , d1, d9
  199. fldd d6 , [ AO, #16 ]
  200. fmacd d22 , d2, d9
  201. fldd d7 , [ AO, #24 ]
  202. fmacd d23 , d3, d9
  203. fmacd d24 , d0, d10
  204. fmacd d25 , d1, d10
  205. fldd d13, [ BO, #8 ]
  206. fmacd d26 , d2, d10
  207. fldd d14, [ BO, #16 ]
  208. fmacd d27 , d3, d10
  209. fldd d15, [ BO, #24 ]
  210. fmacd d28 , d0, d11
  211. fmacd d29 , d1, d11
  212. fmacd d30 , d2, d11
  213. fmacd d31 , d3, d11
  214. .endm
  215. .macro KERNEL4x4_E
  216. fmacd d16 , d4, d12
  217. fmacd d17 , d5, d12
  218. add BO , BO, #32
  219. add AO , AO, #32
  220. fmacd d18 , d6, d12
  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. fldd d8 , [ BO ]
  237. pld [ BO , #B_PRE ]
  238. fldd d0 , [ AO ]
  239. pld [ AO , #A_PRE ]
  240. fldd d1 , [ AO, #8 ]
  241. fmacd d16 , d0, d8
  242. fldd d2 , [ AO, #16 ]
  243. fmacd d17 , d1, d8
  244. fldd d3 , [ AO, #24 ]
  245. fmacd d18 , d2, d8
  246. fldd d9 , [ BO, #8 ]
  247. fmacd d19 , d3, d8
  248. fldd d10, [ BO, #16 ]
  249. fmacd d20 , d0, d9
  250. fldd d11, [ BO, #24 ]
  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. pld [ CO1 , #C_PRE ]
  267. ldr r3 , LDC
  268. add CO2 , CO1, r3
  269. fldd d0, ALPHA
  270. add r4 , CO2, r3
  271. pld [ CO2 , #C_PRE ]
  272. vldmia.f64 CO1, { d8 - d11 }
  273. pld [ r4 , #C_PRE ]
  274. fmacd d8 , d0 , d16
  275. fldd d12, [CO2]
  276. fmacd d9 , d0 , d17
  277. fldd d13, [CO2, #8 ]
  278. fmacd d10, d0 , d18
  279. fldd d14, [CO2, #16 ]
  280. fmacd d11, d0 , d19
  281. fldd d15, [CO2, #24 ]
  282. fmacd d12, d0 , d20
  283. fstd d8 , [CO1]
  284. fmacd d13, d0 , d21
  285. fstd d9 , [CO1, #8 ]
  286. fmacd d14, d0 , d22
  287. fstd d10, [CO1, #16 ]
  288. fmacd d15, d0 , d23
  289. fstd d11, [CO1, #24 ]
  290. vldmia.f64 r4, { d8 - d11 }
  291. fmacd d8 , d0 , d24
  292. fstd d12, [CO2]
  293. fmacd d9 , d0 , d25
  294. fstd d13, [CO2, #8 ]
  295. fmacd d10, d0 , d26
  296. fstd d14, [CO2, #16 ]
  297. fmacd d11, d0 , d27
  298. fstd d15, [CO2, #24 ]
  299. add CO2, r4 , r3
  300. pld [ CO2 , #C_PRE ]
  301. vldmia.f64 CO2, { d12 - d15 }
  302. fstd d8 , [r4 ]
  303. fmacd d12, d0 , d28
  304. fstd d9 , [r4 , #8 ]
  305. fmacd d13, d0 , d29
  306. fstd d10, [r4 , #16 ]
  307. fmacd d14, d0 , d30
  308. fstd d11, [r4 , #24 ]
  309. fmacd d15, d0 , d31
  310. vstmia.f64 CO2, { d12 - d15 }
  311. add CO1, CO1, #32
  312. .endm
  313. /******************************************************************************/
  314. .macro INIT2x4
  315. fldd d16, FP_ZERO
  316. vmov.f64 d17, d16
  317. vmov.f64 d20, d16
  318. vmov.f64 d21, d16
  319. vmov.f64 d24, d16
  320. vmov.f64 d25, d16
  321. vmov.f64 d28, d16
  322. vmov.f64 d29, d16
  323. .endm
  324. .macro KERNEL2x4_SUB
  325. fldd d8 , [ BO ]
  326. fldd d9 , [ BO, #8 ]
  327. fldd d10, [ BO, #16 ]
  328. fldd d11, [ BO, #24 ]
  329. fldd d0 , [ AO ]
  330. fldd d1 , [ AO, #8 ]
  331. fmacd d16 , d0, d8
  332. fmacd d17 , d1, d8
  333. fmacd d20 , d0, d9
  334. fmacd d21 , d1, d9
  335. fmacd d24 , d0, d10
  336. fmacd d25 , d1, d10
  337. fmacd d28 , d0, d11
  338. fmacd d29 , d1, d11
  339. add AO , AO, #16
  340. add BO , BO, #32
  341. .endm
  342. .macro SAVE2x4
  343. ldr r3 , LDC
  344. add CO2 , CO1, r3
  345. add r4 , CO2, r3
  346. fldd d0, ALPHA
  347. fldd d8 , [CO1]
  348. fldd d9 , [CO1, #8 ]
  349. fmacd d8 , d0 , d16
  350. fmacd d9 , d0 , d17
  351. fstd d8 , [CO1]
  352. fstd d9 , [CO1, #8 ]
  353. fldd d12, [CO2]
  354. fldd d13, [CO2, #8 ]
  355. fmacd d12, d0 , d20
  356. fmacd d13, d0 , d21
  357. fstd d12, [CO2]
  358. fstd d13, [CO2, #8 ]
  359. fldd d8 , [r4 ]
  360. fldd d9 , [r4 , #8 ]
  361. fmacd d8 , d0 , d24
  362. fmacd d9 , d0 , d25
  363. fstd d8 , [r4 ]
  364. fstd d9 , [r4 , #8 ]
  365. add CO2, r4 , r3
  366. fldd d12, [CO2]
  367. fldd d13, [CO2, #8 ]
  368. fmacd d12, d0 , d28
  369. fmacd d13, d0 , d29
  370. fstd d12, [CO2]
  371. fstd d13, [CO2, #8 ]
  372. add CO1, CO1, #16
  373. .endm
  374. /******************************************************************************/
  375. .macro INIT1x4
  376. fldd d16, FP_ZERO
  377. vmov.f64 d20, d16
  378. vmov.f64 d24, d16
  379. vmov.f64 d28, d16
  380. .endm
  381. .macro KERNEL1x4_SUB
  382. fldd d8 , [ BO ]
  383. fldd d9 , [ BO, #8 ]
  384. fldd d10, [ BO, #16 ]
  385. fldd d11, [ BO, #24 ]
  386. fldd d0 , [ AO ]
  387. fmacd d16 , d0, d8
  388. fmacd d20 , d0, d9
  389. fmacd d24 , d0, d10
  390. fmacd d28 , d0, d11
  391. add AO , AO, #8
  392. add BO , BO, #32
  393. .endm
  394. .macro SAVE1x4
  395. ldr r3 , LDC
  396. add CO2 , CO1, r3
  397. add r4 , CO2, r3
  398. fldd d0, ALPHA
  399. fldd d8 , [CO1]
  400. fmacd d8 , d0 , d16
  401. fstd d8 , [CO1]
  402. fldd d12, [CO2]
  403. fmacd d12, d0 , d20
  404. fstd d12, [CO2]
  405. fldd d8 , [r4 ]
  406. fmacd d8 , d0 , d24
  407. fstd d8 , [r4 ]
  408. add CO2, r4 , r3
  409. fldd d12, [CO2]
  410. fmacd d12, d0 , d28
  411. fstd d12, [CO2]
  412. add CO1, CO1, #8
  413. .endm
  414. /******************************************************************************/
  415. /******************************************************************************/
  416. .macro INIT4x2
  417. fldd d16, FP_ZERO
  418. vmov.f64 d17, d16
  419. vmov.f64 d18, d16
  420. vmov.f64 d19, d16
  421. vmov.f64 d20, d16
  422. vmov.f64 d21, d16
  423. vmov.f64 d22, d16
  424. vmov.f64 d23, d16
  425. .endm
  426. .macro KERNEL4x2_SUB
  427. fldd d8 , [ BO ]
  428. fldd d9 , [ BO, #8 ]
  429. fldd d0 , [ AO ]
  430. fldd d1 , [ AO, #8 ]
  431. fldd d2 , [ AO, #16 ]
  432. fldd d3 , [ AO, #24 ]
  433. fmacd d16 , d0, d8
  434. fmacd d17 , d1, d8
  435. fmacd d18 , d2, d8
  436. fmacd d19 , d3, d8
  437. fmacd d20 , d0, d9
  438. fmacd d21 , d1, d9
  439. fmacd d22 , d2, d9
  440. fmacd d23 , d3, d9
  441. add AO , AO, #32
  442. add BO , BO, #16
  443. .endm
  444. .macro SAVE4x2
  445. ldr r3 , LDC
  446. add CO2 , CO1, r3
  447. fldd d0, ALPHA
  448. fldd d8 , [CO1]
  449. fldd d9 , [CO1, #8 ]
  450. fldd d10, [CO1, #16 ]
  451. fldd d11, [CO1, #24 ]
  452. fmacd d8 , d0 , d16
  453. fmacd d9 , d0 , d17
  454. fmacd d10, d0 , d18
  455. fmacd d11, d0 , d19
  456. fstd d8 , [CO1]
  457. fstd d9 , [CO1, #8 ]
  458. fstd d10, [CO1, #16 ]
  459. fstd d11, [CO1, #24 ]
  460. fldd d12, [CO2]
  461. fldd d13, [CO2, #8 ]
  462. fldd d14, [CO2, #16 ]
  463. fldd d15, [CO2, #24 ]
  464. fmacd d12, d0 , d20
  465. fmacd d13, d0 , d21
  466. fmacd d14, d0 , d22
  467. fmacd d15, d0 , d23
  468. fstd d12, [CO2]
  469. fstd d13, [CO2, #8 ]
  470. fstd d14, [CO2, #16 ]
  471. fstd d15, [CO2, #24 ]
  472. add CO1, CO1, #32
  473. .endm
  474. /******************************************************************************/
  475. .macro INIT2x2
  476. fldd d16, FP_ZERO
  477. vmov.f64 d17, d16
  478. vmov.f64 d20, d16
  479. vmov.f64 d21, d16
  480. .endm
  481. .macro KERNEL2x2_SUB
  482. fldd d8 , [ BO ]
  483. fldd d9 , [ BO, #8 ]
  484. fldd d0 , [ AO ]
  485. fldd d1 , [ AO, #8 ]
  486. fmacd d16 , d0, d8
  487. fmacd d17 , d1, d8
  488. fmacd d20 , d0, d9
  489. fmacd d21 , d1, d9
  490. add AO , AO, #16
  491. add BO , BO, #16
  492. .endm
  493. .macro SAVE2x2
  494. ldr r3 , LDC
  495. add CO2 , CO1, r3
  496. fldd d0, ALPHA
  497. fldd d8 , [CO1]
  498. fldd d9 , [CO1, #8 ]
  499. fmacd d8 , d0 , d16
  500. fmacd d9 , d0 , d17
  501. fstd d8 , [CO1]
  502. fstd d9 , [CO1, #8 ]
  503. fldd d12, [CO2]
  504. fldd d13, [CO2, #8 ]
  505. fmacd d12, d0 , d20
  506. fmacd d13, d0 , d21
  507. fstd d12, [CO2]
  508. fstd d13, [CO2, #8 ]
  509. add CO1, CO1, #16
  510. .endm
  511. /******************************************************************************/
  512. .macro INIT1x2
  513. fldd d16, FP_ZERO
  514. vmov.f64 d20, d16
  515. .endm
  516. .macro KERNEL1x2_SUB
  517. fldd d8 , [ BO ]
  518. fldd d9 , [ BO, #8 ]
  519. fldd d0 , [ AO ]
  520. fmacd d16 , d0, d8
  521. fmacd d20 , d0, d9
  522. add AO , AO, #8
  523. add BO , BO, #16
  524. .endm
  525. .macro SAVE1x2
  526. ldr r3 , LDC
  527. add CO2 , CO1, r3
  528. fldd d0, ALPHA
  529. fldd d8 , [CO1]
  530. fmacd d8 , d0 , d16
  531. fstd d8 , [CO1]
  532. fldd d12, [CO2]
  533. fmacd d12, d0 , d20
  534. fstd d12, [CO2]
  535. add CO1, CO1, #8
  536. .endm
  537. /******************************************************************************/
  538. /******************************************************************************/
  539. .macro INIT4x1
  540. fldd d16, FP_ZERO
  541. vmov.f64 d17, d16
  542. vmov.f64 d18, d16
  543. vmov.f64 d19, d16
  544. .endm
  545. .macro KERNEL4x1_SUB
  546. fldd d8 , [ BO ]
  547. fldd d0 , [ AO ]
  548. fldd d1 , [ AO, #8 ]
  549. fldd d2 , [ AO, #16 ]
  550. fldd d3 , [ AO, #24 ]
  551. fmacd d16 , d0, d8
  552. fmacd d17 , d1, d8
  553. fmacd d18 , d2, d8
  554. fmacd d19 , d3, d8
  555. add AO , AO, #32
  556. add BO , BO, #8
  557. .endm
  558. .macro SAVE4x1
  559. fldd d0, ALPHA
  560. fldd d8 , [CO1]
  561. fldd d9 , [CO1, #8 ]
  562. fldd d10, [CO1, #16 ]
  563. fldd d11, [CO1, #24 ]
  564. fmacd d8 , d0 , d16
  565. fmacd d9 , d0 , d17
  566. fmacd d10, d0 , d18
  567. fmacd d11, d0 , d19
  568. fstd d8 , [CO1]
  569. fstd d9 , [CO1, #8 ]
  570. fstd d10, [CO1, #16 ]
  571. fstd d11, [CO1, #24 ]
  572. add CO1, CO1, #32
  573. .endm
  574. /******************************************************************************/
  575. .macro INIT2x1
  576. fldd d16, FP_ZERO
  577. vmov.f64 d17, d16
  578. .endm
  579. .macro KERNEL2x1_SUB
  580. fldd d8 , [ BO ]
  581. fldd d0 , [ AO ]
  582. fldd d1 , [ AO, #8 ]
  583. fmacd d16 , d0, d8
  584. fmacd d17 , d1, d8
  585. add AO , AO, #16
  586. add BO , BO, #8
  587. .endm
  588. .macro SAVE2x1
  589. fldd d0, ALPHA
  590. fldd d8 , [CO1]
  591. fldd d9 , [CO1, #8 ]
  592. fmacd d8 , d0 , d16
  593. fmacd d9 , d0 , d17
  594. fstd d8 , [CO1]
  595. fstd d9 , [CO1, #8 ]
  596. add CO1, CO1, #16
  597. .endm
  598. /******************************************************************************/
  599. .macro INIT1x1
  600. fldd d16, FP_ZERO
  601. .endm
  602. .macro KERNEL1x1_SUB
  603. fldd d8 , [ BO ]
  604. fldd d0 , [ AO ]
  605. fmacd d16 , d0, d8
  606. add AO , AO, #8
  607. add BO , BO, #8
  608. .endm
  609. .macro SAVE1x1
  610. fldd d0, ALPHA
  611. fldd d8 , [CO1]
  612. fmacd d8 , d0 , d16
  613. fstd d8 , [CO1]
  614. add CO1, CO1, #8
  615. .endm
  616. /**************************************************************************************
  617. * End of macro definitions
  618. **************************************************************************************/
  619. PROLOGUE
  620. .align 5
  621. push {r4 - r9, fp}
  622. add fp, sp, #24
  623. sub sp, sp, #STACKSIZE // reserve stack
  624. #if !defined(__ARM_PCS_VFP)
  625. vldr OLD_ALPHA, OLD_ALPHA_SOFTFP
  626. ldr OLD_A, OLD_A_SOFTFP
  627. #endif
  628. str OLD_M, M
  629. str OLD_N, N
  630. str OLD_K, K
  631. str OLD_A, A
  632. vstr OLD_ALPHA, ALPHA
  633. movs r4, #0
  634. str r4, FP_ZERO
  635. str r4, FP_ZERO_1
  636. sub r3, fp, #128
  637. vstm r3, { d8 - d15} // store floating point registers
  638. ldr r3, OLD_LDC
  639. lsl r3, r3, #3 // ldc = ldc * 8
  640. str r3, LDC
  641. ldr K1, K
  642. ldr BC, B
  643. ldr J, N
  644. asrs J, J, #2 // J = J / 4
  645. ble dgemm_kernel_L2_BEGIN
  646. dgemm_kernel_L4_BEGIN:
  647. ldr CO1, C // CO1 = C
  648. ldr r4 , LDC
  649. lsl r4 , r4 , #2 // LDC * 4
  650. add r3 , r4, CO1
  651. str r3 , C // store C
  652. ldr AO, A // AO = A
  653. pld [AO , #A_PRE-64]
  654. pld [AO , #A_PRE-32]
  655. dgemm_kernel_L4_M4_BEGIN:
  656. ldr I, M
  657. asrs I, I, #2 // I = I / 4
  658. ble dgemm_kernel_L4_M2_BEGIN
  659. dgemm_kernel_L4_M4_20:
  660. mov BO, BC
  661. asrs L , K1, #3 // L = L / 8
  662. cmp L , #2
  663. blt dgemm_kernel_L4_M4_32
  664. KERNEL4x4_I
  665. KERNEL4x4_M2
  666. KERNEL4x4_M1
  667. KERNEL4x4_M2
  668. KERNEL4x4_M1
  669. KERNEL4x4_M2
  670. KERNEL4x4_M1
  671. KERNEL4x4_M2
  672. subs L, L, #2
  673. ble dgemm_kernel_L4_M4_22a
  674. .align 5
  675. dgemm_kernel_L4_M4_22:
  676. KERNEL4x4_M1
  677. KERNEL4x4_M2
  678. KERNEL4x4_M1
  679. KERNEL4x4_M2
  680. KERNEL4x4_M1
  681. KERNEL4x4_M2
  682. KERNEL4x4_M1
  683. KERNEL4x4_M2
  684. subs L, L, #1
  685. bgt dgemm_kernel_L4_M4_22
  686. dgemm_kernel_L4_M4_22a:
  687. KERNEL4x4_M1
  688. KERNEL4x4_M2
  689. KERNEL4x4_M1
  690. KERNEL4x4_M2
  691. KERNEL4x4_M1
  692. KERNEL4x4_M2
  693. KERNEL4x4_M1
  694. KERNEL4x4_E
  695. b dgemm_kernel_L4_M4_44
  696. dgemm_kernel_L4_M4_32:
  697. tst L, #1
  698. ble dgemm_kernel_L4_M4_40
  699. KERNEL4x4_I
  700. KERNEL4x4_M2
  701. KERNEL4x4_M1
  702. KERNEL4x4_M2
  703. KERNEL4x4_M1
  704. KERNEL4x4_M2
  705. KERNEL4x4_M1
  706. KERNEL4x4_E
  707. b dgemm_kernel_L4_M4_44
  708. dgemm_kernel_L4_M4_40:
  709. INIT4x4
  710. dgemm_kernel_L4_M4_44:
  711. ands L , K1, #7 // L = L % 8
  712. ble dgemm_kernel_L4_M4_100
  713. dgemm_kernel_L4_M4_46:
  714. KERNEL4x4_SUB
  715. subs L, L, #1
  716. bne dgemm_kernel_L4_M4_46
  717. dgemm_kernel_L4_M4_100:
  718. SAVE4x4
  719. dgemm_kernel_L4_M4_END:
  720. subs I, I, #1
  721. bne dgemm_kernel_L4_M4_20
  722. dgemm_kernel_L4_M2_BEGIN:
  723. ldr I, M
  724. tst I , #3
  725. ble dgemm_kernel_L4_END
  726. tst I, #2 // I = I / 2
  727. ble dgemm_kernel_L4_M1_BEGIN
  728. dgemm_kernel_L4_M2_20:
  729. INIT2x4
  730. mov BO, BC
  731. asrs L , K1, #3 // L = L / 8
  732. ble dgemm_kernel_L4_M2_40
  733. dgemm_kernel_L4_M2_22:
  734. KERNEL2x4_SUB
  735. KERNEL2x4_SUB
  736. KERNEL2x4_SUB
  737. KERNEL2x4_SUB
  738. KERNEL2x4_SUB
  739. KERNEL2x4_SUB
  740. KERNEL2x4_SUB
  741. KERNEL2x4_SUB
  742. subs L, L, #1
  743. bgt dgemm_kernel_L4_M2_22
  744. dgemm_kernel_L4_M2_40:
  745. ands L , K1, #7 // L = L % 8
  746. ble dgemm_kernel_L4_M2_100
  747. dgemm_kernel_L4_M2_42:
  748. KERNEL2x4_SUB
  749. subs L, L, #1
  750. bgt dgemm_kernel_L4_M2_42
  751. dgemm_kernel_L4_M2_100:
  752. SAVE2x4
  753. dgemm_kernel_L4_M2_END:
  754. dgemm_kernel_L4_M1_BEGIN:
  755. tst I, #1 // I = I % 2
  756. ble dgemm_kernel_L4_END
  757. dgemm_kernel_L4_M1_20:
  758. INIT1x4
  759. mov BO, BC
  760. asrs L , K1, #3 // L = L / 8
  761. ble dgemm_kernel_L4_M1_40
  762. dgemm_kernel_L4_M1_22:
  763. KERNEL1x4_SUB
  764. KERNEL1x4_SUB
  765. KERNEL1x4_SUB
  766. KERNEL1x4_SUB
  767. KERNEL1x4_SUB
  768. KERNEL1x4_SUB
  769. KERNEL1x4_SUB
  770. KERNEL1x4_SUB
  771. subs L, L, #1
  772. bgt dgemm_kernel_L4_M1_22
  773. dgemm_kernel_L4_M1_40:
  774. ands L , K1, #7 // L = L % 8
  775. ble dgemm_kernel_L4_M1_100
  776. dgemm_kernel_L4_M1_42:
  777. KERNEL1x4_SUB
  778. subs L, L, #1
  779. bgt dgemm_kernel_L4_M1_42
  780. dgemm_kernel_L4_M1_100:
  781. SAVE1x4
  782. dgemm_kernel_L4_END:
  783. mov r3, BC
  784. mov r4, K1
  785. lsl r4, r4, #5 // k * 4 * 8
  786. add r3, r3, r4 // B = B + K * 4 * 8
  787. mov BC, r3
  788. subs J , #1 // j--
  789. bgt dgemm_kernel_L4_BEGIN
  790. /*********************************************************************************************/
  791. dgemm_kernel_L2_BEGIN:
  792. ldr J , N
  793. tst J , #3
  794. ble dgemm_kernel_L999
  795. tst J , #2
  796. ble dgemm_kernel_L1_BEGIN
  797. ldr CO1, C // CO1 = C
  798. ldr r4 , LDC
  799. lsl r4 , r4 , #1 // LDC * 2
  800. add r3 , r4, CO1
  801. str r3 , C // store C
  802. ldr AO, A // AO = A
  803. dgemm_kernel_L2_M4_BEGIN:
  804. ldr I, M
  805. asrs I, I, #2 // I = I / 4
  806. ble dgemm_kernel_L2_M2_BEGIN
  807. dgemm_kernel_L2_M4_20:
  808. INIT4x2
  809. mov BO, BC
  810. asrs L , K1, #3 // L = L / 8
  811. ble dgemm_kernel_L2_M4_40
  812. .align 5
  813. dgemm_kernel_L2_M4_22:
  814. KERNEL4x2_SUB
  815. KERNEL4x2_SUB
  816. KERNEL4x2_SUB
  817. KERNEL4x2_SUB
  818. KERNEL4x2_SUB
  819. KERNEL4x2_SUB
  820. KERNEL4x2_SUB
  821. KERNEL4x2_SUB
  822. subs L, L, #1
  823. bgt dgemm_kernel_L2_M4_22
  824. dgemm_kernel_L2_M4_40:
  825. ands L , K1, #7 // L = L % 8
  826. ble dgemm_kernel_L2_M4_100
  827. dgemm_kernel_L2_M4_42:
  828. KERNEL4x2_SUB
  829. subs L, L, #1
  830. bgt dgemm_kernel_L2_M4_42
  831. dgemm_kernel_L2_M4_100:
  832. SAVE4x2
  833. dgemm_kernel_L2_M4_END:
  834. subs I, I, #1
  835. bgt dgemm_kernel_L2_M4_20
  836. dgemm_kernel_L2_M2_BEGIN:
  837. ldr I, M
  838. tst I , #3
  839. ble dgemm_kernel_L2_END
  840. tst I, #2 // I = I / 2
  841. ble dgemm_kernel_L2_M1_BEGIN
  842. dgemm_kernel_L2_M2_20:
  843. INIT2x2
  844. mov BO, BC
  845. asrs L , K1, #3 // L = L / 8
  846. ble dgemm_kernel_L2_M2_40
  847. dgemm_kernel_L2_M2_22:
  848. KERNEL2x2_SUB
  849. KERNEL2x2_SUB
  850. KERNEL2x2_SUB
  851. KERNEL2x2_SUB
  852. KERNEL2x2_SUB
  853. KERNEL2x2_SUB
  854. KERNEL2x2_SUB
  855. KERNEL2x2_SUB
  856. subs L, L, #1
  857. bgt dgemm_kernel_L2_M2_22
  858. dgemm_kernel_L2_M2_40:
  859. ands L , K1, #7 // L = L % 8
  860. ble dgemm_kernel_L2_M2_100
  861. dgemm_kernel_L2_M2_42:
  862. KERNEL2x2_SUB
  863. subs L, L, #1
  864. bgt dgemm_kernel_L2_M2_42
  865. dgemm_kernel_L2_M2_100:
  866. SAVE2x2
  867. dgemm_kernel_L2_M2_END:
  868. dgemm_kernel_L2_M1_BEGIN:
  869. tst I, #1 // I = I % 2
  870. ble dgemm_kernel_L2_END
  871. dgemm_kernel_L2_M1_20:
  872. INIT1x2
  873. mov BO, BC
  874. asrs L , K1, #3 // L = L / 8
  875. ble dgemm_kernel_L2_M1_40
  876. dgemm_kernel_L2_M1_22:
  877. KERNEL1x2_SUB
  878. KERNEL1x2_SUB
  879. KERNEL1x2_SUB
  880. KERNEL1x2_SUB
  881. KERNEL1x2_SUB
  882. KERNEL1x2_SUB
  883. KERNEL1x2_SUB
  884. KERNEL1x2_SUB
  885. subs L, L, #1
  886. bgt dgemm_kernel_L2_M1_22
  887. dgemm_kernel_L2_M1_40:
  888. ands L , K1, #7 // L = L % 8
  889. ble dgemm_kernel_L2_M1_100
  890. dgemm_kernel_L2_M1_42:
  891. KERNEL1x2_SUB
  892. subs L, L, #1
  893. bgt dgemm_kernel_L2_M1_42
  894. dgemm_kernel_L2_M1_100:
  895. SAVE1x2
  896. dgemm_kernel_L2_END:
  897. mov r3, BC
  898. mov r4, K1
  899. lsl r4, r4, #4 // k * 2 * 8
  900. add r3, r3, r4 // B = B + K * 2 * 8
  901. mov BC, r3
  902. /*********************************************************************************************/
  903. dgemm_kernel_L1_BEGIN:
  904. ldr J , N
  905. tst J , #1
  906. ble dgemm_kernel_L999
  907. ldr CO1, C // CO1 = C
  908. ldr r4 , LDC
  909. add r3 , r4, CO1
  910. str r3 , C // store C
  911. ldr AO, A // AO = A
  912. dgemm_kernel_L1_M4_BEGIN:
  913. ldr I, M
  914. asrs I, I, #2 // I = I / 4
  915. ble dgemm_kernel_L1_M2_BEGIN
  916. dgemm_kernel_L1_M4_20:
  917. INIT4x1
  918. mov BO, BC
  919. asrs L , K1, #3 // L = L / 8
  920. ble dgemm_kernel_L1_M4_40
  921. .align 5
  922. dgemm_kernel_L1_M4_22:
  923. KERNEL4x1_SUB
  924. KERNEL4x1_SUB
  925. KERNEL4x1_SUB
  926. KERNEL4x1_SUB
  927. KERNEL4x1_SUB
  928. KERNEL4x1_SUB
  929. KERNEL4x1_SUB
  930. KERNEL4x1_SUB
  931. subs L, L, #1
  932. bgt dgemm_kernel_L1_M4_22
  933. dgemm_kernel_L1_M4_40:
  934. ands L , K1, #7 // L = L % 8
  935. ble dgemm_kernel_L1_M4_100
  936. dgemm_kernel_L1_M4_42:
  937. KERNEL4x1_SUB
  938. subs L, L, #1
  939. bgt dgemm_kernel_L1_M4_42
  940. dgemm_kernel_L1_M4_100:
  941. SAVE4x1
  942. dgemm_kernel_L1_M4_END:
  943. subs I, I, #1
  944. bgt dgemm_kernel_L1_M4_20
  945. dgemm_kernel_L1_M2_BEGIN:
  946. ldr I, M
  947. tst I , #3
  948. ble dgemm_kernel_L1_END
  949. tst I, #2 // I = I / 2
  950. ble dgemm_kernel_L1_M1_BEGIN
  951. dgemm_kernel_L1_M2_20:
  952. INIT2x1
  953. mov BO, BC
  954. asrs L , K1, #3 // L = L / 8
  955. ble dgemm_kernel_L1_M2_40
  956. dgemm_kernel_L1_M2_22:
  957. KERNEL2x1_SUB
  958. KERNEL2x1_SUB
  959. KERNEL2x1_SUB
  960. KERNEL2x1_SUB
  961. KERNEL2x1_SUB
  962. KERNEL2x1_SUB
  963. KERNEL2x1_SUB
  964. KERNEL2x1_SUB
  965. subs L, L, #1
  966. bgt dgemm_kernel_L1_M2_22
  967. dgemm_kernel_L1_M2_40:
  968. ands L , K1, #7 // L = L % 8
  969. ble dgemm_kernel_L1_M2_100
  970. dgemm_kernel_L1_M2_42:
  971. KERNEL2x1_SUB
  972. subs L, L, #1
  973. bgt dgemm_kernel_L1_M2_42
  974. dgemm_kernel_L1_M2_100:
  975. SAVE2x1
  976. dgemm_kernel_L1_M2_END:
  977. dgemm_kernel_L1_M1_BEGIN:
  978. tst I, #1 // I = I % 2
  979. ble dgemm_kernel_L1_END
  980. dgemm_kernel_L1_M1_20:
  981. INIT1x1
  982. mov BO, BC
  983. asrs L , K1, #3 // L = L / 8
  984. ble dgemm_kernel_L1_M1_40
  985. dgemm_kernel_L1_M1_22:
  986. KERNEL1x1_SUB
  987. KERNEL1x1_SUB
  988. KERNEL1x1_SUB
  989. KERNEL1x1_SUB
  990. KERNEL1x1_SUB
  991. KERNEL1x1_SUB
  992. KERNEL1x1_SUB
  993. KERNEL1x1_SUB
  994. subs L, L, #1
  995. bgt dgemm_kernel_L1_M1_22
  996. dgemm_kernel_L1_M1_40:
  997. ands L , K1, #7 // L = L % 8
  998. ble dgemm_kernel_L1_M1_100
  999. dgemm_kernel_L1_M1_42:
  1000. KERNEL1x1_SUB
  1001. subs L, L, #1
  1002. bgt dgemm_kernel_L1_M1_42
  1003. dgemm_kernel_L1_M1_100:
  1004. SAVE1x1
  1005. dgemm_kernel_L1_END:
  1006. dgemm_kernel_L999:
  1007. sub r3, fp, #128
  1008. vldm r3, { d8 - d15} // restore floating point registers
  1009. movs r0, #0 // set return value
  1010. sub sp, fp, #24
  1011. pop {r4 - r9, fp}
  1012. bx lr
  1013. EPILOGUE