Remove useless sse code in matrix4
This commit is contained in:
parent
3a64cc9f6a
commit
8fb0005020
@ -12,9 +12,6 @@
|
|||||||
#include "aabbox3d.h"
|
#include "aabbox3d.h"
|
||||||
#include "rect.h"
|
#include "rect.h"
|
||||||
#include "irrString.h"
|
#include "irrString.h"
|
||||||
#if defined(WIN32) && !defined(__MINGW32__) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86))
|
|
||||||
#include <intrin.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// enable this to keep track of changes to the matrix
|
// enable this to keep track of changes to the matrix
|
||||||
// and make simpler identity check for seldomly changing matrices
|
// and make simpler identity check for seldomly changing matrices
|
||||||
@ -48,9 +45,6 @@ namespace core
|
|||||||
class CMatrix4
|
class CMatrix4
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
#if defined(WIN32) && !defined(__MINGW32__) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86))
|
|
||||||
float M_raw[24];
|
|
||||||
#endif
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//! Constructor Flags
|
//! Constructor Flags
|
||||||
@ -409,12 +403,7 @@ namespace core
|
|||||||
bool equals(const core::CMatrix4<T>& other, const T tolerance=(T)ROUNDING_ERROR_f64) const;
|
bool equals(const core::CMatrix4<T>& other, const T tolerance=(T)ROUNDING_ERROR_f64) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#if defined(WIN32) && !defined(__MINGW32__) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86))
|
T M[16];
|
||||||
//! Matrix data, stored in row-major order
|
|
||||||
T* M = (T*)((uintptr_t)&M_raw[4] & ~0xF);
|
|
||||||
#else
|
|
||||||
T M[16];
|
|
||||||
#endif
|
|
||||||
#if defined ( USE_MATRIX_TEST )
|
#if defined ( USE_MATRIX_TEST )
|
||||||
//! Flag is this matrix is identity matrix
|
//! Flag is this matrix is identity matrix
|
||||||
mutable u32 definitelyIdentityMatrix;
|
mutable u32 definitelyIdentityMatrix;
|
||||||
@ -669,58 +658,6 @@ namespace core
|
|||||||
const T *m1 = other_a.M;
|
const T *m1 = other_a.M;
|
||||||
const T *m2 = other_b.M;
|
const T *m2 = other_b.M;
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(__MINGW32__) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86))
|
|
||||||
// From http://drrobsjournal.blogspot.fr/2012/10/fast-simd-4x4-matrix-multiplication.html
|
|
||||||
// Use unaligned load/store
|
|
||||||
|
|
||||||
const float *matA = other_a.pointer();
|
|
||||||
|
|
||||||
const __m128 a = _mm_load_ps(matA); // First row
|
|
||||||
const __m128 b = _mm_load_ps(&matA[4]); // Second row
|
|
||||||
const __m128 c = _mm_load_ps(&matA[8]); // Third row
|
|
||||||
const __m128 d = _mm_load_ps(&matA[12]); // Fourth row
|
|
||||||
|
|
||||||
__m128 t1 = _mm_set1_ps(m2[0]);
|
|
||||||
__m128 t2 = _mm_mul_ps(a, t1);
|
|
||||||
t1 = _mm_set1_ps(m2[1]);
|
|
||||||
t2 = _mm_add_ps(_mm_mul_ps(b, t1), t2);
|
|
||||||
t1 = _mm_set1_ps(m2[2]);
|
|
||||||
t2 = _mm_add_ps(_mm_mul_ps(c, t1), t2);
|
|
||||||
t1 = _mm_set1_ps(m2[3]);
|
|
||||||
t2 = _mm_add_ps(_mm_mul_ps(d, t1), t2);
|
|
||||||
_mm_store_ps(&M[0], t2);
|
|
||||||
|
|
||||||
t1 = _mm_set1_ps(m2[4]);
|
|
||||||
t2 = _mm_mul_ps(a, t1);
|
|
||||||
t1 = _mm_set1_ps(m2[5]);
|
|
||||||
t2 = _mm_add_ps(_mm_mul_ps(b, t1), t2);
|
|
||||||
t1 = _mm_set1_ps(m2[6]);
|
|
||||||
t2 = _mm_add_ps(_mm_mul_ps(c, t1), t2);
|
|
||||||
t1 = _mm_set1_ps(m2[7]);
|
|
||||||
t2 = _mm_add_ps(_mm_mul_ps(d, t1), t2);
|
|
||||||
_mm_store_ps(&M[4], t2);
|
|
||||||
|
|
||||||
t1 = _mm_set1_ps(m2[8]);
|
|
||||||
t2 = _mm_mul_ps(a, t1);
|
|
||||||
t1 = _mm_set1_ps(m2[9]);
|
|
||||||
t2 = _mm_add_ps(_mm_mul_ps(b, t1), t2);
|
|
||||||
t1 = _mm_set1_ps(m2[10]);
|
|
||||||
t2 = _mm_add_ps(_mm_mul_ps(c, t1), t2);
|
|
||||||
t1 = _mm_set1_ps(m2[11]);
|
|
||||||
t2 = _mm_add_ps(_mm_mul_ps(d, t1), t2);
|
|
||||||
_mm_store_ps(&M[8], t2);
|
|
||||||
|
|
||||||
t1 = _mm_set1_ps(m2[12]);
|
|
||||||
t2 = _mm_mul_ps(a, t1);
|
|
||||||
t1 = _mm_set1_ps(m2[13]);
|
|
||||||
t2 = _mm_add_ps(_mm_mul_ps(b, t1), t2);
|
|
||||||
t1 = _mm_set1_ps(m2[14]);
|
|
||||||
t2 = _mm_add_ps(_mm_mul_ps(c, t1), t2);
|
|
||||||
t1 = _mm_set1_ps(m2[15]);
|
|
||||||
t2 = _mm_add_ps(_mm_mul_ps(d, t1), t2);
|
|
||||||
_mm_store_ps(&M[12], t2);
|
|
||||||
#else
|
|
||||||
|
|
||||||
M[0] = m1[0]*m2[0] + m1[4]*m2[1] + m1[8]*m2[2] + m1[12]*m2[3];
|
M[0] = m1[0]*m2[0] + m1[4]*m2[1] + m1[8]*m2[2] + m1[12]*m2[3];
|
||||||
M[1] = m1[1]*m2[0] + m1[5]*m2[1] + m1[9]*m2[2] + m1[13]*m2[3];
|
M[1] = m1[1]*m2[0] + m1[5]*m2[1] + m1[9]*m2[2] + m1[13]*m2[3];
|
||||||
M[2] = m1[2]*m2[0] + m1[6]*m2[1] + m1[10]*m2[2] + m1[14]*m2[3];
|
M[2] = m1[2]*m2[0] + m1[6]*m2[1] + m1[10]*m2[2] + m1[14]*m2[3];
|
||||||
@ -742,7 +679,6 @@ namespace core
|
|||||||
M[15] = m1[3]*m2[12] + m1[7]*m2[13] + m1[11]*m2[14] + m1[15]*m2[15];
|
M[15] = m1[3]*m2[12] + m1[7]*m2[13] + m1[11]*m2[14] + m1[15]*m2[15];
|
||||||
#if defined ( USE_MATRIX_TEST )
|
#if defined ( USE_MATRIX_TEST )
|
||||||
definitelyIdentityMatrix=false;
|
definitelyIdentityMatrix=false;
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -1385,97 +1321,6 @@ namespace core
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
const CMatrix4<T> &m = *this;
|
const CMatrix4<T> &m = *this;
|
||||||
#if defined(WIN32) && !defined(__MINGW32__) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86))
|
|
||||||
float *src = (float*)m.pointer();
|
|
||||||
float *dst = (float*)out.pointer();
|
|
||||||
// from http://www.intel.com/design/pentiumiii/sml/245043.htm
|
|
||||||
{
|
|
||||||
__m128 minor0 = {}, minor1 = {}, minor2 = {}, minor3 = {};
|
|
||||||
__m128 row0 = {}, row1 = {}, row2 = {}, row3 = {};
|
|
||||||
__m128 det = {}, tmp1 = {};
|
|
||||||
tmp1 = _mm_loadh_pi(_mm_loadl_pi(tmp1, (__m64*)(src)), (__m64*)(src + 4));
|
|
||||||
row1 = _mm_loadh_pi(_mm_loadl_pi(row1, (__m64*)(src + 8)), (__m64*)(src + 12));
|
|
||||||
row0 = _mm_shuffle_ps(tmp1, row1, 0x88);
|
|
||||||
row1 = _mm_shuffle_ps(row1, tmp1, 0xDD);
|
|
||||||
tmp1 = _mm_loadh_pi(_mm_loadl_pi(tmp1, (__m64*)(src + 2)), (__m64*)(src + 6));
|
|
||||||
row3 = _mm_loadh_pi(_mm_loadl_pi(row3, (__m64*)(src + 10)), (__m64*)(src + 14));
|
|
||||||
row2 = _mm_shuffle_ps(tmp1, row3, 0x88);
|
|
||||||
row3 = _mm_shuffle_ps(row3, tmp1, 0xDD);
|
|
||||||
// -----------------------------------------------
|
|
||||||
tmp1 = _mm_mul_ps(row2, row3);
|
|
||||||
tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
|
|
||||||
minor0 = _mm_mul_ps(row1, tmp1);
|
|
||||||
minor1 = _mm_mul_ps(row0, tmp1);
|
|
||||||
tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
|
|
||||||
minor0 = _mm_sub_ps(_mm_mul_ps(row1, tmp1), minor0);
|
|
||||||
minor1 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor1);
|
|
||||||
minor1 = _mm_shuffle_ps(minor1, minor1, 0x4E);
|
|
||||||
// -----------------------------------------------
|
|
||||||
tmp1 = _mm_mul_ps(row1, row2);
|
|
||||||
tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
|
|
||||||
minor0 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor0);
|
|
||||||
minor3 = _mm_mul_ps(row0, tmp1);
|
|
||||||
tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
|
|
||||||
minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row3, tmp1));
|
|
||||||
minor3 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor3);
|
|
||||||
minor3 = _mm_shuffle_ps(minor3, minor3, 0x4E);
|
|
||||||
// -----------------------------------------------
|
|
||||||
tmp1 = _mm_mul_ps(_mm_shuffle_ps(row1, row1, 0x4E), row3);
|
|
||||||
tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
|
|
||||||
row2 = _mm_shuffle_ps(row2, row2, 0x4E);
|
|
||||||
minor0 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor0);
|
|
||||||
minor2 = _mm_mul_ps(row0, tmp1);
|
|
||||||
tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
|
|
||||||
minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row2, tmp1));
|
|
||||||
minor2 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor2);
|
|
||||||
minor2 = _mm_shuffle_ps(minor2, minor2, 0x4E);
|
|
||||||
// -----------------------------------------------
|
|
||||||
tmp1 = _mm_mul_ps(row0, row1);
|
|
||||||
tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
|
|
||||||
minor2 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor2);
|
|
||||||
minor3 = _mm_sub_ps(_mm_mul_ps(row2, tmp1), minor3);
|
|
||||||
tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
|
|
||||||
minor2 = _mm_sub_ps(_mm_mul_ps(row3, tmp1), minor2);
|
|
||||||
minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row2, tmp1));
|
|
||||||
// -----------------------------------------------
|
|
||||||
tmp1 = _mm_mul_ps(row0, row3);
|
|
||||||
tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
|
|
||||||
minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row2, tmp1));
|
|
||||||
minor2 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor2);
|
|
||||||
tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
|
|
||||||
minor1 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor1);
|
|
||||||
minor2 = _mm_sub_ps(minor2, _mm_mul_ps(row1, tmp1));
|
|
||||||
// -----------------------------------------------
|
|
||||||
tmp1 = _mm_mul_ps(row0, row2);
|
|
||||||
tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1);
|
|
||||||
minor1 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor1);
|
|
||||||
minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row1, tmp1));
|
|
||||||
tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E);
|
|
||||||
minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row3, tmp1));
|
|
||||||
minor3 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor3);
|
|
||||||
// -----------------------------------------------
|
|
||||||
det = _mm_mul_ps(row0, minor0);
|
|
||||||
det = _mm_add_ps(_mm_shuffle_ps(det, det, 0x4E), det);
|
|
||||||
det = _mm_add_ss(_mm_shuffle_ps(det, det, 0xB1), det);
|
|
||||||
tmp1 = _mm_rcp_ss(det);
|
|
||||||
det = _mm_sub_ss(_mm_add_ss(tmp1, tmp1), _mm_mul_ss(det, _mm_mul_ss(tmp1, tmp1)));
|
|
||||||
det = _mm_shuffle_ps(det, det, 0x00);
|
|
||||||
minor0 = _mm_mul_ps(det, minor0);
|
|
||||||
_mm_storel_pi((__m64*)(dst), minor0);
|
|
||||||
_mm_storeh_pi((__m64*)(dst + 2), minor0);
|
|
||||||
minor1 = _mm_mul_ps(det, minor1);
|
|
||||||
_mm_storel_pi((__m64*)(dst + 4), minor1);
|
|
||||||
_mm_storeh_pi((__m64*)(dst + 6), minor1);
|
|
||||||
minor2 = _mm_mul_ps(det, minor2);
|
|
||||||
_mm_storel_pi((__m64*)(dst + 8), minor2);
|
|
||||||
_mm_storeh_pi((__m64*)(dst + 10), minor2);
|
|
||||||
minor3 = _mm_mul_ps(det, minor3);
|
|
||||||
_mm_storel_pi((__m64*)(dst + 12), minor3);
|
|
||||||
_mm_storeh_pi((__m64*)(dst + 14), minor3);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
#else
|
|
||||||
|
|
||||||
f32 d = (m(0, 0) * m(1, 1) - m(0, 1) * m(1, 0)) * (m(2, 2) * m(3, 3) - m(2, 3) * m(3, 2)) -
|
f32 d = (m(0, 0) * m(1, 1) - m(0, 1) * m(1, 0)) * (m(2, 2) * m(3, 3) - m(2, 3) * m(3, 2)) -
|
||||||
(m(0, 0) * m(1, 2) - m(0, 2) * m(1, 0)) * (m(2, 1) * m(3, 3) - m(2, 3) * m(3, 1)) +
|
(m(0, 0) * m(1, 2) - m(0, 2) * m(1, 0)) * (m(2, 1) * m(3, 3) - m(2, 3) * m(3, 1)) +
|
||||||
(m(0, 0) * m(1, 3) - m(0, 3) * m(1, 0)) * (m(2, 1) * m(3, 2) - m(2, 2) * m(3, 1)) +
|
(m(0, 0) * m(1, 3) - m(0, 3) * m(1, 0)) * (m(2, 1) * m(3, 2) - m(2, 2) * m(3, 1)) +
|
||||||
@ -1541,7 +1386,6 @@ namespace core
|
|||||||
out.definitelyIdentityMatrix = definitelyIdentityMatrix;
|
out.definitelyIdentityMatrix = definitelyIdentityMatrix;
|
||||||
#endif
|
#endif
|
||||||
return true;
|
return true;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user