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

数学计算

开发平台:

Unix_Linux

  1. dnl  Alpha mpn_divexact_by3c -- mpn division by 3, expecting no remainder.
  2. dnl  Copyright 2004, 2005, 2009 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:    22
  17. C EV5:    11.5
  18. C EV6:     6.3 Note that mpn_bdiv_dbm1c is faster
  19. C TODO
  20. C  * Remove the unops, they benefit just ev6, which no longer uses this file.
  21. C  * Try prefetch for destination, using lds.
  22. C  * Improve feed-in code, by moving initial mulq earlier; make initial load
  23. C    to u0/u0 to save some copying.
  24. C  * Combine u0 and u2, u1 and u3.
  25. C INPUT PARAMETERS
  26. define(`rp', `r16')
  27. define(`up', `r17')
  28. define(`n', `r18')
  29. define(`cy', `r19')
  30. ASM_START()
  31. DATASTART(L(LC))
  32. .quad 0xAAAAAAAAAAAAAAAB
  33. .quad 0x5555555555555555
  34. .quad 0xAAAAAAAAAAAAAAAA
  35. DATAEND()
  36. define(`xAAAAAAAAAAAAAAAB', `r20')
  37. define(`x5555555555555555', `r21')
  38. define(`xAAAAAAAAAAAAAAAA', `r22')
  39. define(`u0', `r0') define(`u1', `r1')
  40. define(`u2', `r2') define(`u3', `r3')
  41. define(`l0', `r25') define(`x', `r8')
  42. define(`q0', `r4') define(`q1', `r5')
  43. define(`p6', `r6') define(`p7', `r7')
  44. define(`t0', `r23') define(`t1', `r24')
  45. define(`cymask',`r28')
  46. PROLOGUE(mpn_divexact_by3c,gp)
  47. ldq r28, 0(up) C load first limb early
  48. C Put magic constants in registers
  49. lda r0, L(LC)
  50. ldq xAAAAAAAAAAAAAAAB, 0(r0)
  51. ldq x5555555555555555, 8(r0)
  52. ldq xAAAAAAAAAAAAAAAA, 16(r0)
  53. C Compute initial l0 value
  54. cmpeq cy, 1, p6
  55. cmpeq cy, 2, p7
  56. negq p6, p6
  57. and p6, x5555555555555555, l0
  58. cmovne p7, xAAAAAAAAAAAAAAAA, l0
  59. C Feed-in depending on (n mod 4)
  60. and n, 3, r8
  61. lda n, -3(n)
  62. cmpeq r8, 1, r4
  63. cmpeq r8, 2, r5
  64. bne r4, $Lb01
  65. bne r5, $Lb10
  66. beq r8, $Lb00
  67. $Lb11: ldq u3, 8(up)
  68. lda up, -24(up)
  69. lda rp, -24(rp)
  70. mulq r28, xAAAAAAAAAAAAAAAB, q0
  71. mov r28, u2
  72. br r31, $L11
  73. $Lb00: ldq u2, 8(up)
  74. lda up, -16(up)
  75. lda rp, -16(rp)
  76. mulq r28, xAAAAAAAAAAAAAAAB, q1
  77. mov r28, u1
  78. br r31, $L00
  79. $Lb01: lda rp, -8(rp)
  80. mulq r28, xAAAAAAAAAAAAAAAB, q0
  81. mov r28, u0
  82. blt n, $Lcj1
  83. ldq u1, 8(up)
  84. lda up, -8(up)
  85. br r31, $L01
  86. $Lb10: ldq u0, 8(up)
  87. mulq r28, xAAAAAAAAAAAAAAAB, q1
  88. mov r28, u3
  89. blt n, $Lend
  90. ALIGN(16)
  91. $Ltop:
  92. C 0
  93. cmpult u3, cy, cy C L0
  94. mulq u0, xAAAAAAAAAAAAAAAB, q0 C U1
  95. ldq u1, 16(up) C L1
  96. addq q1, l0, x C U0
  97. C 1
  98. negq cy, cymask C L0
  99. unop C U1
  100. unop C L1
  101. cmpult x5555555555555555, x, p6 C U0
  102. C 2
  103. cmpult xAAAAAAAAAAAAAAAA, x, p7 C U1
  104. unop
  105. unop
  106. negq p6, t0 C L0
  107. C 3
  108. negq p7, t1 C L0
  109. and cymask, x5555555555555555, l0 C U1
  110. addq p6, cy, cy
  111. and t0, x5555555555555555, t0
  112. C 4
  113. and t1, x5555555555555555, t1
  114. addq p7, cy, cy
  115. unop
  116. addq t0, l0, l0
  117. C 5
  118. addq t1, l0, l0
  119. unop
  120. stq x, 0(rp) C L1
  121. unop
  122. $L01:
  123. C 0
  124. cmpult u0, cy, cy C L0
  125. mulq u1, xAAAAAAAAAAAAAAAB, q1 C U1
  126. ldq u2, 24(up) C L1
  127. addq q0, l0, x C U0
  128. C 1
  129. negq cy, cymask C L0
  130. unop C U1
  131. unop C L1
  132. cmpult x5555555555555555, x, p6 C U0
  133. C 2
  134. cmpult xAAAAAAAAAAAAAAAA, x, p7 C U1
  135. unop
  136. unop
  137. negq p6, t0 C L0
  138. C 3
  139. negq p7, t1 C L0
  140. and cymask, x5555555555555555, l0 C U1
  141. addq p6, cy, cy
  142. and t0, x5555555555555555, t0
  143. C 4
  144. and t1, x5555555555555555, t1
  145. addq p7, cy, cy
  146. unop
  147. addq t0, l0, l0
  148. C 5
  149. addq t1, l0, l0
  150. unop
  151. stq x, 8(rp) C L1
  152. unop
  153. $L00:
  154. C 0
  155. cmpult u1, cy, cy C L0
  156. mulq u2, xAAAAAAAAAAAAAAAB, q0 C U1
  157. ldq u3, 32(up) C L1
  158. addq q1, l0, x C U0
  159. C 1
  160. negq cy, cymask C L0
  161. unop C U1
  162. unop C L1
  163. cmpult x5555555555555555, x, p6 C U0
  164. C 2
  165. cmpult xAAAAAAAAAAAAAAAA, x, p7 C U1
  166. unop
  167. unop
  168. negq p6, t0 C L0
  169. C 3
  170. negq p7, t1 C L0
  171. and cymask, x5555555555555555, l0 C U1
  172. addq p6, cy, cy
  173. and t0, x5555555555555555, t0
  174. C 4
  175. and t1, x5555555555555555, t1
  176. addq p7, cy, cy
  177. unop
  178. addq t0, l0, l0
  179. C 5
  180. addq t1, l0, l0
  181. unop
  182. stq x, 16(rp) C L1
  183. unop
  184. $L11:
  185. C 0
  186. cmpult u2, cy, cy C L0
  187. mulq u3, xAAAAAAAAAAAAAAAB, q1 C U1
  188. ldq u0, 40(up) C L1
  189. addq q0, l0, x C U0
  190. C 1
  191. negq cy, cymask C L0
  192. unop C U1
  193. unop C L1
  194. cmpult x5555555555555555, x, p6 C U0
  195. C 2
  196. cmpult xAAAAAAAAAAAAAAAA, x, p7 C U1
  197. lda n, -4(n) C L1 bookkeeping
  198. unop
  199. negq p6, t0 C L0
  200. C 3
  201. negq p7, t1 C L0
  202. and cymask, x5555555555555555, l0 C U1
  203. addq p6, cy, cy
  204. and t0, x5555555555555555, t0
  205. C 4
  206. and t1, x5555555555555555, t1
  207. addq p7, cy, cy
  208. unop
  209. addq t0, l0, l0
  210. C 5
  211. addq t1, l0, l0
  212. unop
  213. stq x, 24(rp) C L1
  214. lda up, 32(up)
  215. C
  216. ldl r31, 256(up) C prefetch
  217. unop
  218. lda rp, 32(rp)
  219. bge n, $Ltop C U1
  220. C *** MAIN LOOP END ***
  221. $Lend:
  222. cmpult u3, cy, cy C L0
  223. mulq u0, xAAAAAAAAAAAAAAAB, q0 C U1
  224. unop
  225. addq q1, l0, x C U0
  226. C 1
  227. negq cy, cymask C L0
  228. unop C U1
  229. unop C L1
  230. cmpult x5555555555555555, x, p6 C U0
  231. C 2
  232. cmpult xAAAAAAAAAAAAAAAA, x, p7 C U1
  233. unop
  234. unop
  235. negq p6, t0 C L0
  236. C 3
  237. negq p7, t1 C L0
  238. and cymask, x5555555555555555, l0 C U1
  239. addq p6, cy, cy
  240. and t0, x5555555555555555, t0
  241. C 4
  242. and t1, x5555555555555555, t1
  243. addq p7, cy, cy
  244. unop
  245. addq t0, l0, l0
  246. C 5
  247. addq t1, l0, l0
  248. unop
  249. stq x, 0(rp) C L1
  250. unop
  251. $Lcj1:
  252. cmpult u0, cy, cy C L0
  253. addq q0, l0, x C U0
  254. cmpult x5555555555555555, x, p6 C U0
  255. cmpult xAAAAAAAAAAAAAAAA, x, p7 C U1
  256. addq p6, cy, cy
  257. addq p7, cy, r0
  258. stq x, 8(rp) C L1
  259. ret r31,(r26),1
  260. EPILOGUE()
  261. ASM_END()
  262. C This is useful for playing with various schedules.
  263. C Expand as: one(0)one(1)one(2)one(3)
  264. define(`one',`
  265. C 0
  266. cmpult `$'eval(($1+3)%4), cy, cy C L0
  267. mulq `$'$1, xAAAAAAAAAAAAAAAB, `$'eval(4+$1%2) C U1
  268. ldq `$'eval(($1+1)%4), eval($1*8+16)(up) C L1
  269. addq `$'eval(4+($1+1)%2), l0, x C U0
  270. C 1
  271. negq cy, cymask C L0
  272. unop C U1
  273. unop C L1
  274. cmpult x5555555555555555, x, p6 C U0
  275. C 2
  276. cmpult xAAAAAAAAAAAAAAAA, x, p7 C U1
  277. unop
  278. unop
  279. negq p6, t0 C L0
  280. C 3
  281. negq p7, t1 C L0
  282. and cymask, x5555555555555555, l0 C U1
  283. addq p6, cy, cy
  284. and t0, x5555555555555555, t0
  285. C 4
  286. and t1, x5555555555555555, t1
  287. addq p7, cy, cy
  288. unop
  289. addq t0, l0, l0
  290. C 5
  291. addq t1, l0, l0
  292. unop
  293. stq x, eval($1*8)(rp) C L1
  294. unop
  295. ')