diff tests/mini/asm8.d @ 959:7e669954db7d

Implement implicit return after inline asm on x86_64
author Frits van Bommel <fvbommel wxs.nl>
date Sun, 15 Feb 2009 18:04:22 +0100
parents b2d27ddf8f45
children aa2e3a6c3410
line wrap: on
line diff
--- a/tests/mini/asm8.d	Sun Feb 15 14:54:36 2009 +0100
+++ b/tests/mini/asm8.d	Sun Feb 15 18:04:22 2009 +0100
@@ -1,3 +1,7 @@
+const float  one_f = 1;
+const double one_d = 1;
+const real   one_r = 1;
+
 int foo()
 {
     version(X86)
@@ -24,6 +28,7 @@
     else static assert(0, "todo");
 }
 
+
 float onef()
 {
     version(X86)
@@ -32,7 +37,7 @@
     }
     else version (X86_64)
     {
-        asm { fld1; }
+        asm { movss XMM0, [one_f]; }
     }
     else static assert(0, "todo");
 }
@@ -45,7 +50,7 @@
     }
     else version (X86_64)
     {
-        asm { fld1; }
+        asm { movsd XMM0, [one_d]; }
     }
     else static assert(0, "todo");
 }
@@ -63,18 +68,172 @@
     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");
+}
 
-real two = 2.0;
+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; flds two_f; }
+    }
+    else version (X86_64)
+    {
+        asm
+        {
+            movss XMM1, [two_f];
+            movss XMM0, [one_f];
+            movd ECX, XMM1;
+            movd EAX, XMM0;
+            
+            // invalid operand size :(
+            //shl RCX, 32;
+            //or RAX, RCX;
+            
+            pushq RAX;
+            mov [RSP + 4], EAX;
+            popq RAX;
+            
+            movd XMM0, RAX;
+        }
+    }
+    else static assert(0, "todo");
+}
+
+cfloat cf2()
+{
+    version(X86)
+    {
+        asm
+        {
+            naked;
+            fld1;
+            flds two_f;
+            ret;
+        }
+    }
+    else version (X86_64)
+    {
+        asm
+        {
+            naked;
+            movss XMM1, [two_f];
+            movss XMM0, [one_f];
+            movd ECX, XMM1;
+            movd EAX, XMM0;
+            
+            // invalid operand size :(
+            //shl RCX, 32;
+            //or RAX, RCX;
+            
+            pushq RAX;
+            mov [RSP + 4], EAX;
+            popq RAX;
+            
+            movd RAX, XMM0;
+            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; }
+        asm { fld1; fld two_r; }
     }
     else version (X86_64)
     {
-        asm { fld1; fld two; }
+        asm { fld two_r; fld1; }
     }
     else static assert(0, "todo");
 }
@@ -87,17 +246,17 @@
         {
             naked;
             fld1;
-            fld two;
+            fld two_r;
             ret;
         }
     }
     else version (X86_64)
     {
-    asm
+        asm
         {
             naked;
+            fld two_r;
             fld1;
-            fld two;
             ret;
         }
     }
@@ -193,8 +352,20 @@
     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(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);