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

数学计算

开发平台:

Unix_Linux

  1. dnl  Alpha ev6 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 2000, 2003, 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:     5.4
  19. C EV6:     2.125
  20. C  INPUT PARAMETERS
  21. C  rp r16
  22. C  up r17
  23. C  vp r18
  24. C  n r19
  25. C  cy r20   (for mpn_add_nc)
  26. C TODO
  27. C   Finish cleaning up cy registers r22, r23 (make them use cy0/cy1)
  28. C   Use multi-pronged feed-in.
  29. C   Perform additional micro-tuning
  30. C  This code was written in cooperation with ev6 pipeline expert Steve Root.
  31. C  Pair loads and stores where possible
  32. C  Store pairs oct-aligned where possible (didn't need it here)
  33. C  Stores are delayed every third cycle
  34. C  Loads and stores are delayed by fills
  35. C  U stays still, put code there where possible (note alternation of U1 and U0)
  36. C  L moves because of loads and stores
  37. C  Note dampers in L to limit damage
  38. C  This odd-looking optimization expects that were having random bits in our
  39. C  data, so that a pure zero result is unlikely. so we penalize the unlikely
  40. C  case to help the common case.
  41. define(`u0', `r0')  define(`u1', `r3')
  42. define(`v0', `r1')  define(`v1', `r4')
  43. define(`cy0', `r20')  define(`cy1', `r21')
  44. MULFUNC_PROLOGUE(mpn_sub_n mpn_sub_nc)
  45. ASM_START()
  46. PROLOGUE(mpn_sub_nc)
  47. br r31, $entry
  48. EPILOGUE()
  49. PROLOGUE(mpn_sub_n)
  50. bis r31, r31, cy0 C clear carry in
  51. $entry: cmpult r19, 5, r22 C L1 move counter
  52. ldq u1, 0(r17) C L0 get next ones
  53. ldq v1, 0(r18) C L1
  54. bne r22, $Lsmall
  55. ldq u0, 8(r17) C L0 get next ones
  56. ldq v0, 8(r18) C L1
  57. subq u1, v1, r5 C U0 sub two data
  58. cmpult u1, v1, r23 C U0 did it borrow
  59. ldq u1, 16(r17) C L0 get next ones
  60. ldq v1, 16(r18) C L1
  61. subq u0, v0, r8 C U1 sub two data
  62. subq r5, cy0, r24 C U0 borrow in
  63. cmpult u0, v0, r22 C U1 did it borrow
  64. beq r5, $fix5f C U0 fix exact zero
  65. $ret5f: ldq u0, 24(r17) C L0 get next ones
  66. ldq v0, 24(r18) C L1
  67. subq r8, r23, r25 C U1 borrow from last
  68. subq u1, v1, r7 C U0 sub two data
  69. beq r8, $fix6f C U1 fix exact zero
  70. $ret6f: cmpult u1, v1, r23 C U0 did it borrow
  71. ldq u1, 32(r17) C L0 get next ones
  72. ldq v1, 32(r18) C L1
  73. lda r17, 40(r17) C L0 move pointer
  74. lda r18, 40(r18) C L1 move pointer
  75. lda r16, -8(r16)
  76. lda r19, -13(r19) C L1 move counter
  77. blt r19, $Lend C U1 loop control
  78. C Main loop.  8-way unrolled.
  79. ALIGN(16)
  80. $Loop: subq u0, v0, r2 C U1 sub two data
  81. stq r24, 8(r16) C L0 put an answer
  82. subq r7, r22, r24 C U0 borrow from last
  83. stq r25, 16(r16) C L1 pair
  84. cmpult u0, v0, cy1 C U1 did it borrow
  85. beq r7, $fix7 C U0 fix exact 0
  86. $ret7: ldq u0, 0(r17) C L0 get next ones
  87. ldq v0, 0(r18) C L1
  88. bis r31, r31, r31 C L  damp out
  89. subq r2, r23, r25 C U1 borrow from last
  90. bis r31, r31, r31 C L  moves in L !
  91. subq u1, v1, r5 C U0 sub two data
  92. beq r2, $fix0 C U1 fix exact zero
  93. $ret0: cmpult u1, v1, cy0 C U0 did it borrow
  94. ldq u1, 8(r17) C L0 get next ones
  95. ldq v1, 8(r18) C L1
  96. subq u0, v0, r8 C U1 sub two data
  97. stq r24, 24(r16) C L0 store pair
  98. subq r5, cy1, r24 C U0 borrow from last
  99. stq r25, 32(r16) C L1
  100. cmpult u0, v0, r22 C U1 did it borrow
  101. beq r5, $fix1 C U0 fix exact zero
  102. $ret1: ldq u0, 16(r17) C L0 get next ones
  103. ldq v0, 16(r18) C L1
  104. lda r16, 64(r16) C L0 move pointer
  105. subq r8, cy0, r25 C U1 borrow from last
  106. lda r19, -8(r19) C L1 move counter
  107. subq u1, v1, r7 C U0 sub two data
  108. beq r8, $fix2 C U1 fix exact zero
  109. $ret2: cmpult u1, v1, r23 C U0 did it borrow
  110. ldq u1, 24(r17) C L0 get next ones
  111. ldq v1, 24(r18) C L1
  112. subq u0, v0, r2 C U1 sub two data
  113. stq r24, -24(r16) C L0 put an answer
  114. subq r7, r22, r24 C U0 borrow from last
  115. stq r25, -16(r16) C L1 pair
  116. cmpult u0, v0, cy1 C U1 did it borrow
  117. beq r7, $fix3 C U0 fix exact 0
  118. $ret3: ldq u0, 32(r17) C L0 get next ones
  119. ldq v0, 32(r18) C L1
  120. bis r31, r31, r31 C L  damp out
  121. subq r2, r23, r25 C U1 borrow from last
  122. bis r31, r31, r31 C L  moves in L !
  123. subq u1, v1, r5 C U0 sub two data
  124. beq r2, $fix4 C U1 fix exact zero
  125. $ret4: cmpult u1, v1, cy0 C U0 did it borrow
  126. ldq u1, 40(r17) C L0 get next ones
  127. ldq v1, 40(r18) C L1
  128. subq u0, v0, r8 C U1 sub two data
  129. stq r24, -8(r16) C L0 store pair
  130. subq r5, cy1, r24 C U0 borrow from last
  131. stq r25, 0(r16) C L1
  132. cmpult u0, v0, r22 C U1 did it borrow
  133. beq r5, $fix5 C U0 fix exact zero
  134. $ret5: ldq u0, 48(r17) C L0 get next ones
  135. ldq v0, 48(r18) C L1
  136. ldl r31, 256(r17) C L0 prefetch
  137. subq r8, cy0, r25 C U1 borrow from last
  138. ldl r31, 256(r18) C L1 prefetch
  139. subq u1, v1, r7 C U0 sub two data
  140. beq r8, $fix6 C U1 fix exact zero
  141. $ret6: cmpult u1, v1, r23 C U0 did it borrow
  142. ldq u1, 56(r17) C L0 get next ones
  143. ldq v1, 56(r18) C L1
  144. lda r17, 64(r17) C L0 move pointer
  145. bis r31, r31, r31 C U
  146. lda r18, 64(r18) C L1 move pointer
  147. bge r19, $Loop C U1 loop control
  148. C ==== main loop end
  149. $Lend: subq u0, v0, r2 C U1 sub two data
  150. stq r24, 8(r16) C L0 put an answer
  151. subq r7, r22, r24 C U0 borrow from last
  152. stq r25, 16(r16) C L1 pair
  153. cmpult u0, v0, cy1 C U1 did it borrow
  154. beq r7, $fix7c C U0 fix exact 0
  155. $ret7c: subq r2, r23, r25 C U1 borrow from last
  156. subq u1, v1, r5 C U0 sub two data
  157. beq r2, $fix0c C U1 fix exact zero
  158. $ret0c: cmpult u1, v1, cy0 C U0 did it borrow
  159. stq r24, 24(r16) C L0 store pair
  160. subq r5, cy1, r24 C U0 borrow from last
  161. stq r25, 32(r16) C L1
  162. beq r5, $fix1c C U0 fix exact zero
  163. $ret1c: stq r24, 40(r16) C L0 put an answer
  164. lda r16, 48(r16) C L0 move pointer
  165. lda r19, 8(r19)
  166. beq r19, $Lret
  167. ldq u1, 0(r17)
  168. ldq v1, 0(r18)
  169. $Lsmall:
  170. lda r19, -1(r19)
  171. beq r19, $Lend0
  172. ALIGN(8)
  173. $Loop0: subq u1, v1, r2 C main sub
  174. cmpult u1, v1, r8 C compute bw from last sub
  175. ldq u1, 8(r17)
  176. ldq v1, 8(r18)
  177. subq r2, cy0, r5 C borrow sub
  178. lda r17, 8(r17)
  179. lda r18, 8(r18)
  180. stq r5, 0(r16)
  181. cmpult r2, cy0, cy0 C compute bw from last sub
  182. lda r19, -1(r19) C decr loop cnt
  183. bis r8, cy0, cy0 C combine bw from the two subs
  184. lda r16, 8(r16)
  185. bne r19, $Loop0
  186. $Lend0: subq u1, v1, r2 C main sub
  187. subq r2, cy0, r5 C borrow sub
  188. cmpult u1, v1, r8 C compute bw from last sub
  189. cmpult r2, cy0, cy0 C compute bw from last sub
  190. stq r5, 0(r16)
  191. bis r8, cy0, r0 C combine bw from the two subs
  192. ret r31,(r26),1
  193. ALIGN(8)
  194. $Lret: lda r0, 0(cy0) C copy borrow into return register
  195. ret r31,(r26),1
  196. $fix5f: bis r23, cy0, r23 C bring forward borrow
  197. br r31, $ret5f
  198. $fix6f: bis r22, r23, r22 C bring forward borrow
  199. br r31, $ret6f
  200. $fix0: bis cy1, r23, cy1 C bring forward borrow
  201. br r31, $ret0
  202. $fix1: bis cy0, cy1, cy0 C bring forward borrow
  203. br r31, $ret1
  204. $fix2: bis r22, cy0, r22 C bring forward borrow
  205. br r31, $ret2
  206. $fix3: bis r23, r22, r23 C bring forward borrow
  207. br r31, $ret3
  208. $fix4: bis cy1, r23, cy1 C bring forward borrow
  209. br r31, $ret4
  210. $fix5: bis cy1, cy0, cy0 C bring forward borrow
  211. br r31, $ret5
  212. $fix6: bis r22, cy0, r22 C bring forward borrow
  213. br r31, $ret6
  214. $fix7: bis r23, r22, r23 C bring forward borrow
  215. br r31, $ret7
  216. $fix0c: bis cy1, r23, cy1 C bring forward borrow
  217. br r31, $ret0c
  218. $fix1c: bis cy0, cy1, cy0 C bring forward borrow
  219. br r31, $ret1c
  220. $fix7c: bis r23, r22, r23 C bring forward borrow
  221. br r31, $ret7c
  222. EPILOGUE()
  223. ASM_END()