// Copyright 2022 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 NR % 8 == 0
$ABC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#include <assert.h>

#include <immintrin.h>

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


void xnn_f16_igemm_minmax_ukernel_${MR}x${NR}__avx2_broadcast(
    size_t mr,
    size_t nc,
    size_t kc,
    size_t ks,
    const void**restrict a,
    const void*restrict w,
    void*restrict c,
    size_t cm_stride,
    size_t cn_stride,
    size_t a_offset,
    const void* zero,
    const union xnn_f16_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
{
  assert(mr != 0);
  assert(mr <= ${MR});
  assert(nc != 0);
  assert(kc != 0);
  assert(kc % sizeof(uint16_t) == 0);
  assert(ks != 0);
  assert(ks % (${MR} * sizeof(void*)) == 0);
  assert(a_offset % sizeof(uint16_t) == 0);
  assert(a != NULL);
  assert(w != NULL);
  assert(c != NULL);

  uint16_t* c0 = c;
  $for M in range(1, MR):
    uint16_t* c${M} = (uint16_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 {
    __m256 vacc0x${ABC[0:8]} = _mm256_cvtph_ps(_mm_load_si128((const __m128i*) w));
    $for N in range(8, NR, 8):
      __m256 vacc0x${ABC[N:N+8]} = _mm256_cvtph_ps(_mm_load_si128((const __m128i*) ((const uint16_t*) w + ${N})));
    $for M in range(1, MR):
      $for N in range(0, NR, 8):
        __m256 vacc${M}x${ABC[N:N+8]} = vacc0x${ABC[N:N+8]};
    w = (const uint16_t*) w + ${NR};

    size_t p = ks;
    do {
      $for M in range(MR):
        const uint16_t* restrict a${M} = (const uint16_t*) a[${M}];
        assert(a${M} != NULL);
        if XNN_UNPREDICTABLE(a${M} != zero) {
          a${M} = (const uint16_t*) ((uintptr_t) a${M} + a_offset);
        }
      a += ${MR};

      size_t k = kc;
      do {
        const __m256 vb${ABC[0:8]} = _mm256_cvtph_ps(_mm_load_si128((const __m128i*) w));
        $for N in range(8, NR, 8):
          const __m256 vb${ABC[N:N+8]} = _mm256_cvtph_ps(_mm_load_si128((const __m128i*) ((const uint16_t*) w + ${N})));
        w = (const uint16_t*) w + ${NR};

        $for M in range(MR):
          const __m256 va${M} = _mm256_cvtph_ps(_mm_set1_epi16((short) *a${M}));
          a${M} += 1;

        $for M in range(MR):
          $for N in range(0, NR, 8):
            vacc${M}x${ABC[N:N+8]} = _mm256_cvtph_ps(_mm256_cvtps_ph(_mm256_fmadd_ps(va${M}, vb${ABC[N:N+8]}, vacc${M}x${ABC[N:N+8]}), _MM_FROUND_NO_EXC));

        k -= sizeof(uint16_t);
      } while (k != 0);
      p -= ${MR} * sizeof(void*);
    } while (p != 0);

    const __m256 vmin = _mm256_load_ps(params->avx.min);
    $for N in range(0, NR, 8):
      $for M in range(MR):
        vacc${M}x${ABC[N:N+8]} = _mm256_max_ps(vacc${M}x${ABC[N:N+8]}, vmin);

    const __m256 vmax = _mm256_load_ps(params->avx.max);
    $for N in range(0, NR, 8):
      $for M in range(MR):
        vacc${M}x${ABC[N:N+8]} = _mm256_min_ps(vacc${M}x${ABC[N:N+8]}, vmax);

    if XNN_LIKELY(nc >= ${NR}) {
      $for M in reversed(range(MR)):
        _mm_storeu_si128((__m128i*) c${M}, _mm256_cvtps_ph(vacc${M}x${ABC[0:8]}, _MM_FROUND_NO_EXC));
        $for N in range(8, NR, 8):
          _mm_storeu_si128((__m128i*) (c${M} + ${N}), _mm256_cvtps_ph(vacc${M}x${ABC[N:N+8]}, _MM_FROUND_NO_EXC));
        c${M} = (uint16_t*) ((uintptr_t) c${M} + cn_stride);

      a = (const void**restrict) ((uintptr_t) a - ks);
      nc -= ${NR};
    } else {
      $for LOG2N in reversed(range(NR.bit_length())):
        $if LOG2N == 3:
          $for M in reversed(range(MR)):
            __m128i vh${M}x${ABC[0:8]} = _mm256_cvtps_ph(vacc${M}x${ABC[0:8]}, _MM_FROUND_NO_EXC);
        $if NR != 1 << LOG2N:
          if (nc & ${1 << LOG2N}) {
            $if LOG2N >= 4:
              $for M in reversed(range(MR)):
                _mm_storeu_si128((__m128i*) c${M}, _mm256_cvtps_ph(vacc${M}x${ABC[0:8]}, _MM_FROUND_NO_EXC));
                $for N in range(8, 1 << LOG2N, 8):
                  _mm_storeu_si128((__m128i*) (c${M} + ${N}), _mm256_cvtps_ph(vacc${M}x${ABC[N:N+8]}, _MM_FROUND_NO_EXC));

              $for M in reversed(range(MR)):
                $for N in range(0, 1 << (LOG2N - 1), 8):
                  vacc${M}x${ABC[N:N+8]} = vacc${M}x${ABC[N + (1 << LOG2N):N + (1 << LOG2N)+8]};

              $for M in reversed(range(MR)):
                c${M} += ${1 << LOG2N};
            $elif LOG2N == 3:
              $for M in reversed(range(MR)):
                _mm_storeu_si128((__m128i*) c${M}, vh${M}x${ABC[0:8]});

              $for M in reversed(range(MR)):
                vh${M}x${ABC[0:8]} = _mm256_cvtps_ph(vacc${M}x${ABC[8:16]}, _MM_FROUND_NO_EXC);

              $for M in reversed(range(MR)):
                c${M} += ${1 << LOG2N};
            $elif LOG2N == 2:
              $for M in reversed(range(MR)):
                _mm_storel_epi64((__m128i*) c${M}, vh${M}x${ABC[0:8]});

              $for M in reversed(range(MR)):
                vh${M}x${ABC[0:8]} = _mm_unpackhi_epi64(vh${M}x${ABC[0:8]}, vh${M}x${ABC[0:8]});

              $for M in reversed(range(MR)):
                c${M} += 4;
            $elif LOG2N == 1:
              $for M in reversed(range(MR)):
                _mm_storeu_si32(c${M}, vh${M}x${ABC[0:8]});

              $for M in reversed(range(MR)):
                vh${M}x${ABC[0:8]} = _mm_srli_epi64(vh${M}x${ABC[0:8]}, 32);

              $for M in reversed(range(MR)):
                c${M} += 2;
            $elif LOG2N == 0:
              $for M in reversed(range(MR)):
                *c${M} = _mm_extract_epi16(vh${M}x${ABC[0:8]}, 0);
          }

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