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

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