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

#include <xmmintrin.h>

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


void xnn_f32_vhswish_ukernel__sse_x${BATCH_TILE}(
    size_t n,
    const float* x,
    float* y,
    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
{
  assert(n != 0);
  assert(n % sizeof(float) == 0);

  const __m128 vsixth = _mm_load_ps(params->sse.sixth);
  const __m128 vhalf = _mm_load_ps(params->sse.half);
  const __m128 vone = _mm_load_ps(params->sse.one);
  const __m128 vzero = _mm_setzero_ps();

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

    $for N in range(0, BATCH_TILE, 4):
      __m128 vacc${ABC[N:N+4]} = _mm_mul_ps(vx${ABC[N:N+4]}, vsixth);

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

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

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

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

    _mm_storeu_ps(y, vacc${ABC[0:4]});
    $for N in range(4, BATCH_TILE, 4):
      _mm_storeu_ps(y + ${N}, vacc${ABC[N:N+4]});
    y += ${BATCH_TILE};
  }
  $if BATCH_TILE > 4:
    for (; n >= 4 * sizeof(float); n -= 4 * sizeof(float)) {
      const __m128 vx0123 = _mm_loadu_ps(x);
      x += 4;
      __m128 vacc0123 = _mm_mul_ps(vx0123, vsixth);
      vacc0123 = _mm_add_ps(vacc0123, vhalf);
      vacc0123 = _mm_max_ps(vacc0123, vzero);
      vacc0123 = _mm_min_ps(vacc0123, vone);
      vacc0123 = _mm_mul_ps(vacc0123, vx0123);
      _mm_storeu_ps(y, vacc0123);
      y += 4;
    }
  if XNN_UNLIKELY(n != 0) {
    const __m128 vx0123 = _mm_loadu_ps(x);
    __m128 vacc0123 = _mm_mul_ps(vx0123, vsixth);
    vacc0123 = _mm_add_ps(vacc0123, vhalf);
    vacc0123 = _mm_max_ps(vacc0123, vzero);
    vacc0123 = _mm_min_ps(vacc0123, vone);
    vacc0123 = _mm_mul_ps(vacc0123, vx0123);

    if (n & (2 * sizeof(float))) {
      _mm_storel_pi((__m64*) y, vacc0123);
      vacc0123 = _mm_movehl_ps(vacc0123, vacc0123);
      y += 2;
    }
    if (n & (1 * sizeof(float))) {
      _mm_store_ss(y, vacc0123);
    }
  }
}
