changeset 952:29da57670853

Automated merge with http://hg.dsource.org/projects/ldc
author Christian Kamm <kamm incasoftware de>
date Thu, 12 Feb 2009 18:39:14 +0100
parents f31b29eb6980 (diff) e71c61befd6d (current diff)
children 5fa3e0ea06e9
files
diffstat 3 files changed, 124 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/gen/naked.cpp	Thu Feb 12 18:39:03 2009 +0100
+++ b/gen/naked.cpp	Thu Feb 12 18:39:14 2009 +0100
@@ -179,8 +179,8 @@
     asmblock->retty = llretTy;
     asmblock->retn = 1;
 
-    // x86
-    if (global.params.cpu == ARCHx86)
+    // x86 or x86_64
+    if (global.params.cpu == ARCHx86 || global.params.cpu == ARCHx86_64)
     {
         LINK l = fdecl->linkage;
         assert((l == LINKd || l == LINKc || l == LINKwindows) && "invalid linkage for asm implicit return");
--- a/tests/mini/asm5.d	Thu Feb 12 18:39:03 2009 +0100
+++ b/tests/mini/asm5.d	Thu Feb 12 18:39:14 2009 +0100
@@ -1,14 +1,24 @@
 int foo()
 {
     version(X86)
-    asm { mov EAX, 42; }
+    {
+      asm { mov EAX, 42; }
+    } else version(X86_64)
+    {
+      asm { movq RAX, 42; }
+    }
     else static assert(0, "todo");
 }
 
 ulong bar()
 {
     version(X86)
-    asm { mov EAX, 0xFF; mov EDX, 0xAA; }
+    {
+      asm { mov EAX, 0xFF; mov EDX, 0xAA; }
+    } else version(X86_64)
+    {
+      asm { movq RAX, 0xFF; }
+    }
     else static assert(0, "todo");
 }
 
@@ -19,5 +29,11 @@
     l = 4;
     l = 8;
     assert(foo() == 42);
-    assert(bar() == 0x000000AA000000FF);
+    version(X86)
+    {
+        assert(bar() == 0x000000AA000000FF);
+    } else version(X86_64)
+    {
+        assert(bar() == 0x00000000000000FF);
+    }
 }
--- a/tests/mini/asm8.d	Thu Feb 12 18:39:03 2009 +0100
+++ b/tests/mini/asm8.d	Thu Feb 12 18:39:14 2009 +0100
@@ -1,56 +1,105 @@
 int foo()
 {
     version(X86)
-    asm { mov EAX, 42; }
+    {
+        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; }
+    {
+        asm { mov EDX, 0xAA; mov EAX, 0xFF; }
+    }
+    else version (X86_64)
+    {
+        asm { movq RAX, 0xFF; }
+    }
     else static assert(0, "todo");
 }
 
 float onef()
 {
     version(X86)
-    asm { fld1; }
+    {
+        asm { fld1; }
+    }
+    else version (X86_64)
+    {
+        asm { fld1; }
+    }
     else static assert(0, "todo");
 }
 
 double oned()
 {
     version(X86)
-    asm { fld1; }
+    {
+        asm { fld1; }
+    }
+    else version (X86_64)
+    {
+        asm { fld1; }
+    }
     else static assert(0, "todo");
 }
 
 real oner()
 {
     version(X86)
-    asm { fld1; }
+    {
+        asm { fld1; }
+    }
+    else version (X86_64)
+    {
+        asm { fld1; }
+    }
     else static assert(0, "todo");
 }
 
+
 real two = 2.0;
 
 creal cr()
 {
     version(X86)
-    asm { fld1; fld two; }
+    {
+        asm { fld1; fld two; }
+    }
+    else version (X86_64)
+    {
+        asm { fld1; fld two; }
+    }
     else static assert(0, "todo");
 }
 
 creal cr2()
 {
     version(X86)
-    asm
     {
-        naked;
-        fld1;
-        fld two;
-        ret;
+        asm
+        {
+            naked;
+            fld1;
+            fld two;
+            ret;
+        }
+    }
+    else version (X86_64)
+    {
+    asm
+        {
+            naked;
+            fld1;
+            fld two;
+            ret;
+        }
     }
     else static assert(0, "todo");
 }
@@ -58,7 +107,13 @@
 void* vp()
 {
     version(X86)
-    asm { mov EAX, 0x80; }
+    {
+        asm { mov EAX, 0x80; }
+    }
+    else version (X86_64)
+    {
+        asm { movq RAX, 0x80; }
+    }
     else static assert(0, "todo");
 }
 
@@ -67,7 +122,13 @@
 int[int] aa()
 {
     version(X86)
-    asm { mov EAX, gaa; }
+    {
+        asm { mov EAX, gaa; }
+    }
+    else version (X86_64)
+    {
+        asm { movq RAX, gaa; }
+    }
     else static assert(0, "todo");
 }
 
@@ -76,7 +137,13 @@
 Object ob()
 {
     version(X86)
-    asm { mov EAX, gobj; }
+    {
+        asm { mov EAX, gobj; }
+    }
+    else version (X86_64)
+    {
+        asm { movq RAX, gobj; }
+    }
     else static assert(0, "todo");
 }
 
@@ -85,14 +152,26 @@
 char[] str()
 {
     version(X86)
-    asm { lea ECX, ghello; mov EAX, [ECX]; mov EDX, [ECX+4]; }
+    {
+        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; }
+    {
+        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");
 }
 
@@ -103,7 +182,14 @@
     auto adg = &gobj.toString;
 
     assert(foo() == 42);
-    assert(bar() == 0x000000AA000000FF);
+    version(X86)
+    {
+        assert(bar() == 0x000000AA000000FF);
+    } 
+    else version (X86_64)
+    {
+        assert(bar() == 0x00000000000000FF);
+    }
     assert(onef() == 1);
     assert(oned() == 1);
     assert(oner() == 1);