A better MSVC fix and code speedups

This commit is contained in:
Erik Hofman
2016-12-20 09:54:19 +01:00
parent 09b44ac68a
commit 4ea1326126
2 changed files with 27 additions and 19 deletions

View File

@@ -21,8 +21,8 @@
#include <cstring>
#include <cmath>
#include <simgear/math/SGLimits.hxx>
#include <simgear/math/SGMisc.hxx>
#include "SGLimits.hxx"
#include "SGMisc.hxx"
template<typename T, int N> class simd4_t;

View File

@@ -112,7 +112,8 @@ inline void post_translate(simd4x4_t<T,4>& m, const simd4_t<S,3>& dist)
{
simd4_t<T,3> col3(m.ptr()[3]);
for (int i=0; i<3; ++i) {
simd4_t<T,3> trow3 = T(dist[i])*m.ptr()[i];
simd4_t<T,3> trow3 = T(dist[i]);
trow3 *= m.ptr()[i];
col3 += trow3;
}
for (int i=0; i<3; ++i) {
@@ -421,14 +422,11 @@ public:
template<int M>
inline simd4_t<float,M> operator*(const simd4x4_t<float,4>& m, const simd4_t<float,M>& vi)
{
simd4_t<float,M> mv(m.m4x4()[0]);
mv *= vi.ptr()[0];
__m128 mv = _mm_mul_ps(m.m4x4()[0], _mm_set1_ps(vi.ptr()[0]));
for (int i=1; i<M; ++i) {
simd4_t<float,M> row(m.m4x4()[i]);
row *= vi.ptr()[i];
mv.v4() += row.v4();
__m128 row = _mm_mul_ps(m.m4x4()[i], _mm_set1_ps(vi.ptr()[i]));
mv = _mm_add_ps(mv, row);
}
for (int i=M; i<4; ++i) mv[i] = 0;
return mv;
}
@@ -502,11 +500,10 @@ inline void post_translate(simd4x4_t<float,4>& m, const simd4_t<S,3>& dist)
template<>
inline simd4_t<float,3> transform<float>(const simd4x4_t<float,4>& m, const simd4_t<float,3>& pt) {
simd4_t<float,3> tpt;
tpt.v4() = m.m4x4()[3];
__m128 tpt = m.m4x4()[3];
for (int i=0; i<3; ++i) {
__m128 ptd = _mm_set1_ps(pt[i]);
tpt.v4() = _mm_add_ps(tpt.v4(), _mm_mul_ps(ptd, m.m4x4()[i]));
tpt = _mm_add_ps(tpt, _mm_mul_ps(ptd, m.m4x4()[i]));
}
tpt[3] = 0.0;
return tpt;
@@ -672,15 +669,17 @@ public:
template<int M>
inline simd4_t<double,M> operator*(const simd4x4_t<double,4>& m, const simd4_t<double,M>& vi)
{
simd4_t<double,M> mv(m.m4x4()[0]);
mv *= vi.ptr()[0];
__m128d mv[2];
mv[0] = _mm_mul_pd(m.m4x4()[0][0], _mm_set1_pd(vi.ptr()[0]));
mv[1] = _mm_mul_pd(m.m4x4()[0][1], _mm_set1_pd(vi.ptr()[0]));
for (int i=1; i<M; ++i) {
simd4_t<double,M> row = m.m4x4()[i];
row *= vi.ptr()[i];
mv.v4()[0] += row.v4()[0];
mv.v4()[1] += row.v4()[1];
__m128d row[2];
row[0] = _mm_mul_pd(m.m4x4()[i][0], _mm_set1_pd(vi.ptr()[i]));
row[1] = _mm_mul_pd(m.m4x4()[i][1], _mm_set1_pd(vi.ptr()[i]));
mv[0] = _mm_add_pd(mv[0], row[0]);
mv[1] = _mm_add_pd(mv[1], row[1]);
}
for (int i=M; i<4; ++i) mv[i] = 0;
return mv;
}
@@ -753,6 +752,14 @@ inline void translate(simd4x4_t<double,4>& m, const simd4_t<double,3>& dist) {
template<typename S>
inline void pre_translate(simd4x4_t<double,4>& m, const simd4_t<S,3>& dist)
{
simd4_t<double,4> row3(m.ptr()[0][3],m.ptr()[1][3],m.ptr()[2][3],m.ptr()[3][3]);
for (int i=0; i<3; ++i) {
for (int j=0; j<4; ++j) {
m.ptr()[j][i] += row3[j]*double(dist[i]);
}
}
#if 0
// twice as slow
simd4x4_t<double,4> mt = simd4x4::transpose(m);
__m128d row3[2];
row3[0] = mt.m4x4()[3][0];
@@ -763,6 +770,7 @@ inline void pre_translate(simd4x4_t<double,4>& m, const simd4_t<S,3>& dist)
mt.m4x4()[i][1] = _mm_add_pd(mt.m4x4()[i][1], _mm_mul_pd(t, row3[1]));
}
m = simd4x4::transpose(mt);
#endif
}
template<typename S>