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

#include <xmmintrin.h>

#include <xnnpack/common.h>
#include <xnnpack/intrinsics-polyfill.h>
#include <xnnpack/vbinary.h>


$_MM_OP_PS = {
$  "ADD": lambda x: "_mm_add_ps(%s, vb)" % x,
$  "DIV": lambda x: "_mm_div_ps(%s, vb)" % x,
$  "RDIV": lambda x: "_mm_div_ps(vb, %s)" % x,
$  "MAX": lambda x: "_mm_max_ps(%s, vb)" % x,
$  "MIN": lambda x: "_mm_min_ps(%s, vb)" % x,
$  "MUL": lambda x: "_mm_mul_ps(%s, vb)" % x,
$  "SUB": lambda x: "_mm_sub_ps(%s, vb)" % x,
$  "RSUB": lambda x: "_mm_sub_ps(vb, %s)" % x,
$  "SQRDIFF": lambda x: "_mm_sub_ps(%s, vb)" % x,
$}[OP]
$SUFFIX = {"LINEAR": "", "MINMAX": "_minmax"}[ACTIVATION]
$PARAMS = {"LINEAR": "xnn_f32_default_params", "MINMAX": "xnn_f32_minmax_params"}[ACTIVATION]
void xnn_f32_v${OP.lower()}c${SUFFIX}_ukernel__sse_x${BATCH_TILE}(
    size_t n,
    const float* a,
    const float* b,
    float* y,
    const union ${PARAMS} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
{
  assert(n != 0);
  assert(n % sizeof(float) == 0);
  assert(a != NULL);
  assert(b != NULL);
  assert(y != NULL);

  $if ACTIVATION == "MINMAX":
    const __m128 vy_min = _mm_load_ps(params->sse.min);
    const __m128 vy_max = _mm_load_ps(params->sse.max);

  const __m128 vb = _mm_load1_ps(b);
  for (; n >= ${BATCH_TILE} * sizeof(float); n -= ${BATCH_TILE} * sizeof(float)) {
    const __m128 va${ABC[0:4]} = _mm_loadu_ps(a);
    $for N in range(4, BATCH_TILE, 4):
      const __m128 va${ABC[N:N+4]} = _mm_loadu_ps(a + ${N});
    a += ${BATCH_TILE};

    $for N in range(0, BATCH_TILE, 4):
      __m128 vy${ABC[N:N+4]} = ${_MM_OP_PS("va" + ABC[N:N+4])};

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

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

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

    _mm_storeu_ps(y, vy${ABC[0:4]});
    $for N in range(4, BATCH_TILE, 4):
      _mm_storeu_ps(y + ${N}, vy${ABC[N:N+4]});
    y += ${BATCH_TILE};
  }
  $if BATCH_TILE > 4:
    for (; n >= 4 * sizeof(float); n -= 4 * sizeof(float)) {
      const __m128 va0123 = _mm_loadu_ps(a);
      a += 4;

      __m128 vy0123 = ${_MM_OP_PS("va0123")};
      $if OP == "SQRDIFF":
        vy0123 = _mm_mul_ps(vy0123, vy0123);
      $if ACTIVATION == "MINMAX":
        vy0123 = _mm_max_ps(vy0123, vy_min);
        vy0123 = _mm_min_ps(vy0123, vy_max);
      _mm_storeu_ps(y, vy0123);
      y += 4;
    }
  if XNN_UNLIKELY(n != 0) {
    const __m128 va0123 = _mm_loadu_ps(a);

    __m128 vy0123 = ${_MM_OP_PS("va0123")};
    $if OP == "SQRDIFF":
      vy0123 = _mm_mul_ps(vy0123, vy0123);
    $if ACTIVATION == "MINMAX":
      vy0123 = _mm_max_ps(vy0123, vy_min);
      vy0123 = _mm_min_ps(vy0123, vy_max);
    if (n & (2 * sizeof(float))) {
      _mm_storel_pi((__m64*) y, vy0123);
      vy0123 = _mm_movehl_ps(vy0123, vy0123);
      y += 2;
    }
    if (n & (1 * sizeof(float))) {
      _mm_store_ss(y, vy0123);
    }
  }
}
