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_lsx.S 28 kB

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