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

数学计算

开发平台:

Unix_Linux

  1. dnl  Intel Pentium mpn_and_n,...,mpn_xnor_n -- bitwise logical operations.
  2. dnl  Copyright 2001, 2002 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 P5: 3.0 c/l  and, ior, xor
  20. C     3.5 c/l  andn, iorn, nand, nior, xnor
  21. define(M4_choose_op,
  22. `ifdef(`OPERATION_$1',`
  23. define(`M4_function', `mpn_$1')
  24. define(`M4_want_pre', `$4')
  25. define(`M4op',        `$3')
  26. define(`M4_want_post',`$2')
  27. ')')
  28. define(M4pre, `ifelse(M4_want_pre, yes,`$1')')
  29. define(M4post,`ifelse(M4_want_post,yes,`$1')')
  30. M4_choose_op( and_n,     , andl,    )
  31. M4_choose_op( andn_n,    , andl, yes)
  32. M4_choose_op( nand_n, yes, andl,    )
  33. M4_choose_op( ior_n,     ,  orl,    )
  34. M4_choose_op( iorn_n,    ,  orl, yes)
  35. M4_choose_op( nior_n, yes,  orl,    )
  36. M4_choose_op( xor_n,     , xorl,    )
  37. M4_choose_op( xnor_n, yes, xorl,    )
  38. ifdef(`M4_function',,
  39. `m4_error(`Unrecognised or undefined OPERATION symbol
  40. ')')
  41. MULFUNC_PROLOGUE(mpn_and_n mpn_andn_n mpn_nand_n mpn_ior_n mpn_iorn_n mpn_nior_n mpn_xor_n mpn_xnor_n)
  42. NAILS_SUPPORT(0-31)
  43. C void M4_function (mp_ptr wp, mp_srcptr xp, mp_srcptr yp, mp_size_t size);
  44. C
  45. C Nothing complicated here, just some care to avoid data cache bank clashes
  46. C and AGIs.
  47. C
  48. C We're one register short of being able to do a simple 4 loads, 2 ops, 2
  49. C stores.  Instead %ebp is juggled a bit and nops are introduced to keep the
  50. C pairings as intended.  An in-place operation would free up a register, for
  51. C an 0.5 c/l speedup, if that's worth bothering with.
  52. C
  53. C This code seems best for P55 too.  Data alignment is a big problem for MMX
  54. C and the pairing restrictions on movq and integer instructions make life
  55. C difficult.
  56. defframe(PARAM_SIZE,16)
  57. defframe(PARAM_YP,  12)
  58. defframe(PARAM_XP,   8)
  59. defframe(PARAM_WP,   4)
  60. TEXT
  61. ALIGN(8)
  62. PROLOGUE(M4_function)
  63. deflit(`FRAME',0)
  64. pushl %ebx FRAME_pushl()
  65. pushl %esi FRAME_pushl()
  66. pushl %edi FRAME_pushl()
  67. pushl %ebp FRAME_pushl()
  68. movl PARAM_SIZE, %ecx
  69. movl PARAM_XP, %ebx
  70. movl PARAM_YP, %esi
  71. movl PARAM_WP, %edi
  72. shrl %ecx
  73. jnc L(entry)
  74. movl (%ebx,%ecx,8), %eax C risk of data cache bank clash here
  75. movl (%esi,%ecx,8), %edx
  76. M4pre(` notl_or_xorl_GMP_NUMB_MASK(%edx)')
  77. M4op %edx, %eax
  78. M4post(`xorl $GMP_NUMB_MASK, %eax')
  79. orl %ecx, %ecx
  80. movl %eax, (%edi,%ecx,8)
  81. jz L(done)
  82. jmp L(entry)
  83. L(top):
  84. C eax
  85. C ebx xp
  86. C ecx counter, limb pairs, decrementing
  87. C edx
  88. C esi yp
  89. C edi wp
  90. C ebp
  91. M4op %ebp, %edx
  92. nop
  93. M4post(`xorl $GMP_NUMB_MASK, %eax')
  94. M4post(`xorl $GMP_NUMB_MASK, %edx')
  95. movl %eax, 4(%edi,%ecx,8)
  96. movl %edx, (%edi,%ecx,8)
  97. L(entry):
  98. movl -4(%ebx,%ecx,8), %ebp
  99. nop
  100. movl -4(%esi,%ecx,8), %eax
  101. movl -8(%esi,%ecx,8), %edx
  102. M4pre(` xorl $GMP_NUMB_MASK, %eax')
  103. M4pre(` xorl $GMP_NUMB_MASK, %edx')
  104. M4op %ebp, %eax
  105. movl -8(%ebx,%ecx,8), %ebp
  106. decl %ecx
  107. jnz L(top)
  108. M4op %ebp, %edx
  109. nop
  110. M4post(`xorl $GMP_NUMB_MASK, %eax')
  111. M4post(`xorl $GMP_NUMB_MASK, %edx')
  112. movl %eax, 4(%edi,%ecx,8)
  113. movl %edx, (%edi,%ecx,8)
  114. L(done):
  115. popl %ebp
  116. popl %edi
  117. popl %esi
  118. popl %ebx
  119. ret
  120. EPILOGUE()