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

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


$VOPQ_F32 = {
$  "ADD": lambda x, y: "vaddq_f32(%s, %s)" % (x, y),
$  "DIV": lambda x, y: "vdivq_f32(%s, %s)" % (x, y),
$  "MAX": lambda x, y: "vmaxq_f32(%s, %s)" % (x, y),
$  "MIN": lambda x, y: "vminq_f32(%s, %s)" % (x, y),
$  "MUL": lambda x, y: "vmulq_f32(%s, %s)" % (x, y),
$  "SUB": lambda x, y: "vsubq_f32(%s, %s)" % (x, y),
$  "SQRDIFF": lambda x, y: "vsubq_f32(%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__neon_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 float32x4_t vy_min = vld1q_dup_f32(&params->scalar.min);
    const float32x4_t vy_max = vld1q_dup_f32(&params->scalar.max);

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

    $for N in range(0, BATCH_TILE, 4):
      float32x4_t vy${ABC[N:N+4]} = ${VOPQ_F32("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]} = vmulq_f32(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]} = vmaxq_f32(vy${ABC[N:N+4]}, vy_min);

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

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

      float32x4_t vy0123 = ${VOPQ_F32("va0123", "vb0123")};
      $if OP == "SQRDIFF":
        vy0123 = vmulq_f32(vy0123, vy0123);
      $if ACTIVATION == "MINMAX":
        vy0123 = vmaxq_f32(vy0123, vy_min);
        vy0123 = vminq_f32(vy0123, vy_max);
      vst1q_f32(y, vy0123); y += 4;
    }
  if XNN_UNLIKELY(n != 0) {
    const float32x4_t va0123 = vld1q_f32(a);
    const float32x4_t vb0123 = vld1q_f32(b);

    float32x4_t vy0123 = ${VOPQ_F32("va0123", "vb0123")};
    $if OP == "SQRDIFF":
      vy0123 = vmulq_f32(vy0123, vy0123);
    $if ACTIVATION == "MINMAX":
      vy0123 = vmaxq_f32(vy0123, vy_min);
      vy0123 = vminq_f32(vy0123, vy_max);

    float32x2_t vy01 = vget_low_f32(vy0123);
    if (n & (2 * sizeof(float))) {
      vst1_f32(y, vy01); y += 2;
      vy01 = vget_high_f32(vy0123);
    }
    if (n & (1 * sizeof(float))) {
      vst1_lane_f32(y, vy01, 0);
    }
  }
}
