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.

zgemm_kernel_2x2_vfpv3.S 22 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353
  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/05 Saar
  29. * BLASTEST : OK
  30. * CTEST : OK
  31. * TEST : OK
  32. *
  33. * 2013/11/02 Saar
  34. * UNROLL_N 2
  35. * UNROLL_M 2
  36. * ZGEMM_P 64
  37. * ZGEMM_Q 120
  38. * ZGEMM_R 4096
  39. * A_PRE 96
  40. * B_PRE 96
  41. * C_PRE 64
  42. *
  43. * Performance on Odroid U2:
  44. *
  45. * 1 Core: 1.62 GFLOPS ATLAS: 1.39 GFLOPS
  46. * 2 Cores: 3.20 GFLOPS ATLAS: 2.54 GFLOPS
  47. * 3 Cores: 4.72 GFLOPS ATLAS: 3.76 GFLOPS
  48. * 4 Cores: 5.93 GFLOPS ATLAS: 4.88 GFLOPS
  49. **************************************************************************************/
  50. #define ASSEMBLER
  51. #include "common.h"
  52. #define STACKSIZE 256
  53. #define OLD_M r0
  54. #define OLD_N r1
  55. #define OLD_K r2
  56. #define OLD_A r3
  57. #define OLD_ALPHA_R d0
  58. #define OLD_ALPHA_I d1
  59. /******************************************************
  60. * [fp, #-128] - [fp, #-64] is reserved
  61. * for store and restore of floating point
  62. * registers
  63. *******************************************************/
  64. #define A [fp, #-248 ]
  65. #define LDC [fp, #-252 ]
  66. #define M [fp, #-256 ]
  67. #define N [fp, #-260 ]
  68. #define K [fp, #-264 ]
  69. #define FP_ZERO [fp, #-240]
  70. #define FP_ZERO_0 [fp, # -240]
  71. #define FP_ZERO_1 [fp, # -236]
  72. #define ALPHA_I [fp, #-272]
  73. #define ALPHA_R [fp, #-280]
  74. #define B [fp, #4 ]
  75. #define C [fp, #8 ]
  76. #define OLD_LDC [fp, #12 ]
  77. #define I r0
  78. #define J r1
  79. #define L r2
  80. #define AO r5
  81. #define BO r6
  82. #define CO1 r8
  83. #define CO2 r9
  84. #define K1 r7
  85. #define BC r12
  86. #define A_PRE 96
  87. #define B_PRE 96
  88. #define C_PRE 64
  89. #if defined(NN) || defined(NT) || defined(TN) || defined(TT)
  90. #define FADD_R fsubd
  91. #define FADD_I faddd
  92. #define FMAC_R1 fnmacd
  93. #define FMAC_R2 fnmacd
  94. #define FMAC_I1 fmacd
  95. #define FMAC_I2 fnmacd
  96. #elif defined(CN) || defined(CT)
  97. #define FADD_R faddd
  98. #define FADD_I fsubd
  99. #define FMAC_R1 fmacd
  100. #define FMAC_R2 fmacd
  101. #define FMAC_I1 fnmacd
  102. #define FMAC_I2 fmacd
  103. #elif defined(NC) || defined(TC)
  104. #define FADD_R faddd
  105. #define FADD_I fsubd
  106. #define FMAC_R1 fmacd
  107. #define FMAC_R2 fnmacd
  108. #define FMAC_I1 fmacd
  109. #define FMAC_I2 fmacd
  110. #else
  111. #define FADD_R fsubd
  112. #define FADD_I faddd
  113. #define FMAC_R1 fnmacd
  114. #define FMAC_R2 fmacd
  115. #define FMAC_I1 fnmacd
  116. #define FMAC_I2 fnmacd
  117. #endif
  118. /**************************************************************************************
  119. * Macro definitions
  120. **************************************************************************************/
  121. .macro INIT2x2
  122. fldd d16, FP_ZERO
  123. vmov.f64 d17, d16
  124. vmov.f64 d18, d16
  125. vmov.f64 d19, d16
  126. vmov.f64 d20, d16
  127. vmov.f64 d21, d16
  128. vmov.f64 d22, d16
  129. vmov.f64 d23, d16
  130. vmov.f64 d24, d16
  131. vmov.f64 d25, d16
  132. vmov.f64 d26, d16
  133. vmov.f64 d27, d16
  134. vmov.f64 d28, d16
  135. vmov.f64 d29, d16
  136. vmov.f64 d30, d16
  137. vmov.f64 d31, d16
  138. .endm
  139. .macro KERNEL2x2_I
  140. pld [ AO , #A_PRE ]
  141. pld [ BO , #B_PRE ]
  142. fldd d0 , [ AO ]
  143. fldd d1 , [ AO, #8 ]
  144. fldd d8 , [ BO ]
  145. fldd d9 , [ BO, #8 ]
  146. fmuld d16 , d0, d8
  147. fldd d2 , [ AO, #16 ]
  148. fmuld d24 , d1, d9
  149. fldd d3 , [ AO, #24 ]
  150. fmuld d17 , d0, d9
  151. fldd d10, [ BO, #16 ]
  152. fmuld d25 , d1, d8
  153. fldd d11, [ BO, #24 ]
  154. fmuld d18 , d2, d8
  155. add BO , BO, #32
  156. fmuld d26 , d3, d9
  157. add AO , AO, #32
  158. fmuld d19 , d2, d9
  159. pld [ BO , #B_PRE ]
  160. fmuld d27 , d3, d8
  161. pld [ AO , #A_PRE ]
  162. fmuld d20 , d0, d10
  163. fldd d4 , [ AO, #0 ]
  164. fmuld d28 , d1, d11
  165. fldd d5 , [ AO, #8 ]
  166. fmuld d21 , d0, d11
  167. fldd d12, [ BO ]
  168. fmuld d29 , d1, d10
  169. fldd d13, [ BO, #8 ]
  170. fmuld d22 , d2, d10
  171. fldd d6 , [ AO, #16 ]
  172. fmuld d30 , d3, d11
  173. fldd d7 , [ AO, #24 ]
  174. fmuld d23 , d2, d11
  175. fldd d14, [ BO, #16 ]
  176. fmuld d31 , d3, d10
  177. fldd d15, [ BO, #24 ]
  178. add BO , BO, #32
  179. add AO , AO, #32
  180. .endm
  181. .macro KERNEL2x2_M1
  182. pld [ AO , #A_PRE ]
  183. fmacd d16 , d0, d8
  184. pld [ BO , #B_PRE ]
  185. fmacd d24 , d1, d9
  186. fldd d4 , [ AO, #0 ]
  187. fmacd d17 , d0, d9
  188. fldd d5 , [ AO, #8 ]
  189. fmacd d25 , d1, d8
  190. fldd d12, [ BO ]
  191. fmacd d18 , d2, d8
  192. fldd d13, [ BO, #8 ]
  193. fmacd d26 , d3, d9
  194. fldd d6 , [ AO, #16 ]
  195. fmacd d19 , d2, d9
  196. fldd d7 , [ AO, #24 ]
  197. fmacd d27 , d3, d8
  198. fmacd d20 , d0, d10
  199. fldd d14, [ BO, #16 ]
  200. fmacd d28 , d1, d11
  201. fmacd d21 , d0, d11
  202. fldd d15, [ BO, #24 ]
  203. fmacd d29 , d1, d10
  204. fmacd d22 , d2, d10
  205. add BO , BO, #32
  206. fmacd d30 , d3, d11
  207. fmacd d23 , d2, d11
  208. add AO , AO, #32
  209. fmacd d31 , d3, d10
  210. .endm
  211. .macro KERNEL2x2_M2
  212. pld [ AO , #A_PRE ]
  213. fmacd d16 , d4, d12
  214. pld [ BO , #B_PRE ]
  215. fmacd d24 , d5, d13
  216. fldd d0 , [ AO, #0 ]
  217. fmacd d17 , d4, d13
  218. fldd d1 , [ AO, #8 ]
  219. fmacd d25 , d5, d12
  220. fmacd d18 , d6, d12
  221. fldd d8 , [ BO ]
  222. fmacd d26 , d7, d13
  223. fldd d9 , [ BO, #8 ]
  224. fmacd d19 , d6, d13
  225. fmacd d27 , d7, d12
  226. fldd d2 , [ AO, #16 ]
  227. fmacd d20 , d4, d14
  228. fldd d3 , [ AO, #24 ]
  229. fmacd d28 , d5, d15
  230. fmacd d21 , d4, d15
  231. fldd d10, [ BO, #16 ]
  232. fmacd d29 , d5, d14
  233. fldd d11, [ BO, #24 ]
  234. fmacd d22 , d6, d14
  235. fmacd d30 , d7, d15
  236. add BO , BO, #32
  237. fmacd d23 , d6, d15
  238. add AO , AO, #32
  239. fmacd d31 , d7, d14
  240. .endm
  241. .macro KERNEL2x2_E
  242. fmacd d16 , d4, d12
  243. fmacd d24 , d5, d13
  244. fmacd d17 , d4, d13
  245. fmacd d25 , d5, d12
  246. fmacd d18 , d6, d12
  247. fmacd d26 , d7, d13
  248. fmacd d19 , d6, d13
  249. fmacd d27 , d7, d12
  250. fmacd d20 , d4, d14
  251. fmacd d28 , d5, d15
  252. fmacd d21 , d4, d15
  253. fmacd d29 , d5, d14
  254. fmacd d22 , d6, d14
  255. fmacd d30 , d7, d15
  256. fmacd d23 , d6, d15
  257. fmacd d31 , d7, d14
  258. .endm
  259. .macro KERNEL2x2_SUB
  260. pld [ AO , #A_PRE ]
  261. pld [ BO , #B_PRE ]
  262. fldd d0 , [ AO ]
  263. fldd d1 , [ AO, #8 ]
  264. fldd d8 , [ BO ]
  265. fldd d9 , [ BO, #8 ]
  266. fmacd d16 , d0, d8
  267. fldd d2 , [ AO, #16 ]
  268. fmacd d24 , d1, d9
  269. fldd d3 , [ AO, #24 ]
  270. fmacd d17 , d0, d9
  271. fldd d10, [ BO, #16 ]
  272. fmacd d25 , d1, d8
  273. fldd d11, [ BO, #24 ]
  274. fmacd d18 , d2, d8
  275. fmacd d26 , d3, d9
  276. fmacd d19 , d2, d9
  277. fmacd d27 , d3, d8
  278. fmacd d20 , d0, d10
  279. fmacd d28 , d1, d11
  280. fmacd d21 , d0, d11
  281. fmacd d29 , d1, d10
  282. fmacd d22 , d2, d10
  283. add BO , BO, #32
  284. fmacd d30 , d3, d11
  285. fmacd d23 , d2, d11
  286. add AO , AO, #32
  287. fmacd d31 , d3, d10
  288. .endm
  289. .macro SAVE2x2
  290. pld [ CO1 , #C_PRE ]
  291. ldr r3 , LDC
  292. add CO2 , CO1, r3
  293. fldd d0, ALPHA_R
  294. fldd d1, ALPHA_I
  295. fldmiad CO1, { d4 - d7 }
  296. fldmiad CO2, { d8 - d11 }
  297. FADD_R d16, d24 , d16
  298. FADD_I d17, d25 , d17
  299. FADD_R d18, d26 , d18
  300. FADD_I d19, d27 , d19
  301. FADD_R d20, d28 , d20
  302. FADD_I d21, d29 , d21
  303. FADD_R d22, d30 , d22
  304. FADD_I d23, d31 , d23
  305. FMAC_R1 d4 , d0 , d16
  306. FMAC_I1 d5 , d0 , d17
  307. FMAC_R2 d4 , d1 , d17
  308. FMAC_I2 d5 , d1 , d16
  309. FMAC_R1 d6 , d0 , d18
  310. FMAC_I1 d7 , d0 , d19
  311. FMAC_R2 d6 , d1 , d19
  312. FMAC_I2 d7 , d1 , d18
  313. FMAC_R1 d8 , d0 , d20
  314. FMAC_I1 d9 , d0 , d21
  315. FMAC_R2 d8 , d1 , d21
  316. FMAC_I2 d9 , d1 , d20
  317. FMAC_R1 d10, d0 , d22
  318. FMAC_I1 d11, d0 , d23
  319. FMAC_R2 d10, d1 , d23
  320. FMAC_I2 d11, d1 , d22
  321. fstmiad CO1, { d4 - d7 }
  322. fstmiad CO2, { d8 - d11 }
  323. add CO1, CO1, #32
  324. .endm
  325. /******************************************************************************/
  326. .macro INIT1x2
  327. fldd d16, FP_ZERO
  328. vmov.f64 d17, d16
  329. vmov.f64 d20, d16
  330. vmov.f64 d21, d16
  331. vmov.f64 d24, d16
  332. vmov.f64 d25, d16
  333. vmov.f64 d28, d16
  334. vmov.f64 d29, d16
  335. .endm
  336. .macro KERNEL1x2_I
  337. pld [ AO , #A_PRE ]
  338. pld [ BO , #B_PRE ]
  339. fldd d0 , [ AO ]
  340. fldd d1 , [ AO, #8 ]
  341. fldd d8 , [ BO ]
  342. fldd d9 , [ BO, #8 ]
  343. fldd d10, [ BO, #16 ]
  344. fldd d11, [ BO, #24 ]
  345. fmuld d16 , d0, d8
  346. fmuld d24 , d1, d9
  347. fmuld d17 , d0, d9
  348. fmuld d25 , d1, d8
  349. fmuld d20 , d0, d10
  350. fmuld d28 , d1, d11
  351. fmuld d21 , d0, d11
  352. fmuld d29 , d1, d10
  353. add BO , BO, #32
  354. add AO , AO, #16
  355. pld [ BO , #B_PRE ]
  356. fldd d4 , [ AO, #0 ]
  357. fldd d5 , [ AO, #8 ]
  358. fldd d12, [ BO ]
  359. fldd d13, [ BO, #8 ]
  360. fldd d14, [ BO, #16 ]
  361. fldd d15, [ BO, #24 ]
  362. add BO , BO, #32
  363. add AO , AO, #16
  364. .endm
  365. .macro KERNEL1x2_M1
  366. pld [ BO , #B_PRE ]
  367. fmacd d16 , d0, d8
  368. fmacd d24 , d1, d9
  369. fmacd d17 , d0, d9
  370. fmacd d25 , d1, d8
  371. fmacd d20 , d0, d10
  372. fmacd d28 , d1, d11
  373. fmacd d21 , d0, d11
  374. fmacd d29 , d1, d10
  375. fldd d4 , [ AO, #0 ]
  376. fldd d5 , [ AO, #8 ]
  377. fldd d12, [ BO ]
  378. fldd d13, [ BO, #8 ]
  379. fldd d14, [ BO, #16 ]
  380. fldd d15, [ BO, #24 ]
  381. add BO , BO, #32
  382. add AO , AO, #16
  383. .endm
  384. .macro KERNEL1x2_M2
  385. pld [ AO , #A_PRE ]
  386. pld [ BO , #B_PRE ]
  387. fmacd d16 , d4, d12
  388. fmacd d24 , d5, d13
  389. fmacd d17 , d4, d13
  390. fmacd d25 , d5, d12
  391. fmacd d20 , d4, d14
  392. fmacd d28 , d5, d15
  393. fmacd d21 , d4, d15
  394. fmacd d29 , d5, d14
  395. fldd d0 , [ AO, #0 ]
  396. fldd d1 , [ AO, #8 ]
  397. fldd d8 , [ BO ]
  398. fldd d9 , [ BO, #8 ]
  399. fldd d10, [ BO, #16 ]
  400. fldd d11, [ BO, #24 ]
  401. add BO , BO, #32
  402. add AO , AO, #16
  403. .endm
  404. .macro KERNEL1x2_E
  405. fmacd d16 , d4, d12
  406. fmacd d24 , d5, d13
  407. fmacd d17 , d4, d13
  408. fmacd d25 , d5, d12
  409. fmacd d20 , d4, d14
  410. fmacd d28 , d5, d15
  411. fmacd d21 , d4, d15
  412. fmacd d29 , d5, d14
  413. .endm
  414. .macro KERNEL1x2_SUB
  415. pld [ AO , #A_PRE ]
  416. pld [ BO , #B_PRE ]
  417. fldd d0 , [ AO ]
  418. fldd d1 , [ AO, #8 ]
  419. fldd d8 , [ BO ]
  420. fldd d9 , [ BO, #8 ]
  421. fldd d10, [ BO, #16 ]
  422. fldd d11, [ BO, #24 ]
  423. fmacd d16 , d0, d8
  424. fmacd d24 , d1, d9
  425. fmacd d17 , d0, d9
  426. fmacd d25 , d1, d8
  427. fmacd d20 , d0, d10
  428. fmacd d28 , d1, d11
  429. fmacd d21 , d0, d11
  430. fmacd d29 , d1, d10
  431. add BO , BO, #32
  432. add AO , AO, #16
  433. .endm
  434. .macro SAVE1x2
  435. pld [ CO1 , #C_PRE ]
  436. ldr r3 , LDC
  437. add CO2 , CO1, r3
  438. fldd d0, ALPHA_R
  439. fldd d1, ALPHA_I
  440. fldmiad CO1, { d4 - d5 }
  441. fldmiad CO2, { d8 - d9 }
  442. FADD_R d16, d24 , d16
  443. FADD_I d17, d25 , d17
  444. FADD_R d20, d28 , d20
  445. FADD_I d21, d29 , d21
  446. FMAC_R1 d4 , d0 , d16
  447. FMAC_I1 d5 , d0 , d17
  448. FMAC_R2 d4 , d1 , d17
  449. FMAC_I2 d5 , d1 , d16
  450. FMAC_R1 d8 , d0 , d20
  451. FMAC_I1 d9 , d0 , d21
  452. FMAC_R2 d8 , d1 , d21
  453. FMAC_I2 d9 , d1 , d20
  454. fstmiad CO1, { d4 - d5 }
  455. fstmiad CO2, { d8 - d9 }
  456. add CO1, CO1, #16
  457. .endm
  458. /******************************************************************************/
  459. .macro INIT2x1
  460. fldd d16, FP_ZERO
  461. vmov.f64 d17, d16
  462. vmov.f64 d18, d16
  463. vmov.f64 d19, d16
  464. vmov.f64 d24, d16
  465. vmov.f64 d25, d16
  466. vmov.f64 d26, d16
  467. vmov.f64 d27, d16
  468. .endm
  469. .macro KERNEL2x1_I
  470. pld [ AO , #A_PRE ]
  471. pld [ BO , #B_PRE ]
  472. fldd d0 , [ AO ]
  473. fldd d1 , [ AO, #8 ]
  474. fldd d2 , [ AO, #16 ]
  475. fldd d3 , [ AO, #24 ]
  476. fldd d8 , [ BO ]
  477. fldd d9 , [ BO, #8 ]
  478. fmuld d16 , d0, d8
  479. fmuld d24 , d1, d9
  480. fmuld d17 , d0, d9
  481. fmuld d25 , d1, d8
  482. fmuld d18 , d2, d8
  483. fmuld d26 , d3, d9
  484. fmuld d19 , d2, d9
  485. fmuld d27 , d3, d8
  486. add BO , BO, #16
  487. add AO , AO, #32
  488. pld [ BO , #B_PRE ]
  489. pld [ AO , #A_PRE ]
  490. fldd d4 , [ AO, #0 ]
  491. fldd d5 , [ AO, #8 ]
  492. fldd d6 , [ AO, #16 ]
  493. fldd d7 , [ AO, #24 ]
  494. fldd d12, [ BO ]
  495. fldd d13, [ BO, #8 ]
  496. add BO , BO, #16
  497. add AO , AO, #32
  498. .endm
  499. .macro KERNEL2x1_M1
  500. pld [ AO , #A_PRE ]
  501. pld [ BO , #B_PRE ]
  502. fmacd d16 , d0, d8
  503. fmacd d24 , d1, d9
  504. fmacd d17 , d0, d9
  505. fmacd d25 , d1, d8
  506. fmacd d18 , d2, d8
  507. fmacd d26 , d3, d9
  508. fmacd d19 , d2, d9
  509. fmacd d27 , d3, d8
  510. fldd d4 , [ AO, #0 ]
  511. fldd d5 , [ AO, #8 ]
  512. fldd d6 , [ AO, #16 ]
  513. fldd d7 , [ AO, #24 ]
  514. fldd d12, [ BO ]
  515. fldd d13, [ BO, #8 ]
  516. add BO , BO, #16
  517. add AO , AO, #32
  518. .endm
  519. .macro KERNEL2x1_M2
  520. pld [ AO , #A_PRE ]
  521. pld [ BO , #B_PRE ]
  522. fmacd d16 , d4, d12
  523. fmacd d24 , d5, d13
  524. fmacd d17 , d4, d13
  525. fmacd d25 , d5, d12
  526. fmacd d18 , d6, d12
  527. fmacd d26 , d7, d13
  528. fmacd d19 , d6, d13
  529. fmacd d27 , d7, d12
  530. fldd d0 , [ AO, #0 ]
  531. fldd d1 , [ AO, #8 ]
  532. fldd d2 , [ AO, #16 ]
  533. fldd d3 , [ AO, #24 ]
  534. fldd d8 , [ BO ]
  535. fldd d9 , [ BO, #8 ]
  536. add BO , BO, #16
  537. add AO , AO, #32
  538. .endm
  539. .macro KERNEL2x1_E
  540. fmacd d16 , d4, d12
  541. fmacd d24 , d5, d13
  542. fmacd d17 , d4, d13
  543. fmacd d25 , d5, d12
  544. fmacd d18 , d6, d12
  545. fmacd d26 , d7, d13
  546. fmacd d19 , d6, d13
  547. fmacd d27 , d7, d12
  548. .endm
  549. .macro KERNEL2x1_SUB
  550. pld [ AO , #A_PRE ]
  551. pld [ BO , #B_PRE ]
  552. fldd d0 , [ AO ]
  553. fldd d1 , [ AO, #8 ]
  554. fldd d2 , [ AO, #16 ]
  555. fldd d3 , [ AO, #24 ]
  556. fldd d8 , [ BO ]
  557. fldd d9 , [ BO, #8 ]
  558. fmacd d16 , d0, d8
  559. fmacd d24 , d1, d9
  560. fmacd d17 , d0, d9
  561. fmacd d25 , d1, d8
  562. fmacd d18 , d2, d8
  563. fmacd d26 , d3, d9
  564. fmacd d19 , d2, d9
  565. fmacd d27 , d3, d8
  566. add BO , BO, #16
  567. add AO , AO, #32
  568. .endm
  569. .macro SAVE2x1
  570. pld [ CO1 , #C_PRE ]
  571. fldd d0, ALPHA_R
  572. fldd d1, ALPHA_I
  573. fldmiad CO1, { d4 - d7 }
  574. FADD_R d16, d24 , d16
  575. FADD_I d17, d25 , d17
  576. FADD_R d18, d26 , d18
  577. FADD_I d19, d27 , d19
  578. FMAC_R1 d4 , d0 , d16
  579. FMAC_I1 d5 , d0 , d17
  580. FMAC_R2 d4 , d1 , d17
  581. FMAC_I2 d5 , d1 , d16
  582. FMAC_R1 d6 , d0 , d18
  583. FMAC_I1 d7 , d0 , d19
  584. FMAC_R2 d6 , d1 , d19
  585. FMAC_I2 d7 , d1 , d18
  586. fstmiad CO1, { d4 - d7 }
  587. add CO1, CO1, #32
  588. .endm
  589. /******************************************************************************/
  590. .macro INIT1x1
  591. fldd d16, FP_ZERO
  592. vmov.f64 d17, d16
  593. vmov.f64 d24, d16
  594. vmov.f64 d25, d16
  595. .endm
  596. .macro KERNEL1x1_I
  597. pld [ AO , #A_PRE ]
  598. pld [ BO , #B_PRE ]
  599. fldd d0 , [ AO ]
  600. fldd d1 , [ AO, #8 ]
  601. fldd d8 , [ BO ]
  602. fldd d9 , [ BO, #8 ]
  603. fmuld d16 , d0, d8
  604. fmuld d24 , d1, d9
  605. fmuld d17 , d0, d9
  606. fmuld d25 , d1, d8
  607. add BO , BO, #16
  608. add AO , AO, #16
  609. pld [ BO , #B_PRE ]
  610. pld [ AO , #A_PRE ]
  611. fldd d4 , [ AO, #0 ]
  612. fldd d5 , [ AO, #8 ]
  613. fldd d12, [ BO ]
  614. fldd d13, [ BO, #8 ]
  615. add BO , BO, #16
  616. add AO , AO, #16
  617. .endm
  618. .macro KERNEL1x1_M1
  619. fmacd d16 , d0, d8
  620. fmacd d24 , d1, d9
  621. fmacd d17 , d0, d9
  622. fmacd d25 , d1, d8
  623. fldd d4 , [ AO, #0 ]
  624. fldd d5 , [ AO, #8 ]
  625. fldd d12, [ BO ]
  626. fldd d13, [ BO, #8 ]
  627. add BO , BO, #16
  628. add AO , AO, #16
  629. .endm
  630. .macro KERNEL1x1_M2
  631. fmacd d16 , d4, d12
  632. fmacd d24 , d5, d13
  633. fmacd d17 , d4, d13
  634. fmacd d25 , d5, d12
  635. fldd d0 , [ AO, #0 ]
  636. fldd d1 , [ AO, #8 ]
  637. fldd d8 , [ BO ]
  638. fldd d9 , [ BO, #8 ]
  639. add BO , BO, #16
  640. add AO , AO, #16
  641. .endm
  642. .macro KERNEL1x1_E
  643. fmacd d16 , d4, d12
  644. fmacd d24 , d5, d13
  645. fmacd d17 , d4, d13
  646. fmacd d25 , d5, d12
  647. .endm
  648. .macro KERNEL1x1_SUB
  649. fldd d0 , [ AO ]
  650. fldd d1 , [ AO, #8 ]
  651. fldd d8 , [ BO ]
  652. fldd d9 , [ BO, #8 ]
  653. fmacd d16 , d0, d8
  654. fmacd d24 , d1, d9
  655. fmacd d17 , d0, d9
  656. fmacd d25 , d1, d8
  657. add BO , BO, #16
  658. add AO , AO, #16
  659. .endm
  660. .macro SAVE1x1
  661. pld [ CO1 , #C_PRE ]
  662. fldd d0, ALPHA_R
  663. fldd d1, ALPHA_I
  664. fldmiad CO1, { d4 - d5 }
  665. FADD_R d16, d24 , d16
  666. FADD_I d17, d25 , d17
  667. FMAC_R1 d4 , d0 , d16
  668. FMAC_I1 d5 , d0 , d17
  669. FMAC_R2 d4 , d1 , d17
  670. FMAC_I2 d5 , d1 , d16
  671. fstmiad CO1, { d4 - d5 }
  672. add CO1, CO1, #16
  673. .endm
  674. /******************************************************************************/
  675. /**************************************************************************************
  676. * End of macro definitions
  677. **************************************************************************************/
  678. PROLOGUE
  679. .align 5
  680. push {r4 - r9, fp}
  681. add fp, sp, #24
  682. sub sp, sp, #STACKSIZE // reserve stack
  683. str OLD_M, M
  684. str OLD_N, N
  685. str OLD_K, K
  686. str OLD_A, A
  687. vstr OLD_ALPHA_R, ALPHA_R
  688. vstr OLD_ALPHA_I, ALPHA_I
  689. sub r3, fp, #128
  690. vstm r3, { d8 - d15} // store floating point registers
  691. movs r4, #0
  692. str r4, FP_ZERO
  693. str r4, FP_ZERO_1
  694. ldr r3, OLD_LDC
  695. lsl r3, r3, #4 // ldc = ldc * 8 * 2
  696. str r3, LDC
  697. ldr K1, K
  698. ldr BC, B
  699. ldr J, N
  700. asrs J, J, #1 // J = J / 2
  701. ble zgemm_kernel_L1_BEGIN
  702. zgemm_kernel_L2_BEGIN:
  703. ldr CO1, C // CO1 = C
  704. ldr r4 , LDC
  705. lsl r4 , r4 , #1 // LDC * 2
  706. add r3 , r4, CO1
  707. str r3 , C // store C
  708. ldr AO, A // AO = A
  709. pld [AO , #A_PRE-64]
  710. pld [AO , #A_PRE-32]
  711. zgemm_kernel_L2_M2_BEGIN:
  712. ldr I, M
  713. asrs I, I, #1 // I = I / 2
  714. ble zgemm_kernel_L2_M1_BEGIN
  715. zgemm_kernel_L2_M2_20:
  716. mov BO, BC
  717. asrs L , K1, #3 // L = L / 8
  718. cmp L , #3
  719. blt zgemm_kernel_L2_M2_30
  720. .align 5
  721. KERNEL2x2_I
  722. KERNEL2x2_M2
  723. KERNEL2x2_M1
  724. KERNEL2x2_M2
  725. KERNEL2x2_M1
  726. KERNEL2x2_M2
  727. KERNEL2x2_M1
  728. KERNEL2x2_M2
  729. sub L, L, #2
  730. zgemm_kernel_L2_M2_22:
  731. KERNEL2x2_M1
  732. KERNEL2x2_M2
  733. KERNEL2x2_M1
  734. KERNEL2x2_M2
  735. KERNEL2x2_M1
  736. KERNEL2x2_M2
  737. KERNEL2x2_M1
  738. KERNEL2x2_M2
  739. subs L, L, #1
  740. bgt zgemm_kernel_L2_M2_22
  741. KERNEL2x2_M1
  742. KERNEL2x2_M2
  743. KERNEL2x2_M1
  744. KERNEL2x2_M2
  745. KERNEL2x2_M1
  746. KERNEL2x2_M2
  747. KERNEL2x2_M1
  748. KERNEL2x2_E
  749. b zgemm_kernel_L2_M2_44
  750. zgemm_kernel_L2_M2_30:
  751. tst L, #3
  752. ble zgemm_kernel_L2_M2_40
  753. tst L, #2
  754. ble zgemm_kernel_L2_M2_32
  755. KERNEL2x2_I
  756. KERNEL2x2_M2
  757. KERNEL2x2_M1
  758. KERNEL2x2_M2
  759. KERNEL2x2_M1
  760. KERNEL2x2_M2
  761. KERNEL2x2_M1
  762. KERNEL2x2_M2
  763. KERNEL2x2_M1
  764. KERNEL2x2_M2
  765. KERNEL2x2_M1
  766. KERNEL2x2_M2
  767. KERNEL2x2_M1
  768. KERNEL2x2_M2
  769. KERNEL2x2_M1
  770. KERNEL2x2_E
  771. b zgemm_kernel_L2_M2_44
  772. zgemm_kernel_L2_M2_32:
  773. tst L, #1
  774. ble zgemm_kernel_L2_M2_40
  775. KERNEL2x2_I
  776. KERNEL2x2_M2
  777. KERNEL2x2_M1
  778. KERNEL2x2_M2
  779. KERNEL2x2_M1
  780. KERNEL2x2_M2
  781. KERNEL2x2_M1
  782. KERNEL2x2_E
  783. b zgemm_kernel_L2_M2_44
  784. zgemm_kernel_L2_M2_40:
  785. INIT2x2
  786. zgemm_kernel_L2_M2_44:
  787. ands L , K1, #7 // L = L % 8
  788. ble zgemm_kernel_L2_M2_100
  789. zgemm_kernel_L2_M2_46:
  790. KERNEL2x2_SUB
  791. subs L, L, #1
  792. bne zgemm_kernel_L2_M2_46
  793. zgemm_kernel_L2_M2_100:
  794. SAVE2x2
  795. zgemm_kernel_L2_M2_END:
  796. subs I, I, #1
  797. bne zgemm_kernel_L2_M2_20
  798. zgemm_kernel_L2_M1_BEGIN:
  799. ldr I, M
  800. tst I, #1 // I = I % 2
  801. ble zgemm_kernel_L2_END
  802. zgemm_kernel_L2_M1_20:
  803. INIT1x2
  804. mov BO, BC
  805. asrs L , K1, #3 // L = L / 8
  806. ble zgemm_kernel_L2_M1_40
  807. zgemm_kernel_L2_M1_22:
  808. KERNEL1x2_SUB
  809. KERNEL1x2_SUB
  810. KERNEL1x2_SUB
  811. KERNEL1x2_SUB
  812. KERNEL1x2_SUB
  813. KERNEL1x2_SUB
  814. KERNEL1x2_SUB
  815. KERNEL1x2_SUB
  816. subs L, L, #1
  817. bgt zgemm_kernel_L2_M1_22
  818. zgemm_kernel_L2_M1_40:
  819. ands L , K1, #7 // L = L % 8
  820. ble zgemm_kernel_L2_M1_100
  821. zgemm_kernel_L2_M1_42:
  822. KERNEL1x2_SUB
  823. subs L, L, #1
  824. bgt zgemm_kernel_L2_M1_42
  825. zgemm_kernel_L2_M1_100:
  826. SAVE1x2
  827. zgemm_kernel_L2_END:
  828. mov r3, BC
  829. mov r4, K1
  830. lsl r4, r4, #5 // k * 2 * 8 * 2
  831. add r3, r3, r4 // B = B + K * 4 * 8
  832. mov BC, r3
  833. subs J , #1 // j--
  834. bgt zgemm_kernel_L2_BEGIN
  835. /*********************************************************************************************/
  836. zgemm_kernel_L1_BEGIN:
  837. ldr J , N
  838. tst J , #1
  839. ble zgemm_kernel_L999
  840. ldr CO1, C // CO1 = C
  841. ldr r4 , LDC
  842. add r3 , r4, CO1
  843. str r3 , C // store C
  844. ldr AO, A // AO = A
  845. zgemm_kernel_L1_M2_BEGIN:
  846. ldr I, M
  847. asrs I, I, #1 // I = I / 2
  848. ble zgemm_kernel_L1_M1_BEGIN
  849. zgemm_kernel_L1_M2_20:
  850. mov BO, BC
  851. asrs L , K1, #3 // L = L / 8
  852. cmp L , #3
  853. blt zgemm_kernel_L1_M2_30
  854. .align 5
  855. KERNEL2x1_I
  856. KERNEL2x1_M2
  857. KERNEL2x1_M1
  858. KERNEL2x1_M2
  859. KERNEL2x1_M1
  860. KERNEL2x1_M2
  861. KERNEL2x1_M1
  862. KERNEL2x1_M2
  863. sub L, L, #2
  864. zgemm_kernel_L1_M2_22:
  865. KERNEL2x1_M1
  866. KERNEL2x1_M2
  867. KERNEL2x1_M1
  868. KERNEL2x1_M2
  869. KERNEL2x1_M1
  870. KERNEL2x1_M2
  871. KERNEL2x1_M1
  872. KERNEL2x1_M2
  873. subs L, L, #1
  874. bgt zgemm_kernel_L1_M2_22
  875. KERNEL2x1_M1
  876. KERNEL2x1_M2
  877. KERNEL2x1_M1
  878. KERNEL2x1_M2
  879. KERNEL2x1_M1
  880. KERNEL2x1_M2
  881. KERNEL2x1_M1
  882. KERNEL2x1_E
  883. b zgemm_kernel_L1_M2_44
  884. zgemm_kernel_L1_M2_30:
  885. tst L, #3
  886. ble zgemm_kernel_L1_M2_40
  887. tst L, #2
  888. ble zgemm_kernel_L1_M2_32
  889. KERNEL2x1_I
  890. KERNEL2x1_M2
  891. KERNEL2x1_M1
  892. KERNEL2x1_M2
  893. KERNEL2x1_M1
  894. KERNEL2x1_M2
  895. KERNEL2x1_M1
  896. KERNEL2x1_M2
  897. KERNEL2x1_M1
  898. KERNEL2x1_M2
  899. KERNEL2x1_M1
  900. KERNEL2x1_M2
  901. KERNEL2x1_M1
  902. KERNEL2x1_M2
  903. KERNEL2x1_M1
  904. KERNEL2x1_E
  905. b zgemm_kernel_L1_M2_44
  906. zgemm_kernel_L1_M2_32:
  907. tst L, #1
  908. ble zgemm_kernel_L1_M2_40
  909. KERNEL2x1_I
  910. KERNEL2x1_M2
  911. KERNEL2x1_M1
  912. KERNEL2x1_M2
  913. KERNEL2x1_M1
  914. KERNEL2x1_M2
  915. KERNEL2x1_M1
  916. KERNEL2x1_E
  917. b zgemm_kernel_L1_M2_44
  918. zgemm_kernel_L1_M2_40:
  919. INIT2x1
  920. zgemm_kernel_L1_M2_44:
  921. ands L , K1, #7 // L = L % 8
  922. ble zgemm_kernel_L1_M2_100
  923. zgemm_kernel_L1_M2_46:
  924. KERNEL2x1_SUB
  925. subs L, L, #1
  926. bne zgemm_kernel_L1_M2_46
  927. zgemm_kernel_L1_M2_100:
  928. SAVE2x1
  929. zgemm_kernel_L1_M2_END:
  930. subs I, I, #1
  931. bne zgemm_kernel_L1_M2_20
  932. zgemm_kernel_L1_M1_BEGIN:
  933. ldr I, M
  934. tst I, #1 // I = I % 2
  935. ble zgemm_kernel_L1_END
  936. zgemm_kernel_L1_M1_20:
  937. INIT1x1
  938. mov BO, BC
  939. asrs L , K1, #3 // L = L / 8
  940. ble zgemm_kernel_L1_M1_40
  941. zgemm_kernel_L1_M1_22:
  942. KERNEL1x1_SUB
  943. KERNEL1x1_SUB
  944. KERNEL1x1_SUB
  945. KERNEL1x1_SUB
  946. KERNEL1x1_SUB
  947. KERNEL1x1_SUB
  948. KERNEL1x1_SUB
  949. KERNEL1x1_SUB
  950. subs L, L, #1
  951. bgt zgemm_kernel_L1_M1_22
  952. zgemm_kernel_L1_M1_40:
  953. ands L , K1, #7 // L = L % 8
  954. ble zgemm_kernel_L1_M1_100
  955. zgemm_kernel_L1_M1_42:
  956. KERNEL1x1_SUB
  957. subs L, L, #1
  958. bgt zgemm_kernel_L1_M1_42
  959. zgemm_kernel_L1_M1_100:
  960. SAVE1x1
  961. zgemm_kernel_L1_END:
  962. zgemm_kernel_L999:
  963. sub r3, fp, #128
  964. vldm r3, { d8 - d15} // restore floating point registers
  965. movs r0, #0 // set return value
  966. sub sp, fp, #24
  967. pop {r4 - r9, fp}
  968. bx lr
  969. EPILOGUE