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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel Pentium 4 mpn_mod_34lsub1 -- remainder modulo 2^24-1.
  2. dnl  Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
  3. dnl
  4. dnl  This file is part of the GNU MP Library.
  5. dnl
  6. dnl  The GNU MP Library is free software; you can redistribute it and/or
  7. dnl  modify it under the terms of the GNU Lesser General Public License as
  8. dnl  published by the Free Software Foundation; either version 3 of the
  9. dnl  License, or (at your option) any later version.
  10. dnl
  11. dnl  The GNU MP Library is distributed in the hope that it will be useful,
  12. dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14. dnl  Lesser General Public License for more details.
  15. dnl
  16. dnl  You should have received a copy of the GNU Lesser General Public License
  17. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  18. include(`../config.m4')
  19. C Pentium4: 1.0 cycles/limb
  20. C mp_limb_t mpn_mod_34lsub1 (mp_srcptr src, mp_size_t size)
  21. C
  22. C Enhancements:
  23. C
  24. C There might a couple of cycles to save by using plain integer code for
  25. C more small sizes.  2 limbs measures about 20 cycles, but 3 limbs jumps to
  26. C about 46 (inclusive of some function call overheads).
  27. defframe(PARAM_SIZE, 8)
  28. defframe(PARAM_SRC,  4)
  29. dnl  re-use parameter space
  30. define(SAVE_EBX, `PARAM_SRC')
  31. define(SAVE_ESI, `PARAM_SIZE')
  32. TEXT
  33. ALIGN(16)
  34. PROLOGUE(mpn_mod_34lsub1)
  35. deflit(`FRAME',0)
  36. movl PARAM_SIZE, %ecx
  37. movl PARAM_SRC, %edx
  38. movl (%edx), %eax
  39. subl $2, %ecx
  40. ja L(three_or_more)
  41. jne L(one)
  42. movl 4(%edx), %edx
  43. movl %eax, %ecx
  44. shrl $24, %eax C src[0] high
  45. andl $0x00FFFFFF, %ecx C src[0] low
  46. addl %ecx, %eax
  47. movl %edx, %ecx
  48. shll $8, %edx
  49. shrl $16, %ecx C src[1] low
  50. addl %ecx, %eax
  51. andl $0x00FFFF00, %edx C src[1] high
  52. addl %edx, %eax
  53. L(one):
  54. ret
  55. L(three_or_more):
  56. pxor %mm0, %mm0
  57. pxor %mm1, %mm1
  58. pxor %mm2, %mm2
  59. pcmpeqd %mm7, %mm7
  60. psrlq $32, %mm7 C 0x00000000FFFFFFFF, low 32 bits
  61. pcmpeqd %mm6, %mm6
  62. psrlq $40, %mm6 C 0x0000000000FFFFFF, low 24 bits
  63. L(top):
  64. C eax
  65. C ebx
  66. C ecx counter, size-2 to 0, -1 or -2
  67. C edx src, incrementing
  68. C
  69. C mm0 sum 0mod3
  70. C mm1 sum 1mod3
  71. C mm2 sum 2mod3
  72. C mm3
  73. C mm4
  74. C mm5
  75. C mm6 0x0000000000FFFFFF
  76. C mm7 0x00000000FFFFFFFF
  77. movd (%edx), %mm3
  78. paddq %mm3, %mm0
  79. movd 4(%edx), %mm3
  80. paddq %mm3, %mm1
  81. movd 8(%edx), %mm3
  82. paddq %mm3, %mm2
  83. addl $12, %edx
  84. subl $3, %ecx
  85. ja L(top)
  86. C ecx is -2, -1 or 0 representing 0, 1 or 2 more limbs, respectively
  87. addl $1, %ecx
  88. js L(combine) C 0 more
  89. movd (%edx), %mm3
  90. paddq %mm3, %mm0
  91. jz L(combine) C 1 more
  92. movd 4(%edx), %mm3
  93. paddq %mm3, %mm1
  94. L(combine):
  95. movq %mm7, %mm3 C low halves
  96. pand %mm0, %mm3
  97. movq %mm7, %mm4
  98. pand %mm1, %mm4
  99. movq %mm7, %mm5
  100. pand %mm2, %mm5
  101. psrlq $32, %mm0 C high halves
  102. psrlq $32, %mm1
  103. psrlq $32, %mm2
  104. paddq %mm0, %mm4 C fold high halves to give 33 bits each
  105. paddq %mm1, %mm5
  106. paddq %mm2, %mm3
  107. psllq $8, %mm4 C combine at respective offsets
  108. psllq $16, %mm5
  109. paddq %mm4, %mm3
  110. paddq %mm5, %mm3 C 0x000cxxxxxxxxxxxx, 50 bits
  111. pand %mm3, %mm6 C fold at 24 bits
  112. psrlq $24, %mm3
  113. paddq %mm6, %mm3
  114. movd %mm3, %eax
  115. ASSERT(z, C nothing left in high dword
  116. `psrlq $32, %mm3
  117. movd %mm3, %ecx
  118. orl %ecx, %ecx')
  119. emms
  120. ret
  121. EPILOGUE()