/*
 * 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 <assert.h>
#include <emmintrin.h>  // SSE2
#include <smmintrin.h>  /* SSE4.1 */

#include "aom/aom_integer.h"
#include "av1/common/av1_common_int.h"
#include "av1/common/txb_common.h"
#include "aom_dsp/x86/synonyms.h"

#if CONFIG_FORWARDSKIP
static INLINE void _xx_fill_buffer(__m128i *buff, __m128i *end, __m128i zeros) {
  do {
    _mm_storeu_si128(buff, zeros);
    buff++;
  } while (buff < end);
}

void av1_txb_init_levels_skip_sse4_1(const tran_low_t *const coeff,
                                     const int width, const int height,
                                     uint8_t *const levels) {
  const int stride = width + TX_PAD_LEFT;
  const __m128i zeros = _mm_setzero_si128();

  const int32_t bottom_len = sizeof(*levels) * (TX_PAD_BOTTOM * stride);
  uint8_t *bottom_buf = levels + stride * height;
  uint8_t *bottom_buf_end = bottom_buf + bottom_len;

  do {
    _mm_storeu_si128((__m128i *)(bottom_buf), zeros);
    bottom_buf += 16;
  } while (bottom_buf < bottom_buf_end);

  const int32_t top_len = sizeof(*levels) * (TX_PAD_TOP * stride);
  uint8_t *top_buf = levels;
  uint8_t *top_buf_end = top_buf + top_len;
  do {
    _mm_storeu_si128((__m128i *)(top_buf), zeros);
    top_buf += 16;
  } while (top_buf < top_buf_end);

  int i = 0;
  uint8_t *ls = levels;
  const tran_low_t *cf = coeff;
  ls += TX_PAD_TOP * stride;
  if (width == 4) {
    do {
      const __m128i coeffA = xx_loadu_128(cf);
      const __m128i coeffB = xx_loadu_128(cf + 4);
      const __m128i coeffZA = _mm_packs_epi32(zeros, coeffA);
      const __m128i absZA = _mm_abs_epi16(coeffZA);
      const __m128i coeffZB = _mm_packs_epi32(zeros, coeffB);
      const __m128i absZB = _mm_abs_epi16(coeffZB);
      const __m128i coeffAB = _mm_packs_epi16(absZA, absZB);
      xx_storeu_128(ls, coeffAB);
      ls += ((stride) << 1);
      cf += (width << 1);
      i += 2;
    } while (i < height);
  } else if (width == 8) {
    do {
      xx_storeu_128(ls, zeros);
      ls += TX_PAD_LEFT;
      const __m128i coeffA = xx_loadu_128(cf);
      const __m128i coeffB = xx_loadu_128(cf + 4);
      const __m128i coeffAB = _mm_packs_epi32(coeffA, coeffB);
      const __m128i absAB = _mm_abs_epi16(coeffAB);
      const __m128i absAB8 = _mm_packs_epi16(absAB, zeros);
      xx_storeu_128(ls, absAB8);
      ls += stride - TX_PAD_LEFT;
      cf += width;
      i += 1;
    } while (i < height);
  } else {
    do {
      xx_storeu_128(ls, zeros);
      ls += TX_PAD_LEFT;
      int j = 0;
      do {
        const __m128i coeffA = xx_loadu_128(cf);
        const __m128i coeffB = xx_loadu_128(cf + 4);
        const __m128i coeffC = xx_loadu_128(cf + 8);
        const __m128i coeffD = xx_loadu_128(cf + 12);
        const __m128i coeffAB = _mm_packs_epi32(coeffA, coeffB);
        const __m128i coeffCD = _mm_packs_epi32(coeffC, coeffD);
        const __m128i absAB = _mm_abs_epi16(coeffAB);
        const __m128i absCD = _mm_abs_epi16(coeffCD);
        const __m128i absABCD = _mm_packs_epi16(absAB, absCD);
        xx_storeu_128(ls + j, absABCD);
        j += 16;
        cf += 16;
      } while (j < width);
      *(int32_t *)(ls + width) = 0;
      ls += stride - TX_PAD_LEFT;
      i += 1;
    } while (i < height);
  }
}

void av1_txb_init_levels_signs_sse4_1(const tran_low_t *const coeff,
                                      const int width, const int height,
                                      uint8_t *const levels,
                                      int8_t *const signs) {
  const int stride = width + TX_PAD_HOR;
  const __m128i zeros = _mm_setzero_si128();
  const __m128i one16 = _mm_set1_epi16(1);

  uint8_t *lvl_top_buf = levels;
  uint8_t *lvl_top_buf_end =
      lvl_top_buf + sizeof(*levels) * (TX_PAD_TOP * stride);
  _xx_fill_buffer((__m128i *)lvl_top_buf, (__m128i *)lvl_top_buf_end, zeros);

  int8_t *si_bot_buf =
      signs + stride * height + sizeof(*signs) * (TX_PAD_TOP * stride);
  int8_t *si_bot_buf_end =
      si_bot_buf + sizeof(*signs) * (TX_PAD_BOTTOM * stride);
  _xx_fill_buffer((__m128i *)si_bot_buf, (__m128i *)si_bot_buf_end, zeros);

  int i = 0;
  int8_t *si = signs;
  uint8_t *ls = levels;
  const tran_low_t *cf = coeff;

  ls += TX_PAD_TOP * stride;
  si += TX_PAD_TOP * stride;

  if (width == 4) {
    do {
      const __m128i coeffA = xx_loadu_128(cf);
      const __m128i coeffB = xx_loadu_128(cf + 4);
      const __m128i absZA = _mm_abs_epi16(_mm_packs_epi32(zeros, coeffA));
      const __m128i absZB = _mm_abs_epi16(_mm_packs_epi32(zeros, coeffB));
      const __m128i coeffAB = _mm_packs_epi16(absZA, absZB);
      const __m128i signZA =
          _mm_sign_epi16(one16, _mm_packs_epi32(coeffA, zeros));
      const __m128i signZB =
          _mm_sign_epi16(one16, _mm_packs_epi32(coeffB, zeros));
      const __m128i signAB = _mm_packs_epi16(signZA, signZB);
      xx_storeu_128(ls, coeffAB);
      xx_storeu_128(si, signAB);
      ls += ((stride) << 1);
      si += ((stride) << 1);
      cf += (width << 1);
      i += 2;
    } while (i < height);
  } else if (width == 8) {
    do {
      const __m128i coeffA = xx_loadu_128(cf);
      const __m128i coeffB = xx_loadu_128(cf + 4);
      const __m128i coeffAB = _mm_packs_epi32(coeffA, coeffB);
      const __m128i absAB = _mm_abs_epi16(coeffAB);
      const __m128i absAB8 = _mm_packs_epi16(absAB, zeros);
      const __m128i signAB = _mm_sign_epi16(one16, coeffAB);
      const __m128i signAB8 = _mm_packs_epi16(signAB, zeros);
      xx_storeu_128(ls, zeros);
      xx_storeu_128(ls + TX_PAD_LEFT, absAB8);
      xx_storeu_128(si, signAB8);
      xx_storeu_128(si + stride, zeros);
      si += stride;
      ls += stride;
      cf += width;
      i += 1;
    } while (i < height);
  } else {
    do {
      xx_storeu_128(ls, zeros);
      ls += TX_PAD_LEFT;
      int j = 0;
      do {
        const __m128i coeffA = xx_loadu_128(cf);
        const __m128i coeffB = xx_loadu_128(cf + 4);
        const __m128i coeffC = xx_loadu_128(cf + 8);
        const __m128i coeffD = xx_loadu_128(cf + 12);
        const __m128i coeffAB = _mm_packs_epi32(coeffA, coeffB);
        const __m128i coeffCD = _mm_packs_epi32(coeffC, coeffD);
        const __m128i absAB = _mm_abs_epi16(coeffAB);
        const __m128i absCD = _mm_abs_epi16(coeffCD);
        const __m128i absABCD = _mm_packs_epi16(absAB, absCD);
        const __m128i signAB = _mm_sign_epi16(one16, coeffAB);
        const __m128i signCD = _mm_sign_epi16(one16, coeffCD);
        const __m128i signABCD = _mm_packs_epi16(signAB, signCD);
        xx_storeu_128(ls + j, absABCD);
        xx_storeu_128(si + j, signABCD);
        j += 16;
        cf += 16;
      } while (j < width);
      xx_storeu_128(si + width, zeros);
      *(int32_t *)(ls + width) = 0;
      ls += stride - TX_PAD_LEFT;
      si += stride;
      i += 1;
    } while (i < height);
  }
}
#endif  // CONFIG_FORWARDSKIP

void av1_txb_init_levels_sse4_1(const tran_low_t *const coeff, const int width,
                                const int height, uint8_t *const levels) {
  const int stride = width + TX_PAD_HOR;
  const __m128i zeros = _mm_setzero_si128();

  const int32_t bottom_len = sizeof(*levels) * (TX_PAD_BOTTOM * stride);
  uint8_t *bottom_buf = levels + stride * height;
  uint8_t *bottom_buf_end = bottom_buf + bottom_len;
  do {
    _mm_storeu_si128((__m128i *)(bottom_buf), zeros);
    bottom_buf += 16;
  } while (bottom_buf < bottom_buf_end);

  int i = 0;
  uint8_t *ls = levels;
  const tran_low_t *cf = coeff;
  if (width == 4) {
    do {
      const __m128i coeffA = xx_loadu_128(cf);
      const __m128i coeffB = xx_loadu_128(cf + 4);
      const __m128i coeffAB = _mm_packs_epi32(coeffA, coeffB);
      const __m128i absAB = _mm_abs_epi16(coeffAB);
      const __m128i absAB8 = _mm_packs_epi16(absAB, zeros);
      const __m128i lsAB = _mm_unpacklo_epi32(absAB8, zeros);
      xx_storeu_128(ls, lsAB);
      ls += (stride << 1);
      cf += (width << 1);
      i += 2;
    } while (i < height);
  } else if (width == 8) {
    do {
      const __m128i coeffA = xx_loadu_128(cf);
      const __m128i coeffB = xx_loadu_128(cf + 4);
      const __m128i coeffAB = _mm_packs_epi32(coeffA, coeffB);
      const __m128i absAB = _mm_abs_epi16(coeffAB);
      const __m128i absAB8 = _mm_packs_epi16(absAB, zeros);
      xx_storeu_128(ls, absAB8);
      ls += stride;
      cf += width;
      i += 1;
    } while (i < height);
  } else {
    do {
      int j = 0;
      do {
        const __m128i coeffA = xx_loadu_128(cf);
        const __m128i coeffB = xx_loadu_128(cf + 4);
        const __m128i coeffC = xx_loadu_128(cf + 8);
        const __m128i coeffD = xx_loadu_128(cf + 12);
        const __m128i coeffAB = _mm_packs_epi32(coeffA, coeffB);
        const __m128i coeffCD = _mm_packs_epi32(coeffC, coeffD);
        const __m128i absAB = _mm_abs_epi16(coeffAB);
        const __m128i absCD = _mm_abs_epi16(coeffCD);
        const __m128i absABCD = _mm_packs_epi16(absAB, absCD);
        xx_storeu_128(ls + j, absABCD);
        j += 16;
        cf += 16;
      } while (j < width);
      *(int32_t *)(ls + width) = 0;
      ls += stride;
      i += 1;
    } while (i < height);
  }
}
