diff run/a/asm_pshuflw_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_pshuflw_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_pshuflw_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -16,40 +16,60 @@
 	int main(){
 		haveSSE2!()();
 
-		const short[8] A = [9, 9, 9, 9, 9, 9, 9, 9];
-		const short[8] B = [1, 2, 3, 4, 5, 6, 7, 8];
+		short[] A = [9, 9, 9, 9, 9, 9, 9, 9];
+		short* a = A.ptr;
 
-		short[8] c;
+		short[] B = [1, 2, 3, 4, 5, 6, 7, 8];
+		short* b = B.ptr;
+
+		short* c = (new short[8]).ptr;
 
-		asm{
-			movdqu XMM0, A;
-			movdqu XMM1, B;
-			psuhflw XMM0, XMM1, 0b11_10_01_00;
-			movdqu, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movdqu XMM0, [EAX];
+				mov EAX, b;
+				movdqu XMM1, [EAX];
+				pshuflw XMM0, XMM1, 0b11_01_10_00;
+				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];
+				pshuflw XMM0, XMM1, 0b11_01_10_00;
+				mov RAX, c;
+				movdqu [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != 1){
 			assert(0);
 		}
-		if(c[1] != 2){
+		if(c[1] != 3){
 			assert(0);
 		}
-		if(c[2] != 3){
+		if(c[2] != 2){
 			assert(0);
 		}
 		if(c[3] != 4){
 			assert(0);
 		}
-		if(c[4] != 8){
+		if(c[4] != 5){
 			assert(0);
 		}
-		if(c[5] != 7){
+		if(c[5] != 6){
 			assert(0);
 		}
-		if(c[6] != 6){
+		if(c[6] != 7){
 			assert(0);
 		}
-		if(c[7] != 5){
+		if(c[7] != 8){
 			assert(0);
 		}