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