|
|
|
@ -15,10 +15,10 @@ namespace detail |
|
|
|
|
|
|
|
|
|
inline fmat4x4SIMD::fmat4x4SIMD(float const & s) |
|
|
|
|
{ |
|
|
|
|
this->value[0] = fvec4SIMD(s, 0, 0, 0); |
|
|
|
|
this->value[1] = fvec4SIMD(0, s, 0, 0); |
|
|
|
|
this->value[2] = fvec4SIMD(0, 0, s, 0); |
|
|
|
|
this->value[3] = fvec4SIMD(0, 0, 0, s); |
|
|
|
|
this->Data[0] = fvec4SIMD(s, 0, 0, 0); |
|
|
|
|
this->Data[1] = fvec4SIMD(0, s, 0, 0); |
|
|
|
|
this->Data[2] = fvec4SIMD(0, 0, s, 0); |
|
|
|
|
this->Data[3] = fvec4SIMD(0, 0, 0, s); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline fmat4x4SIMD::fmat4x4SIMD |
|
|
|
@ -29,10 +29,10 @@ namespace detail |
|
|
|
|
float const & x3, float const & y3, float const & z3, float const & w3 |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
this->value[0] = fvec4SIMD(x0, y0, z0, w0); |
|
|
|
|
this->value[1] = fvec4SIMD(x1, y1, z1, w1); |
|
|
|
|
this->value[2] = fvec4SIMD(x2, y2, z2, w2); |
|
|
|
|
this->value[3] = fvec4SIMD(x3, y3, z3, w3); |
|
|
|
|
this->Data[0] = fvec4SIMD(x0, y0, z0, w0); |
|
|
|
|
this->Data[1] = fvec4SIMD(x1, y1, z1, w1); |
|
|
|
|
this->Data[2] = fvec4SIMD(x2, y2, z2, w2); |
|
|
|
|
this->Data[3] = fvec4SIMD(x3, y3, z3, w3); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline fmat4x4SIMD::fmat4x4SIMD |
|
|
|
@ -43,21 +43,21 @@ namespace detail |
|
|
|
|
fvec4SIMD const & v3 |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
this->value[0] = v0; |
|
|
|
|
this->value[1] = v1; |
|
|
|
|
this->value[2] = v2; |
|
|
|
|
this->value[3] = v3; |
|
|
|
|
this->Data[0] = v0; |
|
|
|
|
this->Data[1] = v1; |
|
|
|
|
this->Data[2] = v2; |
|
|
|
|
this->Data[3] = v3; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline fmat4x4SIMD::fmat4x4SIMD |
|
|
|
|
( |
|
|
|
|
tmat4x4 const & m |
|
|
|
|
tmat4x4<float> const & m |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
this->value[0] = fvec4SIMD(m[0]); |
|
|
|
|
this->value[1] = fvec4SIMD(m[1]); |
|
|
|
|
this->value[2] = fvec4SIMD(m[2]); |
|
|
|
|
this->value[3] = fvec4SIMD(m[3]); |
|
|
|
|
this->Data[0] = fvec4SIMD(m[0]); |
|
|
|
|
this->Data[1] = fvec4SIMD(m[1]); |
|
|
|
|
this->Data[2] = fvec4SIMD(m[2]); |
|
|
|
|
this->Data[3] = fvec4SIMD(m[3]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
////////////////////////////////////// |
|
|
|
@ -65,26 +65,26 @@ namespace detail |
|
|
|
|
|
|
|
|
|
inline fvec4SIMD & fmat4x4SIMD::operator[] |
|
|
|
|
( |
|
|
|
|
typename fmat4x4SIMD::size_type i |
|
|
|
|
fmat4x4SIMD::size_type i |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
assert( |
|
|
|
|
i >= typename tmat4x4<valType>::size_type(0) && |
|
|
|
|
i < tmat4x4<valType>::col_size()); |
|
|
|
|
i >= fmat4x4SIMD::size_type(0) && |
|
|
|
|
i < fmat4x4SIMD::col_size()); |
|
|
|
|
|
|
|
|
|
return value[i]; |
|
|
|
|
return this->Data[i]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline fvec4SIMD const & fmat4x4SIMD::operator[] |
|
|
|
|
( |
|
|
|
|
typename fmat4x4SIMD::size_type i |
|
|
|
|
fmat4x4SIMD::size_type i |
|
|
|
|
) const |
|
|
|
|
{ |
|
|
|
|
assert( |
|
|
|
|
i >= typename fmat4x4SIMD::size_type(0) && |
|
|
|
|
i >= fmat4x4SIMD::size_type(0) && |
|
|
|
|
i < fmat4x4SIMD::col_size()); |
|
|
|
|
|
|
|
|
|
return value[i]; |
|
|
|
|
return this->Data[i]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////// |
|
|
|
@ -95,10 +95,10 @@ namespace detail |
|
|
|
|
fmat4x4SIMD const & m |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
this->value[0].Data = m[0].Data; |
|
|
|
|
this->value[1].Data = m[1].Data; |
|
|
|
|
this->value[2].Data = m[2].Data; |
|
|
|
|
this->value[3].Data = m[3].Data; |
|
|
|
|
this->Data[0] = m[0]; |
|
|
|
|
this->Data[1] = m[1]; |
|
|
|
|
this->Data[2] = m[2]; |
|
|
|
|
this->Data[3] = m[3]; |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -107,10 +107,10 @@ namespace detail |
|
|
|
|
fmat4x4SIMD const & m |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
this->value[0].Data = _mm_add_ps(this->value[0].Data, m[0].Data); |
|
|
|
|
this->value[1].Data = _mm_add_ps(this->value[1].Data, m[1].Data); |
|
|
|
|
this->value[2].Data = _mm_add_ps(this->value[2].Data, m[2].Data); |
|
|
|
|
this->value[3].Data = _mm_add_ps(this->value[3].Data, m[3].Data); |
|
|
|
|
this->Data[0].Data = _mm_add_ps(this->Data[0].Data, m[0].Data); |
|
|
|
|
this->Data[1].Data = _mm_add_ps(this->Data[1].Data, m[1].Data); |
|
|
|
|
this->Data[2].Data = _mm_add_ps(this->Data[2].Data, m[2].Data); |
|
|
|
|
this->Data[3].Data = _mm_add_ps(this->Data[3].Data, m[3].Data); |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -119,10 +119,10 @@ namespace detail |
|
|
|
|
fmat4x4SIMD const & m |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
this->value[0].Data = _mm_sub_ps(this->value[0].Data, m[0].Data); |
|
|
|
|
this->value[1].Data = _mm_sub_ps(this->value[1].Data, m[1].Data); |
|
|
|
|
this->value[2].Data = _mm_sub_ps(this->value[2].Data, m[2].Data); |
|
|
|
|
this->value[3].Data = _mm_sub_ps(this->value[3].Data, m[3].Data); |
|
|
|
|
this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, m[0].Data); |
|
|
|
|
this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, m[1].Data); |
|
|
|
|
this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, m[2].Data); |
|
|
|
|
this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, m[3].Data); |
|
|
|
|
|
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
@ -132,7 +132,7 @@ namespace detail |
|
|
|
|
fmat4x4SIMD const & m |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
_mm_mul_ps(this->Data, m.Data, this->Data); |
|
|
|
|
_mm_mul_ps(&this->Data[0].Data, &m.Data[0].Data, &this->Data[0].Data); |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -142,8 +142,8 @@ namespace detail |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
__m128 Inv[4]; |
|
|
|
|
_mm_inverse_ps(m.Data, Inv); |
|
|
|
|
_mm_mul_ps(this->Data, Inv, this->Data); |
|
|
|
|
_mm_inverse_ps(&this->Data[0].Data, Inv); |
|
|
|
|
_mm_mul_ps(&this->Data[0].Data, Inv, &this->Data[0].Data); |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -153,10 +153,10 @@ namespace detail |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
__m128 Operand = _mm_set_ps1(s); |
|
|
|
|
this->value[0].Data = _mm_add_ps(this->value[0].Data, Operand); |
|
|
|
|
this->value[1].Data = _mm_add_ps(this->value[1].Data, Operand); |
|
|
|
|
this->value[2].Data = _mm_add_ps(this->value[2].Data, Operand); |
|
|
|
|
this->value[3].Data = _mm_add_ps(this->value[3].Data, Operand); |
|
|
|
|
this->Data[0].Data = _mm_add_ps(this->Data[0].Data, Operand); |
|
|
|
|
this->Data[1].Data = _mm_add_ps(this->Data[1].Data, Operand); |
|
|
|
|
this->Data[2].Data = _mm_add_ps(this->Data[2].Data, Operand); |
|
|
|
|
this->Data[3].Data = _mm_add_ps(this->Data[3].Data, Operand); |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -166,10 +166,10 @@ namespace detail |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
__m128 Operand = _mm_set_ps1(s); |
|
|
|
|
this->value[0].Data = _mm_sub_ps(this->value[0].Data, Operand); |
|
|
|
|
this->value[1].Data = _mm_sub_ps(this->value[1].Data, Operand); |
|
|
|
|
this->value[2].Data = _mm_sub_ps(this->value[2].Data, Operand); |
|
|
|
|
this->value[3].Data = _mm_sub_ps(this->value[3].Data, Operand); |
|
|
|
|
this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, Operand); |
|
|
|
|
this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, Operand); |
|
|
|
|
this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, Operand); |
|
|
|
|
this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, Operand); |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -179,10 +179,10 @@ namespace detail |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
__m128 Operand = _mm_set_ps1(s); |
|
|
|
|
this->value[0].Data = _mm_mul_ps(this->value[0].Data, Operand); |
|
|
|
|
this->value[1].Data = _mm_mul_ps(this->value[1].Data, Operand); |
|
|
|
|
this->value[2].Data = _mm_mul_ps(this->value[2].Data, Operand); |
|
|
|
|
this->value[3].Data = _mm_mul_ps(this->value[3].Data, Operand); |
|
|
|
|
this->Data[0].Data = _mm_mul_ps(this->Data[0].Data, Operand); |
|
|
|
|
this->Data[1].Data = _mm_mul_ps(this->Data[1].Data, Operand); |
|
|
|
|
this->Data[2].Data = _mm_mul_ps(this->Data[2].Data, Operand); |
|
|
|
|
this->Data[3].Data = _mm_mul_ps(this->Data[3].Data, Operand); |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -191,29 +191,29 @@ namespace detail |
|
|
|
|
float const & s |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
__m128 Operand = _mm_div_ps(one, s)); |
|
|
|
|
this->value[0].Data = _mm_mul_ps(this->value[0].Data, Operand); |
|
|
|
|
this->value[1].Data = _mm_mul_ps(this->value[1].Data, Operand); |
|
|
|
|
this->value[2].Data = _mm_mul_ps(this->value[2].Data, Operand); |
|
|
|
|
this->value[3].Data = _mm_mul_ps(this->value[3].Data, Operand); |
|
|
|
|
__m128 Operand = _mm_div_ps(one, _mm_set_ps1(s)); |
|
|
|
|
this->Data[0].Data = _mm_mul_ps(this->Data[0].Data, Operand); |
|
|
|
|
this->Data[1].Data = _mm_mul_ps(this->Data[1].Data, Operand); |
|
|
|
|
this->Data[2].Data = _mm_mul_ps(this->Data[2].Data, Operand); |
|
|
|
|
this->Data[3].Data = _mm_mul_ps(this->Data[3].Data, Operand); |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline fmat4x4SIMD & fmat4x4SIMD::operator++ () |
|
|
|
|
{ |
|
|
|
|
this->value[0].Data = _mm_add_ps(this->value[0].Data, one); |
|
|
|
|
this->value[1].Data = _mm_add_ps(this->value[1].Data, one); |
|
|
|
|
this->value[2].Data = _mm_add_ps(this->value[2].Data, one); |
|
|
|
|
this->value[3].Data = _mm_add_ps(this->value[3].Data, one); |
|
|
|
|
this->Data[0].Data = _mm_add_ps(this->Data[0].Data, one); |
|
|
|
|
this->Data[1].Data = _mm_add_ps(this->Data[1].Data, one); |
|
|
|
|
this->Data[2].Data = _mm_add_ps(this->Data[2].Data, one); |
|
|
|
|
this->Data[3].Data = _mm_add_ps(this->Data[3].Data, one); |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline fmat4x4SIMD & fmat4x4SIMD::operator-- () |
|
|
|
|
{ |
|
|
|
|
this->value[0].Data = _mm_sub_ps(this->value[0].Data, one); |
|
|
|
|
this->value[1].Data = _mm_sub_ps(this->value[1].Data, one); |
|
|
|
|
this->value[2].Data = _mm_sub_ps(this->value[2].Data, one); |
|
|
|
|
this->value[3].Data = _mm_sub_ps(this->value[3].Data, one); |
|
|
|
|
this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, one); |
|
|
|
|
this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, one); |
|
|
|
|
this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, one); |
|
|
|
|
this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, one); |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|