//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This file contains an AdvSIMD architecture optimised single-precision expf.
///
//===----------------------------------------------------------------------===//

#include "src/mathvec/expf.h"
#include "arm_neon.h"
#include "src/__support/common.h"
#include "src/__support/macros/attributes.h"
#include "src/__support/mathvec/expf_utils.h"
#include "src/mathvec/aarch64/common.h"
#include "src/mathvec/abi_prefix.h"

namespace LIBC_NAMESPACE_DECL {

struct expf_data {
  V2_SPLAT_TYPE(float64) shift, inv_ln2;
  double ln2_hi, ln2_lo;
  double c1, c3;
  V2_SPLAT_TYPE(float64) c0, c2;
  V4_SPLAT_TYPE(float32) range_val;
  V4_SPLAT_TYPE(uint32) inf;
  V2_SPLAT_TYPE(uint64) idx_mask;
  const uint64_t *mantissa;
};

static constexpr expf_data EXPF_DATA = {
    V2_SPLAT_INITIALIZER(0x1.800000000ffc0p+46), // shift
    V2_SPLAT_INITIALIZER(0x1.71547652b82fep+0),  // inv_ln2
    0x1.62e42fefa39efp-1,                        // ln2_hi
    0x1.abc9e3b39803fp-56,                       // ln2_lo
    0x1.55555555543c2p-3,                        // c1
    0x1.111126b4eff73p-7,                        // c3
    V2_SPLAT_INITIALIZER(0x1.fffffffffdbcep-2),  // c0
    V2_SPLAT_INITIALIZER(0x1.555573c64f2e3p-5),  // c2
    V4_SPLAT_INITIALIZER(0x1p+9),                // range_val
    V4_SPLAT_INITIALIZER(0x7f800000),            // inf
    V2_SPLAT_INITIALIZER(0x3f),                  // idx_mask
    mathvec::EXP_MANTISSA,                       // mantissa
};

LIBC_INLINE LIBC_VECTOR_PCS static float64x2_t
exp_lookup(uint64x2_t u, const expf_data &data) {
  // The low 6 bits of u index the 64 element mantissa table.
  uint64x2_t vidx_mask = MAKE_SPLAT_VECTOR(data.idx_mask, u64);
  uint64_t idx0 = vgetq_lane_u64(u & vidx_mask, 0);
  uint64_t idx1 = vgetq_lane_u64(u & vidx_mask, 1);

  uint64_t mant0 = data.mantissa[idx0];
  uint64_t mant1 = data.mantissa[idx1];

  uint64x2_t mantissa = vdupq_n_u64(mant0);
  mantissa = vsetq_lane_u64(mant1, mantissa, 1);

  // The next 11 bits, 16:6, holds the biased exponent for the result.
  // Shifting by 46 moves these bits up to the exponent field.
  uint64x2_t exponent = vshlq_n_u64(u, 46);
  uint64x2_t mask = vdupq_n_u64(0xfff0000000000000);
  uint64x2_t result = vbslq_u64(mask, exponent, mantissa);

  return vreinterpretq_f64_u64(result);
}

LIBC_INLINE LIBC_VECTOR_PCS static float64x2_t
inline_exp(float64x2_t x, const expf_data &data) {
  float64x2_t vshift = MAKE_SPLAT_VECTOR(data.shift, f64);
  float64x2_t vinv_ln2 = MAKE_SPLAT_VECTOR(data.inv_ln2, f64);
  float64x2_t z = vfmaq_f64(vshift, x, vinv_ln2);
  float64x2_t n = vsubq_f64(z, vshift);

  float64x2_t ln2 = vld1q_f64(&data.ln2_hi);

  float64x2_t r = x;
  r = vfmsq_laneq_f64(r, n, ln2, 0);
  r = vfmsq_laneq_f64(r, n, ln2, 1);

  float64x2_t coeffs = vld1q_f64(&data.c1);

  // poly(r) = exp(r) - 1 ~= r + c0*r^2 + c1*r^3 + c2*r^4 + c3*r^5
  float64x2_t r2 = r * r;
  float64x2_t vc0 = MAKE_SPLAT_VECTOR(data.c0, f64);
  float64x2_t vc2 = MAKE_SPLAT_VECTOR(data.c2, f64);
  float64x2_t p01 = vfmaq_laneq_f64(vc0, r, coeffs, 0);
  float64x2_t p23 = vfmaq_laneq_f64(vc2, r, coeffs, 1);
  float64x2_t p04 = vfmaq_f64(p01, r2, p23);
  float64x2_t y = vfmaq_f64(r, r2, p04);

  uint64x2_t u = vreinterpretq_u64_f64(z);
  float64x2_t s = exp_lookup(u, data);

  return vfmaq_f64(s, s, y);
}

LLVM_LIBC_FUNCTION(AdvSIMDFP32Vector, expf, (AdvSIMDFP32Vector x),
                   LIBC_VFABI_FLOAT_SYMBOL(expf)) {
  const expf_data &data = *PTR_BARRIER(&EXPF_DATA);

  // Splits into an upper and lower half for double-precision computation.
  float64x2_t x_d_lo = vcvt_f64_f32(vget_low_f32(x));
  float64x2_t x_d_hi = vcvt_high_f64_f32(x);

  // Compute the double precision exponential for the high and low halves.
  float64x2_t y_lo = inline_exp(x_d_lo, data);
  float64x2_t y_hi = inline_exp(x_d_hi, data);

  // Round to single precision, and recombine the results.
  float32x4_t ret = vcombine_f32(vcvt_f32_f64(y_lo), vcvt_f32_f64(y_hi));

  // Handle special cases for overflow and underflow.
  float32x4_t vrange_val = MAKE_SPLAT_VECTOR(data.range_val, f32);
  uint32x4_t special = vcagtq_f32(x, vrange_val);
  bool has_special = vmaxvq_u32(special) != 0;
  if (LIBC_UNLIKELY(has_special)) {
    uint32x4_t is_inf = vcgtzq_f32(x);
    uint32x4_t vinf = MAKE_SPLAT_VECTOR(data.inf, u32);
    uint32x4_t inf_or_zero = vandq_u32(is_inf, vinf);
    float32x4_t special_res = vreinterpretq_f32_u32(inf_or_zero);

    // Combine the results for normal and special cases and return.
    return vbslq_f32(special, special_res, ret);
  }

  return ret;
}

} // namespace LIBC_NAMESPACE_DECL
