diff run/a/asm_pavgw_01_A.d @ 1285:229e630d4b1a

partuial inline asm review
author thomask
date Tue, 26 Dec 2006 14:21:37 +0000
parents f9084d3862e8
children
line wrap: on
line diff
--- 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++){