// 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 >= 1
$ABC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#include <assert.h>

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


$MIN_F32 = "__builtin_wasm_min_f32" if WASM else "math_min_f32"
$MAX_F32 = "__builtin_wasm_max_f32" if WASM else "math_max_f32"
void xnn_f32_vhswish_ukernel__${"wasm" if WASM else "scalar"}_x${BATCH_TILE}(
    size_t n,
    const float* x,
    float* y,
    const union xnn_f32_hswish_params params[restrict XNN_MIN_ELEMENTS(1)])
{
  assert(n != 0);
  assert(n % sizeof(float) == 0);

  const float vsixth = params->scalar.sixth;
  const float vthree = params->scalar.three;
  const float vsix = params->scalar.six;
  const float vzero = 0.0f;
  assert(vthree == 3.0f);
  assert(vsix == 6.0f);

  $if BATCH_TILE > 1:
    for (; n >= ${BATCH_TILE} * sizeof(float); n -= ${BATCH_TILE} * sizeof(float)) {
      $for N in range(BATCH_TILE):
        float vx${ABC[N]} = x[${N}];
      x += ${BATCH_TILE};

      $for N in range(BATCH_TILE):
        float vacc${ABC[N]} = vx${ABC[N]} + vthree;
        vx${ABC[N]} *= vsixth;

      $for N in range(BATCH_TILE):
        vacc${ABC[N]} = ${MAX_F32}(vacc${ABC[N]}, vzero);

      $for N in range(BATCH_TILE):
        vacc${ABC[N]} = ${MIN_F32}(vacc${ABC[N]}, vsix);

      $for N in range(BATCH_TILE):
        vacc${ABC[N]} *= vx${ABC[N]};

      $for N in range(BATCH_TILE):
        y[${N}] = vacc${ABC[N]};
      y += ${BATCH_TILE};
    }
    if XNN_UNLIKELY(n != 0) {
      $if BATCH_TILE > 2:
        do {
          float vx = *x++;
          float vacc = vx + vthree;
          vx *= vsixth;
          vacc = ${MAX_F32}(vacc, vzero);
          vacc = ${MIN_F32}(vacc, vsix);
          vacc *= vx;
          *y++ = vacc;
          n -= sizeof(float);
        } while (n != 0);
      $else:
        float vx = *x;
        float vacc = vx + vthree;
        vx *= vsixth;
        vacc = ${MAX_F32}(vacc, vzero);
        vacc = ${MIN_F32}(vacc, vsix);
        vacc *= vx;
        *y = vacc;
    }
  $else:
    for (; n >= sizeof(float); n -= sizeof(float)) {
      float vx = *x++;
      float vacc = vx + vthree;
      vx *= vsixth;
      vacc = ${MAX_F32}(vacc, vzero);
      vacc = ${MIN_F32}(vacc, vsix);
      vacc *= vx;
      *y++ = vacc;
    }
}
