changeset 1285:229e630d4b1a

partuial inline asm review
author thomask
date Tue, 26 Dec 2006 14:21:37 +0000
parents 96e7be832c35
children 2df3e4a5a044
files run/a/asm_packssdw_01_A.d run/a/asm_packsswb_01_A.d run/a/asm_packuswb_01_A.d run/a/asm_paddb_01_A.d run/a/asm_paddd_01_A.d run/a/asm_paddq_01_A.d run/a/asm_paddsb_01_A.d run/a/asm_paddsw_01_A.d run/a/asm_paddusb_01_A.d run/a/asm_paddusw_01_A.d run/a/asm_paddw_01_A.d run/a/asm_pand_01_A.d run/a/asm_pandn_01_A.d run/a/asm_pavgb_01_A.d run/a/asm_pavgb_01_B.d run/a/asm_pavgusb_01_A.d run/a/asm_pavgusb_01_B.d run/a/asm_pavgw_01_A.d run/a/asm_pcmpeqb_01_A.d run/a/asm_pcmpeqd_01_A.d run/a/asm_pcmpeqw_01_A.d run/a/asm_pcmpgtb_01_A.d run/a/asm_pcmpgtd_01_A.d run/a/asm_pcmpgtw_01_A.d run/a/asm_pextrw_01_A.d run/a/asm_pf2id_01_A.d run/a/asm_pf2id_01_B.d run/a/asm_pfacc_01_A.d run/a/asm_pfacc_01_B.d run/a/asm_pfadd_01_A.d run/a/asm_pfadd_01_B.d
diffstat 31 files changed, 498 insertions(+), 322 deletions(-) [+]
line wrap: on
line diff
--- a/run/a/asm_packssdw_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_packssdw_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -17,26 +17,44 @@
 		haveSSE2!()();
 		haveMMX!()();
 
-		int[] a = new int[4];
+		int* a = (new int[4]).ptr;
 		a[0] = 1;
 		a[1] = -2;
 		a[2] = 3;
 		a[3] = -4;
 
-		int[] b = new int[4];
+		int* b = (new int[4]).ptr;
 		b[0] = 5;
 		b[1] = -6;
 		b[2] = 7;
 		b[3] = -8;
 
-		short[] c = new short[8];
+		short* c = (new short[8]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movdqu XMM1, b;
-			packssdw XMM0, XMM1;
-			movdqu c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				packssdw 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];
+				packssdw XMM0, XMM1;
+				mov RAX, c;
+				movdqu [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
+
 		if(c[0] != 1){
 			assert(0);
 		}
--- a/run/a/asm_packsswb_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_packsswb_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		haveSSE2!()();
 
-		short* a = [cast(short)1, -2, 3, -4, 5, -6, 7, -8];
-		short* b = [cast(short)9, 8, -7, 6, -5, 4, -3, 2];
-		byte* c = new byte[16];
+		short[] A = [1, -2, 3, -4, 5, -6, 7, -8];
+		short* a = A.ptr;
+
+		short[] B = [9, 8, -7, 6, -5, 4, -3, 2];
+		short* b = B.ptr;
+
+		byte* c = (new byte[16]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_packuswb_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_packuswb_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -15,10 +15,14 @@
 
 	int main(){
 		haveSSE2!()();
+	
+		short[] A = [1, -2, 3, -4, 5, -6, 7, -8];
+		short* a = A.ptr;
 
-		short* a = [cast(short)1, -2, 3, -4, 5, -6, 7, -8];
-		short* b = [cast(short)9, 8, -7, 6, -5, 4, -3, 2];
-		byte* c = new byte[16];
+		short[] B = [9, 8, -7, 6, -5, 4, -3, 2];
+		short* b = B.ptr;
+
+		byte* c = (new byte[16]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_paddb_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_paddb_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,7 +16,7 @@
 	int main(){
 		haveSSE2!()();
 
-		byte[] a = new byte[16];
+		byte* a = (new byte[16]).ptr;
 		a[0] = 1;
 		a[1] = 2;
 		a[2] = 3;
@@ -30,10 +30,11 @@
 		a[10] = 11;
 		a[11] = 12;
 		a[12] = 13;
+		a[13] = 14;
 		a[14] = 15;
 		a[15] = 16;
 
-		byte[] b = new byte[16];
+		byte* b = (new byte[16]).ptr;
 		b[0] = -8;
 		b[1] = -7;
 		b[2] = -6;
@@ -51,13 +52,30 @@
 		b[14] = 6;
 		b[15] = 7;
 
-		byte[] c = new byte[16];
+		byte* c = (new byte[16]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movdqu XMM1, b;
-			paddb XMM0, XMM1;
-			movdqu c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				paddb 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];
+				paddb XMM0, XMM1;
+				mov RAX, c;
+				movdqu [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != -7){
--- a/run/a/asm_paddd_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_paddd_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,25 +16,42 @@
 	int main(){
 		haveSSE2!()();
 
-		int[] a = new int[4];
+		int* a = (new int[4]).ptr;
 		a[0] = 1;
 		a[1] = 2;
 		a[2] = 3;
 		a[3] = 4;
 
-		int[] b = new int[4];
+		int* b = (new int[4]).ptr;
 		b[0] = int.max-2;
 		b[1] = int.min;
 		b[2] = 0;
 		b[3] = -6;
 
-		int[] c = new int[4];
+		int* c = (new int[4]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movdqu XMM1, b;
-			paddd XMM0, XMM1;
-			movdqu c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				paddd 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];
+				paddd XMM0, XMM1;
+				mov RAX, c;
+				movdqu [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != int.max - 1){
--- a/run/a/asm_paddq_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_paddq_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,21 +16,38 @@
 	int main(){
 		haveSSE2!()();
 
-		long[] a = new long[2];
+		long* a = (new long[2]).ptr;
 		a[0] = -1;
 		a[1] = -2;
 
-		long[] b = new long[2];
+		long* b = (new long[2]).ptr;
 		b[0] = 2;
 		b[1] = long.max;
 
-		long[] c = new long[2];
+		long* c = (new long[2]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movdqu XMM1, b;
-			paddq XMM0, XMM1;
-			movdqu c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				paddq XMM0, XMM1;
+				mov EAX, c;
+				movdqu [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				paddq XMM0, XMM1;
+				mov EAX, c;
+				movdqu [EAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 1){
--- a/run/a/asm_paddsb_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_paddsb_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,7 +16,7 @@
 	int main(){
 		haveSSE2!()();
 
-		byte[] a = new byte[16];
+		byte* a = (new byte[16]).ptr;
 		a[0] = 1;
 		a[1] = byte.min;
 		a[2] = 3;
@@ -34,7 +34,7 @@
 		a[14] = 15;
 		a[15] = 16;
 
-		byte[] b = new byte[16];
+		byte* b = (new byte[16]).ptr;
 		b[0] = byte.max;
 		b[1] = -7;
 		b[2] = -6;
@@ -52,13 +52,30 @@
 		b[14] = 6;
 		b[15] = 7;
 
-		byte[] c = new byte[16];
+		byte* c = (new byte[16]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movdqu XMM1, b;
-			paddsb XMM0, XMM1;
-			movdqu c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				paddsb 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];
+				paddsb XMM0, XMM1;
+				mov RAX, c;
+				movdqu [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != byte.max){
--- a/run/a/asm_paddsw_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_paddsw_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		haveSSE2!()();
 
-		short* a = [cast(short)1, short.min, 3, 4, 5, 6, 7, 8];
-		short* b = [cast(short)short.max, -8, -7, -6, -5, -4, -3, -2];
-		short* c = new short[8];
+		short[] A = [1, short.min, 3, 4, 5, 6, 7, 8];
+		short* a = A.ptr;
+
+		short[] B = [short.max, -8, -7, -6, -5, -4, -3, -2];
+		short* b = B.ptr;
+
+		short* c = (new short[8]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_paddusb_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_paddusb_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		haveSSE2!()();
 
-		ubyte* a = [cast(ubyte)1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
-		ubyte* b = [cast(ubyte)ubyte.max, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7];
-		ubyte* c = new ubyte[16];
+		ubyte[] A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
+		ubyte* a = A.ptr;
+
+		ubyte[] B = [ubyte.max, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7];
+		ubyte* b = B.ptr;
+
+		ubyte* c = (new ubyte[16]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_paddusw_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_paddusw_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		haveSSE2!()();
 
-		ushort* a = [cast(ushort)1, 0, 3, 4, 5, 6, 7, 8];
-		ushort* b = [cast(ushort)ushort.max, 8, 7, 6, 5, 4, 3, 2];
-		ushort* c = new ushort[8];
+		ushort[] A = [1, 0, 3, 4, 5, 6, 7, 8];
+		ushort* a = A.ptr;
+
+		ushort[] B = [ushort.max, 8, 7, 6, 5, 4, 3, 2];
+		ushort* b = B.ptr;
+
+		ushort* c = (new ushort[8]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_paddw_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_paddw_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		haveSSE2!()();
 
-		short* a = [cast(short)1, 2, 3, 4, 5, 6, 7, 8];
-		short* b = [cast(short)-9, -8, -7, -6, -5, -4, -3, -2];
-		short* c = new short[8];
+		short[] A = [1, 2, 3, 4, 5, 6, 7, 8];
+		short* a = A.ptr;
+
+		short[] B = [-9, -8, -7, -6, -5, -4, -3, -2];
+		short* b = B.ptr;
+
+		short* c = (new short[8]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pand_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pand_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,15 +16,19 @@
 	int main(){
 		haveSSE2!()();
 
-		ushort* a = [cast(ushort)
+		ushort[] A = [
 			0b01101100_01101110, 0b01101001_01101101, 0b01100011_01101011, 0b11100111_01100111,
 			0b11000110_11100110, 0b10001101_10011011, 0b00011011_10011011, 0b01100110_00000000
 		];
-		ushort* b = [cast(ushort)
+		ushort* a = A.ptr;
+
+		ushort[] B = [
 			0b10000000_11000000, 0b01000000_01100000, 0b00100000_00110000, 0b00010000_00011000,
 			0b00001000_00001100, 0b00000100_00000110, 0b00000010_00000011, 0b11111111_10101010
 		];
-		ushort* c = new ushort[8];
+		ushort* b = B.ptr;
+
+		ushort* c = (new ushort[8]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pandn_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pandn_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,15 +16,19 @@
 	int main(){
 		haveSSE2!()();
 
-		ushort* a = [cast(ushort)
+		ushort[] A = [
 			0b01101100_01101110, 0b01101001_01101101, 0b01100011_01101011, 0b11100111_01100111,
 			0b11000110_11100110, 0b10001101_10011011, 0b00011011_10011011, 0b01100110_00000000
 		];
-		ushort* b = [cast(ushort)
+		ushort* a = A.ptr;
+
+		ushort[] B = [
 			0b10000000_11000000, 0b01000000_01100000, 0b00100000_00110000, 0b00010000_00011000,
 			0b00001000_00001100, 0b00000100_00000110, 0b00000010_00000011, 0b11111111_10101010
 		];
-		ushort* c = new ushort[8];
+		ushort* b = B.ptr;
+
+		ushort* c = (new ushort[8]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pavgb_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pavgb_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,7 +16,7 @@
 	int main(){
 		haveSSE!()();
 
-		byte[] a = new byte[8];
+		byte* a = (new byte[8]).ptr;
 		a[0] = 1;
 		a[1] = 2;
 		a[2] = 3;
@@ -26,7 +26,7 @@
 		a[6] = 7;
 		a[7] = 8;
 
-		byte[] b = new byte[8];
+		byte* b = (new byte[8]).ptr;
 		b[0] = 5;
 		b[1] = 2;
 		b[2] = 1;
@@ -46,14 +46,32 @@
 		c[6] = 4;
 		c[7] = 6;
 
-		byte[] d = new byte[8];
+		byte* d = (new byte[8]).ptr;
 
-		asm{
-			movq MM0, a;
-			movq MM1, b;
-			pavgb MM0, MM1;
-			movq d, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM0, [EAX];
+				mov EAX, b;
+				movq MM1, [EAX];
+				pavgb MM0, MM1;
+				mov EAX, d;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM0, [RAX];
+				mov RAX, b;
+				movq MM1, [RAX];
+				pavgb MM0, MM1;
+				mov RAX, d;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		for(size_t i = 0; i < c.length; i++){
--- a/run/a/asm_pavgb_01_B.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pavgb_01_B.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,46 +16,63 @@
 	int main(){
 		haveSSE!()();
 
-		byte[] a = new byte[16];
+		ubyte* a = (new ubyte[16]).ptr;
 		a[0] = 1;
-		a[1] = -2;
+		a[1] = 2;
 		a[2] = 3;
 		a[3] = 4;
 		a[4] = 5;
 		a[5] = 6;
 		a[6] = 7;
 		a[7] = 8;
-		a[8] = -12;
+		a[8] = 12;
 
-		byte[] b = new byte[16];
+		ubyte* b = (new ubyte[16]).ptr;
 		b[0] = 5;
 		b[1] = 2;
-		b[2] = -1;
-		b[3] = -8;
+		b[2] = 11;
+		b[3] = 8;
 		b[4] = 15;
 		b[5] = 4;
 		b[6] = 1;
 		b[7] = 4;
-		b[8] = -6;
+		b[8] = 6;
 
-		byte[] c = new byte[16];
+		ubyte[] c = new ubyte[16];
 		c[0] = 3;
-		c[1] = 0;
-		c[2] = 1;
-		c[3] = -2;
+		c[1] = 2;
+		c[2] = 7;
+		c[3] = 6;
 		c[4] = 10;
 		c[5] = 5;
 		c[6] = 4;
 		c[7] = 6;
-		c[8] = -8;
+		c[8] = 9;
 
-		byte[] d = new byte[16];
+		ubyte* d = (new ubyte[16]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movdqu XMM1, b;
-			pavgb XMM0, XMM1;
-			movdqu d, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				pavgb XMM0, XMM1;
+				mov EAX, d;
+				movdqu [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movdqu XMM0, [RAX];
+				mov RAX, b;
+				movdqu XMM1, [RAX];
+				pavgb XMM0, XMM1;
+				mov RAX, d;
+				movdqu [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		for(size_t i = 0; i < c.length; i++){
--- a/run/a/asm_pavgusb_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-// $HeadURL$
-// $Date$
-// $Author$
-
-module dstress.run.a.asm_pavgusb_01_A;
-
-version(D_InlineAsm_X86){
-	version = runTest;
-}else version(D_InlineAsm_X86_64){
-	version = runTest;
-}
-
-version(runTest){
-	import addon.cpuinfo;
-
-	int main(){
-		haveSSE!()();
-
-		ubyte[] a = new ubyte[8];
-		a[0] = 1;
-		a[1] = 2;
-		a[2] = 3;
-		a[3] = 4;
-		a[4] = 5;
-		a[5] = 6;
-		a[6] = 7;
-		a[7] = 8;
-
-		ubyte[] b = new ubyte[8];
-		b[0] = 5;
-		b[1] = 2;
-		b[2] = 1;
-		b[3] = 8;
-		b[4] = 15;
-		b[5] = 4;
-		b[6] = 1;
-		b[7] = 4;
-
-		ubyte[] c = new ubyte[8];
-		c[0] = 3;
-		c[1] = 2;
-		c[2] = 2;
-		c[3] = 6;
-		c[4] = 10;
-		c[5] = 5;
-		c[6] = 4;
-		c[7] = 6;
-
-		ubyte[] d = new ubyte[8];
-
-		asm{
-			movq MM0, a;
-			pavgusb MM0, b;
-			movq d, MM0;
-			emms;
-		}
-
-		for(size_t i = 0; i < c.length; i++){
-			if(d[i] != c[i]){
-				assert(0);
-			}
-		}
-
-		return 0;
-	}
-}else{
-	pragma(msg, "DSTRESS{XFAIL}: no inline ASM support");
-	static assert(0);
-}
--- a/run/a/asm_pavgusb_01_B.d	Tue Dec 26 14:21:29 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-// $HeadURL$
-// $Date$
-// $Author$
-
-module dstress.run.a.asm_pavgusb_01_B;
-
-version(D_InlineAsm_X86){
-	version = runTest;
-}else version(D_InlineAsm_X86_64){
-	version = runTest;
-}
-
-version(runTest){
-	import addon.cpuinfo;
-
-	int main(){
-		have3DNow!()();
-
-		ubyte[] a = new ubyte[8];
-		a[0] = 1;
-		a[1] = 2;
-		a[2] = 3;
-		a[3] = 4;
-		a[4] = 5;
-		a[5] = 6;
-		a[6] = 7;
-		a[7] = 8;
-
-		ubyte[] b = new ubyte[8];
-		b[0] = 5;
-		b[1] = 2;
-		b[2] = 1;
-		b[3] = 8;
-		b[4] = 15;
-		b[5] = 4;
-		b[6] = 1;
-		b[7] = 4;
-
-		ubyte[] c = new ubyte[8];
-		c[0] = 3;
-		c[1] = 2;
-		c[2] = 2;
-		c[3] = 6;
-		c[4] = 10;
-		c[5] = 5;
-		c[6] = 4;
-		c[7] = 6;
-
-		ubyte[] d = new ubyte[8];
-
-		asm{
-			emms;
-			movq MM0, a;
-			movq MM1, b;
-			pavgusb MM0, MM1;
-			movq d, MM0;
-			emms;
-		}
-
-		for(size_t i = 0; i < c.length; i++){
-			if(d[i] != c[i]){
-				assert(0);
-			}
-		}
-
-		return 0;
-	}
-}else{
-	pragma(msg, "DSTRESS{XPASS}: no inline ASM support");
-	static assert(0);
-}
--- a/run/a/asm_pavgw_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pavgw_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,9 +16,9 @@
 	int main(){
 		haveSSE!()();
 
-		short[] a = new short[8];
+		short* a = (new short[8]).ptr;
 		a[0] = 1;
-		a[1] = -2;
+		a[1] = 2;
 		a[2] = 3;
 		a[3] = 4;
 		a[4] = 5;
@@ -26,33 +26,50 @@
 		a[6] = 7;
 		a[7] = 8;
 
-		short[] b = new short[8];
+		ushort* b = (new ushort[8]).ptr;
 		b[0] = 5;
 		b[1] = 2;
-		b[2] = -1;
-		b[3] = -8;
+		b[2] = 1;
+		b[3] = 8;
 		b[4] = 15;
 		b[5] = 4;
 		b[6] = 1;
 		b[7] = 4;
 
-		short[] c = new short[8];
+		ushort[] c = new ushort[8];
 		c[0] = 3;
-		c[1] = 0;
-		c[2] = 1;
-		c[3] = -2;
+		c[1] = 2;
+		c[2] = 2;
+		c[3] = 6;
 		c[4] = 10;
 		c[5] = 5;
 		c[6] = 4;
 		c[7] = 6;
 
-		byte[] d = new byte[8];
+		ushort* d = (new ushort[8]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movdqu XMM1, b;
-			pavgw XMM0, XMM1;
-			movdqu d, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				pavgw XMM0, XMM1;
+				mov EAX, d;
+				movdqu [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movdqu XMM0, [RAX];
+				mov RAX, b;
+				movdqu XMM1, [RAX];
+				pavgw XMM0, XMM1;
+				mov RAX, d;
+				movdqu [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		for(size_t i = 0; i < c.length; i++){
--- a/run/a/asm_pcmpeqb_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pcmpeqb_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		haveSSE2!()();
 
-		byte* a = [cast(byte)1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
-		byte* b = [cast(byte)1, 0, byte.min, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 16];
-		ubyte* c = new ubyte[16];
+		byte[] A = [cast(byte)1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
+		byte* a = A.ptr;
+
+		byte[] B = [cast(byte)1, 0, byte.min, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 16];
+		byte* b = B.ptr;
+
+		ubyte* c = (new ubyte[16]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pcmpeqd_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pcmpeqd_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		haveSSE2!()();
 
-		int* a = [cast(int)0, 1, 0, 4];
-		int* b = [cast(int)0, 3, 1, 4];
-		uint* c = new uint[4];
+		int[] A = [cast(int)0, 1, 0, 4];
+		int* a = A.ptr;
+
+		int[] B = [cast(int)0, 3, 1, 4];
+		int* b = B.ptr;
+
+		uint* c = (new uint[4]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pcmpeqw_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pcmpeqw_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		haveSSE2!()();
 
-		short* a = [cast(short)1, 2, 3, 4, 5, 6, 7, 8];
-		short* b = [cast(short)1, 0, byte.min, -5, -4, -3, -2, 8];
-		ushort* c = new ushort[8];
+		short[] A = [cast(short)1, 2, 3, 4, 5, 6, 7, 8];
+		short* a = A.ptr;
+
+		short[] B = [cast(short)1, 0, byte.min, -5, -4, -3, -2, 8];
+		short* b = B.ptr;
+
+		ushort* c = (new ushort[8]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pcmpgtb_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pcmpgtb_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		haveSSE2!()();
 
-		byte* a = [cast(byte)1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
-		byte* b = [cast(byte)1, 3, 2, 4, 6, 5, 7, 9, 8, 10, 12, 11, 13, 16, 15, 14];
-		ubyte* c = new ubyte[16];
+		byte[] A = [cast(byte)1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
+		byte* a = A.ptr;
+
+		byte[] B = [cast(byte)1, 3, 2, 4, 6, 5, 7, 9, 8, 10, 12, 11, 13, 16, 15, 14];
+		byte* b = B.ptr;
+
+		ubyte* c = (new ubyte[16]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pcmpgtd_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pcmpgtd_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		haveSSE2!()();
 
-		int* a = [cast(int)0, 3, 0, 4];
-		int* b = [cast(int)0, 1, 1, 4];
-		uint* c = new uint[4];
+		int[] A = [cast(int)0, 3, 0, 4];
+		int* a = A.ptr;
+
+		int[] B = [cast(int)0, 1, 1, 4];
+		int* b = B.ptr;
+
+		uint* c = (new uint[4]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pcmpgtw_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pcmpgtw_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,9 +16,13 @@
 	int main(){
 		haveSSE2!()();
 
-		short* a = [cast(short)1, 2, 3, 4, 5, 6, 7, 8];
-		short* b = [cast(short)1, 0, byte.min, -5, -4, -3, -2, 8];
-		ushort* c = new ushort[8];
+		short[] A = [cast(short)1, 2, 3, 4, 5, 6, 7, 8];
+		short* a = A.ptr;
+
+		short[] B = [cast(short)1, 0, byte.min, -5, -4, -3, -2, 8];
+		short* b = B.ptr;
+
+		ushort* c = (new ushort[8]).ptr;
 
 		static if(size_t.sizeof == 4){
 			asm{
--- a/run/a/asm_pextrw_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pextrw_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,7 +16,9 @@
 	int main(){
 		haveSSE!()();
 
-		ushort* x = [cast(ushort)1, 2, 3, 4, 5, 0xFFFF, 7, 0];
+		ushort[] X = [cast(ushort)1, 2, 3, 4, 5, 0xFFFF, 7, 0];
+		ushort* x = X.ptr;
+
 		uint a;
 		uint b;
 
--- a/run/a/asm_pf2id_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pf2id_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,16 +16,30 @@
 	int main(){
 		have3DNow!()();
 
-		float[] a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = 123.0f;
 		a[1] = -456.0f;
 
-		int[] b = new int[2];
+		int* b = (new int[2]).ptr;
 
-		asm{
-			pf2id MM0, a;
-			movq b, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				pf2id MM0, [EAX];
+				mov EAX, b;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				pf2id MM0, [RAX];
+				mov RAX, b;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b[0] != a[0]){
--- a/run/a/asm_pf2id_01_B.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pf2id_01_B.d	Tue Dec 26 14:21:37 2006 +0000
@@ -16,17 +16,32 @@
 	int main(){
 		have3DNow!()();
 
-		float[] a = new float[2];
+		float* a = (new float[2]).ptr;
 		a[0] = 123.0f;
 		a[1] = -456.0f;
 
-		int[] b = new int[2];
+		int* b = (new int[2]).ptr;
 
-		asm{
-			movq MM1, a;
-			pf2id MM0, MM1;
-			movq b, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM1, [EAX];
+				pf2id MM0, MM1;
+				mov EAX, b;
+				movq [EAX], MM0;
+				emms;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movq MM1, [RAX];
+				pf2id MM0, MM1;
+				mov RAX, b;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(b[0] != a[0]){
--- a/run/a/asm_pfacc_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pfacc_01_A.d	Tue Dec 26 14:21:37 2006 +0000
@@ -4,23 +4,50 @@
 
 module dstress.run.a.asm_pfacc_01_A;
 
-int main(){
-	version(D_InlineAsm_X86){
-		float[] a = new float[2];
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		have3DNow!()();
+
+		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] = 12.0f;
 		b[1] = 17.0f;
 
-		float[] c = new float[2];
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM0, a;
-			pfacc MM0, b;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM0, [EAX];
+				mov EAX, b;
+				pfacc 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;
+				pfacc MM0, [RAX];
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != -333.0f){
@@ -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_pfacc_01_B.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pfacc_01_B.d	Tue Dec 26 14:21:37 2006 +0000
@@ -4,24 +4,52 @@
 
 module dstress.run.a.asm_pfacc_01_B;
 
-int main(){
-	version(D_InlineAsm_X86){
-		float[] a = new float[2];
+version(D_InlineAsm_X86){
+	version = runTest;
+}else version(D_InlineAsm_X86_64){
+	version = runTest;
+}
+
+version(runTest){
+	import addon.cpuinfo;
+
+	int main(){
+		have3DNow!()();
+
+		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] = 12.0f;
 		b[1] = 17.0f;
 
-		float[] c = new float[2];
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM0, a;
-			movq MM1, b;
-			pfacc 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];
+				pfacc 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];
+				pfacc MM0, MM1;
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != -333.0f){
@@ -32,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_pfadd_01_A.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pfadd_01_A.d	Tue Dec 26 14:21:37 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] = -456.0f;
 
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 12.0f;
 		b[1] = 17.0f;
 
-		float[] c = new float[2];
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM0, a;
-			pfadd MM0, b;
-			movq c, MM0;
-			emms;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movq MM0, [EAX];
+				mov EAX, b;
+				pfadd 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;
+				pfadd MM0, [RAX];
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 135.0f){
--- a/run/a/asm_pfadd_01_B.d	Tue Dec 26 14:21:29 2006 +0000
+++ b/run/a/asm_pfadd_01_B.d	Tue Dec 26 14:21:37 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] = -456.0f;
 
-		float[] b = new float[2];
+		float* b = (new float[2]).ptr;
 		b[0] = 12.0f;
 		b[1] = 17.0f;
 
-		float[] c = new float[2];
+		float* c = (new float[2]).ptr;
 
-		asm{
-			movq MM0, a;
-			movq MM1, b;
-			pfadd 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];
+				pfadd 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];
+				pfadd MM0, MM1;
+				mov RAX, c;
+				movq [RAX], MM0;
+				emms;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 135.0f){