/*
 * Copyright (c) 2016, 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 <tmmintrin.h>
#include <assert.h>

#include "config/aom_dsp_rtcd.h"

#include "aom_dsp/aom_convolve.h"
#include "aom_dsp/aom_dsp_common.h"
#include "aom_dsp/aom_filter.h"
#include "aom_dsp/x86/convolve_sse2.h"
#include "av1/common/convolve.h"

void av1_highbd_convolve_2d_sr_ssse3(const uint16_t *src, int src_stride,
                                     uint16_t *dst, int dst_stride, int w,
                                     int h, InterpFilterParams *filter_params_x,
                                     InterpFilterParams *filter_params_y,
                                     const int subpel_x_q4,
                                     const int subpel_y_q4,
                                     ConvolveParams *conv_params, int bd) {
  DECLARE_ALIGNED(32, int16_t, im_block[(MAX_SB_SIZE + MAX_FILTER_TAP) * 8]);
  int im_h = h + filter_params_y->taps - 1;
  int im_stride = 8;
  int i, j;
  const int fo_vert = filter_params_y->taps / 2 - 1;
  const int fo_horiz = filter_params_x->taps / 2 - 1;
  const uint16_t *const src_ptr = src - fo_vert * src_stride - fo_horiz;

  // Check that, even with 12-bit input, the intermediate values will fit
  // into an unsigned 16-bit intermediate array.
  assert(bd + FILTER_BITS + 2 - conv_params->round_0 <= 16);
  __m128i coeffs_x[4], coeffs_y[4], s[16];

  const __m128i round_const_x = _mm_set1_epi32(
      ((1 << conv_params->round_0) >> 1) + (1 << (bd + FILTER_BITS - 1)));
  const __m128i round_shift_x = _mm_cvtsi32_si128(conv_params->round_0);

  const __m128i round_const_y =
      _mm_set1_epi32(((1 << conv_params->round_1) >> 1) -
                     (1 << (bd + 2 * FILTER_BITS - conv_params->round_0 - 1)));
  const __m128i round_shift_y = _mm_cvtsi32_si128(conv_params->round_1);

  const int bits =
      FILTER_BITS * 2 - conv_params->round_0 - conv_params->round_1;
  const __m128i round_shift_bits = _mm_cvtsi32_si128(bits);
  const __m128i round_const_bits = _mm_set1_epi32((1 << bits) >> 1);
  const __m128i clip_pixel =
      _mm_set1_epi16(bd == 10 ? 1023 : (bd == 12 ? 4095 : 255));
  const __m128i zero = _mm_setzero_si128();

  prepare_coeffs(filter_params_x, subpel_x_q4, coeffs_x);
  prepare_coeffs(filter_params_y, subpel_y_q4, coeffs_y);

  for (j = 0; j < w; j += 8) {
    /* Horizontal filter */
    {
      for (i = 0; i < im_h; i += 1) {
        const __m128i row00 =
            _mm_loadu_si128((__m128i *)&src_ptr[i * src_stride + j]);
        const __m128i row01 =
            _mm_loadu_si128((__m128i *)&src_ptr[i * src_stride + (j + 8)]);

        // even pixels
        s[0] = _mm_alignr_epi8(row01, row00, 0);
        s[1] = _mm_alignr_epi8(row01, row00, 4);
        s[2] = _mm_alignr_epi8(row01, row00, 8);
        s[3] = _mm_alignr_epi8(row01, row00, 12);

        __m128i res_even = convolve(s, coeffs_x);
        res_even = _mm_sra_epi32(_mm_add_epi32(res_even, round_const_x),
                                 round_shift_x);

        // odd pixels
        s[0] = _mm_alignr_epi8(row01, row00, 2);
        s[1] = _mm_alignr_epi8(row01, row00, 6);
        s[2] = _mm_alignr_epi8(row01, row00, 10);
        s[3] = _mm_alignr_epi8(row01, row00, 14);

        __m128i res_odd = convolve(s, coeffs_x);
        res_odd =
            _mm_sra_epi32(_mm_add_epi32(res_odd, round_const_x), round_shift_x);

        __m128i res_even1 = _mm_packs_epi32(res_even, res_even);
        __m128i res_odd1 = _mm_packs_epi32(res_odd, res_odd);
        __m128i res = _mm_unpacklo_epi16(res_even1, res_odd1);

        _mm_store_si128((__m128i *)&im_block[i * im_stride], res);
      }
    }
    /* Vertical filter */
    {
      __m128i s0 = _mm_loadu_si128((__m128i *)(im_block + 0 * im_stride));
      __m128i s1 = _mm_loadu_si128((__m128i *)(im_block + 1 * im_stride));
      __m128i s2 = _mm_loadu_si128((__m128i *)(im_block + 2 * im_stride));
      __m128i s3 = _mm_loadu_si128((__m128i *)(im_block + 3 * im_stride));
      __m128i s4 = _mm_loadu_si128((__m128i *)(im_block + 4 * im_stride));
      __m128i s5 = _mm_loadu_si128((__m128i *)(im_block + 5 * im_stride));
      __m128i s6 = _mm_loadu_si128((__m128i *)(im_block + 6 * im_stride));

      s[0] = _mm_unpacklo_epi16(s0, s1);
      s[1] = _mm_unpacklo_epi16(s2, s3);
      s[2] = _mm_unpacklo_epi16(s4, s5);

      s[4] = _mm_unpackhi_epi16(s0, s1);
      s[5] = _mm_unpackhi_epi16(s2, s3);
      s[6] = _mm_unpackhi_epi16(s4, s5);

      s[0 + 8] = _mm_unpacklo_epi16(s1, s2);
      s[1 + 8] = _mm_unpacklo_epi16(s3, s4);
      s[2 + 8] = _mm_unpacklo_epi16(s5, s6);

      s[4 + 8] = _mm_unpackhi_epi16(s1, s2);
      s[5 + 8] = _mm_unpackhi_epi16(s3, s4);
      s[6 + 8] = _mm_unpackhi_epi16(s5, s6);

      for (i = 0; i < h; i += 2) {
        const int16_t *data = &im_block[i * im_stride];

        __m128i s7 = _mm_loadu_si128((__m128i *)(data + 7 * im_stride));
        __m128i s8 = _mm_loadu_si128((__m128i *)(data + 8 * im_stride));

        s[3] = _mm_unpacklo_epi16(s6, s7);
        s[7] = _mm_unpackhi_epi16(s6, s7);

        s[3 + 8] = _mm_unpacklo_epi16(s7, s8);
        s[7 + 8] = _mm_unpackhi_epi16(s7, s8);

        const __m128i res_a0 = convolve(s, coeffs_y);
        __m128i res_a_round0 =
            _mm_sra_epi32(_mm_add_epi32(res_a0, round_const_y), round_shift_y);
        res_a_round0 = _mm_sra_epi32(
            _mm_add_epi32(res_a_round0, round_const_bits), round_shift_bits);

        const __m128i res_a1 = convolve(s + 8, coeffs_y);
        __m128i res_a_round1 =
            _mm_sra_epi32(_mm_add_epi32(res_a1, round_const_y), round_shift_y);
        res_a_round1 = _mm_sra_epi32(
            _mm_add_epi32(res_a_round1, round_const_bits), round_shift_bits);

        if (w - j > 4) {
          const __m128i res_b0 = convolve(s + 4, coeffs_y);
          __m128i res_b_round0 = _mm_sra_epi32(
              _mm_add_epi32(res_b0, round_const_y), round_shift_y);
          res_b_round0 = _mm_sra_epi32(
              _mm_add_epi32(res_b_round0, round_const_bits), round_shift_bits);

          const __m128i res_b1 = convolve(s + 4 + 8, coeffs_y);
          __m128i res_b_round1 = _mm_sra_epi32(
              _mm_add_epi32(res_b1, round_const_y), round_shift_y);
          res_b_round1 = _mm_sra_epi32(
              _mm_add_epi32(res_b_round1, round_const_bits), round_shift_bits);

          __m128i res_16bit0 = _mm_packs_epi32(res_a_round0, res_b_round0);
          res_16bit0 = _mm_min_epi16(res_16bit0, clip_pixel);
          res_16bit0 = _mm_max_epi16(res_16bit0, zero);

          __m128i res_16bit1 = _mm_packs_epi32(res_a_round1, res_b_round1);
          res_16bit1 = _mm_min_epi16(res_16bit1, clip_pixel);
          res_16bit1 = _mm_max_epi16(res_16bit1, zero);

          _mm_storeu_si128((__m128i *)&dst[i * dst_stride + j], res_16bit0);
          _mm_storeu_si128((__m128i *)&dst[i * dst_stride + j + dst_stride],
                           res_16bit1);
        } else if (w == 4) {
          res_a_round0 = _mm_packs_epi32(res_a_round0, res_a_round0);
          res_a_round0 = _mm_min_epi16(res_a_round0, clip_pixel);
          res_a_round0 = _mm_max_epi16(res_a_round0, zero);

          res_a_round1 = _mm_packs_epi32(res_a_round1, res_a_round1);
          res_a_round1 = _mm_min_epi16(res_a_round1, clip_pixel);
          res_a_round1 = _mm_max_epi16(res_a_round1, zero);

          _mm_storel_epi64((__m128i *)&dst[i * dst_stride + j], res_a_round0);
          _mm_storel_epi64((__m128i *)&dst[i * dst_stride + j + dst_stride],
                           res_a_round1);
        } else {
          res_a_round0 = _mm_packs_epi32(res_a_round0, res_a_round0);
          res_a_round0 = _mm_min_epi16(res_a_round0, clip_pixel);
          res_a_round0 = _mm_max_epi16(res_a_round0, zero);

          res_a_round1 = _mm_packs_epi32(res_a_round1, res_a_round1);
          res_a_round1 = _mm_min_epi16(res_a_round1, clip_pixel);
          res_a_round1 = _mm_max_epi16(res_a_round1, zero);

          *((uint32_t *)(&dst[i * dst_stride + j])) =
              _mm_cvtsi128_si32(res_a_round0);

          *((uint32_t *)(&dst[i * dst_stride + j + dst_stride])) =
              _mm_cvtsi128_si32(res_a_round1);
        }
        s[0] = s[1];
        s[1] = s[2];
        s[2] = s[3];

        s[4] = s[5];
        s[5] = s[6];
        s[6] = s[7];

        s[0 + 8] = s[1 + 8];
        s[1 + 8] = s[2 + 8];
        s[2 + 8] = s[3 + 8];

        s[4 + 8] = s[5 + 8];
        s[5 + 8] = s[6 + 8];
        s[6 + 8] = s[7 + 8];

        s6 = s8;
      }
    }
  }
}
