diff options
Diffstat (limited to 'Eigen/src/Core/util')
-rw-r--r-- | Eigen/src/Core/util/ConfigureVectorization.h | 55 | ||||
-rw-r--r-- | Eigen/src/Core/util/Constants.h | 4 |
2 files changed, 41 insertions, 18 deletions
diff --git a/Eigen/src/Core/util/ConfigureVectorization.h b/Eigen/src/Core/util/ConfigureVectorization.h index f07a284f6..af4e69623 100644 --- a/Eigen/src/Core/util/ConfigureVectorization.h +++ b/Eigen/src/Core/util/ConfigureVectorization.h @@ -2,6 +2,7 @@ // for linear algebra. // // Copyright (C) 2008-2018 Gael Guennebaud <gael.guennebaud@inria.fr> +// Copyright (C) 2020, Arm Limited and Contributors // // 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 @@ -384,34 +385,50 @@ #undef vector #undef pixel - #elif (defined __ARM_NEON) || (defined __ARM_NEON__) + #elif ((defined __ARM_NEON) || (defined __ARM_NEON__)) && !(defined EIGEN_ARM64_USE_SVE) #define EIGEN_VECTORIZE #define EIGEN_VECTORIZE_NEON #include <arm_neon.h> - #elif (defined __s390x__ && defined __VEC__) + // We currently require SVE to be enabled explicitly via EIGEN_ARM64_USE_SVE and + // will not select the backend automatically + #elif (defined __ARM_FEATURE_SVE) && (defined EIGEN_ARM64_USE_SVE) #define EIGEN_VECTORIZE - #define EIGEN_VECTORIZE_ZVECTOR - #include <vecintrin.h> + #define EIGEN_VECTORIZE_SVE + #include <arm_sve.h> + + // Since we depend on knowing SVE vector lengths at compile-time, we need + // to ensure a fixed lengths is set + #if defined __ARM_FEATURE_SVE_BITS + #define EIGEN_ARM64_SVE_VL __ARM_FEATURE_SVE_BITS + #else +#error "Eigen requires a fixed SVE lector length but EIGEN_ARM64_SVE_VL is not set." +#endif - #elif defined __mips_msa +#elif (defined __s390x__ && defined __VEC__) - // Limit MSA optimizations to little-endian CPUs for now. - // TODO: Perhaps, eventually support MSA optimizations on big-endian CPUs? - #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) - #if defined(__LP64__) - #define EIGEN_MIPS_64 - #else - #define EIGEN_MIPS_32 - #endif - #define EIGEN_VECTORIZE - #define EIGEN_VECTORIZE_MSA - #include <msa.h> - #endif +#define EIGEN_VECTORIZE +#define EIGEN_VECTORIZE_ZVECTOR +#include <vecintrin.h> - #endif +#elif defined __mips_msa + +// Limit MSA optimizations to little-endian CPUs for now. +// TODO: Perhaps, eventually support MSA optimizations on big-endian CPUs? +#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#if defined(__LP64__) +#define EIGEN_MIPS_64 +#else +#define EIGEN_MIPS_32 +#endif +#define EIGEN_VECTORIZE +#define EIGEN_VECTORIZE_MSA +#include <msa.h> +#endif + +#endif #endif // Following the Arm ACLE arm_neon.h should also include arm_fp16.h but not all @@ -478,6 +495,8 @@ inline static const char *SimdInstructionSetsInUse(void) { return "VSX"; #elif defined(EIGEN_VECTORIZE_NEON) return "ARM NEON"; +#elif defined(EIGEN_VECTORIZE_SVE) + return "ARM SVE"; #elif defined(EIGEN_VECTORIZE_ZVECTOR) return "S390X ZVECTOR"; #elif defined(EIGEN_VECTORIZE_MSA) diff --git a/Eigen/src/Core/util/Constants.h b/Eigen/src/Core/util/Constants.h index ad9af5727..f7f907ab7 100644 --- a/Eigen/src/Core/util/Constants.h +++ b/Eigen/src/Core/util/Constants.h @@ -3,6 +3,7 @@ // // Copyright (C) 2008-2015 Gael Guennebaud <gael.guennebaud@inria.fr> // Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1@gmail.com> +// Copyright (C) 2020, Arm Limited and Contributors // // 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 @@ -474,6 +475,7 @@ namespace Architecture VSX = 0x3, NEON = 0x4, MSA = 0x5, + SVE = 0x6, #if defined EIGEN_VECTORIZE_SSE Target = SSE #elif defined EIGEN_VECTORIZE_ALTIVEC @@ -482,6 +484,8 @@ namespace Architecture Target = VSX #elif defined EIGEN_VECTORIZE_NEON Target = NEON +#elif defined EIGEN_VECTORIZE_SVE + Target = SVE #elif defined EIGEN_VECTORIZE_MSA Target = MSA #else |