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.

axpby_lasx.S 25 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063
  1. /***************************************************************************
  2. Copyright (c) 2023, 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. #define ASSEMBLER
  28. #include "common.h"
  29. #define N $r4
  30. #define ALPHA $f0
  31. #define X $r5
  32. #define INCX $r6
  33. #define BETA $f1
  34. #define Y $r7
  35. #define INCY $r8
  36. #define I $r12
  37. #define TEMP $r13
  38. #define t1 $r14
  39. #define t2 $r16
  40. #define t3 $r15
  41. #define t4 $r17
  42. #define XX $r18
  43. #define YY $r19
  44. #define a1 $f12
  45. #define a2 $f13
  46. #define VX0 $xr8
  47. #define VX1 $xr20
  48. #define VX2 $xr21
  49. #define VX3 $xr22
  50. #define VXA $xr23
  51. #define VXB $xr9
  52. #define VXZ $xr19
  53. PROLOGUE
  54. bge $r0, N, .L999
  55. movgr2fr.d a1, $r0
  56. ffint.s.l a1, a1
  57. slli.d INCX, INCX, BASE_SHIFT
  58. slli.d INCY, INCY, BASE_SHIFT
  59. MTG t1, ALPHA
  60. MTG t2, BETA
  61. MTG t3, a1
  62. #ifdef DOUBLE
  63. xvreplgr2vr.d VXA, t1
  64. xvreplgr2vr.d VXB, t2
  65. xvreplgr2vr.d VXZ, t3
  66. #else
  67. xvreplgr2vr.w VXA, t1
  68. xvreplgr2vr.w VXB, t2
  69. xvreplgr2vr.w VXZ, t3
  70. #endif
  71. // If incx == 0 || incy == 0, do one by one
  72. and TEMP, INCX, INCY
  73. or I, N, N
  74. beqz TEMP, .L998
  75. li.d TEMP, 1
  76. slli.d TEMP, TEMP, BASE_SHIFT
  77. srai.d I, N, 3
  78. bne INCX, TEMP, .L20
  79. bne INCY, TEMP, .L12 // INCX==1 and INCY!=1
  80. b .L11 // INCX==1 and INCY==1
  81. .L20:
  82. bne INCY, TEMP, .L22 // INCX!=1 and INCY!=1
  83. b .L21 // INCX!=1 and INCY==1
  84. .L11:
  85. bge $r0, I, .L997
  86. CMPEQ $fcc0, ALPHA, a1
  87. bcnez $fcc0, .L110
  88. CMPEQ $fcc0, BETA, a1
  89. bcnez $fcc0, .L112 // ALPHA!=0 BETA==0
  90. b .L111 // ALPHA!=0 BETA!=0
  91. .align 3
  92. .L110:
  93. CMPEQ $fcc0, BETA, a1
  94. bcnez $fcc0, .L114 // ALPHA==0 BETA==0
  95. b .L113 // ALPHA==0 BETA!=0
  96. .align 3
  97. .L111: // ALPHA!=0 BETA!=0
  98. xvld VX0, X, 0 * SIZE
  99. #ifdef DOUBLE
  100. xvld VX2, Y, 0 * SIZE
  101. xvld VX1, X, 4 * SIZE
  102. xvld VX3, Y, 4 * SIZE
  103. xvfmul.d VX0, VX0, VXA
  104. xvfmul.d VX1, VX1, VXA
  105. xvfmadd.d VX2, VX2, VXB, VX0
  106. xvfmadd.d VX3, VX3, VXB, VX1
  107. addi.d I, I, -1
  108. xvst VX2, Y, 0 * SIZE
  109. xvst VX3, Y, 4 * SIZE
  110. #else
  111. xvld VX2, Y, 0 * SIZE
  112. xvfmul.s VX0, VX0, VXA
  113. addi.d I, I, -1
  114. xvfmadd.s VX2, VX2, VXB, VX0
  115. xvst VX2, Y, 0 * SIZE
  116. #endif
  117. addi.d X, X, 8 * SIZE
  118. addi.d Y, Y, 8 * SIZE
  119. blt $r0, I, .L111
  120. b .L997
  121. .align 3
  122. .L112: // ALPHA!=0 BETA==0
  123. xvld VX0, X, 0 * SIZE
  124. #ifdef DOUBLE
  125. xvld VX1, X, 4 * SIZE
  126. xvfmul.d VX0, VX0, VXA
  127. xvfmul.d VX1, VX1, VXA
  128. xvst VX0, Y, 0 * SIZE
  129. xvst VX1, Y, 4 * SIZE
  130. #else
  131. xvfmul.s VX0, VX0, VXA
  132. xvst VX0, Y, 0 * SIZE
  133. #endif
  134. addi.d I, I, -1
  135. addi.d X, X, 8 * SIZE
  136. addi.d Y, Y, 8 * SIZE
  137. blt $r0, I, .L112
  138. b .L997
  139. .align 3
  140. .L113: // ALPHA==0 BETA!=0
  141. xvld VX2, Y, 0 * SIZE
  142. #ifdef DOUBLE
  143. xvld VX3, Y, 4 * SIZE
  144. xvfmul.d VX2, VX2, VXB
  145. xvfmul.d VX3, VX3, VXB
  146. xvst VX2, Y, 0 * SIZE
  147. xvst VX3, Y, 4 * SIZE
  148. #else
  149. xvfmul.s VX2, VX2, VXB
  150. xvst VX2, Y, 0 * SIZE
  151. #endif
  152. addi.d I, I, -1
  153. addi.d Y, Y, 8 * SIZE
  154. blt $r0, I, .L113
  155. b .L997
  156. .align 3
  157. .L114: // ALPHA==0 BETA==0
  158. xvst VXZ, Y, 0 * SIZE
  159. #ifdef DOUBLE
  160. xvst VXZ, Y, 4 * SIZE
  161. #endif
  162. addi.d Y, Y, 8 * SIZE
  163. addi.d I, I, -1
  164. blt $r0, I, .L114
  165. b .L997
  166. .align 3
  167. .L12: // INCX==1 and INCY!=1
  168. bge $r0, I, .L997
  169. move YY, Y
  170. CMPEQ $fcc0, ALPHA, a1
  171. bcnez $fcc0, .L120
  172. CMPEQ $fcc0, BETA, a1
  173. bcnez $fcc0, .L122 // ALPHA!=0 BETA==0
  174. b .L121 // ALPHA!=0 BETA!=0
  175. .align 3
  176. .L120:
  177. CMPEQ $fcc0, BETA, a1
  178. bcnez $fcc0, .L124 // ALPHA==0 BETA==0
  179. b .L123 // ALPHA==0 BETA!=0
  180. .align 3
  181. .L121: // ALPHA!=0 BETA!=0
  182. xvld VX0, X, 0 * SIZE
  183. #ifdef DOUBLE
  184. ld.d t1, Y, 0 * SIZE
  185. add.d Y, Y, INCY
  186. ld.d t2, Y, 0 * SIZE
  187. add.d Y, Y, INCY
  188. ld.d t3, Y, 0 * SIZE
  189. add.d Y, Y, INCY
  190. ld.d t4, Y, 0 * SIZE
  191. xvinsgr2vr.d VX2, t1, 0
  192. xvinsgr2vr.d VX2, t2, 1
  193. xvinsgr2vr.d VX2, t3, 2
  194. xvinsgr2vr.d VX2, t4, 3
  195. add.d Y, Y, INCY
  196. xvfmul.d VX0, VX0, VXA
  197. xvld VX1, X, 4 * SIZE
  198. xvfmadd.d VX2, VX2, VXB, VX0
  199. ld.d t1, Y, 0 * SIZE
  200. add.d Y, Y, INCY
  201. ld.d t2, Y, 0 * SIZE
  202. add.d Y, Y, INCY
  203. ld.d t3, Y, 0 * SIZE
  204. add.d Y, Y, INCY
  205. ld.d t4, Y, 0 * SIZE
  206. add.d Y, Y, INCY
  207. xvinsgr2vr.d VX3, t1, 0
  208. xvinsgr2vr.d VX3, t2, 1
  209. xvinsgr2vr.d VX3, t3, 2
  210. xvinsgr2vr.d VX3, t4, 3
  211. xvstelm.d VX2, YY, 0, 0
  212. add.d YY, YY, INCY
  213. xvstelm.d VX2, YY, 0, 1
  214. add.d YY, YY, INCY
  215. xvstelm.d VX2, YY, 0, 2
  216. add.d YY, YY, INCY
  217. xvstelm.d VX2, YY, 0, 3
  218. add.d YY, YY, INCY
  219. xvfmul.d VX1, VX1, VXA
  220. xvfmadd.d VX3, VX3, VXB, VX1
  221. addi.d I, I, -1
  222. xvstelm.d VX3, YY, 0, 0
  223. add.d YY, YY, INCY
  224. xvstelm.d VX3, YY, 0, 1
  225. add.d YY, YY, INCY
  226. xvstelm.d VX3, YY, 0, 2
  227. add.d YY, YY, INCY
  228. xvstelm.d VX3, YY, 0, 3
  229. #else
  230. ld.w t1, Y, 0 * SIZE
  231. add.d Y, Y, INCY
  232. ld.w t2, Y, 0 * SIZE
  233. add.d Y, Y, INCY
  234. ld.w t3, Y, 0 * SIZE
  235. add.d Y, Y, INCY
  236. ld.w t4, Y, 0 * SIZE
  237. add.d Y, Y, INCY
  238. xvinsgr2vr.w VX2, t1, 0
  239. xvinsgr2vr.w VX2, t2, 1
  240. xvinsgr2vr.w VX2, t3, 2
  241. xvinsgr2vr.w VX2, t4, 3
  242. ld.w t1, Y, 0 * SIZE
  243. add.d Y, Y, INCY
  244. ld.w t2, Y, 0 * SIZE
  245. add.d Y, Y, INCY
  246. ld.w t3, Y, 0 * SIZE
  247. add.d Y, Y, INCY
  248. ld.w t4, Y, 0 * SIZE
  249. xvinsgr2vr.w VX2, t1, 4
  250. xvinsgr2vr.w VX2, t2, 5
  251. xvinsgr2vr.w VX2, t3, 6
  252. xvinsgr2vr.w VX2, t4, 7
  253. add.d Y, Y, INCY
  254. xvfmul.s VX0, VX0, VXA
  255. xvfmadd.s VX2, VX2, VXB, VX0
  256. xvstelm.w VX2, YY, 0, 0
  257. add.d YY, YY, INCY
  258. xvstelm.w VX2, YY, 0, 1
  259. add.d YY, YY, INCY
  260. xvstelm.w VX2, YY, 0, 2
  261. add.d YY, YY, INCY
  262. xvstelm.w VX2, YY, 0, 3
  263. add.d YY, YY, INCY
  264. xvstelm.w VX2, YY, 0, 4
  265. add.d YY, YY, INCY
  266. xvstelm.w VX2, YY, 0, 5
  267. add.d YY, YY, INCY
  268. xvstelm.w VX2, YY, 0, 6
  269. add.d YY, YY, INCY
  270. xvstelm.w VX2, YY, 0, 7
  271. #endif
  272. add.d YY, YY, INCY
  273. addi.d X, X, 8 * SIZE
  274. addi.d I, I, -1
  275. blt $r0, I, .L121
  276. move Y, YY
  277. b .L997
  278. .align 3
  279. .L122: // ALPHA!=0 BETA==0
  280. xvld VX0, X, 0 * SIZE
  281. #ifdef DOUBLE
  282. xvld VX1, X, 4 * SIZE
  283. xvfmul.d VX0, VX0, VXA
  284. xvfmul.d VX1, VX1, VXA
  285. xvstelm.d VX0, YY, 0, 0
  286. add.d YY, YY, INCY
  287. xvstelm.d VX0, YY, 0, 1
  288. add.d YY, YY, INCY
  289. xvstelm.d VX0, YY, 0, 2
  290. add.d YY, YY, INCY
  291. xvstelm.d VX0, YY, 0, 3
  292. add.d YY, YY, INCY
  293. xvstelm.d VX1, YY, 0, 0
  294. add.d YY, YY, INCY
  295. xvstelm.d VX1, YY, 0, 1
  296. add.d YY, YY, INCY
  297. xvstelm.d VX1, YY, 0, 2
  298. add.d YY, YY, INCY
  299. xvstelm.d VX1, YY, 0, 3
  300. #else
  301. xvfmul.s VX0, VX0, VXA
  302. addi.d I, I, -1
  303. xvstelm.w VX0, YY, 0, 0
  304. add.d YY, YY, INCY
  305. xvstelm.w VX0, YY, 0, 1
  306. add.d YY, YY, INCY
  307. xvstelm.w VX0, YY, 0, 2
  308. add.d YY, YY, INCY
  309. xvstelm.w VX0, YY, 0, 3
  310. add.d YY, YY, INCY
  311. xvstelm.w VX0, YY, 0, 4
  312. add.d YY, YY, INCY
  313. xvstelm.w VX0, YY, 0, 5
  314. add.d YY, YY, INCY
  315. xvstelm.w VX0, YY, 0, 6
  316. add.d YY, YY, INCY
  317. xvstelm.w VX0, YY, 0, 7
  318. #endif
  319. add.d YY, YY, INCY
  320. addi.d X, X, 8 * SIZE
  321. blt $r0, I, .L122
  322. move Y, YY
  323. b .L997
  324. .align 3
  325. .L123: // ALPHA==0 BETA!=0
  326. #ifdef DOUBLE
  327. ld.d t1, Y, 0 * SIZE
  328. add.d Y, Y, INCY
  329. ld.d t2, Y, 0 * SIZE
  330. add.d Y, Y, INCY
  331. ld.d t3, Y, 0 * SIZE
  332. add.d Y, Y, INCY
  333. ld.d t4, Y, 0 * SIZE
  334. xvinsgr2vr.d VX2, t1, 0
  335. xvinsgr2vr.d VX2, t2, 1
  336. xvinsgr2vr.d VX2, t3, 2
  337. xvinsgr2vr.d VX2, t4, 3
  338. add.d Y, Y, INCY
  339. xvfmul.d VX2, VX2, VXB
  340. ld.d t1, Y, 0 * SIZE
  341. add.d Y, Y, INCY
  342. ld.d t2, Y, 0 * SIZE
  343. add.d Y, Y, INCY
  344. ld.d t3, Y, 0 * SIZE
  345. add.d Y, Y, INCY
  346. ld.d t4, Y, 0 * SIZE
  347. add.d Y, Y, INCY
  348. xvinsgr2vr.d VX3, t1, 0
  349. xvinsgr2vr.d VX3, t2, 1
  350. xvinsgr2vr.d VX3, t3, 2
  351. xvinsgr2vr.d VX3, t4, 3
  352. xvstelm.d VX2, YY, 0, 0
  353. add.d YY, YY, INCY
  354. xvstelm.d VX2, YY, 0, 1
  355. add.d YY, YY, INCY
  356. xvstelm.d VX2, YY, 0, 2
  357. add.d YY, YY, INCY
  358. xvstelm.d VX2, YY, 0, 3
  359. add.d YY, YY, INCY
  360. xvfmul.d VX3, VX3, VXB
  361. xvstelm.d VX3, YY, 0, 0
  362. add.d YY, YY, INCY
  363. xvstelm.d VX3, YY, 0, 1
  364. add.d YY, YY, INCY
  365. xvstelm.d VX3, YY, 0, 2
  366. add.d YY, YY, INCY
  367. xvstelm.d VX3, YY, 0, 3
  368. #else
  369. ld.w t1, Y, 0 * SIZE
  370. add.d Y, Y, INCY
  371. ld.w t2, Y, 0 * SIZE
  372. add.d Y, Y, INCY
  373. ld.w t3, Y, 0 * SIZE
  374. add.d Y, Y, INCY
  375. ld.w t4, Y, 0 * SIZE
  376. add.d Y, Y, INCY
  377. xvinsgr2vr.w VX2, t1, 0
  378. xvinsgr2vr.w VX2, t2, 1
  379. xvinsgr2vr.w VX2, t3, 2
  380. xvinsgr2vr.w VX2, t4, 3
  381. ld.w t1, Y, 0 * SIZE
  382. add.d Y, Y, INCY
  383. ld.w t2, Y, 0 * SIZE
  384. add.d Y, Y, INCY
  385. ld.w t3, Y, 0 * SIZE
  386. add.d Y, Y, INCY
  387. ld.w t4, Y, 0 * SIZE
  388. xvinsgr2vr.w VX2, t1, 4
  389. xvinsgr2vr.w VX2, t2, 5
  390. xvinsgr2vr.w VX2, t3, 6
  391. xvinsgr2vr.w VX2, t4, 7
  392. add.d Y, Y, INCY
  393. xvfmul.s VX2, VX2, VXB
  394. xvstelm.w VX2, YY, 0, 0
  395. add.d YY, YY, INCY
  396. xvstelm.w VX2, YY, 0, 1
  397. add.d YY, YY, INCY
  398. xvstelm.w VX2, YY, 0, 2
  399. add.d YY, YY, INCY
  400. xvstelm.w VX2, YY, 0, 3
  401. add.d YY, YY, INCY
  402. xvstelm.w VX2, YY, 0, 4
  403. add.d YY, YY, INCY
  404. xvstelm.w VX2, YY, 0, 5
  405. add.d YY, YY, INCY
  406. xvstelm.w VX2, YY, 0, 6
  407. add.d YY, YY, INCY
  408. xvstelm.w VX2, YY, 0, 7
  409. #endif
  410. add.d YY, YY, INCY
  411. addi.d I, I, -1
  412. blt $r0, I, .L123
  413. move Y, YY
  414. b .L997
  415. .align 3
  416. .L124: // ALPHA==0 BETA==0
  417. #ifdef DOUBLE
  418. xvstelm.d VXZ, YY, 0, 0
  419. add.d YY, YY, INCY
  420. xvstelm.d VXZ, YY, 0, 1
  421. add.d YY, YY, INCY
  422. xvstelm.d VXZ, YY, 0, 2
  423. add.d YY, YY, INCY
  424. xvstelm.d VXZ, YY, 0, 3
  425. add.d YY, YY, INCY
  426. xvstelm.d VXZ, YY, 0, 0
  427. add.d YY, YY, INCY
  428. xvstelm.d VXZ, YY, 0, 1
  429. add.d YY, YY, INCY
  430. xvstelm.d VXZ, YY, 0, 2
  431. add.d YY, YY, INCY
  432. xvstelm.d VXZ, YY, 0, 3
  433. #else
  434. xvstelm.w VXZ, YY, 0, 0
  435. add.d YY, YY, INCY
  436. xvstelm.w VXZ, YY, 0, 1
  437. add.d YY, YY, INCY
  438. xvstelm.w VXZ, YY, 0, 2
  439. add.d YY, YY, INCY
  440. xvstelm.w VXZ, YY, 0, 3
  441. add.d YY, YY, INCY
  442. xvstelm.w VXZ, YY, 0, 4
  443. add.d YY, YY, INCY
  444. xvstelm.w VXZ, YY, 0, 5
  445. add.d YY, YY, INCY
  446. xvstelm.w VXZ, YY, 0, 6
  447. add.d YY, YY, INCY
  448. xvstelm.w VXZ, YY, 0, 7
  449. #endif
  450. add.d YY, YY, INCY
  451. addi.d I, I, -1
  452. blt $r0, I, .L124
  453. move Y, YY
  454. b .L997
  455. .align 3
  456. .L21:// INCX!=1 and INCY==1
  457. bge $r0, I, .L997
  458. CMPEQ $fcc0, ALPHA, a1
  459. bcnez $fcc0, .L210
  460. CMPEQ $fcc0, BETA, a1
  461. bcnez $fcc0, .L212 // ALPHA!=0 BETA==0
  462. b .L211 // ALPHA!=0 BETA!=0
  463. .align 3
  464. .L210:
  465. CMPEQ $fcc0, BETA, a1
  466. bcnez $fcc0, .L214 // ALPHA==0 BETA==0
  467. b .L213 // ALPHA==0 BETA!=0
  468. .align 3
  469. .L211: // ALPHA!=0 BETA!=0
  470. xvld VX2, Y, 0 * SIZE
  471. #ifdef DOUBLE
  472. ld.d t1, X, 0 * SIZE
  473. add.d X, X, INCX
  474. ld.d t2, X, 0 * SIZE
  475. add.d X, X, INCX
  476. ld.d t3, X, 0 * SIZE
  477. add.d X, X, INCX
  478. ld.d t4, X, 0 * SIZE
  479. xvinsgr2vr.d VX0, t1, 0
  480. xvinsgr2vr.d VX0, t2, 1
  481. xvinsgr2vr.d VX0, t3, 2
  482. xvinsgr2vr.d VX0, t4, 3
  483. add.d X, X, INCX
  484. xvfmul.d VX0, VXA, VX0
  485. xvfmadd.d VX2, VX2, VXB, VX0
  486. xvld VX3, Y, 4 * SIZE
  487. xvst VX2, Y, 0 * SIZE
  488. ld.d t1, X, 0 * SIZE
  489. add.d X, X, INCX
  490. ld.d t2, X, 0 * SIZE
  491. add.d X, X, INCX
  492. ld.d t3, X, 0 * SIZE
  493. add.d X, X, INCX
  494. ld.d t4, X, 0 * SIZE
  495. xvinsgr2vr.d VX1, t1, 0
  496. xvinsgr2vr.d VX1, t2, 1
  497. xvinsgr2vr.d VX1, t3, 2
  498. xvinsgr2vr.d VX1, t4, 3
  499. add.d X, X, INCX
  500. xvfmul.d VX1, VX1, VXA
  501. xvfmadd.d VX3, VX3, VXB, VX1
  502. addi.d I, I, -1
  503. xvst VX3, Y, 4 * SIZE
  504. #else
  505. ld.w t1, X, 0 * SIZE
  506. add.d X, X, INCX
  507. ld.w t2, X, 0 * SIZE
  508. add.d X, X, INCX
  509. ld.w t3, X, 0 * SIZE
  510. add.d X, X, INCX
  511. ld.w t4, X, 0 * SIZE
  512. add.d X, X, INCX
  513. xvinsgr2vr.w VX0, t1, 0
  514. xvinsgr2vr.w VX0, t2, 1
  515. xvinsgr2vr.w VX0, t3, 2
  516. xvinsgr2vr.w VX0, t4, 3
  517. ld.w t1, X, 0 * SIZE
  518. add.d X, X, INCX
  519. ld.w t2, X, 0 * SIZE
  520. add.d X, X, INCX
  521. ld.w t3, X, 0 * SIZE
  522. add.d X, X, INCX
  523. ld.w t4, X, 0 * SIZE
  524. xvinsgr2vr.w VX0, t1, 4
  525. xvinsgr2vr.w VX0, t2, 5
  526. xvinsgr2vr.w VX0, t3, 6
  527. xvinsgr2vr.w VX0, t4, 7
  528. add.d X, X, INCX
  529. xvfmul.s VX0, VXA, VX0
  530. xvfmadd.s VX2, VX2, VXB, VX0
  531. addi.d I, I, -1
  532. xvst VX2, Y, 0 * SIZE
  533. #endif
  534. addi.d Y, Y, 8 * SIZE
  535. blt $r0, I, .L211
  536. b .L997
  537. .align 3
  538. .L212: // ALPHA!=0 BETA==0
  539. #ifdef DOUBLE
  540. ld.d t1, X, 0 * SIZE
  541. add.d X, X, INCX
  542. ld.d t2, X, 0 * SIZE
  543. add.d X, X, INCX
  544. ld.d t3, X, 0 * SIZE
  545. add.d X, X, INCX
  546. ld.d t4, X, 0 * SIZE
  547. xvinsgr2vr.d VX0, t1, 0
  548. xvinsgr2vr.d VX0, t2, 1
  549. xvinsgr2vr.d VX0, t3, 2
  550. xvinsgr2vr.d VX0, t4, 3
  551. add.d X, X, INCX
  552. xvfmul.d VX0, VXA, VX0
  553. ld.d t1, X, 0 * SIZE
  554. add.d X, X, INCX
  555. ld.d t2, X, 0 * SIZE
  556. add.d X, X, INCX
  557. ld.d t3, X, 0 * SIZE
  558. add.d X, X, INCX
  559. ld.d t4, X, 0 * SIZE
  560. add.d X, X, INCX
  561. xvinsgr2vr.d VX1, t1, 0
  562. xvinsgr2vr.d VX1, t2, 1
  563. xvinsgr2vr.d VX1, t3, 2
  564. xvinsgr2vr.d VX1, t4, 3
  565. xvst VX0, Y, 0 * SIZE
  566. xvfmul.d VX1, VX1, VXA
  567. addi.d I, I, -1
  568. xvst VX1, Y, 4 * SIZE
  569. #else
  570. ld.w t1, X, 0 * SIZE
  571. add.d X, X, INCX
  572. ld.w t2, X, 0 * SIZE
  573. add.d X, X, INCX
  574. ld.w t3, X, 0 * SIZE
  575. add.d X, X, INCX
  576. ld.w t4, X, 0 * SIZE
  577. add.d X, X, INCX
  578. xvinsgr2vr.w VX0, t1, 0
  579. xvinsgr2vr.w VX0, t2, 1
  580. xvinsgr2vr.w VX0, t3, 2
  581. xvinsgr2vr.w VX0, t4, 3
  582. ld.w t1, X, 0 * SIZE
  583. add.d X, X, INCX
  584. ld.w t2, X, 0 * SIZE
  585. add.d X, X, INCX
  586. ld.w t3, X, 0 * SIZE
  587. add.d X, X, INCX
  588. ld.w t4, X, 0 * SIZE
  589. xvinsgr2vr.w VX0, t1, 4
  590. xvinsgr2vr.w VX0, t2, 5
  591. xvinsgr2vr.w VX0, t3, 6
  592. xvinsgr2vr.w VX0, t4, 7
  593. add.d X, X, INCX
  594. xvfmul.s VX0, VXA, VX0
  595. addi.d I, I, -1
  596. xvst VX0, Y, 0 * SIZE
  597. #endif
  598. addi.d Y, Y, 8 * SIZE
  599. blt $r0, I, .L212
  600. b .L997
  601. .align 3
  602. .L213: // ALPHA==0 BETA!=0
  603. xvld VX2, Y, 0 * SIZE
  604. #ifdef DOUBLE
  605. xvld VX3, Y, 4 * SIZE
  606. xvfmul.d VX2, VX2, VXB
  607. xvfmul.d VX3, VX3, VXB
  608. xvst VX2, Y, 0 * SIZE
  609. xvst VX3, Y, 4 * SIZE
  610. #else
  611. xvfmul.s VX2, VX2, VXB
  612. xvst VX2, Y, 0 * SIZE
  613. #endif
  614. addi.d Y, Y, 8 * SIZE
  615. addi.d I, I, -1
  616. blt $r0, I, .L213
  617. b .L997
  618. .align 3
  619. .L214: // ALPHA==0 BETA==0
  620. xvst VXZ, Y, 0 * SIZE
  621. #ifdef DOUBLE
  622. xvst VXZ, Y, 4 * SIZE
  623. #endif
  624. addi.d Y, Y, 8 * SIZE
  625. addi.d I, I, -1
  626. blt $r0, I, .L214
  627. b .L997
  628. .align 3
  629. .L22:
  630. bge $r0, I, .L997
  631. move YY, Y
  632. CMPEQ $fcc0, ALPHA, a1
  633. bcnez $fcc0, .L220
  634. CMPEQ $fcc0, BETA, a1
  635. bcnez $fcc0, .L222 // ALPHA!=0 BETA==0
  636. b .L221 // ALPHA!=0 BETA!=0
  637. .align 3
  638. .L220:
  639. CMPEQ $fcc0, BETA, a1
  640. bcnez $fcc0, .L224 // ALPHA==0 BETA==0
  641. b .L223 // ALPHA==0 BETA!=0
  642. .align 3
  643. .L221: // ALPHA!=0 BETA!=0
  644. #ifdef DOUBLE
  645. ld.d t1, X, 0 * SIZE
  646. add.d X, X, INCX
  647. ld.d t2, X, 0 * SIZE
  648. add.d X, X, INCX
  649. ld.d t3, X, 0 * SIZE
  650. add.d X, X, INCX
  651. ld.d t4, X, 0 * SIZE
  652. add.d X, X, INCX
  653. xvinsgr2vr.d VX0, t1, 0
  654. xvinsgr2vr.d VX0, t2, 1
  655. xvinsgr2vr.d VX0, t3, 2
  656. xvinsgr2vr.d VX0, t4, 3
  657. ld.d t1, Y, 0 * SIZE
  658. add.d Y, Y, INCY
  659. ld.d t2, Y, 0 * SIZE
  660. add.d Y, Y, INCY
  661. ld.d t3, Y, 0 * SIZE
  662. add.d Y, Y, INCY
  663. ld.d t4, Y, 0 * SIZE
  664. xvinsgr2vr.d VX2, t1, 0
  665. xvinsgr2vr.d VX2, t2, 1
  666. xvinsgr2vr.d VX2, t3, 2
  667. xvinsgr2vr.d VX2, t4, 3
  668. add.d Y, Y, INCY
  669. xvfmul.d VX0, VX0, VXA
  670. ld.d t1, X, 0 * SIZE
  671. add.d X, X, INCX
  672. xvfmadd.d VX2, VX2, VXB, VX0
  673. ld.d t2, X, 0 * SIZE
  674. add.d X, X, INCX
  675. ld.d t3, X, 0 * SIZE
  676. add.d X, X, INCX
  677. ld.d t4, X, 0 * SIZE
  678. add.d X, X, INCX
  679. xvinsgr2vr.d VX1, t1, 0
  680. xvinsgr2vr.d VX1, t2, 1
  681. xvinsgr2vr.d VX1, t3, 2
  682. xvinsgr2vr.d VX1, t4, 3
  683. xvstelm.d VX2, YY, 0, 0
  684. add.d YY, YY, INCY
  685. xvstelm.d VX2, YY, 0, 1
  686. add.d YY, YY, INCY
  687. xvstelm.d VX2, YY, 0, 2
  688. add.d YY, YY, INCY
  689. xvstelm.d VX2, YY, 0, 3
  690. add.d YY, YY, INCY
  691. ld.d t1, Y, 0 * SIZE
  692. xvinsgr2vr.d VX3, t1, 0
  693. add.d Y, Y, INCY
  694. ld.d t2, Y, 0 * SIZE
  695. add.d Y, Y, INCY
  696. ld.d t3, Y, 0 * SIZE
  697. add.d Y, Y, INCY
  698. ld.d t4, Y, 0 * SIZE
  699. xvinsgr2vr.d VX3, t2, 1
  700. xvinsgr2vr.d VX3, t3, 2
  701. xvinsgr2vr.d VX3, t4, 3
  702. add.d Y, Y, INCY
  703. xvfmul.d VX1, VX1, VXA
  704. xvfmadd.d VX3, VX3, VXB, VX1
  705. addi.d I, I, -1
  706. xvstelm.d VX3, YY, 0, 0
  707. add.d YY, YY, INCY
  708. xvstelm.d VX3, YY, 0, 1
  709. add.d YY, YY, INCY
  710. xvstelm.d VX3, YY, 0, 2
  711. add.d YY, YY, INCY
  712. xvstelm.d VX3, YY, 0, 3
  713. #else
  714. ld.w t1, X, 0 * SIZE
  715. add.d X, X, INCX
  716. ld.w t2, X, 0 * SIZE
  717. add.d X, X, INCX
  718. ld.w t3, X, 0 * SIZE
  719. add.d X, X, INCX
  720. ld.w t4, X, 0 * SIZE
  721. add.d X, X, INCX
  722. xvinsgr2vr.w VX0, t1, 0
  723. xvinsgr2vr.w VX0, t2, 1
  724. xvinsgr2vr.w VX0, t3, 2
  725. xvinsgr2vr.w VX0, t4, 3
  726. ld.w t1, X, 0 * SIZE
  727. add.d X, X, INCX
  728. ld.w t2, X, 0 * SIZE
  729. add.d X, X, INCX
  730. ld.w t3, X, 0 * SIZE
  731. add.d X, X, INCX
  732. ld.w t4, X, 0 * SIZE
  733. xvinsgr2vr.w VX0, t1, 4
  734. xvinsgr2vr.w VX0, t2, 5
  735. xvinsgr2vr.w VX0, t3, 6
  736. xvinsgr2vr.w VX0, t4, 7
  737. add.d X, X, INCX
  738. ld.w t1, Y, 0 * SIZE
  739. add.d Y, Y, INCY
  740. ld.w t2, Y, 0 * SIZE
  741. add.d Y, Y, INCY
  742. ld.w t3, Y, 0 * SIZE
  743. add.d Y, Y, INCY
  744. ld.w t4, Y, 0 * SIZE
  745. xvinsgr2vr.w VX2, t1, 0
  746. xvinsgr2vr.w VX2, t2, 1
  747. xvinsgr2vr.w VX2, t3, 2
  748. xvinsgr2vr.w VX2, t4, 3
  749. add.d Y, Y, INCY
  750. ld.w t1, Y, 0 * SIZE
  751. add.d Y, Y, INCY
  752. ld.w t2, Y, 0 * SIZE
  753. add.d Y, Y, INCY
  754. ld.w t3, Y, 0 * SIZE
  755. add.d Y, Y, INCY
  756. ld.w t4, Y, 0 * SIZE
  757. xvinsgr2vr.w VX2, t1, 4
  758. xvinsgr2vr.w VX2, t2, 5
  759. xvinsgr2vr.w VX2, t3, 6
  760. xvinsgr2vr.w VX2, t4, 7
  761. add.d Y, Y, INCY
  762. xvfmul.s VX0, VX0, VXA
  763. xvfmadd.s VX2, VX2, VXB, VX0
  764. addi.d I, I, -1
  765. xvstelm.w VX2, YY, 0, 0
  766. add.d YY, YY, INCY
  767. xvstelm.w VX2, YY, 0, 1
  768. add.d YY, YY, INCY
  769. xvstelm.w VX2, YY, 0, 2
  770. add.d YY, YY, INCY
  771. xvstelm.w VX2, YY, 0, 3
  772. add.d YY, YY, INCY
  773. xvstelm.w VX2, YY, 0, 4
  774. add.d YY, YY, INCY
  775. xvstelm.w VX2, YY, 0, 5
  776. add.d YY, YY, INCY
  777. xvstelm.w VX2, YY, 0, 6
  778. add.d YY, YY, INCY
  779. xvstelm.w VX2, YY, 0, 7
  780. #endif
  781. add.d YY, YY, INCY
  782. blt $r0, I, .L221
  783. move Y, YY
  784. b .L997
  785. .align 3
  786. .L222: // ALPHA!=0 BETA==0
  787. #ifdef DOUBLE
  788. ld.d t1, X, 0 * SIZE
  789. add.d X, X, INCX
  790. ld.d t2, X, 0 * SIZE
  791. add.d X, X, INCX
  792. ld.d t3, X, 0 * SIZE
  793. add.d X, X, INCX
  794. ld.d t4, X, 0 * SIZE
  795. xvinsgr2vr.d VX0, t1, 0
  796. xvinsgr2vr.d VX0, t2, 1
  797. xvinsgr2vr.d VX0, t3, 2
  798. xvinsgr2vr.d VX0, t4, 3
  799. add.d X, X, INCX
  800. xvfmul.d VX0, VX0, VXA
  801. ld.d t1, X, 0 * SIZE
  802. add.d X, X, INCX
  803. ld.d t2, X, 0 * SIZE
  804. add.d X, X, INCX
  805. ld.d t3, X, 0 * SIZE
  806. add.d X, X, INCX
  807. ld.d t4, X, 0 * SIZE
  808. add.d X, X, INCX
  809. xvinsgr2vr.d VX1, t1, 0
  810. xvinsgr2vr.d VX1, t2, 1
  811. xvinsgr2vr.d VX1, t3, 2
  812. xvinsgr2vr.d VX1, t4, 3
  813. xvstelm.d VX0, YY, 0, 0
  814. add.d YY, YY, INCY
  815. xvstelm.d VX0, YY, 0, 1
  816. add.d YY, YY, INCY
  817. xvstelm.d VX0, YY, 0, 2
  818. add.d YY, YY, INCY
  819. xvstelm.d VX0, YY, 0, 3
  820. add.d YY, YY, INCY
  821. xvfmul.d VX1, VX1, VXA
  822. addi.d I, I, -1
  823. xvstelm.d VX1, YY, 0, 0
  824. add.d YY, YY, INCY
  825. xvstelm.d VX1, YY, 0, 1
  826. add.d YY, YY, INCY
  827. xvstelm.d VX1, YY, 0, 2
  828. add.d YY, YY, INCY
  829. xvstelm.d VX1, YY, 0, 3
  830. #else
  831. ld.w t1, X, 0 * SIZE
  832. add.d X, X, INCX
  833. ld.w t2, X, 0 * SIZE
  834. add.d X, X, INCX
  835. ld.w t3, X, 0 * SIZE
  836. add.d X, X, INCX
  837. ld.w t4, X, 0 * SIZE
  838. xvinsgr2vr.w VX0, t1, 0
  839. xvinsgr2vr.w VX0, t2, 1
  840. xvinsgr2vr.w VX0, t3, 2
  841. xvinsgr2vr.w VX0, t4, 3
  842. add.d X, X, INCX
  843. ld.w t1, X, 0 * SIZE
  844. add.d X, X, INCX
  845. ld.w t2, X, 0 * SIZE
  846. add.d X, X, INCX
  847. ld.w t3, X, 0 * SIZE
  848. add.d X, X, INCX
  849. ld.w t4, X, 0 * SIZE
  850. xvinsgr2vr.w VX0, t1, 4
  851. xvinsgr2vr.w VX0, t2, 5
  852. xvinsgr2vr.w VX0, t3, 6
  853. xvinsgr2vr.w VX0, t4, 7
  854. add.d X, X, INCX
  855. xvfmul.s VX0, VX0, VXA
  856. addi.d I, I, -1
  857. xvstelm.w VX0, YY, 0, 0
  858. add.d YY, YY, INCY
  859. xvstelm.w VX0, YY, 0, 1
  860. add.d YY, YY, INCY
  861. xvstelm.w VX0, YY, 0, 2
  862. add.d YY, YY, INCY
  863. xvstelm.w VX0, YY, 0, 3
  864. add.d YY, YY, INCY
  865. xvstelm.w VX0, YY, 0, 4
  866. add.d YY, YY, INCY
  867. xvstelm.w VX0, YY, 0, 5
  868. add.d YY, YY, INCY
  869. xvstelm.w VX0, YY, 0, 6
  870. add.d YY, YY, INCY
  871. xvstelm.w VX0, YY, 0, 7
  872. #endif
  873. add.d YY, YY, INCY
  874. blt $r0, I, .L222
  875. move Y, YY
  876. b .L997
  877. .align 3
  878. .L223: // ALPHA==0 BETA!=0
  879. #ifdef DOUBLE
  880. ld.d t1, Y, 0 * SIZE
  881. add.d Y, Y, INCY
  882. ld.d t2, Y, 0 * SIZE
  883. add.d Y, Y, INCY
  884. ld.d t3, Y, 0 * SIZE
  885. add.d Y, Y, INCY
  886. ld.d t4, Y, 0 * SIZE
  887. xvinsgr2vr.d VX2, t1, 0
  888. xvinsgr2vr.d VX2, t2, 1
  889. xvinsgr2vr.d VX2, t3, 2
  890. xvinsgr2vr.d VX2, t4, 3
  891. add.d Y, Y, INCY
  892. xvfmul.d VX2, VX2, VXB
  893. ld.d t1, Y, 0 * SIZE
  894. add.d Y, Y, INCY
  895. ld.d t2, Y, 0 * SIZE
  896. add.d Y, Y, INCY
  897. ld.d t3, Y, 0 * SIZE
  898. add.d Y, Y, INCY
  899. ld.d t4, Y, 0 * SIZE
  900. add.d Y, Y, INCY
  901. xvinsgr2vr.d VX3, t1, 0
  902. xvinsgr2vr.d VX3, t2, 1
  903. xvinsgr2vr.d VX3, t3, 2
  904. xvinsgr2vr.d VX3, t4, 3
  905. xvstelm.d VX2, YY, 0, 0
  906. add.d YY, YY, INCY
  907. xvstelm.d VX2, YY, 0, 1
  908. add.d YY, YY, INCY
  909. xvstelm.d VX2, YY, 0, 2
  910. add.d YY, YY, INCY
  911. xvstelm.d VX2, YY, 0, 3
  912. add.d YY, YY, INCY
  913. xvfmul.d VX3, VX3, VXB
  914. addi.d I, I, -1
  915. xvstelm.d VX3, YY, 0, 0
  916. add.d YY, YY, INCY
  917. xvstelm.d VX3, YY, 0, 1
  918. add.d YY, YY, INCY
  919. xvstelm.d VX3, YY, 0, 2
  920. add.d YY, YY, INCY
  921. xvstelm.d VX3, YY, 0, 3
  922. #else
  923. ld.w t1, Y, 0 * SIZE
  924. add.d Y, Y, INCY
  925. ld.w t2, Y, 0 * SIZE
  926. add.d Y, Y, INCY
  927. ld.w t3, Y, 0 * SIZE
  928. add.d Y, Y, INCY
  929. ld.w t4, Y, 0 * SIZE
  930. add.d Y, Y, INCY
  931. xvinsgr2vr.w VX2, t1, 0
  932. xvinsgr2vr.w VX2, t2, 1
  933. xvinsgr2vr.w VX2, t3, 2
  934. xvinsgr2vr.w VX2, t4, 3
  935. ld.w t1, Y, 0 * SIZE
  936. add.d Y, Y, INCY
  937. ld.w t2, Y, 0 * SIZE
  938. add.d Y, Y, INCY
  939. ld.w t3, Y, 0 * SIZE
  940. add.d Y, Y, INCY
  941. ld.w t4, Y, 0 * SIZE
  942. xvinsgr2vr.w VX2, t1, 4
  943. xvinsgr2vr.w VX2, t2, 5
  944. xvinsgr2vr.w VX2, t3, 6
  945. xvinsgr2vr.w VX2, t4, 7
  946. add.d Y, Y, INCY
  947. xvfmul.s VX2, VX2, VXB
  948. addi.d I, I, -1
  949. xvstelm.w VX2, YY, 0, 0
  950. add.d YY, YY, INCY
  951. xvstelm.w VX2, YY, 0, 1
  952. add.d YY, YY, INCY
  953. xvstelm.w VX2, YY, 0, 2
  954. add.d YY, YY, INCY
  955. xvstelm.w VX2, YY, 0, 3
  956. add.d YY, YY, INCY
  957. xvstelm.w VX2, YY, 0, 4
  958. add.d YY, YY, INCY
  959. xvstelm.w VX2, YY, 0, 5
  960. add.d YY, YY, INCY
  961. xvstelm.w VX2, YY, 0, 6
  962. add.d YY, YY, INCY
  963. xvstelm.w VX2, YY, 0, 7
  964. #endif
  965. add.d YY, YY, INCY
  966. blt $r0, I, .L223
  967. move Y, YY
  968. b .L997
  969. .align 3
  970. .L224: // ALPHA==0 BETA==0
  971. #ifdef DOUBLE
  972. xvstelm.d VXZ, YY, 0, 0
  973. add.d YY, YY, INCY
  974. xvstelm.d VXZ, YY, 0, 1
  975. add.d YY, YY, INCY
  976. xvstelm.d VXZ, YY, 0, 2
  977. add.d YY, YY, INCY
  978. xvstelm.d VXZ, YY, 0, 3
  979. add.d YY, YY, INCY
  980. xvstelm.d VXZ, YY, 0, 0
  981. add.d YY, YY, INCY
  982. xvstelm.d VXZ, YY, 0, 1
  983. add.d YY, YY, INCY
  984. xvstelm.d VXZ, YY, 0, 2
  985. add.d YY, YY, INCY
  986. xvstelm.d VXZ, YY, 0, 3
  987. #else
  988. xvstelm.w VXZ, YY, 0, 0
  989. add.d YY, YY, INCY
  990. xvstelm.w VXZ, YY, 0, 1
  991. add.d YY, YY, INCY
  992. xvstelm.w VXZ, YY, 0, 2
  993. add.d YY, YY, INCY
  994. xvstelm.w VXZ, YY, 0, 3
  995. add.d YY, YY, INCY
  996. xvstelm.w VXZ, YY, 0, 4
  997. add.d YY, YY, INCY
  998. xvstelm.w VXZ, YY, 0, 5
  999. add.d YY, YY, INCY
  1000. xvstelm.w VXZ, YY, 0, 6
  1001. add.d YY, YY, INCY
  1002. xvstelm.w VXZ, YY, 0, 7
  1003. #endif
  1004. add.d YY, YY, INCY
  1005. addi.d I, I, -1
  1006. blt $r0, I, .L224
  1007. move Y, YY
  1008. b .L997
  1009. .align 3
  1010. .L997:
  1011. andi I, N, 7
  1012. bge $r0, I, .L999
  1013. .align 3
  1014. .L998:
  1015. LD $f12, X, 0 * SIZE
  1016. LD $f13, Y, 0 * SIZE
  1017. addi.d I, I, -1
  1018. MUL $f12, $f12, ALPHA
  1019. MADD $f13, $f13, BETA, $f12
  1020. ST $f13, Y, 0 * SIZE
  1021. add.d X, X, INCX
  1022. add.d Y, Y, INCY
  1023. blt $r0, I, .L998
  1024. .align 3
  1025. .L999:
  1026. move $r4, $r12
  1027. jirl $r0, $r1, 0x0
  1028. .align 3
  1029. EPILOGUE