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 23 kB

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