]> git.sesse.net Git - ffmpeg/blob - libavutil/x86/float_dsp.asm
Merge commit '6477139721f559b26eafd415e23e13ea2b0c27e1'
[ffmpeg] / libavutil / x86 / float_dsp.asm
1 ;*****************************************************************************
2 ;* x86-optimized Float DSP functions
3 ;*
4 ;* Copyright 2006 Loren Merritt
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 "x86util.asm"
24
25 SECTION .text
26
27 ;-----------------------------------------------------------------------------
28 ; void vector_fmul(float *dst, const float *src0, const float *src1, int len)
29 ;-----------------------------------------------------------------------------
30 %macro VECTOR_FMUL 0
31 cglobal vector_fmul, 4,4,2, dst, src0, src1, len
32     lea       lenq, [lend*4 - 64]
33 ALIGN 16
34 .loop:
35 %assign a 0
36 %rep 32/mmsize
37     mova      m0,   [src0q + lenq + (a+0)*mmsize]
38     mova      m1,   [src0q + lenq + (a+1)*mmsize]
39     mulps     m0, m0, [src1q + lenq + (a+0)*mmsize]
40     mulps     m1, m1, [src1q + lenq + (a+1)*mmsize]
41     mova      [dstq + lenq + (a+0)*mmsize], m0
42     mova      [dstq + lenq + (a+1)*mmsize], m1
43 %assign a a+2
44 %endrep
45
46     sub       lenq, 64
47     jge       .loop
48     REP_RET
49 %endmacro
50
51 INIT_XMM sse
52 VECTOR_FMUL
53 %if HAVE_AVX_EXTERNAL
54 INIT_YMM avx
55 VECTOR_FMUL
56 %endif
57
58 ;------------------------------------------------------------------------------
59 ; void ff_vector_fmac_scalar(float *dst, const float *src, float mul, int len)
60 ;------------------------------------------------------------------------------
61
62 %macro VECTOR_FMAC_SCALAR 0
63 %if UNIX64
64 cglobal vector_fmac_scalar, 3,3,3, dst, src, len
65 %else
66 cglobal vector_fmac_scalar, 4,4,3, dst, src, mul, len
67 %endif
68 %if ARCH_X86_32
69     VBROADCASTSS m0, mulm
70 %else
71 %if WIN64
72     mova       xmm0, xmm2
73 %endif
74     shufps     xmm0, xmm0, 0
75 %if cpuflag(avx)
76     vinsertf128  m0, m0, xmm0, 1
77 %endif
78 %endif
79     lea    lenq, [lend*4-64]
80 .loop:
81 %assign a 0
82 %rep 32/mmsize
83 %if cpuflag(fma3)
84     mova     m1, [dstq+lenq+(a+0)*mmsize]
85     mova     m2, [dstq+lenq+(a+1)*mmsize]
86     fmaddps  m1, m0, [srcq+lenq+(a+0)*mmsize], m1
87     fmaddps  m2, m0, [srcq+lenq+(a+1)*mmsize], m2
88 %else
89     mulps    m1, m0, [srcq+lenq+(a+0)*mmsize]
90     mulps    m2, m0, [srcq+lenq+(a+1)*mmsize]
91     addps    m1, m1, [dstq+lenq+(a+0)*mmsize]
92     addps    m2, m2, [dstq+lenq+(a+1)*mmsize]
93 %endif
94     mova  [dstq+lenq+(a+0)*mmsize], m1
95     mova  [dstq+lenq+(a+1)*mmsize], m2
96 %assign a a+2
97 %endrep
98     sub    lenq, 64
99     jge .loop
100     REP_RET
101 %endmacro
102
103 INIT_XMM sse
104 VECTOR_FMAC_SCALAR
105 %if HAVE_AVX_EXTERNAL
106 INIT_YMM avx
107 VECTOR_FMAC_SCALAR
108 %endif
109 %if HAVE_FMA3_EXTERNAL
110 INIT_YMM fma3
111 VECTOR_FMAC_SCALAR
112 %endif
113
114 ;------------------------------------------------------------------------------
115 ; void ff_vector_fmul_scalar(float *dst, const float *src, float mul, int len)
116 ;------------------------------------------------------------------------------
117
118 %macro VECTOR_FMUL_SCALAR 0
119 %if UNIX64
120 cglobal vector_fmul_scalar, 3,3,2, dst, src, len
121 %else
122 cglobal vector_fmul_scalar, 4,4,3, dst, src, mul, len
123 %endif
124 %if ARCH_X86_32
125     movss    m0, mulm
126 %elif WIN64
127     SWAP 0, 2
128 %endif
129     shufps   m0, m0, 0
130     lea    lenq, [lend*4-mmsize]
131 .loop:
132     mova     m1, [srcq+lenq]
133     mulps    m1, m0
134     mova  [dstq+lenq], m1
135     sub    lenq, mmsize
136     jge .loop
137     REP_RET
138 %endmacro
139
140 INIT_XMM sse
141 VECTOR_FMUL_SCALAR
142
143 ;------------------------------------------------------------------------------
144 ; void ff_vector_dmul_scalar(double *dst, const double *src, double mul,
145 ;                            int len)
146 ;------------------------------------------------------------------------------
147
148 %macro VECTOR_DMUL_SCALAR 0
149 %if ARCH_X86_32
150 cglobal vector_dmul_scalar, 3,4,3, dst, src, mul, len, lenaddr
151     mov          lenq, lenaddrm
152 %elif UNIX64
153 cglobal vector_dmul_scalar, 3,3,3, dst, src, len
154 %else
155 cglobal vector_dmul_scalar, 4,4,3, dst, src, mul, len
156 %endif
157 %if ARCH_X86_32
158     VBROADCASTSD   m0, mulm
159 %else
160 %if WIN64
161     movlhps      xmm2, xmm2
162 %if cpuflag(avx)
163     vinsertf128  ymm2, ymm2, xmm2, 1
164 %endif
165     SWAP 0, 2
166 %else
167     movlhps      xmm0, xmm0
168 %if cpuflag(avx)
169     vinsertf128  ymm0, ymm0, xmm0, 1
170 %endif
171 %endif
172 %endif
173     lea          lenq, [lend*8-2*mmsize]
174 .loop:
175     mulpd          m1, m0, [srcq+lenq       ]
176     mulpd          m2, m0, [srcq+lenq+mmsize]
177     mova   [dstq+lenq       ], m1
178     mova   [dstq+lenq+mmsize], m2
179     sub          lenq, 2*mmsize
180     jge .loop
181     REP_RET
182 %endmacro
183
184 INIT_XMM sse2
185 VECTOR_DMUL_SCALAR
186 %if HAVE_AVX_EXTERNAL
187 INIT_YMM avx
188 VECTOR_DMUL_SCALAR
189 %endif
190
191 ;-----------------------------------------------------------------------------
192 ; vector_fmul_add(float *dst, const float *src0, const float *src1,
193 ;                 const float *src2, int len)
194 ;-----------------------------------------------------------------------------
195 %macro VECTOR_FMUL_ADD 0
196 cglobal vector_fmul_add, 5,5,4, dst, src0, src1, src2, len
197     lea       lenq, [lend*4 - 2*mmsize]
198 ALIGN 16
199 .loop:
200     mova    m0,   [src0q + lenq]
201     mova    m1,   [src0q + lenq + mmsize]
202 %if cpuflag(fma3)
203     mova    m2,     [src2q + lenq]
204     mova    m3,     [src2q + lenq + mmsize]
205     fmaddps m0, m0, [src1q + lenq], m2
206     fmaddps m1, m1, [src1q + lenq + mmsize], m3
207 %else
208     mulps   m0, m0, [src1q + lenq]
209     mulps   m1, m1, [src1q + lenq + mmsize]
210     addps   m0, m0, [src2q + lenq]
211     addps   m1, m1, [src2q + lenq + mmsize]
212 %endif
213     mova    [dstq + lenq], m0
214     mova    [dstq + lenq + mmsize], m1
215
216     sub     lenq,   2*mmsize
217     jge     .loop
218     REP_RET
219 %endmacro
220
221 INIT_XMM sse
222 VECTOR_FMUL_ADD
223 %if HAVE_AVX_EXTERNAL
224 INIT_YMM avx
225 VECTOR_FMUL_ADD
226 %endif
227 %if HAVE_FMA3_EXTERNAL
228 INIT_YMM fma3
229 VECTOR_FMUL_ADD
230 %endif
231
232 ;-----------------------------------------------------------------------------
233 ; void vector_fmul_reverse(float *dst, const float *src0, const float *src1,
234 ;                          int len)
235 ;-----------------------------------------------------------------------------
236 %macro VECTOR_FMUL_REVERSE 0
237 cglobal vector_fmul_reverse, 4,4,2, dst, src0, src1, len
238     lea       lenq, [lend*4 - 2*mmsize]
239 ALIGN 16
240 .loop:
241 %if cpuflag(avx)
242     vmovaps     xmm0, [src1q + 16]
243     vinsertf128 m0, m0, [src1q], 1
244     vshufps     m0, m0, m0, q0123
245     vmovaps     xmm1, [src1q + mmsize + 16]
246     vinsertf128 m1, m1, [src1q + mmsize], 1
247     vshufps     m1, m1, m1, q0123
248 %else
249     mova    m0, [src1q]
250     mova    m1, [src1q + mmsize]
251     shufps  m0, m0, q0123
252     shufps  m1, m1, q0123
253 %endif
254     mulps   m0, m0, [src0q + lenq + mmsize]
255     mulps   m1, m1, [src0q + lenq]
256     mova    [dstq + lenq + mmsize], m0
257     mova    [dstq + lenq], m1
258     add     src1q, 2*mmsize
259     sub     lenq,  2*mmsize
260     jge     .loop
261     REP_RET
262 %endmacro
263
264 INIT_XMM sse
265 VECTOR_FMUL_REVERSE
266 %if HAVE_AVX_EXTERNAL
267 INIT_YMM avx
268 VECTOR_FMUL_REVERSE
269 %endif
270
271 ; float scalarproduct_float_sse(const float *v1, const float *v2, int len)
272 INIT_XMM sse
273 cglobal scalarproduct_float, 3,3,2, v1, v2, offset
274     neg   offsetq
275     shl   offsetq, 2
276     sub       v1q, offsetq
277     sub       v2q, offsetq
278     xorps    xmm0, xmm0
279 .loop:
280     movaps   xmm1, [v1q+offsetq]
281     mulps    xmm1, [v2q+offsetq]
282     addps    xmm0, xmm1
283     add   offsetq, 16
284     js .loop
285     movhlps  xmm1, xmm0
286     addps    xmm0, xmm1
287     movss    xmm1, xmm0
288     shufps   xmm0, xmm0, 1
289     addss    xmm0, xmm1
290 %if ARCH_X86_64 == 0
291     movss     r0m,  xmm0
292     fld dword r0m
293 %endif
294     RET
295
296 ;-----------------------------------------------------------------------------
297 ; void ff_butterflies_float(float *src0, float *src1, int len);
298 ;-----------------------------------------------------------------------------
299 INIT_XMM sse
300 cglobal butterflies_float, 3,3,3, src0, src1, len
301 %if ARCH_X86_64
302     movsxd    lenq, lend
303 %endif
304     test      lenq, lenq
305     jz .end
306     shl       lenq, 2
307     add      src0q, lenq
308     add      src1q, lenq
309     neg       lenq
310 .loop:
311     mova        m0, [src0q + lenq]
312     mova        m1, [src1q + lenq]
313     subps       m2, m0, m1
314     addps       m0, m0, m1
315     mova        [src1q + lenq], m2
316     mova        [src0q + lenq], m0
317     add       lenq, mmsize
318     jl .loop
319 .end:
320     REP_RET