diff run/mini/asm8.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/run/mini/asm8.d	Mon Jan 10 19:47:18 2011 +0100
@@ -0,0 +1,401 @@
+const float  one_f = 1;
+const double one_d = 1;
+const real   one_r = 1;
+
+int foo()
+{
+    version(X86)
+    {
+        asm { mov EAX, 42; }
+    }
+    else version (X86_64)
+    {
+        asm { mov EAX, 42; }
+    }
+    else static assert(0, "todo");
+}
+
+ulong bar()
+{
+    version(X86)
+    {
+        asm { mov EDX, 0xAA; mov EAX, 0xFF; }
+    }
+    else version (X86_64)
+    {
+        asm { movq RAX, 0xAA000000FF; }
+    }
+    else static assert(0, "todo");
+}
+
+
+float onef()
+{
+    version(X86)
+    {
+        asm { fld1; }
+    }
+    else version (X86_64)
+    {
+        asm { movss XMM0, [one_f]; }
+    }
+    else static assert(0, "todo");
+}
+
+double oned()
+{
+    version(X86)
+    {
+        asm { fld1; }
+    }
+    else version (X86_64)
+    {
+        asm { movsd XMM0, [one_d]; }
+    }
+    else static assert(0, "todo");
+}
+
+real oner()
+{
+    version(X86)
+    {
+        asm { fld1; }
+    }
+    else version (X86_64)
+    {
+        asm { fld1; }
+    }
+    else static assert(0, "todo");
+}
+
+ifloat oneif()
+{
+    version(X86)
+    {
+        asm { fld1; }
+    }
+    else version (X86_64)
+    {
+        asm { movss XMM0, [one_f]; }
+    }
+    else static assert(0, "todo");
+}
+
+idouble oneid()
+{
+    version(X86)
+    {
+        asm { fld1; }
+    }
+    else version (X86_64)
+    {
+        asm { movsd XMM0, [one_d]; }
+    }
+    else static assert(0, "todo");
+}
+
+ireal oneir()
+{
+    version(X86)
+    {
+        asm { fld1; }
+    }
+    else version (X86_64)
+    {
+        asm { fld1; }
+    }
+    else static assert(0, "todo");
+}
+
+
+const float two_f = 2;
+
+cfloat cf()
+{
+    version(X86)
+    {
+        asm { fld1; fld two_f; }
+    }
+    else version (X86_64)
+    {
+        asm
+        {
+            movss XMM0, [one_f];
+            movss XMM1, [two_f];
+        }
+    }
+    else static assert(0, "todo");
+}
+
+extern(C) cfloat cf_C()
+{
+    version(X86)
+    {
+        asm {
+            mov EAX, [one_f];
+            mov EDX, [two_f];
+        }
+    }
+    else version (X86_64)
+    {
+        asm {
+            mov EAX, [one_f];
+            mov ECX, [two_f];
+            
+            shl RCX, 32;
+            or RAX, RCX;
+            
+            movd XMM0, RAX;
+        }
+    }
+    else static assert(0, "todo");
+}
+
+cfloat cf2()
+{
+    version(X86)
+    {
+        asm
+        {
+            naked;
+            fld1;
+            fld two_f;
+            ret;
+        }
+    }
+    else version (X86_64)
+    {
+        asm
+        {
+            naked;
+            movss XMM0, [one_f];
+            movss XMM1, [two_f];
+            ret;
+        }
+    }
+    else static assert(0, "todo");
+}
+
+extern(C) cfloat cf2_C()
+{
+    version(X86)
+    {
+        asm
+        {
+            naked;
+            mov EAX, [one_f];
+            mov EDX, [two_f];
+            ret;
+        }
+    }
+    else version (X86_64)
+    {
+        asm {
+            naked;
+            mov EAX, [one_f];
+            mov ECX, [two_f];
+            
+            shl RCX, 32;
+            or RAX, RCX;
+            
+            movd XMM0, RAX;
+            ret;
+        }
+    }
+    else static assert(0, "todo");
+}
+
+
+const double two_d = 2;
+
+cdouble cd()
+{
+    version(X86)
+    {
+        asm { fld1; fld two_d; }
+    }
+    else version (X86_64)
+    {
+        asm
+        {
+            leaq RAX, [one_d];
+            leaq RCX, [two_d];
+            movsd XMM0, [RAX];
+            movsd XMM1, [RCX];
+        }
+    }
+    else static assert(0, "todo");
+}
+
+cdouble cd2()
+{
+    version(X86)
+    {
+        asm
+        {
+            naked;
+            fld1;
+            fld two_d;
+            ret;
+        }
+    }
+    else version (X86_64)
+    {
+        asm
+        {
+            naked;
+            movsd XMM0, [one_d];
+            movsd XMM1, [two_d];
+        }
+    }
+    else static assert(0, "todo");
+}
+
+
+const real two_r = 2.0;
+
+creal cr()
+{
+    version(X86)
+    {
+        asm { fld1; fld two_r; }
+    }
+    else version (X86_64)
+    {
+        asm { fld two_r; fld1; }
+    }
+    else static assert(0, "todo");
+}
+
+creal cr2()
+{
+    version(X86)
+    {
+        asm
+        {
+            naked;
+            fld1;
+            fld two_r;
+            ret;
+        }
+    }
+    else version (X86_64)
+    {
+        asm
+        {
+            naked;
+            fld two_r;
+            fld1;
+            ret;
+        }
+    }
+    else static assert(0, "todo");
+}
+
+void* vp()
+{
+    version(X86)
+    {
+        asm { mov EAX, 0x80; }
+    }
+    else version (X86_64)
+    {
+        asm { movq RAX, 0x80; }
+    }
+    else static assert(0, "todo");
+}
+
+int[int] gaa;
+
+int[int] aa()
+{
+    version(X86)
+    {
+        asm { mov EAX, gaa; }
+    }
+    else version (X86_64)
+    {
+        asm { movq RAX, gaa; }
+    }
+    else static assert(0, "todo");
+}
+
+Object gobj;
+
+Object ob()
+{
+    version(X86)
+    {
+        asm { mov EAX, gobj; }
+    }
+    else version (X86_64)
+    {
+        asm { movq RAX, gobj; }
+    }
+    else static assert(0, "todo");
+}
+
+char[] ghello = "hello world";
+
+char[] str()
+{
+    version(X86)
+    {
+        asm { lea ECX, ghello; mov EAX, [ECX]; mov EDX, [ECX+4]; }
+    }
+    else version (X86_64)
+    {
+        asm { movq RAX, [ghello]; movq RDX, [ghello]+8; }
+    }
+    else static assert(0, "todo");
+}
+
+char[] delegate() dg()
+{
+    version(X86)
+    {
+        asm { mov EAX, gobj; lea EDX, Object.toString; }
+    }
+    else version (X86_64)
+    {
+        asm { movq RAX, [gobj]; leaq RDX, Object.toString; }
+    }
+    else static assert(0, "todo");
+}
+
+void main()
+{
+    gaa[4] = 5;
+    gobj = new Object;
+    auto adg = &gobj.toString;
+
+    assert(foo() == 42);
+    assert(bar() == 0xAA000000FF);
+    assert(onef() == 1);
+    assert(oned() == 1);
+    assert(oner() == 1);
+    
+    assert(oneif() == 1i);
+    assert(oneid() == 1i);
+    assert(oneir() == 1i);
+    
+    assert(cf() == 1+2i);
+    assert(cf2() == 1+2i);
+    
+    assert(cf_C() == 1+2i);
+    assert(cf2_C() == 1+2i);
+    
+    assert(cd() == 1+2i);
+    assert(cd2() == 1+2i);
+    
+    assert(cr() == 1+2i);
+    assert(cr2() == 1+2i);
+    
+    assert(vp() == cast(void*)0x80);
+    assert(aa() is gaa);
+    assert(ob() is gobj);
+    assert(str() == "hello world");
+    assert(dg()() == "object.Object");
+}
+
+extern(C) int printf(char*, ...);