Mercurial > projects > ldc
diff gen/asmstmt.cpp @ 920:545f54041d91
Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Fixed align N; in asm blocks.
Fixed inreg parameter passing on x86 for ref/out params.
Removed support for lazy initialization of function local static variables, I have no idea why I ever implemented this, it's not in the D spec, and DMD doesn't support it :P
Some of the global variable related changes might cause minor regressions, but they should be easily fixable.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Tue, 03 Feb 2009 08:54:57 +0100 |
parents | 661384d6a936 |
children | 03d7c4aac654 |
line wrap: on
line diff
--- a/gen/asmstmt.cpp Mon Feb 02 02:35:44 2009 +0100 +++ b/gen/asmstmt.cpp Tue Feb 03 08:54:57 2009 +0100 @@ -15,7 +15,6 @@ #include <cassert> #include <deque> #include <iostream> -#include <sstream> #include <cstring> //#include "d-lang.h" @@ -157,6 +156,8 @@ if (err) fatal(); + //puts(toChars()); + sc->func->inlineAsm = 1; sc->func->inlineStatus = ILSno; // %% not sure // %% need to set DECL_UNINLINABLE too? @@ -699,3 +700,35 @@ return CompoundStatement::semantic(sc); } + +////////////////////////////////////////////////////////////////////////////// + +void AsmStatement::toNakedIR(IRState *p) +{ + Logger::println("AsmStatement::toNakedIR(): %s", loc.toChars()); + LOG_SCOPE; + + // is there code? + if (!asmcode) + return; + AsmCode * code = (AsmCode *) asmcode; + + // build asm stmt + std::ostringstream& asmstr = p->nakedAsm; + asmstr << "\t"; + asmstr.write(code->insnTemplate, code->insnTemplateLen); + asmstr << std::endl; +} + +void AsmBlockStatement::toNakedIR(IRState *p) +{ + Logger::println("AsmBlockStatement::toNakedIR(): %s", loc.toChars()); + LOG_SCOPE; + + // do asm statements + for (unsigned i=0; i<statements->dim; i++) + { + Statement* s = (Statement*)statements->data[i]; + if (s) s->toNakedIR(p); + } +}