/*
 * 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 <stdlib.h>
#include "./macros_msa.h"

extern const int16_t aom_rv[];

#define AOM_TRANSPOSE8x16_UB_UB(in0, in1, in2, in3, in4, in5, in6, in7, out0,  \
                                out1, out2, out3, out4, out5, out6, out7,      \
                                out8, out9, out10, out11, out12, out13, out14, \
                                out15)                                         \
  {                                                                            \
    v8i16 temp0, temp1, temp2, temp3, temp4;                                   \
    v8i16 temp5, temp6, temp7, temp8, temp9;                                   \
                                                                               \
    ILVR_B4_SH(in1, in0, in3, in2, in5, in4, in7, in6, temp0, temp1, temp2,    \
               temp3);                                                         \
    ILVR_H2_SH(temp1, temp0, temp3, temp2, temp4, temp5);                      \
    ILVRL_W2_SH(temp5, temp4, temp6, temp7);                                   \
    ILVL_H2_SH(temp1, temp0, temp3, temp2, temp4, temp5);                      \
    ILVRL_W2_SH(temp5, temp4, temp8, temp9);                                   \
    ILVL_B4_SH(in1, in0, in3, in2, in5, in4, in7, in6, temp0, temp1, temp2,    \
               temp3);                                                         \
    ILVR_H2_SH(temp1, temp0, temp3, temp2, temp4, temp5);                      \
    ILVRL_W2_UB(temp5, temp4, out8, out10);                                    \
    ILVL_H2_SH(temp1, temp0, temp3, temp2, temp4, temp5);                      \
    ILVRL_W2_UB(temp5, temp4, out12, out14);                                   \
    out0 = (v16u8)temp6;                                                       \
    out2 = (v16u8)temp7;                                                       \
    out4 = (v16u8)temp8;                                                       \
    out6 = (v16u8)temp9;                                                       \
    out9 = (v16u8)__msa_ilvl_d((v2i64)out8, (v2i64)out8);                      \
    out11 = (v16u8)__msa_ilvl_d((v2i64)out10, (v2i64)out10);                   \
    out13 = (v16u8)__msa_ilvl_d((v2i64)out12, (v2i64)out12);                   \
    out15 = (v16u8)__msa_ilvl_d((v2i64)out14, (v2i64)out14);                   \
    out1 = (v16u8)__msa_ilvl_d((v2i64)out0, (v2i64)out0);                      \
    out3 = (v16u8)__msa_ilvl_d((v2i64)out2, (v2i64)out2);                      \
    out5 = (v16u8)__msa_ilvl_d((v2i64)out4, (v2i64)out4);                      \
    out7 = (v16u8)__msa_ilvl_d((v2i64)out6, (v2i64)out6);                      \
  }

#define AOM_AVER_IF_RETAIN(above2_in, above1_in, src_in, below1_in, below2_in, \
                           ref, out)                                           \
  {                                                                            \
    v16u8 temp0, temp1;                                                        \
                                                                               \
    temp1 = __msa_aver_u_b(above2_in, above1_in);                              \
    temp0 = __msa_aver_u_b(below2_in, below1_in);                              \
    temp1 = __msa_aver_u_b(temp1, temp0);                                      \
    out = __msa_aver_u_b(src_in, temp1);                                       \
    temp0 = __msa_asub_u_b(src_in, above2_in);                                 \
    temp1 = __msa_asub_u_b(src_in, above1_in);                                 \
    temp0 = (temp0 < ref);                                                     \
    temp1 = (temp1 < ref);                                                     \
    temp0 = temp0 & temp1;                                                     \
    temp1 = __msa_asub_u_b(src_in, below1_in);                                 \
    temp1 = (temp1 < ref);                                                     \
    temp0 = temp0 & temp1;                                                     \
    temp1 = __msa_asub_u_b(src_in, below2_in);                                 \
    temp1 = (temp1 < ref);                                                     \
    temp0 = temp0 & temp1;                                                     \
    out = __msa_bmz_v(out, src_in, temp0);                                     \
  }

#define TRANSPOSE12x16_B(in0, in1, in2, in3, in4, in5, in6, in7, in8, in9,    \
                         in10, in11, in12, in13, in14, in15)                  \
  {                                                                           \
    v8i16 temp0, temp1, temp2, temp3, temp4;                                  \
    v8i16 temp5, temp6, temp7, temp8, temp9;                                  \
                                                                              \
    ILVR_B2_SH(in1, in0, in3, in2, temp0, temp1);                             \
    ILVRL_H2_SH(temp1, temp0, temp2, temp3);                                  \
    ILVR_B2_SH(in5, in4, in7, in6, temp0, temp1);                             \
    ILVRL_H2_SH(temp1, temp0, temp4, temp5);                                  \
    ILVRL_W2_SH(temp4, temp2, temp0, temp1);                                  \
    ILVRL_W2_SH(temp5, temp3, temp2, temp3);                                  \
    ILVR_B2_SH(in9, in8, in11, in10, temp4, temp5);                           \
    ILVR_B2_SH(in9, in8, in11, in10, temp4, temp5);                           \
    ILVRL_H2_SH(temp5, temp4, temp6, temp7);                                  \
    ILVR_B2_SH(in13, in12, in15, in14, temp4, temp5);                         \
    ILVRL_H2_SH(temp5, temp4, temp8, temp9);                                  \
    ILVRL_W2_SH(temp8, temp6, temp4, temp5);                                  \
    ILVRL_W2_SH(temp9, temp7, temp6, temp7);                                  \
    ILVL_B2_SH(in1, in0, in3, in2, temp8, temp9);                             \
    ILVR_D2_UB(temp4, temp0, temp5, temp1, in0, in2);                         \
    in1 = (v16u8)__msa_ilvl_d((v2i64)temp4, (v2i64)temp0);                    \
    in3 = (v16u8)__msa_ilvl_d((v2i64)temp5, (v2i64)temp1);                    \
    ILVL_B2_SH(in5, in4, in7, in6, temp0, temp1);                             \
    ILVR_D2_UB(temp6, temp2, temp7, temp3, in4, in6);                         \
    in5 = (v16u8)__msa_ilvl_d((v2i64)temp6, (v2i64)temp2);                    \
    in7 = (v16u8)__msa_ilvl_d((v2i64)temp7, (v2i64)temp3);                    \
    ILVL_B4_SH(in9, in8, in11, in10, in13, in12, in15, in14, temp2, temp3,    \
               temp4, temp5);                                                 \
    ILVR_H4_SH(temp9, temp8, temp1, temp0, temp3, temp2, temp5, temp4, temp6, \
               temp7, temp8, temp9);                                          \
    ILVR_W2_SH(temp7, temp6, temp9, temp8, temp0, temp1);                     \
    in8 = (v16u8)__msa_ilvr_d((v2i64)temp1, (v2i64)temp0);                    \
    in9 = (v16u8)__msa_ilvl_d((v2i64)temp1, (v2i64)temp0);                    \
    ILVL_W2_SH(temp7, temp6, temp9, temp8, temp2, temp3);                     \
    in10 = (v16u8)__msa_ilvr_d((v2i64)temp3, (v2i64)temp2);                   \
    in11 = (v16u8)__msa_ilvl_d((v2i64)temp3, (v2i64)temp2);                   \
  }

#define AOM_TRANSPOSE12x8_UB_UB(in0, in1, in2, in3, in4, in5, in6, in7, in8, \
                                in9, in10, in11)                             \
  {                                                                          \
    v8i16 temp0, temp1, temp2, temp3;                                        \
    v8i16 temp4, temp5, temp6, temp7;                                        \
                                                                             \
    ILVR_B2_SH(in1, in0, in3, in2, temp0, temp1);                            \
    ILVRL_H2_SH(temp1, temp0, temp2, temp3);                                 \
    ILVR_B2_SH(in5, in4, in7, in6, temp0, temp1);                            \
    ILVRL_H2_SH(temp1, temp0, temp4, temp5);                                 \
    ILVRL_W2_SH(temp4, temp2, temp0, temp1);                                 \
    ILVRL_W2_SH(temp5, temp3, temp2, temp3);                                 \
    ILVL_B2_SH(in1, in0, in3, in2, temp4, temp5);                            \
    temp4 = __msa_ilvr_h(temp5, temp4);                                      \
    ILVL_B2_SH(in5, in4, in7, in6, temp6, temp7);                            \
    temp5 = __msa_ilvr_h(temp7, temp6);                                      \
    ILVRL_W2_SH(temp5, temp4, temp6, temp7);                                 \
    in0 = (v16u8)temp0;                                                      \
    in2 = (v16u8)temp1;                                                      \
    in4 = (v16u8)temp2;                                                      \
    in6 = (v16u8)temp3;                                                      \
    in8 = (v16u8)temp6;                                                      \
    in10 = (v16u8)temp7;                                                     \
    in1 = (v16u8)__msa_ilvl_d((v2i64)temp0, (v2i64)temp0);                   \
    in3 = (v16u8)__msa_ilvl_d((v2i64)temp1, (v2i64)temp1);                   \
    in5 = (v16u8)__msa_ilvl_d((v2i64)temp2, (v2i64)temp2);                   \
    in7 = (v16u8)__msa_ilvl_d((v2i64)temp3, (v2i64)temp3);                   \
    in9 = (v16u8)__msa_ilvl_d((v2i64)temp6, (v2i64)temp6);                   \
    in11 = (v16u8)__msa_ilvl_d((v2i64)temp7, (v2i64)temp7);                  \
  }

static void postproc_down_across_chroma_msa(uint8_t *src_ptr, uint8_t *dst_ptr,
                                            int32_t src_stride,
                                            int32_t dst_stride, int32_t cols,
                                            uint8_t *f) {
  uint8_t *p_src = src_ptr;
  uint8_t *p_dst = dst_ptr;
  uint8_t *f_orig = f;
  uint8_t *p_dst_st = dst_ptr;
  uint16_t col;
  uint64_t out0, out1, out2, out3;
  v16u8 above2, above1, below2, below1, src, ref, ref_temp;
  v16u8 inter0, inter1, inter2, inter3, inter4, inter5;
  v16u8 inter6, inter7, inter8, inter9, inter10, inter11;

  for (col = (cols / 16); col--;) {
    ref = LD_UB(f);
    LD_UB2(p_src - 2 * src_stride, src_stride, above2, above1);
    src = LD_UB(p_src);
    LD_UB2(p_src + 1 * src_stride, src_stride, below1, below2);
    AOM_AVER_IF_RETAIN(above2, above1, src, below1, below2, ref, inter0);
    above2 = LD_UB(p_src + 3 * src_stride);
    AOM_AVER_IF_RETAIN(above1, src, below1, below2, above2, ref, inter1);
    above1 = LD_UB(p_src + 4 * src_stride);
    AOM_AVER_IF_RETAIN(src, below1, below2, above2, above1, ref, inter2);
    src = LD_UB(p_src + 5 * src_stride);
    AOM_AVER_IF_RETAIN(below1, below2, above2, above1, src, ref, inter3);
    below1 = LD_UB(p_src + 6 * src_stride);
    AOM_AVER_IF_RETAIN(below2, above2, above1, src, below1, ref, inter4);
    below2 = LD_UB(p_src + 7 * src_stride);
    AOM_AVER_IF_RETAIN(above2, above1, src, below1, below2, ref, inter5);
    above2 = LD_UB(p_src + 8 * src_stride);
    AOM_AVER_IF_RETAIN(above1, src, below1, below2, above2, ref, inter6);
    above1 = LD_UB(p_src + 9 * src_stride);
    AOM_AVER_IF_RETAIN(src, below1, below2, above2, above1, ref, inter7);
    ST_UB8(inter0, inter1, inter2, inter3, inter4, inter5, inter6, inter7,
           p_dst, dst_stride);

    p_dst += 16;
    p_src += 16;
    f += 16;
  }

  if (0 != (cols / 16)) {
    ref = LD_UB(f);
    LD_UB2(p_src - 2 * src_stride, src_stride, above2, above1);
    src = LD_UB(p_src);
    LD_UB2(p_src + 1 * src_stride, src_stride, below1, below2);
    AOM_AVER_IF_RETAIN(above2, above1, src, below1, below2, ref, inter0);
    above2 = LD_UB(p_src + 3 * src_stride);
    AOM_AVER_IF_RETAIN(above1, src, below1, below2, above2, ref, inter1);
    above1 = LD_UB(p_src + 4 * src_stride);
    AOM_AVER_IF_RETAIN(src, below1, below2, above2, above1, ref, inter2);
    src = LD_UB(p_src + 5 * src_stride);
    AOM_AVER_IF_RETAIN(below1, below2, above2, above1, src, ref, inter3);
    below1 = LD_UB(p_src + 6 * src_stride);
    AOM_AVER_IF_RETAIN(below2, above2, above1, src, below1, ref, inter4);
    below2 = LD_UB(p_src + 7 * src_stride);
    AOM_AVER_IF_RETAIN(above2, above1, src, below1, below2, ref, inter5);
    above2 = LD_UB(p_src + 8 * src_stride);
    AOM_AVER_IF_RETAIN(above1, src, below1, below2, above2, ref, inter6);
    above1 = LD_UB(p_src + 9 * src_stride);
    AOM_AVER_IF_RETAIN(src, below1, below2, above2, above1, ref, inter7);
    out0 = __msa_copy_u_d((v2i64)inter0, 0);
    out1 = __msa_copy_u_d((v2i64)inter1, 0);
    out2 = __msa_copy_u_d((v2i64)inter2, 0);
    out3 = __msa_copy_u_d((v2i64)inter3, 0);
    SD4(out0, out1, out2, out3, p_dst, dst_stride);

    out0 = __msa_copy_u_d((v2i64)inter4, 0);
    out1 = __msa_copy_u_d((v2i64)inter5, 0);
    out2 = __msa_copy_u_d((v2i64)inter6, 0);
    out3 = __msa_copy_u_d((v2i64)inter7, 0);
    SD4(out0, out1, out2, out3, p_dst + 4 * dst_stride, dst_stride);
  }

  f = f_orig;
  p_dst = dst_ptr - 2;
  LD_UB8(p_dst, dst_stride, inter0, inter1, inter2, inter3, inter4, inter5,
         inter6, inter7);

  for (col = 0; col < (cols / 8); ++col) {
    ref = LD_UB(f);
    f += 8;
    AOM_TRANSPOSE12x8_UB_UB(inter0, inter1, inter2, inter3, inter4, inter5,
                            inter6, inter7, inter8, inter9, inter10, inter11);
    if (0 == col) {
      above2 = inter2;
      above1 = inter2;
    } else {
      above2 = inter0;
      above1 = inter1;
    }
    src = inter2;
    below1 = inter3;
    below2 = inter4;
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 0);
    AOM_AVER_IF_RETAIN(above2, above1, src, below1, below2, ref_temp, inter2);
    above2 = inter5;
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 1);
    AOM_AVER_IF_RETAIN(above1, src, below1, below2, above2, ref_temp, inter3);
    above1 = inter6;
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 2);
    AOM_AVER_IF_RETAIN(src, below1, below2, above2, above1, ref_temp, inter4);
    src = inter7;
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 3);
    AOM_AVER_IF_RETAIN(below1, below2, above2, above1, src, ref_temp, inter5);
    below1 = inter8;
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 4);
    AOM_AVER_IF_RETAIN(below2, above2, above1, src, below1, ref_temp, inter6);
    below2 = inter9;
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 5);
    AOM_AVER_IF_RETAIN(above2, above1, src, below1, below2, ref_temp, inter7);
    if (col == (cols / 8 - 1)) {
      above2 = inter9;
    } else {
      above2 = inter10;
    }
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 6);
    AOM_AVER_IF_RETAIN(above1, src, below1, below2, above2, ref_temp, inter8);
    if (col == (cols / 8 - 1)) {
      above1 = inter9;
    } else {
      above1 = inter11;
    }
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 7);
    AOM_AVER_IF_RETAIN(src, below1, below2, above2, above1, ref_temp, inter9);
    TRANSPOSE8x8_UB_UB(inter2, inter3, inter4, inter5, inter6, inter7, inter8,
                       inter9, inter2, inter3, inter4, inter5, inter6, inter7,
                       inter8, inter9);
    p_dst += 8;
    LD_UB2(p_dst, dst_stride, inter0, inter1);
    ST8x1_UB(inter2, p_dst_st);
    ST8x1_UB(inter3, (p_dst_st + 1 * dst_stride));
    LD_UB2(p_dst + 2 * dst_stride, dst_stride, inter2, inter3);
    ST8x1_UB(inter4, (p_dst_st + 2 * dst_stride));
    ST8x1_UB(inter5, (p_dst_st + 3 * dst_stride));
    LD_UB2(p_dst + 4 * dst_stride, dst_stride, inter4, inter5);
    ST8x1_UB(inter6, (p_dst_st + 4 * dst_stride));
    ST8x1_UB(inter7, (p_dst_st + 5 * dst_stride));
    LD_UB2(p_dst + 6 * dst_stride, dst_stride, inter6, inter7);
    ST8x1_UB(inter8, (p_dst_st + 6 * dst_stride));
    ST8x1_UB(inter9, (p_dst_st + 7 * dst_stride));
    p_dst_st += 8;
  }
}

static void postproc_down_across_luma_msa(uint8_t *src_ptr, uint8_t *dst_ptr,
                                          int32_t src_stride,
                                          int32_t dst_stride, int32_t cols,
                                          uint8_t *f) {
  uint8_t *p_src = src_ptr;
  uint8_t *p_dst = dst_ptr;
  uint8_t *p_dst_st = dst_ptr;
  uint8_t *f_orig = f;
  uint16_t col;
  v16u8 above2, above1, below2, below1;
  v16u8 src, ref, ref_temp;
  v16u8 inter0, inter1, inter2, inter3, inter4, inter5, inter6;
  v16u8 inter7, inter8, inter9, inter10, inter11;
  v16u8 inter12, inter13, inter14, inter15;

  for (col = (cols / 16); col--;) {
    ref = LD_UB(f);
    LD_UB2(p_src - 2 * src_stride, src_stride, above2, above1);
    src = LD_UB(p_src);
    LD_UB2(p_src + 1 * src_stride, src_stride, below1, below2);
    AOM_AVER_IF_RETAIN(above2, above1, src, below1, below2, ref, inter0);
    above2 = LD_UB(p_src + 3 * src_stride);
    AOM_AVER_IF_RETAIN(above1, src, below1, below2, above2, ref, inter1);
    above1 = LD_UB(p_src + 4 * src_stride);
    AOM_AVER_IF_RETAIN(src, below1, below2, above2, above1, ref, inter2);
    src = LD_UB(p_src + 5 * src_stride);
    AOM_AVER_IF_RETAIN(below1, below2, above2, above1, src, ref, inter3);
    below1 = LD_UB(p_src + 6 * src_stride);
    AOM_AVER_IF_RETAIN(below2, above2, above1, src, below1, ref, inter4);
    below2 = LD_UB(p_src + 7 * src_stride);
    AOM_AVER_IF_RETAIN(above2, above1, src, below1, below2, ref, inter5);
    above2 = LD_UB(p_src + 8 * src_stride);
    AOM_AVER_IF_RETAIN(above1, src, below1, below2, above2, ref, inter6);
    above1 = LD_UB(p_src + 9 * src_stride);
    AOM_AVER_IF_RETAIN(src, below1, below2, above2, above1, ref, inter7);
    src = LD_UB(p_src + 10 * src_stride);
    AOM_AVER_IF_RETAIN(below1, below2, above2, above1, src, ref, inter8);
    below1 = LD_UB(p_src + 11 * src_stride);
    AOM_AVER_IF_RETAIN(below2, above2, above1, src, below1, ref, inter9);
    below2 = LD_UB(p_src + 12 * src_stride);
    AOM_AVER_IF_RETAIN(above2, above1, src, below1, below2, ref, inter10);
    above2 = LD_UB(p_src + 13 * src_stride);
    AOM_AVER_IF_RETAIN(above1, src, below1, below2, above2, ref, inter11);
    above1 = LD_UB(p_src + 14 * src_stride);
    AOM_AVER_IF_RETAIN(src, below1, below2, above2, above1, ref, inter12);
    src = LD_UB(p_src + 15 * src_stride);
    AOM_AVER_IF_RETAIN(below1, below2, above2, above1, src, ref, inter13);
    below1 = LD_UB(p_src + 16 * src_stride);
    AOM_AVER_IF_RETAIN(below2, above2, above1, src, below1, ref, inter14);
    below2 = LD_UB(p_src + 17 * src_stride);
    AOM_AVER_IF_RETAIN(above2, above1, src, below1, below2, ref, inter15);
    ST_UB8(inter0, inter1, inter2, inter3, inter4, inter5, inter6, inter7,
           p_dst, dst_stride);
    ST_UB8(inter8, inter9, inter10, inter11, inter12, inter13, inter14, inter15,
           p_dst + 8 * dst_stride, dst_stride);
    p_src += 16;
    p_dst += 16;
    f += 16;
  }

  f = f_orig;
  p_dst = dst_ptr - 2;
  LD_UB8(p_dst, dst_stride, inter0, inter1, inter2, inter3, inter4, inter5,
         inter6, inter7);
  LD_UB8(p_dst + 8 * dst_stride, dst_stride, inter8, inter9, inter10, inter11,
         inter12, inter13, inter14, inter15);

  for (col = 0; col < cols / 8; ++col) {
    ref = LD_UB(f);
    f += 8;
    TRANSPOSE12x16_B(inter0, inter1, inter2, inter3, inter4, inter5, inter6,
                     inter7, inter8, inter9, inter10, inter11, inter12, inter13,
                     inter14, inter15);
    if (0 == col) {
      above2 = inter2;
      above1 = inter2;
    } else {
      above2 = inter0;
      above1 = inter1;
    }

    src = inter2;
    below1 = inter3;
    below2 = inter4;
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 0);
    AOM_AVER_IF_RETAIN(above2, above1, src, below1, below2, ref_temp, inter2);
    above2 = inter5;
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 1);
    AOM_AVER_IF_RETAIN(above1, src, below1, below2, above2, ref_temp, inter3);
    above1 = inter6;
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 2);
    AOM_AVER_IF_RETAIN(src, below1, below2, above2, above1, ref_temp, inter4);
    src = inter7;
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 3);
    AOM_AVER_IF_RETAIN(below1, below2, above2, above1, src, ref_temp, inter5);
    below1 = inter8;
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 4);
    AOM_AVER_IF_RETAIN(below2, above2, above1, src, below1, ref_temp, inter6);
    below2 = inter9;
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 5);
    AOM_AVER_IF_RETAIN(above2, above1, src, below1, below2, ref_temp, inter7);
    if (col == (cols / 8 - 1)) {
      above2 = inter9;
    } else {
      above2 = inter10;
    }
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 6);
    AOM_AVER_IF_RETAIN(above1, src, below1, below2, above2, ref_temp, inter8);
    if (col == (cols / 8 - 1)) {
      above1 = inter9;
    } else {
      above1 = inter11;
    }
    ref_temp = (v16u8)__msa_splati_b((v16i8)ref, 7);
    AOM_AVER_IF_RETAIN(src, below1, below2, above2, above1, ref_temp, inter9);
    AOM_TRANSPOSE8x16_UB_UB(inter2, inter3, inter4, inter5, inter6, inter7,
                            inter8, inter9, inter2, inter3, inter4, inter5,
                            inter6, inter7, inter8, inter9, inter10, inter11,
                            inter12, inter13, inter14, inter15, above2, above1);

    p_dst += 8;
    LD_UB2(p_dst, dst_stride, inter0, inter1);
    ST8x1_UB(inter2, p_dst_st);
    ST8x1_UB(inter3, (p_dst_st + 1 * dst_stride));
    LD_UB2(p_dst + 2 * dst_stride, dst_stride, inter2, inter3);
    ST8x1_UB(inter4, (p_dst_st + 2 * dst_stride));
    ST8x1_UB(inter5, (p_dst_st + 3 * dst_stride));
    LD_UB2(p_dst + 4 * dst_stride, dst_stride, inter4, inter5);
    ST8x1_UB(inter6, (p_dst_st + 4 * dst_stride));
    ST8x1_UB(inter7, (p_dst_st + 5 * dst_stride));
    LD_UB2(p_dst + 6 * dst_stride, dst_stride, inter6, inter7);
    ST8x1_UB(inter8, (p_dst_st + 6 * dst_stride));
    ST8x1_UB(inter9, (p_dst_st + 7 * dst_stride));
    LD_UB2(p_dst + 8 * dst_stride, dst_stride, inter8, inter9);
    ST8x1_UB(inter10, (p_dst_st + 8 * dst_stride));
    ST8x1_UB(inter11, (p_dst_st + 9 * dst_stride));
    LD_UB2(p_dst + 10 * dst_stride, dst_stride, inter10, inter11);
    ST8x1_UB(inter12, (p_dst_st + 10 * dst_stride));
    ST8x1_UB(inter13, (p_dst_st + 11 * dst_stride));
    LD_UB2(p_dst + 12 * dst_stride, dst_stride, inter12, inter13);
    ST8x1_UB(inter14, (p_dst_st + 12 * dst_stride));
    ST8x1_UB(inter15, (p_dst_st + 13 * dst_stride));
    LD_UB2(p_dst + 14 * dst_stride, dst_stride, inter14, inter15);
    ST8x1_UB(above2, (p_dst_st + 14 * dst_stride));
    ST8x1_UB(above1, (p_dst_st + 15 * dst_stride));
    p_dst_st += 8;
  }
}

void aom_post_proc_down_and_across_mb_row_msa(uint8_t *src, uint8_t *dst,
                                              int32_t src_stride,
                                              int32_t dst_stride, int32_t cols,
                                              uint8_t *f, int32_t size) {
  if (8 == size) {
    postproc_down_across_chroma_msa(src, dst, src_stride, dst_stride, cols, f);
  } else if (16 == size) {
    postproc_down_across_luma_msa(src, dst, src_stride, dst_stride, cols, f);
  }
}

void aom_mbpost_proc_across_ip_msa(uint8_t *src_ptr, int32_t pitch,
                                   int32_t rows, int32_t cols, int32_t flimit) {
  int32_t row, col, cnt;
  uint8_t *src_dup = src_ptr;
  v16u8 src0, src, tmp_orig;
  v16u8 tmp = { 0 };
  v16i8 zero = { 0 };
  v8u16 sum_h, src_r_h, src_l_h;
  v4u32 src_r_w, src_l_w;
  v4i32 flimit_vec;

  flimit_vec = __msa_fill_w(flimit);
  for (row = rows; row--;) {
    int32_t sum_sq = 0;
    int32_t sum = 0;
    src0 = (v16u8)__msa_fill_b(src_dup[0]);
    ST8x1_UB(src0, (src_dup - 8));

    src0 = (v16u8)__msa_fill_b(src_dup[cols - 1]);
    ST_UB(src0, src_dup + cols);
    src_dup[cols + 16] = src_dup[cols - 1];
    tmp_orig = (v16u8)__msa_ldi_b(0);
    tmp_orig[15] = tmp[15];
    src = LD_UB(src_dup - 8);
    src[15] = 0;
    ILVRL_B2_UH(zero, src, src_r_h, src_l_h);
    src_r_w = __msa_dotp_u_w(src_r_h, src_r_h);
    src_l_w = __msa_dotp_u_w(src_l_h, src_l_h);
    sum_sq = HADD_SW_S32(src_r_w);
    sum_sq += HADD_SW_S32(src_l_w);
    sum_h = __msa_hadd_u_h(src, src);
    sum = HADD_UH_U32(sum_h);
    {
      v16u8 src7, src8, src_r, src_l;
      v16i8 mask;
      v8u16 add_r, add_l;
      v8i16 sub_r, sub_l, sum_r, sum_l, mask0, mask1;
      v4i32 sum_sq0, sum_sq1, sum_sq2, sum_sq3;
      v4i32 sub0, sub1, sub2, sub3;
      v4i32 sum0_w, sum1_w, sum2_w, sum3_w;
      v4i32 mul0, mul1, mul2, mul3;
      v4i32 total0, total1, total2, total3;
      v8i16 const8 = __msa_fill_h(8);

      src7 = LD_UB(src_dup + 7);
      src8 = LD_UB(src_dup - 8);
      for (col = 0; col < (cols >> 4); ++col) {
        ILVRL_B2_UB(src7, src8, src_r, src_l);
        HSUB_UB2_SH(src_r, src_l, sub_r, sub_l);

        sum_r[0] = sum + sub_r[0];
        for (cnt = 0; cnt < 7; ++cnt) {
          sum_r[cnt + 1] = sum_r[cnt] + sub_r[cnt + 1];
        }
        sum_l[0] = sum_r[7] + sub_l[0];
        for (cnt = 0; cnt < 7; ++cnt) {
          sum_l[cnt + 1] = sum_l[cnt] + sub_l[cnt + 1];
        }
        sum = sum_l[7];
        src = LD_UB(src_dup + 16 * col);
        ILVRL_B2_UH(zero, src, src_r_h, src_l_h);
        src7 = (v16u8)((const8 + sum_r + (v8i16)src_r_h) >> 4);
        src8 = (v16u8)((const8 + sum_l + (v8i16)src_l_h) >> 4);
        tmp = (v16u8)__msa_pckev_b((v16i8)src8, (v16i8)src7);

        HADD_UB2_UH(src_r, src_l, add_r, add_l);
        UNPCK_SH_SW(sub_r, sub0, sub1);
        UNPCK_SH_SW(sub_l, sub2, sub3);
        ILVR_H2_SW(zero, add_r, zero, add_l, sum0_w, sum2_w);
        ILVL_H2_SW(zero, add_r, zero, add_l, sum1_w, sum3_w);
        MUL4(sum0_w, sub0, sum1_w, sub1, sum2_w, sub2, sum3_w, sub3, mul0, mul1,
             mul2, mul3);
        sum_sq0[0] = sum_sq + mul0[0];
        for (cnt = 0; cnt < 3; ++cnt) {
          sum_sq0[cnt + 1] = sum_sq0[cnt] + mul0[cnt + 1];
        }
        sum_sq1[0] = sum_sq0[3] + mul1[0];
        for (cnt = 0; cnt < 3; ++cnt) {
          sum_sq1[cnt + 1] = sum_sq1[cnt] + mul1[cnt + 1];
        }
        sum_sq2[0] = sum_sq1[3] + mul2[0];
        for (cnt = 0; cnt < 3; ++cnt) {
          sum_sq2[cnt + 1] = sum_sq2[cnt] + mul2[cnt + 1];
        }
        sum_sq3[0] = sum_sq2[3] + mul3[0];
        for (cnt = 0; cnt < 3; ++cnt) {
          sum_sq3[cnt + 1] = sum_sq3[cnt] + mul3[cnt + 1];
        }
        sum_sq = sum_sq3[3];

        UNPCK_SH_SW(sum_r, sum0_w, sum1_w);
        UNPCK_SH_SW(sum_l, sum2_w, sum3_w);
        total0 = sum_sq0 * __msa_ldi_w(15);
        total0 -= sum0_w * sum0_w;
        total1 = sum_sq1 * __msa_ldi_w(15);
        total1 -= sum1_w * sum1_w;
        total2 = sum_sq2 * __msa_ldi_w(15);
        total2 -= sum2_w * sum2_w;
        total3 = sum_sq3 * __msa_ldi_w(15);
        total3 -= sum3_w * sum3_w;
        total0 = (total0 < flimit_vec);
        total1 = (total1 < flimit_vec);
        total2 = (total2 < flimit_vec);
        total3 = (total3 < flimit_vec);
        PCKEV_H2_SH(total1, total0, total3, total2, mask0, mask1);
        mask = __msa_pckev_b((v16i8)mask1, (v16i8)mask0);
        tmp = __msa_bmz_v(tmp, src, (v16u8)mask);

        if (col == 0) {
          uint64_t src_d;

          src_d = __msa_copy_u_d((v2i64)tmp_orig, 1);
          SD(src_d, (src_dup - 8));
        }

        src7 = LD_UB(src_dup + 16 * (col + 1) + 7);
        src8 = LD_UB(src_dup + 16 * (col + 1) - 8);
        ST_UB(tmp, (src_dup + (16 * col)));
      }

      src_dup += pitch;
    }
  }
}

void aom_mbpost_proc_down_msa(uint8_t *dst_ptr, int32_t pitch, int32_t rows,
                              int32_t cols, int32_t flimit) {
  int32_t row, col, cnt, i;
  const int16_t *rv3 = &aom_rv[63 & rand()];
  v4i32 flimit_vec;
  v16u8 dst7, dst8, dst_r_b, dst_l_b;
  v16i8 mask;
  v8u16 add_r, add_l;
  v8i16 dst_r_h, dst_l_h, sub_r, sub_l, mask0, mask1;
  v4i32 sub0, sub1, sub2, sub3, total0, total1, total2, total3;

  flimit_vec = __msa_fill_w(flimit);

  for (col = 0; col < (cols >> 4); ++col) {
    uint8_t *dst_tmp = &dst_ptr[col << 4];
    v16u8 dst;
    v16i8 zero = { 0 };
    v16u8 tmp[16];
    v8i16 mult0, mult1, rv2_0, rv2_1;
    v8i16 sum0_h = { 0 };
    v8i16 sum1_h = { 0 };
    v4i32 mul0 = { 0 };
    v4i32 mul1 = { 0 };
    v4i32 mul2 = { 0 };
    v4i32 mul3 = { 0 };
    v4i32 sum0_w, sum1_w, sum2_w, sum3_w;
    v4i32 add0, add1, add2, add3;
    const int16_t *rv2[16];

    dst = LD_UB(dst_tmp);
    for (cnt = (col << 4), i = 0; i < 16; ++cnt) {
      rv2[i] = rv3 + ((cnt * 17) & 127);
      ++i;
    }
    for (cnt = -8; cnt < 0; ++cnt) {
      ST_UB(dst, dst_tmp + cnt * pitch);
    }

    dst = LD_UB((dst_tmp + (rows - 1) * pitch));
    for (cnt = rows; cnt < rows + 17; ++cnt) {
      ST_UB(dst, dst_tmp + cnt * pitch);
    }
    for (cnt = -8; cnt <= 6; ++cnt) {
      dst = LD_UB(dst_tmp + (cnt * pitch));
      UNPCK_UB_SH(dst, dst_r_h, dst_l_h);
      MUL2(dst_r_h, dst_r_h, dst_l_h, dst_l_h, mult0, mult1);
      mul0 += (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)mult0);
      mul1 += (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)mult0);
      mul2 += (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)mult1);
      mul3 += (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)mult1);
      ADD2(sum0_h, dst_r_h, sum1_h, dst_l_h, sum0_h, sum1_h);
    }

    for (row = 0; row < (rows + 8); ++row) {
      for (i = 0; i < 8; ++i) {
        rv2_0[i] = *(rv2[i] + (row & 127));
        rv2_1[i] = *(rv2[i + 8] + (row & 127));
      }
      dst7 = LD_UB(dst_tmp + (7 * pitch));
      dst8 = LD_UB(dst_tmp - (8 * pitch));
      ILVRL_B2_UB(dst7, dst8, dst_r_b, dst_l_b);

      HSUB_UB2_SH(dst_r_b, dst_l_b, sub_r, sub_l);
      UNPCK_SH_SW(sub_r, sub0, sub1);
      UNPCK_SH_SW(sub_l, sub2, sub3);
      sum0_h += sub_r;
      sum1_h += sub_l;

      HADD_UB2_UH(dst_r_b, dst_l_b, add_r, add_l);

      ILVRL_H2_SW(zero, add_r, add0, add1);
      ILVRL_H2_SW(zero, add_l, add2, add3);
      mul0 += add0 * sub0;
      mul1 += add1 * sub1;
      mul2 += add2 * sub2;
      mul3 += add3 * sub3;
      dst = LD_UB(dst_tmp);
      ILVRL_B2_SH(zero, dst, dst_r_h, dst_l_h);
      dst7 = (v16u8)((rv2_0 + sum0_h + dst_r_h) >> 4);
      dst8 = (v16u8)((rv2_1 + sum1_h + dst_l_h) >> 4);
      tmp[row & 15] = (v16u8)__msa_pckev_b((v16i8)dst8, (v16i8)dst7);

      UNPCK_SH_SW(sum0_h, sum0_w, sum1_w);
      UNPCK_SH_SW(sum1_h, sum2_w, sum3_w);
      total0 = mul0 * __msa_ldi_w(15);
      total0 -= sum0_w * sum0_w;
      total1 = mul1 * __msa_ldi_w(15);
      total1 -= sum1_w * sum1_w;
      total2 = mul2 * __msa_ldi_w(15);
      total2 -= sum2_w * sum2_w;
      total3 = mul3 * __msa_ldi_w(15);
      total3 -= sum3_w * sum3_w;
      total0 = (total0 < flimit_vec);
      total1 = (total1 < flimit_vec);
      total2 = (total2 < flimit_vec);
      total3 = (total3 < flimit_vec);
      PCKEV_H2_SH(total1, total0, total3, total2, mask0, mask1);
      mask = __msa_pckev_b((v16i8)mask1, (v16i8)mask0);
      tmp[row & 15] = __msa_bmz_v(tmp[row & 15], dst, (v16u8)mask);

      if (row >= 8) {
        ST_UB(tmp[(row - 8) & 15], (dst_tmp - 8 * pitch));
      }

      dst_tmp += pitch;
    }
  }
}
