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

数学计算

开发平台:

Unix_Linux

  1. dnl  IA-64 mpn_popcount -- mpn population count.
  2. dnl  Copyright 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
  3. dnl  Inc.
  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:       1.5
  18. C Itanium 2:     1
  19. C INPUT PARAMETERS
  20. define(`up', `r32')
  21. define(`n', `r33')
  22. define(`u0',`r16') define(`u1',`r17') define(`u2',`r18') define(`u3',`r19')
  23. define(`c0',`r28') define(`c1',`r29') define(`c2',`r30') define(`c3',`r31')
  24. define(`s',`r8')
  25. ASM_START()
  26. PROLOGUE(mpn_popcount)
  27. .prologue
  28. ifdef(`HAVE_ABI_32',
  29. ` addp4 up = 0, up C M I
  30. zxt4 n = n C I
  31. ;;
  32. ')
  33.  {.mmi; add r9 = 512, up C prefetch pointer M I
  34. ld8 r10 = [up], 8 C load first limb M01
  35. mov.i r2 = ar.lc C save ar.lc I0
  36. }{.mmi; and r14 = 3, n C M I
  37. cmp.lt p15, p14 = 4, n C small count? M I
  38. add n = -5, n C M I
  39. ;;
  40. }{.mmi; cmp.eq p6, p0 = 1, r14 C M I
  41. cmp.eq p7, p0 = 2, r14 C M I
  42. cmp.eq p8, p0 = 3, r14 C M I
  43. }{.bbb
  44.   (p6) br.dptk .Lb01 C B
  45.   (p7) br.dptk .Lb10 C B
  46.   (p8) br.dptk .Lb11 C B
  47. }
  48. .Lb00: ld8 u1 = [up], 8 C M01
  49. shr.u n = n, 2 C I0
  50. mov s = 0 C M I
  51. ;;
  52. ld8 u2 = [up], 8 C M01
  53. popcnt c0 = r10 C I0
  54. mov.i ar.lc = n C I0
  55. ;;
  56. ld8 u3 = [up], 8 C M01
  57. popcnt c1 = u1 C I0
  58.   (p15) br.cond.dptk .grt4 C B
  59. ;;
  60. nop.m 0 C -
  61. nop.m 0 C -
  62. popcnt c2 = u2 C I0
  63. ;;
  64. mov s = c0 C M I
  65. popcnt c3 = u3 C I0
  66. br .Lcj4 C B
  67. .grt4: ld8 u0 = [up], 8 C M01
  68. popcnt c2 = u2 C I0
  69. br .LL00 C B
  70. .Lb01:
  71. popcnt s = r10 C I0
  72.   (p14) br.ret.sptk.many b0 C B
  73. .grt1: ld8 u0 = [up], 8 C M01
  74. shr.u n = n, 2 C I0
  75. ;;
  76. ld8 u1 = [up], 8 C M01
  77. mov.i ar.lc = n C I0
  78. ;;
  79. ld8 u2 = [up], 8 C M01
  80. popcnt c0 = u0 C I0
  81. mov c3 = 0 C I0
  82. ;;
  83. ld8 u3 = [up], 8 C M01
  84. popcnt c1 = u1 C I0
  85. br.cloop.dptk .Loop C B
  86. br .Lend C B
  87. .Lb10: ld8 u3 = [up], 8 C M01
  88. shr.u n = n, 2 C I0
  89.   (p15) br.cond.dptk .grt2 C B
  90. popcnt s = r10 C I0
  91. ;;
  92. popcnt c3 = u3 C I0
  93. br .Lcj2 C B
  94. .grt2: ld8 u0 = [up], 8 C M01
  95. mov.i ar.lc = n C I0
  96. popcnt c2 = r10 C I0
  97. ;;
  98. ld8 u1 = [up], 8 C M01
  99. popcnt c3 = u3 C I0
  100. mov s = 0 C M I
  101. ;;
  102. ld8 u2 = [up], 8 C M01
  103. popcnt c0 = u0 C I0
  104. br .LL10 C B
  105. .Lb11: ld8 u2 = [up], 8 C M01
  106. shr.u n = n, 2 C I0
  107. mov s = 0 C M I
  108. ;;
  109. ld8 u3 = [up], 8 C M01
  110. popcnt s = r10 C I0
  111.   (p15) br.cond.dptk .grt3 C B
  112. popcnt c2 = u2 C I0
  113. ;;
  114. popcnt c3 = u3 C I0
  115. br .Lcj3 C B
  116. .grt3: ld8 u0 = [up], 8 C M01
  117. popcnt c2 = u2 C I0
  118. mov.i ar.lc = n C I0
  119. mov c1 = 0
  120. ;;
  121. ld8 u1 = [up], 8 C M01
  122. popcnt c3 = u3 C I0
  123. br .LL11 C B
  124. .Loop: ld8 u0 = [up], 8 C M01
  125. popcnt c2 = u2 C I0
  126. add s = s, c3 C M I
  127. ;;
  128. .LL00: ld8 u1 = [up], 8 C M01
  129. popcnt c3 = u3 C I0
  130. add s = s, c0 C M I
  131. ;;
  132. .LL11: ld8 u2 = [up], 8 C M01
  133. popcnt c0 = u0 C I0
  134. add s = s, c1 C M I
  135. ;;
  136. .LL10: ld8 u3 = [up], 8 C M01
  137. popcnt c1 = u1 C I0
  138. add s = s, c2 C M I
  139. lfetch [r9], 32 C M01
  140. nop.m 0 C -
  141. br.cloop.dptk .Loop C B
  142. ;;
  143. .Lend: popcnt c2 = u2 C I0
  144. add s = s, c3 C M I
  145. ;;
  146. popcnt c3 = u3 C I0
  147. add s = s, c0 C M I
  148. ;;
  149. .Lcj4: add s = s, c1 C M I
  150. ;;
  151. .Lcj3: add s = s, c2 C M I
  152. ;;
  153. .Lcj2: add s = s, c3 C M I
  154. mov.i ar.lc = r2 C I0
  155. br.ret.sptk.many b0 C B
  156. EPILOGUE()
  157. ASM_END()