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

数学计算

开发平台:

Unix_Linux

  1. dnl  IA-64 mpn_addlsh1_n/mpn_sublsh1_n -- rp[] = up[] +- (vp[] << 1).
  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:      3.0
  17. C Itanium 2:    1.5
  18. C TODO
  19. C  * Use shladd in feed-in code (for mpn_addlsh1_n).
  20. C INPUT PARAMETERS
  21. define(`rp',`r32')
  22. define(`up',`r33')
  23. define(`vp',`r34')
  24. define(`n',`r35')
  25. ifdef(`OPERATION_addlsh1_n',`
  26.   define(ADDSUB,       add)
  27.   define(PRED,        ltu)
  28.   define(INCR,        1)
  29.   define(LIM,        -1)
  30.   define(func, mpn_addlsh1_n)
  31. ')
  32. ifdef(`OPERATION_sublsh1_n',`
  33.   define(ADDSUB,       sub)
  34.   define(PRED,        gtu)
  35.   define(INCR,        -1)
  36.   define(LIM,        0)
  37.   define(func, mpn_sublsh1_n)
  38. ')
  39. C Some useful aliases for registers we use
  40. define(`u0',`r14') define(`u1',`r15') define(`u2',`r16') define(`u3',`r17')
  41. define(`v0',`r18') define(`v1',`r19') define(`v2',`r20') define(`v3',`r21')
  42. define(`w0',`r22') define(`w1',`r23') define(`w2',`r24') define(`w3',`r25')
  43. define(`s0',`r26') define(`s1',`r27') define(`s2',`r28') define(`s3',`r29')
  44. define(`x0',`r30') define(`x1',`r31') define(`x2',`r30') define(`x3',`r31')
  45. MULFUNC_PROLOGUE(mpn_addlsh1_n mpn_sublsh1_n)
  46. ASM_START()
  47. PROLOGUE(func)
  48. .prologue
  49. .save ar.lc, r2
  50. .body
  51. ifdef(`HAVE_ABI_32',`
  52. addp4 rp = 0, rp C M I
  53. addp4 up = 0, up C M I
  54. addp4 vp = 0, vp C M I
  55. zxt4 n = n C I
  56. ;;
  57. ')
  58.  {.mmi; ld8 r11 = [vp], 8 C M01
  59. ld8 r10 = [up], 8 C M01
  60. mov.i r2 = ar.lc C I0
  61. }{.mmi; and r14 = 3, n C M I
  62. cmp.lt p15, p0 = 4, n C M I
  63. add n = -4, n C M I
  64. ;;
  65. }{.mmi; cmp.eq p6, p0 = 1, r14 C M I
  66. cmp.eq p7, p0 = 2, r14 C M I
  67. cmp.eq p8, p0 = 3, r14 C M I
  68. }{.bbb
  69.   (p6) br.dptk .Lb01 C B
  70.   (p7) br.dptk .Lb10 C B
  71.   (p8) br.dptk .Lb11 C B
  72. }
  73. .Lb00: ld8 v0 = [vp], 8 C M01
  74. ld8 u0 = [up], 8 C M01
  75. shr.u n = n, 2 C I0
  76. ;;
  77. ld8 v1 = [vp], 8 C M01
  78. ld8 u1 = [up], 8 C M01
  79. add x3 = r11, r11 C M I
  80. ;;
  81. ld8 v2 = [vp], 8 C M01
  82. ld8 u2 = [up], 8 C M01
  83. ADDSUB w3 = r10, x3 C M I
  84.   (p15) br.dpnt .grt4 C B
  85. ;;
  86. shrp x0 = v0, r11, 63 C I0
  87. cmp.PRED p8, p0 = w3, r10 C M I
  88. ;;
  89. shrp x1 = v1, v0, 63 C I0
  90. ADDSUB w0 = u0, x0 C M I
  91. ;;
  92. cmp.PRED p6, p0 = w0, u0 C M I
  93. ADDSUB w1 = u1, x1 C M I
  94. br .Lcj4 C B
  95. .grt4: ld8 v3 = [vp], 8 C M01
  96. shrp x0 = v0, r11, 63 C I0
  97. cmp.PRED p8, p0 = w3, r10 C M I
  98. add n = -1, n
  99. ;;
  100. ld8 u3 = [up], 8 C M01
  101. mov.i ar.lc = n C I0
  102. shrp x1 = v1, v0, 63 C I0
  103. ld8 v0 = [vp], 8 C M01
  104. ADDSUB w0 = u0, x0 C M I
  105. ;;
  106. cmp.PRED p6, p0 = w0, u0 C M I
  107. ld8 u0 = [up], 8 C M01
  108. ADDSUB w1 = u1, x1 C M I
  109. br .LL00 C B
  110. .Lb01: add x2 = r11, r11 C M I
  111. shr.u n = n, 2 C I0
  112.   (p15) br.dpnt .grt1 C B
  113. ;;
  114. ADDSUB w2 = r10, x2 C M I
  115. shr.u r8 = r11, 63 C retval I0
  116. ;;
  117. cmp.PRED p6, p0 = w2, r10 C M I
  118. ;;
  119. st8 [rp] = w2, 8 C M23
  120.    (p6) add r8 = 1, r8 C M I
  121. br.ret.sptk.many b0 C B
  122. .grt1: ld8 v3 = [vp], 8 C M01
  123. ld8 u3 = [up], 8 C M01
  124. mov.i ar.lc = n C FIXME swap with next I0
  125. ;;
  126. ld8 v0 = [vp], 8 C M01
  127. ld8 u0 = [up], 8 C M01
  128. ADDSUB w2 = r10, x2
  129. ;;
  130. ld8 v1 = [vp], 8 C M01
  131. ld8 u1 = [up], 8 C M01
  132. shrp x3 = v3, r11, 63 C I0
  133. ;;
  134. ld8 v2 = [vp], 8 C M01
  135. ld8 u2 = [up], 8 C M01
  136. cmp.PRED p6, p0 = w2, r10 C M I
  137. ADDSUB w3 = u3, x3 C M I
  138. br.cloop.dptk .grt5 C B
  139. ;;
  140. shrp x0 = v0, v3, 63 C I0
  141. cmp.PRED p8, p0 = w3, u3 C M I
  142. br .Lcj5 C B
  143. .grt5: shrp x0 = v0, v3, 63 C I0
  144. ld8 v3 = [vp], 8 C M01
  145. cmp.PRED p8, p0 = w3, u3 C M I
  146. br .LL01 C B
  147. .Lb10: ld8 v2 = [vp], 8 C M01
  148. ld8 u2 = [up], 8 C M01
  149. shr.u n = n, 2 C I0
  150. add x1 = r11, r11 C M I
  151.   (p15) br.dpnt .grt2 C B
  152. ;;
  153. ADDSUB w1 = r10, x1 C M I
  154. shrp x2 = v2, r11, 63 C I0
  155. ;;
  156. cmp.PRED p8, p0 = w1, r10 C M I
  157. ADDSUB w2 = u2, x2 C M I
  158. shr.u r8 = v2, 63 C retval I0
  159. ;;
  160. cmp.PRED p6, p0 = w2, u2 C M I
  161. br .Lcj2 C B
  162. .grt2: ld8 v3 = [vp], 8 C M01
  163. ld8 u3 = [up], 8 C M01
  164. mov.i ar.lc = n C I0
  165. ;;
  166. ld8 v0 = [vp], 8 C M01
  167. ld8 u0 = [up], 8 C M01
  168. ADDSUB w1 = r10, x1 C M I
  169. ;;
  170. ld8 v1 = [vp], 8 C M01
  171. shrp x2 = v2, r11, 63 C I0
  172. cmp.PRED p8, p0 = w1, r10 C M I
  173. ;;
  174. ld8 u1 = [up], 8 C M01
  175. shrp x3 = v3, v2, 63 C I0
  176. ld8 v2 = [vp], 8 C M01
  177. ADDSUB w2 = u2, x2 C M I
  178. ;;
  179. cmp.PRED p6, p0 = w2, u2 C M I
  180. ld8 u2 = [up], 8 C M01
  181. ADDSUB w3 = u3, x3 C M I
  182. br.cloop.dpnt .Loop C B
  183. br .Lskip C B
  184. .Lb11: ld8 v1 = [vp], 8 C M01
  185. ld8 u1 = [up], 8 C M01
  186. shr.u n = n, 2 C I0
  187. add x0 = r11, r11 C M I
  188. ;;
  189. ld8 v2 = [vp], 8 C M01
  190. ld8 u2 = [up], 8 C M01
  191.   (p15) br.dpnt .grt3 C B
  192. ;;
  193. shrp x1 = v1, r11, 63 C I0
  194. ADDSUB w0 = r10, x0 C M I
  195. ;;
  196. cmp.PRED p6, p0 = w0, r10 C M I
  197. ADDSUB w1 = u1, x1 C M I
  198. ;;
  199. shrp x2 = v2, v1, 63 C I0
  200. cmp.PRED p8, p0 = w1, u1 C M I
  201. br .Lcj3 C B
  202. .grt3: ld8 v3 = [vp], 8 C M01
  203. ld8 u3 = [up], 8 C M01
  204. mov.i ar.lc = n C I0
  205. shrp x1 = v1, r11, 63 C I0
  206. ADDSUB w0 = r10, x0 C M I
  207. ;;
  208. ld8 v0 = [vp], 8 C M01
  209. cmp.PRED p6, p0 = w0, r10 C M I
  210. ld8 u0 = [up], 8 C M01
  211. ADDSUB w1 = u1, x1 C M I
  212. ;;
  213. shrp x2 = v2, v1, 63 C I0
  214. ld8 v1 = [vp], 8 C M01
  215. cmp.PRED p8, p0 = w1, u1 C M I
  216. br .LL11 C B
  217. C *** MAIN LOOP START ***
  218. ALIGN(32)
  219. .Loop: st8 [rp] = w1, 8 C M23
  220. shrp x0 = v0, v3, 63 C I0
  221.    (p8) cmp.eq.or p6, p0 = LIM, w2 C M I
  222.    (p8) add w2 = INCR, w2 C M I
  223. ld8 v3 = [vp], 8 C M01
  224. cmp.PRED p8, p0 = w3, u3 C M I
  225. ;;
  226. .LL01: ld8 u3 = [up], 8 C M01
  227. shrp x1 = v1, v0, 63 C I0
  228.    (p6) cmp.eq.or p8, p0 = LIM, w3 C M I
  229.    (p6) add w3 = INCR, w3 C M I
  230. ld8 v0 = [vp], 8 C M01
  231. ADDSUB w0 = u0, x0 C M I
  232. ;;
  233. st8 [rp] = w2, 8 C M23
  234. cmp.PRED p6, p0 = w0, u0 C M I
  235. ld8 u0 = [up], 8 C M01
  236. ADDSUB w1 = u1, x1 C M I
  237. ;;
  238. .LL00: st8 [rp] = w3, 8 C M23
  239. shrp x2 = v2, v1, 63 C I0
  240.    (p8) cmp.eq.or p6, p0 = LIM, w0 C M I
  241.    (p8) add w0 = INCR, w0 C M I
  242. ld8 v1 = [vp], 8 C M01
  243. cmp.PRED p8, p0 = w1, u1 C M I
  244. ;;
  245. .LL11: ld8 u1 = [up], 8 C M01
  246. shrp x3 = v3, v2, 63 C I0
  247.    (p6) cmp.eq.or p8, p0 = LIM, w1 C M I
  248.    (p6) add w1 = INCR, w1 C M I
  249. ld8 v2 = [vp], 8 C M01
  250. ADDSUB w2 = u2, x2 C M I
  251. ;;
  252. st8 [rp] = w0, 8 C M23
  253. cmp.PRED p6, p0 = w2, u2 C M I
  254. ld8 u2 = [up], 8 C M01
  255. ADDSUB w3 = u3, x3 C M I
  256. br.cloop.dptk .Loop C B
  257. ;;
  258. C *** MAIN LOOP END ***
  259. .Lskip: st8 [rp] = w1, 8 C M23
  260. shrp x0 = v0, v3, 63 C I0
  261.    (p8) cmp.eq.or p6, p0 = LIM, w2 C M I
  262.    (p8) add w2 = INCR, w2 C M I
  263. cmp.PRED p8, p0 = w3, u3 C M I
  264. ;;
  265. .Lcj5: shrp x1 = v1, v0, 63 C I0
  266.    (p6) cmp.eq.or p8, p0 = LIM, w3 C M I
  267.    (p6) add w3 = INCR, w3 C M I
  268. ADDSUB w0 = u0, x0 C M I
  269. ;;
  270. st8 [rp] = w2, 8 C M23
  271. cmp.PRED p6, p0 = w0, u0 C M I
  272. ADDSUB w1 = u1, x1 C M I
  273. ;;
  274. .Lcj4: st8 [rp] = w3, 8 C M23
  275. shrp x2 = v2, v1, 63 C I0
  276.    (p8) cmp.eq.or p6, p0 = LIM, w0 C M I
  277.    (p8) add w0 = INCR, w0 C M I
  278. cmp.PRED p8, p0 = w1, u1 C M I
  279. ;;
  280. .Lcj3: shr.u r8 = v2, 63 C I0
  281.    (p6) cmp.eq.or p8, p0 = LIM, w1 C M I
  282.    (p6) add w1 = INCR, w1 C M I
  283. ADDSUB w2 = u2, x2 C M I
  284. ;;
  285. st8 [rp] = w0, 8 C M23
  286. cmp.PRED p6, p0 = w2, u2 C M I
  287. ;;
  288. .Lcj2: st8 [rp] = w1, 8 C M23
  289.    (p8) cmp.eq.or p6, p0 = LIM, w2 C M I
  290.    (p8) add w2 = INCR, w2 C M I
  291. ;;
  292. .Lcj1: st8 [rp] = w2, 8 C M23
  293. mov.i ar.lc = r2 C I0
  294.    (p6) add r8 = 1, r8 C M I
  295. br.ret.sptk.many b0 C B
  296. EPILOGUE()
  297. ASM_END()