// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008-2015 Gael Guennebaud <gael.guennebaud@inria.fr>
// Copyright (C) 2008-2009 Benoit Jacob <jacob.benoit.1@gmail.com>
// Copyright (C) 2009 Kenneth Riddile <kfriddile@yahoo.com>
// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>
// Copyright (C) 2010 Thomas Capricelli <orzel@freehackers.org>
// Copyright (C) 2013 Pavel Holoborodko <pavel@holoborodko.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

/*****************************************************************************
*** Platform checks for aligned malloc functions                           ***
*****************************************************************************/

#ifndef EIGEN_MEMORY_H
#define EIGEN_MEMORY_H

#ifndef EIGEN_MALLOC_ALREADY_ALIGNED

// Try to determine automatically if malloc is already aligned.

// On 64-bit systems, glibc's malloc returns 16-byte-aligned pointers, see:
//   http://www.gnu.org/s/libc/manual/html_node/Aligned-Memory-Blocks.html
// This is true at least since glibc 2.8.
// This leaves the question how to detect 64-bit. According to this document,
//   http://gcc.fyxm.net/summit/2003/Porting%20to%2064%20bit.pdf
// page 114, "[The] LP64 model [...] is used by all 64-bit UNIX ports" so it's indeed
// quite safe, at least within the context of glibc, to equate 64-bit with LP64.
#if defined(__GLIBC__) && ((__GLIBC__ >= 2 && __GLIBC_MINOR__ >= 8) || __GLIBC__ > 2) && defined(__LP64__) && \
    !defined(__SANITIZE_ADDRESS__) && (EIGEN_DEFAULT_ALIGN_BYTES == 16)
#define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 1
#else
#define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 0
#endif

// FreeBSD 6 seems to have 16-byte aligned malloc
//   See http://svn.freebsd.org/viewvc/base/stable/6/lib/libc/stdlib/malloc.c?view=markup
// FreeBSD 7 seems to have 16-byte aligned malloc except on ARM and MIPS architectures
//   See http://svn.freebsd.org/viewvc/base/stable/7/lib/libc/stdlib/malloc.c?view=markup
#if defined(__FreeBSD__) && !(EIGEN_ARCH_ARM || EIGEN_ARCH_MIPS) && (EIGEN_DEFAULT_ALIGN_BYTES == 16)
#define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 1
#else
#define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 0
#endif

#if (EIGEN_OS_MAC && (EIGEN_DEFAULT_ALIGN_BYTES == 16)) || (EIGEN_OS_WIN64 && (EIGEN_DEFAULT_ALIGN_BYTES == 16)) || \
    EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED || EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED
#define EIGEN_MALLOC_ALREADY_ALIGNED 1
#else
#define EIGEN_MALLOC_ALREADY_ALIGNED 0
#endif

#endif

#ifndef EIGEN_MALLOC_CHECK_THREAD_LOCAL

// Check whether we can use the thread_local keyword to allow or disallow
// allocating memory with per-thread granularity, by means of the
// set_is_malloc_allowed() function.
#ifndef EIGEN_AVOID_THREAD_LOCAL

#if ((EIGEN_COMP_GNUC) || __has_feature(cxx_thread_local) || EIGEN_COMP_MSVC >= 1900) && \
    !defined(EIGEN_GPU_COMPILE_PHASE)
#define EIGEN_MALLOC_CHECK_THREAD_LOCAL thread_local
#else
#define EIGEN_MALLOC_CHECK_THREAD_LOCAL
#endif

#else  // EIGEN_AVOID_THREAD_LOCAL
#define EIGEN_MALLOC_CHECK_THREAD_LOCAL
#endif  // EIGEN_AVOID_THREAD_LOCAL

#endif

// IWYU pragma: private
#include "../InternalHeaderCheck.h"

namespace Eigen {

namespace internal {

/*****************************************************************************
*** Implementation of portable aligned versions of malloc/free/realloc     ***
*****************************************************************************/

#ifdef EIGEN_NO_MALLOC
EIGEN_DEVICE_FUNC inline void check_that_malloc_is_allowed() {
  eigen_assert(false && "heap allocation is forbidden (EIGEN_NO_MALLOC is defined)");
}
#elif defined EIGEN_RUNTIME_NO_MALLOC
EIGEN_DEVICE_FUNC inline bool is_malloc_allowed_impl(bool update, bool new_value = false) {
  EIGEN_MALLOC_CHECK_THREAD_LOCAL static bool value = true;
  if (update == 1) value = new_value;
  return value;
}
EIGEN_DEVICE_FUNC inline bool is_malloc_allowed() { return is_malloc_allowed_impl(false); }
EIGEN_DEVICE_FUNC inline bool set_is_malloc_allowed(bool new_value) { return is_malloc_allowed_impl(true, new_value); }
EIGEN_DEVICE_FUNC inline void check_that_malloc_is_allowed() {
  eigen_assert(is_malloc_allowed() &&
               "heap allocation is forbidden (EIGEN_RUNTIME_NO_MALLOC is defined and g_is_malloc_allowed is false)");
}
#else
EIGEN_DEVICE_FUNC inline void check_that_malloc_is_allowed() {}
#endif

EIGEN_DEVICE_FUNC inline void throw_std_bad_alloc() {
#ifdef EIGEN_EXCEPTIONS
  throw std::bad_alloc();
#else
  std::size_t huge = static_cast<std::size_t>(-1);
#if defined(EIGEN_HIPCC)
  //
  // calls to "::operator new" are to be treated as opaque function calls (i.e no inlining),
  // and as a consequence the code in the #else block triggers the hipcc warning :
  // "no overloaded function has restriction specifiers that are compatible with the ambient context"
  //
  // "throw_std_bad_alloc" has the EIGEN_DEVICE_FUNC attribute, so it seems that hipcc expects
  // the same on "operator new"
  // Reverting code back to the old version in this #if block for the hipcc compiler
  //
  new int[huge];
#else
  void* unused = ::operator new(huge);
  EIGEN_UNUSED_VARIABLE(unused);
#endif
#endif
}

/*****************************************************************************
*** Implementation of handmade aligned functions                           ***
*****************************************************************************/

/* ----- Hand made implementations of aligned malloc/free and realloc ----- */

/** \internal Like malloc, but the returned pointer is guaranteed to be aligned to `alignment`.
 * Fast, but wastes `alignment` additional bytes of memory. Does not throw any exception.
 */
EIGEN_DEVICE_FUNC inline void* handmade_aligned_malloc(std::size_t size,
                                                       std::size_t alignment = EIGEN_DEFAULT_ALIGN_BYTES) {
  eigen_assert(alignment >= sizeof(void*) && alignment <= 128 && (alignment & (alignment - 1)) == 0 &&
               "Alignment must be at least sizeof(void*), less than or equal to 128, and a power of 2");

  check_that_malloc_is_allowed();
  EIGEN_USING_STD(malloc)
  void* original = malloc(size + alignment);
  if (original == 0) return 0;
  uint8_t offset = static_cast<uint8_t>(alignment - (reinterpret_cast<std::size_t>(original) & (alignment - 1)));
  void* aligned = static_cast<void*>(static_cast<uint8_t*>(original) + offset);
  *(static_cast<uint8_t*>(aligned) - 1) = offset;
  return aligned;
}

/** \internal Frees memory allocated with handmade_aligned_malloc */
EIGEN_DEVICE_FUNC inline void handmade_aligned_free(void* ptr) {
  if (ptr != nullptr) {
    uint8_t offset = static_cast<uint8_t>(*(static_cast<uint8_t*>(ptr) - 1));
    void* original = static_cast<void*>(static_cast<uint8_t*>(ptr) - offset);

    check_that_malloc_is_allowed();
    EIGEN_USING_STD(free)
    free(original);
  }
}

/** \internal
 * \brief Reallocates aligned memory.
 * Since we know that our handmade version is based on std::malloc
 * we can use std::realloc to implement efficient reallocation.
 */
EIGEN_DEVICE_FUNC inline void* handmade_aligned_realloc(void* ptr, std::size_t new_size, std::size_t old_size,
                                                        std::size_t alignment = EIGEN_DEFAULT_ALIGN_BYTES) {
  if (ptr == nullptr) return handmade_aligned_malloc(new_size, alignment);
  uint8_t old_offset = *(static_cast<uint8_t*>(ptr) - 1);
  void* old_original = static_cast<uint8_t*>(ptr) - old_offset;

  check_that_malloc_is_allowed();
  EIGEN_USING_STD(realloc)
  void* original = realloc(old_original, new_size + alignment);
  if (original == nullptr) return nullptr;
  if (original == old_original) return ptr;
  uint8_t offset = static_cast<uint8_t>(alignment - (reinterpret_cast<std::size_t>(original) & (alignment - 1)));
  void* aligned = static_cast<void*>(static_cast<uint8_t*>(original) + offset);
  if (offset != old_offset) {
    const void* src = static_cast<const void*>(static_cast<uint8_t*>(original) + old_offset);
    std::size_t count = (std::min)(new_size, old_size);
    std::memmove(aligned, src, count);
  }
  *(static_cast<uint8_t*>(aligned) - 1) = offset;
  return aligned;
}

/** \internal Allocates \a size bytes. The returned pointer is guaranteed to have 16 or 32 bytes alignment depending on
 * the requirements. On allocation error, the returned pointer is null, and std::bad_alloc is thrown.
 */
EIGEN_DEVICE_FUNC inline void* aligned_malloc(std::size_t size) {
  if (size == 0) return nullptr;

  void* result;
#if (EIGEN_DEFAULT_ALIGN_BYTES == 0) || EIGEN_MALLOC_ALREADY_ALIGNED

  check_that_malloc_is_allowed();
  EIGEN_USING_STD(malloc)
  result = malloc(size);

#if EIGEN_DEFAULT_ALIGN_BYTES == 16
  eigen_assert((size < 16 || (std::size_t(result) % 16) == 0) &&
               "System's malloc returned an unaligned pointer. Compile with EIGEN_MALLOC_ALREADY_ALIGNED=0 to fallback "
               "to handmade aligned memory allocator.");
#endif
#else
  result = handmade_aligned_malloc(size);
#endif

  if (!result && size) throw_std_bad_alloc();

  return result;
}

/** \internal Frees memory allocated with aligned_malloc. */
EIGEN_DEVICE_FUNC inline void aligned_free(void* ptr) {
#if (EIGEN_DEFAULT_ALIGN_BYTES == 0) || EIGEN_MALLOC_ALREADY_ALIGNED

  if (ptr != nullptr) {
    check_that_malloc_is_allowed();
    EIGEN_USING_STD(free)
    free(ptr);
  }

#else
  handmade_aligned_free(ptr);
#endif
}

/**
 * \internal
 * \brief Reallocates an aligned block of memory.
 * \throws std::bad_alloc on allocation failure
 */
EIGEN_DEVICE_FUNC inline void* aligned_realloc(void* ptr, std::size_t new_size, std::size_t old_size) {
  if (ptr == nullptr) return aligned_malloc(new_size);
  if (old_size == new_size) return ptr;
  if (new_size == 0) {
    aligned_free(ptr);
    return nullptr;
  }

  void* result;
#if (EIGEN_DEFAULT_ALIGN_BYTES == 0) || EIGEN_MALLOC_ALREADY_ALIGNED
  EIGEN_UNUSED_VARIABLE(old_size)

  check_that_malloc_is_allowed();
  EIGEN_USING_STD(realloc)
  result = realloc(ptr, new_size);
#else
  result = handmade_aligned_realloc(ptr, new_size, old_size);
#endif

  if (!result && new_size) throw_std_bad_alloc();

  return result;
}

/*****************************************************************************
*** Implementation of conditionally aligned functions                      ***
*****************************************************************************/

/** \internal Allocates \a size bytes. If Align is true, then the returned ptr is 16-byte-aligned.
 * On allocation error, the returned pointer is null, and a std::bad_alloc is thrown.
 */
template <bool Align>
EIGEN_DEVICE_FUNC inline void* conditional_aligned_malloc(std::size_t size) {
  return aligned_malloc(size);
}

template <>
EIGEN_DEVICE_FUNC inline void* conditional_aligned_malloc<false>(std::size_t size) {
  if (size == 0) return nullptr;

  check_that_malloc_is_allowed();
  EIGEN_USING_STD(malloc)
  void* result = malloc(size);

  if (!result && size) throw_std_bad_alloc();
  return result;
}

/** \internal Frees memory allocated with conditional_aligned_malloc */
template <bool Align>
EIGEN_DEVICE_FUNC inline void conditional_aligned_free(void* ptr) {
  aligned_free(ptr);
}

template <>
EIGEN_DEVICE_FUNC inline void conditional_aligned_free<false>(void* ptr) {
  if (ptr != nullptr) {
    check_that_malloc_is_allowed();
    EIGEN_USING_STD(free)
    free(ptr);
  }
}

template <bool Align>
EIGEN_DEVICE_FUNC inline void* conditional_aligned_realloc(void* ptr, std::size_t new_size, std::size_t old_size) {
  return aligned_realloc(ptr, new_size, old_size);
}

template <>
EIGEN_DEVICE_FUNC inline void* conditional_aligned_realloc<false>(void* ptr, std::size_t new_size,
                                                                  std::size_t old_size) {
  if (ptr == nullptr) return conditional_aligned_malloc<false>(new_size);
  if (old_size == new_size) return ptr;
  if (new_size == 0) {
    conditional_aligned_free<false>(ptr);
    return nullptr;
  }

  check_that_malloc_is_allowed();
  EIGEN_USING_STD(realloc)
  return realloc(ptr, new_size);
}

/*****************************************************************************
*** Construction/destruction of array elements                             ***
*****************************************************************************/

/** \internal Destructs the elements of an array.
 * The \a size parameters tells on how many objects to call the destructor of T.
 */
template <typename T>
EIGEN_DEVICE_FUNC inline void destruct_elements_of_array(T* ptr, std::size_t size) {
  // always destruct an array starting from the end.
  if (ptr)
    while (size) ptr[--size].~T();
}

/** \internal Constructs the elements of an array.
 * The \a size parameter tells on how many objects to call the constructor of T.
 */
template <typename T>
EIGEN_DEVICE_FUNC inline T* default_construct_elements_of_array(T* ptr, std::size_t size) {
  std::size_t i = 0;
  EIGEN_TRY {
    for (i = 0; i < size; ++i) ::new (ptr + i) T;
  }
  EIGEN_CATCH(...) {
    destruct_elements_of_array(ptr, i);
    EIGEN_THROW;
  }
  return ptr;
}

/** \internal Copy-constructs the elements of an array.
 * The \a size parameter tells on how many objects to copy.
 */
template <typename T>
EIGEN_DEVICE_FUNC inline T* copy_construct_elements_of_array(T* ptr, const T* src, std::size_t size) {
  std::size_t i = 0;
  EIGEN_TRY {
    for (i = 0; i < size; ++i) ::new (ptr + i) T(*(src + i));
  }
  EIGEN_CATCH(...) {
    destruct_elements_of_array(ptr, i);
    EIGEN_THROW;
  }
  return ptr;
}

/** \internal Move-constructs the elements of an array.
 * The \a size parameter tells on how many objects to move.
 */
template <typename T>
EIGEN_DEVICE_FUNC inline T* move_construct_elements_of_array(T* ptr, T* src, std::size_t size) {
  std::size_t i = 0;
  EIGEN_TRY {
    for (i = 0; i < size; ++i) ::new (ptr + i) T(std::move(*(src + i)));
  }
  EIGEN_CATCH(...) {
    destruct_elements_of_array(ptr, i);
    EIGEN_THROW;
  }
  return ptr;
}

/*****************************************************************************
*** Implementation of aligned new/delete-like functions                    ***
*****************************************************************************/

template <typename T>
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void check_size_for_overflow(std::size_t size) {
  if (size > std::size_t(-1) / sizeof(T)) throw_std_bad_alloc();
}

/** \internal Allocates \a size objects of type T. The returned pointer is guaranteed to have 16 bytes alignment.
 * On allocation error, the returned pointer is undefined, but a std::bad_alloc is thrown.
 * The default constructor of T is called.
 */
template <typename T>
EIGEN_DEVICE_FUNC inline T* aligned_new(std::size_t size) {
  check_size_for_overflow<T>(size);
  T* result = static_cast<T*>(aligned_malloc(sizeof(T) * size));
  EIGEN_TRY { return default_construct_elements_of_array(result, size); }
  EIGEN_CATCH(...) {
    aligned_free(result);
    EIGEN_THROW;
  }
  return result;
}

template <typename T, bool Align>
EIGEN_DEVICE_FUNC inline T* conditional_aligned_new(std::size_t size) {
  check_size_for_overflow<T>(size);
  T* result = static_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T) * size));
  EIGEN_TRY { return default_construct_elements_of_array(result, size); }
  EIGEN_CATCH(...) {
    conditional_aligned_free<Align>(result);
    EIGEN_THROW;
  }
  return result;
}

/** \internal Deletes objects constructed with aligned_new
 * The \a size parameters tells on how many objects to call the destructor of T.
 */
template <typename T>
EIGEN_DEVICE_FUNC inline void aligned_delete(T* ptr, std::size_t size) {
  destruct_elements_of_array<T>(ptr, size);
  aligned_free(ptr);
}

/** \internal Deletes objects constructed with conditional_aligned_new
 * The \a size parameters tells on how many objects to call the destructor of T.
 */
template <typename T, bool Align>
EIGEN_DEVICE_FUNC inline void conditional_aligned_delete(T* ptr, std::size_t size) {
  destruct_elements_of_array<T>(ptr, size);
  conditional_aligned_free<Align>(ptr);
}

template <typename T, bool Align>
EIGEN_DEVICE_FUNC inline T* conditional_aligned_realloc_new(T* pts, std::size_t new_size, std::size_t old_size) {
  check_size_for_overflow<T>(new_size);
  check_size_for_overflow<T>(old_size);

  // If elements need to be explicitly initialized, we cannot simply realloc
  // (or memcpy) the memory block - each element needs to be reconstructed.
  // Otherwise, objects that contain internal pointers like mpfr or
  // AnnoyingScalar can be pointing to the wrong thing.
  T* result = static_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T) * new_size));
  EIGEN_TRY {
    // Move-construct initial elements.
    std::size_t copy_size = (std::min)(old_size, new_size);
    move_construct_elements_of_array(result, pts, copy_size);

    // Default-construct remaining elements.
    if (new_size > old_size) {
      default_construct_elements_of_array(result + copy_size, new_size - old_size);
    }

    // Delete old elements.
    conditional_aligned_delete<T, Align>(pts, old_size);
  }
  EIGEN_CATCH(...) {
    conditional_aligned_free<Align>(result);
    EIGEN_THROW;
  }

  return result;
}

template <typename T, bool Align>
EIGEN_DEVICE_FUNC inline T* conditional_aligned_new_auto(std::size_t size) {
  if (size == 0) return 0;  // short-cut. Also fixes Bug 884
  check_size_for_overflow<T>(size);
  T* result = static_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T) * size));
  if (NumTraits<T>::RequireInitialization) {
    EIGEN_TRY { default_construct_elements_of_array(result, size); }
    EIGEN_CATCH(...) {
      conditional_aligned_free<Align>(result);
      EIGEN_THROW;
    }
  }
  return result;
}

template <typename T, bool Align>
EIGEN_DEVICE_FUNC inline T* conditional_aligned_realloc_new_auto(T* pts, std::size_t new_size, std::size_t old_size) {
  if (NumTraits<T>::RequireInitialization) {
    return conditional_aligned_realloc_new<T, Align>(pts, new_size, old_size);
  }

  check_size_for_overflow<T>(new_size);
  check_size_for_overflow<T>(old_size);
  return static_cast<T*>(
      conditional_aligned_realloc<Align>(static_cast<void*>(pts), sizeof(T) * new_size, sizeof(T) * old_size));
}

template <typename T, bool Align>
EIGEN_DEVICE_FUNC inline void conditional_aligned_delete_auto(T* ptr, std::size_t size) {
  if (NumTraits<T>::RequireInitialization) destruct_elements_of_array<T>(ptr, size);
  conditional_aligned_free<Align>(ptr);
}

/****************************************************************************/

/** \internal Returns the index of the first element of the array that is well aligned with respect to the requested \a
 * Alignment.
 *
 * \tparam Alignment requested alignment in Bytes.
 * \param array the address of the start of the array
 * \param size the size of the array
 *
 * \note If no element of the array is well aligned or the requested alignment is not a multiple of a scalar,
 * the size of the array is returned. For example with SSE, the requested alignment is typically 16-bytes. If
 * packet size for the given scalar type is 1, then everything is considered well-aligned.
 *
 * \note Otherwise, if the Alignment is larger that the scalar size, we rely on the assumptions that sizeof(Scalar) is a
 * power of 2. On the other hand, we do not assume that the array address is a multiple of sizeof(Scalar), as that fails
 * for example with Scalar=double on certain 32-bit platforms, see bug #79.
 *
 * There is also the variant first_aligned(const MatrixBase&) defined in DenseCoeffsBase.h.
 * \sa first_default_aligned()
 */
template <int Alignment, typename Scalar, typename Index>
EIGEN_DEVICE_FUNC inline Index first_aligned(const Scalar* array, Index size) {
  const Index ScalarSize = sizeof(Scalar);
  const Index AlignmentSize = Alignment / ScalarSize;
  const Index AlignmentMask = AlignmentSize - 1;

  if (AlignmentSize <= 1) {
    // Either the requested alignment if smaller than a scalar, or it exactly match a 1 scalar
    // so that all elements of the array have the same alignment.
    return 0;
  } else if ((std::uintptr_t(array) & (sizeof(Scalar) - 1)) || (Alignment % ScalarSize) != 0) {
    // The array is not aligned to the size of a single scalar, or the requested alignment is not a multiple of the
    // scalar size. Consequently, no element of the array is well aligned.
    return size;
  } else {
    Index first = (AlignmentSize - (Index((std::uintptr_t(array) / sizeof(Scalar))) & AlignmentMask)) & AlignmentMask;
    return (first < size) ? first : size;
  }
}

/** \internal Returns the index of the first element of the array that is well aligned with respect the largest packet
 * requirement. \sa first_aligned(Scalar*,Index) and first_default_aligned(DenseBase<Derived>) */
template <typename Scalar, typename Index>
EIGEN_DEVICE_FUNC inline Index first_default_aligned(const Scalar* array, Index size) {
  typedef typename packet_traits<Scalar>::type DefaultPacketType;
  return first_aligned<unpacket_traits<DefaultPacketType>::alignment>(array, size);
}

/** \internal Returns the smallest integer multiple of \a base and greater or equal to \a size
 */
template <typename Index>
inline Index first_multiple(Index size, Index base) {
  return ((size + base - 1) / base) * base;
}

// std::copy is much slower than memcpy, so let's introduce a smart_copy which
// use memcpy on trivial types, i.e., on types that does not require an initialization ctor.
template <typename T, bool UseMemcpy>
struct smart_copy_helper;

template <typename T>
EIGEN_DEVICE_FUNC void smart_copy(const T* start, const T* end, T* target) {
  smart_copy_helper<T, !NumTraits<T>::RequireInitialization>::run(start, end, target);
}

template <typename T>
struct smart_copy_helper<T, true> {
  EIGEN_DEVICE_FUNC static inline void run(const T* start, const T* end, T* target) {
    std::intptr_t size = std::intptr_t(end) - std::intptr_t(start);
    if (size == 0) return;
    eigen_internal_assert(start != 0 && end != 0 && target != 0);
    EIGEN_USING_STD(memcpy)
    memcpy(target, start, size);
  }
};

template <typename T>
struct smart_copy_helper<T, false> {
  EIGEN_DEVICE_FUNC static inline void run(const T* start, const T* end, T* target) { std::copy(start, end, target); }
};

// intelligent memmove. falls back to std::memmove for POD types, uses std::copy otherwise.
template <typename T, bool UseMemmove>
struct smart_memmove_helper;

template <typename T>
void smart_memmove(const T* start, const T* end, T* target) {
  smart_memmove_helper<T, !NumTraits<T>::RequireInitialization>::run(start, end, target);
}

template <typename T>
struct smart_memmove_helper<T, true> {
  static inline void run(const T* start, const T* end, T* target) {
    std::intptr_t size = std::intptr_t(end) - std::intptr_t(start);
    if (size == 0) return;
    eigen_internal_assert(start != 0 && end != 0 && target != 0);
    std::memmove(target, start, size);
  }
};

template <typename T>
struct smart_memmove_helper<T, false> {
  static inline void run(const T* start, const T* end, T* target) {
    if (std::uintptr_t(target) < std::uintptr_t(start)) {
      std::copy(start, end, target);
    } else {
      std::ptrdiff_t count = (std::ptrdiff_t(end) - std::ptrdiff_t(start)) / sizeof(T);
      std::copy_backward(start, end, target + count);
    }
  }
};

template <typename T>
EIGEN_DEVICE_FUNC T* smart_move(T* start, T* end, T* target) {
  return std::move(start, end, target);
}

/*****************************************************************************
*** Implementation of runtime stack allocation (falling back to malloc)    ***
*****************************************************************************/

// you can overwrite Eigen's default behavior regarding alloca by defining EIGEN_ALLOCA
// to the appropriate stack allocation function
#if !defined EIGEN_ALLOCA && !defined EIGEN_GPU_COMPILE_PHASE
#if EIGEN_OS_LINUX || EIGEN_OS_MAC || (defined alloca)
#define EIGEN_ALLOCA alloca
#elif EIGEN_COMP_MSVC
#define EIGEN_ALLOCA _alloca
#endif
#endif

// With clang -Oz -mthumb, alloca changes the stack pointer in a way that is
// not allowed in Thumb2. -DEIGEN_STACK_ALLOCATION_LIMIT=0 doesn't work because
// the compiler still emits bad code because stack allocation checks use "<=".
// TODO: Eliminate after https://bugs.llvm.org/show_bug.cgi?id=23772
// is fixed.
#if defined(__clang__) && defined(__thumb__)
#undef EIGEN_ALLOCA
#endif

// This helper class construct the allocated memory, and takes care of destructing and freeing the handled data
// at destruction time. In practice this helper class is mainly useful to avoid memory leak in case of exceptions.
template <typename T>
class aligned_stack_memory_handler : noncopyable {
 public:
  /* Creates a stack_memory_handler responsible for the buffer \a ptr of size \a size.
   * Note that \a ptr can be 0 regardless of the other parameters.
   * This constructor takes care of constructing/initializing the elements of the buffer if required by the scalar type
   *T (see NumTraits<T>::RequireInitialization). In this case, the buffer elements will also be destructed when this
   *handler will be destructed. Finally, if \a dealloc is true, then the pointer \a ptr is freed.
   **/
  EIGEN_DEVICE_FUNC aligned_stack_memory_handler(T* ptr, std::size_t size, bool dealloc)
      : m_ptr(ptr), m_size(size), m_deallocate(dealloc) {
    if (NumTraits<T>::RequireInitialization && m_ptr) Eigen::internal::default_construct_elements_of_array(m_ptr, size);
  }
  EIGEN_DEVICE_FUNC ~aligned_stack_memory_handler() {
    if (NumTraits<T>::RequireInitialization && m_ptr) Eigen::internal::destruct_elements_of_array<T>(m_ptr, m_size);
    if (m_deallocate) Eigen::internal::aligned_free(m_ptr);
  }

 protected:
  T* m_ptr;
  std::size_t m_size;
  bool m_deallocate;
};

#ifdef EIGEN_ALLOCA

template <typename Xpr, int NbEvaluations,
          bool MapExternalBuffer = nested_eval<Xpr, NbEvaluations>::Evaluate && Xpr::MaxSizeAtCompileTime == Dynamic>
struct local_nested_eval_wrapper {
  static constexpr bool NeedExternalBuffer = false;
  typedef typename Xpr::Scalar Scalar;
  typedef typename nested_eval<Xpr, NbEvaluations>::type ObjectType;
  ObjectType object;

  EIGEN_DEVICE_FUNC local_nested_eval_wrapper(const Xpr& xpr, Scalar* ptr) : object(xpr) {
    EIGEN_UNUSED_VARIABLE(ptr);
    eigen_internal_assert(ptr == 0);
  }
};

template <typename Xpr, int NbEvaluations>
struct local_nested_eval_wrapper<Xpr, NbEvaluations, true> {
  static constexpr bool NeedExternalBuffer = true;
  typedef typename Xpr::Scalar Scalar;
  typedef typename plain_object_eval<Xpr>::type PlainObject;
  typedef Map<PlainObject, EIGEN_DEFAULT_ALIGN_BYTES> ObjectType;
  ObjectType object;

  EIGEN_DEVICE_FUNC local_nested_eval_wrapper(const Xpr& xpr, Scalar* ptr)
      : object(ptr == 0 ? reinterpret_cast<Scalar*>(Eigen::internal::aligned_malloc(sizeof(Scalar) * xpr.size())) : ptr,
               xpr.rows(), xpr.cols()),
        m_deallocate(ptr == 0) {
    if (NumTraits<Scalar>::RequireInitialization && object.data())
      Eigen::internal::default_construct_elements_of_array(object.data(), object.size());
    object = xpr;
  }

  EIGEN_DEVICE_FUNC ~local_nested_eval_wrapper() {
    if (NumTraits<Scalar>::RequireInitialization && object.data())
      Eigen::internal::destruct_elements_of_array(object.data(), object.size());
    if (m_deallocate) Eigen::internal::aligned_free(object.data());
  }

 private:
  bool m_deallocate;
};

#endif  // EIGEN_ALLOCA

template <typename T>
class scoped_array : noncopyable {
  T* m_ptr;

 public:
  explicit scoped_array(std::ptrdiff_t size) { m_ptr = new T[size]; }
  ~scoped_array() { delete[] m_ptr; }
  T& operator[](std::ptrdiff_t i) { return m_ptr[i]; }
  const T& operator[](std::ptrdiff_t i) const { return m_ptr[i]; }
  T*& ptr() { return m_ptr; }
  const T* ptr() const { return m_ptr; }
  operator const T*() const { return m_ptr; }
};

template <typename T>
void swap(scoped_array<T>& a, scoped_array<T>& b) {
  std::swap(a.ptr(), b.ptr());
}

}  // end namespace internal

/** \internal
 *
 * The macro ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) declares, allocates,
 * and construct an aligned buffer named NAME of SIZE elements of type TYPE on the stack
 * if the size in bytes is smaller than EIGEN_STACK_ALLOCATION_LIMIT, and if stack allocation is supported by the
 * platform (currently, this is Linux, OSX and Visual Studio only). Otherwise the memory is allocated on the heap. The
 * allocated buffer is automatically deleted when exiting the scope of this declaration. If BUFFER is non null, then the
 * declared variable is simply an alias for BUFFER, and no allocation/deletion occurs. Here is an example: \code
 * {
 *   ei_declare_aligned_stack_constructed_variable(float,data,size,0);
 *   // use data[0] to data[size-1]
 * }
 * \endcode
 * The underlying stack allocation function can controlled with the EIGEN_ALLOCA preprocessor token.
 *
 * The macro ei_declare_local_nested_eval(XPR_T,XPR,N,NAME) is analogue to
 * \code
 *   typename internal::nested_eval<XPRT_T,N>::type NAME(XPR);
 * \endcode
 * with the advantage of using aligned stack allocation even if the maximal size of XPR at compile time is unknown.
 * This is accomplished through alloca if this later is supported and if the required number of bytes
 * is below EIGEN_STACK_ALLOCATION_LIMIT.
 */
#ifdef EIGEN_ALLOCA

#if EIGEN_DEFAULT_ALIGN_BYTES > 0
   // We always manually re-align the result of EIGEN_ALLOCA.
// If alloca is already aligned, the compiler should be smart enough to optimize away the re-alignment.
#define EIGEN_ALIGNED_ALLOCA(SIZE)                                                                           \
  reinterpret_cast<void*>(                                                                                   \
      (std::uintptr_t(EIGEN_ALLOCA(SIZE + EIGEN_DEFAULT_ALIGN_BYTES - 1)) + EIGEN_DEFAULT_ALIGN_BYTES - 1) & \
      ~(std::size_t(EIGEN_DEFAULT_ALIGN_BYTES - 1)))
#else
#define EIGEN_ALIGNED_ALLOCA(SIZE) EIGEN_ALLOCA(SIZE)
#endif

#define ei_declare_aligned_stack_constructed_variable(TYPE, NAME, SIZE, BUFFER)                                     \
  Eigen::internal::check_size_for_overflow<TYPE>(SIZE);                                                             \
  TYPE* NAME = (BUFFER) != 0 ? (BUFFER)                                                                             \
                             : reinterpret_cast<TYPE*>((sizeof(TYPE) * SIZE <= EIGEN_STACK_ALLOCATION_LIMIT)        \
                                                           ? EIGEN_ALIGNED_ALLOCA(sizeof(TYPE) * SIZE)              \
                                                           : Eigen::internal::aligned_malloc(sizeof(TYPE) * SIZE)); \
  Eigen::internal::aligned_stack_memory_handler<TYPE> EIGEN_CAT(NAME, _stack_memory_destructor)(                    \
      (BUFFER) == 0 ? NAME : 0, SIZE, sizeof(TYPE) * SIZE > EIGEN_STACK_ALLOCATION_LIMIT)

#define ei_declare_local_nested_eval(XPR_T, XPR, N, NAME)                                        \
  Eigen::internal::local_nested_eval_wrapper<XPR_T, N> EIGEN_CAT(NAME, _wrapper)(                \
      XPR, reinterpret_cast<typename XPR_T::Scalar*>(                                            \
               ((Eigen::internal::local_nested_eval_wrapper<XPR_T, N>::NeedExternalBuffer) &&    \
                ((sizeof(typename XPR_T::Scalar) * XPR.size()) <= EIGEN_STACK_ALLOCATION_LIMIT)) \
                   ? EIGEN_ALIGNED_ALLOCA(sizeof(typename XPR_T::Scalar) * XPR.size())           \
                   : 0));                                                                        \
  typename Eigen::internal::local_nested_eval_wrapper<XPR_T, N>::ObjectType NAME(EIGEN_CAT(NAME, _wrapper).object)

#else

#define ei_declare_aligned_stack_constructed_variable(TYPE, NAME, SIZE, BUFFER)                                        \
  Eigen::internal::check_size_for_overflow<TYPE>(SIZE);                                                                \
  TYPE* NAME = (BUFFER) != 0 ? BUFFER : reinterpret_cast<TYPE*>(Eigen::internal::aligned_malloc(sizeof(TYPE) * SIZE)); \
  Eigen::internal::aligned_stack_memory_handler<TYPE> EIGEN_CAT(NAME, _stack_memory_destructor)(                       \
      (BUFFER) == 0 ? NAME : 0, SIZE, true)

#define ei_declare_local_nested_eval(XPR_T, XPR, N, NAME) \
  typename Eigen::internal::nested_eval<XPR_T, N>::type NAME(XPR)

#endif

/*****************************************************************************
*** Implementation of EIGEN_MAKE_ALIGNED_OPERATOR_NEW [_IF]                ***
*****************************************************************************/

#if EIGEN_HAS_CXX17_OVERALIGN

// C++17 -> no need to bother about alignment anymore :)

#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign)
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar, Size)

#else

// HIP does not support new/delete on device.
#if EIGEN_MAX_ALIGN_BYTES != 0 && !defined(EIGEN_HIP_DEVICE_COMPILE)
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign)                                    \
  EIGEN_DEVICE_FUNC void* operator new(std::size_t size, const std::nothrow_t&) EIGEN_NO_THROW { \
    EIGEN_TRY { return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); }        \
    EIGEN_CATCH(...) { return 0; }                                                               \
  }
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)                                                             \
  EIGEN_DEVICE_FUNC void* operator new(std::size_t size) {                                                           \
    return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size);                                          \
  }                                                                                                                  \
  EIGEN_DEVICE_FUNC void* operator new[](std::size_t size) {                                                         \
    return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size);                                          \
  }                                                                                                                  \
  EIGEN_DEVICE_FUNC void operator delete(void* ptr) EIGEN_NO_THROW {                                                 \
    Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr);                                                    \
  }                                                                                                                  \
  EIGEN_DEVICE_FUNC void operator delete[](void* ptr) EIGEN_NO_THROW {                                               \
    Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr);                                                    \
  }                                                                                                                  \
  EIGEN_DEVICE_FUNC void operator delete(void* ptr, std::size_t /* sz */) EIGEN_NO_THROW {                           \
    Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr);                                                    \
  }                                                                                                                  \
  EIGEN_DEVICE_FUNC void operator delete[](void* ptr, std::size_t /* sz */) EIGEN_NO_THROW {                         \
    Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr);                                                    \
  }                                                                                                                  \
  /* in-place new and delete. since (at least afaik) there is no actual   */                                         \
  /* memory allocated we can safely let the default implementation handle */                                         \
  /* this particular case. */                                                                                        \
  EIGEN_DEVICE_FUNC static void* operator new(std::size_t size, void* ptr) { return ::operator new(size, ptr); }     \
  EIGEN_DEVICE_FUNC static void* operator new[](std::size_t size, void* ptr) { return ::operator new[](size, ptr); } \
  EIGEN_DEVICE_FUNC void operator delete(void* memory, void* ptr) EIGEN_NO_THROW {                                   \
    return ::operator delete(memory, ptr);                                                                           \
  }                                                                                                                  \
  EIGEN_DEVICE_FUNC void operator delete[](void* memory, void* ptr) EIGEN_NO_THROW {                                 \
    return ::operator delete[](memory, ptr);                                                                         \
  }                                                                                                                  \
  /* nothrow-new (returns zero instead of std::bad_alloc) */                                                         \
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign)                                                              \
  EIGEN_DEVICE_FUNC void operator delete(void* ptr, const std::nothrow_t&) EIGEN_NO_THROW {                          \
    Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr);                                                    \
  }                                                                                                                  \
  typedef void eigen_aligned_operator_new_marker_type;
#else
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
#endif

#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(true)
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar, Size)                                 \
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(                                                                            \
      bool(((Size) != Eigen::Dynamic) &&                                                                         \
           (((EIGEN_MAX_ALIGN_BYTES >= 16) && ((sizeof(Scalar) * (Size)) % (EIGEN_MAX_ALIGN_BYTES) == 0)) ||     \
            ((EIGEN_MAX_ALIGN_BYTES >= 32) && ((sizeof(Scalar) * (Size)) % (EIGEN_MAX_ALIGN_BYTES / 2) == 0)) || \
            ((EIGEN_MAX_ALIGN_BYTES >= 64) && ((sizeof(Scalar) * (Size)) % (EIGEN_MAX_ALIGN_BYTES / 4) == 0)))))

#endif

/****************************************************************************/

/** \class aligned_allocator
 * \ingroup Core_Module
 *
 * \brief STL compatible allocator to use with types requiring a non-standard alignment.
 *
 * The memory is aligned as for dynamically aligned matrix/array types such as MatrixXd.
 * By default, it will thus provide at least 16 bytes alignment and more in following cases:
 *  - 32 bytes alignment if AVX is enabled.
 *  - 64 bytes alignment if AVX512 is enabled.
 *
 * This can be controlled using the \c EIGEN_MAX_ALIGN_BYTES macro as documented
 * \link TopicPreprocessorDirectivesPerformance there \endlink.
 *
 * Example:
 * \code
 * // Matrix4f requires 16 bytes alignment:
 * std::map< int, Matrix4f, std::less<int>,
 *           aligned_allocator<std::pair<const int, Matrix4f> > > my_map_mat4;
 * // Vector3f does not require 16 bytes alignment, no need to use Eigen's allocator:
 * std::map< int, Vector3f > my_map_vec3;
 * \endcode
 *
 * \sa \blank \ref TopicStlContainers.
 */
template <class T>
class aligned_allocator : public std::allocator<T> {
 public:
  typedef std::size_t size_type;
  typedef std::ptrdiff_t difference_type;
  typedef T* pointer;
  typedef const T* const_pointer;
  typedef T& reference;
  typedef const T& const_reference;
  typedef T value_type;

  template <class U>
  struct rebind {
    typedef aligned_allocator<U> other;
  };

  aligned_allocator() : std::allocator<T>() {}

  aligned_allocator(const aligned_allocator& other) : std::allocator<T>(other) {}

  template <class U>
  aligned_allocator(const aligned_allocator<U>& other) : std::allocator<T>(other) {}

  ~aligned_allocator() {}

#if EIGEN_COMP_GNUC_STRICT && EIGEN_GNUC_STRICT_AT_LEAST(7, 0, 0)
  // In gcc std::allocator::max_size() is bugged making gcc triggers a warning:
  // eigen/Eigen/src/Core/util/Memory.h:189:12: warning: argument 1 value '18446744073709551612' exceeds maximum object
  // size 9223372036854775807 See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87544
  size_type max_size() const { return (std::numeric_limits<std::ptrdiff_t>::max)() / sizeof(T); }
#endif

  pointer allocate(size_type num, const void* /*hint*/ = 0) {
    internal::check_size_for_overflow<T>(num);
    return static_cast<pointer>(internal::aligned_malloc(num * sizeof(T)));
  }

  void deallocate(pointer p, size_type /*num*/) { internal::aligned_free(p); }
};

//---------- Cache sizes ----------

#if !defined(EIGEN_NO_CPUID)
#if EIGEN_COMP_GNUC && EIGEN_ARCH_i386_OR_x86_64
#if defined(__PIC__) && EIGEN_ARCH_i386
// Case for x86 with PIC
#define EIGEN_CPUID(abcd, func, id)                                                  \
  __asm__ __volatile__("xchgl %%ebx, %k1;cpuid; xchgl %%ebx,%k1"                     \
                       : "=a"(abcd[0]), "=&r"(abcd[1]), "=c"(abcd[2]), "=d"(abcd[3]) \
                       : "a"(func), "c"(id));
#elif defined(__PIC__) && EIGEN_ARCH_x86_64
// Case for x64 with PIC. In theory this is only a problem with recent gcc and with medium or large code model, not with
// the default small code model. However, we cannot detect which code model is used, and the xchg overhead is negligible
// anyway.
#define EIGEN_CPUID(abcd, func, id)                                                  \
  __asm__ __volatile__("xchg{q}\t{%%}rbx, %q1; cpuid; xchg{q}\t{%%}rbx, %q1"         \
                       : "=a"(abcd[0]), "=&r"(abcd[1]), "=c"(abcd[2]), "=d"(abcd[3]) \
                       : "0"(func), "2"(id));
#else
// Case for x86_64 or x86 w/o PIC
#define EIGEN_CPUID(abcd, func, id) \
  __asm__ __volatile__("cpuid" : "=a"(abcd[0]), "=b"(abcd[1]), "=c"(abcd[2]), "=d"(abcd[3]) : "0"(func), "2"(id));
#endif
#elif EIGEN_COMP_MSVC
#if EIGEN_ARCH_i386_OR_x86_64
#define EIGEN_CPUID(abcd, func, id) __cpuidex((int*)abcd, func, id)
#endif
#endif
#endif

namespace internal {

#ifdef EIGEN_CPUID

inline bool cpuid_is_vendor(int abcd[4], const int vendor[3]) {
  return abcd[1] == vendor[0] && abcd[3] == vendor[1] && abcd[2] == vendor[2];
}

inline void queryCacheSizes_intel_direct(int& l1, int& l2, int& l3) {
  int abcd[4];
  l1 = l2 = l3 = 0;
  int cache_id = 0;
  int cache_type = 0;
  do {
    abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;
    EIGEN_CPUID(abcd, 0x4, cache_id);
    cache_type = (abcd[0] & 0x0F) >> 0;
    if (cache_type == 1 || cache_type == 3)  // data or unified cache
    {
      int cache_level = (abcd[0] & 0xE0) >> 5;        // A[7:5]
      int ways = (abcd[1] & 0xFFC00000) >> 22;        // B[31:22]
      int partitions = (abcd[1] & 0x003FF000) >> 12;  // B[21:12]
      int line_size = (abcd[1] & 0x00000FFF) >> 0;    // B[11:0]
      int sets = (abcd[2]);                           // C[31:0]

      int cache_size = (ways + 1) * (partitions + 1) * (line_size + 1) * (sets + 1);

      switch (cache_level) {
        case 1:
          l1 = cache_size;
          break;
        case 2:
          l2 = cache_size;
          break;
        case 3:
          l3 = cache_size;
          break;
        default:
          break;
      }
    }
    cache_id++;
  } while (cache_type > 0 && cache_id < 16);
}

inline void queryCacheSizes_intel_codes(int& l1, int& l2, int& l3) {
  int abcd[4];
  abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;
  l1 = l2 = l3 = 0;
  EIGEN_CPUID(abcd, 0x00000002, 0);
  unsigned char* bytes = reinterpret_cast<unsigned char*>(abcd) + 2;
  bool check_for_p2_core2 = false;
  for (int i = 0; i < 14; ++i) {
    switch (bytes[i]) {
      case 0x0A:
        l1 = 8;
        break;  // 0Ah   data L1 cache, 8 KB, 2 ways, 32 byte lines
      case 0x0C:
        l1 = 16;
        break;  // 0Ch   data L1 cache, 16 KB, 4 ways, 32 byte lines
      case 0x0E:
        l1 = 24;
        break;  // 0Eh   data L1 cache, 24 KB, 6 ways, 64 byte lines
      case 0x10:
        l1 = 16;
        break;  // 10h   data L1 cache, 16 KB, 4 ways, 32 byte lines (IA-64)
      case 0x15:
        l1 = 16;
        break;  // 15h   code L1 cache, 16 KB, 4 ways, 32 byte lines (IA-64)
      case 0x2C:
        l1 = 32;
        break;  // 2Ch   data L1 cache, 32 KB, 8 ways, 64 byte lines
      case 0x30:
        l1 = 32;
        break;  // 30h   code L1 cache, 32 KB, 8 ways, 64 byte lines
      case 0x60:
        l1 = 16;
        break;  // 60h   data L1 cache, 16 KB, 8 ways, 64 byte lines, sectored
      case 0x66:
        l1 = 8;
        break;  // 66h   data L1 cache, 8 KB, 4 ways, 64 byte lines, sectored
      case 0x67:
        l1 = 16;
        break;  // 67h   data L1 cache, 16 KB, 4 ways, 64 byte lines, sectored
      case 0x68:
        l1 = 32;
        break;  // 68h   data L1 cache, 32 KB, 4 ways, 64 byte lines, sectored
      case 0x1A:
        l2 = 96;
        break;  // code and data L2 cache, 96 KB, 6 ways, 64 byte lines (IA-64)
      case 0x22:
        l3 = 512;
        break;  // code and data L3 cache, 512 KB, 4 ways (!), 64 byte lines, dual-sectored
      case 0x23:
        l3 = 1024;
        break;  // code and data L3 cache, 1024 KB, 8 ways, 64 byte lines, dual-sectored
      case 0x25:
        l3 = 2048;
        break;  // code and data L3 cache, 2048 KB, 8 ways, 64 byte lines, dual-sectored
      case 0x29:
        l3 = 4096;
        break;  // code and data L3 cache, 4096 KB, 8 ways, 64 byte lines, dual-sectored
      case 0x39:
        l2 = 128;
        break;  // code and data L2 cache, 128 KB, 4 ways, 64 byte lines, sectored
      case 0x3A:
        l2 = 192;
        break;  // code and data L2 cache, 192 KB, 6 ways, 64 byte lines, sectored
      case 0x3B:
        l2 = 128;
        break;  // code and data L2 cache, 128 KB, 2 ways, 64 byte lines, sectored
      case 0x3C:
        l2 = 256;
        break;  // code and data L2 cache, 256 KB, 4 ways, 64 byte lines, sectored
      case 0x3D:
        l2 = 384;
        break;  // code and data L2 cache, 384 KB, 6 ways, 64 byte lines, sectored
      case 0x3E:
        l2 = 512;
        break;  // code and data L2 cache, 512 KB, 4 ways, 64 byte lines, sectored
      case 0x40:
        l2 = 0;
        break;  // no integrated L2 cache (P6 core) or L3 cache (P4 core)
      case 0x41:
        l2 = 128;
        break;  // code and data L2 cache, 128 KB, 4 ways, 32 byte lines
      case 0x42:
        l2 = 256;
        break;  // code and data L2 cache, 256 KB, 4 ways, 32 byte lines
      case 0x43:
        l2 = 512;
        break;  // code and data L2 cache, 512 KB, 4 ways, 32 byte lines
      case 0x44:
        l2 = 1024;
        break;  // code and data L2 cache, 1024 KB, 4 ways, 32 byte lines
      case 0x45:
        l2 = 2048;
        break;  // code and data L2 cache, 2048 KB, 4 ways, 32 byte lines
      case 0x46:
        l3 = 4096;
        break;  // code and data L3 cache, 4096 KB, 4 ways, 64 byte lines
      case 0x47:
        l3 = 8192;
        break;  // code and data L3 cache, 8192 KB, 8 ways, 64 byte lines
      case 0x48:
        l2 = 3072;
        break;  // code and data L2 cache, 3072 KB, 12 ways, 64 byte lines
      case 0x49:
        if (l2 != 0)
          l3 = 4096;
        else {
          check_for_p2_core2 = true;
          l3 = l2 = 4096;
        }
        break;  // code and data L3 cache, 4096 KB, 16 ways, 64 byte lines (P4) or L2 for core2
      case 0x4A:
        l3 = 6144;
        break;  // code and data L3 cache, 6144 KB, 12 ways, 64 byte lines
      case 0x4B:
        l3 = 8192;
        break;  // code and data L3 cache, 8192 KB, 16 ways, 64 byte lines
      case 0x4C:
        l3 = 12288;
        break;  // code and data L3 cache, 12288 KB, 12 ways, 64 byte lines
      case 0x4D:
        l3 = 16384;
        break;  // code and data L3 cache, 16384 KB, 16 ways, 64 byte lines
      case 0x4E:
        l2 = 6144;
        break;  // code and data L2 cache, 6144 KB, 24 ways, 64 byte lines
      case 0x78:
        l2 = 1024;
        break;  // code and data L2 cache, 1024 KB, 4 ways, 64 byte lines
      case 0x79:
        l2 = 128;
        break;  // code and data L2 cache, 128 KB, 8 ways, 64 byte lines, dual-sectored
      case 0x7A:
        l2 = 256;
        break;  // code and data L2 cache, 256 KB, 8 ways, 64 byte lines, dual-sectored
      case 0x7B:
        l2 = 512;
        break;  // code and data L2 cache, 512 KB, 8 ways, 64 byte lines, dual-sectored
      case 0x7C:
        l2 = 1024;
        break;  // code and data L2 cache, 1024 KB, 8 ways, 64 byte lines, dual-sectored
      case 0x7D:
        l2 = 2048;
        break;  // code and data L2 cache, 2048 KB, 8 ways, 64 byte lines
      case 0x7E:
        l2 = 256;
        break;  // code and data L2 cache, 256 KB, 8 ways, 128 byte lines, sect. (IA-64)
      case 0x7F:
        l2 = 512;
        break;  // code and data L2 cache, 512 KB, 2 ways, 64 byte lines
      case 0x80:
        l2 = 512;
        break;  // code and data L2 cache, 512 KB, 8 ways, 64 byte lines
      case 0x81:
        l2 = 128;
        break;  // code and data L2 cache, 128 KB, 8 ways, 32 byte lines
      case 0x82:
        l2 = 256;
        break;  // code and data L2 cache, 256 KB, 8 ways, 32 byte lines
      case 0x83:
        l2 = 512;
        break;  // code and data L2 cache, 512 KB, 8 ways, 32 byte lines
      case 0x84:
        l2 = 1024;
        break;  // code and data L2 cache, 1024 KB, 8 ways, 32 byte lines
      case 0x85:
        l2 = 2048;
        break;  // code and data L2 cache, 2048 KB, 8 ways, 32 byte lines
      case 0x86:
        l2 = 512;
        break;  // code and data L2 cache, 512 KB, 4 ways, 64 byte lines
      case 0x87:
        l2 = 1024;
        break;  // code and data L2 cache, 1024 KB, 8 ways, 64 byte lines
      case 0x88:
        l3 = 2048;
        break;  // code and data L3 cache, 2048 KB, 4 ways, 64 byte lines (IA-64)
      case 0x89:
        l3 = 4096;
        break;  // code and data L3 cache, 4096 KB, 4 ways, 64 byte lines (IA-64)
      case 0x8A:
        l3 = 8192;
        break;  // code and data L3 cache, 8192 KB, 4 ways, 64 byte lines (IA-64)
      case 0x8D:
        l3 = 3072;
        break;  // code and data L3 cache, 3072 KB, 12 ways, 128 byte lines (IA-64)

      default:
        break;
    }
  }
  if (check_for_p2_core2 && l2 == l3) l3 = 0;
  l1 *= 1024;
  l2 *= 1024;
  l3 *= 1024;
}

inline void queryCacheSizes_intel(int& l1, int& l2, int& l3, int max_std_funcs) {
  if (max_std_funcs >= 4)
    queryCacheSizes_intel_direct(l1, l2, l3);
  else if (max_std_funcs >= 2)
    queryCacheSizes_intel_codes(l1, l2, l3);
  else
    l1 = l2 = l3 = 0;
}

inline void queryCacheSizes_amd(int& l1, int& l2, int& l3) {
  int abcd[4];
  abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;

  // First query the max supported function.
  EIGEN_CPUID(abcd, 0x80000000, 0);
  if (static_cast<numext::uint32_t>(abcd[0]) >= static_cast<numext::uint32_t>(0x80000006)) {
    EIGEN_CPUID(abcd, 0x80000005, 0);
    l1 = (abcd[2] >> 24) * 1024;  // C[31:24] = L1 size in KB
    abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;
    EIGEN_CPUID(abcd, 0x80000006, 0);
    l2 = (abcd[2] >> 16) * 1024;                      // C[31;16] = l2 cache size in KB
    l3 = ((abcd[3] & 0xFFFC000) >> 18) * 512 * 1024;  // D[31;18] = l3 cache size in 512KB
  } else {
    l1 = l2 = l3 = 0;
  }
}
#endif

/** \internal
 * Queries and returns the cache sizes in Bytes of the L1, L2, and L3 data caches respectively */
inline void queryCacheSizes(int& l1, int& l2, int& l3) {
#ifdef EIGEN_CPUID
  int abcd[4];
  const int GenuineIntel[] = {0x756e6547, 0x49656e69, 0x6c65746e};
  const int AuthenticAMD[] = {0x68747541, 0x69746e65, 0x444d4163};
  const int AMDisbetter_[] = {0x69444d41, 0x74656273, 0x21726574};  // "AMDisbetter!"

  // identify the CPU vendor
  EIGEN_CPUID(abcd, 0x0, 0);
  int max_std_funcs = abcd[0];
  if (cpuid_is_vendor(abcd, GenuineIntel))
    queryCacheSizes_intel(l1, l2, l3, max_std_funcs);
  else if (cpuid_is_vendor(abcd, AuthenticAMD) || cpuid_is_vendor(abcd, AMDisbetter_))
    queryCacheSizes_amd(l1, l2, l3);
  else
    // by default let's use Intel's API
    queryCacheSizes_intel(l1, l2, l3, max_std_funcs);

    // here is the list of other vendors:
    //   ||cpuid_is_vendor(abcd,"VIA VIA VIA ")
    //   ||cpuid_is_vendor(abcd,"CyrixInstead")
    //   ||cpuid_is_vendor(abcd,"CentaurHauls")
    //   ||cpuid_is_vendor(abcd,"GenuineTMx86")
    //   ||cpuid_is_vendor(abcd,"TransmetaCPU")
    //   ||cpuid_is_vendor(abcd,"RiseRiseRise")
    //   ||cpuid_is_vendor(abcd,"Geode by NSC")
    //   ||cpuid_is_vendor(abcd,"SiS SiS SiS ")
    //   ||cpuid_is_vendor(abcd,"UMC UMC UMC ")
    //   ||cpuid_is_vendor(abcd,"NexGenDriven")
#else
  l1 = l2 = l3 = -1;
#endif
}

/** \internal
 * \returns the size in Bytes of the L1 data cache */
inline int queryL1CacheSize() {
  int l1(-1), l2, l3;
  queryCacheSizes(l1, l2, l3);
  return l1;
}

/** \internal
 * \returns the size in Bytes of the L2 or L3 cache if this later is present */
inline int queryTopLevelCacheSize() {
  int l1, l2(-1), l3(-1);
  queryCacheSizes(l1, l2, l3);
  return (std::max)(l2, l3);
}

/** \internal
 * This wraps C++20's std::construct_at, using placement new instead if it is not available.
 */

#if EIGEN_COMP_CXXVER >= 20
using std::construct_at;
#else
template <class T, class... Args>
EIGEN_DEVICE_FUNC T* construct_at(T* p, Args&&... args) {
  return ::new (const_cast<void*>(static_cast<const volatile void*>(p))) T(std::forward<Args>(args)...);
}
#endif

/** \internal
 * This wraps C++17's std::destroy_at.  If it's not available it calls the destructor.
 * The wrapper is not a full replacement for C++20's std::destroy_at as it cannot
 * be applied to std::array.
 */
#if EIGEN_COMP_CXXVER >= 17
using std::destroy_at;
#else
template <class T>
EIGEN_DEVICE_FUNC void destroy_at(T* p) {
  p->~T();
}
#endif

}  // end namespace internal

}  // end namespace Eigen

#endif  // EIGEN_MEMORY_H
