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

数学计算

开发平台:

Unix_Linux

  1. dnl  HP-PA 7100/7200 mpn_submul_1 -- Multiply a limb vector with a limb and
  2. dnl  subtract the result from 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_submul_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. sub  s0,lo0,s0
  56. add  s0,lo0,%r0 C invert cy
  57. addib,< -1,size_param,L(few_limbs)
  58. stws,ma  s0,4(res_ptr)
  59. C start software pipeline ----------------------------------------------------
  60. LDEF(0)
  61. fldds,ma 8(s1_ptr),%fr4
  62. fldds,ma 8(s1_ptr),%fr8
  63. xmpyu  %fr4L,%fr31R,%fr5
  64. xmpyu  %fr4R,%fr31R,%fr6
  65. xmpyu  %fr8L,%fr31R,%fr9
  66. xmpyu  %fr8R,%fr31R,%fr10
  67. fstds  %fr5,-16(%r31)
  68. fstds  %fr6,-8(%r31)
  69. fstds  %fr9,0(%r31)
  70. fstds  %fr10,8(%r31)
  71. ldws   -16(%r31),hi0
  72. ldws   -12(%r31),lo0
  73. ldws -8(%r31),hi1
  74. ldws -4(%r31),lo1
  75. ldws  0(%r31),hi2
  76. ldws  4(%r31),lo2
  77. ldws  8(%r31),hi3
  78. ldws 12(%r31),lo3
  79. addc  lo0,cylimb,lo0
  80. addc  lo1,hi0,lo1
  81. addc  lo2,hi1,lo2
  82. addc  lo3,hi2,lo3
  83. addib,<  -4,size_param,L(end)
  84. addc  %r0,hi3,cylimb C propagate carry into cylimb
  85. C main loop ------------------------------------------------------------------
  86. LDEF(loop)
  87. fldds,ma 8(s1_ptr),%fr4
  88. fldds,ma 8(s1_ptr),%fr8
  89. ldws  0(res_ptr),s0
  90. xmpyu  %fr4L,%fr31R,%fr5
  91. ldws  4(res_ptr),s1
  92. xmpyu  %fr4R,%fr31R,%fr6
  93. ldws  8(res_ptr),s2
  94. xmpyu  %fr8L,%fr31R,%fr9
  95. ldws 12(res_ptr),s3
  96. xmpyu  %fr8R,%fr31R,%fr10
  97. fstds  %fr5,-16(%r31)
  98. sub  s0,lo0,s0
  99. fstds  %fr6,-8(%r31)
  100. subb  s1,lo1,s1
  101. fstds  %fr9,0(%r31)
  102. subb  s2,lo2,s2
  103. fstds  %fr10,8(%r31)
  104. subb  s3,lo3,s3
  105. subb  %r0,%r0,lo0 C these two insns ...
  106. add  lo0,lo0,%r0 C ... just invert cy
  107. ldws   -16(%r31),hi0
  108. ldws   -12(%r31),lo0
  109. ldws -8(%r31),hi1
  110. ldws -4(%r31),lo1
  111. ldws  0(%r31),hi2
  112. ldws  4(%r31),lo2
  113. ldws  8(%r31),hi3
  114. ldws 12(%r31),lo3
  115. addc  lo0,cylimb,lo0
  116. stws,ma  s0,4(res_ptr)
  117. addc  lo1,hi0,lo1
  118. stws,ma  s1,4(res_ptr)
  119. addc  lo2,hi1,lo2
  120. stws,ma  s2,4(res_ptr)
  121. addc  lo3,hi2,lo3
  122. stws,ma  s3,4(res_ptr)
  123. addib,>= -4,size_param,L(loop)
  124. addc  %r0,hi3,cylimb C propagate carry into cylimb
  125. C finish software pipeline ---------------------------------------------------
  126. LDEF(end)
  127. ldws  0(res_ptr),s0
  128. ldws  4(res_ptr),s1
  129. ldws  8(res_ptr),s2
  130. ldws 12(res_ptr),s3
  131. sub  s0,lo0,s0
  132. stws,ma  s0,4(res_ptr)
  133. subb  s1,lo1,s1
  134. stws,ma  s1,4(res_ptr)
  135. subb  s2,lo2,s2
  136. stws,ma  s2,4(res_ptr)
  137. subb  s3,lo3,s3
  138. stws,ma  s3,4(res_ptr)
  139. subb  %r0,%r0,lo0 C these two insns ...
  140. add  lo0,lo0,%r0 C ... invert cy
  141. C restore callee-saves registers ---------------------------------------------
  142. ldw -96(%r30),%r3
  143. ldw -92(%r30),%r4
  144. ldw -88(%r30),%r5
  145. ldw -84(%r30),%r6
  146. ldw -80(%r30),%r7
  147. LDEF(few_limbs)
  148. addib,=,n 4,size_param,L(ret)
  149. LDEF(loop2)
  150. fldws,ma 4(s1_ptr),%fr4
  151. ldws  0(res_ptr),s0
  152. xmpyu  %fr4,%fr31R,%fr5
  153. fstds  %fr5,-16(%r30)
  154. ldws -16(%r30),hi0
  155. ldws -12(%r30),lo0
  156. addc  lo0,cylimb,lo0
  157. addc  %r0,hi0,cylimb
  158. sub  s0,lo0,s0
  159. add  s0,lo0,%r0 C invert cy
  160. stws,ma  s0,4(res_ptr)
  161. addib,<> -1,size_param,L(loop2)
  162. nop
  163. LDEF(ret)
  164. addc  %r0,cylimb,cylimb
  165. bv  0(%r2)
  166. ldo  -128(%r30),%r30
  167. EPILOGUE(mpn_submul_1)