changeset 976:4bc1d14d6851

extended SSE asm tests
author thomask
date Fri, 28 Apr 2006 08:48:17 +0000
parents 5f982ba378c4
children 1aba99b7f01c
files run/a/asm_addpd_01_A.d run/a/asm_addps_01_A.d run/a/asm_addsd_01.d run/a/asm_addsd_01_A.d run/a/asm_addss_01.d run/a/asm_addss_01_A.d run/a/asm_addsubpd_01_A.d run/a/asm_addsubps_01_A.d run/a/asm_cmpisd_01_A.d run/a/asm_cmpiss_01_A.d run/a/asm_cmppd_01_A.d run/a/asm_cmpps_01_A.d run/a/asm_cmpsd_01_A.d run/a/asm_cmpss_01_A.d run/a/asm_cvtdq2pd_01_A.d run/a/asm_cvtdq2ps_01_A.d run/a/asm_cvtpd2dq_01_A.d run/a/asm_fnstsw_01.d run/a/asm_fstsw_01.d
diffstat 19 files changed, 682 insertions(+), 73 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_addpd_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,43 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_addpd_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static double[2] A = [1.123, 1234.5];
+		static double[2] B = [0.0012, -2.4];
+		double[2] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			addpd XMM0, XMM1;
+			movdqu c, XMM0;
+		}
+
+		c[0] -= 1.1242;
+		if(c[0] < 0.0){
+			c[0] = -c[0];
+		}
+
+		if(c[0] > double.epsilon * 16){
+			assert(0);
+		}
+
+		c[1] -= 1232.1;
+		if(c[1] < 0.0){
+			c[1] = -c[1];
+		}
+
+		if(c[1] > double.epsilon * 16){
+			assert(0);
+		}
+
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_addps_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,59 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_addps_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static float[4] A = [1.0f, 20.0f, 0.4f, 1.0f];
+		static float[4] B = [4.0f, 10.0f, 4.0f, -1.0f];
+		float[4] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			addps XMM0, XMM1;
+			movdqu c, XMM0;
+		}
+
+		c[0] -= 5.0f;
+		if(c[0] < 0.0){
+			c[0] = -c[0];
+		}
+
+		if(c[0] > float.epsilon * 16){
+			assert(0);
+		}
+
+		c[1] -= 30.0f;
+		if(c[1] < 0.0){
+			c[1] = -c[1];
+		}
+
+		if(c[1] > float.epsilon * 16){
+			assert(0);
+		}
+
+		c[2] -= 4.4f;
+		if(c[2] < 0.0){
+			c[2] = -c[2];
+		}
+
+		if(c[2] > float.epsilon * 16){
+			assert(0);
+		}
+
+		if(c[3] < 0.0){
+			c[3] = -c[3];
+		}
+
+		if(c[3] > float.epsilon * 16){
+			assert(0);
+		}
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- a/run/a/asm_addsd_01.d	Fri Apr 28 01:22:57 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-// $HeadURL$
-// $Date$
-// $Author$
-
-module dstress.run.a.asm_addsd_01;
-
-int main(){
-	version(D_InlineAsm){
-		double a = 1.2;
-		double b = 0.2;
-		double c = 1.4;
-		
-		asm{
-			movq XMM0, a;
-			movq XMM1, b;
-			addsd XMM1, XMM0;
-			movq c, XMM1;
-		}
-		
-		a += b;
-		
-		b = a-c;
-		b = (b>0) ? b : (-1 * b);
-		
-		assert(b < b.epsilon*4);
-		
-		return 0;
-	}else{
-		pragma(msg, "no Inline asm support");
-		static assert(0);
-	}
-}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_addsd_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,39 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_addsd_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static double[2] A = [1.0, 20.0];
+		static double[2] B = [4.0, 10.0];
+		double[2] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			addsd XMM0, XMM1;
+			movdqu c, XMM0;
+		}
+
+		c[0] -= 5.0;
+		if(c[0] < 0.0){
+			c[0] = -c[0];
+		}
+
+		if(c[0] > double.epsilon * 16){
+			assert(0);
+		}
+
+		c[1] -= 20.0;
+		if(c[1] < 0.0){
+			c[1] = -c[1];
+		}
+
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- a/run/a/asm_addss_01.d	Fri Apr 28 01:22:57 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-// $HeadURL$
-// $Date$
-// $Author$
-
-module dstress.run.a.asm_addss_01;
-
-int main(){
-	version(D_InlineAsm){
-		float a = 1.2;
-		float b = 0.2;
-		float c = 1.4;
-		
-		asm{
-			movd XMM0, a;
-			movd XMM1, b;
-			addss XMM1, XMM0;
-			movd c, XMM1;
-		}
-		
-		a += b;
-		
-		b = a-c;
-		b = (b>0) ? b : (-1 * b);
-		
-		assert(b < b.epsilon*4);
-		
-		return 0;
-	}else{
-		pragma(msg, "no Inline asm support");
-		static assert(0);
-	}
-}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_addss_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,60 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_addss_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static float[4] A = [1.0f, 20.0f, 0.4f, 2.0f];
+		static float[4] B = [4.0f, 10.0f, -4.0f, -0.4f];
+		float[4] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			addss XMM0, XMM1;
+			movdqu c, XMM0;
+		}
+
+		c[0] -= 5.0f;
+		if(c[0] < 0.0){
+			c[0] = -c[0];
+		}
+
+		if(c[0] > float.epsilon * 16){
+			assert(0);
+		}
+
+		c[1] -= 20.0f;
+		if(c[1] < 0.0){
+			c[1] = -c[1];
+		}
+
+		if(c[1] > float.epsilon * 16){
+			assert(0);
+		}
+
+		c[2] -= 0.4f;
+		if(c[2] < 0.0){
+			c[2] = -c[2];
+		}
+
+		if(c[2] > float.epsilon * 16){
+			assert(0);
+		}
+
+		c[3] -= 2.0f;
+		if(c[3] < 0.0){
+			c[3] = -c[3];
+		}
+
+		if(c[3] > float.epsilon * 16){
+			assert(0);
+		}
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_addsubpd_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,42 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_addsubpd_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static double[2] A = [1.0, 30.0];
+		static double[2] B = [4.0, 10.0];
+		double[2] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			addsubpd XMM0, XMM1;
+			movdqu c, XMM0;
+		}
+
+		c[0] += 3.0;
+		if(c[0] < 0.0){
+			c[0] = -c[0];
+		}
+
+		if(c[0] > double.epsilon * 16){
+			assert(0);
+		}
+
+		c[1] -= 40.0;
+		if(c[1] < 0.0){
+			c[1] = -c[1];
+		}
+
+		if(c[1] > double.epsilon * 16){
+			assert(0);
+		}
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_addsubps_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,60 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_addsubps_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static float[4] A = [1.0f, 2.0f, 3.0f, 4.0f];
+		static float[4] B = [0.1f, 0.2f, 0.3f, 0.4f];
+		float[4] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			addsubps XMM0, XMM1;
+			movdqu c, XMM0;
+		}
+
+		c[0] -= 0.9f;
+		if(c[0] < 0.0){
+			c[0] = -c[0];
+		}
+
+		if(c[0] > float.epsilon * 16){
+			assert(0);
+		}
+
+		c[1] -= 2.2f;
+		if(c[1] < 0.0){
+			c[1] = -c[1];
+		}
+
+		if(c[1] > float.epsilon * 16){
+			assert(0);
+		}
+
+		c[2] -= 2.7f;
+		if(c[2] < 0.0){
+			c[2] = -c[2];
+		}
+
+		if(c[2] > float.epsilon * 16){
+			assert(0);
+		}
+
+		c[3] -= 4.4f;
+		if(c[3] < 0.0){
+			c[3] = -c[3];
+		}
+
+		if(c[3] > float.epsilon * 16){
+			assert(0);
+		}
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_cmpisd_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,51 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_cmpisd_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static double[2] A = [1.0, 2.0];
+		static double[2] B = [0.0, 1.0];
+		uint i;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			comisd XMM0, XMM1;
+			mov EAX, 0;
+			jc done_1;
+			jz done_1;
+			jp done_1;
+			inc EAX;
+		done_1:
+			mov i, EAX;
+		}
+
+		if(i != 1){
+			assert(0);
+		}
+
+		asm{
+			movdqu XMM0, B;
+			movdqu XMM1, A;
+			comisd XMM0, XMM1;
+			mov EAX, 0;
+			jnc done_2;
+			jz done_2;
+			jp done_2;
+			inc EAX;
+		done_2:
+			mov i, EAX;
+		}
+
+		if(i != 1){
+			assert(0);
+		}
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_cmpiss_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,51 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_cmpiss_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static float[4] A = [1.0f, 2.0f, 3.0f, -8.0f];
+		static float[4] B = [0.0f, 4.0f, 3.0f, -4.0f];
+		uint i;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			comiss XMM0, XMM1;
+			mov EAX, 0;
+			jc done_1;
+			jz done_1;
+			jp done_1;
+			inc EAX;
+		done_1:
+			mov i, EAX;
+		}
+
+		if(i != 1){
+			assert(0);
+		}
+
+		asm{
+			movdqu XMM0, B;
+			movdqu XMM1, A;
+			comiss XMM0, XMM1;
+			mov EAX, 0;
+			jnc done_2;
+			jz done_2;
+			jp done_2;
+			inc EAX;
+		done_2:
+			mov i, EAX;
+		}
+
+		if(i != 1){
+			assert(0);
+		}
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_cmppd_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,31 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_cmppd_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static double[2] A = [1.0, 2.0f];
+		static double[2] B = [1.1, 2.0f];
+		ulong[2] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			cmppd XMM0, XMM1, 0;
+			movdqu c, XMM0;
+		}
+
+		if(c[0]){
+			assert(0);
+		}
+		if(c[1] != ulong.max){
+			assert(0);
+		}
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_cmpps_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,37 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_cmpps_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static float[4] A = [1.0f, 2.0f, 3.0f, 4.0f];
+		static float[4] B = [1.1f, 1.9f, 3.0f, 4.1f];
+		uint[4] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			cmpps XMM0, XMM1, 0;
+			movdqu c, XMM0;
+		}
+
+		if(c[0]){
+			assert(0);
+		}
+		if(c[1]){
+			assert(0);
+		}
+		if(c[2] != uint.max){
+			assert(0);
+		}
+		if(c[3]){
+			assert(0);
+		}
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_cmpsd_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,34 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_cmpsd_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static double[2] A = [1.0, 2.0];
+		static double[2] B = [1.0, 2.0];
+		ulong[2] c;
+		double[2] d;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			cmpsd XMM0, XMM1, 0;
+			movdqu c, XMM0;
+			movdqu d, XMM0;
+		}
+
+		if(c[0] != ulong.max){
+			assert(0);
+		}
+		if(d[1] != A[1]){
+			assert(0);
+		}
+
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_cmpss_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,39 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_cmpss_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static float[4] A = [1.0f, 2.0f, 3.0f, 4.0];
+		uint[4] c;
+		float[4] f;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, A;
+			cmpss XMM0, XMM1, 0;
+			movdqu c, XMM0;
+			movdqu f, XMM0;
+		}
+
+		if(c[0] != uint.max){
+			assert(0);
+		}
+		if(f[1] != A[1]){
+			assert(0);
+		}
+		if(f[2] != A[2]){
+			assert(0);
+		}
+		if(f[3] != A[3]){
+			assert(0);
+		}
+
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_cvtdq2pd_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,30 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_cvtdq2pd_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static int[4] A = [0, -1, 2, -3];
+		double[2] b;
+
+		asm{
+			movdqu XMM0, A;
+			cvtdq2pd XMM1, XMM0;
+			movdqu b, XMM1;
+		}
+
+		if(b[0] != 0){
+			assert(0);
+		}
+		if(b[1] != -1){
+			assert(0);
+		}
+
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_cvtdq2ps_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,36 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_cvtdq2ps_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static int[4] A = [0, -1, 2, -3];
+		float[4] b;
+
+		asm{
+			movdqu XMM0, A;
+			cvtdq2ps XMM1, XMM0;
+			movdqu b, XMM1;
+		}
+
+		if(b[0] != 0.0f){
+			assert(0);
+		}
+		if(b[1] != -1.0f){
+			assert(0);
+		}
+		if(b[2] != 2.0f){
+			assert(0);
+		}
+		if(b[3] != -3.0f){
+			assert(0);
+		}
+
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_cvtpd2dq_01_A.d	Fri Apr 28 08:48:17 2006 +0000
@@ -0,0 +1,36 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_cvtpd2dq_01_A;
+
+int main(){
+	version(D_InlineAsm_X86){
+		static double[2] A = [-2.0, 4.0];
+		int[4] b;
+
+		asm{
+			movdqu XMM0, A;
+			cvtpd2dq XMM1, XMM0;
+			movdqu b, XMM1;
+		}
+
+		if(b[0] != -2){
+			assert(0);
+		}
+		if(b[1] != 4){
+			assert(0);
+		}
+		if(b[2] != 0){
+			assert(0);
+		}
+		if(b[3] != 0){
+			assert(0);
+		}
+
+		return 0;
+	}else{
+		pragma(msg, "no Inline asm support");
+		static assert(0);
+	}
+}
--- a/run/a/asm_fnstsw_01.d	Fri Apr 28 01:22:57 2006 +0000
+++ b/run/a/asm_fnstsw_01.d	Fri Apr 28 08:48:17 2006 +0000
@@ -5,11 +5,23 @@
 module dstress.run.a.asm_fnstsw_01;
 
 int main(){
-	version(D_InlineAsm){
-		short s;
+	version(D_InlineAsm_X86){
+		ushort a;
+		uint b;
 		
 		asm{
-			fnstsw s;
+			mov EAX, 0x1234_ABCD;
+			fnstsw a;
+			fnstsw AX;
+			mov b, EAX;
+		}
+
+		if((b & 0xFFFF_0000) != 0x1234_0000){
+			assert(0);
+		}
+
+		if(a != (b & 0xFFFF)){
+			assert(0);
 		}
 		
 		return 0;
@@ -17,4 +29,4 @@
 		pragma(msg, "no Inline asm support");
 		static assert(0);
 	}
-}
\ No newline at end of file
+}
--- a/run/a/asm_fstsw_01.d	Fri Apr 28 01:22:57 2006 +0000
+++ b/run/a/asm_fstsw_01.d	Fri Apr 28 08:48:17 2006 +0000
@@ -5,16 +5,29 @@
 module dstress.run.a.asm_fstsw_01;
 
 int main(){
-	version(D_InlineAsm){
-		short s;
-		
+	version(D_InlineAsm_X86){
+		short a;
+		int b;
+
 		asm{
-			fstsw s;
+			mov EAX, 0x1234_ABCD;
+			fstsw a;
+			fstsw AX;
+			mov b, EAX;
 		}
+
+		if((b & 0xFFFF_0000) != 0x1234_0000){
+			assert(0);
+		}
+
+		if(a != (b & 0xFFFF)){
+			assert(0);
+		}
+
 		
 		return 0;
 	}else{
 		pragma(msg, "no Inline asm support");
 		static assert(0);
 	}
-}
\ No newline at end of file
+}