68 #if ARCH_X86_64 && HAVE_AVX2_EXTERNAL
72 extern const int8_t ff_filters_ssse3[3][15][4][32];
73 extern const int16_t ff_filters_sse2[3][15][8][8];
79 #if ARCH_X86_64 && HAVE_AVX2_EXTERNAL
90 #if ARCH_X86_64 && HAVE_AVX2_EXTERNAL
97 #define itxfm_func(typea, typeb, size, opt) \
98 void ff_vp9_##typea##_##typeb##_##size##x##size##_add_##opt(uint8_t *dst, ptrdiff_t stride, \
99 int16_t *block, int eob)
100 #define itxfm_funcs(size, opt) \
101 itxfm_func(idct, idct, size, opt); \
102 itxfm_func(iadst, idct, size, opt); \
103 itxfm_func(idct, iadst, size, opt); \
104 itxfm_func(iadst, iadst, size, opt)
107 itxfm_func(
idct, iadst, 4, sse2);
108 itxfm_func(iadst,
idct, 4, sse2);
109 itxfm_func(iadst, iadst, 4, sse2);
110 itxfm_funcs(4, ssse3);
111 itxfm_funcs(8, sse2);
112 itxfm_funcs(8, ssse3);
114 itxfm_funcs(16, sse2);
115 itxfm_funcs(16, ssse3);
116 itxfm_funcs(16, avx);
120 itxfm_func(iwht, iwht, 4, mmx);
121 itxfm_funcs(16, avx2);
122 itxfm_funcs(16, avx512icl);
124 itxfm_func(
idct,
idct, 32, avx512icl);
129 #define lpf_funcs(size1, size2, opt) \
130 void ff_vp9_loop_filter_v_##size1##_##size2##_##opt(uint8_t *dst, ptrdiff_t stride, \
131 int E, int I, int H); \
132 void ff_vp9_loop_filter_h_##size1##_##size2##_##opt(uint8_t *dst, ptrdiff_t stride, \
135 lpf_funcs(4, 8, mmxext);
136 lpf_funcs(8, 8, mmxext);
137 lpf_funcs(16, 16, sse2);
138 lpf_funcs(16, 16, ssse3);
139 lpf_funcs(16, 16, avx);
140 lpf_funcs(44, 16, sse2);
141 lpf_funcs(44, 16, ssse3);
142 lpf_funcs(44, 16, avx);
143 lpf_funcs(84, 16, sse2);
144 lpf_funcs(84, 16, ssse3);
145 lpf_funcs(84, 16, avx);
146 lpf_funcs(48, 16, sse2);
147 lpf_funcs(48, 16, ssse3);
148 lpf_funcs(48, 16, avx);
149 lpf_funcs(88, 16, sse2);
150 lpf_funcs(88, 16, ssse3);
151 lpf_funcs(88, 16, avx);
155 #define ipred_func(size, type, opt) \
156 void ff_vp9_ipred_##type##_##size##x##size##_##opt(uint8_t *dst, ptrdiff_t stride, \
157 const uint8_t *l, const uint8_t *a)
159 ipred_func(8, v, mmx);
161 #define ipred_dc_funcs(size, opt) \
162 ipred_func(size, dc, opt); \
163 ipred_func(size, dc_left, opt); \
164 ipred_func(size, dc_top, opt)
166 ipred_dc_funcs(4, mmxext);
167 ipred_dc_funcs(8, mmxext);
169 #define ipred_dir_tm_funcs(size, opt) \
170 ipred_func(size, tm, opt); \
171 ipred_func(size, dl, opt); \
172 ipred_func(size, dr, opt); \
173 ipred_func(size, hd, opt); \
174 ipred_func(size, hu, opt); \
175 ipred_func(size, vl, opt); \
176 ipred_func(size, vr, opt)
178 ipred_dir_tm_funcs(4, mmxext);
180 ipred_func(16, v,
sse);
181 ipred_func(32, v,
sse);
183 ipred_dc_funcs(16, sse2);
184 ipred_dc_funcs(32, sse2);
186 #define ipred_dir_tm_h_funcs(size, opt) \
187 ipred_dir_tm_funcs(size, opt); \
188 ipred_func(size, h, opt)
190 ipred_dir_tm_h_funcs(8, sse2);
191 ipred_dir_tm_h_funcs(16, sse2);
192 ipred_dir_tm_h_funcs(32, sse2);
194 ipred_func(4,
h, sse2);
196 #define ipred_all_funcs(size, opt) \
197 ipred_dc_funcs(size, opt); \
198 ipred_dir_tm_h_funcs(size, opt)
201 ipred_all_funcs(4, ssse3);
202 ipred_all_funcs(8, ssse3);
203 ipred_all_funcs(16, ssse3);
204 ipred_all_funcs(32, ssse3);
206 ipred_dir_tm_h_funcs(8, avx);
207 ipred_dir_tm_h_funcs(16, avx);
208 ipred_dir_tm_h_funcs(32, avx);
210 ipred_all_funcs(32, avx2);
211 ipred_func(32, v, avx2);
214 #undef ipred_dir_tm_h_funcs
215 #undef ipred_dir_tm_funcs
216 #undef ipred_dc_funcs
228 }
else if (bpp == 12) {
235 #define init_lpf(opt) do { \
236 dsp->loop_filter_16[0] = ff_vp9_loop_filter_h_16_16_##opt; \
237 dsp->loop_filter_16[1] = ff_vp9_loop_filter_v_16_16_##opt; \
238 dsp->loop_filter_mix2[0][0][0] = ff_vp9_loop_filter_h_44_16_##opt; \
239 dsp->loop_filter_mix2[0][0][1] = ff_vp9_loop_filter_v_44_16_##opt; \
240 dsp->loop_filter_mix2[0][1][0] = ff_vp9_loop_filter_h_48_16_##opt; \
241 dsp->loop_filter_mix2[0][1][1] = ff_vp9_loop_filter_v_48_16_##opt; \
242 dsp->loop_filter_mix2[1][0][0] = ff_vp9_loop_filter_h_84_16_##opt; \
243 dsp->loop_filter_mix2[1][0][1] = ff_vp9_loop_filter_v_84_16_##opt; \
244 dsp->loop_filter_mix2[1][1][0] = ff_vp9_loop_filter_h_88_16_##opt; \
245 dsp->loop_filter_mix2[1][1][1] = ff_vp9_loop_filter_v_88_16_##opt; \
248 #define init_ipred(sz, opt, t, e) \
249 dsp->intra_pred[TX_##sz##X##sz][e##_PRED] = ff_vp9_ipred_##t##_##sz##x##sz##_##opt
251 #define ff_vp9_ipred_hd_4x4_ssse3 ff_vp9_ipred_hd_4x4_mmxext
252 #define ff_vp9_ipred_vl_4x4_ssse3 ff_vp9_ipred_vl_4x4_mmxext
253 #define init_dir_tm_ipred(sz, opt) do { \
254 init_ipred(sz, opt, dl, DIAG_DOWN_LEFT); \
255 init_ipred(sz, opt, dr, DIAG_DOWN_RIGHT); \
256 init_ipred(sz, opt, hd, HOR_DOWN); \
257 init_ipred(sz, opt, vl, VERT_LEFT); \
258 init_ipred(sz, opt, hu, HOR_UP); \
259 init_ipred(sz, opt, tm, TM_VP8); \
260 init_ipred(sz, opt, vr, VERT_RIGHT); \
262 #define init_dir_tm_h_ipred(sz, opt) do { \
263 init_dir_tm_ipred(sz, opt); \
264 init_ipred(sz, opt, h, HOR); \
266 #define init_dc_ipred(sz, opt) do { \
267 init_ipred(sz, opt, dc, DC); \
268 init_ipred(sz, opt, dc_left, LEFT_DC); \
269 init_ipred(sz, opt, dc_top, TOP_DC); \
271 #define init_all_ipred(sz, opt) do { \
272 init_dc_ipred(sz, opt); \
273 init_dir_tm_h_ipred(sz, opt); \
285 init_ipred(8, mmx, v, VERT);
298 init_dc_ipred(4, mmxext);
299 init_dc_ipred(8, mmxext);
300 init_dir_tm_ipred(4, mmxext);
307 init_ipred(16,
sse, v, VERT);
308 init_ipred(32,
sse, v, VERT);
333 init_dc_ipred(16, sse2);
334 init_dc_ipred(32, sse2);
335 init_dir_tm_h_ipred(8, sse2);
336 init_dir_tm_h_ipred(16, sse2);
337 init_dir_tm_h_ipred(32, sse2);
338 init_ipred(4, sse2,
h, HOR);
361 init_all_ipred(4, ssse3);
362 init_all_ipred(8, ssse3);
363 init_all_ipred(16, ssse3);
364 init_all_ipred(32, ssse3);
381 init_dir_tm_h_ipred(8, avx);
382 init_dir_tm_h_ipred(16, avx);
383 init_dir_tm_h_ipred(32, avx);
394 #if ARCH_X86_64 && HAVE_AVX2_EXTERNAL
407 init_all_ipred(32, avx2);
408 init_ipred(32, avx2, v, VERT);