// 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/igemm.h>
#include <xnnpack/intrinsics-polyfill.h>


void xnn_f32_igemm_ukernel_${MR}x${NR}__avx512f_broadcast(
    size_t mr,
    size_t nc,
    size_t kc,
    size_t ks,
    const float**restrict a,
    const float*restrict w,
    float*restrict c,
    size_t cm_stride,
    size_t cn_stride,
    size_t a_offset,
    const float* zero,
    const union xnn_f32_output_params params[restrict static 1])
{
  assert(mr != 0);
  assert(mr <= ${MR});
  assert(nc != 0);
  assert(kc != 0);
  assert(kc % sizeof(float) == 0);
  assert(ks != 0);
  assert(ks % (${MR} * sizeof(void*)) == 0);
  assert(a_offset % sizeof(float) == 0);
  assert(a != NULL);
  assert(w != NULL);
  assert(c != NULL);

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

  do {
    __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 p = ks;
    do {
      $for M in range(MR):
        const float* restrict a${M} = a[${M}];
        assert(a${M} != NULL);
        if XNN_UNPREDICTABLE(a${M} != zero) {
          a${M} = (const float*) ((uintptr_t) a${M} + a_offset);
        }
      a += ${MR};

      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 M in range(MR):
          $for N in range(0, NR, 16):
            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);
      p -= ${MR} * sizeof(void*);
    } while (p != 0);

    const __m512 vmax = _mm512_broadcast_f32x4(_mm_load_ps(params->sse.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);

    const __m512 vmin = _mm512_broadcast_f32x4(_mm_load_ps(params->sse.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);

    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);

      a = (const float**restrict) ((uintptr_t) a - ks);
      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);
}
