Reinstate AVX support again
This commit is contained in:
@@ -504,10 +504,10 @@ inline simd4_t<float,N>abs(simd4_t<float,N> v) {
|
||||
# endif
|
||||
|
||||
|
||||
# ifdef __AVX_unsupported__
|
||||
# ifdef __AVX__
|
||||
# include <pmmintrin.h>
|
||||
# include <immintrin.h>
|
||||
//# include <avxintrin-emu.h>
|
||||
// # include "avxintrin-emu.h"
|
||||
|
||||
template<int N>
|
||||
class simd4_t<double,N>
|
||||
@@ -634,36 +634,29 @@ inline float hsum_pd_avx(__m256d v) {
|
||||
|
||||
template<>
|
||||
inline double magnitude2(simd4_t<double,4> v) {
|
||||
return hsum_pd_avx(v.v4()*v.v4());
|
||||
return hsum_pd_avx(_mm256_mul_pd(v.v4(),v.v4()));
|
||||
}
|
||||
|
||||
template<>
|
||||
inline double dot(simd4_t<double,4> v1, const simd4_t<double,4>& v2) {
|
||||
return hsum_pd_avx(v1.v4()*v2.v4());
|
||||
return hsum_pd_avx(_mm256_mul_pd(v1.v4(),v2.v4()));
|
||||
}
|
||||
|
||||
#ifdef __AVX2__
|
||||
template<>
|
||||
inline simd4_t<double,3> cross(const simd4_t<double,3>& v1, const simd4_t<double,3>& v2)
|
||||
{
|
||||
#if 1
|
||||
// http://threadlocalmutex.com/?p=8
|
||||
// https://gist.github.com/L2Program/219e07581e69110e7942
|
||||
__m256d v41 = v1.v4(), v42 = v2.v4();
|
||||
__m256d a = _mm256_shuffle_pd(v41, v41, _MM_SHUFFLE(3, 0, 2, 1));
|
||||
__m256d b = _mm256_shuffle_pd(v42, v42, _MM_SHUFFLE(3, 0, 2, 1));
|
||||
__m256d c = _mm256_sub_pd(_mm256_mul_pd(v41, b), _mm256_mul_pd(a, v42));
|
||||
return _mm256_shuffle_pd(c, c, _MM_SHUFFLE(3, 0, 2, 1));
|
||||
#else
|
||||
v1 = _mm256_sub_pd(
|
||||
_mm256_mul_pd(
|
||||
_mm256_shuffle_pd(v1.v4(),v1.v4(),_MM_SHUFFLE(3, 0, 2, 1)),
|
||||
_mm256_shuffle_pd(v2.v4(),v2.v4(),_MM_SHUFFLE(3, 1, 0, 2))),
|
||||
_mm256_mul_pd(
|
||||
_mm256_shuffle_pd(v1.v4(),v1.v4(),_MM_SHUFFLE(3, 1, 0, 2)),
|
||||
_mm256_shuffle_pd(v2.v4(),v2.v4(),_MM_SHUFFLE(3, 0, 2, 1)))
|
||||
);
|
||||
return v1;
|
||||
#endif
|
||||
return _mm256_sub_pd(
|
||||
_mm256_mul_pd(
|
||||
_mm256_permute4x64_pd(v41,_MM_SHUFFLE(3, 0, 2, 1)),
|
||||
_mm256_permute4x64_pd(v42,_MM_SHUFFLE(3, 1, 0, 2))),
|
||||
_mm256_mul_pd(
|
||||
_mm256_permute4x64_pd(v41,_MM_SHUFFLE(3, 1, 0, 2)),
|
||||
_mm256_permute4x64_pd(v42,_MM_SHUFFLE(3, 0, 2, 1))));
|
||||
}
|
||||
#endif
|
||||
|
||||
template<int N>
|
||||
inline simd4_t<double,N> min(simd4_t<double,N> v1, const simd4_t<double,N>& v2) {
|
||||
|
||||
@@ -514,10 +514,10 @@ inline simd4_t<float,3> transform<float>(const simd4x4_t<float,4>& m, const simd
|
||||
# endif
|
||||
|
||||
|
||||
# ifdef __AVX_unsupported__
|
||||
# ifdef __AVX__
|
||||
# include <pmmintrin.h>
|
||||
# include <immintrin.h>
|
||||
//# include <avxintrin-emu.h>
|
||||
// # include "avxintrin-emu.h"
|
||||
|
||||
template<>
|
||||
class simd4x4_t<double,4>
|
||||
@@ -690,25 +690,18 @@ inline simd4x4_t<double,4> rotation_matrix<double>(double angle, const simd4_t<d
|
||||
|
||||
template<>
|
||||
inline simd4x4_t<double,4> transpose<double>(simd4x4_t<double,4> m) {
|
||||
simd4x4_t<double,4> mtx;
|
||||
#if 1
|
||||
for (int i=0; i<4; ++i) {
|
||||
for(int j=0; j<4; ++j) {
|
||||
mtx.ptr()[j][i] = m.ptr()[i][j];
|
||||
}
|
||||
}
|
||||
#else
|
||||
__m256d T0 = _mm256_unpacklo_pd(m.m4x4()[0], m.m4x4()[1]);
|
||||
__m256d T1 = _mm256_unpacklo_pd(m.m4x4()[2], m.m4x4()[3]);
|
||||
__m256d T2 = _mm256_unpackhi_pd(m.m4x4()[0], m.m4x4()[1]);
|
||||
__m256d T3 = _mm256_unpackhi_pd(m.m4x4()[2], m.m4x4()[3]);
|
||||
// http://stackoverflow.com/questions/36167517/m256d-transpose4-equivalent
|
||||
__m256d tmp0 = _mm256_shuffle_pd(m.m4x4()[0], m.m4x4()[1], 0x0);
|
||||
__m256d tmp2 = _mm256_shuffle_pd(m.m4x4()[0], m.m4x4()[1], 0xF);
|
||||
__m256d tmp1 = _mm256_shuffle_pd(m.m4x4()[2], m.m4x4()[3], 0x0);
|
||||
__m256d tmp3 = _mm256_shuffle_pd(m.m4x4()[2], m.m4x4()[3], 0xF);
|
||||
|
||||
mtx.m4x4()[0] = _mm256_unpacklo_pd(T0, T1);
|
||||
mtx.m4x4()[1] = _mm256_unpackhi_pd(T0, T1);
|
||||
mtx.m4x4()[2] = _mm256_unpacklo_pd(T2, T3);
|
||||
mtx.m4x4()[3] = _mm256_unpackhi_pd(T2, T3);
|
||||
#endif
|
||||
return mtx;
|
||||
m.m4x4()[0] = _mm256_permute2f128_pd(tmp0, tmp1, 0x20);
|
||||
m.m4x4()[1] = _mm256_permute2f128_pd(tmp2, tmp3, 0x20);
|
||||
m.m4x4()[2] = _mm256_permute2f128_pd(tmp0, tmp1, 0x31);
|
||||
m.m4x4()[3] = _mm256_permute2f128_pd(tmp2, tmp3, 0x31);
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
inline void translate(simd4x4_t<double,4>& m, const simd4_t<double,3>& dist) {
|
||||
|
||||
Reference in New Issue
Block a user