changeset 1267:409746d4e240

32<->64 iasm fixes
author thomask
date Thu, 21 Dec 2006 15:11:54 +0000
parents 516e1eeceb04
children 93511f726375
files run/a/asm_femms_01.d run/a/asm_fnsave_01.d run/a/asm_fsave_01.d run/a/asm_minsd_01_A.d run/a/asm_minsd_01_B.d run/a/asm_minss_01_A.d run/a/asm_minss_01_B.d run/a/asm_movapd_01_A.d run/a/asm_movaps_01_A.d run/a/asm_movddup_01_A.d run/a/asm_movddup_01_B.d run/a/asm_movhpd_01_A.d run/a/asm_movhpd_01_B.d run/a/asm_movhps_01_A.d run/a/asm_movhps_01_B.d run/a/asm_movlhps_01_A.d run/a/asm_movlpd_01_A.d run/a/asm_movlpd_01_B.d run/a/asm_movlps_01_A.d run/a/asm_movlps_01_B.d run/a/asm_movmskpd_01_A.d run/a/asm_movmskps_01_A.d run/a/asm_movq_02_O.d run/a/asm_mulpd_01_B.d run/a/asm_mulps_01_B.d
diffstat 25 files changed, 469 insertions(+), 170 deletions(-) [+]
line wrap: on
line diff
--- a/run/a/asm_femms_01.d	Thu Dec 21 15:11:45 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-// $HeadURL$
-// $Date$
-// $Author$
-
-module dstress.run.a.asm_femms_01;
-
-version(D_InlineAsm_X86){
-	version = runTest;
-}else version(D_InlineAsm_X86_64){
-	version = runTest;
-}
-
-version(runTest){
-	import addon.cpuinfo;
-	int main(){
-		have3DNow!()();
-		asm{
-			femms;
-		}
-		return 0;
-	}
-}else{
-	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
-	static assert(0);
-}
--- a/run/a/asm_fnsave_01.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_fnsave_01.d	Thu Dec 21 15:11:54 2006 +0000
@@ -24,7 +24,7 @@
 			static assert(0);
 		}
 
-		ubyte* state = new ubyte[stateSize];
+		ubyte* state = (new ubyte[stateSize]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_fsave_01.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_fsave_01.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,15 +16,15 @@
 	int main(){
 		haveFPU!()();
 
-		static if(size_t.sizeof==4 || size_t.sizeof==8){
+		static if((size_t.sizeof == 4) || (size_t.sizeof == 8)){
 			ubyte stateSize = 108;
-		}else static if(size_t.sizeof==2){
+		}else static if(size_t.sizeof == 2){
 			ubyte stateSize = 94;
 		}else{
-			static assert(0);
+			static assert(0, "unhandled pointer size");
 		}
 
-		ubyte* state = new ubyte[stateSize];
+		ubyte* state = (new ubyte[stateSize]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_minsd_01_A.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_minsd_01_A.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,21 +16,38 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 2.0;
 		a[1] = 4.0;
 
-		double[] b = new double[2];
+		double* b = (new double[2]).ptr;
 		b[0] = 1.0;
 		b[1] = 3.0;
 
-		double[] c = new double[2];
+		double* c = (new double[2]).ptr;
 
-		asm{
-			movupd XMM0, a;
-			movupd XMM1, b;
-			minsd XMM0, XMM1;
-			movupd c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				mov EAX, b;
+				movupd XMM1, [EAX];
+				minsd XMM0, XMM1;
+				mov EAX, c;
+				movupd [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				mov RAX, b;
+				movupd XMM1, [RAX];
+				minsd XMM0, XMM1;
+				mov RAX, c;
+				movupd [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 1.0){
--- a/run/a/asm_minsd_01_B.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_minsd_01_B.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,17 +16,32 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 3.0;
 		a[1] = 4.0;
 
 		double b = 2.0;
-		double[] c = new double[2];
+
+		double* c = (new double[2]).ptr;
 
-		asm{
-			movupd XMM0, a;
-			minsd XMM0, b;
-			movupd c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				minsd XMM0, b;
+				mov EAX, c;
+				movupd [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				minsd XMM0, b;
+				mov RAX, c;
+				movupd [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 2.0){
--- a/run/a/asm_minss_01_A.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_minss_01_A.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,25 +16,42 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 2.0f;
 		a[1] = 3.0f;
 		a[2] = 17.0f;
 		a[3] = -1.0f;
 
-		float[] b = new float[4];
+		float* b = (new float[4]).ptr;
 		b[0] = 1.0f;
 		b[1] = 4.0f;
 		b[2] = 16.0f;
 		b[3] = 1.0f;
 
-		float[] c = new float[4];
+		float* c = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movups XMM1, b;
-			minss XMM0, XMM1;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movups XMM1, [EAX];
+				minss 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];
+				minss XMM0, XMM1;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 1.0f){
--- a/run/a/asm_minss_01_B.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_minss_01_B.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,19 +16,34 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 2.0f;
 		a[1] = 3.0f;
 		a[2] = 17.0f;
 		a[3] = -1.0f;
 
 		float b = 1.0f;
-		float[] c = new float[4];
+
+		float* c = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			minss XMM0, b;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				minss XMM0, b;
+				mov EAX, c;
+				movups [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				minss XMM0, b;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 1.0f){
--- a/run/a/asm_movapd_01_A.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movapd_01_A.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,15 +16,30 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 2.0;
 		a[1] = 3.0;
-		double[] b = new double[2];
+
+		double* b = (new double[2]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movapd XMM1, XMM0;
-			movdqu b, XMM1;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				movapd XMM1, XMM0;
+				mov EAX, b;
+				movdqu [EAX], XMM1;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movdqu XMM0, [RAX];
+				movapd XMM1, XMM0;
+				mov RAX, b;
+				movdqu [RAX], XMM1;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(a[0] != b[0]){
--- a/run/a/asm_movaps_01_A.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movaps_01_A.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,18 +16,32 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 2.0f;
 		a[1] = 3.0f;
 		a[2] = 0.0f;
 		a[3] = 0.5f;
 
-		float[] b = new float[4];
+		float* b = (new float[4]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movaps XMM1, XMM0;
-			movdqu b, XMM1;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				movaps XMM1, XMM0;
+				mov EAX, b;
+				movdqu [EAX], XMM1;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movdqu XMM0, [RAX];
+				movaps XMM1, XMM0;
+				mov RAX, b;
+				movdqu [RAX], XMM1;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(a[0] != b[0]){
--- a/run/a/asm_movddup_01_A.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movddup_01_A.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,17 +16,32 @@
 	int main(){
 		haveSSE3!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 2.0;
 		a[1] = 3.0;
 
-		double[] b = new double[2];
+		double* b = (new double[2]).ptr;
 
-		asm{
-			movupd XMM0, a;
-			movupd XMM1, a;
-			movddup XMM1, XMM0;
-			movupd b, XMM1;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				movupd XMM1, [EAX];
+				movddup XMM1, XMM0;
+				mov EAX, b;
+				movupd [EAX], XMM1;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				movupd XMM1, [RAX];
+				movddup XMM1, XMM0;
+				mov RAX, b;
+				movupd [RAX], XMM1;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(a[0] != b[0]){
--- a/run/a/asm_movddup_01_B.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movddup_01_B.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,17 +16,32 @@
 	int main(){
 		haveSSE3!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 2.0;
 		a[1] = 3.0;
 
-		double[] b = new double[2];
+		double* b = (new double[2]).ptr;
+
 		double c = 1.0;
 
-		asm{
-			movupd XMM0, a;
-			movddup XMM0, c;
-			movupd b, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				movddup XMM0, c;
+				mov EAX, b;
+				movupd [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				movddup XMM0, c;
+				mov RAX, b;
+				movupd [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b[0] != 1.0){
--- a/run/a/asm_movhpd_01_A.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movhpd_01_A.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,17 +16,32 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 1.0;
 		a[1] = 2.0;
 
 		double b = 4.0;
-		double[] c = new double[2];
+
+		double* c = (new double[2]).ptr;
 
-		asm{
-			movupd XMM0, a;
-			movhpd XMM0, b;
-			movupd c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				movhpd XMM0, b;
+				mov EAX, c;
+				movupd [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				movhpd XMM0, b;
+				mov RAX, c;
+				movupd [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != a[0]){
--- a/run/a/asm_movhpd_01_B.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movhpd_01_B.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,15 +16,26 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 1.0;
 		a[1] = 2.0;
 
 		double b;
 
-		asm{
-			movupd XMM0, a;
-			movhpd b, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				movhpd b, XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				movhpd b, XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b != a[1]){
--- a/run/a/asm_movhps_01_A.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movhps_01_A.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,22 +16,38 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 1.0f;
 		a[1] = 2.0f;
 		a[2] = 3.0f;
 		a[3] = 4.0f;
 
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 5.0f;
 		b[1] = 6.0f;
 
-		float[] c = new float[4];
+		float* c = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movhps XMM0, b;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movhps XMM0, [EAX];
+				mov EAX, c;
+				movups [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				mov RAX, b;
+				movhps XMM0, [RAX];
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != a[0]){
--- a/run/a/asm_movhps_01_B.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movhps_01_B.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,16 +16,30 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 1.0f;
 		a[1] = 2.0f;
 		a[2] = 3.0f;
 		a[3] = 4.0f;
-		float[] b = new float[2];
+
+		float* b = (new float[2]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movhps b, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movhps [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				mov RAX, b;
+				movhps [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b[0] != a[2]){
--- a/run/a/asm_movlhps_01_A.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movlhps_01_A.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,25 +16,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];
+		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];
+		float* c = (new float[4]).ptr;
 
-		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_movlpd_01_A.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movlpd_01_A.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,18 +16,32 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 3.0;
 		a[1] = 4.0;
 
 		double b = 5.0;
 
-		double[] c = new double[2];
+		double* c = (new double[2]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movlpd XMM0, b;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				movlpd XMM0, b;
+				mov EAX, c;
+				movups [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				movlpd XMM0, b;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != b){
--- a/run/a/asm_movlpd_01_B.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movlpd_01_B.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,15 +16,27 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 3.0;
 		a[1] = 4.0;
 
 		double b = 5.0;
 
-		asm{
-			movups XMM0, a;
-			movlpd b, XMM0;
+
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				movlpd b, XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				movlpd b, XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b != a[0]){
--- a/run/a/asm_movlps_01_A.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movlps_01_A.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,22 +16,38 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 1.0f;
 		a[1] = 2.0f;
 		a[2] = 3.0f;
 		a[3] = 4.0f;
 
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 5.0f;
 		b[1] = 6.0f;
 
-		float[] c = new float[4];
+		float* c = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movlps XMM0, b;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movlps XMM0, [EAX];
+				mov EAX, c;
+				movups [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				mov RAX, b;
+				movlps XMM0, [RAX];
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != b[0]){
--- a/run/a/asm_movlps_01_B.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movlps_01_B.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,17 +16,30 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 1.0f;
 		a[1] = 2.0f;
 		a[2] = 3.0f;
 		a[3] = 4.0f;
 
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movlps b, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movlps [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				mov RAX, b;
+				movlps [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b[0] != a[0]){
--- a/run/a/asm_movmskpd_01_A.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movmskpd_01_A.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,17 +16,31 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 1.0;
 		a[1] = -1.0;
 
 		uint b;
 
-		asm{
-			movupd XMM0, a;
-			mov EAX, 0x1234_5678;
-			movmskpd EAX, XMM0;
-			mov b, EAX;
+
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				mov EAX, 0x1234_5678;
+				movmskpd EAX, XMM0;
+				mov b, EAX;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				mov RAX, 0x1234_5678;
+				movmskpd RAX, XMM0;
+				mov b, RAX;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b != 0x0000_0002){
--- a/run/a/asm_movmskps_01_A.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movmskps_01_A.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,7 +16,7 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 1.0f;
 		a[1] = -1.0f;
 		a[2] = -float.infinity;
@@ -24,11 +24,24 @@
 
 		uint b;
 
-		asm{
-			movdqu XMM0, a;
-			mov EAX, 0x1234_5678;
-			movmskps EAX, XMM0;
-			mov b, EAX;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, 0x1234_5678;
+				movmskps EAX, XMM0;
+				mov b, EAX;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movdqu XMM0, [RAX];
+				mov RAX, 0x1234_5678;
+				movmskps RAX, XMM0;
+				mov b, RAX;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b != 0b1110){
--- a/run/a/asm_movq_02_O.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_movq_02_O.d	Thu Dec 21 15:11:54 2006 +0000
@@ -22,16 +22,28 @@
 	int main(){
 		haveSSE2!()();
 
-		const long A = 0x12_34_56_78_9A_BC_DE_F0;
+		long a = 0x12_34_56_78_9A_BC_DE_F0;
 		long b;
 
-		asm{
-			movq MM0, A;
-			movq b, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				lea EAX, a;
+				movq MM0, [EAX];
+				movq b, MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				lea RAX, a;
+				movq MM0, [RAX];
+				movq b, MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
-		if(A != 0x12_34_56_78_9A_BC_DE_F0){
+		if(a != 0x12_34_56_78_9A_BC_DE_F0){
 			assert(0);
 		}
 		if(b != 0x12_34_56_78_9A_BC_DE_F0){
--- a/run/a/asm_mulpd_01_B.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_mulpd_01_B.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,21 +16,38 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 7.0;
 		a[1] = 4.0;
 
-		double[] b = new double[2];
+		double* b = (new double[2]).ptr;
 		b[0] = 3.0;
 		b[1] = 2.0;
 
-		double[] c = new double[2];
-
-		asm{
-			movupd XMM0, a;
-			movupd XMM1, b;
-			mulpd XMM0, XMM1;
-			movupd c, XMM0;
+		double* c = (new double[2]).ptr;
+	
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				mov EAX, b;
+				movupd XMM1, [EAX];
+				mulpd XMM0, XMM1;
+				mov EAX, c;
+				movupd [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				mov RAX, b;
+				movupd XMM1, [RAX];
+				mulpd XMM0, XMM1;
+				mov RAX, c;
+				movupd [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 21.0){
--- a/run/a/asm_mulps_01_B.d	Thu Dec 21 15:11:45 2006 +0000
+++ b/run/a/asm_mulps_01_B.d	Thu Dec 21 15:11:54 2006 +0000
@@ -16,25 +16,42 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 7.0f;
 		a[1] = 4.0f;
 		a[2] = 1.0f;
 		a[3] = -2.0f;
 
-		float[] b = new float[4];
+		float* b = (new float[4]).ptr;
 		b[0] = 3.0f;
 		b[1] = 2.0f;
 		b[2] = 0.0f;
 		b[3] = 5.0f;
 
-		float[] c = new float[4];
+		float* c = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movups XMM1, b;
-			mulps XMM0, XMM1;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movups XMM1, [EAX];
+				mulps 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];
+				mulps XMM0, XMM1;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 21.0f){