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

#include <immintrin.h>

#include <xnnpack/gemm.h>


$ISA = {0: "avx", 3: "fma3"}[FMA]
void xnn_f32_gemm${"inc" if INC else ""}_minmax_ukernel_${MR}x${NR}s4__${ISA}_broadcast(
    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 xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
{
  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};
      }

  do {
    $if INC:
      $for M in range(MR):
        $for N in range(0, NR, 8):
          __m256 vacc${M}x${ABC[N:N+8]} = _mm256_load_ps(acc + ${M*NR+N});
      acc += ${MR*NR};
    $else:
      $for N in range(0, NR, 8):
        __m256 vacc0x${ABC[N:N+8]} = _mm256_load_ps(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 += ${NR};

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

      $for L in range(4):

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

        $for N in range(0, NR, 8):
          $for M in range(MR):
            $if FMA == 3:
              vacc${M}x${ABC[N:N+8]} = _mm256_fmadd_ps(va${M}, vb${ABC[N:N+8]}c${L}, vacc${M}x${ABC[N:N+8]});
            $else:
              vacc${M}x${ABC[N:N+8]} = _mm256_add_ps(vacc${M}x${ABC[N:N+8]}, _mm256_mul_ps(va${M}, vb${ABC[N:N+8]}c${L}));

        $if L + 1 != 4:
          $for M in range(MR):
            va${M} = _mm256_permute_ps(va${M}, _MM_SHUFFLE(0, 3, 2, 1));

      w += ${4 * NR};
      k -= 4 * sizeof(float);
    }
    if XNN_UNLIKELY(k != 0) {
      $for M in range(MR):
        __m256 va${M} = _mm256_broadcast_ps((const __m128*) a${M});
        a${M} = (const float*) ((uintptr_t) a${M} + k);

      const __m256 vzero = _mm256_setzero_ps();
      $for L in range(4):

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

        $for N in range(0, NR, 8):
          $for M in range(MR):
            $if FMA == 3:
              vacc${M}x${ABC[N:N+8]} = _mm256_fmadd_ps(_mm256_and_ps(va${M}, _mm256_cmp_ps(vb${ABC[N:N+8]}c${L}, vzero, _CMP_NEQ_OQ)), vb${ABC[N:N+8]}c${L}, vacc${M}x${ABC[N:N+8]});
            $else:
              vacc${M}x${ABC[N:N+8]} = _mm256_add_ps(vacc${M}x${ABC[N:N+8]}, _mm256_mul_ps(_mm256_and_ps(va${M}, _mm256_cmp_ps(vb${ABC[N:N+8]}c${L}, vzero, _CMP_NEQ_OQ)), vb${ABC[N:N+8]}c${L}));

        $if L + 1 != 4:
          $for M in range(MR):
            va${M} = _mm256_permute_ps(va${M}, _MM_SHUFFLE(0, 3, 2, 1));

      w += ${4 * NR};
    }

    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)):
        _mm256_storeu_ps(c${M}, vacc${M}x${ABC[0:8]});
        $for N in range(8, NR, 8):
          _mm256_storeu_ps(c${M} + ${N}, vacc${M}x${ABC[N:N+8]});
        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 >= 3:
              $for M in reversed(range(MR)):
                _mm256_storeu_ps(c${M}, vacc${M}x${ABC[0:8]});
                $for N in range(8, 1 << LOG2N, 8):
                  _mm256_storeu_ps(c${M} + ${N}, vacc${M}x${ABC[N:N+8]});

              $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 == 2:
              $for M in reversed(range(MR)):
                _mm_storeu_ps(c${M}, vacc${M}x${ABC[0:4]});

              $for M in reversed(range(MR)):
                vacc${M}x${ABC[0:4]} = _mm256_extractf128_ps(vacc${M}x${ABC[0:8]}, 1);

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

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

              $for M in reversed(range(MR)):
                c${M} += 2;
            $elif LOG2N == 0:
              $for M in reversed(range(MR)):
                _mm_store_ss(c${M}, vacc${M}x${ABC[0:4]});
          }
        $if LOG2N == 3:
          $for M in reversed(range(MR)):
            __m128 vacc${M}x${ABC[0:4]} = _mm256_castps256_ps128(vacc${M}x${ABC[0:8]});

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