diff run/mini/naked_asm5.d @ 1628:c6ef09dfba4d

add mini test set from ldc project
author Moritz Warning <moritzwarning@web.de>
date Mon, 10 Jan 2011 19:47:18 +0100
parents
children d0efa3ae5522
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/mini/naked_asm5.d	Mon Jan 10 19:47:18 2011 +0100
@@ -0,0 +1,34 @@
+int foo(int op)(int a, int b)
+{
+    version(X86)
+    {
+    const OP = (op == '+') ? "add" : "sub";
+    version (Windows)
+    {
+    	asm { naked; }
+    	mixin("asm{push EBP;mov EBP,ESP;sub ESP,8;mov ECX,[EBP+8];"~OP~" EAX, ECX;add ESP,8;pop EBP;}");
+    	asm { ret; }
+	} else
+	{
+    	asm { naked; }
+    	mixin("asm{"~OP~" EAX, [ESP+4];}");
+    	asm { ret 4; }
+	}
+    }
+    else version(X86_64)
+    {
+    const OP = (op == '+') ? "add" : "sub";
+    asm { naked; }
+    mixin("asm{"~OP~" ESI,EDI; mov EAX, ESI;}");
+    asm { ret; }
+    }
+    else static assert(0, "todo");
+}
+
+void main()
+{
+        int i = foo!('+')(2, 4);
+        assert(i == 6);
+        i = foo!('-')(2, 4);
+        assert(i == 2);
+}