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

数学计算

开发平台:

Unix_Linux

  1. dnl  Alpha mpn_sub_n -- Subtract two limb vectors of the same length > 0
  2. dnl  and store difference 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_sub_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. subq r4,r0,r20 C 1st main subtract
  38. ldq r3,24(r18)
  39. subq r19,4,r19 C decr loop cnt
  40. ldq r6,-16(r17)
  41. cmpult r4,r0,r25 C compute cy from last subtract
  42. ldq r7,-8(r17)
  43. subq r5,r1,r28 C 2nd main subtract
  44. addq r18,32,r18 C update s2_ptr
  45. subq r28,r25,r21 C 2nd carry subtract
  46. cmpult r5,r1,r8 C compute cy from last subtract
  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 r28,r25,r25 C compute cy from last subtract
  51. ldq r0,0(r18)
  52. bis r8,r25,r25 C combine cy from the two subtracts
  53. ldq r1,8(r18)
  54. subq r6,r2,r28 C 3rd main subtract
  55. ldq r4,0(r17)
  56. subq r28,r25,r22 C 3rd carry subtract
  57. ldq r5,8(r17)
  58. cmpult r6,r2,r8 C compute cy from last subtract
  59. cmpult r28,r25,r25 C compute cy from last subtract
  60. stq r20,0(r16)
  61. bis r8,r25,r25 C combine cy from the two subtracts
  62. stq r21,8(r16)
  63. subq r7,r3,r28 C 4th main subtract
  64. subq r28,r25,r23 C 4th carry subtract
  65. cmpult r7,r3,r8 C compute cy from last subtract
  66. cmpult r28,r25,r25 C compute cy from last subtract
  67. addq r17,32,r17 C update s1_ptr
  68. bis r8,r25,r25 C combine cy from the two subtracts
  69. addq r16,32,r16 C update res_ptr
  70. subq r4,r0,r28 C 1st main subtract
  71. ldq r2,16(r18)
  72. subq r28,r25,r20 C 1st carry subtract
  73. ldq r3,24(r18)
  74. cmpult r4,r0,r8 C compute cy from last subtract
  75. ldq r6,-16(r17)
  76. cmpult r28,r25,r25 C compute cy from last subtract
  77. ldq r7,-8(r17)
  78. bis r8,r25,r25 C combine cy from the two subtracts
  79. subq r19,4,r19 C decr loop cnt
  80. stq r22,-16(r16)
  81. subq r5,r1,r28 C 2nd main subtract
  82. stq r23,-8(r16)
  83. subq r28,r25,r21 C 2nd carry subtract
  84. addq r18,32,r18 C update s2_ptr
  85. cmpult r5,r1,r8 C compute cy from last subtract
  86. bge r19,$Loop
  87. C Finish software pipeline for 1st loop
  88. $Lend1: cmpult r28,r25,r25 C compute cy from last subtract
  89. bis r8,r25,r25 C combine cy from the two subtracts
  90. subq r6,r2,r28 C cy add
  91. subq r28,r25,r22 C 3rd main subtract
  92. cmpult r6,r2,r8 C compute cy from last subtract
  93. cmpult r28,r25,r25 C compute cy from last subtract
  94. stq r20,0(r16)
  95. bis r8,r25,r25 C combine cy from the two subtracts
  96. stq r21,8(r16)
  97. subq r7,r3,r28 C cy add
  98. subq r28,r25,r23 C 4th main subtract
  99. cmpult r7,r3,r8 C compute cy from last subtract
  100. cmpult r28,r25,r25 C compute cy from last subtract
  101. bis r8,r25,r25 C combine cy from the two subtracts
  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: subq r4,r0,r28 C main subtract
  115. cmpult r4,r0,r8 C compute cy from last subtract
  116. ldq r0,8(r18)
  117. ldq r4,8(r17)
  118. subq r28,r25,r20 C carry subtract
  119. addq r18,8,r18
  120. addq r17,8,r17
  121. stq r20,0(r16)
  122. cmpult r28,r25,r25 C compute cy from last subtract
  123. subq r19,1,r19 C decr loop cnt
  124. bis r8,r25,r25 C combine cy from the two subtracts
  125. addq r16,8,r16
  126. bne r19,$Loop0
  127. $Lend0: subq r4,r0,r28 C main subtract
  128. subq r28,r25,r20 C carry subtract
  129. cmpult r4,r0,r8 C compute cy from last subtract
  130. cmpult r28,r25,r25 C compute cy from last subtract
  131. stq r20,0(r16)
  132. bis r8,r25,r25 C combine cy from the two subtracts
  133. $Lret: bis r25,r31,r0 C return cy
  134. ret r31,(r26),1
  135. EPILOGUE(mpn_sub_n)
  136. ASM_END()