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

#include <xmmintrin.h>

#include <xnnpack/math.h>
#include <xnnpack/vmulcaddc.h>


void xnn_f32_vmulcaddc_minmax_ukernel_c${CHANNEL_TILE}__sse_${ROW_TILE}x(
    size_t rows,
    size_t channels,
    const float*restrict input,
    size_t input_stride,
    const float*restrict weights,
    float*restrict output,
    size_t output_stride,
    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
{
  assert(rows != 0);
  assert(channels != 0);
  assert(channels % sizeof(float) == 0);

  const float* i0 = input;
  float* o0 = output;
  $for M in range(1, ROW_TILE):
    const float* i${M} = (const float*) ((uintptr_t) i${M-1} + input_stride);
    float* o${M} = (float*) ((uintptr_t) o${M-1} + output_stride);

  const size_t input_increment = input_stride * ${ROW_TILE} - channels;
  const size_t output_increment = output_stride * ${ROW_TILE} - channels;

  const __m128 vmin = _mm_load_ps(params->sse.min);
  const __m128 vmax = _mm_load_ps(params->sse.max);
  do {
    $for M in range(1, ROW_TILE):
      $if M % 2 == 0:
        if XNN_UNPREDICTABLE(rows <= ${M}) {
          i${M} = i${M-1};
          o${M} = o${M-1};
        }
      $else:
        if XNN_UNPREDICTABLE(rows < ${M+1}) {
          i${M} = i${M-1};
          o${M} = o${M-1};
        }

    const float* w = weights;
    size_t c = channels;
    for (; c >= ${CHANNEL_TILE} * sizeof(float); c -= ${CHANNEL_TILE} * sizeof(float)) {
      const __m128 vscale${ABC[0:4]} = _mm_load_ps(w);
      $for C in range(4, CHANNEL_TILE, 4):
        const __m128 vscale${ABC[C:C+4]} = _mm_load_ps(w + ${C});

      $for M in range(ROW_TILE):
        __m128 vacc${M}x${ABC[0:4]} = _mm_loadu_ps(i${M});
        $for C in range(4, CHANNEL_TILE, 4):
          __m128 vacc${M}x${ABC[C:C+4]} = _mm_loadu_ps(i${M} + ${C});
        i${M} += ${CHANNEL_TILE};

      $for M in range(ROW_TILE):
        $for C in range(0, CHANNEL_TILE, 4):
          vacc${M}x${ABC[C:C+4]} = _mm_mul_ps(vacc${M}x${ABC[C:C+4]}, vscale${ABC[C:C+4]});

      $for C in range(0, CHANNEL_TILE, 4):
        const __m128 vbias${ABC[C:C+4]} = _mm_load_ps(w + ${C + CHANNEL_TILE});

      $for M in range(ROW_TILE):
        $for C in range(0, CHANNEL_TILE, 4):
          vacc${M}x${ABC[C:C+4]} = _mm_add_ps(vacc${M}x${ABC[C:C+4]}, vbias${ABC[C:C+4]});

      $for M in range(ROW_TILE):
        $for C in range(0, CHANNEL_TILE, 4):
          vacc${M}x${ABC[C:C+4]} = _mm_max_ps(vacc${M}x${ABC[C:C+4]}, vmin);

      $for M in range(ROW_TILE):
        $for C in range(0, CHANNEL_TILE, 4):
          vacc${M}x${ABC[C:C+4]} = _mm_min_ps(vacc${M}x${ABC[C:C+4]}, vmax);

      $for M in range(ROW_TILE):
        _mm_storeu_ps(o${M}, vacc${M}x${ABC[0:4]});
        $for C in range(4, CHANNEL_TILE, 4):
          _mm_storeu_ps(o${M} + ${C}, vacc${M}x${ABC[C:C+4]});
        o${M} += ${CHANNEL_TILE};

      w += ${CHANNEL_TILE * 2};
    }
    $if CHANNEL_TILE > 4:
      for (; c >= 4 * sizeof(float); c -= 4 * sizeof(float)) {
        const __m128 vscale0123 = _mm_load_ps(w);

        $for M in range(ROW_TILE):
          __m128 vacc${M}x0123 = _mm_loadu_ps(i${M});
          i${M} += 4;

        $for M in range(ROW_TILE):
          vacc${M}x0123 = _mm_mul_ps(vacc${M}x0123, vscale0123);

        const __m128 vbias0123 = _mm_load_ps(w + ${CHANNEL_TILE});

        $for M in range(ROW_TILE):
          vacc${M}x0123 = _mm_add_ps(vacc${M}x0123, vbias0123);

        $for M in range(ROW_TILE):
          vacc${M}x0123 = _mm_max_ps(vacc${M}x0123, vmin);

        $for M in range(ROW_TILE):
          vacc${M}x0123 = _mm_min_ps(vacc${M}x0123, vmax);

        $for M in range(ROW_TILE):
          _mm_storeu_ps(o${M}, vacc${M}x0123);
          o${M} += 4;

        w += 4;
      }
    if XNN_UNLIKELY(c != 0) {
      const __m128 vscale0123 = _mm_load_ps(w);

      $for M in range(ROW_TILE):
        __m128 vacc${M}x0123 = _mm_loadu_ps(i${M});
        i${M} = (const float*) ((uintptr_t) i${M} + c);

      $for M in range(ROW_TILE):
        vacc${M}x0123 = _mm_mul_ps(vacc${M}x0123, vscale0123);

      const __m128 vbias0123 = _mm_load_ps(w + ${CHANNEL_TILE});

      $for M in range(ROW_TILE):
        vacc${M}x0123 = _mm_add_ps(vacc${M}x0123, vbias0123);

      $for M in range(ROW_TILE):
        vacc${M}x0123 = _mm_max_ps(vacc${M}x0123, vmin);

      $for M in range(ROW_TILE):
        vacc${M}x0123 = _mm_min_ps(vacc${M}x0123, vmax);

      if (c & (2 * sizeof(float))) {
        $for M in range(ROW_TILE):
          _mm_storel_pi((__m64*) o${M}, vacc${M}x0123);

        $for M in range(ROW_TILE):
          vacc${M}x0123 = _mm_movehl_ps(vacc${M}x0123, vacc${M}x0123);

        $for M in range(ROW_TILE):
          o${M} += 2;
      }
      if (c & (1 * sizeof(float))) {
        $for M in range(ROW_TILE):
          _mm_store_ss(o${M}, vacc${M}x0123);

        $for M in range(ROW_TILE):
          o${M} += 1;
      }
    }
    $for M in range(ROW_TILE):
      i${M} = (const float*) ((uintptr_t) i${M} + input_increment);
      o${M} = (float*) ((uintptr_t) o${M} + output_increment);
    rows = doz(rows, ${ROW_TILE});
  } while (rows != 0);
}
