/*
 * Copyright (c) 2018, 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.
 */

#ifndef AOM_AV1_ENCODER_X86_AV1_FWD_TXFM_AVX2_H_
#define AOM_AV1_ENCODER_X86_AV1_FWD_TXFM_AVX2_H_
#include <immintrin.h>

// out0 = in0*w0 + in1*w1
// out1 = -in1*w0 + in0*w1
static INLINE void btf_32_avx2_type0(const int32_t w0, const int32_t w1,
                                     __m256i *in0, __m256i *in1,
                                     const __m256i _r, const int32_t cos_bit) {
  __m256i _in0 = *in0;
  __m256i _in1 = *in1;
  const __m256i ww0 = _mm256_set1_epi32(w0);
  const __m256i ww1 = _mm256_set1_epi32(w1);
  const __m256i in0_w0 = _mm256_mullo_epi32(_in0, ww0);
  const __m256i in1_w1 = _mm256_mullo_epi32(_in1, ww1);
  __m256i temp0 = _mm256_add_epi32(in0_w0, in1_w1);
  temp0 = _mm256_add_epi32(temp0, _r);
  *in0 = _mm256_srai_epi32(temp0, cos_bit);
  const __m256i in0_w1 = _mm256_mullo_epi32(_in0, ww1);
  const __m256i in1_w0 = _mm256_mullo_epi32(_in1, ww0);
  __m256i temp1 = _mm256_sub_epi32(in0_w1, in1_w0);
  temp1 = _mm256_add_epi32(temp1, _r);
  *in1 = _mm256_srai_epi32(temp1, cos_bit);
}

static INLINE void btf_32_avx2_type1(const int32_t w0, const int32_t w1,
                                     __m256i *in0, __m256i *in1,
                                     const __m256i _r, const int32_t cos_bit) {
  __m256i _in0 = *in0;
  __m256i _in1 = *in1;
  const __m256i ww0 = _mm256_set1_epi32(w0);
  const __m256i ww1 = _mm256_set1_epi32(w1);
  const __m256i in0_w0 = _mm256_mullo_epi32(_in0, ww0);
  const __m256i in1_w1 = _mm256_mullo_epi32(_in1, ww1);
  __m256i temp0 = _mm256_add_epi32(in0_w0, in1_w1);
  temp0 = _mm256_add_epi32(temp0, _r);
  *in0 = _mm256_srai_epi32(temp0, cos_bit);
  const __m256i in0_w1 = _mm256_mullo_epi32(_in0, ww1);
  const __m256i in1_w0 = _mm256_mullo_epi32(_in1, ww0);
  __m256i temp1 = _mm256_sub_epi32(in1_w0, in0_w1);
  temp1 = _mm256_add_epi32(temp1, _r);
  *in1 = _mm256_srai_epi32(temp1, cos_bit);
}

// out0 = in0*w0 + in1*w1
// out1 = -in1*w0 + in0*w1
static INLINE void btf_32_avx2_type0_new(const __m256i ww0, const __m256i ww1,
                                         __m256i *in0, __m256i *in1,
                                         const __m256i _r,
                                         const int32_t cos_bit) {
  __m256i _in0 = *in0;
  __m256i _in1 = *in1;
  const __m256i in0_w0 = _mm256_mullo_epi32(_in0, ww0);
  const __m256i in1_w1 = _mm256_mullo_epi32(_in1, ww1);
  __m256i temp0 = _mm256_add_epi32(in0_w0, in1_w1);
  temp0 = _mm256_add_epi32(temp0, _r);
  *in0 = _mm256_srai_epi32(temp0, cos_bit);
  const __m256i in0_w1 = _mm256_mullo_epi32(_in0, ww1);
  const __m256i in1_w0 = _mm256_mullo_epi32(_in1, ww0);
  __m256i temp1 = _mm256_sub_epi32(in0_w1, in1_w0);
  temp1 = _mm256_add_epi32(temp1, _r);
  *in1 = _mm256_srai_epi32(temp1, cos_bit);
}

// out0 = in0*w0 + in1*w1
// out1 = in1*w0 - in0*w1
static INLINE void btf_32_avx2_type1_new(const __m256i ww0, const __m256i ww1,
                                         __m256i *in0, __m256i *in1,
                                         const __m256i _r,
                                         const int32_t cos_bit) {
  __m256i _in0 = *in0;
  __m256i _in1 = *in1;
  const __m256i in0_w0 = _mm256_mullo_epi32(_in0, ww0);
  const __m256i in1_w1 = _mm256_mullo_epi32(_in1, ww1);
  __m256i temp0 = _mm256_add_epi32(in0_w0, in1_w1);
  temp0 = _mm256_add_epi32(temp0, _r);
  *in0 = _mm256_srai_epi32(temp0, cos_bit);
  const __m256i in0_w1 = _mm256_mullo_epi32(_in0, ww1);
  const __m256i in1_w0 = _mm256_mullo_epi32(_in1, ww0);
  __m256i temp1 = _mm256_sub_epi32(in1_w0, in0_w1);
  temp1 = _mm256_add_epi32(temp1, _r);
  *in1 = _mm256_srai_epi32(temp1, cos_bit);
}

#endif  // AOM_AV1_ENCODER_X86_AV1_FWD_TXFM_AVX2_H_
