changeset 1265:236f0d02b8b9

32<->64 iasm fixes
author thomask
date Thu, 21 Dec 2006 08:58:06 +0000
parents b3d4452d48ac
children 516e1eeceb04
files nocompile/a/asm_offset_01_B.d run/a/asm_haddpd_01_A.d run/a/asm_haddps_01_A.d run/a/asm_hsubpd_01_A.d run/a/asm_hsubps_01_A.d run/a/asm_lddqu_01.d run/a/asm_movntpd_01_A.d run/a/asm_movntps_01_A.d run/a/asm_movq2dq_01.d run/a/asm_movq_01_B.d run/a/asm_movq_01_C.d run/a/asm_movsd_01_A.d run/a/asm_movsd_01_B.d run/a/asm_movsd_01_C.d run/a/asm_movshdup_01_A.d run/a/asm_movsldup_01_A.d run/a/asm_movss_01_A.d run/a/asm_movss_01_B.d run/a/asm_movss_01_C.d run/a/asm_movupd_01_A.d run/a/asm_movupd_01_B.d run/a/asm_movupd_01_C.d run/a/asm_movups_01_A.d run/a/asm_movups_01_B.d run/a/asm_movups_01_C.d run/a/asm_mulsd_01_A.d run/a/asm_mulsd_01_B.d run/a/asm_mulss_01_A.d run/a/asm_mulss_01_B.d run/a/asm_offset_01_A.d run/a/asm_orpd_01_A.d run/a/asm_orps_01_A.d run/a/asm_rcpps_01_A.d run/a/asm_rcpss_01_A.d run/a/asm_rsqrtps_01_A.d run/a/asm_rsqrtss_01_A.d run/a/asm_smsw_02_A.d
diffstat 37 files changed, 585 insertions(+), 215 deletions(-) [+]
line wrap: on
line diff
--- a/nocompile/a/asm_offset_01_B.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/nocompile/a/asm_offset_01_B.d	Thu Dec 21 08:58:06 2006 +0000
@@ -6,14 +6,12 @@
 // @date@	2006-04-28
 // @uri@	news:bug-116-3@http.d.puremagic.com/bugzilla/
 
-// __DSTRESS_ELINE__ 26
+// __DSTRESS_ELINE__ 24
 
 module dstress.nocompile.a.asm_offset_01_B;
 
 version(D_InlineAsm_X86){
 	version = runTest;
-}else version(D_InlineAsm_X86_64){
-	version = runTest;
 }
 
 version(runTest){
--- a/run/a/asm_haddpd_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_haddpd_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,15 +16,15 @@
 	int main(){
 		haveSSE3!()();
 
-		double* a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 7.0;
 		a[1] = 11.0;
 
-		double* b = new double[2];
+		double* b = (new double[2]).ptr;
 		b[0] = 2.0;
 		b[1] = 3.0;
 
-		double* c = new double[2];
+		double* c = (new double[2]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_haddps_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_haddps_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,19 +16,19 @@
 	int main(){
 		haveSSE3!()();
 
-		float* a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 6.1f;
 		a[1] = 7.2f;
 		a[2] = 8.3f;
 		a[3] = 9.4f;
 
-		float* b = new float[4];
+		float* b = (new float[4]).ptr;
 		b[0] = 1.0f;
 		b[1] = 2.0f;
 		b[2] = 3.0f;
 		b[3] = 4.0f;
 
-		float* c = new float[4];
+		float* c = (new float[4]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_hsubpd_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_hsubpd_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,15 +16,15 @@
 	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;
 		b[0] = 1.0;
 		b[1] = 4.0;
 
-		double* c = new double[2];
+		double* c = (new double[2]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_hsubps_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_hsubps_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,19 +16,19 @@
 	int main(){
 		haveSSE3!()();
 
-		float* a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 2.0f;
 		a[1] = 3.0f;
 		a[2] = 6.0f;
 		a[3] = 8.0f;
 
-		float* b = new float[4];
+		float* b = (new float[4]).ptr;
 		b[0] = 1.0f;
 		b[1] = 4.0f;
 		b[2] = 5.0f;
 		b[3] = 9.0f;
 
-		float* c = new float[4];
+		float* c = (new float[4]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_lddqu_01.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_lddqu_01.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,7 +16,7 @@
 	int main(){
 		haveSSE3!()();
 
-		ubyte* a = new ubyte[16];
+		ubyte* a = (new ubyte[16]).ptr;
 		a[0] = 1;
 		a[1] = 2;
 		a[2] = 3;
@@ -34,7 +34,7 @@
 		a[14] = 15;
 		a[15] = 16;
 
-		ubyte* b = new ubyte[16];
+		ubyte* b = (new ubyte[16]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_movntpd_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movntpd_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,16 +16,30 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 1.0;
 		a[1] = -1.0;
 
-		double[] b = aligned_new!(double)(2, 16);
+		double* b = (aligned_new!(double)(2, 16)).ptr;
 
-		asm{
-			movupd XMM0, a;
-			movntpd b, XMM0;
-			sfence;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				mov EAX, b;
+				movntpd [EAX], XMM0;
+				sfence;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				mov RAX, b;
+				movntpd [RAX], XMM0;
+				sfence;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(a[0] != b[0]){
--- a/run/a/asm_movntps_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movntps_01_A.d	Thu Dec 21 08:58:06 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] = -1.0f;
 		a[2] = 0.0f;
 		a[3] = 0.1f;
 
-		float[] b = aligned_new!(float)(4, 16);
+		float* b = (aligned_new!(float)(4, 16)).ptr;
 
-		asm{
-			movups XMM0, a;
-			movntps b, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movntps [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				mov RAX, b;
+				movntps [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(a[0] != b[0]){
--- a/run/a/asm_movq2dq_01.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movq2dq_01.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,18 +16,34 @@
 	int main(){
 		haveSSE!()();
 
-		ulong[] x = new ulong[2];
+		ulong* x = (new ulong[2]).ptr;
 		x[0] = 0x0011_2233_4455_6677_8899LU;
 		x[1] = 0x1234_5678_90AB_CDEF;
 
 		ulong a = 0x1234_ABCD_5678_EF01;
 
-		asm{
-			movdqu XMM0, x;
-			movq MM0, a;
-			movq2dq XMM0, MM0;
-			movdqu x, XMM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, x;
+				movdqu XMM0, [EAX];
+				movq MM0, a;
+				movq2dq XMM0, MM0;
+				mov EAX, x;
+				movdqu [EAX], XMM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, x;
+				movdqu XMM0, [RAX];
+				movq MM0, a;
+				movq2dq XMM0, MM0;
+				mov RAX, x;
+				movdqu [RAX], XMM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(a != 0x1234_ABCD_5678_EF01){
--- a/run/a/asm_movq_01_B.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movq_01_B.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,17 +16,32 @@
 	int main(){
 		haveSSE2!()();
 
-		ulong[] a = new ulong[2];
+		ulong* a = (new ulong[2]).ptr;
 		a[0] = 0x1234_ABCD_5678_EF90_LU;
 		a[1] = 0x1122_5566_77AA_FFFF_LU;
-		ulong[] b = new ulong[2];
+
+		ulong* b = (new ulong[2]).ptr;
 
 		ulong c = 0x1234_ABCD_5678_EF01_LU;
 
-		asm{
-			movdqu XMM0, a;
-			movq XMM0, c;
-			movdqu b, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				movq c, XMM0;
+				mov EAX, b;
+				movq [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movdqu XMM0, [RAX];
+				movq c, XMM0;
+				mov RAX, b;
+				movq [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b[0] != c){
--- a/run/a/asm_movq_01_C.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movq_01_C.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,21 +16,38 @@
 	int main(){
 		haveSSE2!()();
 
-		ulong[] a = new ulong[2];
+		ulong* a = (new ulong[2]).ptr;
 		a[0] = 0x1234_ABCD_5678_EF90_LU;
 		a[1] = 0x1122_2222_5555_FFFF_LU;
 		
-		ulong[] b = new ulong[2];
+		ulong* b = (new ulong[2]).ptr;
 		b[0] = 0x1000_1111_5678_EF90_LU;
 		b[1] = 0x1122_5566_77AA_FFFF_LU;
 
-		ulong[] c = new ulong[2];
+		ulong* c = (new ulong[2]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movdqu XMM1, b;
-			movq XMM0, XMM1;
-			movdqu c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				movq 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];
+				movq XMM0, XMM1;
+				mov RAX, c;
+				movdqu [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[1] == a[1]){
--- a/run/a/asm_movsd_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movsd_01_A.d	Thu Dec 21 08:58:06 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;
-			movsd b, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				movsd b, XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				movsd b, XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b != a[0]){
--- a/run/a/asm_movsd_01_B.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movsd_01_B.d	Thu Dec 21 08:58:06 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] = 2.0;
 
 		double b = 3.0;
-		double[] c = new double[2];
+		double* c = (new double[2]).ptr;
 
-		asm{
-			movupd XMM0, A;
-			movsd XMM0, b;
-			movupd c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				movsd XMM0, b;
+				mov EAX, c;
+				movupd [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				movsd XMM0, b;
+				mov RAX, c;
+				movupd [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != b){
--- a/run/a/asm_movsd_01_C.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movsd_01_C.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,21 +16,38 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 1.0;
 		a[1] = 2.0;
 
-		double[] b = new double[2];
+		double* b = (new double[2]).ptr;
 		b[0] = 3.0;
 		b[1] = 4.0;
 
-		double[] c = new double[2];
+		double* c = (new double[2]).ptr;
 
-		asm{
-			movupd XMM0, a;
-			movupd XMM1, b;
-			movsd XMM0, XMM1;
-			movupd c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				mov EAX, b;
+				movupd XMM1, [EAX];
+				movsd 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];
+				movsd XMM0, XMM1;
+				mov RAX,c;
+				movupd [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != b[0]){
--- a/run/a/asm_movshdup_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movshdup_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -14,18 +14,32 @@
 	import addon.cpuinfo;
 
 	int main(){
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 1.0f;
 		a[1] = -1.0f;
 		a[2] = -2.0f;
 		a[3] = 2.0f;
 
-		float[] b = new float[4];
+		float* b = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movshdup XMM1, XMM0;
-			movups b, XMM1;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				movshdup XMM1, XMM0;
+				mov EAX, b;
+				movups [EAX], XMM1;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				movshdup XMM1, XMM0;
+				mov RAX, b;
+				movups [RAX], XMM1;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(a[1] != b[0]){
--- a/run/a/asm_movsldup_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movsldup_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,18 +16,25 @@
 	int main(){
 		haveSSE3!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 1.0f;
 		a[1] = -1.0f;
 		a[2] = -2.0f;
 		a[3] = 2.0f;
 
-		float[] b = new float[4];
+		float* b = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movsldup XMM1, XMM0;
-			movups b, XMM1;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				movsldup XMM1, XMM0;
+				mov EAX, b;
+				movups [EAX], XMM1;
+			}
+		}else static if(size_t.sizeof == 8){
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(a[0] != b[0]){
--- a/run/a/asm_movss_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movss_01_A.d	Thu Dec 21 08:58:06 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] = 2.0f;
 		a[2] = 3.0f;
@@ -24,12 +24,26 @@
 
 		float b = 9.0f;
 
-		float[] c = new float[4];
+		float* c = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movss XMM0, b;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				movss XMM0, b;
+				mov EAX, c;
+				movups [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				movss XMM0, b;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != b){
--- a/run/a/asm_movss_01_B.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movss_01_B.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,25 +16,42 @@
 	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[4];
+		float* b = (new float[4]).ptr;
 		b[0] = 5.0f;
 		b[1] = 6.0f;
 		b[2] = 7.0f;
 		b[3] = 9.0f;
 
-		float[] c = new float[4];
+		float* c = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movups XMM1, b;
-			movss XMM0, XMM1;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movups XMM1, [EAX];
+				movss 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];
+				movss XMM0, XMM1;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != b[0]){
--- a/run/a/asm_movss_01_C.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movss_01_C.d	Thu Dec 21 08:58:06 2006 +0000
@@ -15,7 +15,7 @@
 	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;
@@ -23,9 +23,20 @@
 
 		float b;
 
-		asm{
-			movups XMM0, a;
-			movss b, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				movss b, XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				movss b, XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b != a[0]){
--- a/run/a/asm_movupd_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movupd_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,15 +16,28 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 1.0;
 		a[1] = 4.0;
 
-		double[] b = new double[2];
+		double* b = (new double[2]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movupd b, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movupd [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movdqu XMM0, [RAX];
+				mov RAX, b;
+				movupd [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b[0] != a[0]){
--- a/run/a/asm_movupd_01_B.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movupd_01_B.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,16 +16,30 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 1.0;
 		a[1] = 4.0;
 
-		double[] b = new double[2];
+		double* b = (new double[2]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movupd XMM1, XMM0;
-			movdqu b, XMM1;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				movupd XMM1, XMM0;
+				mov EAX, b;
+				movdqu [EAX], XMM1;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movdqu XMM0, [RAX];
+				movupd XMM1, XMM0;
+				mov RAX, b;
+				movdqu [RAX], XMM1;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b[0] != a[0]){
--- a/run/a/asm_movupd_01_C.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movupd_01_C.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,15 +16,28 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 1.0;
 		a[1] = 4.0;
 
-		double[] b = new double[2];
+		double* b = (new double[2]).ptr;
 
-		asm{
-			movupd XMM0, a;
-			movdqu b, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				mov EAX, b;
+				movdqu [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				mov RAX, b;
+				movdqu [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b[0] != a[0]){
--- a/run/a/asm_movups_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movups_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -2,6 +2,8 @@
 // $Date$
 // $Author$
 
+// __DSTRESS_TORTURE_BLOCK__ -fPIC
+
 module dstress.run.a.asm_movups_01_A;
 
 version(D_InlineAsm_X86){
@@ -16,29 +18,24 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
-		a[0] = 1.0f;
-		a[1] = 2.0f;
-		a[2] = 3.0f;
-		a[3] = 4.0f;
-
-		float[] b = new float[4];
+		float[4] a = [1.0f, 2.0f, 3.0f, 4.0f];
+		float[4] b;
 
 		asm{
-			movdqu XMM0, A;
+			movdqu XMM0, a;
 			movups b, XMM0;
 		}
 
-		if(b[0] != A[0]){
+		if(b[0] != a[0]){
 			assert(0);
 		}
-		if(b[1] != A[1]){
+		if(b[1] != a[1]){
 			assert(0);
 		}
-		if(b[2] != A[2]){
+		if(b[2] != a[2]){
 			assert(0);
 		}
-		if(b[3] != A[3]){
+		if(b[3] != a[3]){
 			assert(0);
 		}
 
--- a/run/a/asm_movups_01_B.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movups_01_B.d	Thu Dec 21 08:58:06 2006 +0000
@@ -2,6 +2,8 @@
 // $Date$
 // $Author$
 
+// __DSTRESS_TORTURE_BLOCK__ -fPIC
+
 module dstress.run.a.asm_movups_01_B;
 
 version(D_InlineAsm_X86){
@@ -16,13 +18,8 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
-		a[0] = 1.0f;
-		a[1] = 2.0f;
-		a[2] = 3.0f;
-		a[3] = 4.0f;
-
-		float[] b = new float[4];
+		float[4] a = [1.0f, 2.0f, 3.0f, 4.0f];
+		float[4] b;
 
 		asm{
 			movdqu XMM0, a;
--- a/run/a/asm_movups_01_C.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_movups_01_C.d	Thu Dec 21 08:58:06 2006 +0000
@@ -2,6 +2,8 @@
 // $Date$
 // $Author$
 
+// __DSTRESS_TORTURE_BLOCK__ -fPIC
+
 module dstress.run.a.asm_movups_01_C;
 
 version(D_InlineAsm_X86){
@@ -16,13 +18,8 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
-		a[0] = 1.0f;
-		a[1] = 2.0f;
-		a[2] = 3.0f;
-		a[3] = 4.0f;
-
-		float[] b = new float[4];
+		float[4] a = [1.0f, 2.0f, 3.0f, 4.0f];
+		float[4] b;
 
 		asm{
 			movups XMM0, a;
--- a/run/a/asm_mulsd_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_mulsd_01_A.d	Thu Dec 21 08:58:06 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];
+		double* c = (new double[2]).ptr;
 
-		asm{
-			movupd XMM0, a;
-			movupd XMM1, b;
-			mulsd XMM0, XMM1;
-			movupd c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				mov EAX, b;
+				movupd XMM1, [EAX];
+				mulsd 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];
+				mulsd XMM0, XMM1;
+				mov RAX, c;
+				movupd [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 21.0){
--- a/run/a/asm_mulsd_01_B.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_mulsd_01_B.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,18 +16,32 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 7.0;
 		a[1] = 4.0;
 
 		double b = 2.0;
 
-		double[] c = new double[2];
+		double* c = (new double[2]).ptr;
 
-		asm{
-			movupd XMM0, a;
-			mulsd XMM0, b;
-			movupd c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				mulsd XMM0, b;
+				mov EAX, c;
+				movupd [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movupd XMM0, [RAX];
+				mulsd XMM0, b;
+				mov RAX, c;
+				movupd [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 14.0){
--- a/run/a/asm_mulss_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_mulss_01_A.d	Thu Dec 21 08:58:06 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;
-			mulss XMM0, XMM1;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movups XMM1, [EAX];
+				mulss 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];
+				mulss XMM0, XMM1;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 21.0f){
--- a/run/a/asm_mulss_01_B.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_mulss_01_B.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,7 +16,7 @@
 	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;
@@ -24,12 +24,26 @@
 
 		float b = 5.0f;
 
-		float[] c = new float[4];
+		float* c = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			mulss XMM0, b;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mulss XMM0, b;
+				mov EAX, c;
+				movups [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				mulss XMM0, b;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 35.0f){
--- a/run/a/asm_offset_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_offset_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -23,7 +23,7 @@
 
 		static if(size_t.sizeof == 4){
 			asm{
-				mov EAX, offsetof b;
+				mov EAX, offset b;
 				mov y, EAX;
 			}
 		}else{
--- a/run/a/asm_orpd_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_orpd_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,21 +16,38 @@
 	int main(){
 		haveSSE2!()();
 
-		double[] a = new double[2];
+		double* a = (new double[2]).ptr;
 		a[0] = 4.0;
 		a[1] = 8.0;
 
-		double[] b = new double[2];
+		double* b = (new double[2]).ptr;
 		b[0] = 3.0;
 		b[1] = 4.0;
 
-		double[] c = new double[2];
+		double* c = (new double[2]).ptr;
 
-		asm{
-			movupd XMM0, a;
-			movupd XMM1, b;
-			orpd XMM0, XMM1;
-			movupd c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movupd XMM0, [EAX];
+				mov EAX, b;
+				movupd XMM1, [EAX];
+				orpd 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];
+				orpd XMM0, XMM1;
+				mov RAX, c;
+				movupd [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 6.0){
--- a/run/a/asm_orps_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_orps_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,25 +16,42 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 5.0f;
 		a[1] = 10.0f;
 		a[2] = 1.0f;
 		a[3] = 17.0f;
 
-		float[] b = new float[4];
+		float* b = (new float[4]).ptr;
 		b[0] = 6.0f;
 		b[1] = 9.0f;
 		b[2] = -2.0f;
 		b[3] = 20.0f;
 
-		float[] c = new float[4];
+		float* c = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movups XMM1, b;
-			orpd XMM0, XMM1;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movups XMM1, [EAX];
+				orpd 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];
+				orpd XMM0, XMM1;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 7.0f){
--- a/run/a/asm_rcpps_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_rcpps_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,18 +16,32 @@
 	int main(){
 		haveSSE2!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 1.0f;
 		a[1] = 2.0f;
 		a[2] = 0.5f;
 		a[3] = -4.0f;
 
-		float[] b = new float[4];
+		float* b = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			rcpps XMM1, XMM0;
-			movups b, XMM1;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				rcpps XMM1, XMM0;
+				mov EAX, b;
+				movups [EAX], XMM1;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				rcpps XMM1, XMM0;
+				mov RAX, b;
+				movups [RAX], XMM1;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		b[0] -= 1.0f;
--- a/run/a/asm_rcpss_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_rcpss_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,25 +16,42 @@
 	int main(){
 		haveSSE2!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 2.0f;
 		a[1] = 1.0f;
 		a[2] = 0.5f;
 		a[3] = -4.0f;
 
-		float[] b = new float[4];
+		float* b = (new float[4]).ptr;
 		b[0] = 5.0f;
 		b[1] = 6.0f;
 		b[2] = 7.0f;
 		b[3] = 8.0f;
 
-		float[] c = new float[4];
+		float* c = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movups XMM1, b;
-			rcpss XMM1, XMM0;
-			movups c, XMM1;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movups XMM1, [EAX];
+				rcpss XMM1, XMM0;
+				mov EAX, c;
+				movups [EAX], XMM1;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				mov RAX, b;
+				movups XMM1, [RAX];
+				rcpss XMM1, XMM0;
+				mov RAX, c;
+				movups [RAX], XMM1;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		c[0] -= 0.5f;
--- a/run/a/asm_rsqrtps_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_rsqrtps_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,25 +16,42 @@
 	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[4];
+		float* b = (new float[4]).ptr;
 		b[0] = -1.0f;
 		b[1] = 1.0f;
 		b[2] = 4.0f;
 		b[3] = -4.0f;
 
-		float[] c = new float[4];
+		float* c = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movups XMM1, b;
-			rsqrtps XMM0, XMM1;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movups XMM1, [EAX];
+				rsqrtps 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];
+				rsqrtps XMM0, XMM1;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		c[0] += 1.0f;
--- a/run/a/asm_rsqrtss_01_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_rsqrtss_01_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -16,25 +16,42 @@
 	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[4];
+		float* b = (new float[4]).ptr;
 		b[0] = -1.0f;
 		b[1] = 1.0f;
 		b[2] = 4.0f;
 		b[3] = -4.0f;
 
-		float[] c = new float[4];
+		float* c = (new float[4]).ptr;
 
-		asm{
-			movups XMM0, a;
-			movups XMM1, b;
-			rsqrtss XMM0, XMM1;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movups XMM1, [EAX];
+				rsqrtss 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];
+				rsqrtss XMM0, XMM1;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		c[0] += 1.0f;
--- a/run/a/asm_smsw_02_A.d	Tue Dec 19 15:00:26 2006 +0000
+++ b/run/a/asm_smsw_02_A.d	Thu Dec 21 08:58:06 2006 +0000
@@ -20,7 +20,7 @@
 			mov a, EAX;
 		}
 
-		if(a == 0){
+		if(a & 0xFFFF == 0){
 			assert(0);
 		}