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

数学计算

开发平台:

Unix_Linux

  1. dnl  Alpha mpn_add_n -- Add two limb vectors of the same length > 0 and
  2. dnl  store sum in a third limb vector.
  3. dnl  Copyright 1995, 1999, 2000, 2005 Free Software Foundation, Inc.
  4. dnl  This file is part of the GNU MP Library.
  5. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  6. dnl  it under the terms of the GNU Lesser General Public License as published
  7. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  8. dnl  your option) any later version.
  9. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  10. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  11. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  12. dnl  License for more details.
  13. dnl  You should have received a copy of the GNU Lesser General Public License
  14. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  15. include(`../config.m4')
  16. C      cycles/limb
  17. C EV4:     ?
  18. C EV5:     4.75
  19. C EV6:     3
  20. dnl  INPUT PARAMETERS
  21. dnl  res_ptr r16
  22. dnl  s1_ptr r17
  23. dnl  s2_ptr r18
  24. dnl  size r19
  25. ASM_START()
  26. PROLOGUE(mpn_add_n)
  27. bis r31,r31,r25 C clear cy
  28. subq r19,4,r19 C decr loop cnt
  29. blt r19,$Lend2 C if less than 4 limbs, goto 2nd loop
  30. C Start software pipeline for 1st loop
  31. ldq r0,0(r18)
  32. ldq r4,0(r17)
  33. ldq r1,8(r18)
  34. ldq r5,8(r17)
  35. addq r17,32,r17 C update s1_ptr
  36. ldq r2,16(r18)
  37. addq r0,r4,r20 C 1st main add
  38. ldq r3,24(r18)
  39. subq r19,4,r19 C decr loop cnt
  40. ldq r6,-16(r17)
  41. cmpult r20,r0,r25 C compute cy from last add
  42. ldq r7,-8(r17)
  43. addq r1,r5,r28 C 2nd main add
  44. addq r18,32,r18 C update s2_ptr
  45. addq r28,r25,r21 C 2nd carry add
  46. cmpult r28,r5,r8 C compute cy from last add
  47. blt r19,$Lend1 C if less than 4 limbs remain, jump
  48. C 1st loop handles groups of 4 limbs in a software pipeline
  49. ALIGN(16)
  50. $Loop: cmpult r21,r28,r25 C compute cy from last add
  51. ldq r0,0(r18)
  52. bis r8,r25,r25 C combine cy from the two adds
  53. ldq r1,8(r18)
  54. addq r2,r6,r28 C 3rd main add
  55. ldq r4,0(r17)
  56. addq r28,r25,r22 C 3rd carry add
  57. ldq r5,8(r17)
  58. cmpult r28,r6,r8 C compute cy from last add
  59. cmpult r22,r28,r25 C compute cy from last add
  60. stq r20,0(r16)
  61. bis r8,r25,r25 C combine cy from the two adds
  62. stq r21,8(r16)
  63. addq r3,r7,r28 C 4th main add
  64. addq r28,r25,r23 C 4th carry add
  65. cmpult r28,r7,r8 C compute cy from last add
  66. cmpult r23,r28,r25 C compute cy from last add
  67. addq r17,32,r17 C update s1_ptr
  68. bis r8,r25,r25 C combine cy from the two adds
  69. addq r16,32,r16 C update res_ptr
  70. addq r0,r4,r28 C 1st main add
  71. ldq r2,16(r18)
  72. addq r25,r28,r20 C 1st carry add
  73. ldq r3,24(r18)
  74. cmpult r28,r4,r8 C compute cy from last add
  75. ldq r6,-16(r17)
  76. cmpult r20,r28,r25 C compute cy from last add
  77. ldq r7,-8(r17)
  78. bis r8,r25,r25 C combine cy from the two adds
  79. subq r19,4,r19 C decr loop cnt
  80. stq r22,-16(r16)
  81. addq r1,r5,r28 C 2nd main add
  82. stq r23,-8(r16)
  83. addq r25,r28,r21 C 2nd carry add
  84. addq r18,32,r18 C update s2_ptr
  85. cmpult r28,r5,r8 C compute cy from last add
  86. bge r19,$Loop
  87. C Finish software pipeline for 1st loop
  88. $Lend1: cmpult r21,r28,r25 C compute cy from last add
  89. bis r8,r25,r25 C combine cy from the two adds
  90. addq r2,r6,r28 C 3rd main add
  91. addq r28,r25,r22 C 3rd carry add
  92. cmpult r28,r6,r8 C compute cy from last add
  93. cmpult r22,r28,r25 C compute cy from last add
  94. stq r20,0(r16)
  95. bis r8,r25,r25 C combine cy from the two adds
  96. stq r21,8(r16)
  97. addq r3,r7,r28 C 4th main add
  98. addq r28,r25,r23 C 4th carry add
  99. cmpult r28,r7,r8 C compute cy from last add
  100. cmpult r23,r28,r25 C compute cy from last add
  101. bis r8,r25,r25 C combine cy from the two adds
  102. addq r16,32,r16 C update res_ptr
  103. stq r22,-16(r16)
  104. stq r23,-8(r16)
  105. $Lend2: addq r19,4,r19 C restore loop cnt
  106. beq r19,$Lret
  107. C Start software pipeline for 2nd loop
  108. ldq r0,0(r18)
  109. ldq r4,0(r17)
  110. subq r19,1,r19
  111. beq r19,$Lend0
  112. C 2nd loop handles remaining 1-3 limbs
  113. ALIGN(16)
  114. $Loop0: addq r0,r4,r28 C main add
  115. ldq r0,8(r18)
  116. cmpult r28,r4,r8 C compute cy from last add
  117. ldq r4,8(r17)
  118. addq r28,r25,r20 C carry add
  119. addq r18,8,r18
  120. addq r17,8,r17
  121. stq r20,0(r16)
  122. cmpult r20,r28,r25 C compute cy from last add
  123. subq r19,1,r19 C decr loop cnt
  124. bis r8,r25,r25 C combine cy from the two adds
  125. addq r16,8,r16
  126. bne r19,$Loop0
  127. $Lend0: addq r0,r4,r28 C main add
  128. addq r28,r25,r20 C carry add
  129. cmpult r28,r4,r8 C compute cy from last add
  130. cmpult r20,r28,r25 C compute cy from last add
  131. stq r20,0(r16)
  132. bis r8,r25,r25 C combine cy from the two adds
  133. $Lret: bis r25,r31,r0 C return cy
  134. ret r31,(r26),1
  135. EPILOGUE(mpn_add_n)
  136. ASM_END()