]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/imdct36.asm
Merge commit '218aefce4472dc02ee3f12830a9a894bf7916da9'
[ffmpeg] / 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 STORE 4
133     movhlps %2, %1
134     movss   [%3       ], %1
135     movss   [%3 + 2*%4], %2
136     shufps  %1, %1, 0xb1
137     movss   [%3 +   %4], %1
138     movhlps %2, %1
139     movss   [%3 + 3*%4], %2
140 %endmacro
141
142 %macro LOAD 4
143     movlps  %1, [%3       ]
144     movhps  %1, [%3 +   %4]
145     movlps  %2, [%3 + 2*%4]
146     movhps  %2, [%3 + 3*%4]
147     shufps  %1, %2, 0x88
148 %endmacro
149
150 %macro LOADA64 2
151 %if cpuflag(avx)
152    movu     %1, [%2]
153 %else
154    movlps   %1, [%2]
155    movhps   %1, [%2 + 8]
156 %endif
157 %endmacro
158
159 %macro DEFINE_IMDCT 0
160 cglobal imdct36_float, 4,4,9, out, buf, in, win
161
162     ; for(i=17;i>=1;i--) in[i] += in[i-1];
163     LOADA64 m0, inq
164     LOADA64 m1, inq + 16
165
166     ROTLEFT m5, m0, m1
167
168     PSHUFD  m6, m0, 0x93
169     andps   m6, m6, [ps_mask]
170     addps   m0, m0, m6
171
172     LOADA64 m2, inq + 32
173
174     ROTLEFT m7, m1, m2
175
176     addps   m1, m1, m5
177     LOADA64 m3, inq + 48
178
179     ROTLEFT m5, m2, m3
180
181     xorps   m4, m4, m4
182     movlps  m4, [inq+64]
183     BUILDINVHIGHLOW m6, m3, m4
184     shufps  m6, m6, m4, 0xa9
185
186     addps   m4, m4, m6
187     addps   m2, m2, m7
188     addps   m3, m3, m5
189
190     ; for(i=17;i>=3;i-=2) in[i] += in[i-2];
191     movlhps m5, m5, m0
192     andps   m5, m5, [ps_mask3]
193
194     BUILDINVHIGHLOW m7, m0, m1
195     andps   m7, m7, [ps_mask2]
196
197     addps   m0, m0, m5
198
199     BUILDINVHIGHLOW m6, m1, m2
200     andps   m6, m6, [ps_mask2]
201
202     addps  m1, m1, m7
203
204     BUILDINVHIGHLOW m7, m2, m3
205     andps   m7, m7, [ps_mask2]
206
207     addps   m2, m2, m6
208
209     movhlps m6, m6, m3
210     andps   m6, m6, [ps_mask4]
211
212     addps  m3, m3, m7
213     addps  m4, m4, m6
214
215     ; Populate tmp[]
216     movlhps m6, m1, m5    ; zero out high values
217     subps   m6, m6, m4
218
219     subps  m5, m0, m3
220
221 %if ARCH_X86_64
222     SWAP   m5, m8
223 %endif
224
225     mulps  m7, m2, [ps_val1]
226
227 %if ARCH_X86_64
228     mulps  m5, m8, [ps_val2]
229 %else
230     mulps  m5, m5, [ps_val2]
231 %endif
232     addps  m7, m7, m5
233
234     mulps  m5, m6, [ps_val1]
235     subps  m7, m7, m5
236
237 %if ARCH_X86_64
238     SWAP   m5, m8
239 %else
240     subps  m5, m0, m3
241 %endif
242
243     subps  m5, m5, m6
244     addps  m5, m5, m2
245
246     shufps m6, m4, m3, 0xe4
247     subps  m6, m6, m2
248     mulps  m6, m6, [ps_val3]
249
250     addps  m4, m4, m1
251     mulps  m4, m4, [ps_val4]
252
253     shufps m1, m1, m0, 0xe4
254     addps  m1, m1, m2
255     mulps  m1, m1, [ps_val5]
256
257     mulps  m3, m3, [ps_val6]
258     mulps  m0, m0, [ps_val7]
259     addps  m0, m0, m3
260
261     xorps  m2, m1, [ps_p1p1m1m1]
262     subps  m2, m2, m4
263     addps  m2, m2, m0
264
265     addps  m3, m4, m0
266     subps  m3, m3, m6
267     xorps  m3, m3, [ps_p1p1m1m1]
268
269     shufps m0, m0, m4, 0xe4
270     subps  m0, m0, m1
271     addps  m0, m0, m6
272
273     BUILDINVHIGHLOW m4, m2, m3
274     shufps  m3, m3, m2, 0x4e
275
276     ; we have tmp = {SwAPLH(m0), SwAPLH(m7), m3, m4, m5}
277
278     BUTTERF  m0, m1, 0
279     BUTTERF  m7, m2, 16
280     BUTTERF  m3, m6, 32
281     BUTTERF  m4, m1, 48
282
283     mulps   m5, m5, [ps_cosh + 64]
284     PSHUFD  m1, m5, 0xe1
285     xorps   m5, m5, [ps_p1m1p1m1]
286     addps   m5, m5, m1
287
288     ; permutates:
289     ; m0    0  1  2  3     =>     2  6 10 14   m1
290     ; m7    4  5  6  7     =>     3  7 11 15   m2
291     ; m3    8  9 10 11     =>    17 13  9  5   m3
292     ; m4   12 13 14 15     =>    16 12  8  4   m5
293     ; m5   16 17 xx xx     =>     0  1 xx xx   m0
294
295     unpckhps m1, m0, m7
296     unpckhps m6, m3, m4
297     movhlps  m2, m6, m1
298     movlhps  m1, m1, m6
299
300     unpcklps m5, m5, m4
301     unpcklps m3, m3, m7
302     movhlps  m4, m3, m5
303     movlhps  m5, m5, m3
304     SWAP m4, m3
305     ; permutation done
306
307     PSHUFD  m6, m2, 0xb1
308     movss   m4, [bufq + 4*68]
309     movss   m7, [bufq + 4*64]
310     unpcklps  m7, m7, m4
311     mulps   m6, m6, [winq + 16*4]
312     addps   m6, m6, m7
313     movss   [outq + 64*SBLIMIT], m6
314     shufps  m6, m6, m6, 0xb1
315     movss   [outq + 68*SBLIMIT], m6
316
317     mulps   m6, m3, [winq + 4*4]
318     LOAD    m4, m7, bufq + 4*16, 16
319     addps   m6, m6, m4
320     STORE   m6, m7, outq + 16*SBLIMIT, 4*SBLIMIT
321
322     shufps  m4, m0, m3, 0xb5
323     mulps   m4, m4, [winq + 8*4]
324     LOAD    m7, m6, bufq + 4*32, 16
325     addps   m4, m4, m7
326     STORE   m4, m6, outq + 32*SBLIMIT, 4*SBLIMIT
327
328     shufps  m3, m3, m2, 0xb1
329     mulps   m3, m3, [winq + 12*4]
330     LOAD    m7, m6, bufq + 4*48, 16
331     addps   m3, m3, m7
332     STORE   m3, m7, outq + 48*SBLIMIT, 4*SBLIMIT
333
334     mulps   m2, m2, [winq]
335     LOAD    m6, m7, bufq, 16
336     addps   m2, m2, m6
337     STORE   m2, m7, outq, 4*SBLIMIT
338
339     mulps    m4, m1, [winq + 20*4]
340     STORE    m4, m7, bufq, 16
341
342     mulps    m3, m5, [winq + 24*4]
343     STORE    m3, m7, bufq + 4*16, 16
344
345     shufps   m0, m0, m5, 0xb0
346     mulps    m0, m0, [winq + 28*4]
347     STORE    m0, m7, bufq + 4*32, 16
348
349     shufps   m5, m5, m1, 0xb1
350     mulps    m5, m5, [winq + 32*4]
351     STORE    m5, m7, bufq + 4*48, 16
352
353     shufps   m1, m1, m1, 0xb1
354     mulps    m1, m1, [winq + 36*4]
355     movss    [bufq + 4*64], m1
356     shufps   m1, m1, 0xb1
357     movss    [bufq + 4*68], m1
358     RET
359 %endmacro
360
361 INIT_XMM sse
362 DEFINE_IMDCT
363
364 INIT_XMM sse2
365 DEFINE_IMDCT
366
367 INIT_XMM sse3
368 DEFINE_IMDCT
369
370 INIT_XMM ssse3
371 DEFINE_IMDCT
372
373 %if HAVE_AVX_EXTERNAL
374 INIT_XMM avx
375 DEFINE_IMDCT
376 %endif
377
378 INIT_XMM sse
379
380 %if ARCH_X86_64
381 %define SPILL SWAP
382 %define UNSPILL SWAP
383 %define SPILLED(x) m %+ x
384 %else
385 %define SPILLED(x) [tmpq+(x-8)*16 + 32*4]
386 %macro SPILL 2 ; xmm#, mempos
387     movaps SPILLED(%2), m%1
388 %endmacro
389 %macro UNSPILL 2
390     movaps m%1, SPILLED(%2)
391 %endmacro
392 %endif
393
394 %macro DEFINE_FOUR_IMDCT 0
395 cglobal four_imdct36_float, 5,5,16, out, buf, in, win, tmp
396     movlps  m0, [inq+64]
397     movhps  m0, [inq+64 +   72]
398     movlps  m3, [inq+64 + 2*72]
399     movhps  m3, [inq+64 + 3*72]
400
401     shufps  m5, m0, m3, 0xdd
402     shufps  m0, m0, m3, 0x88
403
404     mova     m1, [inq+48]
405     movu     m6, [inq+48 +   72]
406     mova     m7, [inq+48 + 2*72]
407     movu     m3, [inq+48 + 3*72]
408
409     TRANSPOSE4x4PS 1, 6, 7, 3, 4
410
411     addps   m4, m6, m7
412     mova    [tmpq+4*28], m4
413
414     addps    m7, m3
415     addps    m6, m1
416     addps    m3, m0
417     addps    m0, m5
418     addps    m0, m7
419     addps    m7, m6
420     mova    [tmpq+4*12], m7
421     SPILL   3, 12
422
423     mova     m4, [inq+32]
424     movu     m5, [inq+32 +   72]
425     mova     m2, [inq+32 + 2*72]
426     movu     m7, [inq+32 + 3*72]
427
428     TRANSPOSE4x4PS 4, 5, 2, 7, 3
429
430     addps   m1, m7
431     SPILL   1, 11
432
433     addps   m3, m5, m2
434     SPILL   3, 13
435
436     addps    m7, m2
437     addps    m5, m4
438     addps    m6, m7
439     mova    [tmpq], m6
440     addps   m7, m5
441     mova    [tmpq+4*16], m7
442
443     mova    m2, [inq+16]
444     movu    m7, [inq+16 +   72]
445     mova    m1, [inq+16 + 2*72]
446     movu    m6, [inq+16 + 3*72]
447
448     TRANSPOSE4x4PS 2, 7, 1, 6, 3
449
450     addps   m4, m6
451     addps   m6, m1
452     addps   m1, m7
453     addps   m7, m2
454     addps   m5, m6
455     SPILL   5, 15
456     addps   m6, m7
457     mulps   m6, [costabs + 16*2]
458     mova    [tmpq+4*8], m6
459     SPILL   1, 10
460     SPILL   0, 14
461
462     mova    m1, [inq]
463     movu    m6, [inq +   72]
464     mova    m3, [inq + 2*72]
465     movu    m5, [inq + 3*72]
466
467     TRANSPOSE4x4PS 1, 6, 3, 5, 0
468
469     addps    m2, m5
470     addps    m5, m3
471     addps    m7, m5
472     addps    m3, m6
473     addps    m6, m1
474     SPILL    7, 8
475     addps    m5, m6
476     SPILL    6, 9
477     addps    m6, m4, SPILLED(12)
478     subps    m6, m2
479     UNSPILL  7, 11
480     SPILL    5, 11
481     subps    m5, m1, m7
482     mulps    m7, [costabs + 16*5]
483     addps    m7, m1
484     mulps    m0, m6, [costabs + 16*6]
485     addps    m0, m5
486     mova     [tmpq+4*24], m0
487     addps    m6, m5
488     mova     [tmpq+4*4], m6
489     addps    m6, m4, m2
490     mulps    m6, [costabs + 16*1]
491     subps    m4, SPILLED(12)
492     mulps    m4, [costabs + 16*8]
493     addps    m2, SPILLED(12)
494     mulps    m2, [costabs + 16*3]
495     subps    m5, m7, m6
496     subps    m5, m2
497     addps    m6, m7
498     addps    m6, m4
499     addps    m7, m2
500     subps    m7, m4
501     mova     [tmpq+4*20], m7
502     mova     m2, [tmpq+4*28]
503     mova     [tmpq+4*28], m5
504     UNSPILL  7, 13
505     subps    m5, m7, m2
506     mulps    m5, [costabs + 16*7]
507     UNSPILL  1, 10
508     mulps    m1, [costabs + 16*2]
509     addps    m4, m3, m2
510     mulps    m4, [costabs + 16*4]
511     addps    m2, m7
512     addps    m7, m3
513     mulps    m7, [costabs]
514     subps    m3, m2
515     mulps    m3, [costabs + 16*2]
516     addps    m2, m7, m5
517     addps    m2, m1
518     SPILL    2, 10
519     addps    m7, m4
520     subps    m7, m1
521     SPILL    7, 12
522     subps    m5, m4
523     subps    m5, m1
524     UNSPILL  0, 14
525     SPILL    5, 13
526     addps    m1, m0, SPILLED(15)
527     subps    m1, SPILLED(8)
528     mova     m4, [costabs + 16*5]
529     mulps    m4, [tmpq]
530     UNSPILL  2, 9
531     addps    m4, m2
532     subps    m2, [tmpq]
533     mulps    m5, m1, [costabs + 16*6]
534     addps    m5, m2
535     SPILL    5, 9
536     addps    m2, m1
537     SPILL    2, 14
538     UNSPILL  5, 15
539     subps    m7, m5, m0
540     addps    m5, SPILLED(8)
541     mulps    m5, [costabs + 16*1]
542     mulps    m7, [costabs + 16*8]
543     addps    m0, SPILLED(8)
544     mulps    m0, [costabs + 16*3]
545     subps    m2, m4, m5
546     subps    m2, m0
547     SPILL    2, 15
548     addps    m5, m4
549     addps    m5, m7
550     addps    m4, m0
551     subps    m4, m7
552     SPILL    4, 8
553     mova     m7, [tmpq+4*16]
554     mova     m2, [tmpq+4*12]
555     addps    m0, m7, m2
556     subps    m0, SPILLED(11)
557     mulps    m0, [costabs + 16*2]
558     addps    m4, m7, SPILLED(11)
559     mulps    m4, [costabs]
560     subps    m7, m2
561     mulps    m7, [costabs + 16*7]
562     addps    m2, SPILLED(11)
563     mulps    m2, [costabs + 16*4]
564     addps    m1, m7, [tmpq+4*8]
565     addps    m1, m4
566     addps    m4, m2
567     subps    m4, [tmpq+4*8]
568     SPILL    4, 11
569     subps    m7, m2
570     subps    m7, [tmpq+4*8]
571     addps    m4, m6, SPILLED(10)
572     subps    m6, SPILLED(10)
573     addps    m2, m5, m1
574     mulps    m2, [costabs + 16*9]
575     subps    m5, m1
576     mulps    m5, [costabs + 16*17]
577     subps    m1, m4, m2
578     addps    m4, m2
579     mulps    m2, m1, [winq+4*36]
580     addps    m2, [bufq+4*36]
581     mova     [outq+1152], m2
582     mulps    m1, [winq+4*32]
583     addps    m1, [bufq+4*32]
584     mova     [outq+1024], m1
585     mulps    m1, m4, [winq+4*116]
586     mova     [bufq+4*36], m1
587     mulps    m4, [winq+4*112]
588     mova     [bufq+4*32], m4
589     addps    m2, m6, m5
590     subps    m6, m5
591     mulps    m1, m6, [winq+4*68]
592     addps    m1, [bufq+4*68]
593     mova     [outq+2176], m1
594     mulps    m6, [winq]
595     addps    m6, [bufq]
596     mova     [outq], m6
597     mulps    m1, m2, [winq+4*148]
598     mova     [bufq+4*68], m1
599     mulps    m2, [winq+4*80]
600     mova     [bufq], m2
601     addps    m5, m3, [tmpq+4*24]
602     mova     m2, [tmpq+4*24]
603     subps    m2, m3
604     mova     m1, SPILLED(9)
605     subps    m1, m0
606     mulps    m1, [costabs + 16*10]
607     addps    m0, SPILLED(9)
608     mulps    m0, [costabs + 16*16]
609     addps    m6, m5, m1
610     subps    m5, m1
611     mulps    m3, m5, [winq+4*40]
612     addps    m3, [bufq+4*40]
613     mova     [outq+1280], m3
614     mulps    m5, [winq+4*28]
615     addps    m5, [bufq+4*28]
616     mova     [outq+896], m5
617     mulps    m1, m6, [winq+4*120]
618     mova     [bufq+4*40], m1
619     mulps    m6, [winq+4*108]
620     mova     [bufq+4*28], m6
621     addps    m1, m2, m0
622     subps    m2, m0
623     mulps    m5, m2, [winq+4*64]
624     addps    m5, [bufq+4*64]
625     mova     [outq+2048], m5
626     mulps    m2, [winq+4*4]
627     addps    m2, [bufq+4*4]
628     mova     [outq+128], m2
629     mulps    m0, m1, [winq+4*144]
630     mova     [bufq+4*64], m0
631     mulps    m1, [winq+4*84]
632     mova     [bufq+4*4], m1
633     mova     m1, [tmpq+4*28]
634     mova     m5, m1
635     addps    m1, SPILLED(13)
636     subps    m5, SPILLED(13)
637     UNSPILL  3, 15
638     addps    m2, m7, m3
639     mulps    m2, [costabs + 16*11]
640     subps    m3, m7
641     mulps    m3, [costabs + 16*15]
642     addps    m0, m2, m1
643     subps    m1, m2
644     SWAP     m0, m2
645     mulps    m6, m1, [winq+4*44]
646     addps    m6, [bufq+4*44]
647     mova     [outq+1408], m6
648     mulps    m1, [winq+4*24]
649     addps    m1, [bufq+4*24]
650     mova     [outq+768], m1
651     mulps    m0, m2, [winq+4*124]
652     mova     [bufq+4*44], m0
653     mulps    m2, [winq+4*104]
654     mova     [bufq+4*24], m2
655     addps    m0, m5, m3
656     subps    m5, m3
657     mulps    m1, m5, [winq+4*60]
658     addps    m1, [bufq+4*60]
659     mova     [outq+1920], m1
660     mulps    m5, [winq+4*8]
661     addps    m5, [bufq+4*8]
662     mova     [outq+256], m5
663     mulps    m1, m0, [winq+4*140]
664     mova     [bufq+4*60], m1
665     mulps    m0, [winq+4*88]
666     mova     [bufq+4*8], m0
667     mova     m1, [tmpq+4*20]
668     addps    m1, SPILLED(12)
669     mova     m2, [tmpq+4*20]
670     subps    m2, SPILLED(12)
671     UNSPILL  7, 8
672     subps    m0, m7, SPILLED(11)
673     addps    m7, SPILLED(11)
674     mulps    m4, m7, [costabs + 16*12]
675     mulps    m0, [costabs + 16*14]
676     addps    m5, m1, m4
677     subps    m1, m4
678     mulps    m7, m1, [winq+4*48]
679     addps    m7, [bufq+4*48]
680     mova     [outq+1536], m7
681     mulps    m1, [winq+4*20]
682     addps    m1, [bufq+4*20]
683     mova     [outq+640], m1
684     mulps    m1, m5, [winq+4*128]
685     mova     [bufq+4*48], m1
686     mulps    m5, [winq+4*100]
687     mova     [bufq+4*20], m5
688     addps    m6, m2, m0
689     subps    m2, m0
690     mulps    m1, m2, [winq+4*56]
691     addps    m1, [bufq+4*56]
692     mova     [outq+1792], m1
693     mulps    m2, [winq+4*12]
694     addps    m2, [bufq+4*12]
695     mova     [outq+384], m2
696     mulps    m0, m6, [winq+4*136]
697     mova    [bufq+4*56], m0
698     mulps    m6, [winq+4*92]
699     mova     [bufq+4*12], m6
700     UNSPILL  0, 14
701     mulps    m0, [costabs + 16*13]
702     mova     m3, [tmpq+4*4]
703     addps    m2, m0, m3
704     subps    m3, m0
705     mulps    m0, m3, [winq+4*52]
706     addps    m0, [bufq+4*52]
707     mova     [outq+1664], m0
708     mulps    m3, [winq+4*16]
709     addps    m3, [bufq+4*16]
710     mova     [outq+512], m3
711     mulps    m0, m2, [winq+4*132]
712     mova     [bufq+4*52], m0
713     mulps    m2, [winq+4*96]
714     mova     [bufq+4*16], m2
715     RET
716 %endmacro
717
718 INIT_XMM sse
719 DEFINE_FOUR_IMDCT
720
721 %if HAVE_AVX_EXTERNAL
722 INIT_XMM avx
723 DEFINE_FOUR_IMDCT
724 %endif