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

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