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

#include <immintrin.h>

#include <xnnpack/common.h>
#include <xnnpack/intrinsics-polyfill.h>
#include <xnnpack/math.h>
#include <xnnpack/vunary.h>


$_MM_FROUND_TO_FLAG = {
$  "RNDNE": "_MM_FROUND_TO_NEAREST_INT",
$  "RNDZ": "_MM_FROUND_TO_ZERO",
$  "RNDU": "_MM_FROUND_TO_POS_INF",
$  "RNDD": "_MM_FROUND_TO_NEG_INF",
$}[OP]
void xnn_f32_v${OP.lower()}_ukernel__avx512f_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);

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

    $for N in range(0, BATCH_TILE, 16):
      const __m512 vy${ABC[N:N+16]} = _mm512_roundscale_ps(vx${ABC[N:N+16]}, ${_MM_FROUND_TO_FLAG});

    _mm512_storeu_ps(y, vy${ABC[0:16]});
    $for N in range(16, BATCH_TILE, 16):
      _mm512_storeu_ps(y + ${N}, vy${ABC[N:N+16]});
    y += ${BATCH_TILE};
  }
  $if BATCH_TILE > 16:
    for (; n >= 16 * sizeof(float); n -= 16 * sizeof(float)) {
      const __m512 vx = _mm512_loadu_ps(x);
      x += 16;

      const __m512 vy = _mm512_roundscale_ps(vx, ${_MM_FROUND_TO_FLAG});

      _mm512_storeu_ps(y, vy);
      y += 16;
    }
  if XNN_UNLIKELY(n != 0) {
    assert(n >= 1 * sizeof(float));
    assert(n <= 15 * sizeof(float));
    // Prepare mask for valid 32-bit elements (depends on n).
    n >>= 2 /* log2(sizeof(float)) */;
    const __mmask16 vmask = _cvtu32_mask16((uint16_t) ((uint32_t) (UINT32_C(1) << n) - UINT32_C(1)));

    const __m512 vx = _mm512_maskz_loadu_ps(vmask, x);
    const __m512 vy = _mm512_maskz_roundscale_ps(vmask, vx, ${_MM_FROUND_TO_FLAG});
    _mm512_mask_storeu_ps(y, vmask, vy);
  }
}
