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_vfp.S 20 kB

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