// 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 NR == 2
$assert MR % 2 == 0
#include <assert.h>

#include <psimd.h>

#include <xnnpack/gemm.h>


void xnn_f32_gemm_ukernel_${MR}x${NR}c4__psimd(
    size_t mr,
    size_t nc,
    size_t kc,
    const float* restrict a,
    size_t a_stride,
    const float* restrict w,
    float* restrict c,
    size_t cm_stride,
    size_t cn_stride,
    const union xnn_f32_minmax_params params[restrict static 1])
{
  assert(mr != 0);
  assert(mr <= ${MR});
  assert(nc != 0);
  assert(kc != 0);
  assert(kc % sizeof(float) == 0);
  assert(a != NULL);
  assert(w != NULL);
  assert(c != NULL);

  const float* a0 = a;
  float* c0 = c;
  $for M in range(1, MR):
    const float* a${M} = (const float*) ((uintptr_t) a${M-1} + a_stride);
    float* c${M} = (float*) ((uintptr_t) c${M-1} + cm_stride);
    $if M % 2 == 0:
      if XNN_UNPREDICTABLE(mr <= ${M}) {
        a${M} = a${M-1};
        c${M} = c${M-1};
      }
    $elif M + 1 == MR:
      if XNN_UNPREDICTABLE(mr != ${M+1}) {
        a${M} = a${M-1};
        c${M} = c${M-1};
      }
    $else:
      if XNN_UNPREDICTABLE(mr < ${M+1}) {
        a${M} = a${M-1};
        c${M} = c${M-1};
      }

  do {
    psimd_f32 vacc0x0c4 = psimd_load1_f32(w);
    $for N in range(1, NR):
      psimd_f32 vacc0x${N}c4 = psimd_load1_f32(w + ${N});
    $for M in range(1, MR):
      $for N in range(NR):
        psimd_f32 vacc${M}x${N}c4 = vacc0x${N}c4;
    w += ${NR};

    size_t k = kc;
    for (; k >= 4 * sizeof(float); k -= 4 * sizeof(float)) {
      $for M in range(MR):
        const psimd_f32 va${M} = psimd_load_f32(a${M});
        a${M} += 4;

      const psimd_f32 vb0 = psimd_load_f32(w);
      $for N in range(1, NR):
        const psimd_f32 vb${N} = psimd_load_f32(w + ${N * 4});
      w += ${NR * 4};

      $for M in range(MR):
        $for N in range(NR):
          vacc${M}x${N}c4 = psimd_qfma_f32(vacc${M}x${N}c4, va${M}, vb${N});
    }
    if XNN_UNLIKELY(k != 0) {
      $for M in range(MR):
        const psimd_f32 va${M} = psimd_load_f32(a${M});
        a${M} = (const float*) ((uintptr_t) a${M} + k);

      const psimd_f32 vb0 = psimd_load_f32(w);
      $for N in range(1, NR):
        const psimd_f32 vb${N} = psimd_load_f32(w + ${N * 4});
      w += ${NR * 4};

      const psimd_f32 vzero = psimd_splat_f32(0.0f);
      $for N in range(NR):
        const psimd_s32 vmask${N} = vb${N} != vzero;

      $for M in range(MR):
        $for N in range(NR):
          vacc${M}x${N}c4 = psimd_qfma_f32(vacc${M}x${N}c4, psimd_andmask_f32(vmask${N}, va${M}), vb${N});
    }

    $for M in range(MR):
      const psimd_f32 vacc${M}x01c2 = psimd_add_f32(psimd_interleave_lo_f32(vacc${M}x0c4, vacc${M}x1c4), psimd_interleave_hi_f32(vacc${M}x0c4, vacc${M}x1c4));

    $for M in range(0, MR, 2):
      psimd_f32 vacc${M}${M+1}x01 = psimd_add_f32(psimd_concat_lo_f32(vacc${M}x01c2, vacc${M+1}x01c2), psimd_concat_hi_f32(vacc${M}x01c2, vacc${M+1}x01c2));

    const psimd_f32 vmax = psimd_load_splat_f32(&params->scalar.max);
    $for M in range(0, MR, 2):
      vacc${M}${M+1}x01 = psimd_min_f32(vacc${M}${M+1}x01, vmax);

    const psimd_f32 vmin = psimd_load_splat_f32(&params->scalar.min);
    $for M in range(0, MR, 2):
      vacc${M}${M+1}x01 = psimd_max_f32(vacc${M}${M+1}x01, vmin);

    if XNN_LIKELY(nc >= ${NR}) {
      $for M in reversed(range(0, MR, 2)):
        psimd_store2_f32(c${M}, vacc${M}${M+1}x01);
        c${M} = (float*) ((uintptr_t) c${M} + cn_stride);
        a${M} = (const float*) ((uintptr_t) a${M} - kc);
        psimd_store2_f32(c${M+1}, psimd_concat_hi_f32(vacc${M}${M+1}x01, vacc${M}${M+1}x01));
        c${M+1} = (float*) ((uintptr_t) c${M+1} + cn_stride);
        a${M+1} = (const float*) ((uintptr_t) a${M+1} - kc);

      nc -= ${NR};
    } else {
      assert(nc == 1);
      $for M in reversed(range(0, MR, 2)):
        psimd_store1_f32(c${M}, vacc${M}${M+1}x01);
        psimd_store1_f32(c${M+1}, psimd_concat_hi_f32(vacc${M}${M+1}x01, vacc${M}${M+1}x01));

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