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

数学计算

开发平台:

Unix_Linux

  1. dnl Alpha mpn_mod_34lsub1.
  2. dnl  Copyright 2002 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      cycles/limb
  16. C EV4:     4 (?)
  17. C EV5:     2.67
  18. C EV6:     1.67
  19. dnl  INPUT PARAMETERS
  20. dnl  up r16
  21. dnl  n r17
  22. define(`l0',`r18')
  23. define(`l1',`r19')
  24. define(`l2',`r20')
  25. define(`a0',`r21')
  26. define(`a1',`r22')
  27. define(`a2',`r23')
  28. define(`c0',`r24')
  29. define(`c1',`r5')
  30. define(`c2',`r6')
  31. ASM_START()
  32. PROLOGUE(mpn_mod_34lsub1)
  33. bis r31, r31, c0
  34. bis r31, r31, c1
  35. bis r31, r31, c2
  36. lda r17, -3(r17)
  37. bge r17, $L_3_or_more
  38. bis r31, r31, a0
  39. bis r31, r31, a1
  40. bis r31, r31, a2
  41. br r31, $L_012
  42. $L_3_or_more:
  43. ldq a0, 0(r16)
  44. ldq a1, 8(r16)
  45. ldq a2, 16(r16)
  46. lda r16, 24(r16)
  47. lda r17, -3(r17)
  48. blt r17, $L_012
  49. $L_6_or_more:
  50. ldq l0, 0(r16)
  51. ldq l1, 8(r16)
  52. ldq l2, 16(r16)
  53. addq l0, a0, a0
  54. lda r16, 24(r16)
  55. lda r17, -3(r17)
  56. blt r17, $L_end
  57. ALIGN(16)
  58. C Main loop
  59. $L_9_or_more:
  60. $Loop: cmpult a0, l0, r0
  61. ldq l0, 0(r16)
  62. addq r0, c0, c0
  63. addq l1, a1, a1
  64. cmpult a1, l1, r0
  65. ldq l1, 8(r16)
  66. addq r0, c1, c1
  67. addq l2, a2, a2
  68. cmpult a2, l2, r0
  69. ldq l2, 16(r16)
  70. addq r0, c2, c2
  71. addq l0, a0, a0
  72. lda r16, 24(r16)
  73. lda r17, -3(r17)
  74. bge r17, $Loop
  75. $L_end: cmpult a0, l0, r0
  76. addq r0, c0, c0
  77. addq l1, a1, a1
  78. cmpult a1, l1, r0
  79. addq r0, c1, c1
  80. addq l2, a2, a2
  81. cmpult a2, l2, r0
  82. addq r0, c2, c2
  83. C Handle the last (n mod 3) limbs
  84. $L_012: lda r17, 2(r17)
  85. blt r17, $L_0
  86. ldq l0, 0(r16)
  87. addq l0, a0, a0
  88. cmpult a0, l0, r0
  89. addq r0, c0, c0
  90. beq r17, $L_0
  91. ldq l1, 8(r16)
  92. addq l1, a1, a1
  93. cmpult a1, l1, r0
  94. addq r0, c1, c1
  95. C Align and sum our 3 main accumulators and 3 carry accumulators
  96. $L_0: srl a0, 48, r2
  97. srl a1, 32, r4
  98. ifdef(`HAVE_LIMB_LITTLE_ENDIAN',
  99. ` insll a1, 2, r1', C (a1 & 0xffffffff) << 16
  100. ` zapnot a1, 15, r25
  101. sll r25, 16, r1')
  102. zapnot a0, 63, r0 C a0 & 0xffffffffffff
  103. srl a2, 16, a1
  104. ifdef(`HAVE_LIMB_LITTLE_ENDIAN',
  105. ` inswl a2, 4, r3', C (a2 & 0xffff) << 32
  106. ` zapnot a2, 3, r25
  107. sll r25, 32, r3')
  108. addq r1, r4, r1
  109. addq r0, r2, r0
  110. srl c0, 32, a2
  111. ifdef(`HAVE_LIMB_LITTLE_ENDIAN',
  112. ` insll c0, 2, r4', C (c0 & 0xffffffff) << 16
  113. ` zapnot c0, 15, r25
  114. sll r25, 16, r4')
  115. addq r0, r1, r0
  116. addq r3, a1, r3
  117. addq r0, r3, r0
  118. srl c1, 16, c0
  119. ifdef(`HAVE_LIMB_LITTLE_ENDIAN',
  120. ` inswl c1, 4, r2', C (c1 & 0xffff) << 32
  121. ` zapnot c1, 3, r25
  122. sll r25, 32, r2')
  123. addq r4, a2, r4
  124. C srl c2, 48, r3 C This will be 0 in practise
  125. zapnot c2, 63, r1 C r1 = c2 & 0xffffffffffff
  126. addq r0, r4, r0
  127. addq r2, c0, r2
  128. addq r0, r2, r0
  129. C addq r1, r3, r1
  130. addq r0, r1, r0
  131. ret r31, (r26), 1
  132. EPILOGUE(mpn_mod_34lsub1)
  133. ASM_END()