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

数学计算

开发平台:

Unix_Linux

  1. dnl  mpn_sqr_basecase for Pentium 4 and P6 models with SSE2 (i.e., 9,D,E,F).
  2. dnl  Copyright 2001, 2002, 2007 Free Software Foundation, Inc.
  3. dnl
  4. dnl  This file is part of the GNU MP Library.
  5. dnl
  6. dnl  The GNU MP Library is free software; you can redistribute it and/or modify
  7. dnl  it under the terms of the GNU Lesser General Public License as published
  8. dnl  by the Free Software Foundation; either version 3 of the License, or (at
  9. dnl  your option) any later version.
  10. dnl
  11. dnl  The GNU MP Library is distributed in the hope that it will be useful, but
  12. dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  13. dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  14. dnl  License for more details.
  15. dnl
  16. dnl  You should have received a copy of the GNU Lesser General Public License
  17. dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  18. include(`../config.m4')
  19. C TODO:
  20. C  * Improve ad-hoc outer loop code and register handling.  Some feed-in
  21. C    scheduling could improve things by several cycles per outer iteration.
  22. C  * In Lam3...Lam1 code for, keep accumulation operands in registers, without
  23. C    storing intermediates to rp.
  24. C  * We might want to keep 32 in a free mm register, since the register form is
  25. C    3 bytes and the immediate form is 4 bytes.  About 80 bytes to save.
  26. C  * Look into different loop alignment, we now expand the code about 50 bytes
  27. C    with possibly needless alignment.
  28. C  * Use OSP, should solve feed-in latency problems.
  29. C  * Address relative slowness for un<=3 for Pentium M.  The old code is there
  30. C    considerably faster.  (1:20/14, 2:34:32, 3:66/57)
  31. C INPUT PARAMETERS
  32. C rp sp + 4
  33. C up sp + 8
  34. C un sp + 12
  35. TEXT
  36. ALIGN(16)
  37. PROLOGUE(mpn_sqr_basecase)
  38. mov 4(%esp), %edx C rp
  39. mov 8(%esp), %eax C up
  40. mov 12(%esp), %ecx C un
  41. cmp $2, %ecx
  42. jc L(un1)
  43. jz L(un2)
  44. cmp $4, %ecx
  45. jc L(un3)
  46. jz L(un4)
  47. jmp L(big)
  48. L(un1): mov (%eax), %eax
  49. mov %edx, %ecx
  50. mul %eax
  51. mov %eax, (%ecx)
  52. mov %edx, 4(%ecx)
  53. ret
  54. L(un2): movd (%eax), %mm0 C un=2
  55. movd (%eax), %mm2 C un=2
  56. movd 4(%eax), %mm1 C un=2
  57. pmuludq %mm0, %mm0 C 64b weight 0 un=2
  58. pmuludq %mm1, %mm2 C 64b weight 32 un=2
  59. pmuludq %mm1, %mm1 C 64b weight 64 un=2
  60. movd %mm0, (%edx) C un=2
  61. psrlq $32, %mm0 C 32b weight 32 un=2
  62. pcmpeqd %mm7, %mm7 C un=2
  63. psrlq $33, %mm7 C 0x000000007FFFFFFF un=2
  64. pand %mm2, %mm7 C 31b weight 32 un=2
  65. psrlq $31, %mm2 C 33b weight 65 un=2
  66. psllq $1, %mm7 C 31b weight 33 un=2
  67. paddq %mm7, %mm0 C un=2
  68. movd %mm0, 4(%edx) C un=2
  69. psrlq $32, %mm0 C un=2
  70. paddq %mm2, %mm1 C un=2
  71. paddq %mm0, %mm1 C un=2
  72. movd %mm1, 8(%edx) C un=2
  73. psrlq $32, %mm1 C un=2
  74. movd %mm1, 12(%edx) C un=2
  75. emms
  76. ret
  77. L(un3): movd (%eax), %mm7 C un=3
  78. movd 4(%eax), %mm6 C un=3
  79. pmuludq %mm7, %mm6 C un=3
  80. movd 8(%eax), %mm2 C un=3
  81. pmuludq %mm7, %mm2 C un=3
  82. movd %mm6, 4(%edx) C un=3
  83. psrlq $32, %mm6 C un=3
  84. paddq %mm2, %mm6 C un=3
  85. movd %mm6, 8(%edx) C un=3
  86. psrlq $32, %mm6 C un=3
  87. movd %mm6, 12(%edx) C un=3
  88. lea 4(%edx), %edx C un=3
  89. lea 4(%eax), %eax C un=3
  90. jmp L(am1)
  91. L(un4): movd (%eax), %mm7 C un=4
  92. movd 4(%eax), %mm6 C un=4
  93. pmuludq %mm7, %mm6 C un=4
  94. movd 8(%eax), %mm0 C un=4
  95. pmuludq %mm7, %mm0 C un=4
  96. movd 12(%eax), %mm1 C un=4
  97. pmuludq %mm7, %mm1 C un=4
  98. movd %mm6, 4(%edx) C un=4
  99. psrlq $32, %mm6 C un=4
  100. paddq %mm0, %mm6 C un=4
  101. movd %mm6, 8(%edx) C un=4
  102. psrlq $32, %mm6 C un=4
  103. paddq %mm1, %mm6 C un=4
  104. movd %mm6, 12(%edx) C un=4
  105. psrlq $32, %mm6 C un=4
  106. movd %mm6, 16(%edx) C un=4
  107. lea 4(%edx), %edx C un=4
  108. lea 4(%eax), %eax C un=4
  109. jmp L(am2)
  110. L(big): push %esi
  111. push %ebx
  112. push %edi
  113. pxor %mm6, %mm6
  114. movd (%eax), %mm7 C
  115. lea 4(%eax), %esi C init up, up++
  116. lea 4(%eax), %eax C up2++  FIXME: should fix offsets
  117. lea 4(%edx), %edi C init rp, rp++
  118. lea 4(%edx), %edx C rp2++
  119. lea -4(%ecx), %ebx C loop count
  120. and $3, %ecx
  121. jz L(3m)
  122. cmp $2, %ecx
  123. ja L(2m)
  124. jb L(0m)
  125. L(1m):
  126. movd (%eax), %mm4 C m 1
  127. lea (%ebx), %ecx C inner loop count m 1
  128. pmuludq %mm7, %mm4 C m 1
  129. movd 4(%eax), %mm3 C m 1
  130. pmuludq %mm7, %mm3 C m 1
  131. movd 8(%eax), %mm0 C m 1
  132. jmp L(m01) C m 1
  133. ALIGN(16) C m 1
  134. L(lpm1):
  135. pmuludq %mm7, %mm4 C m 1
  136. paddq %mm0, %mm6 C m 1
  137. movd 4(%eax), %mm3 C m 1
  138. movd %mm6, -8(%edx) C m 1
  139. psrlq $32, %mm6 C m 1
  140. pmuludq %mm7, %mm3 C m 1
  141. paddq %mm1, %mm6 C m 1
  142. movd 8(%eax), %mm0 C m 1
  143. movd %mm6, -4(%edx) C m 1
  144. psrlq $32, %mm6 C m 1
  145. L(m01): pmuludq %mm7, %mm0 C m 1
  146. paddq %mm4, %mm6 C m 1
  147. movd 12(%eax), %mm1 C m 1
  148. movd %mm6, (%edx) C m 1
  149. psrlq $32, %mm6 C m 1
  150. pmuludq %mm7, %mm1 C m 1
  151. paddq %mm3, %mm6 C m 1
  152. movd 16(%eax), %mm4 C m 1
  153. movd %mm6, 4(%edx) C m 1
  154. psrlq $32, %mm6 C m 1
  155. lea 16(%eax), %eax C m 1
  156. lea 16(%edx), %edx C m 1
  157. sub $4, %ecx C m 1
  158. ja L(lpm1) C m 1
  159. pmuludq %mm7, %mm4 C m 1
  160. paddq %mm0, %mm6 C m 1
  161. movd %mm6, -8(%edx) C m 1
  162. psrlq $32, %mm6 C m 1
  163. paddq %mm1, %mm6 C m 1
  164. jmp L(0)
  165. L(2m):
  166. movd (%eax), %mm1 C m 2
  167. lea (%ebx), %ecx C inner loop count m 2
  168. pmuludq %mm7, %mm1 C m 2
  169. movd 4(%eax), %mm4 C m 2
  170. pmuludq %mm7, %mm4 C m 2
  171. movd 8(%eax), %mm3 C m 2
  172. jmp L(m10) C m 2
  173. ALIGN(16) C m 2
  174. L(lpm2):
  175. pmuludq %mm7, %mm4 C m 2
  176. paddq %mm0, %mm6 C m 2
  177. movd 8(%eax), %mm3 C m 2
  178. movd %mm6, -4(%edx) C m 2
  179. psrlq $32, %mm6 C m 2
  180. L(m10): pmuludq %mm7, %mm3 C m 2
  181. paddq %mm1, %mm6 C m 2
  182. movd 12(%eax), %mm0 C m 2
  183. movd %mm6, (%edx) C m 2
  184. psrlq $32, %mm6 C m 2
  185. pmuludq %mm7, %mm0 C m 2
  186. paddq %mm4, %mm6 C m 2
  187. movd 16(%eax), %mm1 C m 2
  188. movd %mm6, 4(%edx) C m 2
  189. psrlq $32, %mm6 C m 2
  190. pmuludq %mm7, %mm1 C m 2
  191. paddq %mm3, %mm6 C m 2
  192. movd 20(%eax), %mm4 C m 2
  193. movd %mm6, 8(%edx) C m 2
  194. psrlq $32, %mm6 C m 2
  195. lea 16(%eax), %eax C m 2
  196. lea 16(%edx), %edx C m 2
  197. sub $4, %ecx C m 2
  198. ja L(lpm2) C m 2
  199. pmuludq %mm7, %mm4 C m 2
  200. paddq %mm0, %mm6 C m 2
  201. movd %mm6, -4(%edx) C m 2
  202. psrlq $32, %mm6 C m 2
  203. paddq %mm1, %mm6 C m 2
  204. jmp L(1)
  205. L(3m):
  206. movd (%eax), %mm0 C m 3
  207. lea (%ebx), %ecx C inner loop count m 3
  208. pmuludq %mm7, %mm0 C m 3
  209. movd 4(%eax), %mm1 C m 3
  210. pmuludq %mm7, %mm1 C m 3
  211. movd 8(%eax), %mm4 C m 3
  212. jmp L(lpm3) C m 3
  213. ALIGN(16) C m 3
  214. L(lpm3):
  215. pmuludq %mm7, %mm4 C m 3
  216. paddq %mm0, %mm6 C m 3
  217. movd 12(%eax), %mm3 C m 3
  218. movd %mm6, (%edx) C m 3
  219. psrlq $32, %mm6 C m 3
  220. pmuludq %mm7, %mm3 C m 3
  221. paddq %mm1, %mm6 C m 3
  222. movd 16(%eax), %mm0 C m 3
  223. movd %mm6, 4(%edx) C m 3
  224. psrlq $32, %mm6 C m 3
  225. pmuludq %mm7, %mm0 C m 3
  226. paddq %mm4, %mm6 C m 3
  227. movd 20(%eax), %mm1 C m 3
  228. movd %mm6, 8(%edx) C m 3
  229. psrlq $32, %mm6 C m 3
  230. pmuludq %mm7, %mm1 C m 3
  231. paddq %mm3, %mm6 C m 3
  232. movd 24(%eax), %mm4 C m 3
  233. movd %mm6, 12(%edx) C m 3
  234. psrlq $32, %mm6 C m 3
  235. lea 16(%eax), %eax C m 3
  236. lea 16(%edx), %edx C m 3
  237. sub $4, %ecx C m 3
  238. ja L(lpm3) C m 3
  239. pmuludq %mm7, %mm4 C m 3
  240. paddq %mm0, %mm6 C m 3
  241. movd %mm6, (%edx) C m 3
  242. psrlq $32, %mm6 C m 3
  243. paddq %mm1, %mm6 C m 3
  244. jmp L(2)
  245. L(0m):
  246. movd (%eax), %mm3 C m 0
  247. lea (%ebx), %ecx C inner loop count m 0
  248. pmuludq %mm7, %mm3 C m 0
  249. movd 4(%eax), %mm0 C m 0
  250. pmuludq %mm7, %mm0 C m 0
  251. movd 8(%eax), %mm1 C m 0
  252. jmp L(m00) C m 0
  253. ALIGN(16) C m 0
  254. L(lpm0):
  255. pmuludq %mm7, %mm4 C m 0
  256. paddq %mm0, %mm6 C m 0
  257. movd (%eax), %mm3 C m 0
  258. movd %mm6, -12(%edx) C m 0
  259. psrlq $32, %mm6 C m 0
  260. pmuludq %mm7, %mm3 C m 0
  261. paddq %mm1, %mm6 C m 0
  262. movd 4(%eax), %mm0 C m 0
  263. movd %mm6, -8(%edx) C m 0
  264. psrlq $32, %mm6 C m 0
  265. pmuludq %mm7, %mm0 C m 0
  266. paddq %mm4, %mm6 C m 0
  267. movd 8(%eax), %mm1 C m 0
  268. movd %mm6, -4(%edx) C m 0
  269. psrlq $32, %mm6 C m 0
  270. L(m00): pmuludq %mm7, %mm1 C m 0
  271. paddq %mm3, %mm6 C m 0
  272. movd 12(%eax), %mm4 C m 0
  273. movd %mm6, (%edx) C m 0
  274. psrlq $32, %mm6 C m 0
  275. lea 16(%eax), %eax C m 0
  276. lea 16(%edx), %edx C m 0
  277. sub $4, %ecx C m 0
  278. ja L(lpm0) C m 0
  279. pmuludq %mm7, %mm4 C m 0
  280. paddq %mm0, %mm6 C m 0
  281. movd %mm6, -12(%edx) C m 0
  282. psrlq $32, %mm6 C m 0
  283. paddq %mm1, %mm6 C m 0
  284. jmp L(3)
  285. L(outer):
  286. lea 8(%edi), %edi C rp += 2
  287. movd (%esi), %mm7 C am 3
  288. mov %edi, %edx C rp2 = rp am 3
  289. lea 4(%esi), %esi C up++ am 3
  290. lea (%esi), %eax C up2 = up am 3
  291. movd (%eax), %mm0 C am 3
  292. lea (%ebx), %ecx C inner loop count am 3
  293. pxor %mm6, %mm6 C am 3
  294. pmuludq %mm7, %mm0 C am 3
  295. movd 4(%eax), %mm1 C am 3
  296. movd (%edx), %mm4 C am 3
  297. pmuludq %mm7, %mm1 C am 3
  298. movd 8(%eax), %mm2 C am 3
  299. paddq %mm0, %mm4 C am 3
  300. movd 4(%edx), %mm5 C am 3
  301. jmp L(lam3) C am 3
  302. ALIGN(16) C am 3
  303. L(lam3):
  304. pmuludq %mm7, %mm2 C am 3
  305. paddq %mm4, %mm6 C am 3
  306. movd 12(%eax), %mm3 C am 3
  307. paddq %mm1, %mm5 C am 3
  308. movd 8(%edx), %mm4 C am 3
  309. movd %mm6, (%edx) C am 3
  310. psrlq $32, %mm6 C am 3
  311. pmuludq %mm7, %mm3 C am 3
  312. paddq %mm5, %mm6 C am 3
  313. movd 16(%eax), %mm0 C am 3
  314. paddq %mm2, %mm4 C am 3
  315. movd 12(%edx), %mm5 C am 3
  316. movd %mm6, 4(%edx) C am 3
  317. psrlq $32, %mm6 C am 3
  318. pmuludq %mm7, %mm0 C am 3
  319. paddq %mm4, %mm6 C am 3
  320. movd 20(%eax), %mm1 C am 3
  321. paddq %mm3, %mm5 C am 3
  322. movd 16(%edx), %mm4 C am 3
  323. movd %mm6, 8(%edx) C am 3
  324. psrlq $32, %mm6 C am 3
  325. pmuludq %mm7, %mm1 C am 3
  326. paddq %mm5, %mm6 C am 3
  327. movd 24(%eax), %mm2 C am 3
  328. paddq %mm0, %mm4 C am 3
  329. movd 20(%edx), %mm5 C am 3
  330. movd %mm6, 12(%edx) C am 3
  331. psrlq $32, %mm6 C am 3
  332. lea 16(%eax), %eax C am 3
  333. lea 16(%edx), %edx C am 3
  334. sub $4, %ecx C am 3
  335. ja L(lam3) C am 3
  336. pmuludq %mm7, %mm2 C am 3
  337. paddq %mm4, %mm6 C am 3
  338. paddq %mm1, %mm5 C am 3
  339. movd 8(%edx), %mm4 C am 3
  340. movd %mm6, (%edx) C am 3
  341. psrlq $32, %mm6 C am 3
  342. paddq %mm5, %mm6 C am 3
  343. paddq %mm2, %mm4 C am 3
  344. L(2): movd %mm6, 4(%edx) C am 3
  345. psrlq $32, %mm6 C am 3
  346. paddq %mm4, %mm6 C am 3
  347. movd %mm6, 8(%edx) C am 3
  348. psrlq $32, %mm6 C am 3
  349. movd %mm6, 12(%edx) C am 3
  350. lea 8(%edi), %edi C rp += 2
  351. movd (%esi), %mm7 C am 2
  352. mov %edi, %edx C rp2 = rp am 2
  353. lea 4(%esi), %esi C up++ am 2
  354. lea (%esi), %eax C up2 = up am 2
  355. movd (%eax), %mm1 C am 2
  356. lea (%ebx), %ecx C inner loop count am 2
  357. pxor %mm6, %mm6 C am 2
  358. pmuludq %mm7, %mm1 C am 2
  359. movd 4(%eax), %mm2 C am 2
  360. movd (%edx), %mm5 C am 2
  361. pmuludq %mm7, %mm2 C am 2
  362. movd 8(%eax), %mm3 C am 2
  363. paddq %mm1, %mm5 C am 2
  364. movd 4(%edx), %mm4 C am 2
  365. jmp L(am10) C am 2
  366. ALIGN(16) C am 2
  367. L(lam2):
  368. pmuludq %mm7, %mm2 C am 2
  369. paddq %mm4, %mm6 C am 2
  370. movd 8(%eax), %mm3 C am 2
  371. paddq %mm1, %mm5 C am 2
  372. movd 4(%edx), %mm4 C am 2
  373. movd %mm6, -4(%edx) C am 2
  374. psrlq $32, %mm6 C am 2
  375. L(am10):
  376. pmuludq %mm7, %mm3 C am 2
  377. paddq %mm5, %mm6 C am 2
  378. movd 12(%eax), %mm0 C am 2
  379. paddq %mm2, %mm4 C am 2
  380. movd 8(%edx), %mm5 C am 2
  381. movd %mm6, (%edx) C am 2
  382. psrlq $32, %mm6 C am 2
  383. pmuludq %mm7, %mm0 C am 2
  384. paddq %mm4, %mm6 C am 2
  385. movd 16(%eax), %mm1 C am 2
  386. paddq %mm3, %mm5 C am 2
  387. movd 12(%edx), %mm4 C am 2
  388. movd %mm6, 4(%edx) C am 2
  389. psrlq $32, %mm6 C am 2
  390. pmuludq %mm7, %mm1 C am 2
  391. paddq %mm5, %mm6 C am 2
  392. movd 20(%eax), %mm2 C am 2
  393. paddq %mm0, %mm4 C am 2
  394. movd 16(%edx), %mm5 C am 2
  395. movd %mm6, 8(%edx) C am 2
  396. psrlq $32, %mm6 C am 2
  397. lea 16(%eax), %eax C am 2
  398. lea 16(%edx), %edx C am 2
  399. sub $4, %ecx C am 2
  400. ja L(lam2) C am 2
  401. pmuludq %mm7, %mm2 C am 2
  402. paddq %mm4, %mm6 C am 2
  403. paddq %mm1, %mm5 C am 2
  404. movd 4(%edx), %mm4 C am 2
  405. movd %mm6, -4(%edx) C am 2
  406. psrlq $32, %mm6 C am 2
  407. paddq %mm5, %mm6 C am 2
  408. paddq %mm2, %mm4 C am 2
  409. L(1): movd %mm6, (%edx) C am 2
  410. psrlq $32, %mm6 C am 2
  411. paddq %mm4, %mm6 C am 2
  412. movd %mm6, 4(%edx) C am 2
  413. psrlq $32, %mm6 C am 2
  414. movd %mm6, 8(%edx) C am 2
  415. lea 8(%edi), %edi C rp += 2
  416. movd (%esi), %mm7 C am 1
  417. mov %edi, %edx C rp2 = rp am 1
  418. lea 4(%esi), %esi C up++ am 1
  419. lea (%esi), %eax C up2 = up am 1
  420. movd (%eax), %mm2 C am 1
  421. lea (%ebx), %ecx C inner loop count am 1
  422. pxor %mm6, %mm6 C am 1
  423. pmuludq %mm7, %mm2 C am 1
  424. movd 4(%eax), %mm3 C am 1
  425. movd (%edx), %mm4 C am 1
  426. pmuludq %mm7, %mm3 C am 1
  427. movd 8(%eax), %mm0 C am 1
  428. paddq %mm2, %mm4 C am 1
  429. movd 4(%edx), %mm5 C am 1
  430. jmp L(am01) C am 1
  431. ALIGN(16) C am 1
  432. L(lam1):
  433. pmuludq %mm7, %mm2 C am 1
  434. paddq %mm4, %mm6 C am 1
  435. movd 4(%eax), %mm3 C am 1
  436. paddq %mm1, %mm5 C am 1
  437. movd (%edx), %mm4 C am 1
  438. movd %mm6, -8(%edx) C am 1
  439. psrlq $32, %mm6 C am 1
  440. pmuludq %mm7, %mm3 C am 1
  441. paddq %mm5, %mm6 C am 1
  442. movd 8(%eax), %mm0 C am 1
  443. paddq %mm2, %mm4 C am 1
  444. movd 4(%edx), %mm5 C am 1
  445. movd %mm6, -4(%edx) C am 1
  446. psrlq $32, %mm6 C am 1
  447. L(am01):
  448. pmuludq %mm7, %mm0 C am 1
  449. paddq %mm4, %mm6 C am 1
  450. movd 12(%eax), %mm1 C am 1
  451. paddq %mm3, %mm5 C am 1
  452. movd 8(%edx), %mm4 C am 1
  453. movd %mm6, (%edx) C am 1
  454. psrlq $32, %mm6 C am 1
  455. pmuludq %mm7, %mm1 C am 1
  456. paddq %mm5, %mm6 C am 1
  457. movd 16(%eax), %mm2 C am 1
  458. paddq %mm0, %mm4 C am 1
  459. movd 12(%edx), %mm5 C am 1
  460. movd %mm6, 4(%edx) C am 1
  461. psrlq $32, %mm6 C am 1
  462. lea 16(%eax), %eax C am 1
  463. lea 16(%edx), %edx C am 1
  464. sub $4, %ecx C am 1
  465. ja L(lam1) C am 1
  466. pmuludq %mm7, %mm2 C am 1
  467. paddq %mm4, %mm6 C am 1
  468. paddq %mm1, %mm5 C am 1
  469. movd (%edx), %mm4 C am 1
  470. movd %mm6, -8(%edx) C am 1
  471. psrlq $32, %mm6 C am 1
  472. paddq %mm5, %mm6 C am 1
  473. paddq %mm2, %mm4 C am 1
  474. L(0): movd %mm6, -4(%edx) C am 1
  475. psrlq $32, %mm6 C am 1
  476. paddq %mm4, %mm6 C am 1
  477. movd %mm6, (%edx) C am 1
  478. psrlq $32, %mm6 C am 1
  479. movd %mm6, 4(%edx) C am 1
  480. lea 8(%edi), %edi C rp += 2
  481. movd (%esi), %mm7 C am 0
  482. mov %edi, %edx C rp2 = rp am 0
  483. lea 4(%esi), %esi C up++ am 0
  484. lea (%esi), %eax C up2 = up am 0
  485. movd (%eax), %mm3 C am 0
  486. lea (%ebx), %ecx C inner loop count am 0
  487. pxor %mm6, %mm6 C am 0
  488. pmuludq %mm7, %mm3 C am 0
  489. movd 4(%eax), %mm0 C am 0
  490. movd (%edx), %mm5 C am 0
  491. pmuludq %mm7, %mm0 C am 0
  492. movd 8(%eax), %mm1 C am 0
  493. paddq %mm3, %mm5 C am 0
  494. movd 4(%edx), %mm4 C am 0
  495. jmp L(am00) C am 0
  496. ALIGN(16) C am 0
  497. L(lam0):
  498. pmuludq %mm7, %mm2 C am 0
  499. paddq %mm4, %mm6 C am 0
  500. movd (%eax), %mm3 C am 0
  501. paddq %mm1, %mm5 C am 0
  502. movd -4(%edx), %mm4 C am 0
  503. movd %mm6, -12(%edx) C am 0
  504. psrlq $32, %mm6 C am 0
  505. pmuludq %mm7, %mm3 C am 0
  506. paddq %mm5, %mm6 C am 0
  507. movd 4(%eax), %mm0 C am 0
  508. paddq %mm2, %mm4 C am 0
  509. movd (%edx), %mm5 C am 0
  510. movd %mm6, -8(%edx) C am 0
  511. psrlq $32, %mm6 C am 0
  512. pmuludq %mm7, %mm0 C am 0
  513. paddq %mm4, %mm6 C am 0
  514. movd 8(%eax), %mm1 C am 0
  515. paddq %mm3, %mm5 C am 0
  516. movd 4(%edx), %mm4 C am 0
  517. movd %mm6, -4(%edx) C am 0
  518. psrlq $32, %mm6 C am 0
  519. L(am00):
  520. pmuludq %mm7, %mm1 C am 0
  521. paddq %mm5, %mm6 C am 0
  522. movd 12(%eax), %mm2 C am 0
  523. paddq %mm0, %mm4 C am 0
  524. movd 8(%edx), %mm5 C am 0
  525. movd %mm6, (%edx) C am 0
  526. psrlq $32, %mm6 C am 0
  527. lea 16(%eax), %eax C am 0
  528. lea 16(%edx), %edx C am 0
  529. sub $4, %ecx C am 0
  530. ja L(lam0) C am 0
  531. pmuludq %mm7, %mm2 C am 0
  532. paddq %mm4, %mm6 C am 0
  533. paddq %mm1, %mm5 C am 0
  534. movd -4(%edx), %mm4 C am 0
  535. movd %mm6, -12(%edx) C am 0
  536. psrlq $32, %mm6 C am 0
  537. paddq %mm5, %mm6 C am 0
  538. paddq %mm2, %mm4 C am 0
  539. L(3): movd %mm6, -8(%edx) C am 0
  540. psrlq $32, %mm6 C am 0
  541. paddq %mm4, %mm6 C am 0
  542. movd %mm6, -4(%edx) C am 0
  543. psrlq $32, %mm6 C am 0
  544. movd %mm6, (%edx) C am 0
  545. sub $4, %ebx C am 0
  546. ja L(outer) C am 0
  547. mov %edi, %edx
  548. mov %esi, %eax
  549. pop %edi
  550. pop %ebx
  551. pop %esi
  552. L(am3): C up[un-1..un-3] x up[un-4]
  553. lea 8(%edx), %edx C rp2 += 2
  554. movd (%eax), %mm7
  555. movd 4(%eax), %mm1
  556. movd 8(%eax), %mm2
  557. movd 12(%eax), %mm3
  558. movd (%edx), %mm4
  559. pmuludq %mm7, %mm1
  560. movd 4(%edx), %mm5
  561. pmuludq %mm7, %mm2
  562. movd 8(%edx), %mm6
  563. pmuludq %mm7, %mm3
  564. paddq %mm1, %mm4
  565. paddq %mm2, %mm5
  566. paddq %mm3, %mm6
  567. movd %mm4, (%edx)
  568. psrlq $32, %mm4
  569. paddq %mm5, %mm4
  570. movd %mm4, 4(%edx)
  571. psrlq $32, %mm4
  572. paddq %mm6, %mm4
  573. movd %mm4, 8(%edx)
  574. psrlq $32, %mm4
  575. movd %mm4, 12(%edx) C FIXME feed through!
  576. lea 4(%eax), %eax
  577. L(am2): C up[un-1..un-2] x up[un-3]
  578. lea 8(%edx), %edx C rp2 += 2
  579. movd (%eax), %mm7
  580. movd 4(%eax), %mm1
  581. movd 8(%eax), %mm2
  582. movd (%edx), %mm4
  583. movd 4(%edx), %mm5
  584. pmuludq %mm7, %mm1
  585. pmuludq %mm7, %mm2
  586. paddq %mm1, %mm4
  587. paddq %mm2, %mm5
  588. movd %mm4, (%edx)
  589. psrlq $32, %mm4
  590. paddq %mm5, %mm4
  591. movd %mm4, 4(%edx)
  592. psrlq $32, %mm4
  593. movd %mm4, 8(%edx) C FIXME feed through!
  594. lea 4(%eax), %eax
  595. L(am1): C up[un-1] x up[un-2]
  596. lea 8(%edx), %edx C rp2 += 2
  597. movd (%eax), %mm7
  598. movd 4(%eax), %mm2
  599. movd (%edx), %mm4
  600. pmuludq %mm7, %mm2
  601. paddq %mm2, %mm4
  602. movd %mm4, (%edx)
  603. psrlq $32, %mm4
  604. movd %mm4, 4(%edx)
  605. C *** diag stuff, use elementary code for now
  606. mov 4(%esp), %edx C rp
  607. mov 8(%esp), %eax C up
  608. mov 12(%esp), %ecx C un
  609. movd (%eax), %mm2
  610. pmuludq %mm2, %mm2 C src[0]^2
  611. pcmpeqd %mm7, %mm7
  612. psrlq $32, %mm7
  613. movd 4(%edx), %mm3 C dst[1]
  614. movd %mm2, (%edx)
  615. psrlq $32, %mm2
  616. psllq $1, %mm3 C 2*dst[1]
  617. paddq %mm3, %mm2
  618. movd %mm2, 4(%edx)
  619. psrlq $32, %mm2
  620. sub $2, %ecx
  621. L(diag):
  622. movd 4(%eax), %mm0 C src limb
  623. add $4, %eax
  624. pmuludq %mm0, %mm0
  625. movq %mm7, %mm1
  626. pand %mm0, %mm1 C diagonal low
  627. psrlq $32, %mm0 C diagonal high
  628. movd 8(%edx), %mm3
  629. psllq $1, %mm3 C 2*dst[i]
  630. paddq %mm3, %mm1
  631. paddq %mm1, %mm2
  632. movd %mm2, 8(%edx)
  633. psrlq $32, %mm2
  634. movd 12(%edx), %mm3
  635. psllq $1, %mm3 C 2*dst[i+1]
  636. paddq %mm3, %mm0
  637. paddq %mm0, %mm2
  638. movd %mm2, 12(%edx)
  639. add $8, %edx
  640. psrlq $32, %mm2
  641. sub $1, %ecx
  642. jnz L(diag)
  643. movd 4(%eax), %mm0 C src[size-1]
  644. pmuludq %mm0, %mm0
  645. pand %mm0, %mm7 C diagonal low
  646. psrlq $32, %mm0 C diagonal high
  647. movd 8(%edx), %mm3 C dst[2*size-2]
  648. psllq $1, %mm3
  649. paddq %mm3, %mm7
  650. paddq %mm7, %mm2
  651. movd %mm2, 8(%edx)
  652. psrlq $32, %mm2
  653. paddq %mm0, %mm2
  654. movd %mm2, 12(%edx) C dst[2*size-1]
  655. emms
  656. ret
  657. EPILOGUE()