/*
 * Copyright (c) 2021, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 3-Clause Clear License
 * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
 * License was not distributed with this source code in the LICENSE file, you
 * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/.  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
 * aomedia.org/license/patent-license/.
 */

#include <arm_neon.h>
#include <assert.h>

#include "aom/aom_integer.h"
#include "aom_dsp/aom_dsp_common.h"
#include "aom_dsp/blend.h"
#include "aom_dsp/arm/blend_neon.h"
#include "aom_dsp/arm/mem_neon.h"
#include "aom_ports/mem.h"
#include "config/aom_dsp_rtcd.h"

uint8x8_t alpha_blend_a64_d16_u16x8(uint16x8_t m, uint16x8_t a, uint16x8_t b,
                                    uint16x8_t round_offset) {
  const uint16x8_t m_inv = vsubq_u16(vdupq_n_u16(AOM_BLEND_A64_MAX_ALPHA), m);
  uint32x4_t blend_u32_lo = vmull_u16(vget_low_u16(m), vget_low_u16(a));
  uint32x4_t blend_u32_hi = vmull_u16(vget_high_u16(m), vget_high_u16(a));
  blend_u32_lo = vmlal_u16(blend_u32_lo, vget_low_u16(m_inv), vget_low_u16(b));
  blend_u32_hi =
      vmlal_u16(blend_u32_hi, vget_high_u16(m_inv), vget_high_u16(b));
  uint16x4_t blend_u16_lo = vshrn_n_u32(blend_u32_lo, AOM_BLEND_A64_ROUND_BITS);
  uint16x4_t blend_u16_hi = vshrn_n_u32(blend_u32_hi, AOM_BLEND_A64_ROUND_BITS);
  uint16x8_t res = vcombine_u16(blend_u16_lo, blend_u16_hi);
  res = vqsubq_u16(res, round_offset);
  return vqrshrn_n_u16(res,
                       2 * FILTER_BITS - ROUND0_BITS - COMPOUND_ROUND1_BITS);
}

void aom_lowbd_blend_a64_d16_mask_neon(
    uint8_t *dst, uint32_t dst_stride, const CONV_BUF_TYPE *src0,
    uint32_t src0_stride, const CONV_BUF_TYPE *src1, uint32_t src1_stride,
    const uint8_t *mask, uint32_t mask_stride, int w, int h, int subw, int subh,
    ConvolveParams *conv_params) {
  (void)conv_params;
  const int bd = 8;
  const int offset_bits = bd + 2 * FILTER_BITS - ROUND0_BITS;
  const int round_offset = (1 << (offset_bits - COMPOUND_ROUND1_BITS)) +
                           (1 << (offset_bits - COMPOUND_ROUND1_BITS - 1));
  const uint16x8_t offset_vec = vdupq_n_u16(round_offset);
  assert(IMPLIES((void *)src0 == dst, src0_stride == dst_stride));
  assert(IMPLIES((void *)src1 == dst, src1_stride == dst_stride));
  assert(h >= 4);
  assert(w >= 4);
  assert(IS_POWER_OF_TWO(h));
  assert(IS_POWER_OF_TWO(w));
  if (subw == 0 && subh == 0) {
    if (w >= 8) {
      do {
        int i = 0;
        do {
          uint16x8_t m0 = vmovl_u8(vld1_u8(mask + i));
          uint16x8_t s0 = vld1q_u16(src0 + i);
          uint16x8_t s1 = vld1q_u16(src1 + i);
          uint8x8_t blend = alpha_blend_a64_d16_u16x8(m0, s0, s1, offset_vec);
          vst1_u8(dst + i, blend);
          i += 8;
        } while (i < w);
        mask += mask_stride;
        src0 += src0_stride;
        src1 += src1_stride;
        dst += dst_stride;
      } while (--h != 0);
    } else {
      do {
        uint16x8_t m0 = vmovl_u8(load_unaligned_u8_4x2(mask, mask_stride));
        uint16x8_t s0 = load_unaligned_u16_4x2(src0, src0_stride);
        uint16x8_t s1 = load_unaligned_u16_4x2(src1, src1_stride);
        uint8x8_t blend = alpha_blend_a64_d16_u16x8(m0, s0, s1, offset_vec);
        store_u8x4_strided_x2(dst, dst_stride, blend);
        mask += 2 * mask_stride;
        src0 += 2 * src0_stride;
        src1 += 2 * src1_stride;
        dst += 2 * dst_stride;
        h -= 2;
      } while (h != 0);
    }
  } else if (subw == 1 && subh == 1) {
    if (w >= 8) {
      do {
        int i = 0;
        do {
          uint8x8_t m0 = vld1_u8(mask + 0 * mask_stride + 2 * i);
          uint8x8_t m1 = vld1_u8(mask + 1 * mask_stride + 2 * i);
          uint8x8_t m2 = vld1_u8(mask + 0 * mask_stride + 2 * i + 8);
          uint8x8_t m3 = vld1_u8(mask + 1 * mask_stride + 2 * i + 8);
          uint16x8_t s0 = vld1q_u16(src0 + i);
          uint16x8_t s1 = vld1q_u16(src1 + i);
          uint16x8_t m_avg =
              vmovl_u8(avg_blend_pairwise_u8x8_4(m0, m1, m2, m3));
          uint8x8_t blend =
              alpha_blend_a64_d16_u16x8(m_avg, s0, s1, offset_vec);
          vst1_u8(dst + i, blend);
          i += 8;
        } while (i < w);
        mask += 2 * mask_stride;
        src0 += src0_stride;
        src1 += src1_stride;
        dst += dst_stride;
      } while (--h != 0);
    } else {
      do {
        uint8x8_t m0 = vld1_u8(mask + 0 * mask_stride);
        uint8x8_t m1 = vld1_u8(mask + 1 * mask_stride);
        uint8x8_t m2 = vld1_u8(mask + 2 * mask_stride);
        uint8x8_t m3 = vld1_u8(mask + 3 * mask_stride);
        uint16x8_t s0 = load_unaligned_u16_4x2(src0, src0_stride);
        uint16x8_t s1 = load_unaligned_u16_4x2(src1, src1_stride);
        uint16x8_t m_avg = vmovl_u8(avg_blend_pairwise_u8x8_4(m0, m1, m2, m3));
        uint8x8_t blend = alpha_blend_a64_d16_u16x8(m_avg, s0, s1, offset_vec);
        store_u8x4_strided_x2(dst, dst_stride, blend);
        mask += 4 * mask_stride;
        src0 += 2 * src0_stride;
        src1 += 2 * src1_stride;
        dst += 2 * dst_stride;
        h -= 2;
      } while (h != 0);
    }
  } else if (subw == 1 && subh == 0) {
    if (w >= 8) {
      do {
        int i = 0;
        do {
          uint8x8_t m0 = vld1_u8(mask + 2 * i);
          uint8x8_t m1 = vld1_u8(mask + 2 * i + 8);
          uint16x8_t s0 = vld1q_u16(src0 + i);
          uint16x8_t s1 = vld1q_u16(src1 + i);
          uint16x8_t m_avg = vmovl_u8(avg_blend_pairwise_u8x8(m0, m1));
          uint8x8_t blend =
              alpha_blend_a64_d16_u16x8(m_avg, s0, s1, offset_vec);
          vst1_u8(dst + i, blend);
          i += 8;
        } while (i < w);
        mask += mask_stride;
        src0 += src0_stride;
        src1 += src1_stride;
        dst += dst_stride;
      } while (--h != 0);
    } else {
      do {
        uint8x8_t m0 = vld1_u8(mask + 0 * mask_stride);
        uint8x8_t m1 = vld1_u8(mask + 1 * mask_stride);
        uint16x8_t s0 = load_unaligned_u16_4x2(src0, src0_stride);
        uint16x8_t s1 = load_unaligned_u16_4x2(src1, src1_stride);
        uint16x8_t m_avg = vmovl_u8(avg_blend_pairwise_u8x8(m0, m1));
        uint8x8_t blend = alpha_blend_a64_d16_u16x8(m_avg, s0, s1, offset_vec);
        store_u8x4_strided_x2(dst, dst_stride, blend);
        mask += 2 * mask_stride;
        src0 += 2 * src0_stride;
        src1 += 2 * src1_stride;
        dst += 2 * dst_stride;
        h -= 2;
      } while (h != 0);
    }
  } else {
    if (w >= 8) {
      do {
        int i = 0;
        do {
          uint8x8_t m0 = vld1_u8(mask + 0 * mask_stride + i);
          uint8x8_t m1 = vld1_u8(mask + 1 * mask_stride + i);
          uint16x8_t s0 = vld1q_u16(src0 + i);
          uint16x8_t s1 = vld1q_u16(src1 + i);
          uint16x8_t m_avg = vmovl_u8(avg_blend_u8x8(m0, m1));
          uint8x8_t blend =
              alpha_blend_a64_d16_u16x8(m_avg, s0, s1, offset_vec);
          vst1_u8(dst + i, blend);
          i += 8;
        } while (i < w);
        mask += 2 * mask_stride;
        src0 += src0_stride;
        src1 += src1_stride;
        dst += dst_stride;
      } while (--h != 0);
    } else {
      do {
        uint8x8_t m0_2 =
            load_unaligned_u8_4x2(mask + 0 * mask_stride, 2 * mask_stride);
        uint8x8_t m1_3 =
            load_unaligned_u8_4x2(mask + 1 * mask_stride, 2 * mask_stride);
        uint16x8_t s0 = load_unaligned_u16_4x2(src0, src0_stride);
        uint16x8_t s1 = load_unaligned_u16_4x2(src1, src1_stride);
        uint16x8_t m_avg = vmovl_u8(avg_blend_u8x8(m0_2, m1_3));
        uint8x8_t blend = alpha_blend_a64_d16_u16x8(m_avg, s0, s1, offset_vec);
        store_u8x4_strided_x2(dst, dst_stride, blend);
        mask += 4 * mask_stride;
        src0 += 2 * src0_stride;
        src1 += 2 * src1_stride;
        dst += 2 * dst_stride;
        h -= 2;
      } while (h != 0);
    }
  }
}

void aom_blend_a64_mask_neon(uint8_t *dst, uint32_t dst_stride,
                             const uint8_t *src0, uint32_t src0_stride,
                             const uint8_t *src1, uint32_t src1_stride,
                             const uint8_t *mask, uint32_t mask_stride, int w,
                             int h, int subw, int subh) {
  assert(IMPLIES(src0 == dst, src0_stride == dst_stride));
  assert(IMPLIES(src1 == dst, src1_stride == dst_stride));
  assert(h >= 1);
  assert(w >= 1);
  assert(IS_POWER_OF_TWO(h));
  assert(IS_POWER_OF_TWO(w));
  if ((subw | subh) == 0) {
    if (w > 8) {
      do {
        int i = 0;
        do {
          uint8x16_t m0 = vld1q_u8(mask + i);
          uint8x16_t s0 = vld1q_u8(src0 + i);
          uint8x16_t s1 = vld1q_u8(src1 + i);
          uint8x16_t blend = alpha_blend_a64_u8x16(m0, s0, s1);
          vst1q_u8(dst + i, blend);
          i += 16;
        } while (i < w);
        mask += mask_stride;
        src0 += src0_stride;
        src1 += src1_stride;
        dst += dst_stride;
      } while (--h != 0);
    } else if (w == 8) {
      do {
        uint8x8_t m0 = vld1_u8(mask);
        uint8x8_t s0 = vld1_u8(src0);
        uint8x8_t s1 = vld1_u8(src1);
        uint8x8_t blend = alpha_blend_a64_u8x8(m0, s0, s1);
        vst1_u8(dst, blend);
        mask += mask_stride;
        src0 += src0_stride;
        src1 += src1_stride;
        dst += dst_stride;
      } while (--h != 0);
    } else {
      do {
        uint8x8_t m0 = load_unaligned_u8_4x2(mask, mask_stride);
        uint8x8_t s0 = load_unaligned_u8_4x2(src0, src0_stride);
        uint8x8_t s1 = load_unaligned_u8_4x2(src1, src1_stride);
        uint8x8_t blend = alpha_blend_a64_u8x8(m0, s0, s1);
        store_u8x4_strided_x2(dst, dst_stride, blend);
        mask += 2 * mask_stride;
        src0 += 2 * src0_stride;
        src1 += 2 * src1_stride;
        dst += 2 * dst_stride;
        h -= 2;
      } while (h != 0);
    }
  } else if ((subw & subh) == 1) {
    if (w > 8) {
      do {
        int i = 0;
        do {
          uint8x16_t m0 = vld1q_u8(mask + 0 * mask_stride + 2 * i);
          uint8x16_t m1 = vld1q_u8(mask + 1 * mask_stride + 2 * i);
          uint8x16_t m2 = vld1q_u8(mask + 0 * mask_stride + 2 * i + 16);
          uint8x16_t m3 = vld1q_u8(mask + 1 * mask_stride + 2 * i + 16);
          uint8x16_t s0 = vld1q_u8(src0 + i);
          uint8x16_t s1 = vld1q_u8(src1 + i);
          uint8x16_t m_avg = avg_blend_pairwise_u8x16_4(m0, m1, m2, m3);
          uint8x16_t blend = alpha_blend_a64_u8x16(m_avg, s0, s1);
          vst1q_u8(dst + i, blend);
          i += 16;
        } while (i < w);
        mask += 2 * mask_stride;
        src0 += src0_stride;
        src1 += src1_stride;
        dst += dst_stride;
      } while (--h != 0);
    } else if (w == 8) {
      do {
        uint8x8_t m0 = vld1_u8(mask + 0 * mask_stride);
        uint8x8_t m1 = vld1_u8(mask + 1 * mask_stride);
        uint8x8_t m2 = vld1_u8(mask + 0 * mask_stride + 8);
        uint8x8_t m3 = vld1_u8(mask + 1 * mask_stride + 8);
        uint8x8_t s0 = vld1_u8(src0);
        uint8x8_t s1 = vld1_u8(src1);
        uint8x8_t m_avg = avg_blend_pairwise_u8x8_4(m0, m1, m2, m3);
        uint8x8_t blend = alpha_blend_a64_u8x8(m_avg, s0, s1);
        vst1_u8(dst, blend);
        mask += 2 * mask_stride;
        src0 += src0_stride;
        src1 += src1_stride;
        dst += dst_stride;
      } while (--h != 0);
    } else {
      do {
        uint8x8_t m0 = vld1_u8(mask + 0 * mask_stride);
        uint8x8_t m1 = vld1_u8(mask + 1 * mask_stride);
        uint8x8_t m2 = vld1_u8(mask + 2 * mask_stride);
        uint8x8_t m3 = vld1_u8(mask + 3 * mask_stride);
        uint8x8_t s0 = load_unaligned_u8_4x2(src0, src0_stride);
        uint8x8_t s1 = load_unaligned_u8_4x2(src1, src1_stride);
        uint8x8_t m_avg = avg_blend_pairwise_u8x8_4(m0, m1, m2, m3);
        uint8x8_t blend = alpha_blend_a64_u8x8(m_avg, s0, s1);
        store_u8x4_strided_x2(dst, dst_stride, blend);
        mask += 4 * mask_stride;
        src0 += 2 * src0_stride;
        src1 += 2 * src1_stride;
        dst += 2 * dst_stride;
        h -= 2;
      } while (h != 0);
    }
  } else if (subw == 1 && subh == 0) {
    if (w > 8) {
      do {
        int i = 0;
        do {
          uint8x16_t m0 = vld1q_u8(mask + 2 * i);
          uint8x16_t m1 = vld1q_u8(mask + 2 * i + 16);
          uint8x16_t s0 = vld1q_u8(src0 + i);
          uint8x16_t s1 = vld1q_u8(src1 + i);
          uint8x16_t m_avg = avg_blend_pairwise_u8x16(m0, m1);
          uint8x16_t blend = alpha_blend_a64_u8x16(m_avg, s0, s1);
          vst1q_u8(dst + i, blend);
          i += 16;
        } while (i < w);
        mask += mask_stride;
        src0 += src0_stride;
        src1 += src1_stride;
        dst += dst_stride;
      } while (--h != 0);
    } else if (w == 8) {
      do {
        uint8x8_t m0 = vld1_u8(mask);
        uint8x8_t m1 = vld1_u8(mask + 8);
        uint8x8_t s0 = vld1_u8(src0);
        uint8x8_t s1 = vld1_u8(src1);
        uint8x8_t m_avg = avg_blend_pairwise_u8x8(m0, m1);
        uint8x8_t blend = alpha_blend_a64_u8x8(m_avg, s0, s1);
        vst1_u8(dst, blend);
        mask += mask_stride;
        src0 += src0_stride;
        src1 += src1_stride;
        dst += dst_stride;
      } while (--h != 0);
    } else {
      do {
        uint8x8_t m0 = vld1_u8(mask + 0 * mask_stride);
        uint8x8_t m1 = vld1_u8(mask + 1 * mask_stride);
        uint8x8_t s0 = load_unaligned_u8_4x2(src0, src0_stride);
        uint8x8_t s1 = load_unaligned_u8_4x2(src1, src1_stride);
        uint8x8_t m_avg = avg_blend_pairwise_u8x8(m0, m1);
        uint8x8_t blend = alpha_blend_a64_u8x8(m_avg, s0, s1);
        store_u8x4_strided_x2(dst, dst_stride, blend);
        mask += 2 * mask_stride;
        src0 += 2 * src0_stride;
        src1 += 2 * src1_stride;
        dst += 2 * dst_stride;
        h -= 2;
      } while (h != 0);
    }
  } else {
    if (w > 8) {
      do {
        int i = 0;
        do {
          uint8x16_t m0 = vld1q_u8(mask + 0 * mask_stride + i);
          uint8x16_t m1 = vld1q_u8(mask + 1 * mask_stride + i);
          uint8x16_t s0 = vld1q_u8(src0 + i);
          uint8x16_t s1 = vld1q_u8(src1 + i);
          uint8x16_t m_avg = avg_blend_u8x16(m0, m1);
          uint8x16_t blend = alpha_blend_a64_u8x16(m_avg, s0, s1);
          vst1q_u8(dst + i, blend);
          i += 16;
        } while (i < w);
        mask += 2 * mask_stride;
        src0 += src0_stride;
        src1 += src1_stride;
        dst += dst_stride;
      } while (--h != 0);
    } else if (w == 8) {
      do {
        uint8x8_t m0 = vld1_u8(mask + 0 * mask_stride);
        uint8x8_t m1 = vld1_u8(mask + 1 * mask_stride);
        uint8x8_t s0 = vld1_u8(src0);
        uint8x8_t s1 = vld1_u8(src1);
        uint8x8_t m_avg = avg_blend_u8x8(m0, m1);
        uint8x8_t blend = alpha_blend_a64_u8x8(m_avg, s0, s1);
        vst1_u8(dst, blend);
        mask += 2 * mask_stride;
        src0 += src0_stride;
        src1 += src1_stride;
        dst += dst_stride;
      } while (--h != 0);
    } else {
      do {
        uint8x8_t m0_2 =
            load_unaligned_u8_4x2(mask + 0 * mask_stride, 2 * mask_stride);
        uint8x8_t m1_3 =
            load_unaligned_u8_4x2(mask + 1 * mask_stride, 2 * mask_stride);
        uint8x8_t s0 = load_unaligned_u8_4x2(src0, src0_stride);
        uint8x8_t s1 = load_unaligned_u8_4x2(src1, src1_stride);
        uint8x8_t m_avg = avg_blend_u8x8(m0_2, m1_3);
        uint8x8_t blend = alpha_blend_a64_u8x8(m_avg, s0, s1);
        store_u8x4_strided_x2(dst, dst_stride, blend);
        mask += 4 * mask_stride;
        src0 += 2 * src0_stride;
        src1 += 2 * src1_stride;
        dst += 2 * dst_stride;
        h -= 2;
      } while (h != 0);
    }
  }
}
