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.

ctrmm_kernel_2x2_vfpv3.S 25 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478
  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/10/16 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 s0
  42. #define OLD_ALPHA_I s1
  43. /******************************************************
  44. * [fp, #-128] - [fp, #-64] is reserved
  45. * for store and restore of floating point
  46. * registers
  47. *******************************************************/
  48. #define KKK [fp, #-240]
  49. #define KK [fp, #-244 ]
  50. #define A [fp, #-248 ]
  51. #define LDC [fp, #-252 ]
  52. #define M [fp, #-256 ]
  53. #define N [fp, #-260 ]
  54. #define K [fp, #-264 ]
  55. #define ALPHA_I [fp, #-272]
  56. #define ALPHA_R [fp, #-280]
  57. #define B [fp, #4 ]
  58. #define C [fp, #8 ]
  59. #define OLD_LDC [fp, #12 ]
  60. #define OFFSET [fp, #16 ]
  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 FADD_R fsubs
  75. #define FADD_I fadds
  76. #define FMAC_R1 fnmuls
  77. #define FMAC_R2 fnmacs
  78. #define FMAC_I1 fmuls
  79. #define FMAC_I2 fnmacs
  80. #elif defined(CN) || defined(CT)
  81. #define FADD_R fadds
  82. #define FADD_I fsubs
  83. #define FMAC_R1 fmuls
  84. #define FMAC_R2 fmacs
  85. #define FMAC_I1 fnmuls
  86. #define FMAC_I2 fmacs
  87. #elif defined(NC) || defined(TC)
  88. #define FADD_R fadds
  89. #define FADD_I fsubs
  90. #define FMAC_R1 fmuls
  91. #define FMAC_R2 fnmacs
  92. #define FMAC_I1 fmuls
  93. #define FMAC_I2 fmacs
  94. #else
  95. #define FADD_R fsubs
  96. #define FADD_I fadds
  97. #define FMAC_R1 fnmuls
  98. #define FMAC_R2 fmacs
  99. #define FMAC_I1 fnmuls
  100. #define FMAC_I2 fnmacs
  101. #endif
  102. /**************************************************************************************
  103. * Macro definitions
  104. **************************************************************************************/
  105. .macro INIT2x2
  106. vmov.f32 s17, s16
  107. vmov.f32 s18, s16
  108. vmov.f32 s19, s16
  109. vmov.f32 s20, s16
  110. vmov.f32 s21, s16
  111. vmov.f32 s22, s16
  112. vmov.f32 s23, s16
  113. vmov.f32 s24, s16
  114. vmov.f32 s25, s16
  115. vmov.f32 s26, s16
  116. vmov.f32 s27, s16
  117. vmov.f32 s28, s16
  118. vmov.f32 s29, s16
  119. vmov.f32 s30, s16
  120. vmov.f32 s31, s16
  121. .endm
  122. .macro KERNEL2x2_I
  123. pld [ AO , #A_PRE ]
  124. pld [ BO , #B_PRE ]
  125. fldmias AO!, { s0 - s1 }
  126. fldmias BO!, { s8 - s9 }
  127. fmuls s16 , s0, s8
  128. fmuls s24 , s1, s9
  129. fldmias AO!, { s2 - s3 }
  130. fmuls s17 , s0, s9
  131. fmuls s25 , s1, s8
  132. fldmias BO!, { s10 - s11 }
  133. fmuls s18 , s2, s8
  134. fmuls s26 , s3, s9
  135. fldmias AO!, { s4 - s5 }
  136. fmuls s19 , s2, s9
  137. fmuls s27 , s3, s8
  138. fldmias BO!, { s12 - s13 }
  139. fmuls s20 , s0, s10
  140. fmuls s28 , s1, s11
  141. fldmias AO!, { s6 - s7 }
  142. fmuls s21 , s0, s11
  143. fmuls s29 , s1, s10
  144. fldmias BO!, { s14 - s15 }
  145. fmuls s22 , s2, s10
  146. fmuls s30 , s3, s11
  147. fmuls s23 , s2, s11
  148. fmuls s31 , s3, s10
  149. .endm
  150. .macro KERNEL2x2_M1
  151. fmacs s16 , s0, s8
  152. fldmias AO!, { s4 - s5 }
  153. fmacs s24 , s1, s9
  154. fmacs s17 , s0, s9
  155. fldmias BO!, { s12 - s13 }
  156. fmacs s25 , s1, s8
  157. fmacs s18 , s2, s8
  158. fldmias AO!, { s6 - s7 }
  159. fmacs s26 , s3, s9
  160. fmacs s19 , s2, s9
  161. fldmias BO!, { s14 - s15 }
  162. fmacs s27 , s3, s8
  163. fmacs s20 , s0, s10
  164. fmacs s28 , s1, s11
  165. fmacs s21 , s0, s11
  166. fmacs s29 , s1, s10
  167. fmacs s22 , s2, s10
  168. fmacs s30 , s3, s11
  169. fmacs s23 , s2, s11
  170. fmacs s31 , s3, s10
  171. .endm
  172. .macro KERNEL2x2_M2
  173. pld [ AO , #A_PRE ]
  174. fmacs s16 , s4, s12
  175. pld [ BO , #B_PRE ]
  176. fmacs s24 , s5, s13
  177. fmacs s17 , s4, s13
  178. fldmias AO!, { s0 - s1 }
  179. fmacs s25 , s5, s12
  180. fmacs s18 , s6, s12
  181. fmacs s26 , s7, s13
  182. fldmias BO!, { s8 - s9 }
  183. fmacs s19 , s6, s13
  184. fmacs s27 , s7, s12
  185. fldmias AO!, { s2 - s3 }
  186. fmacs s20 , s4, s14
  187. fmacs s28 , s5, s15
  188. fldmias BO!, { s10 - s11 }
  189. fmacs s21 , s4, s15
  190. fmacs s29 , s5, s14
  191. fmacs s22 , s6, s14
  192. fmacs s30 , s7, s15
  193. fmacs s23 , s6, s15
  194. fmacs s31 , s7, s14
  195. .endm
  196. .macro KERNEL2x2_E
  197. fmacs s16 , s4, s12
  198. fmacs s24 , s5, s13
  199. fmacs s17 , s4, s13
  200. fmacs s25 , s5, s12
  201. fmacs s18 , s6, s12
  202. fmacs s26 , s7, s13
  203. fmacs s19 , s6, s13
  204. fmacs s27 , s7, s12
  205. fmacs s20 , s4, s14
  206. fmacs s28 , s5, s15
  207. fmacs s21 , s4, s15
  208. fmacs s29 , s5, s14
  209. fmacs s22 , s6, s14
  210. fmacs s30 , s7, s15
  211. fmacs s23 , s6, s15
  212. fmacs s31 , s7, s14
  213. .endm
  214. .macro KERNEL2x2_SUB
  215. fldmias AO!, { s0 - s1 }
  216. fldmias BO!, { s8 - s9 }
  217. fmacs s16 , s0, s8
  218. fmacs s24 , s1, s9
  219. fldmias AO!, { s2 - s3 }
  220. fmacs s17 , s0, s9
  221. fmacs s25 , s1, s8
  222. fldmias BO!, { s10 - s11 }
  223. fmacs s18 , s2, s8
  224. fmacs s26 , s3, s9
  225. fmacs s19 , s2, s9
  226. fmacs s27 , s3, s8
  227. fmacs s20 , s0, s10
  228. fmacs s28 , s1, s11
  229. fmacs s21 , s0, s11
  230. fmacs s29 , s1, s10
  231. fmacs s22 , s2, s10
  232. fmacs s30 , s3, s11
  233. fmacs s23 , s2, s11
  234. fmacs s31 , s3, s10
  235. .endm
  236. .macro SAVE2x2
  237. ldr r3 , LDC
  238. add CO2 , CO1, r3
  239. flds s0, ALPHA_R
  240. flds s1, ALPHA_I
  241. FADD_R s16, s24 , s16
  242. FADD_I s17, s25 , s17
  243. FADD_R s18, s26 , s18
  244. FADD_I s19, s27 , s19
  245. FADD_R s20, s28 , s20
  246. FADD_I s21, s29 , s21
  247. FADD_R s22, s30 , s22
  248. FADD_I s23, s31 , s23
  249. FMAC_R1 s4 , s0 , s16
  250. FMAC_I1 s5 , s0 , s17
  251. FMAC_R2 s4 , s1 , s17
  252. FMAC_I2 s5 , s1 , s16
  253. FMAC_R1 s6 , s0 , s18
  254. FMAC_I1 s7 , s0 , s19
  255. FMAC_R2 s6 , s1 , s19
  256. FMAC_I2 s7 , s1 , s18
  257. FMAC_R1 s8 , s0 , s20
  258. FMAC_I1 s9 , s0 , s21
  259. FMAC_R2 s8 , s1 , s21
  260. FMAC_I2 s9 , s1 , s20
  261. FMAC_R1 s10, s0 , s22
  262. FMAC_I1 s11, s0 , s23
  263. FMAC_R2 s10, s1 , s23
  264. FMAC_I2 s11, s1 , s22
  265. fstmias CO1, { s4 - s7 }
  266. fstmias CO2, { s8 - s11 }
  267. add CO1, CO1, #16
  268. .endm
  269. /******************************************************************************/
  270. .macro INIT1x2
  271. vmov.f32 s17, s16
  272. vmov.f32 s20, s16
  273. vmov.f32 s21, s16
  274. vmov.f32 s24, s16
  275. vmov.f32 s25, s16
  276. vmov.f32 s28, s16
  277. vmov.f32 s29, s16
  278. .endm
  279. .macro KERNEL1x2_I
  280. pld [ AO , #A_PRE ]
  281. pld [ BO , #B_PRE ]
  282. flds s0 , [ AO ]
  283. flds s1 , [ AO, #4 ]
  284. flds s8 , [ BO ]
  285. flds s9 , [ BO, #4 ]
  286. flds s10, [ BO, #8 ]
  287. flds s11, [ BO, #12 ]
  288. fmuls s16 , s0, s8
  289. fmuls s24 , s1, s9
  290. fmuls s17 , s0, s9
  291. fmuls s25 , s1, s8
  292. fmuls s20 , s0, s10
  293. fmuls s28 , s1, s11
  294. fmuls s21 , s0, s11
  295. fmuls s29 , s1, s10
  296. add BO , BO, #16
  297. add AO , AO, #8
  298. pld [ BO , #B_PRE ]
  299. flds s4 , [ AO, #0 ]
  300. flds s5 , [ AO, #4 ]
  301. flds s12, [ BO ]
  302. flds s13, [ BO, #4 ]
  303. flds s14, [ BO, #8 ]
  304. flds s15, [ BO, #12 ]
  305. add BO , BO, #16
  306. add AO , AO, #8
  307. .endm
  308. .macro KERNEL1x2_M1
  309. pld [ BO , #B_PRE ]
  310. fmacs s16 , s0, s8
  311. fmacs s24 , s1, s9
  312. fmacs s17 , s0, s9
  313. fmacs s25 , s1, s8
  314. fmacs s20 , s0, s10
  315. fmacs s28 , s1, s11
  316. fmacs s21 , s0, s11
  317. fmacs s29 , s1, s10
  318. flds s4 , [ AO, #0 ]
  319. flds s5 , [ AO, #4 ]
  320. flds s12, [ BO ]
  321. flds s13, [ BO, #4 ]
  322. flds s14, [ BO, #8 ]
  323. flds s15, [ BO, #12 ]
  324. add BO , BO, #16
  325. add AO , AO, #8
  326. .endm
  327. .macro KERNEL1x2_M2
  328. pld [ AO , #A_PRE ]
  329. pld [ BO , #B_PRE ]
  330. fmacs s16 , s4, s12
  331. fmacs s24 , s5, s13
  332. fmacs s17 , s4, s13
  333. fmacs s25 , s5, s12
  334. fmacs s20 , s4, s14
  335. fmacs s28 , s5, s15
  336. fmacs s21 , s4, s15
  337. fmacs s29 , s5, s14
  338. flds s0 , [ AO, #0 ]
  339. flds s1 , [ AO, #4 ]
  340. flds s8 , [ BO ]
  341. flds s9 , [ BO, #4 ]
  342. flds s10, [ BO, #8 ]
  343. flds s11, [ BO, #12 ]
  344. add BO , BO, #16
  345. add AO , AO, #8
  346. .endm
  347. .macro KERNEL1x2_E
  348. fmacs s16 , s4, s12
  349. fmacs s24 , s5, s13
  350. fmacs s17 , s4, s13
  351. fmacs s25 , s5, s12
  352. fmacs s20 , s4, s14
  353. fmacs s28 , s5, s15
  354. fmacs s21 , s4, s15
  355. fmacs s29 , s5, s14
  356. .endm
  357. .macro KERNEL1x2_SUB
  358. pld [ AO , #A_PRE ]
  359. pld [ BO , #B_PRE ]
  360. flds s0 , [ AO ]
  361. flds s1 , [ AO, #4 ]
  362. flds s8 , [ BO ]
  363. flds s9 , [ BO, #4 ]
  364. flds s10, [ BO, #8 ]
  365. flds s11, [ BO, #12 ]
  366. fmacs s16 , s0, s8
  367. fmacs s24 , s1, s9
  368. fmacs s17 , s0, s9
  369. fmacs s25 , s1, s8
  370. fmacs s20 , s0, s10
  371. fmacs s28 , s1, s11
  372. fmacs s21 , s0, s11
  373. fmacs s29 , s1, s10
  374. add BO , BO, #16
  375. add AO , AO, #8
  376. .endm
  377. .macro SAVE1x2
  378. ldr r3 , LDC
  379. add CO2 , CO1, r3
  380. flds s0, ALPHA_R
  381. flds s1, ALPHA_I
  382. FADD_R s16, s24 , s16
  383. FADD_I s17, s25 , s17
  384. FADD_R s20, s28 , s20
  385. FADD_I s21, s29 , s21
  386. FMAC_R1 s4 , s0 , s16
  387. FMAC_I1 s5 , s0 , s17
  388. FMAC_R2 s4 , s1 , s17
  389. FMAC_I2 s5 , s1 , s16
  390. FMAC_R1 s8 , s0 , s20
  391. FMAC_I1 s9 , s0 , s21
  392. FMAC_R2 s8 , s1 , s21
  393. FMAC_I2 s9 , s1 , s20
  394. fstmias CO1, { s4 - s5 }
  395. fstmias CO2, { s8 - s9 }
  396. add CO1, CO1, #8
  397. .endm
  398. /******************************************************************************/
  399. .macro INIT2x1
  400. vmov.f32 s17, s16
  401. vmov.f32 s18, s16
  402. vmov.f32 s19, s16
  403. vmov.f32 s24, s16
  404. vmov.f32 s25, s16
  405. vmov.f32 s26, s16
  406. vmov.f32 s27, s16
  407. .endm
  408. .macro KERNEL2x1_I
  409. pld [ AO , #A_PRE ]
  410. pld [ BO , #B_PRE ]
  411. flds s0 , [ AO ]
  412. flds s1 , [ AO, #4 ]
  413. flds s2 , [ AO, #8 ]
  414. flds s3 , [ AO, #12 ]
  415. flds s8 , [ BO ]
  416. flds s9 , [ BO, #4 ]
  417. fmuls s16 , s0, s8
  418. fmuls s24 , s1, s9
  419. fmuls s17 , s0, s9
  420. fmuls s25 , s1, s8
  421. fmuls s18 , s2, s8
  422. fmuls s26 , s3, s9
  423. fmuls s19 , s2, s9
  424. fmuls s27 , s3, s8
  425. add BO , BO, #8
  426. add AO , AO, #16
  427. pld [ BO , #B_PRE ]
  428. pld [ AO , #A_PRE ]
  429. flds s4 , [ AO, #0 ]
  430. flds s5 , [ AO, #4 ]
  431. flds s6 , [ AO, #8 ]
  432. flds s7 , [ AO, #12 ]
  433. flds s12, [ BO ]
  434. flds s13, [ BO, #4 ]
  435. add BO , BO, #8
  436. add AO , AO, #16
  437. .endm
  438. .macro KERNEL2x1_M1
  439. pld [ AO , #A_PRE ]
  440. pld [ BO , #B_PRE ]
  441. fmacs s16 , s0, s8
  442. fmacs s24 , s1, s9
  443. fmacs s17 , s0, s9
  444. fmacs s25 , s1, s8
  445. fmacs s18 , s2, s8
  446. fmacs s26 , s3, s9
  447. fmacs s19 , s2, s9
  448. fmacs s27 , s3, s8
  449. flds s4 , [ AO, #0 ]
  450. flds s5 , [ AO, #4 ]
  451. flds s6 , [ AO, #8 ]
  452. flds s7 , [ AO, #12 ]
  453. flds s12, [ BO ]
  454. flds s13, [ BO, #4 ]
  455. add BO , BO, #8
  456. add AO , AO, #16
  457. .endm
  458. .macro KERNEL2x1_M2
  459. pld [ AO , #A_PRE ]
  460. pld [ BO , #B_PRE ]
  461. fmacs s16 , s4, s12
  462. fmacs s24 , s5, s13
  463. fmacs s17 , s4, s13
  464. fmacs s25 , s5, s12
  465. fmacs s18 , s6, s12
  466. fmacs s26 , s7, s13
  467. fmacs s19 , s6, s13
  468. fmacs s27 , s7, s12
  469. flds s0 , [ AO, #0 ]
  470. flds s1 , [ AO, #4 ]
  471. flds s2 , [ AO, #8 ]
  472. flds s3 , [ AO, #12 ]
  473. flds s8 , [ BO ]
  474. flds s9 , [ BO, #4 ]
  475. add BO , BO, #8
  476. add AO , AO, #16
  477. .endm
  478. .macro KERNEL2x1_E
  479. fmacs s16 , s4, s12
  480. fmacs s24 , s5, s13
  481. fmacs s17 , s4, s13
  482. fmacs s25 , s5, s12
  483. fmacs s18 , s6, s12
  484. fmacs s26 , s7, s13
  485. fmacs s19 , s6, s13
  486. fmacs s27 , s7, s12
  487. .endm
  488. .macro KERNEL2x1_SUB
  489. pld [ AO , #A_PRE ]
  490. pld [ BO , #B_PRE ]
  491. flds s0 , [ AO ]
  492. flds s1 , [ AO, #4 ]
  493. flds s2 , [ AO, #8 ]
  494. flds s3 , [ AO, #12 ]
  495. flds s8 , [ BO ]
  496. flds s9 , [ BO, #4 ]
  497. fmacs s16 , s0, s8
  498. fmacs s24 , s1, s9
  499. fmacs s17 , s0, s9
  500. fmacs s25 , s1, s8
  501. fmacs s18 , s2, s8
  502. fmacs s26 , s3, s9
  503. fmacs s19 , s2, s9
  504. fmacs s27 , s3, s8
  505. add BO , BO, #8
  506. add AO , AO, #16
  507. .endm
  508. .macro SAVE2x1
  509. flds s0, ALPHA_R
  510. flds s1, ALPHA_I
  511. FADD_R s16, s24 , s16
  512. FADD_I s17, s25 , s17
  513. FADD_R s18, s26 , s18
  514. FADD_I s19, s27 , s19
  515. FMAC_R1 s4 , s0 , s16
  516. FMAC_I1 s5 , s0 , s17
  517. FMAC_R2 s4 , s1 , s17
  518. FMAC_I2 s5 , s1 , s16
  519. FMAC_R1 s6 , s0 , s18
  520. FMAC_I1 s7 , s0 , s19
  521. FMAC_R2 s6 , s1 , s19
  522. FMAC_I2 s7 , s1 , s18
  523. fstmias CO1, { s4 - s7 }
  524. add CO1, CO1, #16
  525. .endm
  526. /******************************************************************************/
  527. .macro INIT1x1
  528. vmov.f32 s17, s16
  529. vmov.f32 s24, s16
  530. vmov.f32 s25, s16
  531. .endm
  532. .macro KERNEL1x1_I
  533. pld [ AO , #A_PRE ]
  534. pld [ BO , #B_PRE ]
  535. flds s0 , [ AO ]
  536. flds s1 , [ AO, #4 ]
  537. flds s8 , [ BO ]
  538. flds s9 , [ BO, #4 ]
  539. fmuls s16 , s0, s8
  540. fmuls s24 , s1, s9
  541. fmuls s17 , s0, s9
  542. fmuls s25 , s1, s8
  543. add BO , BO, #8
  544. add AO , AO, #8
  545. pld [ BO , #B_PRE ]
  546. pld [ AO , #A_PRE ]
  547. flds s4 , [ AO, #0 ]
  548. flds s5 , [ AO, #4 ]
  549. flds s12, [ BO ]
  550. flds s13, [ BO, #4 ]
  551. add BO , BO, #8
  552. add AO , AO, #8
  553. .endm
  554. .macro KERNEL1x1_M1
  555. fmacs s16 , s0, s8
  556. fmacs s24 , s1, s9
  557. fmacs s17 , s0, s9
  558. fmacs s25 , s1, s8
  559. flds s4 , [ AO, #0 ]
  560. flds s5 , [ AO, #4 ]
  561. flds s12, [ BO ]
  562. flds s13, [ BO, #4 ]
  563. add BO , BO, #8
  564. add AO , AO, #8
  565. .endm
  566. .macro KERNEL1x1_M2
  567. fmacs s16 , s4, s12
  568. fmacs s24 , s5, s13
  569. fmacs s17 , s4, s13
  570. fmacs s25 , s5, s12
  571. flds s0 , [ AO, #0 ]
  572. flds s1 , [ AO, #4 ]
  573. flds s8 , [ BO ]
  574. flds s9 , [ BO, #4 ]
  575. add BO , BO, #8
  576. add AO , AO, #8
  577. .endm
  578. .macro KERNEL1x1_E
  579. fmacs s16 , s4, s12
  580. fmacs s24 , s5, s13
  581. fmacs s17 , s4, s13
  582. fmacs s25 , s5, s12
  583. .endm
  584. .macro KERNEL1x1_SUB
  585. flds s0 , [ AO ]
  586. flds s1 , [ AO, #4 ]
  587. flds s8 , [ BO ]
  588. flds s9 , [ BO, #4 ]
  589. fmacs s16 , s0, s8
  590. fmacs s24 , s1, s9
  591. fmacs s17 , s0, s9
  592. fmacs s25 , s1, s8
  593. add BO , BO, #8
  594. add AO , AO, #8
  595. .endm
  596. .macro SAVE1x1
  597. flds s0, ALPHA_R
  598. flds s1, ALPHA_I
  599. FADD_R s16, s24 , s16
  600. FADD_I s17, s25 , s17
  601. FMAC_R1 s4 , s0 , s16
  602. FMAC_I1 s5 , s0 , s17
  603. FMAC_R2 s4 , s1 , s17
  604. FMAC_I2 s5 , s1 , s16
  605. fstmias CO1, { s4 - s5 }
  606. add CO1, CO1, #8
  607. .endm
  608. /******************************************************************************/
  609. /**************************************************************************************
  610. * End of macro definitions
  611. **************************************************************************************/
  612. PROLOGUE
  613. .align 5
  614. push {r4 - r9, fp}
  615. add fp, sp, #24
  616. sub sp, sp, #STACKSIZE // reserve stack
  617. str OLD_M, M
  618. str OLD_N, N
  619. str OLD_K, K
  620. str OLD_A, A
  621. vstr OLD_ALPHA_R, ALPHA_R
  622. vstr OLD_ALPHA_I, ALPHA_I
  623. sub r3, fp, #128
  624. vstm r3, { s8 - s31} // store floating point registers
  625. ldr r3, OLD_LDC
  626. lsl r3, r3, #3 // ldc = ldc * 4 * 2
  627. str r3, LDC
  628. ldr r3, OFFSET
  629. #ifndef LEFT
  630. neg r3 , r3
  631. #endif
  632. str r3 , KK
  633. ldr BC, B
  634. ldr J, N
  635. asrs J, J, #1 // J = J / 2
  636. ble _L1_BEGIN
  637. _L2_BEGIN:
  638. ldr CO1, C // CO1 = C
  639. ldr r4 , LDC
  640. lsl r4 , r4 , #1 // LDC * 2
  641. add r3 , r4, CO1
  642. str r3 , C // store C
  643. #if defined(LEFT)
  644. ldr r3 , OFFSET
  645. str r3 , KK
  646. #endif
  647. ldr AO, A // AO = A
  648. pld [AO , #A_PRE-64]
  649. pld [AO , #A_PRE-32]
  650. _L2_M2_BEGIN:
  651. ldr I, M
  652. asrs I, I, #1 // I = I / 2
  653. ble _L2_M1_BEGIN
  654. _L2_M2_20:
  655. #if (defined(LEFT) && defined(TRANSA)) || \
  656. (!defined(LEFT) && !defined(TRANSA))
  657. mov BO, BC
  658. #else
  659. mov BO, BC
  660. ldr r3 , KK
  661. lsls r4 , r3 , #4 // 2 * 4 * 2 float values
  662. add BO , BO , r4
  663. lsls r4 , r3 , #4 // 2 * 4 * 2 float values
  664. add AO , AO , r4
  665. #endif
  666. #ifndef TRMMKERNEL
  667. ldr K1, K
  668. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  669. ldr K1, K
  670. ldr r3, KK
  671. sub K1, K1, r3
  672. str K1, KKK
  673. #else
  674. ldr K1, KK
  675. #ifdef LEFT
  676. add K1, K1, #2 // number of values in AO
  677. #else
  678. add K1, K1, #2 // number of values in BO
  679. #endif
  680. str K1, KKK
  681. #endif
  682. asrs L , K1, #3 // L = L / 8
  683. cmp L , #3
  684. blt _L2_M2_30
  685. .align 5
  686. KERNEL2x2_I
  687. KERNEL2x2_M2
  688. KERNEL2x2_M1
  689. KERNEL2x2_M2
  690. KERNEL2x2_M1
  691. KERNEL2x2_M2
  692. KERNEL2x2_M1
  693. KERNEL2x2_M2
  694. sub L, L, #2
  695. _L2_M2_22:
  696. KERNEL2x2_M1
  697. KERNEL2x2_M2
  698. KERNEL2x2_M1
  699. KERNEL2x2_M2
  700. KERNEL2x2_M1
  701. KERNEL2x2_M2
  702. KERNEL2x2_M1
  703. KERNEL2x2_M2
  704. subs L, L, #1
  705. bgt _L2_M2_22
  706. KERNEL2x2_M1
  707. KERNEL2x2_M2
  708. KERNEL2x2_M1
  709. KERNEL2x2_M2
  710. KERNEL2x2_M1
  711. KERNEL2x2_M2
  712. KERNEL2x2_M1
  713. KERNEL2x2_E
  714. b _L2_M2_44
  715. _L2_M2_30:
  716. tst L, #3
  717. ble _L2_M2_40
  718. tst L, #2
  719. ble _L2_M2_32
  720. KERNEL2x2_I
  721. KERNEL2x2_M2
  722. KERNEL2x2_M1
  723. KERNEL2x2_M2
  724. KERNEL2x2_M1
  725. KERNEL2x2_M2
  726. KERNEL2x2_M1
  727. KERNEL2x2_M2
  728. KERNEL2x2_M1
  729. KERNEL2x2_M2
  730. KERNEL2x2_M1
  731. KERNEL2x2_M2
  732. KERNEL2x2_M1
  733. KERNEL2x2_M2
  734. KERNEL2x2_M1
  735. KERNEL2x2_E
  736. b _L2_M2_44
  737. _L2_M2_32:
  738. tst L, #1
  739. ble _L2_M2_40
  740. KERNEL2x2_I
  741. KERNEL2x2_M2
  742. KERNEL2x2_M1
  743. KERNEL2x2_M2
  744. KERNEL2x2_M1
  745. KERNEL2x2_M2
  746. KERNEL2x2_M1
  747. KERNEL2x2_E
  748. b _L2_M2_44
  749. ctrmm_f32zero:
  750. .word 0x00000000
  751. _L2_M2_40:
  752. vldr.f32 s16 , ctrmm_f32zero
  753. INIT2x2
  754. _L2_M2_44:
  755. ands L , K1, #7 // L = L % 8
  756. ble _L2_M2_100
  757. _L2_M2_46:
  758. KERNEL2x2_SUB
  759. subs L, L, #1
  760. bne _L2_M2_46
  761. _L2_M2_100:
  762. SAVE2x2
  763. #if (defined(LEFT) && defined(TRANSA)) || \
  764. (!defined(LEFT) && !defined(TRANSA))
  765. ldr r3 , K
  766. ldr r4 , KKK
  767. sub r3 , r3 , r4
  768. lsls r4 , r3 , #4 // 2 * 4 * 2 float values
  769. add BO , BO , r4
  770. lsls r4 , r3 , #4 // 2 * 4 * 2 float values
  771. add AO , AO , r4
  772. #endif
  773. #if defined(LEFT)
  774. ldr r3 , KK
  775. add r3 , r3 , #2 // number of values in AO
  776. str r3 , KK
  777. #endif
  778. _L2_M2_END:
  779. subs I, I, #1
  780. bne _L2_M2_20
  781. _L2_M1_BEGIN:
  782. ldr I, M
  783. tst I, #1 // I = I % 2
  784. ble _L2_END
  785. _L2_M1_20:
  786. vldr.f32 s16 , ctrmm_f32zero
  787. INIT1x2
  788. #if (defined(LEFT) && defined(TRANSA)) || \
  789. (!defined(LEFT) && !defined(TRANSA))
  790. mov BO, BC
  791. #else
  792. mov BO, BC
  793. ldr r3 , KK
  794. lsls r4 , r3 , #4 // 2 * 4 * 2 float values
  795. add BO , BO , r4
  796. lsls r4 , r3 , #3 // 1 * 4 * 2 float values
  797. add AO , AO , r4
  798. #endif
  799. #ifndef TRMMKERNEL
  800. ldr K1, K
  801. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  802. ldr K1, K
  803. ldr r3, KK
  804. sub K1, K1, r3
  805. str K1, KKK
  806. #else
  807. ldr K1, KK
  808. #ifdef LEFT
  809. add K1, K1, #1 // number of values in AO
  810. #else
  811. add K1, K1, #2 // number of values in BO
  812. #endif
  813. str K1, KKK
  814. #endif
  815. asrs L , K1, #3 // L = L / 8
  816. ble _L2_M1_40
  817. _L2_M1_22:
  818. KERNEL1x2_SUB
  819. KERNEL1x2_SUB
  820. KERNEL1x2_SUB
  821. KERNEL1x2_SUB
  822. KERNEL1x2_SUB
  823. KERNEL1x2_SUB
  824. KERNEL1x2_SUB
  825. KERNEL1x2_SUB
  826. subs L, L, #1
  827. bgt _L2_M1_22
  828. _L2_M1_40:
  829. ands L , K1, #7 // L = L % 8
  830. ble _L2_M1_100
  831. _L2_M1_42:
  832. KERNEL1x2_SUB
  833. subs L, L, #1
  834. bgt _L2_M1_42
  835. _L2_M1_100:
  836. SAVE1x2
  837. #if (defined(LEFT) && defined(TRANSA)) || \
  838. (!defined(LEFT) && !defined(TRANSA))
  839. ldr r3 , K
  840. ldr r4 , KKK
  841. sub r3 , r3 , r4
  842. lsls r4 , r3 , #4 // 2 * 4 * 2 float values
  843. add BO , BO , r4
  844. lsls r4 , r3 , #3 // 1 * 4 * 2 float values
  845. add AO , AO , r4
  846. #endif
  847. #if defined(LEFT)
  848. ldr r3 , KK
  849. add r3 , r3 , #1 // number of values in AO
  850. str r3 , KK
  851. #endif
  852. _L2_END:
  853. mov r3, BC
  854. ldr r4, K
  855. lsl r4, r4, #4 // k * 2 * 4 * 2
  856. add r3, r3, r4 // B = B + K * 2 * 8
  857. mov BC, r3
  858. #if !defined(LEFT)
  859. ldr r3 , KK
  860. add r3 , r3 , #2 // number of values in BO
  861. str r3 , KK
  862. #endif
  863. subs J , #1 // j--
  864. bgt _L2_BEGIN
  865. /*********************************************************************************************/
  866. _L1_BEGIN:
  867. ldr J , N
  868. tst J , #1
  869. ble _L999
  870. ldr CO1, C // CO1 = C
  871. ldr r4 , LDC
  872. add r3 , r4, CO1
  873. str r3 , C // store C
  874. #if defined(LEFT)
  875. ldr r3 , OFFSET
  876. str r3 , KK
  877. #endif
  878. ldr AO, A // AO = A
  879. _L1_M2_BEGIN:
  880. ldr I, M
  881. asrs I, I, #1 // I = I / 2
  882. ble _L1_M1_BEGIN
  883. _L1_M2_20:
  884. #if (defined(LEFT) && defined(TRANSA)) || \
  885. (!defined(LEFT) && !defined(TRANSA))
  886. mov BO, BC
  887. #else
  888. mov BO, BC
  889. ldr r3 , KK
  890. lsls r4 , r3 , #3 // 1 * 4 * 2 float values
  891. add BO , BO , r4
  892. lsls r4 , r3 , #4 // 2 * 4 * 2 float values
  893. add AO , AO , r4
  894. #endif
  895. #ifndef TRMMKERNEL
  896. ldr K1, K
  897. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  898. ldr K1, K
  899. ldr r3, KK
  900. sub K1, K1, r3
  901. str K1, KKK
  902. #else
  903. ldr K1, KK
  904. #ifdef LEFT
  905. add K1, K1, #2 // number of values in AO
  906. #else
  907. add K1, K1, #1 // number of values in BO
  908. #endif
  909. str K1, KKK
  910. #endif
  911. asrs L , K1, #3 // L = L / 8
  912. cmp L , #3
  913. blt _L1_M2_30
  914. .align 5
  915. KERNEL2x1_I
  916. KERNEL2x1_M2
  917. KERNEL2x1_M1
  918. KERNEL2x1_M2
  919. KERNEL2x1_M1
  920. KERNEL2x1_M2
  921. KERNEL2x1_M1
  922. KERNEL2x1_M2
  923. sub L, L, #2
  924. _L1_M2_22:
  925. KERNEL2x1_M1
  926. KERNEL2x1_M2
  927. KERNEL2x1_M1
  928. KERNEL2x1_M2
  929. KERNEL2x1_M1
  930. KERNEL2x1_M2
  931. KERNEL2x1_M1
  932. KERNEL2x1_M2
  933. subs L, L, #1
  934. bgt _L1_M2_22
  935. KERNEL2x1_M1
  936. KERNEL2x1_M2
  937. KERNEL2x1_M1
  938. KERNEL2x1_M2
  939. KERNEL2x1_M1
  940. KERNEL2x1_M2
  941. KERNEL2x1_M1
  942. KERNEL2x1_E
  943. b _L1_M2_44
  944. _L1_M2_30:
  945. tst L, #3
  946. ble _L1_M2_40
  947. tst L, #2
  948. ble _L1_M2_32
  949. KERNEL2x1_I
  950. KERNEL2x1_M2
  951. KERNEL2x1_M1
  952. KERNEL2x1_M2
  953. KERNEL2x1_M1
  954. KERNEL2x1_M2
  955. KERNEL2x1_M1
  956. KERNEL2x1_M2
  957. KERNEL2x1_M1
  958. KERNEL2x1_M2
  959. KERNEL2x1_M1
  960. KERNEL2x1_M2
  961. KERNEL2x1_M1
  962. KERNEL2x1_M2
  963. KERNEL2x1_M1
  964. KERNEL2x1_E
  965. b _L1_M2_44
  966. _L1_M2_32:
  967. tst L, #1
  968. ble _L1_M2_40
  969. KERNEL2x1_I
  970. KERNEL2x1_M2
  971. KERNEL2x1_M1
  972. KERNEL2x1_M2
  973. KERNEL2x1_M1
  974. KERNEL2x1_M2
  975. KERNEL2x1_M1
  976. KERNEL2x1_E
  977. b _L1_M2_44
  978. _L1_M2_40:
  979. vldr.f32 s16 , =0
  980. INIT2x1
  981. _L1_M2_44:
  982. ands L , K1, #7 // L = L % 8
  983. ble _L1_M2_100
  984. _L1_M2_46:
  985. KERNEL2x1_SUB
  986. subs L, L, #1
  987. bne _L1_M2_46
  988. _L1_M2_100:
  989. SAVE2x1
  990. #if (defined(LEFT) && defined(TRANSA)) || \
  991. (!defined(LEFT) && !defined(TRANSA))
  992. ldr r3 , K
  993. ldr r4 , KKK
  994. sub r3 , r3 , r4
  995. lsls r4 , r3 , #3 // 1 * 4 * 2 float values
  996. add BO , BO , r4
  997. lsls r4 , r3 , #4 // 2 * 4 * 2 float values
  998. add AO , AO , r4
  999. #endif
  1000. #if defined(LEFT)
  1001. ldr r3 , KK
  1002. add r3 , r3 , #2 // number of values in AO
  1003. str r3 , KK
  1004. #endif
  1005. _L1_M2_END:
  1006. subs I, I, #1
  1007. bne _L1_M2_20
  1008. _L1_M1_BEGIN:
  1009. ldr I, M
  1010. tst I, #1 // I = I % 2
  1011. ble _L1_END
  1012. _L1_M1_20:
  1013. vldr.f32 s16 , =0
  1014. INIT1x1
  1015. #if (defined(LEFT) && defined(TRANSA)) || \
  1016. (!defined(LEFT) && !defined(TRANSA))
  1017. mov BO, BC
  1018. #else
  1019. mov BO, BC
  1020. ldr r3 , KK
  1021. lsls r4 , r3 , #3 // 1 * 4 * 2 float values
  1022. add BO , BO , r4
  1023. lsls r4 , r3 , #3 // 1 * 4 * 2 float values
  1024. add AO , AO , r4
  1025. #endif
  1026. #ifndef TRMMKERNEL
  1027. ldr K1, K
  1028. #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
  1029. ldr K1, K
  1030. ldr r3, KK
  1031. sub K1, K1, r3
  1032. str K1, KKK
  1033. #else
  1034. ldr K1, KK
  1035. #ifdef LEFT
  1036. add K1, K1, #1 // number of values in AO
  1037. #else
  1038. add K1, K1, #1 // number of values in BO
  1039. #endif
  1040. str K1, KKK
  1041. #endif
  1042. asrs L , K1, #3 // L = L / 8
  1043. ble _L1_M1_40
  1044. _L1_M1_22:
  1045. KERNEL1x1_SUB
  1046. KERNEL1x1_SUB
  1047. KERNEL1x1_SUB
  1048. KERNEL1x1_SUB
  1049. KERNEL1x1_SUB
  1050. KERNEL1x1_SUB
  1051. KERNEL1x1_SUB
  1052. KERNEL1x1_SUB
  1053. subs L, L, #1
  1054. bgt _L1_M1_22
  1055. _L1_M1_40:
  1056. ands L , K1, #7 // L = L % 8
  1057. ble _L1_M1_100
  1058. _L1_M1_42:
  1059. KERNEL1x1_SUB
  1060. subs L, L, #1
  1061. bgt _L1_M1_42
  1062. _L1_M1_100:
  1063. SAVE1x1
  1064. _L1_END:
  1065. _L999:
  1066. sub r3, fp, #128
  1067. vldm r3, { s8 - s31} // restore floating point registers
  1068. movs r0, #0 // set return value
  1069. sub sp, fp, #24
  1070. pop {r4 - r9, fp}
  1071. bx lr
  1072. EPILOGUE