changeset 1288:61d7e32e70a8

partial inline asm review
author thomask
date Wed, 27 Dec 2006 11:59:19 +0000
parents 8cd17283ece1
children ad4d84aba69b
files run/a/asm_pfcmpeq_01_A.d run/a/asm_pfcmpeq_01_B.d run/a/asm_pfcmpge_01_A.d run/a/asm_pfcmpge_01_B.d run/a/asm_pfcmpgt_01_A.d run/a/asm_pfcmpgt_01_B.d run/a/asm_pfmax_01_A.d run/a/asm_pfmax_01_B.d run/a/asm_pfmin_01_A.d run/a/asm_pfmin_01_B.d run/a/asm_pfmul_01_A.d run/a/asm_pfmul_01_B.d run/a/asm_pfrcp_01_A.d run/a/asm_pfrcp_01_B.d run/a/asm_pfrcpit1_01_A.d run/a/asm_pfrcpit1_01_B.d run/a/asm_pfrcpit2_01_A.d run/a/asm_pfrcpit2_01_B.d run/a/asm_pfrsqrt_01_A.d run/a/asm_pfrsqrt_01_B.d run/a/asm_pfrsqrtit1_01_A.d run/a/asm_pfrsqrtit1_01_B.d run/a/asm_pfsub_01_A.d run/a/asm_pfsub_01_B.d run/a/asm_pfsubr_01_A.d run/a/asm_pfsubr_01_B.d
diffstat 26 files changed, 453 insertions(+), 162 deletions(-) [+]
line wrap: on
line diff
--- a/run/a/asm_pfcmpeq_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfcmpeq_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,21 +16,38 @@
 	int main(){
 		haveMMX!()();
 
-		float[] a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = 123.0f;
 		a[1] = -456.0f;
 
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 123.0f;
 		b[1] = 456.0f;
 
-		uint[] c = new uint[2];
+		uint* c = (new uint[2]).ptr;
 
-		asm{
-			movq MM0, a;
-			pfcmpeq MM0, b;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM0, [EAX];
+				mov EAX, b;
+				pfcmpeq MM0, [EAX];
+				mov EAX, c;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM0, [RAX];
+				mov RAX, b;
+				pfcmpeq MM0, [RAX];
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != uint.max){
--- a/run/a/asm_pfcmpeq_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfcmpeq_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -14,11 +14,17 @@
 	import addon.cpuinfo;
 
 	int main(){
-		have3DNow!()();
+		haveMMX!()();
+
+		float* a = (new float[2]).ptr;
+		a[0] = 123.0f;
+		a[1] = -456.0f;
 
-		float* a = [123.0f, -456.0f];
-		float* b = [123.0f, 456.0f];
-		uint* c = new uint[2];
+		float* b = (new float[2]).ptr;
+		b[0] = 123.0f;
+		b[1] = 456.0f;
+
+		uint* c = (new uint[2]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
@@ -56,6 +62,6 @@
 		return 0;
 	}
 }else{
-	pragma(msg, "DSTRESS{XPASS}: no inline ASM support");
+	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
 	static assert(0);
 }
--- a/run/a/asm_pfcmpge_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfcmpge_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		have3DNow!()();
 
-		float* a = [123.0f, 457.0f];
-		float* b = [124.0f, 456.0f];
-		uint* c = new uint[2];
+		float[] A = [123.0f, 457.0f];
+		float* a = A.ptr;
+
+		float[] B = [124.0f, 456.0f];
+		float* b = B.ptr;
+
+		uint* c = (new uint[2]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pfcmpge_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfcmpge_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		have3DNow!()();
 
-		float* a = [123.0f, 458.0f];
-		float* b = [124.0f, 456.0f];
-		uint* c = new uint[2];
+		float[] A = [123.0f, 458.0f];
+		float* a = A.ptr;
+
+		float[] B = [124.0f, 456.0f];
+		float* b = B.ptr;
+
+		uint* c = (new uint[2]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pfcmpgt_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfcmpgt_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -17,9 +17,13 @@
 		haveMMX!()();
 		have3DNow!()();
 
-		float* a = [123.0f, 457.0f];
-		float* b = [124.0f, 456.0f];
-		uint* c = new uint[2];
+		float[] A = [123.0f, 457.0f];
+		float* a = A.ptr;
+
+		float[] B = [124.0f, 456.0f];
+		float* b = B.ptr;
+
+		uint* c = (new uint[2]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pfcmpgt_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfcmpgt_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -17,9 +17,13 @@
 		haveMMX!()();
 		have3DNow!()();
 
-		float* a = [123.0f, 457.0f];
-		float* b = [124.0f, 456.0f];
-		uint* c = new uint[2];
+		float[] A = [123.0f, 457.0f];
+		float* a = A.ptr;
+
+		float[] B = [124.0f, 456.0f];
+		float* b = B.ptr;
+
+		uint* c = (new uint[2]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pfmax_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfmax_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,21 +16,38 @@
 	int main(){
 		have3DNow!()();
 
-		float[] a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = -123.0f;
 		a[1] = 457.0f;
 
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 123.0f;
 		b[1] = 456.0f;
 
-		float[] c = new float[2];
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM0, a;
-			pfmax MM0, b;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM0, [EAX];
+				mov EAX, b;
+				pfmax MM0, [EAX];
+				mov EAX, c;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM0, [RAX];
+				mov RAX, b;
+				pfmax MM0, [RAX];
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != b[0]){
--- a/run/a/asm_pfmax_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfmax_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,22 +16,40 @@
 	int main(){
 		have3DNow!()();
 
-		float[] a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = -123.0f;
 		a[1] = 457.0f;
 
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 123.0f;
 		b[1] = 456.0f;
 
-		float[] c = new float[2];
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM0, a;
-			movq MM1, b;
-			pfmax MM0, MM1;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM0, [EAX];
+				mov EAX, b;
+				movq MM1, [EAX];
+				pfmax MM0, MM1;
+				mov EAX, c;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM0, [RAX];
+				mov RAX, b;
+				movq MM1, [RAX];
+				pfmax MM0, MM1;
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != b[0]){
--- a/run/a/asm_pfmin_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfmin_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,22 +16,38 @@
 	int main(){
 		have3DNow!()();
 
-		float[] a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = -123.0f;
 		a[1] = 789.0f;
 		
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 123.0f;
 		b[1] = 456.0f;
 		
-		float[] c = new float[2];
+		float* c = (new float[2]).ptr;
 
-		asm{
-			emms;
-			movq MM0, a;
-			pfmin MM0, b;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM0, [EAX];
+				mov EAX, b;
+				pfmin MM0, [EAX];
+				mov EAX, c;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM0, [RAX];
+				mov RAX, b;
+				pfmin MM0, [RAX];
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != a[0]){
--- a/run/a/asm_pfmin_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfmin_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,22 +16,40 @@
 	int main(){
 		have3DNow!()();
 
-		float[] a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = -123.0f;
 		a[1] = 789.0f;
 		
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 123.0f;
 		b[1] = 456.0f;
 		
-		float[] c = new float[2];
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM0, a;
-			movq MM1, b;
-			pfmin MM0, MM1;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM0, [EAX];
+				mov EAX, b;
+				movq MM1, [EAX];
+				pfmin MM0, MM1;
+				mov EAX, c;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM0, [RAX];
+				mov RAX, b;
+				movq MM1, [RAX];
+				pfmin MM0, MM1;
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != a[0]){
--- a/run/a/asm_pfmul_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfmul_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,21 +16,38 @@
 	int main(){
 		have3DNow!()();
 
-		float[] a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = -3.0f;
 		a[1] = 7.0f;
 		
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 2.0f;
 		b[1] = 8.0f;
 		
-		float[] c = new float[2];
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM0, a;
-			pfmul MM0, b;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM0, [EAX];
+				mov EAX, b;
+				pfmul MM0, [EAX];
+				mov EAX, c;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM0, [RAX];
+				mov RAX, b;
+				pfmul MM0, [RAX];
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != -6.0f){
--- a/run/a/asm_pfmul_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfmul_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,22 +16,40 @@
 	int main(){
 		have3DNow!()();
 
-		float[] a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = -3.0f;
 		a[1] = 7.0f;
 		
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 2.0f;
 		b[1] = 8.0f;
 		
-		float[] c = new float[2];
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM0, a;
-			movq MM1, b;
-			pfmul MM0, MM1;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM0, [EAX];
+				mov EAX, b;
+				movq MM1, [EAX];
+				pfmul MM0, MM1;
+				mov EAX, c;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM0, [RAX];
+				mov RAX, b;
+				movq MM1, [RAX];
+				pfmul MM0, MM1;
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != -6.0f){
--- a/run/a/asm_pfrcp_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfrcp_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -4,16 +4,43 @@
 
 module dstress.run.a.asm_pfrcp_01_A;
 
-int main(){
-	version(D_InlineAsm_X86){
-		const float[2] A = [2.0f, 3.3f];
-		float[2] c;
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		haveMMX!()();
+
+		float[] A = [2.0f, 3.3f];
+		float* a = A.ptr;
+
+		float* c = (new float[2]).ptr;
 
-		asm{
-			pfrcp MM0, A;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				pfrcp MM0, [EAX];
+				mov EAX, c;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				pfrcp MM0, [RAX];
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
+
 		c[0] -= 0.5f;
 		if(c[0] < 0.0f){
 			c[0] = -c[0];
@@ -31,8 +58,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_pfrcp_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfrcp_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -4,16 +4,43 @@
 
 module dstress.run.a.asm_pfrcp_01_B;
 
-int main(){
-	version(D_InlineAsm_X86){
-		const float[2] A = [2.0f, 3.3f];
-		float[2] c;
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		haveMMX!()();
+
+		float[] A = [2.0f, 3.3f];
+		float* a = A.ptr;
+
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM1, A;
-			pfrcp MM0, MM1;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM1, [EAX];
+				pfrcp MM0, MM1;
+				mov EAX, c;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM1, [RAX];
+				pfrcp MM0, MM1;
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		c[0] -= 0.5f;
@@ -33,8 +60,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_pfrcpit1_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfrcpit1_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -17,14 +17,32 @@
 		haveMMX!()();
 		have3DNow!()();
 
-		const float[2] A = [2.0f, -0.5f];
-		float[2] c;
+		float* a = (new float[2]).ptr;
+		a[0] = 2.0f;
+		a[1] = -0.5f;
+
+		float* c = (new float[2]).ptr;
 
-		asm{
-			pfrcp MM0, A;
-			pfrcpit1 MM0, A;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				pfrcp MM0, [EAX];
+				pfrcpit1 MM0, [EAX];
+				mov EAX, c;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				pfrcp MM0, [RAX];
+				pfrcpit1 MM0, [RAX];
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		c[0] -= 1.007812f;
--- a/run/a/asm_pfrcpit1_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfrcpit1_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -17,30 +17,49 @@
 		haveMMX!()();
 		have3DNow!()();
 
-		const float[2] A = [2.0f, -0.5f];
-		float[2] c;
+		float* a = (new float[2]).ptr;
+		a[0] = 2.0f;
+		a[1] = -0.5f;
+
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM1, A;
-			pfrcp MM0, MM1;
-			pfrcpit1 MM0, MM1;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM1, [EAX];
+				pfrcp MM0, MM1;
+				pfrcpit1 MM0, MM1;
+				mov EAX, c;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM1, [RAX];
+				pfrcp MM0, MM1;
+				pfrcpit1 MM0, MM1;
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		c[0] -= 1.007812f;
 		if(c[0] < 0.0f){
 			c[0] = -c[0];
 		}
-		if(c[0] > float.epsilon * (1 << 11)){
+		if(c[0] > float.epsilon * (1 << 8)){
 			assert(0);
 		}
 
-		c[1] += 1.007812f;
-		if(c[0] < 0.0f){
-			c[0] = -c[0];
+		c[1] -= 1.007812;
+		if(c[1] < 0.0f){
+			c[1] = -c[1];
 		}
-		if(c[0] > float.epsilon * (1 << 11)){
+		if(c[1] > float.epsilon * (1 << 8)){
 			assert(0);
 		}
 
--- a/run/a/asm_pfrcpit2_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfrcpit2_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,15 +16,34 @@
 	int main(){
 		have3DNow!()();
 
-		const float[2] A = [2.0f, -0.5f];
-		float[2] c;
+		float* a = (new float[2]).ptr;
+		a[0] = 2.0f;
+		a[1] = -0.5f;
+
+		float* c = (new float[2]).ptr;
 
-		asm{
-			pfrcp MM0, A;
-			pfrcpit1 MM0, A;
-			pfrcpit2 MM0, A;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				pfrcp MM0, [EAX];
+				pfrcpit1 MM0, [EAX];
+				pfrcpit2 MM0, [EAX];
+				mov EAX, c;
+				movq [EAX], MM0;		
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				pfrcp MM0, [RAX];
+				pfrcpit1 MM0, [RAX];
+				pfrcpit2 MM0, [RAX];
+				mov RAX, c;
+				movq [RAX], MM0;		
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		c[0] -= 2.000061f;
--- a/run/a/asm_pfrcpit2_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfrcpit2_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,23 +16,43 @@
 	int main(){
 		have3DNow!()();
 
-		const float[2] A = [2.0f, -0.5f];
-		float[2] c;
+		float* a = (new float[2]).ptr;
+		a[0] = 2.0f;
+		a[1] = -0.5f;
+
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM1, A;
-			pfrcp MM0, MM1;
-			pfrcpit1 MM0, MM1;
-			pfrcpit2 MM0, MM1;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM1, [EAX];
+				pfrcp MM0, MM1;
+				pfrcpit1 MM0, MM1;
+				pfrcpit2 MM0, MM1;
+				mov EAX, c;
+				movq [EAX], MM0;		
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM1, [RAX];
+				pfrcp MM0, MM1;
+				pfrcpit1 MM0, MM1;
+				pfrcpit2 MM0, MM1;
+				mov RAX, c;
+				movq [RAX], MM0;		
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		c[0] -= 2.000061f;
 		if(c[0] < 0.0f){
 			c[0] = -c[0];
 		}
-		if(c[0] > float.epsilon * (1 << 8)){
+		if(c[0] > float.epsilon * (1 << 3)){
 			assert(0);
 		}
 
@@ -40,7 +60,7 @@
 		if(c[1] < 0.0f){
 			c[1] = -c[1];
 		}
-		if(c[1] > float.epsilon * (1 << 8)){
+		if(c[1] > float.epsilon * (1 << 3)){
 			assert(0);
 		}
 
--- a/run/a/asm_pfrsqrt_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfrsqrt_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,7 +16,7 @@
 	int main(){
 		have3DNow!()();
 
-		float* a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = 4.0f;
 		a[1] = 3.3f;
 
--- a/run/a/asm_pfrsqrt_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfrsqrt_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,7 +16,7 @@
 	int main(){
 		have3DNow!()();
 
-		float* a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = 4.0f;
 		a[1] = 0.5f;
 
--- a/run/a/asm_pfrsqrtit1_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfrsqrtit1_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,7 +16,7 @@
 	int main(){
 		have3DNow!()();
 
-		float* a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = 4.0f;
 		a[1] = 0.5f;
 
--- a/run/a/asm_pfrsqrtit1_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfrsqrtit1_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,7 +16,7 @@
 	int main(){
 		have3DNow!()();
 
-		float* a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = 4.0f;
 		a[1] = 0.5f;
 
--- a/run/a/asm_pfsub_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfsub_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,15 +16,15 @@
 	int main(){
 		have3DNow!()();
 
-		float* a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = 6.0f;
 		a[1] = 2.0f;
 		
-		float* b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 2.0f;
 		b[1] = -1.0f;
 
-		float* c = new float[2];
+		float* c = (new float[2]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pfsub_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfsub_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,15 +16,15 @@
 	int main(){
 		have3DNow!()();
 
-		float* a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = 6.0f;
 		a[1] = 2.0f;
 
-		float* b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 2.0f;
 		b[1] = -1.0f;
 
-		float* c = new float[2];
+		float* c = (new float[2]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pfsubr_01_A.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfsubr_01_A.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,29 +16,47 @@
 	int main(){
 		have3DNow!()();
 
-		float[] a = new	float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = 6.0f;
 		a[1] = 2.0f;
 
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 2.0f;
 		b[1] = 1.0f;
 
-		float[] c = new float[2];
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM0, a;
-			movq MM1, b;
-			pfsubr MM0, MM1;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM0, [EAX];
+				mov EAX, b;
+				movq MM1, [EAX];
+				pfsubr MM0, MM1;
+				mov EAX, c;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM0, [RAX];
+				mov RAX, b;
+				movq MM1, [RAX];
+				pfsubr MM0, MM1;
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != -4.0f){
 			assert(0);
 		}
 
-		if(c[1] != -3.0f){
+		if(c[1] != -1.0f){
 			assert(0);
 		}
 
--- a/run/a/asm_pfsubr_01_B.d	Wed Dec 27 11:59:05 2006 +0000
+++ b/run/a/asm_pfsubr_01_B.d	Wed Dec 27 11:59:19 2006 +0000
@@ -16,15 +16,15 @@
 	int main(){
 		have3DNow!()();
 
-		float* a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = 6.0f;
 		a[1] = 2.0f;
 
-		float* b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 2.0f;
 		b[1] = -1.0f;
 
-		float* c = new float[2];
+		float* c = (new float[2]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{