diff --git a/aom_dsp/x86/convolve_avx2.h b/aom_dsp/x86/convolve_avx2.h
index bcc28a7..ec5868e 100644
--- a/aom_dsp/x86/convolve_avx2.h
+++ b/aom_dsp/x86/convolve_avx2.h
@@ -33,9 +33,9 @@
   6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14
 };
 
-static INLINE void prepare_coeffs(const InterpFilterParams *const filter_params,
-                                  const int subpel_q4,
-                                  __m256i *const coeffs /* [4] */) {
+static INLINE void prepare_coeffs_lowbd(
+    const InterpFilterParams *const filter_params, const int subpel_q4,
+    __m256i *const coeffs /* [4] */) {
   const int16_t *const filter = av1_get_interp_filter_subpel_kernel(
       *filter_params, subpel_q4 & SUBPEL_MASK);
   const __m128i coeffs_8 = _mm_loadu_si128((__m128i *)filter);
@@ -61,27 +61,27 @@
   coeffs[3] = _mm256_shuffle_epi8(coeffs_1, _mm256_set1_epi16(0x0e0cu));
 }
 
-static INLINE void prepare_coeffs_y_2d(
-    const InterpFilterParams *const filter_params_y, const int subpel_y_q4,
-    __m256i *const coeffs /* [4] */) {
-  const int16_t *y_filter = av1_get_interp_filter_subpel_kernel(
-      *filter_params_y, subpel_y_q4 & SUBPEL_MASK);
+static INLINE void prepare_coeffs(const InterpFilterParams *const filter_params,
+                                  const int subpel_q4,
+                                  __m256i *const coeffs /* [4] */) {
+  const int16_t *filter = av1_get_interp_filter_subpel_kernel(
+      *filter_params, subpel_q4 & SUBPEL_MASK);
 
-  const __m128i coeffs_y8 = _mm_loadu_si128((__m128i *)y_filter);
-  const __m256i coeffs_y = _mm256_broadcastsi128_si256(coeffs_y8);
+  const __m128i coeff_8 = _mm_loadu_si128((__m128i *)filter);
+  const __m256i coeff = _mm256_broadcastsi128_si256(coeff_8);
 
   // coeffs 0 1 0 1 0 1 0 1
-  coeffs[0] = _mm256_shuffle_epi32(coeffs_y, 0x00);
+  coeffs[0] = _mm256_shuffle_epi32(coeff, 0x00);
   // coeffs 2 3 2 3 2 3 2 3
-  coeffs[1] = _mm256_shuffle_epi32(coeffs_y, 0x55);
+  coeffs[1] = _mm256_shuffle_epi32(coeff, 0x55);
   // coeffs 4 5 4 5 4 5 4 5
-  coeffs[2] = _mm256_shuffle_epi32(coeffs_y, 0xaa);
+  coeffs[2] = _mm256_shuffle_epi32(coeff, 0xaa);
   // coeffs 6 7 6 7 6 7 6 7
-  coeffs[3] = _mm256_shuffle_epi32(coeffs_y, 0xff);
+  coeffs[3] = _mm256_shuffle_epi32(coeff, 0xff);
 }
 
-static INLINE __m256i convolve(const __m256i *const s,
-                               const __m256i *const coeffs) {
+static INLINE __m256i convolve_lowbd(const __m256i *const s,
+                                     const __m256i *const coeffs) {
   const __m256i res_01 = _mm256_maddubs_epi16(s[0], coeffs[0]);
   const __m256i res_23 = _mm256_maddubs_epi16(s[1], coeffs[1]);
   const __m256i res_45 = _mm256_maddubs_epi16(s[2], coeffs[2]);
@@ -94,8 +94,8 @@
   return res;
 }
 
-static INLINE __m256i convolve_y_2d(const __m256i *const s,
-                                    const __m256i *const coeffs) {
+static INLINE __m256i convolve(const __m256i *const s,
+                               const __m256i *const coeffs) {
   const __m256i res_0 = _mm256_madd_epi16(s[0], coeffs[0]);
   const __m256i res_1 = _mm256_madd_epi16(s[1], coeffs[1]);
   const __m256i res_2 = _mm256_madd_epi16(s[2], coeffs[2]);
@@ -107,9 +107,9 @@
   return res;
 }
 
-static INLINE __m256i convolve_x(const __m256i data,
-                                 const __m256i *const coeffs,
-                                 const __m256i *const filt) {
+static INLINE __m256i convolve_lowbd_x(const __m256i data,
+                                       const __m256i *const coeffs,
+                                       const __m256i *const filt) {
   __m256i s[4];
 
   s[0] = _mm256_shuffle_epi8(data, filt[0]);
@@ -117,7 +117,7 @@
   s[2] = _mm256_shuffle_epi8(data, filt[2]);
   s[3] = _mm256_shuffle_epi8(data, filt[3]);
 
-  return convolve(s, coeffs);
+  return convolve_lowbd(s, coeffs);
 }
 
 static INLINE void add_store_aligned(CONV_BUF_TYPE *const dst,
diff --git a/av1/common/av1_rtcd_defs.pl b/av1/common/av1_rtcd_defs.pl
index 139b184..94990ea 100755
--- a/av1/common/av1_rtcd_defs.pl
+++ b/av1/common/av1_rtcd_defs.pl
@@ -519,6 +519,7 @@
 add_proto qw/void av1_highbd_convolve_2d_copy_sr/, "const uint16_t *src, int src_stride, uint16_t *dst, int dst_stride, int w, int h, InterpFilterParams *filter_params_x, InterpFilterParams *filter_params_y, const int subpel_x_q4, const int subpel_y_q4, ConvolveParams *conv_params, int bd";
 
 add_proto qw/void av1_highbd_convolve_2d_sr/, "const uint16_t *src, int src_stride, uint16_t *dst, int dst_stride, int w, int h, InterpFilterParams *filter_params_x, InterpFilterParams *filter_params_y, const int subpel_x_q4, const int subpel_y_q4, ConvolveParams *conv_params, int bd";
+specialize qw/av1_highbd_convolve_2d_sr c avx2/;
 
 add_proto qw/void av1_highbd_convolve_x/, "const uint16_t *src, int src_stride, uint16_t *dst, int dst_stride, int w, int h, InterpFilterParams *filter_params_x, InterpFilterParams *filter_params_y, const int subpel_x_q4, const int subpel_y_q4, ConvolveParams *conv_params, int bd";
 
diff --git a/av1/common/convolve.c b/av1/common/convolve.c
index 2a96da5..fef179c 100644
--- a/av1/common/convolve.c
+++ b/av1/common/convolve.c
@@ -1242,7 +1242,7 @@
                                  InterpFilterParams *filter_params_y,
                                  const int subpel_x_q4, const int subpel_y_q4,
                                  ConvolveParams *conv_params, int bd) {
-  int32_t im_block[(MAX_SB_SIZE + MAX_FILTER_TAP - 1) * MAX_SB_SIZE];
+  int16_t im_block[(MAX_SB_SIZE + MAX_FILTER_TAP - 1) * MAX_SB_SIZE];
   int im_h = h + filter_params_y->taps - 1;
   int im_stride = w;
   const int fo_vert = filter_params_y->taps / 2 - 1;
@@ -1267,7 +1267,7 @@
   }
 
   // vertical filter
-  int32_t *src_vert = im_block + fo_vert * im_stride;
+  int16_t *src_vert = im_block + fo_vert * im_stride;
   const int16_t *y_filter = av1_get_interp_filter_subpel_kernel(
       *filter_params_y, subpel_y_q4 & SUBPEL_MASK);
   const int offset_bits = bd + 2 * FILTER_BITS - conv_params->round_0;
diff --git a/av1/common/x86/convolve_2d_avx2.c b/av1/common/x86/convolve_2d_avx2.c
index 9c1a32b..fafe344 100644
--- a/av1/common/x86/convolve_2d_avx2.c
+++ b/av1/common/x86/convolve_2d_avx2.c
@@ -50,8 +50,8 @@
   filt[2] = _mm256_load_si256((__m256i const *)filt3_global_avx2);
   filt[3] = _mm256_load_si256((__m256i const *)filt4_global_avx2);
 
-  prepare_coeffs(filter_params_x, subpel_x_q4, coeffs_x);
-  prepare_coeffs_y_2d(filter_params_y, subpel_y_q4, coeffs_y);
+  prepare_coeffs_lowbd(filter_params_x, subpel_x_q4, coeffs_x);
+  prepare_coeffs(filter_params_y, subpel_y_q4, coeffs_y);
 
   for (j = 0; j < w; j += 8) {
     /* Horizontal filter */
@@ -70,7 +70,7 @@
               _mm_loadu_si128(
                   (__m128i *)&src_ptr[(i * src_stride) + j + src_stride]),
               1);
-        __m256i res = convolve_x(data, coeffs_x, filt);
+        __m256i res = convolve_lowbd_x(data, coeffs_x, filt);
 
         res = _mm256_sra_epi16(_mm256_add_epi16(res, round_const), round_shift);
 
@@ -112,8 +112,8 @@
         s[3] = _mm256_unpacklo_epi16(s6, s7);
         s[7] = _mm256_unpackhi_epi16(s6, s7);
 
-        const __m256i res_a = convolve_y_2d(s, coeffs_y);
-        const __m256i res_b = convolve_y_2d(s + 4, coeffs_y);
+        const __m256i res_a = convolve(s, coeffs_y);
+        const __m256i res_b = convolve(s + 4, coeffs_y);
 
         const __m256i res_a_round =
             _mm256_sra_epi32(_mm256_add_epi32(res_a, round_const), round_shift);
@@ -185,8 +185,8 @@
   filt[2] = _mm256_load_si256((__m256i const *)filt3_global_avx2);
   filt[3] = _mm256_load_si256((__m256i const *)filt4_global_avx2);
 
-  prepare_coeffs(filter_params_x, subpel_x_q4, coeffs_h);
-  prepare_coeffs_y_2d(filter_params_y, subpel_y_q4, coeffs_v);
+  prepare_coeffs_lowbd(filter_params_x, subpel_x_q4, coeffs_h);
+  prepare_coeffs(filter_params_y, subpel_y_q4, coeffs_v);
 
   const __m256i round_const_h = _mm256_set1_epi16(
       ((1 << (conv_params->round_0 - 1)) >> 1) + (1 << (bd + FILTER_BITS - 2)));
@@ -214,7 +214,7 @@
                 (__m128i *)&src_ptr[(i * src_stride) + j + src_stride]),
             1);
 
-      __m256i res = convolve_x(data, coeffs_h, filt);
+      __m256i res = convolve_lowbd_x(data, coeffs_h, filt);
 
       res =
           _mm256_sra_epi16(_mm256_add_epi16(res, round_const_h), round_shift_h);
@@ -251,8 +251,8 @@
         s[3] = _mm256_unpacklo_epi16(s6, s7);
         s[7] = _mm256_unpackhi_epi16(s6, s7);
 
-        __m256i res_a = convolve_y_2d(s, coeffs_v);
-        __m256i res_b = convolve_y_2d(s + 4, coeffs_v);
+        __m256i res_a = convolve(s, coeffs_v);
+        __m256i res_b = convolve(s + 4, coeffs_v);
 
         // Combine V round and 2F-H-V round into a single rounding
         res_a =
diff --git a/av1/common/x86/convolve_avx2.c b/av1/common/x86/convolve_avx2.c
index c4d7447..63f6138 100644
--- a/av1/common/x86/convolve_avx2.c
+++ b/av1/common/x86/convolve_avx2.c
@@ -361,7 +361,7 @@
 
   assert((FILTER_BITS - conv_params->round_0) >= 0);
 
-  prepare_coeffs(filter_params_y, subpel_y_q4, coeffs);
+  prepare_coeffs_lowbd(filter_params_y, subpel_y_q4, coeffs);
 
   (void)conv_params;
   (void)filter_params_x;
@@ -442,7 +442,7 @@
       s[3] = _mm256_unpacklo_epi8(src_67a, src_78a);
       s[7] = _mm256_unpackhi_epi8(src_67a, src_78a);
 
-      const __m256i res_lo = convolve(s, coeffs);
+      const __m256i res_lo = convolve_lowbd(s, coeffs);
 
       const __m256i res_lo_0_32b =
           _mm256_cvtepi16_epi32(_mm256_castsi256_si128(res_lo));
@@ -465,7 +465,7 @@
                         &avg_mask);
 
       if (w - j > 8) {
-        const __m256i res_hi = convolve(s + 4, coeffs);
+        const __m256i res_hi = convolve_lowbd(s + 4, coeffs);
 
         const __m256i res_hi_0_32b =
             _mm256_cvtepi16_epi32(_mm256_castsi256_si128(res_hi));
@@ -520,7 +520,7 @@
   assert(((conv_params->round_0 + conv_params->round_1) <= (FILTER_BITS + 1)) ||
          ((conv_params->round_0 + conv_params->round_1) == (2 * FILTER_BITS)));
 
-  prepare_coeffs(filter_params_y, subpel_y_q4, coeffs);
+  prepare_coeffs_lowbd(filter_params_y, subpel_y_q4, coeffs);
 
   (void)filter_params_x;
   (void)subpel_x_q4;
@@ -599,7 +599,7 @@
       s[3] = _mm256_unpacklo_epi8(src_67a, src_78a);
       s[7] = _mm256_unpackhi_epi8(src_67a, src_78a);
 
-      const __m256i res_lo = convolve(s, coeffs);
+      const __m256i res_lo = convolve_lowbd(s, coeffs);
 
       /* rounding code */
       // shift by F - 1
@@ -609,7 +609,7 @@
       __m256i res_8b_lo = _mm256_packus_epi16(res_16b_lo, res_16b_lo);
 
       if (w - j > 8) {
-        const __m256i res_hi = convolve(s + 4, coeffs);
+        const __m256i res_hi = convolve_lowbd(s + 4, coeffs);
 
         /* rounding code */
         // shift by F - 1
@@ -679,7 +679,7 @@
   filt[2] = _mm256_load_si256((__m256i const *)filt3_global_avx2);
   filt[3] = _mm256_load_si256((__m256i const *)filt4_global_avx2);
 
-  prepare_coeffs(filter_params_x, subpel_x_q4, coeffs);
+  prepare_coeffs_lowbd(filter_params_x, subpel_x_q4, coeffs);
 
   const __m256i round_const =
       _mm256_set1_epi16((1 << (conv_params->round_0 - 1)) >> 1);
@@ -698,7 +698,7 @@
           _mm256_loadu_si256((__m256i *)&src_ptr[i * src_stride + j]),
           _MM_SHUFFLE(2, 1, 1, 0));
 
-      __m256i res = convolve_x(data, coeffs, filt);
+      __m256i res = convolve_lowbd_x(data, coeffs, filt);
 
       res = _mm256_sra_epi16(_mm256_add_epi16(res, round_const), round_shift);
 
@@ -738,7 +738,7 @@
   filt[2] = _mm256_load_si256((__m256i const *)filt3_global_avx2);
   filt[3] = _mm256_load_si256((__m256i const *)filt4_global_avx2);
 
-  prepare_coeffs(filter_params_x, subpel_x_q4, coeffs);
+  prepare_coeffs_lowbd(filter_params_x, subpel_x_q4, coeffs);
 
   const __m256i round_0_const =
       _mm256_set1_epi16((1 << (conv_params->round_0 - 1)) >> 1);
@@ -762,7 +762,7 @@
           _mm256_loadu_si256((__m256i *)&src_ptr[(i * src_stride) + j]),
           _mm_loadu_si128((__m128i *)&src_ptr[(i * src_stride) + (j + 8)]), 1);
 
-      __m256i res_16b = convolve_x(data, coeffs, filt);
+      __m256i res_16b = convolve_lowbd_x(data, coeffs, filt);
 
       res_16b = _mm256_sra_epi16(_mm256_add_epi16(res_16b, round_0_const),
                                  round_0_shift);
diff --git a/av1/common/x86/highbd_convolve_2d_avx2.c b/av1/common/x86/highbd_convolve_2d_avx2.c
index 9ac8e9e..cb13e9b 100644
--- a/av1/common/x86/highbd_convolve_2d_avx2.c
+++ b/av1/common/x86/highbd_convolve_2d_avx2.c
@@ -14,10 +14,169 @@
 
 #include "./aom_dsp_rtcd.h"
 #include "aom_dsp/aom_convolve.h"
+#include "aom_dsp/x86/convolve_avx2.h"
+#include "aom_dsp/x86/synonyms.h"
 #include "aom_dsp/aom_dsp_common.h"
 #include "aom_dsp/aom_filter.h"
 #include "av1/common/convolve.h"
 
+void av1_highbd_convolve_2d_sr_avx2(const uint16_t *src, int src_stride,
+                                    uint16_t *dst, int dst_stride, int w, int h,
+                                    InterpFilterParams *filter_params_x,
+                                    InterpFilterParams *filter_params_y,
+                                    const int subpel_x_q4,
+                                    const int subpel_y_q4,
+                                    ConvolveParams *conv_params, int bd) {
+  DECLARE_ALIGNED(32, int16_t, im_block[(MAX_SB_SIZE + MAX_FILTER_TAP) * 8]);
+  int im_h = h + filter_params_y->taps - 1;
+  int im_stride = 8;
+  int i, j;
+  const int fo_vert = filter_params_y->taps / 2 - 1;
+  const int fo_horiz = filter_params_x->taps / 2 - 1;
+  const uint16_t *const src_ptr = src - fo_vert * src_stride - fo_horiz;
+
+  // Check that, even with 12-bit input, the intermediate values will fit
+  // into an unsigned 16-bit intermediate array.
+  assert(bd + FILTER_BITS + 2 - conv_params->round_0 <= 16);
+
+  __m256i s[8], coeffs_y[4], coeffs_x[4];
+
+  const __m256i round_const_x = _mm256_set1_epi32(
+      ((1 << conv_params->round_0) >> 1) + (1 << (bd + FILTER_BITS - 1)));
+  const __m128i round_shift_x = _mm_cvtsi32_si128(conv_params->round_0);
+
+  const __m256i round_const_y = _mm256_set1_epi32(
+      ((1 << conv_params->round_1) >> 1) -
+      (1 << (bd + 2 * FILTER_BITS - conv_params->round_0 - 1)));
+  const __m128i round_shift_y = _mm_cvtsi32_si128(conv_params->round_1);
+
+  const __m128i bits = _mm_cvtsi32_si128(
+      FILTER_BITS * 2 - conv_params->round_0 - conv_params->round_1);
+  const __m256i clip_pixel =
+      _mm256_set1_epi16(bd == 10 ? 1023 : (bd == 12 ? 4095 : 255));
+  const __m256i zero = _mm256_setzero_si256();
+
+  prepare_coeffs(filter_params_x, subpel_x_q4, coeffs_x);
+  prepare_coeffs(filter_params_y, subpel_y_q4, coeffs_y);
+
+  for (j = 0; j < w; j += 8) {
+    /* Horizontal filter */
+    {
+      for (i = 0; i < im_h; i += 2) {
+        const __m256i row0 =
+            _mm256_loadu_si256((__m256i *)&src_ptr[i * src_stride + j]);
+        __m256i row1 = _mm256_set1_epi16(0);
+        if (i + 1 < im_h)
+          row1 =
+              _mm256_loadu_si256((__m256i *)&src_ptr[(i + 1) * src_stride + j]);
+
+        const __m256i r0 = _mm256_permute2x128_si256(row0, row1, 0x20);
+        const __m256i r1 = _mm256_permute2x128_si256(row0, row1, 0x31);
+
+        // even pixels
+        s[0] = _mm256_alignr_epi8(r1, r0, 0);
+        s[1] = _mm256_alignr_epi8(r1, r0, 4);
+        s[2] = _mm256_alignr_epi8(r1, r0, 8);
+        s[3] = _mm256_alignr_epi8(r1, r0, 12);
+
+        __m256i res_even = convolve(s, coeffs_x);
+        res_even = _mm256_sra_epi32(_mm256_add_epi32(res_even, round_const_x),
+                                    round_shift_x);
+
+        // odd pixels
+        s[0] = _mm256_alignr_epi8(r1, r0, 2);
+        s[1] = _mm256_alignr_epi8(r1, r0, 6);
+        s[2] = _mm256_alignr_epi8(r1, r0, 10);
+        s[3] = _mm256_alignr_epi8(r1, r0, 14);
+
+        __m256i res_odd = convolve(s, coeffs_x);
+        res_odd = _mm256_sra_epi32(_mm256_add_epi32(res_odd, round_const_x),
+                                   round_shift_x);
+
+        __m256i res_even1 = _mm256_packs_epi32(res_even, res_even);
+        __m256i res_odd1 = _mm256_packs_epi32(res_odd, res_odd);
+        __m256i res = _mm256_unpacklo_epi16(res_even1, res_odd1);
+
+        _mm256_store_si256((__m256i *)&im_block[i * im_stride], res);
+      }
+    }
+
+    /* Vertical filter */
+    {
+      __m256i s0 = _mm256_loadu_si256((__m256i *)(im_block + 0 * im_stride));
+      __m256i s1 = _mm256_loadu_si256((__m256i *)(im_block + 1 * im_stride));
+      __m256i s2 = _mm256_loadu_si256((__m256i *)(im_block + 2 * im_stride));
+      __m256i s3 = _mm256_loadu_si256((__m256i *)(im_block + 3 * im_stride));
+      __m256i s4 = _mm256_loadu_si256((__m256i *)(im_block + 4 * im_stride));
+      __m256i s5 = _mm256_loadu_si256((__m256i *)(im_block + 5 * im_stride));
+
+      s[0] = _mm256_unpacklo_epi16(s0, s1);
+      s[1] = _mm256_unpacklo_epi16(s2, s3);
+      s[2] = _mm256_unpacklo_epi16(s4, s5);
+
+      s[4] = _mm256_unpackhi_epi16(s0, s1);
+      s[5] = _mm256_unpackhi_epi16(s2, s3);
+      s[6] = _mm256_unpackhi_epi16(s4, s5);
+
+      for (i = 0; i < h; i += 2) {
+        const int16_t *data = &im_block[i * im_stride];
+
+        const __m256i s6 =
+            _mm256_loadu_si256((__m256i *)(data + 6 * im_stride));
+        const __m256i s7 =
+            _mm256_loadu_si256((__m256i *)(data + 7 * im_stride));
+
+        s[3] = _mm256_unpacklo_epi16(s6, s7);
+        s[7] = _mm256_unpackhi_epi16(s6, s7);
+
+        const __m256i res_a = convolve(s, coeffs_y);
+        __m256i res_a_round = _mm256_sra_epi32(
+            _mm256_add_epi32(res_a, round_const_y), round_shift_y);
+        res_a_round = _mm256_sra_epi32(res_a_round, bits);
+        res_a_round = _mm256_min_epi16(res_a_round, clip_pixel);
+        res_a_round = _mm256_max_epi16(res_a_round, zero);
+
+        if (w - j > 4) {
+          const __m256i res_b = convolve(s + 4, coeffs_y);
+          __m256i res_b_round = _mm256_sra_epi32(
+              _mm256_add_epi32(res_b, round_const_y), round_shift_y);
+          res_b_round = _mm256_sra_epi32(res_b_round, bits);
+          res_b_round = _mm256_min_epi16(res_b_round, clip_pixel);
+          res_b_round = _mm256_max_epi16(res_b_round, zero);
+
+          const __m256i res_16bit =
+              _mm256_packs_epi32(res_a_round, res_b_round);
+
+          _mm_store_si128((__m128i *)&dst[i * dst_stride + j],
+                          _mm256_castsi256_si128(res_16bit));
+          _mm_store_si128((__m128i *)&dst[i * dst_stride + j + dst_stride],
+                          _mm256_extracti128_si256(res_16bit, 1));
+        } else if (w == 4) {
+          res_a_round = _mm256_packs_epi32(res_a_round, res_a_round);
+          _mm_storel_epi64((__m128i *)&dst[i * dst_stride + j],
+                           _mm256_castsi256_si128(res_a_round));
+          _mm_storel_epi64((__m128i *)&dst[i * dst_stride + j + dst_stride],
+                           _mm256_extracti128_si256(res_a_round, 1));
+        } else {
+          res_a_round = _mm256_packs_epi32(res_a_round, res_a_round);
+          xx_storel_32((__m128i *)&dst[i * dst_stride + j],
+                       _mm256_castsi256_si128(res_a_round));
+          xx_storel_32((__m128i *)&dst[i * dst_stride + j + dst_stride],
+                       _mm256_extracti128_si256(res_a_round, 1));
+        }
+
+        s[0] = s[1];
+        s[1] = s[2];
+        s[2] = s[3];
+
+        s[4] = s[5];
+        s[5] = s[6];
+        s[6] = s[7];
+      }
+    }
+  }
+}
+
 void av1_highbd_convolve_2d_avx2(const uint16_t *src, int src_stride,
                                  uint16_t *dst0, int dst_stride0, int w, int h,
                                  InterpFilterParams *filter_params_x,
diff --git a/test/av1_convolve_2d_test.cc b/test/av1_convolve_2d_test.cc
index b8b5971..9d04418 100644
--- a/test/av1_convolve_2d_test.cc
+++ b/test/av1_convolve_2d_test.cc
@@ -169,7 +169,11 @@
 INSTANTIATE_TEST_CASE_P(C_COPY, AV1HighbdConvolve2DSrTest,
                         libaom_test::AV1HighbdConvolve2D::BuildParams(
                             av1_highbd_convolve_2d_copy_sr_c, 0, 0, 0));
-
+#if HAVE_AVX2
+INSTANTIATE_TEST_CASE_P(AVX2, AV1HighbdConvolve2DSrTest,
+                        libaom_test::AV1HighbdConvolve2D::BuildParams(
+                            av1_highbd_convolve_2d_sr_avx2, 1, 1, 0));
+#endif
 #if CONFIG_JNT_COMP && HAVE_SSE4_1
 TEST_P(AV1HighbdJntConvolve2DTest, CheckOutput) {
   RunCheckOutput(GET_PARAM(1));
