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

数学计算

开发平台:

Unix_Linux

  1. dnl  AMD64 mpn_addlsh_n and mpn_rsblsh_n.  R = V2^k +- U.
  2. dnl  ("rsb" means reversed subtract, name mandated by mpn_sublsh1_n which
  3. dnl  subtacts the shifted operand from the unshifted operand.)
  4. dnl  Copyright 2006 Free Software Foundation, Inc.
  5. dnl  This file is part of the GNU MP Library.
  6. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  7. dnl  it under the terms of the GNU Lesser General Public License as published
  8. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  9. dnl  your option) any later version.
  10. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  11. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  12. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  13. dnl  License for more details.
  14. dnl  You should have received a copy of the GNU Lesser General Public License
  15. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  16. include(`../config.m4')
  17. C      cycles/limb
  18. C K8,K9:  3.25 (mpn_lshift + mpn_add_n costs about 4.1 c/l)
  19. C K10:  3.25 (mpn_lshift + mpn_add_n costs about 4.1 c/l)
  20. C P4: 14
  21. C P6-15:  4
  22. C This was written quickly and not optimized at all.  Surely one could get
  23. C closer to 3 c/l or perhaps even under 3 c/l.  Ideas:
  24. C   1) Use indexing to save the 3 LEA
  25. C   2) Write reasonable feed-in code
  26. C   3) Be more clever about register usage
  27. C   4) Unroll more, handling CL negation, carry save/restore cost much now
  28. C   5) Reschedule
  29. C INPUT PARAMETERS
  30. define(`rp', `%rdi')
  31. define(`up', `%rsi')
  32. define(`vp', `%rdx')
  33. define(`n', `%rcx')
  34. define(`cnt' `%r8')
  35. ifdef(`OPERATION_addlsh_n',`
  36.   define(ADDSUBC,       `adc')
  37.   define(func, mpn_addlsh_n)
  38. ')
  39. ifdef(`OPERATION_rsblsh_n',`
  40.   define(ADDSUBC,       `sbb')
  41.   define(func, mpn_rsblsh_n)
  42. ')
  43. MULFUNC_PROLOGUE(mpn_addlsh_n mpn_rsblsh_n)
  44. ASM_START()
  45. TEXT
  46. ALIGN(16)
  47. PROLOGUE(func)
  48. push %r12
  49. push %r13
  50. push %r14
  51. push %r15
  52. push %rbx
  53. mov n, %rax
  54. xor %ebx, %ebx C clear carry save register
  55. mov %r8d, %ecx C shift count
  56. xor %r15d, %r15d C limb carry
  57. mov %eax, %r11d
  58. and $3, %r11d
  59. je L(4)
  60. sub $1, %r11d
  61. L(oopette):
  62. mov 0(vp), %r8
  63. mov %r8, %r12
  64. shl %cl, %r8
  65. or %r15, %r8
  66. neg %cl
  67. mov %r12, %r15
  68. shr %cl, %r15
  69. neg %cl
  70. add %ebx, %ebx
  71. ADDSUBC 0(up), %r8
  72. mov %r8, 0(rp)
  73. sbb %ebx, %ebx
  74. lea 8(up), up
  75. lea 8(vp), vp
  76. lea 8(rp), rp
  77. sub $1, %r11d
  78. jnc L(oopette)
  79. L(4):
  80. sub $4, %rax
  81. jc L(end)
  82. L(oop):
  83. mov 0(vp), %r8
  84. mov %r8, %r12
  85. mov 8(vp), %r9
  86. mov %r9, %r13
  87. mov 16(vp), %r10
  88. mov %r10, %r14
  89. mov 24(vp), %r11
  90. shl %cl, %r8
  91. shl %cl, %r9
  92. shl %cl, %r10
  93. or %r15, %r8
  94. mov %r11, %r15
  95. shl %cl, %r11
  96. neg %cl
  97. shr %cl, %r12
  98. shr %cl, %r13
  99. shr %cl, %r14
  100. shr %cl, %r15 C used next loop
  101. or %r12, %r9
  102. or %r13, %r10
  103. or %r14, %r11
  104. neg %cl
  105. add %ebx, %ebx C restore carry flag
  106. ADDSUBC 0(up), %r8
  107. ADDSUBC 8(up), %r9
  108. ADDSUBC 16(up), %r10
  109. ADDSUBC 24(up), %r11
  110. mov %r8, 0(rp)
  111. mov %r9, 8(rp)
  112. mov %r10, 16(rp)
  113. mov %r11, 24(rp)
  114. sbb %ebx, %ebx C save carry flag
  115. lea 32(up), up
  116. lea 32(vp), vp
  117. lea 32(rp), rp
  118. sub $4, %rax
  119. jnc L(oop)
  120. L(end):
  121. add %ebx, %ebx
  122. ADDSUBC $0, %r15
  123. mov %r15, %rax
  124. pop %rbx
  125. pop %r15
  126. pop %r14
  127. pop %r13
  128. pop %r12
  129. ret
  130. EPILOGUE()