/*
 * Copyright (c) 2023, 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 <arm_neon.h>
#include <assert.h>

#include "aom_dsp/arm/mem_neon.h"
#include "av1/common/convolve.h"
#include "config/aom_config.h"
#include "config/av1_rtcd.h"

#define HBD_WIENER_5TAP_HORIZ(name, shift)                              \
  static INLINE uint16x8_t name##_wiener_convolve5_8_2d_h(              \
      const int16x8_t s0, const int16x8_t s1, const int16x8_t s2,       \
      const int16x8_t s3, const int16x8_t s4, const int16x4_t x_filter, \
      const int32x4_t round_vec, const uint16x8_t im_max_val) {         \
    /* Wiener filter is symmetric so add mirrored source elements. */   \
    int16x8_t s04 = vaddq_s16(s0, s4);                                  \
    int16x8_t s13 = vaddq_s16(s1, s3);                                  \
                                                                        \
    /* x_filter[0] = 0. (5-tap filters are 0-padded to 7 taps.) */      \
    int32x4_t sum_lo =                                                  \
        vmlal_lane_s16(round_vec, vget_low_s16(s04), x_filter, 1);      \
    sum_lo = vmlal_lane_s16(sum_lo, vget_low_s16(s13), x_filter, 2);    \
    sum_lo = vmlal_lane_s16(sum_lo, vget_low_s16(s2), x_filter, 3);     \
                                                                        \
    int32x4_t sum_hi =                                                  \
        vmlal_lane_s16(round_vec, vget_high_s16(s04), x_filter, 1);     \
    sum_hi = vmlal_lane_s16(sum_hi, vget_high_s16(s13), x_filter, 2);   \
    sum_hi = vmlal_lane_s16(sum_hi, vget_high_s16(s2), x_filter, 3);    \
                                                                        \
    uint16x4_t res_lo = vqrshrun_n_s32(sum_lo, shift);                  \
    uint16x4_t res_hi = vqrshrun_n_s32(sum_hi, shift);                  \
                                                                        \
    return vminq_u16(vcombine_u16(res_lo, res_hi), im_max_val);         \
  }                                                                     \
                                                                        \
  static INLINE void name##_convolve_add_src_5tap_horiz(                \
      const uint16_t *src_ptr, ptrdiff_t src_stride, uint16_t *dst_ptr, \
      ptrdiff_t dst_stride, int w, int h, const int16x4_t x_filter,     \
      const int32x4_t round_vec, const uint16x8_t im_max_val) {         \
    do {                                                                \
      const int16_t *s = (int16_t *)src_ptr;                            \
      uint16_t *d = dst_ptr;                                            \
      int width = w;                                                    \
                                                                        \
      do {                                                              \
        int16x8_t s0, s1, s2, s3, s4;                                   \
        load_s16_8x5(s, 1, &s0, &s1, &s2, &s3, &s4);                    \
                                                                        \
        uint16x8_t d0 = name##_wiener_convolve5_8_2d_h(                 \
            s0, s1, s2, s3, s4, x_filter, round_vec, im_max_val);       \
                                                                        \
        vst1q_u16(d, d0);                                               \
                                                                        \
        s += 8;                                                         \
        d += 8;                                                         \
        width -= 8;                                                     \
      } while (width != 0);                                             \
      src_ptr += src_stride;                                            \
      dst_ptr += dst_stride;                                            \
    } while (--h != 0);                                                 \
  }

HBD_WIENER_5TAP_HORIZ(highbd, WIENER_ROUND0_BITS)
HBD_WIENER_5TAP_HORIZ(highbd_12, WIENER_ROUND0_BITS + 2)

#undef HBD_WIENER_5TAP_HORIZ

#define HBD_WIENER_7TAP_HORIZ(name, shift)                                     \
  static INLINE uint16x8_t name##_wiener_convolve7_8_2d_h(                     \
      const int16x8_t s0, const int16x8_t s1, const int16x8_t s2,              \
      const int16x8_t s3, const int16x8_t s4, const int16x8_t s5,              \
      const int16x8_t s6, const int16x4_t x_filter, const int32x4_t round_vec, \
      const uint16x8_t im_max_val) {                                           \
    /* Wiener filter is symmetric so add mirrored source elements. */          \
    int16x8_t s06 = vaddq_s16(s0, s6);                                         \
    int16x8_t s15 = vaddq_s16(s1, s5);                                         \
    int16x8_t s24 = vaddq_s16(s2, s4);                                         \
                                                                               \
    int32x4_t sum_lo =                                                         \
        vmlal_lane_s16(round_vec, vget_low_s16(s06), x_filter, 0);             \
    sum_lo = vmlal_lane_s16(sum_lo, vget_low_s16(s15), x_filter, 1);           \
    sum_lo = vmlal_lane_s16(sum_lo, vget_low_s16(s24), x_filter, 2);           \
    sum_lo = vmlal_lane_s16(sum_lo, vget_low_s16(s3), x_filter, 3);            \
                                                                               \
    int32x4_t sum_hi =                                                         \
        vmlal_lane_s16(round_vec, vget_high_s16(s06), x_filter, 0);            \
    sum_hi = vmlal_lane_s16(sum_hi, vget_high_s16(s15), x_filter, 1);          \
    sum_hi = vmlal_lane_s16(sum_hi, vget_high_s16(s24), x_filter, 2);          \
    sum_hi = vmlal_lane_s16(sum_hi, vget_high_s16(s3), x_filter, 3);           \
                                                                               \
    uint16x4_t res_lo = vqrshrun_n_s32(sum_lo, shift);                         \
    uint16x4_t res_hi = vqrshrun_n_s32(sum_hi, shift);                         \
                                                                               \
    return vminq_u16(vcombine_u16(res_lo, res_hi), im_max_val);                \
  }                                                                            \
                                                                               \
  static INLINE void name##_convolve_add_src_7tap_horiz(                       \
      const uint16_t *src_ptr, ptrdiff_t src_stride, uint16_t *dst_ptr,        \
      ptrdiff_t dst_stride, int w, int h, const int16x4_t x_filter,            \
      const int32x4_t round_vec, const uint16x8_t im_max_val) {                \
    do {                                                                       \
      const int16_t *s = (int16_t *)src_ptr;                                   \
      uint16_t *d = dst_ptr;                                                   \
      int width = w;                                                           \
                                                                               \
      do {                                                                     \
        int16x8_t s0, s1, s2, s3, s4, s5, s6;                                  \
        load_s16_8x7(s, 1, &s0, &s1, &s2, &s3, &s4, &s5, &s6);                 \
                                                                               \
        uint16x8_t d0 = name##_wiener_convolve7_8_2d_h(                        \
            s0, s1, s2, s3, s4, s5, s6, x_filter, round_vec, im_max_val);      \
                                                                               \
        vst1q_u16(d, d0);                                                      \
                                                                               \
        s += 8;                                                                \
        d += 8;                                                                \
        width -= 8;                                                            \
      } while (width != 0);                                                    \
      src_ptr += src_stride;                                                   \
      dst_ptr += dst_stride;                                                   \
    } while (--h != 0);                                                        \
  }

HBD_WIENER_7TAP_HORIZ(highbd, WIENER_ROUND0_BITS)
HBD_WIENER_7TAP_HORIZ(highbd_12, WIENER_ROUND0_BITS + 2)

#undef HBD_WIENER_7TAP_HORIZ

#define HBD_WIENER_5TAP_VERT(name, shift)                                     \
  static INLINE uint16x8_t name##_wiener_convolve5_8_2d_v(                    \
      const int16x8_t s0, const int16x8_t s1, const int16x8_t s2,             \
      const int16x8_t s3, const int16x8_t s4, const int16x4_t y_filter,       \
      const int32x4_t round_vec, const uint16x8_t res_max_val) {              \
    const int32x2_t y_filter_lo = vget_low_s32(vmovl_s16(y_filter));          \
    const int32x2_t y_filter_hi = vget_high_s32(vmovl_s16(y_filter));         \
    /* Wiener filter is symmetric so add mirrored source elements. */         \
    int32x4_t s04_lo = vaddl_s16(vget_low_s16(s0), vget_low_s16(s4));         \
    int32x4_t s13_lo = vaddl_s16(vget_low_s16(s1), vget_low_s16(s3));         \
                                                                              \
    /* y_filter[0] = 0. (5-tap filters are 0-padded to 7 taps.) */            \
    int32x4_t sum_lo = vmlaq_lane_s32(round_vec, s04_lo, y_filter_lo, 1);     \
    sum_lo = vmlaq_lane_s32(sum_lo, s13_lo, y_filter_hi, 0);                  \
    sum_lo =                                                                  \
        vmlaq_lane_s32(sum_lo, vmovl_s16(vget_low_s16(s2)), y_filter_hi, 1);  \
                                                                              \
    int32x4_t s04_hi = vaddl_s16(vget_high_s16(s0), vget_high_s16(s4));       \
    int32x4_t s13_hi = vaddl_s16(vget_high_s16(s1), vget_high_s16(s3));       \
                                                                              \
    int32x4_t sum_hi = vmlaq_lane_s32(round_vec, s04_hi, y_filter_lo, 1);     \
    sum_hi = vmlaq_lane_s32(sum_hi, s13_hi, y_filter_hi, 0);                  \
    sum_hi =                                                                  \
        vmlaq_lane_s32(sum_hi, vmovl_s16(vget_high_s16(s2)), y_filter_hi, 1); \
                                                                              \
    uint16x4_t res_lo = vqrshrun_n_s32(sum_lo, shift);                        \
    uint16x4_t res_hi = vqrshrun_n_s32(sum_hi, shift);                        \
                                                                              \
    return vminq_u16(vcombine_u16(res_lo, res_hi), res_max_val);              \
  }                                                                           \
                                                                              \
  static INLINE void name##_convolve_add_src_5tap_vert(                       \
      const uint16_t *src_ptr, ptrdiff_t src_stride, uint16_t *dst_ptr,       \
      ptrdiff_t dst_stride, int w, int h, const int16x4_t y_filter,           \
      const int32x4_t round_vec, const uint16x8_t res_max_val) {              \
    do {                                                                      \
      const int16_t *s = (int16_t *)src_ptr;                                  \
      uint16_t *d = dst_ptr;                                                  \
      int height = h;                                                         \
                                                                              \
      while (height > 3) {                                                    \
        int16x8_t s0, s1, s2, s3, s4, s5, s6, s7;                             \
        load_s16_8x8(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6, &s7);  \
                                                                              \
        uint16x8_t d0 = name##_wiener_convolve5_8_2d_v(                       \
            s0, s1, s2, s3, s4, y_filter, round_vec, res_max_val);            \
        uint16x8_t d1 = name##_wiener_convolve5_8_2d_v(                       \
            s1, s2, s3, s4, s5, y_filter, round_vec, res_max_val);            \
        uint16x8_t d2 = name##_wiener_convolve5_8_2d_v(                       \
            s2, s3, s4, s5, s6, y_filter, round_vec, res_max_val);            \
        uint16x8_t d3 = name##_wiener_convolve5_8_2d_v(                       \
            s3, s4, s5, s6, s7, y_filter, round_vec, res_max_val);            \
                                                                              \
        store_u16_8x4(d, dst_stride, d0, d1, d2, d3);                         \
                                                                              \
        s += 4 * src_stride;                                                  \
        d += 4 * dst_stride;                                                  \
        height -= 4;                                                          \
      }                                                                       \
                                                                              \
      while (height-- != 0) {                                                 \
        int16x8_t s0, s1, s2, s3, s4;                                         \
        load_s16_8x5(s, src_stride, &s0, &s1, &s2, &s3, &s4);                 \
                                                                              \
        uint16x8_t d0 = name##_wiener_convolve5_8_2d_v(                       \
            s0, s1, s2, s3, s4, y_filter, round_vec, res_max_val);            \
                                                                              \
        vst1q_u16(d, d0);                                                     \
                                                                              \
        s += src_stride;                                                      \
        d += dst_stride;                                                      \
      }                                                                       \
                                                                              \
      src_ptr += 8;                                                           \
      dst_ptr += 8;                                                           \
      w -= 8;                                                                 \
    } while (w != 0);                                                         \
  }

HBD_WIENER_5TAP_VERT(highbd, 2 * FILTER_BITS - WIENER_ROUND0_BITS)
HBD_WIENER_5TAP_VERT(highbd_12, 2 * FILTER_BITS - WIENER_ROUND0_BITS - 2)

#undef HBD_WIENER_5TAP_VERT

#define HBD_WIENER_7TAP_VERT(name, shift)                                      \
  static INLINE uint16x8_t name##_wiener_convolve7_8_2d_v(                     \
      const int16x8_t s0, const int16x8_t s1, const int16x8_t s2,              \
      const int16x8_t s3, const int16x8_t s4, const int16x8_t s5,              \
      const int16x8_t s6, const int16x4_t y_filter, const int32x4_t round_vec, \
      const uint16x8_t res_max_val) {                                          \
    const int32x2_t y_filter_lo = vget_low_s32(vmovl_s16(y_filter));           \
    const int32x2_t y_filter_hi = vget_high_s32(vmovl_s16(y_filter));          \
    /* Wiener filter is symmetric so add mirrored source elements. */          \
    int32x4_t s06_lo = vaddl_s16(vget_low_s16(s0), vget_low_s16(s6));          \
    int32x4_t s15_lo = vaddl_s16(vget_low_s16(s1), vget_low_s16(s5));          \
    int32x4_t s24_lo = vaddl_s16(vget_low_s16(s2), vget_low_s16(s4));          \
                                                                               \
    int32x4_t sum_lo = vmlaq_lane_s32(round_vec, s06_lo, y_filter_lo, 0);      \
    sum_lo = vmlaq_lane_s32(sum_lo, s15_lo, y_filter_lo, 1);                   \
    sum_lo = vmlaq_lane_s32(sum_lo, s24_lo, y_filter_hi, 0);                   \
    sum_lo =                                                                   \
        vmlaq_lane_s32(sum_lo, vmovl_s16(vget_low_s16(s3)), y_filter_hi, 1);   \
                                                                               \
    int32x4_t s06_hi = vaddl_s16(vget_high_s16(s0), vget_high_s16(s6));        \
    int32x4_t s15_hi = vaddl_s16(vget_high_s16(s1), vget_high_s16(s5));        \
    int32x4_t s24_hi = vaddl_s16(vget_high_s16(s2), vget_high_s16(s4));        \
                                                                               \
    int32x4_t sum_hi = vmlaq_lane_s32(round_vec, s06_hi, y_filter_lo, 0);      \
    sum_hi = vmlaq_lane_s32(sum_hi, s15_hi, y_filter_lo, 1);                   \
    sum_hi = vmlaq_lane_s32(sum_hi, s24_hi, y_filter_hi, 0);                   \
    sum_hi =                                                                   \
        vmlaq_lane_s32(sum_hi, vmovl_s16(vget_high_s16(s3)), y_filter_hi, 1);  \
                                                                               \
    uint16x4_t res_lo = vqrshrun_n_s32(sum_lo, shift);                         \
    uint16x4_t res_hi = vqrshrun_n_s32(sum_hi, shift);                         \
                                                                               \
    return vminq_u16(vcombine_u16(res_lo, res_hi), res_max_val);               \
  }                                                                            \
                                                                               \
  static INLINE void name##_convolve_add_src_7tap_vert(                        \
      const uint16_t *src_ptr, ptrdiff_t src_stride, uint16_t *dst_ptr,        \
      ptrdiff_t dst_stride, int w, int h, const int16x4_t y_filter,            \
      const int32x4_t round_vec, const uint16x8_t res_max_val) {               \
    do {                                                                       \
      const int16_t *s = (int16_t *)src_ptr;                                   \
      uint16_t *d = dst_ptr;                                                   \
      int height = h;                                                          \
                                                                               \
      while (height > 3) {                                                     \
        int16x8_t s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;                      \
        load_s16_8x10(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6, &s7,   \
                      &s8, &s9);                                               \
                                                                               \
        uint16x8_t d0 = name##_wiener_convolve7_8_2d_v(                        \
            s0, s1, s2, s3, s4, s5, s6, y_filter, round_vec, res_max_val);     \
        uint16x8_t d1 = name##_wiener_convolve7_8_2d_v(                        \
            s1, s2, s3, s4, s5, s6, s7, y_filter, round_vec, res_max_val);     \
        uint16x8_t d2 = name##_wiener_convolve7_8_2d_v(                        \
            s2, s3, s4, s5, s6, s7, s8, y_filter, round_vec, res_max_val);     \
        uint16x8_t d3 = name##_wiener_convolve7_8_2d_v(                        \
            s3, s4, s5, s6, s7, s8, s9, y_filter, round_vec, res_max_val);     \
                                                                               \
        store_u16_8x4(d, dst_stride, d0, d1, d2, d3);                          \
                                                                               \
        s += 4 * src_stride;                                                   \
        d += 4 * dst_stride;                                                   \
        height -= 4;                                                           \
      }                                                                        \
                                                                               \
      while (height-- != 0) {                                                  \
        int16x8_t s0, s1, s2, s3, s4, s5, s6;                                  \
        load_s16_8x7(s, src_stride, &s0, &s1, &s2, &s3, &s4, &s5, &s6);        \
                                                                               \
        uint16x8_t d0 = name##_wiener_convolve7_8_2d_v(                        \
            s0, s1, s2, s3, s4, s5, s6, y_filter, round_vec, res_max_val);     \
                                                                               \
        vst1q_u16(d, d0);                                                      \
                                                                               \
        s += src_stride;                                                       \
        d += dst_stride;                                                       \
      }                                                                        \
                                                                               \
      src_ptr += 8;                                                            \
      dst_ptr += 8;                                                            \
      w -= 8;                                                                  \
    } while (w != 0);                                                          \
  }

HBD_WIENER_7TAP_VERT(highbd, 2 * FILTER_BITS - WIENER_ROUND0_BITS)
HBD_WIENER_7TAP_VERT(highbd_12, 2 * FILTER_BITS - WIENER_ROUND0_BITS - 2)

#undef HBD_WIENER_7TAP_VERT

static AOM_INLINE int get_wiener_filter_taps(const int16_t *filter) {
  assert(filter[7] == 0);
  if (filter[0] == 0 && filter[6] == 0) {
    return WIENER_WIN_REDUCED;
  }
  return WIENER_WIN;
}

void av1_highbd_wiener_convolve_add_src_neon(
    const uint8_t *src8, ptrdiff_t src_stride, uint8_t *dst8,
    ptrdiff_t dst_stride, const int16_t *x_filter, int x_step_q4,
    const int16_t *y_filter, int y_step_q4, int w, int h,
    const WienerConvolveParams *conv_params, int bd) {
  (void)x_step_q4;
  (void)y_step_q4;

  assert(w % 8 == 0);
  assert(w <= MAX_SB_SIZE && h <= MAX_SB_SIZE);
  assert(x_step_q4 == 16 && y_step_q4 == 16);
  assert(x_filter[7] == 0 && y_filter[7] == 0);

  DECLARE_ALIGNED(16, uint16_t,
                  im_block[(MAX_SB_SIZE + WIENER_WIN - 1) * MAX_SB_SIZE]);

  const int x_filter_taps = get_wiener_filter_taps(x_filter);
  const int y_filter_taps = get_wiener_filter_taps(y_filter);
  int16x4_t x_filter_s16 = vld1_s16(x_filter);
  int16x4_t y_filter_s16 = vld1_s16(y_filter);
  // Add 128 to tap 3. (Needed for rounding.)
  x_filter_s16 = vadd_s16(x_filter_s16, vcreate_s16(128ULL << 48));
  y_filter_s16 = vadd_s16(y_filter_s16, vcreate_s16(128ULL << 48));

  const int im_stride = MAX_SB_SIZE;
  const int im_h = h + y_filter_taps - 1;
  const int horiz_offset = x_filter_taps / 2;
  const int vert_offset = (y_filter_taps / 2) * (int)src_stride;

  const int extraprec_clamp_limit =
      WIENER_CLAMP_LIMIT(conv_params->round_0, bd);
  const uint16x8_t im_max_val = vdupq_n_u16(extraprec_clamp_limit - 1);
  const int32x4_t horiz_round_vec = vdupq_n_s32(1 << (bd + FILTER_BITS - 1));

  const uint16x8_t res_max_val = vdupq_n_u16((1 << bd) - 1);
  const int32x4_t vert_round_vec =
      vdupq_n_s32(-(1 << (bd + conv_params->round_1 - 1)));

  uint16_t *src = CONVERT_TO_SHORTPTR(src8);
  uint16_t *dst = CONVERT_TO_SHORTPTR(dst8);

  if (bd == 12) {
    if (x_filter_taps == WIENER_WIN_REDUCED) {
      highbd_12_convolve_add_src_5tap_horiz(
          src - horiz_offset - vert_offset, src_stride, im_block, im_stride, w,
          im_h, x_filter_s16, horiz_round_vec, im_max_val);
    } else {
      highbd_12_convolve_add_src_7tap_horiz(
          src - horiz_offset - vert_offset, src_stride, im_block, im_stride, w,
          im_h, x_filter_s16, horiz_round_vec, im_max_val);
    }

    if (y_filter_taps == WIENER_WIN_REDUCED) {
      highbd_12_convolve_add_src_5tap_vert(im_block, im_stride, dst, dst_stride,
                                           w, h, y_filter_s16, vert_round_vec,
                                           res_max_val);
    } else {
      highbd_12_convolve_add_src_7tap_vert(im_block, im_stride, dst, dst_stride,
                                           w, h, y_filter_s16, vert_round_vec,
                                           res_max_val);
    }

  } else {
    if (x_filter_taps == WIENER_WIN_REDUCED) {
      highbd_convolve_add_src_5tap_horiz(
          src - horiz_offset - vert_offset, src_stride, im_block, im_stride, w,
          im_h, x_filter_s16, horiz_round_vec, im_max_val);
    } else {
      highbd_convolve_add_src_7tap_horiz(
          src - horiz_offset - vert_offset, src_stride, im_block, im_stride, w,
          im_h, x_filter_s16, horiz_round_vec, im_max_val);
    }

    if (y_filter_taps == WIENER_WIN_REDUCED) {
      highbd_convolve_add_src_5tap_vert(im_block, im_stride, dst, dst_stride, w,
                                        h, y_filter_s16, vert_round_vec,
                                        res_max_val);
    } else {
      highbd_convolve_add_src_7tap_vert(im_block, im_stride, dst, dst_stride, w,
                                        h, y_filter_s16, vert_round_vec,
                                        res_max_val);
    }
  }
}
