// 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 >= 1
$ABC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
$assert OP in ["RNDNE", "RNDZ", "RNDU", "RNDD"]
#include <assert.h>
#include <math.h>

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


$OP_FUNC = {
$  "RNDNE": "nearbyintf",
$  "RNDZ": "truncf",
$  "RNDU": "ceilf",
$  "RNDD": "floorf",
$}[OP]
void xnn_f32_v${OP.lower()}_ukernel__scalar_libm_x${BATCH_TILE}(
    size_t n,
    const float* x,
    float* y,
    const union xnn_f32_rnd_params params[restrict XNN_MIN_ELEMENTS(1)])
{
  assert(n != 0);
  assert(n % sizeof(float) == 0);

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

      $for N in range(BATCH_TILE):
        const float vy${ABC[N]} = ${OP_FUNC}(vx${ABC[N]});

      $for N in range(BATCH_TILE):
        y[${N}] = vy${ABC[N]};
      y += ${BATCH_TILE};
    }
    if XNN_UNLIKELY(n != 0) {
      $if BATCH_TILE > 2:
        do {
          const float vx = *x++;
          const float vy = ${OP_FUNC}(vx);
          *y++ = vy;
          n -= sizeof(float);
        } while (n != 0);
      $else:
        const float vx = *x;
        const float vy = ${OP_FUNC}(vx);
        *y = vy;
    }
  $else:
    do {
      const float vx = *x++;
      const float vy = ${OP_FUNC}(vx);
      *y++ = vy;
      n -= sizeof(float);
    } while (n != 0);
}
