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

inline asm review
author thomask
date Fri, 12 Jan 2007 23:07:17 +0000
parents 03c97933de98
children
line wrap: on
line diff
--- a/run/a/asm_psadbw_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_psadbw_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,19 +16,39 @@
 	int main(){
 		haveSSE!()();
 
-		const ubyte[16] A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
-		const ubyte[16] B = [2, 2, 2, 2, 2, 2, 2, 2, 1, 10, 10, 10, 10, 10, 10, 10];
+		ubyte[] A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
+		ubyte* a = A.ptr;
 
-		ushort[8] c;
+		ubyte[] B = [2, 2, 2, 2, 2, 2, 2, 2, 1, 10, 10, 10, 10, 10, 10, 10];
+		ubyte* b = B.ptr;
+
+		ushort* c = (new ushort[8]).ptr;
 
-		asm{
-			movdqu XMM0, A;
-			movdqu XMM1, B;
-			psadbw XMM0, XMM1;
-			movdqu c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				psadbw 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];
+				psadbw XMM0, XMM1;
+				mov RAX, c;
+				movdqu [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
-		if(c[0] != 0){
+		if(c[0] != 22){
 			assert(0);
 		}
 		if(c[1] != 0){
@@ -37,10 +57,10 @@
 		if(c[2] != 0){
 			assert(0);
 		}
-		if(c[3] != 22){
+		if(c[3] != 0){
 			assert(0);
 		}
-		if(c[4] != 0){
+		if(c[4] != 29){
 			assert(0);
 		}
 		if(c[5] != 0){
@@ -49,7 +69,7 @@
 		if(c[6] != 0){
 			assert(0);
 		}
-		if(c[7] != 21){
+		if(c[7] != 0){
 			assert(0);
 		}
 		return 0;