/*
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
 */

#include <assert.h>
#include <stdlib.h>
#include <emmintrin.h>
#include <tmmintrin.h>

#include "./aom_config.h"
#include "aom/aom_integer.h"
#include "aom_ports/mem.h"
#include "aom_dsp/aom_filter.h"

// Half pixel shift
#define HALF_PIXEL_OFFSET (BIL_SUBPEL_SHIFTS / 2)

/*****************************************************************************
 * Horizontal additions
 *****************************************************************************/

static INLINE int32_t hsum_epi32_si32(__m128i v_d) {
  v_d = _mm_hadd_epi32(v_d, v_d);
  v_d = _mm_hadd_epi32(v_d, v_d);
  return _mm_cvtsi128_si32(v_d);
}

static INLINE int64_t hsum_epi64_si64(__m128i v_q) {
  v_q = _mm_add_epi64(v_q, _mm_srli_si128(v_q, 8));
#if ARCH_X86_64
  return _mm_cvtsi128_si64(v_q);
#else
  {
    int64_t tmp;
    _mm_storel_epi64((__m128i *)&tmp, v_q);
    return tmp;
  }
#endif
}

#if CONFIG_HIGHBITDEPTH
static INLINE int64_t hsum_epi32_si64(__m128i v_d) {
  const __m128i v_sign_d = _mm_cmplt_epi32(v_d, _mm_setzero_si128());
  const __m128i v_0_q = _mm_unpacklo_epi32(v_d, v_sign_d);
  const __m128i v_1_q = _mm_unpackhi_epi32(v_d, v_sign_d);
  return hsum_epi64_si64(_mm_add_epi64(v_0_q, v_1_q));
}
#endif  // CONFIG_HIGHBITDEPTH

static INLINE uint32_t calc_masked_variance(__m128i v_sum_d, __m128i v_sse_q,
                                            uint32_t *sse, const int w,
                                            const int h) {
  int64_t sum64;
  uint64_t sse64;

  // Horizontal sum
  sum64 = hsum_epi32_si32(v_sum_d);
  sse64 = hsum_epi64_si64(v_sse_q);

  sum64 = (sum64 >= 0) ? sum64 : -sum64;

  // Round
  sum64 = ROUND_POWER_OF_TWO(sum64, 6);
  sse64 = ROUND_POWER_OF_TWO(sse64, 12);

  // Store the SSE
  *sse = (uint32_t)sse64;
  // Compute the variance
  return *sse - (uint32_t)((sum64 * sum64) / (w * h));
}

/*****************************************************************************
 * n*16 Wide versions
 *****************************************************************************/

static INLINE unsigned int masked_variancewxh_ssse3(
    const uint8_t *a, int a_stride, const uint8_t *b, int b_stride,
    const uint8_t *m, int m_stride, int w, int h, unsigned int *sse) {
  int ii, jj;

  const __m128i v_zero = _mm_setzero_si128();

  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();

  assert((w % 16) == 0);

  for (ii = 0; ii < h; ii++) {
    for (jj = 0; jj < w; jj += 16) {
      // Load inputs - 8 bits
      const __m128i v_a_b = _mm_loadu_si128((const __m128i *)(a + jj));
      const __m128i v_b_b = _mm_loadu_si128((const __m128i *)(b + jj));
      const __m128i v_m_b = _mm_loadu_si128((const __m128i *)(m + jj));

      // Unpack to 16 bits - still containing max 8 bits
      const __m128i v_a0_w = _mm_unpacklo_epi8(v_a_b, v_zero);
      const __m128i v_b0_w = _mm_unpacklo_epi8(v_b_b, v_zero);
      const __m128i v_m0_w = _mm_unpacklo_epi8(v_m_b, v_zero);
      const __m128i v_a1_w = _mm_unpackhi_epi8(v_a_b, v_zero);
      const __m128i v_b1_w = _mm_unpackhi_epi8(v_b_b, v_zero);
      const __m128i v_m1_w = _mm_unpackhi_epi8(v_m_b, v_zero);

      // Difference: [-255, 255]
      const __m128i v_d0_w = _mm_sub_epi16(v_a0_w, v_b0_w);
      const __m128i v_d1_w = _mm_sub_epi16(v_a1_w, v_b1_w);

      // Error - [-255, 255] * [0, 64] = [0xc040, 0x3fc0] => fits in 15 bits
      const __m128i v_e0_w = _mm_mullo_epi16(v_d0_w, v_m0_w);
      const __m128i v_e0_d = _mm_madd_epi16(v_d0_w, v_m0_w);
      const __m128i v_e1_w = _mm_mullo_epi16(v_d1_w, v_m1_w);
      const __m128i v_e1_d = _mm_madd_epi16(v_d1_w, v_m1_w);

      // Squared error - using madd it's max (15 bits * 15 bits) * 2 = 31 bits
      const __m128i v_se0_d = _mm_madd_epi16(v_e0_w, v_e0_w);
      const __m128i v_se1_d = _mm_madd_epi16(v_e1_w, v_e1_w);

      // Sum of v_se{0,1}_d - 31 bits + 31 bits = 32 bits
      const __m128i v_se_d = _mm_add_epi32(v_se0_d, v_se1_d);

      // Unpack Squared error to 64 bits
      const __m128i v_se_lo_q = _mm_unpacklo_epi32(v_se_d, v_zero);
      const __m128i v_se_hi_q = _mm_unpackhi_epi32(v_se_d, v_zero);

      // Accumulate
      v_sum_d = _mm_add_epi32(v_sum_d, v_e0_d);
      v_sum_d = _mm_add_epi32(v_sum_d, v_e1_d);
      v_sse_q = _mm_add_epi64(v_sse_q, v_se_lo_q);
      v_sse_q = _mm_add_epi64(v_sse_q, v_se_hi_q);
    }

    // Move on to next row
    a += a_stride;
    b += b_stride;
    m += m_stride;
  }

  return calc_masked_variance(v_sum_d, v_sse_q, sse, w, h);
}

#define MASKED_VARWXH(W, H)                                                   \
  unsigned int aom_masked_variance##W##x##H##_ssse3(                          \
      const uint8_t *a, int a_stride, const uint8_t *b, int b_stride,         \
      const uint8_t *m, int m_stride, unsigned int *sse) {                    \
    return masked_variancewxh_ssse3(a, a_stride, b, b_stride, m, m_stride, W, \
                                    H, sse);                                  \
  }

MASKED_VARWXH(16, 8)
MASKED_VARWXH(16, 16)
MASKED_VARWXH(16, 32)
MASKED_VARWXH(32, 16)
MASKED_VARWXH(32, 32)
MASKED_VARWXH(32, 64)
MASKED_VARWXH(64, 32)
MASKED_VARWXH(64, 64)
#if CONFIG_EXT_PARTITION
MASKED_VARWXH(64, 128)
MASKED_VARWXH(128, 64)
MASKED_VARWXH(128, 128)
#endif  // CONFIG_EXT_PARTITION

/*****************************************************************************
 * 8 Wide versions
 *****************************************************************************/

static INLINE unsigned int masked_variance8xh_ssse3(
    const uint8_t *a, int a_stride, const uint8_t *b, int b_stride,
    const uint8_t *m, int m_stride, int h, unsigned int *sse) {
  int ii;

  const __m128i v_zero = _mm_setzero_si128();

  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();

  for (ii = 0; ii < h; ii++) {
    // Load inputs - 8 bits
    const __m128i v_a_b = _mm_loadl_epi64((const __m128i *)a);
    const __m128i v_b_b = _mm_loadl_epi64((const __m128i *)b);
    const __m128i v_m_b = _mm_loadl_epi64((const __m128i *)m);

    // Unpack to 16 bits - still containing max 8 bits
    const __m128i v_a_w = _mm_unpacklo_epi8(v_a_b, v_zero);
    const __m128i v_b_w = _mm_unpacklo_epi8(v_b_b, v_zero);
    const __m128i v_m_w = _mm_unpacklo_epi8(v_m_b, v_zero);

    // Difference: [-255, 255]
    const __m128i v_d_w = _mm_sub_epi16(v_a_w, v_b_w);

    // Error - [-255, 255] * [0, 64] = [0xc040, 0x3fc0] => fits in 15 bits
    const __m128i v_e_w = _mm_mullo_epi16(v_d_w, v_m_w);
    const __m128i v_e_d = _mm_madd_epi16(v_d_w, v_m_w);

    // Squared error - using madd it's max (15 bits * 15 bits) * 2 = 31 bits
    const __m128i v_se_d = _mm_madd_epi16(v_e_w, v_e_w);

    // Unpack Squared error to 64 bits
    const __m128i v_se_lo_q = _mm_unpacklo_epi32(v_se_d, v_zero);
    const __m128i v_se_hi_q = _mm_unpackhi_epi32(v_se_d, v_zero);

    // Accumulate
    v_sum_d = _mm_add_epi32(v_sum_d, v_e_d);
    v_sse_q = _mm_add_epi64(v_sse_q, v_se_lo_q);
    v_sse_q = _mm_add_epi64(v_sse_q, v_se_hi_q);

    // Move on to next row
    a += a_stride;
    b += b_stride;
    m += m_stride;
  }

  return calc_masked_variance(v_sum_d, v_sse_q, sse, 8, h);
}

#define MASKED_VAR8XH(H)                                                      \
  unsigned int aom_masked_variance8x##H##_ssse3(                              \
      const uint8_t *a, int a_stride, const uint8_t *b, int b_stride,         \
      const uint8_t *m, int m_stride, unsigned int *sse) {                    \
    return masked_variance8xh_ssse3(a, a_stride, b, b_stride, m, m_stride, H, \
                                    sse);                                     \
  }

MASKED_VAR8XH(4)
MASKED_VAR8XH(8)
MASKED_VAR8XH(16)

/*****************************************************************************
 * 4 Wide versions
 *****************************************************************************/

static INLINE unsigned int masked_variance4xh_ssse3(
    const uint8_t *a, int a_stride, const uint8_t *b, int b_stride,
    const uint8_t *m, int m_stride, int h, unsigned int *sse) {
  int ii;

  const __m128i v_zero = _mm_setzero_si128();

  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();

  assert((h % 2) == 0);

  for (ii = 0; ii < h / 2; ii++) {
    // Load 2 input rows - 8 bits
    const __m128i v_a0_b = _mm_cvtsi32_si128(*(const uint32_t *)a);
    const __m128i v_b0_b = _mm_cvtsi32_si128(*(const uint32_t *)b);
    const __m128i v_m0_b = _mm_cvtsi32_si128(*(const uint32_t *)m);
    const __m128i v_a1_b = _mm_cvtsi32_si128(*(const uint32_t *)(a + a_stride));
    const __m128i v_b1_b = _mm_cvtsi32_si128(*(const uint32_t *)(b + b_stride));
    const __m128i v_m1_b = _mm_cvtsi32_si128(*(const uint32_t *)(m + m_stride));

    // Interleave 2 rows into a single register
    const __m128i v_a_b = _mm_unpacklo_epi32(v_a0_b, v_a1_b);
    const __m128i v_b_b = _mm_unpacklo_epi32(v_b0_b, v_b1_b);
    const __m128i v_m_b = _mm_unpacklo_epi32(v_m0_b, v_m1_b);

    // Unpack to 16 bits - still containing max 8 bits
    const __m128i v_a_w = _mm_unpacklo_epi8(v_a_b, v_zero);
    const __m128i v_b_w = _mm_unpacklo_epi8(v_b_b, v_zero);
    const __m128i v_m_w = _mm_unpacklo_epi8(v_m_b, v_zero);

    // Difference: [-255, 255]
    const __m128i v_d_w = _mm_sub_epi16(v_a_w, v_b_w);

    // Error - [-255, 255] * [0, 64] = [0xc040, 0x3fc0] => fits in 15 bits
    const __m128i v_e_w = _mm_mullo_epi16(v_d_w, v_m_w);
    const __m128i v_e_d = _mm_madd_epi16(v_d_w, v_m_w);

    // Squared error - using madd it's max (15 bits * 15 bits) * 2 = 31 bits
    const __m128i v_se_d = _mm_madd_epi16(v_e_w, v_e_w);

    // Unpack Squared error to 64 bits
    const __m128i v_se_lo_q = _mm_unpacklo_epi32(v_se_d, v_zero);
    const __m128i v_se_hi_q = _mm_unpackhi_epi32(v_se_d, v_zero);

    // Accumulate
    v_sum_d = _mm_add_epi32(v_sum_d, v_e_d);
    v_sse_q = _mm_add_epi64(v_sse_q, v_se_lo_q);
    v_sse_q = _mm_add_epi64(v_sse_q, v_se_hi_q);

    // Move on to next 2 row
    a += a_stride * 2;
    b += b_stride * 2;
    m += m_stride * 2;
  }

  return calc_masked_variance(v_sum_d, v_sse_q, sse, 4, h);
}

#define MASKED_VAR4XH(H)                                                      \
  unsigned int aom_masked_variance4x##H##_ssse3(                              \
      const uint8_t *a, int a_stride, const uint8_t *b, int b_stride,         \
      const uint8_t *m, int m_stride, unsigned int *sse) {                    \
    return masked_variance4xh_ssse3(a, a_stride, b, b_stride, m, m_stride, H, \
                                    sse);                                     \
  }

MASKED_VAR4XH(4)
MASKED_VAR4XH(8)

#if CONFIG_HIGHBITDEPTH

// Main calculation for n*8 wide blocks
static INLINE void highbd_masked_variance64_ssse3(
    const uint16_t *a, int a_stride, const uint16_t *b, int b_stride,
    const uint8_t *m, int m_stride, int w, int h, int64_t *sum, uint64_t *sse) {
  int ii, jj;

  const __m128i v_zero = _mm_setzero_si128();

  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();

  assert((w % 8) == 0);

  for (ii = 0; ii < h; ii++) {
    for (jj = 0; jj < w; jj += 8) {
      // Load inputs - 8 bits
      const __m128i v_a_w = _mm_loadu_si128((const __m128i *)(a + jj));
      const __m128i v_b_w = _mm_loadu_si128((const __m128i *)(b + jj));
      const __m128i v_m_b = _mm_loadl_epi64((const __m128i *)(m + jj));

      // Unpack m to 16 bits - still containing max 8 bits
      const __m128i v_m_w = _mm_unpacklo_epi8(v_m_b, v_zero);

      // Difference: [-4095, 4095]
      const __m128i v_d_w = _mm_sub_epi16(v_a_w, v_b_w);

      // Error - [-4095, 4095] * [0, 64] => sum of 2 of these fits in 19 bits
      const __m128i v_e_d = _mm_madd_epi16(v_d_w, v_m_w);

      // Squared error - max (18 bits * 18 bits) = 36 bits (no sign bit)
      const __m128i v_absd_w = _mm_abs_epi16(v_d_w);
      const __m128i v_dlo_d = _mm_unpacklo_epi16(v_absd_w, v_zero);
      const __m128i v_mlo_d = _mm_unpacklo_epi16(v_m_w, v_zero);
      const __m128i v_elo_d = _mm_madd_epi16(v_dlo_d, v_mlo_d);
      const __m128i v_dhi_d = _mm_unpackhi_epi16(v_absd_w, v_zero);
      const __m128i v_mhi_d = _mm_unpackhi_epi16(v_m_w, v_zero);
      const __m128i v_ehi_d = _mm_madd_epi16(v_dhi_d, v_mhi_d);
      // Square and sum the errors -> 36bits * 4 = 38bits
      __m128i v_se0_q, v_se1_q, v_se2_q, v_se3_q, v_se_q, v_elo1_d, v_ehi3_d;
      v_se0_q = _mm_mul_epu32(v_elo_d, v_elo_d);
      v_elo1_d = _mm_srli_si128(v_elo_d, 4);
      v_se1_q = _mm_mul_epu32(v_elo1_d, v_elo1_d);
      v_se0_q = _mm_add_epi64(v_se0_q, v_se1_q);
      v_se2_q = _mm_mul_epu32(v_ehi_d, v_ehi_d);
      v_ehi3_d = _mm_srli_si128(v_ehi_d, 4);
      v_se3_q = _mm_mul_epu32(v_ehi3_d, v_ehi3_d);
      v_se1_q = _mm_add_epi64(v_se2_q, v_se3_q);
      v_se_q = _mm_add_epi64(v_se0_q, v_se1_q);

      // Accumulate
      v_sum_d = _mm_add_epi32(v_sum_d, v_e_d);
      v_sse_q = _mm_add_epi64(v_sse_q, v_se_q);
    }

    // Move on to next row
    a += a_stride;
    b += b_stride;
    m += m_stride;
  }

  // Horizontal sum
  *sum = hsum_epi32_si64(v_sum_d);
  *sse = hsum_epi64_si64(v_sse_q);

  // Round
  *sum = (*sum >= 0) ? *sum : -*sum;
  *sum = ROUND_POWER_OF_TWO(*sum, 6);
  *sse = ROUND_POWER_OF_TWO(*sse, 12);
}

// Main calculation for 4 wide blocks
static INLINE void highbd_masked_variance64_4wide_ssse3(
    const uint16_t *a, int a_stride, const uint16_t *b, int b_stride,
    const uint8_t *m, int m_stride, int h, int64_t *sum, uint64_t *sse) {
  int ii;

  const __m128i v_zero = _mm_setzero_si128();

  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();

  assert((h % 2) == 0);

  for (ii = 0; ii < h / 2; ii++) {
    // Load 2 input rows - 8 bits
    const __m128i v_a0_w = _mm_loadl_epi64((const __m128i *)a);
    const __m128i v_b0_w = _mm_loadl_epi64((const __m128i *)b);
    const __m128i v_m0_b = _mm_cvtsi32_si128(*(const uint32_t *)m);
    const __m128i v_a1_w = _mm_loadl_epi64((const __m128i *)(a + a_stride));
    const __m128i v_b1_w = _mm_loadl_epi64((const __m128i *)(b + b_stride));
    const __m128i v_m1_b = _mm_cvtsi32_si128(*(const uint32_t *)(m + m_stride));

    // Interleave 2 rows into a single register
    const __m128i v_a_w = _mm_unpacklo_epi64(v_a0_w, v_a1_w);
    const __m128i v_b_w = _mm_unpacklo_epi64(v_b0_w, v_b1_w);
    const __m128i v_m_b = _mm_unpacklo_epi32(v_m0_b, v_m1_b);

    // Unpack to 16 bits - still containing max 8 bits
    const __m128i v_m_w = _mm_unpacklo_epi8(v_m_b, v_zero);

    // Difference: [-4095, 4095]
    const __m128i v_d_w = _mm_sub_epi16(v_a_w, v_b_w);

    // Error - [-4095, 4095] * [0, 64] => fits in 19 bits (incld sign bit)
    const __m128i v_e_d = _mm_madd_epi16(v_d_w, v_m_w);

    // Squared error - max (18 bits * 18 bits) = 36 bits (no sign bit)
    const __m128i v_absd_w = _mm_abs_epi16(v_d_w);
    const __m128i v_dlo_d = _mm_unpacklo_epi16(v_absd_w, v_zero);
    const __m128i v_mlo_d = _mm_unpacklo_epi16(v_m_w, v_zero);
    const __m128i v_elo_d = _mm_madd_epi16(v_dlo_d, v_mlo_d);
    const __m128i v_dhi_d = _mm_unpackhi_epi16(v_absd_w, v_zero);
    const __m128i v_mhi_d = _mm_unpackhi_epi16(v_m_w, v_zero);
    const __m128i v_ehi_d = _mm_madd_epi16(v_dhi_d, v_mhi_d);
    // Square and sum the errors -> 36bits * 4 = 38bits
    __m128i v_se0_q, v_se1_q, v_se2_q, v_se3_q, v_se_q, v_elo1_d, v_ehi3_d;
    v_se0_q = _mm_mul_epu32(v_elo_d, v_elo_d);
    v_elo1_d = _mm_srli_si128(v_elo_d, 4);
    v_se1_q = _mm_mul_epu32(v_elo1_d, v_elo1_d);
    v_se0_q = _mm_add_epi64(v_se0_q, v_se1_q);
    v_se2_q = _mm_mul_epu32(v_ehi_d, v_ehi_d);
    v_ehi3_d = _mm_srli_si128(v_ehi_d, 4);
    v_se3_q = _mm_mul_epu32(v_ehi3_d, v_ehi3_d);
    v_se1_q = _mm_add_epi64(v_se2_q, v_se3_q);
    v_se_q = _mm_add_epi64(v_se0_q, v_se1_q);

    // Accumulate
    v_sum_d = _mm_add_epi32(v_sum_d, v_e_d);
    v_sse_q = _mm_add_epi64(v_sse_q, v_se_q);

    // Move on to next row
    a += a_stride * 2;
    b += b_stride * 2;
    m += m_stride * 2;
  }

  // Horizontal sum
  *sum = hsum_epi32_si32(v_sum_d);
  *sse = hsum_epi64_si64(v_sse_q);

  // Round
  *sum = (*sum >= 0) ? *sum : -*sum;
  *sum = ROUND_POWER_OF_TWO(*sum, 6);
  *sse = ROUND_POWER_OF_TWO(*sse, 12);
}

static INLINE unsigned int highbd_masked_variancewxh_ssse3(
    const uint16_t *a, int a_stride, const uint16_t *b, int b_stride,
    const uint8_t *m, int m_stride, int w, int h, unsigned int *sse) {
  uint64_t sse64;
  int64_t sum64;

  if (w == 4)
    highbd_masked_variance64_4wide_ssse3(a, a_stride, b, b_stride, m, m_stride,
                                         h, &sum64, &sse64);
  else
    highbd_masked_variance64_ssse3(a, a_stride, b, b_stride, m, m_stride, w, h,
                                   &sum64, &sse64);

  // Store the SSE
  *sse = (uint32_t)sse64;
  // Compute and return variance
  return *sse - (uint32_t)((sum64 * sum64) / (w * h));
}

static INLINE unsigned int highbd_10_masked_variancewxh_ssse3(
    const uint16_t *a, int a_stride, const uint16_t *b, int b_stride,
    const uint8_t *m, int m_stride, int w, int h, unsigned int *sse) {
  uint64_t sse64;
  int64_t sum64;

  if (w == 4)
    highbd_masked_variance64_4wide_ssse3(a, a_stride, b, b_stride, m, m_stride,
                                         h, &sum64, &sse64);
  else
    highbd_masked_variance64_ssse3(a, a_stride, b, b_stride, m, m_stride, w, h,
                                   &sum64, &sse64);

  // Normalise
  sum64 = ROUND_POWER_OF_TWO(sum64, 2);
  sse64 = ROUND_POWER_OF_TWO(sse64, 4);

  // Store the SSE
  *sse = (uint32_t)sse64;
  // Compute and return variance
  return *sse - (uint32_t)((sum64 * sum64) / (w * h));
}

static INLINE unsigned int highbd_12_masked_variancewxh_ssse3(
    const uint16_t *a, int a_stride, const uint16_t *b, int b_stride,
    const uint8_t *m, int m_stride, int w, int h, unsigned int *sse) {
  uint64_t sse64;
  int64_t sum64;

  if (w == 4)
    highbd_masked_variance64_4wide_ssse3(a, a_stride, b, b_stride, m, m_stride,
                                         h, &sum64, &sse64);
  else
    highbd_masked_variance64_ssse3(a, a_stride, b, b_stride, m, m_stride, w, h,
                                   &sum64, &sse64);

  sum64 = ROUND_POWER_OF_TWO(sum64, 4);
  sse64 = ROUND_POWER_OF_TWO(sse64, 8);

  // Store the SSE
  *sse = (uint32_t)sse64;
  // Compute and return variance
  return *sse - (uint32_t)((sum64 * sum64) / (w * h));
}

#define HIGHBD_MASKED_VARWXH(W, H)                                         \
  unsigned int aom_highbd_masked_variance##W##x##H##_ssse3(                \
      const uint8_t *a8, int a_stride, const uint8_t *b8, int b_stride,    \
      const uint8_t *m, int m_stride, unsigned int *sse) {                 \
    uint16_t *a = CONVERT_TO_SHORTPTR(a8);                                 \
    uint16_t *b = CONVERT_TO_SHORTPTR(b8);                                 \
    return highbd_masked_variancewxh_ssse3(a, a_stride, b, b_stride, m,    \
                                           m_stride, W, H, sse);           \
  }                                                                        \
                                                                           \
  unsigned int aom_highbd_10_masked_variance##W##x##H##_ssse3(             \
      const uint8_t *a8, int a_stride, const uint8_t *b8, int b_stride,    \
      const uint8_t *m, int m_stride, unsigned int *sse) {                 \
    uint16_t *a = CONVERT_TO_SHORTPTR(a8);                                 \
    uint16_t *b = CONVERT_TO_SHORTPTR(b8);                                 \
    return highbd_10_masked_variancewxh_ssse3(a, a_stride, b, b_stride, m, \
                                              m_stride, W, H, sse);        \
  }                                                                        \
                                                                           \
  unsigned int aom_highbd_12_masked_variance##W##x##H##_ssse3(             \
      const uint8_t *a8, int a_stride, const uint8_t *b8, int b_stride,    \
      const uint8_t *m, int m_stride, unsigned int *sse) {                 \
    uint16_t *a = CONVERT_TO_SHORTPTR(a8);                                 \
    uint16_t *b = CONVERT_TO_SHORTPTR(b8);                                 \
    return highbd_12_masked_variancewxh_ssse3(a, a_stride, b, b_stride, m, \
                                              m_stride, W, H, sse);        \
  }

HIGHBD_MASKED_VARWXH(4, 4)
HIGHBD_MASKED_VARWXH(4, 8)
HIGHBD_MASKED_VARWXH(8, 4)
HIGHBD_MASKED_VARWXH(8, 8)
HIGHBD_MASKED_VARWXH(8, 16)
HIGHBD_MASKED_VARWXH(16, 8)
HIGHBD_MASKED_VARWXH(16, 16)
HIGHBD_MASKED_VARWXH(16, 32)
HIGHBD_MASKED_VARWXH(32, 16)
HIGHBD_MASKED_VARWXH(32, 32)
HIGHBD_MASKED_VARWXH(32, 64)
HIGHBD_MASKED_VARWXH(64, 32)
HIGHBD_MASKED_VARWXH(64, 64)
#if CONFIG_EXT_PARTITION
HIGHBD_MASKED_VARWXH(64, 128)
HIGHBD_MASKED_VARWXH(128, 64)
HIGHBD_MASKED_VARWXH(128, 128)
#endif  // CONFIG_EXT_PARTITION

#endif

//////////////////////////////////////////////////////////////////////////////
// Sub pixel versions
//////////////////////////////////////////////////////////////////////////////

typedef __m128i (*filter_fn_t)(__m128i v_a_b, __m128i v_b_b,
                               __m128i v_filter_b);

static INLINE __m128i apply_filter_avg(const __m128i v_a_b, const __m128i v_b_b,
                                       const __m128i v_filter_b) {
  (void)v_filter_b;
  return _mm_avg_epu8(v_a_b, v_b_b);
}

static INLINE __m128i apply_filter(const __m128i v_a_b, const __m128i v_b_b,
                                   const __m128i v_filter_b) {
  const __m128i v_rounding_w = _mm_set1_epi16(1 << (FILTER_BITS - 1));
  __m128i v_input_lo_b = _mm_unpacklo_epi8(v_a_b, v_b_b);
  __m128i v_input_hi_b = _mm_unpackhi_epi8(v_a_b, v_b_b);
  __m128i v_temp0_w = _mm_maddubs_epi16(v_input_lo_b, v_filter_b);
  __m128i v_temp1_w = _mm_maddubs_epi16(v_input_hi_b, v_filter_b);
  __m128i v_res_lo_w =
      _mm_srai_epi16(_mm_add_epi16(v_temp0_w, v_rounding_w), FILTER_BITS);
  __m128i v_res_hi_w =
      _mm_srai_epi16(_mm_add_epi16(v_temp1_w, v_rounding_w), FILTER_BITS);
  return _mm_packus_epi16(v_res_lo_w, v_res_hi_w);
}

// Apply the filter to the contents of the lower half of a and b
static INLINE void apply_filter_lo(const __m128i v_a_lo_b,
                                   const __m128i v_b_lo_b,
                                   const __m128i v_filter_b, __m128i *v_res_w) {
  const __m128i v_rounding_w = _mm_set1_epi16(1 << (FILTER_BITS - 1));
  __m128i v_input_b = _mm_unpacklo_epi8(v_a_lo_b, v_b_lo_b);
  __m128i v_temp0_w = _mm_maddubs_epi16(v_input_b, v_filter_b);
  *v_res_w =
      _mm_srai_epi16(_mm_add_epi16(v_temp0_w, v_rounding_w), FILTER_BITS);
}

static void sum_and_sse(const __m128i v_a_b, const __m128i v_b_b,
                        const __m128i v_m_b, __m128i *v_sum_d,
                        __m128i *v_sse_q) {
  const __m128i v_zero = _mm_setzero_si128();
  // Unpack to 16 bits - still containing max 8 bits
  const __m128i v_a0_w = _mm_unpacklo_epi8(v_a_b, v_zero);
  const __m128i v_b0_w = _mm_unpacklo_epi8(v_b_b, v_zero);
  const __m128i v_m0_w = _mm_unpacklo_epi8(v_m_b, v_zero);
  const __m128i v_a1_w = _mm_unpackhi_epi8(v_a_b, v_zero);
  const __m128i v_b1_w = _mm_unpackhi_epi8(v_b_b, v_zero);
  const __m128i v_m1_w = _mm_unpackhi_epi8(v_m_b, v_zero);

  // Difference: [-255, 255]
  const __m128i v_d0_w = _mm_sub_epi16(v_a0_w, v_b0_w);
  const __m128i v_d1_w = _mm_sub_epi16(v_a1_w, v_b1_w);

  // Error - [-255, 255] * [0, 64] = [0xc040, 0x3fc0] => fits in 15 bits
  const __m128i v_e0_w = _mm_mullo_epi16(v_d0_w, v_m0_w);
  const __m128i v_e0_d = _mm_madd_epi16(v_d0_w, v_m0_w);
  const __m128i v_e1_w = _mm_mullo_epi16(v_d1_w, v_m1_w);
  const __m128i v_e1_d = _mm_madd_epi16(v_d1_w, v_m1_w);

  // Squared error - using madd it's max (15 bits * 15 bits) * 2 = 31 bits
  const __m128i v_se0_d = _mm_madd_epi16(v_e0_w, v_e0_w);
  const __m128i v_se1_d = _mm_madd_epi16(v_e1_w, v_e1_w);

  // Sum of v_se{0,1}_d - 31 bits + 31 bits = 32 bits
  const __m128i v_se_d = _mm_add_epi32(v_se0_d, v_se1_d);

  // Unpack Squared error to 64 bits
  const __m128i v_se_lo_q = _mm_unpacklo_epi32(v_se_d, v_zero);
  const __m128i v_se_hi_q = _mm_unpackhi_epi32(v_se_d, v_zero);

  // Accumulate
  *v_sum_d = _mm_add_epi32(*v_sum_d, v_e0_d);
  *v_sum_d = _mm_add_epi32(*v_sum_d, v_e1_d);
  *v_sse_q = _mm_add_epi64(*v_sse_q, v_se_lo_q);
  *v_sse_q = _mm_add_epi64(*v_sse_q, v_se_hi_q);
}

// Functions for width (W) >= 16
unsigned int aom_masked_subpel_varWxH_xzero(const uint8_t *src, int src_stride,
                                            int yoffset, const uint8_t *dst,
                                            int dst_stride, const uint8_t *msk,
                                            int msk_stride, unsigned int *sse,
                                            int w, int h,
                                            filter_fn_t filter_fn) {
  int i, j;
  __m128i v_src0_b, v_src1_b, v_res_b, v_dst_b, v_msk_b;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  const __m128i v_filter_b = _mm_set1_epi16(
      (bilinear_filters_2t[yoffset][1] << 8) + bilinear_filters_2t[yoffset][0]);
  assert(yoffset < BIL_SUBPEL_SHIFTS);
  for (j = 0; j < w; j += 16) {
    // Load the first row ready
    v_src0_b = _mm_loadu_si128((const __m128i *)(src + j));
    // Process 2 rows at a time
    for (i = 0; i < h; i += 2) {
      // Load the next row apply the filter
      v_src1_b = _mm_loadu_si128((const __m128i *)(src + j + src_stride));
      v_res_b = filter_fn(v_src0_b, v_src1_b, v_filter_b);
      // Load the dst and msk for the variance calculation
      v_dst_b = _mm_loadu_si128((const __m128i *)(dst + j));
      v_msk_b = _mm_loadu_si128((const __m128i *)(msk + j));
      sum_and_sse(v_res_b, v_dst_b, v_msk_b, &v_sum_d, &v_sse_q);

      // Load the next row apply the filter
      v_src0_b = _mm_loadu_si128((const __m128i *)(src + j + src_stride * 2));
      v_res_b = filter_fn(v_src1_b, v_src0_b, v_filter_b);
      // Load the dst and msk for the variance calculation
      v_dst_b = _mm_loadu_si128((const __m128i *)(dst + j + dst_stride));
      v_msk_b = _mm_loadu_si128((const __m128i *)(msk + j + msk_stride));
      sum_and_sse(v_res_b, v_dst_b, v_msk_b, &v_sum_d, &v_sse_q);
      // Move onto the next block of rows
      src += src_stride * 2;
      dst += dst_stride * 2;
      msk += msk_stride * 2;
    }
    // Reset to the top of the block
    src -= src_stride * h;
    dst -= dst_stride * h;
    msk -= msk_stride * h;
  }
  return calc_masked_variance(v_sum_d, v_sse_q, sse, w, h);
}
unsigned int aom_masked_subpel_varWxH_yzero(const uint8_t *src, int src_stride,
                                            int xoffset, const uint8_t *dst,
                                            int dst_stride, const uint8_t *msk,
                                            int msk_stride, unsigned int *sse,
                                            int w, int h,
                                            filter_fn_t filter_fn) {
  int i, j;
  __m128i v_src0_b, v_src1_b, v_res_b, v_dst_b, v_msk_b;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  const __m128i v_filter_b = _mm_set1_epi16(
      (bilinear_filters_2t[xoffset][1] << 8) + bilinear_filters_2t[xoffset][0]);
  assert(xoffset < BIL_SUBPEL_SHIFTS);
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j += 16) {
      // Load this row and one below & apply the filter to them
      v_src0_b = _mm_loadu_si128((const __m128i *)(src + j));
      v_src1_b = _mm_loadu_si128((const __m128i *)(src + j + 1));
      v_res_b = filter_fn(v_src0_b, v_src1_b, v_filter_b);

      // Load the dst and msk for the variance calculation
      v_dst_b = _mm_loadu_si128((const __m128i *)(dst + j));
      v_msk_b = _mm_loadu_si128((const __m128i *)(msk + j));
      sum_and_sse(v_res_b, v_dst_b, v_msk_b, &v_sum_d, &v_sse_q);
    }
    src += src_stride;
    dst += dst_stride;
    msk += msk_stride;
  }
  return calc_masked_variance(v_sum_d, v_sse_q, sse, w, h);
}
unsigned int aom_masked_subpel_varWxH_xnonzero_ynonzero(
    const uint8_t *src, int src_stride, int xoffset, int yoffset,
    const uint8_t *dst, int dst_stride, const uint8_t *msk, int msk_stride,
    unsigned int *sse, int w, int h, filter_fn_t xfilter_fn,
    filter_fn_t yfilter_fn) {
  int i, j;
  __m128i v_src0_b, v_src1_b, v_src2_b, v_src3_b;
  __m128i v_filtered0_b, v_filtered1_b, v_res_b, v_dst_b, v_msk_b;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  const __m128i v_filterx_b = _mm_set1_epi16(
      (bilinear_filters_2t[xoffset][1] << 8) + bilinear_filters_2t[xoffset][0]);
  const __m128i v_filtery_b = _mm_set1_epi16(
      (bilinear_filters_2t[yoffset][1] << 8) + bilinear_filters_2t[yoffset][0]);
  assert(yoffset < BIL_SUBPEL_SHIFTS);
  assert(xoffset < BIL_SUBPEL_SHIFTS);
  for (j = 0; j < w; j += 16) {
    // Load the first row ready
    v_src0_b = _mm_loadu_si128((const __m128i *)(src + j));
    v_src1_b = _mm_loadu_si128((const __m128i *)(src + j + 1));
    v_filtered0_b = xfilter_fn(v_src0_b, v_src1_b, v_filterx_b);
    // Process 2 rows at a time
    for (i = 0; i < h; i += 2) {
      // Load the next row & apply the filter
      v_src2_b = _mm_loadu_si128((const __m128i *)(src + src_stride + j));
      v_src3_b = _mm_loadu_si128((const __m128i *)(src + src_stride + j + 1));
      v_filtered1_b = xfilter_fn(v_src2_b, v_src3_b, v_filterx_b);
      // Load the dst and msk for the variance calculation
      v_dst_b = _mm_loadu_si128((const __m128i *)(dst + j));
      v_msk_b = _mm_loadu_si128((const __m128i *)(msk + j));
      // Complete the calculation for this row and add it to the running total
      v_res_b = yfilter_fn(v_filtered0_b, v_filtered1_b, v_filtery_b);
      sum_and_sse(v_res_b, v_dst_b, v_msk_b, &v_sum_d, &v_sse_q);

      // Load the next row & apply the filter
      v_src0_b = _mm_loadu_si128((const __m128i *)(src + src_stride * 2 + j));
      v_src1_b =
          _mm_loadu_si128((const __m128i *)(src + src_stride * 2 + j + 1));
      v_filtered0_b = xfilter_fn(v_src0_b, v_src1_b, v_filterx_b);
      // Load the dst and msk for the variance calculation
      v_dst_b = _mm_loadu_si128((const __m128i *)(dst + dst_stride + j));
      v_msk_b = _mm_loadu_si128((const __m128i *)(msk + msk_stride + j));
      // Complete the calculation for this row and add it to the running total
      v_res_b = yfilter_fn(v_filtered1_b, v_filtered0_b, v_filtery_b);
      sum_and_sse(v_res_b, v_dst_b, v_msk_b, &v_sum_d, &v_sse_q);
      // Move onto the next block of rows
      src += src_stride * 2;
      dst += dst_stride * 2;
      msk += msk_stride * 2;
    }
    // Reset to the top of the block
    src -= src_stride * h;
    dst -= dst_stride * h;
    msk -= msk_stride * h;
  }
  return calc_masked_variance(v_sum_d, v_sse_q, sse, w, h);
}

// Note order in which rows loaded xmm[127:96] = row 1, xmm[95:64] = row 2,
// xmm[63:32] = row 3, xmm[31:0] = row 4
unsigned int aom_masked_subpel_var4xH_xzero(const uint8_t *src, int src_stride,
                                            int yoffset, const uint8_t *dst,
                                            int dst_stride, const uint8_t *msk,
                                            int msk_stride, unsigned int *sse,
                                            int h) {
  int i;
  __m128i v_src0_b, v_src1_b, v_src2_b, v_src3_b, v_filtered1_w, v_filtered2_w;
  __m128i v_dst0_b, v_dst1_b, v_dst2_b, v_dst3_b;
  __m128i v_msk0_b, v_msk1_b, v_msk2_b, v_msk3_b, v_res_b;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  __m128i v_filter_b = _mm_set1_epi16((bilinear_filters_2t[yoffset][1] << 8) +
                                      bilinear_filters_2t[yoffset][0]);
  assert(yoffset < BIL_SUBPEL_SHIFTS);
  // Load the first row of src data ready
  v_src0_b = _mm_loadl_epi64((const __m128i *)src);
  for (i = 0; i < h; i += 4) {
    // Load the rest of the source data for these rows
    v_src1_b = _mm_loadl_epi64((const __m128i *)(src + src_stride * 1));
    v_src1_b = _mm_unpacklo_epi32(v_src1_b, v_src0_b);
    v_src2_b = _mm_loadl_epi64((const __m128i *)(src + src_stride * 2));
    v_src3_b = _mm_loadl_epi64((const __m128i *)(src + src_stride * 3));
    v_src3_b = _mm_unpacklo_epi32(v_src3_b, v_src2_b);
    v_src0_b = _mm_loadl_epi64((const __m128i *)(src + src_stride * 4));
    // Load the dst data
    v_dst0_b = _mm_cvtsi32_si128(*(const uint32_t *)(dst + dst_stride * 0));
    v_dst1_b = _mm_cvtsi32_si128(*(const uint32_t *)(dst + dst_stride * 1));
    v_dst0_b = _mm_unpacklo_epi32(v_dst1_b, v_dst0_b);
    v_dst2_b = _mm_cvtsi32_si128(*(const uint32_t *)(dst + dst_stride * 2));
    v_dst3_b = _mm_cvtsi32_si128(*(const uint32_t *)(dst + dst_stride * 3));
    v_dst2_b = _mm_unpacklo_epi32(v_dst3_b, v_dst2_b);
    v_dst0_b = _mm_unpacklo_epi64(v_dst2_b, v_dst0_b);
    // Load the mask data
    v_msk0_b = _mm_cvtsi32_si128(*(const uint32_t *)(msk + msk_stride * 0));
    v_msk1_b = _mm_cvtsi32_si128(*(const uint32_t *)(msk + msk_stride * 1));
    v_msk0_b = _mm_unpacklo_epi32(v_msk1_b, v_msk0_b);
    v_msk2_b = _mm_cvtsi32_si128(*(const uint32_t *)(msk + msk_stride * 2));
    v_msk3_b = _mm_cvtsi32_si128(*(const uint32_t *)(msk + msk_stride * 3));
    v_msk2_b = _mm_unpacklo_epi32(v_msk3_b, v_msk2_b);
    v_msk0_b = _mm_unpacklo_epi64(v_msk2_b, v_msk0_b);
    // Apply the y filter
    if (yoffset == HALF_PIXEL_OFFSET) {
      v_src1_b = _mm_unpacklo_epi64(v_src3_b, v_src1_b);
      v_src2_b =
          _mm_or_si128(_mm_slli_si128(v_src1_b, 4),
                       _mm_and_si128(v_src0_b, _mm_setr_epi32(-1, 0, 0, 0)));
      v_res_b = _mm_avg_epu8(v_src1_b, v_src2_b);
    } else {
      v_src2_b =
          _mm_or_si128(_mm_slli_si128(v_src1_b, 4),
                       _mm_and_si128(v_src2_b, _mm_setr_epi32(-1, 0, 0, 0)));
      apply_filter_lo(v_src1_b, v_src2_b, v_filter_b, &v_filtered1_w);
      v_src2_b =
          _mm_or_si128(_mm_slli_si128(v_src3_b, 4),
                       _mm_and_si128(v_src0_b, _mm_setr_epi32(-1, 0, 0, 0)));
      apply_filter_lo(v_src3_b, v_src2_b, v_filter_b, &v_filtered2_w);
      v_res_b = _mm_packus_epi16(v_filtered2_w, v_filtered1_w);
    }
    // Compute the sum and SSE
    sum_and_sse(v_res_b, v_dst0_b, v_msk0_b, &v_sum_d, &v_sse_q);
    // Move onto the next set of rows
    src += src_stride * 4;
    dst += dst_stride * 4;
    msk += msk_stride * 4;
  }
  return calc_masked_variance(v_sum_d, v_sse_q, sse, 4, h);
}

// Note order in which rows loaded xmm[127:64] = row 1, xmm[63:0] = row 2
unsigned int aom_masked_subpel_var8xH_xzero(const uint8_t *src, int src_stride,
                                            int yoffset, const uint8_t *dst,
                                            int dst_stride, const uint8_t *msk,
                                            int msk_stride, unsigned int *sse,
                                            int h) {
  int i;
  __m128i v_src0_b, v_src1_b, v_filtered0_w, v_filtered1_w, v_res_b;
  __m128i v_dst_b = _mm_setzero_si128();
  __m128i v_msk_b = _mm_setzero_si128();
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  __m128i v_filter_b = _mm_set1_epi16((bilinear_filters_2t[yoffset][1] << 8) +
                                      bilinear_filters_2t[yoffset][0]);
  assert(yoffset < BIL_SUBPEL_SHIFTS);
  // Load the first row of src data ready
  v_src0_b = _mm_loadl_epi64((const __m128i *)src);
  for (i = 0; i < h; i += 2) {
    if (yoffset == HALF_PIXEL_OFFSET) {
      // Load the rest of the source data for these rows
      v_src1_b = _mm_or_si128(
          _mm_slli_si128(v_src0_b, 8),
          _mm_loadl_epi64((const __m128i *)(src + src_stride * 1)));
      v_src0_b = _mm_or_si128(
          _mm_slli_si128(v_src1_b, 8),
          _mm_loadl_epi64((const __m128i *)(src + src_stride * 2)));
      // Apply the y filter
      v_res_b = _mm_avg_epu8(v_src1_b, v_src0_b);
    } else {
      // Load the data and apply the y filter
      v_src1_b = _mm_loadl_epi64((const __m128i *)(src + src_stride * 1));
      apply_filter_lo(v_src0_b, v_src1_b, v_filter_b, &v_filtered0_w);
      v_src0_b = _mm_loadl_epi64((const __m128i *)(src + src_stride * 2));
      apply_filter_lo(v_src1_b, v_src0_b, v_filter_b, &v_filtered1_w);
      v_res_b = _mm_packus_epi16(v_filtered1_w, v_filtered0_w);
    }
    // Load the dst data
    v_dst_b = _mm_unpacklo_epi64(
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 1)),
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 0)));
    // Load the mask data
    v_msk_b = _mm_unpacklo_epi64(
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 1)),
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 0)));
    // Compute the sum and SSE
    sum_and_sse(v_res_b, v_dst_b, v_msk_b, &v_sum_d, &v_sse_q);
    // Move onto the next set of rows
    src += src_stride * 2;
    dst += dst_stride * 2;
    msk += msk_stride * 2;
  }
  return calc_masked_variance(v_sum_d, v_sse_q, sse, 8, h);
}

// Note order in which rows loaded xmm[127:96] = row 1, xmm[95:64] = row 2,
// xmm[63:32] = row 3, xmm[31:0] = row 4
unsigned int aom_masked_subpel_var4xH_yzero(const uint8_t *src, int src_stride,
                                            int xoffset, const uint8_t *dst,
                                            int dst_stride, const uint8_t *msk,
                                            int msk_stride, unsigned int *sse,
                                            int h) {
  int i;
  __m128i v_src0_b, v_src1_b, v_src2_b, v_src3_b, v_filtered0_w, v_filtered2_w;
  __m128i v_src0_shift_b, v_src1_shift_b, v_src2_shift_b, v_src3_shift_b;
  __m128i v_dst0_b, v_dst1_b, v_dst2_b, v_dst3_b;
  __m128i v_msk0_b, v_msk1_b, v_msk2_b, v_msk3_b, v_res_b;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  __m128i v_filter_b = _mm_set1_epi16((bilinear_filters_2t[xoffset][1] << 8) +
                                      bilinear_filters_2t[xoffset][0]);
  assert(xoffset < BIL_SUBPEL_SHIFTS);
  for (i = 0; i < h; i += 4) {
    // Load the src data
    v_src0_b = _mm_loadl_epi64((const __m128i *)src);
    v_src0_shift_b = _mm_srli_si128(v_src0_b, 1);
    v_src1_b = _mm_loadl_epi64((const __m128i *)(src + src_stride * 1));
    v_src0_b = _mm_unpacklo_epi32(v_src1_b, v_src0_b);
    v_src1_shift_b = _mm_srli_si128(v_src1_b, 1);
    v_src2_b = _mm_loadl_epi64((const __m128i *)(src + src_stride * 2));
    v_src0_shift_b = _mm_unpacklo_epi32(v_src1_shift_b, v_src0_shift_b);
    v_src2_shift_b = _mm_srli_si128(v_src2_b, 1);
    v_src3_b = _mm_loadl_epi64((const __m128i *)(src + src_stride * 3));
    v_src2_b = _mm_unpacklo_epi32(v_src3_b, v_src2_b);
    v_src3_shift_b = _mm_srli_si128(v_src3_b, 1);
    v_src2_shift_b = _mm_unpacklo_epi32(v_src3_shift_b, v_src2_shift_b);
    // Load the dst data
    v_dst0_b = _mm_cvtsi32_si128(*(const uint32_t *)(dst + dst_stride * 0));
    v_dst1_b = _mm_cvtsi32_si128(*(const uint32_t *)(dst + dst_stride * 1));
    v_dst0_b = _mm_unpacklo_epi32(v_dst1_b, v_dst0_b);
    v_dst2_b = _mm_cvtsi32_si128(*(const uint32_t *)(dst + dst_stride * 2));
    v_dst3_b = _mm_cvtsi32_si128(*(const uint32_t *)(dst + dst_stride * 3));
    v_dst2_b = _mm_unpacklo_epi32(v_dst3_b, v_dst2_b);
    v_dst0_b = _mm_unpacklo_epi64(v_dst2_b, v_dst0_b);
    // Load the mask data
    v_msk0_b = _mm_cvtsi32_si128(*(const uint32_t *)(msk + msk_stride * 0));
    v_msk1_b = _mm_cvtsi32_si128(*(const uint32_t *)(msk + msk_stride * 1));
    v_msk0_b = _mm_unpacklo_epi32(v_msk1_b, v_msk0_b);
    v_msk2_b = _mm_cvtsi32_si128(*(const uint32_t *)(msk + msk_stride * 2));
    v_msk3_b = _mm_cvtsi32_si128(*(const uint32_t *)(msk + msk_stride * 3));
    v_msk2_b = _mm_unpacklo_epi32(v_msk3_b, v_msk2_b);
    v_msk0_b = _mm_unpacklo_epi64(v_msk2_b, v_msk0_b);
    // Apply the x filter
    if (xoffset == HALF_PIXEL_OFFSET) {
      v_src0_b = _mm_unpacklo_epi64(v_src2_b, v_src0_b);
      v_src0_shift_b = _mm_unpacklo_epi64(v_src2_shift_b, v_src0_shift_b);
      v_res_b = _mm_avg_epu8(v_src0_b, v_src0_shift_b);
    } else {
      apply_filter_lo(v_src0_b, v_src0_shift_b, v_filter_b, &v_filtered0_w);
      apply_filter_lo(v_src2_b, v_src2_shift_b, v_filter_b, &v_filtered2_w);
      v_res_b = _mm_packus_epi16(v_filtered2_w, v_filtered0_w);
    }
    // Compute the sum and SSE
    sum_and_sse(v_res_b, v_dst0_b, v_msk0_b, &v_sum_d, &v_sse_q);
    // Move onto the next set of rows
    src += src_stride * 4;
    dst += dst_stride * 4;
    msk += msk_stride * 4;
  }
  return calc_masked_variance(v_sum_d, v_sse_q, sse, 4, h);
}

unsigned int aom_masked_subpel_var8xH_yzero(const uint8_t *src, int src_stride,
                                            int xoffset, const uint8_t *dst,
                                            int dst_stride, const uint8_t *msk,
                                            int msk_stride, unsigned int *sse,
                                            int h) {
  int i;
  __m128i v_src0_b, v_src1_b, v_filtered0_w, v_filtered1_w;
  __m128i v_src0_shift_b, v_src1_shift_b, v_res_b, v_dst_b, v_msk_b;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  __m128i v_filter_b = _mm_set1_epi16((bilinear_filters_2t[xoffset][1] << 8) +
                                      bilinear_filters_2t[xoffset][0]);
  assert(xoffset < BIL_SUBPEL_SHIFTS);
  for (i = 0; i < h; i += 2) {
    // Load the src data
    v_src0_b = _mm_loadu_si128((const __m128i *)(src));
    v_src0_shift_b = _mm_srli_si128(v_src0_b, 1);
    v_src1_b = _mm_loadu_si128((const __m128i *)(src + src_stride));
    v_src1_shift_b = _mm_srli_si128(v_src1_b, 1);
    // Apply the x filter
    if (xoffset == HALF_PIXEL_OFFSET) {
      v_src1_b = _mm_unpacklo_epi64(v_src0_b, v_src1_b);
      v_src1_shift_b = _mm_unpacklo_epi64(v_src0_shift_b, v_src1_shift_b);
      v_res_b = _mm_avg_epu8(v_src1_b, v_src1_shift_b);
    } else {
      apply_filter_lo(v_src0_b, v_src0_shift_b, v_filter_b, &v_filtered0_w);
      apply_filter_lo(v_src1_b, v_src1_shift_b, v_filter_b, &v_filtered1_w);
      v_res_b = _mm_packus_epi16(v_filtered0_w, v_filtered1_w);
    }
    // Load the dst data
    v_dst_b = _mm_unpacklo_epi64(
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 0)),
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 1)));
    // Load the mask data
    v_msk_b = _mm_unpacklo_epi64(
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 0)),
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 1)));
    // Compute the sum and SSE
    sum_and_sse(v_res_b, v_dst_b, v_msk_b, &v_sum_d, &v_sse_q);
    // Move onto the next set of rows
    src += src_stride * 2;
    dst += dst_stride * 2;
    msk += msk_stride * 2;
  }
  return calc_masked_variance(v_sum_d, v_sse_q, sse, 8, h);
}

// Note order in which rows loaded xmm[127:96] = row 1, xmm[95:64] = row 2,
// xmm[63:32] = row 3, xmm[31:0] = row 4
unsigned int aom_masked_subpel_var4xH_xnonzero_ynonzero(
    const uint8_t *src, int src_stride, int xoffset, int yoffset,
    const uint8_t *dst, int dst_stride, const uint8_t *msk, int msk_stride,
    unsigned int *sse, int h) {
  int i;
  __m128i v_src0_b, v_src1_b, v_src2_b, v_src3_b, v_filtered0_w, v_filtered2_w;
  __m128i v_src0_shift_b, v_src1_shift_b, v_src2_shift_b, v_src3_shift_b;
  __m128i v_dst0_b, v_dst1_b, v_dst2_b, v_dst3_b, v_temp_b;
  __m128i v_msk0_b, v_msk1_b, v_msk2_b, v_msk3_b, v_extra_row_b, v_res_b;
  __m128i v_xres_b[2];
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  __m128i v_filterx_b = _mm_set1_epi16((bilinear_filters_2t[xoffset][1] << 8) +
                                       bilinear_filters_2t[xoffset][0]);
  __m128i v_filtery_b = _mm_set1_epi16((bilinear_filters_2t[yoffset][1] << 8) +
                                       bilinear_filters_2t[yoffset][0]);
  assert(xoffset < BIL_SUBPEL_SHIFTS);
  assert(yoffset < BIL_SUBPEL_SHIFTS);
  for (i = 0; i < h; i += 4) {
    // Load the src data
    v_src0_b = _mm_loadl_epi64((const __m128i *)src);
    v_src0_shift_b = _mm_srli_si128(v_src0_b, 1);
    v_src1_b = _mm_loadl_epi64((const __m128i *)(src + src_stride * 1));
    v_src0_b = _mm_unpacklo_epi32(v_src1_b, v_src0_b);
    v_src1_shift_b = _mm_srli_si128(v_src1_b, 1);
    v_src2_b = _mm_loadl_epi64((const __m128i *)(src + src_stride * 2));
    v_src0_shift_b = _mm_unpacklo_epi32(v_src1_shift_b, v_src0_shift_b);
    v_src2_shift_b = _mm_srli_si128(v_src2_b, 1);
    v_src3_b = _mm_loadl_epi64((const __m128i *)(src + src_stride * 3));
    v_src2_b = _mm_unpacklo_epi32(v_src3_b, v_src2_b);
    v_src3_shift_b = _mm_srli_si128(v_src3_b, 1);
    v_src2_shift_b = _mm_unpacklo_epi32(v_src3_shift_b, v_src2_shift_b);
    // Apply the x filter
    if (xoffset == HALF_PIXEL_OFFSET) {
      v_src0_b = _mm_unpacklo_epi64(v_src2_b, v_src0_b);
      v_src0_shift_b = _mm_unpacklo_epi64(v_src2_shift_b, v_src0_shift_b);
      v_xres_b[i == 0 ? 0 : 1] = _mm_avg_epu8(v_src0_b, v_src0_shift_b);
    } else {
      apply_filter_lo(v_src0_b, v_src0_shift_b, v_filterx_b, &v_filtered0_w);
      apply_filter_lo(v_src2_b, v_src2_shift_b, v_filterx_b, &v_filtered2_w);
      v_xres_b[i == 0 ? 0 : 1] = _mm_packus_epi16(v_filtered2_w, v_filtered0_w);
    }
    // Move onto the next set of rows
    src += src_stride * 4;
  }
  // Load one more row to be used in the y filter
  v_src0_b = _mm_loadl_epi64((const __m128i *)src);
  v_src0_shift_b = _mm_srli_si128(v_src0_b, 1);
  // Apply the x filter
  if (xoffset == HALF_PIXEL_OFFSET) {
    v_extra_row_b = _mm_and_si128(_mm_avg_epu8(v_src0_b, v_src0_shift_b),
                                  _mm_setr_epi32(-1, 0, 0, 0));
  } else {
    apply_filter_lo(v_src0_b, v_src0_shift_b, v_filterx_b, &v_filtered0_w);
    v_extra_row_b =
        _mm_and_si128(_mm_packus_epi16(v_filtered0_w, _mm_setzero_si128()),
                      _mm_setr_epi32(-1, 0, 0, 0));
  }

  for (i = 0; i < h; i += 4) {
    if (h == 8 && i == 0) {
      v_temp_b = _mm_or_si128(_mm_slli_si128(v_xres_b[0], 4),
                              _mm_srli_si128(v_xres_b[1], 12));
    } else {
      v_temp_b = _mm_or_si128(_mm_slli_si128(v_xres_b[i == 0 ? 0 : 1], 4),
                              v_extra_row_b);
    }
    // Apply the y filter
    if (yoffset == HALF_PIXEL_OFFSET) {
      v_res_b = _mm_avg_epu8(v_xres_b[i == 0 ? 0 : 1], v_temp_b);
    } else {
      v_res_b = apply_filter(v_xres_b[i == 0 ? 0 : 1], v_temp_b, v_filtery_b);
    }

    // Load the dst data
    v_dst0_b = _mm_cvtsi32_si128(*(const uint32_t *)(dst + dst_stride * 0));
    v_dst1_b = _mm_cvtsi32_si128(*(const uint32_t *)(dst + dst_stride * 1));
    v_dst0_b = _mm_unpacklo_epi32(v_dst1_b, v_dst0_b);
    v_dst2_b = _mm_cvtsi32_si128(*(const uint32_t *)(dst + dst_stride * 2));
    v_dst3_b = _mm_cvtsi32_si128(*(const uint32_t *)(dst + dst_stride * 3));
    v_dst2_b = _mm_unpacklo_epi32(v_dst3_b, v_dst2_b);
    v_dst0_b = _mm_unpacklo_epi64(v_dst2_b, v_dst0_b);
    // Load the mask data
    v_msk0_b = _mm_cvtsi32_si128(*(const uint32_t *)(msk + msk_stride * 0));
    v_msk1_b = _mm_cvtsi32_si128(*(const uint32_t *)(msk + msk_stride * 1));
    v_msk0_b = _mm_unpacklo_epi32(v_msk1_b, v_msk0_b);
    v_msk2_b = _mm_cvtsi32_si128(*(const uint32_t *)(msk + msk_stride * 2));
    v_msk3_b = _mm_cvtsi32_si128(*(const uint32_t *)(msk + msk_stride * 3));
    v_msk2_b = _mm_unpacklo_epi32(v_msk3_b, v_msk2_b);
    v_msk0_b = _mm_unpacklo_epi64(v_msk2_b, v_msk0_b);
    // Compute the sum and SSE
    sum_and_sse(v_res_b, v_dst0_b, v_msk0_b, &v_sum_d, &v_sse_q);
    // Move onto the next set of rows
    dst += dst_stride * 4;
    msk += msk_stride * 4;
  }
  return calc_masked_variance(v_sum_d, v_sse_q, sse, 4, h);
}

unsigned int aom_masked_subpel_var8xH_xnonzero_ynonzero(
    const uint8_t *src, int src_stride, int xoffset, int yoffset,
    const uint8_t *dst, int dst_stride, const uint8_t *msk, int msk_stride,
    unsigned int *sse, int h) {
  int i;
  __m128i v_src0_b, v_src1_b, v_filtered0_w, v_filtered1_w, v_dst_b, v_msk_b;
  __m128i v_src0_shift_b, v_src1_shift_b;
  __m128i v_xres0_b, v_xres1_b, v_res_b, v_temp_b;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  __m128i v_filterx_b = _mm_set1_epi16((bilinear_filters_2t[xoffset][1] << 8) +
                                       bilinear_filters_2t[xoffset][0]);
  __m128i v_filtery_b = _mm_set1_epi16((bilinear_filters_2t[yoffset][1] << 8) +
                                       bilinear_filters_2t[yoffset][0]);
  assert(xoffset < BIL_SUBPEL_SHIFTS);
  assert(yoffset < BIL_SUBPEL_SHIFTS);
  // Load the first block of src data
  v_src0_b = _mm_loadu_si128((const __m128i *)(src));
  v_src0_shift_b = _mm_srli_si128(v_src0_b, 1);
  v_src1_b = _mm_loadu_si128((const __m128i *)(src + src_stride));
  v_src1_shift_b = _mm_srli_si128(v_src1_b, 1);
  // Apply the x filter
  if (xoffset == HALF_PIXEL_OFFSET) {
    v_src1_b = _mm_unpacklo_epi64(v_src0_b, v_src1_b);
    v_src1_shift_b = _mm_unpacklo_epi64(v_src0_shift_b, v_src1_shift_b);
    v_xres0_b = _mm_avg_epu8(v_src1_b, v_src1_shift_b);
  } else {
    apply_filter_lo(v_src0_b, v_src0_shift_b, v_filterx_b, &v_filtered0_w);
    apply_filter_lo(v_src1_b, v_src1_shift_b, v_filterx_b, &v_filtered1_w);
    v_xres0_b = _mm_packus_epi16(v_filtered0_w, v_filtered1_w);
  }
  for (i = 0; i < h; i += 4) {
    // Load the next block of src data
    v_src0_b = _mm_loadu_si128((const __m128i *)(src + src_stride * 2));
    v_src0_shift_b = _mm_srli_si128(v_src0_b, 1);
    v_src1_b = _mm_loadu_si128((const __m128i *)(src + src_stride * 3));
    v_src1_shift_b = _mm_srli_si128(v_src1_b, 1);
    // Apply the x filter
    if (xoffset == HALF_PIXEL_OFFSET) {
      v_src1_b = _mm_unpacklo_epi64(v_src0_b, v_src1_b);
      v_src1_shift_b = _mm_unpacklo_epi64(v_src0_shift_b, v_src1_shift_b);
      v_xres1_b = _mm_avg_epu8(v_src1_b, v_src1_shift_b);
    } else {
      apply_filter_lo(v_src0_b, v_src0_shift_b, v_filterx_b, &v_filtered0_w);
      apply_filter_lo(v_src1_b, v_src1_shift_b, v_filterx_b, &v_filtered1_w);
      v_xres1_b = _mm_packus_epi16(v_filtered0_w, v_filtered1_w);
    }
    // Apply the y filter to the previous block
    v_temp_b = _mm_or_si128(_mm_srli_si128(v_xres0_b, 8),
                            _mm_slli_si128(v_xres1_b, 8));
    if (yoffset == HALF_PIXEL_OFFSET) {
      v_res_b = _mm_avg_epu8(v_xres0_b, v_temp_b);
    } else {
      v_res_b = apply_filter(v_xres0_b, v_temp_b, v_filtery_b);
    }
    // Load the dst data
    v_dst_b = _mm_unpacklo_epi64(
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 0)),
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 1)));
    // Load the mask data
    v_msk_b = _mm_unpacklo_epi64(
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 0)),
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 1)));
    // Compute the sum and SSE
    sum_and_sse(v_res_b, v_dst_b, v_msk_b, &v_sum_d, &v_sse_q);

    // Load the next block of src data
    v_src0_b = _mm_loadu_si128((const __m128i *)(src + src_stride * 4));
    v_src0_shift_b = _mm_srli_si128(v_src0_b, 1);
    v_src1_b = _mm_loadu_si128((const __m128i *)(src + src_stride * 5));
    v_src1_shift_b = _mm_srli_si128(v_src1_b, 1);
    // Apply the x filter
    if (xoffset == HALF_PIXEL_OFFSET) {
      v_src1_b = _mm_unpacklo_epi64(v_src0_b, v_src1_b);
      v_src1_shift_b = _mm_unpacklo_epi64(v_src0_shift_b, v_src1_shift_b);
      v_xres0_b = _mm_avg_epu8(v_src1_b, v_src1_shift_b);
    } else {
      apply_filter_lo(v_src0_b, v_src0_shift_b, v_filterx_b, &v_filtered0_w);
      apply_filter_lo(v_src1_b, v_src1_shift_b, v_filterx_b, &v_filtered1_w);
      v_xres0_b = _mm_packus_epi16(v_filtered0_w, v_filtered1_w);
    }
    // Apply the y filter to the previous block
    v_temp_b = _mm_or_si128(_mm_srli_si128(v_xres1_b, 8),
                            _mm_slli_si128(v_xres0_b, 8));
    if (yoffset == HALF_PIXEL_OFFSET) {
      v_res_b = _mm_avg_epu8(v_xres1_b, v_temp_b);
    } else {
      v_res_b = apply_filter(v_xres1_b, v_temp_b, v_filtery_b);
    }
    // Load the dst data
    v_dst_b = _mm_unpacklo_epi64(
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 2)),
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 3)));
    // Load the mask data
    v_msk_b = _mm_unpacklo_epi64(
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 2)),
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 3)));
    // Compute the sum and SSE
    sum_and_sse(v_res_b, v_dst_b, v_msk_b, &v_sum_d, &v_sse_q);
    // Move onto the next set of rows
    src += src_stride * 4;
    dst += dst_stride * 4;
    msk += msk_stride * 4;
  }
  return calc_masked_variance(v_sum_d, v_sse_q, sse, 8, h);
}

// For W >=16
#define MASK_SUBPIX_VAR_LARGE(W, H)                                            \
  unsigned int aom_masked_sub_pixel_variance##W##x##H##_ssse3(                 \
      const uint8_t *src, int src_stride, int xoffset, int yoffset,            \
      const uint8_t *dst, int dst_stride, const uint8_t *msk, int msk_stride,  \
      unsigned int *sse) {                                                     \
    assert(W % 16 == 0);                                                       \
    if (xoffset == 0) {                                                        \
      if (yoffset == 0)                                                        \
        return aom_masked_variance##W##x##H##_ssse3(                           \
            src, src_stride, dst, dst_stride, msk, msk_stride, sse);           \
      else if (yoffset == HALF_PIXEL_OFFSET)                                   \
        return aom_masked_subpel_varWxH_xzero(                                 \
            src, src_stride, HALF_PIXEL_OFFSET, dst, dst_stride, msk,          \
            msk_stride, sse, W, H, apply_filter_avg);                          \
      else                                                                     \
        return aom_masked_subpel_varWxH_xzero(src, src_stride, yoffset, dst,   \
                                              dst_stride, msk, msk_stride,     \
                                              sse, W, H, apply_filter);        \
    } else if (yoffset == 0) {                                                 \
      if (xoffset == HALF_PIXEL_OFFSET)                                        \
        return aom_masked_subpel_varWxH_yzero(                                 \
            src, src_stride, HALF_PIXEL_OFFSET, dst, dst_stride, msk,          \
            msk_stride, sse, W, H, apply_filter_avg);                          \
      else                                                                     \
        return aom_masked_subpel_varWxH_yzero(src, src_stride, xoffset, dst,   \
                                              dst_stride, msk, msk_stride,     \
                                              sse, W, H, apply_filter);        \
    } else if (xoffset == HALF_PIXEL_OFFSET) {                                 \
      if (yoffset == HALF_PIXEL_OFFSET)                                        \
        return aom_masked_subpel_varWxH_xnonzero_ynonzero(                     \
            src, src_stride, HALF_PIXEL_OFFSET, HALF_PIXEL_OFFSET, dst,        \
            dst_stride, msk, msk_stride, sse, W, H, apply_filter_avg,          \
            apply_filter_avg);                                                 \
      else                                                                     \
        return aom_masked_subpel_varWxH_xnonzero_ynonzero(                     \
            src, src_stride, HALF_PIXEL_OFFSET, yoffset, dst, dst_stride, msk, \
            msk_stride, sse, W, H, apply_filter_avg, apply_filter);            \
    } else {                                                                   \
      if (yoffset == HALF_PIXEL_OFFSET)                                        \
        return aom_masked_subpel_varWxH_xnonzero_ynonzero(                     \
            src, src_stride, xoffset, HALF_PIXEL_OFFSET, dst, dst_stride, msk, \
            msk_stride, sse, W, H, apply_filter, apply_filter_avg);            \
      else                                                                     \
        return aom_masked_subpel_varWxH_xnonzero_ynonzero(                     \
            src, src_stride, xoffset, yoffset, dst, dst_stride, msk,           \
            msk_stride, sse, W, H, apply_filter, apply_filter);                \
    }                                                                          \
  }

// For W < 16
#define MASK_SUBPIX_VAR_SMALL(W, H)                                            \
  unsigned int aom_masked_sub_pixel_variance##W##x##H##_ssse3(                 \
      const uint8_t *src, int src_stride, int xoffset, int yoffset,            \
      const uint8_t *dst, int dst_stride, const uint8_t *msk, int msk_stride,  \
      unsigned int *sse) {                                                     \
    assert(W == 4 || W == 8);                                                  \
    if (xoffset == 0 && yoffset == 0)                                          \
      return aom_masked_variance##W##x##H##_ssse3(                             \
          src, src_stride, dst, dst_stride, msk, msk_stride, sse);             \
    else if (xoffset == 0)                                                     \
      return aom_masked_subpel_var##W##xH_xzero(                               \
          src, src_stride, yoffset, dst, dst_stride, msk, msk_stride, sse, H); \
    else if (yoffset == 0)                                                     \
      return aom_masked_subpel_var##W##xH_yzero(                               \
          src, src_stride, xoffset, dst, dst_stride, msk, msk_stride, sse, H); \
    else                                                                       \
      return aom_masked_subpel_var##W##xH_xnonzero_ynonzero(                   \
          src, src_stride, xoffset, yoffset, dst, dst_stride, msk, msk_stride, \
          sse, H);                                                             \
  }

MASK_SUBPIX_VAR_SMALL(4, 4)
MASK_SUBPIX_VAR_SMALL(4, 8)
MASK_SUBPIX_VAR_SMALL(8, 4)
MASK_SUBPIX_VAR_SMALL(8, 8)
MASK_SUBPIX_VAR_SMALL(8, 16)
MASK_SUBPIX_VAR_LARGE(16, 8)
MASK_SUBPIX_VAR_LARGE(16, 16)
MASK_SUBPIX_VAR_LARGE(16, 32)
MASK_SUBPIX_VAR_LARGE(32, 16)
MASK_SUBPIX_VAR_LARGE(32, 32)
MASK_SUBPIX_VAR_LARGE(32, 64)
MASK_SUBPIX_VAR_LARGE(64, 32)
MASK_SUBPIX_VAR_LARGE(64, 64)
#if CONFIG_EXT_PARTITION
MASK_SUBPIX_VAR_LARGE(64, 128)
MASK_SUBPIX_VAR_LARGE(128, 64)
MASK_SUBPIX_VAR_LARGE(128, 128)
#endif  // CONFIG_EXT_PARTITION

#if CONFIG_HIGHBITDEPTH
typedef uint32_t (*highbd_calc_masked_var_t)(__m128i v_sum_d, __m128i v_sse_q,
                                             uint32_t *sse, const int w,
                                             const int h);
typedef unsigned int (*highbd_variance_fn_t)(const uint8_t *a8, int a_stride,
                                             const uint8_t *b8, int b_stride,
                                             const uint8_t *m, int m_stride,
                                             unsigned int *sse);
typedef __m128i (*highbd_filter_fn_t)(__m128i v_a_w, __m128i v_b_w,
                                      __m128i v_filter_w);

static INLINE __m128i highbd_apply_filter_avg(const __m128i v_a_w,
                                              const __m128i v_b_w,
                                              const __m128i v_filter_w) {
  (void)v_filter_w;
  return _mm_avg_epu16(v_a_w, v_b_w);
}

static INLINE __m128i highbd_apply_filter(const __m128i v_a_w,
                                          const __m128i v_b_w,
                                          const __m128i v_filter_w) {
  const __m128i v_rounding_d = _mm_set1_epi32(1 << (FILTER_BITS - 1));
  __m128i v_input_lo_w = _mm_unpacklo_epi16(v_a_w, v_b_w);
  __m128i v_input_hi_w = _mm_unpackhi_epi16(v_a_w, v_b_w);
  __m128i v_temp0_d = _mm_madd_epi16(v_input_lo_w, v_filter_w);
  __m128i v_temp1_d = _mm_madd_epi16(v_input_hi_w, v_filter_w);
  __m128i v_res_lo_d =
      _mm_srai_epi32(_mm_add_epi32(v_temp0_d, v_rounding_d), FILTER_BITS);
  __m128i v_res_hi_d =
      _mm_srai_epi32(_mm_add_epi32(v_temp1_d, v_rounding_d), FILTER_BITS);
  return _mm_packs_epi32(v_res_lo_d, v_res_hi_d);
}
// Apply the filter to the contents of the lower half of a and b
static INLINE void highbd_apply_filter_lo(const __m128i v_a_lo_w,
                                          const __m128i v_b_lo_w,
                                          const __m128i v_filter_w,
                                          __m128i *v_res_d) {
  const __m128i v_rounding_d = _mm_set1_epi32(1 << (FILTER_BITS - 1));
  __m128i v_input_w = _mm_unpacklo_epi16(v_a_lo_w, v_b_lo_w);
  __m128i v_temp0_d = _mm_madd_epi16(v_input_w, v_filter_w);
  *v_res_d =
      _mm_srai_epi32(_mm_add_epi32(v_temp0_d, v_rounding_d), FILTER_BITS);
}

static void highbd_sum_and_sse(const __m128i v_a_w, const __m128i v_b_w,
                               const __m128i v_m_b, __m128i *v_sum_d,
                               __m128i *v_sse_q) {
  const __m128i v_zero = _mm_setzero_si128();
  const __m128i v_m_w = _mm_unpacklo_epi8(v_m_b, v_zero);

  // Difference: [-2^12, 2^12] => 13 bits (incld sign bit)
  const __m128i v_d_w = _mm_sub_epi16(v_a_w, v_b_w);

  // Error - [-4095, 4095] * [0, 64] & sum pairs => fits in 19 + 1 bits
  const __m128i v_e_d = _mm_madd_epi16(v_d_w, v_m_w);

  // Squared error - max (18 bits * 18 bits) = 36 bits (no sign bit)
  const __m128i v_absd_w = _mm_abs_epi16(v_d_w);
  const __m128i v_dlo_d = _mm_unpacklo_epi16(v_absd_w, v_zero);
  const __m128i v_mlo_d = _mm_unpacklo_epi16(v_m_w, v_zero);
  const __m128i v_elo_d = _mm_madd_epi16(v_dlo_d, v_mlo_d);
  const __m128i v_dhi_d = _mm_unpackhi_epi16(v_absd_w, v_zero);
  const __m128i v_mhi_d = _mm_unpackhi_epi16(v_m_w, v_zero);
  const __m128i v_ehi_d = _mm_madd_epi16(v_dhi_d, v_mhi_d);
  // Square and sum the errors -> 36bits * 4 = 38bits
  __m128i v_se0_q, v_se1_q, v_se2_q, v_se3_q, v_se_q, v_elo1_d, v_ehi3_d;
  v_se0_q = _mm_mul_epu32(v_elo_d, v_elo_d);
  v_elo1_d = _mm_srli_si128(v_elo_d, 4);
  v_se1_q = _mm_mul_epu32(v_elo1_d, v_elo1_d);
  v_se0_q = _mm_add_epi64(v_se0_q, v_se1_q);
  v_se2_q = _mm_mul_epu32(v_ehi_d, v_ehi_d);
  v_ehi3_d = _mm_srli_si128(v_ehi_d, 4);
  v_se3_q = _mm_mul_epu32(v_ehi3_d, v_ehi3_d);
  v_se1_q = _mm_add_epi64(v_se2_q, v_se3_q);
  v_se_q = _mm_add_epi64(v_se0_q, v_se1_q);

  // Accumulate
  *v_sum_d = _mm_add_epi32(*v_sum_d, v_e_d);
  *v_sse_q = _mm_add_epi64(*v_sse_q, v_se_q);
}

static INLINE uint32_t highbd_10_calc_masked_variance(
    __m128i v_sum_d, __m128i v_sse_q, uint32_t *sse, const int w, const int h) {
  int64_t sum64;
  uint64_t sse64;

  // Horizontal sum
  sum64 = hsum_epi32_si32(v_sum_d);
  sse64 = hsum_epi64_si64(v_sse_q);

  sum64 = (sum64 >= 0) ? sum64 : -sum64;

  // Round
  sum64 = ROUND_POWER_OF_TWO(sum64, 6);
  sse64 = ROUND_POWER_OF_TWO(sse64, 12);

  // Normalise
  sum64 = ROUND_POWER_OF_TWO(sum64, 2);
  sse64 = ROUND_POWER_OF_TWO(sse64, 4);

  // Store the SSE
  *sse = (uint32_t)sse64;
  // Compute the variance
  return *sse - (uint32_t)((sum64 * sum64) / (w * h));
}
static INLINE uint32_t highbd_12_calc_masked_variance(
    __m128i v_sum_d, __m128i v_sse_q, uint32_t *sse, const int w, const int h) {
  int64_t sum64;
  uint64_t sse64;

  // Horizontal sum
  sum64 = hsum_epi32_si64(v_sum_d);
  sse64 = hsum_epi64_si64(v_sse_q);

  sum64 = (sum64 >= 0) ? sum64 : -sum64;

  // Round
  sum64 = ROUND_POWER_OF_TWO(sum64, 6);
  sse64 = ROUND_POWER_OF_TWO(sse64, 12);

  // Normalise
  sum64 = ROUND_POWER_OF_TWO(sum64, 4);
  sse64 = ROUND_POWER_OF_TWO(sse64, 8);

  // Store the SSE
  *sse = (uint32_t)sse64;
  // Compute the variance
  return *sse - (uint32_t)((sum64 * sum64) / (w * h));
}

// High bit depth functions for width (W) >= 8
unsigned int aom_highbd_masked_subpel_varWxH_xzero(
    const uint16_t *src, int src_stride, int yoffset, const uint16_t *dst,
    int dst_stride, const uint8_t *msk, int msk_stride, unsigned int *sse,
    int w, int h, highbd_filter_fn_t filter_fn,
    highbd_calc_masked_var_t calc_var) {
  int i, j;
  __m128i v_src0_w, v_src1_w, v_res_w, v_dst_w, v_msk_b;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  const __m128i v_filter_w =
      _mm_set1_epi32((bilinear_filters_2t[yoffset][1] << 16) +
                     bilinear_filters_2t[yoffset][0]);
  assert(yoffset < BIL_SUBPEL_SHIFTS);
  for (j = 0; j < w; j += 8) {
    // Load the first row ready
    v_src0_w = _mm_loadu_si128((const __m128i *)(src + j));
    // Process 2 rows at a time
    for (i = 0; i < h; i += 2) {
      // Load the next row apply the filter
      v_src1_w = _mm_loadu_si128((const __m128i *)(src + j + src_stride));
      v_res_w = filter_fn(v_src0_w, v_src1_w, v_filter_w);
      // Load the dst and msk for the variance calculation
      v_dst_w = _mm_loadu_si128((const __m128i *)(dst + j));
      v_msk_b = _mm_loadl_epi64((const __m128i *)(msk + j));
      highbd_sum_and_sse(v_res_w, v_dst_w, v_msk_b, &v_sum_d, &v_sse_q);

      // Load the next row apply the filter
      v_src0_w = _mm_loadu_si128((const __m128i *)(src + j + src_stride * 2));
      v_res_w = filter_fn(v_src1_w, v_src0_w, v_filter_w);
      // Load the dst and msk for the variance calculation
      v_dst_w = _mm_loadu_si128((const __m128i *)(dst + j + dst_stride));
      v_msk_b = _mm_loadl_epi64((const __m128i *)(msk + j + msk_stride));
      highbd_sum_and_sse(v_res_w, v_dst_w, v_msk_b, &v_sum_d, &v_sse_q);
      // Move onto the next block of rows
      src += src_stride * 2;
      dst += dst_stride * 2;
      msk += msk_stride * 2;
    }
    // Reset to the top of the block
    src -= src_stride * h;
    dst -= dst_stride * h;
    msk -= msk_stride * h;
  }
  return calc_var(v_sum_d, v_sse_q, sse, w, h);
}
unsigned int aom_highbd_masked_subpel_varWxH_yzero(
    const uint16_t *src, int src_stride, int xoffset, const uint16_t *dst,
    int dst_stride, const uint8_t *msk, int msk_stride, unsigned int *sse,
    int w, int h, highbd_filter_fn_t filter_fn,
    highbd_calc_masked_var_t calc_var) {
  int i, j;
  __m128i v_src0_w, v_src1_w, v_res_w, v_dst_w, v_msk_b;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  const __m128i v_filter_w =
      _mm_set1_epi32((bilinear_filters_2t[xoffset][1] << 16) +
                     bilinear_filters_2t[xoffset][0]);
  assert(xoffset < BIL_SUBPEL_SHIFTS);
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j += 8) {
      // Load this row & apply the filter to them
      v_src0_w = _mm_loadu_si128((const __m128i *)(src + j));
      v_src1_w = _mm_loadu_si128((const __m128i *)(src + j + 1));
      v_res_w = filter_fn(v_src0_w, v_src1_w, v_filter_w);

      // Load the dst and msk for the variance calculation
      v_dst_w = _mm_loadu_si128((const __m128i *)(dst + j));
      v_msk_b = _mm_loadl_epi64((const __m128i *)(msk + j));
      highbd_sum_and_sse(v_res_w, v_dst_w, v_msk_b, &v_sum_d, &v_sse_q);
    }
    src += src_stride;
    dst += dst_stride;
    msk += msk_stride;
  }
  return calc_var(v_sum_d, v_sse_q, sse, w, h);
}

unsigned int aom_highbd_masked_subpel_varWxH_xnonzero_ynonzero(
    const uint16_t *src, int src_stride, int xoffset, int yoffset,
    const uint16_t *dst, int dst_stride, const uint8_t *msk, int msk_stride,
    unsigned int *sse, int w, int h, highbd_filter_fn_t xfilter_fn,
    highbd_filter_fn_t yfilter_fn, highbd_calc_masked_var_t calc_var) {
  int i, j;
  __m128i v_src0_w, v_src1_w, v_src2_w, v_src3_w;
  __m128i v_filtered0_w, v_filtered1_w, v_res_w, v_dst_w, v_msk_b;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  const __m128i v_filterx_w =
      _mm_set1_epi32((bilinear_filters_2t[xoffset][1] << 16) +
                     bilinear_filters_2t[xoffset][0]);
  const __m128i v_filtery_w =
      _mm_set1_epi32((bilinear_filters_2t[yoffset][1] << 16) +
                     bilinear_filters_2t[yoffset][0]);
  assert(xoffset < BIL_SUBPEL_SHIFTS);
  assert(yoffset < BIL_SUBPEL_SHIFTS);
  for (j = 0; j < w; j += 8) {
    // Load the first row ready
    v_src0_w = _mm_loadu_si128((const __m128i *)(src + j));
    v_src1_w = _mm_loadu_si128((const __m128i *)(src + j + 1));
    v_filtered0_w = xfilter_fn(v_src0_w, v_src1_w, v_filterx_w);
    // Process 2 rows at a time
    for (i = 0; i < h; i += 2) {
      // Load the next row & apply the filter
      v_src2_w = _mm_loadu_si128((const __m128i *)(src + src_stride + j));
      v_src3_w = _mm_loadu_si128((const __m128i *)(src + src_stride + j + 1));
      v_filtered1_w = xfilter_fn(v_src2_w, v_src3_w, v_filterx_w);
      // Load the dst and msk for the variance calculation
      v_dst_w = _mm_loadu_si128((const __m128i *)(dst + j));
      v_msk_b = _mm_loadl_epi64((const __m128i *)(msk + j));
      // Complete the calculation for this row and add it to the running total
      v_res_w = yfilter_fn(v_filtered0_w, v_filtered1_w, v_filtery_w);
      highbd_sum_and_sse(v_res_w, v_dst_w, v_msk_b, &v_sum_d, &v_sse_q);

      // Load the next row & apply the filter
      v_src0_w = _mm_loadu_si128((const __m128i *)(src + src_stride * 2 + j));
      v_src1_w =
          _mm_loadu_si128((const __m128i *)(src + src_stride * 2 + j + 1));
      v_filtered0_w = xfilter_fn(v_src0_w, v_src1_w, v_filterx_w);
      // Load the dst and msk for the variance calculation
      v_dst_w = _mm_loadu_si128((const __m128i *)(dst + dst_stride + j));
      v_msk_b = _mm_loadl_epi64((const __m128i *)(msk + msk_stride + j));
      // Complete the calculation for this row and add it to the running total
      v_res_w = yfilter_fn(v_filtered1_w, v_filtered0_w, v_filtery_w);
      highbd_sum_and_sse(v_res_w, v_dst_w, v_msk_b, &v_sum_d, &v_sse_q);
      // Move onto the next block of rows
      src += src_stride * 2;
      dst += dst_stride * 2;
      msk += msk_stride * 2;
    }
    // Reset to the top of the block
    src -= src_stride * h;
    dst -= dst_stride * h;
    msk -= msk_stride * h;
  }
  return calc_var(v_sum_d, v_sse_q, sse, w, h);
}

// Note order in which rows loaded xmm[127:64] = row 1, xmm[63:0] = row 2
unsigned int aom_highbd_masked_subpel_var4xH_xzero(
    const uint16_t *src, int src_stride, int yoffset, const uint16_t *dst,
    int dst_stride, const uint8_t *msk, int msk_stride, unsigned int *sse,
    int h, highbd_calc_masked_var_t calc_var) {
  int i;
  __m128i v_src0_w, v_src1_w, v_filtered0_d, v_filtered1_d, v_res_w;
  __m128i v_dst_w, v_msk_b;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  __m128i v_filter_w = _mm_set1_epi32((bilinear_filters_2t[yoffset][1] << 16) +
                                      bilinear_filters_2t[yoffset][0]);
  assert(yoffset < BIL_SUBPEL_SHIFTS);
  // Load the first row of src data ready
  v_src0_w = _mm_loadl_epi64((const __m128i *)src);
  for (i = 0; i < h; i += 2) {
    if (yoffset == HALF_PIXEL_OFFSET) {
      // Load the rest of the source data for these rows
      v_src1_w = _mm_or_si128(
          _mm_slli_si128(v_src0_w, 8),
          _mm_loadl_epi64((const __m128i *)(src + src_stride * 1)));
      v_src0_w = _mm_or_si128(
          _mm_slli_si128(v_src1_w, 8),
          _mm_loadl_epi64((const __m128i *)(src + src_stride * 2)));
      // Apply the y filter
      v_res_w = _mm_avg_epu16(v_src1_w, v_src0_w);
    } else {
      // Load the data and apply the y filter
      v_src1_w = _mm_loadl_epi64((const __m128i *)(src + src_stride * 1));
      highbd_apply_filter_lo(v_src0_w, v_src1_w, v_filter_w, &v_filtered0_d);
      v_src0_w = _mm_loadl_epi64((const __m128i *)(src + src_stride * 2));
      highbd_apply_filter_lo(v_src1_w, v_src0_w, v_filter_w, &v_filtered1_d);
      v_res_w = _mm_packs_epi32(v_filtered1_d, v_filtered0_d);
    }
    // Load the dst data
    v_dst_w = _mm_unpacklo_epi64(
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 1)),
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 0)));
    // Load the mask data
    v_msk_b = _mm_unpacklo_epi32(
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 1)),
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 0)));
    // Compute the sum and SSE
    highbd_sum_and_sse(v_res_w, v_dst_w, v_msk_b, &v_sum_d, &v_sse_q);
    // Move onto the next set of rows
    src += src_stride * 2;
    dst += dst_stride * 2;
    msk += msk_stride * 2;
  }
  return calc_var(v_sum_d, v_sse_q, sse, 4, h);
}

unsigned int aom_highbd_masked_subpel_var4xH_yzero(
    const uint16_t *src, int src_stride, int xoffset, const uint16_t *dst,
    int dst_stride, const uint8_t *msk, int msk_stride, unsigned int *sse,
    int h, highbd_calc_masked_var_t calc_var) {
  int i;
  __m128i v_src0_w, v_src1_w, v_filtered0_d, v_filtered1_d;
  __m128i v_src0_shift_w, v_src1_shift_w, v_res_w, v_dst_w, v_msk_b;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  __m128i v_filter_w = _mm_set1_epi32((bilinear_filters_2t[xoffset][1] << 16) +
                                      bilinear_filters_2t[xoffset][0]);
  assert(xoffset < BIL_SUBPEL_SHIFTS);
  for (i = 0; i < h; i += 2) {
    // Load the src data
    v_src0_w = _mm_loadu_si128((const __m128i *)(src));
    v_src0_shift_w = _mm_srli_si128(v_src0_w, 2);
    v_src1_w = _mm_loadu_si128((const __m128i *)(src + src_stride));
    v_src1_shift_w = _mm_srli_si128(v_src1_w, 2);
    // Apply the x filter
    if (xoffset == HALF_PIXEL_OFFSET) {
      v_src1_w = _mm_unpacklo_epi64(v_src0_w, v_src1_w);
      v_src1_shift_w = _mm_unpacklo_epi64(v_src0_shift_w, v_src1_shift_w);
      v_res_w = _mm_avg_epu16(v_src1_w, v_src1_shift_w);
    } else {
      highbd_apply_filter_lo(v_src0_w, v_src0_shift_w, v_filter_w,
                             &v_filtered0_d);
      highbd_apply_filter_lo(v_src1_w, v_src1_shift_w, v_filter_w,
                             &v_filtered1_d);
      v_res_w = _mm_packs_epi32(v_filtered0_d, v_filtered1_d);
    }
    // Load the dst data
    v_dst_w = _mm_unpacklo_epi64(
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 0)),
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 1)));
    // Load the mask data
    v_msk_b = _mm_unpacklo_epi32(
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 0)),
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 1)));
    // Compute the sum and SSE
    highbd_sum_and_sse(v_res_w, v_dst_w, v_msk_b, &v_sum_d, &v_sse_q);
    // Move onto the next set of rows
    src += src_stride * 2;
    dst += dst_stride * 2;
    msk += msk_stride * 2;
  }
  return calc_var(v_sum_d, v_sse_q, sse, 4, h);
}

unsigned int aom_highbd_masked_subpel_var4xH_xnonzero_ynonzero(
    const uint16_t *src, int src_stride, int xoffset, int yoffset,
    const uint16_t *dst, int dst_stride, const uint8_t *msk, int msk_stride,
    unsigned int *sse, int h, highbd_calc_masked_var_t calc_var) {
  int i;
  __m128i v_src0_w, v_src1_w, v_filtered0_d, v_filtered1_d, v_dst_w, v_msk_b;
  __m128i v_src0_shift_w, v_src1_shift_w;
  __m128i v_xres0_w, v_xres1_w, v_res_w, v_temp_w;
  __m128i v_sum_d = _mm_setzero_si128();
  __m128i v_sse_q = _mm_setzero_si128();
  __m128i v_filterx_w = _mm_set1_epi32((bilinear_filters_2t[xoffset][1] << 16) +
                                       bilinear_filters_2t[xoffset][0]);
  __m128i v_filtery_w = _mm_set1_epi32((bilinear_filters_2t[yoffset][1] << 16) +
                                       bilinear_filters_2t[yoffset][0]);
  assert(xoffset < BIL_SUBPEL_SHIFTS);
  assert(yoffset < BIL_SUBPEL_SHIFTS);
  // Load the first block of src data
  v_src0_w = _mm_loadu_si128((const __m128i *)(src));
  v_src0_shift_w = _mm_srli_si128(v_src0_w, 2);
  v_src1_w = _mm_loadu_si128((const __m128i *)(src + src_stride));
  v_src1_shift_w = _mm_srli_si128(v_src1_w, 2);
  // Apply the x filter
  if (xoffset == HALF_PIXEL_OFFSET) {
    v_src1_w = _mm_unpacklo_epi64(v_src0_w, v_src1_w);
    v_src1_shift_w = _mm_unpacklo_epi64(v_src0_shift_w, v_src1_shift_w);
    v_xres0_w = _mm_avg_epu16(v_src1_w, v_src1_shift_w);
  } else {
    highbd_apply_filter_lo(v_src0_w, v_src0_shift_w, v_filterx_w,
                           &v_filtered0_d);
    highbd_apply_filter_lo(v_src1_w, v_src1_shift_w, v_filterx_w,
                           &v_filtered1_d);
    v_xres0_w = _mm_packs_epi32(v_filtered0_d, v_filtered1_d);
  }
  for (i = 0; i < h; i += 4) {
    // Load the next block of src data
    v_src0_w = _mm_loadu_si128((const __m128i *)(src + src_stride * 2));
    v_src0_shift_w = _mm_srli_si128(v_src0_w, 2);
    v_src1_w = _mm_loadu_si128((const __m128i *)(src + src_stride * 3));
    v_src1_shift_w = _mm_srli_si128(v_src1_w, 2);
    // Apply the x filter
    if (xoffset == HALF_PIXEL_OFFSET) {
      v_src1_w = _mm_unpacklo_epi64(v_src0_w, v_src1_w);
      v_src1_shift_w = _mm_unpacklo_epi64(v_src0_shift_w, v_src1_shift_w);
      v_xres1_w = _mm_avg_epu16(v_src1_w, v_src1_shift_w);
    } else {
      highbd_apply_filter_lo(v_src0_w, v_src0_shift_w, v_filterx_w,
                             &v_filtered0_d);
      highbd_apply_filter_lo(v_src1_w, v_src1_shift_w, v_filterx_w,
                             &v_filtered1_d);
      v_xres1_w = _mm_packs_epi32(v_filtered0_d, v_filtered1_d);
    }
    // Apply the y filter to the previous block
    v_temp_w = _mm_or_si128(_mm_srli_si128(v_xres0_w, 8),
                            _mm_slli_si128(v_xres1_w, 8));
    if (yoffset == HALF_PIXEL_OFFSET) {
      v_res_w = _mm_avg_epu16(v_xres0_w, v_temp_w);
    } else {
      v_res_w = highbd_apply_filter(v_xres0_w, v_temp_w, v_filtery_w);
    }
    // Load the dst data
    v_dst_w = _mm_unpacklo_epi64(
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 0)),
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 1)));
    // Load the mask data
    v_msk_b = _mm_unpacklo_epi32(
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 0)),
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 1)));
    // Compute the sum and SSE
    highbd_sum_and_sse(v_res_w, v_dst_w, v_msk_b, &v_sum_d, &v_sse_q);

    // Load the next block of src data
    v_src0_w = _mm_loadu_si128((const __m128i *)(src + src_stride * 4));
    v_src0_shift_w = _mm_srli_si128(v_src0_w, 2);
    v_src1_w = _mm_loadu_si128((const __m128i *)(src + src_stride * 5));
    v_src1_shift_w = _mm_srli_si128(v_src1_w, 2);
    // Apply the x filter
    if (xoffset == HALF_PIXEL_OFFSET) {
      v_src1_w = _mm_unpacklo_epi64(v_src0_w, v_src1_w);
      v_src1_shift_w = _mm_unpacklo_epi64(v_src0_shift_w, v_src1_shift_w);
      v_xres0_w = _mm_avg_epu16(v_src1_w, v_src1_shift_w);
    } else {
      highbd_apply_filter_lo(v_src0_w, v_src0_shift_w, v_filterx_w,
                             &v_filtered0_d);
      highbd_apply_filter_lo(v_src1_w, v_src1_shift_w, v_filterx_w,
                             &v_filtered1_d);
      v_xres0_w = _mm_packs_epi32(v_filtered0_d, v_filtered1_d);
    }
    // Apply the y filter to the previous block
    v_temp_w = _mm_or_si128(_mm_srli_si128(v_xres1_w, 8),
                            _mm_slli_si128(v_xres0_w, 8));
    if (yoffset == HALF_PIXEL_OFFSET) {
      v_res_w = _mm_avg_epu16(v_xres1_w, v_temp_w);
    } else {
      v_res_w = highbd_apply_filter(v_xres1_w, v_temp_w, v_filtery_w);
    }
    // Load the dst data
    v_dst_w = _mm_unpacklo_epi64(
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 2)),
        _mm_loadl_epi64((const __m128i *)(dst + dst_stride * 3)));
    // Load the mask data
    v_msk_b = _mm_unpacklo_epi32(
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 2)),
        _mm_loadl_epi64((const __m128i *)(msk + msk_stride * 3)));
    // Compute the sum and SSE
    highbd_sum_and_sse(v_res_w, v_dst_w, v_msk_b, &v_sum_d, &v_sse_q);
    // Move onto the next set of rows
    src += src_stride * 4;
    dst += dst_stride * 4;
    msk += msk_stride * 4;
  }
  return calc_var(v_sum_d, v_sse_q, sse, 4, h);
}

// For W >=8
#define HIGHBD_MASK_SUBPIX_VAR_LARGE(W, H)                                     \
  unsigned int highbd_masked_sub_pixel_variance##W##x##H##_ssse3(              \
      const uint8_t *src8, int src_stride, int xoffset, int yoffset,           \
      const uint8_t *dst8, int dst_stride, const uint8_t *msk, int msk_stride, \
      unsigned int *sse, highbd_calc_masked_var_t calc_var,                    \
      highbd_variance_fn_t full_variance_function) {                           \
    uint16_t *src = CONVERT_TO_SHORTPTR(src8);                                 \
    uint16_t *dst = CONVERT_TO_SHORTPTR(dst8);                                 \
    assert(W % 8 == 0);                                                        \
    if (xoffset == 0) {                                                        \
      if (yoffset == 0)                                                        \
        return full_variance_function(src8, src_stride, dst8, dst_stride, msk, \
                                      msk_stride, sse);                        \
      else if (yoffset == HALF_PIXEL_OFFSET)                                   \
        return aom_highbd_masked_subpel_varWxH_xzero(                          \
            src, src_stride, HALF_PIXEL_OFFSET, dst, dst_stride, msk,          \
            msk_stride, sse, W, H, highbd_apply_filter_avg, calc_var);         \
      else                                                                     \
        return aom_highbd_masked_subpel_varWxH_xzero(                          \
            src, src_stride, yoffset, dst, dst_stride, msk, msk_stride, sse,   \
            W, H, highbd_apply_filter, calc_var);                              \
    } else if (yoffset == 0) {                                                 \
      if (xoffset == HALF_PIXEL_OFFSET)                                        \
        return aom_highbd_masked_subpel_varWxH_yzero(                          \
            src, src_stride, HALF_PIXEL_OFFSET, dst, dst_stride, msk,          \
            msk_stride, sse, W, H, highbd_apply_filter_avg, calc_var);         \
      else                                                                     \
        return aom_highbd_masked_subpel_varWxH_yzero(                          \
            src, src_stride, xoffset, dst, dst_stride, msk, msk_stride, sse,   \
            W, H, highbd_apply_filter, calc_var);                              \
    } else if (xoffset == HALF_PIXEL_OFFSET) {                                 \
      if (yoffset == HALF_PIXEL_OFFSET)                                        \
        return aom_highbd_masked_subpel_varWxH_xnonzero_ynonzero(              \
            src, src_stride, HALF_PIXEL_OFFSET, HALF_PIXEL_OFFSET, dst,        \
            dst_stride, msk, msk_stride, sse, W, H, highbd_apply_filter_avg,   \
            highbd_apply_filter_avg, calc_var);                                \
      else                                                                     \
        return aom_highbd_masked_subpel_varWxH_xnonzero_ynonzero(              \
            src, src_stride, HALF_PIXEL_OFFSET, yoffset, dst, dst_stride, msk, \
            msk_stride, sse, W, H, highbd_apply_filter_avg,                    \
            highbd_apply_filter, calc_var);                                    \
    } else {                                                                   \
      if (yoffset == HALF_PIXEL_OFFSET)                                        \
        return aom_highbd_masked_subpel_varWxH_xnonzero_ynonzero(              \
            src, src_stride, xoffset, HALF_PIXEL_OFFSET, dst, dst_stride, msk, \
            msk_stride, sse, W, H, highbd_apply_filter,                        \
            highbd_apply_filter_avg, calc_var);                                \
      else                                                                     \
        return aom_highbd_masked_subpel_varWxH_xnonzero_ynonzero(              \
            src, src_stride, xoffset, yoffset, dst, dst_stride, msk,           \
            msk_stride, sse, W, H, highbd_apply_filter, highbd_apply_filter,   \
            calc_var);                                                         \
    }                                                                          \
  }

// For W < 8
#define HIGHBD_MASK_SUBPIX_VAR_SMALL(W, H)                                     \
  unsigned int highbd_masked_sub_pixel_variance##W##x##H##_ssse3(              \
      const uint8_t *src8, int src_stride, int xoffset, int yoffset,           \
      const uint8_t *dst8, int dst_stride, const uint8_t *msk, int msk_stride, \
      unsigned int *sse, highbd_calc_masked_var_t calc_var,                    \
      highbd_variance_fn_t full_variance_function) {                           \
    uint16_t *src = CONVERT_TO_SHORTPTR(src8);                                 \
    uint16_t *dst = CONVERT_TO_SHORTPTR(dst8);                                 \
    assert(W == 4);                                                            \
    if (xoffset == 0 && yoffset == 0)                                          \
      return full_variance_function(src8, src_stride, dst8, dst_stride, msk,   \
                                    msk_stride, sse);                          \
    else if (xoffset == 0)                                                     \
      return aom_highbd_masked_subpel_var4xH_xzero(                            \
          src, src_stride, yoffset, dst, dst_stride, msk, msk_stride, sse, H,  \
          calc_var);                                                           \
    else if (yoffset == 0)                                                     \
      return aom_highbd_masked_subpel_var4xH_yzero(                            \
          src, src_stride, xoffset, dst, dst_stride, msk, msk_stride, sse, H,  \
          calc_var);                                                           \
    else                                                                       \
      return aom_highbd_masked_subpel_var4xH_xnonzero_ynonzero(                \
          src, src_stride, xoffset, yoffset, dst, dst_stride, msk, msk_stride, \
          sse, H, calc_var);                                                   \
  }

#define HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(W, H)                                  \
  unsigned int aom_highbd_masked_sub_pixel_variance##W##x##H##_ssse3(          \
      const uint8_t *src8, int src_stride, int xoffset, int yoffset,           \
      const uint8_t *dst8, int dst_stride, const uint8_t *msk, int msk_stride, \
      unsigned int *sse) {                                                     \
    return highbd_masked_sub_pixel_variance##W##x##H##_ssse3(                  \
        src8, src_stride, xoffset, yoffset, dst8, dst_stride, msk, msk_stride, \
        sse, calc_masked_variance,                                             \
        aom_highbd_masked_variance##W##x##H##_ssse3);                          \
  }                                                                            \
  unsigned int aom_highbd_10_masked_sub_pixel_variance##W##x##H##_ssse3(       \
      const uint8_t *src8, int src_stride, int xoffset, int yoffset,           \
      const uint8_t *dst8, int dst_stride, const uint8_t *msk, int msk_stride, \
      unsigned int *sse) {                                                     \
    return highbd_masked_sub_pixel_variance##W##x##H##_ssse3(                  \
        src8, src_stride, xoffset, yoffset, dst8, dst_stride, msk, msk_stride, \
        sse, highbd_10_calc_masked_variance,                                   \
        aom_highbd_10_masked_variance##W##x##H##_ssse3);                       \
  }                                                                            \
  unsigned int aom_highbd_12_masked_sub_pixel_variance##W##x##H##_ssse3(       \
      const uint8_t *src8, int src_stride, int xoffset, int yoffset,           \
      const uint8_t *dst8, int dst_stride, const uint8_t *msk, int msk_stride, \
      unsigned int *sse) {                                                     \
    return highbd_masked_sub_pixel_variance##W##x##H##_ssse3(                  \
        src8, src_stride, xoffset, yoffset, dst8, dst_stride, msk, msk_stride, \
        sse, highbd_12_calc_masked_variance,                                   \
        aom_highbd_12_masked_variance##W##x##H##_ssse3);                       \
  }

HIGHBD_MASK_SUBPIX_VAR_SMALL(4, 4)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(4, 4)
HIGHBD_MASK_SUBPIX_VAR_SMALL(4, 8)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(4, 8)
HIGHBD_MASK_SUBPIX_VAR_LARGE(8, 4)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(8, 4)
HIGHBD_MASK_SUBPIX_VAR_LARGE(8, 8)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(8, 8)
HIGHBD_MASK_SUBPIX_VAR_LARGE(8, 16)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(8, 16)
HIGHBD_MASK_SUBPIX_VAR_LARGE(16, 8)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(16, 8)
HIGHBD_MASK_SUBPIX_VAR_LARGE(16, 16)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(16, 16)
HIGHBD_MASK_SUBPIX_VAR_LARGE(16, 32)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(16, 32)
HIGHBD_MASK_SUBPIX_VAR_LARGE(32, 16)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(32, 16)
HIGHBD_MASK_SUBPIX_VAR_LARGE(32, 32)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(32, 32)
HIGHBD_MASK_SUBPIX_VAR_LARGE(32, 64)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(32, 64)
HIGHBD_MASK_SUBPIX_VAR_LARGE(64, 32)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(64, 32)
HIGHBD_MASK_SUBPIX_VAR_LARGE(64, 64)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(64, 64)
#if CONFIG_EXT_PARTITION
HIGHBD_MASK_SUBPIX_VAR_LARGE(64, 128)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(64, 128)
HIGHBD_MASK_SUBPIX_VAR_LARGE(128, 64)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(128, 64)
HIGHBD_MASK_SUBPIX_VAR_LARGE(128, 128)
HIGHBD_MASK_SUBPIX_VAR_WRAPPERS(128, 128)
#endif  // CONFIG_EXT_PARTITION
#endif
