You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

722 lines
17KB

  1. ;******************************************************************************
  2. ;* 36 point SSE-optimized IMDCT transform
  3. ;* Copyright (c) 2011 Vitor Sessak
  4. ;*
  5. ;* This file is part of Libav.
  6. ;*
  7. ;* Libav is free software; you can redistribute it and/or
  8. ;* modify it under the terms of the GNU Lesser General Public
  9. ;* License as published by the Free Software Foundation; either
  10. ;* version 2.1 of the License, or (at your option) any later version.
  11. ;*
  12. ;* Libav is distributed in the hope that it will be useful,
  13. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. ;* Lesser General Public License for more details.
  16. ;*
  17. ;* You should have received a copy of the GNU Lesser General Public
  18. ;* License along with Libav; if not, write to the Free Software
  19. ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. ;******************************************************************************
  21. %include "libavutil/x86/x86inc.asm"
  22. %include "libavutil/x86/x86util.asm"
  23. SECTION_RODATA
  24. align 16
  25. ps_mask: dd 0, ~0, ~0, ~0
  26. ps_mask2: dd 0, ~0, 0, ~0
  27. ps_mask3: dd 0, 0, 0, ~0
  28. ps_mask4: dd 0, ~0, 0, 0
  29. ps_val1: dd -0.5, -0.5, -0.8660254038, -0.8660254038
  30. ps_val2: dd 1.0, 1.0, 0.8660254038, 0.8660254038
  31. ps_val3: dd 0.1736481777, 0.1736481777, 0.3420201433, 0.3420201433
  32. ps_val4: dd -0.7660444431, -0.7660444431, 0.8660254038, 0.8660254038
  33. ps_val5: dd -0.9396926208, -0.9396926208, -0.9848077530, -0.9848077530
  34. ps_val6: dd 0.5, 0.5, -0.6427876097, -0.6427876097
  35. ps_val7: dd 1.0, 1.0, -0.6427876097, -0.6427876097
  36. ps_p1p1m1m1: dd 0, 0, 0x80000000, 0x80000000
  37. ps_p1m1p1m1: dd 0, 0x80000000, 0, 0x80000000
  38. ps_cosh: dd 1.0, 0.50190991877167369479, 1.0, 5.73685662283492756461
  39. dd 1.0, 0.51763809020504152469, 1.0, 1.93185165257813657349
  40. dd 1.0, 0.55168895948124587824, -1.0, -1.18310079157624925896
  41. dd 1.0, 0.61038729438072803416, -1.0, -0.87172339781054900991
  42. dd 1.0, 0.70710678118654752439, 0.0, 0.0
  43. ps_cosh_sse3: dd 1.0, -0.50190991877167369479, 1.0, -5.73685662283492756461
  44. dd 1.0, -0.51763809020504152469, 1.0, -1.93185165257813657349
  45. dd 1.0, -0.55168895948124587824, -1.0, 1.18310079157624925896
  46. dd 1.0, -0.61038729438072803416, -1.0, 0.87172339781054900991
  47. dd 1.0, 0.70710678118654752439, 0.0, 0.0
  48. costabs: times 4 dd 0.98480773
  49. times 4 dd 0.93969262
  50. times 4 dd 0.86602539
  51. times 4 dd -0.76604444
  52. times 4 dd -0.64278764
  53. times 4 dd 0.50000000
  54. times 4 dd -0.50000000
  55. times 4 dd -0.34202015
  56. times 4 dd -0.17364818
  57. times 4 dd 0.50190992
  58. times 4 dd 0.51763808
  59. times 4 dd 0.55168896
  60. times 4 dd 0.61038726
  61. times 4 dd 0.70710677
  62. times 4 dd 0.87172341
  63. times 4 dd 1.18310082
  64. times 4 dd 1.93185163
  65. times 4 dd 5.73685646
  66. %define SBLIMIT 32
  67. SECTION_TEXT
  68. %macro PSHUFD 3
  69. %if cpuflag(sse2) && notcpuflag(avx)
  70. pshufd %1, %2, %3
  71. %else
  72. shufps %1, %2, %2, %3
  73. %endif
  74. %endmacro
  75. ; input %2={x1,x2,x3,x4}, %3={y1,y2,y3,y4}
  76. ; output %1={x3,x4,y1,y2}
  77. %macro BUILDINVHIGHLOW 3
  78. %if cpuflag(avx)
  79. shufps %1, %2, %3, 0x4e
  80. %else
  81. movlhps %1, %3
  82. movhlps %1, %2
  83. %endif
  84. %endmacro
  85. ; input %2={x1,x2,x3,x4}, %3={y1,y2,y3,y4}
  86. ; output %1={x4,y1,y2,y3}
  87. %macro ROTLEFT 3
  88. %if cpuflag(ssse3)
  89. palignr %1, %3, %2, 12
  90. %else
  91. BUILDINVHIGHLOW %1, %2, %3
  92. shufps %1, %1, %3, 0x99
  93. %endif
  94. %endmacro
  95. %macro INVERTHL 2
  96. %if cpuflag(sse2)
  97. PSHUFD %1, %2, 0x4e
  98. %else
  99. movhlps %1, %2
  100. movlhps %1, %2
  101. %endif
  102. %endmacro
  103. %macro BUTTERF 3
  104. INVERTHL %2, %1
  105. xorps %1, [ps_p1p1m1m1]
  106. addps %1, %2
  107. %if cpuflag(sse3)
  108. mulps %1, %1, [ps_cosh_sse3 + %3]
  109. PSHUFD %2, %1, 0xb1
  110. addsubps %1, %1, %2
  111. %else
  112. mulps %1, [ps_cosh + %3]
  113. PSHUFD %2, %1, 0xb1
  114. xorps %1, [ps_p1m1p1m1]
  115. addps %1, %2
  116. %endif
  117. %endmacro
  118. %macro STORE 4
  119. movhlps %2, %1
  120. movss [%3 ], %1
  121. movss [%3 + 2*%4], %2
  122. shufps %1, %1, 0xb1
  123. movss [%3 + %4], %1
  124. movhlps %2, %1
  125. movss [%3 + 3*%4], %2
  126. %endmacro
  127. %macro LOAD 4
  128. movlps %1, [%3 ]
  129. movhps %1, [%3 + %4]
  130. movlps %2, [%3 + 2*%4]
  131. movhps %2, [%3 + 3*%4]
  132. shufps %1, %2, 0x88
  133. %endmacro
  134. %macro LOADA64 2
  135. %if cpuflag(avx)
  136. movu %1, [%2]
  137. %else
  138. movlps %1, [%2]
  139. movhps %1, [%2 + 8]
  140. %endif
  141. %endmacro
  142. %macro DEFINE_IMDCT 0
  143. cglobal imdct36_float, 4,4,9, out, buf, in, win
  144. ; for(i=17;i>=1;i--) in[i] += in[i-1];
  145. LOADA64 m0, inq
  146. LOADA64 m1, inq + 16
  147. ROTLEFT m5, m0, m1
  148. PSHUFD m6, m0, 0x93
  149. andps m6, m6, [ps_mask]
  150. addps m0, m0, m6
  151. LOADA64 m2, inq + 32
  152. ROTLEFT m7, m1, m2
  153. addps m1, m1, m5
  154. LOADA64 m3, inq + 48
  155. ROTLEFT m5, m2, m3
  156. xorps m4, m4, m4
  157. movlps m4, [inq+64]
  158. BUILDINVHIGHLOW m6, m3, m4
  159. shufps m6, m6, m4, 0xa9
  160. addps m4, m4, m6
  161. addps m2, m2, m7
  162. addps m3, m3, m5
  163. ; for(i=17;i>=3;i-=2) in[i] += in[i-2];
  164. movlhps m5, m5, m0
  165. andps m5, m5, [ps_mask3]
  166. BUILDINVHIGHLOW m7, m0, m1
  167. andps m7, m7, [ps_mask2]
  168. addps m0, m0, m5
  169. BUILDINVHIGHLOW m6, m1, m2
  170. andps m6, m6, [ps_mask2]
  171. addps m1, m1, m7
  172. BUILDINVHIGHLOW m7, m2, m3
  173. andps m7, m7, [ps_mask2]
  174. addps m2, m2, m6
  175. movhlps m6, m6, m3
  176. andps m6, m6, [ps_mask4]
  177. addps m3, m3, m7
  178. addps m4, m4, m6
  179. ; Populate tmp[]
  180. movlhps m6, m1, m5 ; zero out high values
  181. subps m6, m6, m4
  182. subps m5, m0, m3
  183. %if ARCH_X86_64
  184. SWAP m5, m8
  185. %endif
  186. mulps m7, m2, [ps_val1]
  187. %if ARCH_X86_64
  188. mulps m5, m8, [ps_val2]
  189. %else
  190. mulps m5, m5, [ps_val2]
  191. %endif
  192. addps m7, m7, m5
  193. mulps m5, m6, [ps_val1]
  194. subps m7, m7, m5
  195. %if ARCH_X86_64
  196. SWAP m5, m8
  197. %else
  198. subps m5, m0, m3
  199. %endif
  200. subps m5, m5, m6
  201. addps m5, m5, m2
  202. shufps m6, m4, m3, 0xe4
  203. subps m6, m6, m2
  204. mulps m6, m6, [ps_val3]
  205. addps m4, m4, m1
  206. mulps m4, m4, [ps_val4]
  207. shufps m1, m1, m0, 0xe4
  208. addps m1, m1, m2
  209. mulps m1, m1, [ps_val5]
  210. mulps m3, m3, [ps_val6]
  211. mulps m0, m0, [ps_val7]
  212. addps m0, m0, m3
  213. xorps m2, m1, [ps_p1p1m1m1]
  214. subps m2, m2, m4
  215. addps m2, m2, m0
  216. addps m3, m4, m0
  217. subps m3, m3, m6
  218. xorps m3, m3, [ps_p1p1m1m1]
  219. shufps m0, m0, m4, 0xe4
  220. subps m0, m0, m1
  221. addps m0, m0, m6
  222. BUILDINVHIGHLOW m4, m2, m3
  223. shufps m3, m3, m2, 0x4e
  224. ; we have tmp = {SwAPLH(m0), SwAPLH(m7), m3, m4, m5}
  225. BUTTERF m0, m1, 0
  226. BUTTERF m7, m2, 16
  227. BUTTERF m3, m6, 32
  228. BUTTERF m4, m1, 48
  229. mulps m5, m5, [ps_cosh + 64]
  230. PSHUFD m1, m5, 0xe1
  231. xorps m5, m5, [ps_p1m1p1m1]
  232. addps m5, m5, m1
  233. ; permutates:
  234. ; m0 0 1 2 3 => 2 6 10 14 m1
  235. ; m7 4 5 6 7 => 3 7 11 15 m2
  236. ; m3 8 9 10 11 => 17 13 9 5 m3
  237. ; m4 12 13 14 15 => 16 12 8 4 m5
  238. ; m5 16 17 xx xx => 0 1 xx xx m0
  239. unpckhps m1, m0, m7
  240. unpckhps m6, m3, m4
  241. movhlps m2, m6, m1
  242. movlhps m1, m1, m6
  243. unpcklps m5, m5, m4
  244. unpcklps m3, m3, m7
  245. movhlps m4, m3, m5
  246. movlhps m5, m5, m3
  247. SWAP m4, m3
  248. ; permutation done
  249. PSHUFD m6, m2, 0xb1
  250. movss m4, [bufq + 4*68]
  251. movss m7, [bufq + 4*64]
  252. unpcklps m7, m7, m4
  253. mulps m6, m6, [winq + 16*4]
  254. addps m6, m6, m7
  255. movss [outq + 64*SBLIMIT], m6
  256. shufps m6, m6, m6, 0xb1
  257. movss [outq + 68*SBLIMIT], m6
  258. mulps m6, m3, [winq + 4*4]
  259. LOAD m4, m7, bufq + 4*16, 16
  260. addps m6, m6, m4
  261. STORE m6, m7, outq + 16*SBLIMIT, 4*SBLIMIT
  262. shufps m4, m0, m3, 0xb5
  263. mulps m4, m4, [winq + 8*4]
  264. LOAD m7, m6, bufq + 4*32, 16
  265. addps m4, m4, m7
  266. STORE m4, m6, outq + 32*SBLIMIT, 4*SBLIMIT
  267. shufps m3, m3, m2, 0xb1
  268. mulps m3, m3, [winq + 12*4]
  269. LOAD m7, m6, bufq + 4*48, 16
  270. addps m3, m3, m7
  271. STORE m3, m7, outq + 48*SBLIMIT, 4*SBLIMIT
  272. mulps m2, m2, [winq]
  273. LOAD m6, m7, bufq, 16
  274. addps m2, m2, m6
  275. STORE m2, m7, outq, 4*SBLIMIT
  276. mulps m4, m1, [winq + 20*4]
  277. STORE m4, m7, bufq, 16
  278. mulps m3, m5, [winq + 24*4]
  279. STORE m3, m7, bufq + 4*16, 16
  280. shufps m0, m0, m5, 0xb0
  281. mulps m0, m0, [winq + 28*4]
  282. STORE m0, m7, bufq + 4*32, 16
  283. shufps m5, m5, m1, 0xb1
  284. mulps m5, m5, [winq + 32*4]
  285. STORE m5, m7, bufq + 4*48, 16
  286. shufps m1, m1, m1, 0xb1
  287. mulps m1, m1, [winq + 36*4]
  288. movss [bufq + 4*64], m1
  289. shufps m1, m1, 0xb1
  290. movss [bufq + 4*68], m1
  291. RET
  292. %endmacro
  293. INIT_XMM sse
  294. DEFINE_IMDCT
  295. INIT_XMM sse2
  296. DEFINE_IMDCT
  297. INIT_XMM sse3
  298. DEFINE_IMDCT
  299. INIT_XMM ssse3
  300. DEFINE_IMDCT
  301. INIT_XMM avx
  302. DEFINE_IMDCT
  303. INIT_XMM sse
  304. %if ARCH_X86_64
  305. %define SPILL SWAP
  306. %define UNSPILL SWAP
  307. %define SPILLED(x) m %+ x
  308. %else
  309. %define SPILLED(x) [tmpq+(x-8)*16 + 32*4]
  310. %macro SPILL 2 ; xmm#, mempos
  311. movaps SPILLED(%2), m%1
  312. %endmacro
  313. %macro UNSPILL 2
  314. movaps m%1, SPILLED(%2)
  315. %endmacro
  316. %endif
  317. %macro DEFINE_FOUR_IMDCT 0
  318. cglobal four_imdct36_float, 5,5,16, out, buf, in, win, tmp
  319. movlps m0, [inq+64]
  320. movhps m0, [inq+64 + 72]
  321. movlps m3, [inq+64 + 2*72]
  322. movhps m3, [inq+64 + 3*72]
  323. shufps m5, m0, m3, 0xdd
  324. shufps m0, m0, m3, 0x88
  325. mova m1, [inq+48]
  326. movu m6, [inq+48 + 72]
  327. mova m7, [inq+48 + 2*72]
  328. movu m3, [inq+48 + 3*72]
  329. TRANSPOSE4x4PS 1, 6, 7, 3, 4
  330. addps m4, m6, m7
  331. mova [tmpq+4*28], m4
  332. addps m7, m3
  333. addps m6, m1
  334. addps m3, m0
  335. addps m0, m5
  336. addps m0, m7
  337. addps m7, m6
  338. mova [tmpq+4*12], m7
  339. SPILL 3, 12
  340. mova m4, [inq+32]
  341. movu m5, [inq+32 + 72]
  342. mova m2, [inq+32 + 2*72]
  343. movu m7, [inq+32 + 3*72]
  344. TRANSPOSE4x4PS 4, 5, 2, 7, 3
  345. addps m1, m7
  346. SPILL 1, 11
  347. addps m3, m5, m2
  348. SPILL 3, 13
  349. addps m7, m2
  350. addps m5, m4
  351. addps m6, m7
  352. mova [tmpq], m6
  353. addps m7, m5
  354. mova [tmpq+4*16], m7
  355. mova m2, [inq+16]
  356. movu m7, [inq+16 + 72]
  357. mova m1, [inq+16 + 2*72]
  358. movu m6, [inq+16 + 3*72]
  359. TRANSPOSE4x4PS 2, 7, 1, 6, 3
  360. addps m4, m6
  361. addps m6, m1
  362. addps m1, m7
  363. addps m7, m2
  364. addps m5, m6
  365. SPILL 5, 15
  366. addps m6, m7
  367. mulps m6, [costabs + 16*2]
  368. mova [tmpq+4*8], m6
  369. SPILL 1, 10
  370. SPILL 0, 14
  371. mova m1, [inq]
  372. movu m6, [inq + 72]
  373. mova m3, [inq + 2*72]
  374. movu m5, [inq + 3*72]
  375. TRANSPOSE4x4PS 1, 6, 3, 5, 0
  376. addps m2, m5
  377. addps m5, m3
  378. addps m7, m5
  379. addps m3, m6
  380. addps m6, m1
  381. SPILL 7, 8
  382. addps m5, m6
  383. SPILL 6, 9
  384. addps m6, m4, SPILLED(12)
  385. subps m6, m2
  386. UNSPILL 7, 11
  387. SPILL 5, 11
  388. subps m5, m1, m7
  389. mulps m7, [costabs + 16*5]
  390. addps m7, m1
  391. mulps m0, m6, [costabs + 16*6]
  392. addps m0, m5
  393. mova [tmpq+4*24], m0
  394. addps m6, m5
  395. mova [tmpq+4*4], m6
  396. addps m6, m4, m2
  397. mulps m6, [costabs + 16*1]
  398. subps m4, SPILLED(12)
  399. mulps m4, [costabs + 16*8]
  400. addps m2, SPILLED(12)
  401. mulps m2, [costabs + 16*3]
  402. subps m5, m7, m6
  403. subps m5, m2
  404. addps m6, m7
  405. addps m6, m4
  406. addps m7, m2
  407. subps m7, m4
  408. mova [tmpq+4*20], m7
  409. mova m2, [tmpq+4*28]
  410. mova [tmpq+4*28], m5
  411. UNSPILL 7, 13
  412. subps m5, m7, m2
  413. mulps m5, [costabs + 16*7]
  414. UNSPILL 1, 10
  415. mulps m1, [costabs + 16*2]
  416. addps m4, m3, m2
  417. mulps m4, [costabs + 16*4]
  418. addps m2, m7
  419. addps m7, m3
  420. mulps m7, [costabs]
  421. subps m3, m2
  422. mulps m3, [costabs + 16*2]
  423. addps m2, m7, m5
  424. addps m2, m1
  425. SPILL 2, 10
  426. addps m7, m4
  427. subps m7, m1
  428. SPILL 7, 12
  429. subps m5, m4
  430. subps m5, m1
  431. UNSPILL 0, 14
  432. SPILL 5, 13
  433. addps m1, m0, SPILLED(15)
  434. subps m1, SPILLED(8)
  435. mova m4, [costabs + 16*5]
  436. mulps m4, [tmpq]
  437. UNSPILL 2, 9
  438. addps m4, m2
  439. subps m2, [tmpq]
  440. mulps m5, m1, [costabs + 16*6]
  441. addps m5, m2
  442. SPILL 5, 9
  443. addps m2, m1
  444. SPILL 2, 14
  445. UNSPILL 5, 15
  446. subps m7, m5, m0
  447. addps m5, SPILLED(8)
  448. mulps m5, [costabs + 16*1]
  449. mulps m7, [costabs + 16*8]
  450. addps m0, SPILLED(8)
  451. mulps m0, [costabs + 16*3]
  452. subps m2, m4, m5
  453. subps m2, m0
  454. SPILL 2, 15
  455. addps m5, m4
  456. addps m5, m7
  457. addps m4, m0
  458. subps m4, m7
  459. SPILL 4, 8
  460. mova m7, [tmpq+4*16]
  461. mova m2, [tmpq+4*12]
  462. addps m0, m7, m2
  463. subps m0, SPILLED(11)
  464. mulps m0, [costabs + 16*2]
  465. addps m4, m7, SPILLED(11)
  466. mulps m4, [costabs]
  467. subps m7, m2
  468. mulps m7, [costabs + 16*7]
  469. addps m2, SPILLED(11)
  470. mulps m2, [costabs + 16*4]
  471. addps m1, m7, [tmpq+4*8]
  472. addps m1, m4
  473. addps m4, m2
  474. subps m4, [tmpq+4*8]
  475. SPILL 4, 11
  476. subps m7, m2
  477. subps m7, [tmpq+4*8]
  478. addps m4, m6, SPILLED(10)
  479. subps m6, SPILLED(10)
  480. addps m2, m5, m1
  481. mulps m2, [costabs + 16*9]
  482. subps m5, m1
  483. mulps m5, [costabs + 16*17]
  484. subps m1, m4, m2
  485. addps m4, m2
  486. mulps m2, m1, [winq+4*36]
  487. addps m2, [bufq+4*36]
  488. mova [outq+1152], m2
  489. mulps m1, [winq+4*32]
  490. addps m1, [bufq+4*32]
  491. mova [outq+1024], m1
  492. mulps m1, m4, [winq+4*116]
  493. mova [bufq+4*36], m1
  494. mulps m4, [winq+4*112]
  495. mova [bufq+4*32], m4
  496. addps m2, m6, m5
  497. subps m6, m5
  498. mulps m1, m6, [winq+4*68]
  499. addps m1, [bufq+4*68]
  500. mova [outq+2176], m1
  501. mulps m6, [winq]
  502. addps m6, [bufq]
  503. mova [outq], m6
  504. mulps m1, m2, [winq+4*148]
  505. mova [bufq+4*68], m1
  506. mulps m2, [winq+4*80]
  507. mova [bufq], m2
  508. addps m5, m3, [tmpq+4*24]
  509. mova m2, [tmpq+4*24]
  510. subps m2, m3
  511. mova m1, SPILLED(9)
  512. subps m1, m0
  513. mulps m1, [costabs + 16*10]
  514. addps m0, SPILLED(9)
  515. mulps m0, [costabs + 16*16]
  516. addps m6, m5, m1
  517. subps m5, m1
  518. mulps m3, m5, [winq+4*40]
  519. addps m3, [bufq+4*40]
  520. mova [outq+1280], m3
  521. mulps m5, [winq+4*28]
  522. addps m5, [bufq+4*28]
  523. mova [outq+896], m5
  524. mulps m1, m6, [winq+4*120]
  525. mova [bufq+4*40], m1
  526. mulps m6, [winq+4*108]
  527. mova [bufq+4*28], m6
  528. addps m1, m2, m0
  529. subps m2, m0
  530. mulps m5, m2, [winq+4*64]
  531. addps m5, [bufq+4*64]
  532. mova [outq+2048], m5
  533. mulps m2, [winq+4*4]
  534. addps m2, [bufq+4*4]
  535. mova [outq+128], m2
  536. mulps m0, m1, [winq+4*144]
  537. mova [bufq+4*64], m0
  538. mulps m1, [winq+4*84]
  539. mova [bufq+4*4], m1
  540. mova m1, [tmpq+4*28]
  541. mova m5, m1
  542. addps m1, SPILLED(13)
  543. subps m5, SPILLED(13)
  544. UNSPILL 3, 15
  545. addps m2, m7, m3
  546. mulps m2, [costabs + 16*11]
  547. subps m3, m7
  548. mulps m3, [costabs + 16*15]
  549. addps m0, m2, m1
  550. subps m1, m2
  551. SWAP m0, m2
  552. mulps m6, m1, [winq+4*44]
  553. addps m6, [bufq+4*44]
  554. mova [outq+1408], m6
  555. mulps m1, [winq+4*24]
  556. addps m1, [bufq+4*24]
  557. mova [outq+768], m1
  558. mulps m0, m2, [winq+4*124]
  559. mova [bufq+4*44], m0
  560. mulps m2, [winq+4*104]
  561. mova [bufq+4*24], m2
  562. addps m0, m5, m3
  563. subps m5, m3
  564. mulps m1, m5, [winq+4*60]
  565. addps m1, [bufq+4*60]
  566. mova [outq+1920], m1
  567. mulps m5, [winq+4*8]
  568. addps m5, [bufq+4*8]
  569. mova [outq+256], m5
  570. mulps m1, m0, [winq+4*140]
  571. mova [bufq+4*60], m1
  572. mulps m0, [winq+4*88]
  573. mova [bufq+4*8], m0
  574. mova m1, [tmpq+4*20]
  575. addps m1, SPILLED(12)
  576. mova m2, [tmpq+4*20]
  577. subps m2, SPILLED(12)
  578. UNSPILL 7, 8
  579. subps m0, m7, SPILLED(11)
  580. addps m7, SPILLED(11)
  581. mulps m4, m7, [costabs + 16*12]
  582. mulps m0, [costabs + 16*14]
  583. addps m5, m1, m4
  584. subps m1, m4
  585. mulps m7, m1, [winq+4*48]
  586. addps m7, [bufq+4*48]
  587. mova [outq+1536], m7
  588. mulps m1, [winq+4*20]
  589. addps m1, [bufq+4*20]
  590. mova [outq+640], m1
  591. mulps m1, m5, [winq+4*128]
  592. mova [bufq+4*48], m1
  593. mulps m5, [winq+4*100]
  594. mova [bufq+4*20], m5
  595. addps m6, m2, m0
  596. subps m2, m0
  597. mulps m1, m2, [winq+4*56]
  598. addps m1, [bufq+4*56]
  599. mova [outq+1792], m1
  600. mulps m2, [winq+4*12]
  601. addps m2, [bufq+4*12]
  602. mova [outq+384], m2
  603. mulps m0, m6, [winq+4*136]
  604. mova [bufq+4*56], m0
  605. mulps m6, [winq+4*92]
  606. mova [bufq+4*12], m6
  607. UNSPILL 0, 14
  608. mulps m0, [costabs + 16*13]
  609. mova m3, [tmpq+4*4]
  610. addps m2, m0, m3
  611. subps m3, m0
  612. mulps m0, m3, [winq+4*52]
  613. addps m0, [bufq+4*52]
  614. mova [outq+1664], m0
  615. mulps m3, [winq+4*16]
  616. addps m3, [bufq+4*16]
  617. mova [outq+512], m3
  618. mulps m0, m2, [winq+4*132]
  619. mova [bufq+4*52], m0
  620. mulps m2, [winq+4*96]
  621. mova [bufq+4*16], m2
  622. RET
  623. %endmacro
  624. INIT_XMM sse
  625. DEFINE_FOUR_IMDCT
  626. INIT_XMM avx
  627. DEFINE_FOUR_IMDCT