/*
 * 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 "config/aom_config.h"
#include "config/av1_rtcd.h"

#include "aom_dsp/aom_dsp_common.h"
#include "aom_dsp/arm/aom_neon_sve_bridge.h"
#include "aom_dsp/arm/mem_neon.h"

int64_t av1_block_error_sve(const tran_low_t *coeff, const tran_low_t *dqcoeff,
                            intptr_t block_size, int64_t *ssz) {
  int64x2_t error[2] = { vdupq_n_s64(0), vdupq_n_s64(0) };
  int64x2_t sqcoeff[2] = { vdupq_n_s64(0), vdupq_n_s64(0) };

  assert(block_size >= 16);
  assert((block_size % 16) == 0);

  do {
    const int16x8_t c0 = load_tran_low_to_s16q(coeff);
    const int16x8_t c1 = load_tran_low_to_s16q(coeff + 8);
    const int16x8_t d0 = load_tran_low_to_s16q(dqcoeff);
    const int16x8_t d1 = load_tran_low_to_s16q(dqcoeff + 8);

    const int16x8_t diff0 = vsubq_s16(c0, d0);
    const int16x8_t diff1 = vsubq_s16(c1, d1);

    error[0] = aom_sdotq_s16(error[0], diff0, diff0);
    error[1] = aom_sdotq_s16(error[1], diff1, diff1);
    sqcoeff[0] = aom_sdotq_s16(sqcoeff[0], c0, c0);
    sqcoeff[1] = aom_sdotq_s16(sqcoeff[1], c1, c1);

    coeff += 16;
    dqcoeff += 16;
    block_size -= 16;
  } while (block_size != 0);

  *ssz = vaddvq_s64(vaddq_s64(sqcoeff[0], sqcoeff[1]));
  return vaddvq_s64(vaddq_s64(error[0], error[1]));
}

int64_t av1_block_error_lp_sve(const int16_t *coeff, const int16_t *dqcoeff,
                               intptr_t block_size) {
  if (block_size % 32 == 0) {
    int64x2_t error[4] = { vdupq_n_s64(0), vdupq_n_s64(0), vdupq_n_s64(0),
                           vdupq_n_s64(0) };

    do {
      const int16x8_t c0 = vld1q_s16(coeff);
      const int16x8_t c1 = vld1q_s16(coeff + 8);
      const int16x8_t c2 = vld1q_s16(coeff + 16);
      const int16x8_t c3 = vld1q_s16(coeff + 24);
      const int16x8_t d0 = vld1q_s16(dqcoeff);
      const int16x8_t d1 = vld1q_s16(dqcoeff + 8);
      const int16x8_t d2 = vld1q_s16(dqcoeff + 16);
      const int16x8_t d3 = vld1q_s16(dqcoeff + 24);

      const int16x8_t diff0 = vsubq_s16(c0, d0);
      const int16x8_t diff1 = vsubq_s16(c1, d1);
      const int16x8_t diff2 = vsubq_s16(c2, d2);
      const int16x8_t diff3 = vsubq_s16(c3, d3);

      error[0] = aom_sdotq_s16(error[0], diff0, diff0);
      error[1] = aom_sdotq_s16(error[1], diff1, diff1);
      error[2] = aom_sdotq_s16(error[2], diff2, diff2);
      error[3] = aom_sdotq_s16(error[3], diff3, diff3);

      coeff += 32;
      dqcoeff += 32;
      block_size -= 32;
    } while (block_size != 0);

    error[0] = vaddq_s64(error[0], error[1]);
    error[2] = vaddq_s64(error[2], error[3]);
    error[0] = vaddq_s64(error[0], error[2]);
    return vaddvq_s64(error[0]);
  }
  assert(block_size == 16);

  int64x2_t error[2] = { vdupq_n_s64(0), vdupq_n_s64(0) };

  do {
    const int16x8_t c0 = vld1q_s16(coeff);
    const int16x8_t c1 = vld1q_s16(coeff + 8);
    const int16x8_t d0 = vld1q_s16(dqcoeff);
    const int16x8_t d1 = vld1q_s16(dqcoeff + 8);

    const int16x8_t diff0 = vsubq_s16(c0, d0);
    const int16x8_t diff1 = vsubq_s16(c1, d1);

    error[0] = aom_sdotq_s16(error[0], diff0, diff0);
    error[1] = aom_sdotq_s16(error[1], diff1, diff1);

    coeff += 16;
    dqcoeff += 16;
    block_size -= 16;
  } while (block_size != 0);

  return vaddvq_s64(vaddq_s64(error[0], error[1]));
}
