Browse Source

Provides NEON implementation for Matrix::transformVector(float x, float y, float z, float w, Vector3* dst)

Kieran Cunney 13 năm trước cách đây
mục cha
commit
2ec7b9128b
1 tập tin đã thay đổi với 31 bổ sung4 xóa
  1. 31 4
      gameplay/src/Matrix.cpp

+ 31 - 4
gameplay/src/Matrix.cpp

@@ -982,10 +982,37 @@ void Matrix::transformVector(float x, float y, float z, float w, Vector3* dst) c
 {
     GP_ASSERT(dst);
 
+#ifdef USE_NEON
+
+    asm volatile(
+    	"vld1.32	{d0[0]},		[%0]	\n\t"	// load x
+		"vld1.32	{d0[1]},    	[%1]	\n\t"	// load y
+		"vld1.32	{d1[0]},		[%2]	\n\t"	// load z
+		"vld1.32	{d1[1]},		[%3]	\n\t"	// load w
+		"vld1.32	{d18 - d21},	[%4]!	\n\t"	// load first 8 elements of matrix m0-m7
+		"vld1.32	{d22 - d25},	[%4]!	\n\t"	// load second 8 elements of matrix m8-m15
+
+    	"vmul.f32 q13,  q9, d0[0]			\n\t"	// Q5 =  (m0-m3)*x
+    	"vmla.f32 q13, q10, d0[1]      		\n\t"	// Q5 +=  (m4-m7)*y
+    	"vmla.f32 q13, q11, d1[0]      		\n\t"	// Q5 +=  (m8-m11)*z
+		"vmla.f32 q13, q12, d1[1]      		\n\t"	// Q5 +=  (m12-m15)*w
+
+    	"vst1.32 {d26[0]}, [%5]!        	\n\t"	// store dst->x
+		"vst1.32 {d26[1]}, [%5]!        	\n\t"	// store dst->y
+		"vst1.32 {d27[0]}, [%5]!        	\n\t"	// store dst->z
+		:
+    	: "r"(&x), "r"(&y), "r"(&z), "r"(&w), "r"(m), "r"(dst)
+        : "q0", "q9", "q10","q11", "q12", "q13", "memory"
+    );
+
+#else
+
     dst->set(
         x * m[0] + y * m[4] + z * m[8] + w * m[12],
         x * m[1] + y * m[5] + z * m[9] + w * m[13],
         x * m[2] + y * m[6] + z * m[10] + w * m[14]);
+
+#endif
 }
 
 void Matrix::transformVector(Vector4* vector) const
@@ -1002,11 +1029,11 @@ void Matrix::transformVector(const Vector4& vector, Vector4* dst) const
 
     asm volatile
     (
-    		"vld1.32	{d0, d1}, [%1]		\n\t"   //Q0 = v
-    		"vld1.32    {d18 - d21}, [%0]!  \n\t"   //Q1 = m
-    		"vld1.32    {d22 - d25}, [%0]!  \n\t"   //Q2 = m+8
+    		"vld1.32	{d0, d1}, [%1]		\n\t"   //Q0 = v (x, y, z, w)
+    		"vld1.32    {d18 - d21}, [%0]!  \n\t"   //Q1 = M (m0-m7)
+    		"vld1.32    {d22 - d25}, [%0]!  \n\t"   //Q2 = M (m8-m15)
 
-    		"vmul.f32   q13, q9, d0[0]      \n\t"   //Q5 = Q1*Q0[0]
+    		"vmul.f32   q13, q9, d0[0]      \n\t"   //Q5 =  Q0*Q0[0]
     		"vmla.f32   q13, q10, d0[1]     \n\t"   //Q5 += Q1*Q0[1]
     		"vmla.f32   q13, q11, d1[0]     \n\t"   //Q5 += Q2*Q0[2]
     		"vmla.f32   q13, q12, d1[1]     \n\t"   //Q5 += Q3*Q0[3]