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