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

数学计算

开发平台:

Unix_Linux

  1. dnl  Alpha mpn_addlsh1_n/mpn_sublsh1_n -- rp[] = up[] +- (vp[] << 1).
  2. dnl  Copyright 2003 Free Software Foundation, Inc.
  3. dnl  This file is part of the GNU MP Library.
  4. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  5. dnl  it under the terms of the GNU Lesser General Public License as published
  6. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  7. dnl  your option) any later version.
  8. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  9. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  11. dnl  License for more details.
  12. dnl  You should have received a copy of the GNU Lesser General Public License
  13. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  14. include(`../config.m4')
  15. C      cycles/limb
  16. C EV4:    12.5
  17. C EV5:     6.25
  18. C EV6:     4.375 (i.e., worse than separate mpn_lshift and mpn_add_n at 3.875)
  19. C TODO
  20. C  * Write special version for ev6, as this is a slowdown for 100 < n < 2200
  21. C    compared to separate mpn_lshift and mpn_add_n.
  22. C  * Use addq instead of sll for left shift, and similarly cmplt instead of srl
  23. C    for right shift.
  24. dnl  INPUT PARAMETERS
  25. define(`rp',`r16')
  26. define(`up',`r17')
  27. define(`vp',`r18')
  28. define(`n', `r19')
  29. define(`u0', `r8')
  30. define(`u1', `r1')
  31. define(`u2', `r2')
  32. define(`u3', `r3')
  33. define(`v0', `r4')
  34. define(`v1', `r5')
  35. define(`v2', `r6')
  36. define(`v3', `r7')
  37. define(`cy0', `r0')
  38. define(`cy1', `r20')
  39. define(`cy', `r22')
  40. define(`rr', `r24')
  41. define(`ps', `r25')
  42. define(`sl', `r28')
  43. ifdef(`OPERATION_addlsh1_n',`
  44.   define(ADDSUB,       addq)
  45.   define(CARRY,       `cmpult $1,$2,$3')
  46.   define(func, mpn_addlsh1_n)
  47. ')
  48. ifdef(`OPERATION_sublsh1_n',`
  49.   define(ADDSUB,       subq)
  50.   define(CARRY,       `cmpult $2,$1,$3')
  51.   define(func, mpn_sublsh1_n)
  52. ')
  53. MULFUNC_PROLOGUE(mpn_addlsh1_n mpn_sublsh1_n)
  54. ASM_START()
  55. PROLOGUE(func)
  56. lda n, -4(n)
  57. bis r31, r31, cy1
  58. and n, 3, r1
  59. beq r1, $Lb00
  60. cmpeq r1, 1, r2
  61. bne r2, $Lb01
  62. cmpeq r1, 2, r2
  63. bne r2, $Lb10
  64. $Lb11: C n = 3, 7, 11, ...
  65. ldq v0, 0(vp)
  66. ldq u0, 0(up)
  67. ldq v1, 8(vp)
  68. ldq u1, 8(up)
  69. ldq v2, 16(vp)
  70. ldq u2, 16(up)
  71. lda vp, 24(vp)
  72. lda up, 24(up)
  73. bge n, $Loop
  74. br r31, $Lcj3
  75. $Lb10: C n = 2, 6, 10, ...
  76. bis r31, r31, cy0
  77. ldq v1, 0(vp)
  78. ldq u1, 0(up)
  79. ldq v2, 8(vp)
  80. ldq u2, 8(up)
  81. lda rp, -8(rp)
  82. blt n, $Lcj2
  83. ldq v3, 16(vp)
  84. ldq u3, 16(up)
  85. lda vp, 48(vp)
  86. lda up, 16(up)
  87. br r31, $LL10
  88. $Lb01: C n = 1, 5, 9, ...
  89. ldq v2, 0(vp)
  90. ldq u2, 0(up)
  91. lda rp, -16(rp)
  92. blt n, $Lcj1
  93. ldq v3, 8(vp)
  94. ldq u3, 8(up)
  95. ldq v0, 16(vp)
  96. ldq u0, 16(up)
  97. lda vp, 40(vp)
  98. lda up, 8(up)
  99. lda rp, 32(rp)
  100. br r31, $LL01
  101. $Lb00: C n = 4, 8, 12, ...
  102. bis r31, r31, cy0
  103. ldq v3, 0(vp)
  104. ldq u3, 0(up)
  105. ldq v0, 8(vp)
  106. ldq u0, 8(up)
  107. ldq v1, 16(vp)
  108. ldq u1, 16(up)
  109. lda vp, 32(vp)
  110. lda rp, 8(rp)
  111. br r31, $LL00x
  112. ALIGN(16)
  113. C 0
  114. $Loop: sll v0, 1, sl C left shift vlimb
  115. ldq v3, 0(vp)
  116. C 1
  117. ADDSUB u0, sl, ps C ulimb + (vlimb << 1)
  118. ldq u3, 0(up)
  119. C 2
  120. ADDSUB ps, cy1, rr C consume carry from previous operation
  121. srl v0, 63, cy0 C carry out #1
  122. C 3
  123. CARRY( ps, u0, cy) C carry out #2
  124. stq rr, 0(rp)
  125. C 4
  126. addq cy, cy0, cy0 C combine carry out #1 and #2
  127. CARRY( rr, ps, cy) C carry out #3
  128. C 5
  129. addq cy, cy0, cy0 C final carry out
  130. lda vp, 32(vp) C bookkeeping
  131. C 6
  132. $LL10: sll v1, 1, sl
  133. ldq v0, -24(vp)
  134. C 7
  135. ADDSUB u1, sl, ps
  136. ldq u0, 8(up)
  137. C 8
  138. ADDSUB ps, cy0, rr
  139. srl v1, 63, cy1
  140. C 9
  141. CARRY( ps, u1, cy)
  142. stq rr, 8(rp)
  143. C 10
  144. addq cy, cy1, cy1
  145. CARRY( rr, ps, cy)
  146. C 11
  147. addq cy, cy1, cy1
  148. lda rp, 32(rp) C bookkeeping
  149. C 12
  150. $LL01: sll v2, 1, sl
  151. ldq v1, -16(vp)
  152. C 13
  153. ADDSUB u2, sl, ps
  154. ldq u1, 16(up)
  155. C 14
  156. ADDSUB ps, cy1, rr
  157. srl v2, 63, cy0
  158. C 15
  159. CARRY( ps, u2, cy)
  160. stq rr, -16(rp)
  161. C 16
  162. addq cy, cy0, cy0
  163. CARRY( rr, ps, cy)
  164. C 17
  165. addq cy, cy0, cy0
  166. $LL00x: lda up, 32(up) C bookkeeping
  167. C 18
  168. sll v3, 1, sl
  169. ldq v2, -8(vp)
  170. C 19
  171. ADDSUB u3, sl, ps
  172. ldq u2, -8(up)
  173. C 20
  174. ADDSUB ps, cy0, rr
  175. srl v3, 63, cy1
  176. C 21
  177. CARRY( ps, u3, cy)
  178. stq rr, -8(rp)
  179. C 22
  180. addq cy, cy1, cy1
  181. CARRY( rr, ps, cy)
  182. C 23
  183. addq cy, cy1, cy1
  184. lda n, -4(n) C bookkeeping
  185. C 24
  186. bge n, $Loop
  187. $Lcj3: sll v0, 1, sl
  188. ADDSUB u0, sl, ps
  189. ADDSUB ps, cy1, rr
  190. srl v0, 63, cy0
  191. CARRY( ps, u0, cy)
  192. stq rr, 0(rp)
  193. addq cy, cy0, cy0
  194. CARRY( rr, ps, cy)
  195. addq cy, cy0, cy0
  196. $Lcj2: sll v1, 1, sl
  197. ADDSUB u1, sl, ps
  198. ADDSUB ps, cy0, rr
  199. srl v1, 63, cy1
  200. CARRY( ps, u1, cy)
  201. stq rr, 8(rp)
  202. addq cy, cy1, cy1
  203. CARRY( rr, ps, cy)
  204. addq cy, cy1, cy1
  205. $Lcj1: sll v2, 1, sl
  206. ADDSUB u2, sl, ps
  207. ADDSUB ps, cy1, rr
  208. srl v2, 63, cy0
  209. CARRY( ps, u2, cy)
  210. stq rr, 16(rp)
  211. addq cy, cy0, cy0
  212. CARRY( rr, ps, cy)
  213. addq cy, cy0, cy0
  214. ret r31,(r26),1
  215. EPILOGUE()
  216. ASM_END()