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

数学计算

开发平台:

Unix_Linux

  1. dnl  HP-PA 7100/7200 mpn_addmul_1 -- Multiply a limb vector with a limb and
  2. dnl  add the result to a second limb vector.
  3. dnl  Copyright 1995, 2000, 2001, 2002, 2003 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 INPUT PARAMETERS
  17. define(`res_ptr',`%r26')
  18. define(`s1_ptr',`%r25')
  19. define(`size_param',`%r24')
  20. define(`s2_limb',`%r23')
  21. define(`cylimb',`%r28')
  22. define(`s0',`%r19')
  23. define(`s1',`%r20')
  24. define(`s2',`%r3')
  25. define(`s3',`%r4')
  26. define(`lo0',`%r21')
  27. define(`lo1',`%r5')
  28. define(`lo2',`%r6')
  29. define(`lo3',`%r7')
  30. define(`hi0',`%r22')
  31. define(`hi1',`%r23') C safe to reuse
  32. define(`hi2',`%r29')
  33. define(`hi3',`%r1')
  34. ASM_START()
  35. PROLOGUE(mpn_addmul_1)
  36. C .callinfo frame=128,no_calls
  37. ldo 128(%r30),%r30
  38. stws s2_limb,-16(%r30)
  39. add  %r0,%r0,cylimb C clear cy and cylimb
  40. addib,< -4,size_param,L(few_limbs)
  41. fldws -16(%r30),%fr31R
  42. ldo -112(%r30),%r31
  43. stw %r3,-96(%r30)
  44. stw %r4,-92(%r30)
  45. stw %r5,-88(%r30)
  46. stw %r6,-84(%r30)
  47. stw %r7,-80(%r30)
  48. bb,>=,n  s1_ptr,29,L(0)
  49. fldws,ma 4(s1_ptr),%fr4
  50. ldws  0(res_ptr),s0
  51. xmpyu  %fr4,%fr31R,%fr5
  52. fstds  %fr5,-16(%r31)
  53. ldws -16(%r31),cylimb
  54. ldws -12(%r31),lo0
  55. add  s0,lo0,s0
  56. addib,< -1,size_param,L(few_limbs)
  57. stws,ma  s0,4(res_ptr)
  58. C start software pipeline ----------------------------------------------------
  59. LDEF(0)
  60. fldds,ma 8(s1_ptr),%fr4
  61. fldds,ma 8(s1_ptr),%fr8
  62. xmpyu  %fr4L,%fr31R,%fr5
  63. xmpyu  %fr4R,%fr31R,%fr6
  64. xmpyu  %fr8L,%fr31R,%fr9
  65. xmpyu  %fr8R,%fr31R,%fr10
  66. fstds  %fr5,-16(%r31)
  67. fstds  %fr6,-8(%r31)
  68. fstds  %fr9,0(%r31)
  69. fstds  %fr10,8(%r31)
  70. ldws   -16(%r31),hi0
  71. ldws   -12(%r31),lo0
  72. ldws -8(%r31),hi1
  73. ldws -4(%r31),lo1
  74. ldws  0(%r31),hi2
  75. ldws  4(%r31),lo2
  76. ldws  8(%r31),hi3
  77. ldws 12(%r31),lo3
  78. addc  lo0,cylimb,lo0
  79. addc  lo1,hi0,lo1
  80. addc  lo2,hi1,lo2
  81. addc  lo3,hi2,lo3
  82. addib,<  -4,size_param,L(end)
  83. addc  %r0,hi3,cylimb C propagate carry into cylimb
  84. C main loop ------------------------------------------------------------------
  85. LDEF(loop)
  86. fldds,ma 8(s1_ptr),%fr4
  87. fldds,ma 8(s1_ptr),%fr8
  88. ldws  0(res_ptr),s0
  89. xmpyu  %fr4L,%fr31R,%fr5
  90. ldws  4(res_ptr),s1
  91. xmpyu  %fr4R,%fr31R,%fr6
  92. ldws  8(res_ptr),s2
  93. xmpyu  %fr8L,%fr31R,%fr9
  94. ldws 12(res_ptr),s3
  95. xmpyu  %fr8R,%fr31R,%fr10
  96. fstds  %fr5,-16(%r31)
  97. add  s0,lo0,s0
  98. fstds  %fr6,-8(%r31)
  99. addc  s1,lo1,s1
  100. fstds  %fr9,0(%r31)
  101. addc  s2,lo2,s2
  102. fstds  %fr10,8(%r31)
  103. addc  s3,lo3,s3
  104. ldws   -16(%r31),hi0
  105. ldws   -12(%r31),lo0
  106. ldws -8(%r31),hi1
  107. ldws -4(%r31),lo1
  108. ldws  0(%r31),hi2
  109. ldws  4(%r31),lo2
  110. ldws  8(%r31),hi3
  111. ldws 12(%r31),lo3
  112. addc  lo0,cylimb,lo0
  113. stws,ma  s0,4(res_ptr)
  114. addc  lo1,hi0,lo1
  115. stws,ma  s1,4(res_ptr)
  116. addc  lo2,hi1,lo2
  117. stws,ma  s2,4(res_ptr)
  118. addc  lo3,hi2,lo3
  119. stws,ma  s3,4(res_ptr)
  120. addib,>= -4,size_param,L(loop)
  121. addc  %r0,hi3,cylimb C propagate carry into cylimb
  122. C finish software pipeline ---------------------------------------------------
  123. LDEF(end)
  124. ldws  0(res_ptr),s0
  125. ldws  4(res_ptr),s1
  126. ldws  8(res_ptr),s2
  127. ldws 12(res_ptr),s3
  128. add  s0,lo0,s0
  129. stws,ma  s0,4(res_ptr)
  130. addc  s1,lo1,s1
  131. stws,ma  s1,4(res_ptr)
  132. addc  s2,lo2,s2
  133. stws,ma  s2,4(res_ptr)
  134. addc  s3,lo3,s3
  135. stws,ma  s3,4(res_ptr)
  136. C restore callee-saves registers ---------------------------------------------
  137. ldw -96(%r30),%r3
  138. ldw -92(%r30),%r4
  139. ldw -88(%r30),%r5
  140. ldw -84(%r30),%r6
  141. ldw -80(%r30),%r7
  142. LDEF(few_limbs)
  143. addib,=,n 4,size_param,L(ret)
  144. LDEF(loop2)
  145. fldws,ma 4(s1_ptr),%fr4
  146. ldws  0(res_ptr),s0
  147. xmpyu  %fr4,%fr31R,%fr5
  148. fstds  %fr5,-16(%r30)
  149. ldws -16(%r30),hi0
  150. ldws -12(%r30),lo0
  151. addc  lo0,cylimb,lo0
  152. addc  %r0,hi0,cylimb
  153. add  s0,lo0,s0
  154. stws,ma  s0,4(res_ptr)
  155. addib,<> -1,size_param,L(loop2)
  156. nop
  157. LDEF(ret)
  158. addc  %r0,cylimb,cylimb
  159. bv  0(%r2)
  160. ldo  -128(%r30),%r30
  161. EPILOGUE(mpn_addmul_1)