LCOV - code coverage report
Current view: top level - libavcodec/x86 - vp9dsp_init.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 147 147 100.0 %
Date: 2017-10-18 21:45:51 Functions: 241 241 100.0 %

          Line data    Source code
       1             : /*
       2             :  * VP9 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/attributes.h"
      24             : #include "libavutil/cpu.h"
      25             : #include "libavutil/mem.h"
      26             : #include "libavutil/x86/cpu.h"
      27             : #include "libavcodec/vp9dsp.h"
      28             : #include "libavcodec/x86/vp9dsp_init.h"
      29             : 
      30             : #if HAVE_X86ASM
      31             : 
      32             : decl_fpel_func(put,  4,   , mmx);
      33             : decl_fpel_func(put,  8,   , mmx);
      34             : decl_fpel_func(put, 16,   , sse);
      35             : decl_fpel_func(put, 32,   , sse);
      36             : decl_fpel_func(put, 64,   , sse);
      37             : decl_fpel_func(avg,  4, _8, mmxext);
      38             : decl_fpel_func(avg,  8, _8, mmxext);
      39             : decl_fpel_func(avg, 16, _8, sse2);
      40             : decl_fpel_func(avg, 32, _8, sse2);
      41             : decl_fpel_func(avg, 64, _8, sse2);
      42             : decl_fpel_func(put, 32,   , avx);
      43             : decl_fpel_func(put, 64,   , avx);
      44             : decl_fpel_func(avg, 32, _8, avx2);
      45             : decl_fpel_func(avg, 64, _8, avx2);
      46             : 
      47             : decl_mc_funcs(4, mmxext, int16_t, 8, 8);
      48             : decl_mc_funcs(8, sse2, int16_t,  8, 8);
      49             : decl_mc_funcs(4, ssse3, int8_t, 32, 8);
      50             : decl_mc_funcs(8, ssse3, int8_t, 32, 8);
      51             : #if ARCH_X86_64
      52             : decl_mc_funcs(16, ssse3, int8_t, 32, 8);
      53             : decl_mc_funcs(32, avx2, int8_t, 32, 8);
      54             : #endif
      55             : 
      56         336 : mc_rep_funcs(16,  8,  8,  sse2, int16_t,  8, 8)
      57             : #if ARCH_X86_32
      58             : mc_rep_funcs(16,  8,  8, ssse3, int8_t,  32, 8)
      59             : #endif
      60         144 : mc_rep_funcs(32, 16, 16, sse2,  int16_t,  8, 8)
      61         144 : mc_rep_funcs(32, 16, 16, ssse3, int8_t,  32, 8)
      62          48 : mc_rep_funcs(64, 32, 32, sse2,  int16_t,  8, 8)
      63          48 : mc_rep_funcs(64, 32, 32, ssse3, int8_t,  32, 8)
      64             : #if ARCH_X86_64 && HAVE_AVX2_EXTERNAL
      65          24 : mc_rep_funcs(64, 32, 32, avx2,  int8_t,  32, 8)
      66             : #endif
      67             : 
      68             : extern const int8_t ff_filters_ssse3[3][15][4][32];
      69             : extern const int16_t ff_filters_sse2[3][15][8][8];
      70             : 
      71          30 : filters_8tap_2d_fn2(put, 16, 8, 1, mmxext, sse2, sse2)
      72          30 : filters_8tap_2d_fn2(avg, 16, 8, 1, mmxext, sse2, sse2)
      73          21 : filters_8tap_2d_fn2(put, 16, 8, 1, ssse3, ssse3, ssse3)
      74          21 : filters_8tap_2d_fn2(avg, 16, 8, 1, ssse3, ssse3, ssse3)
      75             : #if ARCH_X86_64 && HAVE_AVX2_EXTERNAL
      76           3 : filters_8tap_2d_fn(put, 64, 32, 8, 1, avx2, ssse3)
      77           3 : filters_8tap_2d_fn(put, 32, 32, 8, 1, avx2, ssse3)
      78           3 : filters_8tap_2d_fn(avg, 64, 32, 8, 1, avx2, ssse3)
      79           3 : filters_8tap_2d_fn(avg, 32, 32, 8, 1, avx2, ssse3)
      80             : #endif
      81             : 
      82          60 : filters_8tap_1d_fn3(put, 8, mmxext, sse2, sse2)
      83          60 : filters_8tap_1d_fn3(avg, 8, mmxext, sse2, sse2)
      84          42 : filters_8tap_1d_fn3(put, 8, ssse3, ssse3, ssse3)
      85          42 : filters_8tap_1d_fn3(avg, 8, ssse3, ssse3, ssse3)
      86             : #if ARCH_X86_64 && HAVE_AVX2_EXTERNAL
      87           6 : filters_8tap_1d_fn2(put, 64, 8, avx2, ssse3)
      88           6 : filters_8tap_1d_fn2(put, 32, 8, avx2, ssse3)
      89           6 : filters_8tap_1d_fn2(avg, 64, 8, avx2, ssse3)
      90           6 : filters_8tap_1d_fn2(avg, 32, 8, avx2, ssse3)
      91             : #endif
      92             : 
      93             : #define itxfm_func(typea, typeb, size, opt) \
      94             : void ff_vp9_##typea##_##typeb##_##size##x##size##_add_##opt(uint8_t *dst, ptrdiff_t stride, \
      95             :                                                             int16_t *block, int eob)
      96             : #define itxfm_funcs(size, opt) \
      97             : itxfm_func(idct,  idct,  size, opt); \
      98             : itxfm_func(iadst, idct,  size, opt); \
      99             : itxfm_func(idct,  iadst, size, opt); \
     100             : itxfm_func(iadst, iadst, size, opt)
     101             : 
     102             : itxfm_func(idct,  idct,  4, mmxext);
     103             : itxfm_func(idct,  iadst, 4, sse2);
     104             : itxfm_func(iadst, idct,  4, sse2);
     105             : itxfm_func(iadst, iadst, 4, sse2);
     106             : itxfm_funcs(4, ssse3);
     107             : itxfm_funcs(8, sse2);
     108             : itxfm_funcs(8, ssse3);
     109             : itxfm_funcs(8, avx);
     110             : itxfm_funcs(16, sse2);
     111             : itxfm_funcs(16, ssse3);
     112             : itxfm_funcs(16, avx);
     113             : itxfm_func(idct, idct, 32, sse2);
     114             : itxfm_func(idct, idct, 32, ssse3);
     115             : itxfm_func(idct, idct, 32, avx);
     116             : itxfm_func(iwht, iwht, 4, mmx);
     117             : itxfm_funcs(16, avx2);
     118             : itxfm_func(idct, idct, 32, avx2);
     119             : 
     120             : #undef itxfm_func
     121             : #undef itxfm_funcs
     122             : 
     123             : #define lpf_funcs(size1, size2, opt) \
     124             : void ff_vp9_loop_filter_v_##size1##_##size2##_##opt(uint8_t *dst, ptrdiff_t stride, \
     125             :                                                     int E, int I, int H); \
     126             : void ff_vp9_loop_filter_h_##size1##_##size2##_##opt(uint8_t *dst, ptrdiff_t stride, \
     127             :                                                     int E, int I, int H)
     128             : 
     129             : lpf_funcs(4, 8, mmxext);
     130             : lpf_funcs(8, 8, mmxext);
     131             : lpf_funcs(16, 16, sse2);
     132             : lpf_funcs(16, 16, ssse3);
     133             : lpf_funcs(16, 16, avx);
     134             : lpf_funcs(44, 16, sse2);
     135             : lpf_funcs(44, 16, ssse3);
     136             : lpf_funcs(44, 16, avx);
     137             : lpf_funcs(84, 16, sse2);
     138             : lpf_funcs(84, 16, ssse3);
     139             : lpf_funcs(84, 16, avx);
     140             : lpf_funcs(48, 16, sse2);
     141             : lpf_funcs(48, 16, ssse3);
     142             : lpf_funcs(48, 16, avx);
     143             : lpf_funcs(88, 16, sse2);
     144             : lpf_funcs(88, 16, ssse3);
     145             : lpf_funcs(88, 16, avx);
     146             : 
     147             : #undef lpf_funcs
     148             : 
     149             : #define ipred_func(size, type, opt) \
     150             : void ff_vp9_ipred_##type##_##size##x##size##_##opt(uint8_t *dst, ptrdiff_t stride, \
     151             :                                                    const uint8_t *l, const uint8_t *a)
     152             : 
     153             : ipred_func(8, v, mmx);
     154             : 
     155             : #define ipred_dc_funcs(size, opt) \
     156             : ipred_func(size, dc, opt); \
     157             : ipred_func(size, dc_left, opt); \
     158             : ipred_func(size, dc_top, opt)
     159             : 
     160             : ipred_dc_funcs(4, mmxext);
     161             : ipred_dc_funcs(8, mmxext);
     162             : 
     163             : #define ipred_dir_tm_funcs(size, opt) \
     164             : ipred_func(size, tm, opt); \
     165             : ipred_func(size, dl, opt); \
     166             : ipred_func(size, dr, opt); \
     167             : ipred_func(size, hd, opt); \
     168             : ipred_func(size, hu, opt); \
     169             : ipred_func(size, vl, opt); \
     170             : ipred_func(size, vr, opt)
     171             : 
     172             : ipred_dir_tm_funcs(4, mmxext);
     173             : 
     174             : ipred_func(16, v, sse);
     175             : ipred_func(32, v, sse);
     176             : 
     177             : ipred_dc_funcs(16, sse2);
     178             : ipred_dc_funcs(32, sse2);
     179             : 
     180             : #define ipred_dir_tm_h_funcs(size, opt) \
     181             : ipred_dir_tm_funcs(size, opt); \
     182             : ipred_func(size, h, opt)
     183             : 
     184             : ipred_dir_tm_h_funcs(8, sse2);
     185             : ipred_dir_tm_h_funcs(16, sse2);
     186             : ipred_dir_tm_h_funcs(32, sse2);
     187             : 
     188             : ipred_func(4, h, sse2);
     189             : 
     190             : #define ipred_all_funcs(size, opt) \
     191             : ipred_dc_funcs(size, opt); \
     192             : ipred_dir_tm_h_funcs(size, opt)
     193             : 
     194             : // FIXME hd/vl_4x4_ssse3 does not exist
     195             : ipred_all_funcs(4, ssse3);
     196             : ipred_all_funcs(8, ssse3);
     197             : ipred_all_funcs(16, ssse3);
     198             : ipred_all_funcs(32, ssse3);
     199             : 
     200             : ipred_dir_tm_h_funcs(8, avx);
     201             : ipred_dir_tm_h_funcs(16, avx);
     202             : ipred_dir_tm_h_funcs(32, avx);
     203             : 
     204             : ipred_func(32, v, avx);
     205             : 
     206             : ipred_dc_funcs(32, avx2);
     207             : ipred_func(32, h, avx2);
     208             : ipred_func(32, tm, avx2);
     209             : 
     210             : #undef ipred_func
     211             : #undef ipred_dir_tm_h_funcs
     212             : #undef ipred_dir_tm_funcs
     213             : #undef ipred_dc_funcs
     214             : 
     215             : #endif /* HAVE_X86ASM */
     216             : 
     217         646 : av_cold void ff_vp9dsp_init_x86(VP9DSPContext *dsp, int bpp, int bitexact)
     218             : {
     219             : #if HAVE_X86ASM
     220             :     int cpu_flags;
     221             : 
     222         646 :     if (bpp == 10) {
     223          73 :         ff_vp9dsp_init_10bpp_x86(dsp, bitexact);
     224          73 :         return;
     225         573 :     } else if (bpp == 12) {
     226          73 :         ff_vp9dsp_init_12bpp_x86(dsp, bitexact);
     227          73 :         return;
     228             :     }
     229             : 
     230         500 :     cpu_flags = av_get_cpu_flags();
     231             : 
     232             : #define init_lpf(opt) do { \
     233             :     dsp->loop_filter_16[0] = ff_vp9_loop_filter_h_16_16_##opt; \
     234             :     dsp->loop_filter_16[1] = ff_vp9_loop_filter_v_16_16_##opt; \
     235             :     dsp->loop_filter_mix2[0][0][0] = ff_vp9_loop_filter_h_44_16_##opt; \
     236             :     dsp->loop_filter_mix2[0][0][1] = ff_vp9_loop_filter_v_44_16_##opt; \
     237             :     dsp->loop_filter_mix2[0][1][0] = ff_vp9_loop_filter_h_48_16_##opt; \
     238             :     dsp->loop_filter_mix2[0][1][1] = ff_vp9_loop_filter_v_48_16_##opt; \
     239             :     dsp->loop_filter_mix2[1][0][0] = ff_vp9_loop_filter_h_84_16_##opt; \
     240             :     dsp->loop_filter_mix2[1][0][1] = ff_vp9_loop_filter_v_84_16_##opt; \
     241             :     dsp->loop_filter_mix2[1][1][0] = ff_vp9_loop_filter_h_88_16_##opt; \
     242             :     dsp->loop_filter_mix2[1][1][1] = ff_vp9_loop_filter_v_88_16_##opt; \
     243             : } while (0)
     244             : 
     245             : #define init_ipred(sz, opt, t, e) \
     246             :     dsp->intra_pred[TX_##sz##X##sz][e##_PRED] = ff_vp9_ipred_##t##_##sz##x##sz##_##opt
     247             : 
     248             : #define ff_vp9_ipred_hd_4x4_ssse3 ff_vp9_ipred_hd_4x4_mmxext
     249             : #define ff_vp9_ipred_vl_4x4_ssse3 ff_vp9_ipred_vl_4x4_mmxext
     250             : #define init_dir_tm_ipred(sz, opt) do { \
     251             :     init_ipred(sz, opt, dl, DIAG_DOWN_LEFT); \
     252             :     init_ipred(sz, opt, dr, DIAG_DOWN_RIGHT); \
     253             :     init_ipred(sz, opt, hd, HOR_DOWN); \
     254             :     init_ipred(sz, opt, vl, VERT_LEFT); \
     255             :     init_ipred(sz, opt, hu, HOR_UP); \
     256             :     init_ipred(sz, opt, tm, TM_VP8); \
     257             :     init_ipred(sz, opt, vr, VERT_RIGHT); \
     258             : } while (0)
     259             : #define init_dir_tm_h_ipred(sz, opt) do { \
     260             :     init_dir_tm_ipred(sz, opt); \
     261             :     init_ipred(sz, opt, h,  HOR); \
     262             : } while (0)
     263             : #define init_dc_ipred(sz, opt) do { \
     264             :     init_ipred(sz, opt, dc,      DC); \
     265             :     init_ipred(sz, opt, dc_left, LEFT_DC); \
     266             :     init_ipred(sz, opt, dc_top,  TOP_DC); \
     267             : } while (0)
     268             : #define init_all_ipred(sz, opt) do { \
     269             :     init_dc_ipred(sz, opt); \
     270             :     init_dir_tm_h_ipred(sz, opt); \
     271             : } while (0)
     272             : 
     273         500 :     if (EXTERNAL_MMX(cpu_flags)) {
     274          60 :         init_fpel_func(4, 0,  4, put, , mmx);
     275          60 :         init_fpel_func(3, 0,  8, put, , mmx);
     276          60 :         if (!bitexact) {
     277          60 :             dsp->itxfm_add[4 /* lossless */][DCT_DCT] =
     278          60 :             dsp->itxfm_add[4 /* lossless */][ADST_DCT] =
     279          60 :             dsp->itxfm_add[4 /* lossless */][DCT_ADST] =
     280          60 :             dsp->itxfm_add[4 /* lossless */][ADST_ADST] = ff_vp9_iwht_iwht_4x4_add_mmx;
     281             :         }
     282          60 :         init_ipred(8, mmx, v, VERT);
     283             :     }
     284             : 
     285         500 :     if (EXTERNAL_MMXEXT(cpu_flags)) {
     286          55 :         dsp->loop_filter_8[0][0] = ff_vp9_loop_filter_h_4_8_mmxext;
     287          55 :         dsp->loop_filter_8[0][1] = ff_vp9_loop_filter_v_4_8_mmxext;
     288          55 :         dsp->loop_filter_8[1][0] = ff_vp9_loop_filter_h_8_8_mmxext;
     289          55 :         dsp->loop_filter_8[1][1] = ff_vp9_loop_filter_v_8_8_mmxext;
     290          55 :         init_subpel2(4, 0, 4, put, 8, mmxext);
     291          55 :         init_subpel2(4, 1, 4, avg, 8, mmxext);
     292          55 :         init_fpel_func(4, 1,  4, avg, _8, mmxext);
     293          55 :         init_fpel_func(3, 1,  8, avg, _8, mmxext);
     294          55 :         dsp->itxfm_add[TX_4X4][DCT_DCT] = ff_vp9_idct_idct_4x4_add_mmxext;
     295          55 :         init_dc_ipred(4, mmxext);
     296          55 :         init_dc_ipred(8, mmxext);
     297          55 :         init_dir_tm_ipred(4, mmxext);
     298             :     }
     299             : 
     300         500 :     if (EXTERNAL_SSE(cpu_flags)) {
     301          50 :         init_fpel_func(2, 0, 16, put, , sse);
     302          50 :         init_fpel_func(1, 0, 32, put, , sse);
     303          50 :         init_fpel_func(0, 0, 64, put, , sse);
     304          50 :         init_ipred(16, sse, v, VERT);
     305          50 :         init_ipred(32, sse, v, VERT);
     306             :     }
     307             : 
     308         500 :     if (EXTERNAL_SSE2(cpu_flags)) {
     309          45 :         init_subpel3_8to64(0, put, 8, sse2);
     310          45 :         init_subpel3_8to64(1, avg, 8, sse2);
     311          45 :         init_fpel_func(2, 1, 16, avg,  _8, sse2);
     312          45 :         init_fpel_func(1, 1, 32, avg,  _8, sse2);
     313          45 :         init_fpel_func(0, 1, 64, avg,  _8, sse2);
     314          45 :         init_lpf(sse2);
     315          45 :         dsp->itxfm_add[TX_4X4][ADST_DCT]  = ff_vp9_idct_iadst_4x4_add_sse2;
     316          45 :         dsp->itxfm_add[TX_4X4][DCT_ADST]  = ff_vp9_iadst_idct_4x4_add_sse2;
     317          45 :         dsp->itxfm_add[TX_4X4][ADST_ADST] = ff_vp9_iadst_iadst_4x4_add_sse2;
     318          45 :         dsp->itxfm_add[TX_8X8][DCT_DCT] = ff_vp9_idct_idct_8x8_add_sse2;
     319          45 :         dsp->itxfm_add[TX_8X8][ADST_DCT]  = ff_vp9_idct_iadst_8x8_add_sse2;
     320          45 :         dsp->itxfm_add[TX_8X8][DCT_ADST]  = ff_vp9_iadst_idct_8x8_add_sse2;
     321          45 :         dsp->itxfm_add[TX_8X8][ADST_ADST] = ff_vp9_iadst_iadst_8x8_add_sse2;
     322          45 :         dsp->itxfm_add[TX_16X16][DCT_DCT]   = ff_vp9_idct_idct_16x16_add_sse2;
     323          45 :         dsp->itxfm_add[TX_16X16][ADST_DCT]  = ff_vp9_idct_iadst_16x16_add_sse2;
     324          45 :         dsp->itxfm_add[TX_16X16][DCT_ADST]  = ff_vp9_iadst_idct_16x16_add_sse2;
     325          45 :         dsp->itxfm_add[TX_16X16][ADST_ADST] = ff_vp9_iadst_iadst_16x16_add_sse2;
     326          45 :         dsp->itxfm_add[TX_32X32][ADST_ADST] =
     327          45 :         dsp->itxfm_add[TX_32X32][ADST_DCT] =
     328          45 :         dsp->itxfm_add[TX_32X32][DCT_ADST] =
     329          45 :         dsp->itxfm_add[TX_32X32][DCT_DCT] = ff_vp9_idct_idct_32x32_add_sse2;
     330          45 :         init_dc_ipred(16, sse2);
     331          45 :         init_dc_ipred(32, sse2);
     332          45 :         init_dir_tm_h_ipred(8, sse2);
     333          45 :         init_dir_tm_h_ipred(16, sse2);
     334          45 :         init_dir_tm_h_ipred(32, sse2);
     335          45 :         init_ipred(4, sse2, h, HOR);
     336             :     }
     337             : 
     338         500 :     if (EXTERNAL_SSSE3(cpu_flags)) {
     339          35 :         init_subpel3(0, put, 8, ssse3);
     340          35 :         init_subpel3(1, avg, 8, ssse3);
     341          35 :         dsp->itxfm_add[TX_4X4][DCT_DCT] = ff_vp9_idct_idct_4x4_add_ssse3;
     342          35 :         dsp->itxfm_add[TX_4X4][ADST_DCT]  = ff_vp9_idct_iadst_4x4_add_ssse3;
     343          35 :         dsp->itxfm_add[TX_4X4][DCT_ADST]  = ff_vp9_iadst_idct_4x4_add_ssse3;
     344          35 :         dsp->itxfm_add[TX_4X4][ADST_ADST] = ff_vp9_iadst_iadst_4x4_add_ssse3;
     345          35 :         dsp->itxfm_add[TX_8X8][DCT_DCT] = ff_vp9_idct_idct_8x8_add_ssse3;
     346          35 :         dsp->itxfm_add[TX_8X8][ADST_DCT]  = ff_vp9_idct_iadst_8x8_add_ssse3;
     347          35 :         dsp->itxfm_add[TX_8X8][DCT_ADST]  = ff_vp9_iadst_idct_8x8_add_ssse3;
     348          35 :         dsp->itxfm_add[TX_8X8][ADST_ADST] = ff_vp9_iadst_iadst_8x8_add_ssse3;
     349          35 :         dsp->itxfm_add[TX_16X16][DCT_DCT]   = ff_vp9_idct_idct_16x16_add_ssse3;
     350          35 :         dsp->itxfm_add[TX_16X16][ADST_DCT]  = ff_vp9_idct_iadst_16x16_add_ssse3;
     351          35 :         dsp->itxfm_add[TX_16X16][DCT_ADST]  = ff_vp9_iadst_idct_16x16_add_ssse3;
     352          35 :         dsp->itxfm_add[TX_16X16][ADST_ADST] = ff_vp9_iadst_iadst_16x16_add_ssse3;
     353          35 :         dsp->itxfm_add[TX_32X32][ADST_ADST] =
     354          35 :         dsp->itxfm_add[TX_32X32][ADST_DCT] =
     355          35 :         dsp->itxfm_add[TX_32X32][DCT_ADST] =
     356          35 :         dsp->itxfm_add[TX_32X32][DCT_DCT] = ff_vp9_idct_idct_32x32_add_ssse3;
     357          35 :         init_lpf(ssse3);
     358          35 :         init_all_ipred(4, ssse3);
     359          35 :         init_all_ipred(8, ssse3);
     360          35 :         init_all_ipred(16, ssse3);
     361          35 :         init_all_ipred(32, ssse3);
     362             :     }
     363             : 
     364         500 :     if (EXTERNAL_AVX(cpu_flags)) {
     365          15 :         dsp->itxfm_add[TX_8X8][DCT_DCT] = ff_vp9_idct_idct_8x8_add_avx;
     366          15 :         dsp->itxfm_add[TX_8X8][ADST_DCT]  = ff_vp9_idct_iadst_8x8_add_avx;
     367          15 :         dsp->itxfm_add[TX_8X8][DCT_ADST]  = ff_vp9_iadst_idct_8x8_add_avx;
     368          15 :         dsp->itxfm_add[TX_8X8][ADST_ADST] = ff_vp9_iadst_iadst_8x8_add_avx;
     369          15 :         dsp->itxfm_add[TX_16X16][DCT_DCT] = ff_vp9_idct_idct_16x16_add_avx;
     370          15 :         dsp->itxfm_add[TX_16X16][ADST_DCT]  = ff_vp9_idct_iadst_16x16_add_avx;
     371          15 :         dsp->itxfm_add[TX_16X16][DCT_ADST]  = ff_vp9_iadst_idct_16x16_add_avx;
     372          15 :         dsp->itxfm_add[TX_16X16][ADST_ADST] = ff_vp9_iadst_iadst_16x16_add_avx;
     373          15 :         dsp->itxfm_add[TX_32X32][ADST_ADST] =
     374          15 :         dsp->itxfm_add[TX_32X32][ADST_DCT] =
     375          15 :         dsp->itxfm_add[TX_32X32][DCT_ADST] =
     376          15 :         dsp->itxfm_add[TX_32X32][DCT_DCT] = ff_vp9_idct_idct_32x32_add_avx;
     377          15 :         init_lpf(avx);
     378          15 :         init_dir_tm_h_ipred(8, avx);
     379          15 :         init_dir_tm_h_ipred(16, avx);
     380          15 :         init_dir_tm_h_ipred(32, avx);
     381             :     }
     382         500 :     if (EXTERNAL_AVX_FAST(cpu_flags)) {
     383          15 :         init_fpel_func(1, 0, 32, put, , avx);
     384          15 :         init_fpel_func(0, 0, 64, put, , avx);
     385          15 :         init_ipred(32, avx, v, VERT);
     386             :     }
     387             : 
     388         500 :     if (EXTERNAL_AVX2_FAST(cpu_flags)) {
     389           5 :         init_fpel_func(1, 1, 32, avg, _8, avx2);
     390           5 :         init_fpel_func(0, 1, 64, avg, _8, avx2);
     391             :         if (ARCH_X86_64) {
     392             : #if ARCH_X86_64 && HAVE_AVX2_EXTERNAL
     393           5 :             dsp->itxfm_add[TX_16X16][DCT_DCT] = ff_vp9_idct_idct_16x16_add_avx2;
     394           5 :             dsp->itxfm_add[TX_16X16][ADST_DCT]  = ff_vp9_idct_iadst_16x16_add_avx2;
     395           5 :             dsp->itxfm_add[TX_16X16][DCT_ADST]  = ff_vp9_iadst_idct_16x16_add_avx2;
     396           5 :             dsp->itxfm_add[TX_16X16][ADST_ADST] = ff_vp9_iadst_iadst_16x16_add_avx2;
     397           5 :             dsp->itxfm_add[TX_32X32][ADST_ADST] =
     398           5 :             dsp->itxfm_add[TX_32X32][ADST_DCT] =
     399           5 :             dsp->itxfm_add[TX_32X32][DCT_ADST] =
     400           5 :             dsp->itxfm_add[TX_32X32][DCT_DCT] = ff_vp9_idct_idct_32x32_add_avx2;
     401           5 :             init_subpel3_32_64(0, put, 8, avx2);
     402           5 :             init_subpel3_32_64(1, avg, 8, avx2);
     403             : #endif
     404             :         }
     405           5 :         init_dc_ipred(32, avx2);
     406           5 :         init_ipred(32, avx2, h,  HOR);
     407           5 :         init_ipred(32, avx2, tm, TM_VP8);
     408             :     }
     409             : 
     410             : #undef init_fpel
     411             : #undef init_subpel1
     412             : #undef init_subpel2
     413             : #undef init_subpel3
     414             : 
     415             : #endif /* HAVE_X86ASM */
     416             : }

Generated by: LCOV version 1.13