// 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 NR % 4 == 0
$assert ACTIVATION != "MINMAX" or ARCH in ["ARM", "X86", "RELAXED"]
$assert not FMA or ARCH == "RELAXED"
$ABC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#include <assert.h>

#include <wasm_simd128.h>

#include <xnnpack/gemm.h>


$assert ACTIVATION in ["LINEAR", "RELU", "MINMAX"]
$if ACTIVATION == "MINMAX":
$  WASM_F32X4_MIN={"ARM": "wasm_f32x4_min", "X86": "wasm_f32x4_pmin", "RELAXED": "__builtin_wasm_relaxed_min_f32x4"}[ARCH]
$  WASM_F32X4_MAX={"ARM": "wasm_f32x4_max", "X86": "wasm_f32x4_pmax", "RELAXED": "__builtin_wasm_relaxed_max_f32x4"}[ARCH]
$ACTIVATION_SUFFIX = {"LINEAR": ""}.get(ACTIVATION, "_" + ACTIVATION.lower())
$ISA = "wasmsimd" if not FMA and (ACTIVATION in ["LINEAR", "RELU"] or ARCH != "RELAXED") else "wasmrelaxedsimd"
$ARCH_SUFFIX = "" if not FMA and (ACTIVATION in ["LINEAR", "RELU"] or ARCH == "RELAXED") else "_" + ("fma" if FMA else ARCH.lower())
$PARAMS = {"LINEAR": "xnn_f32_default_params", "RELU": "xnn_f32_relu_params", "MINMAX": "xnn_f32_minmax_params"}[ACTIVATION]
void xnn_f32_gemm${"inc" if INC else ""}${ACTIVATION_SUFFIX}_ukernel_${MR}x${NR}__${ISA}${ARCH_SUFFIX}_splat(
    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,
    $if INC:
      const float*restrict acc,
    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(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);
  $if INC:
    assert(acc != 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};
      }

  $if ACTIVATION == "MINMAX":
    const v128_t vmin = wasm_v128_load64_splat(params->wasmsimd.min);
    const v128_t vmax = wasm_v128_load64_splat(params->wasmsimd.max);
  do {
    $if INC:
      $for M in range(MR):
        $for N in range(0, NR, 4):
          v128_t vacc${M}x${ABC[N:N+4]} = wasm_v128_load(acc + ${M*NR+N});
      acc += ${MR*NR};
    $else:
      $for N in range(0, NR, 4):
        v128_t vacc0x${ABC[N:N+4]} = wasm_v128_load(w + ${N});
      $for M in range(1, MR):
        $for N in range(0, NR, 4):
          v128_t vacc${M}x${ABC[N:N+4]} = vacc0x${ABC[N:N+4]};
      w += ${NR};

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

      $for L in range(4):
        $for M in range(MR):
          const v128_t va${M}c${L} = wasm_v32x4_shuffle(va${M}, va${M}, ${L}, ${L}, ${L}, ${L});

        $for N in range(0, NR, 4):
          const v128_t vb${ABC[N:N+4]}c${L} = wasm_v128_load(w + ${L * NR + N});

        $for N in range(0, NR, 4):
          $for M in range(MR):
            vacc${M}x${ABC[N:N+4]} = wasm_f32x4_add(vacc${M}x${ABC[N:N+4]}, wasm_f32x4_mul(va${M}c${L}, vb${ABC[N:N+4]}c${L}));

      w += ${4 * NR};
      k -= 4 * sizeof(float);
    }
    if XNN_UNLIKELY(k != 0) {
      do {
        $for M in range(MR):
          const v128_t va${M} = wasm_v128_load32_splat(a${M});
          a${M} += 1;

        const v128_t vb${ABC[0:4]} = wasm_v128_load(w);
        $for N in range(4, NR, 4):
          const v128_t vb${ABC[N:N+4]} = wasm_v128_load(w + ${N});
        w += ${NR};

        $for N in range(0, NR, 4):
          $for M in range(MR):
            $if FMA:
              vacc${M}x${ABC[N:N+4]} = __builtin_wasm_fma_f32x4(vacc${M}x${ABC[N:N+4]}, va${M}, vb${ABC[N:N+4]});
            $else:
              vacc${M}x${ABC[N:N+4]} = wasm_f32x4_add(vacc${M}x${ABC[N:N+4]}, wasm_f32x4_mul(va${M}, vb${ABC[N:N+4]}));

        k -= sizeof(float);
      } while (k != 0);
    }

    $if ACTIVATION == "MINMAX":
      $for N in range(0, NR, 4):
        $for M in range(MR):
          vacc${M}x${ABC[N:N+4]} = ${WASM_F32X4_MAX}(vmin, vacc${M}x${ABC[N:N+4]});

      $for N in range(0, NR, 4):
        $for M in range(MR):
          vacc${M}x${ABC[N:N+4]} = ${WASM_F32X4_MIN}(vmax, vacc${M}x${ABC[N:N+4]});
    $elif ACTIVATION == "RELU":
      const v128_t vzero = wasm_i32x4_const_splat(0);
      $for N in range(0, NR, 4):
        $for M in range(MR):
          vacc${M}x${ABC[N:N+4]} = wasm_i32x4_max(vacc${M}x${ABC[N:N+4]}, vzero);

    if XNN_LIKELY(nc >= ${NR}) {
      $for M in reversed(range(MR)):
        wasm_v128_store(c${M}, vacc${M}x${ABC[0:4]});
        $for N in range(4, NR, 4):
          wasm_v128_store(c${M} + ${N}, vacc${M}x${ABC[N:N+4]});
        c${M} = (float*) ((uintptr_t) c${M} + cn_stride);

      $for M in reversed(range(MR)):
        a${M} = (const float*) ((uintptr_t) a${M} - kc);

      nc -= ${NR};
    } else {
      $for LOG2N in reversed(range(NR.bit_length())):
        $if NR != 1 << LOG2N:
          if (nc & ${1 << LOG2N}) {
            $if LOG2N >= 2:
              $for M in reversed(range(MR)):
                wasm_v128_store(c${M}, vacc${M}x${ABC[0:4]});
                $for N in range(4, 1 << LOG2N, 4):
                  wasm_v128_store(c${M} + ${N}, vacc${M}x${ABC[N:N+4]});

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

              $for M in reversed(range(MR)):
                c${M} += ${1 << LOG2N};
            $elif LOG2N == 1:
              $for M in reversed(range(MR)):
                *((double*) c${M}) = wasm_f64x2_extract_lane(vacc${M}x${ABC[0:4]}, 0);

              $for M in reversed(range(MR)):
                vacc${M}x${ABC[0:4]} = wasm_v32x4_shuffle(vacc${M}x${ABC[0:4]}, vacc${M}x${ABC[0:4]}, 2, 3, 2, 3);

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

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