/*
 * 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 "aom_dsp/arm/aom_neon_sve_bridge.h"
#include "aom_dsp/arm/mem_neon.h"
#include "config/aom_dsp_rtcd.h"

static INLINE uint64_t aom_sum_squares_2d_i16_4xh_sve(const int16_t *src,
                                                      int stride, int height) {
  int64x2_t sum_squares = vdupq_n_s64(0);

  do {
    int16x8_t s = vcombine_s16(vld1_s16(src), vld1_s16(src + stride));

    sum_squares = aom_sdotq_s16(sum_squares, s, s);

    src += 2 * stride;
    height -= 2;
  } while (height != 0);

  return (uint64_t)vaddvq_s64(sum_squares);
}

static INLINE uint64_t aom_sum_squares_2d_i16_8xh_sve(const int16_t *src,
                                                      int stride, int height) {
  int64x2_t sum_squares[2] = { vdupq_n_s64(0), vdupq_n_s64(0) };

  do {
    int16x8_t s0 = vld1q_s16(src + 0 * stride);
    int16x8_t s1 = vld1q_s16(src + 1 * stride);

    sum_squares[0] = aom_sdotq_s16(sum_squares[0], s0, s0);
    sum_squares[1] = aom_sdotq_s16(sum_squares[1], s1, s1);

    src += 2 * stride;
    height -= 2;
  } while (height != 0);

  sum_squares[0] = vaddq_s64(sum_squares[0], sum_squares[1]);
  return (uint64_t)vaddvq_s64(sum_squares[0]);
}

static INLINE uint64_t aom_sum_squares_2d_i16_large_sve(const int16_t *src,
                                                        int stride, int width,
                                                        int height) {
  int64x2_t sum_squares[2] = { vdupq_n_s64(0), vdupq_n_s64(0) };

  do {
    const int16_t *src_ptr = src;
    int w = width;
    do {
      int16x8_t s0 = vld1q_s16(src_ptr);
      int16x8_t s1 = vld1q_s16(src_ptr + 8);

      sum_squares[0] = aom_sdotq_s16(sum_squares[0], s0, s0);
      sum_squares[1] = aom_sdotq_s16(sum_squares[1], s1, s1);

      src_ptr += 16;
      w -= 16;
    } while (w != 0);

    src += stride;
  } while (--height != 0);

  sum_squares[0] = vaddq_s64(sum_squares[0], sum_squares[1]);
  return (uint64_t)vaddvq_s64(sum_squares[0]);
}

static INLINE uint64_t aom_sum_squares_2d_i16_wxh_sve(const int16_t *src,
                                                      int stride, int width,
                                                      int height) {
  svint64_t sum_squares = svdup_n_s64(0);
  uint64_t step = svcnth();

  do {
    const int16_t *src_ptr = src;
    int w = 0;
    do {
      svbool_t pred = svwhilelt_b16_u32(w, width);
      svint16_t s0 = svld1_s16(pred, src_ptr);

      sum_squares = svdot_s64(sum_squares, s0, s0);

      src_ptr += step;
      w += step;
    } while (w < width);

    src += stride;
  } while (--height != 0);

  return (uint64_t)svaddv_s64(svptrue_b64(), sum_squares);
}

uint64_t aom_sum_squares_2d_i16_sve(const int16_t *src, int stride, int width,
                                    int height) {
  if (width == 4) {
    return aom_sum_squares_2d_i16_4xh_sve(src, stride, height);
  }
  if (width == 8) {
    return aom_sum_squares_2d_i16_8xh_sve(src, stride, height);
  }
  if (width % 16 == 0) {
    return aom_sum_squares_2d_i16_large_sve(src, stride, width, height);
  }
  return aom_sum_squares_2d_i16_wxh_sve(src, stride, width, height);
}

uint64_t aom_sum_squares_i16_sve(const int16_t *src, uint32_t n) {
  // This function seems to be called only for values of N >= 64. See
  // av1/encoder/compound_type.c. Additionally, because N = width x height for
  // width and height between the standard block sizes, N will also be a
  // multiple of 64.
  if (LIKELY(n % 64 == 0)) {
    int64x2_t sum[4] = { vdupq_n_s64(0), vdupq_n_s64(0), vdupq_n_s64(0),
                         vdupq_n_s64(0) };

    do {
      int16x8_t s0 = vld1q_s16(src);
      int16x8_t s1 = vld1q_s16(src + 8);
      int16x8_t s2 = vld1q_s16(src + 16);
      int16x8_t s3 = vld1q_s16(src + 24);

      sum[0] = aom_sdotq_s16(sum[0], s0, s0);
      sum[1] = aom_sdotq_s16(sum[1], s1, s1);
      sum[2] = aom_sdotq_s16(sum[2], s2, s2);
      sum[3] = aom_sdotq_s16(sum[3], s3, s3);

      src += 32;
      n -= 32;
    } while (n != 0);

    sum[0] = vaddq_s64(sum[0], sum[1]);
    sum[2] = vaddq_s64(sum[2], sum[3]);
    sum[0] = vaddq_s64(sum[0], sum[2]);
    return vaddvq_s64(sum[0]);
  }
  return aom_sum_squares_i16_c(src, n);
}

static INLINE uint64_t aom_sum_sse_2d_i16_4xh_sve(const int16_t *src,
                                                  int stride, int height,
                                                  int *sum) {
  int64x2_t sse = vdupq_n_s64(0);
  int32x4_t sum_s32 = vdupq_n_s32(0);

  do {
    int16x8_t s = vcombine_s16(vld1_s16(src), vld1_s16(src + stride));

    sse = aom_sdotq_s16(sse, s, s);

    sum_s32 = vpadalq_s16(sum_s32, s);

    src += 2 * stride;
    height -= 2;
  } while (height != 0);

  *sum += vaddvq_s32(sum_s32);
  return vaddvq_s64(sse);
}

static INLINE uint64_t aom_sum_sse_2d_i16_8xh_sve(const int16_t *src,
                                                  int stride, int height,
                                                  int *sum) {
  int64x2_t sse[2] = { vdupq_n_s64(0), vdupq_n_s64(0) };
  int32x4_t sum_acc[2] = { vdupq_n_s32(0), vdupq_n_s32(0) };

  do {
    int16x8_t s0 = vld1q_s16(src);
    int16x8_t s1 = vld1q_s16(src + stride);

    sse[0] = aom_sdotq_s16(sse[0], s0, s0);
    sse[1] = aom_sdotq_s16(sse[1], s1, s1);

    sum_acc[0] = vpadalq_s16(sum_acc[0], s0);
    sum_acc[1] = vpadalq_s16(sum_acc[1], s1);

    src += 2 * stride;
    height -= 2;
  } while (height != 0);

  *sum += vaddvq_s32(vaddq_s32(sum_acc[0], sum_acc[1]));
  return vaddvq_s64(vaddq_s64(sse[0], sse[1]));
}

static INLINE uint64_t aom_sum_sse_2d_i16_16xh_sve(const int16_t *src,
                                                   int stride, int width,
                                                   int height, int *sum) {
  int64x2_t sse[2] = { vdupq_n_s64(0), vdupq_n_s64(0) };
  int32x4_t sum_acc[2] = { vdupq_n_s32(0), vdupq_n_s32(0) };

  do {
    int w = 0;
    do {
      int16x8_t s0 = vld1q_s16(src + w);
      int16x8_t s1 = vld1q_s16(src + w + 8);

      sse[0] = aom_sdotq_s16(sse[0], s0, s0);
      sse[1] = aom_sdotq_s16(sse[1], s1, s1);

      sum_acc[0] = vpadalq_s16(sum_acc[0], s0);
      sum_acc[1] = vpadalq_s16(sum_acc[1], s1);

      w += 16;
    } while (w < width);

    src += stride;
  } while (--height != 0);

  *sum += vaddvq_s32(vaddq_s32(sum_acc[0], sum_acc[1]));
  return vaddvq_s64(vaddq_s64(sse[0], sse[1]));
}

uint64_t aom_sum_sse_2d_i16_sve(const int16_t *src, int stride, int width,
                                int height, int *sum) {
  uint64_t sse;

  if (width == 4) {
    sse = aom_sum_sse_2d_i16_4xh_sve(src, stride, height, sum);
  } else if (width == 8) {
    sse = aom_sum_sse_2d_i16_8xh_sve(src, stride, height, sum);
  } else if (width % 16 == 0) {
    sse = aom_sum_sse_2d_i16_16xh_sve(src, stride, width, height, sum);
  } else {
    sse = aom_sum_sse_2d_i16_c(src, stride, width, height, sum);
  }

  return sse;
}

static INLINE uint64_t aom_var_2d_u16_4xh_sve(uint8_t *src, int src_stride,
                                              int width, int height) {
  uint16_t *src_u16 = CONVERT_TO_SHORTPTR(src);
  uint64_t sum = 0;
  uint64_t sse = 0;
  uint32x4_t sum_u32 = vdupq_n_u32(0);
  uint64x2_t sse_u64 = vdupq_n_u64(0);

  int h = height;
  do {
    uint16x8_t s0 =
        vcombine_u16(vld1_u16(src_u16), vld1_u16(src_u16 + src_stride));

    sum_u32 = vpadalq_u16(sum_u32, s0);

    sse_u64 = aom_udotq_u16(sse_u64, s0, s0);

    src_u16 += 2 * src_stride;
    h -= 2;
  } while (h != 0);

  sum += vaddlvq_u32(sum_u32);
  sse += vaddvq_u64(sse_u64);

  return sse - sum * sum / (width * height);
}

static INLINE uint64_t aom_var_2d_u16_8xh_sve(uint8_t *src, int src_stride,
                                              int width, int height) {
  uint16_t *src_u16 = CONVERT_TO_SHORTPTR(src);
  uint64_t sum = 0;
  uint64_t sse = 0;
  uint32x4_t sum_u32 = vdupq_n_u32(0);
  uint64x2_t sse_u64 = vdupq_n_u64(0);

  int h = height;
  do {
    int w = width;
    uint16_t *src_ptr = src_u16;
    do {
      uint16x8_t s0 = vld1q_u16(src_ptr);

      sum_u32 = vpadalq_u16(sum_u32, s0);

      sse_u64 = aom_udotq_u16(sse_u64, s0, s0);

      src_ptr += 8;
      w -= 8;
    } while (w != 0);

    src_u16 += src_stride;
  } while (--h != 0);

  sum += vaddlvq_u32(sum_u32);
  sse += vaddvq_u64(sse_u64);

  return sse - sum * sum / (width * height);
}

static INLINE uint64_t aom_var_2d_u16_16xh_sve(uint8_t *src, int src_stride,
                                               int width, int height) {
  uint16_t *src_u16 = CONVERT_TO_SHORTPTR(src);
  uint64_t sum = 0;
  uint64_t sse = 0;
  uint32x4_t sum_u32[2] = { vdupq_n_u32(0), vdupq_n_u32(0) };
  uint64x2_t sse_u64[2] = { vdupq_n_u64(0), vdupq_n_u64(0) };

  int h = height;
  do {
    int w = width;
    uint16_t *src_ptr = src_u16;
    do {
      uint16x8_t s0 = vld1q_u16(src_ptr);
      uint16x8_t s1 = vld1q_u16(src_ptr + 8);

      sum_u32[0] = vpadalq_u16(sum_u32[0], s0);
      sum_u32[1] = vpadalq_u16(sum_u32[1], s1);

      sse_u64[0] = aom_udotq_u16(sse_u64[0], s0, s0);
      sse_u64[1] = aom_udotq_u16(sse_u64[1], s1, s1);

      src_ptr += 16;
      w -= 16;
    } while (w != 0);

    src_u16 += src_stride;
  } while (--h != 0);

  sum_u32[0] = vaddq_u32(sum_u32[0], sum_u32[1]);
  sse_u64[0] = vaddq_u64(sse_u64[0], sse_u64[1]);

  sum += vaddlvq_u32(sum_u32[0]);
  sse += vaddvq_u64(sse_u64[0]);

  return sse - sum * sum / (width * height);
}

static INLINE uint64_t aom_var_2d_u16_large_sve(uint8_t *src, int src_stride,
                                                int width, int height) {
  uint16_t *src_u16 = CONVERT_TO_SHORTPTR(src);
  uint64_t sum = 0;
  uint64_t sse = 0;
  uint32x4_t sum_u32[4] = { vdupq_n_u32(0), vdupq_n_u32(0), vdupq_n_u32(0),
                            vdupq_n_u32(0) };
  uint64x2_t sse_u64[4] = { vdupq_n_u64(0), vdupq_n_u64(0), vdupq_n_u64(0),
                            vdupq_n_u64(0) };

  int h = height;
  do {
    int w = width;
    uint16_t *src_ptr = src_u16;
    do {
      uint16x8_t s0 = vld1q_u16(src_ptr);
      uint16x8_t s1 = vld1q_u16(src_ptr + 8);
      uint16x8_t s2 = vld1q_u16(src_ptr + 16);
      uint16x8_t s3 = vld1q_u16(src_ptr + 24);

      sum_u32[0] = vpadalq_u16(sum_u32[0], s0);
      sum_u32[1] = vpadalq_u16(sum_u32[1], s1);
      sum_u32[2] = vpadalq_u16(sum_u32[2], s2);
      sum_u32[3] = vpadalq_u16(sum_u32[3], s3);

      sse_u64[0] = aom_udotq_u16(sse_u64[0], s0, s0);
      sse_u64[1] = aom_udotq_u16(sse_u64[1], s1, s1);
      sse_u64[2] = aom_udotq_u16(sse_u64[2], s2, s2);
      sse_u64[3] = aom_udotq_u16(sse_u64[3], s3, s3);

      src_ptr += 32;
      w -= 32;
    } while (w != 0);

    src_u16 += src_stride;
  } while (--h != 0);

  sum_u32[0] = vaddq_u32(sum_u32[0], sum_u32[1]);
  sum_u32[2] = vaddq_u32(sum_u32[2], sum_u32[3]);
  sum_u32[0] = vaddq_u32(sum_u32[0], sum_u32[2]);
  sse_u64[0] = vaddq_u64(sse_u64[0], sse_u64[1]);
  sse_u64[2] = vaddq_u64(sse_u64[2], sse_u64[3]);
  sse_u64[0] = vaddq_u64(sse_u64[0], sse_u64[2]);

  sum += vaddlvq_u32(sum_u32[0]);
  sse += vaddvq_u64(sse_u64[0]);

  return sse - sum * sum / (width * height);
}

uint64_t aom_var_2d_u16_sve(uint8_t *src, int src_stride, int width,
                            int height) {
  if (width == 4) {
    return aom_var_2d_u16_4xh_sve(src, src_stride, width, height);
  }
  if (width == 8) {
    return aom_var_2d_u16_8xh_sve(src, src_stride, width, height);
  }
  if (width == 16) {
    return aom_var_2d_u16_16xh_sve(src, src_stride, width, height);
  }
  if (width % 32 == 0) {
    return aom_var_2d_u16_large_sve(src, src_stride, width, height);
  }
  return aom_var_2d_u16_neon(src, src_stride, width, height);
}
