diff run/a/asm_pxor_02_A.d @ 1329:1c8652b3795a

inline asm review
author thomask
date Fri, 12 Jan 2007 23:07:17 +0000
parents a929acac9127
children
line wrap: on
line diff
--- a/run/a/asm_pxor_02_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_pxor_02_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,7 +16,7 @@
 	int main(){
 		haveSSE2!()();
 
-		ushort[8] a = new ushort[8];
+		ushort* a = (new ushort[8]).ptr;
 		a[0] = 0x1200;
 		a[1] = 0x0120;
 		a[2] = 0x0012;
@@ -26,7 +26,7 @@
 		a[6] = 0x0000;
 		a[7] = 0x1111;
 
-		ushort[] b = new ushort[8];
+		ushort* b = (new ushort[8]).ptr;
 		b[0] = 0x2100;
 		b[1] = 0x2100;
 		b[2] = 0x2100;
@@ -36,7 +36,7 @@
 		b[6] = 0x0102;
 		b[7] = 0x2222;
 
-		ushort[] c = new ushort[8];
+		ushort* c = (new ushort[8]).ptr;
 		c[0] = 0x3300;
 		c[1] = 0x2020;
 		c[2] = 0x2112;
@@ -46,24 +46,44 @@
 		c[6] = 0x0102;
 		c[7] = 0x3333;
 
-		ushort[] d = new ushort[8];
-		ushort[] e = new ushort[8];
+		ushort* d = (new ushort[8]).ptr;
+		ushort* e = (new ushort[8]).ptr;
 
-		asm{
-			movdqu XMM0, a;
-			movdqu XMM1, b;
-			pxor XMM1, XMM0;
-			movdqu d, XMM0;
-			movdqu e, XMM1;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				pxor XMM1, XMM0;
+				mov EAX, d;
+				movdqu [EAX], XMM0;
+				mov EAX, e;
+				movdqu [EAX], XMM1;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movdqu XMM0, [RAX];
+				mov RAX, b;
+				movdqu XMM1, [RAX];
+				pxor XMM1, XMM0;
+				mov RAX, d;
+				movdqu [RAX], XMM0;
+				mov RAX, e;
+				movdqu [RAX], XMM1;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 
-		foreach(size_t i, ushort s; a){
+		foreach(size_t i, ushort s; a[0 .. 8]){
 			if(s != d[i]){
 				assert(0);
 			}
 		}
-		foreach(size_t i, ushort s; c){
+		foreach(size_t i, ushort s; c[0 .. 8]){
 			if(s != e[i]){
 				assert(0);
 			}