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

数学计算

开发平台:

Unix_Linux

  1. dnl  PA64 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 8000,8200: 2
  17. C 8500,8600,8700: 1.75
  18. C TODO
  19. C  * Write special feed-in code for each (n mod 8). (See the ia64 code.)
  20. C  * Try to make this run at closer to 1.5 c/l.
  21. C  * Set up register aliases (define(`u0',`%r19')).
  22. C  * Explicitly align loop.
  23. dnl INPUT PARAMETERS
  24. define(`rp',`%r26')
  25. define(`up',`%r25')
  26. define(`vp',`%r24')
  27. define(`n',`%r23')
  28. ifdef(`OPERATION_addlsh1_n',`
  29.   define(ADCSBC, `add,dc')
  30.   define(INITC, `ldi 0,')
  31.   define(func, mpn_addlsh1_n)
  32. ')
  33. ifdef(`OPERATION_sublsh1_n',`
  34.   define(ADCSBC, `sub,db')
  35.   define(INITC, `ldi 1,')
  36.   define(func, mpn_sublsh1_n)
  37. ')
  38. MULFUNC_PROLOGUE(mpn_addlsh1_n mpn_sublsh1_n)
  39. ifdef(`HAVE_ABI_2_0w',`
  40.   define(LEVEL, `.level 2.0w')
  41.   define(RETREG, `%r28')
  42.   define(CLRRET1, `dnl')
  43. ')
  44. ifdef(`HAVE_ABI_2_0n',`
  45.   define(LEVEL, `.level 2.0')
  46.   define(RETREG, `%r29')
  47.   define(CLRRET1, `ldi 0, %r28')
  48. ')
  49. LEVEL
  50. PROLOGUE(func)
  51. std,ma %r3, 0x100(%r30) C save reg
  52. INITC %r1 C init saved cy
  53. C Primitive code for the first (n mod 8) limbs:
  54. extrd,u n, 63, 3, %r22 C count for loop0
  55. comib,= 0, %r22, L(unrolled) C skip loop0?
  56. copy %r0, %r28
  57. LDEF(loop0)
  58. ldd 0(vp), %r21
  59. ldo 8(vp), vp
  60. ldd 0(up), %r19
  61. ldo 8(up), up
  62. shrpd %r21, %r28, 63, %r31
  63. addi -1, %r1, %r0 C restore cy
  64. ADCSBC %r19, %r31, %r29
  65. std %r29, 0(rp)
  66. add,dc %r0, %r0, %r1 C save cy
  67. copy %r21, %r28
  68. addib,> -1, %r22, L(loop0)
  69. ldo 8(rp), rp
  70. addib,>= -8, n, L(unrolled)
  71. addi -1, %r1, %r0 C restore cy
  72. shrpd %r0, %r28, 63, %r28
  73. ADCSBC %r0, %r28, RETREG
  74. ifdef(`OPERATION_sublsh1_n',
  75. ` sub %r0, RETREG, RETREG')
  76. CLRRET1
  77. bve (%r2)
  78. ldd,mb -0x100(%r30), %r3
  79. LDEF(unrolled)
  80. std %r4, -0xf8(%r30) C save reg
  81. ldd 0(vp), %r4
  82. std %r5, -0xf0(%r30) C save reg
  83. ldd 8(vp), %r5
  84. std %r6, -0xe8(%r30) C save reg
  85. ldd 16(vp), %r6
  86. std %r7, -0xe0(%r30) C save reg
  87. ldd 24(vp), %r7
  88. shrpd %r4, %r28, 63, %r31
  89. std %r8, -0xd8(%r30) C save reg
  90. ldd 32(vp), %r8
  91. shrpd %r5, %r4, 63, %r4
  92. std %r9, -0xd0(%r30) C save reg
  93. ldd 40(vp), %r9
  94. shrpd %r6, %r5, 63, %r5
  95. ldd 48(vp), %r3
  96. shrpd %r7, %r6, 63, %r6
  97. ldd 56(vp), %r28
  98. shrpd %r8, %r7, 63, %r7
  99. ldd 0(up), %r19
  100. shrpd %r9, %r8, 63, %r8
  101. ldd 8(up), %r20
  102. shrpd %r3, %r9, 63, %r9
  103. ldd 16(up), %r21
  104. shrpd %r28, %r3, 63, %r3
  105. ldd 24(up), %r22
  106. nop C alignment FIXME
  107. addib,<= -8, n, L(end)
  108. addi -1, %r1, %r0 C restore cy
  109. LDEF(loop)
  110. ADCSBC %r19, %r31, %r29
  111. ldd 32(up), %r19
  112. std %r29, 0(rp)
  113. ADCSBC %r20, %r4, %r29
  114. ldd 40(up), %r20
  115. std %r29, 8(rp)
  116. ADCSBC %r21, %r5, %r29
  117. ldd 48(up), %r21
  118. std %r29, 16(rp)
  119. ADCSBC %r22, %r6, %r29
  120. ldd 56(up), %r22
  121. std %r29, 24(rp)
  122. ADCSBC %r19, %r7, %r29
  123. ldd 64(vp), %r4
  124. std %r29, 32(rp)
  125. ADCSBC %r20, %r8, %r29
  126. ldd 72(vp), %r5
  127. std %r29, 40(rp)
  128. ADCSBC %r21, %r9, %r29
  129. ldd 80(vp), %r6
  130. std %r29, 48(rp)
  131. ADCSBC %r22, %r3, %r29
  132. std %r29, 56(rp)
  133. add,dc %r0, %r0, %r1 C save cy
  134. ldd 88(vp), %r7
  135. shrpd %r4, %r28, 63, %r31
  136. ldd 96(vp), %r8
  137. shrpd %r5, %r4, 63, %r4
  138. ldd 104(vp), %r9
  139. shrpd %r6, %r5, 63, %r5
  140. ldd 112(vp), %r3
  141. shrpd %r7, %r6, 63, %r6
  142. ldd 120(vp), %r28
  143. shrpd %r8, %r7, 63, %r7
  144. ldd 64(up), %r19
  145. shrpd %r9, %r8, 63, %r8
  146. ldd 72(up), %r20
  147. shrpd %r3, %r9, 63, %r9
  148. ldd 80(up), %r21
  149. shrpd %r28, %r3, 63, %r3
  150. ldd 88(up), %r22
  151. ldo 64(vp), vp
  152. ldo 64(rp), rp
  153. ldo 64(up), up
  154. addib,> -8, n, L(loop)
  155. addi -1, %r1, %r0 C restore cy
  156. LDEF(end)
  157. ADCSBC %r19, %r31, %r29
  158. ldd 32(up), %r19
  159. std %r29, 0(rp)
  160. ADCSBC %r20, %r4, %r29
  161. ldd 40(up), %r20
  162. std %r29, 8(rp)
  163. ADCSBC %r21, %r5, %r29
  164. ldd 48(up), %r21
  165. std %r29, 16(rp)
  166. ADCSBC %r22, %r6, %r29
  167. ldd 56(up), %r22
  168. std %r29, 24(rp)
  169. ADCSBC %r19, %r7, %r29
  170. ldd -0xf8(%r30), %r4 C restore reg
  171. std %r29, 32(rp)
  172. ADCSBC %r20, %r8, %r29
  173. ldd -0xf0(%r30), %r5 C restore reg
  174. std %r29, 40(rp)
  175. ADCSBC %r21, %r9, %r29
  176. ldd -0xe8(%r30), %r6 C restore reg
  177. std %r29, 48(rp)
  178. ADCSBC %r22, %r3, %r29
  179. ldd -0xe0(%r30), %r7 C restore reg
  180. std %r29, 56(rp)
  181. shrpd %r0, %r28, 63, %r28
  182. ldd -0xd8(%r30), %r8 C restore reg
  183. ADCSBC %r0, %r28, RETREG
  184. ifdef(`OPERATION_sublsh1_n',
  185. ` sub %r0, RETREG, RETREG')
  186. CLRRET1
  187. ldd -0xd0(%r30), %r9 C restore reg
  188. bve (%r2)
  189. ldd,mb -0x100(%r30), %r3 C restore reg
  190. EPILOGUE()