// 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"
#include <assert.h>

#include <immintrin.h>

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


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

$ISA = {0: "avx", 3: "fma3"}[FMA]
void xnn_f32_hswish_ukernel__${ISA}_x${BATCH_TILE}(
    size_t n,
    const float* x,
    float* y,
    const union xnn_f32_hswish_params params[restrict static 1])
{
  assert(n != 0);
  assert(n % sizeof(float) == 0);

  const __m256 vsixth = _mm256_broadcast_ps((const __m128*) params->sse.sixth);
  const __m256 vhalf = _mm256_broadcast_ps((const __m128*) params->sse.half);
  const __m256 vone = _mm256_broadcast_ps((const __m128*) params->sse.one);
  const __m256 vzero = _mm256_setzero_ps();

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

    $if FMA == 3:
      $for N in range(0, BATCH_TILE, 8):
        __m256 vacc${ABC[N:N+8]} = _mm256_fmadd_ps(vx${ABC[N:N+8]}, vsixth, vhalf);
    $else:
      $for N in range(0, BATCH_TILE, 8):
        __m256 vacc${ABC[N:N+8]} = _mm256_mul_ps(vx${ABC[N:N+8]}, vsixth);

      $for N in range(0, BATCH_TILE, 8):
        vacc${ABC[N:N+8]} = _mm256_add_ps(vacc${ABC[N:N+8]}, vhalf);

    $for N in range(0, BATCH_TILE, 8):
      vacc${ABC[N:N+8]} = _mm256_max_ps(vacc${ABC[N:N+8]}, vzero);

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

    $for N in range(0, BATCH_TILE, 8):
      vacc${ABC[N:N+8]} = _mm256_mul_ps(vacc${ABC[N:N+8]}, vx${ABC[N:N+8]});

    _mm256_storeu_ps(y, vacc${ABC[0:8]});
    $for N in range(8, BATCH_TILE, 8):
      _mm256_storeu_ps(y + ${N}, vacc${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;
      $if FMA == 3:
        __m256 vacc = _mm256_fmadd_ps(vx, vsixth, vhalf);
      $else:
        __m256 vacc = _mm256_mul_ps(vx, vsixth);
        vacc = _mm256_add_ps(vacc, vhalf);
      vacc = _mm256_max_ps(vacc, vzero);
      vacc = _mm256_min_ps(vacc, vone);
      vacc = _mm256_mul_ps(vacc, vx);
      _mm256_storeu_ps(y, vacc);
      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);
    $if FMA == 3:
      __m256 vacc = _mm256_fmadd_ps(vx, vsixth, vhalf);
    $else:
      __m256 vacc = _mm256_mul_ps(vx, vsixth);
      vacc = _mm256_add_ps(vacc, vhalf);
    vacc = _mm256_max_ps(vacc, vzero);
    vacc = _mm256_min_ps(vacc, vone);
    vacc = _mm256_mul_ps(vacc, vx);

    // _mm256_maskstore_ps(y, vmask, vacc) could be used here, but triggers msan failures (probably an msan bug).
    __m128 vacc_lo = _mm256_castps256_ps128(vacc);
    if (n & (4 * sizeof(float))) {
      _mm_storeu_ps(y, vacc_lo);
      vacc_lo = _mm256_extractf128_ps(vacc, 1);
      y += 4;
    }
    if (n & (2 * sizeof(float))) {
      _mm_storel_pi((__m64*) y, vacc_lo);
      vacc_lo = _mm_movehl_ps(vacc_lo, vacc_lo);
      y += 2;
    }
    if (n & (1 * sizeof(float))) {
      _mm_store_ss(y, vacc_lo);
    }
  }
}
