// 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", "MAX", "MIN", "MUL", "SUB", "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, y: "_mm_add_ps(%s, %s)" % (x, y),
$  "DIV": lambda x, y: "_mm_div_ps(%s, %s)" % (x, y),
$  "MAX": lambda x, y: "_mm_max_ps(%s, %s)" % (x, y),
$  "MIN": lambda x, y: "_mm_min_ps(%s, %s)" % (x, y),
$  "MUL": lambda x, y: "_mm_mul_ps(%s, %s)" % (x, y),
$  "SUB": lambda x, y: "_mm_sub_ps(%s, %s)" % (x, y),
$  "SQRDIFF": lambda x, y: "_mm_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__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);

  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};

    const __m128 vb${ABC[0:4]} = _mm_loadu_ps(b);
    $for N in range(4, BATCH_TILE, 4):
      const __m128 vb${ABC[N:N+4]} = _mm_loadu_ps(b + ${N});
    b += ${BATCH_TILE};

    $for N in range(0, BATCH_TILE, 4):
      __m128 vy${ABC[N:N+4]} = ${_MM_OP_PS("va" + ABC[N:N+4], "vb" + 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;

      const __m128 vb0123 = _mm_loadu_ps(b);
      b += 4;

      __m128 vy0123 = ${_MM_OP_PS("va0123", "vb0123")};
      $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);
    const __m128 vb0123 = _mm_loadu_ps(b);

    __m128 vy0123 = ${_MM_OP_PS("va0123", "vb0123")};
    $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);
    }
  }
}
