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

#include <immintrin.h>

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


void xnn_f32_gemm${"inc" if INC else ""}_minmax_ukernel_${MR}x${NR}__avx512f_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)])
{
  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, 16):
          __m512 vacc${M}x${ABC[N:N+16]} = _mm512_load_ps(acc + ${M*NR+N});
      acc += ${MR*NR};
    $else:
      __m512 vacc0x${ABC[0:16]} = _mm512_load_ps(w);
      $for N in range(16, NR, 16):
        __m512 vacc0x${ABC[N:N+16]} = _mm512_load_ps(w + ${N});
      $for M in range(1, MR):
        $for N in range(0, NR, 16):
          __m512 vacc${M}x${ABC[N:N+16]} = vacc0x${ABC[N:N+16]};
      w += ${NR};

    size_t k = kc;
    do {
      const __m512 vb${ABC[0:16]} = _mm512_load_ps(w);
      $for N in range(16, NR, 16):
        const __m512 vb${ABC[N:N+16]} = _mm512_load_ps(w + ${N});
      w += ${NR};

      $for N in range(0, NR, 16):
        $for M in range(MR):
          vacc${M}x${ABC[N:N+16]} = _mm512_fmadd_ps(_mm512_set1_ps(*a${M}), vb${ABC[N:N+16]}, vacc${M}x${ABC[N:N+16]});

      $for M in range(MR):
        a${M} += 1;

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

    const __m512 vmin = _mm512_set1_ps(params->scalar.min);
    $for N in range(0, NR, 16):
      $for M in range(MR):
        vacc${M}x${ABC[N:N+16]} = _mm512_max_ps(vacc${M}x${ABC[N:N+16]}, vmin);

    const __m512 vmax = _mm512_set1_ps(params->scalar.max);
    $for N in range(0, NR, 16):
      $for M in range(MR):
        vacc${M}x${ABC[N:N+16]} = _mm512_min_ps(vacc${M}x${ABC[N:N+16]}, vmax);

    if XNN_LIKELY(nc >= ${NR}) {
      $for M in reversed(range(MR)):
        _mm512_storeu_ps(c${M}, vacc${M}x${ABC[0:16]});
        $for N in range(16, NR, 16):
          _mm512_storeu_ps(c${M} + ${N}, vacc${M}x${ABC[N:N+16]});
        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(4, NR.bit_length())):
        $if NR != 1 << LOG2N:
          if (nc & ${1 << LOG2N}) {
            $if LOG2N >= 4:
              $for M in reversed(range(MR)):
                _mm512_storeu_ps(c${M}, vacc${M}x${ABC[0:16]});
                $for N in range(16, 1 << LOG2N, 16):
                  _mm512_storeu_ps(c${M} + ${N}, vacc${M}x${ABC[N:N+16]});

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

              $for M in reversed(range(MR)):
                c${M} += ${1 << LOG2N};
          }
        $if LOG2N == 4:
          if (nc & 15) {
            // Prepare mask for valid 32-bit elements (depends on nc).
            const __mmask16 vmask = _cvtu32_mask16((uint16_t) ((uint32_t) (UINT32_C(1) << nc) - UINT32_C(1)));

            $for M in reversed(range(MR)):
              _mm512_mask_storeu_ps(c${M}, vmask, vacc${M}x${ABC[0:16]});
          }

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