avcodec/aacps: move checks for valid length outside the stereo_interpolate dsp function
[ffmpeg.git] / libavcodec / x86 / aacpsdsp.asm
1 ;******************************************************************************
2 ;* SIMD optimized MPEG-4 Parametric Stereo decoding functions
3 ;*
4 ;* Copyright (C) 2015 James Almer
5 ;*
6 ;* This file is part of FFmpeg.
7 ;*
8 ;* FFmpeg is free software; you can redistribute it and/or
9 ;* modify it under the terms of the GNU Lesser General Public
10 ;* License as published by the Free Software Foundation; either
11 ;* version 2.1 of the License, or (at your option) any later version.
12 ;*
13 ;* FFmpeg is distributed in the hope that it will be useful,
14 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 ;* Lesser General Public License for more details.
17 ;*
18 ;* You should have received a copy of the GNU Lesser General Public
19 ;* License along with FFmpeg; if not, write to the Free Software
20 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 ;******************************************************************************
22
23 %include "libavutil/x86/x86util.asm"
24
25 SECTION_RODATA
26
27 ps_p1m1p1m1: dd 0, 0x80000000, 0, 0x80000000
28
29 SECTION .text
30
31 ;*************************************************************************
32 ;void ff_ps_add_squares_<opt>(float *dst, const float (*src)[2], int n);
33 ;*************************************************************************
34 %macro PS_ADD_SQUARES 1
35 cglobal ps_add_squares, 3, 3, %1, dst, src, n
36     shl    nd, 3
37     add  srcq, nq
38     neg    nq
39
40 align 16
41 .loop:
42     movaps m0, [srcq+nq]
43     movaps m1, [srcq+nq+mmsize]
44     mulps  m0, m0
45     mulps  m1, m1
46     HADDPS m0, m1, m2
47     addps  m0, [dstq]
48     movaps [dstq], m0
49     add  dstq, mmsize
50     add    nq, mmsize*2
51     jl .loop
52     REP_RET
53 %endmacro
54
55 INIT_XMM sse
56 PS_ADD_SQUARES 2
57 INIT_XMM sse3
58 PS_ADD_SQUARES 3
59
60 ;*******************************************************************
61 ;void ff_ps_mul_pair_single_sse(float (*dst)[2], float (*src0)[2],
62 ;                                   float *src1, int n);
63 ;*******************************************************************
64 INIT_XMM sse
65 cglobal ps_mul_pair_single, 4, 4, 4, dst, src1, src2, n
66     shl      nd, 3
67     add   src1q, nq
68     add    dstq, nq
69     neg      nq
70
71 align 16
72 .loop:
73     movu     m0, [src1q+nq]
74     movu     m1, [src1q+nq+mmsize]
75     mova     m2, [src2q]
76     mova     m3, m2
77     unpcklps m2, m2
78     unpckhps m3, m3
79     mulps    m0, m2
80     mulps    m1, m3
81     mova [dstq+nq], m0
82     mova [dstq+nq+mmsize], m1
83     add   src2q, mmsize
84     add      nq, mmsize*2
85     jl .loop
86     REP_RET
87
88 ;***********************************************************************
89 ;void ff_ps_stereo_interpolate_sse3(float (*l)[2], float (*r)[2],
90 ;                                   float h[2][4], float h_step[2][4],
91 ;                                   int len);
92 ;***********************************************************************
93 INIT_XMM sse3
94 cglobal ps_stereo_interpolate, 5, 5, 6, l, r, h, h_step, n
95     movaps   m0, [hq]
96     movaps   m1, [h_stepq]
97     unpcklps m4, m0, m0
98     unpckhps m0, m0
99     unpcklps m5, m1, m1
100     unpckhps m1, m1
101     shl      nd, 3
102     add      lq, nq
103     add      rq, nq
104     neg      nq
105
106 align 16
107 .loop:
108     addps    m4, m5
109     addps    m0, m1
110     movddup  m2, [lq+nq]
111     movddup  m3, [rq+nq]
112     mulps    m2, m4
113     mulps    m3, m0
114     addps    m2, m3
115     movsd  [lq+nq], m2
116     movhps [rq+nq], m2
117     add      nq, 8
118     jl .loop
119     REP_RET
120
121 ;***************************************************************************
122 ;void ps_stereo_interpolate_ipdopd_sse3(float (*l)[2], float (*r)[2],
123 ;                                       float h[2][4], float h_step[2][4],
124 ;                                       int len);
125 ;***************************************************************************
126 INIT_XMM sse3
127 cglobal ps_stereo_interpolate_ipdopd, 5, 5, 10, l, r, h, h_step, n
128     movaps   m0, [hq]
129     movaps   m1, [hq+mmsize]
130 %if ARCH_X86_64
131     movaps   m8, [h_stepq]
132     movaps   m9, [h_stepq+mmsize]
133     %define  H_STEP0 m8
134     %define  H_STEP1 m9
135 %else
136     %define  H_STEP0 [h_stepq]
137     %define  H_STEP1 [h_stepq+mmsize]
138 %endif
139     shl      nd, 3
140     add      lq, nq
141     add      rq, nq
142     neg      nq
143
144 align 16
145 .loop:
146     addps    m0, H_STEP0
147     addps    m1, H_STEP1
148     movddup  m2, [lq+nq]
149     movddup  m3, [rq+nq]
150     shufps   m4, m2, m2, q2301
151     shufps   m5, m3, m3, q2301
152     unpcklps m6, m0, m0
153     unpckhps m7, m0, m0
154     mulps    m2, m6
155     mulps    m3, m7
156     unpcklps m6, m1, m1
157     unpckhps m7, m1, m1
158     mulps    m4, m6
159     mulps    m5, m7
160     addps    m2, m3
161     addsubps m2, m4
162     addsubps m2, m5
163     movsd  [lq+nq], m2
164     movhps [rq+nq], m2
165     add      nq, 8
166     jl .loop
167     REP_RET
168
169 ;*******************************************************************
170 ;void ff_ps_hybrid_analysis_<opt>(float (*out)[2], float (*in)[2],
171 ;                                 const float (*filter)[8][2],
172 ;                                 int stride, int n);
173 ;*******************************************************************
174 %macro PS_HYBRID_ANALYSIS_LOOP 3
175     movu     %1, [inq+mmsize*%3]
176     movu     m1, [inq+mmsize*(5-%3)+8]
177 %if cpuflag(sse3)
178     pshufd   %2, %1, q2301
179     pshufd   m4, m1, q0123
180     pshufd   m1, m1, q1032
181     pshufd   m2, [filterq+nq+mmsize*%3], q2301
182     addsubps %2, m4
183     addsubps %1, m1
184 %else
185     mova     m2, [filterq+nq+mmsize*%3]
186     mova     %2, %1
187     mova     m4, m1
188     shufps   %2, %2, q2301
189     shufps   m4, m4, q0123
190     shufps   m1, m1, q1032
191     shufps   m2, m2, q2301
192     xorps    m4, m7
193     xorps    m1, m7
194     subps    %2, m4
195     subps    %1, m1
196 %endif
197     mulps    %2, m2
198     mulps    %1, m2
199 %if %3
200     addps    m3, %2
201     addps    m0, %1
202 %endif
203 %endmacro
204
205 %macro PS_HYBRID_ANALYSIS 0
206 cglobal ps_hybrid_analysis, 5, 5, 8, out, in, filter, stride, n
207 %if cpuflag(sse3)
208 %define MOVH movsd
209 %else
210 %define MOVH movlps
211 %endif
212     shl strided, 3
213     shl nd, 6
214     add filterq, nq
215     neg nq
216     mova m7, [ps_p1m1p1m1]
217
218 align 16
219 .loop:
220     PS_HYBRID_ANALYSIS_LOOP m0, m3, 0
221     PS_HYBRID_ANALYSIS_LOOP m5, m6, 1
222     PS_HYBRID_ANALYSIS_LOOP m5, m6, 2
223
224 %if cpuflag(sse3)
225     pshufd   m3, m3, q2301
226     xorps    m0, m7
227     hsubps   m3, m0
228     pshufd   m1, m3, q0020
229     pshufd   m3, m3, q0031
230     addps    m1, m3
231     movsd    m2, [inq+6*8]
232 %else
233     mova     m1, m3
234     mova     m2, m0
235     shufps   m1, m1, q2301
236     shufps   m2, m2, q2301
237     subps    m1, m3
238     addps    m2, m0
239     unpcklps m3, m1, m2
240     unpckhps m1, m2
241     addps    m1, m3
242     movu     m2, [inq+6*8] ; faster than movlps and no risk of overread
243 %endif
244     movss    m3, [filterq+nq+8*6]
245     SPLATD   m3
246     mulps    m2, m3
247     addps    m1, m2
248     MOVH [outq], m1
249     add    outq, strideq
250     add      nq, 64
251     jl .loop
252     REP_RET
253 %endmacro
254
255 INIT_XMM sse
256 PS_HYBRID_ANALYSIS
257 INIT_XMM sse3
258 PS_HYBRID_ANALYSIS