// 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 CHANNEL_TILE % 8 == 0
$assert CHANNEL_TILE >= 8
$assert ROW_TILE >= 3
$ABC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#include <assert.h>

#include <immintrin.h>

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


void xnn_f16_gavgpool_minmax_ukernel_${ROW_TILE}x__f16c_c${CHANNEL_TILE}(
    size_t rows,
    size_t channels,
    const void* input,
    size_t input_stride,
    const void* zero,
    void* output,
    const union xnn_f16_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
{
  assert(rows != 0);
  assert(rows <= ${ROW_TILE});
  assert(channels != 0);

  const uint16_t* i0 = input;
  $for M in range(1, ROW_TILE):
    const uint16_t* i${M} = (const uint16_t*) ((uintptr_t) i${M-1} + input_stride);
    $if M % 2 == 1:
      if XNN_UNPREDICTABLE(rows < ${M+1}) {
        i${M} = (const uint16_t*) zero;
      }
    $else:
      if XNN_UNPREDICTABLE(rows <= ${M}) {
        i${M} = (const uint16_t*) zero;
      }
  uint16_t* o = (uint16_t*) output;

  const __m256 vscale = _mm256_load_ps(params->avx.scale);
  const __m256 vmin = _mm256_load_ps(params->avx.min);
  const __m256 vmax = _mm256_load_ps(params->avx.max);
  for (; channels >= ${CHANNEL_TILE}; channels -= ${CHANNEL_TILE}) {
    $for M in range(2):
      const __m256 vi${M}x${ABC[0:8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i${M}));
      $for C in range(8, CHANNEL_TILE, 8):
        const __m256 vi${M}x${ABC[C:C+8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) (i${M} + ${C})));
      i${M} += ${CHANNEL_TILE};

    $for C in range(0, CHANNEL_TILE, 8):
      $if C == 0:
        const __m256 vi2x${ABC[0:8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i2));
      $else:
        const __m256 vi2x${ABC[C:C+8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) (i2 + ${C})));
      __m128i vacc${ABC[C:C+8]} = _mm256_cvtps_ph(_mm256_add_ps(vi0x${ABC[C:C+8]}, vi1x${ABC[C:C+8]}), _MM_FROUND_NO_EXC);
    i2 += ${CHANNEL_TILE};

    $for M in range(2, ROW_TILE):
      $for C in range(0, CHANNEL_TILE, 8):
        $if M + 1 != ROW_TILE:
          $if C == 0:
            const __m256 vi${M+1}x${ABC[0:8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i${M+1}));
          $else:
            const __m256 vi${M+1}x${ABC[C:C+8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) (i${M+1} + ${C})));
          $if C + 8 == CHANNEL_TILE:
            i${M+1} += ${CHANNEL_TILE};
        vacc${ABC[C:C+8]} = _mm256_cvtps_ph(_mm256_add_ps(_mm256_cvtph_ps(vacc${ABC[C:C+8]}), vi${M}x${ABC[C:C+8]}), _MM_FROUND_NO_EXC);

    $for C in range(0, CHANNEL_TILE, 8):
      vacc${ABC[C:C+8]} = _mm256_cvtps_ph(_mm256_mul_ps(_mm256_cvtph_ps(vacc${ABC[C:C+8]}), vscale), _MM_FROUND_NO_EXC);

    $for C in range(0, CHANNEL_TILE, 8):
      __m256 vout${ABC[C:C+8]} = _mm256_max_ps(_mm256_cvtph_ps(vacc${ABC[C:C+8]}), vmin);

    $for C in range(0, CHANNEL_TILE, 8):
      vout${ABC[C:C+8]} = _mm256_min_ps(vout${ABC[C:C+8]}, vmax);

    _mm_storeu_si128((__m128i*) o, _mm256_cvtps_ph(vout${ABC[0:8]}, _MM_FROUND_NO_EXC));
    $for C in range(8, CHANNEL_TILE, 8):
      _mm_storeu_si128((__m128i*) (o + ${C}), _mm256_cvtps_ph(vout${ABC[C:C+8]}, _MM_FROUND_NO_EXC));
    o += ${CHANNEL_TILE};
  }
  if XNN_UNLIKELY(channels != 0) {
    ${"do " if CHANNEL_TILE > 8 else ""}{
      $for M in range(2):
        const __m256 vi${M}x${ABC[0:8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i${M}));
        $if CHANNEL_TILE > 8:
          i${M} += 8;

      const __m256 vi2x${ABC[0:8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i2));
      __m128i vacc${ABC[0:8]} = _mm256_cvtps_ph(_mm256_add_ps(vi0x${ABC[0:8]}, vi1x${ABC[0:8]}), _MM_FROUND_NO_EXC);
      $if CHANNEL_TILE > 8:
        i2 += 8;

      $for M in range(2, ROW_TILE):
        $if M + 1 != ROW_TILE:
          const __m256 vi${M+1}x${ABC[0:8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i${M+1}));
          $if CHANNEL_TILE > 8:
            i${M+1} += 8;
        vacc${ABC[0:8]} = _mm256_cvtps_ph(_mm256_add_ps(_mm256_cvtph_ps(vacc${ABC[0:8]}), vi${M}x${ABC[0:8]}), _MM_FROUND_NO_EXC);

      vacc${ABC[0:8]} = _mm256_cvtps_ph(_mm256_mul_ps(_mm256_cvtph_ps(vacc${ABC[0:8]}), vscale), _MM_FROUND_NO_EXC);
      __m256 vout${ABC[0:8]} = _mm256_max_ps(_mm256_cvtph_ps(vacc${ABC[0:8]}), vmin);
      vout${ABC[0:8]} = _mm256_min_ps(vout${ABC[0:8]}, vmax);

      $if CHANNEL_TILE > 8:
        if XNN_LIKELY(channels >= 8) {
          _mm_storeu_si128((__m128i*) o, _mm256_cvtps_ph(vout${ABC[0:8]}, _MM_FROUND_NO_EXC));
          o += 8;
          channels -= 8;
        } else {
          __m128i vh${ABC[0:8]} = _mm256_cvtps_ph(vout${ABC[0:8]}, _MM_FROUND_NO_EXC);
          if (channels & 4) {
            _mm_storel_epi64((__m128i*) o, vh${ABC[0:8]});
            o += 4;
            vh${ABC[0:8]} = _mm_unpackhi_epi64(vh${ABC[0:8]}, vh${ABC[0:8]});
          }
          if (channels & 2) {
            _mm_storeu_si32(o, vh${ABC[0:8]});
            o += 2;
            vh${ABC[0:8]} = _mm_srli_epi64(vh${ABC[0:8]}, 32);
          }
          if (channels & 1) {
            *o = (uint16_t) _mm_extract_epi16(vh${ABC[0:8]}, 0);
          }
          channels = 0;
        }
      $else:
        __m128i vh${ABC[0:8]} = _mm256_cvtps_ph(vout${ABC[0:8]}, _MM_FROUND_NO_EXC);
        if (channels & 4) {
          _mm_storel_epi64((__m128i*) o, vh${ABC[0:8]});
          o += 4;
          vh${ABC[0:8]} = _mm_unpackhi_epi64(vh${ABC[0:8]}, vh${ABC[0:8]});
        }
        if (channels & 2) {
          _mm_storeu_si32(o, vh${ABC[0:8]});
          o += 2;
          vh${ABC[0:8]} = _mm_srli_epi64(vh${ABC[0:8]}, 32);
        }
        if (channels & 1) {
          *o = (uint16_t) _mm_extract_epi16(vh${ABC[0:8]}, 0);
        }
    }${" while (channels != 0);" if CHANNEL_TILE > 8 else ""}
  }
}
