// 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 ROW_TILE >= 1
$assert ACCUMULATORS >= 1
#include <assert.h>

#include <arm_neon.h>

#include <xnnpack/dwconv.h>
#include <xnnpack/math.h>


void xnn_f16_dwconv2d_chw_ukernel_3x3s2p1__neonfp16arith_${ROW_TILE}x4${"_acc%d" % ACCUMULATORS if ACCUMULATORS > 1 else ""}(
    size_t input_height,
    size_t input_width,
    const void* input,
    const void* weights,
    const void* zero,
    void* output,
    uint32_t padding_top,
    const union xnn_f16_chw_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
{
  assert(input_height != 0);
  assert(input_width != 0);
  assert(input_width % sizeof(__fp16) == 0);
  assert(padding_top >= 0);
  assert(padding_top <= 1);

  const uint16x4_t vmask_even = vld1_u16(params->neonfp16arith.mask_even);
  const uint16x4_t vmask_odd  = vld1_u16(params->neonfp16arith.mask_odd);
  const float16x4_t vmax = vld1_dup_f16(&params->neonfp16arith.max);
  const float16x4_t vmin = vld1_dup_f16(&params->neonfp16arith.min);

  const __fp16* w0 = (const __fp16*)weights;
  const float16x8_t vw01234567 = vld1q_f16(w0);
  const float16x4_t vw89 = vreinterpret_f16_u32(vld1_lane_u32((const void*)(w0 + 8), vmov_n_u32(0), 0));

  const size_t input_decrement = round_down_po2(input_width, 4 /* SIMD output width */ * 2 /* subsampling */ * sizeof(__fp16));
  $if ROW_TILE > 1:
    const size_t output_width = round_down_po2((input_width + (2 /* padding */ - 3 /* kernel size */ + 2 /* subsampling */) * sizeof(__fp16)) / 2, sizeof(__fp16));

  const __fp16* i0 = (const __fp16*) ((uintptr_t) input - ((-padding_top) & input_width));
  const __fp16* i1 = (const __fp16*) ((uintptr_t) i0 + input_width);
  if XNN_UNPREDICTABLE(padding_top != 0) {
    i0 = zero;
  }
  $for M in range(2, 1 + 2 * ROW_TILE):
    const __fp16* i${M} = (const __fp16*) ((uintptr_t) i${M-1} + input_width);

  __fp16* o0 = output;
  $for M in range(1, ROW_TILE):
    __fp16* o${M} = (__fp16*) ((uintptr_t) o${M-1} + output_width);

  size_t padded_input_height = input_height + padding_top + 1 /* padding bottom */;
  size_t output_height = (padded_input_height - 3 /* kernel size */ + 2 /* subsampling */) / 2;
  do {
    $for M in range(2, 1 + 2 * ROW_TILE):
      if XNN_UNPREDICTABLE(padded_input_height < ${2 + M}) {
        i${M} = zero;
        $if M % 2 == 1:
          o${(M - 1) // 2} = o${(M - 1) // 2 - 1};
      }

    $for M in range(1 + 2 * ROW_TILE):
      float16x4_t vi${M}x1357 = vmov_n_f16(0);

    size_t w = input_width;
    for (; w >= 8 * sizeof(__fp16); w -= 8 * sizeof(__fp16)) {
      $for M in range(ROW_TILE):
        float16x4_t vo${M}p0 = vdup_laneq_f16(vw01234567, 0);

      $for M in range(1 + 2 * ROW_TILE):
        const float16x4x2_t vi${M}x8ACE9BDF = vld2_f16(i${M}); i${M} += 8;

      $for M in range(ROW_TILE):
        $if ACCUMULATORS > 1:
          float16x4_t vo${M}p1 = vmul_laneq_f16(vi${2*M}x8ACE9BDF.val[0], vw01234567, 2);
        $else:
          vo${M}p0 = vfma_laneq_f16(vo${M}p0, vi${2*M}x8ACE9BDF.val[0], vw01234567, 2);

      $for M in range(ROW_TILE):
        $if ACCUMULATORS > 2:
          float16x4_t vo${M}p2 = vmul_laneq_f16(vi${2*M+1}x8ACE9BDF.val[0], vw01234567, 5);
        $else:
          vo${M}p0 = vfma_laneq_f16(vo${M}p0, vi${2*M+1}x8ACE9BDF.val[0], vw01234567, 5);

      $for M in range(ROW_TILE):
        $if ACCUMULATORS > 3:
          float16x4_t vo${M}p3 = vmul_lane_f16(vi${2*M+2}x8ACE9BDF.val[0], vw89, 0);
        $else:
          vo${M}p${4 % ACCUMULATORS} = vfma_lane_f16(vo${M}p${4 % ACCUMULATORS}, vi${2*M+2}x8ACE9BDF.val[0], vw89, 0);

      $for M in range(1 + 2 * ROW_TILE):
        const float16x4_t vi${M}x7BDF = vext_f16(vi${M}x1357, vi${M}x8ACE9BDF.val[1], 3);
        vi${M}x1357 = vi${M}x8ACE9BDF.val[1];

      $for M in range(ROW_TILE):
        $if ACCUMULATORS > 4:
          float16x4_t vo${M}p4 = vmul_laneq_f16(vi${2*M}x7BDF, vw01234567, 1);
        $else:
          vo${M}p${5 % ACCUMULATORS} = vfma_laneq_f16(vo${M}p${5 % ACCUMULATORS}, vi${2*M}x7BDF, vw01234567, 1);

      $for M in range(ROW_TILE):
        $if ACCUMULATORS > 5:
          float16x4_t vo${M}p5 = vmul_laneq_f16(vi${2*M+1}x7BDF, vw01234567, 4);
        $else:
          vo${M}p${6 % ACCUMULATORS} = vfma_laneq_f16(vo${M}p${6 % ACCUMULATORS}, vi${2*M+1}x7BDF, vw01234567, 4);

      $for M in range(ROW_TILE):
        $if ACCUMULATORS > 6:
          float16x4_t vo${M}p6 = vmul_laneq_f16(vi${2*M+2}x7BDF, vw01234567, 5);
        $else:
          vo${M}p${7 % ACCUMULATORS} = vfma_laneq_f16(vo${M}p${7 % ACCUMULATORS}, vi${2*M+2}x7BDF, vw01234567, 7);

      $for M in range(ROW_TILE):
        vo${M}p${8 % ACCUMULATORS} = vfma_laneq_f16(vo${M}p${8 % ACCUMULATORS}, vi${2*M}x8ACE9BDF.val[1], vw01234567, 3);

      $for M in range(ROW_TILE):
        vo${M}p${9 % ACCUMULATORS} = vfma_laneq_f16(vo${M}p${9 % ACCUMULATORS}, vi${2*M+1}x8ACE9BDF.val[1], vw01234567, 6);

      $for M in range(ROW_TILE):
        vo${M}p${10 % ACCUMULATORS} = vfma_lane_f16(vo${M}p${10 % ACCUMULATORS}, vi${2*M+2}x8ACE9BDF.val[1], vw89, 1);

      $if ACCUMULATORS > 1:
        $ACC_SLICE = 1
        $while ACC_SLICE < ACCUMULATORS:
          $for A in range(0, ACCUMULATORS, ACC_SLICE * 2):
            $if A + ACC_SLICE < ACCUMULATORS:
              $for M in range(ROW_TILE):
                vo${M}p${A} = vadd_f16(vo${M}p${A}, vo${M}p${A + ACC_SLICE});
          $ACC_SLICE *= 2

      $for M in range(ROW_TILE):
        float16x4_t vo${M} = vmax_f16(vo${M}p0, vmin);

      $for M in range(ROW_TILE):
        vo${M} = vmin_f16(vo${M}, vmax);

      $for M in reversed(range(ROW_TILE)):
        vst1_f16(o${M}, vo${M}); o${M} += 4;
    }
    // Last block has 0-7 pixels to process.
    assert(w < 8 * sizeof(__fp16));
    if XNN_LIKELY(w != 0) {
      $for M in range(ROW_TILE):
        float16x4_t vo${M}p0 = vdup_laneq_f16(vw01234567, 0);

      $for M in range(1 + 2 * ROW_TILE):
        const float16x4x2_t vi${M}x8ACE9BDF = vld2_f16(i${M});

      $for M in range(1 + 2 * ROW_TILE):
        const float16x4_t vi${M}x8ACE = vreinterpret_f16_u16(vand_u16(vmask_even, vreinterpret_u16_f16(vi${M}x8ACE9BDF.val[0])));
        const float16x4_t vi${M}x9BDF = vreinterpret_f16_u16(vand_u16(vmask_odd,  vreinterpret_u16_f16(vi${M}x8ACE9BDF.val[1])));

      $for M in range(ROW_TILE):
        $if ACCUMULATORS > 1:
          float16x4_t vo${M}p1 = vmul_laneq_f16(vi${2*M}x8ACE, vw01234567, 2);
        $else:
          vo${M}p0 = vfma_laneq_f16(vo${M}p0, vi${2*M}x8ACE, vw01234567, 2);

      $for M in range(ROW_TILE):
        $if ACCUMULATORS > 2:
          float16x4_t vo${M}p2 = vmul_laneq_f16(vi${2*M+1}x8ACE, vw01234567, 5);
        $else:
          vo${M}p0 = vfma_laneq_f16(vo${M}p0, vi${2*M+1}x8ACE, vw01234567, 5);

      $for M in range(ROW_TILE):
        $if ACCUMULATORS > 3:
          float16x4_t vo${M}p3 = vmul_lane_f16(vi${2*M+2}x8ACE, vw89, 0);
        $else:
          vo${M}p${4 % ACCUMULATORS} = vfma_lane_f16(vo${M}p${4 % ACCUMULATORS}, vi${2*M+2}x8ACE, vw89, 0);

      $for M in range(1 + 2 * ROW_TILE):
        const float16x4_t vi${M}x7BDF = vext_f16(vi${M}x1357, vi${M}x9BDF, 3);

      $for M in range(ROW_TILE):
        $if ACCUMULATORS > 4:
          float16x4_t vo${M}p4 = vmul_laneq_f16(vi${2*M}x7BDF, vw01234567, 1);
        $else:
          vo${M}p${5 % ACCUMULATORS} = vfma_laneq_f16(vo${M}p${5 % ACCUMULATORS}, vi${2*M}x7BDF, vw01234567, 1);

      $for M in range(ROW_TILE):
        $if ACCUMULATORS > 5:
          float16x4_t vo${M}p5 = vmul_laneq_f16(vi${2*M+1}x7BDF, vw01234567, 4);
        $else:
          vo${M}p${6 % ACCUMULATORS} = vfma_laneq_f16(vo${M}p${6 % ACCUMULATORS}, vi${2*M+1}x7BDF, vw01234567, 4);

      $for M in range(ROW_TILE):
        $if ACCUMULATORS > 6:
          float16x4_t vo${M}p6 = vmul_laneq_f16(vi${2*M+2}x7BDF, vw01234567, 5);
        $else:
          vo${M}p${7 % ACCUMULATORS} = vfma_laneq_f16(vo${M}p${7 % ACCUMULATORS}, vi${2*M+2}x7BDF, vw01234567, 7);

      $for M in range(ROW_TILE):
        vo${M}p${8 % ACCUMULATORS} = vfma_laneq_f16(vo${M}p${8 % ACCUMULATORS}, vi${2*M}x9BDF, vw01234567, 3);

      $for M in range(ROW_TILE):
        vo${M}p${9 % ACCUMULATORS} = vfma_laneq_f16(vo${M}p${9 % ACCUMULATORS}, vi${2*M+1}x9BDF, vw01234567, 6);

      $for M in range(ROW_TILE):
        vo${M}p${10 % ACCUMULATORS} = vfma_lane_f16(vo${M}p${10 % ACCUMULATORS}, vi${2*M+2}x9BDF, vw89, 1);

      $if ACCUMULATORS > 1:
        $ACC_SLICE = 1
        $while ACC_SLICE < ACCUMULATORS:
          $for A in range(0, ACCUMULATORS, ACC_SLICE * 2):
            $if A + ACC_SLICE < ACCUMULATORS:
              $for M in range(ROW_TILE):
                vo${M}p${A} = vadd_f16(vo${M}p${A}, vo${M}p${A + ACC_SLICE});
          $ACC_SLICE *= 2

      $for M in range(ROW_TILE):
        float16x4_t vo${M} = vmax_f16(vo${M}p0, vmin);

      $for M in range(ROW_TILE):
        vo${M} = vmin_f16(vo${M}, vmax);

      w += 1 * sizeof(__fp16);

      if XNN_LIKELY(w == 8 * sizeof(__fp16)) {
        $for M in reversed(range(ROW_TILE)):
          vst1_f16(o${M}, vo${M}); o${M} += 4;
      } else {
        if (w & (4 * sizeof(__fp16))) {
          $for M in reversed(range(ROW_TILE)):
            vst1_lane_u32((void*) o${M}, vreinterpret_u32_f16(vo${M}), 0); o${M} += 2;

          $for M in range(ROW_TILE):
            vo${M} = vext_f16(vo${M}, vo${M}, 2);
        }
        if (w & (2 * sizeof(__fp16))) {
          $for M in reversed(range(ROW_TILE)):
            vst1_lane_f16(o${M}, vo${M}, 0); o${M} += 1;
        }
      }

    }

    i0 = (const __fp16*) ((uintptr_t) i${2 * ROW_TILE} - input_decrement);
    $for M in range(1, 1 + 2 * ROW_TILE):
      i${M} = (const __fp16*) ((uintptr_t) i${M-1} + input_width);

    $if ROW_TILE > 1:
      o0 = o${ROW_TILE - 1};
      $for M in range(1, ROW_TILE):
        o${M} = (__fp16*) ((uintptr_t) o${M-1} + output_width);

    $if ROW_TILE > 1:
      output_height = doz(output_height, ${ROW_TILE});
      padded_input_height = doz(padded_input_height, ${ROW_TILE * 2});
    $else:
      output_height -= 1;
      padded_input_height -= 2;
  } while (output_height != 0);
}
