changeset 1329:1c8652b3795a

inline asm review
author thomask
date Fri, 12 Jan 2007 23:07:17 +0000
parents 288d15cd3b95
children f3f715978184
files compile/a/asm_invlpg_01_B.d compile/a/asm_invlpg_01_C.d nocompile/a/asm_fst_02_F.d run/a/asm_cmpiss_01_A.d run/a/asm_comisd_01_A.d run/a/asm_fcmovb_01_A.d run/a/asm_fcmovbe_01_A.d run/a/asm_fcmove_01_A.d run/a/asm_fcmovnb_01_A.d run/a/asm_fcmovnbe_01_A.d run/a/asm_fcmovne_01_A.d run/a/asm_fcmovnu_01_A.d run/a/asm_fcmovu_01_A.d run/a/asm_fcomi_01_A.d run/a/asm_fcomip_01_A.d run/a/asm_fdiv_01_D.d run/a/asm_fdivp_01_A.d run/a/asm_fdivp_01_B.d run/a/asm_fdivr_01_D.d run/a/asm_fdivrp_01_A.d run/a/asm_fdivrp_01_B.d run/a/asm_fsubp_01_A.d run/a/asm_fsubp_01_B.d run/a/asm_fsubrp_01_A.d run/a/asm_fsubrp_01_B.d run/a/asm_fucomi_01_A.d run/a/asm_fucomip_01_A.d run/a/asm_fyl2xp1_01.d run/a/asm_movhlps_01_A.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_pxor_02_A.d
diffstat 35 files changed, 273 insertions(+), 279 deletions(-) [+]
line wrap: on
line diff
--- a/compile/a/asm_invlpg_01_B.d	Fri Jan 12 23:06:49 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-// $HeadURL$
-// $Date$
-// $Author$
-
-// @author@	Frits van Bommel <fvbommel@wxs.nl>
-// @date@	2006-05-31
-// @uri@	http://d.puremagic.com/issues/show_bug.cgi?id=171
-// @desc@	[Issue 171] 'wrong number of operands' for invlpg inline asm instruction
-
-module dstress.compile.a.asm_invlpg_01_B;
-
-version(D_InlineAsm_X86){
-	version = runTest;
-}else version(D_InlineAsm_X86_64){
-	version = runTest;
-}
-
-version(runTest){
-	int main(char[][] arg){
-		void* p = arg.ptr;
-
-		asm{
-			mov EAX, [p];
-			invlpg EAX;
-		}
-
-		return 0;
-	}
-}else{
-	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
-	static assert(0);
-}
-
--- a/compile/a/asm_invlpg_01_C.d	Fri Jan 12 23:06:49 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-// $HeadURL$
-// $Date$
-// $Author$
-
-// @author@	Frits van Bommel <fvbommel@wxs.nl>
-// @date@	2006-05-31
-// @uri@	http://d.puremagic.com/issues/show_bug.cgi?id=171
-// @desc@	[Issue 171] 'wrong number of operands' for invlpg inline asm instruction
-
-module dstress.compile.a.asm_invlpg_01_C;
-
-version(D_InlineAsm_X86){
-	version = runTest;
-}else version(D_InlineAsm_X86_64){
-	version = runTest;
-}
-
-version(runTest){
-	int main(char[][] arg){
-		void* p = arg.ptr;
-
-		asm{
-			mov EAX, p;
-			invlpg EAX;
-		}
-
-		return 0;
-	}
-}else{
-	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
-	static assert(0);
-}
-
--- a/nocompile/a/asm_fst_02_F.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/nocompile/a/asm_fst_02_F.d	Fri Jan 12 23:07:17 2007 +0000
@@ -6,12 +6,15 @@
 
 module dstress.nocompile.a.asm_fst_02_F;
 
-void main(){
-	version(D_InlineAsm){
+version(D_InlineAsm){
+	void main(){
 		real x;
 		
 		asm{
 			fst x;
 		}
 	}
-}
\ No newline at end of file
+}else{
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
+	static assert(0);
+}
--- a/run/a/asm_cmpiss_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-// $HeadURL$
-// $Date$
-// $Author$
-
-module dstress.run.a.asm_cmpiss_01_A;
-
-version(D_InlineAsm_X86){
-	version = runTest;
-}else version(D_InlineAsm_X86_64){
-	version = runTest;
-}
-
-version(runTest){
-	int main(){
-		float* a = (new float[4]).ptr;
-		a[0] = 1.0f;
-		a[1] = 2.0f;
-		a[2] = 3.0f;
-		a[3] = -8.0f;
-
-		float* b = (new float[4]).ptr;
-		b[0] = 0.0f;
-		b[1] = 4.0f;
-		b[2] = 3.0f;
-		b[3] = -4.0f;
-
-		uint i;
-
-		asm{
-			mov EAX, a;
-			movdqu XMM0, [EAX];
-			mov EAX, b;
-			movdqu XMM1, [EAX];
-			comiss XMM0, XMM1;
-			mov EAX, 0;
-			jnc done_1;
-			jz done_1;
-			jp done_1;
-			inc EAX;
-		done_1:
-			mov i, EAX;
-		}
-
-		if(i != 1){
-			assert(0);
-		}
-
-		asm{
-			mov EAX, b;
-			movdqu XMM0, [EAX];
-			mov EAX, a;	
-			movdqu XMM1, [EAX];
-			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, "DSTRESS{XFAIL}: no inline ASM support");
-	static assert(0);
-}
--- a/run/a/asm_comisd_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_comisd_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -17,12 +17,13 @@
 		haveSSE2!()();
 
 		double* a = (new double[2]).ptr;
-		a[0] = 1.0;
-		a[1] = 3.0;
+		a[0] = 3.0;
+		a[1] = 4.0;
+
 
 		double* b = (new double[2]).ptr;
-		b[0] = 4.0;
-		b[1] = 3.0;
+		b[0] = 3.0;
+		b[1] = 5.0;
 
 		static if(size_t.sizeof == 4){
 			asm{
@@ -31,7 +32,7 @@
 				mov EAX, b;
 				movupd XMM1, [EAX];
 				comisd XMM0, XMM1;
-				jz error;
+				jnz error;
 				jp error;
 				jc error;
 			}
@@ -42,7 +43,7 @@
 				mov RAX, b;
 				movupd XMM1, [RAX];
 				comisd XMM0, XMM1;
-				jz error;
+				jnz error;
 				jp error;
 				jc error;
 			}
--- a/run/a/asm_fcmovb_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fcmovb_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -27,7 +27,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovb ST(1);
+			fcmovb ST,ST(1);
 			fst f;
 		}
 
@@ -41,7 +41,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovb ST(1);
+			fcmovb ST,ST(1);
 			fst f;
 		}
 
--- a/run/a/asm_fcmovbe_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fcmovbe_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -27,7 +27,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovbe ST(1);
+			fcmovbe ST, ST(1);
 			fst f;
 		}
 
@@ -41,7 +41,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovbe ST(1);
+			fcmovbe ST, ST(1);
 			fst f;
 		}
 
@@ -55,7 +55,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovbe ST(1);
+			fcmovbe ST, ST(1);
 			fst f;
 		}
 
--- a/run/a/asm_fcmove_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fcmove_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -27,7 +27,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmove ST(1);
+			fcmove ST, ST(1);
 			fst f;
 		}
 
@@ -41,7 +41,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmove ST(1);
+			fcmove ST, ST(1);
 			fst f;
 		}
 
--- a/run/a/asm_fcmovnb_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fcmovnb_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -27,7 +27,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovnb ST(1);
+			fcmovnb ST, ST(1);
 			fst f;
 		}
 
@@ -41,7 +41,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovnb ST(1);
+			fcmovnb ST, ST(1);
 			fst f;
 		}
 
@@ -55,7 +55,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovnb ST(1);
+			fcmovnb ST, ST(1);
 			fst f;
 		}
 
--- a/run/a/asm_fcmovnbe_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fcmovnbe_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -27,7 +27,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovnbe ST(1);
+			fcmovnbe ST, ST(1);
 			fst f;
 		}
 
@@ -41,7 +41,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovnbe ST(1);
+			fcmovnbe ST, ST(1);
 			fst f;
 		}
 
@@ -55,7 +55,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovnbe ST(1);
+			fcmovnbe ST, ST(1);
 			fst f;
 		}
 
--- a/run/a/asm_fcmovne_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fcmovne_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -27,7 +27,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovne ST(1);
+			fcmovne ST, ST(1);
 			fst f;
 		}
 
@@ -41,7 +41,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovne ST(1);
+			fcmovne ST, ST(1);
 			fst f;
 		}
 
@@ -55,7 +55,7 @@
 			cmp AL, BL;
 			fld1;
 			fldz;
-			fcmovne ST(1);
+			fcmovne ST, ST(1);
 			fst f;
 		}
 
--- a/run/a/asm_fcmovnu_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fcmovnu_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -24,7 +24,7 @@
 			fld f;
 			fucomip;
 			fldz;
-			fcmovnu ST(1);
+			fcmovnu ST, ST(1);
 			fst f;
 		}
 
@@ -37,7 +37,7 @@
 			fld1;
 			fucomip;
 			fldz;
-			fcmovnu ST(1);
+			fcmovnu ST, ST(1);
 			fst f;
 		}
 
--- a/run/a/asm_fcmovu_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fcmovu_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -24,7 +24,7 @@
 			fld f;
 			fucomip;
 			fldz;
-			fcmovu ST(1);
+			fcmovu ST, ST(1);
 			fst f;
 		}
 
@@ -37,7 +37,7 @@
 			fld1;
 			fucomip;
 			fldz;
-			fcmovu ST(1);
+			fcmovu ST, ST(1);
 			fst f;
 		}
 
--- a/run/a/asm_fcomi_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fcomi_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -27,7 +27,7 @@
 			fldz;
 			fld1;
 			fldz;
-			fcomi;
+			fcomi ST, ST(1);
 			fstp f1;
 			fstp f2;
 			setc CF;
--- a/run/a/asm_fcomip_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fcomip_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -27,7 +27,7 @@
 			fldz;
 			fld1;
 			fldz;
-			fcomip;
+			fcomip ST, ST(1);
 			fstp f1;
 			fstp f2;
 			setc CF;
--- a/run/a/asm_fdiv_01_D.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fdiv_01_D.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,8 +16,8 @@
 	int main(){
 		haveFPU!()();
 
-		float a = 12.0f;
-		float b = -3.0f;
+		float a = -3.0f;
+		float b = 12.0f;
 		float c;
 
 		asm{
--- a/run/a/asm_fdivp_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fdivp_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,8 +16,8 @@
 	int main(){
 		haveFPU!()();
 
-		float a = 12.0f;
-		float b = -3.0f;
+		float a = -3.0f;
+		float b = 12.0f;
 
 		asm{
 			fld a;
--- a/run/a/asm_fdivp_01_B.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fdivp_01_B.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,8 +16,8 @@
 	int main(){
 		haveFPU!()();
 
-		float a = 12.0f;
-		float b = -3.0f;
+		float a = -3.0f;
+		float b = 12.0f;
 
 		asm{
 			fldz;
--- a/run/a/asm_fdivr_01_D.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fdivr_01_D.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,8 +16,8 @@
 	int main(){
 		haveFPU!()();
 
-		float a = 12.0f;
-		float b = -3.0f;
+		float a = -3.0f;
+		float b = 12.0f;
 		float c = 9.9f;
 
 		asm{
@@ -30,7 +30,7 @@
 			fstp c;
 		}
 
-		if(a != 12.0f){
+		if(a != -3.0f){
 			assert(0);
 		}
 		if(b != 0.0f){
--- a/run/a/asm_fdivrp_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fdivrp_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,8 +16,8 @@
 	int main(){
 		haveFPU!()();
 
-		float a = 12.0f;
-		float b = -3.0f;
+		float a = -3.0f;
+		float b = 12.0f;
 
 		asm{
 			fld b;
--- a/run/a/asm_fdivrp_01_B.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fdivrp_01_B.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,8 +16,8 @@
 	int main(){
 		haveFPU!()();
 
-		float a = 12.0f;
-		float b = -3.0f;
+		float a = -3.0f;
+		float b = 12.0f;
 
 		asm{
 			fldz;
--- a/run/a/asm_fsubp_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fsubp_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -14,8 +14,10 @@
 	import addon.cpuinfo;
 
 	int main(){
-		double a = 2.4;
-		double b = -1.2;
+		haveFPU!()();
+
+		double a = -1.2;
+		double b = 2.4;
 
 		asm{
 			fld1;
--- a/run/a/asm_fsubp_01_B.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fsubp_01_B.d	Fri Jan 12 23:07:17 2007 +0000
@@ -14,8 +14,10 @@
 	import addon.cpuinfo;
 
 	int main(){
-		double a = 2.4;
-		double b = -1.2;
+		haveFPU!()();
+		
+		double a = -1.2;
+		double b = 2.4;
 
 		asm{
 			fld1;
--- a/run/a/asm_fsubrp_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fsubrp_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -14,8 +14,10 @@
 	import addon.cpuinfo;
 
 	int main(){
-		double a = 2.4;
-		double b = -1.2;
+		haveFPU!()();
+
+		double a = -1.2;
+		double b = 2.4;
 
 		asm{
 			fld1;
--- a/run/a/asm_fsubrp_01_B.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fsubrp_01_B.d	Fri Jan 12 23:07:17 2007 +0000
@@ -14,8 +14,10 @@
 	import addon.cpuinfo;
 
 	int main(){
-		double a = 2.4;
-		double b = -1.2;
+		haveFPU!()();
+
+		double a = -1.2;
+		double b = 2.4;
 
 		asm{
 			fld1;
--- a/run/a/asm_fucomi_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fucomi_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -28,7 +28,7 @@
 			fldz;
 			fld1;
 			fld f1;
-			fucomi;
+			fucomi ST,ST(1);
 			fstp f1;
 			fstp f1;
 			fstp f2;
--- a/run/a/asm_fucomip_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fucomip_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -28,7 +28,7 @@
 			fldz;
 			fld1;
 			fld f1;
-			fucomip;
+			fucomip ST, ST(1);
 			fstp f1;
 			fstp f1;
 			fstp f2;
--- a/run/a/asm_fyl2xp1_01.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_fyl2xp1_01.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,17 +16,16 @@
 	int main(){
 		haveFPU!()();
 
-		float a = -0.0f;
+		float a = 7.0f;
 
 		asm{
 			fld a;
 			fld a;
 			fyl2xp1;
 			fstp a;
-			fstp a;
 		}
 
-		if(a != 0.0L){
+		if(a != 21.0){
 			assert(0);
 		}
 
--- a/run/a/asm_movhlps_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_movhlps_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -20,25 +20,42 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 3.0f;
 		a[1] = 4.0f;
 		a[2] = 5.0f;
 		a[3] = 6.0f;
 
-		float[] b = new float[4];
-		a[0] = 10.0f;
-		a[1] = 20.0f;
-		a[2] = 30.0f;
-		a[3] = 40.0f;
+		float* b = (new float[4]).ptr;
+		b[0] = 10.0f;
+		b[1] = 20.0f;
+		b[2] = 30.0f;
+		b[3] = 40.0f;
+
+		float* c = (new float[4]).ptr;
 
-		float[] c = new float[4];
-
-		asm{
-			movups XMM0, a;
-			movups XMM1, b;
-			movlhps XMM0, XMM1;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movups XMM1, [EAX];
+				movlhps XMM0, XMM1;
+				mov EAX, c;
+				movups [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				mov RAX, b;
+				movups XMM1, [RAX];
+				movlhps XMM0, XMM1;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != a[0]){
--- a/run/a/asm_psadbw_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_psadbw_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,19 +16,39 @@
 	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];
+		ubyte[] A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
+		ubyte* a = A.ptr;
 
-		ushort[8] c;
+		ubyte[] B = [2, 2, 2, 2, 2, 2, 2, 2, 1, 10, 10, 10, 10, 10, 10, 10];
+		ubyte* b = B.ptr;
+
+		ushort* c = (new ushort[8]).ptr;
 
-		asm{
-			movdqu XMM0, A;
-			movdqu XMM1, B;
-			psadbw XMM0, XMM1;
-			movdqu c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				psadbw XMM0, XMM1;
+				mov EAX, c;
+				movdqu [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movdqu XMM0, [RAX];
+				mov RAX, b;
+				movdqu XMM1, [RAX];
+				psadbw XMM0, XMM1;
+				mov RAX, c;
+				movdqu [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
-		if(c[0] != 0){
+		if(c[0] != 22){
 			assert(0);
 		}
 		if(c[1] != 0){
@@ -37,10 +57,10 @@
 		if(c[2] != 0){
 			assert(0);
 		}
-		if(c[3] != 22){
+		if(c[3] != 0){
 			assert(0);
 		}
-		if(c[4] != 0){
+		if(c[4] != 29){
 			assert(0);
 		}
 		if(c[5] != 0){
@@ -49,7 +69,7 @@
 		if(c[6] != 0){
 			assert(0);
 		}
-		if(c[7] != 21){
+		if(c[7] != 0){
 			assert(0);
 		}
 		return 0;
--- a/run/a/asm_pshufd_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_pshufd_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,19 +16,36 @@
 	int main(){
 		haveSSE2!()();
 
-		float* a = [1.0f, 2.0f, 3.0f, 4.0f];
-		float* b = [5.0f, 6.0f, 7.0f, 8.0f];
+		float[] A = [1.0f, 2.0f, 3.0f, 4.0f];
+		float* a = A.ptr;
 
-		float* c = new float[4];
+		float[] B = [5.0f, 6.0f, 7.0f, 8.0f];
+		float* b = B.ptr;
+
+		float* c = (new float[4]).ptr;
 
-		asm{
-			mov EAX, a;
-			movups XMM0, [EAX];
-			mov EAX, b;
-			movups XMM1, [EAX];
-			pshufd XMM0, XMM1, 0b01_01_00_10;
-			mov EAX, c;
-			movups [EAX], XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movups XMM1, [EAX];
+				pshufd XMM0, XMM1, 0b01_01_00_10;
+				mov EAX, c;
+				movups [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				mov RAX, b;
+				movups XMM1, [RAX];
+				pshufd XMM0, XMM1, 0b01_01_00_10;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 7.0f){
--- a/run/a/asm_pshufhw_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_pshufhw_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,28 +16,34 @@
 	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[] A = [9, 9, 9, 9, 9, 9, 9, 9];
+		short* a = A.ptr;
 
-		short[8] c;
+		short[] B = [1, 2, 3, 4, 5, 6, 7, 8];
+		short* b = B.ptr;
+
+		short* c = (new short[8]).ptr;
 
 		asm{
-			movdqu XMM0, A;
-			movdqu XMM1, B;
+			mov EAX, a;
+			movdqu XMM0, [EAX];
+			mov EAX, b;
+			movdqu XMM1, [EAX];
 			pshufhw XMM0, XMM1, 0b11_10_01_00;
-			movdqu, XMM0;
+			mov EAX, c;
+			movdqu [EAX], XMM0;
 		}
 
-		if(c[0] != 4){
+		if(c[0] != 1){
 			assert(0);
 		}
-		if(c[1] != 3){
+		if(c[1] != 2){
 			assert(0);
 		}
-		if(c[2] != 2){
+		if(c[2] != 3){
 			assert(0);
 		}
-		if(c[3] != 1){
+		if(c[3] != 4){
 			assert(0);
 		}
 		if(c[4] != 5){
--- a/run/a/asm_pshuflw_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_pshuflw_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,40 +16,60 @@
 	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[] A = [9, 9, 9, 9, 9, 9, 9, 9];
+		short* a = A.ptr;
 
-		short[8] c;
+		short[] B = [1, 2, 3, 4, 5, 6, 7, 8];
+		short* b = B.ptr;
+
+		short* c = (new short[8]).ptr;
 
-		asm{
-			movdqu XMM0, A;
-			movdqu XMM1, B;
-			psuhflw XMM0, XMM1, 0b11_10_01_00;
-			movdqu, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				pshuflw XMM0, XMM1, 0b11_01_10_00;
+				mov EAX, c;
+				movdqu [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movdqu XMM0, [RAX];
+				mov RAX, b;
+				movdqu XMM1, [RAX];
+				pshuflw XMM0, XMM1, 0b11_01_10_00;
+				mov RAX, c;
+				movdqu [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 1){
 			assert(0);
 		}
-		if(c[1] != 2){
+		if(c[1] != 3){
 			assert(0);
 		}
-		if(c[2] != 3){
+		if(c[2] != 2){
 			assert(0);
 		}
 		if(c[3] != 4){
 			assert(0);
 		}
-		if(c[4] != 8){
+		if(c[4] != 5){
 			assert(0);
 		}
-		if(c[5] != 7){
+		if(c[5] != 6){
 			assert(0);
 		}
-		if(c[6] != 6){
+		if(c[6] != 7){
 			assert(0);
 		}
-		if(c[7] != 5){
+		if(c[7] != 8){
 			assert(0);
 		}
 
--- a/run/a/asm_pshufw_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_pshufw_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,28 +16,48 @@
 	int main(){
 		haveSSE2!()();
 
-		const short[4] A = [9, 9, 9, 9];
-		const short[4] B = [1, 2, 3, 4];
+		short[] A = [9, 9, 9, 9];
+		short* a = A.ptr;
 
-		short[4] c;
+		short[] B = [1, 2, 3, 4];
+		short* b = B.ptr;
+
+		short* c = (new short[4]).ptr;
 
-		asm{
-			movq MM0, A;
-			movq MM1, B;
-			psuhfw MM0, MM1, 0b11_10_01_00;
-			movq c, MM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM0, [EAX];
+				mov EAX, b;
+				movq MM1, [EAX];
+				pshufw MM0, MM1, 0b11_00_01_10;
+				mov EAX, c;
+				movq [EAX], MM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM0, [RAX];
+				mov RAX, b;
+				movq MM1, [RAX];
+				pshufw MM0, MM1, 0b11_00_01_10;
+				mov RAX, c;
+				movq [RAX], MM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
-		if(c[0] != 4){
+		if(c[0] != 3){
 			assert(0);
 		}
-		if(c[1] != 3){
+		if(c[1] != 2){
 			assert(0);
 		}
-		if(c[2] != 2){
+		if(c[2] != 1){
 			assert(0);
 		}
-		if(c[3] != 1){
+		if(c[3] != 4){
 			assert(0);
 		}
 
--- a/run/a/asm_pxor_02_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_pxor_02_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,7 +16,7 @@
 	int main(){
 		haveSSE2!()();
 
-		ushort[8] a = new ushort[8];
+		ushort* a = (new ushort[8]).ptr;
 		a[0] = 0x1200;
 		a[1] = 0x0120;
 		a[2] = 0x0012;
@@ -26,7 +26,7 @@
 		a[6] = 0x0000;
 		a[7] = 0x1111;
 
-		ushort[] b = new ushort[8];
+		ushort* b = (new ushort[8]).ptr;
 		b[0] = 0x2100;
 		b[1] = 0x2100;
 		b[2] = 0x2100;
@@ -36,7 +36,7 @@
 		b[6] = 0x0102;
 		b[7] = 0x2222;
 
-		ushort[] c = new ushort[8];
+		ushort* c = (new ushort[8]).ptr;
 		c[0] = 0x3300;
 		c[1] = 0x2020;
 		c[2] = 0x2112;
@@ -46,24 +46,44 @@
 		c[6] = 0x0102;
 		c[7] = 0x3333;
 
-		ushort[] d = new ushort[8];
-		ushort[] e = new ushort[8];
+		ushort* d = (new ushort[8]).ptr;
+		ushort* e = (new ushort[8]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movdqu XMM1, b;
-			pxor XMM1, XMM0;
-			movdqu d, XMM0;
-			movdqu e, XMM1;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				pxor XMM1, XMM0;
+				mov EAX, d;
+				movdqu [EAX], XMM0;
+				mov EAX, e;
+				movdqu [EAX], XMM1;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movdqu XMM0, [RAX];
+				mov RAX, b;
+				movdqu XMM1, [RAX];
+				pxor XMM1, XMM0;
+				mov RAX, d;
+				movdqu [RAX], XMM0;
+				mov RAX, e;
+				movdqu [RAX], XMM1;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 
-		foreach(size_t i, ushort s; a){
+		foreach(size_t i, ushort s; a[0 .. 8]){
 			if(s != d[i]){
 				assert(0);
 			}
 		}
-		foreach(size_t i, ushort s; c){
+		foreach(size_t i, ushort s; c[0 .. 8]){
 			if(s != e[i]){
 				assert(0);
 			}