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

数学计算

开发平台:

Unix_Linux

  1. dnl  Alpha ev67 mpn_hamdist -- mpn hamming distance.
  2. dnl  Copyright 2003, 2005 Free Software Foundation, Inc.
  3. dnl  This file is part of the GNU MP Library.
  4. dnl
  5. dnl  The GNU MP Library is free software; you can redistribute it and/or
  6. dnl  modify it under the terms of the GNU Lesser General Public License as
  7. dnl  published by the Free Software Foundation; either version 3 of the
  8. dnl  License, or (at your option) any later version.
  9. dnl
  10. dnl  The GNU MP Library is distributed in the hope that it will be useful,
  11. dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13. dnl  Lesser General Public License for more details.
  14. dnl
  15. dnl  You should have received a copy of the GNU Lesser General Public License
  16. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  17. include(`../config.m4')
  18. C ev67: 2.5 cycles/limb
  19. C unsigned long mpn_hamdist (mp_srcptr xp, mp_srcptr yp, mp_size_t size);
  20. C
  21. C The hope was for 2.0 c/l here, but that isn't achieved.  We're limited by
  22. C renaming register shortage.  Since we need 5 instructions per limb, further
  23. C unrolling could approach 1.5 c/l.
  24. C
  25. C The main loop processes two limbs from each operand on each iteration.  An
  26. C odd size is handled by processing xp[0]^yp[0] at the start.  If the size
  27. C is even that result is discarded, and is repeated by the main loop.
  28. C
  29. ASM_START()
  30. PROLOGUE(mpn_hamdist)
  31. C r16 xp
  32. C r17 yp
  33. C r18 size
  34. ldq r1, 0(r16) C L0  xp[0]
  35. ldq r2, 0(r17) C L1  yp[0]
  36. and r18, 1, r8 C U1  1 if size odd
  37. srl r18, 1, r18 C U0  size, limb pairs
  38. clr r0 C L0  initial total
  39. s8addq r8, r17, r17 C U1  yp++ if size odd
  40. s8addq r8, r16, r16 C L1  xp++ if size odd
  41. clr r6 C U0  dummy initial xor 1
  42. xor r1, r2, r5 C L   initial xor 0
  43. beq r18, L(one) C U   if size==1
  44. cmoveq r8, r31, r5 C L   discard first limb if size even
  45. unop C U
  46. ALIGN(16)
  47. L(top):
  48. C r0 total accumulating
  49. C r7 xor 0
  50. C r8 xor 1
  51. C r16 xp, incrementing
  52. C r17 yp, incrementing
  53. C r18 size, limb pairs, decrementing
  54. ldq r1, 0(r16) C L
  55. ldq r2, 0(r17) C L
  56. ctpop r5, r7 C U0
  57. lda r16, 16(r16) C U
  58. ldq r3, -8(r16) C L
  59. ldq r4, 8(r17) C L
  60. ctpop r6, r8 C U0
  61. lda r17, 16(r17) C U
  62. ldl r31, 256(r16) C L prefetch
  63. ldl r31, 256(r17) C L prefetch
  64. xor r1, r2, r5 C U
  65. lda r18, -1(r18) C U
  66. xor r3, r4, r6 C U
  67. addq r0, r7, r0 C L
  68. addq r0, r8, r0 C L
  69. bne r18, L(top) C U
  70. ctpop r6, r8 C U0
  71. addq r0, r8, r0 C L
  72. L(one):
  73. ctpop r5, r7 C U0
  74. addq r0, r7, r0 C L
  75. ret r31, (r26), 1 C L0
  76. EPILOGUE()
  77. ASM_END()