// 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 BATCH_TILE % 8 == 0
$assert BATCH_TILE >= 8
$ABC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
$assert OP in ["ADD", "DIV", "MAX", "MIN", "MUL", "SUB", "SQRDIFF"]
$assert ACTIVATION in ["LINEAR", "MINMAX"]
#include <assert.h>

#include <immintrin.h>

#include <xnnpack/common.h>
#include <xnnpack/vbinary.h>


$_MM256_OP_PS = {
$  "ADD": lambda x, y: "_mm256_add_ps(%s, %s)" % (x, y),
$  "DIV": lambda x, y: "_mm256_div_ps(%s, %s)" % (x, y),
$  "MAX": lambda x, y: "_mm256_max_ps(%s, %s)" % (x, y),
$  "MIN": lambda x, y: "_mm256_min_ps(%s, %s)" % (x, y),
$  "MUL": lambda x, y: "_mm256_mul_ps(%s, %s)" % (x, y),
$  "SUB": lambda x, y: "_mm256_sub_ps(%s, %s)" % (x, y),
$  "SQRDIFF": lambda x, y: "_mm256_sub_ps(%s, %s)" % (x, y),
$}[OP]
$SUFFIX = {"LINEAR": "", "MINMAX": "_minmax"}[ACTIVATION]
$PARAMS = {"LINEAR": "xnn_f32_default_params", "MINMAX": "xnn_f32_minmax_params"}[ACTIVATION]
void xnn_f32_v${OP.lower()}${SUFFIX}_ukernel__avx_x${BATCH_TILE}(
    size_t n,
    const float* a,
    const float* b,
    float* y,
    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)])
{
  assert(n != 0);
  assert(n % sizeof(float) == 0);
  assert(a != NULL);
  assert(b != NULL);
  assert(y != NULL);

  $if ACTIVATION == "MINMAX":
    const __m256 vy_min = _mm256_load_ps(params->avx.min);
    const __m256 vy_max = _mm256_load_ps(params->avx.max);

  for (; n >= ${BATCH_TILE} * sizeof(float); n -= ${BATCH_TILE} * sizeof(float)) {
    const __m256 va${ABC[0:8]} = _mm256_loadu_ps(a);
    $for N in range(8, BATCH_TILE, 8):
      const __m256 va${ABC[N:N+8]} = _mm256_loadu_ps(a + ${N});
    a += ${BATCH_TILE};

    const __m256 vb${ABC[0:8]} = _mm256_loadu_ps(b);
    $for N in range(8, BATCH_TILE, 8):
      const __m256 vb${ABC[N:N+8]} = _mm256_loadu_ps(b + ${N});
    b += ${BATCH_TILE};

    $for N in range(0, BATCH_TILE, 8):
      __m256 vy${ABC[N:N+8]} = ${_MM256_OP_PS("va" + ABC[N:N+8], "vb" + ABC[N:N+8])};

    $if OP == "SQRDIFF":
      $for N in range(0, BATCH_TILE, 8):
        vy${ABC[N:N+8]} = _mm256_mul_ps(vy${ABC[N:N+8]}, vy${ABC[N:N+8]});

    $if ACTIVATION == "MINMAX":
      $for N in range(0, BATCH_TILE, 8):
        vy${ABC[N:N+8]} = _mm256_max_ps(vy${ABC[N:N+8]}, vy_min);

      $for N in range(0, BATCH_TILE, 8):
        vy${ABC[N:N+8]} = _mm256_min_ps(vy${ABC[N:N+8]}, vy_max);

    _mm256_storeu_ps(y, vy${ABC[0:8]});
    $for N in range(8, BATCH_TILE, 8):
      _mm256_storeu_ps(y + ${N}, vy${ABC[N:N+8]});
    y += ${BATCH_TILE};
  }
  $if BATCH_TILE > 8:
    for (; n >= 8 * sizeof(float); n -= 8 * sizeof(float)) {
      const __m256 va = _mm256_loadu_ps(a);
      a += 8;

      const __m256 vb = _mm256_loadu_ps(b);
      b += 8;

      __m256 vy = ${_MM256_OP_PS("va", "vb")};
      $if OP == "SQRDIFF":
        vy = _mm256_mul_ps(vy, vy);
      $if ACTIVATION == "MINMAX":
        vy = _mm256_max_ps(vy, vy_min);
        vy = _mm256_min_ps(vy, vy_max);
      _mm256_storeu_ps(y, vy);
      y += 8;
    }
  if XNN_UNLIKELY(n != 0) {
    assert(n >= 1 * sizeof(float));
    assert(n <= 7 * sizeof(float));
    const __m256i vmask = _mm256_loadu_si256((const __m256i*) ((uintptr_t) &params->avx.mask_table[7] - n));

    const __m256 va = _mm256_maskload_ps(a, vmask);
    const __m256 vb = _mm256_maskload_ps(b, vmask);

    __m256 vy = ${_MM256_OP_PS("va", "vb")};
    $if OP == "SQRDIFF":
      vy = _mm256_mul_ps(vy, vy);
    $if ACTIVATION == "MINMAX":
      vy = _mm256_max_ps(vy, vy_min);
      vy = _mm256_min_ps(vy, vy_max);

    __m128 vy_lo = _mm256_castps256_ps128(vy);
    if (n & (4 * sizeof(float))) {
      _mm_storeu_ps(y, vy_lo);
      vy_lo = _mm256_extractf128_ps(vy, 1);
      y += 4;
    }
    if (n & (2 * sizeof(float))) {
      _mm_storel_pi((__m64*) y, vy_lo);
      vy_lo = _mm_movehl_ps(vy_lo, vy_lo);
      y += 2;
    }
    if (n & (1 * sizeof(float))) {
      _mm_store_ss(y, vy_lo);
    }
  }
}
