changeset 931:b6647328d11e

Automated merge with http://hg.dsource.org/projects/ldc
author Christian Kamm <kamm incasoftware de>
date Tue, 03 Feb 2009 21:46:54 +0100
parents 8ff08961da72 (diff) 7985bb036db4 (current diff)
children 5e3bb0c3ea8b a904cc9bc064
files
diffstat 8 files changed, 94 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/gen/asm-x86-32.h	Tue Feb 03 21:46:46 2009 +0100
+++ b/gen/asm-x86-32.h	Tue Feb 03 21:46:54 2009 +0100
@@ -1436,6 +1436,10 @@
                             break;
                         }
 
+                        // osx needs an extra underscore
+                        if (global.params.os == OSMacOSX)
+                            insnTemplate->writestring("_");
+
                         // print out the mangle
                         insnTemplate->writestring(vd->mangle());
                         vd->nakedUse = true;
--- a/gen/asm-x86-64.h	Tue Feb 03 21:46:46 2009 +0100
+++ b/gen/asm-x86-64.h	Tue Feb 03 21:46:54 2009 +0100
@@ -616,6 +616,7 @@
     { "add",    Op_DstSrcNT }, //Op_UpdSrcF },
     { "addpd",  Op_DstSrcSSE },
     { "addps",  Op_DstSrcSSE },
+    { "addq",    Op_DstSrcSSE },
     { "addsd",  Op_DstSrcSSE },
     { "addss",  Op_DstSrcSSE },
     { "addsubpd", Op_DstSrcSSE },
@@ -951,9 +952,9 @@
     { "minss", Op_DstSrcSSE },
     { "monitor", Op_0 },
     { "mov",   Op_DstSrc },
-    { "movb",   Op_DstSrcNT  },
     { "movapd",  Op_DstSrcSSE },
     { "movaps",  Op_DstSrcSSE },
+    { "movb",   Op_DstSrcNT  },
     { "movd",    Op_DstSrcNT  }, // also mmx and sse
     { "movddup", Op_DstSrcSSE },
     { "movdq2q", Op_DstSrcNT }, // mmx/sse
@@ -962,6 +963,7 @@
     { "movhlps", Op_DstSrcSSE },
     { "movhpd",  Op_DstSrcSSE },
     { "movhps",  Op_DstSrcSSE },
+    { "movl",   Op_DstSrc },
     { "movlhps", Op_DstSrcSSE },
     { "movlpd",  Op_DstSrcSSE },
     { "movlps",  Op_DstSrcSSE },
@@ -994,6 +996,7 @@
     { "mulsd", Op_DstSrcSSE },
     { "mulss", Op_DstSrcSSE },
     { "mwait", Op_0 },
+    { "naked", Op_Naked },
     { "neg",   Op_UpdF },
     { "nop",   Op_0 },
     { "not",   Op_Upd },
@@ -1051,7 +1054,6 @@
     { "pmulhw",   Op_DstSrcMMX },
     { "pmullw",   Op_DstSrcMMX },
     { "pmuludq",  Op_DstSrcMMX }, // also sse
-    { "pop",      Op_DstW },
     { "popf",     Op_SizedStack },  // rewrite the insn with a special case
     { "popfq",    Op_SizedStack }, 
     { "popq",    Op_push }, 
@@ -1095,7 +1097,6 @@
     { "punpckldq", Op_DstSrcMMX },
     { "punpcklqdq",Op_DstSrcMMX },
     { "punpcklwd", Op_DstSrcMMX },
-    { "push",   Op_push },
     { "pushf",  Op_SizedStack },
     { "pushfq", Op_SizedStack },
     { "pushq", Op_push },
@@ -1188,6 +1189,7 @@
     { "sub",    Op_UpdSrcF },
     { "subpd",  Op_DstSrcSSE },
     { "subps",  Op_DstSrcSSE },
+    { "subq",    Op_DstSrcSSE },
     { "subsd",  Op_DstSrcSSE },
     { "subss",  Op_DstSrcSSE },
     { "swapgs",  Op_DstSrcSSE },
--- a/gen/naked.cpp	Tue Feb 03 21:46:46 2009 +0100
+++ b/gen/naked.cpp	Tue Feb 03 21:46:54 2009 +0100
@@ -104,34 +104,60 @@
 
     // build function header
 
-    // REALLY FIXME: this is most likely extremely platform dependent
+    // FIXME: could we perhaps use llvm asmwriter to give us these details ?
 
     const char* mangle = fd->mangle();
-    const char* linkage = "globl";
-    std::string section = "text";
-    unsigned align = 16;
-
     std::ostringstream tmpstr;
 
-    if (DtoIsTemplateInstance(fd))
+    // osx is different
+    // also mangling has an extra underscore prefixed
+    if (global.params.os == OSMacOSX)
     {
-        linkage = "weak";
-        tmpstr << "section\t.gnu.linkonce.t." << mangle << ",\"ax\",@progbits";
-        section = tmpstr.str();
+        std::string section = "text";
+        bool weak = false;
+        if (DtoIsTemplateInstance(fd))
+        {
+            tmpstr << "section\t__TEXT,__textcoal_nt,coalesced,pure_instructions";
+            section = tmpstr.str();
+            weak = true;
+        }
+        asmstr << "\t." << section << std::endl;
+        asmstr << "\t.align\t4,0x90" << std::endl;
+        asmstr << "\t.globl\t_" << mangle << std::endl;
+        if (weak)
+        {
+            asmstr << "\t.weak_definition\t_" << mangle << std::endl;
+        }
+        asmstr << "_" << mangle << ":" << std::endl;
     }
-
-    asmstr << "\t." << section << std::endl;
-    asmstr << "\t.align\t" << align << std::endl;
-    asmstr << "\t." << linkage << "\t" << mangle << std::endl;
-    asmstr << "\t.type\t" << mangle << ",@function" << std::endl;
-    asmstr << mangle << ":" << std::endl;
+    // this works on linux x86 32 and 64 bit
+    // assume it works everywhere else as well for now
+    else
+    {
+        const char* linkage = "globl";
+        std::string section = "text";
+        if (DtoIsTemplateInstance(fd))
+        {
+            linkage = "weak";
+            tmpstr << "section\t.gnu.linkonce.t." << mangle << ",\"ax\",@progbits";
+            section = tmpstr.str();
+        }
+        asmstr << "\t." << section << std::endl;
+        asmstr << "\t.align\t16" << std::endl;
+        asmstr << "\t." << linkage << "\t" << mangle << std::endl;
+        asmstr << "\t.type\t" << mangle << ",@function" << std::endl;
+        asmstr << mangle << ":" << std::endl;
+    }
 
     // emit body
     fd->fbody->toNakedIR(gIR);
 
     // emit size after body
-    // why? dunno, llvm seems to do it by default ..
-    asmstr << "\t.size\t" << mangle << ", .-" << mangle << std::endl << std::endl;
+    // llvm does this on linux, but not on osx
+    if (global.params.os != OSMacOSX)
+    {
+        asmstr << "\t.size\t" << mangle << ", .-" << mangle << std::endl << std::endl;
+    }
 
     gIR->module->appendModuleInlineAsm(asmstr.str());
     asmstr.str("");
--- a/tests/mini/naked_asm2.d	Tue Feb 03 21:46:46 2009 +0100
+++ b/tests/mini/naked_asm2.d	Tue Feb 03 21:46:54 2009 +0100
@@ -8,6 +8,15 @@
         mov EAX, fourty2;
         ret;
     }
+    else version (X86_64)
+    {
+      asm
+      {
+	naked;
+	movq RAX,fourty2;
+	ret;
+      }
+    }
     else static assert(0, "todo");
 }
 
--- a/tests/mini/naked_asm3.d	Tue Feb 03 21:46:46 2009 +0100
+++ b/tests/mini/naked_asm3.d	Tue Feb 03 21:46:54 2009 +0100
@@ -8,6 +8,13 @@
         mov EAX, fourty2;
         ret;
     }
+    else version(X86_64)
+    asm
+    {
+        naked;
+        mov EAX, fourty2;
+        ret;
+    }
     else static assert(0, "todo");
 }
 
--- a/tests/mini/naked_asm4.d	Tue Feb 03 21:46:46 2009 +0100
+++ b/tests/mini/naked_asm4.d	Tue Feb 03 21:46:54 2009 +0100
@@ -8,6 +8,14 @@
         hlt;
 pass:   ret;
     }
+    version(X86_64)
+    asm
+    {
+        naked;
+        jmp pass;
+        hlt;
+pass:   ret;
+    }
     else static assert(0, "todo");
 }
 
--- a/tests/mini/naked_asm5.d	Tue Feb 03 21:46:46 2009 +0100
+++ b/tests/mini/naked_asm5.d	Tue Feb 03 21:46:54 2009 +0100
@@ -7,6 +7,13 @@
     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");
 }
 
--- a/tests/mini/naked_asm6.d	Tue Feb 03 21:46:46 2009 +0100
+++ b/tests/mini/naked_asm6.d	Tue Feb 03 21:46:54 2009 +0100
@@ -1,6 +1,9 @@
 extern(C) int printf(char*, ...);
 
 ulong retval() {
+    version (X86)
+    asm { naked; mov EAX, 0xff; mov EDX, 0xaa; ret; }
+    else version (X86_64)
     asm { naked; mov EAX, 0xff; mov EDX, 0xaa; ret; }
 }
 
@@ -13,6 +16,14 @@
     a = retval();
     b = retval2();
     printf("%llu\n%llu\n", retval(), retval2());
+    version (X86)
+    {
     assert(a == 0x000000aa000000ff);
     assert(a == b);
+    }
+    else version (X86_64)
+    {
+    assert(a == 0xff);
+    assert(b == 0x000000aa000000ff);
+    }
 }