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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD64 mpn_popcount, mpn_hamdist -- population count and hamming distance.
  2. dnl  Copyright 2004, 2005, 2007 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      popcount       hamdist
  16. C     cycles/limb     cycles/limb
  17. C K8,K9:  6  7
  18. C K10:  6  7
  19. C P4: 12 14.3
  20. C P6-15:  7  8
  21. C TODO
  22. C  * Tune.  It should be possible to reach 5 c/l for popcount and 6 c/l for
  23. C    hamdist for K8/K9.
  24. ifdef(`OPERATION_popcount',`
  25.   define(`func',`mpn_popcount')
  26.   define(`up', `%rdi')
  27.   define(`n', `%rsi')
  28.   define(`h55555555', `%r10')
  29.   define(`h33333333', `%r11')
  30.   define(`h0f0f0f0f', `%rcx')
  31.   define(`h01010101', `%rdx')
  32.   define(`HAM', `dnl')
  33. ')
  34. ifdef(`OPERATION_hamdist',`
  35.   define(`func',`mpn_hamdist')
  36.   define(`up', `%rdi')
  37.   define(`vp', `%rsi')
  38.   define(`n', `%rdx')
  39.   define(`h55555555', `%r10')
  40.   define(`h33333333', `%r11')
  41.   define(`h0f0f0f0f', `%rcx')
  42.   define(`h01010101', `%r14')
  43.   define(`HAM', `$1')
  44. ')
  45. MULFUNC_PROLOGUE(mpn_popcount mpn_hamdist)
  46. ASM_START()
  47. TEXT
  48. ALIGN(32)
  49. PROLOGUE(func)
  50. pushq %r12
  51. pushq %r13
  52.  HAM(` pushq %r14 ')
  53. movq $0x5555555555555555, h55555555
  54. movq $0x3333333333333333, h33333333
  55. movq $0x0f0f0f0f0f0f0f0f, h0f0f0f0f
  56. movq $0x0101010101010101, h01010101
  57. leaq (up,n,8), up
  58.  HAM(` leaq (vp,n,8), vp ')
  59. negq n
  60. xorl %eax, %eax
  61. btq $0, n
  62. jnc L(oop)
  63. movq (up,n,8), %r8
  64.  HAM(` xorq (vp,n,8), %r8 ')
  65. movq %r8, %r9
  66. shrq %r8
  67. andq h55555555, %r8
  68. subq %r8, %r9
  69. movq %r9, %r8
  70. shrq $2, %r9
  71. andq h33333333, %r8
  72. andq h33333333, %r9
  73. addq %r8, %r9 C 16 4-bit fields (0..4)
  74. movq %r9, %r8
  75. shrq $4, %r9
  76. andq h0f0f0f0f, %r8
  77. andq h0f0f0f0f, %r9
  78. addq %r8, %r9 C 8 8-bit fields (0..16)
  79. imulq h01010101, %r9 C sum the 8 fields in high 8 bits
  80. shrq $56, %r9
  81. addq %r9, %rax C add to total
  82. addq $1, n
  83. jz L(done)
  84. ALIGN(16)
  85. L(oop): movq (up,n,8), %r8
  86. movq 8(up,n,8), %r12
  87.  HAM(` xorq (vp,n,8), %r8 ')
  88.  HAM(` xorq 8(vp,n,8), %r12 ')
  89. movq %r8, %r9
  90. movq %r12, %r13
  91. shrq %r8
  92. shrq %r12
  93. andq h55555555, %r8
  94. andq h55555555, %r12
  95. subq %r8, %r9
  96. subq %r12, %r13
  97. movq %r9, %r8
  98. movq %r13, %r12
  99. shrq $2, %r9
  100. shrq $2, %r13
  101. andq h33333333, %r8
  102. andq h33333333, %r9
  103. andq h33333333, %r12
  104. andq h33333333, %r13
  105. addq %r8, %r9 C 16 4-bit fields (0..4)
  106. addq %r12, %r13 C 16 4-bit fields (0..4)
  107. addq %r13, %r9 C 16 4-bit fields (0..8)
  108. movq %r9, %r8
  109. shrq $4, %r9
  110. andq h0f0f0f0f, %r8
  111. andq h0f0f0f0f, %r9
  112. addq %r8, %r9 C 8 8-bit fields (0..16)
  113. imulq h01010101, %r9 C sum the 8 fields in high 8 bits
  114. shrq $56, %r9
  115. addq %r9, %rax C add to total
  116. addq $2, n
  117. jnc L(oop)
  118. L(done):
  119.  HAM(` popq %r14 ')
  120. popq %r13
  121. popq %r12
  122. ret
  123. EPILOGUE()