/*
 * 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 <emmintrin.h>

#include "aom/aom_integer.h"
static INLINE void load_b_values(const int32_t *zbin_ptr, __m128i *zbin,
                                 const int32_t *round_ptr, __m128i *round,
                                 const int32_t *quant_ptr, __m128i *quant,
                                 const int32_t *dequant_ptr, __m128i *dequant,
                                 const int32_t *shift_ptr, __m128i *shift) {
  *zbin = _mm_loadu_si128((const __m128i *)zbin_ptr);
  *round = _mm_loadu_si128((const __m128i *)round_ptr);
  *quant = _mm_loadu_si128((const __m128i *)quant_ptr);
  *zbin = _mm_sub_epi16(*zbin, _mm_set1_epi16(1));
  *dequant = _mm_loadu_si128((const __m128i *)dequant_ptr);
  *shift = _mm_loadu_si128((const __m128i *)shift_ptr);
}

// With ssse3 and later abs() and sign() are preferred.
static INLINE __m128i invert_sign_sse2(__m128i a, __m128i sign) {
  a = _mm_xor_si128(a, sign);
  return _mm_sub_epi16(a, sign);
}

static INLINE __m128i invert_sign_32_sse2(__m128i a, __m128i sign) {
  a = _mm_xor_si128(a, sign);
  return _mm_sub_epi32(a, sign);
}

static INLINE void calculate_qcoeff(__m128i *coeff, const __m128i round,
                                    const __m128i quant, const __m128i shift) {
  __m128i tmp, qcoeff;
  qcoeff = _mm_adds_epi16(*coeff, round);
  tmp = _mm_mulhi_epi16(qcoeff, quant);
  qcoeff = _mm_add_epi16(tmp, qcoeff);
  *coeff = _mm_mulhi_epi16(qcoeff, shift);
}

static INLINE void calculate_qcoeff_log_scale(__m128i *coeff,
                                              const __m128i round,
                                              const __m128i quant,
                                              const __m128i *shift,
                                              const int *log_scale) {
  __m128i tmp, tmp1, qcoeff;
  qcoeff = _mm_adds_epi16(*coeff, round);
  tmp = _mm_mulhi_epi16(qcoeff, quant);
  qcoeff = _mm_add_epi16(tmp, qcoeff);
  tmp = _mm_mullo_epi16(qcoeff, *shift);
  tmp = _mm_srli_epi16(tmp, (16 - *log_scale));
  tmp1 = _mm_mulhi_epi16(qcoeff, *shift);
  tmp1 = _mm_slli_epi16(tmp1, *log_scale);
  *coeff = _mm_or_si128(tmp, tmp1);
}

static INLINE __m128i calculate_dqcoeff(__m128i qcoeff, __m128i dequant) {
  return _mm_mullo_epi16(qcoeff, dequant);
}

static INLINE void calculate_dqcoeff_and_store_log_scale(__m128i qcoeff,
                                                         __m128i dequant,
                                                         const __m128i zero,
                                                         tran_low_t *dqcoeff,
                                                         const int *log_scale) {
  // calculate abs
  __m128i coeff_sign = _mm_srai_epi16(qcoeff, 15);
  __m128i coeff = invert_sign_sse2(qcoeff, coeff_sign);

  const __m128i sign_0 = _mm_unpacklo_epi16(coeff_sign, zero);
  const __m128i sign_1 = _mm_unpackhi_epi16(coeff_sign, zero);

  const __m128i low = _mm_mullo_epi16(coeff, dequant);
  const __m128i high = _mm_mulhi_epi16(coeff, dequant);
  __m128i dqcoeff32_0 = _mm_unpacklo_epi16(low, high);
  __m128i dqcoeff32_1 = _mm_unpackhi_epi16(low, high);

  dqcoeff32_0 = _mm_srli_epi32(dqcoeff32_0, *log_scale);
  dqcoeff32_1 = _mm_srli_epi32(dqcoeff32_1, *log_scale);

  dqcoeff32_0 = invert_sign_32_sse2(dqcoeff32_0, sign_0);
  dqcoeff32_1 = invert_sign_32_sse2(dqcoeff32_1, sign_1);

  _mm_store_si128((__m128i *)(dqcoeff), dqcoeff32_0);
  _mm_store_si128((__m128i *)(dqcoeff + 4), dqcoeff32_1);
}

// Scan 16 values for eob reference in scan_ptr. Use masks (-1) from comparing
// to zbin to add 1 to the index in 'scan'.
static INLINE __m128i scan_for_eob(__m128i *coeff0, __m128i *coeff1,
                                   const __m128i zbin_mask0,
                                   const __m128i zbin_mask1,
                                   const int16_t *scan_ptr, const int index,
                                   const __m128i zero) {
  const __m128i zero_coeff0 = _mm_cmpeq_epi16(*coeff0, zero);
  const __m128i zero_coeff1 = _mm_cmpeq_epi16(*coeff1, zero);
  __m128i scan0 = _mm_loadu_si128((const __m128i *)(scan_ptr + index));
  __m128i scan1 = _mm_loadu_si128((const __m128i *)(scan_ptr + index + 8));
  __m128i eob0, eob1;
  // Add one to convert from indices to counts
  scan0 = _mm_sub_epi16(scan0, zbin_mask0);
  scan1 = _mm_sub_epi16(scan1, zbin_mask1);
  eob0 = _mm_andnot_si128(zero_coeff0, scan0);
  eob1 = _mm_andnot_si128(zero_coeff1, scan1);
  return _mm_max_epi16(eob0, eob1);
}

static INLINE int16_t accumulate_eob(__m128i eob) {
  __m128i eob_shuffled;
  eob_shuffled = _mm_shuffle_epi32(eob, 0xe);
  eob = _mm_max_epi16(eob, eob_shuffled);
  eob_shuffled = _mm_shufflelo_epi16(eob, 0xe);
  eob = _mm_max_epi16(eob, eob_shuffled);
  eob_shuffled = _mm_shufflelo_epi16(eob, 0x1);
  eob = _mm_max_epi16(eob, eob_shuffled);
  return _mm_extract_epi16(eob, 1);
}

static INLINE __m128i load_coefficients(const tran_low_t *coeff_ptr) {
  assert(sizeof(tran_low_t) == 4);
  const __m128i coeff1 = _mm_loadu_si128((__m128i *)(coeff_ptr));
  const __m128i coeff2 = _mm_loadu_si128((__m128i *)(coeff_ptr + 4));
  return _mm_packs_epi32(coeff1, coeff2);
}

static INLINE void store_coefficients(__m128i coeff_vals,
                                      tran_low_t *coeff_ptr) {
  assert(sizeof(tran_low_t) == 4);

  __m128i one = _mm_set1_epi16(1);
  __m128i coeff_vals_hi = _mm_mulhi_epi16(coeff_vals, one);
  __m128i coeff_vals_lo = _mm_mullo_epi16(coeff_vals, one);
  __m128i coeff_vals_1 = _mm_unpacklo_epi16(coeff_vals_lo, coeff_vals_hi);
  __m128i coeff_vals_2 = _mm_unpackhi_epi16(coeff_vals_lo, coeff_vals_hi);
  _mm_store_si128((__m128i *)(coeff_ptr), coeff_vals_1);
  _mm_store_si128((__m128i *)(coeff_ptr + 4), coeff_vals_2);
}

static INLINE void update_mask1(__m128i *cmp_mask0, __m128i *cmp_mask1,
                                const int16_t *iscan_ptr, int *is_found,
                                __m128i *mask) {
  __m128i all_zero;
  __m128i temp_mask = _mm_setzero_si128();
  all_zero = _mm_or_si128(*cmp_mask0, *cmp_mask1);
  if (_mm_movemask_epi8(all_zero)) {
    __m128i iscan0 = _mm_loadu_si128((const __m128i *)(iscan_ptr));
    __m128i mask0 = _mm_and_si128(*cmp_mask0, iscan0);
    __m128i iscan1 = _mm_loadu_si128((const __m128i *)(iscan_ptr + 8));
    __m128i mask1 = _mm_and_si128(*cmp_mask1, iscan1);
    temp_mask = _mm_max_epi16(mask0, mask1);
    *is_found = 1;
  }
  *mask = _mm_max_epi16(temp_mask, *mask);
}

static INLINE void update_mask0(__m128i *qcoeff0, __m128i *qcoeff1,
                                __m128i *threshold, const int16_t *iscan_ptr,
                                int *is_found, __m128i *mask) {
  __m128i zero = _mm_setzero_si128();
  __m128i coeff[4], cmp_mask0, cmp_mask1, cmp_mask2, cmp_mask3;

  coeff[0] = _mm_unpacklo_epi16(*qcoeff0, zero);
  coeff[1] = _mm_unpackhi_epi16(*qcoeff0, zero);
  coeff[2] = _mm_unpacklo_epi16(*qcoeff1, zero);
  coeff[3] = _mm_unpackhi_epi16(*qcoeff1, zero);

  coeff[0] = _mm_slli_epi32(coeff[0], AOM_QM_BITS);
  cmp_mask0 = _mm_cmpgt_epi32(coeff[0], threshold[0]);
  coeff[1] = _mm_slli_epi32(coeff[1], AOM_QM_BITS);
  cmp_mask1 = _mm_cmpgt_epi32(coeff[1], threshold[1]);
  coeff[2] = _mm_slli_epi32(coeff[2], AOM_QM_BITS);
  cmp_mask2 = _mm_cmpgt_epi32(coeff[2], threshold[1]);
  coeff[3] = _mm_slli_epi32(coeff[3], AOM_QM_BITS);
  cmp_mask3 = _mm_cmpgt_epi32(coeff[3], threshold[1]);

  cmp_mask0 = _mm_packs_epi32(cmp_mask0, cmp_mask1);
  cmp_mask1 = _mm_packs_epi32(cmp_mask2, cmp_mask3);

  update_mask1(&cmp_mask0, &cmp_mask1, iscan_ptr, is_found, mask);
}

static INLINE int calculate_non_zero_count(__m128i mask) {
  __m128i mask0, mask1;
  int non_zero_count = 0;
  mask0 = _mm_unpackhi_epi64(mask, mask);
  mask1 = _mm_max_epi16(mask0, mask);
  mask0 = _mm_shuffle_epi32(mask1, 1);
  mask0 = _mm_max_epi16(mask0, mask1);
  mask1 = _mm_srli_epi32(mask0, 16);
  mask0 = _mm_max_epi16(mask0, mask1);
  non_zero_count = _mm_extract_epi16(mask0, 0) + 1;

  return non_zero_count;
}
