From 703951d5cd87805256b6f75a4cc210fa6d3023e2 Mon Sep 17 00:00:00 2001 From: Benoit Jacob Date: Mon, 15 Dec 2008 15:54:33 +0000 Subject: [PATCH] Fix memory alignment (hence vectorization) on MSVC thanks to help from Armin Berres. --- Eigen/Core | 4 ++++ Eigen/src/Core/util/Macros.h | 2 ++ Eigen/src/Core/util/Memory.h | 12 ++++++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Eigen/Core b/Eigen/Core index c85034f01..3128f3198 100644 --- a/Eigen/Core +++ b/Eigen/Core @@ -44,6 +44,10 @@ #include #include +#if(defined(_MSC_VER) && defined(EIGEN_VECTORIZE)) +#include // for _aligned_malloc +#endif + namespace Eigen { /** \defgroup Core_Module Core module diff --git a/Eigen/src/Core/util/Macros.h b/Eigen/src/Core/util/Macros.h index 942af1e48..c95030524 100644 --- a/Eigen/src/Core/util/Macros.h +++ b/Eigen/src/Core/util/Macros.h @@ -108,6 +108,8 @@ using Eigen::ei_cos; #if (defined __GNUC__) #define EIGEN_ALIGN_128 __attribute__ ((aligned(16))) +#elif (defined _MSC_VER) +#define EIGEN_ALIGN_128 __declspec(align(16)) #else #define EIGEN_ALIGN_128 #endif diff --git a/Eigen/src/Core/util/Memory.h b/Eigen/src/Core/util/Memory.h index e3aa8bea5..9e6ec71c1 100644 --- a/Eigen/src/Core/util/Memory.h +++ b/Eigen/src/Core/util/Memory.h @@ -55,10 +55,14 @@ template inline T* ei_aligned_malloc(size_t size) { #ifdef EIGEN_VECTORIZE - if (ei_packet_traits::size>1) + if(ei_packet_traits::size>1) { void* ptr; - if (posix_memalign(&ptr, 16, size*sizeof(T))==0) + #ifdef _MSC_VER + if(ptr = _aligned_malloc(size*sizeof(T), 16)) + #else + if(posix_memalign(&ptr, 16, size*sizeof(T))==0) + #endif return static_cast(ptr); else return 0; @@ -74,7 +78,11 @@ inline void ei_aligned_free(T* ptr) { #ifdef EIGEN_VECTORIZE if (ei_packet_traits::size>1) + #ifdef _MSC_VER + _aligned_free(ptr); + #else free(ptr); + #endif else #endif delete[] ptr;