aorsmul_1.asm
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:10k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. dnl  Alpha ev6 mpn_addmul_1 and mpn_submul_1.
  2. dnl  Copyright 2000, 2003, 2004, 2005, 2008 Free Software Foundation, Inc.
  3. dnl  This file is part of the GNU MP Library.
  4. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  5. dnl  it under the terms of the GNU Lesser General Public License as published
  6. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  7. dnl  your option) any later version.
  8. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  9. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  11. dnl  License for more details.
  12. dnl  You should have received a copy of the GNU Lesser General Public License
  13. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  14. include(`../config.m4')
  15. C      cycles/limb
  16. C EV4:    42
  17. C EV5:    18
  18. C EV6:     3.5
  19. C  INPUT PARAMETERS
  20. define(`rp', `r16')
  21. define(`up', `r17')
  22. define(`n', `r18')
  23. define(`v0', `r19')
  24. dnl  This code was written in cooperation with ev6 pipeline expert Steve Root.
  25. dnl  The stores can issue a cycle late so we have paired no-op's to 'catch'
  26. dnl  them, so that further disturbance to the schedule is damped.
  27. dnl  We couldn't pair the loads, because the entangled schedule of the carry's
  28. dnl  has to happen on one side {0} of the machine.
  29. dnl  This is a great schedule for the d_cache, a poor schedule for the b_cache.
  30. dnl  The lockup on U0 means that any stall can't be recovered from.  Consider a
  31. dnl  ldq in L1, say that load gets stalled because it collides with a fill from
  32. dnl  the b_cache.  On the next cycle, this load gets priority.  If first looks
  33. dnl  at L0, and goes there.  The instruction we intended for L0 gets to look at
  34. dnl  L1, which is NOT where we want it.  It either stalls 1, because it can't
  35. dnl  go in L0, or goes there, and causes a further instruction to stall.
  36. dnl  So for b_cache, we're likely going to want to put one or more cycles back
  37. dnl  into the code! And, of course, put in lds prefetch for the rp[] operand.
  38. dnl  At a place where we have an mt followed by a bookkeeping, put the
  39. dnl  bookkeeping in upper, and the prefetch into lower.
  40. dnl  Note, the ldq's and stq's are at the end of the quadpacks.  Note, we'd
  41. dnl  like not to have an ldq or an stq to preceded a conditional branch in a
  42. dnl  quadpack.  The conditional branch moves the retire pointer one cycle
  43. dnl  later.
  44. ifdef(`OPERATION_addmul_1',`
  45.     define(`ADDSUB', `addq')
  46.     define(`CMPCY', `cmpult $2,$1')
  47.     define(`func', `mpn_addmul_1')
  48. ')
  49. ifdef(`OPERATION_submul_1',`
  50.     define(`ADDSUB', `subq')
  51.     define(`CMPCY', `cmpult $1,$2')
  52.     define(`func', `mpn_submul_1')
  53. ')
  54. MULFUNC_PROLOGUE(mpn_addmul_1 mpn_submul_1)
  55. ASM_START()
  56. PROLOGUE(func)
  57. ldq r3, 0(up) C
  58. and r18, 7, r20 C
  59. lda r18, -9(r18) C
  60. cmpeq r20, 1, r21 C
  61. beq r21, $L1 C
  62. $1mod8: ldq r5, 0(rp) C
  63. mulq v0, r3, r7 C
  64. umulh v0, r3, r8 C
  65. ADDSUB r5, r7, r23 C
  66. CMPCY( r5, r23), r20 C
  67. addq r8, r20, r0 C
  68. stq r23, 0(rp) C
  69. bge r18, $ent1 C
  70. ret r31, (r26), 1 C
  71. $L1: lda r8, 0(r31) C zero carry reg
  72. lda r24, 0(r31) C zero carry reg
  73. cmpeq r20, 2, r21 C
  74. bne r21, $2mod8 C
  75. cmpeq r20, 3, r21 C
  76. bne r21, $3mod8 C
  77. cmpeq r20, 4, r21 C
  78. bne r21, $4mod8 C
  79. cmpeq r20, 5, r21 C
  80. bne r21, $5mod8 C
  81. cmpeq r20, 6, r21 C
  82. bne r21, $6mod8 C
  83. cmpeq r20, 7, r21 C
  84. beq r21, $0mod8 C
  85. $7mod8: ldq r5, 0(rp) C
  86. lda up, 8(up) C
  87. mulq v0, r3, r7 C
  88. umulh v0, r3, r24 C
  89. ADDSUB r5, r7, r23 C
  90. CMPCY( r5, r23), r20 C
  91. addq r24, r20, r24 C
  92. stq r23, 0(rp) C
  93. lda rp, 8(rp) C
  94. ldq r3, 0(up) C
  95. $6mod8: ldq r1, 8(up) C
  96. mulq v0, r3, r25 C
  97. umulh v0, r3, r3 C
  98. mulq v0, r1, r28 C
  99. ldq r0, 16(up) C
  100. ldq r4, 0(rp) C
  101. umulh v0, r1, r8 C
  102. ldq r1, 24(up) C
  103. lda up, 48(up) C L1 bookkeeping
  104. mulq v0, r0, r2 C
  105. ldq r5, 8(rp) C
  106. lda rp, -32(rp) C L1 bookkeeping
  107. umulh v0, r0, r6 C
  108. ADDSUB r4, r25, r25 C lo + acc
  109. mulq v0, r1, r7 C
  110. br r31, $ent6 C
  111. $ent1: lda up, 8(up) C
  112. lda rp, 8(rp) C
  113. lda r8, 0(r0) C
  114. ldq r3, 0(up) C
  115. $0mod8: ldq r1, 8(up) C
  116. mulq v0, r3, r2 C
  117. umulh v0, r3, r6 C
  118. mulq v0, r1, r7 C
  119. ldq r0, 16(up) C
  120. ldq r4, 0(rp) C
  121. umulh v0, r1, r24 C
  122. ldq r1, 24(up) C
  123. mulq v0, r0, r25 C
  124. ldq r5, 8(rp) C
  125. umulh v0, r0, r3 C
  126. ADDSUB r4, r2, r2 C lo + acc
  127. mulq v0, r1, r28 C
  128. lda rp, -16(rp) C
  129. br r31, $ent0 C
  130. $3mod8: ldq r5, 0(rp) C
  131. lda up, 8(up) C
  132. mulq v0, r3, r7 C
  133. umulh v0, r3, r8 C
  134. ADDSUB r5, r7, r23 C
  135. CMPCY( r5, r23), r20 C
  136. addq r8, r20, r24 C
  137. stq r23, 0(rp) C
  138. lda rp, 8(rp) C
  139. ldq r3, 0(up) C
  140. $2mod8: ldq r1, 8(up) C
  141. mulq v0, r3, r25 C
  142. umulh v0, r3, r3 C
  143. mulq v0, r1, r28 C
  144. ble r18, $n23 C
  145. ldq r0, 16(up) C
  146. ldq r4, 0(rp) C
  147. umulh v0, r1, r8 C
  148. ldq r1, 24(up) C
  149. lda up, 16(up) C L1 bookkeeping
  150. mulq v0, r0, r2 C
  151. ldq r5, 8(rp) C
  152. lda rp, 0(rp) C L1 bookkeeping
  153. umulh v0, r0, r6 C
  154. ADDSUB r4, r25, r25 C lo + acc
  155. mulq v0, r1, r7 C
  156. br r31, $ent2 C
  157. $5mod8: ldq r5, 0(rp) C
  158. lda up, 8(up) C
  159. mulq v0, r3, r7 C
  160. umulh v0, r3, r24 C
  161. ADDSUB r5, r7, r23 C
  162. CMPCY( r5, r23), r20 C
  163. addq r24, r20, r8 C
  164. stq r23, 0(rp) C
  165. lda rp, 8(rp) C
  166. ldq r3, 0(up) C
  167. $4mod8: ldq r1, 8(up) C
  168. mulq v0, r3, r2 C
  169. umulh v0, r3, r6 C
  170. mulq v0, r1, r7 C
  171. ldq r0, 16(up) C
  172. ldq r4, 0(rp) C
  173. umulh v0, r1, r24 C
  174. ldq r1, 24(up) C
  175. lda up, 32(up) C L1 bookkeeping
  176. mulq v0, r0, r25 C
  177. ldq r5, 8(rp) C
  178. lda rp, 16(rp) C L1 bookkeeping
  179. umulh v0, r0, r3 C
  180. ADDSUB r4, r2, r2 C lo + acc
  181. mulq v0, r1, r28 C
  182. CMPCY( r4, r2), r20 C L0 lo add => carry
  183. ADDSUB r2, r8, r22 C U0 hi add => answer
  184. ble r18, $Lend C
  185. ALIGN(16)
  186. $Loop:
  187. bis r31, r31, r31 C U1 mt
  188. CMPCY( r2, r22), r21 C L0 hi add => carry
  189. addq r6, r20, r6 C U0 hi mul + carry
  190. ldq r0, 0(up) C
  191. bis r31, r31, r31 C U1 mt
  192. ADDSUB r5, r7, r7 C L0 lo + acc
  193. addq r6, r21, r6 C U0 hi mul + carry
  194. ldq r4, 0(rp) C L1
  195. umulh v0, r1, r8 C U1
  196. CMPCY( r5, r7), r20 C L0 lo add => carry
  197. ADDSUB r7, r6, r23 C U0 hi add => answer
  198. ldq r1, 8(up) C L1
  199. mulq v0, r0, r2 C U1
  200. CMPCY( r7, r23), r21 C L0 hi add => carry
  201. addq r24, r20, r24 C U0 hi mul + carry
  202. ldq r5, 8(rp) C L1
  203. umulh v0, r0, r6 C U1
  204. ADDSUB r4, r25, r25 C U0 lo + acc
  205. stq r22, -16(rp) C L0
  206. stq r23, -8(rp) C L1
  207. bis r31, r31, r31 C L0 st slosh
  208. mulq v0, r1, r7 C U1
  209. bis r31, r31, r31 C L1 st slosh
  210. addq r24, r21, r24 C U0 hi mul + carry
  211. $ent2:
  212. CMPCY( r4, r25), r20 C L0 lo add => carry
  213. bis r31, r31, r31 C U1 mt
  214. lda r18, -8(r18) C L1 bookkeeping
  215. ADDSUB r25, r24, r22 C U0 hi add => answer
  216. bis r31, r31, r31 C U1 mt
  217. CMPCY( r25, r22), r21 C L0 hi add => carry
  218. addq r3, r20, r3 C U0 hi mul + carry
  219. ldq r0, 16(up) C L1
  220. bis r31, r31, r31 C U1 mt
  221. ADDSUB r5, r28, r28 C L0 lo + acc
  222. addq r3, r21, r3 C U0 hi mul + carry
  223. ldq r4, 16(rp) C L1
  224. umulh v0, r1, r24 C U1
  225. CMPCY( r5, r28), r20 C L0 lo add => carry
  226. ADDSUB r28, r3, r23 C U0 hi add => answer
  227. ldq r1, 24(up) C L1
  228. mulq v0, r0, r25 C U1
  229. CMPCY( r28, r23), r21 C L0 hi add => carry
  230. addq r8, r20, r8 C U0 hi mul + carry
  231. ldq r5, 24(rp) C L1
  232. umulh v0, r0, r3 C U1
  233. ADDSUB r4, r2, r2 C U0 lo + acc
  234. stq r22, 0(rp) C L0
  235. stq r23, 8(rp) C L1
  236. bis r31, r31, r31 C L0 st slosh
  237. mulq v0, r1, r28 C U1
  238. bis r31, r31, r31 C L1 st slosh
  239. addq r8, r21, r8 C U0 hi mul + carry
  240. $ent0:
  241. CMPCY( r4, r2), r20 C L0 lo add => carry
  242. bis r31, r31, r31 C U1 mt
  243. lda up, 64(up) C L1 bookkeeping
  244. ADDSUB r2, r8, r22 C U0 hi add => answer
  245. bis r31, r31, r31 C U1 mt
  246. CMPCY( r2, r22), r21 C L0 hi add => carry
  247. addq r6, r20, r6 C U0 hi mul + carry
  248. ldq r0, -32(up) C L1
  249. bis r31, r31, r31 C U1 mt
  250. ADDSUB r5, r7, r7 C L0 lo + acc
  251. addq r6, r21, r6 C U0 hi mul + carry
  252. ldq r4, 32(rp) C L1
  253. umulh v0, r1, r8 C U1
  254. CMPCY( r5, r7), r20 C L0 lo add => carry
  255. ADDSUB r7, r6, r23 C U0 hi add => answer
  256. ldq r1, -24(up) C L1
  257. mulq v0, r0, r2 C U1
  258. CMPCY( r7, r23), r21 C L0 hi add => carry
  259. addq r24, r20, r24 C U0 hi mul + carry
  260. ldq r5, 40(rp) C L1
  261. umulh v0, r0, r6 C U1
  262. ADDSUB r4, r25, r25 C U0 lo + acc
  263. stq r22, 16(rp) C L0
  264. stq r23, 24(rp) C L1
  265. bis r31, r31, r31 C L0 st slosh
  266. mulq v0, r1, r7 C U1
  267. bis r31, r31, r31 C L1 st slosh
  268. addq r24, r21, r24 C U0 hi mul + carry
  269. $ent6:
  270. CMPCY( r4, r25), r20 C L0 lo add => carry
  271. bis r31, r31, r31 C U1 mt
  272. lda rp, 64(rp) C L1 bookkeeping
  273. ADDSUB r25, r24, r22 C U0 hi add => answer
  274. bis r31, r31, r31 C U1 mt
  275. CMPCY( r25, r22), r21 C L0 hi add => carry
  276. addq r3, r20, r3 C U0 hi mul + carry
  277. ldq r0, -16(up) C L1
  278. bis r31, r31, r31 C U1 mt
  279. ADDSUB r5, r28, r28 C L0 lo + acc
  280. addq r3, r21, r3 C U0 hi mul + carry
  281. ldq r4, -16(rp) C L1
  282. umulh v0, r1, r24 C U1
  283. CMPCY( r5, r28), r20 C L0 lo add => carry
  284. ADDSUB r28, r3, r23 C U0 hi add => answer
  285. ldq r1, -8(up) C L1
  286. mulq v0, r0, r25 C U1
  287. CMPCY( r28, r23), r21 C L0 hi add => carry
  288. addq r8, r20, r8 C U0 hi mul + carry
  289. ldq r5, -8(rp) C L1
  290. umulh v0, r0, r3 C U1
  291. ADDSUB r4, r2, r2 C U0 lo + acc
  292. stq r22, -32(rp) C L0
  293. stq r23, -24(rp) C L1
  294. bis r31, r31, r31 C L0 st slosh
  295. mulq v0, r1, r28 C U1
  296. bis r31, r31, r31 C L1 st slosh
  297. addq r8, r21, r8 C U0 hi mul + carry
  298. CMPCY( r4, r2), r20 C L0 lo add => carry
  299. ADDSUB r2, r8, r22 C U0 hi add => answer
  300. ldl r31, 256(up) C prefetch up[]
  301. bgt r18, $Loop C U1 bookkeeping
  302. $Lend: CMPCY( r2, r22), r21 C
  303. addq r6, r20, r6 C
  304. ADDSUB r5, r7, r7 C
  305. addq r6, r21, r6 C
  306. ldq r4, 0(rp) C
  307. umulh v0, r1, r8 C
  308. CMPCY( r5, r7), r20 C
  309. ADDSUB r7, r6, r23 C
  310. CMPCY(r7, r23), r21 C
  311. addq r24, r20, r24 C
  312. ldq r5, 8(rp) C
  313. ADDSUB r4, r25, r25 C
  314. stq r22, -16(rp) C
  315. stq r23, -8(rp) C
  316. addq r24, r21, r24 C
  317. br L(x)
  318. ALIGN(16)
  319. $n23: ldq r4, 0(rp) C
  320. ldq r5, 8(rp) C
  321. umulh v0, r1, r8 C
  322. ADDSUB r4, r25, r25 C
  323. L(x): CMPCY( r4, r25), r20 C
  324. ADDSUB r25, r24, r22 C
  325. CMPCY( r25, r22), r21 C
  326. addq r3, r20, r3 C
  327. ADDSUB r5, r28, r28 C
  328. addq r3, r21, r3 C
  329. CMPCY( r5, r28), r20 C
  330. ADDSUB r28, r3, r23 C
  331. CMPCY( r28, r23), r21 C
  332. addq r8, r20, r8 C
  333. stq r22, 0(rp) C
  334. stq r23, 8(rp) C
  335. addq r8, r21, r0 C
  336. ret r31, (r26), 1 C
  337. EPILOGUE()
  338. ASM_END()