From 1b793a127c7dedc23e6e3d9d673bd8985587988c Mon Sep 17 00:00:00 2001 From: Erik Hofman Date: Thu, 12 Jan 2017 10:18:39 +0100 Subject: [PATCH] Be more explicit about alignment --- simgear/math/simd.hxx | 38 ++++++++++++++++++++++++++++++++++---- simgear/math/simd4x4.hxx | 8 ++++---- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/simgear/math/simd.hxx b/simgear/math/simd.hxx index 3074e342..4f3ed3ad 100644 --- a/simgear/math/simd.hxx +++ b/simgear/math/simd.hxx @@ -317,8 +317,23 @@ inline simd4_t operator*(simd4_t v, T f) { # include # endif +ALIGN16 +class simd_aligned16 +{ +public: + simd_aligned16() {} + ~simd_aligned16() {} + + void *operator new (size_t size) { + return _mm_malloc(size, 16); + } + void operator delete (void *p) { + _mm_free(p); + } +}; + template -class simd4_t +class simd4_t : public simd_aligned16 { private: typedef float __vec4f_t[N]; @@ -509,8 +524,23 @@ inline simd4_tabs(simd4_t v) { # include // # include "avxintrin-emu.h" +ALIGN32 +class simd_aligned32 +{ +public: + simd_aligned32() {} + ~simd_aligned32() {} + + void *operator new (size_t size) { + return _mm_malloc(size, 32); + } + void operator delete (void *p) { + _mm_free(p); + } +}; + template -class simd4_t +class simd4_t : public simd_aligned32 { private: typedef double __vec4d_t[N]; @@ -683,7 +713,7 @@ inline simd4_tabs(simd4_t v) { # include template -class simd4_t +class simd4_t : public simd_aligned16 { private: typedef double __vec4d_t[N]; @@ -886,7 +916,7 @@ inline simd4_tabs(simd4_t v) { # endif template -class simd4_t +class simd4_t : public simd_aligned16 { private: typedef int __vec4i_t[N]; diff --git a/simgear/math/simd4x4.hxx b/simgear/math/simd4x4.hxx index bbf6908b..0f355fe3 100644 --- a/simgear/math/simd4x4.hxx +++ b/simgear/math/simd4x4.hxx @@ -298,7 +298,7 @@ inline simd4x4_t operator*(const simd4x4_t& m1, const simd4x4_t& # include template<> -class simd4x4_t +class simd4x4_t : public simd_aligned16 { private: typedef float __mtx4f_t[4][4]; @@ -520,7 +520,7 @@ inline simd4_t transform(const simd4x4_t& m, const simd // # include "avxintrin-emu.h" template<> -class simd4x4_t +class simd4x4_t : public simd_aligned32 { private: typedef double __mtx4d_t[4][4]; @@ -758,7 +758,7 @@ inline simd4_t transform(const simd4x4_t& m, const s # include template<> -class simd4x4_t +class simd4x4_t : public simd_aligned16 { private: typedef double __mtx4d_t[4][4]; @@ -1052,7 +1052,7 @@ inline simd4_t transform(const simd4x4_t& m, const s # include template<> -class simd4x4_t +class simd4x4_t : public simd_aligned16 { private: typedef int __mtx4i_t[4][4];