// 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 BATCH_TILE % 8 == 0
$assert BATCH_TILE >= 8
$ABC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
$assert OP in ["ABS", "NEG", "SQR"]
#include <assert.h>

#include <immintrin.h>

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


static const int32_t mask_table[14] = {-1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0};

$_MM256_OP_PS = {
$  "ABS": lambda x: "_mm256_and_ps(%s, vnonsign_mask)" % x,
$  "NEG": lambda x: "_mm256_xor_ps(%s, vsign_mask)" % x,
$  "SQR": lambda x: "_mm256_mul_ps(%s, %s)" % (x, x),
$}[OP]
$PARAMS = {
$  "ABS": "const union xnn_f32_abs_params params[restrict XNN_MIN_ELEMENTS(1)]",
$  "NEG": "const union xnn_f32_neg_params params[restrict XNN_MIN_ELEMENTS(1)]",
$  "SQR": "const void* params",
$}[OP]
void xnn_f32_v${OP.lower()}_ukernel__avx_x${BATCH_TILE}(
    size_t n,
    const float* x,
    float* y,
    ${PARAMS})
{
  assert(n != 0);
  assert(n % sizeof(float) == 0);
  assert(x != NULL);
  assert(y != NULL);

  $if OP == "ABS":
    const __m256 vnonsign_mask = _mm256_broadcast_ps((const __m128*) params->sse.nonsign_mask);
  $elif OP == "NEG":
    const __m256 vsign_mask = _mm256_broadcast_ps((const __m128*) params->sse.sign_mask);
  for (; n >= ${BATCH_TILE} * sizeof(float); n -= ${BATCH_TILE} * sizeof(float)) {
    const __m256 vx${ABC[0:8]} = _mm256_loadu_ps(x);
    $for N in range(8, BATCH_TILE, 8):
      const __m256 vx${ABC[N:N+8]} = _mm256_loadu_ps(x + ${N});
    x += ${BATCH_TILE};

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

    _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 vx = _mm256_loadu_ps(x);
      x += 8;
      const __m256 vy = ${_MM256_OP_PS("vx")};
      _mm256_storeu_ps(y, vy);
      y += 8;
    }
  if XNN_UNLIKELY(n != 0) {
    assert(n >= 1 * sizeof(float));
    assert(n <= 7 * sizeof(float));
    __m256i vmask = _mm256_loadu_si256((const __m256i*) ((uintptr_t) &mask_table[7] - n));

    const __m256 vx = _mm256_maskload_ps(x, vmask);
    const __m256 vy = ${_MM256_OP_PS("vx")};

    // _mm256_maskstore_ps(y, vmask, vy) could be used here, but triggers msan failures (probably an msan bug).
    __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);
    }
  }
}
