// Copyright 2020 Google LLC
//
// This source code is licensed under the BSD-style license found in the
// LICENSE file in the root directory of this source tree.

$assert REQUANTIZATION == "FP32"
$assert DATATYPE in ["QC8", "QS8", "QU8"]
$assert MR <= 4
#include <assert.h>

#include <immintrin.h>

#include <xnnpack/igemm.h>
#include <xnnpack/intrinsics-polyfill.h>
#include <xnnpack/math.h>
#include <xnnpack/unaligned.h>


$PARAMS_STRUCT = REQUANTIZATION.lower() + "_avx2"
$PARAMS_UNION = "xnn_%s_conv_minmax_params" % DATATYPE.lower()
$XINT8_T = "uint8_t" if DATATYPE == "QU8" else "int8_t"
void xnn_${DATATYPE.lower()}_igemm_minmax_fp32_ukernel_${MR}x8c8__avx2(
    size_t mr,
    size_t nc,
    size_t kc,
    size_t ks,
    const ${XINT8_T}** restrict a,
    const void* restrict w,
    ${XINT8_T}* restrict c,
    size_t cm_stride,
    size_t cn_stride,
    size_t a_offset,
    const ${XINT8_T}* zero,
    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
{
  assert(mr != 0);
  assert(mr <= ${MR});
  assert(nc != 0);
  assert(kc != 0);
  assert(ks != 0);
  assert(ks % (${MR} * sizeof(void*)) == 0);
  assert(a_offset % sizeof(${XINT8_T}) == 0);
  assert(a != NULL);
  assert(w != NULL);
  assert(c != NULL);

  kc = round_up_po2(kc, 8);
  ${XINT8_T}* c0 = c;
  $for M in range(1, MR):
    ${XINT8_T}* c${M} = (${XINT8_T}*) ((uintptr_t) c${M-1} + cm_stride);
    $if M % 2 == 0:
      if XNN_UNPREDICTABLE(mr <= ${M}) {
        c${M} = c${M-1};
      }
    $elif M + 1 == MR:
      if XNN_UNPREDICTABLE(mr != ${M+1}) {
        c${M} = c${M-1};
      }
    $else:
      if XNN_UNPREDICTABLE(mr < ${M+1}) {
        c${M} = c${M-1};
      }

  do {
    $for N in range(0, 8, 2):
      const __m128i vbias0x${N} = _mm_cvtsi32_si128(((const int*) w)[${N}]);
      const __m128i vbias0x${N+1} = _mm_cvtsi32_si128(((const int*) w)[${N+1}]);
      __m256i vacc0x${N}${N+1} = _mm256_inserti128_si256(_mm256_castsi128_si256(vbias0x${N}), vbias0x${N+1}, 1);
    $for M in range(1, MR):
      $for N in range(0, 8, 2):
        __m256i vacc${M}x${N}${N+1} = vacc0x${N}${N+1};
    w = (const int32_t*) w + 8;

    size_t p = ks;
    $if DATATYPE == "QU8":
      const __m256i vb_zero_point = _mm256_load_si256((const __m256i*) params->${PARAMS_STRUCT}.kernel_zero_point);
    do {
      $for M in range(MR):
        const ${XINT8_T}* restrict a${M} = a[${M}];
        if XNN_UNPREDICTABLE(a${M} != zero) {
          a${M} = (const ${XINT8_T}*) ((uintptr_t) a${M} + a_offset);
        }
      a += ${MR};

      size_t k = 0;
      while (k < kc) {
        $for M in range(MR):
          const __m128i va${M} = _mm_broadcastq_epi64(_mm_loadl_epi64((const __m128i*) a${M}));
          $if DATATYPE == "QU8":
            const __m256i vxa${M} = _mm256_cvtepu8_epi16(va${M});
          $else:
            const __m256i vxa${M} = _mm256_cvtepi8_epi16(va${M});
          a${M} += 8;

        $for N in range(0, 8, 2):
          $if N == 0:
            const __m128i vb${N}${N+1} = _mm_load_si128((const __m128i*) w);
          $else:
            const __m128i vb${N}${N+1} = _mm_load_si128((const __m128i*) ((const ${XINT8_T}*) w + ${N * 8}));
          $if DATATYPE == "QU8":
            const __m256i vxb${N}${N+1} = _mm256_sub_epi16(_mm256_cvtepu8_epi16(vb${N}${N+1}), vb_zero_point);
          $else:
            const __m256i vxb${N}${N+1} = _mm256_cvtepi8_epi16(vb${N}${N+1});

          $for M in range(MR):
            vacc${M}x${N}${N+1} = _mm256_add_epi32(vacc${M}x${N}${N+1}, _mm256_madd_epi16(vxa${M}, vxb${N}${N+1}));

        w = (const void*) ((const ${XINT8_T}*) w + 64);
        k += 8 * sizeof(${XINT8_T});
      }
      p -= ${MR} * sizeof(void*);
    } while (p != 0);

    $for M in range(MR):
      const __m256i vacc${M}x0213 = _mm256_hadd_epi32(vacc${M}x01, vacc${M}x23);
      const __m256i vacc${M}x4657 = _mm256_hadd_epi32(vacc${M}x45, vacc${M}x67);

    $for M in range(MR):
      const __m256i vacc${M}x02461357 = _mm256_hadd_epi32(vacc${M}x0213, vacc${M}x4657);

    const __m256i vpermute_mask = _mm256_set_epi32(7, 3, 6, 2, 5, 1, 4, 0);
    $for M in range(MR):
      __m256i vacc${M}x01234567 = _mm256_permutevar8x32_epi32(vacc${M}x02461357, vpermute_mask);

    $for M in range(MR):
      __m256 vscaled${M}x01234567 = _mm256_cvtepi32_ps(vacc${M}x01234567);

    $if DATATYPE == "QC8":
      const __m256 vscale01234567 = _mm256_load_ps(w);
      w = (const void*) ((const float*) w + 8);
      $for M in range(MR):
        vscaled${M}x01234567 = _mm256_mul_ps(vscaled${M}x01234567, vscale01234567);
    $else:
      const __m256 vscale = _mm256_load_ps(params->fp32_avx2.scale);
      $for M in range(MR):
        vscaled${M}x01234567 = _mm256_mul_ps(vscaled${M}x01234567, vscale);

    const __m256 voutput_max_less_zero_point = _mm256_load_ps(params->${PARAMS_STRUCT}.output_max_less_zero_point);
    $for M in range(MR):
      vscaled${M}x01234567 = _mm256_min_ps(vscaled${M}x01234567, voutput_max_less_zero_point);

    $for M in range(MR):
      vacc${M}x01234567 = _mm256_cvtps_epi32(vscaled${M}x01234567);

    const __m256i voutput_zero_point = _mm256_load_si256((const __m256i*) params->${PARAMS_STRUCT}.output_zero_point);
    $for M in range(0, MR, 2):
      __m256i vacc${M}${min(M+1, MR-1)}x01234567 = _mm256_adds_epi16(_mm256_packs_epi32(vacc${M}x01234567, vacc${min(M+1, MR-1)}x01234567), voutput_zero_point);

    $for M in range(0, MR, 2):
      vacc${M}${min(M+1, MR-1)}x01234567 = _mm256_permute4x64_epi64(vacc${M}${min(M+1, MR-1)}x01234567, _MM_SHUFFLE(3, 1, 2, 0));

    $if DATATYPE == "QU8":
      $if MR > 2:
        __m256i vout = _mm256_packus_epi16(vacc0${min(1, MR-1)}x01234567, vacc${min(2, MR-1)}${min(3, MR-1)}x01234567);
      $else:
        __m256i vout = _mm256_packus_epi16(vacc0${min(1, MR-1)}x01234567, vacc0${min(1, MR-1)}x01234567);

      vout = _mm256_max_epu8(vout, _mm256_load_si256((const __m256i*) params->${PARAMS_STRUCT}.output_min));
    $else:
      $if MR > 2:
        __m256i vout = _mm256_packs_epi16(vacc0${min(1, MR-1)}x01234567, vacc${min(2, MR-1)}${min(3, MR-1)}x01234567);
      $else:
        __m256i vout = _mm256_packs_epi16(vacc0${min(1, MR-1)}x01234567, vacc0${min(1, MR-1)}x01234567);

      vout = _mm256_max_epi8(vout, _mm256_load_si256((const __m256i*) params->${PARAMS_STRUCT}.output_min));

    __m128i vout_lo = _mm256_castsi256_si128(vout);
    __m128i vout_hi = _mm256_extracti128_si256(vout, 1);

    if (nc >= 8) {
      $if MR > 3:
        _mm_storeh_pi((__m64*) c3, _mm_castsi128_ps(vout_hi));
      $if MR > 2:
        _mm_storeh_pi((__m64*) c2, _mm_castsi128_ps(vout_lo));
      $if MR > 1:
        _mm_storel_epi64((__m128i*) c1, vout_hi);
      _mm_storel_epi64((__m128i*) c0, vout_lo);

      $for M in reversed(range(MR)):
        c${M} = (${XINT8_T}*) ((uintptr_t) c${M} + cn_stride);

      a = (const ${XINT8_T}**restrict) ((uintptr_t) a - ks);

      nc -= 8;
    } else {
      if (nc & 4) {
        $if MR > 3:
          unaligned_store_u32(c3, (uint32_t) _mm_extract_epi32(vout_hi, 2));
        $if MR > 2:
          unaligned_store_u32(c2, (uint32_t) _mm_extract_epi32(vout_lo, 2));
        $if MR > 1:
          _mm_storeu_si32(c1, vout_hi);
        _mm_storeu_si32(c0, vout_lo);

        $for M in reversed(range(MR)):
          c${M} += 4;

        vout_lo = _mm_srli_epi64(vout_lo, 32);
        vout_hi = _mm_srli_epi64(vout_hi, 32);
      }
      if (nc & 2) {
        $if MR > 3:
          unaligned_store_u16(c3, (uint16_t) _mm_extract_epi16(vout_hi, 4));
        $if MR > 2:
          unaligned_store_u16(c2, (uint16_t) _mm_extract_epi16(vout_lo, 4));
        $if MR > 1:
          unaligned_store_u16(c1, (uint16_t) _mm_extract_epi16(vout_hi, 0));
        unaligned_store_u16(c0, (uint16_t) _mm_extract_epi16(vout_lo, 0));

        $for M in reversed(range(MR)):
          c${M} += 2;

        vout_lo = _mm_srli_epi32(vout_lo, 16);
        vout_hi = _mm_srli_epi32(vout_hi, 16);
      }
      if (nc & 1) {
        $if MR > 3:
          *c3 = (${XINT8_T}) _mm_extract_epi8(vout_hi, 8);
        $if MR > 2:
          *c2 = (${XINT8_T}) _mm_extract_epi8(vout_lo, 8);
        $if MR > 1:
          *c1 = (${XINT8_T}) _mm_extract_epi8(vout_hi, 0);
        *c0 = (${XINT8_T}) _mm_extract_epi8(vout_lo, 0);
      }

      nc = 0;
    }
  } while (nc != 0);
}
