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

数学计算

开发平台:

Unix_Linux

  1. dnl  IA-64 mpn_hamdist -- mpn hamming distance.
  2. dnl  Copyright 2003, 2004, 2005 Free Software Foundation, Inc.
  3. dnl
  4. dnl  This file is part of the GNU MP Library.
  5. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  6. dnl  it under the terms of the GNU Lesser General Public License as published
  7. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  8. dnl  your option) any later version.
  9. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  10. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  12. dnl  License for more details.
  13. dnl  You should have received a copy of the GNU Lesser General Public License
  14. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  15. include(`../config.m4')
  16. C           cycles/limb
  17. C Itanium:       2
  18. C Itanium 2:     1
  19. C INPUT PARAMETERS
  20. define(`up', `r32')
  21. define(`vp', `r33')
  22. define(`n', `r34')
  23. define(`u0',`r16') define(`u1',`r17') define(`u2',`r18') define(`u3',`r19')
  24. define(`v0',`r20') define(`v1',`r21') define(`v2',`r22') define(`v3',`r23')
  25. define(`x0',`r24') define(`x1',`r25') define(`x2',`r26') define(`x3',`r27')
  26. define(`c0',`r28') define(`c1',`r29') define(`c2',`r30') define(`c3',`r31')
  27. define(`s',`r8')
  28. ASM_START()
  29. PROLOGUE(mpn_hamdist)
  30. .prologue
  31. ifdef(`HAVE_ABI_32',
  32. ` addp4 up = 0, up C M I
  33. addp4 vp = 0, vp C M I
  34. zxt4 n = n C I
  35. ;;
  36. ')
  37.  {.mmi; ld8 r10 = [up], 8 C load first ulimb M01
  38. ld8 r11 = [vp], 8 C load first vlimb M01
  39. mov.i r2 = ar.lc C save ar.lc I0
  40. }{.mmi; and r14 = 3, n C M I
  41. cmp.lt p15, p0 = 4, n C small count? M I
  42. add n = -5, n C M I
  43. ;;
  44. }{.mmi; cmp.eq p6, p0 = 1, r14 C M I
  45. cmp.eq p7, p0 = 2, r14 C M I
  46. cmp.eq p8, p0 = 3, r14 C M I
  47. }{.bbb
  48.   (p6) br.dptk .Lb01 C B
  49.   (p7) br.dptk .Lb10 C B
  50.   (p8) br.dptk .Lb11 C B
  51. }
  52. .Lb00: ld8 u1 = [up], 8 C M01
  53. ld8 v1 = [vp], 8 C M01
  54. shr.u n = n, 2 C I0
  55. xor x0 = r10, r11 C M I
  56. ;;
  57. ld8 u2 = [up], 8 C M01
  58. ld8 v2 = [vp], 8 C M01
  59. mov.i ar.lc = n C I0
  60. xor x1 = u1, v1 C M I
  61. ;;
  62. ld8 u3 = [up], 8 C M01
  63. ld8 v3 = [vp], 8 C M01
  64. xor x2 = u2, v2 C M I
  65. mov s = 0 C M I
  66.   (p15) br.cond.dptk .grt4 C B
  67. ;;
  68. popcnt c0 = x0 C I0
  69. xor x3 = u3, v3 C M I
  70. ;;
  71. popcnt c1 = x1 C I0
  72. ;;
  73. popcnt c2 = x2 C I0
  74. br .Lcj4 C B
  75. .grt4: ld8 u0 = [up], 8 C M01
  76. ld8 v0 = [vp], 8 C M01
  77. xor x1 = u1, v1 C M I
  78. ;;
  79. ld8 u1 = [up], 8 C M01
  80. ld8 v1 = [vp], 8 C M01
  81. xor x2 = u2, v2 C M I
  82. ;;
  83. ld8 u2 = [up], 8 C M01
  84. ld8 v2 = [vp], 8 C M01
  85. popcnt c0 = x0 C I0
  86. xor x3 = u3, v3 C M I
  87. ;;
  88. ld8 u3 = [up], 8 C M01
  89. ld8 v3 = [vp], 8 C M01
  90. popcnt c1 = x1 C I0
  91. xor x0 = u0, v0 C M I
  92. br.cloop.dpnt .grt8 C B
  93. popcnt c2 = x2 C I0
  94. xor x1 = u1, v1 C M I
  95. br .Lcj8 C B
  96. .grt8: ld8 u0 = [up], 8 C M01
  97. ld8 v0 = [vp], 8 C M01
  98. popcnt c2 = x2 C I0
  99. xor x1 = u1, v1 C M I
  100. br .LL00 C B
  101. .Lb01: xor x3 = r10, r11 C M I
  102. shr.u n = n, 2 C I0
  103.   (p15) br.cond.dptk .grt1 C B
  104. ;;
  105. popcnt r8 = x3 C I0
  106. br.ret.sptk.many b0 C B
  107. .grt1: ld8 u0 = [up], 8 C M01
  108. ld8 v0 = [vp], 8 C M01
  109. mov.i ar.lc = n C I0
  110. ;;
  111. ld8 u1 = [up], 8 C M01
  112. ld8 v1 = [vp], 8 C M01
  113. mov s = 0 C M I
  114. ;;
  115. ld8 u2 = [up], 8 C M01
  116. ld8 v2 = [vp], 8 C M01
  117. ;;
  118. ld8 u3 = [up], 8 C M01
  119. ld8 v3 = [vp], 8 C M01
  120. xor x0 = u0, v0 C M I
  121. br.cloop.dpnt .grt5 C B
  122. xor x1 = u1, v1 C M I
  123. ;;
  124. popcnt c3 = x3 C I0
  125. xor x2 = u2, v2 C M I
  126. ;;
  127. popcnt c0 = x0 C I0
  128. xor x3 = u3, v3 C M I
  129. ;;
  130. popcnt c1 = x1 C I0
  131. br .Lcj5 C B
  132. .grt5: ld8 u0 = [up], 8 C M01
  133. ld8 v0 = [vp], 8 C M01
  134. xor x1 = u1, v1 C M I
  135. ;;
  136. ld8 u1 = [up], 8 C M01
  137. ld8 v1 = [vp], 8 C M01
  138. popcnt c3 = x3 C I0
  139. xor x2 = u2, v2 C M I
  140. ;;
  141. ld8 u2 = [up], 8 C M01
  142. ld8 v2 = [vp], 8 C M01
  143. popcnt c0 = x0 C I0
  144. xor x3 = u3, v3 C M I
  145. ;;
  146. ld8 u3 = [up], 8 C M01
  147. ld8 v3 = [vp], 8 C M01
  148. popcnt c1 = x1 C I0
  149. xor x0 = u0, v0 C M I
  150. br.cloop.dpnt .Loop C B
  151. br .Lend C B
  152. .Lb10: ld8 u3 = [up], 8 C M01
  153. ld8 v3 = [vp], 8 C M01
  154. xor x2 = r10, r11 C M I
  155.   (p15) br.cond.dptk .grt2 C B
  156. ;;
  157. xor x3 = u3, v3 C M I
  158. ;;
  159. popcnt c2 = x2 C I0
  160. ;;
  161. popcnt c3 = x3 C I0
  162. ;;
  163. add s = c2, c3 C M I
  164. br.ret.sptk.many b0 C B
  165. .grt2: ld8 u0 = [up], 8 C M01
  166. ld8 v0 = [vp], 8 C M01
  167. shr.u n = n, 2 C I0
  168. ;;
  169. ld8 u1 = [up], 8 C M01
  170. ld8 v1 = [vp], 8 C M01
  171. mov.i ar.lc = n C I0
  172. mov s = 0 C M I
  173. ;;
  174. ld8 u2 = [up], 8 C M01
  175. ld8 v2 = [vp], 8 C M01
  176. xor x3 = u3, v3 C M I
  177. ;;
  178. ld8 u3 = [up], 8 C M01
  179. ld8 v3 = [vp], 8 C M01
  180. xor x0 = u0, v0 C M I
  181. br.cloop.dptk .grt6 C B
  182. popcnt c2 = x2 C I0
  183. xor x1 = u1, v1 C M I
  184. ;;
  185. popcnt c3 = x3 C I0
  186. xor x2 = u2, v2 C M I
  187. ;;
  188. popcnt c0 = x0 C I0
  189. xor x3 = u3, v3 C M I
  190. br .Lcj6 C B
  191. .grt6: ld8 u0 = [up], 8 C M01
  192. ld8 v0 = [vp], 8 C M01
  193. popcnt c2 = x2 C I0
  194. xor x1 = u1, v1 C M I
  195. ;;
  196. ld8 u1 = [up], 8 C M01
  197. ld8 v1 = [vp], 8 C M01
  198. popcnt c3 = x3 C I0
  199. xor x2 = u2, v2 C M I
  200. ;;
  201. ld8 u2 = [up], 8 C M01
  202. ld8 v2 = [vp], 8 C M01
  203. popcnt c0 = x0 C I0
  204. xor x3 = u3, v3 C M I
  205. br .LL10 C B
  206. .Lb11: ld8 u2 = [up], 8 C M01
  207. ld8 v2 = [vp], 8 C M01
  208. shr.u n = n, 2 C I0
  209. xor x1 = r10, r11 C M I
  210. ;;
  211. ld8 u3 = [up], 8 C M01
  212. ld8 v3 = [vp], 8 C M01
  213. xor x2 = u2, v2 C M I
  214.   (p15) br.cond.dptk .grt3 C B
  215. ;;
  216. xor x3 = u3, v3 C M I
  217. ;;
  218. popcnt c1 = x1 C I0
  219. ;;
  220. popcnt c2 = x2 C I0
  221. ;;
  222. popcnt c3 = x3 C I0
  223. ;;
  224. add s = c1, c2 C M I
  225. ;;
  226. add s = s, c3 C M I
  227. br.ret.sptk.many b0 C B
  228. .grt3: ld8 u0 = [up], 8 C M01
  229. ld8 v0 = [vp], 8 C M01
  230. mov.i ar.lc = n C I0
  231. ;;
  232. ld8 u1 = [up], 8 C M01
  233. ld8 v1 = [vp], 8 C M01
  234. mov s = 0 C M I
  235. ;;
  236. ld8 u2 = [up], 8 C M01
  237. ld8 v2 = [vp], 8 C M01
  238. xor x3 = u3, v3 C M I
  239. ;;
  240. ld8 u3 = [up], 8 C M01
  241. ld8 v3 = [vp], 8 C M01
  242. popcnt c1 = x1 C I0
  243. xor x0 = u0, v0 C M I
  244. br.cloop.dptk .grt7 C B
  245. popcnt c2 = x2 C I0
  246. xor x1 = u1, v1 C M I
  247. ;;
  248. popcnt c3 = x3 C I0
  249. xor x2 = u2, v2 C M I
  250. br .Lcj7 C B
  251. .grt7: ld8 u0 = [up], 8 C M01
  252. ld8 v0 = [vp], 8 C M01
  253. popcnt c2 = x2 C I0
  254. xor x1 = u1, v1 C M I
  255. ;;
  256. ld8 u1 = [up], 8 C M01
  257. ld8 v1 = [vp], 8 C M01
  258. popcnt c3 = x3 C I0
  259. xor x2 = u2, v2 C M I
  260. br .LL11 C B
  261. ALIGN(32)
  262. .Loop: ld8 u0 = [up], 8 C M01
  263. ld8 v0 = [vp], 8 C M01
  264. popcnt c2 = x2 C I0
  265. add s = s, c3 C M I
  266. xor x1 = u1, v1 C M I
  267. nop.b 1 C -
  268. ;;
  269. .LL00: ld8 u1 = [up], 8 C M01
  270. ld8 v1 = [vp], 8 C M01
  271. popcnt c3 = x3 C I0
  272. add s = s, c0 C M I
  273. xor x2 = u2, v2 C M I
  274. nop.b 1 C -
  275. ;;
  276. .LL11: ld8 u2 = [up], 8 C M01
  277. ld8 v2 = [vp], 8 C M01
  278. popcnt c0 = x0 C I0
  279. add s = s, c1 C M I
  280. xor x3 = u3, v3 C M I
  281. nop.b 1 C -
  282. ;;
  283. .LL10: ld8 u3 = [up], 8 C M01
  284. ld8 v3 = [vp], 8 C M01
  285. popcnt c1 = x1 C I0
  286. add s = s, c2 C M I
  287. xor x0 = u0, v0 C M I
  288. br.cloop.dptk .Loop C B
  289. ;;
  290. .Lend: popcnt c2 = x2 C I0
  291. add s = s, c3 C M I
  292. xor x1 = u1, v1 C M I
  293. ;;
  294. .Lcj8: popcnt c3 = x3 C I0
  295. add s = s, c0 C M I
  296. xor x2 = u2, v2 C M I
  297. ;;
  298. .Lcj7: popcnt c0 = x0 C I0
  299. add s = s, c1 C M I
  300. xor x3 = u3, v3 C M I
  301. ;;
  302. .Lcj6: popcnt c1 = x1 C I0
  303. add s = s, c2 C M I
  304. ;;
  305. .Lcj5: popcnt c2 = x2 C I0
  306. add s = s, c3 C M I
  307. ;;
  308. .Lcj4: popcnt c3 = x3 C I0
  309. add s = s, c0 C M I
  310. ;;
  311. add s = s, c1 C M I
  312. ;;
  313. add s = s, c2 C M I
  314. ;;
  315. add s = s, c3 C M I
  316. mov.i ar.lc = r2 C I0
  317. br.ret.sptk.many b0 C B
  318. EPILOGUE()
  319. ASM_END()