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

数学计算

开发平台:

Unix_Linux

  1. dnl  IA-64 mpn_copyi -- copy limb vector, incrementing.
  2. dnl  Copyright 2001, 2002, 2004 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 Itanium:    1
  17. C Itanium 2:  0.5
  18. C INPUT PARAMETERS
  19. C rp = r32
  20. C sp = r33
  21. C n = r34
  22. ASM_START()
  23. PROLOGUE(mpn_copyi)
  24. .prologue
  25. .save ar.lc, r2
  26. .body
  27. ifdef(`HAVE_ABI_32',
  28. ` addp4 r32 = 0, r32
  29. addp4 r33 = 0, r33
  30. sxt4 r34 = r34
  31. ;;
  32. ')
  33. {.mmi
  34. nop 0
  35. nop 0
  36. mov.i r2 = ar.lc
  37. }
  38. {.mmi
  39. and r14 = 3, r34
  40. cmp.ge p14, p15 = 3, r34
  41. add r34 = -4, r34
  42. ;;
  43. }
  44. {.mmi
  45. cmp.eq p8, p0 = 1, r14
  46. cmp.eq p10, p0 = 2, r14
  47. cmp.eq p12, p0 = 3, r14
  48. }
  49. {.bbb
  50.   (p8) br.dptk .Lb01
  51.   (p10) br.dptk .Lb10
  52.   (p12) br.dptk .Lb11
  53. }
  54. .Lb00: C  n = 0, 4, 8, 12, ...
  55.   (p14) br.dptk .Ls00
  56. ;;
  57. add r21 = 8, r33
  58. ld8 r16 = [r33], 16
  59. shr r15 = r34, 2
  60. ;;
  61. ld8 r17 = [r21], 16
  62. mov.i ar.lc = r15
  63. ld8 r18 = [r33], 16
  64. add r20 = 8, r32
  65. ;;
  66. ld8 r19 = [r21], 16
  67. br.cloop.dptk .Loop
  68. ;;
  69. br.sptk .Lend
  70. ;;
  71. .Lb01: C  n = 1, 5, 9, 13, ...
  72. add r21 = 0, r33
  73. add r20 = 0, r32
  74. add r33 = 8, r33
  75. add r32 = 8, r32
  76. ;;
  77. ld8 r19 = [r21], 16
  78. shr r15 = r34, 2
  79.   (p14) br.dptk .Ls01
  80. ;;
  81. ld8 r16 = [r33], 16
  82. mov.i ar.lc = r15
  83. ;;
  84. ld8 r17 = [r21], 16
  85. ld8 r18 = [r33], 16
  86. br.sptk .Li01
  87. ;;
  88. .Lb10: C  n = 2,6, 10, 14, ...
  89. add r21 = 8, r33
  90. add r20 = 8, r32
  91. ld8 r18 = [r33], 16
  92. shr r15 = r34, 2
  93. ;;
  94. ld8 r19 = [r21], 16
  95. mov.i ar.lc = r15
  96.   (p14) br.dptk .Ls10
  97. ;;
  98. ld8 r16 = [r33], 16
  99. ld8 r17 = [r21], 16
  100. br.sptk .Li10
  101. ;;
  102. .Lb11: C  n = 3, 7, 11, 15, ...
  103. add r21 = 0, r33
  104. add r20 = 0, r32
  105. add r33 = 8, r33
  106. add r32 = 8, r32
  107. ;;
  108. ld8 r17 = [r21], 16
  109. shr r15 = r34, 2
  110. ;;
  111. ld8 r18 = [r33], 16
  112. mov.i ar.lc = r15
  113. ld8 r19 = [r21], 16
  114.   (p14) br.dptk .Ls11
  115. ;;
  116. ld8 r16 = [r33], 16
  117. br.sptk .Li11
  118. ;;
  119. ALIGN(32)
  120. .Loop:
  121. .Li00:
  122. {.mmb
  123. st8 [r32] = r16, 16
  124. ld8 r16 = [r33], 16
  125. nop.b 0
  126. }
  127. .Li11:
  128. {.mmb
  129. st8 [r20] = r17, 16
  130. ld8 r17 = [r21], 16
  131. nop.b 0
  132. ;;
  133. }
  134. .Li10:
  135. {.mmb
  136. st8 [r32] = r18, 16
  137. ld8 r18 = [r33], 16
  138. nop.b 0
  139. }
  140. .Li01:
  141. {.mmb
  142. st8 [r20] = r19, 16
  143. ld8 r19 = [r21], 16
  144. br.cloop.dptk .Loop
  145. ;;
  146. }
  147. .Lend: st8 [r32] = r16, 16
  148. .Ls11: st8 [r20] = r17, 16
  149. ;;
  150. .Ls10: st8 [r32] = r18, 16
  151. .Ls01: st8 [r20] = r19, 16
  152. .Ls00: mov.i ar.lc = r2
  153. br.ret.sptk.many b0
  154. EPILOGUE()
  155. ASM_END()