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.

zgemv_t_ppc440.S 26 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294
  1. /*********************************************************************/
  2. /* Copyright 2009, 2010 The University of Texas at Austin. */
  3. /* All rights reserved. */
  4. /* */
  5. /* Redistribution and use in source and binary forms, with or */
  6. /* without modification, are permitted provided that the following */
  7. /* conditions are met: */
  8. /* */
  9. /* 1. Redistributions of source code must retain the above */
  10. /* copyright notice, this list of conditions and the following */
  11. /* disclaimer. */
  12. /* */
  13. /* 2. Redistributions in binary form must reproduce the above */
  14. /* copyright notice, this list of conditions and the following */
  15. /* disclaimer in the documentation and/or other materials */
  16. /* provided with the distribution. */
  17. /* */
  18. /* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
  19. /* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
  20. /* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
  21. /* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
  22. /* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
  23. /* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
  24. /* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
  25. /* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
  26. /* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
  27. /* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
  28. /* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
  29. /* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
  30. /* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
  31. /* POSSIBILITY OF SUCH DAMAGE. */
  32. /* */
  33. /* The views and conclusions contained in the software and */
  34. /* documentation are those of the authors and should not be */
  35. /* interpreted as representing official policies, either expressed */
  36. /* or implied, of The University of Texas at Austin. */
  37. /*********************************************************************/
  38. #define ASSEMBLER
  39. #include "common.h"
  40. #define P 1024
  41. #ifndef __64BIT__
  42. #define STACKSIZE 224
  43. #else
  44. #define STACKSIZE 304
  45. #endif
  46. #if defined(linux) || defined(__FreeBSD__)
  47. #ifndef __64BIT__
  48. #define M r3
  49. #define N r4
  50. #define A r6
  51. #define LDA r7
  52. #define X r8
  53. #define INCX r9
  54. #define Y r10
  55. #define INCY r5
  56. #else
  57. #define M r3
  58. #define N r4
  59. #define A r8
  60. #define LDA r9
  61. #define X r10
  62. #define INCX r5
  63. #define Y r6
  64. #define INCY r7
  65. #endif
  66. #endif
  67. #if defined(_AIX) || defined(__APPLE__)
  68. #if !defined(__64BIT__) && defined(DOUBLE)
  69. #define M r3
  70. #define N r4
  71. #define A r10
  72. #define LDA r5
  73. #define X r6
  74. #define INCX r7
  75. #define Y r8
  76. #define INCY r9
  77. #else
  78. #define M r3
  79. #define N r4
  80. #define A r8
  81. #define LDA r9
  82. #define X r10
  83. #define INCX r5
  84. #define Y r6
  85. #define INCY r7
  86. #endif
  87. #endif
  88. #define BUFFER r11
  89. #define XP r12
  90. #define X1 r14
  91. #define J r15
  92. #define AO1 r16
  93. #define AO2 r17
  94. #define AO3 r18
  95. #define AO4 r19
  96. #define PREA r20
  97. #define PREC r21
  98. #define YY r22
  99. #if defined(PPCG4)
  100. #define PREFETCHSIZE_A (3 * 8)
  101. #define PREFETCHSIZE_C 7
  102. #endif
  103. #if defined(POWER6)
  104. #define PREFETCHSIZE_A (3 * 8)
  105. #define PREFETCHSIZE_C 7
  106. #endif
  107. #if !(defined(CONJ) && defined(XCONJ))
  108. #define FMADDR FMADD
  109. #define FMSUBR FNMSUB
  110. #else
  111. #define FMADDR FNMSUB
  112. #define FMSUBR FMADD
  113. #endif
  114. #ifndef NEEDPARAM
  115. #ifndef __64BIT__
  116. #define FZERO 200(SP)
  117. #else
  118. #define FZERO 256(SP)
  119. #endif
  120. PROLOGUE
  121. PROFCODE
  122. addi SP, SP, -STACKSIZE
  123. li r0, 0
  124. stfd f14, 0(SP)
  125. stfd f15, 8(SP)
  126. stfd f16, 16(SP)
  127. stfd f17, 24(SP)
  128. stfd f18, 32(SP)
  129. stfd f19, 40(SP)
  130. stfd f20, 48(SP)
  131. stfd f21, 56(SP)
  132. stfd f22, 64(SP)
  133. stfd f23, 72(SP)
  134. stfd f24, 80(SP)
  135. stfd f25, 88(SP)
  136. stfd f26, 96(SP)
  137. stfd f27, 104(SP)
  138. stfd f28, 112(SP)
  139. stfd f29, 120(SP)
  140. stfd f30, 128(SP)
  141. stfd f31, 136(SP)
  142. #ifdef __64BIT__
  143. std r14, 144(SP)
  144. std r15, 152(SP)
  145. std r16, 160(SP)
  146. std r17, 168(SP)
  147. std r18, 176(SP)
  148. std r19, 184(SP)
  149. std r20, 192(SP)
  150. std r21, 200(SP)
  151. std r22, 208(SP)
  152. std r0, FZERO
  153. #else
  154. stw r14, 144(SP)
  155. stw r15, 148(SP)
  156. stw r16, 152(SP)
  157. stw r17, 156(SP)
  158. stw r18, 160(SP)
  159. stw r19, 164(SP)
  160. stw r20, 168(SP)
  161. stw r21, 172(SP)
  162. stw r22, 176(SP)
  163. stw r0, FZERO
  164. stw r0, 4 + FZERO
  165. #endif
  166. #if defined(linux) || defined(__FreeBSD__)
  167. #ifndef __64BIT__
  168. lwz INCY, FRAMESLOT(0) + STACKSIZE(SP)
  169. lwz BUFFER, FRAMESLOT(1) + STACKSIZE(SP)
  170. #else
  171. ld INCX, FRAMESLOT(0) + STACKSIZE(SP)
  172. ld Y, FRAMESLOT(1) + STACKSIZE(SP)
  173. ld INCY, FRAMESLOT(2) + STACKSIZE(SP)
  174. ld BUFFER, FRAMESLOT(3) + STACKSIZE(SP)
  175. #endif
  176. #endif
  177. #if defined(_AIX) || defined(__APPLE__)
  178. #ifndef __64BIT__
  179. #ifdef DOUBLE
  180. lwz LDA, FRAMESLOT(0) + STACKSIZE(SP)
  181. lwz X, FRAMESLOT(1) + STACKSIZE(SP)
  182. lwz INCX, FRAMESLOT(2) + STACKSIZE(SP)
  183. lwz Y, FRAMESLOT(3) + STACKSIZE(SP)
  184. lwz INCY, FRAMESLOT(4) + STACKSIZE(SP)
  185. lwz BUFFER, FRAMESLOT(5) + STACKSIZE(SP)
  186. #else
  187. lwz INCX, FRAMESLOT(0) + STACKSIZE(SP)
  188. lwz Y, FRAMESLOT(1) + STACKSIZE(SP)
  189. lwz INCY, FRAMESLOT(2) + STACKSIZE(SP)
  190. lwz BUFFER, FRAMESLOT(3) + STACKSIZE(SP)
  191. #endif
  192. #else
  193. ld INCX, FRAMESLOT(0) + STACKSIZE(SP)
  194. ld Y, FRAMESLOT(1) + STACKSIZE(SP)
  195. ld INCY, FRAMESLOT(2) + STACKSIZE(SP)
  196. ld BUFFER, FRAMESLOT(3) + STACKSIZE(SP)
  197. #endif
  198. #endif
  199. #ifndef XCONJ
  200. #ifndef CONJ
  201. #define FMADD1 FMADD
  202. #define FMADD2 FMADD
  203. #define FMADD3 FNMSUB
  204. #define FMADD4 FMADD
  205. #else
  206. #define FMADD1 FMADD
  207. #define FMADD2 FMADD
  208. #define FMADD3 FMADD
  209. #define FMADD4 FNMSUB
  210. #endif
  211. #else
  212. #ifndef CONJ
  213. #define FMADD1 FMADD
  214. #define FMADD2 FNMSUB
  215. #define FMADD3 FMADD
  216. #define FMADD4 FMADD
  217. #else
  218. #define FMADD1 FMADD
  219. #define FMADD2 FMADD
  220. #define FMADD3 FNMSUB
  221. #define FMADD4 FMADD
  222. #endif
  223. #endif
  224. #define y1 f0
  225. #define y2 f1
  226. #define y3 f2
  227. #define y4 f3
  228. #define y5 f4
  229. #define y6 f5
  230. #define y7 f6
  231. #define y8 f7
  232. #define a1 f8
  233. #define a2 f9
  234. #define a3 f10
  235. #define a4 f11
  236. #define a5 f12
  237. #define a6 f13
  238. #define a7 f14
  239. #define a8 f15
  240. #define b1 f16
  241. #define b2 f17
  242. #define b3 f18
  243. #define b4 f19
  244. #define b5 f20
  245. #define b6 f21
  246. #define b7 f22
  247. #define b8 f23
  248. #define alpha_r f24
  249. #define alpha_i f25
  250. fmr alpha_r, f1
  251. fmr alpha_i, f2
  252. slwi LDA, LDA, ZBASE_SHIFT
  253. slwi INCX, INCX, ZBASE_SHIFT
  254. slwi INCY, INCY, ZBASE_SHIFT
  255. li PREA, PREFETCHSIZE_A * SIZE
  256. li PREC, PREFETCHSIZE_C * SIZE
  257. addi A, A, -SIZE
  258. addi INCX, INCX, -SIZE
  259. addi INCY, INCY, -SIZE
  260. sub X, X, INCX
  261. sub Y, Y, INCY
  262. mr YY, Y
  263. cmpwi cr0, M, 0
  264. ble LL(999)
  265. cmpwi cr0, N, 0
  266. ble LL(999)
  267. mr XP, X
  268. cmpwi cr0, INCX, SIZE
  269. beq LL(10)
  270. addi XP, BUFFER, -SIZE
  271. addi X1, BUFFER, -SIZE
  272. srawi. r0, M, 2
  273. mtspr CTR, r0
  274. ble LL(05)
  275. .align 4
  276. LL(02):
  277. LFDUX f0, X, INCX
  278. LFDU f1, 1 * SIZE(X)
  279. LFDUX f2, X, INCX
  280. LFDU f3, 1 * SIZE(X)
  281. LFDUX f4, X, INCX
  282. LFDU f5, 1 * SIZE(X)
  283. LFDUX f6, X, INCX
  284. LFDU f7, 1 * SIZE(X)
  285. STFDU f0, 1 * SIZE(X1)
  286. STFDU f1, 1 * SIZE(X1)
  287. STFDU f2, 1 * SIZE(X1)
  288. STFDU f3, 1 * SIZE(X1)
  289. STFDU f4, 1 * SIZE(X1)
  290. STFDU f5, 1 * SIZE(X1)
  291. STFDU f6, 1 * SIZE(X1)
  292. STFDU f7, 1 * SIZE(X1)
  293. bdnz LL(02)
  294. .align 4
  295. LL(05):
  296. andi. r0, M, 3
  297. mtspr CTR, r0
  298. ble LL(10)
  299. .align 4
  300. LL(06):
  301. LFDUX f0, X, INCX
  302. LFDU f1, 1 * SIZE(X)
  303. STFDU f0, 1 * SIZE(X1)
  304. STFDU f1, 1 * SIZE(X1)
  305. bdnz LL(06)
  306. .align 4
  307. LL(10):
  308. srawi. J, N, 2
  309. ble LL(20)
  310. .align 4
  311. LL(11):
  312. lfd y1, FZERO
  313. mr AO1, A
  314. fmr y2, y1
  315. mr X1, XP
  316. fmr y3, y1
  317. add AO2, A, LDA
  318. fmr y4, y1
  319. add AO3, AO2, LDA
  320. fmr y5, y1
  321. add AO4, AO3, LDA
  322. fmr y6, y1
  323. add A, AO4, LDA
  324. fmr y7, y1
  325. dcbtst PREC, Y
  326. fmr y8, y1
  327. srawi. r0, M, 2
  328. mtspr CTR, r0
  329. ble LL(15)
  330. LFDU a1, 1 * SIZE(AO1)
  331. LFDU b1, 1 * SIZE(X1)
  332. LFDU a2, 1 * SIZE(AO1)
  333. LFDU b2, 1 * SIZE(X1)
  334. LFDU a3, 1 * SIZE(AO2)
  335. LFDU a4, 1 * SIZE(AO2)
  336. LFDU a5, 1 * SIZE(AO3)
  337. LFDU a6, 1 * SIZE(AO3)
  338. LFDU a7, 1 * SIZE(AO4)
  339. bdz LL(13)
  340. .align 5
  341. LL(12):
  342. FMADD1 y1, a1, b1, y1
  343. LFDU a8, 1 * SIZE(AO4)
  344. FMADD2 y2, a1, b2, y2
  345. LFDU b3, 1 * SIZE(X1)
  346. FMADD1 y3, a3, b1, y3
  347. LFDU b4, 1 * SIZE(X1)
  348. FMADD2 y4, a3, b2, y4
  349. #ifdef PPCG4
  350. dcbt AO1, PREA
  351. #endif
  352. FMADD3 y1, a2, b2, y1
  353. LFDU a1, 1 * SIZE(AO1)
  354. FMADD4 y2, a2, b1, y2
  355. LFDU a2, 1 * SIZE(AO1)
  356. FMADD3 y3, a4, b2, y3
  357. LFDU a3, 1 * SIZE(AO2)
  358. FMADD4 y4, a4, b1, y4
  359. LFDU a4, 1 * SIZE(AO2)
  360. #ifdef PPCG4
  361. dcbt X1, PREA
  362. #endif
  363. FMADD1 y5, a5, b1, y5
  364. FMADD2 y6, a5, b2, y6
  365. FMADD1 y7, a7, b1, y7
  366. FMADD2 y8, a7, b2, y8
  367. #ifdef PPCG4
  368. dcbt AO2, PREA
  369. #endif
  370. FMADD3 y5, a6, b2, y5
  371. LFDU a5, 1 * SIZE(AO3)
  372. FMADD4 y6, a6, b1, y6
  373. LFDU a6, 1 * SIZE(AO3)
  374. FMADD3 y7, a8, b2, y7
  375. LFDU a7, 1 * SIZE(AO4)
  376. FMADD4 y8, a8, b1, y8
  377. LFDU a8, 1 * SIZE(AO4)
  378. FMADD1 y1, a1, b3, y1
  379. LFDU b1, 1 * SIZE(X1)
  380. FMADD2 y2, a1, b4, y2
  381. LFDU b2, 1 * SIZE(X1)
  382. FMADD1 y3, a3, b3, y3
  383. FMADD2 y4, a3, b4, y4
  384. #ifdef PPCG4
  385. dcbt AO3, PREA
  386. #endif
  387. FMADD3 y1, a2, b4, y1
  388. LFDU a1, 1 * SIZE(AO1)
  389. FMADD4 y2, a2, b3, y2
  390. LFDU a2, 1 * SIZE(AO1)
  391. FMADD3 y3, a4, b4, y3
  392. LFDU a3, 1 * SIZE(AO2)
  393. FMADD4 y4, a4, b3, y4
  394. LFDU a4, 1 * SIZE(AO2)
  395. FMADD1 y5, a5, b3, y5
  396. FMADD2 y6, a5, b4, y6
  397. FMADD1 y7, a7, b3, y7
  398. FMADD2 y8, a7, b4, y8
  399. #ifdef PPCG4
  400. dcbt AO4, PREA
  401. #endif
  402. FMADD3 y5, a6, b4, y5
  403. LFDU a5, 1 * SIZE(AO3)
  404. FMADD4 y6, a6, b3, y6
  405. LFDU a6, 1 * SIZE(AO3)
  406. FMADD3 y7, a8, b4, y7
  407. LFDU a7, 1 * SIZE(AO4)
  408. FMADD4 y8, a8, b3, y8
  409. LFDU a8, 1 * SIZE(AO4)
  410. FMADD1 y1, a1, b1, y1
  411. LFDU b3, 1 * SIZE(X1)
  412. FMADD2 y2, a1, b2, y2
  413. LFDU b4, 1 * SIZE(X1)
  414. FMADD1 y3, a3, b1, y3
  415. FMADD2 y4, a3, b2, y4
  416. #if defined(PPCG4) && defined(DOUBLE)
  417. dcbt AO1, PREA
  418. #endif
  419. FMADD3 y1, a2, b2, y1
  420. LFDU a1, 1 * SIZE(AO1)
  421. FMADD4 y2, a2, b1, y2
  422. LFDU a2, 1 * SIZE(AO1)
  423. FMADD3 y3, a4, b2, y3
  424. LFDU a3, 1 * SIZE(AO2)
  425. FMADD4 y4, a4, b1, y4
  426. LFDU a4, 1 * SIZE(AO2)
  427. #if defined(PPCG4) && defined(DOUBLE)
  428. dcbt X1, PREA
  429. #endif
  430. FMADD1 y5, a5, b1, y5
  431. FMADD2 y6, a5, b2, y6
  432. FMADD1 y7, a7, b1, y7
  433. FMADD2 y8, a7, b2, y8
  434. #if defined(PPCG4) && defined(DOUBLE)
  435. dcbt AO2, PREA
  436. #endif
  437. FMADD3 y5, a6, b2, y5
  438. LFDU a5, 1 * SIZE(AO3)
  439. FMADD4 y6, a6, b1, y6
  440. LFDU a6, 1 * SIZE(AO3)
  441. FMADD3 y7, a8, b2, y7
  442. LFDU a7, 1 * SIZE(AO4)
  443. FMADD4 y8, a8, b1, y8
  444. LFDU a8, 1 * SIZE(AO4)
  445. FMADD1 y1, a1, b3, y1
  446. FMADD2 y2, a1, b4, y2
  447. FMADD1 y3, a3, b3, y3
  448. FMADD2 y4, a3, b4, y4
  449. #if defined(PPCG4) && defined(DOUBLE)
  450. dcbt AO3, PREA
  451. #endif
  452. FMADD3 y1, a2, b4, y1
  453. LFDU a1, 1 * SIZE(AO1)
  454. FMADD4 y2, a2, b3, y2
  455. LFDU a2, 1 * SIZE(AO1)
  456. FMADD3 y3, a4, b4, y3
  457. LFDU a3, 1 * SIZE(AO2)
  458. FMADD4 y4, a4, b3, y4
  459. LFDU a4, 1 * SIZE(AO2)
  460. FMADD1 y5, a5, b3, y5
  461. LFDU b1, 1 * SIZE(X1)
  462. FMADD2 y6, a5, b4, y6
  463. LFDU b2, 1 * SIZE(X1)
  464. FMADD1 y7, a7, b3, y7
  465. FMADD2 y8, a7, b4, y8
  466. #if defined(PPCG4) && defined(DOUBLE)
  467. dcbt AO4, PREA
  468. #endif
  469. FMADD3 y5, a6, b4, y5
  470. LFDU a5, 1 * SIZE(AO3)
  471. FMADD4 y6, a6, b3, y6
  472. LFDU a6, 1 * SIZE(AO3)
  473. FMADD3 y7, a8, b4, y7
  474. LFDU a7, 1 * SIZE(AO4)
  475. FMADD4 y8, a8, b3, y8
  476. bdnz LL(12)
  477. .align 4
  478. LL(13):
  479. FMADD1 y1, a1, b1, y1
  480. LFDU a8, 1 * SIZE(AO4)
  481. FMADD2 y2, a1, b2, y2
  482. LFDU b3, 1 * SIZE(X1)
  483. FMADD1 y3, a3, b1, y3
  484. LFDU b4, 1 * SIZE(X1)
  485. FMADD2 y4, a3, b2, y4
  486. FMADD3 y1, a2, b2, y1
  487. LFDU a1, 1 * SIZE(AO1)
  488. FMADD4 y2, a2, b1, y2
  489. LFDU a2, 1 * SIZE(AO1)
  490. FMADD3 y3, a4, b2, y3
  491. LFDU a3, 1 * SIZE(AO2)
  492. FMADD4 y4, a4, b1, y4
  493. LFDU a4, 1 * SIZE(AO2)
  494. FMADD1 y5, a5, b1, y5
  495. FMADD2 y6, a5, b2, y6
  496. FMADD1 y7, a7, b1, y7
  497. FMADD2 y8, a7, b2, y8
  498. FMADD3 y5, a6, b2, y5
  499. LFDU a5, 1 * SIZE(AO3)
  500. FMADD4 y6, a6, b1, y6
  501. LFDU a6, 1 * SIZE(AO3)
  502. FMADD3 y7, a8, b2, y7
  503. LFDU a7, 1 * SIZE(AO4)
  504. FMADD4 y8, a8, b1, y8
  505. LFDU a8, 1 * SIZE(AO4)
  506. FMADD1 y1, a1, b3, y1
  507. LFDU b1, 1 * SIZE(X1)
  508. FMADD2 y2, a1, b4, y2
  509. LFDU b2, 1 * SIZE(X1)
  510. FMADD1 y3, a3, b3, y3
  511. FMADD2 y4, a3, b4, y4
  512. FMADD3 y1, a2, b4, y1
  513. LFDU a1, 1 * SIZE(AO1)
  514. FMADD4 y2, a2, b3, y2
  515. LFDU a2, 1 * SIZE(AO1)
  516. FMADD3 y3, a4, b4, y3
  517. LFDU a3, 1 * SIZE(AO2)
  518. FMADD4 y4, a4, b3, y4
  519. LFDU a4, 1 * SIZE(AO2)
  520. FMADD1 y5, a5, b3, y5
  521. FMADD2 y6, a5, b4, y6
  522. FMADD1 y7, a7, b3, y7
  523. FMADD2 y8, a7, b4, y8
  524. FMADD3 y5, a6, b4, y5
  525. LFDU a5, 1 * SIZE(AO3)
  526. FMADD4 y6, a6, b3, y6
  527. LFDU a6, 1 * SIZE(AO3)
  528. FMADD3 y7, a8, b4, y7
  529. LFDU a7, 1 * SIZE(AO4)
  530. FMADD4 y8, a8, b3, y8
  531. LFDU a8, 1 * SIZE(AO4)
  532. FMADD1 y1, a1, b1, y1
  533. LFDU b3, 1 * SIZE(X1)
  534. FMADD2 y2, a1, b2, y2
  535. LFDU b4, 1 * SIZE(X1)
  536. FMADD1 y3, a3, b1, y3
  537. FMADD2 y4, a3, b2, y4
  538. FMADD3 y1, a2, b2, y1
  539. LFDU a1, 1 * SIZE(AO1)
  540. FMADD4 y2, a2, b1, y2
  541. LFDU a2, 1 * SIZE(AO1)
  542. FMADD3 y3, a4, b2, y3
  543. LFDU a3, 1 * SIZE(AO2)
  544. FMADD4 y4, a4, b1, y4
  545. LFDU a4, 1 * SIZE(AO2)
  546. FMADD1 y5, a5, b1, y5
  547. FMADD2 y6, a5, b2, y6
  548. FMADD1 y7, a7, b1, y7
  549. FMADD2 y8, a7, b2, y8
  550. FMADD3 y5, a6, b2, y5
  551. LFDU a5, 1 * SIZE(AO3)
  552. FMADD4 y6, a6, b1, y6
  553. LFDU a6, 1 * SIZE(AO3)
  554. FMADD3 y7, a8, b2, y7
  555. LFDU a7, 1 * SIZE(AO4)
  556. FMADD4 y8, a8, b1, y8
  557. LFDU a8, 1 * SIZE(AO4)
  558. FMADD1 y1, a1, b3, y1
  559. FMADD2 y2, a1, b4, y2
  560. FMADD1 y3, a3, b3, y3
  561. FMADD2 y4, a3, b4, y4
  562. FMADD3 y1, a2, b4, y1
  563. FMADD4 y2, a2, b3, y2
  564. FMADD3 y3, a4, b4, y3
  565. FMADD4 y4, a4, b3, y4
  566. FMADD1 y5, a5, b3, y5
  567. FMADD2 y6, a5, b4, y6
  568. FMADD1 y7, a7, b3, y7
  569. FMADD2 y8, a7, b4, y8
  570. FMADD3 y5, a6, b4, y5
  571. FMADD4 y6, a6, b3, y6
  572. FMADD3 y7, a8, b4, y7
  573. FMADD4 y8, a8, b3, y8
  574. .align 4
  575. LL(15):
  576. andi. r0, M, 2
  577. ble LL(17)
  578. LFDU a1, 1 * SIZE(AO1)
  579. LFDU b1, 1 * SIZE(X1)
  580. LFDU a2, 1 * SIZE(AO1)
  581. LFDU b2, 1 * SIZE(X1)
  582. LFDU a3, 1 * SIZE(AO2)
  583. LFDU b3, 1 * SIZE(X1)
  584. LFDU a4, 1 * SIZE(AO2)
  585. LFDU b4, 1 * SIZE(X1)
  586. FMADD1 y1, a1, b1, y1
  587. LFDU a5, 1 * SIZE(AO3)
  588. FMADD2 y2, a1, b2, y2
  589. LFDU a6, 1 * SIZE(AO3)
  590. FMADD1 y3, a3, b1, y3
  591. LFDU a7, 1 * SIZE(AO4)
  592. FMADD2 y4, a3, b2, y4
  593. LFDU a8, 1 * SIZE(AO4)
  594. FMADD3 y1, a2, b2, y1
  595. LFDU a1, 1 * SIZE(AO1)
  596. FMADD4 y2, a2, b1, y2
  597. LFDU a2, 1 * SIZE(AO1)
  598. FMADD3 y3, a4, b2, y3
  599. LFDU a3, 1 * SIZE(AO2)
  600. FMADD4 y4, a4, b1, y4
  601. LFDU a4, 1 * SIZE(AO2)
  602. FMADD1 y5, a5, b1, y5
  603. FMADD2 y6, a5, b2, y6
  604. FMADD1 y7, a7, b1, y7
  605. FMADD2 y8, a7, b2, y8
  606. FMADD3 y5, a6, b2, y5
  607. LFDU a5, 1 * SIZE(AO3)
  608. FMADD4 y6, a6, b1, y6
  609. LFDU a6, 1 * SIZE(AO3)
  610. FMADD3 y7, a8, b2, y7
  611. LFDU a7, 1 * SIZE(AO4)
  612. FMADD4 y8, a8, b1, y8
  613. LFDU a8, 1 * SIZE(AO4)
  614. FMADD1 y1, a1, b3, y1
  615. FMADD2 y2, a1, b4, y2
  616. FMADD1 y3, a3, b3, y3
  617. FMADD2 y4, a3, b4, y4
  618. FMADD3 y1, a2, b4, y1
  619. FMADD4 y2, a2, b3, y2
  620. FMADD3 y3, a4, b4, y3
  621. FMADD4 y4, a4, b3, y4
  622. FMADD1 y5, a5, b3, y5
  623. FMADD2 y6, a5, b4, y6
  624. FMADD1 y7, a7, b3, y7
  625. FMADD2 y8, a7, b4, y8
  626. FMADD3 y5, a6, b4, y5
  627. FMADD4 y6, a6, b3, y6
  628. FMADD3 y7, a8, b4, y7
  629. FMADD4 y8, a8, b3, y8
  630. .align 4
  631. LL(17):
  632. andi. r0, M, 1
  633. ble LL(19)
  634. LFDU a1, 1 * SIZE(AO1)
  635. LFDU a2, 1 * SIZE(AO1)
  636. LFDU a3, 1 * SIZE(AO2)
  637. LFDU a4, 1 * SIZE(AO2)
  638. LFDU a5, 1 * SIZE(AO3)
  639. LFDU a6, 1 * SIZE(AO3)
  640. LFDU a7, 1 * SIZE(AO4)
  641. LFDU a8, 1 * SIZE(AO4)
  642. LFDU b1, 1 * SIZE(X1)
  643. LFDU b2, 1 * SIZE(X1)
  644. FMADD1 y1, a1, b1, y1
  645. FMADD2 y2, a1, b2, y2
  646. FMADD1 y3, a3, b1, y3
  647. FMADD2 y4, a3, b2, y4
  648. FMADD3 y1, a2, b2, y1
  649. FMADD4 y2, a2, b1, y2
  650. FMADD3 y3, a4, b2, y3
  651. FMADD4 y4, a4, b1, y4
  652. FMADD1 y5, a5, b1, y5
  653. FMADD2 y6, a5, b2, y6
  654. FMADD1 y7, a7, b1, y7
  655. FMADD2 y8, a7, b2, y8
  656. FMADD3 y5, a6, b2, y5
  657. FMADD4 y6, a6, b1, y6
  658. FMADD3 y7, a8, b2, y7
  659. FMADD4 y8, a8, b1, y8
  660. .align 4
  661. LL(19):
  662. LFDUX b1, Y, INCY
  663. LFDU b2, 1 * SIZE(Y)
  664. LFDUX b3, Y, INCY
  665. LFDU b4, 1 * SIZE(Y)
  666. LFDUX b5, Y, INCY
  667. LFDU b6, 1 * SIZE(Y)
  668. LFDUX b7, Y, INCY
  669. LFDU b8, 1 * SIZE(Y)
  670. FMADD b1, alpha_r, y1, b1
  671. FMADDR b2, alpha_r, y2, b2
  672. FMADD b3, alpha_r, y3, b3
  673. FMADDR b4, alpha_r, y4, b4
  674. FMADD b5, alpha_r, y5, b5
  675. FMADDR b6, alpha_r, y6, b6
  676. FMADD b7, alpha_r, y7, b7
  677. FMADDR b8, alpha_r, y8, b8
  678. FMSUBR b1, alpha_i, y2, b1
  679. FMADD b2, alpha_i, y1, b2
  680. FMSUBR b3, alpha_i, y4, b3
  681. FMADD b4, alpha_i, y3, b4
  682. FMSUBR b5, alpha_i, y6, b5
  683. FMADD b6, alpha_i, y5, b6
  684. FMSUBR b7, alpha_i, y8, b7
  685. FMADD b8, alpha_i, y7, b8
  686. STFDUX b1, YY, INCY
  687. STFDU b2, 1 * SIZE(YY)
  688. STFDUX b3, YY, INCY
  689. STFDU b4, 1 * SIZE(YY)
  690. STFDUX b5, YY, INCY
  691. STFDU b6, 1 * SIZE(YY)
  692. STFDUX b7, YY, INCY
  693. STFDU b8, 1 * SIZE(YY)
  694. addi J, J, -1
  695. cmpwi cr0, J, 0
  696. bgt LL(11)
  697. .align 4
  698. LL(20):
  699. andi. J, N, 2
  700. ble LL(30)
  701. lfd y1, FZERO
  702. mr AO1, A
  703. fmr y2, y1
  704. mr X1, XP
  705. fmr y3, y1
  706. add AO2, A, LDA
  707. fmr y4, y1
  708. add A, AO2, LDA
  709. srawi. r0, M, 2
  710. mtspr CTR, r0
  711. ble LL(25)
  712. LFDU a1, 1 * SIZE(AO1)
  713. LFDU b1, 1 * SIZE(X1)
  714. LFDU a2, 1 * SIZE(AO1)
  715. LFDU b2, 1 * SIZE(X1)
  716. LFDU a3, 1 * SIZE(AO2)
  717. bdz LL(23)
  718. .align 5
  719. LL(22):
  720. FMADD1 y1, a1, b1, y1
  721. LFDU a4, 1 * SIZE(AO2)
  722. FMADD2 y2, a1, b2, y2
  723. LFDU b3, 1 * SIZE(X1)
  724. FMADD1 y3, a3, b1, y3
  725. LFDU b4, 1 * SIZE(X1)
  726. FMADD2 y4, a3, b2, y4
  727. #ifdef PPCG4
  728. dcbt AO1, PREA
  729. #endif
  730. FMADD3 y1, a2, b2, y1
  731. LFDU a1, 1 * SIZE(AO1)
  732. FMADD4 y2, a2, b1, y2
  733. LFDU a2, 1 * SIZE(AO1)
  734. FMADD3 y3, a4, b2, y3
  735. LFDU a3, 1 * SIZE(AO2)
  736. FMADD4 y4, a4, b1, y4
  737. LFDU a4, 1 * SIZE(AO2)
  738. #ifdef PPCG4
  739. dcbt AO2, PREA
  740. #endif
  741. FMADD1 y1, a1, b3, y1
  742. LFDU b1, 1 * SIZE(X1)
  743. FMADD2 y2, a1, b4, y2
  744. LFDU b2, 1 * SIZE(X1)
  745. FMADD1 y3, a3, b3, y3
  746. FMADD2 y4, a3, b4, y4
  747. #ifdef PPCG4
  748. dcbt X1, PREA
  749. #endif
  750. FMADD3 y1, a2, b4, y1
  751. LFDU a1, 1 * SIZE(AO1)
  752. FMADD4 y2, a2, b3, y2
  753. LFDU a2, 1 * SIZE(AO1)
  754. FMADD3 y3, a4, b4, y3
  755. LFDU a3, 1 * SIZE(AO2)
  756. FMADD4 y4, a4, b3, y4
  757. LFDU a4, 1 * SIZE(AO2)
  758. FMADD1 y1, a1, b1, y1
  759. LFDU b3, 1 * SIZE(X1)
  760. FMADD2 y2, a1, b2, y2
  761. LFDU b4, 1 * SIZE(X1)
  762. FMADD1 y3, a3, b1, y3
  763. FMADD2 y4, a3, b2, y4
  764. #if defined(PPCG4) && defined(DOUBLE)
  765. dcbt AO1, PREA
  766. #endif
  767. FMADD3 y1, a2, b2, y1
  768. LFDU a1, 1 * SIZE(AO1)
  769. FMADD4 y2, a2, b1, y2
  770. LFDU a2, 1 * SIZE(AO1)
  771. FMADD3 y3, a4, b2, y3
  772. LFDU a3, 1 * SIZE(AO2)
  773. FMADD4 y4, a4, b1, y4
  774. LFDU a4, 1 * SIZE(AO2)
  775. #if defined(PPCG4) && defined(DOUBLE)
  776. dcbt AO2, PREA
  777. #endif
  778. FMADD1 y1, a1, b3, y1
  779. LFDU b1, 1 * SIZE(X1)
  780. FMADD2 y2, a1, b4, y2
  781. LFDU b2, 1 * SIZE(X1)
  782. FMADD1 y3, a3, b3, y3
  783. FMADD2 y4, a3, b4, y4
  784. #if defined(PPCG4) && defined(DOUBLE)
  785. dcbt X1, PREA
  786. #endif
  787. FMADD3 y1, a2, b4, y1
  788. LFDU a1, 1 * SIZE(AO1)
  789. FMADD4 y2, a2, b3, y2
  790. LFDU a2, 1 * SIZE(AO1)
  791. FMADD3 y3, a4, b4, y3
  792. LFDU a3, 1 * SIZE(AO2)
  793. FMADD4 y4, a4, b3, y4
  794. bdnz LL(22)
  795. .align 4
  796. LL(23):
  797. FMADD1 y1, a1, b1, y1
  798. LFDU a4, 1 * SIZE(AO2)
  799. FMADD2 y2, a1, b2, y2
  800. LFDU b3, 1 * SIZE(X1)
  801. FMADD1 y3, a3, b1, y3
  802. LFDU b4, 1 * SIZE(X1)
  803. FMADD2 y4, a3, b2, y4
  804. FMADD3 y1, a2, b2, y1
  805. LFDU a1, 1 * SIZE(AO1)
  806. FMADD4 y2, a2, b1, y2
  807. LFDU a2, 1 * SIZE(AO1)
  808. FMADD3 y3, a4, b2, y3
  809. LFDU a3, 1 * SIZE(AO2)
  810. FMADD4 y4, a4, b1, y4
  811. LFDU a4, 1 * SIZE(AO2)
  812. FMADD1 y1, a1, b3, y1
  813. LFDU b1, 1 * SIZE(X1)
  814. FMADD2 y2, a1, b4, y2
  815. LFDU b2, 1 * SIZE(X1)
  816. FMADD1 y3, a3, b3, y3
  817. FMADD2 y4, a3, b4, y4
  818. FMADD3 y1, a2, b4, y1
  819. LFDU a1, 1 * SIZE(AO1)
  820. FMADD4 y2, a2, b3, y2
  821. LFDU a2, 1 * SIZE(AO1)
  822. FMADD3 y3, a4, b4, y3
  823. LFDU a3, 1 * SIZE(AO2)
  824. FMADD4 y4, a4, b3, y4
  825. LFDU a4, 1 * SIZE(AO2)
  826. FMADD1 y1, a1, b1, y1
  827. LFDU b3, 1 * SIZE(X1)
  828. FMADD2 y2, a1, b2, y2
  829. LFDU b4, 1 * SIZE(X1)
  830. FMADD1 y3, a3, b1, y3
  831. FMADD2 y4, a3, b2, y4
  832. FMADD3 y1, a2, b2, y1
  833. LFDU a1, 1 * SIZE(AO1)
  834. FMADD4 y2, a2, b1, y2
  835. LFDU a2, 1 * SIZE(AO1)
  836. FMADD3 y3, a4, b2, y3
  837. LFDU a3, 1 * SIZE(AO2)
  838. FMADD4 y4, a4, b1, y4
  839. LFDU a4, 1 * SIZE(AO2)
  840. FMADD1 y1, a1, b3, y1
  841. FMADD2 y2, a1, b4, y2
  842. FMADD1 y3, a3, b3, y3
  843. FMADD2 y4, a3, b4, y4
  844. FMADD3 y1, a2, b4, y1
  845. FMADD4 y2, a2, b3, y2
  846. FMADD3 y3, a4, b4, y3
  847. FMADD4 y4, a4, b3, y4
  848. .align 4
  849. LL(25):
  850. andi. r0, M, 2
  851. ble LL(27)
  852. LFDU a1, 1 * SIZE(AO1)
  853. LFDU b1, 1 * SIZE(X1)
  854. LFDU a2, 1 * SIZE(AO1)
  855. LFDU b2, 1 * SIZE(X1)
  856. LFDU a3, 1 * SIZE(AO2)
  857. LFDU b3, 1 * SIZE(X1)
  858. LFDU a4, 1 * SIZE(AO2)
  859. LFDU b4, 1 * SIZE(X1)
  860. FMADD1 y1, a1, b1, y1
  861. FMADD2 y2, a1, b2, y2
  862. FMADD1 y3, a3, b1, y3
  863. FMADD2 y4, a3, b2, y4
  864. FMADD3 y1, a2, b2, y1
  865. LFDU a1, 1 * SIZE(AO1)
  866. FMADD4 y2, a2, b1, y2
  867. LFDU a2, 1 * SIZE(AO1)
  868. FMADD3 y3, a4, b2, y3
  869. LFDU a3, 1 * SIZE(AO2)
  870. FMADD4 y4, a4, b1, y4
  871. LFDU a4, 1 * SIZE(AO2)
  872. FMADD1 y1, a1, b3, y1
  873. FMADD2 y2, a1, b4, y2
  874. FMADD1 y3, a3, b3, y3
  875. FMADD2 y4, a3, b4, y4
  876. FMADD3 y1, a2, b4, y1
  877. FMADD4 y2, a2, b3, y2
  878. FMADD3 y3, a4, b4, y3
  879. FMADD4 y4, a4, b3, y4
  880. .align 4
  881. LL(27):
  882. andi. r0, M, 1
  883. ble LL(29)
  884. LFDU a1, 1 * SIZE(AO1)
  885. LFDU a2, 1 * SIZE(AO1)
  886. LFDU a3, 1 * SIZE(AO2)
  887. LFDU a4, 1 * SIZE(AO2)
  888. LFDU b1, 1 * SIZE(X1)
  889. LFDU b2, 1 * SIZE(X1)
  890. FMADD1 y1, a1, b1, y1
  891. FMADD2 y2, a1, b2, y2
  892. FMADD1 y3, a3, b1, y3
  893. FMADD2 y4, a3, b2, y4
  894. FMADD3 y1, a2, b2, y1
  895. FMADD4 y2, a2, b1, y2
  896. FMADD3 y3, a4, b2, y3
  897. FMADD4 y4, a4, b1, y4
  898. .align 4
  899. LL(29):
  900. LFDUX b1, Y, INCY
  901. LFDU b2, 1 * SIZE(Y)
  902. LFDUX b3, Y, INCY
  903. LFDU b4, 1 * SIZE(Y)
  904. FMADD b1, alpha_r, y1, b1
  905. FMADDR b2, alpha_r, y2, b2
  906. FMADD b3, alpha_r, y3, b3
  907. FMADDR b4, alpha_r, y4, b4
  908. FMSUBR b1, alpha_i, y2, b1
  909. FMADD b2, alpha_i, y1, b2
  910. FMSUBR b3, alpha_i, y4, b3
  911. FMADD b4, alpha_i, y3, b4
  912. STFDUX b1, YY, INCY
  913. STFDU b2, 1 * SIZE(YY)
  914. STFDUX b3, YY, INCY
  915. STFDU b4, 1 * SIZE(YY)
  916. .align 4
  917. LL(30):
  918. andi. J, N, 1
  919. ble LL(999)
  920. lfd y1, FZERO
  921. mr AO1, A
  922. fmr y2, y1
  923. mr X1, XP
  924. fmr y3, y1
  925. fmr y4, y1
  926. add A, A, LDA
  927. srawi. r0, M, 2
  928. mtspr CTR, r0
  929. ble LL(35)
  930. LFDU a1, 1 * SIZE(AO1)
  931. LFDU b1, 1 * SIZE(X1)
  932. LFDU a2, 1 * SIZE(AO1)
  933. LFDU b2, 1 * SIZE(X1)
  934. bdz LL(33)
  935. .align 5
  936. LL(32):
  937. FMADD1 y1, a1, b1, y1
  938. LFDU b3, 1 * SIZE(X1)
  939. FMADD2 y2, a1, b2, y2
  940. LFDU b4, 1 * SIZE(X1)
  941. #ifdef PPCG4
  942. dcbt AO1, PREA
  943. #endif
  944. FMADD3 y3, a2, b2, y3
  945. LFDU a1, 1 * SIZE(AO1)
  946. FMADD4 y4, a2, b1, y4
  947. LFDU a2, 1 * SIZE(AO1)
  948. FMADD1 y1, a1, b3, y1
  949. LFDU b1, 1 * SIZE(X1)
  950. FMADD2 y2, a1, b4, y2
  951. LFDU b2, 1 * SIZE(X1)
  952. #ifdef PPCG4
  953. dcbt X1, PREA
  954. #endif
  955. FMADD3 y3, a2, b4, y3
  956. LFDU a1, 1 * SIZE(AO1)
  957. FMADD4 y4, a2, b3, y4
  958. LFDU a2, 1 * SIZE(AO1)
  959. FMADD1 y1, a1, b1, y1
  960. LFDU b3, 1 * SIZE(X1)
  961. FMADD2 y2, a1, b2, y2
  962. LFDU b4, 1 * SIZE(X1)
  963. #if defined(PPCG4) && defined(DOUBLE)
  964. dcbt AO1, PREA
  965. #endif
  966. FMADD3 y3, a2, b2, y3
  967. LFDU a1, 1 * SIZE(AO1)
  968. FMADD4 y4, a2, b1, y4
  969. LFDU a2, 1 * SIZE(AO1)
  970. FMADD1 y1, a1, b3, y1
  971. LFDU b1, 1 * SIZE(X1)
  972. FMADD2 y2, a1, b4, y2
  973. LFDU b2, 1 * SIZE(X1)
  974. #if defined(PPCG4) && defined(DOUBLE)
  975. dcbt X1, PREA
  976. #endif
  977. FMADD3 y3, a2, b4, y3
  978. LFDU a1, 1 * SIZE(AO1)
  979. FMADD4 y4, a2, b3, y4
  980. LFDU a2, 1 * SIZE(AO1)
  981. bdnz LL(32)
  982. .align 4
  983. LL(33):
  984. FMADD1 y1, a1, b1, y1
  985. LFDU b3, 1 * SIZE(X1)
  986. FMADD2 y2, a1, b2, y2
  987. LFDU b4, 1 * SIZE(X1)
  988. FMADD3 y3, a2, b2, y3
  989. LFDU a1, 1 * SIZE(AO1)
  990. FMADD4 y4, a2, b1, y4
  991. LFDU a2, 1 * SIZE(AO1)
  992. FMADD1 y1, a1, b3, y1
  993. LFDU b1, 1 * SIZE(X1)
  994. FMADD2 y2, a1, b4, y2
  995. LFDU b2, 1 * SIZE(X1)
  996. FMADD3 y3, a2, b4, y3
  997. LFDU a1, 1 * SIZE(AO1)
  998. FMADD4 y4, a2, b3, y4
  999. LFDU a2, 1 * SIZE(AO1)
  1000. FMADD1 y1, a1, b1, y1
  1001. LFDU b3, 1 * SIZE(X1)
  1002. FMADD2 y2, a1, b2, y2
  1003. LFDU b4, 1 * SIZE(X1)
  1004. FMADD3 y3, a2, b2, y3
  1005. LFDU a1, 1 * SIZE(AO1)
  1006. FMADD4 y4, a2, b1, y4
  1007. LFDU a2, 1 * SIZE(AO1)
  1008. FMADD1 y1, a1, b3, y1
  1009. FMADD2 y2, a1, b4, y2
  1010. FMADD3 y3, a2, b4, y3
  1011. FMADD4 y4, a2, b3, y4
  1012. .align 4
  1013. LL(35):
  1014. andi. r0, M, 2
  1015. ble LL(37)
  1016. LFDU a1, 1 * SIZE(AO1)
  1017. LFDU b1, 1 * SIZE(X1)
  1018. LFDU a2, 1 * SIZE(AO1)
  1019. LFDU b2, 1 * SIZE(X1)
  1020. FMADD1 y1, a1, b1, y1
  1021. LFDU b3, 1 * SIZE(X1)
  1022. FMADD2 y2, a1, b2, y2
  1023. LFDU a3, 1 * SIZE(AO1)
  1024. FMADD3 y3, a2, b2, y3
  1025. LFDU b4, 1 * SIZE(X1)
  1026. FMADD4 y4, a2, b1, y4
  1027. LFDU a4, 1 * SIZE(AO1)
  1028. FMADD1 y1, a3, b3, y1
  1029. FMADD2 y2, a3, b4, y2
  1030. FMADD3 y3, a4, b4, y3
  1031. FMADD4 y4, a4, b3, y4
  1032. .align 4
  1033. LL(37):
  1034. andi. r0, M, 1
  1035. ble LL(39)
  1036. LFDU a1, 1 * SIZE(AO1)
  1037. LFDU b1, 1 * SIZE(X1)
  1038. LFDU a2, 1 * SIZE(AO1)
  1039. LFDU b2, 1 * SIZE(X1)
  1040. FMADD1 y1, a1, b1, y1
  1041. FMADD2 y2, a1, b2, y2
  1042. FMADD3 y3, a2, b2, y3
  1043. FMADD4 y4, a2, b1, y4
  1044. .align 4
  1045. LL(39):
  1046. LFDUX b1, Y, INCY
  1047. LFDU b2, 1 * SIZE(Y)
  1048. FADD y1, y1, y3
  1049. FADD y2, y2, y4
  1050. FMADD b1, alpha_r, y1, b1
  1051. FMADDR b2, alpha_r, y2, b2
  1052. FMSUBR b1, alpha_i, y2, b1
  1053. FMADD b2, alpha_i, y1, b2
  1054. STFDUX b1, YY, INCY
  1055. STFDU b2, 1 * SIZE(YY)
  1056. .align 4
  1057. LL(999):
  1058. li r3, 0
  1059. lfd f14, 0(SP)
  1060. lfd f15, 8(SP)
  1061. lfd f16, 16(SP)
  1062. lfd f17, 24(SP)
  1063. lfd f18, 32(SP)
  1064. lfd f19, 40(SP)
  1065. lfd f20, 48(SP)
  1066. lfd f21, 56(SP)
  1067. lfd f22, 64(SP)
  1068. lfd f23, 72(SP)
  1069. lfd f24, 80(SP)
  1070. lfd f25, 88(SP)
  1071. lfd f26, 96(SP)
  1072. lfd f27, 104(SP)
  1073. lfd f28, 112(SP)
  1074. lfd f29, 120(SP)
  1075. lfd f30, 128(SP)
  1076. lfd f31, 136(SP)
  1077. #ifdef __64BIT__
  1078. ld r14, 144(SP)
  1079. ld r15, 152(SP)
  1080. ld r16, 160(SP)
  1081. ld r17, 168(SP)
  1082. ld r18, 176(SP)
  1083. ld r19, 184(SP)
  1084. ld r20, 192(SP)
  1085. ld r21, 200(SP)
  1086. ld r22, 208(SP)
  1087. #else
  1088. lwz r14, 144(SP)
  1089. lwz r15, 148(SP)
  1090. lwz r16, 152(SP)
  1091. lwz r17, 156(SP)
  1092. lwz r18, 160(SP)
  1093. lwz r19, 164(SP)
  1094. lwz r20, 168(SP)
  1095. lwz r21, 172(SP)
  1096. lwz r22, 176(SP)
  1097. #endif
  1098. addi SP, SP, STACKSIZE
  1099. blr
  1100. EPILOGUE
  1101. #endif