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

数学计算

开发平台:

Unix_Linux

  1. dnl  SPARC v9 32-bit mpn_sqr_diagonal.
  2. dnl  Copyright 2001, 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 INPUT PARAMETERS
  16. C rp i0
  17. C up i1
  18. C n i2
  19. C This code uses a very deep software pipeline, due to the need for moving data
  20. C forth and back between the integer registers and floating-point registers.
  21. C
  22. C A VIS variant of this code would make the pipeline less deep, since the
  23. C masking now done in the integer unit could take place in the floating-point
  24. C unit using the FAND instruction.  It would be possible to save several cycles
  25. C too.
  26. C
  27. C On UltraSPARC 1 and 2, this code runs at 11 cycles/limb from the Dcache and
  28. C not much slower from the Ecache.  It would perhaps be possible to shave off
  29. C one cycle, but not easily.  We cannot do better than 10 cycles/limb with the
  30. C used instructions, since we have 10 memory operations per limb.  But a VIS
  31. C variant could run three cycles faster than the corresponding non-VIS code.
  32. C This is non-pipelined code showing the algorithm:
  33. C
  34. C .Loop:
  35. C lduw [up+0],%g4 C 00000000hhhhllll
  36. C sllx %g4,16,%g3 C 0000hhhhllll0000
  37. C or %g3,%g4,%g2 C 0000hhhhXXXXllll
  38. C andn %g2,%g5,%g2 C 0000hhhh0000llll
  39. C stx %g2,[%fp+80]
  40. C ldd [%fp+80],%f0
  41. C fitod %f0,%f4 C hi16
  42. C fitod %f1,%f6 C lo16
  43. C ld [up+0],%f9
  44. C fxtod %f8,%f2
  45. C fmuld %f2,%f4,%f4
  46. C fmuld %f2,%f6,%f6
  47. C fdtox %f4,%f4
  48. C fdtox %f6,%f6
  49. C std %f4,[%fp-24]
  50. C std %f6,[%fp-16]
  51. C ldx [%fp-24],%g2
  52. C ldx [%fp-16],%g1
  53. C sllx %g2,16,%g2
  54. C add %g2,%g1,%g1
  55. C stw %g1,[rp+0]
  56. C srlx %g1,32,%l0
  57. C stw %l0,[rp+4]
  58. C add up,4,up
  59. C subcc n,1,n
  60. C bne,pt %icc,.Loop
  61. C add rp,8,rp
  62. define(`fanop',`fitod %f12,%f10') dnl  A quasi nop running in the FA pipe
  63. ASM_START()
  64. TEXT
  65. ALIGN(4)
  66. .Lnoll:
  67. .word 0
  68. PROLOGUE(mpn_sqr_diagonal)
  69. save %sp,-256,%sp
  70. ifdef(`PIC',
  71. `.Lpc: rd %pc,%o7
  72. ld [%o7+.Lnoll-.Lpc],%f8',
  73. ` sethi %hi(.Lnoll),%g1
  74. ld [%g1+%lo(.Lnoll)],%f8')
  75. sethi %hi(0xffff0000),%g5
  76. add %i1,-8,%i1
  77. lduw [%i1+8],%g4
  78. add %i1,4,%i1 C s1_ptr++
  79. sllx %g4,16,%g3 C 0000hhhhllll0000
  80. or %g3,%g4,%g2 C 0000hhhhXXXXllll
  81. subcc %i2,1,%i2
  82. bne,pt %icc,.L_grt_1
  83. andn %g2,%g5,%g2 C 0000hhhh0000llll
  84. add %i1,4,%i1 C s1_ptr++
  85. stx %g2,[%fp+80]
  86. ld [%i1],%f9
  87. ldd [%fp+80],%f0
  88. fxtod %f8,%f2
  89. fitod %f0,%f4
  90. fitod %f1,%f6
  91. fmuld %f2,%f4,%f4
  92. fmuld %f2,%f6,%f6
  93. fdtox %f4,%f4
  94. fdtox %f6,%f6
  95. std %f4,[%fp-24]
  96. std %f6,[%fp-16]
  97. add %fp, 80, %l3
  98. add %fp, -24, %l4
  99. add %fp, 72, %l5
  100. b .L1
  101. add %fp, -40, %l6
  102. .L_grt_1:
  103. stx %g2,[%fp+80]
  104. lduw [%i1+8],%g4
  105. add %i1,4,%i1 C s1_ptr++
  106. sllx %g4,16,%g3 C 0000hhhhllll0000
  107. or %g3,%g4,%g2 C 0000hhhhXXXXllll
  108. subcc %i2,1,%i2
  109. bne,pt %icc,.L_grt_2
  110. andn %g2,%g5,%g2 C 0000hhhh0000llll
  111. stx %g2,[%fp+72]
  112. ld [%i1],%f9
  113. add %i1,4,%i1 C s1_ptr++
  114. ldd [%fp+80],%f0
  115. fxtod %f8,%f2
  116. fitod %f0,%f4
  117. fitod %f1,%f6
  118. fmuld %f2,%f4,%f4
  119. ld [%i1],%f9
  120. fmuld %f2,%f6,%f6
  121. ldd [%fp+72],%f0
  122. fdtox %f4,%f4
  123. fdtox %f6,%f6
  124. std %f4,[%fp-24]
  125. fxtod %f8,%f2
  126. std %f6,[%fp-16]
  127. fitod %f0,%f4
  128. fitod %f1,%f6
  129. fmuld %f2,%f4,%f4
  130. fmuld %f2,%f6,%f6
  131. fdtox %f4,%f4
  132. add %fp, 72, %l3
  133. add %fp, -40, %l4
  134. add %fp, 80, %l5
  135. b .L2
  136. add %fp, -24, %l6
  137. .L_grt_2:
  138. stx %g2,[%fp+72]
  139. lduw [%i1+8],%g4
  140. ld [%i1],%f9
  141. add %i1,4,%i1 C s1_ptr++
  142. ldd [%fp+80],%f0
  143. sllx %g4,16,%g3 C 0000hhhhllll0000
  144. or %g3,%g4,%g2 C 0000hhhhXXXXllll
  145. subcc %i2,1,%i2
  146. fxtod %f8,%f2
  147. bne,pt %icc,.L_grt_3
  148. andn %g2,%g5,%g2 C 0000hhhh0000llll
  149. stx %g2,[%fp+80]
  150. fitod %f0,%f4
  151. fitod %f1,%f6
  152. fmuld %f2,%f4,%f4
  153. ld [%i1],%f9
  154. fmuld %f2,%f6,%f6
  155. add %i1,4,%i1 C s1_ptr++
  156. ldd [%fp+72],%f0
  157. fdtox %f4,%f4
  158. fdtox %f6,%f6
  159. std %f4,[%fp-24]
  160. fxtod %f8,%f2
  161. std %f6,[%fp-16]
  162. fitod %f0,%f4
  163. fitod %f1,%f6
  164. fmuld %f2,%f4,%f4
  165. ld [%i1],%f9
  166. add %fp, 80, %l3
  167. fmuld %f2,%f6,%f6
  168. add %fp, -24, %l4
  169. ldd [%fp+80],%f0
  170. add %fp, 72, %l5
  171. fdtox %f4,%f4
  172. b .L3
  173. add %fp, -40, %l6
  174. .L_grt_3:
  175. stx %g2,[%fp+80]
  176. fitod %f0,%f4
  177. lduw [%i1+8],%g4
  178. fitod %f1,%f6
  179. fmuld %f2,%f4,%f4
  180. ld [%i1],%f9
  181. fmuld %f2,%f6,%f6
  182. add %i1,4,%i1 C s1_ptr++
  183. ldd [%fp+72],%f0
  184. fdtox %f4,%f4
  185. sllx %g4,16,%g3 C 0000hhhhllll0000
  186. fdtox %f6,%f6
  187. or %g3,%g4,%g2 C 0000hhhhXXXXllll
  188. subcc %i2,1,%i2
  189. std %f4,[%fp-24]
  190. fxtod %f8,%f2
  191. std %f6,[%fp-16]
  192. bne,pt %icc,.L_grt_4
  193. andn %g2,%g5,%g2 C 0000hhhh0000llll
  194. stx %g2,[%fp+72]
  195. fitod %f0,%f4
  196. fitod %f1,%f6
  197. add %fp, 72, %l3
  198. fmuld %f2,%f4,%f4
  199. add %fp, -40, %l4
  200. ld [%i1],%f9
  201. fmuld %f2,%f6,%f6
  202. add %i1,4,%i1 C s1_ptr++
  203. ldd [%fp+80],%f0
  204. add %fp, 80, %l5
  205. fdtox %f4,%f4
  206. b .L4
  207. add %fp, -24, %l6
  208. .L_grt_4:
  209. stx %g2,[%fp+72]
  210. fitod %f0,%f4
  211. lduw [%i1+8],%g4
  212. fitod %f1,%f6
  213. fmuld %f2,%f4,%f4
  214. ld [%i1],%f9
  215. fmuld %f2,%f6,%f6
  216. add %i1,4,%i1 C s1_ptr++
  217. ldd [%fp+80],%f0
  218. fdtox %f4,%f4
  219. sllx %g4,16,%g3 C 0000hhhhllll0000
  220. fdtox %f6,%f6
  221. or %g3,%g4,%g2 C 0000hhhhXXXXllll
  222. subcc %i2,1,%i2
  223. std %f4,[%fp-40]
  224. fxtod %f8,%f2
  225. std %f6,[%fp-32]
  226. be,pn %icc,.L5
  227. andn %g2,%g5,%g2 C 0000hhhh0000llll
  228. b,a .Loop
  229. .align 16
  230. C --- LOOP BEGIN
  231. .Loop: nop
  232. nop
  233. stx %g2,[%fp+80]
  234. fitod %f0,%f4
  235. C ---
  236. nop
  237. nop
  238. lduw [%i1+8],%g4
  239. fitod %f1,%f6
  240. C ---
  241. nop
  242. nop
  243. ldx [%fp-24],%g2 C p16
  244. fanop
  245. C ---
  246. nop
  247. nop
  248. ldx [%fp-16],%g1 C p0
  249. fmuld %f2,%f4,%f4
  250. C ---
  251. sllx %g2,16,%g2 C align p16
  252. add %i0,8,%i0 C res_ptr++
  253. ld [%i1],%f9
  254. fmuld %f2,%f6,%f6
  255. C ---
  256. add %g2,%g1,%g1 C add p16 to p0 (ADD1)
  257. add %i1,4,%i1 C s1_ptr++
  258. ldd [%fp+72],%f0
  259. fanop
  260. C ---
  261. srlx %g1,32,%l0
  262. nop
  263. stw %g1,[%i0-8]
  264. fdtox %f4,%f4
  265. C ---
  266. sllx %g4,16,%g3 C 0000hhhhllll0000
  267. nop
  268. stw %l0,[%i0-4]
  269. fdtox %f6,%f6
  270. C ---
  271. or %g3,%g4,%g2 C 0000hhhhXXXXllll
  272. subcc %i2,1,%i2
  273. std %f4,[%fp-24]
  274. fxtod %f8,%f2
  275. C ---
  276. std %f6,[%fp-16]
  277. andn %g2,%g5,%g2 C 0000hhhh0000llll
  278. be,pn %icc,.Lend
  279. fanop
  280. C ---  LOOP MIDDLE
  281. nop
  282. nop
  283. stx %g2,[%fp+72]
  284. fitod %f0,%f4
  285. C ---
  286. nop
  287. nop
  288. lduw [%i1+8],%g4
  289. fitod %f1,%f6
  290. C ---
  291. nop
  292. nop
  293. ldx [%fp-40],%g2 C p16
  294. fanop
  295. C ---
  296. nop
  297. nop
  298. ldx [%fp-32],%g1 C p0
  299. fmuld %f2,%f4,%f4
  300. C ---
  301. sllx %g2,16,%g2 C align p16
  302. add %i0,8,%i0 C res_ptr++
  303. ld [%i1],%f9
  304. fmuld %f2,%f6,%f6
  305. C ---
  306. add %g2,%g1,%g1 C add p16 to p0 (ADD1)
  307. add %i1,4,%i1 C s1_ptr++
  308. ldd [%fp+80],%f0
  309. fanop
  310. C ---
  311. srlx %g1,32,%l0
  312. nop
  313. stw %g1,[%i0-8]
  314. fdtox %f4,%f4
  315. C ---
  316. sllx %g4,16,%g3 C 0000hhhhllll0000
  317. nop
  318. stw %l0,[%i0-4]
  319. fdtox %f6,%f6
  320. C ---
  321. or %g3,%g4,%g2 C 0000hhhhXXXXllll
  322. subcc %i2,1,%i2
  323. std %f4,[%fp-40]
  324. fxtod %f8,%f2
  325. C ---
  326. std %f6,[%fp-32]
  327. andn %g2,%g5,%g2 C 0000hhhh0000llll
  328. bne,pt %icc,.Loop
  329. fanop
  330. C --- LOOP END
  331. .L5: add %fp, 80, %l3
  332. add %fp, -24, %l4
  333. add %fp, 72, %l5
  334. b .Ltail
  335. add %fp, -40, %l6
  336. .Lend: add %fp, 72, %l3
  337. add %fp, -40, %l4
  338. add %fp, 80, %l5
  339. add %fp, -24, %l6
  340. .Ltail: stx %g2,[%l3]
  341. fitod %f0,%f4
  342. fitod %f1,%f6
  343. ldx [%l4],%g2 C p16
  344. ldx [%l4+8],%g1 C p0
  345. fmuld %f2,%f4,%f4
  346. sllx %g2,16,%g2 C align p16
  347. add %i0,8,%i0 C res_ptr++
  348. ld [%i1],%f9
  349. fmuld %f2,%f6,%f6
  350. add %g2,%g1,%g1 C add p16 to p0 (ADD1)
  351. add %i1,4,%i1 C s1_ptr++
  352. ldd [%l5],%f0
  353. srlx %g1,32,%l0
  354. stw %g1,[%i0-8]
  355. fdtox %f4,%f4
  356. stw %l0,[%i0-4]
  357. .L4: fdtox %f6,%f6
  358. std %f4,[%l4]
  359. fxtod %f8,%f2
  360. std %f6,[%l4+8]
  361. fitod %f0,%f4
  362. fitod %f1,%f6
  363. ldx [%l6],%g2 C p16
  364. ldx [%l6+8],%g1 C p0
  365. fmuld %f2,%f4,%f4
  366. sllx %g2,16,%g2 C align p16
  367. add %i0,8,%i0 C res_ptr++
  368. ld [%i1],%f9
  369. fmuld %f2,%f6,%f6
  370. add %g2,%g1,%g1 C add p16 to p0 (ADD1)
  371. ldd [%l3],%f0
  372. srlx %g1,32,%l0
  373. stw %g1,[%i0-8]
  374. fdtox %f4,%f4
  375. stw %l0,[%i0-4]
  376. .L3: fdtox %f6,%f6
  377. std %f4,[%l6]
  378. fxtod %f8,%f2
  379. std %f6,[%l6+8]
  380. fitod %f0,%f4
  381. fitod %f1,%f6
  382. ldx [%l4],%g2 C p16
  383. ldx [%l4+8],%g1 C p0
  384. fmuld %f2,%f4,%f4
  385. sllx %g2,16,%g2 C align p16
  386. add %i0,8,%i0 C res_ptr++
  387. fmuld %f2,%f6,%f6
  388. add %g2,%g1,%g1 C add p16 to p0 (ADD1)
  389. srlx %g1,32,%l0
  390. stw %g1,[%i0-8]
  391. fdtox %f4,%f4
  392. stw %l0,[%i0-4]
  393. .L2: fdtox %f6,%f6
  394. std %f4,[%l4]
  395. std %f6,[%l4+8]
  396. ldx [%l6],%g2 C p16
  397. ldx [%l6+8],%g1 C p0
  398. sllx %g2,16,%g2 C align p16
  399. add %i0,8,%i0 C res_ptr++
  400. add %g2,%g1,%g1 C add p16 to p0 (ADD1)
  401. srlx %g1,32,%l0
  402. stw %g1,[%i0-8]
  403. stw %l0,[%i0-4]
  404. .L1: ldx [%l4],%g2 C p16
  405. ldx [%l4+8],%g1 C p0
  406. sllx %g2,16,%g2 C align p16
  407. add %i0,8,%i0 C res_ptr++
  408. add %g2,%g1,%g1 C add p16 to p0 (ADD1)
  409. srlx %g1,32,%l0
  410. stw %g1,[%i0-8]
  411. stw %l0,[%i0-4]
  412. ret
  413. restore %g0,%g0,%o0
  414. EPILOGUE(mpn_sqr_diagonal)