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

inline asm review
author thomask
date Fri, 12 Jan 2007 23:07:17 +0000
parents 81222734adf3
children
line wrap: on
line diff
--- a/run/a/asm_movhlps_01_A.d	Fri Jan 12 23:06:49 2007 +0000
+++ b/run/a/asm_movhlps_01_A.d	Fri Jan 12 23:07:17 2007 +0000
@@ -20,25 +20,42 @@
 	int main(){
 		haveSSE!()();
 
-		float[] a = new float[4];
+		float* a = (new float[4]).ptr;
 		a[0] = 3.0f;
 		a[1] = 4.0f;
 		a[2] = 5.0f;
 		a[3] = 6.0f;
 
-		float[] b = new float[4];
-		a[0] = 10.0f;
-		a[1] = 20.0f;
-		a[2] = 30.0f;
-		a[3] = 40.0f;
+		float* b = (new float[4]).ptr;
+		b[0] = 10.0f;
+		b[1] = 20.0f;
+		b[2] = 30.0f;
+		b[3] = 40.0f;
+
+		float* c = (new float[4]).ptr;
 
-		float[] c = new float[4];
-
-		asm{
-			movups XMM0, a;
-			movups XMM1, b;
-			movlhps XMM0, XMM1;
-			movups c, XMM0;
+		static if(size_t.sizeof == 4){
+			asm{
+				mov EAX, a;
+				movups XMM0, [EAX];
+				mov EAX, b;
+				movups XMM1, [EAX];
+				movlhps XMM0, XMM1;
+				mov EAX, c;
+				movups [EAX], XMM0;
+			}
+		}else static if(size_t.sizeof == 8){
+			asm{
+				mov RAX, a;
+				movups XMM0, [RAX];
+				mov RAX, b;
+				movups XMM1, [RAX];
+				movlhps XMM0, XMM1;
+				mov RAX, c;
+				movups [RAX], XMM0;
+			}
+		}else{
+			static assert(0, "unhandled pointer size");
 		}
 
 		if(c[0] != a[0]){