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

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