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

数学计算

开发平台:

Unix_Linux

  1. dnl  IA-64 mpn_divexact_1 -- mpn by limb exact division.
  2. dnl  Copyright 2003, 2004, 2005 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:      16
  17. C Itanium 2:     8
  18. C INPUT PARAMETERS
  19. define(`rp', `r32')
  20. define(`up', `r33')
  21. define(`n',  `r34')
  22. define(`divisor', `r35')
  23. define(`lshift', `r24')
  24. define(`rshift', `r25')
  25. C This code is a bit messy, and not as similar to mode1o.asm as desired.
  26. C The critical path during initialization is for computing the inverse of the
  27. C divisor.  Since odd divisors are probably common, we conditionally execute
  28. C the initial count_traling_zeros code and the downshift.
  29. C Possible improvement: Merge more of the feed-in code into the inverse
  30. C computation.
  31. ASM_START()
  32. .text
  33. .align 32
  34. .Ltab:
  35. data1 0,0x01, 0,0xAB, 0,0xCD, 0,0xB7, 0,0x39, 0,0xA3, 0,0xC5, 0,0xEF
  36. data1 0,0xF1, 0,0x1B, 0,0x3D, 0,0xA7, 0,0x29, 0,0x13, 0,0x35, 0,0xDF
  37. data1 0,0xE1, 0,0x8B, 0,0xAD, 0,0x97, 0,0x19, 0,0x83, 0,0xA5, 0,0xCF
  38. data1 0,0xD1, 0,0xFB, 0,0x1D, 0,0x87, 0,0x09, 0,0xF3, 0,0x15, 0,0xBF
  39. data1 0,0xC1, 0,0x6B, 0,0x8D, 0,0x77, 0,0xF9, 0,0x63, 0,0x85, 0,0xAF
  40. data1 0,0xB1, 0,0xDB, 0,0xFD, 0,0x67, 0,0xE9, 0,0xD3, 0,0xF5, 0,0x9F
  41. data1 0,0xA1, 0,0x4B, 0,0x6D, 0,0x57, 0,0xD9, 0,0x43, 0,0x65, 0,0x8F
  42. data1 0,0x91, 0,0xBB, 0,0xDD, 0,0x47, 0,0xC9, 0,0xB3, 0,0xD5, 0,0x7F
  43. data1 0,0x81, 0,0x2B, 0,0x4D, 0,0x37, 0,0xB9, 0,0x23, 0,0x45, 0,0x6F
  44. data1 0,0x71, 0,0x9B, 0,0xBD, 0,0x27, 0,0xA9, 0,0x93, 0,0xB5, 0,0x5F
  45. data1 0,0x61, 0,0x0B, 0,0x2D, 0,0x17, 0,0x99, 0,0x03, 0,0x25, 0,0x4F
  46. data1 0,0x51, 0,0x7B, 0,0x9D, 0,0x07, 0,0x89, 0,0x73, 0,0x95, 0,0x3F
  47. data1 0,0x41, 0,0xEB, 0,0x0D, 0,0xF7, 0,0x79, 0,0xE3, 0,0x05, 0,0x2F
  48. data1 0,0x31, 0,0x5B, 0,0x7D, 0,0xE7, 0,0x69, 0,0x53, 0,0x75, 0,0x1F
  49. data1 0,0x21, 0,0xCB, 0,0xED, 0,0xD7, 0,0x59, 0,0xC3, 0,0xE5, 0,0x0F
  50. data1 0,0x11, 0,0x3B, 0,0x5D, 0,0xC7, 0,0x49, 0,0x33, 0,0x55, 0,0xFF
  51. PROLOGUE(mpn_divexact_1)
  52. .prologue
  53. .save ar.lc, r2
  54. .body
  55.  {.mmi; add r8 = -1, divisor C M0
  56. nop 0 C M1
  57. tbit.z p8, p9 = divisor, 0 C I0
  58. }
  59. ifdef(`HAVE_ABI_32',
  60. ` addp4 rp = 0, rp C M2  rp extend
  61. addp4 up = 0, up C M3  up extend
  62. sxt4 n = n') C I1  size extend
  63. ;;
  64. .Lhere:
  65.  {.mmi; ld8 r20 = [up], 8 C M0  up[0]
  66.   (p8) andcm r8 = r8, divisor C M1
  67. mov r15 = ip C I0  .Lhere
  68. ;;
  69. }{.mii
  70. .pred.rel "mutex", p8, p9
  71.   (p9) mov rshift = 0 C M0
  72.   (p8) popcnt rshift = r8 C I0 r8 = cnt_lo_zeros(divisor)
  73. cmp.eq p6, p10 = 1, n C I1
  74. ;;
  75. }{.mii; add r9 = .Ltab-.Lhere, r15 C M0
  76.   (p8) shr.u divisor = divisor, rshift C I0
  77. nop 0 C I1
  78. ;;
  79. }{.mmi; add n = -4, n C M0  size-1
  80.   (p10) ld8 r21 = [up], 8 C M1  up[1]
  81. mov r14 = 2 C M1  2
  82. }{.mfi; setf.sig f6 = divisor C M2  divisor
  83. mov f9 = f0 C M3  carry FIXME
  84. zxt1 r3 = divisor C I1  divisor low byte
  85. ;;
  86. }{.mmi; add r3 = r9, r3 C M0  table offset ip and index
  87. sub r16 = 0, divisor C M1  -divisor
  88. mov r2 = ar.lc C I0
  89. }{.mmi; sub lshift = 64, rshift C M2
  90. setf.sig f13 = r14 C M3  2 in significand
  91. mov r17 = -1 C I1  -1
  92. ;;
  93. }{.mmi; ld1 r3 = [r3] C M0  inverse, 8 bits
  94. nop 0 C M1
  95. mov ar.lc = n C I0  size-1 loop count
  96. }{.mmi; setf.sig f12 = r16 C M2  -divisor
  97. setf.sig f8 = r17 C M3  -1
  98. cmp.eq p7, p0 = -2, n C I1
  99. ;;
  100. }{.mmi; setf.sig f7 = r3 C M2  inverse, 8 bits
  101. cmp.eq p8, p0 = -1, n C M0
  102. shr.u r23 = r20, rshift C I0
  103. ;;
  104. }
  105. C f6 divisor
  106. C f7 inverse, being calculated
  107. C f8 -1, will be -inverse
  108. C f9 carry
  109. C f12 -divisor
  110. C f13 2
  111. C f14 scratch
  112. xmpy.l f14 = f13, f7 C Newton 2*i
  113. xmpy.l f7 = f7, f7 C Newton i*i
  114. ;;
  115. xma.l f7 = f7, f12, f14 C Newton i*i*-d + 2*i, 16 bits
  116. ;;
  117. setf.sig f10 = r23 C speculative, used iff n = 1
  118. xmpy.l f14 = f13, f7 C Newton 2*i
  119. shl r22 = r21, lshift C speculative, used iff n > 1
  120. xmpy.l f7 = f7, f7 C Newton i*i
  121. ;;
  122. or r31 = r22, r23 C speculative, used iff n > 1
  123. xma.l f7 = f7, f12, f14 C Newton i*i*-d + 2*i, 32 bits
  124. shr.u r23 = r21, rshift C speculative, used iff n > 1
  125. ;;
  126. setf.sig f11 = r31 C speculative, used iff n > 1
  127. xmpy.l f14 = f13, f7 C Newton 2*i
  128. xmpy.l f7 = f7, f7 C Newton i*i
  129. ;;
  130. xma.l f7 = f7, f12, f14 C Newton i*i*-d + 2*i, 64 bits
  131.   (p7) br.cond.dptk .Ln2
  132.   (p10) br.cond.dptk .grt3
  133. ;;
  134. .Ln1: xmpy.l f12 = f10, f7 C q = ulimb * inverse
  135. br .Lx1
  136. .Ln2:
  137. xmpy.l f8 = f7, f8 C -inverse = inverse * -1
  138. xmpy.l f12 = f11, f7 C q = ulimb * inverse
  139. setf.sig f11 = r23
  140. br .Lx2
  141. .grt3:
  142. ld8 r21 = [up], 8 C up[2]
  143. xmpy.l f8 = f7, f8 C -inverse = inverse * -1
  144. ;;
  145. shl r22 = r21, lshift
  146. ;;
  147. xmpy.l f12 = f11, f7 C q = ulimb * inverse
  148. ;;
  149. or r31 = r22, r23
  150. shr.u r23 = r21, rshift
  151. ;;
  152. setf.sig f11 = r31
  153.   (p8) br.cond.dptk .Lx3 C branch for n = 3
  154. ;;
  155. ld8 r21 = [up], 8
  156. br .Lent
  157. .Loop: ld8 r21 = [up], 8
  158. xma.l f12 = f9, f8, f10 C q = c * -inverse + si
  159. ;;
  160. .Lent: add r16 = 160, up
  161. shl r22 = r21, lshift
  162. ;;
  163. stf8 [rp] = f12, 8
  164. xma.hu f9 = f12, f6, f9 C c = high(q * divisor + c)
  165. xmpy.l f10 = f11, f7 C si = ulimb * inverse
  166. ;;
  167. or r31 = r22, r23
  168. shr.u r23 = r21, rshift
  169. ;;
  170. lfetch [r16]
  171. setf.sig f11 = r31
  172. br.cloop.sptk.few.clr .Loop
  173. xma.l f12 = f9, f8, f10 C q = c * -inverse + si
  174. ;;
  175. .Lx3: stf8 [rp] = f12, 8
  176. xma.hu f9 = f12, f6, f9 C c = high(q * divisor + c)
  177. xmpy.l f10 = f11, f7 C si = ulimb * inverse
  178. ;;
  179. setf.sig f11 = r23
  180. ;;
  181. xma.l f12 = f9, f8, f10 C q = c * -inverse + si
  182. ;;
  183. .Lx2: stf8 [rp] = f12, 8
  184. xma.hu f9 = f12, f6, f9 C c = high(q * divisor + c)
  185. xmpy.l f10 = f11, f7 C si = ulimb * inverse
  186. ;;
  187. xma.l f12 = f9, f8, f10 C q = c * -inverse + si
  188. ;;
  189. .Lx1: stf8 [rp] = f12, 8
  190. mov ar.lc = r2 C I0
  191. br.ret.sptk.many b0
  192. EPILOGUE()