12#ifndef EIGEN_CONFIGURE_VECTORIZATION_H
13#define EIGEN_CONFIGURE_VECTORIZATION_H
16#if defined(EIGEN_VECTORIZE_GENERIC) && !defined(EIGEN_GENERIC_VECTOR_SIZE_BYTES)
17#define EIGEN_GENERIC_VECTOR_SIZE_BYTES 64
19#if defined(EIGEN_VECTORIZE_GENERIC) && !defined(EIGEN_DONT_VECTORIZE) && !defined(EIGEN_DONT_ALIGN)
20#if !EIGEN_ARCH_VECTOR_EXTENSIONS
21#error "The compiler does not support clang vector extensions."
23#define EIGEN_VECTORIZE
24#define EIGEN_MAX_ALIGN_BYTES EIGEN_GENERIC_VECTOR_SIZE_BYTES
46#if (defined EIGEN_CUDACC)
47#define EIGEN_ALIGN_TO_BOUNDARY(n) __align__(n)
48#define EIGEN_ALIGNOF(x) __alignof(x)
50#define EIGEN_ALIGN_TO_BOUNDARY(n) alignas(n)
51#define EIGEN_ALIGNOF(x) alignof(x)
57#ifndef EIGEN_ALIGN_TO_AVOID_FALSE_SHARING
58#define EIGEN_ALIGN_TO_AVOID_FALSE_SHARING EIGEN_ALIGN_TO_BOUNDARY(128)
62#if defined(EIGEN_DONT_VECTORIZE)
63#if defined(EIGEN_GPUCC)
66#define EIGEN_IDEAL_MAX_ALIGN_BYTES 16
68#define EIGEN_IDEAL_MAX_ALIGN_BYTES 0
70#elif defined(EIGEN_VECTORIZE_GENERIC)
72#define EIGEN_IDEAL_MAX_ALIGN_BYTES EIGEN_GENERIC_VECTOR_SIZE_BYTES
73#elif defined(__AVX512F__)
75#define EIGEN_IDEAL_MAX_ALIGN_BYTES 64
85#elif defined(EIGEN_ARM64_USE_SVE) && defined(__ARM_FEATURE_SVE_BITS) && (__ARM_FEATURE_SVE_BITS != 0)
89#if __ARM_FEATURE_SVE_BITS <= 1024
90#define EIGEN_IDEAL_MAX_ALIGN_BYTES (__ARM_FEATURE_SVE_BITS / 8)
92#define EIGEN_IDEAL_MAX_ALIGN_BYTES 128
96#define EIGEN_IDEAL_MAX_ALIGN_BYTES 32
97#elif defined __HVX__ && (__HVX_LENGTH__ == 128)
98#define EIGEN_IDEAL_MAX_ALIGN_BYTES 128
99#elif defined(EIGEN_RISCV64_USE_RVV10)
100#if __riscv_v_fixed_vlen <= 512
101#define EIGEN_IDEAL_MAX_ALIGN_BYTES 64
103#define EIGEN_IDEAL_MAX_ALIGN_BYTES 128
106#define EIGEN_IDEAL_MAX_ALIGN_BYTES 16
110#define EIGEN_MIN_ALIGN_BYTES 16
116#if (defined(EIGEN_DONT_ALIGN_STATICALLY) || defined(EIGEN_DONT_ALIGN)) && defined(EIGEN_MAX_STATIC_ALIGN_BYTES) && \
117 EIGEN_MAX_STATIC_ALIGN_BYTES > 0
118#error EIGEN_MAX_STATIC_ALIGN_BYTES and EIGEN_DONT_ALIGN[_STATICALLY] are both defined with EIGEN_MAX_STATIC_ALIGN_BYTES!=0. Use EIGEN_MAX_STATIC_ALIGN_BYTES=0 as a synonym of EIGEN_DONT_ALIGN_STATICALLY.
123#if defined(EIGEN_DONT_ALIGN_STATICALLY) || defined(EIGEN_DONT_ALIGN)
124#ifdef EIGEN_MAX_STATIC_ALIGN_BYTES
125#undef EIGEN_MAX_STATIC_ALIGN_BYTES
127#define EIGEN_MAX_STATIC_ALIGN_BYTES 0
130#ifndef EIGEN_MAX_STATIC_ALIGN_BYTES
140#if EIGEN_COMP_GNUC && !(EIGEN_ARCH_i386_OR_x86_64 || EIGEN_ARCH_ARM_OR_ARM64 || EIGEN_ARCH_PPC || EIGEN_ARCH_IA64 || \
141 EIGEN_ARCH_MIPS || EIGEN_ARCH_LOONGARCH64 || EIGEN_ARCH_RISCV)
142#define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 1
144#define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 0
148#if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT && !EIGEN_COMP_SUNCC && !EIGEN_OS_QNX
149#define EIGEN_ARCH_WANTS_STACK_ALIGNMENT 1
151#define EIGEN_ARCH_WANTS_STACK_ALIGNMENT 0
154#if EIGEN_ARCH_WANTS_STACK_ALIGNMENT
155#define EIGEN_MAX_STATIC_ALIGN_BYTES EIGEN_IDEAL_MAX_ALIGN_BYTES
157#define EIGEN_MAX_STATIC_ALIGN_BYTES 0
163#if defined(EIGEN_MAX_ALIGN_BYTES) && EIGEN_MAX_ALIGN_BYTES < EIGEN_MAX_STATIC_ALIGN_BYTES
164#undef EIGEN_MAX_STATIC_ALIGN_BYTES
165#define EIGEN_MAX_STATIC_ALIGN_BYTES EIGEN_MAX_ALIGN_BYTES
168#if EIGEN_MAX_STATIC_ALIGN_BYTES == 0 && !defined(EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT)
169#define EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT
178#define EIGEN_ALIGN8 EIGEN_ALIGN_TO_BOUNDARY(8)
179#define EIGEN_ALIGN16 EIGEN_ALIGN_TO_BOUNDARY(16)
180#define EIGEN_ALIGN32 EIGEN_ALIGN_TO_BOUNDARY(32)
181#define EIGEN_ALIGN64 EIGEN_ALIGN_TO_BOUNDARY(64)
182#if EIGEN_MAX_STATIC_ALIGN_BYTES > 0
183#define EIGEN_ALIGN_MAX EIGEN_ALIGN_TO_BOUNDARY(EIGEN_MAX_STATIC_ALIGN_BYTES)
185#define EIGEN_ALIGN_MAX
190#if defined(EIGEN_DONT_ALIGN) && defined(EIGEN_MAX_ALIGN_BYTES) && EIGEN_MAX_ALIGN_BYTES > 0
191#error EIGEN_MAX_ALIGN_BYTES and EIGEN_DONT_ALIGN are both defined with EIGEN_MAX_ALIGN_BYTES!=0. Use EIGEN_MAX_ALIGN_BYTES=0 as a synonym of EIGEN_DONT_ALIGN.
194#ifdef EIGEN_DONT_ALIGN
195#ifdef EIGEN_MAX_ALIGN_BYTES
196#undef EIGEN_MAX_ALIGN_BYTES
198#define EIGEN_MAX_ALIGN_BYTES 0
199#elif !defined(EIGEN_MAX_ALIGN_BYTES)
200#define EIGEN_MAX_ALIGN_BYTES EIGEN_IDEAL_MAX_ALIGN_BYTES
203#if EIGEN_IDEAL_MAX_ALIGN_BYTES > EIGEN_MAX_ALIGN_BYTES
204#define EIGEN_DEFAULT_ALIGN_BYTES EIGEN_IDEAL_MAX_ALIGN_BYTES
206#define EIGEN_DEFAULT_ALIGN_BYTES EIGEN_MAX_ALIGN_BYTES
209#ifndef EIGEN_UNALIGNED_VECTORIZE
210#define EIGEN_UNALIGNED_VECTORIZE 1
217#if EIGEN_MAX_ALIGN_BYTES == 0
218#ifndef EIGEN_DONT_VECTORIZE
219#define EIGEN_DONT_VECTORIZE
228#if (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || EIGEN_ARCH_x86_64
229#define EIGEN_SSE2_ON_MSVC_2008_OR_LATER
233#define EIGEN_SSE2_ON_NON_MSVC
237#if !(defined(EIGEN_DONT_VECTORIZE) || defined(EIGEN_GPUCC) || defined(EIGEN_VECTORIZE_GENERIC))
246#if defined(__ARM_FEATURE_SME2) && !(defined(__ARM_FEATURE_SVE_BITS) && (__ARM_FEATURE_SVE_BITS != 0))
247#define EIGEN_ARM64_SME_USABLE
255#if defined(EIGEN_ARM64_SME_USABLE) && !defined(EIGEN_ARM64_NO_SME) && !defined(EIGEN_ARM64_USE_SVE)
256#define EIGEN_ARM64_SME_SELECTED
259#if defined(EIGEN_ARM64_USE_SME) && defined(EIGEN_ARM64_NO_SME)
260#error "EIGEN_ARM64_USE_SME and EIGEN_ARM64_NO_SME are mutually exclusive."
263#if defined(EIGEN_SSE2_ON_NON_MSVC) || defined(EIGEN_SSE2_ON_MSVC_2008_OR_LATER)
268#define EIGEN_VECTORIZE
269#define EIGEN_VECTORIZE_SSE
270#define EIGEN_VECTORIZE_SSE2
277#define EIGEN_VECTORIZE_SSE3
280#define EIGEN_VECTORIZE_SSSE3
283#define EIGEN_VECTORIZE_SSE4_1
286#define EIGEN_VECTORIZE_SSE4_2
289#if !defined(EIGEN_USE_SYCL) && !EIGEN_COMP_EMSCRIPTEN
290#define EIGEN_VECTORIZE_AVX
292#define EIGEN_VECTORIZE_SSE3
293#define EIGEN_VECTORIZE_SSSE3
294#define EIGEN_VECTORIZE_SSE4_1
295#define EIGEN_VECTORIZE_SSE4_2
298#ifndef EIGEN_USE_SYCL
299#define EIGEN_VECTORIZE_AVX2
300#define EIGEN_VECTORIZE_AVX
302#define EIGEN_VECTORIZE_SSE3
303#define EIGEN_VECTORIZE_SSSE3
304#define EIGEN_VECTORIZE_SSE4_1
305#define EIGEN_VECTORIZE_SSE4_2
307#if defined(__FMA__) || (EIGEN_COMP_MSVC && defined(__AVX2__))
310#define EIGEN_VECTORIZE_FMA
312#if defined(__AVX512F__)
313#ifndef EIGEN_VECTORIZE_FMA
315#error Please add -mfma to your compiler flags: compiling with -mavx512f alone without SSE/AVX FMA is not supported (bug 1638).
317#error Please enable FMA in your compiler flags (e.g. -mfma): compiling with AVX512 alone without SSE/AVX FMA is not supported (bug 1638).
320#ifndef EIGEN_USE_SYCL
321#define EIGEN_VECTORIZE_AVX512
322#define EIGEN_VECTORIZE_AVX2
323#define EIGEN_VECTORIZE_AVX
325#define EIGEN_VECTORIZE_FMA
326#define EIGEN_VECTORIZE_SSE3
327#define EIGEN_VECTORIZE_SSSE3
328#define EIGEN_VECTORIZE_SSE4_1
329#define EIGEN_VECTORIZE_SSE4_2
330#ifndef EIGEN_USE_SYCL
332#define EIGEN_VECTORIZE_AVX512DQ
335#define EIGEN_VECTORIZE_AVX512ER
338#define EIGEN_VECTORIZE_AVX512BF16
341#define EIGEN_VECTORIZE_AVX512VL
347#elif defined(__AVX512VL__)
348#define EIGEN_VECTORIZE_AVX512FP16
350#define EIGEN_HAS_BUILTIN_FLOAT16 1
353#error Please add -mavx512vl to your compiler flags: compiling with -mavx512fp16 alone without AVX512-VL is not supported.
355#error Please enable AVX512-VL in your compiler flags (e.g. -mavx512vl): compiling with AVX512-FP16 alone without AVX512-VL is not supported.
363#if (EIGEN_COMP_CLANGAPPLE == 11000033) && (__MAC_OS_X_VERSION_MIN_REQUIRED == 101500)
366#ifdef EIGEN_VECTORIZE_AVX
367#undef EIGEN_VECTORIZE_AVX
369 "Disabling AVX support: clang compiler shipped with XCode 11.[012] generates broken assembly with -macosx-version-min=10.15 and AVX enabled. "
370#ifdef EIGEN_VECTORIZE_AVX2
371#undef EIGEN_VECTORIZE_AVX2
373#ifdef EIGEN_VECTORIZE_FMA
374#undef EIGEN_VECTORIZE_FMA
376#ifdef EIGEN_VECTORIZE_AVX512
377#undef EIGEN_VECTORIZE_AVX512
379#ifdef EIGEN_VECTORIZE_AVX512DQ
380#undef EIGEN_VECTORIZE_AVX512DQ
382#ifdef EIGEN_VECTORIZE_AVX512ER
383#undef EIGEN_VECTORIZE_AVX512ER
407#if EIGEN_COMP_ICC || EIGEN_COMP_EMSCRIPTEN
408#include <immintrin.h>
411#include <emmintrin.h>
412#include <xmmintrin.h>
413#ifdef EIGEN_VECTORIZE_SSE3
414#include <pmmintrin.h>
416#ifdef EIGEN_VECTORIZE_SSSE3
417#include <tmmintrin.h>
419#ifdef EIGEN_VECTORIZE_SSE4_1
420#include <smmintrin.h>
422#ifdef EIGEN_VECTORIZE_SSE4_2
423#include <nmmintrin.h>
425#if defined(EIGEN_VECTORIZE_AVX) || defined(EIGEN_VECTORIZE_AVX512)
426#include <immintrin.h>
431#elif defined(__VSX__) && !defined(__APPLE__)
433#define EIGEN_VECTORIZE
434#define EIGEN_VECTORIZE_VSX 1
437#if defined(__POWER8_VECTOR__)
438#define EIGEN_VECTORIZE_POWER8_VECTOR
440#define EIGEN_VECTORIZE_FMA
448#elif defined __ALTIVEC__
450#define EIGEN_VECTORIZE
451#define EIGEN_VECTORIZE_ALTIVEC
452#define EIGEN_VECTORIZE_FMA
460#elif defined(EIGEN_ARM64_USE_SME) && !defined(EIGEN_ARM64_SME_USABLE)
463 "EIGEN_ARM64_USE_SME requires a compiler targeting SME2 in scalable (SVE VLA) mode: build with e.g. -march=armv9.2-a+sme2 and without -msve-vector-bits."
465#elif ((defined __ARM_NEON) || (defined __ARM_NEON__)) && !(defined EIGEN_ARM64_USE_SVE) && \
466 !(defined EIGEN_ARM64_SME_SELECTED)
468#define EIGEN_VECTORIZE
469#define EIGEN_VECTORIZE_NEON
474#elif (defined __ARM_FEATURE_SVE) && (defined EIGEN_ARM64_USE_SVE)
476#define EIGEN_VECTORIZE
477#define EIGEN_VECTORIZE_SVE
482#if defined __ARM_FEATURE_SVE_BITS
483#define EIGEN_ARM64_SVE_VL __ARM_FEATURE_SVE_BITS
486static_assert((EIGEN_ARM64_SVE_VL >= 128) && (EIGEN_ARM64_SVE_VL <= 2048) &&
487 ((EIGEN_ARM64_SVE_VL & (EIGEN_ARM64_SVE_VL - 1)) == 0),
488 "SVE vector length must be 2^n for some n in [7, 11]");
490#error "Eigen requires a fixed SVE vector length but EIGEN_ARM64_SVE_VL is not set."
499#if defined(EIGEN_STACK_ALLOCATION_LIMIT_WAS_DEFAULTED) && \
500 EIGEN_STACK_ALLOCATION_LIMIT < (9 * EIGEN_ARM64_SVE_VL * EIGEN_ARM64_SVE_VL / 64)
501#undef EIGEN_STACK_ALLOCATION_LIMIT
502#define EIGEN_STACK_ALLOCATION_LIMIT (9 * EIGEN_ARM64_SVE_VL * EIGEN_ARM64_SVE_VL / 64)
507#elif defined(EIGEN_ARM64_SME_SELECTED)
509#define EIGEN_VECTORIZE
510#define EIGEN_VECTORIZE_SME
519#if !defined(EIGEN_ARM64_NO_SME_F64F64) && \
520 (defined(__ARM_FEATURE_SME_F64F64) || EIGEN_HAS_BUILTIN(__builtin_sme_svmopa_za64_f64_m))
521#define EIGEN_VECTORIZE_SME_F64F64
524#elif EIGEN_ARCH_RISCV
526#if defined(__riscv_zfh)
527#define EIGEN_HAS_BUILTIN_FLOAT16
532#if (defined EIGEN_RISCV64_USE_RVV10)
534#define EIGEN_VECTORIZE
535#define EIGEN_VECTORIZE_RVV10
536#include <riscv_vector.h>
540#if defined(__riscv_v_fixed_vlen)
541#define EIGEN_RISCV64_RVV_VL __riscv_v_fixed_vlen
542#if __riscv_v_fixed_vlen >= 256
543#undef EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT
544#define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 1
547#error "Eigen requires a fixed RVV vector length but -mrvv-vector-bits=zvl is not set."
554#ifdef EIGEN_STACK_ALLOCATION_LIMIT_WAS_DEFAULTED
555#undef EIGEN_STACK_ALLOCATION_LIMIT
556#if __riscv_v_fixed_vlen <= 512
557#define EIGEN_STACK_ALLOCATION_LIMIT 196608
559#define EIGEN_STACK_ALLOCATION_LIMIT 393216
563#if defined(__riscv_zvfh) && defined(__riscv_zfh)
564#define EIGEN_VECTORIZE_RVV10FP16
565#elif defined(__riscv_zvfh)
566#if defined(__GNUC__) || defined(__clang__)
567#warning "The Eigen::Half vectorization requires Zfh and Zvfh extensions."
568#elif defined(_MSC_VER)
569#pragma message("The Eigen::Half vectorization requires Zfh and Zvfh extensions.")
573#if defined(__riscv_zvfbfwma)
574#define EIGEN_VECTORIZE_RVV10BF16
580#elif (defined __s390x__ && defined __VEC__ && (!defined(__ARCH__) || __ARCH__ >= 12))
582#define EIGEN_VECTORIZE
583#define EIGEN_VECTORIZE_ZVECTOR
584#include <vecintrin.h>
586#elif defined __mips_msa
590#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
596#define EIGEN_VECTORIZE
597#define EIGEN_VECTORIZE_MSA
601#elif (defined __loongarch64 && defined __loongarch_sx)
603#define EIGEN_VECTORIZE
604#define EIGEN_VECTORIZE_LSX
605#include <lsxintrin.h>
607#elif defined __HVX__ && (__HVX_LENGTH__ == 128)
609#define EIGEN_VECTORIZE
610#define EIGEN_VECTORIZE_HVX
611#include <hexagon_types.h>
617#undef EIGEN_STACK_ALLOCATION_LIMIT_WAS_DEFAULTED
622#if defined(EIGEN_HAS_ARM64_FP16_SCALAR_ARITHMETIC)
627#if defined(__ARM_FEATURE_FMA)
628#define EIGEN_VECTORIZE_FMA
631#if defined(__F16C__) && !defined(EIGEN_GPUCC)
633#define EIGEN_HAS_FP16_C
641#include <immintrin.h>
645#if defined EIGEN_CUDACC
646#define EIGEN_VECTORIZE_GPU
647#include <vector_types.h>
648#include <cuda_runtime_api.h>
649#if defined(EIGEN_HAS_CUDA_FP16)
650#include <cuda_fp16.h>
654#if defined(EIGEN_HIPCC)
655#define EIGEN_VECTORIZE_GPU
656#include <hip/hip_vector_types.h>
657#include <hip/hip_fp16.h>
658#define EIGEN_HAS_HIP_BF16
659#include <hip/hip_bfloat16.h>
664#ifndef EIGEN_RISCV64_DEFAULT_LMUL
665#define EIGEN_RISCV64_DEFAULT_LMUL 1
671#include "../InternalHeaderCheck.h"
681#ifndef EIGEN_SCALAR_MADD_USE_FMA
682#ifdef EIGEN_VECTORIZE_FMA
683#define EIGEN_SCALAR_MADD_USE_FMA 1
685#define EIGEN_SCALAR_MADD_USE_FMA 0
691inline static const char* SimdInstructionSetsInUse(
void) {
692#if defined(EIGEN_VECTORIZE_AVX512)
693 return "AVX512, FMA, AVX2, AVX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2";
694#elif defined(EIGEN_VECTORIZE_AVX)
695 return "AVX SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2";
696#elif defined(EIGEN_VECTORIZE_SSE4_2)
697 return "SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2";
698#elif defined(EIGEN_VECTORIZE_SSE4_1)
699 return "SSE, SSE2, SSE3, SSSE3, SSE4.1";
700#elif defined(EIGEN_VECTORIZE_SSSE3)
701 return "SSE, SSE2, SSE3, SSSE3";
702#elif defined(EIGEN_VECTORIZE_SSE3)
703 return "SSE, SSE2, SSE3";
704#elif defined(EIGEN_VECTORIZE_SSE2)
706#elif defined(EIGEN_VECTORIZE_ALTIVEC)
708#elif defined(EIGEN_VECTORIZE_POWER8_VECTOR)
709 return "VSX, POWER8 vector";
710#elif defined(EIGEN_VECTORIZE_VSX)
712#elif defined(EIGEN_VECTORIZE_NEON)
714#elif defined(EIGEN_VECTORIZE_SME)
716#elif defined(EIGEN_VECTORIZE_SVE)
718#elif defined(EIGEN_VECTORIZE_ZVECTOR)
719 return "S390X ZVECTOR";
720#elif defined(EIGEN_VECTORIZE_MSA)
722#elif defined(EIGEN_VECTORIZE_LSX)
723 return "LOONGARCH64 LSX";
724#elif defined(EIGEN_VECTORIZE_RVV10)