# HG changeset patch # User Christian Kamm # Date 1233694014 -3600 # Node ID b6647328d11e2ec7972be23185db696a6106fafe # Parent 8ff08961da7257d19098d9ec232308c0af6de2dc# Parent 7985bb036db488f8680bd571374ddf4a5c8b74e3 Automated merge with http://hg.dsource.org/projects/ldc diff -r 7985bb036db4 -r b6647328d11e gen/asm-x86-32.h --- 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; diff -r 7985bb036db4 -r b6647328d11e gen/asm-x86-64.h --- 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 }, diff -r 7985bb036db4 -r b6647328d11e gen/naked.cpp --- 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(""); diff -r 7985bb036db4 -r b6647328d11e tests/mini/naked_asm2.d --- 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"); } diff -r 7985bb036db4 -r b6647328d11e tests/mini/naked_asm3.d --- 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"); } diff -r 7985bb036db4 -r b6647328d11e tests/mini/naked_asm4.d --- 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"); } diff -r 7985bb036db4 -r b6647328d11e tests/mini/naked_asm5.d --- 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"); } diff -r 7985bb036db4 -r b6647328d11e tests/mini/naked_asm6.d --- 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); + } }