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

#include <arm_neon.h>

#include <xnnpack/spmm.h>


void xnn_f32_spmm_minmax_ukernel_${MR}x${NR}__${"neonfma" if FMA else "neon"}_pipelined(
    size_t mc,
    size_t nc,
    const float*restrict input,
    const float*restrict weights,
    const int32_t*restrict widx_dmap,
    const uint32_t*restrict nidx_nnzmap,
    float*restrict output,
    size_t output_stride,
    const union xnn_f32_minmax_params params[restrict XNN_MIN_ELEMENTS(1)])
{
  assert(mc != 0);
  assert(mc % sizeof(float) == 0);
  assert(nc != 0);

  const float32x4_t vmin = vld1q_dup_f32(&params->scalar.min);
  const float32x4_t vmax = vld1q_dup_f32(&params->scalar.max);
  size_t output_decrement = output_stride * nc - ${MR} * sizeof(float);
  while XNN_LIKELY(mc >= ${MR} * sizeof(float)) {
    const float*restrict w = weights;
    const int32_t* dmap = widx_dmap;
    const uint32_t* nnzmap = nidx_nnzmap;
    float32x4_t vw = vld1q_dup_f32(w); w += 1;
    intptr_t diff = *dmap++;
    float32x4_t vi0123 = vld1q_f32(input);
    $for M in range(4, MR, 4):
      float32x4_t vi${ABC[M:M+4]} = vld1q_f32(input + ${M});
    size_t n = nc;
    do {
      uint32_t nnz = *nnzmap++;
      $for M in range(0, MR, 4):
        float32x4_t vacc${ABC[M:M+4]} = vw;
      vw = vld1q_dup_f32(w); w += 1;
      if XNN_LIKELY(nnz != 0) {
        do {
          $for M in range(0, MR, 4):
            vacc${ABC[M:M+4]} = vfmaq_f32(vacc${ABC[M:M+4]}, vi${ABC[M:M+4]}, vw);
          input = (const float*restrict) ((uintptr_t) input + (uintptr_t) diff);
          $for M in range(0, MR, 16):
            __builtin_prefetch(input + ${M+16});
          diff = *dmap++;
          vw = vld1q_dup_f32(w); w += 1;
          __builtin_prefetch(w + 32);
          vi0123 = vld1q_f32(input);
          $for M in range(4, MR, 4):
            vi${ABC[M:M+4]} = vld1q_f32(input + ${M});
        } while (--nnz != 0);
      }
      $for M in range(0, MR, 4):
        float32x4_t vout${ABC[M:M+4]} = vminq_f32(vacc${ABC[M:M+4]}, vmax);
      $for M in range(0, MR, 4):
        vout${ABC[M:M+4]} = vmaxq_f32(vout${ABC[M:M+4]}, vmin);
      vst1q_f32(output, vout0123);
      $for M in range(4, MR, 4):
        vst1q_f32(output + ${M}, vout${ABC[M:M+4]});
      output = (float*restrict) ((uintptr_t) output + output_stride);
    } while (--n != 0);
    output = (float*restrict) ((uintptr_t) output - output_decrement);
    input += ${MR};
    mc -= ${MR} * sizeof(float);
  }
  if XNN_UNLIKELY(mc != 0) {
    $for LOG2M in reversed(range((MR - 1).bit_length())):
      $SUBMR = 1 << LOG2M
      $if SUBMR * 2 >= MR:
        output_decrement += ${MR - SUBMR} * sizeof(float);
      $else:
        output_decrement += ${SUBMR} * sizeof(float);
      if (mc & (${SUBMR} * sizeof(float))) {
        const float*restrict w = weights;
        const int32_t* dmap = widx_dmap;
        const uint32_t* nnzmap = nidx_nnzmap;
        size_t n = nc;
        do {
          uint32_t nnz = *nnzmap++;
          $if SUBMR <= 2:
            float32x2_t vacc${ABC[0:SUBMR]} = vld1_dup_f32(w); w += 1;
          $else:
            float32x4_t vacc0123 = vld1q_dup_f32(w); w += 1;
          $for M in range(4, SUBMR, 4):
            float32x4_t vacc${ABC[M:M+4]} = vacc0123;
          if XNN_LIKELY(nnz != 0) {
            do {
              const intptr_t diff = *dmap++;
              $if SUBMR == 1:
                const float32x2_t vi0 = vld1_dup_f32(input);
              $elif SUBMR == 2:
                const float32x2_t vi01 = vld1_f32(input);
              $else:
                const float32x4_t vi0123 = vld1q_f32(input);
              $for M in range(4, SUBMR, 4):
                const float32x4_t vi${ABC[M:M+4]} = vld1q_f32(input + ${M});
              input = (const float*restrict) ((uintptr_t) input + (uintptr_t) diff);
              $for M in range(0, MR, 16):
                __builtin_prefetch(input + ${M+16});
              $if SUBMR <= 2:
                const float32x2_t vb = vld1_dup_f32(w); w += 1;
              $else:
                const float32x4_t vb = vld1q_dup_f32(w); w += 1;
              __builtin_prefetch(w + 32);
              $if SUBMR <= 2:
                vacc${ABC[0:SUBMR]} = vfma_f32(vacc${ABC[0:SUBMR]}, vi${ABC[0:SUBMR]}, vb);
              $else:
                $for M in range(0, SUBMR, 4):
                  vacc${ABC[M:M+4]} = vfmaq_f32(vacc${ABC[M:M+4]}, vi${ABC[M:M+4]}, vb);
            } while (--nnz != 0);
          }
          $if SUBMR <= 2:
            float32x2_t vout${ABC[0:SUBMR]} = vmin_f32(vacc${ABC[0:SUBMR]}, vget_low_f32(vmax));
            vout${ABC[0:SUBMR]} = vmax_f32(vout${ABC[0:SUBMR]}, vget_low_f32(vmin));
            $if SUBMR == 1:
              vst1_lane_f32(output, vout${ABC[0]}, 0);
            $else:
              vst1_f32(output, vout${ABC[0:SUBMR]});
          $else:
            $for M in range(0, SUBMR, 4):
              float32x4_t vout${ABC[M:M+4]} = vminq_f32(vacc${ABC[M:M+4]}, vmax);
            $for M in range(0, SUBMR, 4):
              vout${ABC[M:M+4]} = vmaxq_f32(vout${ABC[M:M+4]}, vmin);
            vst1q_f32(output, vout0123);
            $for M in range(4, SUBMR, 4):
              vst1q_f32(output + ${M}, vout${ABC[M:M+4]});
          output = (float*restrict) ((uintptr_t) output + output_stride);
        } while (--n != 0);
        output = (float*restrict) ((uintptr_t) output - output_decrement);
        input += ${SUBMR};
      }
  }
}
