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.

ztrmm_kernel_2x2_vfpv3.S 26 kB

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