changeset 1019:d9dbc4d0698f

inline ASM review
author thomask
date Tue, 23 May 2006 18:21:32 +0000
parents 1b6d9acddb76
children 165fd0587328
files run/a/asm_pmullw_01_A.d run/a/asm_pmuludq_01_A.d run/a/asm_pop_01_A.d run/a/asm_pop_01_B.d run/a/asm_pop_02_A.d run/a/asm_pop_02_B.d run/a/asm_popa_01_A.d run/a/asm_popad_01_A.d run/a/asm_por_01.d run/a/asm_por_02_A.d run/a/asm_por_02_B.d run/a/asm_prefetchnta_01.d run/a/asm_prefetcht0_01.d run/a/asm_prefetcht1_01.d run/a/asm_prefetcht2_01.d run/a/asm_psadbw_01_A.d run/a/asm_pshufd_01_A.d run/a/asm_pshufhw_01_A.d run/a/asm_pshuflw_01_A.d run/a/asm_pshufw_01_A.d run/a/asm_pslldq_01_A.d
diffstat 21 files changed, 727 insertions(+), 106 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_pmullw_01_A.d	Tue May 23 18:21:32 2006 +0000
@@ -0,0 +1,61 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_pmullw_01_A;
+
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		haveSSE2!()();
+
+		const short[8] A = [-1, 2, 0x7FFF, 7, 0x7FF0, 0x7EDC, 3, -16];
+		const short[8] B = [2, 0, 7, 0x7FFF, 0x00FF, 0x7EDC, 5, 0x7ABC];
+
+		ushort[8] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			pmullw, XMM0, XMM1;
+			movdqu c, XMM0;
+		}
+
+		if(c[0] != 0xFFFE){
+			assert(0);
+		}
+		if(c[1] != 0x0000){
+			assert(0);
+		}
+		if(c[2] != 0x7FF9){
+			assert(0);
+		}
+		if(c[3] != 0x7FF9){
+			assert(0);
+		}
+		if(c[4] != 0x7010){
+			assert(0);
+		}
+		if(c[5] != 0x4D10){
+			assert(0);
+		}
+		if(c[6] != 0x000F){
+			assert(0);
+		}
+		if(c[7] != 0x5440){
+			assert(0);
+		}
+
+		return 0;
+	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_pmuludq_01_A.d	Tue May 23 18:21:32 2006 +0000
@@ -0,0 +1,43 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_pmuludq_01_A;
+
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		haveSSE2!()();
+
+		const uint[4] A = [1, 0x1234_5678, 0xFEDC_A987, 3];
+		const uint[4] B = [0xFFFF_FFFF, 0xABCD, 13, 88];
+
+		ulong[2] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			pmuludq, XMM0, XMM1;
+			movdqu c, XMM0;
+		}
+
+		if(c[0] != 0x0000_0C37__89AB_6618){
+			assert(0);
+		}
+		if(c[1] != 0x0000_0000__0000_0108){
+			assert(0);
+		}
+
+		return 0;
+	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- a/run/a/asm_pop_01_A.d	Mon May 22 20:17:12 2006 +0000
+++ b/run/a/asm_pop_01_A.d	Tue May 23 18:21:32 2006 +0000
@@ -2,15 +2,21 @@
 // $Date$
 // $Author$
 
-module dstress.run.a.asm_push_01_A;
+module dstress.run.a.asm_pop_01_A;
 
-int main(){
-	version(D_InlineAsm){
-		ushort a= 0x12_AB;
-		ushort b= 0x00_00;
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	int main(){
+		ushort a = 0x12_AB;
+		ushort b = 0x00_00;
 		size_t p1, p2, p3;
 		
-		static if(size_t.sizeof==4){
+		static if(size_t.sizeof == 4){
 			asm{
 				mov p1, ESP;
 				push a;
@@ -19,16 +25,23 @@
 				mov p3, ESP;
 			}
 		}else{
+			pragma(msg, "DSTRESS{ERROR}: unhandled size of void pointer");
 			static assert(0);
 		}
 		
-		assert(p1==p3);
-		assert(p1-2==p2);
-		assert(b==0x12_AB);
+		if(p1 != p3){
+			assert(0);
+		}
+		if(p1-2 != p2){
+			assert(0);
+		}
+		if(b != 0x12_AB){
+			assert(0);
+		}
 		
 		return 0;
-	}else{
-		pragma(msg, "no Inline asm support");
-		static assert(0);
 	}
-}
\ No newline at end of file
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- a/run/a/asm_pop_01_B.d	Mon May 22 20:17:12 2006 +0000
+++ b/run/a/asm_pop_01_B.d	Tue May 23 18:21:32 2006 +0000
@@ -2,15 +2,19 @@
 // $Date$
 // $Author$
 
-module dstress.run.a.asm_push_01_B;
+module dstress.run.a.asm_pop_01_B;
+
+version(D_InlineAsm_X86){
+	version = runTest;
+}
 
-int main(){
-	version(D_InlineAsm){
-		static if(size_t.sizeof==4){
-			uint a= 0x12_AB_34_CD;
-			uint b= 0x00_00_00_00;
-			size_t p1, p2, p3;
+version(runTest){
+	int main(){
+		uint a = 0x12AB_34CD;
+		uint b = 0;
+		size_t p1, p2, p3;
 		
+		static if(size_t.sizeof == 4){
 			asm{
 				mov p1, ESP;
 				push a;
@@ -18,14 +22,24 @@
 				pop b;
 				mov p3, ESP;
 			}
+		}else{
+			pragma(msg, "DSTRESS{ERROR}: unhandled size of void pointer");
+			static assert(0);
+		}
 		
-			assert(p1==p3);
-			assert(p1-4==p2);
-			assert(b==0x12_AB_34_CD);
+		if(p1 != p3){
+			assert(0);
 		}
+		if(p1-4 != p2){
+			assert(0);
+		}
+		if(b != 0x12AB_34CD){
+			assert(0);
+		}
+		
 		return 0;
-	}else{
-		pragma(msg, "no Inline asm support");
-		static assert(0);
 	}
-}
\ No newline at end of file
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_pop_02_A.d	Tue May 23 18:21:32 2006 +0000
@@ -0,0 +1,48 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_pop_02_A;
+
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	int main(){
+		ushort a = 0;
+		size_t p1, p2, p3;
+		
+		static if(size_t.sizeof == 4){
+			asm{
+				mov AX, 0x1234;
+				mov p1, ESP;
+				push AX;
+				mov p2, ESP;
+				pop BX;
+				mov p3, ESP;
+				mov a, BX;
+			}
+		}else{
+			pragma(msg, "DSTRESS{ERROR}: unhandled size of void pointer");
+			static assert(0);
+		}
+		
+		if(p1 != p3){
+			assert(0);
+		}
+		if(p1-2 != p2){
+			assert(0);
+		}
+		if(a != 0x12_34){
+			assert(0);
+		}
+		
+		return 0;
+	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_pop_02_B.d	Tue May 23 18:21:32 2006 +0000
@@ -0,0 +1,46 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_pop_02_B;
+
+version(D_InlineAsm_X86){
+	version = runTest;
+}
+
+version(runTest){
+	int main(){
+		uint a = 0;
+		size_t p1, p2, p3;
+		
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, 0xABCD_1234;
+				mov p1, ESP;
+				push EAX;
+				mov p2, ESP;
+				pop EBX;
+				mov p3, ESP;
+				mov a, EBX;
+			}
+		}else{
+			pragma(msg, "DSTRESS{ERROR}: unhandled size of void pointer");
+			static assert(0);
+		}
+		
+		if(p1 != p3){
+			assert(0);
+		}
+		if(p1-4 != p2){
+			assert(0);
+		}
+		if(a != 0xABCD_1234){
+			assert(0);
+		}
+		
+		return 0;
+	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_popa_01_A.d	Tue May 23 18:21:32 2006 +0000
@@ -0,0 +1,48 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_popa_01_A;
+
+version(D_InlineAsm_X86){
+	version = runTest;
+}
+
+version(runTest){
+	int main(){
+		ushort a = 0x12_AB;
+		ushort b = 0x00_00;
+		size_t p1, p2, p3;
+		
+		static if(size_t.sizeof == 4){
+			asm{
+				mov AX, a;
+				mov p1, ESP;
+				pusha;
+				mov p2, ESP;
+				mov AX, b;
+				popa;
+				mov p3, ESP;
+				mov b, AX;
+			}
+		}else{
+			pragma(msg, "DSTRESS{ERROR}: unhandled size of void pointer");
+			static assert(0);
+		}
+		
+		if(p1 != p3){
+			assert(0);
+		}
+		if(p1-16 != p2){
+			assert(0);
+		}
+		if(b != 0x12_AB){
+			assert(0);
+		}
+		
+		return 0;
+	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_popad_01_A.d	Tue May 23 18:21:32 2006 +0000
@@ -0,0 +1,48 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_popad_01_A;
+
+version(D_InlineAsm_X86){
+	version = runTest;
+}
+
+version(runTest){
+	int main(){
+		uint a = 0x1234_ABCD;
+		uint b = 0x00_00;
+		size_t p1, p2, p3;
+		
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				mov p1, ESP;
+				pushad;
+				mov p2, ESP;
+				mov EAX, b;
+				popad;
+				mov p3, ESP;
+				mov b, EAX;
+			}
+		}else{
+			pragma(msg, "DSTRESS{ERROR}: unhandled size of void pointer");
+			static assert(0);
+		}
+		
+		if(p1 != p3){
+			assert(0);
+		}
+		if(p1-32 != p2){
+			assert(0);
+		}
+		if(b != 0x1234_ABCD){
+			assert(0);
+		}
+		
+		return 0;
+	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- a/run/a/asm_por_01.d	Mon May 22 20:17:12 2006 +0000
+++ b/run/a/asm_por_01.d	Tue May 23 18:21:32 2006 +0000
@@ -4,8 +4,18 @@
 
 module dstress.run.a.asm_por_01;
 
-int main(){
-	version(D_InlineAsm){
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		haveMMX!()();
+
 		ulong a = 0xFF01_00FF_0001_0000;
 		ulong b = 0xFF00_10FF_0002_0000;
 		ulong c = 2;
@@ -16,11 +26,13 @@
 			movq c, MM0;
 		}
 		
-		assert(c==0xFF01_10FF_0003_0000);
+		if(c != 0xFF01_10FF_0003_0000){
+			assert(0);
+		}
 
 		return 0;
-	}else{
-		pragma(msg, "no Inline asm support");
-		static assert(0);
 	}
-}
\ No newline at end of file
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- a/run/a/asm_por_02_A.d	Mon May 22 20:17:12 2006 +0000
+++ b/run/a/asm_por_02_A.d	Tue May 23 18:21:32 2006 +0000
@@ -4,14 +4,24 @@
 
 module dstress.run.a.asm_por_02_A;
 
-int main(){
-	version(D_InlineAsm_X86){
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+	
+	int main(){
+		haveSSE2!()();
+
 		static ushort[8] A = [0x1200, 0x0120, 0x0012, 0x2001, 0x0008, 0xFFFF, 0x0000, 0x1111];
 		static ushort[8] B = [0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x0F00, 0x0102, 0x2222];
 		static ushort[8] C = [0x3300, 0x2120, 0x2112, 0x2101, 0x2108, 0xFFFF, 0x0102, 0x3333];
 
-		ushort[8] a = A;
-		ushort[8] b = B;
+		ushort[8] a;
+		ushort[8] b;
 		
 		asm{
 			movdqu XMM0, A;
@@ -34,8 +44,8 @@
 		}
 		
 		return 0;
-	}else{
-		pragma(msg, "no Inline asm support");
-		static assert(0);
 	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
 }
--- a/run/a/asm_por_02_B.d	Mon May 22 20:17:12 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-// $HeadURL$
-// $Date$
-// $Author$
-
-module dstress.run.a.asm_por_02_B;
-
-int main(){
-	version(D_InlineAsm_X86){
-		static ushort[8] A = [0x1200, 0x0120, 0x0012, 0x2001, 0x0008, 0xFFFF, 0x0000, 0x1111];
-		static ushort[8] B = [0x2100, 0x2100, 0x2100, 0x2100, 0x2100, 0x0F00, 0x0102, 0x2222];
-		static ushort[8] C = [0x3300, 0x2120, 0x2112, 0x2101, 0x2108, 0xFFFF, 0x0102, 0x3333];
-
-		ushort[8] a;
-		
-		asm{
-			movdqu XMM0, A;
-			por XMM0, B;
-			movdqu a, XMM0;
-		}
-
-
-		foreach(size_t i, ushort s; C){
-			if(s != a[i]){
-				assert(0);
-			}
-		}
-		
-		return 0;
-	}else{
-		pragma(msg, "no Inline asm support");
-		static assert(0);
-	}
-}
--- a/run/a/asm_prefetchnta_01.d	Mon May 22 20:17:12 2006 +0000
+++ b/run/a/asm_prefetchnta_01.d	Tue May 23 18:21:32 2006 +0000
@@ -4,8 +4,14 @@
 
 module dstress.run.a.asm_prefetchnta_01;
 
-int main(){
-	version(D_InlineAsm_X86){
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	int main(){
 		byte b;
 		
 		asm{
@@ -13,8 +19,8 @@
 		}
 		
 		return 0;
-	}else{
-		pragma(msg, "no Inline asm support");
-		static assert(0);
 	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
 }
--- a/run/a/asm_prefetcht0_01.d	Mon May 22 20:17:12 2006 +0000
+++ b/run/a/asm_prefetcht0_01.d	Tue May 23 18:21:32 2006 +0000
@@ -3,9 +3,14 @@
 // $Author$
 
 module dstress.run.a.asm_prefetcht0_01;
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
 
-int main(){
-	version(D_InlineAsm_X86){
+version(runTest){
+	int main(){
 		byte b;
 		
 		asm{
@@ -13,8 +18,8 @@
 		}
 		
 		return 0;
-	}else{
-		pragma(msg, "no Inline asm support");
-		static assert(0);
 	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
 }
--- a/run/a/asm_prefetcht1_01.d	Mon May 22 20:17:12 2006 +0000
+++ b/run/a/asm_prefetcht1_01.d	Tue May 23 18:21:32 2006 +0000
@@ -4,8 +4,14 @@
 
 module dstress.run.a.asm_prefetch1_01;
 
-int main(){
-	version(D_InlineAsm_X86){
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	int main(){
 		byte b;
 		
 		asm{
@@ -13,8 +19,8 @@
 		}
 		
 		return 0;
-	}else{
-		pragma(msg, "no Inline asm support");
-		static assert(0);
 	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
 }
--- a/run/a/asm_prefetcht2_01.d	Mon May 22 20:17:12 2006 +0000
+++ b/run/a/asm_prefetcht2_01.d	Tue May 23 18:21:32 2006 +0000
@@ -4,8 +4,14 @@
 
 module dstress.run.a.asm_prefetch2_01;
 
-int main(){
-	version(D_InlineAsm_X86){
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	int main(){
 		byte b;
 		
 		asm{
@@ -13,8 +19,8 @@
 		}
 		
 		return 0;
-	}else{
-		pragma(msg, "no Inline asm support");
-		static assert(0);
 	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_psadbw_01_A.d	Tue May 23 18:21:32 2006 +0000
@@ -0,0 +1,60 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_psadbw_01_A;
+
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		haveSSE!()();
+
+		const ubyte[16] A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
+		const ubyte[16] B = [2, 2, 2, 2, 2, 2, 2, 2, 1, 10, 10, 10, 10, 10, 10, 10];
+
+		ushort[8] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			psadbw XMM0, XMM1;
+			movdqu c, XMM0;
+		}
+	
+		if(c[0] != 0){
+			assert(0);
+		}
+		if(c[1] != 0){
+			assert(0);
+		}
+		if(c[2] != 0){
+			assert(0);
+		}
+		if(c[3] != 22){
+			assert(0);
+		}
+		if(c[4] != 0){
+			assert(0);
+		}
+		if(c[5] != 0){
+			assert(0);
+		}
+		if(c[6] != 0){
+			assert(0);
+		}
+		if(c[7] != 21){
+			assert(0);
+		}
+		return 0;
+	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_pshufd_01_A.d	Tue May 23 18:21:32 2006 +0000
@@ -0,0 +1,49 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_pshufd_01_A;
+
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		haveSSE2!()();
+
+		const float[4] A = [1.0f, 2.0f, 3.0f, 4.0f];
+		const float[4] B = [5.0f, 6.0f, 7.0f, 8.0f];
+
+		float[4] c;
+
+		asm{
+			movups XMM0, A;
+			movups XMM1, B;
+			pushfd XMM0, XMM1, 0b01_01_00_10;
+			movups c, XMM0;
+		}
+
+		if(c[0] != 6.0f){
+			assert(0);
+		}
+		if(c[1] != 6.0f){
+			assert(0);
+		}
+		if(c[2] != 5.0f){
+			assert(0);
+		}
+		if(c[3] != 7.0f){
+			assert(0);
+		}
+
+		return 0;
+	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_pshufhw_01_A.d	Tue May 23 18:21:32 2006 +0000
@@ -0,0 +1,61 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_pshufhw_01_A;
+
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		haveSSE2!()();
+
+		const short[8] A = [9, 9, 9, 9, 9, 9, 9, 9];
+		const short[8] B = [1, 2, 3, 4, 5, 6, 7, 8];
+
+		short[8] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			pushfhw XMM0, XMM1, 0b11_10_01_00;
+			movdqu, XMM0;
+		}
+
+		if(c[0] != 4){
+			assert(0);
+		}
+		if(c[1] != 4){
+			assert(0);
+		}
+		if(c[2] != 2){
+			assert(0);
+		}
+		if(c[3] != 1){
+			assert(0);
+		}
+		if(c[4] != 5){
+			assert(0);
+		}
+		if(c[5] != 6){
+			assert(0);
+		}
+		if(c[6] != 7){
+			assert(0);
+		}
+		if(c[7] != 8){
+			assert(0);
+		}
+
+		return 0;
+	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_pshuflw_01_A.d	Tue May 23 18:21:32 2006 +0000
@@ -0,0 +1,61 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_pshuflw_01_A;
+
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		haveSSE2!()();
+
+		const short[8] A = [9, 9, 9, 9, 9, 9, 9, 9];
+		const short[8] B = [1, 2, 3, 4, 5, 6, 7, 8];
+
+		short[8] c;
+
+		asm{
+			movdqu XMM0, A;
+			movdqu XMM1, B;
+			pushflw XMM0, XMM1, 0b11_10_01_00;
+			movdqu, XMM0;
+		}
+
+		if(c[0] != 1){
+			assert(0);
+		}
+		if(c[1] != 2){
+			assert(0);
+		}
+		if(c[2] != 3){
+			assert(0);
+		}
+		if(c[3] != 4){
+			assert(0);
+		}
+		if(c[4] != 8){
+			assert(0);
+		}
+		if(c[5] != 7){
+			assert(0);
+		}
+		if(c[6] != 6){
+			assert(0);
+		}
+		if(c[7] != 5){
+			assert(0);
+		}
+
+		return 0;
+	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/a/asm_pshufw_01_A.d	Tue May 23 18:21:32 2006 +0000
@@ -0,0 +1,49 @@
+// $HeadURL$
+// $Date$
+// $Author$
+
+module dstress.run.a.asm_pshuflw_01_A;
+
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		haveSSE2!()();
+
+		const short[4] A = [9, 9, 9, 9];
+		const short[4] B = [1, 2, 3, 4];
+
+		short[4] c;
+
+		asm{
+			movq MM0, A;
+			movq MM1, B;
+			pushfw MM0, MM1, 0b11_10_01_00;
+			movq c, MM0;
+		}
+
+		if(c[0] != 4){
+			assert(0);
+		}
+		if(c[1] != 3){
+			assert(0);
+		}
+		if(c[2] != 2){
+			assert(0);
+		}
+		if(c[3] != 1){
+			assert(0);
+		}
+
+		return 0;
+	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- a/run/a/asm_pslldq_01_A.d	Mon May 22 20:17:12 2006 +0000
+++ b/run/a/asm_pslldq_01_A.d	Tue May 23 18:21:32 2006 +0000
@@ -4,30 +4,38 @@
 
 module dstress.run.a.asm_pslldq_01_A;
 
-int main(){
-	version(D_InlineAsm_X86){
-		const ubyte[16] a = [0, 1, 2, 3, 4, 5, 6, 7, 8 ,9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF];
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		const ubyte[16] A = [1, 0, 2, 3, 4, 5, 6, 7, 8 ,9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF];
 		ubyte[16] b;
 		
 		asm{
-			movdqu XMM0, a;
-			pslldq XMM0, 2;
+			movdqu XMM0, A;
+			pslldq XMM0, 1;
 			movdqu b, XMM0;
 		}
 
-		for(size_t i = 0; i < c.length-2; i++){
-			if(b[i] != i+2){
+		foreach(size_t i, ubyte x; b[0 .. b.length - 1]){
+			if(x != i){
 				assert(0);
 			}
 		}
 
-		if(b[b.length - 2] || b[b.length - 1]){
+		if(b[$-1] != 0){
 			assert(0);
 		}
-		
+
 		return 0;
-	}else{
-		pragma(msg, "no Inline asm support");
-		static assert(0);
 	}
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
 }