2 * Copyright 2005 Balatoni Denes
3 * Copyright 2006 Loren Merritt
5 * This file is part of FFmpeg.
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.
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.
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
23 #include "attributes.h"
24 #include "float_dsp.h"
27 static void vector_fmul_c(float *dst
, const float *src0
, const float *src1
,
31 for (i
= 0; i
< len
; i
++)
32 dst
[i
] = src0
[i
] * src1
[i
];
35 static void vector_dmul_c(double *dst
, const double *src0
, const double *src1
,
39 for (i
= 0; i
< len
; i
++)
40 dst
[i
] = src0
[i
] * src1
[i
];
43 static void vector_fmac_scalar_c(float *dst
, const float *src
, float mul
,
47 for (i
= 0; i
< len
; i
++)
48 dst
[i
] += src
[i
] * mul
;
51 static void vector_dmac_scalar_c(double *dst
, const double *src
, double mul
,
55 for (i
= 0; i
< len
; i
++)
56 dst
[i
] += src
[i
] * mul
;
59 static void vector_fmul_scalar_c(float *dst
, const float *src
, float mul
,
63 for (i
= 0; i
< len
; i
++)
64 dst
[i
] = src
[i
] * mul
;
67 static void vector_dmul_scalar_c(double *dst
, const double *src
, double mul
,
71 for (i
= 0; i
< len
; i
++)
72 dst
[i
] = src
[i
] * mul
;
75 static void vector_fmul_window_c(float *dst
, const float *src0
,
76 const float *src1
, const float *win
, int len
)
84 for (i
= -len
, j
= len
- 1; i
< 0; i
++, j
--) {
89 dst
[i
] = s0
* wj
- s1
* wi
;
90 dst
[j
] = s0
* wi
+ s1
* wj
;
94 static void vector_fmul_add_c(float *dst
, const float *src0
, const float *src1
,
95 const float *src2
, int len
){
98 for (i
= 0; i
< len
; i
++)
99 dst
[i
] = src0
[i
] * src1
[i
] + src2
[i
];
102 static void vector_fmul_reverse_c(float *dst
, const float *src0
,
103 const float *src1
, int len
)
108 for (i
= 0; i
< len
; i
++)
109 dst
[i
] = src0
[i
] * src1
[-i
];
112 static void butterflies_float_c(float *av_restrict v1
, float *av_restrict v2
,
117 for (i
= 0; i
< len
; i
++) {
118 float t
= v1
[i
] - v2
[i
];
124 float avpriv_scalarproduct_float_c(const float *v1
, const float *v2
, int len
)
129 for (i
= 0; i
< len
; i
++)
135 av_cold AVFloatDSPContext
*avpriv_float_dsp_alloc(int bit_exact
)
137 AVFloatDSPContext
*fdsp
= av_mallocz(sizeof(AVFloatDSPContext
));
141 fdsp
->vector_fmul
= vector_fmul_c
;
142 fdsp
->vector_dmul
= vector_dmul_c
;
143 fdsp
->vector_fmac_scalar
= vector_fmac_scalar_c
;
144 fdsp
->vector_fmul_scalar
= vector_fmul_scalar_c
;
145 fdsp
->vector_dmac_scalar
= vector_dmac_scalar_c
;
146 fdsp
->vector_dmul_scalar
= vector_dmul_scalar_c
;
147 fdsp
->vector_fmul_window
= vector_fmul_window_c
;
148 fdsp
->vector_fmul_add
= vector_fmul_add_c
;
149 fdsp
->vector_fmul_reverse
= vector_fmul_reverse_c
;
150 fdsp
->butterflies_float
= butterflies_float_c
;
151 fdsp
->scalarproduct_float
= avpriv_scalarproduct_float_c
;
154 ff_float_dsp_init_aarch64(fdsp
);
156 ff_float_dsp_init_arm(fdsp
);
158 ff_float_dsp_init_ppc(fdsp
, bit_exact
);
160 ff_float_dsp_init_x86(fdsp
);
162 ff_float_dsp_init_mips(fdsp
);