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