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.

caxpby_lsx.S 25 kB

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