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

数学计算

开发平台:

Unix_Linux

  1. dnl  Alpha ev6 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 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_add_n mpn_add_nc)
  45. ASM_START()
  46. PROLOGUE(mpn_add_nc)
  47. br r31, $entry
  48. EPILOGUE()
  49. PROLOGUE(mpn_add_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. addq u1, v1, r5 C U0 add two data
  58. cmpult r5, v1, r23 C U0 did it carry
  59. ldq u1, 16(r17) C L0 get next ones
  60. ldq v1, 16(r18) C L1
  61. addq u0, v0, r8 C U1 add two data
  62. addq r5, cy0, r5 C U0 carry in
  63. cmpult r8, v0, r22 C U1 did it carry
  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. addq r8, r23, r8 C U1 carry from last
  68. addq u1, v1, r7 C U0 add two data
  69. beq r8, $fix6f C U1 fix exact zero
  70. $ret6f: cmpult r7, v1, r23 C U0 did it carry
  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: addq u0, v0, r2 C U1 add two data
  81. addq r7, r22, r7 C U0 add in carry
  82. stq r5, 8(r16) C L0 put an answer
  83. stq r8, 16(r16) C L1 pair
  84. cmpult r2, v0, cy1 C U1 did it carry
  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. addq r2, r23, r2 C U1 carry from last
  90. bis r31, r31, r31 C L  moves in L !
  91. addq u1, v1, r5 C U0 add two data
  92. beq r2, $fix0 C U1 fix exact zero
  93. $ret0: cmpult r5, v1, cy0 C U0 did it carry
  94. ldq u1, 8(r17) C L0 get next ones
  95. ldq v1, 8(r18) C L1
  96. addq u0, v0, r8 C U1 add two data
  97. addq r5, cy1, r5 C U0 carry from last
  98. stq r7, 24(r16) C L0 store pair
  99. stq r2, 32(r16) C L1
  100. cmpult r8, v0, r22 C U1 did it carry
  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. addq r8, cy0, r8 C U1 carry from last
  106. lda r19, -8(r19) C L1 move counter
  107. addq u1, v1, r7 C U0 add two data
  108. beq r8, $fix2 C U1 fix exact zero
  109. $ret2: cmpult r7, v1, r23 C U0 did it carry
  110. ldq u1, 24(r17) C L0 get next ones
  111. ldq v1, 24(r18) C L1
  112. addq u0, v0, r2 C U1 add two data
  113. addq r7, r22, r7 C U0 add in carry
  114. stq r5, -24(r16) C L0 put an answer
  115. stq r8, -16(r16) C L1 pair
  116. cmpult r2, v0, cy1 C U1 did it carry
  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. addq r2, r23, r2 C U1 carry from last
  122. bis r31, r31, r31 C L  moves in L !
  123. addq u1, v1, r5 C U0 add two data
  124. beq r2, $fix4 C U1 fix exact zero
  125. $ret4: cmpult r5, v1, cy0 C U0 did it carry
  126. ldq u1, 40(r17) C L0 get next ones
  127. ldq v1, 40(r18) C L1
  128. addq u0, v0, r8 C U1 add two data
  129. addq r5, cy1, r5 C U0 carry from last
  130. stq r7, -8(r16) C L0 store pair
  131. stq r2, 0(r16) C L1
  132. cmpult r8, v0, r22 C U1 did it carry
  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. addq r8, cy0, r8 C U1 carry from last
  138. ldl r31, 256(r18) C L1 prefetch
  139. addq u1, v1, r7 C U0 add two data
  140. beq r8, $fix6 C U1 fix exact zero
  141. $ret6: cmpult r7, v1, r23 C U0 did it carry
  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: addq u0, v0, r2 C U1 add two data
  150. addq r7, r22, r7 C U0 add in carry
  151. stq r5, 8(r16) C L0 put an answer
  152. stq r8, 16(r16) C L1 pair
  153. cmpult r2, v0, cy1 C U1 did it carry
  154. beq r7, $fix7c C U0 fix exact 0
  155. $ret7c: addq r2, r23, r2 C U1 carry from last
  156. addq u1, v1, r5 C U0 add two data
  157. beq r2, $fix0c C U1 fix exact zero
  158. $ret0c: cmpult r5, v1, cy0 C U0 did it carry
  159. addq r5, cy1, r5 C U0 carry from last
  160. stq r7, 24(r16) C L0 store pair
  161. stq r2, 32(r16) C L1
  162. beq r5, $fix1c C U0 fix exact zero
  163. $ret1c: stq r5, 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: addq u1, v1, r2 C main add
  174. cmpult r2, v1, r8 C compute cy from last add
  175. ldq u1, 8(r17)
  176. ldq v1, 8(r18)
  177. addq r2, cy0, r5 C carry add
  178. lda r17, 8(r17)
  179. lda r18, 8(r18)
  180. stq r5, 0(r16)
  181. cmpult r5, r2, cy0 C compute cy from last add
  182. lda r19, -1(r19) C decr loop cnt
  183. bis r8, cy0, cy0 C combine cy from the two adds
  184. lda r16, 8(r16)
  185. bne r19, $Loop0
  186. $Lend0: addq u1, v1, r2 C main add
  187. addq r2, cy0, r5 C carry add
  188. cmpult r2, v1, r8 C compute cy from last add
  189. cmpult r5, r2, cy0 C compute cy from last add
  190. stq r5, 0(r16)
  191. bis r8, cy0, r0 C combine cy from the two adds
  192. ret r31,(r26),1
  193. ALIGN(8)
  194. $Lret: lda r0, 0(cy0) C copy carry into return register
  195. ret r31,(r26),1
  196. $fix5f: bis r23, cy0, r23 C bring forward carry
  197. br r31, $ret5f
  198. $fix6f: bis r22, r23, r22 C bring forward carry
  199. br r31, $ret6f
  200. $fix0: bis cy1, r23, cy1 C bring forward carry
  201. br r31, $ret0
  202. $fix1: bis cy0, cy1, cy0 C bring forward carry
  203. br r31, $ret1
  204. $fix2: bis r22, cy0, r22 C bring forward carry
  205. br r31, $ret2
  206. $fix3: bis r23, r22, r23 C bring forward carry
  207. br r31, $ret3
  208. $fix4: bis cy1, r23, cy1 C bring forward carry
  209. br r31, $ret4
  210. $fix5: bis cy1, cy0, cy0 C bring forward carry
  211. br r31, $ret5
  212. $fix6: bis r22, cy0, r22 C bring forward carry
  213. br r31, $ret6
  214. $fix7: bis r23, r22, r23 C bring forward carry
  215. br r31, $ret7
  216. $fix0c: bis cy1, r23, cy1 C bring forward carry
  217. br r31, $ret0c
  218. $fix1c: bis cy0, cy1, cy0 C bring forward carry
  219. br r31, $ret1c
  220. $fix7c: bis r23, r22, r23 C bring forward carry
  221. br r31, $ret7c
  222. EPILOGUE()
  223. ASM_END()