x86 asm: Add SECTION_TEXT to dct32_sse.asm.
[ffmpeg.git] / libavcodec / x86 / dct32_sse.asm
1 ;******************************************************************************
2 ;* 32 point SSE-optimized DCT transform
3 ;* Copyright (c) 2010 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 "x86inc.asm"
23 %include "x86util.asm"
24
25 SECTION_RODATA 32
26
27 align 32
28 ps_cos_vec: dd   0.500603,  0.505471,  0.515447,  0.531043
29             dd   0.553104,  0.582935,  0.622504,  0.674808
30             dd -10.190008, -3.407609, -2.057781, -1.484165
31             dd  -1.169440, -0.972568, -0.839350, -0.744536
32             dd   0.502419,  0.522499,  0.566944,  0.646822
33             dd   0.788155,  1.060678,  1.722447,  5.101149
34             dd   0.509796,  0.601345,  0.899976,  2.562916
35             dd   0.509796,  0.601345,  0.899976,  2.562916
36             dd   1.000000,  1.000000,  1.306563,  0.541196
37             dd   1.000000,  1.000000,  1.306563,  0.541196
38             dd   1.000000,  0.707107,  1.000000, -0.707107
39             dd   1.000000,  0.707107,  1.000000, -0.707107
40             dd   0.707107,  0.707107,  0.707107,  0.707107
41
42 align 32
43 ps_p1p1m1m1: dd 0, 0, 0x80000000, 0x80000000, 0, 0, 0x80000000, 0x80000000
44
45 %macro BUTTERFLY_SSE 4
46     movaps %4, %1
47     subps  %1, %2
48     addps  %2, %4
49     mulps  %1, %3
50 %endmacro
51
52 %macro BUTTERFLY_AVX 4
53     vsubps  %4, %1, %2
54     vaddps  %2, %2, %1
55     vmulps  %1, %4, %3
56 %endmacro
57
58 %macro BUTTERFLY0_SSE 5
59     movaps %4, %1
60     shufps %1, %1, %5
61     xorps  %4, %2
62     addps  %1, %4
63     mulps  %1, %3
64 %endmacro
65
66 %macro BUTTERFLY0_AVX 5
67     vshufps %4, %1, %1, %5
68     vxorps  %1, %1, %2
69     vaddps  %4, %4, %1
70     vmulps  %1, %4, %3
71 %endmacro
72
73 %macro BUTTERFLY2 4
74     BUTTERFLY0 %1, %2, %3, %4, 0x1b
75 %endmacro
76
77 %macro BUTTERFLY3 4
78     BUTTERFLY0 %1, %2, %3, %4, 0xb1
79 %endmacro
80
81 %macro BUTTERFLY3V 5
82     movaps m%5, m%1
83     addps  m%1, m%2
84     subps  m%5, m%2
85     SWAP %2, %5
86     mulps  m%2, [ps_cos_vec+192]
87     movaps m%5, m%3
88     addps  m%3, m%4
89     subps  m%4, m%5
90     mulps  m%4, [ps_cos_vec+192]
91 %endmacro
92
93 %macro PASS6_AND_PERMUTE 0
94     mov         tmpd, [outq+4]
95     movss         m7, [outq+72]
96     addss         m7, [outq+76]
97     movss         m3, [outq+56]
98     addss         m3, [outq+60]
99     addss         m4, m3
100     movss         m2, [outq+52]
101     addss         m2, m3
102     movss         m3, [outq+104]
103     addss         m3, [outq+108]
104     addss         m1, m3
105     addss         m5, m4
106     movss [outq+ 16], m1
107     movss         m1, [outq+100]
108     addss         m1, m3
109     movss         m3, [outq+40]
110     movss [outq+ 48], m1
111     addss         m3, [outq+44]
112     movss         m1, [outq+100]
113     addss         m4, m3
114     addss         m3, m2
115     addss         m1, [outq+108]
116     movss [outq+ 40], m3
117     addss         m2, [outq+36]
118     movss         m3, [outq+8]
119     movss [outq+ 56], m2
120     addss         m3, [outq+12]
121     movss [outq+ 32], m3
122     movss         m3, [outq+80]
123     movss [outq+  8], m5
124     movss [outq+ 80], m1
125     movss         m2, [outq+52]
126     movss         m5, [outq+120]
127     addss         m5, [outq+124]
128     movss         m1, [outq+64]
129     addss         m2, [outq+60]
130     addss         m0, m5
131     addss         m5, [outq+116]
132     mov    [outq+64], tmpd
133     addss         m6, m0
134     addss         m1, m6
135     mov         tmpd, [outq+12]
136     mov   [outq+ 96], tmpd
137     movss [outq+  4], m1
138     movss         m1, [outq+24]
139     movss [outq+ 24], m4
140     movss         m4, [outq+88]
141     addss         m4, [outq+92]
142     addss         m3, m4
143     addss         m4, [outq+84]
144     mov         tmpd, [outq+108]
145     addss         m1, [outq+28]
146     addss         m0, m1
147     addss         m1, m5
148     addss         m6, m3
149     addss         m3, m0
150     addss         m0, m7
151     addss         m5, [outq+20]
152     addss         m7, m1
153     movss [outq+ 12], m6
154     mov   [outq+112], tmpd
155     movss         m6, [outq+28]
156     movss [outq+ 28], m0
157     movss         m0, [outq+36]
158     movss [outq+ 36], m7
159     addss         m1, m4
160     movss         m7, [outq+116]
161     addss         m0, m2
162     addss         m7, [outq+124]
163     movss [outq+ 72], m0
164     movss         m0, [outq+44]
165     addss         m2, m0
166     movss [outq+ 44], m1
167     movss [outq+ 88], m2
168     addss         m0, [outq+60]
169     mov         tmpd, [outq+60]
170     mov   [outq+120], tmpd
171     movss [outq+104], m0
172     addss         m4, m5
173     addss         m5, [outq+68]
174     movss  [outq+52], m4
175     movss  [outq+60], m5
176     movss         m4, [outq+68]
177     movss         m5, [outq+20]
178     movss [outq+ 20], m3
179     addss         m5, m7
180     addss         m7, m6
181     addss         m4, m5
182     movss         m2, [outq+84]
183     addss         m2, [outq+92]
184     addss         m5, m2
185     movss [outq+ 68], m4
186     addss         m2, m7
187     movss         m4, [outq+76]
188     movss [outq+ 84], m2
189     movss [outq+ 76], m5
190     addss         m7, m4
191     addss         m6, [outq+124]
192     addss         m4, m6
193     addss         m6, [outq+92]
194     movss [outq+100], m4
195     movss [outq+108], m6
196     movss         m6, [outq+92]
197     movss  [outq+92], m7
198     addss         m6, [outq+124]
199     movss [outq+116], m6
200 %endmacro
201
202 %define BUTTERFLY  BUTTERFLY_AVX
203 %define BUTTERFLY0 BUTTERFLY0_AVX
204
205 INIT_YMM
206 SECTION_TEXT
207 %ifdef HAVE_AVX
208 ; void ff_dct32_float_avx(FFTSample *out, const FFTSample *in)
209 cglobal dct32_float_avx, 2,3,8, out, in, tmp
210     ; pass 1
211     vmovaps     m4, [inq+0]
212     vinsertf128 m5, m5, [inq+96], 1
213     vinsertf128 m5, m5, [inq+112], 0
214     vshufps     m5, m5, m5, 0x1b
215     BUTTERFLY   m4, m5, [ps_cos_vec], m6
216
217     vmovaps     m2, [inq+64]
218     vinsertf128 m6, m6, [inq+32], 1
219     vinsertf128 m6, m6, [inq+48], 0
220     vshufps     m6, m6, m6, 0x1b
221     BUTTERFLY   m2, m6, [ps_cos_vec+32], m0
222
223     ; pass 2
224
225     BUTTERFLY  m5, m6, [ps_cos_vec+64], m0
226     BUTTERFLY  m4, m2, [ps_cos_vec+64], m7
227
228
229     ; pass 3
230     vperm2f128  m3, m6, m4, 0x31
231     vperm2f128  m1, m6, m4, 0x20
232     vshufps     m3, m3, m3, 0x1b
233
234     BUTTERFLY   m1, m3, [ps_cos_vec+96], m6
235
236
237     vperm2f128  m4, m5, m2, 0x20
238     vperm2f128  m5, m5, m2, 0x31
239     vshufps     m5, m5, m5, 0x1b
240
241     BUTTERFLY   m4, m5, [ps_cos_vec+96], m6
242
243     ; pass 4
244     vmovaps m6, [ps_p1p1m1m1+0]
245     vmovaps m2, [ps_cos_vec+128]
246
247     BUTTERFLY2  m5, m6, m2, m7
248     BUTTERFLY2  m4, m6, m2, m7
249     BUTTERFLY2  m1, m6, m2, m7
250     BUTTERFLY2  m3, m6, m2, m7
251
252
253     ; pass 5
254     vshufps m6, m6, m6, 0xcc
255     vmovaps m2, [ps_cos_vec+160]
256
257     BUTTERFLY3  m5, m6, m2, m7
258     BUTTERFLY3  m4, m6, m2, m7
259     BUTTERFLY3  m1, m6, m2, m7
260     BUTTERFLY3  m3, m6, m2, m7
261
262     vperm2f128  m6, m3, m3, 0x31
263     vmovaps [outq], m3
264
265     vextractf128  [outq+64], m5, 1
266     vextractf128  [outq+32], m5, 0
267
268     vextractf128  [outq+80], m4, 1
269     vextractf128  [outq+48], m4, 0
270
271     vperm2f128  m0, m1, m1, 0x31
272     vmovaps [outq+96], m1
273
274     vzeroupper
275
276     ;    pass 6, no SIMD...
277 INIT_XMM
278     PASS6_AND_PERMUTE
279     RET
280 %endif
281
282 %define BUTTERFLY  BUTTERFLY_SSE
283 %define BUTTERFLY0 BUTTERFLY0_SSE
284
285 %ifdef ARCH_X86_64
286 %define SPILL SWAP
287 %define UNSPILL SWAP
288
289 %macro PASS5 0
290     nop ; FIXME code alignment
291     SWAP 5, 8
292     SWAP 4, 12
293     SWAP 6, 14
294     SWAP 7, 13
295     SWAP 0, 15
296     PERMUTE 9,10, 10,12, 11,14, 12,9, 13,11, 14,13
297     TRANSPOSE4x4PS 8, 9, 10, 11, 0
298     BUTTERFLY3V    8, 9, 10, 11, 0
299     addps   m10, m11
300     TRANSPOSE4x4PS 12, 13, 14, 15, 0
301     BUTTERFLY3V    12, 13, 14, 15, 0
302     addps   m14, m15
303     addps   m12, m14
304     addps   m14, m13
305     addps   m13, m15
306 %endmacro
307
308 %macro PASS6 0
309     SWAP 9, 12
310     SWAP 11, 14
311     movss [outq+0x00], m8
312     pshuflw m0, m8, 0xe
313     movss [outq+0x10], m9
314     pshuflw m1, m9, 0xe
315     movss [outq+0x20], m10
316     pshuflw m2, m10, 0xe
317     movss [outq+0x30], m11
318     pshuflw m3, m11, 0xe
319     movss [outq+0x40], m12
320     pshuflw m4, m12, 0xe
321     movss [outq+0x50], m13
322     pshuflw m5, m13, 0xe
323     movss [outq+0x60], m14
324     pshuflw m6, m14, 0xe
325     movaps [outq+0x70], m15
326     pshuflw m7, m15, 0xe
327     addss   m0, m1
328     addss   m1, m2
329     movss [outq+0x08], m0
330     addss   m2, m3
331     movss [outq+0x18], m1
332     addss   m3, m4
333     movss [outq+0x28], m2
334     addss   m4, m5
335     movss [outq+0x38], m3
336     addss   m5, m6
337     movss [outq+0x48], m4
338     addss   m6, m7
339     movss [outq+0x58], m5
340     movss [outq+0x68], m6
341     movss [outq+0x78], m7
342
343     PERMUTE 1,8, 3,9, 5,10, 7,11, 9,12, 11,13, 13,14, 8,1, 10,3, 12,5, 14,7
344     movhlps m0, m1
345     pshufd  m1, m1, 3
346     SWAP 0, 2, 4, 6, 8, 10, 12, 14
347     SWAP 1, 3, 5, 7, 9, 11, 13, 15
348 %rep 7
349     movhlps m0, m1
350     pshufd  m1, m1, 3
351     addss   m15, m1
352     SWAP 0, 2, 4, 6, 8, 10, 12, 14
353     SWAP 1, 3, 5, 7, 9, 11, 13, 15
354 %endrep
355 %assign i 4
356 %rep 15
357     addss m0, m1
358     movss [outq+i], m0
359     SWAP 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
360     %assign i i+8
361 %endrep
362 %endmacro
363
364 %else ; ARCH_X86_32
365 %macro SPILL 2 ; xmm#, mempos
366     movaps [outq+(%2-8)*16], m%1
367 %endmacro
368 %macro UNSPILL 2
369     movaps m%1, [outq+(%2-8)*16]
370 %endmacro
371
372 %define PASS6 PASS6_AND_PERMUTE
373 %macro PASS5 0
374     movaps      m2, [ps_cos_vec+160]
375     shufps      m3, m3, 0xcc
376
377     BUTTERFLY3  m5, m3, m2, m1
378     SPILL 5, 8
379
380     UNSPILL 1, 9
381     BUTTERFLY3  m1, m3, m2, m5
382     SPILL 1, 14
383
384     BUTTERFLY3  m4, m3, m2, m5
385     SPILL 4, 12
386
387     BUTTERFLY3  m7, m3, m2, m5
388     SPILL 7, 13
389
390     UNSPILL 5, 10
391     BUTTERFLY3  m5, m3, m2, m7
392     SPILL 5, 10
393
394     UNSPILL 4, 11
395     BUTTERFLY3  m4, m3, m2, m7
396     SPILL 4, 11
397
398     BUTTERFLY3  m6, m3, m2, m7
399     SPILL 6, 9
400
401     BUTTERFLY3  m0, m3, m2, m7
402     SPILL 0, 15
403 %endmacro
404 %endif
405
406
407 INIT_XMM
408 ; void ff_dct32_float_sse(FFTSample *out, const FFTSample *in)
409 cglobal dct32_float_sse, 2,3,16, out, in, tmp
410     ; pass 1
411
412     movaps      m0, [inq+0]
413     movaps      m1, [inq+112]
414     shufps      m1, m1, 0x1b
415     BUTTERFLY   m0, m1, [ps_cos_vec], m3
416
417     movaps      m7, [inq+64]
418     movaps      m4, [inq+48]
419     shufps      m4, m4, 0x1b
420     BUTTERFLY   m7, m4, [ps_cos_vec+32], m3
421
422     ; pass 2
423     movaps      m2, [ps_cos_vec+64]
424     BUTTERFLY   m1, m4, m2, m3
425     SPILL 1, 11
426     SPILL 4, 8
427
428     ; pass 1
429     movaps      m1, [inq+16]
430     movaps      m6, [inq+96]
431     shufps      m6, m6, 0x1b
432     BUTTERFLY   m1, m6, [ps_cos_vec+16], m3
433
434     movaps      m4, [inq+80]
435     movaps      m5, [inq+32]
436     shufps      m5, m5, 0x1b
437     BUTTERFLY   m4, m5, [ps_cos_vec+48], m3
438
439     ; pass 2
440     BUTTERFLY   m0, m7, m2, m3
441
442     movaps      m2, [ps_cos_vec+80]
443     BUTTERFLY   m6, m5, m2, m3
444
445     BUTTERFLY   m1, m4, m2, m3
446
447     ; pass 3
448     movaps      m2, [ps_cos_vec+96]
449     shufps      m1, m1, 0x1b
450     BUTTERFLY   m0, m1, m2, m3
451     SPILL 0, 15
452     SPILL 1, 14
453
454     UNSPILL 0, 8
455     shufps      m5, m5, 0x1b
456     BUTTERFLY   m0, m5, m2, m3
457
458     UNSPILL 1, 11
459     shufps      m6, m6, 0x1b
460     BUTTERFLY   m1, m6, m2, m3
461     SPILL 1, 11
462
463     shufps      m4, m4, 0x1b
464     BUTTERFLY   m7, m4, m2, m3
465
466     ; pass 4
467     movaps      m3, [ps_p1p1m1m1+0]
468     movaps      m2, [ps_cos_vec+128]
469
470     BUTTERFLY2  m5, m3, m2, m1
471
472     BUTTERFLY2  m0, m3, m2, m1
473     SPILL 0, 9
474
475     BUTTERFLY2  m6, m3, m2, m1
476     SPILL 6, 10
477
478     UNSPILL 0, 11
479     BUTTERFLY2  m0, m3, m2, m1
480     SPILL 0, 11
481
482     BUTTERFLY2  m4, m3, m2, m1
483
484     BUTTERFLY2  m7, m3, m2, m1
485
486     UNSPILL 6, 14
487     BUTTERFLY2  m6, m3, m2, m1
488
489     UNSPILL 0, 15
490     BUTTERFLY2  m0, m3, m2, m1
491
492     PASS5
493     PASS6
494     RET