dct32: Change pass 6 permutation to allow for AVX implementation
[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
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  -1.169440, -0.972568, -0.839350, -0.744536
30             dd -10.190008, -3.407609, -2.057781, -1.484165
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   1.000000,  1.000000,  1.306563,  0.541196
35             dd   1.000000,  0.707107,  1.000000, -0.707107
36
37
38 ps_p1p1m1m1: dd 0, 0, 0x80000000, 0x80000000
39
40 %macro BUTTERFLY 4
41     movaps %4, %1
42     subps  %1, %2
43     addps  %2, %4
44     mulps  %1, %3
45 %endmacro
46
47 %macro BUTTERFLY0 5
48     movaps %4, %1
49     shufps %1, %1, %5
50     xorps  %4, %2
51     addps  %1, %4
52     mulps  %1, %3
53 %endmacro
54
55 %macro BUTTERFLY2 4
56     BUTTERFLY0 %1, %2, %3, %4, 0x1b
57 %endmacro
58
59 %macro BUTTERFLY3 4
60     BUTTERFLY0 %1, %2, %3, %4, 0xb1
61 %endmacro
62
63 INIT_XMM
64 section .text align=16
65 ; void ff_dct32_float_sse(FFTSample *out, const FFTSample *in)
66 cglobal dct32_float_sse, 2,3,8, out, in, tmp
67     ; pass 1
68
69     movaps      m0, [inq+0]
70     movaps      m1, [inq+112]
71     shufps      m1, m1, 0x1b
72     BUTTERFLY   m0, m1, [ps_cos_vec], m3
73
74     movaps      m7, [inq+64]
75     movaps      m4, [inq+48]
76     shufps      m4, m4, 0x1b
77     BUTTERFLY   m7,  m4, [ps_cos_vec+48], m3
78
79
80     ; pass 2
81     movaps      m2, [ps_cos_vec+64]
82     BUTTERFLY   m1, m4, m2, m3
83     movaps      [outq+48], m1
84     movaps      [outq+ 0], m4
85
86     ; pass 1
87     movaps      m1, [inq+16]
88     movaps      m6, [inq+96]
89     shufps      m6, m6, 0x1b
90     BUTTERFLY   m1, m6, [ps_cos_vec+16], m3
91
92     movaps      m4, [inq+80]
93     movaps      m5, [inq+32]
94     shufps      m5, m5, 0x1b
95     BUTTERFLY   m4, m5, [ps_cos_vec+32], m3
96
97     ; pass 2
98     BUTTERFLY   m0, m7, m2, m3
99
100     movaps      m2, [ps_cos_vec+80]
101     BUTTERFLY   m6, m5, m2, m3
102
103     BUTTERFLY   m1, m4, m2, m3
104
105     ; pass 3
106     movaps      m2, [ps_cos_vec+96]
107     shufps      m1, m1, 0x1b
108     BUTTERFLY   m0, m1, m2, m3
109     movaps      [outq+112], m0
110     movaps      [outq+ 96], m1
111
112     movaps      m0, [outq+0]
113     shufps      m5, m5, 0x1b
114     BUTTERFLY   m0, m5, m2, m3
115
116     movaps      m1, [outq+48]
117     shufps      m6, m6, 0x1b
118     BUTTERFLY   m1, m6, m2, m3
119     movaps      [outq+48], m1
120
121     shufps      m4, m4, 0x1b
122     BUTTERFLY   m7, m4, m2, m3
123
124     ; pass 4
125     movaps      m3, [ps_p1p1m1m1+0]
126     movaps      m2, [ps_cos_vec+112]
127
128     BUTTERFLY2  m5, m3, m2, m1
129
130     BUTTERFLY2  m0, m3, m2, m1
131     movaps      [outq+16], m0
132
133     BUTTERFLY2  m6, m3, m2, m1
134     movaps      [outq+32], m6
135
136     movaps      m0, [outq+48]
137     BUTTERFLY2  m0, m3, m2, m1
138     movaps      [outq+48], m0
139
140     BUTTERFLY2  m4, m3, m2, m1
141
142     BUTTERFLY2  m7, m3, m2, m1
143
144     movaps      m6, [outq+96]
145     BUTTERFLY2  m6, m3, m2, m1
146
147     movaps      m0, [outq+112]
148     BUTTERFLY2  m0, m3, m2, m1
149
150     ; pass 5
151     movaps      m2, [ps_cos_vec+128]
152     shufps      m3, m3, 0xcc
153
154     BUTTERFLY3  m5, m3, m2, m1
155     movaps      [outq+0], m5
156
157     movaps      m1, [outq+16]
158     BUTTERFLY3  m1, m3, m2, m5
159     movaps      [outq+96], m1
160
161     BUTTERFLY3  m4, m3, m2, m5
162     movaps      [outq+64], m4
163
164     BUTTERFLY3  m7, m3, m2, m5
165     movaps      [outq+80], m7
166
167     movaps      m5, [outq+32]
168     BUTTERFLY3  m5, m3, m2, m7
169     movaps      [outq+32], m5
170
171     movaps      m4, [outq+48]
172     BUTTERFLY3  m4, m3, m2, m7
173     movaps      [outq+48], m4
174
175     BUTTERFLY3  m6, m3, m2, m7
176     movaps      [outq+16], m6
177
178     BUTTERFLY3  m0, m3, m2, m7
179     movaps      [outq+112], m0
180
181
182     ;    pass 6, no SIMD...
183     mov         tmpd, [outq+4]
184     movss         m7, [outq+72]
185     addss         m7, [outq+76]
186     movss         m3, [outq+56]
187     addss         m3, [outq+60]
188     addss         m4, m3
189     movss         m2, [outq+52]
190     addss         m2, m3
191     movss         m3, [outq+104]
192     addss         m3, [outq+108]
193     addss         m1, m3
194     addss         m5, m4
195     movss [outq+ 16], m1
196     movss         m1, [outq+100]
197     addss         m1, m3
198     movss         m3, [outq+40]
199     movss [outq+ 48], m1
200     addss         m3, [outq+44]
201     movss         m1, [outq+100]
202     addss         m4, m3
203     addss         m3, m2
204     addss         m1, [outq+108]
205     movss [outq+ 40], m3
206     addss         m2, [outq+36]
207     movss         m3, [outq+8]
208     movss [outq+ 56], m2
209     addss         m3, [outq+12]
210     movss [outq+ 32], m3
211     movss         m3, [outq+80]
212     movss [outq+  8], m5
213     movss [outq+ 80], m1
214     movss         m2, [outq+52]
215     movss         m5, [outq+120]
216     addss         m5, [outq+124]
217     movss         m1, [outq+64]
218     addss         m2, [outq+60]
219     addss         m0, m5
220     addss         m5, [outq+116]
221     mov    [outq+64], tmpd
222     addss         m6, m0
223     addss         m1, m6
224     mov         tmpd, [outq+12]
225     mov   [outq+ 96], tmpd
226     movss [outq+  4], m1
227     movss         m1, [outq+24]
228     movss [outq+ 24], m4
229     movss         m4, [outq+88]
230     addss         m4, [outq+92]
231     addss         m3, m4
232     addss         m4, [outq+84]
233     mov         tmpd, [outq+108]
234     addss         m1, [outq+28]
235     addss         m0, m1
236     addss         m1, m5
237     addss         m6, m3
238     addss         m3, m0
239     addss         m0, m7
240     addss         m5, [outq+20]
241     addss         m7, m1
242     movss [outq+ 12], m6
243     mov   [outq+112], tmpd
244     movss         m6, [outq+28]
245     movss [outq+ 28], m0
246     movss         m0, [outq+36]
247     movss [outq+ 36], m7
248     addss         m1, m4
249     movss         m7, [outq+116]
250     addss         m0, m2
251     addss         m7, [outq+124]
252     movss [outq+ 72], m0
253     movss         m0, [outq+44]
254     addss         m2, m0
255     movss [outq+ 44], m1
256     movss [outq+ 88], m2
257     addss         m0, [outq+60]
258     mov         tmpd, [outq+60]
259     mov   [outq+120], tmpd
260     movss [outq+104], m0
261     addss         m4, m5
262     addss         m5, [outq+68]
263     movss  [outq+52], m4
264     movss  [outq+60], m5
265     movss         m4, [outq+68]
266     movss         m5, [outq+20]
267     movss [outq+ 20], m3
268     addss         m5, m7
269     addss         m7, m6
270     addss         m4, m5
271     movss         m2, [outq+84]
272     addss         m2, [outq+92]
273     addss         m5, m2
274     movss [outq+ 68], m4
275     addss         m2, m7
276     movss         m4, [outq+76]
277     movss [outq+ 84], m2
278     movss [outq+ 76], m5
279     addss         m7, m4
280     addss         m6, [outq+124]
281     addss         m4, m6
282     addss         m6, [outq+92]
283     movss [outq+100], m4
284     movss [outq+108], m6
285     movss         m6, [outq+92]
286     movss  [outq+92], m7
287     addss         m6, [outq+124]
288     movss [outq+116], m6
289     RET