Be more explicit about alignment

This commit is contained in:
Erik Hofman
2017-01-12 10:18:39 +01:00
parent 3cb3084725
commit 1b793a127c
2 changed files with 38 additions and 8 deletions

View File

@@ -317,8 +317,23 @@ inline simd4_t<T,N> operator*(simd4_t<T,N> v, T f) {
# include <pmmintrin.h>
# 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<int N>
class simd4_t<float,N>
class simd4_t<float,N> : public simd_aligned16
{
private:
typedef float __vec4f_t[N];
@@ -509,8 +524,23 @@ inline simd4_t<float,N>abs(simd4_t<float,N> v) {
# include <immintrin.h>
// # 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<int N>
class simd4_t<double,N>
class simd4_t<double,N> : public simd_aligned32
{
private:
typedef double __vec4d_t[N];
@@ -683,7 +713,7 @@ inline simd4_t<double,N>abs(simd4_t<double,N> v) {
# include <emmintrin.h>
template<int N>
class simd4_t<double,N>
class simd4_t<double,N> : public simd_aligned16
{
private:
typedef double __vec4d_t[N];
@@ -886,7 +916,7 @@ inline simd4_t<double,N>abs(simd4_t<double,N> v) {
# endif
template<int N>
class simd4_t<int,N>
class simd4_t<int,N> : public simd_aligned16
{
private:
typedef int __vec4i_t[N];

View File

@@ -298,7 +298,7 @@ inline simd4x4_t<T,N> operator*(const simd4x4_t<T,N>& m1, const simd4x4_t<T,N>&
# include <xmmintrin.h>
template<>
class simd4x4_t<float,4>
class simd4x4_t<float,4> : public simd_aligned16
{
private:
typedef float __mtx4f_t[4][4];
@@ -520,7 +520,7 @@ inline simd4_t<float,3> transform<float>(const simd4x4_t<float,4>& m, const simd
// # include "avxintrin-emu.h"
template<>
class simd4x4_t<double,4>
class simd4x4_t<double,4> : public simd_aligned32
{
private:
typedef double __mtx4d_t[4][4];
@@ -758,7 +758,7 @@ inline simd4_t<double,3> transform<double>(const simd4x4_t<double,4>& m, const s
# include <emmintrin.h>
template<>
class simd4x4_t<double,4>
class simd4x4_t<double,4> : public simd_aligned16
{
private:
typedef double __mtx4d_t[4][4];
@@ -1052,7 +1052,7 @@ inline simd4_t<double,3> transform<double>(const simd4x4_t<double,4>& m, const s
# include <xmmintrin.h>
template<>
class simd4x4_t<int,4>
class simd4x4_t<int,4> : public simd_aligned16
{
private:
typedef int __mtx4i_t[4][4];