]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/dcadsp.asm
Merge commit '18c506e9e6e8df8b1d496d093077b8240ea68c28'
[ffmpeg] / libavcodec / x86 / dcadsp.asm
1 ;******************************************************************************
2 ;* SIMD-optimized functions for the DCA decoder
3 ;* Copyright (C) 2016 James Almer
4 ;*
5 ;* This file is part of FFmpeg.
6 ;*
7 ;* FFmpeg 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 ;* FFmpeg 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 FFmpeg; 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 .text
25
26 %define sizeof_float 4
27 %define FMA3_OFFSET (8 * cpuflag(fma3) * ARCH_X86_64)
28
29 %macro LFE_FIR0_FLOAT 0
30 cglobal lfe_fir0_float, 4, 6, 12 + cpuflag(fma3)*4, samples, lfe, coeff, nblocks, cnt1, cnt2
31     shr nblocksd, 1
32     sub     lfeq, 7*sizeof_float
33     mov    cnt1d, 32*sizeof_float
34     mov    cnt2d, 32*sizeof_float-8-FMA3_OFFSET
35     lea   coeffq, [coeffq+cnt1q*8]
36     add samplesq, cnt1q
37     neg    cnt1q
38
39 .loop:
40 %if cpuflag(avx)
41     cvtdq2ps  m4, [lfeq+16]
42     cvtdq2ps  m5, [lfeq   ]
43     shufps    m7, m4, m4, q0123
44     shufps    m6, m5, m5, q0123
45 %elif cpuflag(sse2)
46     movu      m4, [lfeq+16]
47     movu      m5, [lfeq   ]
48     cvtdq2ps  m4, m4
49     cvtdq2ps  m5, m5
50     pshufd    m7, m4, q0123
51     pshufd    m6, m5, q0123
52 %else
53     cvtpi2ps  m4, [lfeq+16]
54     cvtpi2ps  m0, [lfeq+24]
55     cvtpi2ps  m5, [lfeq   ]
56     cvtpi2ps  m1, [lfeq+8 ]
57     shufps    m4, m0, q1010
58     shufps    m5, m1, q1010
59     shufps    m7, m4, m4, q0123
60     shufps    m6, m5, m5, q0123
61 %endif
62
63 .inner_loop:
64 %if ARCH_X86_64
65     movaps    m8, [coeffq+cnt1q*8   ]
66     movaps    m9, [coeffq+cnt1q*8+16]
67     movaps   m10, [coeffq+cnt1q*8+32]
68     movaps   m11, [coeffq+cnt1q*8+48]
69 %if cpuflag(fma3)
70     movaps   m12, [coeffq+cnt1q*8+64]
71     movaps   m13, [coeffq+cnt1q*8+80]
72     movaps   m14, [coeffq+cnt1q*8+96]
73     movaps   m15, [coeffq+cnt1q*8+112]
74     mulps     m0, m7, m8
75     mulps     m1, m7, m10
76     mulps     m2, m7, m12
77     mulps     m3, m7, m14
78     fmaddps   m0, m6, m9, m0
79     fmaddps   m1, m6, m11, m1
80     fmaddps   m2, m6, m13, m2
81     fmaddps   m3, m6, m15, m3
82
83     haddps    m0, m1
84     haddps    m2, m3
85     haddps    m0, m2
86     movaps [samplesq+cnt1q], m0
87 %else
88     mulps     m0, m7, m8
89     mulps     m1, m6, m9
90     mulps     m2, m7, m10
91     mulps     m3, m6, m11
92     addps     m0, m1
93     addps     m2, m3
94
95     unpckhps  m3, m0, m2
96     unpcklps  m0, m2
97     addps     m3, m0
98     movhlps   m2, m3
99     addps     m2, m3
100     movlps [samplesq+cnt1q], m2
101 %endif
102 %else ; ARCH_X86_32
103 %if cpuflag(fma3)
104     mulps     m0, m7, [coeffq+cnt1q*8   ]
105     movaps        m1, [coeffq+cnt1q*8+16]
106     mulps     m2, m7, [coeffq+cnt1q*8+32]
107     fmaddps   m0, m6, m1, m0
108     fmaddps   m2, m6, [coeffq+cnt1q*8+48], m2
109 %else
110     mulps     m0, m7, [coeffq+cnt1q*8   ]
111     mulps     m1, m6, [coeffq+cnt1q*8+16]
112     mulps     m2, m7, [coeffq+cnt1q*8+32]
113     mulps     m3, m6, [coeffq+cnt1q*8+48]
114     addps     m0, m1
115     addps     m2, m3
116 %endif
117     unpckhps  m3, m0, m2
118     unpcklps  m0, m2
119     addps     m3, m0
120     movhlps   m2, m3
121     addps     m2, m3
122     movlps [samplesq+cnt1q], m2
123 %endif; ARCH
124
125 %if ARCH_X86_64
126 %if cpuflag(fma3)
127     mulps     m8, m5
128     mulps    m10, m5
129     mulps    m12, m5
130     mulps    m14, m5
131     fmaddps   m8, m4, m9, m8
132     fmaddps  m10, m4, m11, m10
133     fmaddps  m12, m4, m13, m12
134     fmaddps  m14, m4, m15, m14
135
136     haddps   m10, m8
137     haddps   m14, m12
138     haddps   m14, m10
139     movaps [samplesq+cnt2q], m14
140 %else
141     mulps     m8, m5
142     mulps     m9, m4
143     mulps    m10, m5
144     mulps    m11, m4
145     addps     m8, m9
146     addps    m10, m11
147
148     unpckhps m11, m10, m8
149     unpcklps m10, m8
150     addps    m11, m10
151     movhlps   m8, m11
152     addps     m8, m11
153     movlps [samplesq+cnt2q], m8
154 %endif
155 %else ; ARCH_X86_32
156 %if cpuflag(fma3)
157     mulps     m0, m5, [coeffq+cnt1q*8   ]
158     mulps     m2, m5, [coeffq+cnt1q*8+32]
159     fmaddps   m0, m4, m1, m0
160     fmaddps   m2, m4, [coeffq+cnt1q*8+48], m2
161 %else
162     mulps     m0, m5, [coeffq+cnt1q*8   ]
163     mulps     m1, m4, [coeffq+cnt1q*8+16]
164     mulps     m2, m5, [coeffq+cnt1q*8+32]
165     mulps     m3, m4, [coeffq+cnt1q*8+48]
166     addps     m0, m1
167     addps     m2, m3
168 %endif
169     unpckhps  m3, m2, m0
170     unpcklps  m2, m0
171     addps     m3, m2
172     movhlps   m0, m3
173     addps     m0, m3
174     movlps [samplesq+cnt2q], m0
175 %endif; ARCH
176
177     sub    cnt2d, 8 + FMA3_OFFSET
178     add    cnt1q, 8 + FMA3_OFFSET
179     jl .inner_loop
180
181     add     lfeq, 4
182     add samplesq,  64*sizeof_float
183     mov    cnt1q, -32*sizeof_float
184     mov    cnt2d,  32*sizeof_float-8-FMA3_OFFSET
185     sub nblocksd, 1
186     jg .loop
187     RET
188 %endmacro
189
190 %if ARCH_X86_32
191 INIT_XMM sse
192 LFE_FIR0_FLOAT
193 %endif
194 INIT_XMM sse2
195 LFE_FIR0_FLOAT
196 %if HAVE_AVX_EXTERNAL
197 INIT_XMM avx
198 LFE_FIR0_FLOAT
199 %endif
200 %if HAVE_FMA3_EXTERNAL
201 INIT_XMM fma3
202 LFE_FIR0_FLOAT
203 %endif
204
205 %macro LFE_FIR1_FLOAT 0
206 cglobal lfe_fir1_float, 4, 6, 10, samples, lfe, coeff, nblocks, cnt1, cnt2
207     shr nblocksd, 2
208     sub     lfeq, 3*sizeof_float
209     mov    cnt1d, 64*sizeof_float
210     mov    cnt2d, 64*sizeof_float-16
211     lea   coeffq, [coeffq+cnt1q*4]
212     add samplesq, cnt1q
213     neg    cnt1q
214
215 .loop:
216 %if cpuflag(avx)
217     cvtdq2ps  m4, [lfeq]
218     shufps    m5, m4, m4, q0123
219 %elif cpuflag(sse2)
220     movu      m4, [lfeq]
221     cvtdq2ps  m4, m4
222     pshufd    m5, m4, q0123
223 %endif
224
225 .inner_loop:
226     movaps    m6, [coeffq+cnt1q*4   ]
227     movaps    m7, [coeffq+cnt1q*4+16]
228     mulps     m0, m5, m6
229     mulps     m1, m5, m7
230 %if ARCH_X86_64
231     movaps    m8, [coeffq+cnt1q*4+32]
232     movaps    m9, [coeffq+cnt1q*4+48]
233     mulps     m2, m5, m8
234     mulps     m3, m5, m9
235 %else
236     mulps     m2, m5, [coeffq+cnt1q*4+32]
237     mulps     m3, m5, [coeffq+cnt1q*4+48]
238 %endif
239
240     haddps    m0, m1
241     haddps    m2, m3
242     haddps    m0, m2
243     movaps [samplesq+cnt1q], m0
244
245     mulps     m6, m4
246     mulps     m7, m4
247 %if ARCH_X86_64
248     mulps     m8, m4
249     mulps     m9, m4
250
251     haddps    m6, m7
252     haddps    m8, m9
253     haddps    m6, m8
254 %else
255     mulps     m2, m4, [coeffq+cnt1q*4+32]
256     mulps     m3, m4, [coeffq+cnt1q*4+48]
257
258     haddps    m6, m7
259     haddps    m2, m3
260     haddps    m6, m2
261 %endif
262     movaps [samplesq+cnt2q], m6
263
264     sub    cnt2d, 16
265     add    cnt1q, 16
266     jl .inner_loop
267
268     add     lfeq, sizeof_float
269     add samplesq, 128*sizeof_float
270     mov    cnt1q, -64*sizeof_float
271     mov    cnt2d,  64*sizeof_float-16
272     sub nblocksd, 1
273     jg .loop
274     RET
275 %endmacro
276
277 INIT_XMM sse3
278 LFE_FIR1_FLOAT
279 %if HAVE_AVX_EXTERNAL
280 INIT_XMM avx
281 LFE_FIR1_FLOAT
282 %endif