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

数学计算

开发平台:

Unix_Linux

  1. dnl  IA-64 mpn_lshift/mpn_rshift.
  2. dnl  Copyright 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
  3. dnl  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 Itanium:      2.0
  18. C Itanium 2:    1.0
  19. C This code is scheduled deeply since the plain shift instructions shr and shl
  20. C have a latency of 4 (on Itanium) or 3 (on Itanium 2).  Poor scheduling of
  21. C these instructions cause a 10 cycle replay trap on Itanium.
  22. C TODO
  23. C  * Optimize function entry and feed-in code.
  24. C INPUT PARAMETERS
  25. define(`rp',`r32')
  26. define(`up',`r33')
  27. define(`n',`r34')
  28. define(`cnt',`r35')
  29. define(`tnc',`r9')
  30. ifdef(`OPERATION_lshift',`
  31. define(`FSH',`shl')
  32. define(`BSH',`shr.u')
  33. define(`UPD',`-8')
  34. define(`POFF',`-512')
  35. define(`PUPD',`-32')
  36. define(`func',`mpn_lshift')
  37. ')
  38. ifdef(`OPERATION_rshift',`
  39. define(`FSH',`shr.u')
  40. define(`BSH',`shl')
  41. define(`UPD',`8')
  42. define(`POFF',`512')
  43. define(`PUPD',`32')
  44. define(`func',`mpn_rshift')
  45. ')
  46. MULFUNC_PROLOGUE(mpn_lshift mpn_rshift)
  47. ASM_START()
  48. PROLOGUE(func)
  49. .prologue
  50. .save ar.lc, r2
  51. .body
  52. ifdef(`HAVE_ABI_32',
  53. ` addp4 rp = 0, rp C M I
  54. addp4 up = 0, up C M I
  55. sxt4 n = n C M I
  56. zxt4 cnt = cnt C I
  57. ;;
  58. ')
  59.  {.mmi; cmp.lt p14, p15 = 4, n C M I
  60. and r14 = 3, n C M I
  61. mov.i r2 = ar.lc C I0
  62. }{.mmi; add r15 = -1, n C M I
  63. sub tnc = 64, cnt C M I
  64. add r16 = -5, n
  65. ;;
  66. }{.mmi; cmp.eq p6, p0 = 1, r14 C M I
  67. cmp.eq p7, p0 = 2, r14 C M I
  68. shr.u n = r16, 2 C I0
  69. }{.mmi; cmp.eq p8, p0 = 3, r14 C M I
  70. ifdef(`OPERATION_lshift',
  71. ` shladd up = r15, 3, up C M I
  72. shladd rp = r15, 3, rp') C M I
  73. ;;
  74. }{.mmi; add r11 = POFF, up C M I
  75. ld8 r10 = [up], UPD C M01
  76. mov.i ar.lc = n C I0
  77. }{.bbb;
  78.    (p6) br.dptk .Lb01
  79.    (p7) br.dptk .Lb10
  80.    (p8) br.dptk .Lb11
  81. ;;
  82. }
  83. .Lb00: ld8 r19 = [up], UPD
  84. ;;
  85. ld8 r16 = [up], UPD
  86. ;;
  87. ld8 r17 = [up], UPD
  88. BSH r8 = r10, tnc C function return value
  89.   (p14) br.cond.dptk .grt4
  90. FSH r24 = r10, cnt
  91. BSH r25 = r19, tnc
  92. ;;
  93. FSH r26 = r19, cnt
  94. BSH r27 = r16, tnc
  95. ;;
  96. FSH r20 = r16, cnt
  97. BSH r21 = r17, tnc
  98. ;;
  99. or r14 = r25, r24
  100. FSH r22 = r17, cnt
  101. BSH r23 = r10, tnc
  102. br .Lr4
  103. .grt4: FSH r24 = r10, cnt
  104. BSH r25 = r19, tnc
  105. ;;
  106. ld8 r18 = [up], UPD
  107. FSH r26 = r19, cnt
  108. BSH r27 = r16, tnc
  109. ;;
  110. ld8 r19 = [up], UPD
  111. FSH r20 = r16, cnt
  112. BSH r21 = r17, tnc
  113. ;;
  114. ld8 r16 = [up], UPD
  115. FSH r22 = r17, cnt
  116. BSH r23 = r18, tnc
  117. ;;
  118. or r14 = r25, r24
  119. ld8 r17 = [up], UPD
  120. br.cloop.dpnt .Ltop
  121. br .Lbot
  122. .Lb01:
  123.   (p15) BSH r8 = r10, tnc C function return value I
  124.   (p15) FSH r22 = r10, cnt C I
  125.   (p15) br.cond.dptk .Lr1 C return B
  126. .grt1: ld8 r18 = [up], UPD
  127. ;;
  128. ld8 r19 = [up], UPD
  129. BSH r8 = r10, tnc C function return value
  130. ;;
  131. ld8 r16 = [up], UPD
  132. FSH r22 = r10, cnt
  133. BSH r23 = r18, tnc
  134. ;;
  135. ld8 r17 = [up], UPD
  136. br.cloop.dpnt .grt5
  137. ;;
  138. FSH r24 = r18, cnt
  139. BSH r25 = r19, tnc
  140. ;;
  141. or r15 = r23, r22
  142. FSH r26 = r19, cnt
  143. BSH r27 = r16, tnc
  144. ;;
  145. FSH r20 = r16, cnt
  146. BSH r21 = r17, tnc
  147. br .Lr5
  148. .grt5: FSH r24 = r18, cnt
  149. BSH r25 = r19, tnc
  150. ;;
  151. ld8 r18 = [up], UPD
  152. FSH r26 = r19, cnt
  153. BSH r27 = r16, tnc
  154. ;;
  155. ld8 r19 = [up], UPD
  156. FSH r20 = r16, cnt
  157. BSH r21 = r17, tnc
  158. ;;
  159. or r15 = r23, r22
  160. ld8 r16 = [up], UPD
  161. br .LL01
  162. .Lb10: ld8 r17 = [up], UPD
  163.   (p14) br.cond.dptk .grt2
  164. BSH r8 = r10, tnc C function return value
  165. ;;
  166. FSH r20 = r10, cnt
  167. BSH r21 = r17, tnc
  168. ;;
  169. or r14 = r21, r20
  170. FSH r22 = r17, cnt
  171. br .Lr2 C return
  172. .grt2: ld8 r18 = [up], UPD
  173. BSH r8 = r10, tnc C function return value
  174. ;;
  175. ld8 r19 = [up], UPD
  176. FSH r20 = r10, cnt
  177. BSH r21 = r17, tnc
  178. ;;
  179. ld8 r16 = [up], UPD
  180. FSH r22 = r17, cnt
  181. BSH r23 = r18, tnc
  182. ;;
  183. ld8 r17 = [up], UPD
  184. br.cloop.dpnt .grt6
  185. ;;
  186. or r14 = r21, r20
  187. FSH r24 = r18, cnt
  188. BSH r25 = r19, tnc
  189. ;;
  190. FSH r26 = r19, cnt
  191. BSH r27 = r16, tnc
  192. br .Lr6
  193. .grt6: or r14 = r21, r20
  194. FSH r24 = r18, cnt
  195. BSH r25 = r19, tnc
  196. ;;
  197. ld8 r18 = [up], UPD
  198. FSH r26 = r19, cnt
  199. BSH r27 = r16, tnc
  200. ;;
  201. ld8 r19 = [up], UPD
  202. br .LL10
  203. .Lb11: ld8 r16 = [up], UPD
  204. ;;
  205. ld8 r17 = [up], UPD
  206. BSH r8 = r10, tnc C function return value
  207.   (p14) br.cond.dptk .grt3
  208. ;;
  209. FSH r26 = r10, cnt
  210. BSH r27 = r16, tnc
  211. ;;
  212. FSH r20 = r16, cnt
  213. BSH r21 = r17, tnc
  214. ;;
  215. or r15 = r27, r26
  216. FSH r22 = r17, cnt
  217. br .Lr3 C return
  218. .grt3: ld8 r18 = [up], UPD
  219. FSH r26 = r10, cnt
  220. BSH r27 = r16, tnc
  221. ;;
  222. ld8 r19 = [up], UPD
  223. FSH r20 = r16, cnt
  224. BSH r21 = r17, tnc
  225. ;;
  226. ld8 r16 = [up], UPD
  227. FSH r22 = r17, cnt
  228. BSH r23 = r18, tnc
  229. ;;
  230. ld8 r17 = [up], UPD
  231. br.cloop.dpnt .grt7
  232. or r15 = r27, r26
  233. FSH r24 = r18, cnt
  234. BSH r25 = r19, tnc
  235. br .Lr7
  236. .grt7: or r15 = r27, r26
  237. FSH r24 = r18, cnt
  238. BSH r25 = r19, tnc
  239. ld8 r18 = [up], UPD
  240. br .LL11
  241. C *** MAIN LOOP START ***
  242. ALIGN(32)
  243. .Ltop:
  244.  {.mmi; st8 [rp] = r14, UPD C M2
  245. or r15 = r27, r26 C M3
  246. FSH r24 = r18, cnt C I0
  247. }{.mmi; ld8 r18 = [up], UPD C M1
  248. lfetch [r11], PUPD
  249. BSH r25 = r19, tnc C I1
  250. ;; }
  251. .LL11:
  252.  {.mmi; st8 [rp] = r15, UPD
  253. or r14 = r21, r20
  254. FSH r26 = r19, cnt
  255. }{.mmi; ld8 r19 = [up], UPD
  256. nop.m 0
  257. BSH r27 = r16, tnc
  258. ;; }
  259. .LL10:
  260.  {.mmi; st8 [rp] = r14, UPD
  261. or r15 = r23, r22
  262. FSH r20 = r16, cnt
  263. }{.mmi; ld8 r16 = [up], UPD
  264. nop.m 0
  265. BSH r21 = r17, tnc
  266. ;; }
  267. .LL01:
  268.  {.mmi; st8 [rp] = r15, UPD
  269. or r14 = r25, r24
  270. FSH r22 = r17, cnt
  271. }{.mib; ld8 r17 = [up], UPD
  272. BSH r23 = r18, tnc
  273. br.cloop.dptk .Ltop
  274. ;; }
  275. C *** MAIN LOOP END ***
  276. .Lbot: or r15 = r27, r26
  277. FSH r24 = r18, cnt
  278. BSH r25 = r19, tnc
  279. st8 [rp] = r14, UPD
  280. ;;
  281. .Lr7: or r14 = r21, r20
  282. FSH r26 = r19, cnt
  283. BSH r27 = r16, tnc
  284. st8 [rp] = r15, UPD
  285. ;;
  286. .Lr6: or r15 = r23, r22
  287. FSH r20 = r16, cnt
  288. BSH r21 = r17, tnc
  289. st8 [rp] = r14, UPD
  290. ;;
  291. .Lr5: st8 [rp] = r15, UPD
  292. or r14 = r25, r24
  293. FSH r22 = r17, cnt
  294. ;;
  295. .Lr4: or r15 = r27, r26
  296. st8 [rp] = r14, UPD
  297. ;;
  298. .Lr3: or r14 = r21, r20
  299. st8 [rp] = r15, UPD
  300. ;;
  301. .Lr2: st8 [rp] = r14, UPD
  302. ;;
  303. .Lr1: st8 [rp] = r22, UPD C M23
  304. mov ar.lc = r2 C I0
  305. br.ret.sptk.many b0 C B
  306. EPILOGUE(func)
  307. ASM_END()