// 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 <tmmintrin.h>

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


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

  const __m128 vmask = _mm_load_ps((const float*) params->sse.mask);
  const __m128 vmax = _mm_load_ps(params->sse.max);
  const __m128 vmin = _mm_load_ps(params->sse.min);

  const __m128 vbias = _mm_load1_ps(weights);
  const __m128 vk00 = _mm_load1_ps(weights + 1);
  const __m128 vk01 = _mm_load1_ps(weights + 2);
  const __m128 vk02 = _mm_load1_ps(weights + 3);
  const __m128 vk10 = _mm_load1_ps(weights + 4);
  const __m128 vk11 = _mm_load1_ps(weights + 5);
  const __m128 vk12 = _mm_load1_ps(weights + 6);
  const __m128 vk20 = _mm_load1_ps(weights + 7);
  const __m128 vk21 = _mm_load1_ps(weights + 8);
  const __m128 vk22 = _mm_load1_ps(weights + 9);

  const size_t input_decrement = round_up_po2(input_width, 4 * sizeof(float));

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

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

  size_t output_height = input_height;
  do {
    $for M in range(2, 2 + ROW_TILE):
      if XNN_UNPREDICTABLE(output_height < ${M}) {
        i${M} = zero;
        $if M <= ROW_TILE:
          o${M-1} = o${M-2};
      }

    $for M in range(2 + ROW_TILE):
      __m128 vi${M}x0123 = _mm_setzero_ps();

    $for M in range(2 + ROW_TILE):
      __m128 vi${M}x4567 = _mm_loadu_ps(i${M});
      i${M} += 4;

    size_t w = input_width;
    for (; w > 4 * sizeof(float); w -= 4 * sizeof(float)) {
      $for M in range(2 + ROW_TILE):
        const __m128 vi${M}x89AB = _mm_loadu_ps(i${M});
        i${M} += 4;

      $for K in range(3):
        $for M in range(ROW_TILE):
          $if K == 0:
            __m128 vo${M}p0 = _mm_add_ps(vbias, _mm_mul_ps(vi${M+K}x4567, vk${K}1));
          $elif K < ACCUMULATORS:
            __m128 vo${M}p${K} = _mm_mul_ps(vi${M+K}x4567, vk${K}1);
          $else:
            vo${M}p${K % ACCUMULATORS} = _mm_add_ps(vo${M}p${K % ACCUMULATORS}, _mm_mul_ps(vi${M+K}x4567, vk${K}1));

      $for M in range(2 + ROW_TILE):
        const __m128 vi${M}x3456 = _mm_castsi128_ps(_mm_alignr_epi8(_mm_castps_si128(vi${M}x4567), _mm_castps_si128(vi${M}x0123), 12));

      $for K in range(3):
        $for M in range(ROW_TILE):
          $if K+3 < ACCUMULATORS:
            __m128 vo${M}p${K+3} = _mm_mul_ps(vi${M+K}x3456, vk${K}0);
          $else:
            vo${M}p${(K+3) % ACCUMULATORS} = _mm_add_ps(vo${M}p${(K+3) % ACCUMULATORS}, _mm_mul_ps(vi${M+K}x3456, vk${K}0));

      $for M in range(2 + ROW_TILE):
        vi${M}x0123 = vi${M}x4567;

      $for M in range(2 + ROW_TILE):
        const __m128 vi${M}x5678 = _mm_castsi128_ps(_mm_alignr_epi8(_mm_castps_si128(vi${M}x89AB), _mm_castps_si128(vi${M}x4567), 4));

      $for K in range(3):
        $for M in range(ROW_TILE):
          vo${M}p${(K+6) % ACCUMULATORS} = _mm_add_ps(vo${M}p${(K+6) % ACCUMULATORS}, _mm_mul_ps(vi${M+K}x5678, vk${K}2));

      $for M in range(2 + ROW_TILE):
        vi${M}x4567 = vi${M}x89AB;

      $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} = _mm_add_ps(vo${M}p${A}, vo${M}p${A + ACC_SLICE});
          $ACC_SLICE *= 2

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

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

      $for M in reversed(range(ROW_TILE)):
        _mm_storeu_ps(o${M}, vo${M});
        o${M} += 4;
    }
    // Always process the last block of 1..4 pixels.
    assert(w >= 1 * sizeof(float));
    assert(w <= 4 * sizeof(float));
    {
      $for M in range(2 + ROW_TILE):
        vi${M}x4567 = _mm_and_ps(vmask, vi${M}x4567);

      $for K in range(3):
        $for M in range(ROW_TILE):
          $if K == 0:
            __m128 vo${M}p0 = _mm_add_ps(vbias, _mm_mul_ps(vi${M+K}x4567, vk${K}1));
          $elif K < ACCUMULATORS:
            __m128 vo${M}p${K} = _mm_mul_ps(vi${M+K}x4567, vk${K}1);
          $else:
            vo${M}p${K % ACCUMULATORS} = _mm_add_ps(vo${M}p${K % ACCUMULATORS}, _mm_mul_ps(vi${M+K}x4567, vk${K}1));

      $for M in range(2 + ROW_TILE):
        const __m128 vi${M}x3456 = _mm_castsi128_ps(_mm_alignr_epi8(_mm_castps_si128(vi${M}x4567), _mm_castps_si128(vi${M}x0123), 12));

      $for K in range(3):
        $for M in range(ROW_TILE):
          $if K+3 < ACCUMULATORS:
            __m128 vo${M}p${K+3} = _mm_mul_ps(vi${M+K}x3456, vk${K}0);
          $else:
            vo${M}p${(K+3) % ACCUMULATORS} = _mm_add_ps(vo${M}p${(K+3) % ACCUMULATORS}, _mm_mul_ps(vi${M+K}x3456, vk${K}0));

      const __m128i vzero = _mm_setzero_si128();
      $for M in range(2 + ROW_TILE):
        const __m128 vi${M}x5678 = _mm_castsi128_ps(_mm_alignr_epi8(vzero, _mm_castps_si128(vi${M}x4567), 4));

      $for K in range(3):
        $for M in range(ROW_TILE):
          vo${M}p${(K+6) % ACCUMULATORS} = _mm_add_ps(vo${M}p${(K+6) % ACCUMULATORS}, _mm_mul_ps(vi${M+K}x5678, vk${K}2));

      $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} = _mm_add_ps(vo${M}p${A}, vo${M}p${A + ACC_SLICE});
          $ACC_SLICE *= 2

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

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

      if XNN_LIKELY(w == 4 * sizeof(float)) {
        $for M in reversed(range(ROW_TILE)):
          _mm_storeu_ps(o${M}, vo${M});
          o${M} += 4;
      } else {
        if (w & (2 * sizeof(float))) {
          $for M in reversed(range(ROW_TILE)):
            _mm_storel_pi((__m64*) o${M}, vo${M});
            o${M} += 2;

          $for M in range(ROW_TILE):
            vo${M} = _mm_movehl_ps(vo${M}, vo${M});
        }
        if (w & (1 * sizeof(float))) {
          $for M in reversed(range(ROW_TILE)):
            _mm_store_ss(o${M}, vo${M});
            o${M} += 1;
        }
      }
    }

    i0 = (const float*) ((uintptr_t) i${ROW_TILE} - input_decrement);
    i1 = (const float*) ((uintptr_t) i${ROW_TILE+1} - input_decrement);
    $for M in range(2, 2 + ROW_TILE):
      i${M} = (const float*) ((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} = (float*) ((uintptr_t) o${M-1} + input_width);

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