vp9/x86: sse2 MC assembly.
[ffmpeg.git] / libavcodec / x86 / vp9mc.asm
1 ;******************************************************************************
2 ;* VP9 MC SIMD optimizations
3 ;*
4 ;* Copyright (c) 2013 Ronald S. Bultje <rsbultje gmail com>
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 32
26
27 cextern pw_256
28 cextern pw_64
29
30 %macro F8_SSSE3_TAPS 8
31 times 16 db %1, %2
32 times 16 db %3, %4
33 times 16 db %5, %6
34 times 16 db %7, %8
35 %endmacro
36
37 %macro F8_SSE2_TAPS 8
38 times 8 dw %1
39 times 8 dw %2
40 times 8 dw %3
41 times 8 dw %4
42 times 8 dw %5
43 times 8 dw %6
44 times 8 dw %7
45 times 8 dw %8
46 %endmacro
47
48 %macro FILTER 1
49 const filters_%1 ; smooth
50                     F8_TAPS -3, -1,  32,  64,  38,   1, -3,  0
51                     F8_TAPS -2, -2,  29,  63,  41,   2, -3,  0
52                     F8_TAPS -2, -2,  26,  63,  43,   4, -4,  0
53                     F8_TAPS -2, -3,  24,  62,  46,   5, -4,  0
54                     F8_TAPS -2, -3,  21,  60,  49,   7, -4,  0
55                     F8_TAPS -1, -4,  18,  59,  51,   9, -4,  0
56                     F8_TAPS -1, -4,  16,  57,  53,  12, -4, -1
57                     F8_TAPS -1, -4,  14,  55,  55,  14, -4, -1
58                     F8_TAPS -1, -4,  12,  53,  57,  16, -4, -1
59                     F8_TAPS  0, -4,   9,  51,  59,  18, -4, -1
60                     F8_TAPS  0, -4,   7,  49,  60,  21, -3, -2
61                     F8_TAPS  0, -4,   5,  46,  62,  24, -3, -2
62                     F8_TAPS  0, -4,   4,  43,  63,  26, -2, -2
63                     F8_TAPS  0, -3,   2,  41,  63,  29, -2, -2
64                     F8_TAPS  0, -3,   1,  38,  64,  32, -1, -3
65                     ; regular
66                     F8_TAPS  0,  1,  -5, 126,   8,  -3,  1,  0
67                     F8_TAPS -1,  3, -10, 122,  18,  -6,  2,  0
68                     F8_TAPS -1,  4, -13, 118,  27,  -9,  3, -1
69                     F8_TAPS -1,  4, -16, 112,  37, -11,  4, -1
70                     F8_TAPS -1,  5, -18, 105,  48, -14,  4, -1
71                     F8_TAPS -1,  5, -19,  97,  58, -16,  5, -1
72                     F8_TAPS -1,  6, -19,  88,  68, -18,  5, -1
73                     F8_TAPS -1,  6, -19,  78,  78, -19,  6, -1
74                     F8_TAPS -1,  5, -18,  68,  88, -19,  6, -1
75                     F8_TAPS -1,  5, -16,  58,  97, -19,  5, -1
76                     F8_TAPS -1,  4, -14,  48, 105, -18,  5, -1
77                     F8_TAPS -1,  4, -11,  37, 112, -16,  4, -1
78                     F8_TAPS -1,  3,  -9,  27, 118, -13,  4, -1
79                     F8_TAPS  0,  2,  -6,  18, 122, -10,  3, -1
80                     F8_TAPS  0,  1,  -3,   8, 126,  -5,  1,  0
81                     ; sharp
82                     F8_TAPS -1,  3,  -7, 127,   8,  -3,  1,  0
83                     F8_TAPS -2,  5, -13, 125,  17,  -6,  3, -1
84                     F8_TAPS -3,  7, -17, 121,  27, -10,  5, -2
85                     F8_TAPS -4,  9, -20, 115,  37, -13,  6, -2
86                     F8_TAPS -4, 10, -23, 108,  48, -16,  8, -3
87                     F8_TAPS -4, 10, -24, 100,  59, -19,  9, -3
88                     F8_TAPS -4, 11, -24,  90,  70, -21, 10, -4
89                     F8_TAPS -4, 11, -23,  80,  80, -23, 11, -4
90                     F8_TAPS -4, 10, -21,  70,  90, -24, 11, -4
91                     F8_TAPS -3,  9, -19,  59, 100, -24, 10, -4
92                     F8_TAPS -3,  8, -16,  48, 108, -23, 10, -4
93                     F8_TAPS -2,  6, -13,  37, 115, -20,  9, -4
94                     F8_TAPS -2,  5, -10,  27, 121, -17,  7, -3
95                     F8_TAPS -1,  3,  -6,  17, 125, -13,  5, -2
96                     F8_TAPS  0,  1,  -3,   8, 127,  -7,  3, -1
97 %endmacro
98
99 %define F8_TAPS F8_SSSE3_TAPS
100 ; int8_t ff_filters_ssse3[3][15][4][32]
101 FILTER ssse3
102 %define F8_TAPS F8_SSE2_TAPS
103 ; int16_t ff_filters_sse2[3][15][8][8]
104 FILTER sse2
105
106 SECTION .text
107
108 %macro filter_sse2_h_fn 1
109 %assign %%px mmsize/2
110 cglobal vp9_%1_8tap_1d_h_ %+ %%px, 6, 6, 15, dst, dstride, src, sstride, h, filtery
111     pxor        m5, m5
112     mova        m6, [pw_64]
113     mova        m7, [filteryq+  0]
114 %if ARCH_X86_64 && mmsize > 8
115     mova        m8, [filteryq+ 16]
116     mova        m9, [filteryq+ 32]
117     mova       m10, [filteryq+ 48]
118     mova       m11, [filteryq+ 64]
119     mova       m12, [filteryq+ 80]
120     mova       m13, [filteryq+ 96]
121     mova       m14, [filteryq+112]
122 %endif
123 .loop:
124     movh        m0, [srcq-3]
125     movh        m1, [srcq-2]
126     movh        m2, [srcq-1]
127     movh        m3, [srcq+0]
128     movh        m4, [srcq+1]
129     punpcklbw   m0, m5
130     punpcklbw   m1, m5
131     punpcklbw   m2, m5
132     punpcklbw   m3, m5
133     punpcklbw   m4, m5
134     pmullw      m0, m7
135 %if ARCH_X86_64 && mmsize > 8
136     pmullw      m1, m8
137     pmullw      m2, m9
138     pmullw      m3, m10
139     pmullw      m4, m11
140 %else
141     pmullw      m1, [filteryq+ 16]
142     pmullw      m2, [filteryq+ 32]
143     pmullw      m3, [filteryq+ 48]
144     pmullw      m4, [filteryq+ 64]
145 %endif
146     paddw       m0, m1
147     paddw       m2, m3
148     paddw       m0, m4
149     movh        m1, [srcq+2]
150     movh        m3, [srcq+3]
151     movh        m4, [srcq+4]
152     add       srcq, sstrideq
153     punpcklbw   m1, m5
154     punpcklbw   m3, m5
155     punpcklbw   m4, m5
156 %if ARCH_X86_64 && mmsize > 8
157     pmullw      m1, m12
158     pmullw      m3, m13
159     pmullw      m4, m14
160 %else
161     pmullw      m1, [filteryq+ 80]
162     pmullw      m3, [filteryq+ 96]
163     pmullw      m4, [filteryq+112]
164 %endif
165     paddw       m0, m1
166     paddw       m3, m4
167     paddw       m0, m6
168     paddw       m2, m3
169     paddsw      m0, m2
170     psraw       m0, 7
171 %ifidn %1, avg
172     movh        m1, [dstq]
173 %endif
174     packuswb    m0, m0
175 %ifidn %1, avg
176     pavgb       m0, m1
177 %endif
178     movh    [dstq], m0
179     add       dstq, dstrideq
180     dec         hd
181     jg .loop
182     RET
183 %endmacro
184
185 INIT_MMX mmxext
186 filter_sse2_h_fn put
187 filter_sse2_h_fn avg
188
189 INIT_XMM sse2
190 filter_sse2_h_fn put
191 filter_sse2_h_fn avg
192
193 %macro filter_h_fn 1
194 %assign %%px mmsize/2
195 cglobal vp9_%1_8tap_1d_h_ %+ %%px, 6, 6, 11, dst, dstride, src, sstride, h, filtery
196     mova        m6, [pw_256]
197     mova        m7, [filteryq+ 0]
198 %if ARCH_X86_64 && mmsize > 8
199     mova        m8, [filteryq+32]
200     mova        m9, [filteryq+64]
201     mova       m10, [filteryq+96]
202 %endif
203 .loop:
204     movh        m0, [srcq-3]
205     movh        m1, [srcq-2]
206     movh        m2, [srcq-1]
207     movh        m3, [srcq+0]
208     movh        m4, [srcq+1]
209     movh        m5, [srcq+2]
210     punpcklbw   m0, m1
211     punpcklbw   m2, m3
212     movh        m1, [srcq+3]
213     movh        m3, [srcq+4]
214     add       srcq, sstrideq
215     punpcklbw   m4, m5
216     punpcklbw   m1, m3
217     pmaddubsw   m0, m7
218 %if ARCH_X86_64 && mmsize > 8
219     pmaddubsw   m2, m8
220     pmaddubsw   m4, m9
221     pmaddubsw   m1, m10
222 %else
223     pmaddubsw   m2, [filteryq+32]
224     pmaddubsw   m4, [filteryq+64]
225     pmaddubsw   m1, [filteryq+96]
226 %endif
227     paddw       m0, m4
228     paddw       m2, m1
229     paddsw      m0, m2
230     pmulhrsw    m0, m6
231 %ifidn %1, avg
232     movh        m1, [dstq]
233 %endif
234     packuswb    m0, m0
235 %ifidn %1, avg
236     pavgb       m0, m1
237 %endif
238     movh    [dstq], m0
239     add       dstq, dstrideq
240     dec         hd
241     jg .loop
242     RET
243 %endmacro
244
245 INIT_MMX ssse3
246 filter_h_fn put
247 filter_h_fn avg
248
249 INIT_XMM ssse3
250 filter_h_fn put
251 filter_h_fn avg
252
253 %if ARCH_X86_64
254 %macro filter_hx2_fn 1
255 %assign %%px mmsize
256 cglobal vp9_%1_8tap_1d_h_ %+ %%px, 6, 6, 14, dst, dstride, src, sstride, h, filtery
257     mova       m13, [pw_256]
258     mova        m8, [filteryq+ 0]
259     mova        m9, [filteryq+32]
260     mova       m10, [filteryq+64]
261     mova       m11, [filteryq+96]
262 .loop:
263     movu        m0, [srcq-3]
264     movu        m1, [srcq-2]
265     movu        m2, [srcq-1]
266     movu        m3, [srcq+0]
267     movu        m4, [srcq+1]
268     movu        m5, [srcq+2]
269     movu        m6, [srcq+3]
270     movu        m7, [srcq+4]
271     add       srcq, sstrideq
272     SBUTTERFLY  bw, 0, 1, 12
273     SBUTTERFLY  bw, 2, 3, 12
274     SBUTTERFLY  bw, 4, 5, 12
275     SBUTTERFLY  bw, 6, 7, 12
276     pmaddubsw   m0, m8
277     pmaddubsw   m1, m8
278     pmaddubsw   m2, m9
279     pmaddubsw   m3, m9
280     pmaddubsw   m4, m10
281     pmaddubsw   m5, m10
282     pmaddubsw   m6, m11
283     pmaddubsw   m7, m11
284     paddw       m0, m4
285     paddw       m1, m5
286     paddw       m2, m6
287     paddw       m3, m7
288     paddsw      m0, m2
289     paddsw      m1, m3
290     pmulhrsw    m0, m13
291     pmulhrsw    m1, m13
292     packuswb    m0, m1
293 %ifidn %1, avg
294     pavgb       m0, [dstq]
295 %endif
296     mova    [dstq], m0
297     add       dstq, dstrideq
298     dec         hd
299     jg .loop
300     RET
301 %endmacro
302
303 INIT_XMM ssse3
304 filter_hx2_fn put
305 filter_hx2_fn avg
306
307 %if HAVE_AVX2_EXTERNAL
308 INIT_YMM avx2
309 filter_hx2_fn put
310 filter_hx2_fn avg
311 %endif
312
313 %endif ; ARCH_X86_64
314
315 %macro filter_sse2_v_fn 1
316 %assign %%px mmsize/2
317 %if ARCH_X86_64
318 cglobal vp9_%1_8tap_1d_v_ %+ %%px, 6, 8, 15, dst, dstride, src, sstride, h, filtery, src4, sstride3
319 %else
320 cglobal vp9_%1_8tap_1d_v_ %+ %%px, 4, 7, 15, dst, dstride, src, sstride, filtery, src4, sstride3
321     mov   filteryq, r5mp
322 %define hd r4mp
323 %endif
324     pxor        m5, m5
325     mova        m6, [pw_64]
326     lea  sstride3q, [sstrideq*3]
327     lea      src4q, [srcq+sstrideq]
328     sub       srcq, sstride3q
329     mova        m7, [filteryq+  0]
330 %if ARCH_X86_64 && mmsize > 8
331     mova        m8, [filteryq+ 16]
332     mova        m9, [filteryq+ 32]
333     mova       m10, [filteryq+ 48]
334     mova       m11, [filteryq+ 64]
335     mova       m12, [filteryq+ 80]
336     mova       m13, [filteryq+ 96]
337     mova       m14, [filteryq+112]
338 %endif
339 .loop:
340     ; FIXME maybe reuse loads from previous rows, or just
341     ; more generally unroll this to prevent multiple loads of
342     ; the same data?
343     movh        m0, [srcq]
344     movh        m1, [srcq+sstrideq]
345     movh        m2, [srcq+sstrideq*2]
346     movh        m3, [srcq+sstride3q]
347     add       srcq, sstrideq
348     movh        m4, [src4q]
349     punpcklbw   m0, m5
350     punpcklbw   m1, m5
351     punpcklbw   m2, m5
352     punpcklbw   m3, m5
353     punpcklbw   m4, m5
354     pmullw      m0, m7
355 %if ARCH_X86_64 && mmsize > 8
356     pmullw      m1, m8
357     pmullw      m2, m9
358     pmullw      m3, m10
359     pmullw      m4, m11
360 %else
361     pmullw      m1, [filteryq+ 16]
362     pmullw      m2, [filteryq+ 32]
363     pmullw      m3, [filteryq+ 48]
364     pmullw      m4, [filteryq+ 64]
365 %endif
366     paddw       m0, m1
367     paddw       m2, m3
368     paddw       m0, m4
369     movh        m1, [src4q+sstrideq]
370     movh        m3, [src4q+sstrideq*2]
371     movh        m4, [src4q+sstride3q]
372     add      src4q, sstrideq
373     punpcklbw   m1, m5
374     punpcklbw   m3, m5
375     punpcklbw   m4, m5
376 %if ARCH_X86_64 && mmsize > 8
377     pmullw      m1, m12
378     pmullw      m3, m13
379     pmullw      m4, m14
380 %else
381     pmullw      m1, [filteryq+ 80]
382     pmullw      m3, [filteryq+ 96]
383     pmullw      m4, [filteryq+112]
384 %endif
385     paddw       m0, m1
386     paddw       m3, m4
387     paddw       m0, m6
388     paddw       m2, m3
389     paddsw      m0, m2
390     psraw       m0, 7
391 %ifidn %1, avg
392     movh        m1, [dstq]
393 %endif
394     packuswb    m0, m0
395 %ifidn %1, avg
396     pavgb       m0, m1
397 %endif
398     movh    [dstq], m0
399     add       dstq, dstrideq
400     dec         hd
401     jg .loop
402     RET
403 %endmacro
404
405 INIT_MMX mmxext
406 filter_sse2_v_fn put
407 filter_sse2_v_fn avg
408
409 INIT_XMM sse2
410 filter_sse2_v_fn put
411 filter_sse2_v_fn avg
412
413 %macro filter_v_fn 1
414 %assign %%px mmsize/2
415 %if ARCH_X86_64
416 cglobal vp9_%1_8tap_1d_v_ %+ %%px, 6, 8, 11, dst, dstride, src, sstride, h, filtery, src4, sstride3
417 %else
418 cglobal vp9_%1_8tap_1d_v_ %+ %%px, 4, 7, 11, dst, dstride, src, sstride, filtery, src4, sstride3
419     mov   filteryq, r5mp
420 %define hd r4mp
421 %endif
422     mova        m6, [pw_256]
423     lea  sstride3q, [sstrideq*3]
424     lea      src4q, [srcq+sstrideq]
425     sub       srcq, sstride3q
426     mova        m7, [filteryq+ 0]
427 %if ARCH_X86_64 && mmsize > 8
428     mova        m8, [filteryq+32]
429     mova        m9, [filteryq+64]
430     mova       m10, [filteryq+96]
431 %endif
432 .loop:
433     ; FIXME maybe reuse loads from previous rows, or just
434     ; more generally unroll this to prevent multiple loads of
435     ; the same data?
436     movh        m0, [srcq]
437     movh        m1, [srcq+sstrideq]
438     movh        m2, [srcq+sstrideq*2]
439     movh        m3, [srcq+sstride3q]
440     movh        m4, [src4q]
441     movh        m5, [src4q+sstrideq]
442     punpcklbw   m0, m1
443     punpcklbw   m2, m3
444     movh        m1, [src4q+sstrideq*2]
445     movh        m3, [src4q+sstride3q]
446     add       srcq, sstrideq
447     add      src4q, sstrideq
448     punpcklbw   m4, m5
449     punpcklbw   m1, m3
450     pmaddubsw   m0, m7
451 %if ARCH_X86_64 && mmsize > 8
452     pmaddubsw   m2, m8
453     pmaddubsw   m4, m9
454     pmaddubsw   m1, m10
455 %else
456     pmaddubsw   m2, [filteryq+32]
457     pmaddubsw   m4, [filteryq+64]
458     pmaddubsw   m1, [filteryq+96]
459 %endif
460     paddw       m0, m4
461     paddw       m2, m1
462     paddsw      m0, m2
463     pmulhrsw    m0, m6
464 %ifidn %1, avg
465     movh        m1, [dstq]
466 %endif
467     packuswb    m0, m0
468 %ifidn %1, avg
469     pavgb       m0, m1
470 %endif
471     movh    [dstq], m0
472     add       dstq, dstrideq
473     dec         hd
474     jg .loop
475     RET
476 %endmacro
477
478 INIT_MMX ssse3
479 filter_v_fn put
480 filter_v_fn avg
481
482 INIT_XMM ssse3
483 filter_v_fn put
484 filter_v_fn avg
485
486 %if ARCH_X86_64
487
488 %macro filter_vx2_fn 1
489 %assign %%px mmsize
490 cglobal vp9_%1_8tap_1d_v_ %+ %%px, 6, 8, 14, dst, dstride, src, sstride, h, filtery, src4, sstride3
491     mova       m13, [pw_256]
492     lea  sstride3q, [sstrideq*3]
493     lea      src4q, [srcq+sstrideq]
494     sub       srcq, sstride3q
495     mova        m8, [filteryq+ 0]
496     mova        m9, [filteryq+32]
497     mova       m10, [filteryq+64]
498     mova       m11, [filteryq+96]
499 .loop:
500     ; FIXME maybe reuse loads from previous rows, or just
501     ; more generally unroll this to prevent multiple loads of
502     ; the same data?
503     movu        m0, [srcq]
504     movu        m1, [srcq+sstrideq]
505     movu        m2, [srcq+sstrideq*2]
506     movu        m3, [srcq+sstride3q]
507     movu        m4, [src4q]
508     movu        m5, [src4q+sstrideq]
509     movu        m6, [src4q+sstrideq*2]
510     movu        m7, [src4q+sstride3q]
511     add       srcq, sstrideq
512     add      src4q, sstrideq
513     SBUTTERFLY  bw, 0, 1, 12
514     SBUTTERFLY  bw, 2, 3, 12
515     SBUTTERFLY  bw, 4, 5, 12
516     SBUTTERFLY  bw, 6, 7, 12
517     pmaddubsw   m0, m8
518     pmaddubsw   m1, m8
519     pmaddubsw   m2, m9
520     pmaddubsw   m3, m9
521     pmaddubsw   m4, m10
522     pmaddubsw   m5, m10
523     pmaddubsw   m6, m11
524     pmaddubsw   m7, m11
525     paddw       m0, m4
526     paddw       m1, m5
527     paddw       m2, m6
528     paddw       m3, m7
529     paddsw      m0, m2
530     paddsw      m1, m3
531     pmulhrsw    m0, m13
532     pmulhrsw    m1, m13
533     packuswb    m0, m1
534 %ifidn %1, avg
535     pavgb       m0, [dstq]
536 %endif
537     mova    [dstq], m0
538     add       dstq, dstrideq
539     dec         hd
540     jg .loop
541     RET
542 %endmacro
543
544 INIT_XMM ssse3
545 filter_vx2_fn put
546 filter_vx2_fn avg
547
548 %if HAVE_AVX2_EXTERNAL
549 INIT_YMM avx2
550 filter_vx2_fn put
551 filter_vx2_fn avg
552 %endif
553
554 %endif ; ARCH_X86_64
555
556 %macro fpel_fn 6
557 %if %2 == 4
558 %define %%srcfn movh
559 %define %%dstfn movh
560 %else
561 %define %%srcfn movu
562 %define %%dstfn mova
563 %endif
564
565 %if %2 <= mmsize
566 cglobal vp9_%1%2, 5, 7, 4, dst, dstride, src, sstride, h, dstride3, sstride3
567     lea  sstride3q, [sstrideq*3]
568     lea  dstride3q, [dstrideq*3]
569 %else
570 cglobal vp9_%1%2, 5, 5, 4, dst, dstride, src, sstride, h
571 %endif
572 .loop:
573     %%srcfn     m0, [srcq]
574     %%srcfn     m1, [srcq+s%3]
575     %%srcfn     m2, [srcq+s%4]
576     %%srcfn     m3, [srcq+s%5]
577     lea       srcq, [srcq+sstrideq*%6]
578 %ifidn %1, avg
579     pavgb       m0, [dstq]
580     pavgb       m1, [dstq+d%3]
581     pavgb       m2, [dstq+d%4]
582     pavgb       m3, [dstq+d%5]
583 %endif
584     %%dstfn [dstq], m0
585     %%dstfn [dstq+d%3], m1
586     %%dstfn [dstq+d%4], m2
587     %%dstfn [dstq+d%5], m3
588     lea       dstq, [dstq+dstrideq*%6]
589     sub         hd, %6
590     jnz .loop
591     RET
592 %endmacro
593
594 %define d16 16
595 %define s16 16
596 %define d32 32
597 %define s32 32
598 INIT_MMX mmx
599 fpel_fn put, 4,  strideq, strideq*2, stride3q, 4
600 fpel_fn put, 8,  strideq, strideq*2, stride3q, 4
601 INIT_MMX mmxext
602 fpel_fn avg, 4,  strideq, strideq*2, stride3q, 4
603 fpel_fn avg, 8,  strideq, strideq*2, stride3q, 4
604 INIT_XMM sse
605 fpel_fn put, 16, strideq, strideq*2, stride3q, 4
606 fpel_fn put, 32, mmsize,  strideq,   strideq+mmsize, 2
607 fpel_fn put, 64, mmsize,  mmsize*2,  mmsize*3, 1
608 INIT_XMM sse2
609 fpel_fn avg, 16, strideq, strideq*2, stride3q, 4
610 fpel_fn avg, 32, mmsize,  strideq,   strideq+mmsize, 2
611 fpel_fn avg, 64, mmsize,  mmsize*2,  mmsize*3, 1
612 INIT_YMM avx
613 fpel_fn put, 32, strideq, strideq*2, stride3q, 4
614 fpel_fn put, 64, mmsize,  strideq,   strideq+mmsize, 2
615 %if HAVE_AVX2_EXTERNAL
616 INIT_YMM avx2
617 fpel_fn avg, 32, strideq, strideq*2, stride3q, 4
618 fpel_fn avg, 64, mmsize,  strideq,   strideq+mmsize, 2
619 %endif
620 %undef s16
621 %undef d16
622 %undef s32
623 %undef d32