dct32: Add AVX implementation of 32-point DCT
[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 "config.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
41
42 ps_p1p1m1m1: dd 0, 0, 0x80000000, 0x80000000, 0, 0, 0x80000000, 0x80000000
43
44 %macro BUTTERFLY_SSE 4
45     movaps %4, %1
46     subps  %1, %2
47     addps  %2, %4
48     mulps  %1, %3
49 %endmacro
50
51 %macro BUTTERFLY_AVX 4
52     vsubps  %4, %1, %2
53     vaddps  %2, %2, %1
54     vmulps  %1, %4, %3
55 %endmacro
56
57 %macro BUTTERFLY0_SSE 5
58     movaps %4, %1
59     shufps %1, %1, %5
60     xorps  %4, %2
61     addps  %1, %4
62     mulps  %1, %3
63 %endmacro
64
65 %macro BUTTERFLY0_AVX 5
66     vshufps %4, %1, %1, %5
67     vxorps  %1, %1, %2
68     vaddps  %4, %4, %1
69     vmulps  %1, %4, %3
70 %endmacro
71
72 %macro BUTTERFLY2 4
73     BUTTERFLY0 %1, %2, %3, %4, 0x1b
74 %endmacro
75
76 %macro BUTTERFLY3 4
77     BUTTERFLY0 %1, %2, %3, %4, 0xb1
78 %endmacro
79
80 %macro PASS6_AND_PERMUTE 0
81     mov         tmpd, [outq+4]
82     movss         m7, [outq+72]
83     addss         m7, [outq+76]
84     movss         m3, [outq+56]
85     addss         m3, [outq+60]
86     addss         m4, m3
87     movss         m2, [outq+52]
88     addss         m2, m3
89     movss         m3, [outq+104]
90     addss         m3, [outq+108]
91     addss         m1, m3
92     addss         m5, m4
93     movss [outq+ 16], m1
94     movss         m1, [outq+100]
95     addss         m1, m3
96     movss         m3, [outq+40]
97     movss [outq+ 48], m1
98     addss         m3, [outq+44]
99     movss         m1, [outq+100]
100     addss         m4, m3
101     addss         m3, m2
102     addss         m1, [outq+108]
103     movss [outq+ 40], m3
104     addss         m2, [outq+36]
105     movss         m3, [outq+8]
106     movss [outq+ 56], m2
107     addss         m3, [outq+12]
108     movss [outq+ 32], m3
109     movss         m3, [outq+80]
110     movss [outq+  8], m5
111     movss [outq+ 80], m1
112     movss         m2, [outq+52]
113     movss         m5, [outq+120]
114     addss         m5, [outq+124]
115     movss         m1, [outq+64]
116     addss         m2, [outq+60]
117     addss         m0, m5
118     addss         m5, [outq+116]
119     mov    [outq+64], tmpd
120     addss         m6, m0
121     addss         m1, m6
122     mov         tmpd, [outq+12]
123     mov   [outq+ 96], tmpd
124     movss [outq+  4], m1
125     movss         m1, [outq+24]
126     movss [outq+ 24], m4
127     movss         m4, [outq+88]
128     addss         m4, [outq+92]
129     addss         m3, m4
130     addss         m4, [outq+84]
131     mov         tmpd, [outq+108]
132     addss         m1, [outq+28]
133     addss         m0, m1
134     addss         m1, m5
135     addss         m6, m3
136     addss         m3, m0
137     addss         m0, m7
138     addss         m5, [outq+20]
139     addss         m7, m1
140     movss [outq+ 12], m6
141     mov   [outq+112], tmpd
142     movss         m6, [outq+28]
143     movss [outq+ 28], m0
144     movss         m0, [outq+36]
145     movss [outq+ 36], m7
146     addss         m1, m4
147     movss         m7, [outq+116]
148     addss         m0, m2
149     addss         m7, [outq+124]
150     movss [outq+ 72], m0
151     movss         m0, [outq+44]
152     addss         m2, m0
153     movss [outq+ 44], m1
154     movss [outq+ 88], m2
155     addss         m0, [outq+60]
156     mov         tmpd, [outq+60]
157     mov   [outq+120], tmpd
158     movss [outq+104], m0
159     addss         m4, m5
160     addss         m5, [outq+68]
161     movss  [outq+52], m4
162     movss  [outq+60], m5
163     movss         m4, [outq+68]
164     movss         m5, [outq+20]
165     movss [outq+ 20], m3
166     addss         m5, m7
167     addss         m7, m6
168     addss         m4, m5
169     movss         m2, [outq+84]
170     addss         m2, [outq+92]
171     addss         m5, m2
172     movss [outq+ 68], m4
173     addss         m2, m7
174     movss         m4, [outq+76]
175     movss [outq+ 84], m2
176     movss [outq+ 76], m5
177     addss         m7, m4
178     addss         m6, [outq+124]
179     addss         m4, m6
180     addss         m6, [outq+92]
181     movss [outq+100], m4
182     movss [outq+108], m6
183     movss         m6, [outq+92]
184     movss  [outq+92], m7
185     addss         m6, [outq+124]
186     movss [outq+116], m6
187 %endmacro
188
189 %define BUTTERFLY  BUTTERFLY_AVX
190 %define BUTTERFLY0 BUTTERFLY0_AVX
191
192 INIT_YMM
193 section .text align=16
194 %ifdef HAVE_AVX
195 ; void ff_dct32_float_avx(FFTSample *out, const FFTSample *in)
196 cglobal dct32_float_avx, 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 %endif
268
269 %define BUTTERFLY  BUTTERFLY_SSE
270 %define BUTTERFLY0 BUTTERFLY0_SSE
271
272 INIT_XMM
273 ; void ff_dct32_float_sse(FFTSample *out, const FFTSample *in)
274 cglobal dct32_float_sse, 2,3,8, out, in, tmp
275     ; pass 1
276
277     movaps      m0, [inq+0]
278     movaps      m1, [inq+112]
279     shufps      m1, m1, 0x1b
280     BUTTERFLY   m0, m1, [ps_cos_vec], m3
281
282     movaps      m7, [inq+64]
283     movaps      m4, [inq+48]
284     shufps      m4, m4, 0x1b
285     BUTTERFLY   m7, m4, [ps_cos_vec+32], m3
286
287     ; pass 2
288     movaps      m2, [ps_cos_vec+64]
289     BUTTERFLY   m1, m4, m2, m3
290     movaps      [outq+48], m1
291     movaps      [outq+ 0], m4
292
293     ; pass 1
294     movaps      m1, [inq+16]
295     movaps      m6, [inq+96]
296     shufps      m6, m6, 0x1b
297     BUTTERFLY   m1, m6, [ps_cos_vec+16], m3
298
299     movaps      m4, [inq+80]
300     movaps      m5, [inq+32]
301     shufps      m5, m5, 0x1b
302     BUTTERFLY   m4, m5, [ps_cos_vec+48], m3
303
304     ; pass 2
305     BUTTERFLY   m0, m7, m2, m3
306
307     movaps      m2, [ps_cos_vec+80]
308     BUTTERFLY   m6, m5, m2, m3
309
310     BUTTERFLY   m1, m4, m2, m3
311
312     ; pass 3
313     movaps      m2, [ps_cos_vec+96]
314     shufps      m1, m1, 0x1b
315     BUTTERFLY   m0, m1, m2, m3
316     movaps      [outq+112], m0
317     movaps      [outq+ 96], m1
318
319     movaps      m0, [outq+0]
320     shufps      m5, m5, 0x1b
321     BUTTERFLY   m0, m5, m2, m3
322
323     movaps      m1, [outq+48]
324     shufps      m6, m6, 0x1b
325     BUTTERFLY   m1, m6, m2, m3
326     movaps      [outq+48], m1
327
328     shufps      m4, m4, 0x1b
329     BUTTERFLY   m7, m4, m2, m3
330
331     ; pass 4
332     movaps      m3, [ps_p1p1m1m1+0]
333     movaps      m2, [ps_cos_vec+128]
334
335     BUTTERFLY2  m5, m3, m2, m1
336
337     BUTTERFLY2  m0, m3, m2, m1
338     movaps      [outq+16], m0
339
340     BUTTERFLY2  m6, m3, m2, m1
341     movaps      [outq+32], m6
342
343     movaps      m0, [outq+48]
344     BUTTERFLY2  m0, m3, m2, m1
345     movaps      [outq+48], m0
346
347     BUTTERFLY2  m4, m3, m2, m1
348
349     BUTTERFLY2  m7, m3, m2, m1
350
351     movaps      m6, [outq+96]
352     BUTTERFLY2  m6, m3, m2, m1
353
354     movaps      m0, [outq+112]
355     BUTTERFLY2  m0, m3, m2, m1
356
357     ; pass 5
358     movaps      m2, [ps_cos_vec+160]
359     shufps      m3, m3, 0xcc
360
361     BUTTERFLY3  m5, m3, m2, m1
362     movaps      [outq+0], m5
363
364     movaps      m1, [outq+16]
365     BUTTERFLY3  m1, m3, m2, m5
366     movaps      [outq+96], m1
367
368     BUTTERFLY3  m4, m3, m2, m5
369     movaps      [outq+64], m4
370
371     BUTTERFLY3  m7, m3, m2, m5
372     movaps      [outq+80], m7
373
374     movaps      m5, [outq+32]
375     BUTTERFLY3  m5, m3, m2, m7
376     movaps      [outq+32], m5
377
378     movaps      m4, [outq+48]
379     BUTTERFLY3  m4, m3, m2, m7
380     movaps      [outq+48], m4
381
382     BUTTERFLY3  m6, m3, m2, m7
383     movaps      [outq+16], m6
384
385     BUTTERFLY3  m0, m3, m2, m7
386     movaps      [outq+112], m0
387
388
389     ;    pass 6, no SIMD...
390     PASS6_AND_PERMUTE
391     RET