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