Fixed build

master
Christophe Riccio ago%!(EXTRA string=15 years)
parent 96d6e76e78
commit 510d9bbccf
  1. 6
      glm/core/_detail.hpp
  2. 8
      glm/core/intrinsic_geometric.inl
  3. 2
      glm/core/intrinsic_matrix.inl
  4. 51
      glm/gtx/simd_mat4.hpp
  5. 17
      glm/gtx/simd_mat4.inl
  6. 51
      glm/gtx/simd_vec4.hpp
  7. 61
      glm/gtx/simd_vec4.inl
  8. 36
      test/gtx/gtx-simd-mat4.cpp
  9. 19
      test/gtx/gtx-simd-vec4.cpp

@ -322,12 +322,12 @@ namespace detail
#if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005)) #if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005))
# define GLM_DEPRECATED __declspec(deprecated) # define GLM_DEPRECATED __declspec(deprecated)
# define GLM_ALIGNED(keyword, x) __declspec(align(x)) keyword # define GLM_ALIGN(x) __declspec(align(x))
# define GLM_RESTRICT __declspec(restrict) # define GLM_RESTRICT __declspec(restrict)
# define GLM_RESTRICT_VAR __restrict # define GLM_RESTRICT_VAR __restrict
#elif((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC31)) #elif((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC31))
# define GLM_DEPRECATED __attribute__((__deprecated__)) # define GLM_DEPRECATED __attribute__((__deprecated__))
# define GLM_ALIGNED(keyword, x) keyword __attribute__(aligned(x)) # define GLM_ALIGN(x) __attribute__(aligned(x))
# if(GLM_COMPILER >= GLM_COMPILER_GCC33) # if(GLM_COMPILER >= GLM_COMPILER_GCC33)
# define GLM_RESTRICT __restrict__ # define GLM_RESTRICT __restrict__
# define GLM_RESTRICT_VAR __restrict__ # define GLM_RESTRICT_VAR __restrict__
@ -339,7 +339,7 @@ namespace detail
# define GLM_RESTRICT_VAR __restrict__ # define GLM_RESTRICT_VAR __restrict__
#else #else
# define GLM_DEPRECATED # define GLM_DEPRECATED
# define GLM_ALIGN_UNION(x) union # define GLM_ALIGN(x)
# define GLM_RESTRICT # define GLM_RESTRICT
# define GLM_RESTRICT_VAR # define GLM_RESTRICT_VAR
#endif//GLM_COMPILER #endif//GLM_COMPILER

@ -62,7 +62,7 @@ inline __m128 sse_xpd_ps(__m128 v1, __m128 v2)
} }
//normalize //normalize
inline __m128 _mm_nrm_ps(__m128 v) inline __m128 sse_nrm_ps(__m128 v)
{ {
__m128 dot0 = sse_dot_ps(v, v); __m128 dot0 = sse_dot_ps(v, v);
__m128 isr0 = _mm_rsqrt_ps(dot0); __m128 isr0 = _mm_rsqrt_ps(dot0);
@ -71,7 +71,7 @@ inline __m128 _mm_nrm_ps(__m128 v)
} }
//faceforward //faceforward
inline __m128 _mm_ffd_ps(__m128 N, __m128 I, __m128 Nref) inline __m128 sse_ffd_ps(__m128 N, __m128 I, __m128 Nref)
{ {
//__m128 dot0 = _mm_dot_ps(v, v); //__m128 dot0 = _mm_dot_ps(v, v);
//__m128 neg0 = _mm_neg_ps(N); //__m128 neg0 = _mm_neg_ps(N);
@ -87,7 +87,7 @@ inline __m128 _mm_ffd_ps(__m128 N, __m128 I, __m128 Nref)
} }
//reflect //reflect
inline __m128 _mm_rfe_ps(__m128 I, __m128 N) inline __m128 sse_rfe_ps(__m128 I, __m128 N)
{ {
__m128 dot0 = sse_dot_ps(N, I); __m128 dot0 = sse_dot_ps(N, I);
__m128 mul0 = _mm_mul_ps(N, dot0); __m128 mul0 = _mm_mul_ps(N, dot0);
@ -97,7 +97,7 @@ inline __m128 _mm_rfe_ps(__m128 I, __m128 N)
} }
//refract //refract
inline __m128 _mm_rfa_ps(__m128 I, __m128 N, __m128 eta) inline __m128 sse_rfa_ps(__m128 I, __m128 N, __m128 eta)
{ {
__m128 dot0 = sse_dot_ps(N, I); __m128 dot0 = sse_dot_ps(N, I);
__m128 mul0 = _mm_mul_ps(eta, eta); __m128 mul0 = _mm_mul_ps(eta, eta);

@ -1014,7 +1014,7 @@ void sse_rotate_ps(__m128 const in[4], float Angle, float const v[3], __m128 out
glm::vec4 AxisA(v[0], v[1], v[2], float(0)); glm::vec4 AxisA(v[0], v[1], v[2], float(0));
__m128 AxisB = _mm_set_ps(AxisA.w, AxisA.z, AxisA.y, AxisA.x); __m128 AxisB = _mm_set_ps(AxisA.w, AxisA.z, AxisA.y, AxisA.x);
__m128 AxisC = _mm_nrm_ps(AxisB); __m128 AxisC = detail::sse_nrm_ps(AxisB);
__m128 Cos0 = _mm_set_ss(c); __m128 Cos0 = _mm_set_ss(c);
__m128 CosA = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(0, 0, 0, 0)); __m128 CosA = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(0, 0, 0, 0));

@ -32,7 +32,7 @@ namespace glm
{ {
namespace detail namespace detail
{ {
GLM_ALIGNED(struct, 16) fmat4x4SIMD GLM_ALIGN(16) struct fmat4x4SIMD
{ {
enum ctor{null}; enum ctor{null};
@ -132,64 +132,37 @@ namespace glm
//! GLM_GTX_simd_mat4 extension: SIMD implementation of vec4 type. //! GLM_GTX_simd_mat4 extension: SIMD implementation of vec4 type.
namespace simd_mat4 namespace simd_mat4
{ {
typedef detail::fmat4x4SIMD simd_mat4; typedef detail::fmat4x4SIMD simdMat4;
//! Multiply matrix x by matrix y component-wise, i.e., //! Multiply matrix x by matrix y component-wise, i.e.,
//! result[i][j] is the scalar product of x[i][j] and y[i][j]. //! result[i][j] is the scalar product of x[i][j] and y[i][j].
//! (From GLM_GTX_simd_mat4 extension). //! (From GLM_GTX_simd_mat4 extension).
detail::fmat4x4SIMD simd_matrixCompMult( detail::fmat4x4SIMD simdMatrixCompMult(
detail::fmat4x4SIMD const & x, detail::fmat4x4SIMD const & x,
detail::fmat4x4SIMD const & y); detail::fmat4x4SIMD const & y);
//! Returns the transposed matrix of x
//! (From GLM_GTX_simd_mat4 extension).
detail::fmat4x4SIMD simd_transpose(detail::fmat4x4SIMD const & m);
//! Return the determinant of a mat4 matrix.
//! (From GLM_GTX_simd_mat4 extension).
float simd_determinant(detail::fmat4x4SIMD const & m);
//! Return the inverse of a mat4 matrix.
//! (From GLM_GTX_simd_mat4 extension).
detail::fmat4x4SIMD simd_inverse(detail::fmat4x4SIMD const & m);
}//namespace simd_mat4
namespace simd_mat4
{
//! Multiply matrix x by matrix y component-wise, i.e.,
//! result[i][j] is the scalar product of x[i][j] and y[i][j].
//! (From GLM_GTX_simd_mat4 extension).
template <typename matType>
matType matrixCompMult(
matType const & x,
matType const & y);
//! Treats the first parameter c as a column vector //! Treats the first parameter c as a column vector
//! and the second parameter r as a row vector //! and the second parameter r as a row vector
//! and does a linear algebraic matrix multiply c * r. //! and does a linear algebraic matrix multiply c * r.
//! (From GLM_GTX_simd_mat4 extension). //! (From GLM_GTX_simd_mat4 extension).
template <typename vecType, typename matType> detail::fmat4x4SIMD simdOuterProduct(
matType outerProduct( detail::fvec4SIMD const & c,
vecType const & c, detail::fvec4SIMD const & r);
vecType const & r);
//! Returns the transposed matrix of x //! Returns the transposed matrix of x
//! (From GLM_GTX_simd_mat4 extension). //! (From GLM_GTX_simd_mat4 extension).
template <typename matType> detail::fmat4x4SIMD simdTranspose(
typename matType::transpose_type transpose( detail::fmat4x4SIMD const & x);
matType const & x);
//! Return the determinant of a mat4 matrix. //! Return the determinant of a mat4 matrix.
//! (From GLM_GTX_simd_mat4 extension). //! (From GLM_GTX_simd_mat4 extension).
template <typename T> float simdDeterminant(
typename detail::tmat4x4<T>::value_type determinant( detail::fmat4x4SIMD const & m);
detail::tmat4x4<T> const & m);
//! Return the inverse of a mat4 matrix. //! Return the inverse of a mat4 matrix.
//! (From GLM_GTX_simd_mat4 extension). //! (From GLM_GTX_simd_mat4 extension).
template <typename T> detail::fmat4x4SIMD simdInverse(
detail::tmat4x4<T> inverse( detail::fmat4x4SIMD const & m);
detail::tmat4x4<T> const & m);
}//namespace simd_mat4 }//namespace simd_mat4
}//namespace gtx }//namespace gtx

@ -237,7 +237,7 @@ namespace detail
namespace gtx{ namespace gtx{
namespace simd_mat4 namespace simd_mat4
{ {
inline detail::fmat4x4SIMD simd_matrixCompMult inline detail::fmat4x4SIMD simdMatrixCompMult
( (
detail::fmat4x4SIMD const & x, detail::fmat4x4SIMD const & x,
detail::fmat4x4SIMD const & y detail::fmat4x4SIMD const & y
@ -251,21 +251,30 @@ namespace simd_mat4
return result; return result;
} }
inline detail::fmat4x4SIMD simd_transpose(detail::fmat4x4SIMD const & m) inline detail::fmat4x4SIMD simdOuterProduct
(
detail::fvec4SIMD const & c,
detail::fvec4SIMD const & r
)
{
}
inline detail::fmat4x4SIMD simdTranspose(detail::fmat4x4SIMD const & m)
{ {
detail::fmat4x4SIMD result; detail::fmat4x4SIMD result;
detail::sse_transpose_ps(&m[0].Data, &result[0].Data); detail::sse_transpose_ps(&m[0].Data, &result[0].Data);
return result; return result;
} }
inline float simd_determinant(detail::fmat4x4SIMD const & m) inline float simdDeterminant(detail::fmat4x4SIMD const & m)
{ {
float Result; float Result;
_mm_store_ss(&Result, detail::sse_det_ps(&m[0].Data)); _mm_store_ss(&Result, detail::sse_det_ps(&m[0].Data));
return Result; return Result;
} }
inline detail::fmat4x4SIMD simd_inverse(detail::fmat4x4SIMD const & m) inline detail::fmat4x4SIMD simdInverse(detail::fmat4x4SIMD const & m)
{ {
detail::fmat4x4SIMD result; detail::fmat4x4SIMD result;
detail::sse_inverse_ps(&m[0].Data, &result[0].Data); detail::sse_inverse_ps(&m[0].Data, &result[0].Data);

@ -32,10 +32,10 @@ namespace glm
{ {
namespace detail namespace detail
{ {
GLM_ALIGNED(union, 4) fvec4SIMD GLM_ALIGN(4) struct fvec4SIMD
{ {
enum ctor{null}; enum ctor{null};
typedef float value_type; typedef __m128 value_type;
typedef std::size_t size_type; typedef std::size_t size_type;
static size_type value_size(); static size_type value_size();
@ -43,10 +43,6 @@ namespace glm
typedef tvec4<bool> bool_type; typedef tvec4<bool> bool_type;
__m128 Data; __m128 Data;
float Array[4];
struct{float x, y, z, w;};
struct{float r, g, b, a;};
struct{float s, t, q, p;};
////////////////////////////////////// //////////////////////////////////////
// Implicit basic constructors // Implicit basic constructors
@ -54,7 +50,10 @@ namespace glm
fvec4SIMD(); fvec4SIMD();
fvec4SIMD(__m128 const & Data); fvec4SIMD(__m128 const & Data);
fvec4SIMD(fvec4SIMD const & v); fvec4SIMD(fvec4SIMD const & v);
fvec4SIMD(tvec4<float> const & v); fvec4SIMD(tvec4<float> const & v);
//operator detail::tvec4<float>();
//operator detail::tvec4<float> const();
////////////////////////////////////// //////////////////////////////////////
// Explicit basic constructors // Explicit basic constructors
@ -118,43 +117,13 @@ namespace glm
//! GLM_GTX_simd_vec4 extension: SIMD implementation of vec4 type. //! GLM_GTX_simd_vec4 extension: SIMD implementation of vec4 type.
namespace simd_vec4 namespace simd_vec4
{ {
typedef detail::fvec4SIMD simd_vec4; typedef detail::fvec4SIMD simdVec4;
detail::fvec4SIMD simd_length(
detail::fvec4SIMD const & v);
detail::fvec4SIMD simd_cross(
detail::fvec4SIMD const & a,
detail::fvec4SIMD const & b);
detail::fvec4SIMD simd_distance(
detail::fvec4SIMD const & v);
detail::fvec4SIMD simd_dot(
detail::fvec4SIMD const & a,
detail::fvec4SIMD const & b);
detail::fvec4SIMD simd_normalize(
detail::fvec4SIMD const & v);
detail::fvec4SIMD simd_faceforward( //! Convert a simdVec4 to a vec4.
detail::fvec4SIMD const & N, //! (From GLM_GTX_simd_vec4 extension)
detail::fvec4SIMD const & I, detail::tvec4<float> vec4_cast(
detail::fvec4SIMD const & Nref); detail::fvec4SIMD const & x);
detail::fvec4SIMD simd_reflect(
detail::fvec4SIMD const & I,
detail::fvec4SIMD const & N);
detail::fvec4SIMD simd_refract(
detail::fvec4SIMD const & I,
detail::fvec4SIMD const & N,
float const & eta);
}//namespace simd_vec4
namespace simd_vec4
{
//! Returns the length of x, i.e., sqrt(x * x). //! Returns the length of x, i.e., sqrt(x * x).
//! (From GLM_GTX_simd_vec4 extension, geometry functions) //! (From GLM_GTX_simd_vec4 extension, geometry functions)
float simdLength( float simdLength(

@ -35,6 +35,20 @@ namespace glm
Data(_mm_set_ps(v.w, v.z, v.y, v.x)) Data(_mm_set_ps(v.w, v.z, v.y, v.x))
{} {}
inline fvec4SIMD::operator detail::tvec4<float>()
{
detail::tvec4<float> Result;
_mm_store_ps(&Result[0], this->Data);
return Result;
}
//inline fvec4SIMD::operator detail::tvec4<float> const()
//{
// detail::tvec4<float> Result;
// _mm_store_ps(&Result[0], this->Data);
// return Result;
//}
////////////////////////////////////// //////////////////////////////////////
// Explicit basic constructors // Explicit basic constructors
@ -162,14 +176,18 @@ namespace glm
template <comp X, comp Y, comp Z, comp W> template <comp X, comp Y, comp Z, comp W>
inline fvec4SIMD fvec4SIMD::swizzle() const inline fvec4SIMD fvec4SIMD::swizzle() const
{ {
__m128 Data = _mm_shuffle_ps(this->Data, this->Data, mask<(W << 6) | (Z << 4) | (Y << 2) | (X << 0)>::value); __m128 Data = _mm_shuffle_ps(
this->Data, this->Data,
mask<(W << 6) | (Z << 4) | (Y << 2) | (X << 0)>::value);
return fvec4SIMD(Data); return fvec4SIMD(Data);
} }
template <comp X, comp Y, comp Z, comp W> template <comp X, comp Y, comp Z, comp W>
inline fvec4SIMD& fvec4SIMD::swizzle() inline fvec4SIMD& fvec4SIMD::swizzle()
{ {
this->Data = _mm_shuffle_ps(this->Data, this->Data, mask<(W << 6) | (Z << 4) | (Y << 2) | (X << 0)>::value); this->Data = _mm_shuffle_ps(
this->Data, this->Data,
mask<(W << 6) | (Z << 4) | (Y << 2) | (X << 0)>::value);
return *this; return *this;
} }
@ -266,36 +284,23 @@ namespace glm
namespace gtx{ namespace gtx{
namespace simd_vec4 namespace simd_vec4
{ {
# if(GLM_INSTRUCTION_SET & GLM_INSTRUCTION_SET_SSE) inline detail::tvec4<float> vec4_cast
inline detail::fvec4SIMD simd_cross
(
detail::fvec4SIMD const & a,
detail::fvec4SIMD const & b
)
{
return detail::sse_xpd_ps(a.Data, b.Data);
}
# else//(GLM_INSTRUCTION_SET & GLM_INSTRUCTION_SET_PURE)
inline detail::fvec4SIMD simd_cross
( (
detail::fvec4SIMD const & a, detail::fvec4SIMD const & x
detail::fvec4SIMD const & b
) )
{ {
return detail::sse_xpd_ps(a.Data, b.Data); detail::tvec4<float> Result;
_mm_store_ps(&Result[0], x.Data);
return Result;
} }
# endif
}//namespace simd_vec4
namespace simd_vec4
{
inline float simdLength inline float simdLength
( (
detail::fvec4SIMD const & x detail::fvec4SIMD const & x
) )
{ {
float Result = 0; float Result = 0;
_mm_store_ss(sse_len_ps(x.data), &Result); _mm_store_ss(&Result, detail::sse_len_ps(x.Data));
return Result; return Result;
} }
@ -306,7 +311,7 @@ namespace glm
) )
{ {
float Result = 0; float Result = 0;
_mm_store_ss(sse_dst_ps(p0.data, p1.data), &Result); _mm_store_ss(&Result, detail::sse_dst_ps(p0.Data, p1.Data));
return Result; return Result;
} }
@ -317,7 +322,7 @@ namespace glm
) )
{ {
float Result = 0; float Result = 0;
_mm_store_ss(sse_dot_ss(x.data, y.data), &Result); _mm_store_ss(&Result, detail::sse_dot_ss(x.Data, y.Data));
return Result; return Result;
} }
@ -327,7 +332,7 @@ namespace glm
detail::fvec4SIMD const & y detail::fvec4SIMD const & y
) )
{ {
return sse_xpd_ps(x.data, y.data); return detail::sse_xpd_ps(x.Data, y.Data);
} }
inline detail::fvec4SIMD simdNormalize inline detail::fvec4SIMD simdNormalize
@ -335,7 +340,7 @@ namespace glm
detail::fvec4SIMD const & x detail::fvec4SIMD const & x
) )
{ {
return _mm_nrm_ps(x.data); return detail::sse_nrm_ps(x.Data);
} }
inline detail::fvec4SIMD simdFaceforward inline detail::fvec4SIMD simdFaceforward
@ -345,7 +350,7 @@ namespace glm
detail::fvec4SIMD const & Nref detail::fvec4SIMD const & Nref
) )
{ {
return _mm_ffd_ps(N.data, I.data, Nref.data); return detail::sse_ffd_ps(N.Data, I.Data, Nref.Data);
} }
inline detail::fvec4SIMD simdReflect inline detail::fvec4SIMD simdReflect
@ -354,7 +359,7 @@ namespace glm
detail::fvec4SIMD const & N detail::fvec4SIMD const & N
) )
{ {
return detail::fvec4SIMD(_mm_rfe_ps(I.data, N.data)); return detail::sse_rfe_ps(I.Data, N.Data);
} }
inline detail::fvec4SIMD simdRefract inline detail::fvec4SIMD simdRefract
@ -364,7 +369,7 @@ namespace glm
float const & eta float const & eta
) )
{ {
return detail::fvec4SIMD(_mm_rfa_ps(I.data, N.data, _mm_set1_ps(eta))); return detail::sse_rfa_ps(I.Data, N.Data, _mm_set1_ps(eta));
} }
}//namespace simd_vec4 }//namespace simd_vec4

@ -42,8 +42,10 @@ std::vector<float> test_detB(std::vector<glm::mat4> const & Data)
for(std::size_t i = 0; i < Test.size() - 1; ++i) for(std::size_t i = 0; i < Test.size() - 1; ++i)
{ {
_mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0); _mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0);
glm::simd_mat4 m(Data[i]); glm::simdMat4 m(Data[i]);
Test[i] = glm::simd_vec4(glm::detail::sse_slow_det_ps((__m128 const * const)&m)).x; glm::simdVec4 d(glm::detail::sse_slow_det_ps((__m128 const * const)&m));
glm::vec4 v;//(d);
Test[i] = v.x;
} }
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
@ -61,8 +63,10 @@ std::vector<float> test_detC(std::vector<glm::mat4> const & Data)
for(std::size_t i = 0; i < Test.size() - 1; ++i) for(std::size_t i = 0; i < Test.size() - 1; ++i)
{ {
_mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0); _mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0);
glm::simd_mat4 m(Data[i]); glm::simdMat4 m(Data[i]);
Test[i] = glm::simd_vec4(glm::detail::sse_det_ps((__m128 const * const)&m)).x; glm::simdVec4 d(glm::detail::sse_det_ps((__m128 const * const)&m));
glm::vec4 v;//(d);
Test[i] = v.x;
} }
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
@ -80,8 +84,10 @@ std::vector<float> test_detD(std::vector<glm::mat4> const & Data)
for(std::size_t i = 0; i < Test.size() - 1; ++i) for(std::size_t i = 0; i < Test.size() - 1; ++i)
{ {
_mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0); _mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0);
glm::simd_mat4 m(Data[i]); glm::simdMat4 m(Data[i]);
Test[i] = glm::simd_vec4(glm::detail::sse_detd_ps((__m128 const * const)&m)).x; glm::simdVec4 d(glm::detail::sse_detd_ps((__m128 const * const)&m));
glm::vec4 v;//(d);
Test[i] = v.x;
} }
std::clock_t TimeEnd = clock(); std::clock_t TimeEnd = clock();
@ -116,8 +122,8 @@ void test_invC(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out
for(std::size_t i = 0; i < Out.size() - 1; ++i) for(std::size_t i = 0; i < Out.size() - 1; ++i)
{ {
_mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0); _mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0);
glm::simd_mat4 m(Data[i]); glm::simdMat4 m(Data[i]);
glm::simd_mat4 o; glm::simdMat4 o;
glm::detail::sse_inverse_fast_ps((__m128 const * const)&m, (__m128 *)&o); glm::detail::sse_inverse_fast_ps((__m128 const * const)&m, (__m128 *)&o);
Out[i] = *(glm::mat4*)&o; Out[i] = *(glm::mat4*)&o;
} }
@ -136,8 +142,8 @@ void test_invD(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out
for(std::size_t i = 0; i < Out.size() - 1; ++i) for(std::size_t i = 0; i < Out.size() - 1; ++i)
{ {
_mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0); _mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0);
glm::simd_mat4 m(Data[i]); glm::simdMat4 m(Data[i]);
glm::simd_mat4 o; glm::simdMat4 o;
glm::detail::sse_inverse_ps((__m128 const * const)&m, (__m128 *)&o); glm::detail::sse_inverse_ps((__m128 const * const)&m, (__m128 *)&o);
Out[i] = *(glm::mat4*)&o; Out[i] = *(glm::mat4*)&o;
} }
@ -172,7 +178,7 @@ void test_mulD(std::vector<glm::mat4> const & Data, std::vector<glm::mat4> & Out
for(std::size_t i = 0; i < Out.size() - 1; ++i) for(std::size_t i = 0; i < Out.size() - 1; ++i)
{ {
_mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0); _mm_prefetch((char*)&Data[i + 1], _MM_HINT_T0);
glm::simd_mat4 m(Data[i]); glm::simdMat4 m(Data[i]);
glm::detail::sse_mul_ps((__m128 const * const)&m, (__m128 const * const)&m, (__m128*)&Out[i]); glm::detail::sse_mul_ps((__m128 const * const)&m, (__m128 const * const)&m, (__m128*)&Out[i]);
} }
@ -267,15 +273,15 @@ int main()
} }
// shuffle test // shuffle test
glm::simd_vec4 A(1.0f, 2.0f, 3.0f, 4.0f); glm::simdVec4 A(1.0f, 2.0f, 3.0f, 4.0f);
glm::simd_vec4 B(5.0f, 6.0f, 7.0f, 8.0f); glm::simdVec4 B(5.0f, 6.0f, 7.0f, 8.0f);
__m128 C = _mm_shuffle_ps(A.Data, B.Data, _MM_SHUFFLE(1, 0, 1, 0)); __m128 C = _mm_shuffle_ps(A.Data, B.Data, _MM_SHUFFLE(1, 0, 1, 0));
Failed += test_compute_glm(); Failed += test_compute_glm();
Failed += test_compute_gtx(); Failed += test_compute_gtx();
float Det = glm::simd_determinant(glm::simd_mat4(1.0)); float Det = glm::simdDeterminant(glm::simdMat4(1.0));
glm::simd_mat4 B = glm::simd_matrixCompMult(glm::simd_mat4(1.0), glm::simd_mat4(1.0)); glm::simdMat4 D = glm::simdMatrixCompMult(glm::simdMat4(1.0), glm::simdMat4(1.0));
system("pause"); system("pause");

@ -13,15 +13,18 @@
int main() int main()
{ {
glm::simd_vec4 A1(0.0f, 0.1f, 0.2f, 0.3f); glm::simdVec4 A1(0.0f, 0.1f, 0.2f, 0.3f);
glm::simd_vec4 B1(0.4f, 0.5f, 0.6f, 0.7f); glm::simdVec4 B1(0.4f, 0.5f, 0.6f, 0.7f);
glm::simd_vec4 C1 = A1 + B1; glm::simdVec4 C1 = A1 + B1;
glm::simd_vec4 D1 = A1.swizzle<glm::X, glm::Z, glm::Y, glm::W>(); glm::simdVec4 D1 = A1.swizzle<glm::X, glm::Z, glm::Y, glm::W>();
glm::simdVec4 E1 = glm::vec4(1.0f);
glm::vec4 F1 = E1;
//glm::vec4 G1(E1);
printf("A1(%2.3f, %2.3f, %2.3f, %2.3f)\n", A1.x, A1.y, A1.z, A1.w); //printf("A1(%2.3f, %2.3f, %2.3f, %2.3f)\n", A1.x, A1.y, A1.z, A1.w);
printf("B1(%2.3f, %2.3f, %2.3f, %2.3f)\n", B1.x, B1.y, B1.z, B1.w); //printf("B1(%2.3f, %2.3f, %2.3f, %2.3f)\n", B1.x, B1.y, B1.z, B1.w);
printf("C1(%2.3f, %2.3f, %2.3f, %2.3f)\n", C1.x, C1.y, C1.z, C1.w); //printf("C1(%2.3f, %2.3f, %2.3f, %2.3f)\n", C1.x, C1.y, C1.z, C1.w);
printf("D1(%2.3f, %2.3f, %2.3f, %2.3f)\n", D1.x, D1.y, D1.z, D1.w); //printf("D1(%2.3f, %2.3f, %2.3f, %2.3f)\n", D1.x, D1.y, D1.z, D1.w);
return 0; return 0;
} }

Loading…
Cancel
Save