Browse Source

Improved simd cast and added duplicated values function with smind instructions

Christophe Riccio 15 years ago
parent
commit
8387847c42
5 changed files with 65 additions and 20 deletions
  1. 5 0
      glm/gtx/simd_mat4.hpp
  2. 13 0
      glm/gtx/simd_mat4.inl
  3. 19 4
      glm/gtx/simd_vec4.hpp
  4. 26 14
      glm/gtx/simd_vec4.inl
  5. 2 2
      test/gtx/gtx-simd-vec4.cpp

+ 5 - 0
glm/gtx/simd_mat4.hpp

@@ -134,6 +134,11 @@ namespace glm
 	{
 	{
 		typedef detail::fmat4x4SIMD simdMat4;
 		typedef detail::fmat4x4SIMD simdMat4;
 
 
+		//! Convert a simdMat4 to a mat4.
+		//! (From GLM_GTX_simd_mat4 extension)
+		detail::tmat4x4<float> mat4_cast(
+			detail::fmat4x4SIMD const & x);
+
 		//! 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).

+ 13 - 0
glm/gtx/simd_mat4.inl

@@ -237,6 +237,19 @@ namespace detail
 namespace gtx{
 namespace gtx{
 namespace simd_mat4
 namespace simd_mat4
 {
 {
+	inline detail::tmat4x4<float> mat4_cast
+	(
+		detail::fmat4x4SIMD const & x
+	)
+	{
+		detail::tmat4x4<float> Result;
+		_mm_store_ps(&Result[0][0], x.Data[0].Data);
+		_mm_store_ps(&Result[1][0], x.Data[1].Data);
+		_mm_store_ps(&Result[2][0], x.Data[2].Data);
+		_mm_store_ps(&Result[3][0], x.Data[3].Data);
+		return Result;
+	}
+
 	inline detail::fmat4x4SIMD simdMatrixCompMult
 	inline detail::fmat4x4SIMD simdMatrixCompMult
 	(
 	(
 		detail::fmat4x4SIMD const & x,
 		detail::fmat4x4SIMD const & x,

+ 19 - 4
glm/gtx/simd_vec4.hpp

@@ -51,10 +51,6 @@ namespace glm
 			fvec4SIMD(__m128 const & Data);
 			fvec4SIMD(__m128 const & Data);
 			fvec4SIMD(fvec4SIMD const & v);
 			fvec4SIMD(fvec4SIMD const & v);
 
 
-			fvec4SIMD(tvec4<float> const & v);
-			//operator detail::tvec4<float>();
-			//operator detail::tvec4<float> const();
-
 			//////////////////////////////////////
 			//////////////////////////////////////
 			// Explicit basic constructors
 			// Explicit basic constructors
 
 
@@ -67,6 +63,8 @@ namespace glm
 				float const & y, 
 				float const & y, 
 				float const & z, 
 				float const & z, 
 				float const & w);
 				float const & w);
+			explicit fvec4SIMD(
+				tvec4<float> const & v);
 
 
 			////////////////////////////////////////
 			////////////////////////////////////////
 			//// Convertion vector constructors
 			//// Convertion vector constructors
@@ -129,18 +127,35 @@ namespace glm
 		float simdLength(
 		float simdLength(
 			detail::fvec4SIMD const & x);
 			detail::fvec4SIMD const & x);
 
 
+		//! Returns the length of x, i.e., sqrt(x * x).
+		//! (From GLM_GTX_simd_vec4 extension, geometry functions)
+		detail::fvec4SIMD simdLength4(
+			detail::fvec4SIMD const & x);
+
 		//! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).
 		//! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).
 		//! (From GLM_GTX_simd_vec4 extension, geometry functions)
 		//! (From GLM_GTX_simd_vec4 extension, geometry functions)
 		float simdDistance(
 		float simdDistance(
 			detail::fvec4SIMD const & p0,
 			detail::fvec4SIMD const & p0,
 			detail::fvec4SIMD const & p1);
 			detail::fvec4SIMD const & p1);
 
 
+		//! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1).
+		//! (From GLM_GTX_simd_vec4 extension, geometry functions)
+		detail::fvec4SIMD simdDistance4(
+			detail::fvec4SIMD const & p0,
+			detail::fvec4SIMD const & p1);
+
 		//! Returns the dot product of x and y, i.e., result = x * y.
 		//! Returns the dot product of x and y, i.e., result = x * y.
 		//! (From GLM_GTX_simd_vec4 extension, geometry functions)
 		//! (From GLM_GTX_simd_vec4 extension, geometry functions)
 		float simdDot(
 		float simdDot(
 			detail::fvec4SIMD const & x,
 			detail::fvec4SIMD const & x,
 			detail::fvec4SIMD const & y);
 			detail::fvec4SIMD const & y);
 
 
+		//! Returns the dot product of x and y, i.e., result = x * y.
+		//! (From GLM_GTX_simd_vec4 extension, geometry functions)
+		detail::fvec4SIMD simdDot4(
+			detail::fvec4SIMD const & x,
+			detail::fvec4SIMD const & y);
+
 		//! Returns the cross product of x and y.
 		//! Returns the cross product of x and y.
 		//! (From GLM_GTX_simd_vec4 extension, geometry functions)
 		//! (From GLM_GTX_simd_vec4 extension, geometry functions)
 		detail::fvec4SIMD simdCross(
 		detail::fvec4SIMD simdCross(

+ 26 - 14
glm/gtx/simd_vec4.inl

@@ -35,20 +35,6 @@ 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
 
 
@@ -304,6 +290,14 @@ namespace glm
 			return Result;
 			return Result;
 		}
 		}
 
 
+		inline detail::fvec4SIMD simdLength4
+		(
+			detail::fvec4SIMD const & x
+		)
+		{
+			return detail::sse_len_ps(x.Data);
+		}
+
 		inline float simdDistance
 		inline float simdDistance
 		(
 		(
 			detail::fvec4SIMD const & p0,
 			detail::fvec4SIMD const & p0,
@@ -315,6 +309,15 @@ namespace glm
 			return Result;
 			return Result;
 		}
 		}
 
 
+		inline detail::fvec4SIMD simdDistance4
+		(
+			detail::fvec4SIMD const & p0,
+			detail::fvec4SIMD const & p1
+		)
+		{
+			return detail::sse_dst_ps(p0.Data, p1.Data);
+		}
+
 		inline float simdDot
 		inline float simdDot
 		(
 		(
 			detail::fvec4SIMD const & x,
 			detail::fvec4SIMD const & x,
@@ -326,6 +329,15 @@ namespace glm
 			return Result;
 			return Result;
 		}
 		}
 
 
+		inline detail::fvec4SIMD simdDot4
+		(
+			detail::fvec4SIMD const & x,
+			detail::fvec4SIMD const & y
+		)
+		{
+			return detail::sse_dot_ss(x.Data, y.Data);
+		}
+
 		inline detail::fvec4SIMD simdCross
 		inline detail::fvec4SIMD simdCross
 		(
 		(
 			detail::fvec4SIMD const & x,
 			detail::fvec4SIMD const & x,

+ 2 - 2
test/gtx/gtx-simd-vec4.cpp

@@ -17,8 +17,8 @@ int main()
 	glm::simdVec4 B1(0.4f, 0.5f, 0.6f, 0.7f);
 	glm::simdVec4 B1(0.4f, 0.5f, 0.6f, 0.7f);
 	glm::simdVec4 C1 = A1 + B1;
 	glm::simdVec4 C1 = A1 + B1;
 	glm::simdVec4 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::simdVec4 E1(glm::vec4(1.0f));
+	glm::vec4 F1 = glm::vec4_cast(E1);
 	//glm::vec4 G1(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);