]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/aacpsdsp.asm
Merge commit '90bc423212396e96a02edc1118982ab7f7766a63'
[ffmpeg] / 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, 5, 4, dst, src1, src2, n
66     xor r4q, r4q
67
68 .loop:
69     movu     m0, [src1q+r4q]
70     movu     m1, [src1q+r4q+mmsize]
71     mova     m2, [src2q]
72     mova     m3, m2
73     unpcklps m2, m2
74     unpckhps m3, m3
75     mulps    m0, m2
76     mulps    m1, m3
77     mova [dstq+r4q], m0
78     mova [dstq+r4q+mmsize], m1
79     add   src2q, mmsize
80     add     r4q, mmsize*2
81     sub      nd, mmsize/4
82     jg .loop
83     REP_RET
84
85 ;***********************************************************************
86 ;void ff_ps_stereo_interpolate_sse3(float (*l)[2], float (*r)[2],
87 ;                                   float h[2][4], float h_step[2][4],
88 ;                                   int len);
89 ;***********************************************************************
90 INIT_XMM sse3
91 cglobal ps_stereo_interpolate, 5, 5, 6, l, r, h, h_step, n
92     movaps   m0, [hq]
93     movaps   m1, [h_stepq]
94     cmp      nd, 0
95     jle .ret
96     shl      nd, 3
97     add      lq, nq
98     add      rq, nq
99     neg      nq
100
101 align 16
102 .loop:
103     addps    m0, m1
104     movddup  m2, [lq+nq]
105     movddup  m3, [rq+nq]
106     movaps   m4, m0
107     movaps   m5, m0
108     unpcklps m4, m4
109     unpckhps m5, m5
110     mulps    m2, m4
111     mulps    m3, m5
112     addps    m2, m3
113     movsd  [lq+nq], m2
114     movhps [rq+nq], m2
115     add      nq, 8
116     jl .loop
117 .ret:
118     REP_RET
119
120 ;*******************************************************************
121 ;void ff_ps_hybrid_analysis_<opt>(float (*out)[2], float (*in)[2],
122 ;                                 const float (*filter)[8][2],
123 ;                                 int stride, int n);
124 ;*******************************************************************
125 %macro PS_HYBRID_ANALYSIS_LOOP 3
126     movu     %1, [inq+mmsize*%3]
127     movu     m1, [inq+mmsize*(5-%3)+8]
128 %if cpuflag(sse3)
129     pshufd   %2, %1, q2301
130     pshufd   m4, m1, q0123
131     pshufd   m1, m1, q1032
132     pshufd   m2, [filterq+nq+mmsize*%3], q2301
133     addsubps %2, m4
134     addsubps %1, m1
135 %else
136     mova     m2, [filterq+nq+mmsize*%3]
137     mova     %2, %1
138     mova     m4, m1
139     shufps   %2, %2, q2301
140     shufps   m4, m4, q0123
141     shufps   m1, m1, q1032
142     shufps   m2, m2, q2301
143     xorps    m4, m7
144     xorps    m1, m7
145     subps    %2, m4
146     subps    %1, m1
147 %endif
148     mulps    %2, m2
149     mulps    %1, m2
150 %if %3
151     addps    m3, %2
152     addps    m0, %1
153 %endif
154 %endmacro
155
156 %macro PS_HYBRID_ANALYSIS 0
157 cglobal ps_hybrid_analysis, 5, 5, 8, out, in, filter, stride, n
158 %if cpuflag(sse3)
159 %define MOVH movsd
160 %else
161 %define MOVH movlps
162 %endif
163     shl strided, 3
164     shl nd, 6
165     add filterq, nq
166     neg nq
167     mova m7, [ps_p1m1p1m1]
168
169 align 16
170 .loop:
171     PS_HYBRID_ANALYSIS_LOOP m0, m3, 0
172     PS_HYBRID_ANALYSIS_LOOP m5, m6, 1
173     PS_HYBRID_ANALYSIS_LOOP m5, m6, 2
174
175 %if cpuflag(sse3)
176     pshufd   m3, m3, q2301
177     xorps    m0, m7
178     hsubps   m3, m0
179     pshufd   m1, m3, q0020
180     pshufd   m3, m3, q0031
181     addps    m1, m3
182     movsd    m2, [inq+6*8]
183 %else
184     mova     m1, m3
185     mova     m2, m0
186     shufps   m1, m1, q2301
187     shufps   m2, m2, q2301
188     subps    m1, m3
189     addps    m2, m0
190     unpcklps m3, m1, m2
191     unpckhps m1, m2
192     addps    m1, m3
193     movu     m2, [inq+6*8] ; faster than movlps and no risk of overread
194 %endif
195     movss    m3, [filterq+nq+8*6]
196     SPLATD   m3
197     mulps    m2, m3
198     addps    m1, m2
199     MOVH [outq], m1
200     add    outq, strideq
201     add      nq, 64
202     jl .loop
203     REP_RET
204 %endmacro
205
206 INIT_XMM sse
207 PS_HYBRID_ANALYSIS
208 INIT_XMM sse3
209 PS_HYBRID_ANALYSIS